| Chase H.Q. | Routines |
| Prev: B045 | 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_not_jumping | |||
|
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 | Thump sfx as the car lands | ||
| B076 | CALL start_sfx | Call start_sfx | ||
|
Hero car is in mid-air.
|
||||
| mhc_midair | B079 | LD HL,$0000 | Point HL at entry in jump table. Self modified by B96C and B092 | |
| B07C | XOR A | off_road = 0 | ||
| B07D | LD ($A23E),A | |||
| B080 | LD A,($A0D5) | Clear up/down/left/right bits of user input (can't turn in mid-air etc.) | ||
| B083 | AND $F0 | |||
| B085 | LD ($A0D5),A | |||
| B088 | LD A,(HL) | $B5B0 = *HL++ -- Self modified value in draw_car | ||
| B089 | LD ($B5B0),A | |||
| B08C | INC HL | |||
| B08D | LD A,($B5AB) | A = *$B5AB + *HL++ -- Self modified value in draw_car - vertical shift? | ||
| B090 | ADD A,(HL) | |||
| B091 | INC HL | |||
| B092 | LD ($B07A),HL | Update HL load above, mhc_midair | ||
| mhc_not_jumping | B095 | LD ($B5AB),A | *$B5AB = A | |
| B098 | LD HL,$A24E | Address of boost timer | ||
| B09B | LD A,(HL) | Jump 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 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,move_hero_car_0 | |||
| B0AE | DEC (HL) | Decrement smoke | ||
|
Handle gear changes.
|
||||
| move_hero_car_0 | B0AF | LD A,($A0D5) | Read user input | |
| B0B2 | LD C,A | C = A | ||
| B0B3 | LD A,($B326) | Read from the 'LD A,x' @ main_loop_24_0 (crash flag) | ||
| B0B6 | AND A | Jump if zero | ||
| B0B7 | JR Z,move_hero_car_1 | |||
| B0B9 | LD A,C | C = C & $10, i.e. Fire/Gear | ||
| B0BA | AND $10 | |||
| B0BC | LD C,A | |||
| move_hero_car_1 | B0BD | LD A,C | A = C | |
| B0BE | PUSH AF | |||
| B0BF | BIT 4,A | Test it again? [Strange to re-test it?] | ||
| B0C1 | LD HL,$A253 | Address of gear flag | ||
| B0C4 | LD A,($A252) | A = var_a252 | ||
| B0C7 | JR Z,move_hero_car_2 | Jump if fire/gear is unset | ||
| B0C9 | AND A | Jump if var_a252 is set | ||
| B0CA | JR NZ,move_hero_car_2 | |||
| B0CC | LD A,(HL) | Toggle gear flag | ||
| B0CD | XOR $01 | |||
| B0CF | LD (HL),A | |||
| B0D0 | LD A,$04 | A = 4 | ||
| B0D2 | JR Z,move_hero_car_2 | Jump if low gear? | ||
| B0D4 | LD ($A24F),A | smoke = A | ||
| move_hero_car_2 | B0D7 | SUB $01 | Decement A [why write it as a SUB 1?] | |
| B0D9 | JR C,move_hero_car_3 | jump if +ve? | ||
| B0DB | LD ($A252),A | var_a252 = A | ||
| move_hero_car_3 | 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 it | ||
| B0E4 | LD DE,$0078 | HL -= 120 | ||
| B0E7 | SBC HL,DE | |||
| B0E9 | JR NC,move_hero_car_4 | Jump if speed >= 120 | ||
| B0EB | LD A,($A230) | Jump if perp_caught_stage > 0 | ||
| B0EE | AND A | |||
| B0EF | JR NZ,move_hero_car_4 | |||
|
Handle idle timer.
|
||||
| B0F1 | LD HL,$A16E | Address of idle timer | ||
| B0F4 | DEC (HL) | Decrement idle timer | ||
| B0F5 | JR NZ,move_hero_car_4 | Jump if non-zero | ||
| B0F7 | LD (HL),$64 | Reset idle timer to 100 | ||
| B0F9 | LD A,$0A | Set priority to 10 | ||
| B0FB | LD HL,$98F8 | HL = get_moving_chatter | ||
| B0FE | CALL chatter | Call chatter (priority 10) | ||
| move_hero_car_4 | B101 | POP HL | Pop speed | |
| B102 | LD D,H | DE = HL | ||
| B103 | LD E,L | |||
| B104 | LD A,($A23E) | Load the off-road flag | ||
| B107 | AND A | Jump if zero | ||
| B108 | JR Z,move_hero_car_6 | |||
|
Handle off-road (it can be 1 or 2).
|
||||
| B10A | LD BC,$0078 | BC = 120 -- factor for off-road == 1 | ||
| B10D | DEC A | Jump if off-road was one | ||
| B10E | JR Z,move_hero_car_5 | |||
| B110 | LD BC,$006E | BC = 110 -- factor for off-road == 2 | ||
| move_hero_car_5 | B113 | AND A | Clear carry? | |
| B114 | SBC HL,BC | HL -= BC -- 16-bit sub just for testing | ||
| B116 | LD H,D | HL = DE | ||
| B117 | LD L,E | |||
| B118 | JR C,move_hero_car_6 | Jump if HL < BC (result of subtraction) | ||
| B11A | LD A,L | A = L | ||
| B11B | RR H | H >>= 1 -- 9 bit rotate right through carry | ||
| B11D | RLA | A <<= 4 -- 9 bit rotate left through carry | ||
| B11E | RLA | |||
| B11F | RLA | |||
| B120 | RLA | |||
| B121 | AND $0F | A = -((A & $0F) | 1) | ||
| B123 | OR $01 | |||
| B125 | NEG | |||
| B127 | LD C,A | BC = $FF00 | A | ||
| B128 | LD B,$FF | |||
| B12A | JP move_hero_car_11 | |||
| move_hero_car_6 | B12D | LD A,($A24E) | A = boost (time remaining) | |
| B130 | AND A | Test then bank the flags | ||
| B131 | EX AF,AF' | Bank | ||
| B132 | AND A | Check previously banked A | ||
| B133 | JR NZ,move_hero_car_9 | |||
| B135 | LD BC,$01D6 | BC = 470 | ||
| B138 | EX AF,AF' | Unbank boost + flags | ||
| B139 | JR NZ,move_hero_car_7 | Uses banked flags | ||
| B13B | LD BC,$00E6 | BC = 230 | ||
| move_hero_car_7 | B13E | SBC HL,BC | HL -= BC | |
| B140 | JP NC,move_hero_car_8 | |||
| B143 | LD A,L | C = ~L | ||
| B144 | CPL | |||
| B145 | LD C,A | |||
| B146 | LD A,H | B = ~H | ||
| B147 | CPL | |||
| B148 | LD B,A | |||
| B149 | INC BC | BC++ | ||
| B14A | LD A,C | A = C | ||
| B14B | SRL B | B >>= 1 | ||
| B14D | RRA | |||
| B14E | SRL B | B >>= 1 | ||
| B150 | RRA | |||
| B151 | RRA | |||
| B152 | RRA | |||
| B153 | AND $3F | C = (A & $3F) | 1 | ||
| B155 | OR $01 | |||
| B157 | LD C,A | |||
| B158 | JR move_hero_car_11 | |||
| move_hero_car_8 | B15A | LD A,L | A = L | |
| B15B | SRL H | H >>= 1 | ||
| B15D | RRA | |||
| B15E | SRL H | H >>= 1 | ||
| 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 | ||
| B16A | LD B,$FF | |||
| B16C | JR move_hero_car_11 | |||
| move_hero_car_9 | B16E | LD BC,$00DC | BC = 220 | |
| B171 | SBC HL,BC | HL -= BC -- for flags | ||
| B173 | LD H,D | HL = DE | ||
| B174 | LD L,E | |||
| B175 | JR NC,move_hero_car_10 | from result of calc | ||
| B177 | LD BC,$01D6 | BC = 470 | ||
| B17A | EX AF,AF' | |||
| B17B | JR NZ,move_hero_car_7 | |||
| B17D | LD A,E | A = E | ||
| B17E | LD B,D | B = D | ||
| B17F | SRL B | B >>= 1 | ||
| B181 | RRA | |||
| B182 | SRL B | B >>= 1 | ||
| B184 | RRA | |||
| B185 | RRA | |||
| B186 | RRA | |||
| B187 | OR $01 | C = (A | 1) & $1F | ||
| B189 | AND $1F | |||
| B18B | LD C,A | |||
| B18C | JR move_hero_car_11 | |||
| move_hero_car_10 | B18E | LD BC,$02B7 | BC = 695 | |
| B191 | EX AF,AF' | |||
| B192 | JR NZ,move_hero_car_7 | |||
| B194 | LD BC,$0168 | BC = 360 | ||
| B197 | JP move_hero_car_7 | |||
| move_hero_car_11 | B19A | POP AF | Get stacked AF | |
| B19B | PUSH AF | |||
| B19C | RRA | Test bit 2? | ||
| B19D | RRA | |||
| B19E | RRA | |||
| B19F | JR NC,move_hero_car_12 | |||
| B1A1 | LD BC,$FFEC | BC = $FFEC | ||
| B1A4 | JR move_hero_car_13 | |||
| move_hero_car_12 | B1A6 | RRA | ||
| B1A7 | JR C,move_hero_car_13 | |||
| B1A9 | LD BC,$FFF6 | |||
| move_hero_car_13 | B1AC | LD H,D | HL = DE | |
| B1AD | LD L,E | |||
| B1AE | AND A | Clear carry? | ||
| B1AF | ADC HL,BC | HL += BC | ||
| B1B1 | JP P,move_hero_car_14 | |||
| B1B4 | LD HL,$0000 | HL = $0000 | ||
| move_hero_car_14 | B1B7 | LD A,($A24C) | A = var_a24c - 1 | |
| B1BA | SUB $01 | |||
| B1BC | JR NC,move_hero_car_17 | |||
| B1BE | LD A,($B5B0) | A = $B5B0 | ||
| B1C1 | AND A | Set flags | ||
| B1C2 | JR Z,move_hero_car_17 | |||
| B1C4 | LD C,A | C = A | ||
| B1C5 | LD A,H | A = H | ||
| B1C6 | OR L | A |= L | ||
| B1C7 | JR Z,move_hero_car_17 | |||
| B1C9 | LD A,C | A = (C - 5) | 1 | ||
| B1CA | SUB $05 | |||
| B1CC | OR $01 | |||
| B1CE | LD C,A | C = A | ||
| B1CF | LD B,$00 | B = 0 | ||
| B1D1 | JP P,move_hero_car_15 | |||
| B1D4 | DEC B | B-- | ||
| move_hero_car_15 | B1D5 | LD D,H | DE = HL | |
| B1D6 | LD E,L | |||
| B1D7 | ADD HL,BC | HL += BC | ||
| B1D8 | LD BC,$02B7 | BC = 695 | ||
| B1DB | PUSH HL | |||
| B1DC | SBC HL,BC | HL -= BC | ||
| B1DE | POP HL | |||
| B1DF | JR C,move_hero_car_16 | |||
| B1E1 | EX DE,HL | |||
| move_hero_car_16 | B1E2 | LD A,$03 | A = 3 | |
| move_hero_car_17 | B1E4 | LD ($A24C),A | var_a24c = A | |
| B1E7 | LD A,H | A = H | ||
| B1E8 | CP $02 | CP 2 | ||
| B1EA | JR C,move_hero_car_18 | |||
| B1EC | LD HL,$01FF | Cap speed to $1FF | ||
| move_hero_car_18 | B1EF | LD ($A24A),HL | Set speed to HL | |
| B1F2 | POP HL | |||
| B1F3 | LD A,($A263) | A = var_a263 | ||
| B1F6 | LD B,A | B = A | ||
| B1F7 | LD A,($A264) | A = var_a264 | ||
| B1FA | LD C,A | C = A | ||
| B1FB | LD A,($B064) | A = *$B064 -- Jump counter [self modified] | ||
| B1FE | AND A | Set flags | ||
| B1FF | JP NZ,move_hero_car_27 | |||
| B202 | RR H | |||
| B204 | JR C,move_hero_car_21 | |||
| B206 | RR H | |||
| B208 | JR C,move_hero_car_23 | |||
| B20A | LD A,C | A = C - 9 | ||
| B20B | SUB $09 | |||
| B20D | JR NC,move_hero_car_19 | |||
| B20F | XOR A | A = 0 | ||
| move_hero_car_19 | B210 | LD C,A | C = A | |
| B211 | LD A,B | A = B - 9 | ||
| B212 | SUB $09 | |||
| B214 | JR NC,move_hero_car_20 | |||
| B216 | XOR A | A = 0 | ||
| move_hero_car_20 | B217 | LD B,A | B = A | |
| B218 | JR move_hero_car_25 | |||
| move_hero_car_21 | 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,move_hero_car_22 | |||
| B222 | LD B,A | B = A | ||
| move_hero_car_22 | B223 | LD A,C | C -= B | |
| B224 | SUB B | |||
| B225 | LD C,A | |||
| B226 | JR NC,move_hero_car_25 | |||
| B228 | LD C,$00 | C = 0 | ||
| B22A | JR move_hero_car_25 | |||
| move_hero_car_23 | B22C | LD A,C | A = C + 4 | |
| B22D | ADD A,$04 | |||
| B22F | LD C,$24 | C = $24 | ||
| B231 | CP C | |||
| B232 | JR NC,move_hero_car_24 | |||
| B234 | LD C,A | C = A | ||
| move_hero_car_24 | B235 | LD A,B | B -= C | |
| B236 | SUB C | |||
| B237 | LD B,A | |||
| B238 | JR NC,move_hero_car_25 | |||
| B23A | LD B,$00 | B = 0 | ||
| move_hero_car_25 | B23C | LD HL,($A24A) | HL = speed | |
| B23F | LD A,L | A = L | ||
| B240 | RR H | |||
| B242 | RRA | |||
| B243 | SRL A | A >>= 1 | ||
| B245 | SRL A | A >>= 1 | ||
| B247 | LD L,A | L = A | ||
| B248 | SRL L | L >>= 1 | ||
| B24A | ADD A,L | A += L | ||
| B24B | CP B | |||
| B24C | JR NC,move_hero_car_26 | |||
| B24E | LD B,A | B = A | ||
| move_hero_car_26 | B24F | CP C | ||
| B250 | JR NC,move_hero_car_27 | |||
| B252 | LD C,A | C = A | ||
| move_hero_car_27 | B253 | PUSH BC | ||
| B254 | LD BC,$0000 | BC = $0000 | ||
| B257 | LD E,B | E = B | ||
| B258 | LD A,($A25C) | A = horizon_scroll (e.g. $FA..$06 in multiples of two) | ||
| B25B | OR A | Set flags | ||
| B25C | JP Z,move_hero_car_32 | Jump if zero | ||
| B25F | JP P,move_hero_car_28 | Jump if positive | ||
|
Negative scroll => scroll horizon right.
|
||||
| B262 | INC E | E++ | ||
| B263 | NEG | A = -A | ||
|
Positive scroll => scroll horizon left.
|
||||
| move_hero_car_28 | B265 | LD HL,$B827 | HL -> 32-byte table at table_b828 | |
| B268 | LD C,A | C = 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,move_hero_car_32 | Jump if zero | ||
| B276 | LD C,(HL) | C = *HL | ||
| move_hero_car_29 | B277 | SUB C | A -= C | |
| B278 | JR C,move_hero_car_30 | Jump if carry | ||
| B27A | INC B | B++ | ||
| B27B | EX AF,AF' | |||
| B27C | ADD A,C | A += C | ||
| B27D | EX AF,AF' | |||
| B27E | JR move_hero_car_29 | Jump | ||
| move_hero_car_30 | B280 | LD A,B | A = B | |
| B281 | AND A | Set flags | ||
| B282 | JR Z,move_hero_car_31 | |||
| 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 | |||
| B290 | JR NC,move_hero_car_31 | |||
| B292 | DEC B | B-- | ||
| B293 | NEG | A = -A | ||
| move_hero_car_31 | B295 | LD C,A | C = A | |
| B296 | EX AF,AF' | |||
| B297 | LD ($A261),A | var_a261 = A | ||
|
No scroll required?
|
||||
| move_hero_car_32 | B29A | LD HL,($A25F) | HL = var_a25f + BC | |
| B29D | ADD HL,BC | |||
| B29E | LD DE,$0000 | DE = $0000 | ||
| B2A1 | LD ($A25F),DE | var_a25f = DE | ||
| B2A5 | LD A,($B326) | A = *$B326 -- Read self modified op in main_loop_24 -- crashed flag | ||
| B2A8 | AND A | Set flags | ||
| B2A9 | JR Z,move_hero_car_33 | |||
| B2AB | EX DE,HL | |||
| B2AC | LD D,H | D = H | ||
| move_hero_car_33 | B2AD | POP BC | ||
| B2AE | LD A,B | var_a263 = B | ||
| B2AF | LD ($A263),A | |||
| B2B2 | LD A,C | var_a264 = C | ||
| B2B3 | LD ($A264),A | |||
| B2B6 | SUB B | A -= B | ||
| B2B7 | JP P,move_hero_car_34 | |||
| B2BA | DEC D | D-- | ||
| move_hero_car_34 | B2BB | LD E,A | E = A | |
| B2BC | SRA E | |||
| B2BE | ADD HL,DE | HL += DE | ||
| B2BF | OR A | Set flags | ||
| B2C0 | JR Z,move_hero_car_38 | Jump if zero | ||
| B2C2 | JP P,move_hero_car_35 | Jump if positive | ||
| B2C5 | NEG | A = -A | ||
| move_hero_car_35 | B2C7 | CP $11 | Compare | |
| B2C9 | LD A,$00 | A = 0 -- not self modified | ||
| B2CB | JR C,move_hero_car_38 | Jump if A < 17 | ||
| B2CD | BIT 7,H | Jump if H bit 7 clear | ||
| B2CF | JR Z,move_hero_car_36 | |||
| B2D1 | BIT 7,D | Jump if D bit 7 set | ||
| B2D3 | JR NZ,move_hero_car_38 | |||
| B2D5 | BIT 7,H | Jump if H bit 7 clear -- bug? already tested above | ||
| B2D7 | JR Z,move_hero_car_38 | |||
| B2D9 | JR move_hero_car_37 | Jump | ||
| move_hero_car_36 | B2DB | BIT 7,D | Jump if D bit 7 clear | |
| B2DD | JR Z,move_hero_car_38 | |||
| B2DF | BIT 7,H | Jump if H bit 7 set | ||
| B2E1 | JR NZ,move_hero_car_38 | |||
| move_hero_car_37 | B2E3 | LD A,$01 | A = 1 | |
| move_hero_car_38 | B2E5 | LD ($A24D),A | cornering = A | |
| B2E8 | LD BC,($A26C) | BC = road_pos | ||
| B2EC | ADD HL,BC | HL += BC | ||
| B2ED | LD ($A26C),HL | road_pos = HL | ||
| B2F0 | LD D,$01 | D = 1 | ||
| B2F2 | LD A,E | A = E | ||
| B2F3 | OR A | Set flags [why are some ORs and some ANDs?] | ||
| B2F4 | JP P,move_hero_car_39 | Jump if positive | ||
| B2F7 | DEC D | D-- | ||
| B2F8 | NEG | A = -A | ||
| move_hero_car_39 | B2FA | CP $0C | CP 12 | |
| B2FC | LD B,$02 | B = 2 | ||
| B2FE | JR NC,move_hero_car_40 | |||
| B300 | DEC B | B-- | ||
| B301 | CP $06 | CP 6 | ||
| B303 | JR NC,move_hero_car_40 | |||
| B305 | DEC B | B-- | ||
| move_hero_car_40 | B306 | LD A,B | A = B | |
| B307 | LD ($A250),A | turn_speed = A | ||
| B30A | LD A,D | A = D | ||
| B30B | LD ($A251),A | flip = A | ||
| B30E | LD A,($B064) | A = *$B064 -- Jump counter [self modified] | ||
| B311 | AND A | Set flags | ||
| B312 | RET Z | Return if zero | ||
| B313 | XOR A | cornering = 0 | ||
| B314 | LD ($A24D),A | |||
| B317 | RET | Return | ||
| Prev: B045 | Up: Map | Next: B318 |