| Chase H.Q. | Routines |
| Prev: 4000 | Up: Map | Next: 5BD7 |
|
The game starts here.
|
||||
| start | 5B00 | DI | Disable interrupts | |
| 5B01 | LD SP,$5C00 | Set stack pointer | ||
|
Copy $4910 bytes from $5C00+ to $76F0+ (copying backwards to avoid overlap).
|
||||
| 5B04 | LD HL,$A50F | Final source byte | ||
| 5B07 | LD DE,$BFFF | Final destination byte | ||
| 5B0A | LD BC,$4910 | Count | ||
| 5B0D | LDDR | Copy | ||
|
Detect 128K machines.
Assuming bank 0 is mapped in to start with, we copy a byte from bank 0.
|
||||
| 5B0F | LD HL,$FFF0 | Read the byte at $FFF0 into E | ||
| 5B12 | LD E,(HL) | |||
|
Now we modify it, then store it back after attempting to page in bank 1.
|
||||
| 5B13 | LD A,$01 | Attempt to map RAM bank 1 to $C000 | ||
| 5B15 | LD BC,$7FFD | |||
| 5B18 | OUT (C),A | |||
| 5B1A | LD A,E | Increment the read byte by $FD (being a handy non-zero value) | ||
| 5B1B | ADD A,C | |||
| 5B1C | LD (HL),A | Store it | ||
|
If the modified byte remains present after restoring bank 0 then it's a 48K machine.
|
||||
| 5B1D | XOR A | Attempt to map RAM bank 0 to $C000 | ||
| 5B1E | OUT (C),A | |||
| 5B20 | LD A,(HL) | Fetch potentially changed byte | ||
| 5B21 | LD (HL),E | Restore original byte | ||
| 5B22 | LD HL,$5B7D | Point HL at loader_commands_48K | ||
|
If byte was modified no paging took place, so this is a 48K machine.
|
||||
| 5B25 | CP E | If modified, jump to loader with loader_commands_48K setup | ||
| 5B26 | JR NZ,loader | |||
| mode_is_128k | 5B28 | LD HL,$5B87 | Otherwise point HL at loader_commands_128K | |
|
Loader accepts a command list and uses it to load the game into memory. The 48K command list at loader_commands_48K loads stage 1, then starts the game. The 128K command list at loader_commands_128K loads stages while paging in the appropriate banks, then starts the game.
|
||||
| loader | 5B2B | LD E,(HL) | Load a handler address from HL | |
| 5B2C | INC HL | |||
| 5B2D | LD D,(HL) | |||
| 5B2E | INC HL | |||
| 5B2F | PUSH DE | Call the handler | ||
| 5B30 | RET | |||
|
Loader handler that loads a stage.
|
||||
| loader_load | 5B31 | PUSH HL | Preserve command list address | |
| 5B32 | LD IX,$5BD5 | Address | ||
| 5B36 | LD DE,$0002 | Count | ||
| 5B39 | CALL loader_load_chunk | Call loader_load_chunk | ||
| 5B3C | POP HL | Restore command list address | ||
| loader_load_headerless | 5B3D | LD E,(HL) | Load address into IX | |
| 5B3E | INC HL | |||
| 5B3F | LD D,(HL) | |||
| 5B40 | INC HL | |||
| 5B41 | PUSH DE | |||
| 5B42 | POP IX | |||
| 5B44 | LD E,(HL) | Load count into DE | ||
| 5B45 | INC HL | |||
| 5B46 | LD D,(HL) | |||
| 5B47 | INC HL | |||
| 5B48 | PUSH HL | Preserve command list address | ||
| 5B49 | CALL loader_load_chunk | Call loader_load_chunk | ||
| 5B4C | POP HL | Restore command list address | ||
| 5B4D | JR loader | Process next entry | ||
|
Subroutine that loads DE bytes to address IX.
|
||||
| loader_load_chunk | 5B4F | CALL tape_load | Call tape_load | |
| 5B52 | RET C | Return if no errors | ||
|
Infinitely cycle through border colours if a tape loading error occurred.
|
||||
| loader_load_failed | 5B53 | OUT ($FE),A | ||
| 5B55 | INC A | |||
| 5B56 | JR loader_load_failed | |||
|
Loader handler that pages in the specified RAM bank.
|
||||
| loader_set_bank | 5B58 | LD A,$80 | Page in RAM where interrupt vector lives | |
| 5B5A | LD I,A | Set Interrupt Control Vector Register | ||
| 5B5C | LD A,(HL) | Load 128K paging flags byte | ||
| 5B5D | INC HL | Second byte is unused | ||
| 5B5E | INC HL | |||
| 5B5F | LD BC,$7FFD | 128K: Set paging register | ||
| 5B62 | OUT (C),A | |||
| 5B64 | JR loader | Process next entry | ||
|
Loader handler that copies data around.
|
||||
| loader_copy | 5B66 | PUSH HL | Preserve command list address | |
| 5B67 | LD HL,$5C00 | Move $5C00..$76EF to $C000 onwards | ||
| 5B6A | LD DE,$C000 | |||
| 5B6D | LD BC,$1AF0 | |||
| 5B70 | LDIR | |||
| 5B72 | POP HL | Restore command list address | ||
| 5B73 | JR loader | Process next entry | ||
|
Loader handler that starts the game.
|
||||
| loader_done | 5B75 | LD A,(HL) | Load entrypoint address from HL | |
| 5B76 | INC HL | |||
| 5B77 | LD H,(HL) | |||
| 5B78 | LD L,A | |||
| 5B79 | XOR A | Set border to black | ||
| 5B7A | OUT ($FE),A | |||
| 5B7C | JP (HL) | Exit via entrypoint just read | ||
|
Loader commands for 48K mode.
|
||||
| loader_commands_48K | 5B7D | DEFW loader_load | loader_load | |
| 5B7F | DEFW bitmap_horizon,$1AF0 | Stage 1: at $5C00 load $1AF0 bytes | ||
| 5B83 | DEFW loader_done | loader_done | ||
| 5B85 | DEFW entrypt_48k | entrypt_48k | ||
|
Loader commands for 128K mode.
|
||||
| loader_commands_128K | 5B87 | DEFW loader_load | loader_load | |
| 5B89 | DEFW bitmap_horizon,$1AF0 | Stage 1: at $5C00 load $1AF0 bytes | ||
| 5B8D | DEFW loader_set_bank | loader_set_bank | ||
| 5B8F | DEFB $01,$00 | Bank 1 (second byte is unused here) | ||
| 5B91 | DEFW loader_copy | loader_copy | ||
| 5B93 | DEFW loader_load | loader_load | ||
| 5B95 | DEFW $E000,$1AF0 | Stage 2: at $E000 load $1AF0 bytes | ||
| 5B99 | DEFW loader_set_bank | loader_set_bank | ||
| 5B9B | DEFB $06,$00 | Bank 6 | ||
| 5B9D | DEFW loader_load | loader_load | ||
| 5B9F | DEFW $C000,$1AF0 | Stage 3: at $C000 load $1AF0 bytes | ||
| 5BA3 | DEFW loader_load | loader_load | ||
| 5BA5 | DEFW $E000,$1AF0 | Stage 4: at $E000 load $1AF0 bytes | ||
| 5BA9 | DEFW loader_set_bank | loader_set_bank | ||
| 5BAB | DEFB $07,$00 | Bank 7 | ||
| 5BAD | DEFW loader_load | loader_load | ||
| 5BAF | DEFW $C000,$1AF0 | Stage 5: at $C000 load $1AF0 bytes | ||
| 5BB3 | DEFW loader_load | loader_load | ||
| 5BB5 | DEFW $E000,$1AF0 | End screen: at $E000 load $1AF0 bytes | ||
| 5BB9 | DEFW loader_set_bank | loader_set_bank | ||
| 5BBB | DEFB $03,$00 | Bank 3 | ||
| 5BBD | DEFW loader_load_headerless | loader_load_headerless | ||
| 5BBF | DEFW $C000,$4000 | Title screen: at $C000 load $4000 bytes | ||
| 5BC3 | DEFW loader_set_bank | loader_set_bank | ||
| 5BC5 | DEFB $04,$00 | Bank 4 | ||
| 5BC7 | DEFW loader_load_headerless | loader_load_headerless | ||
| 5BC9 | DEFW $C000,$4000 | Sampled speech: at $C000 load $4000 bytes | ||
| 5BCD | DEFW loader_set_bank | loader_set_bank | ||
| 5BCF | DEFB $00,$00 | Bank 0 | ||
| 5BD1 | DEFW loader_done | loader_done | ||
| 5BD3 | DEFW entrypt_128k | entrypt_128k | ||
| loader_scratch | 5BD5 | DEFB $01,$01 | loader_load loads two bytes to here. -- unsure what uses them | |
| Prev: 4000 | Up: Map | Next: 5BD7 |