```001: ; idiot.g
002:
003: ; a variant of stupid.g
004:
005: ; start by moving up for 6 steps, then right for 6 steps, etc,
006: ; then always move into the available direction closest to lambda-man's position
007:
008:
009: ; detect sudden jumps in position and reset the start counter
010:   int 3
011:   int 5
012:   sub a, [1]
013:   sub b, [2]
016:   jlt nojump, a, 3
017:   mov [0], 0
018:
019: nojump:
020:   int 3
021:   int 5
022:   mov [1], a
023:   mov [2], b
024:   jgt follow, [0], 24
025:   ; the start counter is low: try to get out of the start box
026:   inc [0]
027:   mov b, [0]
028:   div b, 6
029:   int 3
031:   and a, 3
032:   int 0
033:   hlt
034:
035: follow:
036:   int 1     ; get lman's coordinates in A and B
037:   mov c, a  ; c = lman.x
038:   mov d, b  ; d = lman.y
039:   int 3     ; get this ghost's index
040:   int 5
041:   mov e, a  ; e = my.x
042:   mov f, b  ; f = my.y
043:
044: ; compute direction
045:
046:   mov a, 1     ; alpha
047:   mov b, 1     ; phi
048:   mov g, c
049:   sub g, e     ; absx = dx  = lman.x - my.x
050:   mov h, f
051:   sub h, d     ; absy = -dy = my.y - lman.y
052:
053:   jgt l1, c, e     ; if lman.x =< my.x then
055:     mov g, e
056:     sub g, c   ; absx = -dx
057:     xor b, 254 ; phi := -phi
058: l1:
059:   jlt l2, d, f     ; if lman.y >= my.y then
060:     xor a, 2
061:     mov h, d
062:     sub h, f   ; absy = dy
063:     xor b, 254 ; phi := -phi
064:
065:
066: l2:
067: ; from now on, c and d are the main and secondary direction
068:   mov c, a
069:   mov d, a
070:
071:   jlt l3, g, h    ; if absx >= absy then
072:     xor b, 254    ; phi := -phi
073: l3:
074:     sub c, b      ; add phi for main direction
075:     add d, b      ; subtract phi for secondary direction
076:
077: l4:
078:   div c, 2        ; main direction of lambda-man
079:   div d, 2        ; secondary direction
080: ; if panic mode, reverse direction
081:
082:   int 3
083:   int 6
084:   jeq test, a, 0
085:
088:
089: test:
090:   int 3
091:   int 5
092:   and c, 3
093:   mov [254], c
094:   mov [255], ret1
095:   mov PC, next    ; get coordinates of square in direction c
096: ret1:
097:   int 7           ; get square
098:   jeq secondary, a, 0    ; go in main direction if not wall
099:
100:   int 3
101:   int 6
103:   and b, 3
104:   and c, 3
105:   jeq secondary, b, c
106:   jmp go
107:
108: secondary:
109:   int 8
110:   mov c, d        ; go in secondary direction
111:
112: go:
113:   and c, 3        ; reduce modulo 4
114:   mov a, c
115:   int 0           ; direction is in a
116:   hlt
117:
118:
119:
120: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
121: ; next a <- X, b <- Y, [254] <- DIR, [255] <- RETURN
122: next:
123:         MUL [254], 2