Routines |
Prev: 7AE2 | Up: Map | Next: 7B5A |
7AF4 | LD HL,$0001 | Set Sam's main action timer to 1 (so that we come here on the next pass through the main loop) and his midstride/mid-action timer to 0 | ||
7AF7 | LD ($E608),HL | |||
First we need to determine who is carrying Sam.
|
||||
7AFA | LD HL,$D700 | Point HL at byte 0x00 of character 0xD7's buffer | ||
7AFD | LD B,$0F | We will check characters 0xD7-0xE5 | ||
7AFF | LD A,(HL) | A=character's animatory state | ||
7B00 | AND $78 | A=character's base animatory state (bits 0-2 and 7 reset) | ||
7B02 | CP $18 | 0x18: Is this character a policeman carrying Sam? | ||
7B04 | JR Z,$7B28 | Jump if so | ||
7B06 | CP $28 | 0x28: Is this character a gangster carrying Sam? | ||
7B08 | JR Z,$7B28 | Jump if so | ||
7B0A | INC H | Next character | ||
7B0B | DJNZ $7AFF | Jump back until we find who's carrying Sam | ||
No one is carrying Sam at the moment. Whoever was carrying him must have just dropped him.
|
||||
7B0D | LD L,$02 | Point HL at byte 0x02 of Sam's buffer | ||
7B0F | LD A,(HL) | A=Sam's y-coordinate | ||
7B10 | CP $13 | Set the carry flag if it's less than 19 | ||
7B12 | LD B,$01 | B=1 indicates that Sam is being dropped off the roof of a building | ||
7B14 | JP C,$FB55 | Jump if Sam's being dropped off the roof of a building | ||
Sam is being dropped by a policeman onto the floor of the jail cell.
|
||||
7B17 | XOR A | Clear all of Sam's status flags at 7FFC | ||
7B18 | LD ($7FFC),A | |||
7B1B | LD L,$08 | Set Sam's main action timer to 8 | ||
7B1D | LD (HL),$08 | |||
7B1F | CALL $E9C8 | Update the SRB for Sam's current animatory state and location | ||
7B22 | AND $80 | Sam's new animatory state is 0x00 (bit 7 of A is reset, because Sam's always facing left when he's dropped here) | ||
7B24 | INC D | Drop him one level (to the floor) | ||
7B25 | JP $E9D5 | Update Sam's animatory state and location and update the SRB | ||
Sam is still being carried by a gangster or policeman. Calculate Sam's new animatory state and location (which depend on those of his carrier).
|
||||
7B28 | LD L,$04 | Point HL at byte 0x04 of Sam's carrier's buffer | ||
7B2A | LD A,(HL) | A=carrier's z-coordinate | ||
7B2B | LD ($E604),A | Set Sam's z-coordinate to the same value | ||
7B2E | LD L,$00 | Point HL at byte 0x00 of Sam's carrier's buffer | ||
7B30 | LD C,$05 | Animatory state 0x05: Sam being carried (facing left) | ||
7B32 | LD E,$FF | E=-1 | ||
7B34 | BIT 0,(HL) | Is Sam's carrier midstride? | ||
7B36 | JR Z,$7B3B | Jump if not | ||
7B38 | DEC E | E=-2 | ||
7B39 | LD C,$02 | Animatory state 0x02: Sam standing (facing left) | ||
7B3B | LD A,E | A=-2 if Sam's carrier is midstride, -1 otherwise | ||
7B3C | BIT 7,(HL) | Is Sam's carrier facing left? | ||
7B3E | JR Z,$7B44 | Jump if so | ||
7B40 | SET 7,C | C=0x82 or 0x85 (animatory states of Sam being carried, facing right) | ||
7B42 | NEG | A=2 if Sam's carrier is midstride, 1 otherwise | ||
7B44 | INC L | Add Sam's carrier's x-coordinate to obtain Sam's x-coordinate | ||
7B45 | ADD A,(HL) | |||
7B46 | LD E,A | Copy this to E | ||
7B47 | INC L | D=Sam's carrier's y-coordinate | ||
7B48 | LD D,(HL) | |||
7B49 | DEC D | Decrement it to obtain Sam's y-coordinate | ||
7B4A | LD A,C | A=Sam's animatory state | ||
7B4B | PUSH AF | Save Sam's animatory state briefly | ||
7B4C | PUSH DE | Save Sam's new coordinates | ||
7B4D | LD H,$E6 | 0xE6=Sam | ||
7B4F | CALL $E9C8 | Update the SRB for Sam's current animatory state and location | ||
7B52 | POP DE | Restore Sam's new coordinates to DE | ||
7B53 | POP AF | Restore Sam's animatory state to A | ||
7B54 | CALL $E9D5 | Update Sam's animatory state and location and update the SRB | ||
7B57 | JP $EC83 | Scroll the screen left, right, up or down if necessary |
Prev: 7AE2 | Up: Map | Next: 7B5A |