| Chase H.Q. | Routines |
| Prev: A27A | Up: Map | Next: A579 |
|
Used by the routines at main_loop and cpu_driver.
|
||||
| check_collisions | A399 | LD HL,$0048 | HL = $0048 | |
| A39C | LD DE,$01D8 | DE = $01D8 | ||
| A39F | EXX | |||
| A3A0 | LD A,($A265) | A = fork_visible | ||
| A3A3 | AND A | Set flags | ||
| A3A4 | JR Z,cc_at_fork | Jump to cc_at_fork if zero | ||
| A3A6 | LD A,($A266) | A = fork_countdown | ||
| A3A9 | AND A | Set flags | ||
| A3AA | JP Z,cc_not_fork | Jump to cc_not_fork if zero | ||
| A3AD | DEC A | A-- | ||
| A3AE | RET Z | Return if zero [can't collide immediately before fork?] | ||
|
Check left hand side of car.
|
||||
| cc_at_fork | A3AF | LD HL,($EAFE) | HL = *$EAFE | |
| A3B2 | LD A,H | A = H (0 or 255) | ||
| A3B3 | AND A | Set flags | ||
| A3B4 | JR NZ,cc_a3d1 | Jump to cc_a3d1 if non-zero | ||
| A3B6 | PUSH HL | Jump to cc_a3d1 if HL < $40 | ||
| A3B7 | LD BC,$0040 | |||
| A3BA | SBC HL,BC | |||
| A3BC | POP HL | |||
| A3BD | JR C,cc_a3d1 | |||
| A3BF | PUSH HL | Jump to cc_a3d5 if HL < $6A | ||
| A3C0 | LD C,$6A | |||
| A3C2 | SBC HL,BC | |||
| A3C4 | POP HL | |||
| A3C5 | JR C,cc_a3d5 | |||
| A3C7 | LD C,$85 | HL -= $85 | ||
| A3C9 | SBC HL,BC | |||
| A3CB | INC A | A++ -- A == 1 => partially off-road | ||
| A3CC | JR C,cc_fork_set | Jump to cc_fork_set if A was 255 | ||
| A3CE | INC A | A++ -- A == 2 => fully off-road | ||
| A3CF | JR cc_fork_set | Jump to cc_fork_set | ||
| cc_a3d1 | A3D1 | XOR A | var_a23d = 0 | |
| A3D2 | LD ($A23D),A | |||
|
Check right hand side of car.
|
||||
| cc_a3d5 | A3D5 | LD HL,($EAFC) | HL = *$EAFC | |
| A3D8 | LD A,H | A = H | ||
| A3D9 | AND A | Set flags | ||
| A3DA | LD A,$00 | A = 0 (not self modified) | ||
| A3DC | JR NZ,cc_a3fa | Jump to cc_a3fa if non-zero | ||
| A3DE | PUSH HL | Jump to cc_a3fa if HL >= $BE | ||
| A3DF | LD BC,$00BE | |||
| A3E2 | SBC HL,BC | |||
| A3E4 | POP HL | |||
| A3E5 | JR NC,cc_a3fa | |||
| A3E7 | PUSH HL | Jump to cc_fork_set if HL >= $8E | ||
| A3E8 | LD BC,$008E | |||
| A3EB | SBC HL,BC | |||
| A3ED | POP HL | |||
| A3EE | JR NC,cc_fork_set | |||
| A3F0 | LD C,$7C | HL -= $7C | ||
| A3F2 | SBC HL,BC | |||
| A3F4 | INC A | A++ -- A == 1 => partially off-road | ||
| A3F5 | JR NC,cc_fork_set | Jump to cc_fork_set if no carry | ||
| A3F7 | INC A | A++ -- A == 2 => fully off-road | ||
| A3F8 | JR cc_fork_set | Jump to cc_fork_set | ||
| cc_a3fa | A3FA | LD ($A23C),A | var_a23c = A | |
| cc_fork_set | A3FD | LD ($A23E),A | off_road = A -- 0/1/2 => on-road/one wheel off-road/both wheels off-road | |
| A400 | AND A | Set flags | ||
| A401 | LD C,$00 | C = 0 (not self modified) | ||
| A403 | JR Z,cc_a43b | not off road? | ||
| A405 | LD A,($A240) | Load road_buffer_offset into A | ||
| A408 | ADD A,$40 | Add 64 so it's the lanes data offset | ||
| A40A | LD L,A | Point HL at road buffer lanes data | ||
| A40B | LD H,$EE | |||
| A40D | LD A,(HL) | A = *HL | ||
| A40E | BIT 6,A | Test bit 6 -- tunnel bits perhaps? | ||
| A410 | JR Z,cc_a43b | Jump if clear | ||
| A412 | RLA | Test bit 7 | ||
| A413 | JR C,cc_a43b | Jump if set | ||
| A415 | BIT 3,A | Test bit 3 (was bit 2 before RLA) | ||
| A417 | LD A,($A26D) | A = road_pos.hi | ||
| A41A | JR Z,cc_a426 | Jump if clear | ||
| A41C | LD C,A | C = A | ||
| A41D | LD A,$14 | A = 20 | ||
| A41F | EX AF,AF' | |||
| A420 | LD A,C | A = C & 1 | ||
| A421 | AND $01 | |||
| A423 | JP cc_hit_scenery2 | Jump to cc_hit_scenery2 | ||
| cc_a426 | A426 | LD HL,$00D1 | HL = $00D1 | |
| A429 | LD DE,$0195 | DE = $0195 | ||
| A42C | EXX | |||
| A42D | AND A | Set flags [A is ?] | ||
| A42E | LD C,$01 | C = 1 | ||
| A430 | JR Z,cc_hit_tunnel_wall | |||
| A432 | INC C | C = 2 | ||
| cc_hit_tunnel_wall | A433 | PUSH BC | Preserve BC | |
| A434 | LD BC,$0604 | Effect 6 (tunnel wall hit), Priority 4 | ||
| A437 | CALL start_sfx | Call start_sfx | ||
| A43A | POP BC | Restore BC | ||
| cc_a43b | A43B | LD A,C | A = C | |
| A43C | LD ($B3DC),A | ($B3DC) = A | ||
| A43F | EXX | |||
| A440 | LD ($B396),HL | ($B396) = HL | ||
| A443 | LD ($B3A4),DE | ($B3A4) = DE | ||
| A447 | AND A | Set flags | ||
| A448 | RET NZ | Return if non-zero | ||
| A449 | LD A,($A240) | Load road_buffer_offset into A | ||
|
-- RIGHT SIDE OBJECT HIT CHECKING --
|
||||
| A44C | ADD A,$60 | Add 96 so it's the right side objects data offset | ||
| A44E | LD L,A | Point HL at road buffer right side objects data | ||
| A44F | EX AF,AF' | Bank road buffer offset | ||
| A450 | LD H,$EE | (cont.) | ||
| A452 | LD A,($A240) | Load road_buffer_offset into A | ||
| A455 | RLA | Top bit -> carry | ||
| A456 | LD A,(HL) | Read a right side object data byte | ||
| A457 | JR NC,cc_a45a | Jump if top bit was clear | ||
| A459 | INC L | L++ -- so if the top bit of the road buffer offset is set we take next byte? | ||
| cc_a45a | A45A | OR (HL) | OR in the (next) byte | |
| A45B | JR Z,cc_a480 | Jump if it's zero -- no object | ||
|
Build a graphics_defs address.
|
||||
| A45D | LD C,A | HL = (*addrof_right_hand_objects)[A * 7] | ||
| A45E | ADD A,A | |||
| A45F | ADD A,A | |||
| A460 | ADD A,A | |||
| A461 | SUB C | |||
| A462 | LD C,A | |||
| A463 | LD B,$00 | |||
| A465 | LD HL,($5CFA) | |||
| A468 | ADD HL,BC | |||
|
Read collision values.
|
||||
| A469 | LD C,(HL) | C = *HL++ -- e.g. $5E5B. a higher value | ||
| A46A | INC HL | |||
| A46B | LD E,(HL) | E = *HL++ -- e.g. $5E5C. a lower value | ||
| A46C | INC HL | |||
| A46D | LD A,(HL) | A = *HL -- e.g. $5E5D. TBD | ||
| A46E | LD D,B | D = B -- B is zero here, so BC = C and DE = E | ||
|
Check for collisions with scenery (right hand side).
|
||||
| A46F | LD HL,($EAFC) | HL = *$EAFC -- near end of road drawing words (centre)... must be position of car | ||
| A472 | PUSH HL | Jump to cc_a480 if HL >= BC | ||
| A473 | SBC HL,BC | |||
| A475 | POP HL | |||
| A476 | JR NC,cc_a480 | |||
| A478 | SBC HL,DE | Jump to cc_a480 if HL < DE | ||
| A47A | JR C,cc_a480 | |||
| A47C | EX AF,AF' | Unbank road buffer offset | ||
| A47D | XOR A | A = 0 -- perhaps a right hand flag | ||
| A47E | JR cc_hit_scenery | Jump to cc_hit_scenery | ||
| cc_a480 | A480 | EX AF,AF' | Unbank road buffer offset | |
|
-- LEFT SIDE OBJECT HIT CHECKING --
|
||||
| A481 | ADD A,$20 | Add 32 so it's the left side objects data offset | ||
| A483 | LD L,A | Point HL at road buffer left side objects data | ||
| A484 | LD H,$EE | |||
| A486 | LD A,($A240) | Load road_buffer_offset into A | ||
| A489 | RLA | Top bit -> carry | ||
| A48A | LD A,(HL) | Read a left side object data byte | ||
| A48B | JR NC,cc_a48e | Jump if top bit was clear | ||
| A48D | INC L | L++ | ||
| cc_a48e | A48E | OR (HL) | OR in the (next) byte | |
| A48F | RET Z | Return if zero -- no object | ||
| A490 | LD C,A | HL = (*addrof_left_hand_objects)[A * 7] | ||
| A491 | ADD A,A | |||
| A492 | ADD A,A | |||
| A493 | ADD A,A | |||
| A494 | SUB C | |||
| A495 | LD C,A | |||
| A496 | LD B,$00 | |||
| A498 | LD HL,($5D00) | |||
| A49B | ADD HL,BC | |||
|
Read collision values.
|
||||
| A49C | LD C,(HL) | C = *HL++ | ||
| A49D | INC HL | |||
| A49E | LD E,(HL) | E = *HL++ | ||
| A49F | INC HL | |||
| A4A0 | LD A,(HL) | A = *HL | ||
| A4A1 | LD D,B | D = B must be zero? | ||
|
Check for collisions with scenery (left hand side).
|
||||
| A4A2 | LD HL,($EAFE) | HL = *$EAFE -- suspected position of car | ||
| A4A5 | PUSH HL | Return if HL < BC | ||
| A4A6 | SBC HL,BC | |||
| A4A8 | POP HL | |||
| A4A9 | RET C | |||
| A4AA | SBC HL,DE | Return if HL >= DE | ||
| A4AC | RET NC | |||
| A4AD | EX AF,AF' | Unbank road buffer offset | ||
| A4AE | LD A,$01 | A = 1 -- perhaps a left hand flag | ||
|
Arrive here if hit scenery, e.g. drove a tree or a lamp post.
|
||||
| cc_hit_scenery | A4B0 | PUSH AF | Preserve AF -- suspected left hand flag | |
| A4B1 | LD BC,$0403 | Effect 4 (scenery crash), Priority 3 | ||
| A4B4 | CALL start_sfx | Call start_sfx | ||
| A4B7 | POP AF | Restore AF | ||
|
This entry point is used by the routines at smash_handler and hazard_handler_a8cd.
|
||||
| cc_hit_scenery2 | A4B8 | LD HL,$B326 | HL = &<crashed flag> | |
| A4BB | INC (HL) | Set flags | ||
| A4BC | DEC (HL) | |||
| A4BD | RET NZ | Return if already crashed | ||
| cc_new_crash | A4BE | LD (HL),$01 | Set crashed flag | |
| A4C0 | LD ($B36F),A | *$B36F = A++ -- set flip flag (0/1 = right/left) | ||
| A4C3 | INC A | |||
| A4C4 | LD ($B38E),A | *$B38E = A | ||
| A4C7 | LD A,$05 | *$B385 = 5 | ||
| A4C9 | LD ($B385),A | |||
| A4CC | LD HL,($A24A) | Load speed into HL | ||
| A4CF | PUSH HL | Preserve HL | ||
| A4D0 | SRL H | H >>= 1 | ||
| A4D2 | LD A,L | A = L | ||
| A4D3 | RR A | |||
| A4D5 | SRL A | A = (A << 3) + 16 | ||
| A4D7 | SRL A | |||
| A4D9 | SRL A | |||
| A4DB | ADD A,$10 | |||
| A4DD | LD L,$18 | L = 24 | ||
| A4DF | CP L | |||
| A4E0 | JR C,cc_a4e3 | |||
| A4E2 | LD L,A | L = A | ||
| cc_a4e3 | A4E3 | LD ($B357),HL | Self modify 'LD HL,$xxxx' @ B356 | |
| A4E6 | EX AF,AF' | |||
| A4E7 | LD L,A | HL = A | ||
| A4E8 | LD H,$00 | |||
| A4EA | POP DE | |||
| A4EB | PUSH HL | |||
| A4EC | SBC HL,DE | HL -= DE | ||
| A4EE | POP HL | |||
| A4EF | JR C,cc_a4f2 | |||
| A4F1 | EX DE,HL | |||
| cc_a4f2 | A4F2 | LD ($B32F),HL | Self modify 'LD BC' @ B32E to load HL | |
| A4F5 | RET | Return | ||
| cc_not_fork | A4F6 | LD HL,($E8FE) | HL = *$E8FE -- checking the final word of the road drawing (left) table | |
| A4F9 | LD A,H | A = H (0 or 255) | ||
| A4FA | AND A | Set flags | ||
| A4FB | JR NZ,cc_a510 | Jump to cc_a510 if A isn't zero | ||
| A4FD | PUSH HL | Jump to cc_a510 if HL < $6A | ||
| A4FE | LD BC,$006A | |||
| A501 | SBC HL,BC | |||
| A503 | POP HL | |||
| A504 | JR C,cc_a510 | |||
| A506 | LD C,$85 | HL -= $85 | ||
| A508 | SBC HL,BC | |||
| A50A | INC A | A++ -- A == 1 => partially off-road | ||
| A50B | JR C,cc_not_fork_set | Jump to cc_not_fork_set if HL < $85 | ||
| A50D | INC A | A++ -- A == 2 => fully off-road | ||
| A50E | JR cc_not_fork_set | Jump to cc_not_fork_set | ||
| cc_a510 | A510 | LD HL,($EDFC) | HL = *$EDFC | |
| A513 | LD A,H | A = H | ||
| A514 | AND A | Set flags | ||
| A515 | LD A,$00 | A = 0 | ||
| A517 | JR NZ,cc_not_fork_set | JR NZ,cc_not_fork_set | ||
| A519 | PUSH HL | Jump to cc_not_fork_set if HL >= $8E | ||
| A51A | LD BC,$008E | |||
| A51D | SBC HL,BC | |||
| A51F | POP HL | |||
| A520 | JR NC,cc_not_fork_set | |||
| A522 | LD C,$7C | HL -= $7C | ||
| A524 | SBC HL,BC | |||
| A526 | INC A | A++ -- A == 1 => partially off-road | ||
| A527 | JR NC,cc_not_fork_set | Jump to cc_not_fork_set if HL >= $7C | ||
| A529 | INC A | A++ -- A == 2 => fully off-road | ||
|
Set the off-road flag etc.
|
||||
| cc_not_fork_set | A52A | LD ($A23E),A | off_road = A | |
| A52D | XOR A | A = 0 | ||
| A52E | LD ($B3DC),A | *$B3DC = A | ||
| A531 | EXX | |||
| A532 | LD ($B396),HL | *$B396 = HL | ||
| A535 | LD ($B3A4),DE | *$B3A4 = DE | ||
| A539 | LD A,($A249) | Jump to cc_a55c if fork_taken was 1 (right fork taken) | ||
| A53C | AND A | |||
| A53D | JR NZ,cc_a55c | |||
| A53F | LD HL,($5CFC) | HL = *$5CFC | ||
| A542 | LD C,(HL) | C = *HL++ -- max object boundary | ||
| A543 | INC HL | |||
| A544 | LD E,(HL) | E = *HL++ -- min object boundary | ||
| A545 | INC HL | |||
| A546 | LD A,(HL) | A = *HL | ||
| A547 | LD B,$00 | B = 0 | ||
| A549 | LD D,B | D = B | ||
| A54A | LD HL,($EAFE) | HL = *$EAFE | ||
| A54D | PUSH HL | Return if HL >= BC | ||
| A54E | SBC HL,BC | |||
| A550 | POP HL | |||
| A551 | RET NC | |||
| A552 | SBC HL,DE | Return if HL < DE | ||
| A554 | RET C | |||
| A555 | LD A,$8C | A = $8C | ||
| A557 | EX AF,AF' | |||
| A558 | XOR A | A = 0 -- perhaps a right hand flag | ||
| A559 | JP cc_hit_scenery | Exit via cc_hit_scenery | ||
| cc_a55c | A55C | LD HL,($5D02) | HL = *$5D02 | |
| A55F | LD C,(HL) | C = *HL++ | ||
| A560 | INC HL | |||
| A561 | LD E,(HL) | E = *HL++ | ||
| A562 | INC HL | |||
| A563 | LD B,$00 | B = 0 | ||
| A565 | LD D,B | D = B | ||
| A566 | LD HL,($EAFC) | HL = *$EAFC | ||
| A569 | PUSH HL | Return if HL < BC | ||
| A56A | SBC HL,BC | |||
| A56C | POP HL | |||
| A56D | RET C | |||
| A56E | SBC HL,DE | Return if HL >= DE | ||
| A570 | RET NC | |||
| A571 | LD A,$8C | A = $8C | ||
| A573 | EX AF,AF' | Bank | ||
| A574 | LD A,$01 | A = 1 -- perhaps a left hand flag | ||
| A576 | JP cc_hit_scenery | Exit via cc_hit_scenery | ||
| Prev: A27A | Up: Map | Next: A579 |