| Chase H.Q. | Routines | 
| Prev: B063 | Up: Map | Next: B4CC | 
| 
Used by the routines at main_loop and cpu_driver.
 | ||||
| animate_hero_car | B318 | LD HL,($A24A) | Jump to ahc_check_crashed if speed > 0 | |
| B31B | LD A,H | |||
| B31C | OR L | |||
| B31D | JR NZ,ahc_check_crashed | |||
| 
A is zero here.
 | ||||
| B31F | LD ($B3DC),A | Self modify 'LD A' @ B3DB (below) to load zero | ||
| B322 | LD ($A23E),A | off_road = 0 | ||
| ahc_check_crashed | B325 | LD A,$00 | A = <self modified> -- crashed flag set by cc_new_crash | |
| B327 | AND A | Jump if not crashed | ||
| B328 | JR Z,ahc_not_crashed | |||
| 
Crashed. A is non-zero here.
 | ||||
| ahc_crashed | B32A | LD ($A24D),A | cornering = A (which is non-zero here) | |
| B32D | PUSH HL | Preserve speed | ||
| B32E | LD BC,$0000 | BC = <self modified> -- set when crashed by cc_a4f2 | ||
| B331 | SBC HL,BC | Speed minus whatever BC holds? | ||
| B333 | POP HL | Restore speed | ||
| B334 | JR C,ahc_speed_less_or_eq | Jump to ahc_speed_less_or_eq if speed < ? | ||
| ahc_speed_greater | B336 | LD D,H | Divide speed by four (D becomes zero since game max speed is 511) | |
| B337 | LD A,L | |||
| B338 | SRL D | |||
| B33A | RR A | |||
| B33C | SRL A | |||
| B33E | OR $03 | A |= 3 -- perhaps rounding up | ||
| B340 | LD E,A | E = A | ||
| B341 | SBC HL,DE | HL -= DE -- overall expr is new_speed = (speed - ((speed / 4) | 3)) | ||
| B343 | JR Z,ahc_speed_less_or_eq | Jump to ahc_speed_less_or_eq if equal (to zero?) | ||
| B345 | LD A,$02 | Turn speed = 2 (fastest) | ||
| B347 | JR NC,ahc_assign_speed | Jump to ahc_assign_speed if HL > DE | ||
| 
Otherwise HL < DE.
 | ||||
| ahc_speed_less_or_eq | B349 | XOR A | Clear crashed flag | |
| B34A | LD ($B326),A | |||
| B34D | INC A | Turn speed = 1 (middle) | ||
| B34E | JR ahc_assign_turn_speed | Jump to set turn speed | ||
| ahc_assign_speed | B350 | LD ($A24A),HL | Set speed to HL | |
| ahc_assign_turn_speed | B353 | LD ($A250),A | Set turn_speed to A -- could be 0, 1 or 2 | |
| 
This value is set by cc_a4e3, then decremented by 1/16 each time we pass here.
 | ||||
| B356 | LD HL,$0000 | HL = <self modified below> | ||
| 
Divide HL by 16.
 | ||||
| B359 | LD D,H | DE = HL | ||
| B35A | LD E,L | |||
| B35B | SRL D | DE / 2 -- after this it all fits into E | ||
| B35D | RR E | |||
| B35F | SRL E | Divide E by 8 | ||
| B361 | SRL E | |||
| B363 | SRL E | |||
| B365 | SBC HL,DE | HL -= DE -- i.e. original HL minus HL/16 | ||
| B367 | LD ($B357),HL | Self modify 'LD HL,$xxxx' @ B356 above | ||
| B36A | EX DE,HL | |||
| B36B | LD HL,($A26C) | Load road_pos | ||
| B36E | LD C,$00 | Load flip_flag, self modified by A4C0 in check_collisions | ||
| B370 | LD A,C | flip_car = (flip_flag & 1) | ||
| B371 | AND $01 | |||
| B373 | LD ($A251),A | |||
| B376 | DEC C | Jump if flip_flag is 1 | ||
| B377 | JR Z,ahc_reduce_road_pos | |||
| B379 | DEC C | Jump if flip_flag is 2 -- is this ever taken? | ||
| B37A | JR Z,ahc_assign_road_pos | |||
| 
Flip flag was zero?
 | ||||
