Chase H.Q. | Routines |
Prev: B059 | Up: Map | Next: B318 |
Used by the routines at main_loop and cpu_driver.
|
||||
move_hero_car | B063 | LD A,$00 | Load jump counter. Self modified by 8827 and B965. Highest is 8. | |
B065 | AND A | Jump to mhc_not_jumping if the jump counter is zero | ||
B066 | JR Z,mhc_set_jump_offset | |||
Hero car is jumping.
|
||||
mhc_jumping | B068 | DEC A | Decrement the jump counter in (self modified) move_hero_car | |
B069 | LD ($B064),A | |||
B06C | JR NZ,mhc_midair | Jump to mhc_midair if we're still jumping | ||
Hero car has landed.
|
||||
mhc_landed | B06E | LD A,$03 | smoke = 3 | |
B070 | LD ($A24F),A | |||
B073 | LD BC,$0203 | Effect 2 (car landing), Priority 3 | ||
B076 | CALL start_sfx | Call start_sfx | ||
Hero car is in mid-air, or has just landed.
|
||||
mhc_midair | B079 | LD HL,$0000 | Point HL at entry in jump table. Self modified by B96C and B092. Default is $B055. | |
B07C | XOR A | off_road = 0 | ||
B07D | LD ($A23E),A | } | ||
B080 | LD A,($A0D5) | Clear up/down/left/right bits of user input (stop the player from turning when in mid-air) | ||
B083 | AND $F0 | |||
B085 | LD ($A0D5),A | |||
The low bytes of the hero_car_jump_table entries are the car's pitch (0/3/6).
|
||||
B088 | LD A,(HL) | Self modify the 'ADD A,x' at #$B5AF to load the car's pitch | ||
B089 | LD ($B5B0),A | |||
B08C | INC HL | |||
The high bytes of the entries are the car's jump offset (-13..13).
|
||||
B08D | LD A,($B5AB) | A = *$B5AB + *HL++ -- Self modified value in draw_car | ||
B090 | ADD A,(HL) | |||
B091 | INC HL | |||
B092 | LD ($B07A),HL | Update HL jump table entry address above @ mhc_midair | ||
mhc_set_jump_offset | B095 | LD ($B5AB),A | Self modify 'SUB x' @ B5AA to be the new car jump offset | |
B098 | LD HL,$A24E | Address of boost timer | ||
B09B | LD A,(HL) | Jump to mhc_smoke if a turbo boost is not in effect | ||
B09C | AND A | |||
B09D | JR Z,mhc_smoke | |||
B09F | DEC (HL) | Decrement boost timer | ||
B0A0 | JR NZ,mhc_smoke | Jump to mhc_smoke if boost timer is non-zero | ||
B0A2 | LD A,($A170) | Decrement turbo boost count [POKE $B0A5,0 for Infinite turbos] | ||
B0A5 | DEC A | |||
B0A6 | LD ($A170),A | |||
Handle smoke effect.
|
||||
mhc_smoke | B0A9 | INC HL | HL now points at smoke | |
B0AA | LD A,(HL) | Jump if smoke is zero | ||
B0AB | AND A | |||
B0AC | JR Z,mhc_gear_change | |||
B0AE | DEC (HL) | Decrement smoke | ||
Handle gear changes.
|
||||
mhc_gear_change | B0AF | LD A,($A0D5) | Read user input | |
B0B2 | LD C,A | Preserve it in C | ||
B0B3 | LD A,($B326) | Read from the 'LD A,x' @ ahc_check_crashed (crashed flag) | ||
B0B6 | AND A | Jump if zero | ||
B0B7 | JR Z,mhc_b0bd | |||
Otherwise the crashed flag is set.
|
||||
B0B9 | LD A,C | Change user input to be ONLY the fire/gear flag (if set) | ||
B0BA | AND $10 | |||
B0BC | LD C,A | |||
mhc_b0bd | B0BD | LD A,C | A = C | |
B0BE | PUSH AF | Preserve the modified user input for later | ||
B0BF | BIT 4,A | Test fire/gear flag | ||
B0C1 | LD HL,$A253 | Address of gear flag | ||
B0C4 | LD A,($A252) | Load gear_lockout | ||
B0C7 | JR Z,mhc_b0d7 | Jump if fire/gear is unset | ||
Fire/gear was set.
|
||||
B0C9 | AND A | Jump if gear_lockout is set -- lock out gear changes while set | ||
B0CA | JR NZ,mhc_b0d7 | |||
B0CC | LD A,(HL) | Toggle gear flag | ||
B0CD | XOR $01 | |||
B0CF | LD (HL),A | |||
B0D0 | LD A,$04 | Smoke time remaining | ||
B0D2 | JR Z,mhc_b0d7 | Jump if low gear | ||
B0D4 | LD ($A24F),A | Set smoke counter | ||
mhc_b0d7 | B0D7 | SUB $01 | Decrement A [why write it as a SUB 1?] | |
B0D9 | JR C,mhc_b0de | Jump if positive result | ||
B0DB | LD ($A252),A | gear_lockout = A | ||
mhc_b0de | B0DE | LD A,(HL) | Read current gear flag | |
B0DF | EX AF,AF' | Bank it | ||
B0E0 | LD HL,($A24A) | Read current speed | ||
B0E3 | PUSH HL | Stack current speed | ||
B0E4 | LD DE,$0078 | Jump if speed >= 120 | ||
B0E7 | SBC HL,DE | |||
B0E9 | JR NC,mhc_done_idle | |||
Going slowly here (<120).
|
||||
mhc_going_slow | B0EB | LD A,($A230) | Jump if perp_caught_phase > 0 -- Don't do idle handling if we're slowing while catching the perp | |
B0EE | AND A | |||
B0EF | JR NZ,mhc_done_idle | |||
Handle idle timer.
|
||||
mhc_idle_timer | B0F1 | LD HL,$A16E | Address of idle timer | |
B0F4 | DEC (HL) | Decrement idle timer | ||
B0F5 | JR NZ,mhc_done_idle | Jump if non-zero | ||
mhc_reset_idle_timer | B0F7 | LD (HL),$64 | Reset idle timer to 100 | |
B0F9 | LD A,$0A | Set priority to 10 | ||
B0FB | LD HL,$98F8 | Point HL at get_moving_chatter (Raymond: "LET'S GET MOVIN' MAN!") | ||
B0FE | CALL start_chatter | Call start_chatter (priority 10) | ||
mhc_done_idle | B101 | POP HL | Pop current speed | |
B102 | LD D,H | Save current speed in DE for later | ||
B103 | LD E,L | |||
B104 | LD A,($A23E) | Load the off-road flag | ||
B107 | AND A | Jump if zero (fully on-road) | ||
B108 | JR Z,mhc_done_offroad | |||
Handle off-road (A can be 1 or 2 here).
|
||||
mhc_offroad | B10A | LD BC,$0078 | Set max speed for when one wheel off-road (120 => ~100?) | |
B10D | DEC A | Jump if off-road was one | ||
B10E | JR Z,mhc_chose_offroad_speed | |||
B110 | LD BC,$006E | Set max speed for when both wheels off-road (110 => ~90?) | ||
mhc_chose_offroad_speed | B113 | AND A | Clear carry | |
B114 | SBC HL,BC | 16-bit subtract only for result in flags | ||
B116 | LD H,D | Restore current speed saved earlier | ||
B117 | LD L,E | |||
B118 | JR C,mhc_done_offroad | Jump if current speed (HL) < max speed (DE) -- don't reduce speed? | ||
This seems to be reducing the speed by a pseudorandom value when we're off-road. If it's NOPped out then going offroad will cause max speed.
|
||||
mhc_offroad_reduce_speed | B11A | LD A,L | Current speed low byte | |
B11B | RR H | Bottom bit of H moves to carry | ||
B11D | RLA | A <<= 4 -- 9 bit rotate left through carry | ||
B11E | RLA | |||
B11F | RLA | |||
B120 | RLA | |||
B121 | AND $0F | A = -((A & $0F) | 1) -- top four bits of speed... at least one | ||
B123 | OR $01 | |||
B125 | NEG | |||
B127 | LD C,A | BC = $FF00 | A -- speed delta (slowing) | ||
B128 | LD B,$FF | |||
B12A | JP mhc_check_brake | Jump to mhc_check_brake | ||
mhc_done_offroad | B12D | LD A,($A24E) | Load turbo boost time remaining (60..0) | |
B130 | AND A | Test | ||
B131 | EX AF,AF' | Bank with flags | ||
B132 | AND A | Test previously banked copy of gear flag | ||
B133 | JR NZ,mhc_high_gear | Jump if in high gear | ||
mhc_low_gear | B135 | LD BC,$01D6 | BC = 470 -- max speed? | |
B138 | EX AF,AF' | Unbank turbo boost with flags | ||
B139 | JR NZ,mhc_low_gear_slowing | Jump if turbo boost in effect -- Uses banked flags | ||
No turbo boost.
|
||||
B13B | LD BC,$00E6 | BC = 230 -- max speed? | ||
mhc_low_gear_slowing | B13E | SBC HL,BC | HL -= BC | |
B140 | JP NC,mhc_low_gear_accelerating | Jump if HL was >= BC -- speed > limit value | ||
B143 | LD A,L | BC = ~HL + 1 = -HL | ||
B144 | CPL | |||
B145 | LD C,A | |||
B146 | LD A,H | |||
B147 | CPL | |||
B148 | LD B,A | |||
B149 | INC BC | |||
B14A | LD A,C | A = C | ||
B14B | SRL B | Shift a bit out of B into A? | ||
B14D | RRA | |||
B14E | SRL B | and again -- B must now be zero | ||
B150 | RRA | |||
B151 | RRA | Then divide by 4? | ||
B152 | RRA | |||
B153 | AND $3F | C = (A & $3F) | 1 | ||
B155 | OR $01 | |||
B157 | LD C,A | |||
B158 | JR mhc_check_brake | Jump to mhc_check_brake | ||
mhc_low_gear_accelerating | B15A | LD A,L | A = L | |
B15B | SRL H | A = HL >> 4 | ||
B15D | RRA | |||
B15E | SRL H | |||
B160 | RRA | |||
B161 | RRA | |||
B162 | RRA | |||
B163 | AND $1F | A = -((A & $1F) | 1) | ||
B165 | OR $01 | |||
B167 | NEG | |||
B169 | LD C,A | BC = $FF00 | A -- speed delta (slowing) | ||
B16A | LD B,$FF | |||
B16C | JR mhc_check_brake | Jump to mhc_check_brake | ||
mhc_high_gear | B16E | LD BC,$00DC | BC = 220 -- max speed? | |
B171 | SBC HL,BC | 16-bit subtract only for result in flags | ||
B173 | LD H,D | Restore current speed saved earlier | ||
B174 | LD L,E | |||
B175 | JR NC,mhc_high_gear_accelerating | Jump if current speed (HL) < max speed (DE) | ||
mhc_high_gear_slowing | B177 | LD BC,$01D6 | BC = 470 -- max speed? | |
B17A | EX AF,AF' | Unbank turbo boost with flags | ||
B17B | JR NZ,mhc_low_gear_slowing | Jump if turbo boost in effect -- Uses banked flags | ||
mhc_something2 | B17D | LD A,E | A = DE >> 4 | |
B17E | LD B,D | |||
B17F | SRL B | |||
B181 | RRA | |||
B182 | SRL B | |||
B184 | RRA | |||
B185 | RRA | |||
B186 | RRA | |||
B187 | OR $01 | C = (A | 1) & $1F | ||
B189 | AND $1F | |||
B18B | LD C,A | |||
B18C | JR mhc_check_brake | Jump to mhc_check_brake | ||
mhc_high_gear_accelerating | B18E | LD BC,$02B7 | BC = 695 -- max speed? | |
B191 | EX AF,AF' | Unbank turbo boost with flags | ||
B192 | JR NZ,mhc_low_gear_slowing | Jump if turbo boost in effect -- Uses banked flags | ||
B194 | LD BC,$0168 | BC = 360 -- max speed? | ||
B197 | JP mhc_low_gear_slowing | Use mhc_low_gear_slowing | ||
mhc_check_brake | B19A | POP AF | Get modified user input (stored by B0BE) | |
B19B | PUSH AF | |||
B19C | RRA | Is BRAKE pressed? (bit 2 / down) | ||
B19D | RRA | |||
B19E | RRA | |||
B19F | JR NC,mhc_not_braking | Jump to mhc_not_braking if not pressed | ||
Braking
|
||||
B1A1 | LD BC,$FFEC | Speed delta is -20 to slow down | ||
B1A4 | JR mhc_calc_speed | Jump to mhc_calc_speed | ||
mhc_not_braking | B1A6 | RRA | Is ACCELERATE pressed? (bit 3 / up) | |
B1A7 | JR C,mhc_calc_speed | Jump if so {what's in BC? must be the speed delta from earlier} | ||
Not accelerating
|
||||
B1A9 | LD BC,$FFF6 | Speed delta is -10 to gradually slow | ||
mhc_calc_speed | B1AC | LD H,D | Copy speed from DE | |
B1AD | LD L,E | |||
B1AE | AND A | Clear carry | ||
B1AF | ADC HL,BC | Change speed | ||
B1B1 | JP P,mhc_speed_set | Jump if still positive or zero | ||
Cope with speed going negative
|
||||
B1B4 | LD HL,$0000 | HL = $0000 | ||
HL = new speed
|
||||
mhc_speed_set | B1B7 | LD A,($A24C) | A = inclined - 1 (hasn't used DEC A here... possibly left for tweaking) | |
B1BA | SUB $01 | |||
B1BC | JR NC,mhc_set_inclined | Jump if A is now >= 0 | ||
"inclined" counter went -ve
|
||||
B1BE | LD A,($B5B0) | A = $B5B0 -- read self modified value in draw_car that sets the car's pitch (0/3/6) | ||
B1C1 | AND A | Jump if zero (pitch is level) | ||
B1C2 | JR Z,mhc_set_inclined | |||
B1C4 | LD C,A | C = A -- temp save A | ||
B1C5 | LD A,H | Jump if HL (new speed) is zero | ||
B1C6 | OR L | |||
B1C7 | JR Z,mhc_set_inclined | |||
new speed is non-zero
|
||||
B1C9 | LD A,C | BC = (C - 5) | 1 -- 0/3/6 in C => -5/-1/1 in BC | ||
B1CA | SUB $05 | |||
B1CC | OR $01 | |||
B1CE | LD C,A | |||
B1CF | LD B,$00 | |||
B1D1 | JP P,mhc_positive | Jump if result is positive | ||
B1D4 | DEC B | BC = $FF00 | A -- otherwise widen as negative | ||
mhc_positive | B1D5 | LD D,H | Copy speed from HL to DE | |
B1D6 | LD E,L | |||
B1D7 | ADD HL,BC | Increment speed ... by a value computed from car's pitch ... eh? | ||
B1D8 | LD BC,$02B7 | Speed threshold 695 | ||
B1DB | PUSH HL | Save it | ||
B1DC | SBC HL,BC | Reduce speed by threshold | ||
B1DE | POP HL | Restore it | ||
B1DF | JR C,mhc_b1e2 | Jump if speed < 695 -- surely always the case?! | ||
B1E1 | EX DE,HL | |||
mhc_b1e2 | B1E2 | LD A,$03 | A = 3 -- reset A24C to 3 | |
mhc_set_inclined | B1E4 | LD ($A24C),A | inclined = A | |
B1E7 | LD A,H | A = H | ||
B1E8 | CP $02 | CP 2 | ||
B1EA | JR C,mhc_b1ef | |||
B1EC | LD HL,$01FF | Cap speed to $1FF | ||
mhc_b1ef | B1EF | LD ($A24A),HL | Set speed to HL | |
B1F2 | POP HL | Restore HL [likely to be the user input?] | ||
B1F3 | LD A,($A263) | B = right_turn | ||
B1F6 | LD B,A | |||
B1F7 | LD A,($A264) | C = left_turn | ||
B1FA | LD C,A | |||
B1FB | LD A,($B064) | A = *$B064 -- Jump counter [self modified] | ||
B1FE | AND A | Jump to mhc_b253 if non-zero | ||
B1FF | JP NZ,mhc_b253 | |||
Is this checking input flags in H?
|
||||
B202 | RR H | Shift LSB out of H | ||
B204 | JR C,mhc_b21a | Jump to mhc_b21a if set | ||
B206 | RR H | Shift new LSB out of H | ||
B208 | JR C,mhc_b22c | Jump to mhc_b22c if set | ||
Reduce left turning force A = ((C >= 9) ? C - 9 : 0) = MAX(C - 9, 0) This instr is hit continuously
|
||||
B20A | LD A,C | A = C - 9 -- left turning force from earlier | ||
B20B | SUB $09 | |||
B20D | JR NC,mhc_store_left_turning_force | Jump if C >= 9 | ||
B20F | XOR A | A = 0 -- clamp | ||
mhc_store_left_turning_force | B210 | LD C,A | C = A | |
Reduce right turning force A = ((B >= 9) ? B - 9 : 0) = MAX(B - 9, 0)
|
||||
B211 | LD A,B | A = B - 9 -- right turning force from earlier | ||
B212 | SUB $09 | |||
B214 | JR NC,mhc_store_right_turning_force | Jump to mhc_b217 if B >= 9 | ||
B216 | XOR A | A = 0 -- clamp | ||
mhc_store_right_turning_force | B217 | LD B,A | B = A | |
B218 | JR mhc_handle_speed | Jump to mhc_handle_speed | ||
B = ((B + 4 >= 36) ? 36 : B + 4) = MIN(36, B + 4) -- 36 is the max turning force
|
||||
mhc_b21a | B21A | LD A,B | A = B + 4 | |
B21B | ADD A,$04 | |||
B21D | LD B,$24 | Jump if A >= 36 | ||
B21F | CP B | |||
B220 | JR NC,mhc_b223 | |||
B222 | LD B,A | B = A | ||
C = ((C >= B) ? C - B : 0) = MAX(C - B, 0)
|
||||
mhc_b223 | B223 | LD A,C | C -= B | |
B224 | SUB B | |||
B225 | LD C,A | |||
B226 | JR NC,mhc_handle_speed | Jump to mhc_handle_speed if C >= B | ||
B228 | LD C,$00 | C = 0 | ||
B22A | JR mhc_handle_speed | Jump to mhc_handle_speed | ||
C = ((C + 4 >= 36) ? 36 : C + 4) = MIN(36, C + 4)
|
||||
mhc_b22c | B22C | LD A,C | A = C + 4 | |
B22D | ADD A,$04 | |||
B22F | LD C,$24 | C = 36 | ||
B231 | CP C | Jump to mhc_b235 if A >= 36 | ||
B232 | JR NC,mhc_b235 | |||
B234 | LD C,A | C = A | ||
B = ((B >= C) ? B - C : 0) = MAX(B - C, 0)
|
||||
mhc_b235 | B235 | LD A,B | B -= C | |
B236 | SUB C | |||
B237 | LD B,A | |||
B238 | JR NC,mhc_handle_speed | Jump to mhc_handle_speed if B >= C | ||
B23A | LD B,$00 | B = 0 | ||
mhc_handle_speed | B23C | LD HL,($A24A) | Load speed into HL | |
B23F | LD A,L | Speed low byte | ||
B240 | RR H | Bottom bit of H moves to carry (H now unused) | ||
B242 | RRA | Halve speed, shifting carry in as MSB | ||
Divide by 2.666 but not quite right?
|
||||
B243 | SRL A | A >>= 2 | ||
B245 | SRL A | |||
B247 | LD L,A | L = A | ||
B248 | SRL L | L >>= 1 | ||
B24A | ADD A,L | A += L | ||
B24B | CP B | Jump if A >= B | ||
B24C | JR NC,mhc_b24f | |||
B24E | LD B,A | B = A | ||
mhc_b24f | B24F | CP C | Jump if A >= C | |
B250 | JR NC,mhc_b253 | |||
B252 | LD C,A | C = A | ||
mhc_b253 | B253 | PUSH BC | Store turning forces for later mhc_reset_turning_forces | |
B254 | LD BC,$0000 | BC = $0000 | ||
B257 | LD E,B | E = B, i.e. zero | ||
B258 | LD A,($A25C) | Load current_curvature | ||
B25B | OR A | Set flags | ||
B25C | JP Z,mhc_straight_road | Jump to mhc_straight_road if zero | ||
B25F | JP P,mhc_scroll_horizon | Jump to mhc_scroll_horizon if positive | ||
Negative scroll => scroll horizon right.
|
||||
mhc_scroll_right | B262 | INC E | E++ -- i.e. 1 | |
B263 | NEG | A = -A | ||
Positive scroll => scroll horizon left.
|
||||
mhc_scroll_horizon | B265 | LD HL,$B827 | 16 word horizon table at horizon_table | |
B268 | LD C,A | BC = A -- B is zero at this point | ||
B269 | ADD HL,BC | HL += BC | ||
B26A | LD A,($A261) | A = var_a261 | ||
B26D | LD C,A | C = A | ||
B26E | EX AF,AF' | |||
B26F | LD A,($A23F) | A = fast_counter - C | ||
B272 | SUB C | |||
B273 | AND A | Set flags | ||
B274 | JR Z,mhc_straight_road | Jump if zero | ||
B276 | LD C,(HL) | C = *HL | ||
mhc_b277 | B277 | SUB C | A -= C | |
B278 | JR C,mhc_b280 | Jump if carry | ||
B27A | INC B | B++ | ||
B27B | EX AF,AF' | |||
B27C | ADD A,C | A += C | ||
B27D | EX AF,AF' | |||
B27E | JR mhc_b277 | Jump to mhc_b277 (above) -- loop? | ||
mhc_b280 | B280 | LD A,B | A = B | |
B281 | AND A | Jump to mhc_b295 if A is zero | ||
B282 | JR Z,mhc_b295 | |||
B284 | LD HL,$A262 | HL = var_a262 | ||
B287 | ADD A,(HL) | A += *HL | ||
B288 | LD (HL),A | *HL = A | ||
B289 | LD A,B | A = B * 3 | ||
B28A | ADD A,A | |||
B28B | ADD A,B | |||
B28C | LD B,$00 | B = 0 | ||
B28E | RR E | Bottom bit of E moves to carry | ||
B290 | JR NC,mhc_b295 | Jump if clear | ||
B292 | DEC B | B-- | ||
B293 | NEG | A = -A | ||
mhc_b295 | B295 | LD C,A | C = A | |
B296 | EX AF,AF' | |||
B297 | LD ($A261),A | var_a261 = A | ||
No curvature - No scroll required?
|
||||
mhc_straight_road | B29A | LD HL,($A25F) | HL = horizontal_adjust + BC | |
B29D | ADD HL,BC | |||
B29E | LD DE,$0000 | horizontal_adjust = 0 | ||
B2A1 | LD ($A25F),DE | |||
B2A5 | LD A,($B326) | A = *$B326 -- Read self modified op in animate_hero_car -- crashed flag | ||
B2A8 | AND A | Set flags | ||
B2A9 | JR Z,mhc_reset_turning_forces | Jump to mhc_b2ad if zero | ||
B2AB | EX DE,HL | DE <> HL | ||
B2AC | LD D,H | D = H [must be a delta] | ||
mhc_reset_turning_forces | B2AD | POP BC | Restore turning forces | |
B2AE | LD A,B | right_turn = B | ||
B2AF | LD ($A263),A | |||
B2B2 | LD A,C | left_turn = C | ||
B2B3 | LD ($A264),A | |||
B2B6 | SUB B | A -= B | ||
B2B7 | JP P,mhc_b2bb | Jump to mhc_b2bb if positive | ||
B2BA | DEC D | Otherwise decrement D | ||
mhc_b2bb | B2BB | LD E,A | E = A >> 1 | |
B2BC | SRA E | |||
B2BE | ADD HL,DE | HL += DE | ||
B2BF | OR A | Set flags | ||
B2C0 | JR Z,mhc_set_cornering | Jump to mhc_set_cornering if zero | ||
B2C2 | JP P,mhc_check_cornering | Jump if positive | ||
B2C5 | NEG | A = -A | ||
mhc_check_cornering | B2C7 | CP $11 | Compare A to 17 | |
B2C9 | LD A,$00 | A = 0 -- cornering = 0 | ||
B2CB | JR C,mhc_set_cornering | Jump to mhc_set_cornering if A < 17 | ||
B2CD | BIT 7,H | Jump if H bit 7 clear | ||
B2CF | JR Z,mhc_b2db | |||
B2D1 | BIT 7,D | Jump to mhc_set_cornering if D bit 7 set | ||
B2D3 | JR NZ,mhc_set_cornering | |||
B2D5 | BIT 7,H | Jump to mhc_set_cornering if H bit 7 clear -- bug? already tested above | ||
B2D7 | JR Z,mhc_set_cornering | |||
B2D9 | JR mhc_is_cornering | Jump to mhc_is_cornering | ||
mhc_b2db | B2DB | BIT 7,D | Jump to mhc_set_cornering if D bit 7 clear | |
B2DD | JR Z,mhc_set_cornering | |||
B2DF | BIT 7,H | Jump to mhc_set_cornering if H bit 7 set | ||
B2E1 | JR NZ,mhc_set_cornering | |||
mhc_is_cornering | B2E3 | LD A,$01 | A = 1 | |
mhc_set_cornering | B2E5 | LD ($A24D),A | cornering = A | |
B2E8 | LD BC,($A26C) | road_pos += HL [must be a delta] | ||
B2EC | ADD HL,BC | |||
B2ED | LD ($A26C),HL | |||
B2F0 | LD D,$01 | D = 1 -- flip flag | ||
B2F2 | LD A,E | A = E -- E is? | ||
B2F3 | OR A | Set flags [why are some ORs and some ANDs?] | ||
B2F4 | JP P,mhc_decide_turn_speed | Jump if positive | ||
B2F7 | DEC D | D-- -- flip flag -> 0 | ||
B2F8 | NEG | A = -A | ||
mhc_decide_turn_speed | B2FA | CP $0C | Compare A to 12 | |
B2FC | LD B,$02 | 2 => Turn hard | ||
B2FE | JR NC,mhc_exit | Jump to mhc_exit if A >= 12 | ||
B300 | DEC B | 1 => Turn | ||
B301 | CP $06 | Compare A to 6 | ||
B303 | JR NC,mhc_exit | Jump to mhc_exit if A >= 6 | ||
B305 | DEC B | 0 => Straight | ||
mhc_exit | B306 | LD A,B | turn_speed = B -- should be 0/1/2 | |
B307 | LD ($A250),A | |||
B30A | LD A,D | flip_car = D -- should be 0/1 | ||
B30B | LD ($A251),A | |||
B30E | LD A,($B064) | A = *$B064 -- Jump counter [self modified] | ||
B311 | AND A | Return if zero | ||
B312 | RET Z | |||
B313 | XOR A | cornering = 0 -- reset cornering if not jumping | ||
B314 | LD ($A24D),A | |||
B317 | RET | Return |
Prev: B059 | Up: Map | Next: B318 |