Prev: 59951 Up: Map Next: 60214
59978: Handler: Main Menu
Used by the routine at Game_Loop.
main-menu-cursor
Handler_MainMenu 59978 LD DE,55412 DE=Score_Digit_01.
59981 LD HL,55407 HL=HighScore.
59984 LD A,(DE) Load the first byte of the current score.
59985 SUB (HL) Compare it with the first byte of the high score.
59986 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.
59989 LD A,(DE) Write the first score digit to the first highscore digit.
59990 LD (HL),A
59991 INC DE Increment the current score pointer by one.
59992 INC HL Increment the high score pointer by one.
59993 JR NZ,UpdateHighScore Jump to UpdateHighScore until the score digit is zero.
59995 LD A,(DE) Load the second byte of the current score.
59996 SUB (HL) Compare it with the second byte of the high score.
59997 JP M,Print_Score/HighScore Jump to Print_Score/HighScore if the current score digit is less than the high score digit.
UpdateHighScore 60000 LD A,(DE) Write the second score digit to the second highscore digit.
60001 LD (HL),A
Print the score of the last game and the high score.
Print_Score/HighScore 60002 LD B,19 Set the X co-ordinate for the score display.
60004 LD C,14 Set the Y co-ordinate for the score display.
60006 LD DE,55412 DE=Score_Digit_01.
60009 LD A,6 Set the number of digits to print in A.
60011 CALL Print_Numbers Call Print_Numbers.
60014 LD B,21 Set the X co-ordinate for the high score display.
60016 LD C,14 Set the Y co-ordinate for the high score display.
60018 LD DE,55407 DE=HighScore.
60021 LD A,6 Set the number of digits to print in A.
60023 CALL Print_Numbers Call Print_Numbers.
Initialise the cursor/ pointer which highlights the currently selected menu item.
60026 LD IX,(55415) IX=*SelectedMenuItem_ScreenPosition.
60030 LD HL,60216 HL=SelectedMenuItem.
60033 JR HighlightSelectedMenuItem Jump to HighlightSelectedMenuItem.
Maybe a debounce loop?
Debounce_Loop 60035 XOR A Get the player input from ALL half-rows (i.e. all the keys).
60036 IN A,(254)
60038 CPL Invert the bits in A.
60039 AND %00011111 Keep only bits 0-4.
60041 JR NZ,Debounce_Loop Jump to Debounce_Loop if HL is not zero.
Get the player input.
MainMenuInput_Loop 60043 LD A,247 Read from the keyboard;
Port Number Bit
0 1 2 3 4
247 1 2 3 4 5
60045 IN A,(254)
60047 CPL Invert the bits in A.
60048 AND %00011111 Mask for the key bits.
60050 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.
60052 RRA Jump to MainMenuInput_Kempston if "1" was not pressed.
60053 JR NC,MainMenuInput_Kempston
60055 LD A,1 Jump back to Debounce_Loop if this menu item is already selected.
60057 CP (HL)
60058 JR Z,Debounce_Loop
60060 CALL ClearSelectedMenuItem Call ClearSelectedMenuItem.
60063 LD IX,22595 Set the screen position for this option in IX.
60067 LD DE,60260 Set the address of the input control routine for this option in DE (InputHandler_Keyboard).
60070 JR UpdateMenuSelection Jump to UpdateMenuSelection.
Handle "KEMPSTON" being selected.
MainMenuInput_Kempston 60072 RRA Jump to MainMenuInput_Cursor if "2" was not pressed.
60073 JR NC,MainMenuInput_Cursor
60075 LD A,2 Jump back to Debounce_Loop if this menu item is already selected.
60077 CP (HL)
60078 JR Z,Debounce_Loop
60080 CALL ClearSelectedMenuItem Call ClearSelectedMenuItem.
60083 LD IX,22691 Set the screen position for this option in IX.
60087 LD DE,60312 Set the address of the input control routine for this option in DE (InputHandler_Kempston).
60090 JR UpdateMenuSelection Jump to UpdateMenuSelection.
Handle "CURSOR" being selected.
MainMenuInput_Cursor 60092 RRA Jump to MainMenuInput_Sinclair if "3" was not pressed.
60093 JR NC,MainMenuInput_Sinclair
60095 LD A,3 Jump back to Debounce_Loop if this menu item is already selected.
60097 CP (HL)
60098 JR Z,Debounce_Loop
60100 CALL ClearSelectedMenuItem Call ClearSelectedMenuItem.
60103 LD IX,22787 Set the screen position for this option in IX.
60107 LD DE,60318 Set the address of the input control routine for this option in DE (InputHandler_Cursor).
60110 JR UpdateMenuSelection Jump to UpdateMenuSelection.
Handle "SINCLAIR" being selected.
MainMenuInput_Sinclair 60112 RRA Jump to MainMenuInput_StartGame if "4" was not pressed.
60113 JR NC,MainMenuInput_StartGame
60115 LD A,4 Jump back to Debounce_Loop if this menu item is already selected.
60117 CP (HL)
60118 JR Z,Debounce_Loop
60120 CALL ClearSelectedMenuItem Call ClearSelectedMenuItem.
60123 LD IX,22883 Set the screen position for this option in IX.
60127 LD DE,60365 Set the address of the input control routine for this option in DE (InputHandler_Sinclair).
Update menu selection.
UpdateMenuSelection 60130 LD (HL),A Write the selected menu item to *SelectedMenuItem.
60131 LD (60214),DE Write the address of the input control routine to *Pointer_InputControl.
Point to selected menu item.
HighlightSelectedMenuItem 60135 LD (IX+0),69 Write INK: CYAN, PAPER: BLACK (BRIGHT) to:
Offset Position
*IX+0 Top-left
*IX+1 Top-right
60139 LD (IX+1),69
60143 LD (IX+32),5 Write INK: CYAN, PAPER: BLACK to:
Offset Position
*IX+32 Bottom-left
*IX+33 Bottom-right
60147 LD (IX+33),5
60151 LD (55415),IX Write IX to SelectedMenuItem_ScreenPosition.
60155 JR Debounce_Loop Jump to Debounce_Loop.
Clear previous selected menu item.
ClearSelectedMenuItem 60157 LD (IX+0),0 Write INK: BLACK, PAPER: BLACK to:
Offset Position
*IX+0 Top-left
*IX+1 Top-right
*IX+32 Bottom-left
*IX+33 Bottom-right
60161 LD (IX+1),0
60165 LD (IX+32),0
60169 LD (IX+33),0
60173 RET Return.
Note; there's no need for the "not pressed" check, as there are only five options.
Handle "START GAME" being selected.
good-luck
Uncover the "Good Luck" messaging (it's already present, just black on black).
MainMenuInput_StartGame 60174 LD HL,23094 HL=23094 (attribute buffer location).
60177 LD DE,32 DE=0032.
60180 LD B,4 Set a counter in B for the number of rows to process.
GoodLuck_OuterLoop 60182 PUSH BC Stash the row counter on the stack.
60183 LD B,8 Set a counter in B for the width of the messaging.
60185 PUSH HL Stash the starting position in the attribute buffer on the stack.
GoodLuck_InnerLoop 60186 LD (HL),71 Write INK: WHITE, PAPER: BLACK (BRIGHT) to *HL.
60188 INC HL Increment attribute buffer screen position by one.
60189 DJNZ GoodLuck_InnerLoop Decrease width counter by one and loop back to GoodLuck_InnerLoop until all the width has been coloured.
60191 POP HL Restore the attribute buffer starting position from the stack.
60192 ADD HL,DE HL+=0032 (move down one row).
60193 POP BC Restore the row counter from the stack.
60194 DJNZ GoodLuck_OuterLoop Decrease the row counter by one and loop back to GoodLuck_OuterLoop until the row counter is zero.
60196 LD HL,60217 Write 1 to 60217.
60199 LD (HL),1
60201 PUSH HL Stash 60217 on the stack.
60202 LD HL,60218 HL=60218.
60205 LD B,14 B=14.
60207 CALL 61258 Call 61258.
60210 POP HL Restore HL from the stack.
60211 LD (HL),0 Write 0 to *HL.
60213 RET Return.
Prev: 59951 Up: Map Next: 60214