--VB0 --OZ1 11 topaz.font --OZ2 18 Bocklin.font --OZ3 27 bocklin.font --DF titelb --FF31 --ZS2 --SA0 --PA --SA1 --ZS0 --FF21 DEFEND --DF titelc --FF31 --ZS1 --SA0 --PA --SA1 --ZS0 --FF21 DEFEND --DF titelchen --FF31 --ZS0 --PA --ZS0 --FF21 DEFEND --DF climode --FF00 --PA --FF21 DEFEND --FF31 --ZS3 --SA0 4.4 Mausefalle --SA1 --ZS0 --FF21 --FF00 num DAT 2660 falle SPL * JMP falle anzahl DAT 798 offset DAT 0 grube JMP -3 start SUB #10, offset ADD #10, grube MOV grube, @offset DJN start, anzahl end MOV #-4, anzahl kill MOV #0, @anzahl SUB #3, anzahl DJN kill, num MOV #0, falle MOV #2660, num --FF21 `Mausefalle' wurde hinsichtlich der Ueberlegenheit der 64 Programmzeiger von `Mice' geschrieben. Es gewinnt so auch in den meisten Fällen gegen `Mice', hat aber seine Schwierigkeiten mit `Knirps' und `Gnom', weil diese Programme sehr kurz sind. `Mausefalle' besteht aus einer Falle und zwei Hauptschleifen, gekennzeichnet mit den Symbolen `start' und `kill'. In der ersten Schleife werden über den ganzen Speicher hinweg `JMP'-Befehle verteilt, die alle auf die Falle weisen. Wenn einer der `JMP'-Befehle in ein gegnerisches Programm geschrieben und früher oder später ausgeführt wird, landet der betroffene Programmzeiger in der Falle: Ein `SPL'-Befehl, der auf sich selber weist und der durch den unmittelbar darauf folgenden Sprungbefehl immer wieder ausgeführt wird. Einmal in der Falle gefangen, vermehrt sich dieser Programmzeiger immer wieder, bis schliesslich kein einziges fremdes Programm mehr frei ist: Die Ausführung der gegnerischen Programme kommt beinahe zum Erliegen. Die Schwierigkeit dieser Methode besteht in der Berechnung der Sprungweite der `JMP'-Anweisungen. Durch den Befehl `ADD #10, grube' wird die Zahl 10 zum vorgegebenen Sprungbefehl `JMP -3' addiert. Die Position der nächsten JMP-Bombe wird durch `SUB #10, offset' bestimmt: Zehn Zellen hinter der zuletzt gesetzten `JMP'-Anweisung. Mit `MOV grube @offset' wird durch die indirekte Adressierung der Inhalt von `grube' (`JMP') an die durch `offset' bestimmte Speicherzelle kopiert: Eine weitere Fallgrube ist erstellt. Der Abschluss der Schleife bildet der `DJN'-Befehl, der den ganzen Vorgang 1660 mal wiederholen lässt. Die zweite Schleife, die erst nach der Versendung der `JMP'-Anweisungen begonnen wird, überschreibt jede dritte Speicherzelle mit einer `DAT 0'-Anweisung. Dies geschieht deshalb, weil einige gegnerische Programme immer noch intakt sein können. Wenn die Schleife nach 2660 Ausführungen beendet ist, werden durch den Befehl `MOV #0, falle' alle Programmzeiger, die sich in der Falle befinden, nach spätestens 64 Zyklen gelöscht. Wenn jetzt noch kein Sieg erfolgt ist, besteht immerhin noch die Gelegenheit eines Unentschiedens: Mit der letzten `JMP'-Anweisung des Programmes wird die zweite Schleife nochmals von Vorne begonnen. Das Programm `Mausefalle2' (siehe CoreWars-Diskette, Verzeichnis `Redcode') besitzt an seinem Anfang ein `Knirpsgrab', wie es schon im ersten Kapitel vorgestellt wurde. Das Grab wird durch die erste `SPL'-Anweisung nach dem Start aktiviert. `Mausefalle' ist zwar doppelt so schnell wie `Mausefalle2', aber gegen einen Knirps kann `Mausefalle' mit grosser Wahrscheinlichkeit nur ein Unentschieden herausholen. Im Gegensatz dazu gewinnt `Mausefalle2' gegen `Mice' viel seltener, weil die Berechnung der `JMP'-Anweisungen schon zu langsam ist.