![]() |
Routines |
| Prev: 720A | Up: Map | Next: 7294 |
|
Used by the routine at 7377. Returns with the carry flag reset if the policeman spots, recognises and starts chasing Sam.
|
||||||||
| 7222 | CALL $70AA | Is Sam close enough that the policeman has a chance of spotting him? | ||||||
| 7225 | CCF | Return with the carry flag set if not | ||||||
| 7226 | RET C | |||||||
| 7227 | PUSH DE | E and D hold the horizontal and vertical distances between Sam and the policeman; save these briefly | ||||||
| 7228 | PUSH HL | Save the policeman's character number briefly | ||||||
| 7229 | LD H,$E6 | 0xE6=Sam | ||||||
| 722B | CALL $70D6 | Check whether Sam is visible to passers-by | ||||||
| 722E | LD B,$06 | Prepare B for the case where Sam is visible to passers-by | ||||||
| 7230 | JR Z,$7240 | Jump if Sam is visible to passers-by | ||||||
| 7232 | CALL $F436 | Is Sam standing next to a light switch? | ||||||
| 7235 | JR Z,$723F | Jump if not | ||||||
| 7237 | LD A,(BC) | A=window flags for Sam's location | ||||||
| 7238 | AND $20 | Set the zero flag if the light switch for this window is in the 'on' position | ||||||
| 723A | LD A,$04 | Prepare A for the case where Sam is standing next to a light switch in the 'on' position | ||||||
| 723C | JR Z,$723F | Jump if the light switch for this window is in the 'on' position | ||||||
| 723E | XOR A | Prepare A for the case where Sam is neither visible to passers-by nor standing next to a light switch in the 'on' position | ||||||
| 723F | LD B,A | B=0, 4 or 6 | ||||||
|
Now B=6 (if Sam is visible to passers-by), or 4 (if Sam is standing next to a light switch that is in the 'on' position), or 0 otherwise.
|
||||||||
| 7240 | CALL $7294 | Check whether Sam's disguise is known to the police | ||||||
| 7243 | POP HL | Restore the policeman's character number to H | ||||||
| 7244 | POP DE | Restore the horizontal and vertical distances between Sam and the policeman to E and D | ||||||
| 7245 | LD A,B | A=0, 1, 4, 5, 6 or 7 | ||||||
| 7246 | CP $06 | Is Sam visible to passers-by? | ||||||
| 7248 | JR NC,$7251 | Jump if so | ||||||
| 724A | CALL $70D6 | Is the policeman visible to passers-by? | ||||||
| 724D | JR NZ,$7251 | Jump if not | ||||||
| 724F | INC B | B=2, 3, 6 or 7 | ||||||
| 7250 | INC B | |||||||
| 7251 | LD A,B | A=0-7 | ||||||
| 7252 | LD L,A | Save this value in L | ||||||
| 7253 | ADD A,A | Point BC at an entry in the table at 720A | ||||||
| 7254 | ADD A,B | |||||||
| 7255 | ADD A,$0A | |||||||
| 7257 | LD C,A | |||||||
| 7258 | LD B,$72 | |||||||
| 725A | LD A,(BC) | Pick up the first byte of the entry | ||||||
| 725B | CP D | Compare it with the vertical distance between Sam and the policeman | ||||||
| 725C | RET C | Return (with the carry flag set) if the vertical distance is greater | ||||||
| 725D | INC C | Pick up the second byte of the entry | ||||||
| 725E | LD A,(BC) | |||||||
| 725F | CP E | Compare it with the horizontal distance between Sam and the policeman | ||||||
| 7260 | RET C | Return (with the carry flag set) if the horizontal distance is greater | ||||||
| 7261 | INC C | Pick up the third byte of the entry | ||||||
| 7262 | LD A,(BC) | |||||||
| 7263 | SUB D | Subtract both the horizontal and vertical distances between Sam and the policeman | ||||||
| 7264 | SUB E | |||||||
| 7265 | RET C | Return (with the carry flag set) if the result is negative | ||||||
| 7266 | BIT 0,L | Bit 0 of L is set if Sam's current disguise (if any) is known to the police | ||||||
| 7268 | LD L,$1D | Point HL at byte 0x1D of the policeman's buffer | ||||||
| 726A | JR NZ,$728A | Jump if Sam's current disguise is known to the police | ||||||
|
Sam has been spotted by the policeman, but he's wearing a disguise that is not (yet) known to the police.
|
||||||||
| 726C | LD A,($7FC9) | Collect Sam's current disguise ID (1-7) from 7FC9 | ||||||
| 726F | RRCA | Move bits 0-2 into bits 5-7 | ||||||
| 7270 | RRCA | |||||||
| 7271 | RRCA | |||||||
| 7272 | LD C,A | Copy these disguise identifier bits into C | ||||||
| 7273 | LD A,(HL) | Pick up byte 0x1D of the policeman's buffer | ||||||
| 7274 | AND $1F | Keep only bits 0-4 (the disguise timeout counter) | ||||||
| 7276 | JR NZ,$727A | Jump unless they are all 0 | ||||||
| 7278 | LD A,$10 | The disguise timeout counter will be initialised to 0x10 | ||||||
| 727A | OR C | Copy the disguise identifier bits from C into bits 5-7 of A | ||||||
| 727B | LD (HL),A | Copy the disguise identifier bits and the timeout counter into byte 0x1D of the policeman's buffer | ||||||
| 727C | INC L | L=0x1E | ||||||
| 727D | CALL $6558 | Determine Sam's location | ||||||
| 7280 | LD (HL),E | Copy Sam's x-coordinate into byte 0x1E of the policeman's buffer | ||||||
| 7281 | INC L | L=0x1F | ||||||
| 7282 | AND $03 | A=0 if z (Sam's z-coordinate) is 4, 2 if z is 2, or 1 if z is 1 | ||||||
| 7284 | RRCA | A=0x00 if z=4, 0x80 (bit 7 set) if z=2, or 0x40 (bit 6 set) if z=1 | ||||||
| 7285 | RRCA | |||||||
| 7286 | OR D | Copy Sam's y-coordinate into bits 0-5 of A | ||||||
| 7287 | LD (HL),A | Copy this value into byte 0x1F of the policeman's buffer | ||||||
| 7288 | SCF | Set the carry flag: the policeman is not chasing Sam | ||||||
| 7289 | RET | |||||||
|
Sam has been spotted by the policeman, and his current disguise (if any) is known to the police.
|
||||||||
| 728A | LD A,(HL) | Collect byte 0x1D of the policeman's buffer | ||||||
| 728B | AND A | Is there a disguise ID in bits 5-7? | ||||||
| 728C | CALL NZ,$71C6 | If so, make that disguise known to the police (if it isn't already) | ||||||
| 728F | CALL $71A0 | Set the policeman's destination to Sam's current location | ||||||
| 7292 | AND A | Clear the carry flag to indicate that the policeman is now chasing Sam | ||||||
| 7293 | RET | |||||||
| Prev: 720A | Up: Map | Next: 7294 |