Routines |
Prev: EA2F | Up: Map | Next: EB36 |
Used by the routine at Game_Loop.
|
||||||||||||||||||||
|
||||||||||||||||||||
Handler_MainMenu | EA4A | LD DE,$D874 | DE=Score_Digit_01. | |||||||||||||||||
EA4D | LD HL,$D86F | HL=HighScore. | ||||||||||||||||||
EA50 | LD A,(DE) | Load the first byte of the current score. | ||||||||||||||||||
EA51 | SUB (HL) | Compare it with the first byte of the high score. | ||||||||||||||||||
EA52 | JP M,Print_Score/HighScore | Jump to Print_Score/HighScore if the current score digit is less than the high score digit. | ||||||||||||||||||
It's a new high score! Update what's stored.
|
||||||||||||||||||||
EA55 | LD A,(DE) | Write the first score digit to the first highscore digit. | ||||||||||||||||||
EA56 | LD (HL),A | |||||||||||||||||||
EA57 | INC DE | Increment the current score pointer by one. | ||||||||||||||||||
EA58 | INC HL | Increment the high score pointer by one. | ||||||||||||||||||
EA59 | JR NZ,UpdateHighScore | Jump to UpdateHighScore until the score digit is zero. | ||||||||||||||||||
EA5B | LD A,(DE) | Load the second byte of the current score. | ||||||||||||||||||
EA5C | SUB (HL) | Compare it with the second byte of the high score. | ||||||||||||||||||
EA5D | JP M,Print_Score/HighScore | Jump to Print_Score/HighScore if the current score digit is less than the high score digit. | ||||||||||||||||||
UpdateHighScore | EA60 | LD A,(DE) | Write the second score digit to the second highscore digit. | |||||||||||||||||
EA61 | LD (HL),A | |||||||||||||||||||
Print the score of the last game and the high score.
|
||||||||||||||||||||
Print_Score/HighScore | EA62 | LD B,$13 | Set the X co-ordinate for the score display. | |||||||||||||||||
EA64 | LD C,$0E | Set the Y co-ordinate for the score display. | ||||||||||||||||||
EA66 | LD DE,$D874 | DE=Score_Digit_01. | ||||||||||||||||||
EA69 | LD A,$06 | Set the number of digits to print in A. | ||||||||||||||||||
EA6B | CALL Print_Numbers | Call Print_Numbers. | ||||||||||||||||||
EA6E | LD B,$15 | Set the X co-ordinate for the high score display. | ||||||||||||||||||
EA70 | LD C,$0E | Set the Y co-ordinate for the high score display. | ||||||||||||||||||
EA72 | LD DE,$D86F | DE=HighScore. | ||||||||||||||||||
EA75 | LD A,$06 | Set the number of digits to print in A. | ||||||||||||||||||
EA77 | CALL Print_Numbers | Call Print_Numbers. | ||||||||||||||||||
Initialise the cursor/ pointer which highlights the currently selected menu item.
|
||||||||||||||||||||
EA7A | LD IX,($D877) | IX=*SelectedMenuItem_ScreenPosition. | ||||||||||||||||||
EA7E | LD HL,$EB38 | HL=SelectedMenuItem. | ||||||||||||||||||
EA81 | JR HighlightSelectedMenuItem | Jump to HighlightSelectedMenuItem. | ||||||||||||||||||
Maybe a debounce loop?
|
||||||||||||||||||||
Debounce_Loop | EA83 | XOR A | Get the player input from ALL half-rows (i.e. all the keys). | |||||||||||||||||
EA84 | IN A,($FE) | |||||||||||||||||||
EA86 | CPL | Invert the bits in A. | ||||||||||||||||||
EA87 | AND %00011111 | Keep only bits 0-4. | ||||||||||||||||||
EA89 | JR NZ,Debounce_Loop | Jump to Debounce_Loop if HL is not zero. | ||||||||||||||||||
Get the player input.
|
||||||||||||||||||||
MainMenuInput_Loop | EA8B | LD A,$F7 | Read from the keyboard;
|
|||||||||||||||||
EA8D | IN A,($FE) | |||||||||||||||||||
EA8F | CPL | Invert the bits in A. | ||||||||||||||||||
EA90 | AND %00011111 | Mask for the key bits. | ||||||||||||||||||
EA92 | JR Z,MainMenuInput_Loop | Jump back to MainMenuInput_Loop if no keys are being pressed. | ||||||||||||||||||
Check which key was pressed and handle accordingly.
Handle "KEYBOARD" being selected.
|
||||||||||||||||||||
EA94 | RRA | Jump to MainMenuInput_Kempston if "1" was not pressed. | ||||||||||||||||||
EA95 | JR NC,MainMenuInput_Kempston | |||||||||||||||||||
EA97 | LD A,$01 | Jump back to Debounce_Loop if this menu item is already selected. | ||||||||||||||||||
EA99 | CP (HL) | |||||||||||||||||||
EA9A | JR Z,Debounce_Loop | |||||||||||||||||||
EA9C | CALL ClearSelectedMenuItem | Call ClearSelectedMenuItem. | ||||||||||||||||||
EA9F | LD IX,$5843 | Set the screen position for this option in IX. | ||||||||||||||||||
EAA3 | LD DE,$EB64 | Set the address of the input control routine for this option in DE (InputHandler_Keyboard). | ||||||||||||||||||
EAA6 | JR UpdateMenuSelection | Jump to UpdateMenuSelection. | ||||||||||||||||||
Handle "KEMPSTON" being selected.
|
||||||||||||||||||||
MainMenuInput_Kempston | EAA8 | RRA | Jump to MainMenuInput_Cursor if "2" was not pressed. | |||||||||||||||||
EAA9 | JR NC,MainMenuInput_Cursor | |||||||||||||||||||
EAAB | LD A,$02 | Jump back to Debounce_Loop if this menu item is already selected. | ||||||||||||||||||
EAAD | CP (HL) | |||||||||||||||||||
EAAE | JR Z,Debounce_Loop | |||||||||||||||||||
EAB0 | CALL ClearSelectedMenuItem | Call ClearSelectedMenuItem. | ||||||||||||||||||
EAB3 | LD IX,$58A3 | Set the screen position for this option in IX. | ||||||||||||||||||
EAB7 | LD DE,$EB98 | Set the address of the input control routine for this option in DE (InputHandler_Kempston). | ||||||||||||||||||
EABA | JR UpdateMenuSelection | Jump to UpdateMenuSelection. | ||||||||||||||||||
Handle "CURSOR" being selected.
|
||||||||||||||||||||
MainMenuInput_Cursor | EABC | RRA | Jump to MainMenuInput_Sinclair if "3" was not pressed. | |||||||||||||||||
EABD | JR NC,MainMenuInput_Sinclair | |||||||||||||||||||
EABF | LD A,$03 | Jump back to Debounce_Loop if this menu item is already selected. | ||||||||||||||||||
EAC1 | CP (HL) | |||||||||||||||||||
EAC2 | JR Z,Debounce_Loop | |||||||||||||||||||
EAC4 | CALL ClearSelectedMenuItem | Call ClearSelectedMenuItem. | ||||||||||||||||||
EAC7 | LD IX,$5903 | Set the screen position for this option in IX. | ||||||||||||||||||
EACB | LD DE,$EB9E | Set the address of the input control routine for this option in DE (InputHandler_Cursor). | ||||||||||||||||||
EACE | JR UpdateMenuSelection | Jump to UpdateMenuSelection. | ||||||||||||||||||
Handle "SINCLAIR" being selected.
|
||||||||||||||||||||
MainMenuInput_Sinclair | EAD0 | RRA | Jump to MainMenuInput_StartGame if "4" was not pressed. | |||||||||||||||||
EAD1 | JR NC,MainMenuInput_StartGame | |||||||||||||||||||
EAD3 | LD A,$04 | Jump back to Debounce_Loop if this menu item is already selected. | ||||||||||||||||||
EAD5 | CP (HL) | |||||||||||||||||||
EAD6 | JR Z,Debounce_Loop | |||||||||||||||||||
EAD8 | CALL ClearSelectedMenuItem | Call ClearSelectedMenuItem. | ||||||||||||||||||
EADB | LD IX,$5963 | Set the screen position for this option in IX. | ||||||||||||||||||
EADF | LD DE,$EBCD | Set the address of the input control routine for this option in DE (InputHandler_Sinclair). | ||||||||||||||||||
Update menu selection.
|
||||||||||||||||||||
UpdateMenuSelection | EAE2 | LD (HL),A | Write the selected menu item to *SelectedMenuItem. | |||||||||||||||||
EAE3 | LD ($EB36),DE | Write the address of the input control routine to *Pointer_InputControl. | ||||||||||||||||||
Point to selected menu item.
|
||||||||||||||||||||
HighlightSelectedMenuItem | EAE7 | LD (IX+$00),$45 | Write INK:
CYAN,
PAPER:
BLACK
(BRIGHT)
to:
|
|||||||||||||||||
EAEB | LD (IX+$01),$45 | |||||||||||||||||||
EAEF | LD (IX+$20),$05 | Write INK:
CYAN,
PAPER:
BLACK
to:
|
||||||||||||||||||
EAF3 | LD (IX+$21),$05 | |||||||||||||||||||
EAF7 | LD ($D877),IX | Write IX to SelectedMenuItem_ScreenPosition. | ||||||||||||||||||
EAFB | JR Debounce_Loop | Jump to Debounce_Loop. | ||||||||||||||||||
Clear previous selected menu item.
|
||||||||||||||||||||
ClearSelectedMenuItem | EAFD | LD (IX+$00),$00 | Write INK:
BLACK,
PAPER:
BLACK
to:
|
|||||||||||||||||
EB01 | LD (IX+$01),$00 | |||||||||||||||||||
EB05 | LD (IX+$20),$00 | |||||||||||||||||||
EB09 | LD (IX+$21),$00 | |||||||||||||||||||
EB0D | RET | Return. | ||||||||||||||||||
Note; there's no need for the "not pressed" check, as there are only five options.
Handle "START GAME" being selected.
Uncover the "Good Luck" messaging (it's already present, just black on black).
|
||||||||||||||||||||
MainMenuInput_StartGame | EB0E | LD HL,$5A36 | HL=5A36 (attribute buffer location). | |||||||||||||||||
EB11 | LD DE,$0020 | DE=0020. | ||||||||||||||||||
EB14 | LD B,$04 | Set a counter in B for the number of rows to process. | ||||||||||||||||||
GoodLuck_OuterLoop | EB16 | PUSH BC | Stash the row counter on the stack. | |||||||||||||||||
EB17 | LD B,$08 | Set a counter in B for the width of the messaging. | ||||||||||||||||||
EB19 | PUSH HL | Stash the starting position in the attribute buffer on the stack. | ||||||||||||||||||
GoodLuck_InnerLoop | EB1A | LD (HL),$47 | Write INK: WHITE, PAPER: BLACK (BRIGHT) to *HL. | |||||||||||||||||
EB1C | INC HL | Increment attribute buffer screen position by one. | ||||||||||||||||||
EB1D | DJNZ GoodLuck_InnerLoop | Decrease width counter by one and loop back to GoodLuck_InnerLoop until all the width has been coloured. | ||||||||||||||||||
EB1F | POP HL | Restore the attribute buffer starting position from the stack. | ||||||||||||||||||
EB20 | ADD HL,DE | HL+=0020 (move down one row). | ||||||||||||||||||
EB21 | POP BC | Restore the row counter from the stack. | ||||||||||||||||||
EB22 | DJNZ GoodLuck_OuterLoop | Decrease the row counter by one and loop back to GoodLuck_OuterLoop until the row counter is zero. | ||||||||||||||||||
EB24 | LD HL,$EB39 | Write 01 to EB39. | ||||||||||||||||||
EB27 | LD (HL),$01 | |||||||||||||||||||
EB29 | PUSH HL | Stash EB39 on the stack. | ||||||||||||||||||
EB2A | LD HL,$EB3A | HL=EB3A. | ||||||||||||||||||
EB2D | LD B,$0E | B=0E. | ||||||||||||||||||
EB2F | CALL $EF4A | Call EF4A. | ||||||||||||||||||
EB32 | POP HL | Restore HL from the stack. | ||||||||||||||||||
EB33 | LD (HL),$00 | Write 00 to *HL. | ||||||||||||||||||
EB35 | RET | Return. |
Prev: EA2F | Up: Map | Next: EB36 |