
Zacznijmy zatem nauk walki. Pierwsz rzecz, z ktrej musisz sobie zda spraw jest zaptlenie pola walki. Oznacza to ni mniej ni wicej tyle, i czogi widz przestrze przed sob jako cig - przeciwnik znajdujcy si z prawej strony moe zosta dostrzeony z lewej, pocisk znikajcy w grze ekranu wlatuje doem. Ponadto pamitaj, e czogi znajdujce si na polu walki nie widz go tak jak ty. Dla nich pojcia typu: gra ekranu, d ekranu nie maj adnego znaczenia. One orientuj si w otoczeniu wycznie wzgldem swojego wasnego ustawienia - wiedz co to znaczy do przodu, do tyu, w prawo i w lewo - nic ponadto.

Pierwszy przeciwnik z jakim si postaramy zmierzy jest przypisany do scenariusza ALONE. Jak gosi opis: ten czog nie ma paliwa, nie ma amunicji i wyczekuje swojej zagady. Nie bdzie trudno go zniszczy, gdy aby tego dokona musisz umie jedynie strzela i porusza si.
Do poruszania si po polu walki suy gwnie polecenie FORWD <MI>n<D> nakazujce jazd do przodu (oraz analogiczne do niego BACK <MI>n<D> kace jecha w ty), gdzie <MI>n<D> oznacza odlego na jak czog ma si przemieci. W praktyce uywa si przemieszcze o jeden, aby zapewni sobie moliwo zorientowania si w otoczeniu w trakcie jazdy.
Z tej jednej instrukcji mona uzoy dziaajcy ju program, ktry mgby wyglda tak:

FORWD 5

Tak oprogramowany czog przejedzie 5 pl i na tym zakoczy swoje dziaanie. Bez sensu, co? Sprbujmy zatem go poprawi, aby by bardziej ruchliwy. Poniewa makasymalnym parametrem dla FORWD jest 9, posuymy si kolejn instrukcj. Tym razem prznalee ona bdzie do zestawu instrukcji sterujcych wykonaniem programu (w przeciwiestwie do tych nakazujcych czogom ruch jak FORWD). Jest to JMP etykieta i nakazuje ona jako nastpn wykona instrukcj znajdujc si przy danej etykiecie, czyli program:

start     FORWD 1
          JMP start

nakae czogowi jecha o jedno pole, a nastpnie wykona skok do etykiety start, czyli znowu jecha o jedno pole i tak w nieskoczono (do najechania na min, obicia si o ska, lub bycia zastrzelonym). Nadal jest to mao uyteczny program, ale ju jedzi - szkoda, e tylko do przodu. Postrajmy si troch poskrca. Mamy w tym celu instrukcj RIGHT <MI>n<D> - czyli skrt w prawo o <MI>n<D> razy kt prosty (w szczeglnoci RIGHT 2 kae zawrci do tyu) oraz LEFT <MI>n<D> - analogicznie skrt w lewo. Zrbmy z nich uytek:

start     FORWD 1
          RIGHT 1
          FORWD 1
          LEFT 1
          JMP start

Ten program bdzie ju jedzi zygzakiem (pole do przodu, skrt w prawo, pole do przodu, skrt w lewo i od nowa). Niestety nadal nikogo nie ustrzeli. Wyposamy go wic w jak bro.
Najczciej uywan broni s strzay jonowe. Nie ma na nie adnego ograniczenia ilociowego jakkolwiek nie maj one wielkiej siy raenia. Na dodatek posiadaj one zdolno do "tunelowania", co oznacza ni mniej ni wicej tyle, i pocisk jonowy poruszajcy si z du prdkoci wzgldem celu moe przez niego przenikn. Szybko poruszajcym si przeciwnikom daje to moliwo uniknicia strzau nawet w wskim przesmyku jeli rzuc si na spotkanie pocisku z pen prdkoci. Nam to jednak tym razem nie grozi poniewa nasz przeciwnik nie wykona najmniejszego ruchu. Do wystrzelenia jonwki na odlego n suy instrukcja FILO <MI>n<D>. Wykorzystajmy j zatem:

start     FILO 9
          FORWD 1
          RIGHT 1
          FILO 9
          FORWD 1
          LEFT 1
          JMP start

Jest to ju w peni funkcjonalny program, ktry od dawnych czasw nosi imi Malestwo i mimo swego sdziwego wieku i prostoty konstrukcji nadal na odsonitym polu wychodzi zwycisko z pojedynkw ze znacznie bardziej skomplikowanymi wojownikami. Jednak pokonamy go w swoim czasie.
Proponuj ci teraz wpisa w edytorze programw Malestwo; zapisa je na dysk (zapewne jako MALENSTW)i skompilowa by po powrocie do gwnego menu wybra scenariusz ALONE i postawi mu za przeciwnika MALENSTW.
Malestwo wygrywa wikszo pojedynkw z ALONE (czasami przez swoj prostot doprowadza do remisu ginc w ogniu wybuchu), ale przyznasz, e robi to mao elegancko. Zanim jednak napiszemy program, ktry dostrzee przeciwnika i dopiero wwczas odda decydujcy strza musisz poj ide tzw. znacznikw. Su one do przekazywania pewnych informacji o zaszych zdarzeniach, ktrym wystarcza moliwo opisu TAK (zdarzenie zaszo) i NIE (zdarzenie nie zaszo). W pierwszym przypadku mwimy, e znacznik jest ustawiony, w drugim, e wyzerowany. Programujc naszych wojownikw mamy dostp do dwch znacznikw: ZERO i CARRY. Drugim si nie bdziemy teraz zajmowa (i w ogle nieczsto bdziemy z niego korzysta), pierwszy za przyda nam si przy okazji podstawowej instrukcji sucej do orientacji w otoczeniu (i zauwaania przeciwnika): SEEK <MI>kierunek<D> <MI>obiekt<D>.
<MI>kierunek<D> to jedna z czterech liter: F - z przodu czogu, B - z tyu, R - z prawej strony korpusu, L - z lewej strony. Lista za wszelkich obiektw znajduje si pod koniec tej instrukcji, nas obecnie bdzie interesowa obiekt TANK (czyli czog, czyli przeciwnik). W ten sposb instrukcja

