diff --git a/src/example/char_in.asm b/src/example/char_in.asm index faa2dd2..51e2f5d 100644 --- a/src/example/char_in.asm +++ b/src/example/char_in.asm @@ -1,13 +1,39 @@ -;Queries the keyboard for input and prints the resulting keycode - ORG 100H ;Tell the assembler to start at addr 0x100 -START: LD HL,GREET ;Load the start addr. of the banner text - LD B,15H ;The length if the string - LD DE,0H ;Start output in the top left corner - CALL 84CDH ;Call str_out -LOOP: CALL 8881H ;Call the char_in - LD DE,16H ;Position cursor in row 0, col 22 - CALL 8468H ;Print the char - JR LOOP ;Retrun to the loop - RET ;End the program -GREET: DB 'Test keyboard input: ' - END ;Mark the end of code for the assembler +;;Queries the keyboard for input and prints the resulting keycode + ORG 100H ;Tell the assembler to start at addr 0x100 +START: LD HL,GREET ;Load the start addr. of the banner text + LD B,15H ;The length of the string + LD DE,0H ;Start output in the top left corner + CALL 84CDH ;Call str_out +LOOP: CALL 8881H ;Call the char_in + JR NC,LOOP ;If no key was pressed, jump back to scan + CP 51H ;Checks if the pressed key was "ON/Break" + RET Z ;If the key was "ON" end the program. + LD HL,BUF ;Load the buffer addess + CALL BTOHEX ;Convert the byte in A into a HEX-string and store it at BUF + LD B,2 ;Set the length of BUF + LD DE,15H ;Position cursor in row 0, col 22 + CALL 84CDH ;Print the Keycode + JR LOOP ;Retrun to the loop + RET ;End the program +;;Convert the contents of A into a hex-string and stores the result in the buffer pointed in HL +BTOHEX: PUSH AF ;Store A onto the stack for later use + LD B,4 ;Init a loop for shifting the register +LP1: SRL A ;Shift the MSN down to the least significant Nibble + DJNZ LP1 ;Shift again, until all 4 bits where shifted. + CALL HEXDGT ;Converts the LSN to hex + INC HL ;Point HL to the next byte in buffer + POP AF ;Retrieve the original A + AND 0FH ;Cut the first digit of the hex no. + CALL HEXDGT ;Call HEXDIGIT again for the second digit. + LD HL,BUF ;Restore the buffer address + RET +;;Converts the least significant nibble in A into a ASCII hex-digit and stores the result +HEXDGT: CP 0AH ;Check if the number is smaller than 10 + JR C,SKIP ;Skip the next instruction, if it is + ADD A,07H ;If the value is >10, we need to skip the chars between '9' and 'A' +SKIP: ADD A,30H ;Converts the number into its ASCII digit + LD (HL),A ;Store the digit in the correct location. + RET +GREET: DB 'Test keyboard input: ' +BUF: DS 2 ;Define a 2 byte buffer to store the keycode in ASCII + END ;Mark the end of code for the assembler diff --git a/src/example/char_in.md b/src/example/char_in.md new file mode 100644 index 0000000..cd4fb8c --- /dev/null +++ b/src/example/char_in.md @@ -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 \ +> Last modified by: Jali + +## 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 +``` diff --git a/src/example/char_out.md b/src/example/char_out.md index b78e9ea..442e682 100644 --- a/src/example/char_out.md +++ b/src/example/char_out.md @@ -1,6 +1,8 @@ # ```char_out``` -> Version: 1.0.20092.1 \ +> Version: 1.0.20096.1 \ +> Created On: Fri 02 Apr 2020 11:44:05 AM CEST \ +> Created By: Sun 05 Apr 2020 12:44:42 AM CEST \ > Created by: Jali \ > Last modified by: Jali