Magazyn Enter, sierpień 1994, strona 119

Adam Ryba

Gisela2

Nniejszym mam przyjemność zaprezentować zwycięzcę II Mistrzostw Polski w Wojnach Rdzeniowych, program Gisela2 autorstwa pana Andrzeja Maciejczaka z Sieradza. Pan Andrzej, wygrywając tegoroczny turniej, obronił tytuł Mistrza Polski zdobyty na poprzednich zawodach, kieto to pierwsze miejsce zajęła jego Gisela1. Styl walki Giseli2 jest identyczny jak Giseli1, jednak sam program został napisany od nowa, udoskonalony i skrócony. Przyjrzyjmy się zatem, jak od środka wygląda najlepszy z wojowników.

  ; Gisela2
  ; Andrzej Maciejczak
  ; Sieradz, 1994
  1.         DAT $0         $0
  2.         DAT $0         $0
  3.         DAT $0         $0
  4.         DAT $0         $0
  5.         SPL $0         <3
  6.         SPL $-1        <-5
  7.         MOV $8         <-1
  8.         JMN $-2        #64
  9.         DAT $-4        $4
  10.        MOV $-8        $8
  11.        JMP $-16       $16
  12.        CMP $-32       $32
  13.        MOV $-64       $64
  14.        CMP $2516      $2516
  15.        DAT $0         $0
  16.        ADD @2         $1
  17. start  CMP $-84       $84
  18.        JMP $2         $-5
  19.        DJN $-3        @-2
  20.        MOV $17        $-17
  21.        SLT $-4        #4970
  22.        JMP $4         <-4
  23.        JMZ $8         @-6
  24.        ADD $-7        $-21
  25.        JMP $7         $-13
  26.        MOV $-12       $-9
  27.        SUB <-2        $-10
  28.        DJN $-11       #4
  29.        MOV $-14       <1
  30.        JMP $-1        <-28
  31.        SUB $-14       $-28
  32.        MOV $-29       @-29
  33.        MOV #9         #0
  34.        MOV $-19       <-31
  35.        MOV $-17       <-32
  36.        DJN $-2        $-3
  37.        JMP $-21       $23

Gisela2 stara się przede wszystkim jak najbszybciej zlokalizować przeciwnika. Przeszukiwaniem rdzenia zajmuje się pętla zawarta w liniach 16-19, porównująca zawartości kolejnych komórek znajdujących się „z przodu” i „z tyłu” wojownika. Odległość pomiędzy badanymi komórkami może być regulowana w ramach wartości zapisancyh w tablicy w liniach 9-13. Wystarczy w tym celu zmieniać wartośc wskaźnika znajdujacego się w linii 18.

Dopóki CMP nie wykazuje żadnych różnic, Gisela2 kontynuuje poszukiwanie zakładając, że porównywane komórki są czyste tj. zawierajace DAT $0 $0. Zamykający pętlę DJN zmienia wówczas zawartość jednej z nich, co w efekcie może zakłócać pracę przeciwnika, jeśli on również przegląda arenę. Dodatkowo, umożliwia to stwierdzenie obecności przeciwnika, gdy porównywane komórki są identyczne, ale mają jedynkę w B-argumentach.

Wyjście z pętli może nastąpić wtedy, gdy zostanie zlokalizowany przeciwnik, lub gdy Gisela2 po przejrzeniu całej areny namierzy swój własny kod. Dlatego też przed ostrzelaniem podejrzanego obszaru musi być sprawdzone położenie celownika (rozkaz SLT). Przedtem jednak linia 37 jest przepisywana do 3. Będzie to maska niezbędna do obliczania koordynatów ostrzału oraz jednocześnie bomba JMP (tym zajmiemy się za chwilę).

Jeśli celownik wskazuje kod Giseli2, zmniejszany jest jego skok (linia 22), a położenie ustawiane jest w okolice środka areny (linie 26-28). Operacja przeglądania rdzenia powtarzana jest jeszcze cztery razy (czuwa nad tym DJN w linii 28), przy czym przy każdym powtórzeniu skok celownika jest coraz mniejszy. Jeśli po pięciokrotnym przeszukaniu areny przeciwnik wciąż żyje, Gisela2 zamyka się w liniach 29-30 i przystępuje do systematycznego demolowania rdzenia. Do każdej komórki (poczynając od linii 2) wpisuje DAT $0 $0 i zmniejsza w niej B-argument tak, że arena zapełniania jest instrukcjami DAT $0 $-1. Jeśli i tym razem wrogi program nie zostanie skutecznie ostrzelany, Gisela2 po zbombardowaniu całego rdzenia zginie pod własnymi ciosami. Nieczęsto jednak do tego dochodzi.

Jeśli przeszukiwanie areny wykaże jakieś zmiany znajdujące się poza kodem Giseli2, będzie ona musiała zdecydować, która z porównywanych komórek jest czysta, a którą należy ostrzelać. W tym celu badany jest B-argument jednej z nich (linia 23). Jeśli jest on różny od zera, komórka zapewne jest fragmentem wrogiego programu, który należy zaatakować. W przeciwnym zaś razie uznawana jest za część czystej areny i wówczas celem ostrzału staje się druga komórka. W zależności od tego, która z komórek ma być ostrzelana, wskazanie celwnika jest albo dodawane, albo odejmowane od maski znajdującej się w linii 3 (linie 24-25 i 31). W ten sposób przygotowywana jest bomba JMP.

Atak polega na zapisani ukolica poderjzanej komórki sekwencją JMP $2 - DAT - (...) - JMP $2 - DAT zakończoną bombą JMP prowadzącą do worka mieszczącego się w liniach 5-8. Uwięzione w nim procesy dzielą się, spowalniając działanie dotychczas nie schwytanych, oraz prowadzą ostrzał rdzenia. Worek jest tak skonstruowany, że każdy proces wchodzący do niego lub rodzący się w nim jest liczony, a gdy ich liczba osiągnie 64 (będa to wówczas wszystkie wrogie procesy), zostaną one zniszczone, a tym samym przeciwnik zostanie pokonany.