SEEK F TANK

nakae naszemu wojownikowi spojrze do przodu w poszukiwaniu przeciwnika. Przyrzdy optyczne czogu pozwalaj mu na dostrzeganie wszelkich obiektw w odlegoci 9 pl w linii prostej przy oczywistym zaoeniu, e na drodze nie stoi adna skaa, beczka, albo drzewo, ktre mogoby przesoni widok. Jeli dany obiekt (w tym przypadku czog) zostanie zauwaony, wwczas znacznik ZERO zostanie ustawiony (w przeciwnym przypadku wyzerowany), a w rejestrze X znajdzie si jego odlego od naszego wojownika (rejestrami zajmiemy si nieco pniej, teraz nie jest to nam jeszcze niezbdne).
Sprbujmy zatem napisa program, ktry bdzie przemierza pole walki rozgldajc si za przeciwnikiem i gdy go dostrzee - zniszczy.

start     SEEK R TANK
          JZ strzelaj
          FORWD 1
          JMP start
strzelaj  RIGHT 1
          FILO 9
          LEFT 1
          JMP start

Wyjanienia wymaga nowa instrukcja JZ <MI>etykieta<D>. Jest to jeden z tak zwanych skokw warunkowych. W tym przypadku jest to skok przy warunku, e znacznik ZERO jest ustawiony (skocz jeli ZERO). Zatem gdy ZERO jest wyzerowany, wwczas instrukcja JZ zostanie zwyczajnie pominita, a w przeciwnym przypadku zostanie wykonany skok do danej etykiety jak przy uyciu JMP. Istniej jeszcze inne instrukcje tego typu i s to: JNZ (skocz jeli nie ZERO), JC (skocz jeli CARRY) i JNC (skocz jeli nie CARRY).
Powyszy program zatem sprawdza, czy z prawej strony dostrzega przeciwnika i jeli nie, to jedzie do przodu, jeli za tak, to obraca si w prawo i oddaje strza. Na tym w zasadzie mgby si ten program zakoczy (nasz obecny przeciwnik nie ucieka od pociskw), ale nie zaszkodzi napisa go bardziej oglnie, czyli na powrt odwrci go w lewo i kaza mu jecha dalej.
Pora zatem wystawi ten program przeciko ALONE. Czy nie zachowuje si bardziej elegancko od Malestwa? Nadajmy mu imi Sprawy z braku lepszego pomysu.
Teraz dokonajmy kilku zmian, w Sprawym, ktre nie wnios wiele do jego strategii (adna to jeszcze strategia mwic szczerze), ale pozwol ci si nauczy kilku nowych instrukcji.
Najpierw zauwamy, e przecie czog nie musi si odwraca cay, aby odda strza - wystarczy odwrci wieyczk. Z gry ci uprzedzam, e w tym przypadku nic to nie pomoe, gdy obrt wiey trwa tyle co obrt caego czogu, ale w przyszoci poznamy prociutki program, ktry wanie dziki obracaniu dziaa jest wyjtkowo skuteczny (pobija na ten przykad Malestwo).
Do obracania wieyczki mamy dwie instrukcje: TRGT <MI>n<D> - obrt w prawo, TLFT <MI>n<D> - obrt w lewo. Zastosujmy je w Sprawym.

start     SEEK R TANK
          JZ strzelaj
          FORWD 1
          JMP start
strzelaj  TRGT 1
          FILO 9
          TLFT 1
          JMP start

Powiedziabym, e program jest tak samo efektywny, ale nieco bardziej efektowny.
Teraz dokonamy kolejnej poprawki, ale w tym celu musisz uprzednio ykn troch teorii.
W powaniejszym programie nie wystarcza wpisa po prostu wartoci liczbowych dokadnie sterujcych poruszaniem si wojownika. Moe si zdarzy, e w pewnej sytuacji czog musi si obrci raz, w podobnej, ale innej dwa razy. Gdzie musi odda strza na odlego trzech pl, innym razem piciu. Czasami musi skrca wzdu cian a znajdzie wyjcie. I tak dalej. Aby mc to zrealizowa, czog ma dostp do, tak zwanych: rejestrw. S to odpowiedniki zmiennych, w ktrych moe by przechowana liczba cakowita z zakresu -100 do 100. Nasze czogi maj dostp do piciu rejestrw oglnego przeznaczenia (czyli do uycia wedle yczenia), ktre maj jake wymowne nazwy: A, B, C, D i E oraz dwch rejestrw wykorzystywanych przez pewne rozkazy: X i Y. Po prawdzie istnieje jeszcze jeden rejestr Z (moe go zauwaye w okienku informacyjnym czogu podczas walki), ale jest on dla ciebie niedostpny. Jeli w rejestrze A znajduje si liczba 32, to zamiast mwi, w rejestrze A znajduje si warto 32, mwimy po prostu, e rejestr A ma warto 32.
Prawie zawsze, wszdzie tam, gdzie moesz uy liczby, moesz uy rwnie rejestru. Zatem moesz napisa:

FORWD A
BACK X
TRGT E

i wwczas czog pojedzie do przodu o warto znajdujc si w rejestrze A, do tyu o X i obrci wie w prawo o E.

UWAGA: Na pocztku walki wszystkie rejestry maj warto 0.

Teraz przypomnij sobie jak dziaa instrukcja SEEK. Nie tylko ustawia (lub zeruje) ona znacznik ZERO, ale rwnie do rejestru X zapisuje warto bdc odlegoci szukanego obiektu od twojego czogu. Wykorzystajmy to przy uyciu najpotniejszej broni na polu walki jak s atomwki i strzelimy dokadnie na odlego w jakiej znajduje si przeciwnik (czyli nie owijajc w bawen: w niego).
Uywajc strzaw jonowych rzadko kiedy ustawia si inn odlego strzau ni 9 (i tak kosi wszystko po drodze). Atomwka jednak leci ponad przeszkodami i spada dokadnie tam, gdzie jej kazalimy robic spore zamieszanie, ale tylko wok miejsca swej eksplozji. Uyjmy jej strzelajc w przeciwnika.

