Core War
Core War, zu deutsch Krieg der Kerne, ist ein Computerspiel, bei dem zwei oder mehr Programme, die in einer simplen, assemblerartigen Sprache namens Redcode geschrieben sind, im selben Speicherraum gegeneinander antreten. Gewinner ist das Programm, das alle anderen überlebt. Obwohl Core War für beliebige Arten des Spiels stehen kann, wird gemeinhin die Variante gemeint, die auf der Programmiersprache Redcode basiert und durch die Artikel von Alexander K. Dewdney im Scientific American bekannt wurde.
Diese Programme werden vom Memory Array Redcode Simulator (MARS), einer virtuellen Maschine, ausgeführt.
Die International Core War Society (ICWS) hat 1984 und 1988 Revisionen von Redcode veröffentlicht, ein Update-Vorschlag von 1994 wurde nicht verabschiedet.
Kampfregeln
Redcode als Kampfsprache unterscheidet sich von anderen Assembler-Sprachen:
- Es wird nur relative Adressierung verwendet.
- Der Speicherraum (Core) ist ringförmig. Adressen sind daher als modulo der Speichergröße zu interpretieren.
- Jedes mögliche Argument eines Befehls ist auch ein gültiges Argument.
- Daten werden als Argumente des Befehls DAT gespeichert.
- Durch Ausführung von DAT als Befehl stirbt der Prozess.
Programme
Die ersten Programme waren eher dröge und langweilig. Das einfachste Programm imp (im deutschen "Knirps"), bestehend aus einer Anweisung (mov 0 1
), kopiert seinen inhalt ein Feld weiter, und geht dann auf dieses Feld.
Zwilling
Gemini (im deutschen "Zwilling") macht von seinem Programm eine komplette Kopie, und springt dann in seine Kopie.
jmp 3
dat1 dat #0
dat2 dat #99
start mov @dat1 @dat2
add #1 dat1
add #1 dat2
cmp dat1 dat3
jmp start
mov #99 94
jmp 94
dat3 dat #10
Erst mit der Einführung des Befehl SPL (split, aufspalten) kam Dynamik in das Spiel. Das zeigte sich an zwei Programmen mit verschiedenen Strategien.
Mice und Catcan
Während das Programm Mice (von Chip Wendell) den Befehl SPL benutzt, um sich kontrolliert aufzusplitten,
ptr dat #0
org mov #12 ptr ; n = 12
loop mov @ptr <dest ; *dest = *(ptr+(*ptr))
djn loop ptr ; if(--ptr != 0)
; goto loop
spl @dest ; split(*dest)
add #653 dest ; dest += 653
jmz org ptr ; if(!ptr)
; goto org
dest dat #0 #833
end org
benutzt das Program Catcan (Katzendose ??, Catch as catch can ??) die Anweisung als Split-Bombe, um den Gegner auszuschalten, um ihm zuletzt durch Auslöschung den Garaus zu machen:
Warrior: Cat Can Standard: CWS'88
Author: A. Kirchner Remixor: F. Uy
start mov trap2 < bomb
mov trap1 < bomb
sub # 6 bomb
jmn start bomb ; trap loop
set mov # -12 bomb
kill mov bomb @ bomb
djn kill bomb ; kill loop
reset jmp set 0
jmp set 0
dat # 0 # 0 ; buffer
bomb dat # 0 # -1024
trap1 spl 0 2
trap2 jmp -1 1
end start
; ; Your basic two sweep methodical bomber. ; Fires SPL 0 and JMP -1 at every eight ; addresses, then erases the core with ; DAT bombs.
Obwohl Mice gegen die meisten älteren Gegner (Gnome, Zwilling, ..) überlegen war, war Catcan mit seiner Split-Bombe noch erfolgreicher.
Um die Konsequenz der SPL Anweisung zu verstehen, muss man wissen, wie ein Duell in Core War aussieht. Der Ablauf sieht nämlich vor, das erst das eine Programm eine Anweisung ausführt, und dann das andere Programm. Wenn nun ein Programm eine SPL-Anweisung ausführt bewirkt das, das der Ablauf eines Programms auf zwei verschiedene Teile aufgespaltet wird. Ohne Split ist der Ablauf bei zwei Programmen A und B: A B A B A B ... . Wenn nun Programm B nur sich nur einmal auf zwei Segmente aufspaltet (was durchaus sinnvoll sein kann) is der Ablauf A B1 A B2 A B1 A B2A B1 A B2 ... . Wenn ein Programm nun von einer SPL Bombe getroffen wird, oder in eine solche hineintappt, dann muss das Programm, expotential steigernd, immer mehr seiner "Rechenzeit" für die völlig unnütze Anweisungen verschwenden.
Agony
Mit dem 94er Standard entstanden zahlreiche Programme (die so genannten Vampire), die dem Catcan weit überlegen sind. Als Beispiel dafür das Programm Agony 2.1 von Stefan Strack:
;strategy Small-interval CMP scanner that bombs with a SPL 0 carpet. ;strategy 2.0: smaller ;strategy 2.1: larger, but should tie less; changed scan constants ;strategy Submitted: @date@
CDIST EQU 23 ; distance between addresses CoMPared
IVAL EQU 994 ; scan increment (mod-2 pattern)
scan ADD incr, comp ; CMP scan loop:
comp CMP 0, CDIST ;
SLT #incr-comp+CDIST+(bptr-comp)+1,comp ; don't bomb self
JMP scan ;
MOV #CDIST+(bptr-comp)+1,count ; init bomb-loop w/ # of bombs
MOV comp, bptr ; use "comp" as bomb-pointer
bptr DAT #0 ; this will be "comp" when exec
split MOV bomb, <bptr ; bomb away
count DJN split, #0
JMN scan, scan ; fall thru when self-obliterated
bomb SPL 0 ; and clear the core
MOV 2,<-1
incr DAT #IVAL, #IVAL
Weblinks
- The Beginner's Guide to Redcode by Ilmari Karonen provides an introduction to Redcode for programmers and nonprogrammers alike.
- KOTH.org hosts "King of the Hill" Core War tournaments and provides information and software.
- The Core War FAQ