| Chase H.Q. | Routines |
| Prev: C00C | Up: Map | Next: C16A |
|
Reached from check_high_score when the new score beats or ties the table row whose address was pushed there. Shifts the rows below the insertion point down by one (33 bytes each; row 1 needs no shift), writes the score digits, stage code and retry-attempt number into the row, runs a highlight/flash display, then drops into the joystick-driven name-entry loop at name_entry_frame.
Used by the routine at check_high_score.
|
||||
| insert_high_score_entry | C06E | LD A,C | A = row counter (1..10, from check_high_score) | |
| C06F | EX AF,AF' | Bank the row counter | ||
| C070 | LD A,C | A = row counter again | ||
| C071 | DEC A | |||
| C072 | JR Z,ihe_write_row | Row 1 (bottom of the table) -> nothing below to shift | ||
| ihe_shift_rows | C074 | LD DE,$C54A | DE -> one past the last table row (shift destination) | |
| C077 | LD HL,$C529 | HL -> last table row (shift source) | ||
| insert_high_score_entry_0 | C07A | LD BC,$001A | Shift 26 bytes of the row down into the row below | |
| C07D | LDDR | |||
| C07F | LD C,$07 | then step both pointers back the rest of the 33-byte row stride without copying -- the trailing 7 bytes of each row (2 padding bytes + the row's own 5-char rank suffix, e.g. "2ND " -- see the data at C3AF) are static labels, not player data, so they are simply left untouched by the shift | ||
| C081 | AND A | |||
| C082 | SBC HL,BC | |||
| C084 | EX DE,HL | |||
| C085 | SBC HL,BC | |||
| C087 | EX DE,HL | |||
| C088 | DEC A | One row done | ||
| C089 | JR NZ,insert_high_score_entry_0 | Loop up through the rows above the insertion point | ||
| ihe_write_row | C08B | POP DE | DE -> the row being inserted (address pushed by check_high_score) | |
| C08C | LD HL,$C55F | HL -> formatted score digit string | ||
| C08F | LD BC,$0008 | Write the 8 score digits into the row | ||
| C092 | LDIR | |||
| C094 | INC DE | DE += 4 | ||
| C095 | INC DE | |||
| C096 | INC DE | |||
| C097 | INC DE | |||
| C098 | LD A,($8007) | A = wanted_stage_number | ||
| C09B | LD C,A | C = stage_number * 3 -- index into a 3-byte-per-stage table | ||
| C09C | ADD A,A | |||
| C09D | ADD A,C | |||
| C09E | LD C,A | |||
| C09F | LD HL,$C564 | HL -> stage code/name table (3 bytes/stage) | ||
| C0A2 | ADD HL,BC | HL -> this stage's entry | ||
| C0A3 | LD C,$03 | Write the 3-byte stage code into the row | ||
| C0A5 | LDIR | |||
| C0A7 | EX DE,HL | HL -> row (DE no longer needed for the copy) | ||
| C0A8 | LD C,$05 | HL += 5 | ||
| C0AA | ADD HL,BC | |||
| C0AB | LD A,($8006) | A = retry_count (0/1/2) | ||
| C0AE | ADD A,$31 | A = ASCII '1'..'3' | ||
| C0B0 | LD (HL),A | Write the attempt-number digit into the row | ||
| C0B1 | LD C,$03 | HL += 3 | ||
| C0B3 | ADD HL,BC | |||
| C0B4 | LD ($C59C),HL | Remember this position | ||
| C0B7 | LD (HL),$2E | Write two static full stops ("..") | ||
| C0B9 | INC HL | |||
| C0BA | LD (HL),$2E | |||
| C0BC | INC HL | |||
| C0BD | LD (HL),$AE | A third full stop with bit 7 set, terminating the row's 3-character name field (see C3AF) with placeholder text before the player's initials overwrite it | ||
| C0BF | EX AF,AF' | Restore the row counter (banked at $C06F) | ||
| C0C0 | LD ($C2F8),A | Save the row counter | ||
| C0C3 | LD B,A | B = row counter | ||
|
Address = $C401 + (10 - row_counter) * 33: locates this row's entry in a 33-byte-per-row table (screen or attribute positions for the 10-row name-entry table), used below to scroll the display to the new entry. The multiply is done as (10-row)*32 (5x ADD A,A, overflow captured in D via RL D) plus one more (10-row) added back in (ADD A,C) -- i.e. x*32 + x = x*33.
|
||||
| C0C4 | NEG | |||
| C0C6 | ADD A,$0A | |||
| C0C8 | LD C,A | |||
| C0C9 | ADD A,A | |||
| C0CA | ADD A,A | |||
| C0CB | ADD A,A | |||
| C0CC | ADD A,A | |||
| C0CD | ADD A,A | |||
| C0CE | LD D,$00 | |||
| C0D0 | RL D | |||
| C0D2 | ADD A,C | |||
| C0D3 | LD E,A | |||
| C0D4 | LD HL,$C401 | |||
| C0D7 | ADD HL,DE | |||
| C0D8 | LD ($C156),HL | Save the computed address | ||
|
Border-flash colour = $A0 - clamp(7 - row_counter, 0..7) * 16: fades from bright ($A0) for early rows to darker for rows further down the table, giving the flashing highlight a position-dependent brightness.
|
||||
| C0DB | LD A,$07 | |||
| C0DD | SUB B | |||
| C0DE | JR NC,insert_high_score_entry_1 | |||
| C0E0 | XOR A | |||
| insert_high_score_entry_1 | C0E1 | ADD A,A | ||
| C0E2 | ADD A,A | |||
| C0E3 | ADD A,A | |||
| C0E4 | ADD A,A | |||
| C0E5 | LD C,A | |||
| C0E6 | LD A,$A0 | |||
| C0E8 | SUB C | |||
| C0E9 | LD ($C13D),A | Save the computed flash colour (read back at $C13C) | ||
| C0EC | CALL clear_playfield_and_attrs | See clear_playfield_and_attrs | ||
|
Clear/prepare screen buffers for the name-entry display ($C0EF-$C132). Not traced instruction-by-instruction here.
|
||||
| C0EF | INC L | |||
| C0F0 | LD H,$5A | |||
| C0F2 | INC E | |||
| C0F3 | LD D,H | |||
| C0F4 | LD (HL),$47 | |||
| C0F6 | LD BC,$01FF | |||
| C0F9 | LDIR | |||
| C0FB | LD HL,$59E0 | |||
| C0FE | LD DE,$5AE0 | |||
| C101 | XOR A | |||
| C102 | LD B,$20 | |||
| insert_high_score_entry_2 | C104 | LD (HL),A | Zero two 32-byte blocks at $59E0 and $5AE0 in lockstep | |
| C105 | LD (DE),A | |||
| C106 | INC E | |||
| C107 | INC L | |||
| C108 | DJNZ insert_high_score_entry_2 | |||
| C10A | LD DE,$C401 | |||
| C10D | LD HL,$C54B | |||
| C110 | LD A,$0A | A = 10 (rows) | ||
| insert_high_score_entry_3 | C112 | LDI | Copy 2 bytes per row from the table at $C54B into the row-offset table at $C401 (31-byte stride) | |
| C114 | LDI | |||
| C116 | EX DE,HL | |||
| C117 | LD BC,$001F | |||
| C11A | ADD HL,BC | |||
| C11B | EX DE,HL | |||
| C11C | DEC A | |||
| C11D | JR NZ,insert_high_score_entry_3 | |||
| C11F | LD HL,$C3AF | HL -> C3AF data block | ||
| C122 | CALL print_string | Common routine outside this bank | ||
| C125 | CALL setup_im2_interrupt_table | See setup_im2_interrupt_table | ||
| C128 | LD A,$03 | |||
| C12A | CALL titlescr_start_tune | See titlescr_start_tune, called with A=3 | ||
| C12D | EI | |||
| C12E | HALT | Wait for the next interrupt | ||
| C12F | XOR A | |||
| C130 | LD ($C2F2),A | Clear a flag/self-modified byte at $C2F2 | ||
| ihe_flash_loop | C133 | CALL titlescr_music | See titlescr_music | |
| C136 | CALL scroll_score_rows | See scroll_score_rows | ||
| C139 | CALL name_entry_input | See name_entry_input | ||
| C13C | LD A,$A0 | Recomputes to a constant $9F every pass, so JR NZ is always taken here -- this loop can only actually end via a side effect inside one of the three CALLs above (e.g. popping this return address), not via this test | ||
| C13E | DEC A | |||
| C13F | LD ($C13D),A | |||
| C142 | JR NZ,ihe_flash_loop | |||
| C144 | LD A,$C9 | $C9 = RET opcode | ||
| C146 | LD ($C2F2),A | Self-modify $C2F2 to RET, ending the entry loop | ||
| ihe_entry_loop | C149 | CALL name_entry_frame | Handle one frame of name entry (see name_entry_frame) | |
| C14C | CALL name_entry_input | See name_entry_input | ||
| C14F | CALL titlescr_music | See titlescr_music | ||
| C152 | JP ihe_entry_loop | Loop -- exits via a side effect inside a callee | ||
|
This entry point is used by the routine at name_entry_input.
|
||||
| name_entry_frame | C155 | LD HL,$C422 | HL -> a saved (DE) pair, likely the current cursor/ | |
| C158 | LD E,(HL) | letter-selection state | ||
| C159 | INC HL | |||
| C15A | LD D,(HL) | |||
| C15B | INC HL | |||
| C15C | EXX | Swap in DE (bank what was the caller's shadow set) | ||
| C15D | PUSH HL | Preserve the caller's shadow BC/DE/HL on the stack, in case redraw_name_frame uses EXX itself | ||
| C15E | PUSH DE | |||
| C15F | PUSH BC | |||
| C160 | EXX | Swap back -- main regs include DE (the loaded state) | ||
| C161 | CALL redraw_name_frame | See redraw_name_frame (joystick/letter-selection update) | ||
| C164 | EXX | Swap to the (now current) shadow set | ||
| C165 | POP BC | Restore the caller's shadow BC/DE/HL | ||
| C166 | POP DE | |||
| C167 | POP HL | |||
| C168 | EXX | Swap back to the main set | ||
| C169 | RET | |||
| Prev: C00C | Up: Map | Next: C16A |