start     SEEK R TANK
          JZ strzelaj
          FORWD 1
          JMP start
strzelaj  TRGT 1
          FIRE X
          TLFT 1
          JMP start

Przyznasz, e takie zastosowanie atomwki mija si z sensem, ale spjrz co by si stao, gdyby przeciwnik zdy si usun spod strzau. Pocisk jonowy by spudowa, atomwka za cigle ma szans pogrzeba delikwenta.
Poniewa jednak nasz przeciwnik jest nader nieruchawy, sami strzelmy nieco obok niego - na przykad o jedno pole za blisko. To oznacza konieczno zmniejszenia wartoci X o jeden, czyli znowu chwilk teorii.
Do operacji na rejestrach przewidziany jest zestaw kilku instrukcji, ktre zarwno nazw jak i swym dziaaniem s niemal identyczne jak analogiczne instrukcje w jzykach asemblerowych.
Pierwsz z nich jest MOV <MI>rejestr<D> <MI>warto-lub-rejestr<D>, czyli rozkaz umieszczenia w danym rejestrze podanej wartoci lub wartoci z innego rejestru. Na przykad:

MOV A 9         ; zaaduj do rejestru A warto 9
MOV E C         ; zaaduj do rejestru E warto z rejestru C

UWAGA: Uyty powyej rednik oznacza, e od niego samego do koca linii znajduje si komentarz, czyli cz programu, ktra zostaje pominita przy kompilacji. W ten sposb moesz w programie umieszcza drobne informacje o jego dziaaniu, lub przeznaczeniu (numer telefonu do cioci, przepis na pizz i co tam jeszcze). Prawd powiedziawszy ze wzgldu na ograniczenia edytora nie dasz rady umieszcza w programie tak dugich linii tekstu jak powysze - moesz jednak zacz komentarz od pocztku nowej linii.

Kolejn instrukcj jest INC <MI>rejestr<D>, czyli rozkaz zwikszenia wartoci danego rejestru o 1 i przeciwna do niej DEC <MI>rejestr<D>, ktra nakazuje te zmniejszy o jeden (zaraz z niej skorzystamy). Tu wspomnie musz o innych skutkach tych instrukcji. Jeli bowiem po wykonaniu, ktrej z nich w danym rejestrze otrzymamy zero, np:

MOV A 1
DEC A

wwczas dodatkowo ustawiony zostanie znacznik ZERO (ju wiesz, skd si bierze jego nazwa). Za jeli przekroczysz zakres rejestru (np. gdy ma ju warto -100, a ty cigle zmniejszasz), wwczas nie tylko w rejestrze znajdzie si warto z "przeciwnej strony", ale rwnie ustawiony zostanie znacznik CARRY (w ojczystej mowie znacznik "przeniesienia").

MOV A 100
INC A            ; teraz w A jest warto -100, a CARRY jest ustawiony

To nam na razie wystarczy by poprawi (szczerze mwic: nadpsu z deczka) Sprawego.

start     SEEK R TANK
          JZ strzelaj
          FORWD 1
          JMP start
strzelaj  TRGT 1
          DEC X
          FIRE X
          TLFT 1
          JMP start

Teraz z Sprawy z wasnej woli strzela niezbyt celnie, ale przeciwnik i tak koczy w ogniu eksplozji dziki sporej sile raenia atomwki.
To koczy nasze zmagania ze scenariuszem ALONE.

Teraz przejdmy na wyszy (oj, nie tak bardzo) etap, czyli scenariusz RUNAWAY. Mamy tu do czynienia z przeciwnikiem, ktry zwyczajnie spanikowa i pomny ostatniego przykazania kadego wojownika: ratuj si kto w Boga wierzy! podkuli luf pod siebie i pryska a mu generator stka.
Oczywicie zauwaysz od razu, e wystarczy na niego posa Malestwo, lub Sprawego (no, jemu si nie zawsze powiedzie) i bdzie po robocie, ale pokonajmy tego przeciwnika bardziej widowiskowo - za pomoc min. Uyciu min suy instrukcja MINE i powoduje ona postawienie POD CZOGIEM miny przeciwpancernej. Poniewa od tej pory stoisz na minie musisz nieco uwaa. Moesz si na niej obraca do woli i podziwia okolic, ale przy zjedaniu z niej powiniene nieco uwaa. Jeli bowiem uderzysz w ska, ktra odbije ci na powrt na min, wwczas zginiesz.
Napiszmy zatem program, ktry porozsiewa po polu walki troch min.

start     MINE
          FORWD 2
          RIGHT 1
          MINE
          FORWD 3
          LEFT 1
          JMP start

Jeli uruchomie powyszy program, to zapewne zauwaye dwie rzeczy: na wodzie nie da si postawi miny, gdy ta zwyczajnie tonie oraz istnieje niebezpieczestwo, e nasz wojownik sam wjedzie na wasn min. Na pierwszy problem jest tylko taka rada, eby nie stawia min na wodzie, bo to tylko strata czasu i wystawianie si na strza, drugi problem za da si rozwiza zamieniajc proste instrukcje ruchu FORWD na nieco bardziej skomplikowane sprawdzajce, czy czog nie ma przed sob miny. Sprbuj sam dokona tej poprawki z uyciem instrukcji SEEK F MINE.
Sprbujmy pokona program z tego scenariusza na jeszcze inny sposb - robic zamieszanie na polu walki i liczc na to, e przeciwnik kiedy wlezie w wybuch. Rozmiecimy rzdek min, w ktre nastpnie strzelimy powodujc spor eksplozj. W tym celu przyda nam si kolejna instrukcja - LOOP <MI>etykieta<D> <MI>rejestr<D>. Jest to instrukcja organizujca tak zwane ptle. Jej dziaanie polega na zmniejszeniu wartoci danego rejestru o jeden, a nastpnie jeli NIE zostao osignite zero wykonaniu skoku do podanej etykiety. W przeciwnym przypadku (wynikiem zmniejszenia rejestru jest zero) program przechodzi do nastpujcej po LOOP instrukcji. By moe zauwaye, e sekwencja:

          MOV A 3
