| Chase H.Q. | Routines |
| Prev: B9F4 | Up: Map | Next: BC3E |
|
Returns at once unless the high byte of fork_distance is non-zero, so nothing happens until the fork has been travelled far enough.
fork_taken then picks the left or the right exit: the five road data stream pointers - curvature, height, lanes, hazards and side objects - are pointed at that branch's exit tables and the per-command handlers for each stream are wired up through lookup_map_goto. 32 curvature bytes are filled with the turn type, 32 lane bytes with the lane type and 32 object bytes are zeroed. All the fork and road counters are reset last, so the engine goes back to rendering a single road.
Used by the routine at main_loop.
|
||||
|
When fork_distance exceeds 255 we can proceed.
|
||||
| exit_fork | BB69 | LD A,($A268) | Return if (fork_distance & $FF00) is zero | |
| BB6C | AND A | |||
| BB6D | RET Z | |||
|
Reset road setup back to a single road now that the forked road has completed.
|
||||
| BB6E | LD A,($A249) | A = fork_taken - 1 | ||
| BB71 | DEC A | |||
| BB72 | JR Z,ef_right | Jump if A is zero (right fork taken) | ||
|
Set up left route.
|
||||
| ef_left | BB74 | LD DE,$FC01 | D,E = $FC,$01 (curvature byte -4 => super hard (?) left turn, lanes byte = 1) | |
| BB77 | PUSH DE | Save for later | ||
| BB78 | LD HL,$E2D9 | road_leftside_ptr = $E2D9 | ||
| BB7B | LD ($A276),HL | |||
| BB7E | LD HL,$E2D5 | road_rightside_ptr = $E2D5 | ||
| BB81 | LD ($A274),HL | |||
| BB84 | LD HL,$E2E7 | road_lanes_ptr = $E2E7 | ||
| BB87 | LD ($A272),HL | |||
| BB8A | LD HL,$0000 | Self modified by C035 to be the left route's hazards data | ||
| BB8D | LD DE,$0000 | Self modified by BF73 to be the left route's rightside data | ||
| BB90 | LD BC,$0000 | Self modified by BFBC to be the left route's leftside data | ||
| BB93 | EXX | Bank | ||
| BB94 | LD HL,$0000 | Self modified by BE5C to be the left route's curvature data | ||
| BB97 | LD DE,$0000 | Self modified by BEAE to be the left route's height data | ||
| BB9A | LD BC,$0000 | Self modified by BEF9 to be the left route's lanes data | ||
| BB9D | LD A,$40 | A = 64 -- added to the lanes offset below, so the stream cleared at BC0C is the left objects one (64 + 64 = 128) | ||
| BB9F | JR ef_set_handlers | Jump to ef_set_handlers | ||
|
Set up right route.
|
||||
| ef_right | BBA1 | LD DE,$0403 | D,E = $04,$03 (curvature byte +4 => super hard (?) right turn, lanes byte = 3) | |
| BBA4 | PUSH DE | Save for later | ||
|
Note the switch around here.
|
||||
| BBA5 | LD HL,$E2D5 | road_leftside_ptr = $E2D5 | ||
| BBA8 | LD ($A276),HL | |||
| BBAB | LD HL,$E2D9 | road_rightside_ptr = $E2D9 | ||
| BBAE | LD ($A274),HL | |||
| BBB1 | LD HL,$E2F3 | road_lanes_ptr = $E2F3 | ||
| BBB4 | LD ($A272),HL | |||
| BBB7 | LD HL,$0000 | Self modified by C03D to be the right route's hazards data | ||
| BBBA | LD DE,$0000 | Self modified by BF73 to be the right route's rightside data | ||
| BBBD | LD BC,$0000 | Self modified by BFC4 to be the right route's leftside data | ||
| BBC0 | EXX | Bank | ||
| BBC1 | LD HL,$0000 | Self modified by BE62 to be the right route's curvature data | ||
| BBC4 | LD DE,$0000 | Self modified by BEB6 to be the right route's height data | ||
| BBC7 | LD BC,$0000 | Self modified by BF01 to be the right route's lanes data | ||
| BBCA | LD A,$20 | A = 32 -- added to the lanes offset below, so the stream cleared at BC0C is the right objects one (64 + 32 = 96) | ||
| ef_set_handlers | BBCC | LD ($BE6D),HL | Self modify rm_curvature_one_command handler | |
| BBCF | LD ($BEBF),DE | Self modify rm_height_one_command handler | ||
| BBD3 | LD ($BF0A),BC | Self modify rm_lanes_one_command handler | ||
| BBD7 | EXX | Unbank | ||
| BBD8 | LD ($BFCD),BC | Self modify rm_leftside_one_command handler | ||
| BBDC | LD ($BF84),DE | Self modify rm_rightside_one_command handler | ||
| BBE0 | LD ($C046),HL | Self modify rm_hazards_one_command handler | ||
| BBE3 | LD HL,$E2DD | road_curvature_ptr = $E2DD | ||
| BBE6 | LD ($A26E),HL | |||
| BBE9 | LD HL,$E2E2 | road_height_ptr = $E2E2 | ||
| BBEC | LD ($A270),HL | |||
| BBEF | LD HL,$E2D2 | road_hazard_ptr = $E2D2 | ||
| BBF2 | LD ($A278),HL | |||
| BBF5 | POP DE | Suspected road curve type left/right | ||
| BBF6 | LD C,A | Copy road buffer additional offset | ||
|
The code commonly loads the byte at road_buffer_offset and merges it with $EE00, yet road_buffer_offset already contains a whole word with the right value.
|
||||
| BBF7 | LD A,($A240) | Load road_buffer_offset.lo into A [as byte] | ||
| BBFA | LD L,A | Point HL at road buffer curvature data | ||
| BBFB | LD H,$EE | |||
|
Set the 32 bytes at HL to the road curvature type in D.
|
||||
| BBFD | LD B,$20 | 32 iterations | ||
| ef_set_curvature_loop | BBFF | LD (HL),D | Store | |
| BC00 | INC L | Advance | ||
| BC01 | DJNZ ef_set_curvature_loop | Loop | ||
|
Set the 32 bytes at HL + 64 to the lane type in E.
|
||||
| BC03 | ADD A,$40 | A = road_buffer_offset.lo + 64 | ||
| BC05 | LD L,A | Point HL at lane bytes | ||
| BC06 | LD B,$20 | 32 iterations | ||
| ef_set_lanes_loop | BC08 | LD (HL),E | Store | |
| BC09 | INC L | Advance | ||
| BC0A | DJNZ ef_set_lanes_loop | Loop | ||
|
Zero the 32 bytes at HL + 64 + C (the additional offset that was setup earlier). The road buffer holds six 32-byte streams in the order curvature, height, lanes, right objects, left objects, hazards, so this clears the objects stream on the inside of the fork being entered.
|
||||
| BC0C | ADD A,C | get offset | ||
| BC0D | LD L,A | Point HL at the objects bytes | ||
| BC0E | LD E,B | E = 0, since B is zero | ||
| BC0F | LD B,$20 | 32 iterations | ||
| ef_set_objects_loop | BC11 | LD (HL),E | Store | |
| BC12 | INC L | Advance | ||
| BC13 | DJNZ ef_set_objects_loop | Loop | ||
| BC15 | XOR A | curvature_byte = 0 | ||
| BC16 | LD C,A | |||
| BC17 | LD ($A242),A | |||
| BC1A | LD ($A243),A | height_byte = 0 | ||
| BC1D | LD ($A244),A | leftside_byte = 0 | ||
| BC20 | LD ($A245),A | rightside_byte = 0 | ||
| BC23 | LD ($A246),A | hazards_byte = 0 | ||
| BC26 | LD ($A247),A | lanes_counter_byte = 0 | ||
| BC29 | LD ($A269),A | fork_in_progress = 0 | ||
| BC2C | LD ($A249),A | fork_taken = 0 | ||
| BC2F | LD ($A265),A | fork_visible = 0 | ||
| BC32 | INC A | no_objects_counter = 1 | ||
| BC33 | LD ($A185),A | |||
| BC36 | LD ($A16D),A | spawn_accumulator = 1 | ||
| BC39 | LD ($A267),BC | fork_distance = 0 [B & C are zero here] | ||
| BC3D | RET | Return | ||
| Prev: B9F4 | Up: Map | Next: BC3E |