Orion-PRO/Sources/BIOS/kbd.asm
2021-11-11 12:50:05 +03:00

1015 lines
29 KiB
NASM
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; =============================================
; Модуль обслуживания клавиатуры в ROM1
; =============================================
; ---------------------------------------------
;Статус клавиатуры
; ---------------------------------------------
STTS IN A,(0x0)
AND 0x4
JR Z,STTS1
XOR A
OUT (PORT_18_KBD),A
IN A,(PORT_19_KBD)
XOR 0xff
RET Z
LD A,0xff
RET
STTS1
XOR A
OUT (PORT_1A_KBD),A
OUT (PORT_19_KBD),A
IN A,(PORT_18_KBD)
INC A
RET Z
LD A,0xff
OUT (PORT_1A_KBD),A
LD A,0xfc
OUT (PORT_19_KBD),A
NOP
IN A,(PORT_18_KBD)
AND 0xe3
CP 0xe3
JR NZ,LAB_ram_1051
LD A,0x3
OUT (PORT_19_KBD),A
NOP
IN A,(PORT_18_KBD)
INC A
JR NZ,LAB_ram_1051
OUT (PORT_1A_KBD),A
NOP
IN A,(PORT_18_KBD)
INC A
RET Z
LAB_ram_1051
LD A,0xff
RET
; ---------------------------------------------
; Процедура опроса клавиатуры с миганием курсором
; Вход:
; C - режим курсора, старший бит - признак того, что курсор отображается
; DE - счетчик задержки мигания
; Выход:
; A, "CY" - результат INKEY
; ---------------------------------------------
CURINK
CALL INKEY
BIT 0x5,C
RET Z
BIT 0x4,C
RET Z
DEC DE
INC E
DEC E
RET NZ
INC D
DEC D
RET NZ
LD DE,(CURTM)
BIT 0x7,C
JR Z,CURON
CUROFF
RES 0x7,C
PUSH BC
PUSH DE
PUSH HL
PUSH AF
LD A,0x6 ; Получить позицию курсора
CALL TVOUT
LD A,0x3 ; Погасить графический курсор в заданн...
CO1
CALL TVOUT
POP AF
POP HL
POP DE
POP BC
RET
CURON
SET 0x7,C
PUSH BC
PUSH DE
PUSH HL
PUSH AF
LD A,0x6
CALL TVOUT
LD A,0x2
JR CO1
; ---------------------------------------------
; Определение кодировки клавиатуры
; "CY","NZ" - ALT, koi-8
; "NC","Z" - koi-7 n2
; "NC","NZ" - koi-7 n1,0
; ---------------------------------------------
IS_KOI7
LD A,(KBMODE)
AND 0x3
CP 0x2
RET
; ---------------------------------------------
; Определение старого режима клавиатуры
; "NZ" - rk-86 или старый режим ms7007
; "Z" - новый режим ms7007
; ---------------------------------------------
IS_OLD
IN A,(0x0)
AND 0x4
RET NZ
LD A,(KBMODE)
BIT 0x7,A
RET
; ---------------------------------------------
; Ввод символа с клавиатуры
; Выход:
; A - Код нажатой клавиши
; Для формироввания звука "rus/lat" используется процедура
; "SOUND" монитора. она может быть заменена на другую.
; На ее вход подпрограмма "KBRD" подает признак RUS/LAT в регистре A (A=0 - lat, A<>0 - rus).
; В стандартной процедуре SOUND этот признак не используется, параметры звука задаются в регистрах BC, DE.
; Особенности: обеспечивается обработка буфера KBRD.
; ---------------------------------------------
KBRD PUSH BC
PUSH DE
PUSH HL
DB 3EH ;LD A,...
KBRD1 POP AF
CALL RDBUF
LD A,C
JR NC,KBRD3
CALL KBD
PUSH AF
CALL GETKBM
CP 0x3
JR NC,KBRD2
LD B,(HL)
LD A,D
AND 0x3
CP 0x3
JR Z,KBRD2
LD E,A
ADD A,A
ADD A,E
LD E,A
LD D,0x0
LD HL,FUNTAB
ADD HL,DE
LD A,C
CP 0x4
JR Z,KBRD01
CP 0x0A ; упр?
JR NZ,KBRD02
KBRD01 LD A,B
KBRD02 CALL FUNKEY
JR NC,KBRD1
KBRD2 POP AF
KBRD3 POP HL
POP DE
POP BC
RET
; ---------------------------------------------
; Обработка функциональных клавиш
; Вход:
; HL - адрес таблицы ФК
; A - код сканирования
; Выход:
; "CY" - нет в таблице, иначе строка -> в буфер KBRD
; ---------------------------------------------
FUNKEY
LD C,PORT_0A_MEM_CFG
IN B,(C)
PUSH BC
SET SHIFT,B
OUT (C),B
SRL C
IN B,(C)
PUSH BC
LD E,(HL)
INC HL
LD D,(HL)
INC HL
OUTI
EX DE,HL
RES 0x7,H
SET 0x6,H
PUSH HL
CALL SRCKEY
POP HL
CALL NC,STRADR ; HL- адрес строки
CALL NC,BUFSTR
POP BC
OUT (C),B
POP BC
OUT (C),B
RET
; ---------------------------------------------
; Поиск функциональной клавиши в таблице
; Вход:
; A - код сканирования
; HL - адрес начала таблицы
; Выход:
; B = 0,
; "CY" - не найден, иначе A - порядковый номер в таблице
; ---------------------------------------------
SRCKEY
LD B,0x0
LD C,(HL)
SCF
INC C
DEC C
RET Z
INC HL
PUSH BC
CPIR
LD A,C
POP BC
SCF
RET NZ
SUB C
CPL
OR A
RET
; ---------------------------------------------
; Определение адреса строки в таблице
; Вход:
; A - порядковый номер клавиши
; HL - адрес начала таблицы
; B = 0
; Выход:
; HL - адрес начала строки
; "NC"- всегда
; ---------------------------------------------
STRADR
LD C,(HL)
INC HL
ADD HL,BC
INC A
SA1
DEC A
OR A
RET Z
LD C,(HL)
INC HL
ADD HL,BC
JR SA1
; ---------------------------------------------
; Запись строки в буфер клавиатуры
; Вход:
; HL - адрес начала строки
; Выход:
; "CY" - строка пуста, иначе строка заносится в буфер
; ---------------------------------------------
BUFSTR
LD B,(HL)
SCF
INC B
DEC B
RET Z
BS1
INC HL
LD C,(HL)
CALL WRBUF
JR C,BS2
DJNZ BS1
BS2
OR A
RET
; ---------------------------------------------
; Процедура KBRD без поддержки буфера
; ---------------------------------------------
KBD
LD A,NCURMR
CALL TVOUT
RES 0x7,C
BIT ENACUR,C
CALL NZ,CURON
LD DE,(CURTM)
JR KBD3
KBD0 POP AF
LD HL,(KBAUTO)
JR KBD21
KBD1 POP AF
KBD2 LD HL,1
KBD21 LD (STAUTO),HL
KBD3 CALL CURINK
LD B,A
JR NC,KBD32
PUSH BC
CALL KBD8
POP BC
JR KBD2
KBD32 CALL KBD20
JR NC,KBD2
LD HL,(STAUTO)
PUSH HL
KBD4 XOR A
KBD5 DEC A
JR NZ,KBD5
CALL CURINK
JR C,KBD1
CP B
JR NZ,KBD0
DEC HL
LD A,H
OR L
JR NZ,KBD4
POP HL
DEC HL
LD A,H
OR L
LD HL,(KBAUTO)
JR Z,KBD6
LD HL,0x2
KBD6 LD (STAUTO),HL
BIT 0x7,C
CALL NZ,CUROFF
LD A,B
LD (KBSYM),A
LD DE,(KBMODE)
PUSH AF
CALL KBSND ; Звук клавиатуры
POP AF
RET
; ---------------------------------------------
; Обработка спецклавиш
; Вход:
; B - выходное значение INKEY
; ---------------------------------------------
KBD8
LD HL,KBFLAG
LD C,(HL)
CALL IS_OLD
LD A,B
JR Z,KBD18
CP 0xfe
JR NZ,KBD11
KBD9 CALL IS_KOI7
JR Z,KBD13
JR NC,KBD19
BIT GRFALF,(HL)
JR NZ,KBD10
KBD13 LD A,(HL)
XOR ruslat
LD (HL),A
KBD10F PUSH BC
PUSH DE
PUSH HL
LD A,C
LD DE,(KBMODE)
CALL KBSIG
POP HL
POP DE
POP BC
KBD10 CALL INKEY
JR NC,KBD10
INC A
JR NZ,KBD10
LD A,(HL)
AND 0x1f
JR NZ,KBD10
RET
KBD11 CP 0xf
JR NZ,KBD14
KBD12 RES GRFALF,(HL)
JR KBD10F
KBD14 CP 0xe
JR NZ,KBD16
KBD15 CALL IS_KOI7
JR NC,KBD10
SET GRFALF,(HL)
JR KBD10F
KBD16 BIT SHIFT,(HL)
RET Z
BIT CTRL,(HL)
RET Z
KBD17
CALL IS_KOI7
JR Z,KBD13
KBD19
LD A,(HL)
XOR bolmal
LD (HL),A
JR KBD10F
KBD18
BIT FIX,(HL)
RET Z
BIT SHIFT,(HL)
JR NZ,KBD17
BIT ALF,(HL)
JR NZ,KBD9
BIT GRF,(HL)
RET Z
CALL IS_KOI7
JR NC,KBD10
LD A,(HL)
XOR grfalf
LD (HL),A
JR KBD10F
; ---------------------------------------------
; Обработка ^O,^N rk86 и ms7007(OLD MODE)
; Вход:
; (B) - код на выходе INKEY
; "CY" - ^O,^N не нажаты
; ---------------------------------------------
KBD20
CALL IS_OLD
SCF
RET Z
CALL IS_KOI7
CCF
RET C
LD HL,OLDGRF
LD A,(HL)
DEC HL
CP (HL)
JR NZ,KBD22
CP B
SCF
RET NZ
LD HL,KBFLAG
BIT GRFALF,(HL)
JR Z,KBD15
JR KBD12
KBD22
LD A,(HL)
CP B
INC HL
LD A,(HL)
LD HL,KBFLAG
JR Z,KBD12
CP B
JR Z,KBD15
SCF
RET
; =============================================
; INKEY
; =============================================
; ---------------------------------------------
; INKEY с обработкой спецклавиш
; "NC", A - код клавиши
; "CY", A - не нажата или спецклавиша
; ---------------------------------------------
INKEY2 IN A,(PORT_00_DIPSW)
AND 4 ; Тип клавиатуры
JR Z,INK23
; Полный опрос матрицы РК86
XOR A
OUT (PORT_18_KBD),A
IN A,(PORT_19_KBD)
OR A
JR NZ,INK24
IN A,(PORT_1A_KBD)
OR 0x1f
INC A
JR NZ,INK24
INK22
OR 0xff
SCF
RET
; Полный опрос матрицы МС7007
INK23
XOR A
OUT (PORT_19_KBD),A
OUT (PORT_1A_KBD),A
IN A,(PORT_18_KBD)
INC A
JR Z,INK22
INK24
CALL INKEY
PUSH HL
PUSH BC
PUSH DE
LD B,A
JR NC,INK26
CALL KBD8
INK25
OR 0xff
SCF
JP INK8
INK26
CALL KBD20
JR NC,INK25
LD A,B
OR A
JP INK8
; ---------------------------------------------
; Опрос нажатой клавиши (старый вариант, базовая)
; Выход:
; если "NC": клавиша нажата A - код клавиши (кроме CTRL,SHIFT,FIX,ALF,GRF)
; если "CY":
; A = 0FFH - клавиша не нажата
; A = 0FEH - нажата одна клавиша "ФИКС" (РУС/LAT)
; A = 0EH - нажата одна клавиша "ГРАФ" на МС7007
; A = 0FH - нажата одна клавиша "АЛФ" на МС7007
; ---------------------------------------------
INKEY
PUSH HL
PUSH BC
PUSH DE
CALL NUMINK
AND A
JR Z,INK3
CP 0x4
JR NC,INK3
LD HL,KBFLAG
LD D,A
LD E,0x0
LD A,(HL)
AND 0x1f
JR Z,INK10
LD B,0x5
INK1
RRCA
JR NC,INK2
INC E
INK2
DJNZ INK1
LD A,D
CP E
JR NZ,INK9
DEC A
JR NZ,INK3
BIT FIX,(HL)
JR NZ,INK4
BIT GRF,(HL)
JR NZ,INK5
BIT ALF,(HL)
JR NZ,INK6
;
INK3 LD A,0xFF
DB 0x21
INK4 LD A,0xFE
DB 0x21
INK5 LD A,0x0E ; граф
DB 0x21
INK6 LD A,0x0F ; АЛФ
;
INK7 SCF
;
INK8 POP DE
POP BC
POP HL
RET
INK9 LD A,C
CP 0xd
JR NC,INK92
LD A,D
CP 0x2
JR NZ,INK3
LD A,C
CP 0xa
JR NC,INK91
CP 0x4
JR NZ,INK92
INK91 PUSH HL
LD HL,(BAZA)
INC HL
LD C,(HL)
POP HL
INK92 BIT FIX,(HL)
JR NZ,INK3
INK10 LD D,C
LD A,C
LD HL,CURTAB
LD BC,0x0004
CPIR ;=
JR NZ,INK11
LD A,0x3
SUB C
LD C,A
LD HL,CURCOD
ADD HL,BC
LD A,(KBFLAG)
AND 0x3
ADD A,A
ADD A,A
LD C,A
LD A,E
CP 0x2
JR C,INK101
LD C,0x0
INK101 ADD HL,BC
LD A,(HL)
JR INK8
INK11 LD C,D
LD HL,KBTAB
LD DE,KBTAB+88
CALL IS_KOI7
LD A,(KBFLAG)
JR C,INK12
EX DE,HL
JR NZ,INK16
BIT ALF,A
JR Z,INK01
XOR ruslat
INK01 BIT RUSLAT,A ; CHECK RUSLAT+1?
JR NZ,INK17
EX DE,HL
JR INK17
INK12 BIT CTRL,A
JR NZ,INK17
LD HL,KBTAB+88*4
LD DE,-(88*2)
BIT GRF,A
JR Z,INK13
XOR grfalf
INK13
BIT GRFALF,A
JR NZ,INK15
ADD HL,DE
BIT ALF,A
JR Z,INK14
XOR ruslat
INK14
BIT RUSLAT,A
JR NZ,INK15
ADD HL,DE
INK15
EX DE,HL
LD HL,88
ADD HL,DE
INK16
BIT CPSLCK,A
JR Z,INK17
EX DE,HL
INK17
BIT SHIFT,A
JR Z,INK18
EX DE,HL
ADD HL,BC
IN A,(PORT_00_DIPSW)
AND KBD_TYPE
JR NZ,INK19
INK171
LD A,C
PUSH HL
LD HL,SPECTB
LD C,SPECTE-SPECTB ; BC - длина таблицы
CPIR
POP HL
JR NZ,INK19
LD A,(HL)
XOR 0x10
JR INC20
INK18
ADD HL,BC
IN A,(CTRL)
AND KBD_TYPE
JR NZ,INK171
INK19
LD A,(HL)
INC20
LD C,A
CALL IS_KOI7
DEC A
JR NZ,INK21
LD HL,ALTK8
LD A,C
SUB 0x80
JR C,INK21
LD C,A
ADD HL,BC
LD C,(HL)
; ---------------------------------------------
; Обработка клавиши CTRL
; ---------------------------------------------
INK21 LD HL,INK8
PUSH HL
LD A,(KBFLAG)
OR A
BIT CTRL,A ; Нажата CTRL?
LD A,C
RET Z ; Не нажата
CP ruslat
CCF
RET NC ; Не буква
CP 0x7F
RET NC ; Не буква
AND 0x1F
RET
;-- Таблица номеров клавиш курсора --
CURTAB DB 4Ch,35h,3Eh,3Dh ; LEFT, RIGHT, UP, DOWN
;-- Таблица перекодирования номеров клавиш по SHIFT
SPECTB
DB 19h,21h,29h,30h,39h,41h,48h,50h
DB 57h,4Fh,47h,46h,10h,37h,54h,45h
SPECTE ; конец таблицы
; Таблица перевода сканкодов МС7007 в коды клавиш
; используется 4 таблицы по 88 байт каждая:
; 1). для больших латинских букв;
; 2). для маленьких латинских букв;
; (или русские в верхнем КОИ-7);
; 3). для больших русских букв ALT-кодировки;
; 4). для маленьких русских букв;
; 5). для набора 1 псевдографики ALT-кодировки;
; 6). для набора 2 псевдографики ALT-кодировки;
; Примечание: коды клавиш курсора не учитываются
;
KBTAB
; Большие латинские
DB 39H,38H,00H,00H,00H,34H,35H,36H ;0-7
DB 1BH,09H,00H,0EH,0FH,2BH,2DH,0DH ;8-F
DB 2BH,4AH,46H,51H,00H,30H,2EH,2CH ;10-17
DB 00H,21H,43H,59H,5EH,31H,32H,33H ;18-1F
DB 01H,22H,55H,57H,53H,37H,0CH,1FH ;20-27
DB 02H,23H,4BH,41H,4DH,7FH,1EH,0AH ;28-2F
DB 24H,45H,50H,49H,20H,18H,0DH,3FH ;30-37
DB 03H,25H,4EH,52H,54H,1AH,19H,5FH ;38-3F
DB 04H,26H,47H,4FH,58H,3EH,2AH,3DH ;40-47
DB 27H,5BH,4CH,42H,08H,5CH,48H,20H ;48-4F
DB 28H,5DH,44H,40H,3CH,56H,5AH,29H ;50-57
;
; Малые латинские (или русские для КОИ-7 n2)
DB 39H,38H,00H,00H,00H,34H,35H,36H ;0-7
DB 1BH,09H,00H,0EH,0FH,2BH,2DH,0DH ;8-F
DB 2BH,6AH,66H,71H,00H,30H,2EH,2CH ;10-17
DB 00H,21H,63H,79H,7EH,31H,32H,33H ;18-1F
DB 01H,22H,75H,77H,73H,37H,0CH,1FH ;20-27
DB 02H,23H,6BH,61H,6DH,7FH,1EH,0AH ;28-2F
DB 24H,65H,70H,69H,20H,18H,0DH,3FH ;30-37
DB 03H,25H,6EH,72H,74H,1AH,19H,5FH ;38-3F
DB 04H,26H,67H,6FH,78H,3EH,2AH,3DH ;40-47
DB 27H,7BH,6CH,62H,08H,7CH,68H,20H ;48-4F
DB 28H,7DH,64H,60H,3CH,76H,7AH,29H ;50-57
;
; Русские большие
DB 39H,38H,00H,00H,00H,34H,35H,36H ;0-7
DB 1BH,09H,00H,0EH,0FH,2BH,2DH,0DH ;8-F
DB 2BH,89H,94H,9FH,00H,30H,2EH,2CH ;10-17
DB 00H,21H,96H,9BH,97H,31H,32H,33H ;18-1F
DB 01H,22H,93H,82H,91H,37H,0CH,1FH ;20-27
DB 02H,23H,8AH,80H,8CH,7FH,1EH,0AH ;28-2F
DB 24H,85H,8FH,88H,20H,18H,0DH,3FH ;30-37
DB 03H,25H,8DH,90H,92H,1AH,19H,9AH ;38-3F
DB 04H,26H,83H,8EH,9CH,3EH,2AH,3DH ;40-47
DB 27H,98H,8BH,81H,08H,9DH,95H,20H ;48-4F
DB 28H,99H,84H,9EH,3CH,86H,87H,29H ;50-57
;
; Русские малые
DB 39H,38H,00H,00H,00H,34H,35H,36H ;0-7
DB 1BH,09H,00H,0EH,0FH,2BH,2DH,0DH ;8-F
DB 2BH,0A9H,0E4H,0EFH,00H,30H,2EH,2CH ;10-17
DB 00H,21H,0E6H,0EBH,0E7H,31H,32H,33H ;18-1F
DB 01H,22H,0E3H,0A2H,0E1H,37H,0CH,1FH ;20-27
DB 02H,23H,0AAH,0A0H,0ACH,7FH,1EH,0AH ;28-2F
DB 24H,0A5H,0AFH,0A8H,20H,18H,0DH,3FH ;30-37
DB 03H,25H,0ADH,0E0H,0E2H,1AH,19H,0EAH ;38-3F
DB 04H,26H,0A3H,0AEH,0ECH,3EH,2AH,3DH ;40-47
DB 27H,0E8H,0ABH,0A1H,08H,0EDH,0E5H,20H ;48-4F
DB 28H,0E9H,0A4H,0EEH,3CH,0A6H,0A7H,29H ;50-57
;
; Псевдографика 1
DB 39H,38H,00H,00H,00H,34H,35H,36H ;0-7
DB 1BH,09H,00H,0EH,0FH,2BH,2DH,0DH ;8-F
DB 2BH,0C9H,0CCH,0C8H,00H,30H,2EH,2CH ;10-17
DB 00H,21H,0CBH,0CEH,0CAH,31H,32H,33H ;18-1F
DB 01H,22H,0BBH,0B9H,0BCH,37H,0CH,1FH ;20-27
DB 02H,23H,0D6H,0C7H,0D3H,7FH,1EH,0AH ;28-2F
DB 24H,0D2H,0D7H,0D0H,20H,18H,0DH,3FH ;30-37
DB 03H,25H,0B7H,0B6H,0BDH,1AH,19H,0F0H ;38-3F
DB 04H,26H,0B0H,0DDH,0B2H,3EH,2AH,3DH ;40-47
DB 27H,0DFH,0FEH,0DCH,08H,0BAH,0CDH,20H ;48-4F
DB 28H,0B1H,0DEH,0DBH,3CH,0FDH,0FBH,29H ;50-57
;
; Псевдографика 2
DB 39H,38H,00H,00H,00H,34H,35H,36H ;0-7
DB 1BH,09H,00H,0EH,0FH,2BH,2DH,0DH ;8-F
DB 2BH,0DAH,0C3H,0C0H,00H,30H,2EH,2CH ;10-17
DB 00H,21H,0C2H,0C5H,0C1H,31H,32H,33H ;18-1F
DB 01H,22H,0BFH,0B4H,0D9H,37H,0CH,1FH ;20-27
DB 02H,23H,0D5H,0C6H,0D4H,7FH,1EH,0AH ;28-2F
DB 24H,0D1H,0D8H,0CFH,20H,18H,0DH,3FH ;30-37
DB 03H,25H,0B8H,0B5H,0BEH,1AH,19H,0F1H ;38-3F
DB 04H,26H,0F5H,0F7H,0F2H,3EH,2AH,3DH ;40-47
DB 27H,0F8H,0FFH,0F9H,08H,0B3H,0C4H,20H ;48-4F
DB 28H,0F4H,0F6H,0F3H,3CH,0FCH,0FAH,29H ;50-57
;
;
; Таблица перекодировки ALT -> КОИ-8
ALTK8 DB 0E1H,0E2H,0F7H,0E7H,0E4H,0E5H,0F6H,0FAH ;А-З
DB 0E9H,0EAH,0EBH,0ECH,0EDH,0EEH,0EFH,0F0H ;И-П
DB 0F2H,0F3H,0F4H,0F5H,0E6H,0E8H,0E3H,0FEH ;Р
DB 0FBH,0FDH,0FFH,0F9H,0F8H,0FCH,0E0H,0F1H ;Ш-Я
DB 0C1H,0C2H,0D7H,0C7H,0C4H,0C5H,0D6H,0DAH ;а
DB 0C9H,0CAH,0CBH,0CCH,0CDH,0CEH,0CFH,0D0H ;и-п
DB 0B0H,0B1H,0B2H,0B3H,0B4H,0B5H,0B6H,0B7H ;графика
DB 0B8H,0B9H,0BAH,0BBH,0BCH,0BDH,0BEH,0BFH
DB 80H,81H,82H,83H,84H,85H,86H,87H
DB 88H,89H,8AH,8BH,8CH,8DH,8EH,8FH
DB 90H,91H,92H,93H,94H,95H,96H,97H
DB 98H,99H,9AH,9BH,9CH,9DH,9EH,9FH
DB 0D2H,0D3H,0D4H,0D5H,0C6H,0C8H,0C3H,0DEH ;р
DB 0DBH,0DDH,0DFH,0D9H,0D8H,0DCH,0C0H,0D1H ;ш-я
DB 0A0H,0A1H,0A2H,0A3H,0A4H,0A5H,0A6H,0A7H ;спецсимволы
DB 0A8H,0A9H,0AAH,0ABH,0ACH,0ADH,0AEH,0AFH
; ---------------------------------------------
; Опрос номеров нажатых клавиш
; Выход:
; A - число нажатых клавиш
; HL- адрес буфера с кодами клавиш
; C - номер последней (по таблице) нажатой клавиши
; если С=0FFh, то ни одна клавиша не нажата
; Особенности: данная пп формирует флаги клавиатуры CTRL, SHIFT, FIX в байте "KBFLAG"
; при нажатии соответствующей клавиши (для МС7007 - еще и флаги ALF, GRF).
; ---------------------------------------------
NUMINK LD HL,KBFLAG
LD A,0xe0
AND (HL)
LD (HL),A
XOR A
LD HL,(BAZA)
LD (HL),A
INC HL
EX DE,HL
LD HL,POS1
IN A,(0x0)
AND KBD_TYPE
JR NZ,NUM11
LD C,0x0
NUM1
LD A,L
OUT (PORT_19_KBD),A
LD A,H
OUT (PORT_1A_KBD),A
IN A,(PORT_18_KBD)
CP 0xff
JR Z,NUM7
LD B,A
LD A,(IKEYTM)
NUM2
DEC A
JR NZ,NUM2
IN A,(PORT_18_KBD)
CP B
JR NZ,NUM7
LD B,0x9
DEC C
NUM3
INC C
DEC B
JR Z,NUM8
RRCA
JR C,NUM3
EX DE,HL
LD (HL),C
INC HL
OR 0x80
LD (HL),A
EX DE,HL
PUSH HL
PUSH AF
LD HL,KBFLAG
LD A,C
CP 0x4
JR NZ,NUM4
SET SHIFT,(HL)
NUM4 CP 0xa
JR NZ,NUM5
SET CTRL,(HL)
NUM5 CP 0x14
JR NZ,NUM51
SET FIX,(HL)
NUM51 CP 0xb
JR NZ,NUM52
SET GRF,(HL)
NUM52 CP 0xc
JR NZ,NUM6
SET ALF,(HL)
NUM6 LD HL,(BAZA)
INC (HL)
POP AF
POP HL
JR NUM3
NUM7 LD A,C
ADD A,0x8
LD C,A
NUM8 ; db 0CBh
SLL L ; DEC (HL)
RL H
LD A,H
CP 0xf7 ; Конец опроса?
JR NZ,NUM1
NUM9 LD HL,(BAZA)
EX DE,HL
LD A,(DE)
AND A
LD C,0xff
JR Z,NUM10
DEC HL
LD C,(HL)
NUM10 EX DE,HL
INC HL
RET
NUM11 LD HL,0x97f
LD C,0x0
IN A,(PORT_1A_KBD)
OR 0x1f
CP 0xff
JR Z,NUM19
JR NUM14
NUM12
LD A,L
OUT (PORT_18_KBD),A
IN A,(PORT_19_KBD)
CP 0xff
JR Z,NUM19
LD B,A
LD A,(IKEYTM)
NUM13
DEC A
JR NZ,NUM13
IN A,(PORT_19_KBD)
CP B
JR NZ,NUM19
NUM14
LD B,0x9
DEC C
NUM15
INC C
DEC B
JR Z,NUM20
RRCA
JR C,NUM15
EX DE,HL
PUSH AF
PUSH BC
PUSH HL
LD HL,KBFLAG
LD A,C
CP 0x5
JR NZ,NUM16
SET SHIFT,(HL)
NUM16
CP 0x6
JR NZ,NUM17
SET CTRL,(HL)
NUM17
CP 0x7
JR NZ,NUM18 ;РУС/LAT?
SET FIX,(HL)
NUM18
LD HL,(BAZA)
INC (HL)
LD HL,TBNUM-5
LD B,0x0
ADD HL,BC
LD A,(HL)
POP HL
LD (HL),A
POP BC
POP AF
INC HL
OR 0x80
LD (HL),A
EX DE,HL
JR NUM15
NUM19
LD A,C
ADD A,0x8
LD C,A
NUM20
RLC L
DEC H
JR NZ,NUM12
JR NUM9
; ---------------------------------------------
; Таблица перевода скан-кодов РК86 в скан-коды МС7007
; Начало таблицы = TBNUM-05H
; ---------------------------------------------
TBNUM DB 4,0AH,14H ; ss, us, rus/LAT
DB 26H,27H,8,18H,20H,28H,38H,40H ; 0-7
DB 9,2FH,36H,2DH,4CH,3EH,35H,3DH ; 8-F
DB 4FH,19H,21H,29H,30H,39H,41H,48H ; 10-17
DB 50H,57H,46H,10H,54H,47H,45H,37H ; 18-1F
DB 53H,2BH,4BH,1AH,52H,31H,12H,42H ; 20-27
DB 4EH,33H,11H,2AH,4AH,2CH,3AH,43H ; 28-2F
DB 32H,13H,3BH,24H,3CH,22H,55H,23H ; 30-37
DB 44H,1BH,56H,49H,4DH,51H,1CH,34H ; 38-3F
;