petla     ...
          ...
          LOOP petla A

jest rwnowana innej:

          MOV A 3
petla     ...
          ...
          DEC A
          JNZ petla

ale przyznasz, e jest mniej kopotliwa w uyciu i bardziej czytelna.

UWAGA: Jeli w rejestrze, na ktrym ma operowa instrukcja LOOP, znajduje si warto ujemna, wwczas nie jest ona zmniejszana lecz zwikszana, a dalej wszystko dziaa tak samo. LOOP zawsze dy w kierunku zera.

Napiszmy zatem co takiego:

start     MOV A 3
petla     MINE
          FORWD 2
          LOOP petla A
          RIGHT 2
          FILO 9
          JMP start

Ten program nosi imi Bandyta i jest nieczsto uywany bynajmniej nie przez swoj aspoeczno, lecz nieudolno. Tym razem jednak sprawuje si wystarczajco dobrze (c, przeciwnik nie walczy).

Swego czasu obiecaem ci, e pokonamy Malestwo i teraz przysza na to pora. Wojownik, ktrego oprogramujemy nie bdzie wprawdzie idealnym przeciwnikiem dla Malestwa, ale bdzie wygrywa w wikszoci pojedynkw. Korzysta on z nowej techniki walki z uyciem zasiekw. Zasieki to takie ustrojstwo, przez ktre nie przechodzi strza jonowy, za doskonale przez nie wida i bez problemu mona strzeli ponad zasiekami atomwk. Oto Asekurant:

          BLOCK
          FORWD 2
          BLOCK
          BACK 1
          RIGHT 1
          FORWD 1
          BLOCK
          BACK 2
          BLOCK
          FORWD 1
start     SEEK F TANK
          JZ prosto
          SEEK R TANK
          JZ naprawo
          JMP start
prosto    FIRE X
          JMP start
naprawo   RIGHT 1
          JMP prosto

Sprbuj go wystawi przeciwko Malestwu na w miar pustym polu (na przykad pole z ALONE). Tym razem ju nie uywaj scenariusza, ale zaaduj w edytorze pola walki wybrane pole, wyjd do gwnego menu, zaaduj oba (skompilowane uprzednio) programy MALENSTW i ASEKURAN (pewnie tak je nazwae zapisujc na dysk) i wylij je na pojedynek. Uprzednio moesz na drugim ekranie ustawie zmieni "ile pojedynkw" na przynajmniej pi - wwczas bdziesz mia lepszy wgld na to, ktry wojownik jest istotnie lepszy.
Zauwaasz zapewne pewne niedostatki w Asekurancie. Po pierwsze i mniej wane: budowanie schronienia z zasiekw moe wyglda inaczej, np. tak:

          MOV A 3
petla     BLOCK
          FORWD 1
          RIGHT 1
          FORWD 1
          LOOP petla A
          BLOCK
          RIGHT 1
          FORWD 1

ale niestety taki program mimo wikszej elegancji wykonania jest mniej skuteczny (bo przez duszy okres czasu czog jest wystawiony na strzay przeciwnika). Po drugie i bardzo istotne: Malestwo jedc po gaziach przystraja si w nie i robi si niewidoczne (a raczej jest widoczne, ale jako gazie). Trzeba wic udoskonali Asekuranta, eby i do gazi strzela. Zmiemy zatem fragment jego programu zaczynajcy si od etykiety "start".

start     SEEK F TANK
          JZ prosto
          SEEK F BRANCH
          JZ prosto
          SEEK R TANK
          JZ naprawo
          SEEK R BRANCH
          JZ naprawo
          JMP start

To jednak te nie rozwizuje wszelkich problemw, gdy nasz dzielny wojownik miao grzmoci do wszelkich gazi na polu i gdy takowe znajduj sie od niego w pewnej odlegoci, to gotw zmarnowa i trzy atomwki na jedn ga, gdy zanim pocisk zniszczy ga, czog jeszcze j przez chwil widzi (a atomwki s limitowane). Zatem w decydujcym momencie moe ju nie mc odda strzau. Z tym uporamy si dosy prosto i nieelegancko - dopisujc po instrukcji FIRE X instrukcj WAIT. Nakazuje ona czogowi przez jedn kolejk nic nie robi, a zatem daje atomwce czas na osignicie celu. Takie nierbstwo podczas walki jest zazwyczaj zgubne, ale tym razem uycie tej instrukcji jest w peni uzasadnione, gdy nasz wojownik jest dla Malestwa i tak nieosigalny.
Pozostaj jeszcze dwa problemy. Po pierwsze Malestwo czasem wazi w naronik utworzony z zasiekw i walka pozostaje nierozstrzygnita. Temu da si zaradzi konstruujc zasieki mniej oszczdnie - z omiu elementw. Po drugie bywa, e Asekurant nie widzi przeciwnika, bo w kierunku, w ktrym patrzy widok zasania mu drzewo, gdy tymczasem patrzc w drug stron swobodnie by dostrzeg przeciwnika. C, aden problem kaza mu patrze we wszystkie strony.

Teraz zrobimy sobie przerw w pokonywaniu gupich wojownikw, ktrych jedynym przeznaczeniem jest suy ci jako materia do wicze, i zajmiemy si kilkoma instrukcjami, ktrych nie zastosujemy podczas tej nauki, ale zapewniam ci, e ci si przydadz podczas samodzielnych walk.
Zacznijmy od trzech instrukcji, ktre realizuj operacje dodawania, odejmowania i porwnywania liczb. Instrukcja dodawania wyglda tak: ADD <MI>rejestr<D> <MI>warto-lub-rejestr<D> i dziaa w ten sposb, e po jej wykonaniu w rejestrze podanym jako pierwszy znajdzie si suma jego samego i drugiego parametru. Na przykad:

