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 = split_road -- fairly sure this is a split road flag | ||
A3A3 | AND A | Set flags | ||
A3A4 | JR Z,cc_at_split | Jump to cc_at_split if zero | ||
A3A6 | LD A,($A266) | A = split_road_countdown | ||
A3A9 | AND A | Set flags | ||
A3AA | JP Z,cc_not_split | Jump to cc_not_split if zero | ||
A3AD | DEC A | A-- | ||
A3AE | RET Z | Return if zero [can't collide immediately before split?] | ||
Check left hand side of car.
|
||||
cc_at_split | A3AF | LD HL,($EAFE) | HL = *$EAFE | |
A3B2 | LD A,H | A = H (0 or 255) | ||
A3B3 | AND A | Set flags | ||
A3B4 | JR NZ,check_collisions_0 | |||
A3B6 | PUSH HL | Jump to check_collisions_0 if HL < $40 | ||
A3B7 | LD BC,$0040 | |||
A3BA | SBC HL,BC | |||
A3BC | POP HL | |||
A3BD | JR C,check_collisions_0 | |||
A3BF | PUSH HL | Jump to check_collisions_1 if HL < $6A | ||
A3C0 | LD C,$6A | |||
A3C2 | SBC HL,BC | |||
A3C4 | POP HL | |||
A3C5 | JR C,check_collisions_1 | |||
A3C7 | LD C,$85 | HL -= $85 | ||
A3C9 | SBC HL,BC | |||
A3CB | INC A | A++ -- A == 1 => partially off-road | ||
A3CC | JR C,cc_split_set | Jump to cc_split_set if A was 255 | ||
A3CE | INC A | A++ -- A == 2 => fully off-road | ||
A3CF | JR cc_split_set | Jump to cc_split_set | ||
check_collisions_0 | A3D1 | XOR A | var_a23d = 0 | |
A3D2 | LD ($A23D),A | |||
Check right hand side of car.
|
||||
check_collisions_1 | A3D5 | LD HL,($EAFC) | HL = *$EAFC | |
A3D8 | LD A,H | A = H | ||
A3D9 | AND A | Set flags | ||
A3DA | LD A,$00 | A = 0 | ||
A3DC | JR NZ,check_collisions_2 | |||
A3DE | PUSH HL | Jump to check_collisions_2 if HL >= $BE | ||
A3DF | LD BC,$00BE | |||
A3E2 | SBC HL,BC | |||
A3E4 | POP HL | |||
A3E5 | JR NC,check_collisions_2 | |||
A3E7 | PUSH HL | Jump to cc_split_set if HL >= $8E | ||
A3E8 | LD BC,$008E | |||
A3EB | SBC HL,BC | |||
A3ED | POP HL | |||
A3EE | JR NC,cc_split_set | |||
A3F0 | LD C,$7C | HL -= $7C | ||
A3F2 | SBC HL,BC | |||
A3F4 | INC A | A++ -- A == 1 => partially off-road | ||
A3F5 | JR NC,cc_split_set | Jump to cc_split_set if no carry | ||
A3F7 | INC A | A++ -- A == 2 => fully off-road | ||
A3F8 | JR cc_split_set | Jump to cc_split_set | ||
check_collisions_2 | A3FA | LD ($A23C),A | var_a23c = A | |
cc_split_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 = $00 | ||
A403 | JR Z,check_collisions_4 | 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 | HL = $EE00 | L | ||
A40B | LD H,$EE | |||
A40D | LD A,(HL) | A = *HL | ||
A40E | BIT 6,A | Test bit 6 -- tunnel bits perhaps? | ||
A410 | JR Z,check_collisions_4 | Jump if clear | ||
A412 | RLA | Test bit 7 | ||
A413 | JR C,check_collisions_4 | 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,check_collisions_3 | 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 check_collisions_8 | |||
check_collisions_3 | A426 | LD HL,$00D1 | HL = $00D1 | |
A429 | LD DE,$0195 | DE = $0195 | ||
A42C | EXX | |||
A42D | AND A | Set flags | ||
A42E | LD C,$01 | C = 1 | ||
A430 | JR Z,cc_hit_tunnel_wall | |||
A432 | INC C | C++ | ||
cc_hit_tunnel_wall | A433 | PUSH BC | ||
A434 | LD BC,$0604 | BC = $0604 | ||
A437 | CALL start_sfx | Call start_sfx | ||
A43A | POP BC | |||
check_collisions_4 | 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 | ||
A44C | ADD A,$60 | Add 96 so it's the right side objects data offset | ||
A44E | LD L,A | L = A | ||
A44F | EX AF,AF' | |||
A450 | LD H,$EE | H = $EE | ||
A452 | LD A,($A240) | Load road_buffer_offset into A | ||
A455 | RLA | Doubling? | ||
A456 | LD A,(HL) | A = *HL | ||
A457 | JR NC,check_collisions_5 | |||
A459 | INC L | L++ | ||
check_collisions_5 | A45A | OR (HL) | A |= *HL | |
A45B | JR Z,check_collisions_6 | |||
A45D | LD C,A | HL = addrof_graphic_defs[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 | |||
A469 | LD C,(HL) | C = *HL++ | ||
A46A | INC HL | |||
A46B | LD E,(HL) | E = *HL++ | ||
A46C | INC HL | |||
A46D | LD A,(HL) | A = *HL | ||
A46E | LD D,B | D = B | ||
A46F | LD HL,($EAFC) | HL = *$EAFC | ||
A472 | PUSH HL | |||
A473 | SBC HL,BC | HL -= BC | ||
A475 | POP HL | |||
A476 | JR NC,check_collisions_6 | |||
A478 | SBC HL,DE | HL -= DE | ||
A47A | JR C,check_collisions_6 | |||
A47C | EX AF,AF' | |||
A47D | XOR A | A = 0 | ||
A47E | JR cc_hit_scenery | Jump to cc_hit_scenery | ||
check_collisions_6 | A480 | EX AF,AF' | ||
A481 | ADD A,$20 | A += 32 | ||
A483 | LD L,A | HL = $EE00 | A | ||
A484 | LD H,$EE | |||
A486 | LD A,($A240) | Load road_buffer_offset into A | ||
A489 | RLA | Doubling? | ||
A48A | LD A,(HL) | A = *HL | ||
A48B | JR NC,check_collisions_7 | |||
A48D | INC L | L++ | ||
check_collisions_7 | A48E | OR (HL) | A |= *HL | |
A48F | RET Z | Return if zero | ||
A490 | LD C,A | HL = (*$5D00)[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 | |||
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? | ||
A4A2 | LD HL,($EAFE) | HL = *$EAFE | ||
A4A5 | PUSH HL | |||
A4A6 | SBC HL,BC | HL -= BC | ||
A4A8 | POP HL | |||
A4A9 | RET C | Return if carry | ||
A4AA | SBC HL,DE | HL -= DE | ||
A4AC | RET NC | Return if no carry | ||
A4AD | EX AF,AF' | |||
A4AE | LD A,$01 | A = $01 | ||
cc_hit_scenery | A4B0 | PUSH AF | ||
A4B1 | LD BC,$0403 | BC = $0403 -- arrive here if drive into scenery, e.g. a tree | ||
A4B4 | CALL start_sfx | Call start_sfx | ||
A4B7 | POP AF | |||
This entry point is used by the routines at smash_handler and hazard_handler_a8cd.
|
||||
check_collisions_8 | A4B8 | LD HL,$B326 | HL = &<crashed flag> | |
A4BB | INC (HL) | Set flags | ||
A4BC | DEC (HL) | |||
A4BD | RET NZ | Return if already crashed? | ||
A4BE | LD (HL),$01 | Set crashed flag | ||
A4C0 | LD ($B36F),A | *$B36F = A++ | ||
A4C3 | INC A | |||
A4C4 | LD ($B38E),A | *$B38E = A | ||
A4C7 | LD A,$05 | |||
A4C9 | LD ($B385),A | *$B385 = 5 | ||
A4CC | LD HL,($A24A) | HL = speed | ||
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,check_collisions_9 | |||
A4E2 | LD L,A | L = A | ||
check_collisions_9 | A4E3 | LD ($B357),HL | *$B357 = HL | |
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,check_collisions_10 | |||
A4F1 | EX DE,HL | |||
check_collisions_10 | A4F2 | LD ($B32F),HL | Self modify 'LD BC' @ B32E to load HL | |
A4F5 | RET | Return | ||
cc_not_split | A4F6 | LD HL,($E8FE) | HL = *$E8FE [mystery var] | |
A4F9 | LD A,H | A = H (0 or 255) | ||
A4FA | AND A | Set flags | ||
A4FB | JR NZ,check_collisions_11 | A isn't zero | ||
A4FD | PUSH HL | Jump to check_collisions_11 if HL < $6A | ||
A4FE | LD BC,$006A | |||
A501 | SBC HL,BC | |||
A503 | POP HL | |||
A504 | JR C,check_collisions_11 | |||
A506 | LD C,$85 | |||
A508 | SBC HL,BC | HL -= $85 | ||
A50A | INC A | A++ -- A == 1 => partially off-road | ||
A50B | JR C,cc_not_split_set | Jump to cc_not_split_set if HL < $85 | ||
A50D | INC A | A++ -- A == 2 => fully off-road | ||
A50E | JR cc_not_split_set | Jump to cc_not_split_set | ||
check_collisions_11 | 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_split_set | JR NZ,cc_not_split_set | ||
A519 | PUSH HL | Jump to cc_not_split_set if HL >= $8E | ||
A51A | LD BC,$008E | |||
A51D | SBC HL,BC | |||
A51F | POP HL | |||
A520 | JR NC,cc_not_split_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_split_set | Jump to cc_not_split_set if HL >= $7C | ||
A529 | INC A | A++ -- A == 2 => fully off-road | ||
cc_not_split_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 check_collisions_12 if fork_taken was 1 (right fork taken) | ||
A53C | AND A | |||
A53D | JR NZ,check_collisions_12 | |||
A53F | LD HL,($5CFC) | HL = *$5CFC | ||
A542 | LD C,(HL) | C = *HL++ | ||
A543 | INC HL | |||
A544 | LD E,(HL) | E = *HL++ | ||
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 | ||
A559 | JP cc_hit_scenery | Jump to cc_hit_scenery | ||
check_collisions_12 | 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' | |||
A574 | LD A,$01 | A = 1 | ||
A576 | JP cc_hit_scenery | Jump to cc_hit_scenery |
Prev: A27A | Up: Map | Next: A579 |