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.