;#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  _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,"/" <")V\B@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,"<>{}_+|?"