; LAST UPDATE: 18.10.2023 savelij
;#INCLUDE "ALLVARS.ASH"
_KB_INT: RET
KB_INIT: JP _KB_INIT
KB_SCAN: JP _KB_SCAN
KB_ENCODE: JP _KB_ENCODE
KB_GET_SHIFTS: JP _KB_GET_SH
KB_SET_RUS: JP _KB_SET_RUS
;#INCLUDE "KB_SH.INC"
KB_TIME EQU K_5CNT;#DEFINE KB_TIME K_5CNT
_KB_TIME EQU _K_5CNT;#DEFINE _KB_TIME _K_5CNT
;#PRAGMA LOCAL
;----------------------------------------
; LOCALS
_IN: EX AF,AF'
LD A,55H
IN A,(0FEH)
EX AF,AF'
IN A,(0FEH)
RET
_IN MACRO V
LD A,V
CALL _IN
ENDM
;----------------------------------------
; INIT KEYBOARD (STANDARD ENTRY)
_KB_INIT: _IN 8
LD A,8AH
IN A,(0FEH)
_IN 1
CP 10H
JR NC,ABORT
XOR A
RET
ABORT: CALL PRN
DB 1BH,"M1VE31 not installed",0DH,0AH,0
DI
HALT
;----------------------------------------
; SCAN KEYBOARD
; IN E&1 - WAIT FOR SYM, E&2 - WAIT FOR SHIFTS
;
; RET A-FF NO,0-KEY, 1-SHIFT
; L-CHAR/0
_KB_SCAN:
BIT _INTOF,(IX-_FLAG1)
JR Z,__NOCHECK
LD A,(IX-_TIME_C)
CP (IX-_KB_TIME)
LD (KB_TIME),A
JR Z,__NOALL
__NOCHECK:
LD BC,0FEH
IN A,(C)
LD B,40H
IN L,(C)
LD B,80H
IN H,(C)
PUSH DE
LD DE,(KS_ASH)
LD (KS_ASH),HL
OR A
SBC HL,DE
POP DE
JR NZ,__SHIFT
OR A
JR NZ,__SYM
__NOALL: INC E
DEC E
JR NZ,_KB_SCAN
LD A,-1
__R1: LD L,0
__RET: LD DE,(KS_ASH)
_RET1: EX AF,AF'
LD A,D
AND 15
OR E
LD E,A
EX AF,AF'
RET
__SYM: LD L,A
LD A,0
JR __RET
__SHIFT: OR A
JR NZ,__SYM
BIT 1,E
JR Z,_KB_SCAN
LD A,1
JR __R1
;-------------------------------
_KB_GET_SH:_IN 9
LD E,A
_IN 49H
LD D,A
LD (KS_ASH),DE
XOR A
JR _RET1
;---------------------------------------
_KB_SET_RUS:
OR A
LD A,55H
IN A,(0FEH)
LD A,0BH
JR Z,KSR_1
DEC A
KSR_1: IN A,(0FEH)
JP _KB_GET_SH
;---------------------------------------
_KB_ENCODE:LD HL,ENC_TABL
XOR A
RET
ENC_TABL
ENT_DEF ED_PROC,ED_CHAR,ED_CHAR,ED_CHAR
ENT_DEF ED_PROC,ED_PROC,ED_PROC,ED_PROC
ENT_DEF ED_PROC,ED_CHAR,ED_CHAR,ED_CHAR
ENT_DEF ED_CHAR,ED_CHAR,ED_PROC,ED_PROC
DB 0,0
DW PALT ; HI BIT ENCODER
DW TRP ; RUS PUNCT
DW TRSP ; RUS+SHFT PUNCT
DW TRLET ; RUS LETTER
DW 0 ; RUS+SHFT LETTER
DW NRET ; OTHERS
DW NRET ; SHFT OTHERS
DW NRET ; RUS OTHERS
DW NRET ; RUS+SHFT OTHERS
DW TCCTRL ; CTRL CONTROLL
DW TSDIG ; SHFT DIGITS
DW TCDIG ; CTRL DIGITS
DW TRSDIG ; RUS+SHFT DIGITS
DW TSP ; SHFT PUNCT
DW PCP ; CTRL PUNCT
DW NRET ; CTRL OTHERS
PALT: LD L,-1
BIT B_KS_NUM,(IX-_KS_ASH)
RET NZ
CP "."
JR NZ,PALT_1
LD A,"y"
RET
PALT_1: CP "0"
RET C
CP 0X39+1;'9'+1
RET NC
LD HL,TALT-0X30;'0'
CALL ADD_HL_A
LD A,(HL)
SRET: LD L,-1
RET
NRET: XOR A
CRET: LD L,0
RET
TALT: DB "xwqur",0,"svpt"
PCP: CP "@"
JR C,NRET
AND 1FH
LD L,0
RET
TRP: DB 0X88, "`;',.[]",0X5C,"(v|b`h",0X7F,0
;ED_tab "`;',.[]",0X5C <"(v|b`h", 127,0> 1
TRSP: DB 0X8A, "`;',.[]=",0X5C,"/",")V",0X5C,"B@H_+",0,"?"
;ED_tab "`;',.[]=",0X5C,"/" <")V0x5CB@H_+",0,"?"> 1
TRLET: DB 0, "fiswuapr{oldxt}zjkyegmc~nq"
;ED_tab "fiswuapr{oldxt}zjkyegmc~nq"
TCCTRL: DB 0X81, 0X0D,0X0A
;ED_tab 0dh 0ah 1
TSDIG: DB 0, ")!@#$%^&*("
;ED_tab "")!@#$%^&*("
TCDIG: DB 1, "6",0X1E
;ED_tab "6" 1eh
TRSDIG: DB 0, "%!",0X22,"/$:,.;?"
;ED_tab "%!",0X22,"/$:,.;?"
TSP: DB 0X0B, "`;',.[]-=",0X5C,"/","~:",0X22,"<>{}_+|?"
;ED_tab "`;',.[]-=",0X5C,"/" "~:",0X22,"<>{}_+|?"