| ahc_increase_road_pos | B37C | ADD HL,DE | Increment road position by DE | |
| B37D | JR ahc_assign_road_pos | Jump to set road_pos | ||
| ahc_reduce_road_pos | B37F | SBC HL,DE | Decrement road position by DE | |
| ahc_assign_road_pos | B381 | LD ($A26C),HL | Set road_pos to HL | |
| 
Decrement this counter.
 | ||||
| B384 | LD A,$00 | Set to 5 on collisions (by A4C7, and decremented below) | ||
| B386 | AND A | Jump if zero | ||
| B387 | JR Z,animate_hero_car_0 | |||
| B389 | DEC A | Decrement | ||
| B38A | LD ($B385),A | Self modify 'LD A,x' @ B384 (above) to x = A | ||
| B38D | LD A,$00 | A = <self modified> -- gets set to (flip flag + 1) | ||
| animate_hero_car_0 | B38F | LD ($B3DC),A | *$B3DC = A (below) | |
| 
Arrive here if not crashed.
 | ||||
| ahc_not_crashed | B392 | LD HL,($A26C) | Load road_pos | |
| B395 | LD DE,$0048 | DE = 72 | ||
| B398 | LD A,H | A = H | ||
| B399 | AND A | Set flags | ||
| B39A | JP M,animate_hero_car_2 | Jump if top bit is set? | ||
| B39D | JR NZ,animate_hero_car_1 | Jump if non-zero | ||
| 
Otherwise it was zero.
 | ||||
| B39F | LD A,L | A = L | ||
| B3A0 | SUB E | A -= E | ||
| B3A1 | JR C,animate_hero_car_2 | Jump if E > L | ||
| animate_hero_car_1 | B3A3 | LD DE,$01D8 | DE = $01D8 | |
| B3A6 | LD A,H | A = H | ||
| B3A7 | CP D | |||
| B3A8 | JR C,ahc_assign_road_pos_2 | Jump if D > H | ||
| B3AA | JR NZ,animate_hero_car_2 | |||
| B3AC | LD A,L | A = L | ||
| B3AD | SUB E | A -= E | ||
| B3AE | JR C,ahc_assign_road_pos_2 | Jump if E > L | ||
| animate_hero_car_2 | B3B0 | EX DE,HL | ||
| ahc_assign_road_pos_2 | B3B1 | LD ($A26C),HL | Set road_pos to HL | |
| B3B4 | LD A,($A24D) | A = cornering | smoke | ||
| B3B7 | LD HL,$A24F | |||
| B3BA | OR (HL) | |||
| B3BB | LD BC,$0105 | Effect 1 (cornering squeal), Priority 5 | ||
| B3BE | CALL NZ,start_sfx | Call start_sfx if cornering or smoke | ||
| B3C1 | LD A,($A230) | Jump if perp_caught_phase == 0 | ||
| B3C4 | AND A | |||
| B3C5 | JR Z,ahc_debris | |||
| B3C7 | DEC A | Jump if perp_caught_phase is 1 (starts the pull over sequence) | ||
| B3C8 | JR Z,ahc_debris | |||
| 
New turn speed = MIN(A,2)
 | ||||
| B3CA | CP $02 | Jump if A < 2 | ||
| B3CC | JR C,animate_hero_car_3 | |||
| B3CE | LD A,$02 | Else A = 2 | ||
| animate_hero_car_3 | B3D0 | LD ($A250),A | turn_speed = A | |
| B3D3 | LD A,$01 | flip_car = 1 | ||
| B3D5 | LD ($A251),A | |||
| ahc_debris | B3D8 | CALL draw_debris | Draw debris | |
| B3DB | LD A,$00 | A = <self modified> -- flip flag + 1 | ||
| B3DD | AND A | Jump if zero (not flipped?) | ||
| B3DE | JR Z,animate_hero_car_6 | |||
| B3E0 | LD C,A | C = A | ||
| B3E1 | RLCA | |||
| B3E2 | ADD A,C | A += C + 24 | ||
| B3E3 | ADD A,$18 | |||
| B3E5 | LD C,A | C = A | ||
| B3E6 | LD A,($A250) | Load turn_speed | ||
| B3E9 | CP $02 | Jump if < 2 | ||
| B3EB | JR C,animate_hero_car_5 | |||
| 
turn_speed is 2.
 | ||||
