Hilfe ber Hilfe ---------------- In diesem Fenster sehen Sie das eingebaute Hilfe-System von CoreWar. Es ist dazu gedacht, Ihnen eine grobe šbersicht ber das Spiel und seine Bedienung zu geben. Fr weitergehende Informationen und Erkl„rungen von Begriffen greifen Sie bitte auf die Handbcher zurck. Geben Sie beim Indexfeld "INDEX" oder die letzte Seitennummer ein, um das alphabetisch sortierte Index-Verzeichnis zu erhalten. Zu jedem Stichwort werden optional Querverweise angegeben, unter denen weitere Informationen stehen. Geben Sie dazu die Querverweise im Indexfeld ein. Das Men von CoreWar besteht aus folgenden Punkten: Ende - Mit diesem Menpunkt k”nnen Sie das Programm beenden. Dabei k”nnen Sie die eingestellten Optionen abspeichern lassen. MARS - Hinter diesem Menpunkt verbirgt sich das eigentliche Spiel mit integrierter Debugging-Funktion. Assembler - Ein einmal eingetipptes Kampfprogramm muá, bevor man es auf einen Gegner loslassen kann, erst mit dem Assembler in die Sprache des MARS bersetzt werden. Wenn der Assembler auf Fehler st”át, wird keine Objektdatei erzeugt. Editor - Editieren eines Kampfprogramms oder L”schen eines K„mpfers. Optionen - Programmparameter „ndern (z.B. Eingabe eines anderen Editor- namens, Wechseln zwischen Standard und Erweiterung). Drucken - Kampfprogramm oder Fehlerdatei drucken. Hilfe - Diesen Menpunkt haben Sie gerade gew„hlt. Bedienung der Fenster: Steuerung: Zwischen den einzelnen Komponenten eines Fensters kann mit den Cursortasten LINKS und RECHTS gewechselt werden. Der Titel der ausge- w„hlten Komponente wird dann invers dargestellt. Mit SPACE oder RETURN beendet man die Eingabe einer Komponente. Mit ESC wird das Fenster verlassen und auf das Fenster der n„chsth”heren Ebene gegangen. Maus: Wenn Sie eine Maus angeschlossen und einen Maustreiber installiert haben, k”nnen Sie die Komponenten des Fensters direkt mit dem Maus- zeiger und Drcken der linken Maustaste ausw„hlen. Die rechte Maus- taste ist gleichbedeutend mit der ESC-Taste und hat die gleiche Wir- kung. Bedienung eines Eingabefeldes: Steuerung: In einem Eingabefeld kann mit BACKSPACE oder DEL gel”scht werden, im Namenseingabefeld kann mit den Cursortasten HOCH und RUNTER die Verzeichnisanzeige durchgegangen werden. PAGE UP/DOWN berspringt in der Verzeichnisanzeige mehrere Positionen. In einem Zahleneingabefeld kann mit den Cursortasten HOCH und RUNTER der Wert erh”ht bzw. erniedrigt werden. Alle Mens und Fenster lassen sich auch durch eine Maus bedienen. Sie mssen aber dafr Sorge tragen, daá Sie eine Maus angeschlossen und einen Maustreiber installiert haben. Bewegen Sie den Mauszeiger auf einen Menpunkt im Hauptmen oder auf eine Komponente eines Fensters. Drcken Sie dann die linke Maustaste, um den Menpunkt bzw. die Komponente zu aktivieren. Kann keine Komponente ausge- w„hlt werden, so ert”nt ein Piepton. Die rechte Maustaste ist gleichbedeutend mit der ESC-Taste und hat die gleiche Wirkung. Hinter diesem Menpunkt verbirgt sich das eigentliche Spiel von CoreWar. In dem Fenster von MARS k”nnen folgende Felder bzw. Schalter eingestellt werden: Modus: Kampf zweier Kampfprogramme oder Test eines K„mpfers Debug: Debugger Informationen an oder aus Grafik: Grafische Anzeige der Arena oder nur Textanzeige Kampfanzahl: Anzahl der K„mpfe, die ausgetragen werden sollen K„mpfer: Namen der K„mpfer Im MARS-Eingabefenster kann man den Spielmodus Debug einstellen. Genau wie im normalen Kampf k”nnen Sie auch bei eingeschaltetem Debugmodus zwischen einem Grafik- und Text-Debugmodus w„hlen. Debug im Textmodus: ------------------- Fr jeden K„mpfer werden drei Speicherbl”cke angezeigt, jeweils von einer Speicherzelle eine Umgebung der zwei davor und dahinter liegenden Zellen: Anweisungsblock - Umgebung der aktuellen Anweisung. Zielblock A - Umgebung der Adresse, auf die der erste Operand zugreift. Zielblock B - Umgebung der Adresse, auf die der zweite Operand zugreift. Zus„tzlich werden zu jedem K„mpfer die Inhalte der 5 Register dargestellt. Aufbau eines Blocks: Name des Blocks - Jeder Block tr„gt als Kennung einen Titel, der anzeigt, ob es sich um einen Anweisungsblock eines K„mpfers (KM1 bzw. KM2) oder Zielblock (Ziel A bzw. B) handelt. Queue - Im Titel des Anweisungsblocks wird ein Ausschnitt der Queue angezeigt. Die erste Adresse gibt die zuvor bearbeitete Anweisung an. Die zweite Adresse enth„lt die aktuelle Anweisung. Die dritte Adresse gibt die Speicherzelle der folgenden Anweisung an (falls diese schon feststeht). Aufbau eines Blocks (Fortsetzung): * - Markierung - Derjenige K„mpfer, der die n„chste Anweisung ausfhrt, wird im Titel seines Anweisungsblocks mit Sternchen markiert. Operanden - In den Zielbl”cken gibt der Titel die aufgel”ste Adresse der aktuellen Anweisung an. Besitzattribut - In der ersten Spalte jedes Blocks wird das Besitz- attribut dargestellt (1 = K„mpfer 1; 2 = K„mpfer 2). Adressen - Die zweite Spalte eines Blocks gibt die absoluten Adressen des angezeigten Blocks an. Aufbau eines Blocks (Fortsetzung): Anweisungen - Hinter den Adressen stehen die in den Speicherzellen enthaltenen Anweisungen im disassamblierten Format. In der mittleren Zeile des Anweisungsblocks steht die aktuelle Anweisung. Eingaben: --------- Bereich - Adresse einer w„hlbaren Speicherzelle, die mit ihren Nachbarzellen im Bereichsblock angezeigt wird. Beim inter- aktiven Žndern des Bereichs wird die Anzeige im Bereichs- block sofort aktualisiert. Schrittweite - Festlegung einer Schrittweite Eingaben (Fortsetzung): Schritte - Abarbeiten von Schrittweite Anweisungen auf einmal. 1 Schritt - Nur die n„chste Anweisung ausfhren. Grafik ein - Grafikmodus unter Debug einschalten. Abbruch - Abbruch von MARS, Anzeige des Fensters 'MARS beendet'. Debug im Grafikmodus: --------------------- Anzeige - Analog zum normalen Grafikmodus. Grafik aus - Wechseln zum Debug-Textfenster. N Schritte weite - Angegebene Anzahl Anweisungen abarbeiten. Schrittweite „ndern - Dazu muá in das Textfenster gewechselt werden. Bei diesem Menpunkt wird der Assembler aufgerufen. Geben Sie im Feld 'K„mpfer' den Namen des Redcode-Programms ein, das Sie assemblieren m”chten. Das Feld 'max. Fehlermeldungen' gibt an, ab wievielen Fehlern der Assembler den šbersetzungsvorgang eines Redcode-Programms in eine Objektdatei abbricht. Ist der Assembler gestartet, so werden zwei Durchg„nge durchlaufen, wobei am Ende eine Objektdatei erzeugt wird. Sollten Fehler auftreten, so wird keine Objektdatei erzeugt, eine existierende Objektdatei wird gel”scht. Dadurch k”nnen Sie sicher sein, daá Sie nicht aus Versehen im MARS ein „lteres Kampfprogramm laufen lassen, da das aktuelle noch fehlerhaft ist. Bei diesem Menpunkt k”nnen Sie die Redcode-Datei eines Kampfpro- gramms editieren. Weiterhin haben Sie die M”glichkeit, ein be- stehendes Kampfprogramm zu l”schen. Als Editor steht als Voreinstellung der BIGEMACS zur Verfgung. In dem Menpunkt Optionen k”nnen Sie auch einen Editor Ihrer Wahl ein- stellen. Die wichtigsten Control-Sequenzen: CTRL-Z Abspeichern und beenden CTRL-X CTRL-C Editieren beenden CTRL-X CTRL-B Liste der benutzten Buffer CTRL-X B Auf anderen Buffer wechseln CTRL-X CTRL-S Aktuellen Buffer speichern CTRL-X S Alle Buffer speichern CTRL-X 2 Weiteres Fenster ”ffnen CTRL-X 1 Alle Fenster bis auf das aktive schlieáen CTRL-X CTRL-R Datei einlesen CTRL-X CTRL-W Datei schreiben Funktionstasten: F1 MS-DOS-Kommando ausfhren F2 DOS-Shell aufrufen F3 Umschalten zwischen den Fenstern Arbeiten mit zwei Bildschirmen 1. Aufruf von BIGEMACS mit dem Namen der Redcode-Datei 2. Erzeugen eines zweiten Fensters mit CTRL-X 2 3. Wechseln des Buffers mit CTRL-X B und Angabe eines neuen Buffernamens 4. Laden der Fehlerdatei mit CTRL-X CTRL-R und Eingabe des Dateinamens 5. Editierung ... (mit F3 kann zwischen den zwei Fenstern umgeschaltet werden; mit CTRL-X 1 kann das nicht aktive Fenster geschlossen werden) 6. Abspeichern und Beenden mit CTRL-Z Vorsicht: Durch Drcken der Funktionstaste F2 macht BIGEMACS eine weitere DOS-Shell auf. Wenn Sie dann den Befehl EXIT eintippen, wird diese DOS-Shell geschlossen, und BIGEMACS ist wieder zur Eingabe bereit. Bei diesem Menpunkt k”nnen Sie ein bestehendes Redcode-Programm aus- drucken. Falls Sie ein Redcode-Programm assembliert haben, wobei Fehler aufgetreten sind, so existiert zus„tzlich eine Fehlerdatei zum Redcode-Programm. Diese Fehlerdatei k”nnen Sie auch ausdrucken lassen. Bei Optionen k”nnen Sie Einstellungen fr CoreWar vornehmen: Editorname: Hier kann der Editor ggf. mit Pfad eingestellt werden, der im Menpunkt 'Editor' bei der Auswahl 'Editor starten' aufgerufen wird. Speicherarenagr”áe: Hier kann eingestellt werden, wie groá die Arena sein soll, in der die K„mpfer gegeneinander antreten. K„mpferabstand: Hier wird der minimale Abstand zweier K„mpfer in der Arena festgelegt. Zyklenzahl: Wieviele Zyklen sollen abgearbeitet werden? Wenn diese Zahl erreicht wird, ist der Kampf beendet und wird als Unentschieden gewertet. Schrittweite: Einstellung fr den Debugger, wieviele Schritte als Vorgabe hintereinander abgearbeitet werden sollen. Suffixe: Hier kann eingestellt werden, mit welcher Extension die jeweiligen Dateien abgelegt werden. Assembler: Einstellung, ob der Assembler im Standard oder in der Erweiterung ein Redcode-Programm bersetzt. MARS: Hier kann ausgew„hlt werden, ob mit oder ohne Register gespielt werden soll. Free-Task-Register(%0): Wenn mit Registern gespielt wird, wird hier der Startwert fr das %0-Register eingestellt. Dieses Register bestimmt, wie oft sich ein Programm teilen darf. Inkrement Free-Task bei: Der Wert hierbei bestimmt, wieviele gegnerische Speicherstellen getroffen werden mssen, damit das %0-Register um 1 erh”ht wird. Grafikfarben: Hier k”nnen die Farben der K„mpfer bei Grafikanzeige ge- w„hlt werden. Es gibt 11 Redcode-Anweisungen: DAT MOV ADD SUB JMP JMZ JMN CMP SLT DJN SPL und zwei Direktiven: EQU END Fr weitere Hilfe geben sie eine Anweisung oder Direktive im Index- Feld an. Einer Redcode-Anweisung folgen allgemein zwei Operanden, Ausnahmen hierbei sind bei den einzelnen Anweisungen angegeben. Syntax: Anweisung Operand A Operand B Beispiel: ADD #5 37 Eine Redcode-Anweisung und Operanden werden durch Leer- oder Tabulator- zeichen voneinander getrennt. Ein Operand besteht aus einem die Adressierungsart angebenden Pr„fixzeichen ( '#',' ','@','<' ), und einem Ausdruck. Bei der Erweiterung sind auch Register als Operanden erlaubt. Bedeutung der Krzel der Redcode-Anweisungen: DAT Data MOV Move ADD Add SUB Subtract JMP Jump JMZ Jump on zero JMN Jump on non-zero CMP Compare SLT Skip on less than DJN Decrement and jump on non-zero SPL Split Adressierungsarten: '#' Unmittelbar ' ' Direkt, diese Adressierungsart wird durch kein Zeichen eingeleitet '@' Indirekt '<' Pr„dekrement-Indirekt Ein Ausdruck besteht aus Labels und Zahlenkonstanten, die beliebig mit den Operatoren '+','-','*','/' in Infixnotation verknpft werden k”nnen. Wichtig: Ein Ausdruck darf im Standard keine Leer- oder Tabulator- zeichen enthalten! Beispiele: start+5*2 ist im Standard ein zul„ssiger Ausdruck (start + 5*2) ist nur in der Erweiterung ein zul„ssiger Ausdruck start + 5*2 ist in jedem Fall ein unzul„ssiger Ausdruck In der Erweiterung des Redcode-Standards ist folgendes erlaubt: 1. Verwendung von Registern. 2. Ein Operand darf mit '(' und ')' geklammert werden, dabei drfen innerhalb der Klammerung Leer- und Tabulartorzeichen verwendet werden. Es existieren folgende Register: %0 Free-Task %1 Hurt-Event %2 Hurt-Address %3 Hunt-Event %4 Hunt-Address Die DAT-Anweisung ben”tigt einen Operanden: DAT A Falls nur ein Operand angegeben ist, wird dieser als Operand B ange- nommen, wobei der Operand A als #0 gesetzt wird. Als Adressierungs- arten sind direkt und unmittelbar zugelassen, die aber keinen Einfluá auf die Auswirkung der Anweisung haben. Die DAT-Anweisung erfllt zwei verschiedene Funktionen: 1. Sie wird verwendet, um Daten im Speicher abzulegen, auf die man zurckgreifen und die man ggf. „ndern kann. 2. Da eine DAT-Anweisung nicht ausfhrbar ist, kann man mit dieser Anweisung Tasks (und somit auch ganze Programme) zum Absturz bringen. Daher werden bei vielen Programmen auch DAT-Anweisungen in den Speicher geschrieben. Die MOV-Anweisung ben”tigt zwei Operanden: MOV A B Fr den Operanden A sind alle Adressierungsarten zul„ssig, fr den Operanden B jedoch nur direkt , indirekt '@' und pr„dekrement-indirekt '<'. Die MOV-Anweisung wirkt in Abh„ngigkeit von der Adressierungsart des Operanden A. Ist dieser mit der Adressierungsart unmittelbar versehen, so wird das B-Feld in das B-Feld der B-Speicherzelle kopiert, andernfalls wird die A-Speicherzelle in die B-Speicherzelle kopiert. Die ADD-Anweisung ben”tigt zwei Operanden: ADD A B Fr den Operanden A sind alle Adressierungsarten zul„ssig, fr den Operanden B nur direkt, indirekt '@' und pr„dekrement-indirekt '<'. Das A-Feld und das B-Feld der durch den Operanden A referenzierten A-Speicherzelle werden einzeln zu dem A-Feld und dem B-Feld der B-Speicherzelle addiert. Falls die Adressierungsart des Operanden A unmittelbar ist, wird das A-Feld dieses Operanden zu dem B-Feld der B-Speicherzelle addiert. Die SUB-Anweisung ben”tigt zwei Operanden: SUB A B Fr den Operanden A sind alle Adressierungsarten zul„ssig, fr den Operanden B direkt, indirekt '@' und pr„dekrement-indirekt '<'. Ist die Adressierungsart des Operanden A unmittelbar, wird das A-Feld von dem B-Feld der B-Speicherzelle subtrahiert; andernfalls werden das A-Feld und das B-Feld der A-Speicherzelle jeweils von dem A-Feld und dem B-Feld der B-Speicherzelle subtrahiert. Die JMP-Anweisung ben”tigt nur einen Operanden: JMP A Falls nur ein Operand angegeben ist, wird dieser als Operand A angenommen, und der Operand B wird #0 gesetzt. Fr den Operanden A sind nur direkt, indirekt '@' und pr„dekrement-indirekt '<' als Adressierungarten zul„ssig, fr den Operanden B jedoch alle. Das Programm, das die JMP-Anweisung ausfhrt, f„hrt in seiner Abarbeitung an der Adresse der A-Speicherzelle fort. Der optionale Operand B ist an der Ausfhrung nicht beteiligt. Die JMZ-Anweisung ben”tigt zwei Operanden: JMZ A B Fr den Operanden A sind nur die Adressierungsarten direkt, indirekt '@' und pr„dekrement-indirekt '<' zul„ssig, fr den Operanden B jedoch alle. Falls der B-Operand #0 ist bzw. das B-Feld der B-Speicherzelle gleich Null ist, wird mit der Programmabarbeitung an der Adresse der A-Speicherzelle fortgefahren. Die JMN-Anweisung ben”tigt zwei Operanden: JMN A B Fr den Operanden A sind nur direkt, indirekt '@' und pr„dekrement-indirekt '<' als Adressierungarten zul„ssig, fr den Operanden B jedoch alle. Falls der Operand B nicht #0 ist bzw. das B-Feld der B-Speicherzelle ungleich Null ist, wird mit der Programmabarbeitung an der Adresse der A-Speicherzelle fortgefahren. Die DJN-Anweisung ben”tigt zwei Operanden: DJN A B Fr den Operanden A sind nur direkt, indirekt '@' und pr„dekrement-indirekt '<' als Adressierungarten zul„ssig, fr den Operanden B jedoch alle. Zuerst wird das B-Feld des Operanden B um eins vermindert, falls der Operand B die Adressierungsart unmittelbar hat; ansonsten wird das B-Feld der B-Speicherzelle um eins vermindert. Danach wird mit dem Operand A und dem dekrementierten Operand B der B-Speicherzelle eine JMN-Anweisung ausgefhrt. Die CMP-Anweisung ben”tigt zwei Operanden: CMP A B Fr den Operanden A sind alle Adressierungsarten zul„ssig, fr den Operanden B nur direkt, indirekt '@' und pr„dekrement-indirekt '<'. Falls der Operand A die Adressierungsart unmittelbar hat, wird das A-Feld des Operanden A mit dem B-Feld der B-Speicherzelle verglichen; ansonsten wird die gesamte A-Speicherzelle mit der B-Speicherzelle verglichen. Falls beide Werte bzw. beide Anweisungen gleich sind, wird die n„chste Anweisung bersprungen, d.h. eine JMP-Anweisung JMP 2 wird ausgefhrt. Die SLT-Anweisung ben”tigt zwei Operanden: SLT A B Fr den Operanden A sind alle Adressierungsarten zul„ssig, fr den Operanden B nur direkt, indirekt '@' und pr„dekrement-indirekt '<'. Falls der Operand A die Adressierungsart unmittelbar hat, wird geprft, ob das A-Feld dieses Operanden kleiner dem B-Feld der B-Speicherstelle ist. In diesem Fall wird die n„chste Anweisung bersprungen 'JMP 2'. Ist die Adressierungsart des Operanden A nicht unmittelbar, so wird getestet, ob das B-Feld der A-Speicherzelle kleiner dem B-Feld der B-Speicherzelle ist. Ist dies der Fall, wird die n„chste Anweisung bersprungen. Wichtig: Da der Speicher zyklisch angeordnet ist, werden fr die SLT-Anweisung negative Werte in positive umgerechnet, indem bei negativen Werten die Speichergr”áe addiert wird. Daher ist z.B. - 1 > 2. Die SPL-Anweisung ben”tigt nur einen Operanden: SPL A Falls nur ein Operand angegeben ist, wird dieser als Operand A angenommen und der Operand B wird #0 gesetzt. Fr den Operanden A sind nur direkt, indirekt '@' und pr„dekrement-indirekt '<' als Adressierungsarten zul„ssig, fr den Operanden B jedoch alle. Durch die SPL-Anweisung teilt sich ein Task in zwei Tasks auf. Der Programmz„hler des ursprnglichen Tasks wird um eins erh”ht und der Warteschlange angefgt. Anschlieáend wird auch die Adresse der A-Speicherzelle als Programmz„hler des neuen Task der Warteschlange angefgt. Der Operand B ist an der Ausfhrung nicht beteiligt. Die EQU-Direktive definiert eine benannte Konstante. Sie hat die Form: name EQU Ausdruck Der Wert des Ausdrucks wird dem Bezeichner "name" zugewiesen. Fr die Bezeichner dieser Direktive gelten die gleichen Regeln wie bei den Labels. Im Ausdruck drfen nur vor referenzierte Labels vor- kommen. Falls Labels verwendet werden, so ist zu beachten, das der Label durch die Nummer der Programmzeile innerhalb des Programms ersetzt wird, an deren Anfang er steht. Dabei beginnt die Z„hlung bei 0. Die END-Direktive hat zwei verschiedene Aufgaben. Zum einen wird mit der END-Direktive das Ende des Programms signalisiert, d.h. alle Anweisungen, die dieser Direktive folgen, werden ignoriert. Zum anderen wird mit der Direktive der Programmbeginn festgelegt. Die Ausfhrung eines Kampfprogramms muá nicht bei der ersten Anweiseung beginnen. Man hat die M”glichkeit, die Startadresse als Ausdruck hinter dem END anzu- geben. Fehlt dieser Ausdruck, so beginnt das Programm mit seiner ersten Anweisung. Beispiele: END Start bei der ersten Anweisung END 0 Start bei der ersten Anweisung, Adresse 0 END 27 Start bei Adresse 27 CoreWar wurde im Rahmen des Informatik-Praktikums II an der Georg-August-Universit„t G”ttingen im Fachbereich Mathematik verwirklicht. Die Autoren sind: Stefan Balliel Jochen Biedermann Udo Edelmann Projektleiter: Helge Robitzsch Helge Hargesheimer Assistent: Volker Hampe Andreas Jahn Bernd Kellner Jens Trapp