Prev: 44283 Up: Map Next: 44598
44338: Handler: User Input
Used by the routine at GameLoop.
Handles keyboard input, tokenises commands and validates the vocabulary.
Reset the screen position to defaults.
Handler_UserInput 44338 CALL SetDefaultScreenPosition Call SetDefaultScreenPosition.
44341 CALL PrintInputPrompt Call PrintInputPrompt.
Initialise the command buffer.
44344 LD HL,42994 HL=CommandBuffer.
44347 LD B,0 Initialise a letter counter in B.
44349 JR UserInput_Next Jump to UserInput_Next.
Main input loop - process each keypress.
UserInput_Loop 44351 INC HL Move to the next byte of the command buffer.
44352 INC B Increment the letter counter by one.
UserInput_Next 44353 CALL Print_Cursor Call Print_Cursor.
44356 CALL GetUserInput Call GetUserInput.
44359 CP 12 Jump to ValidateUserInput if "DELETE" was not pressed.
44361 JR NZ,ValidateUserInput
The user pressed "DELETE".
44363 XOR A Jump back to UserInput_Next if there hasn't been any input yet (nothing to delete).
44364 OR B
44365 JR Z,UserInput_Next
There is input which can be deleted, so action a delete!
44367 EX DE,HL Temporarily stash the command buffer pointer in DE.
Print "SPACE BACKSPACE BACKSPACE SPACE BACKSPACE" to move the current print position on the screen to the previous character, and to delete the character present using a space.
44368 LD HL,44230 HL=Messaging_SpaceBackspaceBackspaceSpaceBackspace.
44371 CALL PrintString Call PrintString.
Adjust the command buffer position and letter counter.
44374 EX DE,HL Restore the command buffer pointer from DE.
44375 DEC HL Decrease the command buffer pointer by one.
44376 DEC B Decrease the letter counter by one.
44377 JR UserInput_Next Jump to UserInput_Next.
Check which key the user pressed:
ValidateUserInput 44379 LD C,A Jump to UserInput_WriteKeypress if "ENTER" was pressed.
44380 CP 13
44382 JR Z,UserInput_WriteKeypress
44384 CP 32 If the keypress was any other control key (the value being under 32 ASCII "SPACE"), it's not valid input so jump back to UserInput_Next.
44386 JR C,UserInput_Next
44388 CP 128 If the keypress was higher than 128 it's also not valid input so jump back to UserInput_Next.
44390 JR NC,UserInput_Next
Is the command buffer full?
44392 LD A,B Jump to UserInput_Next if the letter counter is 49 (so the buffer is full).
44393 CP 49
44395 JR Z,UserInput_Next
Writes the keypress into the command buffer and print it to the screen.
UserInput_WriteKeypress 44397 LD A,C Write the user input key to *HL.
44398 LD (HL),A
44399 CALL Print_UserInputToScreen Call Print_UserInputToScreen.
Did the user press "ENTER"?
44402 LD A,C Jump to UserInput_Loop if "ENTER" was not pressed.
44403 CP 13
44405 JR NZ,UserInput_Loop
The player pressed "ENTER" so begin to process the user input.
Clear down the user input tokens.
44407 LD HL,43044 HL=UserInput_Token_1.
44410 LD B,10 Set a counter in B for all 10 user input tokens.
EmptyUserInputTokens_Loop 44412 LD (HL),255 Write a termination byte (255) to *HL.
44414 INC HL Increment HL by one.
44415 DJNZ EmptyUserInputTokens_Loop Decrease the user input tokens counter by one and loop back to EmptyUserInputTokens_Loop until all the tokens have been set to termination bytes (255).
Set up pointers for the command buffer, the user input tokens and the count of the number of user input tokens.
44417 LD HL,42994 HL=CommandBuffer.
44420 LD IX,43044 IX=UserInput_Token_1.
44424 LD C,10 Set a counter in C for the 10 user input tokens.
44426 JR EmptyFourLetterBuffer Jump to EmptyFourLetterBuffer.
What's been entered isn't parsable.
Print "I don't understand.".
Response_NotUnderstood 44428 LD HL,43087 HL=Messaging_IDontUnderstand.
44431 CALL PrintStringAndNewline Call PrintStringAndNewline.
44434 JP Handler_UserInput Jump to Handler_UserInput.
Process found word into user input token.
ProcessFoundWord 44437 PUSH HL Stash the command buffer pointer, DE and user input tokens counter on the stack.
44438 PUSH DE
44439 PUSH BC
44440 LD HL,(44226) HL=*TempStore_CommandBufferPointer.
44443 LD DE,43055 DE=FourLetterBuffer.
Ensure that the length is not more than 4.
44446 LD BC,4 BC=0004.
44449 LD A,(44228) Jump to CopyWordToBuffer if *TempStore_CommandBufferCount is greater than or equal to 4.
44452 CP C
44453 JR NC,CopyWordToBuffer
The length is less than 4 so no need to copy 4 bytes.
44455 LD C,A Copy the actual length of the word into C.
Copy the word (up to 4 characters in length) into the four letter buffer.
CopyWordToBuffer 44456 LDIR Copy the "up-to-4" letters from the command buffer into the four-letter buffer.
44458 POP BC Restore the user input token counter, DE and command buffer pointer from the stack.
44459 POP DE
44460 POP HL
44461 PUSH HL Stash the command buffer pointer back on the stack.
Stash the vocabulary pointer for a separate check...
44462 LD HL,(42950) Stash *Pointer_Vocabulary on the stack.
44465 PUSH HL
Ignore any usage of "THE" - this is a very good idea! If the player enters: "EXAMINE THE SKULL", this ensures it's evaluated in the exact same way as "EXAMINE SKULL" (or really, "EXAM SKUL").
44466 LD HL,42599 Write Table_Vocabulary_The to *Pointer_Vocabulary.
44469 LD (42950),HL
44472 CALL Handler_MatchItem Call Handler_MatchItem.
Do nothing with with this match - just restore the vocabulary pointer from the stack.
44475 POP HL Restore *Pointer_Vocabulary from the stack and write it back to *Pointer_Vocabulary.
44476 LD (42950),HL
44479 POP HL Restore HL from the stack.
44480 JR C,EmptyFourLetterBuffer Jump to EmptyFourLetterBuffer if "THE" was successfully found.
44482 CALL Handler_MatchItem Call Handler_MatchItem.
44485 JR C,StoreTokenAndContinue Jump to StoreTokenAndContinue if an item was successfully found.
Nothing matched ... Inform the player.
Print "I don't know the word:-".
44487 LD HL,43107 HL=Messaging_IDontKnowTheWord.
44490 CALL PrintStringAndNewline Call PrintStringAndNewline.
Print a double quote character: """.
44493 LD A,34 Call PrintCharacter to print a double quote character (ASCII 34).
44495 CALL PrintCharacter
44498 LD HL,(44228) HL=*TempStore_CommandBufferCount.
44501 LD DE,(44226) HL+=*TempStore_CommandBufferPointer.
44505 ADD HL,DE
44506 LD (HL),255 Write 255 to *HL.
44508 EX DE,HL Exchange the DE and HL registers.
44509 CALL PrintString Call PrintString.
Print a double quote character: """.
44512 LD A,34 Call PrintCharacter to print another double quote character (ASCII 34).
44514 CALL PrintCharacter
Print ".".
44517 LD HL,43541 HL=Messaging_FullStop.
44520 CALL PrintStringAndNewline Call PrintStringAndNewline.
44523 JP Handler_UserInput Jump to Handler_UserInput.
The word in the four-letter buffer was matched!
Store the found token and check if we can continue parsing.
StoreTokenAndContinue 44526 LD (IX+0),A Write the token to the current token slot.
44529 INC IX Move to the next token slot.
44531 DEC C Decrease the token counter by one.
44532 JR Z,CheckVerbToken Jump to CheckVerbToken if all token slots are filled.
Token matching only uses four letters of every word so a buffer is used for processing.
Start by clearing the buffer.
EmptyFourLetterBuffer 44534 PUSH HL Stash the command buffer pointer and user input tokens counter on the stack.
44535 PUSH BC
44536 LD HL,43055 Load FourLetterBuffer into HL.
44539 LD B,4 Set a counter in B for the 4 letters in the buffer.
EmptyFourLetterBuffer_Loop 44541 LD (HL),32 Write ASCII "SPACE" (32) to *HL.
44543 INC HL Increment HL by one.
44544 DJNZ EmptyFourLetterBuffer_Loop Decrease the letter buffer counter by one and loop back to EmptyFourLetterBuffer_Loop until all four letters have been cleared.
44546 POP BC Restore the user input tokens counter and command buffer pointer from the stack.
44547 POP HL
44548 PUSH DE Stash DE on the stack.
44549 JR FindWordStart Jump to FindWordStart.
Skip delimiter characters to find the next word.
SkipDelimiters 44551 INC HL Move to the next byte of the command buffer.
FindWordStart 44552 LD A,(HL) Fetch a character from the command buffer.
44553 CP 13 Jump to EndWordParsing if the character is "ENTER" (ASCII 13).
44555 JR Z,EndWordParsing
44557 CALL IsDelimiter Call IsDelimiter.
44560 JR Z,SkipDelimiters Jump to SkipDelimiters if the character is a delimiter.
The character is not a delimiter.
44562 LD (44226),HL Store the starting address of this new word in *TempStore_CommandBufferPointer.
44565 LD DE,0 Initialise DE to 0000 to count the number of letters in the word.
Just keep looping and moving across the command buffer until we hit a delimiter or an "ENTER" character.
CountWordLength 44568 INC HL Move to the next byte of the command buffer.
44569 INC DE Increment the letter counter by one.
44570 LD A,(HL) Fetch a character from the command buffer.
44571 CP 13 Jump to StoreWordLength if the character is "ENTER" (ASCII 13).
44573 JR Z,StoreWordLength
44575 CALL IsDelimiter Call IsDelimiter.
44578 JR NZ,CountWordLength Jump to CountWordLength if the character was not a delimiter.
This is the end of the word, so store the word length.
StoreWordLength 44580 LD (44228),DE Write the letter counter to *TempStore_CommandBufferCount.
44584 SCF Set the carry flag to indicate that a word was successfully found.
EndWordParsing 44585 POP DE Restore DE from the stack.
44586 JP C,ProcessFoundWord Jump to ProcessFoundWord if a word was found.
Check to see if any of the user input tokens have been populated, and if not, print "I don't understand.".
CheckVerbToken 44589 LD A,(43044) Jump to Response_NotUnderstood if *UserInput_Token_1 hold the terminator byte (255).
44592 CP 255
44594 JP Z,Response_NotUnderstood
44597 RET Return.
View the equivalent code in The Jewels Of Babylon.
Prev: 44283 Up: Map Next: 44598