| Routines

7AF4: Deal with Sam when he's being carried by a gangster or policeman

Used by the routine at 74D8 when bit 0 at 7FFC is set (by the routine at 71DD), indicating that Sam is being carried by a gangster or policeman.
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