![]()  | 
Routines | 
| Prev: 624F | Up: Map | Next: 63DA | 
| 
 
Called from the main loop at 6229.
 
 | 
||||
| 6337 | LD A,($7C61) | Decrement the sprite movement timer. | ||
| 633A | DEC A | |||
| 633B | LD ($7C61),A | |||
| 633E | RET NZ | Return unless it's zero. | ||
| 633F | LD A,($7C62) | Reset the sprite movement timer to the value of the game speed parameter. | ||
| 6342 | LD ($7C61),A | |||
| 6345 | LD A,($7C79) | Pick up the tunnel timer. | ||
| 6348 | AND A | Is Horace in a tunnel at the moment? | ||
| 6349 | JR NZ,$63BF | Jump if so. | ||
| 634B | LD A,($7C70) | Pick up Horace's animation frame. | ||
| 634E | LD HL,($7C6B) | Pick up Horace's current location. | ||
| 6351 | CALL $6CC2 | Check the tiles in front of Horace. | ||
| 6354 | CP $00 | Is there anything in front of Horace? | ||
| 6356 | JR Z,$63AB | Jump if not. | ||
| 6358 | CP $01 | Is Horace facing a tunnel entrance? | ||
| 635A | JR Z,$636A | Jump if so. | ||
| 635C | CP $02 | Is Horace facing a maze exit or entrance? | ||
| 635E | JR NZ,$63B9 | Jump if not. | ||
| 6360 | LD A,($7C70) | Pick up Horace's animation frame. | ||
| 6363 | CP $01 | Is Horace facing right? | ||
| 6365 | JP Z,$6A1E | Jump if so (Horace is leaving the maze). | ||
| 6368 | JR $63B9 | |||
| 
 
Horace is about to enter a tunnel.
 
 | 
||||
| 636A | LD A,$5A | Initialise the tunnel timer. | ||
| 636C | LD ($7C79),A | |||
| 636F | LD BC,($6FCF) | Pick up the tunnel offset for the current maze. | ||
| 6373 | LD HL,($7C6B) | Pick up Horace's location. | ||
| 6376 | LD A,($7C70) | Pick up Horace's animation frame. | ||
| 6379 | AND A | Is Horace going up? | ||
| 637A | JR Z,$6380 | Jump if so. | ||
| 637C | SBC HL,BC | Subtract the tunnel offset from Horace's location. | ||
| 637E | JR $6381 | |||
| 6380 | ADD HL,BC | Add the tunnel offset to Horace's location. | ||
| 6381 | PUSH HL | Save HL (which holds Horace's new location) temporarily. | ||
| 6382 | LD HL,$7C69 | Pick up the sound on/off indicator. | ||
| 6385 | LD C,$10 | Initialise C for the loop that follows. | ||
| 6387 | PUSH BC | Save the loop counter (unnecessarily). | ||
| 6388 | LD B,C | Set B and E equal to 8*C. This value determines the pitch. | ||
| 6389 | SLA B | |||
| 638B | SLA B | |||
| 638D | SLA B | |||
| 638F | LD E,B | |||
| 6390 | LD D,$08 | This value determines the duration. | ||
| 6392 | LD B,E | Produce a sound (if the sound on/off indicator is on) with pitch and duration determined by E and D. | ||
| 6393 | LD A,$1F | |||
| 6395 | AND (HL) | |||
| 6396 | OUT ($FE),A | |||
| 6398 | DJNZ $6398 | |||
| 639A | LD A,$07 | |||
| 639C | OUT ($FE),A | |||
| 639E | LD B,E | |||
| 639F | DJNZ $639F | |||
| 63A1 | DEC D | |||
| 63A2 | JR NZ,$6392 | |||
| 63A4 | POP BC | Restore the loop counter to C (unnecessarily). | ||
| 63A5 | DEC C | Finished yet? | ||
| 63A6 | JR NZ,$6387 | Jump back if not. | ||
| 63A8 | POP HL | Restore Horace's new location to HL. | ||
| 63A9 | JR $63B4 | |||
| 
 
There's nothing in front of Horace, so he can move one space forward.
 
 | 
||||
| 63AB | LD HL,($7C6B) | Pick up Horace's current location. | ||
| 63AE | LD A,($7C70) | Pick up Horace's animation frame. | ||
| 63B1 | CALL $6D17 | Get the location of the spot one space in front of Horace. | ||
| 63B4 | LD ($7C6D),HL | Update Horace's location. | ||
| 63B7 | JR $63BF | |||
| 
 
Horace is facing a wall or the maze entrance, and so cannot move forward.
 
 | 
||||
| 63B9 | LD HL,($7C6B) | Pick up Horace's current location. | ||
| 63BC | LD ($7C6D),HL | Set Horace's new location. | ||
| 
 
Now it's time to move the guards.
 
 | 
||||
| 63BF | LD HL,$6DA6 | Point HL at the first of the guard countdown timers. | ||
| 63C2 | LD B,$04 | There are four guards to consider. | ||
| 63C4 | PUSH BC | Save the guard counter. | ||
| 63C5 | LD A,(HL) | Set the zero flag if this guard is in play. | ||
| 63C6 | INC HL | |||
| 63C7 | OR (HL) | |||
| 63C8 | INC HL | Point HL at the next guard's countdown timer. | ||
| 63C9 | PUSH HL | Save the guard countdown timer pointer. | ||
| 63CA | JR NZ,$63D5 | Jump if this guard is not in play at the moment. | ||
| 63CC | CALL $6A3F | Copy the guard's buffer into the temporary location (6DB8). | ||
| 63CF | CALL $63DA | Move the guard. | ||
| 63D2 | CALL $6A6A | Copy the guard's buffer back to the original location. | ||
| 63D5 | POP HL | Restore the guard countdown timer pointer to HL. | ||
| 63D6 | POP BC | Restore the guard counter to B. | ||
| 63D7 | DJNZ $63C4 | Jump back to handle the next guard. | ||
| 63D9 | RET | |||
| Prev: 624F | Up: Map | Next: 63DA |