MOV A 5
ADD A 8      ; w rejestrze A jest teraz 13

MOV A 4
MOV B -6
ADD A B      ; a teraz w rejestrze A jest -2

Jeli w wyniku wykonania instrukcji ADD otrzymamy zero, wwczas znacznik ZERO zostanie ustawiony. Jeli ADD spowoduje zmian znaku wartoci w rejestrze, na ktrym operujemy (jak w powyszym przykadzie), to zostanie ustawiony znacznik CARRY. Znacznik CARRY bdzie ustawiony rwnie jeli przekroczylimy zakres np. w taki sposb:

MOV C 99
ADD C 2

Po tej operacji w C znajdzie si warto -100 i CARRY bdzie ustawiony.
Analogicznie do dodawania dziaa instrukcja odejmowania SUB. Ma ona takie same parametry i w dokadnie ten sam sposb ustawia znaczniki co ADD. Szczegln postaci instrukcji SUB jest CMP. Dziaa ona identycznie jak SUB, z t jednak rnic, e nie zapamituje wyniku odejmowania w adnym rejestrze, a jedynie ustawia znaczniki zgodnie z wynikiem dziaania. Uywana jest ona do porwnywania dwch wartoci. Zobaczmy to na przykadzie.

MOV E 3
CMP E 4

Wynikiem odejmowania tego odejmowania byaby warto -1 umieszczona w rejestrze E, lecz po uyciu CMP w tyme rejestrze nadal mamy warto 3. Natomiast znaczniki wygldaj nastpujco: ZERO wyzerowany (wynikiem jest -1, a nie 0), CARRY za ustawiony (E zmienia znak z dodatniego na ujemny). W ten sposb uywajc znacznika CARRY moemy sprawdzi, ktra z dwch liczb jest wiksza, a znacznika ZERO, czy aby nie s rwne. Sekwencja:

CMP A B
JC dalej
...

oznacza: jeli B jest wiksze od A, to skocz do "dalej", a w przeciwnym wypadku  wykonaj nastpn instrukcj. Sekwencja:

CMP X Y
JNZ dalej
...

oznacza: jeli X jest rne od Y to skocz do "dalej", a jeli s sobie rwne, to wykonaj kolejn instrukcj.
Tego typu porwnywania przydaj si przy ocenie odlegoci od celu i unikaniu takich niespodzianek jak oddanie strzau do przeciwnika, ktry stoi tu przed tob i wybuchajc zniszczy i ciebie. Pozwalaj rwnie na podjcie decyzji, czy bardziej si opaca strzeli do przeciwnika w prawo, czy w lewo (jeli jest on osigalny z obu stron), aby pocisk ugodzi go jak najszybciej.
Nastpnym elementem programowania, z ktrego istnienia musisz sobie zda spraw s tak zwane podprogramy. Wyobramy sobie, e jak sekwencj rozkazw wykonujesz kilkakrotnie. Naturalnym jest, e chciaby j zapisa w jednym tylko miejscu i odwoywa si do niej ilekro zechcesz. Przyjrzyj si uwanie poniszemu przykadowi.

          CALL linia
          CALL linia
          FIRE 1
linia     BLOCK
          FORWD 1
          RIGHT 1
          FORWD 1
          RET

Co ten programik robi? Ano instrukcja CALL nakazuje skoczy do etykiety "linia", ale tym rni si ona od instrukcji JMP, i pamita dokd chcesz wrci po wykonaniu podprogramu. Pod etykiet "linia" znajduje si kilka instrukcji stanowicych w podprogram (jest to jeszcze inaczej napisany fragmencik Asekuranta) i na kocu instrukcja RET. To ona sprawia, e wykonany zostaje powrt z podprogramu. Tym razem wrcimy do drugiej linii; znowu zostanie wywoana sekwencja instrukcji po "linia"; tym razem wrcimy do trzeciej linii programu, ale tym razem nie ma ju kolejnego wywoania podprogramu, lecz instrukcja FIRE 1, czyli samozniszczenie.
CALL, podobnie jak JMP wystpuje w kilku postaciach: CZ (CALL jeli ZERO), CNZ (CALL jeli nie ZERO), CC (CALL jeli CARRY), CNC (CALL jeli nie CARRY).
Teraz poznamy dwie instrukcje suce tak zwanym operacjom na stosie. C to jest stos? Ano jest to co jak sterta papierw. Moesz ka kartki na jego wierzch i tylko z wierzchu je zdejmowa. Suy on zatem do przechowywania informacji, gdy nie masz na ni miejsca gdzie indziej. Tutaj nie bdziemy oczywicie operowa kartkami, lecz rejestrami. Instrukcja PUSH <MI>rejestr<D> spowoduje, e na wierzchu stosu pojawi si dany rejestr. Odwrotna do niej instrukcja POP <MI>rejestr<D> sprawi, e w danym rejestrze pojawi si warto zdjta z wierzchu stosu. Aby zrozumie dokadnie mechanizm dziaania stosu przyjrzyj si poniszemu przykadowi.

MOV A 4
MOV C 7
PUSH A
PUSH C
POP A     ; teraz w rejestrze A jest 7
POP B     ; w rejestrze B mamy za 4

Czyli krtko mwic zdejmujemy wartoci ze stosu w odwrotnej kolejnoci ni je na niego kadziemy oraz, oczywicie, nie musimy uywa do tego celu tych samych rejestrw.

