| Routines

74D8: Deal with Sam

Called from the main loop at F02B when one of Sam's status flags at 7FFC is set, indicating that he is in the middle of an action. Returns with the zero flag set if Sam has finished the action by the end of the routine.
74D8 | LD HL,$E608 | Decrement Sam's main action timer in byte 0x08 of his buffer
74DB | DEC (HL)
74DC | RET NZ | Return unless it's time to deal with Sam
74DD | LD HL,$74F3 | We will continue at 74F3 (below) after calling the routine to handle Sam
74E0 | PUSH HL
74E1 | LD L,$C6 | HL=74C6
74E3 | LD A,($7FFC) | Pick up Sam's status flags from 7FFC
74E6 | INC L | Point HL at one of the entries in the table of Sam-handling routine addresses at 74C8
74E7 | INC L
74E8 | RLCA
74E9 | JR NC,$74E6
74EB | LD C,(HL) | Collect the routine address into BC
74EC | INC L
74ED | LD B,(HL)
74EE | PUSH BC | Push it onto the stack, ready for an indirect jump
74EF | LD HL,$E600 | Point HL at byte 0x00 of Sam's buffer
74F2 | RET | Make an indirect jump to the Sam-handling routine
We come here after the Sam-handling routine has returned.
74F3 | LD HL,$7FFC | 7FFC holds Sam's status flags
74F6 | LD A,(HL) | Pick them up in A
74F7 | AND A | Has Sam finished the action yet?
74F8 | RET Z | Return with the zero flag set if so
74F9 | LD A,($E608) | Collect Sam's main action timer from byte 0x08 of his buffer
74FC | AND A | Did the Sam-handling routine set the action timer to a non-zero value (meaning that the action is still in progress)?
74FD | RET NZ | Return with the zero flag reset if so
74FE | LD (HL),A | Otherwise clear all of Sam's status flags at 7FFC
74FF | RET | Return with the zero flag set