| Routines

7996: Collect a keypress during the game (or simulate one in demo mode)

Called from the main loop at F02B.
7996 | LD A,($7FEE) | A=current game mode (0-4)
7999 | AND A | Is it demo mode?
799A | JP NZ,$EAB2 | Jump if not
It's demo mode.
799D | CALL $EAD9 | Collect the ASCII code of the last key pressed in A
79A0 | JP NZ,$F0EA | Start a new game if a game key was pressed
79A3 | LD A,$26 | Message 0x26: 'PRESS A KEY TO PLAY'
79A5 | LD ($7FD2),A | Store this message number at 7FD2 so that it can be monitored
79A8 | CALL $78FF | Is this message in the message queue?
79AB | CALL NZ,$6EC5 | If not, add it to the message queue (again)
79AE | LD A,$F8 | Set bits 3-7 at 7FEA, effectively giving Sam the keys to all the houses
79B0 | LD ($7FEA),A
79B3 | LD A,($E60B) | Pick up byte 0x0B of Sam's buffer (which holds his destination y-coordinate)
79B6 | AND A | Has a destination been set for Sam yet?
79B7 | JR NZ,$79D4 | Jump if so
We need to set a new destination for Sam.
79B9 | CALL $F17F | Get an even random number between 0x86 and 0x94 in A
79BC | AND $0E
79BE | ADD A,$86
79C0 | LD L,A | Point HL at an entry in the table of locations at 7986
79C1 | LD H,$79
79C3 | LD E,(HL) | Collect the location coordinates in DE
79C4 | INC L
79C5 | LD D,(HL)
79C6 | LD HL,$E60A | Copy the location coordinates into bytes 0x0A and 0x0B of Sam's buffer
79C9 | LD (HL),E
79CA | INC L
79CB | LD (HL),D
79CC | LD C,$01 | Assume a z-coordinate of 1 (indoors)
79CE | CALL $ED47 | Obtain an identifier for the location
79D1 | LD L,$0C | Copy the destination location identifier into byte 0x0C of Sam's buffer
79D3 | LD (HL),A
79D4 | LD H,$E6 | 0xE6=Sam
79D6 | CALL $ED8C | Determine the next move Sam should make to reach his destination
79D9 | AND A | Is Sam already at his destination?
79DA | JR Z,$79B9 | Jump back to set a new destination if so
Sam's destination has been set. Now to simulate a keypress that will make him take the next step towards it.
79DC | ADD A,$7F | Point HL at the offset of the appropriate keypress to simulate in the table at 7980
79DE | LD L,A
79DF | LD H,$79
79E1 | LD A,(HL) | Pick up the keypress offset
79E2 | AND A | Make sure the zero flag is reset to indicate that a simulated keypress was made (this instruction is redundant)
79E3 | RET |