UWAGA: Jeli nie znasz mechanizmu dziaania stosu maszynowego procesora, to swobodnie pomi ten akapit.
Tradycyjnie procesor operuje na jednym stosie, ktrego uywa zarwno dla operacji CALL, jak i do przechowywania wartoci rejestrw. Tutaj jednak masz do dyspozycji dwa niezalene stosy: jeden dla operacji PUSH i POP, drugi dla adresw powrotw dla CALL. Ten drugi jest dla ciebie bezporednio niedostpny. Krtko mwic: na twoim stosie nie pojawia si nic poza wartociami rejestrw, ktre sam tam umiecie - moesz zatem przekazywa parametry do podprogramw przez stos.
Oba stosy maj pojemno rwn stu wartociom. Jest to praktycznie nieskoczono, ale jeli uda ci si j przekroczy, to nie dostaniesz informacji o bdzie, lecz stos si zaptli od pocztku.
Stos zmiennych jest na pocztku ustawiany cay na zero, za stos wywoa na lini numer jeden.

Teraz wrcimy ponownie na pole walki i zajmiemy si pokonaniem kolejnej ofiary losu, ktr spotkamy w scenariuszu MAZEMAN. Ten program znowu nie da rady zrobi ci krzywdy (chocia strzela - a jake!), bo ma kolawo napisany program. Tym razem podstawowa trudno polega bdzie na odnalezieniu przeciwnika, czyli umiejtnoci poruszania si po labiryncie.
Orientowa si w otoczeniu ju potrafisz - za pomoc instrukcji SEEK, tym razem jednak bardziej przyda si nam inna jej odmiana: TOUCH <MI>kierunek<D> <MI>obiekt<D>. TOUCH dziaa identycznie jak SEEK z tym wyjtkiem, e sprawdza tylko pole bezporednio przylegajce do czogu w danym kierunku. Nie zwraca wic do rejestru X odlegoci (ta zawsze jest rwna jeden), a jedynie ustawia znacznik ZERO, gdy szukany obiekt istotnie znajduje si tam gdzie patrzymy.
Podczas pisania naszego programu bdziemy korzysta z dwch, nieznanych ci jeszcze, obiektw. Pierwszy z nich to EMPTY i oznacza on pole, na ktre czog moe wjecha, czyli albo GRASS (trawa), albo GRAVEL (wir), albo WATER (woda), albo SAND (piach), albo TREE (drzewo -  mona je zmiady). Zamiast wic wielokrotnie sprawdza, czy pole jest puste (gdy nie wiemy czy moe to by trawa, piach czy co innego), sprawdzamy jedynie czy "znajduje si na nim obiekt EMPTY". Obiektem przeciwnego typu jest USED, czyli pole zajte. Dodatkowo jednak i tutaj naley TREE (drzewo), gdy moesz sobie nie yczy niszczy drzew - nie, nie z powodw ekologicznych - drzewa zwyczajnie stanowi oson przed przeciwnikiem (no, nie przed jego strzaami).
Dosy atwo jest napisa program, ktry bdzie jecha przed siebie tak dugo, a napotka przeszkod i wwczas nakaza mu skrci. Zauwaysz jednak od razu, e nie jest to poprawny program do zwiedzania labiryntu, gdy chocia nie bdzie si on obija o ciany, to jednak nader atwo si on zaptli w prostym korytarzu. Napiszmy wic od razu nieco trudniejsz procedur, ktra bdzie chodzi trzymajc si lewej ciany.

start     CALL czolg?
          TOUCH L EMPTY
          JZ lewo        ; da si skrci w lewo
          TOUCH F EMPTY
          JZ prosto      ; w prawo nie skrcimy, ale prosto mona
          RIGHT 1        ; c, moemy tylko skrci w lewo
          JMP start
lewo      LEFT 1
prosto    FORWD 1
          JMP start

Nasz wojownik ju jedzi po labiryncie. Dopiszmy zatem brakujc procedur "czolg?".

czolg?    SEEK F TANK
          JZ strzal
          RET
strzal    FILO 9
          RET

Masz zatem pierwszego wojownika zdolnego walczy w labiryncie. Zapewne zauwaye w jego dziaaniu kilka brakw i niedorobie. Nader czsto nie zauwaa on przeciwnika przejedajc obok niego, chocia wystarczyoby tylko spojrze w bok. Ponadto jest on bezsilny na bardziej pustym polu, gdy zwyczajnie jedzi w kko. Ale wszystko jest do poprawki, prawda?

I znowu pora na chwilk teorii. W zestawie dostpnych instrukcji znajduje si co jak: LOOP <MI>kierunek<D> <MI>odlego<D>. Jest to, nie ukrywajc, mao uyteczna instrukcja stanowica swego rodzaju przeciwiestwo SEEK. Sprawia ona, e do rejestru X zaadowany zostanie po jej wykonaniu numer obiektu znajdujcego si w danym kierunku i danej odlegoci od czogu. Numery obiektw znajdziesz w ich spisie na kocu instrukcji.
Masz rwnie do dyspozycji dwie instrukcje dajce ci pewne informacje o twoim czogu. Pierwsza z nich to ATOM <MI>rejestr<D>, ktra do danego rejestru aduje warto bdc liczb pozostaych wojownikowi atomwek. Daje ci ona zatem moliwo oszczdzania tej broni oraz przejcia na jonwki w krytycznym momencie.
Druga z tych instrukcji to TRDIR <MI>rejestr<D> umoliwiajca ci zorientowanie si w jakim kierunku masz ustawion wieyczk (to moe by przydatne jeli uywasz przerwa - ale tym si zajmiemy nieco pniej). Do danego rejestru zostaje zaadowana warto informujca o kierunku wieyczki wzgldem kierunku korpusu czogu zgodnie ze schematem: 0 - jest do przodu, 1 - jest w prawo, 2 - jest do tyu, -1 - jest w lewo. Dziki temu sekwencja instrukcji:

TRDIR D
TLFT D

spowoduje, e bez wzgldu na poprzednie ustawienie wieyczki teraz bdzie ona skierowana w przd.

UWAGA: Instrukcja TLFT -1 dziaa tak jak TRGT 1. Podobnie wszelki inne instrukcje s sobie przeciwstawne: FORWD -3 to nic innego jak BACK 3, a RIGHT -1 to LEFT 1.

