Finished keyboard routine example

This commit is contained in:
2020-04-05 01:24:58 +02:00
parent 8dd85c7e2a
commit 27e3ad193d
3 changed files with 128 additions and 14 deletions

86
src/example/char_in.md Normal file
View File

@@ -0,0 +1,86 @@
#```char_in```
> Version: 1.0.20096.1 \
> Created On: Sun 05 Apr 2020 12:42:26 AM CEST \
> Last modified: Sun 05 Apr 2020 01:24:29 AM CEST \
> Created by: Jali <jali@orca-central.de> \
> Last modified by: Jali <jali@orca-central.de>
## About
The ```char_in``` function is one of the built in functions in ROM. It checks, if a key is
currently pressed, and returns the key code in Register A.
## Parameters
The ```char_in``` function is called through addresses 0xBE53 or 0x8881 and takes no
input parameters.
## Return values
It returns the key-code of the pressed key in Register A. If no keypress was detected, A is 0.
To indicate, that a key was pressed the carry-flag is also set. When no keypress was detected,
the carry flag is cleared. This allows for easy checking if a key is pressed.
If more than one key was pressed at a time, A will contain 0x52, or -if SHIFT was addionally
pressed- 0xD2.
## Notes
Every key has a unique keycode, that identifies the key that was pressed.
The only key without a keycode, is the shift key. Of the shift-key is pressed and held with any
other key, the most significant bit is set in A, adding 0x80 to each keycode. The only key
unaffected by this, is the ON/BREAK key, which always has a keycode of 51.
| | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
|--| ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |
|00| -- | OFF | Q | W | E | R | T | Y | U | A | S | D | F | G | H | J |
|10| K | Z | X | C | V | B | N | M | , | CAL | BAS | CAPS | ANS | TAB | SPAC | do |
|20| up | left | righ | CONS | 0 | . | +/- | + | RET | L | ; | DEL | 1 | 2 | 3 | - |
|30| M+ | I | O | INS | 4 | 5 | 6 | * | RM | P | BS | n! | 7 | 8 | 9 | / |
|40| ) | hyp | DEG | y^x | Sqrt | x^2 | ( | 1/x | MDF | 2nd | sin | cos | ln | log | tan | FSE |
|50| CCE | ON | | | | | | | | | | | | | | |
## Example
The folowing example is a simple polling routine. It runs in an endless loop, and
displays the key code, of the last key pressed, as a hex-value. Pressing ON/BREAK
will end the program gracefully.
```ASM
10;;Queries the keyboard for input and prints the resulting keycode
20 ORG 100H ;Tell the assembler to start at addr 0x100
30START: LD HL,GREET ;Load the start addr. of the banner text
40 LD B,15H ;The length of the string
50 LD DE,0H ;Start output in the top left corner
60 CALL 84CDH ;Call str_out
70LOOP: CALL 8881H ;Call the char_in
80 JR NC,LOOP ;If no key was pressed, jump back to scan
90 CP 51H ;Checks if the pressed key was "ON/Break"
100 RET Z ;If the key was "ON" end the program.
110 LD HL,BUF ;Load the buffer addess
120 CALL BTOHEX ;Convert the byte in A into a HEX-string and store it at BUF
130 LD B,2 ;Set the length of BUF
140 LD DE,15H ;Position cursor in row 0, col 22
150 CALL 84CDH ;Print the Keycode
160 JR LOOP ;Retrun to the loop
170 RET ;End the program
180;;Convert the contents of A into a hex-string and stores the result in the buffer pointed in HL
190BTOHEX: PUSH AF ;Store A onto the stack for later use
200 LD B,4 ;Init a loop for shifting the register
210LP1: SRL A ;Shift the MSN down to the least significant Nibble
220 DJNZ LP1 ;Shift again, until all 4 bits where shifted.
230 CALL HEXDGT ;Converts the LSN to hex
240 INC HL ;Point HL to the next byte in buffer
250 POP AF ;Retrieve the original A
260 AND 0FH ;Cut the first digit of the hex no.
270 CALL HEXDGT ;Call HEXDIGIT again for the second digit.
280 LD HL,BUF ;Restore the buffer address
290 RET
300;;Converts the least significant nibble in A into a ASCII hex-digit and stores the result
310HEXDGT: CP 0AH ;Check if the number is smaller than 10
320 JR C,SKIP ;Skip the next instruction, if it is
330 ADD A,07H ;If the value is >10, we need to skip the chars between '9' and 'A'
340SKIP: ADD A,30H ;Converts the number into its ASCII digit
350 LD (HL),A ;Store the digit in the correct location.
360 RET
370GREET: DB 'Test keyboard input: '
380BUF: DS 2 ;Define a 2 byte buffer to store the keycode in ASCII
390 END ;Mark the end of code for the assembler
```