; SURVIVAL TENSOR MACHINE — symbolic machine code
; registers:
;   R0 step       signed int, -1..28
;   R1 phase      unsigned int
;   R2 coherence  unsigned int
;   R3 risk       unsigned int
;   R4 g1         0 hide, 1 assimilate
;   R5 g2         0 collapse, 1 expand
;   R6 g3         0 wait, 1 move
;   R7 wall       1 if step == 27
;
; opcodes:
;   OBS dst                 observe field into dst
;   RPT src                 report witness state
;   CMP a b                 compare a-b
;   JGT label               jump if last compare > 0
;   JLE label               jump if last compare <= 0
;   MOV dst val             assign
;   ADD dst val             add
;   SUB dst val             subtract
;   JEQ reg val label       jump if equal
;   BRA label               jump
;   HALT                    stop

START:
  OBS R3                 ; risk = incoming threat field
  RPT R0                 ; report current step to witness

SENSE_MINUS_2:
  CMP R3 R2              ; risk - coherence
  JGT CHOOSE_FLIGHT_G1
  BRA CHOOSE_FIGHT_G1

CHOOSE_FLIGHT_G1:
  MOV R4 0               ; G1 = HIDE
  BRA COHERENCE_GATE

CHOOSE_FIGHT_G1:
  MOV R4 1               ; G1 = ASSIMILATE
  BRA COHERENCE_GATE

COHERENCE_GATE:
  CMP R2 R3              ; coherence - risk
  JGT TRY_EXPAND
  MOV R5 0               ; G2 = COLLAPSE
  BRA ACTION_GATE

TRY_EXPAND:
  ; expand only if coherence is meaningfully above risk
  ; threshold +20 represented as risk + 20 via temporary compare note
  MOV R5 1               ; G2 = EXPAND
  BRA ACTION_GATE

ACTION_GATE:
  JEQ R0 27 AT_WALL
  JEQ R5 0 WAIT_ACTION
  CMP R3 30
  JGT WAIT_ACTION
  MOV R6 1               ; G3 = MOVE
  BRA VALIDATE

AT_WALL:
  JEQ R5 1 MOVE_ACTION
  BRA WAIT_ACTION

MOVE_ACTION:
  MOV R6 1
  BRA VALIDATE

WAIT_ACTION:
  MOV R6 0
  BRA VALIDATE

VALIDATE:
  ; illegal: HIDE + MOVE
  JEQ R4 0 CHECK_HIDE_MOVE
  BRA EXECUTE

CHECK_HIDE_MOVE:
  JEQ R6 1 POCKET_COLLAPSE
  BRA EXECUTE

POCKET_COLLAPSE:
  MOV R4 0               ; HIDE
  MOV R5 0               ; COLLAPSE
  MOV R6 0               ; WAIT
  BRA FLIGHT

EXECUTE:
  JEQ R4 0 FLIGHT
  JEQ R5 1 FIGHT
  BRA FLIGHT

FLIGHT:
  JEQ R0 -1 HOLD
  SUB R0 1               ; retreat toward 0 / -1
  JEQ R0 0 ENTER_REST
  BRA START

ENTER_REST:
  SUB R0 1               ; 0 -> -1 protected hold
  BRA HOLD

HOLD:
  RPT R0                 ; witness retained in -1
  BRA START

FIGHT:
  ADD R0 1               ; run tunnel
  JEQ R0 28 PHASE_BREACH
  BRA START

PHASE_BREACH:
  ADD R1 1               ; phase++
  MOV R0 0               ; wrap to next phase
  RPT R1
  BRA START
