; ── SWARM FORAGER ──────────────────────────── ; Random walk to find food, dead reckoning to ; navigate home. Pheromone marks food for others. ; Hit play, then try improving it! ; ── Registers ── .alias dx r1 ; x displacement from nest .alias dy r2 ; y displacement from nest .alias ret r3 ; return address for CALL ; ── Pheromone ── .const PH_FOOD CH_RED ; marks food locations .const PH_NEST CH_BLUE .const PHER_INIT 255 .const PHER_DECAY 2 ; ── Roles (visible in simulation viewer) ── .tag 0 foraging .tag 1 homing ; ────────────────────────────────────────────── main: set r7 PHER_INIT loop: CARRYING JNE r0 0 go_home TAG foraging ; ── SEARCH: find food ───────────────────────── search: SENSE FOOD JNE r0 0 grab ; if we are too far from the food, dont mark JLT r7 PHER_DECAY smell_trail SUB r7 PHER_DECAY ; if there is already a trail here, dont mark SNIFF PH_NEST HERE r0 JNE r0 0 smell_trail MARK PH_NEST r7 smell_trail: SMELL PH_FOOD JNE r0 0 step SENSE EMPTY step: CALL ret move_track JMP loop grab: CALL ret move_track PICKUP MARK PH_FOOD 255 SET r6 PHER_INIT JMP loop ; ── GO HOME: dead reckon toward nest ────────── go_home: TAG homing ; if we are too far from the food, dont mark JLT r6 PHER_DECAY sense_nest SUB r6 PHER_DECAY ; if there is already a trail here, dont mark SNIFF PH_FOOD HERE r0 JNE r0 0 sense_nest MARK PH_FOOD r6 sense_nest: SENSE NEST JNE r0 0 deliver smell_nest: SMELL PH_NEST JNE r0 0 move_track RANDOM r0 4 JEQ r0 0 wander ; 25% random to unstick walls CALL ret home_dir CALL ret move_track JMP main wander: SENSE EMPTY CALL ret move_track JMP main deliver: CALL ret move_track DROP SET r7 PHER_INIT JMP main ; ══════════════════════════════════════════════ ; SUBROUTINES — CALL ret