| Chase H.Q. | Routines | 
| Prev: B9F4 | Up: Map | Next: BC3E | 
| 
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 -- additional offset into road buffer (presumably left objects) | ||
| 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 -- additional offset into road buffer (presumably right objects) | ||
| 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 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 + 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). This seems to be objects.
 | ||||
| BC0C | ADD A,C | get offset | ||
| BC0D | LD L,A | Point HL at (?) 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 | var_a16d = 1 | ||
| BC39 | LD ($A267),BC | fork_distance = 0 [B & C are zero here] | ||
| BC3D | RET | Return | ||
| Prev: B9F4 | Up: Map | Next: BC3E |