Warrior: phat_diet

Hill: Beginner Standard 94
Author: physsio
Redcode
;redcode-94b
;name phat_diet
;author physsio
;assert CORESIZE == 8000
;strategy phatpaper + Anti phatpaper
;strategy Picks one strategy based on previous rounds

step        equ       4437

ORG start

result      dat       #0,         #0                  ;a contains result, b contains pick
score       dat       #0,         #0                  ;a contains stga score, b contains stgb score, score = wins - loss

start       ldp.a     #0,         result
            ldp.ab    #1,         result
            ldp.a     #2,         score               ;load stga score
            ldp.ab    #3,         score               ;load stgb score
            sne.a     #-1,        result              ;do init on first round
            jmp       init
            jmp       record
init        stp.ab    #100,       #2                  ;set initial scores equal to number of rounds to avoid negative numbers
            stp.ab    #100,       #3
            jmp       pstga
record      sne.a     #1,         result              ;record the result into p space
            jmp       recordw
            sne.a     #2,         result
            jmp       max                             ;was a tie don't record anything just pick next
            ;jmp      recordl
recordl     sne.ab    #2,         result              ;record the loss.
            jmp       stgbl
            ;jmp      stgal
stgal       sub.a     #1,         score
            stp.ab    score,      #2                  ;store stga score
            jmp max

recordw     sne.ab    #2,         result              ;record the win
            jmp       stgbw
            ;jmp      stgaw
stgaw       add.a     #1,         score
            stp.ab    score,      #2                  ;store stga score
            jmp       max

stgbw       add.ab    #1,          score
            stp.b     score,       #3                 ;store stgb score
            jmp       max

stgbl       sub.ab    #1,          score
            stp.b     score,       #3                 ;store stgb score
            ;jmp      max
max         slt.ab    score,       score
            jmp       pstga
            ;jmp      pstgb
pstgb       mov.ab    #2,         result
save        stp.b     result,     #1
protect     mov.i     result,     init
            mov.i     result,     init+1
            mov.i     result,     stgal+1
            mov.i     result,     stgaw+1
            mov.i     result,     stgbl+1
            mov.i     result,     stgbw+1
            mov.i     result,     save
same        sne.ab    #1,         result
            jmp       paper         ;stga
            jmp       search         ;stgb
pstga       mov.ab    #1,         result
            jmp       save

paper       mov.ab    #fin+1,     #0                  ;paper contains the length of the program in A
scan        add.ab    #step,      #step               ;scan is the ptr to area being scanned
            jmz.f     scan,       @scan
            slt       paper,      scan                ;do not overwrite yourself, it may overwrite other copies
            jmp       scan
            add.ab    paper,      scan                ;copy back to front ending where we found data
copy        mov.i     <paper,     <scan
            jmn       copy,       paper
            spl       @scan                           ;spawn child
            jmp       paper                           ;repeat

p2          mov.i     <-2,        <-1
p3          jmn.b     $-1,        $-3
p6          dat       $1,         $1

search      add.ab    #step,      #100
            jmz.f     search,     @search
            sne.i     p2,         @search
            jmp       kill
            sne.i     p3,         @search
            jmp       kill
            sne.i     p6,         @search
            jmp       findhead
            jmp       search
bomb        spl       0,          0
findhead    mov.b     search, searchhead
            add.ab    #search-searchhead, searchhead  ;adjust for relative pointer
searchhead  add.ab    #-2,        #0
            sne.i     p2,         @searchhead
            jmp       killhead
            sne.i     p3,         @searchhead
            jmp       killhead
            sne.i     p2-1,       @searchhead
            jmp       search
            jmp       searchhead
killhead    mov.b     searchhead, search
            add.ab    #searchhead-search, search      ;adjust for relative pointer
            jmp       kill
kill        mov.i     bomb,       @search
            mov.b     search,     }saved
            djn       search,     #2
clear       mov.i     saved,      bomb                ;change bomb
            mov.b     {saved,     search              ;pop stack of saved fork bombs
            mov.i     bomb,       @search
            add.ab    #1, search
            mov.i     bomb,       @search
            sub.ab    #1, search
            jmn.a     clear,      saved
            jmp search
saved       dat       #0, #0

            dat       1,          1
            dat       1,          1
            dat       1,          1
            dat       1,          1
fin         dat       1,          1