Magazyn Enter, luty 1994

Adam Ryba

Miotacze bomb

Filozofia działania miotaczy bomb jest bardzo prosta. Rozrzucają one po rdzeniu bomby w nadziei, że któraś z nich trafi przeciwnika, uszkadzając tym samym jego kod. Robią to przeważnie bardzo szybko i, mimo iż działają na oślep, potrafią być groźne. Rzucanymi bombami zazwyczaj są pojedyncze instrukcje, ale mogą nimi być również krótkie, kilkurozkazowe programiki. Jeśli uda się taką bombę wszczepić w program przeciwnika, zostanie ona przez niego wykonana tak, jak gdyby to był jego własny kod. W najprostszym przypadku bombą jest rozkaz DAT, którego próba wykonania uśmierca trafiony proces. Jednym z takich najprostszych miotaczy jest Barnak:

  ;Barnak
  bomba       DAT 0
  start       MOV bomba       <bomba
              JMP start
              END

Instrukcja MOV przepisuje rozkaz DAT (linię bomba) pod adres odczytany z jego argumentu B i zmniejszony o jeden. Do przesuwania celownika po arenie wykorzystany jest argument typu <, więc Barnak bombarduje arenę komórka po komórce.

Podstawową wadą Barnaka jest to, że jeśli szybko nie pokona przeciwnika, to po zbombardowaniu całego rdzenia zginie pod gradem własnych ciosów. Aby uniknąć ostrzelania własnego kodu, taki wojownik powinien liczyć rzucane bomby lub kontrolować położenie celownika. Tak może wyglądać liczenie bomb:

  bomba       DAT 0
  start       MOV bomba       <bomba
              DJN start       #100
              …
              END

Liczeniem bomb zajmuje się rozkad DJN, który po ruzceniu każdej bomby zmniejsza wartość swojego argumentu B. Gdy osiągnie on zero, wykonanie pętli zostanie przerwane. Nieco inaczej działa kontrola celownika:

  start       MOV bomba       @bomba
              DJN start       bomba
              …
  bomba       DAT 0           100
              END start

Tu rozkaz MOV zajmuje się wyłącznie rzucaniem bomb, natomiast DJN obsługuje celownik. Pętla jest wykonywana aż do wyzerowania argumentu B rozkazu DAT, czyli aż do momentu, w którym celownik wskazywałby linię bomby.

Wszystkie powyższe programy demolują rdzeń komórka po komórce, więc robią to niezbyt szybko. W ten sposób opłaca się co najwyżej kasować niewielkie fragmenty rdzenia, ale nie całą arenę. Na szczęście przy ostrzeliwaniu całej areny taka dokładność rzadko kiedy jest potrzebna, więc można przyspieszyć ostrzał zwiększając odległość pomiędzy rzucanymi bombami. Przykładem takiego miotacza jest Gnom, klasyczny już wojownik autorstwa samego Dewdneya:

  ;GNOM
  ;A.K. Dewdney, 1984
  cel         DAT 0           -1
  start       ADD #5          cel
              MOV cel         @cel
              JMP start
              END start

W Gnomie celownik obsługiwany jest przez rozkaz ADD. który umożliwa dodwolne ustalenie odległości pomiędzy rzucanymi bombami. Gnom strzela w co piątą komórkę areny, więc ponieważ sam liczy tylko trzy rozkazy (lub cztery, jeśli liczyć DAT) może być pewien, że nie uszkodzi przypadkiem własnego kodu. W ten sposób nie musi liczyć bomb, ani pilnować celownika. Gnom działa poprawnie tylko wtedy, gdy rozmiar areny jest podzielny przez pięć.

Istnieją również wojownicy, którzy nie używają rozkazów ADD czy SUB, a mimo to potrafią sprawnie i szybko ostrzeliwać arenę:

  ;ZOMBI
  ;Jarosław Chudziak, 1992
  ognia       DAT 0           0
  oj          DAT 0           660
  obrona      JMP obrona      <-2
  start       SPL obrona
  atak1       MOV ognia       <ognia
              DJN atak1       oj
  switch      MOV #660        oj
              MOV skoczek     switch
              MOV #0          ognia
              JMP atak1
  skoczek     MOV 0           1

To już bardziej skomplikowany program, podzielony na dwa procesy. Pierwszy z nich, uwięziony w linii obrona, zajmuje się przesuwaniem celownika (linia ognia), a drugi ostrzeliwuje arenę i liczy rozrzucane bomby. Oba procesy działają równolegle i w efekcie bomby lądują w co trzeciej komórce. Po pierwszym ostrzeleniu areny Zombi inicjuje wartości w liniach ognia i cel oraz wstawia instrukcję MOV 0 1 do linii switch tak, by po ponownym ostrzelaniu areny proces zamienił się w skoczka.

Zombi często wychodzi zwycięsko z konfrontacji z innymi miotaczami. Dzieje się tak między innymi dlatego, że jest on podzielony na dwa procesy. W przypadku śmierci jednego z nich drugi nadal funkcjonuje i nadal ma szanse, jeśli nie na wygraną, to przynajmniej na remis.

Warto sobie przypomnieć o zbliżających się II Mistrzostwach Polski w Wojnach Rdzeniowych. Może w nich wiąć udział każdy zarejestrowany użytkownik jednego z trzech polskich środowisk Wojen Rdzeniowych. Są to: Arbiter, CORDAT CoreWars i nierozpowszechniany już Wojownik. Wszystkie te programy działają na komputerach PC. Arbiter jest rozpowszechniany przez redakcję, wystarczy zwrócić się listownie załączając w kopercie kopię odcinka przekazu kwoty 100 tys. zł na konto Wydawnictwa. CORDAT CoreWars można natomiast kupić w firmie CORDAT-Kraków, będącej producentem i dystrybutorem tego programu. Adres: ul. Wadowicka 3, 30-415 Kraków. Cena: 345 tys. zł.

Każdy uczestnik może zgłosić do turnieju tylko jednego wojownika. Powinien ob być napisant zgodnie ze standardem WA'91 oraz składać się z co najwyżej 100 instrukcji. Wojowników prosimy przysyłać na dyskietkach w postacji zarówno źródłowej (*.RED), jak i skompilowanej (*.OBJ lub *.CMP). Niech każda nadesłana dyskieta będzie dokładnie opisana (dane autora, nazwa wojownika), a i sam wojownik niech zawiera parametry swego autora w linii komentarza. Proszę też wyraźnie zaznaczyć, że jest to dyskietka bojowa.

Na nadsyłanych wojowników czekamy do 1 kwietnia br. Turniej zostanie rozegrany pod kontrolą Arbitra na arenie wielkości 5000 komórek, przy losowanej odległości początkowej i limicie ruchów ustalonym na 30000. Każdy zawodnik będzie walczył z każdym z pozostałych. Walki będą powtarzane 50-krotnie, przy czym za każde zwycięstwo przyznamy 10, za remis 5, a za porażkę 0 pkt.

Programy, które zdobędą identyczne liczby punktów rozegrają między sobą dogrywki o kolejność na liście rankingowej. Dogrywki będą polegały na serii powtarzanych 100-krotnie walk systemem „każdy z każdym”.