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.

Inhaltsverzeichnis

Kampfregeln

Redcode als Kampfsprache unterscheidet sich von anderen Assembler-Sprachen:

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

See also: Core War, Adressierung (Datenverarbeitung), Alexander K. Dewdney, Assembler (Informatik), Modulo, Scientific American, Virtuelle Maschine