| B3ED | LD A,($A251) | Load flip_car | ||
| B3F0 | AND A | Jump if zero | ||
| B3F1 | JR Z,animate_hero_car_4 | |||
| B3F3 | INC C | 2 -> 3 | ||
| animate_hero_car_4 | B3F4 | INC C | 2/3 -> 3/4 | |
| animate_hero_car_5 | B3F5 | EXX | Bank/unbank | |
| B3F6 | LD A,($A234) | B = counter_A & 1 -- animation counter | ||
| B3F9 | AND $01 | |||
| B3FB | LD B,A | |||
| B3FC | RLCA | |||
| B3FD | LD C,A | C = A | ||
| B3FE | EXX | |||
| B3FF | LD A,C | A = C | ||
| B400 | CALL draw_crash | Draw crash | ||
| B403 | XOR A | off_road = 0 | ||
| B404 | LD ($A23E),A | |||
| animate_hero_car_6 | B407 | CALL ahc_check_hand_flag | Call ahc_check_hand_flag | |
| 
Make the car bounce up and down when it goes off-road.
 | ||||
| B40A | LD B,$00 | Default bounce of zero to pass to draw_car. It should be either 0 or 3. | ||
| B40C | LD A,($A23E) | Add the bounce only when one wheel is off-road (if off_road == 1) | ||
| B40F | DEC A | |||
| B410 | JR NZ,ahc_draw_car | |||
| B412 | LD A,($A236) | New bounce = (counter_C & 1) * 3 -- half rate counter 0/1/2/3 | ||
| B415 | AND $01 | |||
| B417 | LD B,A | |||
| B418 | ADD A,A | |||
| B419 | ADD A,B | |||
| B41A | LD B,A | |||
| ahc_draw_car | B41B | LD A,($A250) | Load turn_speed | |
| B41E | CALL draw_car | Call draw_car | ||
| B421 | LD A,($A228) | Jump if cherry_light is zero | ||
| B424 | AND A | |||
| B425 | JR Z,ahc_draw_smoke | |||
| 
Draw the cherry light.
 | ||||
| B427 | XOR A | A = 0 | ||
| B428 | LD BC,$0102 | BC = $0102 -- size? | ||
| B42B | CALL draw_cherry | Call draw_cherry | ||
| 
Check to see if smoke needs drawing.
 | ||||
| ahc_draw_smoke | B42E | LD A,($A234) | B = counter_A (0/1/2/3) | |
| B431 | LD B,A | |||
| B432 | LD HL,$A24D | Jump if cornering | ||
| B435 | LD A,(HL) | |||
| B436 | AND A | |||
| B437 | JR NZ,ahc_do_draw_smoke | |||
| B439 | LD A,($A236) | A = counter_C -- half rate counter 0/1/2/3 | ||
| B43C | LD B,A | B = A | ||
| B43D | INC HL | HL++ | ||
| B43E | LD A,(HL) | A = *HL++ | ||
| B43F | INC HL | |||
| B440 | OR (HL) | A |= *HL | ||
| B441 | JR NZ,ahc_do_draw_smoke | |||
| B443 | LD A,($A23E) | Load off_road | ||
| B446 | CP $02 | Return if not fully off-road | ||
| B448 | RET NZ | |||
| 
Draw the smoke.
 | ||||
| ahc_do_draw_smoke | B449 | XOR A | A' = 0 | |
| B44A | EX AF,AF' | |||
| B44B | LD A,B | A = B -- smoke anim index | ||
| B44C | PUSH AF | preserve | ||
| B44D | CALL draw_smoke | Call draw_smoke - for the right hand side | ||
| B450 | LD A,$01 | A' = 1 | ||
| B452 | EX AF,AF' | |||
| B453 | POP AF | restore smoke anim index | ||
| B454 | JP draw_smoke | Exit via draw_smoke - for the left hand side | ||
| ahc_check_hand_flag | B457 | LD A,($A22F) | Return if hand_flag is zero | |
| B45A | AND A | |||
| B45B | RET Z | |||
| 
Start the animation.
 | ||||