I jeszcze ostatnia instrukcja zanim wrcimy do pisania kolejnego programu. Wprawdzie, jak si dowiedziae na pocztku instrukcji (jeli naleysz do wskiej grupy osb czytujcych wstpy), nie ma zadowalajcej moliwoci cznoci radiowej z twoim wojownikiem podczas walki, to jednak zdarza si, e uda si przedrze przez zaguszanie i wysa wojownikowi skromn informacj. Mwic wprost: moesz w ograniczonym zakresie pokierowa swoim czogiem. Suy temu ISKEY <MI>kod-klawisza<D> (kody obsugiwanych klawiszy znajdziesz pod koniec instrukcji). Jeli znasz dziaanie podobnych rozkazw w innych jzykach, to zapomnij o nich na chwil, jeli nie znasz, to pamitaj na przyszo, e ISKEY dziaa nieco inaczej. Sprawdza ona bowiem czy zosta nacinity klawisz o podanym kodzie i jeli tak, to ustawia znacznik ZERO, a jeli nie to go zeruje.
Kodem klawisza "A" jest 65. Zatem sekwencja:

          ISKEY 65
          JNZ dalej
          BACK 1
          ...
dalej     ...

sprawdza czy zosta nacinity klawisz "A" i jeli nie zosta, wwczas wykonanie programu przechodzi do etykiety "dalej", a jeli zosta nacinity, to czog pojedzie do tyu.
W zestwie przykadowych programw doczonych do gry znajdziesz dwa programiki: REFLEX1 i REFLEX2, dziki ktrym moesz nieco pogimnastykowa palce i powalczy z koleg bd z jakimkolwiek czogiem sterowanym klasycznym programem. Z gry ostrzegam ci, e nie jest atwo wygra z klasycznym wojownikiem, bo chocia ty obejmujesz wzrokiem cae pole walki i na dodatek jeste czowiekiem, czyli istot inteligentn, to jednak przeciwnik moe by znacznie szybszy (jednak nikt ci nie broni postrzela sobie do przeciwnika z dowolnie gupim programem). Opisy tych i innych doczonych programw znajdziesz w liniach-komentarzach ich samych.

Koniec naszej pogadanki o programowaniu czogw przeznaczony jest dla bardziej zaawansowanych technik walki. Bdziemy rozwaa uycie radaru oraz obsug przerwa. Jeli nie czujesz si jeszcze na siach sprosta temu, to nie czytaj tego fragmentu teraz a wr do niego pniej (bo warto umie dostrzega przeciwnika przez skay lub zasonitego gaziami i warto umie uciec przed strzaem, czy nie?).
Tak wic radar uytecznym urzdzeniem jest (cho nie takim atwym w obsudze), a na jego uycie pozwala instrukcja RADAR. Zasig radaru to trzy pola w kadym kierunku, ale w odrnieniu od SEEK tym razem sprawdzany jest cay kwadrat siedem na siedem, czyli poowa pola walki. Jeli w tym kwadracie znajdzie si przeciwnik, wwczas znacznik ZERO zostanie ustawiony, a do rejestrw X i Y powdruj wsprzdne wroga liczone wzgldem twojego wojownika. Jeli przeciwnik nie znajduje si w przeszukiwanym kwadracie, to znacznik ZERO zostanie wyzerowany.
Dla przykadu: X=2 i Y=3 oznacza, e wroga maszyna jest o dwa pola na prawo i o trzy do przodu; X=-1 i Y=-2 oznacza, e przeciwnik jest o jedno pole na lewo i o dwa do tyu; X=0 i Y=-1 oznacza za, e masz go na ogonie, na ssiednim polu (dziewi na dziesi jeste ju martwy).
Sprbujmy napisa program obsugujcy radar (bdzie on do niczego, ale powinien rozwia resztki twoich wtpliwoci). Przydadz nam si do tego jeszcze dwie instrukcje: ABS <MI>rejestr<D> <MI>warto-lub-rejestr<D> i SGN <MI>rejestr<D> <MI>warto-lub-rejestr<D>. ABS sprawia, e do rejestru podanego jako pierwszy zaadowana zostanie warto bezwzgldna rejestru lub liczby podanej jako drugi parametr. SGN za uzupenia dziaanie ABS adujc do pierwszego podanego rejestru znak drugiego parametru. Czyli:

ABS C -3         ; w rejestrze C mamy teraz 3
ABS D 4          ; w rejestrze D jest warto 4
SGN E -4         ; w E jest -1
SGN A 0          ; w A jest 0
SGN D 65         ; w D jest 1

A oto obiecany program obsugujcy radar:

start     RADAR
          JZ tuciemam     ; znalazem ci amago!
          FORWD 1         ; a jak ci nie ma to jad sobie dalej
          JMP start
tuciemam  CMP X 0
          JZ prosto       ; jest prosto z przodu, albo z tyu
          SGN A X
          TRGT A          ; wieyczka w prawo (X>>0) lub w lewo (X<<0)
          FORWD Y         ; troch do przodu (Y>>0) lub do tyu (Y<<0)
          ABS X X         ; odrzucamy ewentualny minus...
          FIRE X          ; i grzmocimy w bandyt
          TRDIR A
          TLFT A          ; zwracamy wieyczk do przodu
          JMP start
prosto    CMP Y 0
          JC ztylu        ; Y<<0, czyli jest z tyu
          FIRE Y          ; jest z przodu i jest po nim
          JMP start
ztylu     TRGT 2          ; obrt w ty
          ABS Y Y         ; nie mona strzela na ujemn odlego
          FIRE Y
          TLFT 2          ; wieyczka do przodu
          JMP start

Ten program obsuguje radar w penym jego zakresie, ale wysyajc go na spotkanie jakiegokolwiek szybkiego przeciwnika przekonasz si, e nie da rady go pokona strzelajc zawsze w miejsce, na ktrym przeciwnik sta przed chwil. W praktyce nie opaca si uywa radaru w tak oglny sposb tylko ograniczy si do zajmowania si tylko tymi przypadkami, gdy przeciwnik jest z przodu, albo w dodatniej wiartce, albo na ktrej z prostych.

