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.