Amiga Minus 1/2001 - Niekomercyjny Magazyn Użytkowników Komputerów Amiga
  Wydanie internetowe Nr 1, Marzec 2001  

 Okładka
 Przełamując schematy
 Prawa autorskie
 Stopka redakcyjna

 Amiga Inc. zabija Amigę?
 Amiga Inc. w ocenie Polaków

 Jay Miner, ojciec Amigi
 Amiga w Gazecie Wyborczej
 Opinie
 Zamiast narzekać na piractwo

 Lato, lato...
 Amiga-fiction

 Urban Mueller
 Marcel Beck

 Pirackie oprogramowanie
 Ile za oryginalny program?
 Jakie programy do Internetu?
 Zdania o firmie Elbox

 Gwóźdź do trumny
 Dobra robota
 Najlepsi na scenie

 ZShell - z Unixa na Amigę

 Świat gier tekstowych
 Wojny rdzeniowe
 HArbiter


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