A teraz bdzie o przerwaniach. Co to s przerwania? Duo wyjania sama nazwa - przerwanie wykonania programu. A teraz do rzeczy. Wyobra sobie, e twj wojownik co tam sobie robi i nagle pojawia si jaka nadzwyczajna sytuacja, ktr chciaby natychmiast obsuy niezalenie od tego co akurat robi czog w tej chwili. Takie nadzwyczajne sytuacje to: odgos strzau (prawdopodobnie kto strzela do nas), wizka fal radiowych omiatajca korpus (kto nas wanie namierzy za pomoc radaru i za chwil nam przygrzmoci), albo jedziemy sobie wesoo przed siebie, a tu nagle przed dziobem pojawia si nam przeciwnik. Wszystkie te trzy zdarzenia wymagaj bezzwocznego zajcia si nimi i bardzo przydatn mozliwoci byoby przerwanie wykonania programu gdy tylko zaistniaa ktra z tych sytuacji, skok do odpowiedniej procedury obsugujcej owo przerwanie i powrt do gnego programu dokadnie w miejsce, w ktrym jego praca zostaa przerwana. To si da zrobi.
Jedyne co musisz zrobi, to umieci w programie instrukcj wczajc dane przerwanie (od jej wykonania a do koca walki to przerwanie bdzie ju obsugiwane). Masz do dyspozycji: IFRAD <MI>etykieta<D> (przerwanie na radar przeciwnika), IFSHT <MI>etykieta<D> (przerwanie na odgos strzau), IFSEE <MI>etykieta<D> (przerwanie na pojawienie si przeciwnika na polu bezporednio przed tob). Pod ow <MI>etykiet<D> musi si znajdowa procedura obsugi przerwania.
Procedury obsugi przerwania moesz traktowa jak zwyke podprogramy wywoywane instrukcj CALL z tym wyjtkiem, e tutaj nie uywasz w celu powrotu do programu RET, lecz IRET.

UWAGA: Nie martw si o rejestry, ktrych uywae w gwnym programie, e je zmienisz w przerwaniu. Wszystkie rejestry s odkadane na stos podczas wywoania przerwania i pobierane z niego przy wykonaniu instrukcji IRET (dlatego nie powiniene uywa instrukcji RET, chocia ona te pozwoli ci wrci do programu).

Dodatkowo uzyskujesz pewne informacje przy wejciu do obugi przerwania. W przypadku "IFRAD" s to wsprzdne przeciwnika (adowane do rejestrw X i Y), ktre podaj ci jego pozycj analogicznie jak przy uyciu radaru (widzisz wic, e radar jest broni obosieczn, gdy w tym przypadku i uywajcy go i jego przeciwnik zyskuj takie same informacje o swojej pozycji). W obsudze "IFSHT" podobnie dostajesz wsprzdne, na ktrych usyszae strza (czyli wsprzdne przeciwnika), ale strza syszysz na caym polu, a nie tylko w promieniu trzech pl. Zatem X jest z zakresu -4 do 5, Y za od -5 do 4 (w praktyce zakres nie ma dla ciebie wielkiego znaczenia).
Sprbujmy napisa program obsugujcy jakie przerwanie. Na pocztek niech bdzie to najprostsze przerwanie "IFSEE".

          IFSEE jest     ; wczamy przerwanie
start     FORWD 2        ; i jedzimy sobie zygzakiem
          RIGHT 1
          FORWD 3
          LEFT 1
          JMP start
jest      BACK 1         ; przeciwnik jest na nosie wic cofamy si
          FILO 3         ; i posyamy go do diaba
          IRET           ; oraz wracamy do gwnego programu

Proste, prawda? Trudniej bdzie sprawdzi, e ten program istotnie dziaa, gdy moe min sporo czasu zanim czog nadzieje si na przeciwnika. Proponuj ci uruchomi go na pustym polu przeciwko REFLEX1 i sterujc tym drugim z klawiatury podjed sam mu pod nos. eby si duej pobawi moesz zmieni instrukcj FILO 3 na FILO 1.
Teraz zmajstrujmy program do obsugi najprzydatniejszego przerwania "IFSHT". Nic do ukrycia, e posuyem si fragmentem z obsugi radaru.

          IFSHT jest
start     JMP start       ; siedzimy i czekamy na strza
jest      CMP X 0
          JZ prosto       ; strza prosto z przodu, albo z tyu
          SGN A X
          TRGT A          ; wieyczka w prawo (X>>0) lub w lewo (X<<0)
          FORWD Y         ; troch do przodu (Y>>0) lub do tyu (Y<<0)
          ABS X X         ; odrzucamy ewentualny minus...
          FIRE X          ; i grzmocimy w bandyt
          TRDIR A
          TLFT A          ; zwracamy wieyczk do przodu
          IRET
prosto    CMP Y 0
          JC ztylu        ; Y<<0, czyli jest z tyu
          FIRE Y          ; jest z przodu i jest po nim
          IRET
ztylu     TRGT 2          ; obrt w ty
          ABS Y Y         ; nie mona strzela na ujemn odlego
          FIRE Y
          TLFT 2          ; wieyczka do przodu
          IRET

Mao uyteczny to program, ale dobrze obrazuje uycie tego przerwania. Podczas prawdziwych walk zapewne czciej bdziesz uywa owo przerwanie do ucieczki przed strzaem ni do namierzenia przeciwnika, ale tak te mona.
Przerwaniem "IFRAD" nie bdziemy si zajmowa, gdy dziaa ono analogicznie do "IFSHT".

To wszystko czego mog ci nauczy o jzyku ATEN-12XTND. A teraz egnam ci z czystym sumieniem i poczuciem, e umiesz walczy o wasnych siach. yczc powodzenia w przyszych bataliach zostawiam ci wraz z kilkoma przykadowymi wojownikami na dobry pocztek.
