; gather.quants -- quantas source for ants gathering food home
; they leave markers to find home
; Zsban Ambrus
;
; TODO: leave markers to find food piles
;


; at home
morning:

; turn to random direction
rnd 2 
jz 1>
ror
ror
ror
1:
rnd 3
jz 1>
ror
rnd 2
jz 1>
ror
1:

; move ahead until we go out the home
; turn right with 1/2 probability if we collide
1:
cmp %bl +h
jnc 2>
mov %ah %bl
jno 1<
rnd 2
jnz 1<
ror
jmp 1<
2:


; with 1/4 probability start leaving trace so that ants can find home
; if finds trace, stops writing trace
; a trace is: home 0 01 02 0 01 02 0 etc
; stops trace after some time randomatically
; if collides with a rock, truns one randomly; if with ant, waits
rnd 4
jnz day>
cmp %ah 0
jc day>
cmp %ar 0
jc day>
cmp %al 0
jc day>
ror
cmp %ar 0
jc day>
rol
rol
cmp %al 0
jc day>
ror
trace:

5: ; copy
cmp %ah 0
jc day>
set 0
mov %ah %bl
jno 5>
cmp %ah r
jc 4>
rnd 32
jz day>
jnz 5<
4:
rnd 2
jz 3>
cmp %al r
jc 1>
rol
jmp 5<
1:
cmp %ar r
jc 1>
ror
jmp 5<
1:
jmp day>

5: ; paste 1
cmp %ah 0
jc day>
set 0
set 1
mov %ah %bl
jno 5>
cmp %ah r
jc 4>
rnd 32
jz day>
jnz 5<
4:
rnd 2
jz 3>
cmp %al r
jc 1>
rol
jmp 5<
1:
cmp %ar r
jc 1>
ror
jmp 5<
1:
jmp day>

5: ; paste 2
cmp %ah 0
jc day>
set 0
set 2
mov %ah %bl
jno 5>
cmp %ah r
jc 4>
rnd 32
jz day>
jnz 5<
4:
rnd 2
jz 3>
cmp %al r
jc 1>
rol
jmp 5<
1:
cmp %ar r
jc 1>
ror
jmp 5<
1:
jmp day>

5:
rnd 5
jnz trace<


; just go forward trying to find food, don't leave trace
; turn randomly somtimes, more often when near rock
; if finds food, turn back and jump to evening state
; collides with rock ==> turn random
; collides with ant ==> try to avoid it on its right side
day:
rnd 5
jnz 2>
cmp %al r
jnc 1>
ror
jmp 3>
1:
cmp %ar r
jnc 1>
rol
jmp 3>
1:
2:
rnd 42
jnz 3>
rnd 2
jz 1>
rol
jmp 3>
1:
ror

3:
mov %ah %bl
jo collide>
pck
jo day<
rol
rol
rol
jmp evening>

collide:
cmp %ah r
jno avoid>
rnd 5
jz 4>
rnd 2
jz 3>
rol
1:
rol
jmp day<
3:
ror
2:
ror
jmp day<
4:
rnd 2
jz 1<
jmp 2<

avoid:
ror
mov %ah %bl
jno 4>
jmp collide< ;?
4:
rol
jmp day<


; found food, try to go home
; randomly turn, more often on walls
; on collision, same as in the day, 
; if finds trace, follow it
; if finds home, drops food
evening:
rnd 5
jnz 2>
cmp %al r
jnc 1>
ror
jmp 3>
1:
cmp %ar r
jnc 1>
rol
jmp 3>
1:
2:
rnd 42
jnz 3>
rnd 2
jz 1>
rol
jmp 3>
1:
ror

mov %ah %bl
jo collide>
cmp %bl +h
jc arrived>
cmp %bl 0
jc follow>
jmp evening<

collide:
cmp %ah r
jno avoid>
rnd 5
jz 4>
rnd 2
jz 3>
rol
1:
rol
jmp evening<
3:
ror
2:
ror
jmp evening<
4:
rnd 2
jz 1<
jmp 2<
avoid:
ror
mov %ah %bl
jno 4>
jmp collide< ;?
4:
rol
jmp evening<


; follow the trace we've found
; check direction, reverse if goes in the wrong deirection (in theory;
; it won't do in practice)
; if finds home, drops food
follow:
cmp %bl +h
jc arrived>

cmp %ah 0
jc dir>
cmp %al 0
jnc 1>
rol
jmp dir>
1:
cmp %ar 0
jnc 1>
ror
jmp dir>
1:
ror
cmp %ar 0
jnc 1>
ror
jmp dir>
1:
rol
rol
cmp %al 0
jnc 1>
ror ; !
jmp dir>
1:
jmp evening< ; we're either lost, or at home

dir:
cmp %bl 1 ; HARD-TO-TRACK-DOWN-BUG 2
jnc ok>
cmp %ah 2
jnc ok>
ror ; we're going in the wrong way (doesn't seem to work)
ror
ror
cmp %ah 0
jc ok>
cmp %al 0
jnc 1>
rol
jmp ok>
1:
cmp %ar 0
jnc 1>
ror
jmp ok>
1:

ok: ;ok, we can move now
mov %ah %bl
jno follow<
rnd 8
jnz dir<
jmp collide< ;?



; finally arrived home
; drop food, go working again; ants work tirelessly :-)
arrived:
drp
jmp morning<



;end
