Na Amigę dostępnych jest kilka wersji kompilatorów Wojen Rdzeniowych (gry
opisanej w sąsiednim artykule). Jednym z nich jest HArbiter - pakiet rodzimej
produkcji, stworzony przez Pawła Gawrońskiego. Od niedawna jest dostępny
w Aminecie.
Do tworzenia programów-wojowników wystarczy dowolny edytor tekstu. Dozwolone
jest wykorzystywanie etykiet (nie muszą się kończyć dwukropkiem), a jako
parametrów instrukcji - stałych (np. abc=1) oraz wyrażeń algebraicznych na
liczbach całkowitych. Każdy
z programów można (ale nie trzeba) zakończyć pseudoinstrukcją END. Gdy
podamy po niej nazwę etykiety - kompilator rozpocznie wykonywanie programu
od wskazanego miejsca. Miejsce startu można również zaznaczyć etykietą
'Start'. Gdy początek nie zostanie przez programistę oznaczony, program
będzie wykonywany od pierwszej instrukcji.
Działanie wojownika sprowadza się do operowania zawartościami komórek obszaru
gry. Autor walczących programów posługuje się językiem Redcode, oferującym
dziesięć instrukcji analizujących zawartość komórek. Każda z komórek zawiera
kod instrukcji oraz dwa parametry. Parametry (argumenty) służą do sterowania
instrukcjami języka i mają postać liczb dziesiętnych, poprzedzonych
operatorem '#', '$', '@' lub '<'. W zależności od rodzaju operatora zmienia
się charakter argumentu na jeden z czterech niżej opisanych:
# - argument natychmiastowy (#15 jest równoznaczne wartości 15)
$ - argument bezpośredni (wskazuje adres pamięci z którego ma być pobrana
wartość, np. $2 odwołuje się do zawartości komórki znajdującej się dwa
miejsca dalej)
@ - argument pośredni (adres komórki, której pole B, czyli drugi parametr,
wskazuje adres skąd ma być pobrany właściwy argument)
< - argument pośredni zmniejszany (jest to argument pośredni, przy czym
przed wykonaniem instrukcji w której został użyty wskazany adres jest
zmniejszany o jeden, a po jej wykonaniu zmniejszana jest o jeden zawartość
komórki)
Brak operatora zmienia automatyczne charakter argumentu na bezpośredni.
Programista powinien pamiętać, że odwoływanie się do określonych komórek
regulowane jest zasadami adresowania względnego. Oznacza to, że komórka
której zawartość ma być zbadana bądź zmieniona, wskazywana jest przez podanie
liczby komórek dzielących ją od aktualnie wykonywanej instrukcji.
Każdej z istniejących instrukcji towarzyszą dwa argumenty, jednak nie
wszystkie korzystają z obydwu. Niektóre z instrukcji są sterowane tylko
jednym parametrem - drugi można więc pominąć bądź użyć do przechowywania danych.
Oto lista dostępnych instrukcji wraz z krótką charakterystyką:
DAT [A] B
instrukcja niewykonywalna - jej wykonanie spowoduje zniszczenie
programu, służy więc za broń przeciwko przeciwnikowi,
może być również używana do przechowywania danych
MOV A B
gdy A jest argumentem natychmiastowym - przepisuje jego wartość do pola B
komórki znajdującej się pod adresem B; gdy A jest innym argumentem niż
natychmiastowy - następuje skopiowanie całej komórki z miejsca wskazanego
adresem A pod adres wskazany parametrem B
ADD A B
gdy A jest argumentem natychmiastowym - pole B komórki znajdującej się
pod adresem B jest zwiększane o podaną wartość A; gdy A jest innym
argumentem niż natychmiastowy - oba pola A i B komórki pod adresem B
zwiększane są o zawartość pól A i B komórki znajdującej się pod adresem A
SUB A B
instrukcja analogiczna do ADD, lecz zmniejszająca zawartość pól komórki
JMP A [B]
skacze do adresu wskazanego argumentem A
JMZ A B
skok warunkowy do adresu A gdy w polu B komórki pod adresem B jest zero
JMN A B
skok warunkowy do adresu A gdy w polu B komórki pod adresem B jest wartość
różna od zera
DJN A B
instrukcja skoku warunkowego, która najpierw zmniejsza o 1 zawartość pola
B komórki pod adresem B, a następnie skacze do adresu A gdy pole B jest
różne od zera
CMP A B
jeśli A jest argumentem natychmiastowym - porównuje wartość A z polem B
komórki pod adresem B i gdy wartości są takie same - przeskakuje następną
instrukcję; gdy A jest innym argumentem niż natychmiastowy - porównuje
oba pola komórek znajdujących się pod adresami A i B, a gdy zawierają one tą
samą wartość - przeskakiwana jest następna instrukcja
SPL A [B]
uruchamia niezależny program (proces) od komórki znajdującej się pod adresem
A (instrukcje nowo powstałego programu są wykonywane na zmianę z
instrukcjami już istniejących programów z tej samej drużyny)
SLT A B
gdy A jest argumentem natychmiastowym - porównuje wartość A z polem B
komórki pod adresem B i gdy A jest mniejsze od wartości tego pola
- przeskakiwana jest następna instrukcja; w przypadku gdy A jest innym
argumentem niż natychmiastowy - brane są pod uwagę pola B komórek
znajdujących się pod adresami A i B - gdy A jest mniejsze od B przeskakiwana
jest następna instrukcja
Najprostszy z możliwych programów to tzw. skoczek:
MOV 0,1
Kopiuje on sam siebie do następnej komórki, systematycznie niszcząc
wszystko co napotka na swojej drodze. Innym znanym i równie prostym programem
jest tzw. karzeł:
DAT 0
LOOP
ADD #5,-1
MOV #0, -2
JMP LOOP
Zeruje on co piątą komórkę. Ponieważ sam zajmuje cztery komórki - siebie
omija. Mechanizm jego działania opiera się na cyklicznym zwiększaniu licznika
DAT o liczbę 5 (instrukcja ADD) i zerowaniu komórki odległej od programu
o stale zwiększającą się liczbę miejsc (instrukcja MOV). Należy pamiętać,
że obszar pamięci w którym odbywa się walka ma kształt pierścienia - komórka
następująca po ostatniej jest jednocześnie pierwszą pozycją obszaru.
Mając już przygotowane dwa programy (w pakiecie znajduje się
kilkadziesiąt przykładowych programów) można rozpocząć zabawę. HArbiter
oferuje możliwość pojedyńczej walki dwóch programów bądź turniej, w
którym mogą wziąć udział więcej niż dwa programy, a walka będzie przebiegać
systemem każdy z każdym w ustalonej przez użytkownika liczbie starć.
Aby rozpocząć grę wystarczy więc wybrać jej rodzaj (pojedynek lub turniej)
oraz wskazać programy.
Pojedynek można śledzić w oknie przedstawiającym zawartość pola walki.
Różnokolorowymi punktami zaznaczone są miejsca zajmowane przez programy
oraz komórki, których zawartość została zmieniona skutkiem działania
jednej z instrukcji. W dowolnym momencie można grę zatrzymać lub
zmienić tempo walki. Istnieje możliwość włączenia okien służących
do obserwacji wykonywanych fragmentów kodu programów.
Program Pawła Gawrońskiego pozwala na swobodną konfigurację
warunków gry. Opcje znajdujące się w preferencjach to:
- limit instrukcji (maksymalna ilość instrukcji przypadająca na program),
- wielkość rdzenia (liczba komórek obszaru walki),
- limit cykli (maksymalna ilość ruchów każdego programu),
- opóźnienie (zmiana tempa rozgrywki),
- szerokość okna rdzenia (szerokość okna do śledzenia walki),
- limit procesów (maksymalna ilość procesów na jakie może się podzielić
program jednego z graczy),
- liczba walk w turnieju (ilość starć systemu turniejowego),
- włączenie lub wyłączenie okna rdzenia oraz okien podglądu kodu programów.
HArbiter jest solidnie wykonaną wersją znanych na całym świecie Wojen
Rdzeniowych. Kompilator zapewnia zgodność ze standardem WA'91, będącym
rozszerzeniem systemu CWS'88 (Core Wars Standard of 1988). Jego jedyne
wymagania to system w wersji co najmniej 2.0 i biblioteka reqtools.library.
HArbiter jest programem typu shareware. Koszt rejestracji wynosi 10 złotych,
a wersja niezarejestrowana ma zablokowany zapis ustawień konfiguracji oraz
zapis wyników walki. Warto go zarejestrować, by spędzić wiele godzin nad
tworzeniem własnych wojowników i zmierzyć się z pomysłowością swoich
znajomych. Zapewniam, że o tej grze się nie zapomina.
Sławomir Wilk
Do góry