Prev: 62102 Up: Map Next: 62283
62201: Code sheet - set up and evaluate player code input
Clear/reset input area (clear by printing 5 spaces):
62201 LD BC,3603 Line number (B) = 14
Column number (C) = 19
62204 CALL 3545 Call ROM 'CL-SET' routine
HL register pair returned with screen display position to print at (18510)
62207 CALL 62056 Print the following characters on screen. On RETurn from this CALL, continue from 62216
Characters to print - spaces to clear input area:
62210 DEFM " " 5 spaces
62215 DEFB 255 End-of-data byte
Prepare for player input:
62216 LD BC,3603 Line number (B) = 14
Column number (C) = 19
62219 CALL 3545 Call ROM 'CL-SET' routine
HL register pair returned with screen display position to print at
62222 LD B,4 4 digits to enter
62224 LD HL,0 HL not needed for print routine (uses RST 16 instruction and stack pointer to the following data)
62227 CALL 62056 Print the (following) characters on screen
Characters for flashing cursor:
62230 DEFM 18,1," ",18,0,8 ASCII codes for:
- FLASH 1
- " " (SPACE)
- FLASH 0
- CURSOR LEFT
62236 DEFB 255 End-of-data marker
Check player input:
62237 BIT 5,(IY+1) FLAGS (system variable) - bit 5 is set if a key is pressed
62241 JR Z,62237 Keep checking until it's pressed
62243 RES 5,(IY+1) Key pressed - reset bit 5 of FLAGS system variable
62247 LD A,(23560) Get value of LAST-K (last pressed key)
62250 CP 12 Has DELETE been pressed?
62252 JR Z,62201 If so, jump back and reset the player's input (clear the input area)
Evaluate key pressed:
62254 LD C,A Store key value in C register
62255 SUB 48 Is code for key pressed <48 (number 0 = value of 48, the first valid character that can be typed)
62257 JR C,62237 If so, it's not valid - jump back until another key is pressed
62259 CP 10 Is the code for the key press one of the numbers (0-9)?
62261 JR NC,62237 If not, it's not valid - jump back until another key is pressed
A valid key between 0 and 9 has been pressed
62263 LD E,A Store value of key pressed (0-9) in E register
62264 LD A,C Retrieve key code value from C register
62265 RST 16 Print the value on screen
The value to check against is a 2 byte value stored at 61944. Therefore we need to multiple each accumulated figure/digit by 16 before adding the next:
62266 ADD HL,HL HL = HL x2
62267 ADD HL,HL x4
62268 ADD HL,HL x8
62269 ADD HL,HL x16
62270 LD D,0
62272 ADD HL,DE
62273 DJNZ 62227 Decrement the counter in the B register. Continue to check for input until all 4 digits have been entered
We now have the code value in the HL register pair - check it against the correct code:
62275 LD DE,(61944) Get the correct code value
62279 XOR A Clear the carry flag
62280 SBC HL,DE Subtract the correct code from the user-entered code
62282 RET Return to 62292 with zero flag result (Z = correct, NZ = incorrect)
Prev: 62102 Up: Map Next: 62283