| ahc_hand_flag_non_zero | B45C | DEC A | Jump if hand_flag is one | |
| B45D | JR Z,ahc_hand_flag_one | |||
| 
Show the "stop" hand.
 | ||||
| ahc_hand_flag_gt_one | B45F | EXX | Bank | |
| B460 | LD B,A | BC = A | ||
| B461 | LD C,$00 | |||
| B463 | EXX | Unbank | ||
| 
Avoid the hand animation if turning hard?
 | ||||
| B464 | LD A,($A250) | Is turn_speed 2? (turn hard) | ||
| B467 | CP $02 | |||
| B469 | LD A,$24 | A = 36 | ||
| B46B | JP NZ,draw_crash | Exit via draw_crash if turn_speed != 2 | ||
| 
Otherwise turn_speed is 2 (turn hard).
 | ||||
| B46E | LD A,($A251) | A = flip_car + 37 | ||
| B471 | ADD A,$25 | |||
| B473 | JP draw_crash | Exit via draw_crash | ||
| 
Start the animation.
 | ||||
| ahc_hand_flag_one | B476 | LD C,$00 | C = <self modified> | |
| B478 | LD A,$00 | A = <self modified> [could be animation frame?] -- gets set to 2 | ||
| B47A | DEC A | A-- | ||
| B47B | LD ($B479),A | Self modify 'LD A' @ B478 (above) to load A | ||
| B47E | JR NZ,ahc_b493 | |||
| B480 | LD B,$02 | B = 2 | ||
| B482 | INC C | C++ | ||
| B483 | LD A,C | A = C | ||
| B484 | CP $04 | Jump if >= 4 | ||
| B486 | JR NC,ahc_b48f | |||
| B488 | INC A | A++ | ||
| B489 | LD C,A | C = A | ||
| B48A | CP $02 | Jump if != 2 | ||
| B48C | JR NZ,ahc_b48f | |||
| B48E | INC B | B++ | ||
| ahc_b48f | B48F | LD A,B | A = B | |
| B490 | LD ($B479),A | Self modify 'LD A' @ B478 (above) to load A | ||
| ahc_b493 | B493 | LD A,C | A = C | |
| B494 | LD ($B477),A | Self modify 'LD C' @ ahc_hand_flag_one (above) to load A | ||
| B497 | CP $07 | Jump if >= 7 | ||
| B499 | JR C,animate_hero_car_7 | |||
| B49B | XOR A | hand_flag = 0 | ||
| B49C | LD ($A22F),A | |||
| B49F | RET | Return | ||
| animate_hero_car_7 | B4A0 | LD A,($A250) | A = turn_speed | |
| B4A3 | CP $02 | CP 2 | ||
| B4A5 | LD A,$06 | A = 6 | ||
| B4A7 | JR NZ,animate_hero_car_8 | |||
| B4A9 | LD A,($A251) | A = (A << 3) - flip_car + 13 | ||
| B4AC | LD B,A | |||
| B4AD | RLCA | |||
| B4AE | RLCA | |||
| B4AF | RLCA | |||
| B4B0 | SUB B | |||
| B4B1 | ADD A,$0D | |||
| animate_hero_car_8 | B4B3 | ADD A,C | A += C | |
| B4B4 | PUSH AF | |||
| B4B5 | CALL draw_cherry_b699 | |||
| B4B8 | POP AF | |||
| B4B9 | LD C,A | C = A | ||
| B4BA | LD A,($B477) | Read from 'LD C' @ ahc_hand_flag_one (above) to load A | ||
| B4BD | CP $04 | Jump to ahc_enable_cherry_light if A >= 4 | ||
| B4BF | JR NC,ahc_enable_cherry_light | |||
| B4C1 | INC C | C++ | ||
| B4C2 | LD A,C | A = C | ||
| B4C3 | JP draw_cherry_b699 | Exit via draw_cherry_b699 | ||
| ahc_enable_cherry_light | B4C6 | LD A,$01 | Enable the cherry_light | |
| B4C8 | LD ($A228),A | |||
| B4CB | RET | Return | ||
| Prev: B063 | Up: Map | Next: B4CC |