![]() |
Routines |
| Prev: EC8E | Up: Map | Next: ED35 |
|
Used by the routine at InitialiseGame.
|
||||
| CheckPassword | ECAB | LD HL,$0A23 | Write 0A23 to *REPDEL/*REPPER. | |
| ECAE | LD ($5C09),HL | |||
| ECB1 | CALL ClearScreen | Call ClearScreen. | ||
|
Set the attributes for the code entry messaging.
|
||||
| ECB4 | LD HL,$5900 | HL=5900 (attribute buffer location). | ||
| ECB7 | LD B,$40 | B=40 (counter; two full rows). | ||
| CheckPassword_GreenLoop | ECB9 | LD (HL),$04 | Write 04 (INK: GREEN, PAPER: BLACK ) to *HL. | |
| ECBB | INC L | Increment L by one. | ||
| ECBC | DJNZ CheckPassword_GreenLoop | Decrease counter by one and loop back to CheckPassword_GreenLoop until counter is zero. | ||
|
Print "KEY IN 1ST CHARACTER OF CODE" to the screen.
|
||||
| ECBE | EXX | Switch to the shadow registers. | ||
| ECBF | LD DE,$4800 | DE'=4800 (screen buffer location). | ||
| ECC2 | EXX | Switch back to the normal registers. | ||
| ECC3 | LD B,$40 | B=40 (counter; two full rows). | ||
| ECC5 | LD HL,$EE14 | HL=Messaging_CodeEntry. | ||
| ECC8 | CALL Print_Loop | Call Print_Loop. | ||
| ECCB | CALL PlayerTypedInput | Call PlayerTypedInput. | ||
| ECCE | CP $0D | Jump to CheckPassword_Input if A is not equal to 0D ("ENTER"). | ||
| ECD0 | JR NZ,CheckPassword_Input | |||
|
The player pressed the "ENTER" key to skip entering a code.
|
||||
| StartGame | ECD2 | LD HL,$0101 | Write 01 to *REPDEL and 01 to *REPPER. | |
| ECD5 | LD ($5C09),HL | |||
| ECD8 | JP GameInitialisation | Jump to GameInitialisation. | ||
|
The player is entering a password to access a later level.
|
||||
| CheckPassword_Input | ECDB | LD DE,$782E | DE=LevelProgressPointer. | |
| ECDE | LD (DE),A | Write A to *DE. | ||
| ECDF | EXX | Switch to the shadow registers. | ||
| ECE0 | LD E,$20 | E'=20. | ||
| ECE2 | EXX | Switch back to the normal registers. | ||
| ECE3 | LD HL,$E9A0 | HL=Messaging_Blank. | ||
| ECE6 | LD B,$20 | B=20. | ||
| ECE8 | CALL Print_Loop | Call Print_Loop. | ||
| ECEB | LD B,$04 | B=04. | ||
| ECED | LD HL,$EEB4 | HL=Messaging_CodeLetterPosition. | ||
|
Updates the number suffix in the messaging.
|
||||
| NumberSuffix | ECF0 | EXX | Switch to the shadow registers. | |
| ECF1 | LD E,$09 | E'=09. | ||
| ECF3 | EXX | Switch back to the normal registers. | ||
| ECF4 | PUSH BC | Stash BC on the stack. | ||
| ECF5 | LD B,$03 | B=03 (counter; length of number suffix messaging). | ||
| ECF7 | CALL Print_Loop | Call Print_Loop. | ||
| ECFA | POP BC | Restore BC from the stack. | ||
| ECFB | PUSH HL | Stash HL on the stack. | ||
| ECFC | CALL PlayerTypedInput | Call PlayerTypedInput. | ||
| ECFF | POP HL | Restore HL from the stack. | ||
| ED00 | INC E | Increment E by one. | ||
| ED01 | LD (DE),A | Write A to *DE. | ||
| ED02 | DJNZ NumberSuffix | Decrease counter by one and loop back to NumberSuffix until counter is zero. | ||
|
Test if any of the passwords match the input.
|
||||
| ED04 | LD C,$07 | C=07 (counter; there are seven passwords). | ||
| ED06 | LD HL,$EEC0 | HL=Messaging_Passwords. | ||
| CheckPassword_Loop | ED09 | LD E,$2E | Reset the user input held by DE back to the start of the string (LevelProgressPointer). | |
| ED0B | LD B,$05 | B=05 (counter; length of a password string). | ||
| CheckLetter_Loop | ED0D | LD A,(DE) | Fetch a letter of the user-entered password string. | |
| ED0E | INC E | Increment the user-entered input pointer by one. | ||
| ED0F | CP (HL) | Jump to NextPassword if A is not equal to *HL. | ||
| ED10 | JR NZ,NextPassword | |||
|
There's a match, move onto the next letter of this password.
|
||||
| ED12 | INC HL | Increment HL by one. | ||
| ED13 | DJNZ CheckLetter_Loop | Decrease counter by one and loop back to CheckLetter_Loop until counter is zero. | ||
|
Success! This password is a match!
|
||||
| ED15 | LD A,$07 | A=07 (maximum levels). | ||
|
The position in the password list counts down from 07 so this negatively correlates with the level number.
|
||||
| ED17 | SUB C | A-=C. | ||
| ED18 | LD ($7820),A | Write A to *CurrentLevel. | ||
| ED1B | JR StartGame | Jump to StartGame. | ||
|
This password didn't match, move onto the next one.
|
||||
| NextPassword | ED1D | INC HL | Increment HL by one. | |
| ED1E | DJNZ NextPassword | Decrease counter by one and loop back to NextPassword until counter is zero. | ||
|
Are we out of passwords to check yet?
|
||||
| ED20 | DEC C | Decrease C by one. | ||
| ED21 | JR NZ,CheckPassword_Loop | Jump to CheckPassword_Loop until C is zero. | ||
|
All passwords have been checked, let the player know their password was entered incorrectly.
|
||||
| ED23 | EXX | Switch to the shadow registers. | ||
| ED24 | LD E,$00 | E'=00. | ||
| ED26 | EXX | Switch back to the normal registers. | ||
| ED27 | LD HL,$EE54 | HL=Messaging_Mistake. | ||
| ED2A | LD B,$20 | B=20 (counter; length of mistake string). | ||
| ED2C | CALL Print_Loop | Call Print_Loop. | ||
| ED2F | CALL PauseLong | Debounce using PauseLong. | ||
| ED32 | JP CheckPassword | Jump to CheckPassword. | ||
| Prev: EC8E | Up: Map | Next: ED35 |