| Chase H.Q. | Routines |
| Prev: F0FE | Up: Map | Next: F491 |
|
This is relocated to $8014/load_stage onwards during init (926 bytes long).
|
||||
| page_in_stage_128k | F220 | LD A,($8007) | Load wanted_stage_number | |
| F223 | LD HL,$A13A | Address of current_stage_number | ||
| F226 | CP (HL) | Return if the stage is already loaded | ||
| F227 | RET Z | |||
| F228 | LD (HL),A | wanted_stage_number = current_stage_number | ||
|
Copy the stage data from the correct bank and address to $5C00..$76EF.
|
||||
| F229 | ADD A,A | Point HL at stage_data_locations[current_stage_number] | ||
| F22A | LD B,$00 | |||
| F22C | LD C,A | |||
| F22D | LD HL,$8037 | |||
| F230 | ADD HL,BC | |||
| F231 | LD A,(HL) | Load paging flags byte | ||
| F232 | INC HL | HL++ | ||
| F233 | LD H,(HL) | HL = Source data address (B is zero) | ||
| F234 | LD L,B | |||
| F235 | LD BC,$7FFD | 128K: Page in required bank | ||
| F238 | OUT (C),A | |||
| F23A | LD DE,$5C00 | Destination $5C00..$76EF (from the horizon backdrop to just before the turbo icons) | ||
| F23D | LD BC,$1AF0 | Bytes to copy (worst case) | ||
| F240 | LDIR | Copy | ||
| F242 | JP $8208 | Exit via relocated reset_paging_128k | ||
|
Pairs of (top byte of source data address, paging flags).
|
||||
| stage_data_locations | F245 | DEFW $C001 | Level 1. Source = $C000, Paging = bank 1 | |
| F247 | DEFW $E001 | Level 2. Source = $E000, Paging = bank 1 | ||
| F249 | DEFW $C006 | Level 3. Source = $C000, Paging = bank 6 | ||
| F24B | DEFW $E006 | Level 4. Source = $E000, Paging = bank 6 | ||
| F24D | DEFW $C007 | Level 5. Source = $C000, Paging = bank 7 | ||
| F24F | DEFW $E007 | Level 6. Source = $E000, Paging = bank 7 | ||
|
$8045 once relocated.
|
||||
| start_siren_hook_128k | F251 | LD A,$8C | Store $8C to channel A fine pitch | |
| F253 | LD ($A213),A | |||
| F256 | LD A,$0E | Store 14 to channel A volume (4-bit) | ||
| F258 | LD ($A21B),A | |||
| F25B | SUB $02 | Store 12 to channel B volume | ||
| F25D | LD ($A21C),A | |||
| F260 | LD A,$AA | Self modify 'LD A,x' @ F271 (in this position) | ||
| F262 | LD ($8066),A | |||
| F265 | LD ($A239),A | var_a239 = $AA | ||
| F268 | RET | Return | ||
| engine_sfx_play_hook_128k | F269 | LD A,($A239) | var_a239 (initialised to $AA above) | |
| F26C | AND A | Return if zero | ||
| F26D | RET Z | |||
| F26E | LD A,($A213) | Load channel A fine pitch | ||
| F271 | LD B,$AA | jump on 50-50 alternating pattern? -- could be flipping between string sets? | ||
| F273 | RLC B | |||
| F275 | JR C,f27f_128k | |||
|
Decreasing case
|
||||
| F277 | SUB $03 | A -= 3 | ||
| F279 | CP $5A | Jump if A >= $5A | ||
| F27B | JR NC,f28b_128k | |||
| F27D | JR f285_128k | Jump | ||
|
Increasing case
|
||||
| f27f_128k | F27F | ADD A,$03 | A += 3 | |
| F281 | CP $8C | Jump if A < $8C | ||
| F283 | JR C,f28b_128k | |||
|
Arrive here if A is outside of $5A..$8B
|
||||
| f285_128k | F285 | EX AF,AF' | ||
| F286 | LD A,B | Store B (rotating pattern) | ||
| F287 | LD ($8066),A | |||
| F28A | EX AF,AF' | |||
|
Arrive here if A is $5A..$8B
|
||||
| f28b_128k | F28B | LD ($A213),A | Update channel A fine pitch | |
| F28E | SUB $04 | and store 4 less to channel B fine pitch | ||
| F290 | LD ($A215),A | |||
| F293 | LD A,($A21A) | Set mixer to enable tone A & B | ||
| F296 | AND $3C | |||
| F298 | LD ($A21A),A | |||
| F29B | JR write_registers_hook_128k | Jump | ||
| silence_audio_hook_128k | F29D | LD A,$3F | Initialise mixer to $3F (all noise and tone off) | |
| F29F | LD ($A21A),A | |||
|
writing the full register set?
|
||||
| write_registers_hook_128k | F2A2 | LD HL,$A21E | Address of sound register value(s) -- other values must be earlier | |
| F2A5 | LD A,$0B | Select AY-3-8912 sound chip register 11: envelope fine duration | ||
| F2A7 | LD C,$FD | |||
| write_registers_hook_loop | F2A9 | LD B,$FF | ||
| F2AB | OUT (C),A | |||
| F2AD | LD B,$BF | Write to the register from (HL), then decrement B and HL | ||
| F2AF | OUTD | |||
| F2B1 | DEC A | Next register down | ||
| F2B2 | JP P,sub_809D | Loop to write_registers_hook_loop while +ve | ||
| F2B5 | RET | Return | ||
| f2b6_128k | F2B6 | LD HL,($A24A) | Get speed value | |
| F2B9 | RR H | A = speed / 2 (top half) | ||
| F2BB | LD A,L | A = speed / 2 (bottom half) | ||
| F2BC | RRA | |||
| F2BD | CPL | L = ~A | ||
| F2BE | LD L,A | |||
| F2BF | LD A,($A253) | Jump if in low gear | ||
| F2C2 | AND A | |||
| F2C3 | JR Z,page_in_stage_128k_0 | |||
| F2C5 | SLA L | |||
| F2C7 | RL H | |||
| page_in_stage_128k_0 | F2C9 | SLA L | ||
| F2CB | RL H | |||
| F2CD | SLA L | |||
| F2CF | RL H | |||
| F2D1 | LD A,($A23B) | A = tunnel_sfx | ||
| F2D4 | AND A | Set flags | ||
| F2D5 | LD DE,$0190 | -- base tone value? | ||
| F2D8 | LD A,$0F | |||
| F2DA | JR Z,page_in_stage_128k_1 | Jump if tunnel_sfx was zero | ||
| F2DC | LD DE,$0258 | -- base tone value? | ||
| F2DF | LD A,$0C | Volume = 12 | ||
| page_in_stage_128k_1 | F2E1 | ADD HL,DE | -- speed value + base tone? | |
| F2E2 | LD ($A217),HL | Set channel C pitch (both fine and course) | ||
| F2E5 | LD ($A21D),A | Set channel C volume | ||
| F2E8 | LD A,($A21A) | Set mixer to enable tone C | ||
| F2EB | AND $3B | |||
| F2ED | LD ($A21A),A | |||
| F2F0 | RET | Return | ||
| turbo_sfx_play_hook_128k | F2F1 | LD A,$3C | Set noise pitch (5-bit) [$3C is > 5-bit...] | |
| F2F3 | LD ($A219),A | |||
| F2F6 | LD ($A23A),A | var_a23a = $3C -- Copy of it? | ||
| F2F9 | RET | Return | ||
| engine_sfx_setup_hook_128k | F2FA | LD A,($A23A) | Jump if var_a23a is zero | |
| F2FD | AND A | |||
| F2FE | JR Z,f2b6_128k | |||
| F300 | DEC A | Decrement noise pitch | ||
| F301 | RET Z | Return if zero | ||
| F302 | LD HL,$A219 | Address of noise pitch register soft copy | ||
| F305 | DEC (HL) | Decrement in-place | ||
| F306 | JR Z,f31f_128k | Jump if zero | ||
| F308 | LD A,(HL) | Increment noise pitch register soft copy by 10 | ||
| F309 | ADD A,$0A | |||
| F30B | LD L,A | |||
| F30C | LD H,$00 | |||
| F30E | LD ($A217),HL | Set channel C pitch (both fine and course) | ||
| F311 | LD A,($A21A) | Set mixer to enable tone C and noise C | ||
| F314 | AND $1B | |||
| F316 | LD ($A21A),A | |||
| F319 | LD A,$0D | Set channel C volume to 13 | ||
| F31B | LD ($A21D),A | |||
| F31E | RET | Return | ||
| f31f_128k | F31F | LD A,($A21A) | Set mixer to disable tone C and noise C | |
| F322 | OR $24 | |||
| F324 | LD ($A21A),A | |||
| F327 | XOR A | var_a23a = 0 | ||
| F328 | LD ($A23A),A | |||
| F32B | JP load_stage_7 | Exit via f2b6_128k | ||
|
Relocated to $8122
"Giddy up boy!"
|
||||
| speech_samples_table | F32E | DEFW $0A8C | length | |
| F330 | DEFW $C000 | address | ||
|
"Let's go Mr. Driver!"
|
||||
| F332 | DEFW $14E6 | length | ||
| F334 | DEFW $CA8C | address | ||
|
"Hold on man!"
|
||||
| F336 | DEFW $0A5A | length | ||
| F338 | DEFW $DF72 | address | ||
|
"Your time's up"
|
||||
| F33A | DEFW $0ABE | length | ||
| F33C | DEFW $E9CC | address | ||
|
Start noise
|
||||
| F33E | DEFW $0ADC | length | ||
| F340 | DEFW $F48A | address | ||
| play_speech_128k | F342 | EX AF,AF' | Bank input index (sample indices are 1..5) | |
| F343 | CALL load_stage_6 | Call silence_audio_hook_128k | ||
| F346 | LD A,$04 | 128K: Map RAM bank 4 to $C000; Map normal screen; Map ROM 0 | ||
| F348 | LD BC,$7FFD | |||
| F34B | OUT (C),A | |||
| F34D | LD C,$FD | |||
| F34F | LD HL,$FFBF | |||
| F352 | LD D,$08 | |||
| F354 | EXX | |||
| F355 | EX AF,AF' | Unbank input index | ||
| F356 | ADD A,A | HL = $F32A + A*4 -- i.e. it's 1-indexed speech_samples_table | ||
| F357 | ADD A,A | |||
| F358 | LD HL,$811E | |||
| F35B | LD C,A | |||
| F35C | LD B,$00 | |||
| F35E | ADD HL,BC | |||
| F35F | LD E,(HL) | DE = wordat(HL); HL += 2 -- read length | ||
| F360 | INC HL | |||
| F361 | LD D,(HL) | |||
| F362 | INC HL | |||
| F363 | LD A,(HL) | HL = wordat(HL) -- read address | ||
| F364 | INC HL | |||
| F365 | LD H,(HL) | |||
| F366 | LD L,A | |||
| plsp_f367_128k | F367 | LD C,$02 | C = 2 -- iterations (two nibbles) | |
| F369 | LD A,(HL) | A = *HL -- read a sample (or two?) | ||
| F36A | RRA | A = A ROR 4 | ||
| F36B | RRA | |||
| F36C | RRA | |||
| F36D | RRA | |||
| plsp_f36e_loop | F36E | AND $0F | A &= 15 | |
| F370 | EX AF,AF' | |||
| F371 | EXX | |||
| F372 | LD B,H | B = H which is $FF | ||
| F373 | LD A,D | A = D which is 8 -- register 8: Channel A volume | ||
| F374 | OUT (C),A | C is $FD | ||
| F376 | LD B,L | B = L which is $BF | ||
| F377 | EX AF,AF' | A = value loaded above | ||
| F378 | OUT (C),A | Write to register | ||
| F37A | EX AF,AF' | Bank it again | ||
| F37B | INC A | 8 -> 9 -- register 9: Channel B volume | ||
| F37C | LD B,H | B = $FF | ||
| F37D | OUT (C),A | C is $FD | ||
| F37F | LD B,L | B = L which is $BF | ||
| F380 | EX AF,AF' | A = value loaded above | ||
| F381 | OUT (C),A | Write to register | ||
| F383 | EX AF,AF' | Bank it again | ||
| F384 | INC A | 9 -> 10 -- register 9: Channel C volume | ||
| F385 | LD B,H | B = $FF | ||
| F386 | OUT (C),A | C is $FD | ||
| F388 | LD B,L | B = L which is $BF | ||
| F389 | EX AF,AF' | A = value loaded above | ||
| F38A | OUT (C),A | Write to register | ||
| F38C | EXX | |||
| F38D | LD B,$13 | Delay loop (lower value => higher frequency) | ||
| page_in_stage_128k_2 | F38F | DJNZ page_in_stage_128k_2 | ||
| F391 | LD A,(HL) | Load next nibble (same byte, but next nibble) | ||
| F392 | DEC C | Decrement nibble counter | ||
| F393 | JR NZ,plsp_f36e_loop | Loop plsp_f36e_loop | ||
| F395 | INC HL | Advance to next byte of sample data | ||
| F396 | DEC DE | Decrement sample data counter | ||
| F397 | LD A,D | Loop to plsp_f367_128k while sample data remains | ||
| F398 | OR E | |||
| F399 | JP NZ,$815B | |||
| F39C | JP $8208 | Exit via relocated reset_paging_128k | ||
| plsp_f39f_128k | F39F | LD A,($8E4A) | -- frame delay? | |
| F3A2 | CP $2A | Return if A < 42 | ||
| F3A4 | RET C | |||
| F3A5 | CALL silence_audio_hook | Call silence_audio_hook | ||
| F3A8 | XOR A | var_a239 = 0 | ||
| F3A9 | LD ($A239),A | |||
| F3AC | INC A | A = 1 | ||
| F3AD | LD ($A23A),A | Load var_a23a -- copy of noise pitch | ||
| F3B0 | LD ($8E4A),A | Self modify 8E49 | ||
| F3B3 | LD HL,$C006 | |||
| plsp_f3b6_128k | F3B6 | LD ($81C6),HL | Self modify 'CALL xxxx' @ $81C5 ($F3D1 before relocation - below) | |
| F3B9 | LD HL,$B000 | Copy 4096 bytes from $B000 to $F000 (preserving registers for later) | ||
| F3BC | LD DE,$F000 | |||
| F3BF | LD BC,$1000 | |||
| F3C2 | PUSH HL | |||
| F3C3 | PUSH DE | |||
| F3C4 | PUSH BC | |||
| F3C5 | LDIR | |||
| F3C7 | LD ($81CE),SP | Self modify 'LD SP,xxxx' @ 81CD ($F3D9 here - below) | ||
| F3CB | LD SP,$A214 | new sp | ||
| F3CE | CALL $81D6 | Call relocated f3e2_128k | ||
| F3D1 | CALL $0000 | Self modified by plsp_f3b6_128k | ||
| F3D4 | PUSH AF | Preserve ? | ||
| F3D5 | CALL $81D6 | Call relocated f3e2_128k | ||
| F3D8 | POP AF | Restore ? | ||
| F3D9 | LD SP,$0000 | Restore SP - self modified by F3C7 above | ||
| F3DC | POP BC | Copy 4096 bytes from $B000 to $F000 | ||
| F3DD | POP HL | |||
| F3DE | POP DE | |||
| F3DF | LDIR | Copy | ||
| F3E1 | RET | Return | ||
| f3e2_128k | F3E2 | LD HL,$C000 | HL = $C000 | |
| F3E5 | LD B,$04 | 4 iterations | ||
| F3E7 | LD E,L | E = 0 | ||
| f3e8_loop | F3E8 | PUSH BC | Preserve iterations | |
| F3E9 | LD D,$B0 | DE = $B000 | ||
| F3EB | LD BC,$1000 | 4096 bytes | ||
| F3EE | PUSH BC | Preserve | ||
| F3EF | PUSH HL | |||
| F3F0 | LDIR | Copy | ||
| F3F2 | LD A,$03 | A = 3 | ||
| F3F4 | CALL engine_sfx_setup_0 | Jump into engine_sfx_setup with engine speed setup | ||
| F3F7 | POP HL | Retrieve from stack | ||
| F3F8 | POP BC | |||
| F3F9 | PUSH BC | |||
| F3FA | PUSH HL | |||
| F3FB | LD D,$B0 | DE = $B000 | ||
| f3fd_loop | F3FD | LD A,(DE) | A = *DE | |
| F3FE | LDI | Transfer a byte | ||
| F400 | DEC HL | HL[-1] = A | ||
| F401 | LD (HL),A | |||
| F402 | INC HL | |||
| F403 | JP PE,$81F1 | Loop if (parity even) to f3fd_loop | ||
| F406 | CALL $8208 | Call relocated reset_paging_128k | ||
| F409 | POP DE | Restore | ||
| F40A | POP BC | |||
| F40B | LD H,$B0 | HL = $B000 | ||
| F40D | LDIR | Copy | ||
| F40F | LD H,D | H = D | ||
| F410 | POP BC | Restore iterations | ||
| F411 | DJNZ f3e8_loop | Loop to f3e8_loop | ||
| F413 | RET | Return | ||
| reset_paging_128k | F414 | XOR A | 128K: Set paging register to default | |
| F415 | LD BC,$7FFD | |||
| F418 | OUT (C),A | |||
| F41A | RET | Return | ||
| attract_mode_hook_128k | F41B | LD HL,$C000 | HL = $C000 | |
| page_in_stage_128k_3 | F41E | CALL $81AA | Call relocated plsp_f3b6_128k (speech) | |
| F421 | AND A | Return if A is zero | ||
| F422 | RET Z | |||
| F423 | LD HL,$5D2B | HL -> attract_data | ||
| F426 | CALL setup_game | Call setup_game | ||
| F429 | LD A,$02 | var or self modify or ..? | ||
| F42B | LD ($825E),A | |||
| F42E | LD HL,$0190 | Set speed to $190 | ||
| F431 | LD ($A24A),HL | |||
| f434_128k_loop | F434 | CALL cpu_driver | Call cpu_driver | |
| F437 | LD A,($8001) | Load attract_cycle | ||
| F43A | AND A | Set flags | ||
| F43B | LD DE,$8296 | -> enter_for_options_messages | ||
| F43E | JR Z,f44b_key_check | Jump to f44b_key_check | ||
| F440 | CALL keyscan | Call keyscan | ||
| F443 | AND $10 | Was FIRE pressed? | ||
| F445 | JP NZ,play_start_noise | Jump to play_start_noise if so | ||
| F448 | LD DE,$8285 | -> press_gear_messages | ||
| f44b_key_check | F44B | LD A,$BF | Read port $BFFE -- ENTER, L, K, J, H | |
| F44D | IN A,($FE) | |||
| F44F | CPL | Complement the value returned to change it from to active-high | ||
| F450 | RRA | ?Shift out lsb | ||
| F451 | LD HL,$C009 | |||
| F454 | JR C,page_in_stage_128k_3 | ?Jump if ENTER was pressed | ||
| F456 | EX DE,HL | |||
| F457 | LD A,$F0 | |||
| F459 | RRCA | -- why load A then shift? self modified? | ||
| F45A | LD ($824C),A | |||
| F45D | JR NC,page_in_stage_128k_4 | |||
| F45F | LD A,(HL) | |||
| F460 | CALL print_message | Call print_message | ||
| page_in_stage_128k_4 | F463 | LD A,($A231) | If transition_control != 0 jump | |
| F466 | AND A | |||
| F467 | JR NZ,f488_128k | |||
| F469 | LD A,$00 | -- smells like self modified | ||
| F46B | AND A | |||
| F46C | JP M,$820F | |||
| F46F | DEC A | A-- | ||
| F470 | LD ($825E),A | self modifying? | ||
| F473 | JP P,attract_mode_1 | |||
| F476 | LD A,$08 | Transition type? | ||
| F478 | CALL setup_transition | Call setup_transition | ||
| F47B | JR f488_128k | |||
| f47d_128k | F47D | LD HL,$82AD | -- must be messages ptr below ($8208+165 means ?) | |
| F480 | JR NZ,f485_128k | |||
| F482 | LD HL,$830F | -- must be messages ptr below ($8208+263 means ?) | ||
| f485_128k | F485 | CALL message_printing_related | Call message_printing_related | |
| f488_128k | F488 | CALL transition | Call transition | |
| F48B | CALL draw_screen | Call draw_screen | ||
| F48E | JP $8228 | Loop to f434_128k_loop | ||
| Prev: F0FE | Up: Map | Next: F491 |