; LAST UPDATE: 16.02.2025 savelij
PC_KEY_X EQU 1 ; координата вывода рамки
PC_KEY_Y EQU 5 ; координата вывода рамки
PRT_PCKEY_X EQU 16
PRT_PCKEY_Y EQU 22
PR_COL EQU %00111000
UPR_COL EQU %01000100
PC_KEYS_TEST DI
LD A,%01000010
CALL CLEAR_TXTSCR
CALL TXTMODE_ON
LD H,CMOS.BYTE_00
CALL READCMOS
AND CMOS_ED.M_TYPE_FONT
LD (TYPEFONT),A
LD DE,PC_KEY_X*0x100+PC_KEY_Y
LD BC,0x4E10
CALL RAMKA4TXTSCR
LD HL,PC_KEYS
CALL PRT4TXTMODE
LD DE,PRT_PCKEY_X*0x100+PRT_PCKEY_Y
CALL PRINT_EMPTY
LD HL,TXT4TESTERPC
CALL PRT4TXTMODE
CALL SYSTEM_KEYS
LD HL,0xC000
LD DE,0xC001
LD BC,0xFF
LD (HL),L
LDIR
PKT_05 LD H,CMOS.REG_C
CALL READCMOS ; прочитали регистр CMOS
SET CMOSREG.B_B_RW_DSE,L ; бит 0=1 сброс буфера клавиатуры
CALL WRITECMOS ; записали обратно
LD HL,0xF002
CALL WRITECMOS ; включили доступ к буферу клавиатуры
LD DE,PRT_PCKEY_X*0x100+PRT_PCKEY_Y
LD B,0
PKT_04 EI
HALT
DI
CALL EXIT_ALT_F4
JR NZ,EXIT_TESTER
CALL EXIT_LCTRL_X
JR NZ,EXIT_TESTER
LD H,CMOS.READ_PS2
CALL READCMOS ; чтение байта из буфера клавиатуры
AND A
JR Z,PKT_04 ; если ноль то ждем
INC A
JR Z,PKT_05 ; если ff то инитим лог
LD A,L
CP 0xE0
JR NZ,PKT_06
SET 7,B ; нажата кнопка с доп кодом
JR PKT_0D
PKT_06 CP 0xF0
JR NZ,PKT_07
SET 6,B ; отпущена клавиша
JR PKT_0D
PKT_07 CP 0x58
CALL Z,CAPSLOCKLED
LD H,0xC0
LD C,1 ; нажата кнопка
BIT 7,B
JR Z,PKT_0C
LD C,2 ; нажата кнопка с доп кодом
LD A,0xE0
CALL PRTT_A_
LD A,","
CALL PRTSYMTXTMODE
PKT_0C BIT 6,B
JR Z,PKT_08
LD C,3 ; отпущена кнопка
LD A,0xF0
CALL PRTT_A_
LD A,","
CALL PRTSYMTXTMODE
PKT_08 LD (HL),C
LD A,L
CALL PRTT_A_
CALL DRAW_COLOR
LD A,3
LD B,0
SUB C
JR NZ,PKT_00
LD H,0xC0
LD (HL),B
PKT_00 CALL PRINT_EMPTY ; печать пустой строки
PKT_0D LD DE,PRT_PCKEY_X*0x100+PRT_PCKEY_Y
JR PKT_04
CAPSLOCKLED LD A,B
AND 0xC0
RET NZ
PUSH HL
LD H,CMOS.REG_C
CALL READCMOS
LD A,CMOSREG.M_B_RW_24_12
XOR L
LD L,A
CALL WRITECMOS
POP HL
RET
EXIT_TESTER CALL TXTMODE_OFF
LD A,0x10
CALL SET_7FFD
JP RESTART
; выход по ALT+F4
EXIT_ALT_F4 LD HL,0xC011
LD A,(HL)
AND A
RET Z
LD L,0x0C
LD A,(HL)
AND A
RET
; выход по LEFT CONTROL+X
EXIT_LCTRL_X LD HL,0xC014
LD A,(HL)
AND A
RET Z
LD L,0x22
LD A,(HL)
AND A
RET
; рисование цветного квадратика нажатой или отпущеной кнопки
DRAW_COLOR PUSH BC
PUSH DE
PUSH HL
BIT 7,B
LD DE,TABL_PR_COL ; таблица основных кодов
JR Z,DRAWC1
LD DE,EXTTBL_PR_COL ; таблица кодов с 0xE0
DRAWC1 LD B,(HL) ; взяли код кнопки
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,DE
LD D,(HL) ; координата X
INC D
INC D
INC HL
LD E,(HL) ; координата Y
INC E
INC HL
LD C,(HL) ; высота
INC HL
LD A,C
OR (HL)
JR Z,DRAWC3
LD A,B
CP 3
LD A,PR_COL ; цвет нажатой кнопки
JR NZ,DRAWC2
LD A,UPR_COL ; цвет отпущеной кнопки
DRAWC2 LD B,(HL) ; ширина
DEC B
INC B
CALL NZ,COL_KVAD ; рисовать цветной квадрат
DRAWC3 POP HL
POP DE
POP BC
RET
PRINT_EMPTY PUSH BC
LD B,0x10
PRINT_EMPTY1 LD A," "
CALL PRTSYMTXTMODE
DJNZ PRINT_EMPTY1
POP BC
RET
PRT4TXTMODE LD A,(HL)
INC HL
AND A
RET Z
CALL PRTSYM4TXTMOD
JR PRT4TXTMODE
PRTSYM4TXTMOD CP 0x20
JP NC,PRTSYMTXTMODE
CP 0x16
RET NZ
LD E,(HL)
INC HL
LD D,(HL)
INC HL
RET
SYSTEM_KEYS LD DE,(PC_KEY_X+0x2E)*0x100+PC_KEY_Y+1
LD BC,0x1203
LD A,%01000011
COL_KVAD PUSH DE
PUSH BC
COL_KVAD2 PUSH DE
PUSH BC
COL_KVAD1 CALL SET_COL
DJNZ COL_KVAD1
POP BC
POP DE
INC E
DEC C
JR NZ,COL_KVAD2
POP BC
POP DE
RET
SET_COL PUSH DE
PUSH BC
PUSH AF
LD A,0x1B
CALL SET_7FFD
LD L,E
LD A,D
LD H,0
LD D,H
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD E,A
SRL E
ADD HL,DE
AND 1
RRCA
RRCA
RRCA
OR 0xC1
LD D,A
LD E,0xC0
ADD HL,DE
POP AF
PUSH AF
LD (HL),A
LD A,0x1F
CALL SET_7FFD
POP AF
POP BC
POP DE
INC D
RET
; X,Y,V,H
TABL_PR_COL DB 4 DUP 0 ; 00
DB PC_KEY_X+32,PC_KEY_Y,3,4 ; 01 F9
DB 4 DUP 0 ; 02
DB PC_KEY_X+19,PC_KEY_Y,3,4 ; 03 F5
DB PC_KEY_X+12,PC_KEY_Y,3,4 ; 04 F3
DB PC_KEY_X+6,PC_KEY_Y,3,4 ; 05 F1
DB PC_KEY_X+9,PC_KEY_Y,3,4 ; 06 F2
DB PC_KEY_X+43,PC_KEY_Y,3,5 ; 07 F12
DB 4 DUP 0 ; 08
DB PC_KEY_X+35,PC_KEY_Y,3,5 ; 09 F10
DB PC_KEY_X+28,PC_KEY_Y,3,4 ; 0A F8
DB PC_KEY_X+22,PC_KEY_Y,3,4 ; 0B F6
DB PC_KEY_X+15,PC_KEY_Y,3,4 ; 0C F4
DB PC_KEY_X,PC_KEY_Y+5,3,6 ; 0D TAB
DB PC_KEY_X,PC_KEY_Y+3,3,4 ; 0E `
DB 8 DUP 0 ; 0F
DB PC_KEY_X+11,PC_KEY_Y+11,3,5 ; 11 L ALT
DB PC_KEY_X,PC_KEY_Y+9,3,10 ; 12 L SHIFT
DB 4 DUP 0 ; 13
DB PC_KEY_X,PC_KEY_Y+11,3,8 ; 14 L CTRL
DB PC_KEY_X+5,PC_KEY_Y+5,3,4 ; 15 Q
DB PC_KEY_X+3,PC_KEY_Y+3,3,4 ; 16 1
DB 12 DUP 0 ; 17
DB PC_KEY_X+9,PC_KEY_Y+9,3,4 ; 1A Z
DB PC_KEY_X+10,PC_KEY_Y+7,3,4 ; 1B S
DB PC_KEY_X+7,PC_KEY_Y+7,3,4 ; 1C A
DB PC_KEY_X+8,PC_KEY_Y+5,3,4 ; 1D W
DB PC_KEY_X+6,PC_KEY_Y+3,3,4 ; 1E 2
DB 8 DUP 0 ; 1F
DB PC_KEY_X+15,PC_KEY_Y+9,3,4 ; 21 C
DB PC_KEY_X+12,PC_KEY_Y+9,3,4 ; 22 X
DB PC_KEY_X+13,PC_KEY_Y+7,3,4 ; 23 D
DB PC_KEY_X+11,PC_KEY_Y+5,3,4 ; 24 E
DB PC_KEY_X+12,PC_KEY_Y+3,3,4 ; 25 4
DB PC_KEY_X+9,PC_KEY_Y+3,3,4 ; 26 3
DB 8 DUP 0 ; 27
DB PC_KEY_X+15,PC_KEY_Y+11,3,13 ; 29 SPACE
DB PC_KEY_X+18,PC_KEY_Y+9,3,4 ; 2A V
DB PC_KEY_X+16,PC_KEY_Y+7,3,4 ; 2B F
DB PC_KEY_X+17,PC_KEY_Y+5,3,4 ; 2C T
DB PC_KEY_X+14,PC_KEY_Y+5,3,4 ; 2D R
DB PC_KEY_X+15,PC_KEY_Y+3,3,4 ; 2E 5
DB 8 DUP 0 ; 2F
DB PC_KEY_X+24,PC_KEY_Y+9,3,4 ; 31 N
DB PC_KEY_X+21,PC_KEY_Y+9,3,4 ; 32 B
DB PC_KEY_X+22,PC_KEY_Y+7,3,4 ; 33 H
DB PC_KEY_X+19,PC_KEY_Y+7,3,4 ; 34 G
DB PC_KEY_X+20,PC_KEY_Y+5,3,4 ; 35 Y
DB PC_KEY_X+18,PC_KEY_Y+3,3,4 ; 36 6
DB 12 DUP 0 ; 37
DB PC_KEY_X+27,PC_KEY_Y+9,3,4 ; 3A M
DB PC_KEY_X+25,PC_KEY_Y+7,3,4 ; 3B J
DB PC_KEY_X+23,PC_KEY_Y+5,3,4 ; 3C U
DB PC_KEY_X+21,PC_KEY_Y+3,3,4 ; 3D 7
DB PC_KEY_X+24,PC_KEY_Y+3,3,4 ; 3E 8
DB 8 DUP 0 ; 3F
DB PC_KEY_X+30,PC_KEY_Y+9,3,4 ; 41 ,
DB PC_KEY_X+28,PC_KEY_Y+7,3,4 ; 42 K
DB PC_KEY_X+26,PC_KEY_Y+5,3,4 ; 43 I
DB PC_KEY_X+29,PC_KEY_Y+5,3,4 ; 44 O
DB PC_KEY_X+30,PC_KEY_Y+3,3,4 ; 45 0
DB PC_KEY_X+27,PC_KEY_Y+3,3,4 ; 46 9
DB 8 DUP 0 ; 47
DB PC_KEY_X+33,PC_KEY_Y+9,3,4 ; 49 .
DB PC_KEY_X+36,PC_KEY_Y+9,3,4 ; 4A /
DB PC_KEY_X+31,PC_KEY_Y+7,3,4 ; 4B L
DB PC_KEY_X+34,PC_KEY_Y+7,3,4 ; 4C ;
DB PC_KEY_X+32,PC_KEY_Y+5,3,4 ; 4D P
DB PC_KEY_X+33,PC_KEY_Y+3,3,4 ; 4E -
DB 12 DUP 0 ; 4F
DB PC_KEY_X+37,PC_KEY_Y+7,3,5 ; 52 '
DB 4 DUP 0 ; 53
DB PC_KEY_X+35,PC_KEY_Y+5,3,4 ; 54 [
DB PC_KEY_X+36,PC_KEY_Y+3,3,4 ; 55 =
DB 8 DUP 0 ; 56
DB PC_KEY_X,PC_KEY_Y+7,3,8 ; 58 CAPS LOCK
DB PC_KEY_X+39,PC_KEY_Y+9,3,9 ; 59 R SHIFT
DB PC_KEY_X+41,PC_KEY_Y+5,5,7 ; 5A ENTER
DB PC_KEY_X+38,PC_KEY_Y+5,3,4 ; 5B ]
DB 4 DUP 0 ; 5C
DB PC_KEY_X+39,PC_KEY_Y+3,3,4 ; 5D BACK /
DB 32 DUP 0 ; 5E
DB PC_KEY_X+42,PC_KEY_Y+3,3,6 ; 66 BACKSPACE
DB 8 DUP 0 ; 67
DB PC_KEY_X+63,PC_KEY_Y+9,3,4 ; 69 KP 1
DB 4 DUP 0 ; 6A
DB PC_KEY_X+63,PC_KEY_Y+7,3,4 ; 6B KP 4
DB PC_KEY_X+63,PC_KEY_Y+5,3,4 ; 6C KP 7
DB 12 DUP 0 ; 6D
DB PC_KEY_X+63,PC_KEY_Y+11,3,7 ; 70 KP 0
DB PC_KEY_X+69,PC_KEY_Y+11,3,4 ; 71 KP .
DB PC_KEY_X+66,PC_KEY_Y+9,3,4 ; 72 KP 2
DB PC_KEY_X+66,PC_KEY_Y+7,3,4 ; 73 KP 5
DB PC_KEY_X+69,PC_KEY_Y+7,3,4 ; 74 KP 6
DB PC_KEY_X+66,PC_KEY_Y+5,3,4 ; 75 KP 8
DB PC_KEY_X,PC_KEY_Y,3,5 ; 76 ESC
DB PC_KEY_X+63,PC_KEY_Y+3,3,4 ; 77 NUM LOCK
DB PC_KEY_X+39,PC_KEY_Y,3,5 ; 78 F11
DB PC_KEY_X+72,PC_KEY_Y+5,5,4 ; 79 KP +
DB PC_KEY_X+69,PC_KEY_Y+9,3,4 ; 7A KP 3
DB PC_KEY_X+72,PC_KEY_Y+3,3,4 ; 7B KP -
DB PC_KEY_X+69,PC_KEY_Y+3,3,4 ; 7C KP *
DB PC_KEY_X+69,PC_KEY_Y+5,3,4 ; 7D KP 9
DB PC_KEY_X+53,PC_KEY_Y,3,5 ; 7E SCROLL
DB 16 DUP 0 ; 7F
DB PC_KEY_X+25,PC_KEY_Y,3,4 ; 83 F7
EXTTBL_PR_COL DB 68 DUP 0 ; 00
DB PC_KEY_X+27,PC_KEY_Y+11,3,5 ; 11 R ALT
DB 8 DUP 0 ; 12
DB PC_KEY_X+40,PC_KEY_Y+11,3,8 ; 14 R CTRL
DB 40 DUP 0 ; 15
DB PC_KEY_X+7,PC_KEY_Y+11,3,5 ; 1F L WIN
DB 28 DUP 0 ; 20
DB PC_KEY_X+31,PC_KEY_Y+11,3,5 ; 27 R WIN
DB 28 DUP 0 ; 28
DB PC_KEY_X+35,PC_KEY_Y+11,3,6 ; 2F MENU
DB 104 DUP 0 ; 30
DB PC_KEY_X+66,PC_KEY_Y+3,3,4 ; 4A KP /
DB 60 DUP 0 ; 4B
DB PC_KEY_X+72,PC_KEY_Y+9,5,4 ; 5A KP ENTER
DB 56 DUP 0 ; 5B
DB PC_KEY_X+53,PC_KEY_Y+5,3,5 ; 69 END
DB 4 DUP 0 ; 6A
DB PC_KEY_X+49,PC_KEY_Y+11,3,5 ; 6B LEFT ARROW
DB PC_KEY_X+53,PC_KEY_Y+3,3,5 ; 6C HOME
DB 12 DUP 0 ; 6D
DB PC_KEY_X+49,PC_KEY_Y+3,3,5 ; 70 INSERT
DB PC_KEY_X+49,PC_KEY_Y+5,3,5 ; 71 DELETE
DB PC_KEY_X+53,PC_KEY_Y+11,3,5 ; 72 DOWN ARROW
DB 4 DUP 0 ; 73
DB PC_KEY_X+57,PC_KEY_Y+11,3,5 ; 74 RIGHT ARROW
DB PC_KEY_X+53,PC_KEY_Y+9,3,5 ; 75 UP ARROW
DB 16 DUP 0 ; 76
DB PC_KEY_X+57,PC_KEY_Y+5,3,5 ; 7A PAGE DOWN
DB 8 DUP 0 ; 7B
DB PC_KEY_X+57,PC_KEY_Y+3,3,5 ; 7D PAGE UP
DB 24 DUP 0 ; 7E
;01234567890123456789012345678901234567890123456789012345678901234567890123456789
;┌───┐ ┌──┬──┬──┬──┐┌──┬──┬──┬──┐┌──┬───┬───┬───┐ ┌───┬───┬───┐ 00
;│ESC│ │F1│F2│F3│F4││F5│F6│F7│F8││F9│F10│F11│F12│ │PRT│SCL│PAU│ 01
;└───┘ └──┴──┴──┴──┘└──┴──┴──┴──┘└──┴───┴───┴───┘ └───┴───┴───┘ 02
;┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬────┐ ┌───┬───┬───┐ ┌──┬──┬──┬──┐ 03
;│ ~│ 1│ 2│ 3│ 4│ 5│ 6│ 7│ 8│ 9│ 0│ -│ =│ |│ BS │ │INS│HOM│PUp│ │NM│ /│ *│ -│ 04
;├──┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴────┤ ├───┼───┼───┤ ├──┼──┼──┼──┤ 05
;│ TAB│ Q│ W│ E│ R│ T│ Y│ U│ I│ O│ P│ [│ ]│ │ │DEL│END│PDn│ │ 7│ 8│ 9│ │ 06
;├────┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴──┤ENTER│ └───┴───┴───┘ ├──┼──┼──┤ +│ 07
;│CSLOCK│ A│ S│ D│ F│ G│ H│ J│ K│ L│ ;│ ' │ │ │ 4│ 5│ 6│ │ 08
;├──────┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬─┴─────┤ ┌───┐ ├──┼──┼──┼──┤ 09
;│ SHIFT │ Z│ X│ C│ V│ B│ N│ M│ ,│ .│ /│ SHIFT │ │ UP│ │ 1│ 2│ 3│ E│ 0A
;├──────┬─┴─┬┴──┼──┴──┴──┴──┼──┴┬─┴─┬┴──┴┬──────┤ ┌───┼───┼───┐ ├──┴──┼──┤ N│ 0B
;│ CTRL │WIN│ALT│ SPACE │ALT│WIN│MENU│ CTRL │ │ LF│DWN│RT │ │ 0 │ .│ T│ 0C
;└──────┴───┴───┴───────────┴───┴───┴────┴──────┘ └───┴───┴───┘ └─────┴──┴──┘ 0D
;01234567890123456789012345678901234567890123456789012345678901234567890123456789
PC_KEYS DB 0x16,PC_KEY_Y+1,PC_KEY_X+1, "┌───┐ ┌──┬──┬──┬──┐┌──┬──┬──┬──┐┌──┬───┬───┬───┐ ┌───┬───┬───┐"
DB 0x16,PC_KEY_Y+2,PC_KEY_X+1, "│ESC│ │F1│F2│F3│F4││F5│F6│F7│F8││F9│F10│F11│F12│ │PRT│SCL│PAU│"
DB 0x16,PC_KEY_Y+3,PC_KEY_X+1, "└───┘ └──┴──┴──┴──┘└──┴──┴──┴──┘└──┴───┴───┴───┘ └───┴───┴───┘"
DB 0x16,PC_KEY_Y+4,PC_KEY_X+1, "┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬────┐ ┌───┬───┬───┐ ┌──┬──┬──┬──┐"
DB 0x16,PC_KEY_Y+5,PC_KEY_X+1, "│ ~│ 1│ 2│ 3│ 4│ 5│ 6│ 7│ 8│ 9│ 0│ -│ =│ ",0x5C,"│ BS │ │INS│HOM│PUp│ │NM│ /│ *│ -│"
DB 0x16,PC_KEY_Y+6,PC_KEY_X+1, "├──┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴────┤ ├───┼───┼───┤ ├──┼──┼──┼──┤"
DB 0x16,PC_KEY_Y+7,PC_KEY_X+1, "│ TAB│ Q│ W│ E│ R│ T│ Y│ U│ I│ O│ P│ [│ ]│ │ │DEL│END│PDn│ │ 7│ 8│ 9│ │"
DB 0x16,PC_KEY_Y+8,PC_KEY_X+1, "├────┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴──┤ENTER│ └───┴───┴───┘ ├──┼──┼──┤ +│"
DB 0x16,PC_KEY_Y+9,PC_KEY_X+1, "│CSLOCK│ A│ S│ D│ F│ G│ H│ J│ K│ L│ ;│ ' │ │ │ 4│ 5│ 6│ │"
DB 0x16,PC_KEY_Y+10,PC_KEY_X+1,"├──────┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬┴─┬─┴─────┤ ┌───┐ ├──┼──┼──┼──┤"
DB 0x16,PC_KEY_Y+11,PC_KEY_X+1,"│ SHIFT │ Z│ X│ C│ V│ B│ N│ M│ ,│ .│ /│ SHIFT │ │ UP│ │ 1│ 2│ 3│ E│"
DB 0x16,PC_KEY_Y+12,PC_KEY_X+1,"├──────┬─┴─┬┴──┼──┴──┴──┴──┼──┴┬─┴─┬┴──┴┬──────┤ ┌───┼───┼───┐ ├──┴──┼──┤ N│"
DB 0x16,PC_KEY_Y+13,PC_KEY_X+1,"│ CTRL │WIN│ALT│ SPACE │ALT│WIN│MENU│ CTRL │ │ LF│DWN│RT │ │ 0 │ .│ T│"
DB 0x16,PC_KEY_Y+14,PC_KEY_X+1,"└──────┴───┴───┴───────────┴───┴───┴────┴──────┘ └───┴───┴───┘ └─────┴──┴──┘",0
; 1C A 45 0 04 F3 7D KP 9 1F LGUI
; 32 B 16 1 0C F4 5B ] 14 RCTRL
; 21 C 1E 2 03 F5 4C ; 27 RGUI
; 23 D 26 3 0B F6 52 ' 11 RALT
; 24 E 25 4 83 F7 41 , 2F APPS
; 2B F 2E 5 0A F8 49 . 70 INSERT
; 34 G 36 6 01 F9 4A / 6C HOME
; 33 H 3D 7 09 F10 7D PG UP
; 43 I 3E 8 78 F11 71 DELETE
; 3B J 46 9 07 F12 69 END
; 42 K 0E ` 7E SCROLL 7A PG DN
; 4B L 4E - 54 [ 75 U ARROW
; 3A M 55 = 77 NUM 6B L ARROW
; 31 N 5D \ 7C KP * 72 D ARROW
; 44 O 66 BKSP 7B KP - 74 R ARROW
; 4D P 29 SPACE 79 KP + 4A KP /
; 15 Q 0D TAB 71 KP . 5A KP ENTER
; 2D R 58 CAPS 70 KP 0
; 1B S 12 LSHIFT 69 KP 1
; 2C T 14 LCTRL 72 KP 2
; 3C U 11 LALT 7A KP 3
; 2A V 59 RSHIFT 6B KP 4
; 1D W 5A ENTER 73 KP 5
; 22 X 76 ESC 74 KP 6
; 35 Y 05 F1 6C KP 7
; 1A Z 06 F2 75 KP 8
TXT4TESTERPC DB 0x16,0,31,"PC keyboard tester",0x16,24,(80-(TXT4TESTERPC2-TXT4TESTERPC1))/2
TXT4TESTERPC1 DB "EXIT - press ALT+F4 or Left CTRL+X"
TXT4TESTERPC2 DB 0x16,22,2,"Read codes:",0