Estex-DSS/DSS/KEYINTER.ASM
2025-03-28 03:23:22 +10:00

1292 lines
25 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.

; MODULE KEYINTER
;[BEGIN]
;//MODULE: KEYINTER Keyboard Scan Codes: Set 2
;//CREATE: 19-05-1998 AUTHOR: Denis Parinov
;//UPDATE: 24-10-1999 DNS Restore module
;------------------------------------------------
;R02 13-04-2023 BAO FIX BUG IN K_CLEAR WITH STACK OVERFLOW
;R01 10-02-2003 DNS Add cursor visualisation
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;KEYBOARD BUFFER
_mInfoALIGN 256,0
SBUF: BLOCK 64,0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; _mInfoALIGN 256,0 ;;
; 0 1 2 3 4 5 6 7 8 9 A B C D E F ;;
XLAT_T: DB #00,#43,#00,#3F,#3D,#3B,#3C,#46,#00,#44,#42,#40,#3E,#0F,#00,#00 ;00 ;;
DB #00,#37,#29,#00,#36,#10,#02,#00,#00,#00,#2A,#1E,#1D,#11,#03,#00 ;10 ;;
DB #00,#2C,#2B,#1F,#12,#05,#04,#00,#00,#38,#2D,#20,#14,#13,#06,#00 ;20 ;;
DB #00,#2F,#2E,#22,#21,#15,#07,#00,#00,#00,#30,#23,#16,#08,#09,#00 ;30 ;;
DB #00,#31,#24,#17,#18,#0B,#0A,#00,#00,#32,#33,#25,#26,#19,#0C,#00 ;40 ;;
DB #00,#00,#27,#00,#1A,#0D,#00,#00,#1C,#34,#28,#1B,#00,#35,#00,#00 ;50 ;;
DB #00,#00,#00,#00,#00,#00,#0E,#00,#00,#51,#00,#54,#57,#00,#00,#00 ;60 ;;
DB #50,#4F,#52,#55,#56,#58,#01,#49,#45,#4D,#53,#4C,#4B,#59,#48,#00 ;70 ;;
DB #00,#00,#00,#41,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00 ;80 ;;
.Size EQU $-XLAT_T ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
HEAD DB #00
HOST DB #00
;
K_LOCK EQU $-KEYFLAG
LANG_L EQU 7
PAUSE_L EQU 6
RES5_L EQU 5 ; not used ;X_SHIFT
RES4_L EQU 4 ; not used
NUM_L EQU 3
SCRL_L EQU 2
INS_L EQU 1
CAPS_L EQU 0
KEYFLAG DB #02 ;D0-Key Pressed
;
K_SHIFT EQU $-KEYFLAG
L_SHIFT EQU 7
R_SHIFT EQU 6
X_CTRL EQU 5
X_ALT EQU 4
L_CTRL EQU 3
L_ALT EQU 2
R_CTRL EQU 1
R_ALT EQU 0
KEYCTRL DB #00
;
KEYFLG EQU $-KEYFLAG
FLAG_E0 EQU 7
FLAG_F0 EQU 6
FLAG_E1 EQU 5
FLAG_04 EQU 4
FLAG_03 EQU 3
FLAG_02 EQU 2
FLAG_01 EQU 1
CTRL_SHIFT EQU 0 ; ctrl+shift = change language
KEY_FLG DB #00
;
SOUND_K EQU $-KEYFLAG
FLAG_S7 EQU 7
FLAG_S6 EQU 6
FLAG_S5 EQU 5
FLAG_S4 EQU 4
FLAG_S3 EQU 3
FLAG_S2 EQU 2
SF_ALT EQU 1
SF_BUFF EQU 0
DB #03
;
UnCODE EQU $-KEYFLAG
UNCODE DW 0 ; <20><><EFBFBD><E1ABA5><EFBFBD><EFBFBD> <20><EFBFBD><E2A6A0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; D15 - LShift
; D14 - RShift
; D13 - CTRL
; D12 - ALT
; D11 - LCTRL
; D10 - LALT
; D9 - RCTRL
; D8 - RALT
; D7 - Language Lock
; D6 - Pause Lock
; D5 - Reserved
; D4 - Reserved
; D3 - Num Lock
; D2 - Scroll Lock
; D1 - Insert Lock
; D0 - Caps Lock
; D15 - Keystroke
; D14
; D13 \
; D12 \
; D11 -- Position code (0...5Ah)
; D10 /
; D9 /
; D8
; D7..D0 - ASCII code
WAITKEY LD HL,HOST
LD A,(HEAD)
CP (HL)
JR Z,WAITKEY
CALL GETSYM
LD A,E
AND A
RET
SCANKEY LD HL,HOST
LD A,(HEAD)
CP (HL)
RET Z
CALL GETSYM
LD A,E
RET
;
;
IF CLASSIC_CURSOR ;------------------------------;
ECHOKEY: ;R01
.CURCOUNT+1: LD A,#FF
INC A
LD (.CURCOUNT),A
AND #FF
JR NZ,.NOTUR
.CURSYM+1: LD A,#00
XOR #01
LD (.CURSYM),A
CALL CURSOR
PUSH DE
LD A," "
JR Z,.CURSKI
LD A,"_"
.CURSKI: CALL PUTCHAR.NO_SCROLL ;R03; [x] -bug with Vasil's version of cursor
POP DE
CALL LOCATE
;LD A,8 ; BACKSPACE
;CALL PUTCHAR
.NOTUR: CALL SCANKEY
JR Z,ECHOKEY
PUSH DE
PUSH BC
PUSH AF
CALL CURSOR
PUSH DE
LD A," "
CALL PUTCHAR.NO_SCROLL ;R03; [x] -bug with Vasil's version of cursor
;LD A,8 ; BACKSPACE
;CALL PUTCHAR
POP DE
POP AF
PUSH DE
;R01 [v]
CALL PUTCHAR.NO_SCROLL ; [x] -bug with Vasil's version of cursor
POP DE
CALL LOCATE
POP BC
POP DE
LD A,E
AND A
RET
ELSE ;------------------------------;
;------; !FIXIT <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E7A5AD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>?
delay_curs: EQU 11 ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
INS_CUR_ZG: EQU #9B ; [x] 14/03/2025 <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E0A0AD> <><E0A5A6><EFBFBD><><E1AFA5><EFBFBD>
CURSOR_ZG: EQU #5B ; [x] 14/03/2025 <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E0A0AD> <><E0A5A6><EFBFBD><><E1AFA5><EFBFBD>
NORM_ZG: EQU #1B
;------;
ECHOKEY: CALL Cursor_On ; <20><><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><E2A0AD><EFBFBD><EFBFBD><EFBFBD><><E4AEAA> <20><> "Input Line"
EI
.loop: CALL SCANKEY
JR Z,.loop
PUSH DE
PUSH BC
PUSH AF
CALL Cursor_Off ; <20>몫. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
POP AF
OR A
; [x] -bug with Vasil's version of cursor
CALL NZ,PUTCHAR.NO_SCROLL ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD> "a" <20><> <20><>
POP BC
POP DE
LD A,E
AND A
RET
Cursor: ;!TODO <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><E0A3A0> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><>?
.Flag+1: LD A,0 ; 䫠<> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 00-<2D><><EFBFBD>/01-<2D><><EFBFBD><EFBFBD>
CPL
LD (.Flag),A
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Cursor_On: LD C,BIOS.LP_GET_PLACE ; 㧭<><E3A7AD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
RST ToBIOS
LD (Cursor_Off.pos),DE
XOR A
LD C,BIOS.WIN_GET_SYM ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E1A8AC><EFBFBD>
RST ToBIOS
;
LD A,%0010'0000
AND B
LD (.char_size),A ; [ ] 24/03/2025 <20><><EFBFBD>࠭塞 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 80/40 ᨬ<><E1A8AC><EFBFBD><EFBFBD><EFBFBD>
;
LD BC,NORM_ZG*256+BIOS.WIN_PUT_SYM ; b=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>., <20>=ᨬ<><E1A8AC><EFBFBD> <20><> <20><>
LD A,(Cursor.Flag)
OR A
JR Z,.put
LD B,INS_CUR_ZG ; <20><><EFBFBD><EFBFBD>
LD A,(KEYFLAG) ; 䫠<><E4ABA0> <20><><EFBFBD><EFBFBD><EFBFBD>
AND 1<<INS_L
JR Z,.put
LD B,CURSOR_ZG ; <20><><EFBFBD><EFBFBD><EFBFBD>
.put: ;
.char_size+1: LD A,0
OR B
LD B,A
XOR A ; <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
RST ToBIOS
;
LD DE,(Cursor_Off.pos)
CALL LOCATE
;
LD A,1
LD (Cursor_Off.Flag),A
LD A,delay_curs
RET
;
; <20><EFBFBD><EBAAAB><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
;
Cursor_Off:
.Flag+1: LD A,0 ; 䫠<> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: 00-<2D>몫/01-<2D><><EFBFBD>
OR A
RET Z
LD A,-1 ; = #FF
LD (Cursor.Flag),A
INC A
LD (.Flag),A
LD A,delay_curs
LD (cursor_interrupt.timer),A
.pos+1: LD DE,0 ; Y/X <20><><EFBFBD><EFBFBD><EFBFBD>.
BIT 7,E
RET NZ
LD C,BIOS.WIN_GET_SYM ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><E1A8AC><EFBFBD>
XOR A
RST ToBIOS
;
LD A,%0010'0000
AND B
OR NORM_ZG
LD B,A ; [ ] 24/03/2025 <20><><EFBFBD>࠭塞 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 80/40 ᨬ<><E1A8AC><EFBFBD><EFBFBD><EFBFBD>
;
XOR A
LD C,BIOS.WIN_PUT_SYM ; ᨬ<><E1A8AC><EFBFBD> <20><> <20><>
RST ToBIOS
;
LD DE,(Cursor_Off.pos)
JP LOCATE
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><E3A6A8><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
cursor_interrupt:
LD A,(Cursor_Off.Flag)
OR A
RET Z
.timer+1: LD A,1 ; <20><><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DEC A
CALL Z,Cursor
LD (.timer),A
RET
; <20><><EFBFBD><EFBFBD><EFBFBD><E0AEA9> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SETUP_CURSORS:
.buffer EQU #C000
;
in a,(SLOT3)
push af ; <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD>
ld a,(BANKTBL+TXTPAGE) ; 2-<2D> <20><><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E0A0AD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD>
out (SLOT3),a
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
ld de,.buffer ;!HARDCODE <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> 2048 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
push de
ld c,BIOS.WIN_GET_ZG ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
rst ToBIOS
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> #FF 2 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
ld hl,.buffer+(2048-(2*256)) ;!HARDCODE <20><><EFBFBD><E1ABA5><EFBFBD><EFBFBD> 512 <20><><EFBFBD><EFBFBD>
ld bc,511
ld a,CURSOR_ZG; ; <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. "<22><><EFBFBD><EFBFBD><EFBFBD>窠"
call .fill_data_font
pop hl
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><E2A0AB><EFBFBD><EFBFBD> 6 <20><><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
ld bc,2048-513 ;!HARDCODE
ld a,INS_CUR_ZG ; <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. "<22><><EFBFBD><EFBFBD>"
call .fill_data_font
pop af
out (SLOT3),a ; <20><><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD>
ret
; <20><><EFBFBD><EFBFBD><EFBFBD><E0AEA9> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20> <20><><EFBFBD><><E0A5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; <20>室: a=<3D><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
; hl=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; bc=ࠧ<><E0A0A7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
.fill_data_font:
ld e,l
ld d,h
ld (hl),#FF
inc de
ldir
ld de,.buffer ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
ld c,BIOS.WIN_SET_ZG ; <20><><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
jp ToBIOS
;ret
;
ENDIF ;------------------------------;
CTRLKEY:
LD HL,HOST
LD A,(HEAD)
CP (HL)
LD BC,(KEYFLAG)
LD A,#00
RET Z
DEC A
RET
TESTKEY:
LD HL,HOST
LD A,(HEAD)
CP (HL)
RET Z
LD L,(HL)
LD H,high SBUF
LD E,(HL)
INC L
LD D,(HL)
INC L
LD B,(HL)
INC L
LD C,(HL)
LD A,E
RET
; K_CLEAR LD A,(HOST)
; LD (HEAD),A
; LD A,#2F
; CP B
; JR C,K_C2
; LD A,DSS_Error.sys.INVALID_FUNCTION
; SCF
; RET
; K_C2 LD A,#34 ;R02
; CP B
; JR NC,K_C3
; LD A,DSS_Error.sys.INVALID_FUNCTION
; SCF
; RET
; K_C3 LD C,B
; RST ToDSS
; RET
;small optimization
K_CLEAR:
LD A,(HOST)
LD (HEAD),A
LD A,Dss.WaitKey - 1
CP B
JR NC,.error
LD A,Dss.EDIT ;R02
CP B
JR C,.error
LD C,B
JP RST_10
;
.error: LD A,DSS_Error.sys.INVALID_FUNCTION
SCF
RET
;
PUTSYM: LD HL,HEAD
LD A,(HOST)
SUB 4
AND #3F
CP (HL)
JR Z,FULL_BF
LD A,(HL)
INC (HL)
INC (HL)
INC (HL)
INC (HL)
RES 6,(HL)
LD L,A
LD H,high SBUF
LD (HL),E
INC L
LD (HL),D
INC L
LD (HL),B
INC L
LD (HL),C
RET
GETSYM: LD HL,HOST
LD A,(HEAD)
CP (HL)
RET Z
LD A,(HL)
INC (HL)
INC (HL)
INC (HL)
INC (HL)
RES 6,(HL)
LD L,A
LD H,high SBUF
LD E,(HL)
INC L
LD D,(HL)
INC L
LD B,(HL)
INC L
LD C,(HL)
RET
;
FULL_BF: EX AF,AF'
BIT SF_BUFF,(IX+SOUND_K)
JR Z,.FBF
EXX
LD DE,230
LD HL,50
CALL BEEP
EXX
.FBF: EX AF,AF'
RET
;
.E0_KEY: SET FLAG_E0,(IX+KEYFLG)
JR KEYSCAN.RESCAN
;
.F0_KEY: SET FLAG_F0,(IX+KEYFLG)
JR KEYSCAN.RESCAN
;
IF USE_E1_SCANCODE
.E1_KEY: SET FLAG_E1,(IX+KEYFLG)
JR KEYSCAN.RESCAN
ENDIF
;
KEYSCAN: LD IX,KEYFLAG
;!TEST SIO INT
IF KEYBOARD_INT_ENABLED
CALL .RESCAN
LD A,%0011'1000 ; return from int
OUT (Z84.SIO.Ch_A.Ctrl),A
RET
ENDIF
.RESCAN: IN A,(Z84.SIO.Ch_A.Ctrl)
AND 1
RET Z
;[ ] 18/02/2024 <20><EFBFBD><20><> <20><><EFBFBD><E0A5AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; A = 1
; reg 1
OUT (Z84.SIO.Ch_A.Ctrl),A
IN A,(Z84.SIO.Ch_A.Ctrl)
AND %0010'0000 ; check receiver overrun error
JP NZ,KBD_Receiver_Overrun
;
IN A,(Z84.SIO.Ch_A.Data)
CP #F0
JR Z,FULL_BF.F0_KEY
;
CP #E0
JR Z,FULL_BF.E0_KEY
CP #E1
IF USE_E1_SCANCODE
JR Z,FULL_BF.E1_KEY
ELSE
JR Z,.RESCAN
ENDIF
;
BIT FLAG_F0,(IX+KEYFLG)
JR NZ,UN_KEY
;
LD L,A
CALL XLAT
CALL SHIFTS
RES FLAG_E0,(IX+KEYFLG)
IF USE_E1_SCANCODE
RES FLAG_E1,(IX+KEYFLG)
ENDIF
;
IF CHANGE_LANG_CTRL_SHIFT
JR NZ,.check_key
; check ctrl+shift
BIT X_CTRL,(IX+K_SHIFT)
JR Z,.RESCAN ;[x] <20><><EFBFBD><EFBFBD><E0A5A1><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
LD A,(KEYCTRL)
AND 1<<L_SHIFT | 1<<R_SHIFT
JR Z,.RESCAN ;[x] <20><><EFBFBD><EFBFBD><E0A5A1><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
SET CTRL_SHIFT,(IX+KEYFLG)
JR .RESCAN ;[x] <20><><EFBFBD><EFBFBD><E0A5A1><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
ELSE
;[x] <20><><EFBFBD><EFBFBD><E0A5A1><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
JR Z,.RESCAN ;IT'S SHIFT KEY
;
ENDIF
;
.check_key: CALL INPCODE ;L - AT POS. CODE
;PUTCODE
;Caps Lock
LD HL,#1C00
AND A
SBC HL,DE
CALL Z,CAPS_X
IFN CHANGE_LANG_CTRL_SHIFT
;Ctrl + Space
LD HL,#B800
AND A
SBC HL,DE
CALL Z,LANG_X
ENDIF
;Insert
LD HL,#5000
AND A
SBC HL,DE
CALL Z,INS_X
;Num Lock
LD HL,#4900
AND A
SBC HL,DE
CALL Z,NUM_X
;Pause Lock
LD HL,#C900
AND A
SBC HL,DE
CALL Z,PAUSE_X
;Scroll Lock
LD HL,#4800
AND A
SBC HL,DE
CALL Z,SCL_X
;Ctrl + Alt + Del
;[x] small optimization)))
; LD HL,#CF00
; AND A
; SBC HL,DE
; CALL Z,RST_X
;
;; [ ] <20><><EFBFBD><EFBFBD> <20><EFBFBD>
;LD HL,BREAK_PROCESS_CODE
;AND A
;SBC HL,DE
;CALL Z,Break_Process
;
LD BC,(KEYFLAG)
CALL PUTSYM
;[ ] 29/02/2024 <20><><EFBFBD><EFBFBD><E0A5A1><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
JP .RESCAN
;RET
;
;
; IF CHANGE_LANG_CTRL_SHIFT
; UN_KEY: RES FLAG_F0,(IX+KEYFLG)
; LD L,A
; CALL XLAT
; CALL UNSHIFT
; RES FLAG_E0,(IX+KEYFLG)
; LD A,(UNCODE)
; LD H,0
; LD (UNCODE),HL
; ;
; CP #36 ;L CTRL
; JR Z,.check_shift
; CP #29 ;L SHIFT
; RET NZ
; ; check ctrl
; LD A,L
; SUB #36 ;L CTRL
; JR Z,LANG_X
; RET
; ;
; .check_shift: LD A,L
; SUB #29
; JR Z,LANG_X
; RET
; ELSE
UN_KEY: RES FLAG_F0,(IX+KEYFLG)
LD L,A
CALL XLAT
CALL UNSHIFT
RES FLAG_E0,(IX+KEYFLG)
LD H,0
LD (UNCODE),HL
RET
; ENDIF
;
CAPS_X: LD A,(KEYFLAG)
XOR 1<<CAPS_L
LD (KEYFLAG),A
RET
;
LANG_X: IFN CHANGE_LANG_CTRL_SHIFT
BIT X_CTRL,(IX+K_SHIFT)
RET Z
ELSE
RES CTRL_SHIFT,(IX+KEYFLG)
ENDIF
LD A,(KEYFLAG)
XOR 1<<LANG_L
LD (KEYFLAG),A
BIT SF_ALT,(IX+SOUND_K)
RET Z
EXX
LD DE,190
LD HL,20
CALL BEEP
EXX
RET
;
INS_X: LD A,(KEYFLAG)
XOR 1<<INS_L
LD (KEYFLAG),A
RET
;
NUM_X: LD A,(KEYFLAG)
XOR 1<<NUM_L
LD (KEYFLAG),A
RET
;
PAUSE_X: BIT X_CTRL,(IX+K_SHIFT)
RET Z
POP HL ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD>
LD A,(KEYFLAG)
XOR 1<<PAUSE_L
LD (KEYFLAG),A
AND 1<<PAUSE_L
RET Z
EI
.loop: HALT
BIT PAUSE_L,(IX+K_LOCK)
JR NZ,.loop
DI
RET
;
SCL_X: LD A,(KEYFLAG)
XOR 1<<SCRL_L
LD (KEYFLAG),A
RET
;
;small optimization
; RST_X BIT X_CTRL,(IX+K_SHIFT)
; RET Z
; BIT X_ALT,(IX+K_SHIFT)
; RET Z
; XOR A
; LD BC,#01FD
; RST ToBIOS
; RET
;;;
UNSHIFT: LD A,L
CP #37 ;L ALT
JR NZ,.USH1
RES L_ALT,(IX+K_SHIFT)
BIT R_ALT,(IX+K_SHIFT)
RET NZ
RES X_ALT,(IX+K_SHIFT)
RET
;
.USH1: CP #39 ;R ALT
JR NZ,.USH2
RES R_ALT,(IX+K_SHIFT)
BIT L_ALT,(IX+K_SHIFT)
RET NZ
RES X_ALT,(IX+K_SHIFT)
RET
;
.USH2: CP #36 ;L CTRL
JR NZ,.USH3
RES L_CTRL,(IX+K_SHIFT)
IF CHANGE_LANG_CTRL_SHIFT
CALL .CHECK_CTRL_SHIFT
ENDIF
BIT R_CTRL,(IX+K_SHIFT)
RET NZ
RES X_CTRL,(IX+K_SHIFT)
RET
;
.USH3: CP #3A ;R CTRL
JR NZ,.USH4
RES R_CTRL,(IX+K_SHIFT)
IF CHANGE_LANG_CTRL_SHIFT
CALL .CHECK_CTRL_SHIFT
ENDIF
BIT L_CTRL,(IX+K_SHIFT)
RET NZ
RES X_CTRL,(IX+K_SHIFT)
RET
;
.USH4: CP #29 ;L SHIFT
JR NZ,.USH5
RES L_SHIFT,(IX+K_SHIFT)
IF CHANGE_LANG_CTRL_SHIFT
JR .CHECK_CTRL_SHIFT
ELSE
RET
ENDIF
;
.USH5: CP #34 ;R SHIFT
;JR NZ,.USH6
RET NZ
RES R_SHIFT,(IX+K_SHIFT)
IFN CHANGE_LANG_CTRL_SHIFT
.USH6: RET
ELSE
.CHECK_CTRL_SHIFT:
BIT CTRL_SHIFT,(IX+KEYFLG)
RET Z
JP LANG_X
ENDIF
SHIFTS: LD A,L
CP #37 ;L ALT
JR NZ,.NSH1
SET L_ALT,(IX+K_SHIFT)
SET X_ALT,(IX+K_SHIFT)
RET
;
.NSH1: CP #39 ;R ALT
JR NZ,.NSH2
SET R_ALT,(IX+K_SHIFT)
SET X_ALT,(IX+K_SHIFT)
RET
;
.NSH2: CP #36 ;L CTRL
JR NZ,.NSH3
SET L_CTRL,(IX+K_SHIFT)
SET X_CTRL,(IX+K_SHIFT)
RET
;
.NSH3: CP #3A ;R CTRL
JR NZ,.NSH4
SET R_CTRL,(IX+K_SHIFT)
SET X_CTRL,(IX+K_SHIFT)
RET
;
.NSH4: CP #29 ;L SHIFT
JR NZ,.NSH5
SET L_SHIFT,(IX+K_SHIFT)
; BIT X_CTRL,(IX+K_SHIFT)
; RET Z
; SET
RET
;
.NSH5: CP #34 ;R SHIFT
;JR NZ,.NSH6
RET NZ
SET R_SHIFT,(IX+K_SHIFT)
.NSH6: RET
XLAT: BIT FLAG_E0,(IX+KEYFLG)
JR Z,.W_O_E0
CP #11 ;Right ALT
LD L,#39
RET Z
CP #14 ;Right CTRL
LD L,#3A
RET Z
CP #5A ;enter
LD L,#4E
RET Z
CP #4A ; /
LD L,#4A
RET Z
CP #7C ; * - Print Screen
LD L,#47
RET Z
LD L,A
.W_O_E0: ;LD H,high XLAT_T
;LD L,(HL)
; [x] 31/03/2024 <20><><EFBFBD><EFBFBD><E0A0A2><EFBFBD> <20><><EFBFBD> <20> <20><><EFBFBD><E5AEA4> <20><> <20><EFBFBD><E0A0AD><EFBFBD><><E2A0A1><EFBFBD><EFBFBD> XLAT_T
CP XLAT_T.Size
LD L,0
RET NC
;
LD HL,XLAT_T
ADD A,L
LD L,A
JR NC,.no_inc
INC H
.no_inc: LD L,(HL)
RET
;
;INPCODE BIT 1,(IX+1) ;00110000
; JR NZ,FN_KEY ;LRCAcaRP
INPCODE: LD D,L
LD E,0
BIT LANG_L,(IX+K_LOCK)
JP NZ,RUSCODE
LD A,(KEYCTRL)
AND 1<<L_SHIFT | 1<<R_SHIFT
JR NZ,.SHIFT
SET 7,D
BIT X_ALT,(IX+K_SHIFT)
RET NZ
BIT X_CTRL,(IX+K_SHIFT)
RET NZ
LD D,L
BIT CAPS_L,(IX+K_LOCK)
LD BC,CAPSTAB
JR NZ,CONVERT.NO_SET
LD BC,NORMTAB
JR CONVERT.NO_SET
;
.SHIFT: LD BC,SHIFTAB
BIT CAPS_L,(IX+K_LOCK)
JR Z,CONVERT.SET
LD BC,SHF2TAB
CONVERT: ;
.SET: SET 7,D
.NO_SET: LD H,0
ADD HL,BC
LD E,(HL)
RET
RUSCODE: LD A,(KEYCTRL)
AND 1<<L_SHIFT | 1<<R_SHIFT
JR NZ,.SHIFT
SET 7,D
BIT X_ALT,(IX+K_SHIFT)
RET NZ
BIT X_CTRL,(IX+K_SHIFT)
RET NZ
LD D,L
BIT CAPS_L,(IX+K_LOCK)
LD BC,CAPSRUS
JR NZ,CONVERT.NO_SET
LD BC,NORMRUS
JR CONVERT.NO_SET
;
.SHIFT: LD BC,SHIFRUS
BIT CAPS_L,(IX+K_LOCK)
JR Z,CONVERT.SET
LD BC,SHF2RUS
JR CONVERT.SET
;-----------------------------------------------------------------------
;!TEST
K_SETUP: INC B
DJNZ K_SND_R
; subfunc 0
KEYMAP: LD BC,ENDNORM-NORMTAB
BIT 7,A
JR NZ,READMAP
;
LD DE,NORMTAB
OR A
JR Z,.LTAB
LD DE,SHIFTAB
DEC A
JR Z,.LTAB
LD DE,CAPSTAB
DEC A
JR Z,.LTAB
LD DE,SHF2TAB
DEC A
JR Z,.LTAB
LD DE,NORMRUS
DEC A
JR Z,.LTAB
LD DE,SHIFRUS
DEC A
JR Z,.LTAB
LD DE,CAPSRUS
DEC A
JR Z,.LTAB
LD DE,SHF2RUS
DEC A
JR Z,.LTAB
;
XOR A ; ????? <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> .INVALID_COMMAND?
SCF
RET
;
.LTAB: LDIR
XOR A
RET
;
READMAP: RES 7,A
LD DE,NORMTAB
OR A
JR Z,.RTAB
LD DE,SHIFTAB
DEC A
JR Z,.RTAB
LD DE,CAPSTAB
DEC A
JR Z,.RTAB
LD DE,SHF2TAB
DEC A
JR Z,.RTAB
LD DE,NORMRUS
DEC A
JR Z,.RTAB
LD DE,SHIFRUS
DEC A
JR Z,.RTAB
LD DE,CAPSRUS
DEC A
JR Z,.RTAB
LD DE,SHF2RUS
DEC A
JR Z,.RTAB
XOR A ; ????? <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> .INVALID_COMMAND?
SCF
RET
;
.RTAB: EX DE,HL
LDIR
XOR A
RET
;
; DEC B
; JP Z,KEYMAP
; DEC B
; JP Z,K_SND_R
; DEC B
; JP Z,K_SND_W
; error subfunc
K_SETUP.ERROR: LD A,DSS_Error.sys.INVALID_ACCESS
SCF
RET
;
K_SND_R: DJNZ K_SND_W
; subfunc 1
LD A,(SOUND_K)
AND A
RET
; subfunc 2
K_SND_W: ;DJNZ K_RESET_BUFFER ;. [ ] 31/03/2024 subfunc 3 <20><EFBFBD> <20><>?
DJNZ K_SETUP.ERROR
;
LD (SOUND_K),A
AND A
RET
;
; ;. [ ] 31/03/2024 subfunc 3 <20><EFBFBD> <20><>?
; K_RESET_BUFFER: DJNZ K_SETUP.ERROR
; LD A,R
; PUSH AF
; EI
; ;
; .Clear_loop: ; empty the buffer
; HALT
; IN A,(Z84.SIO.Ch_A.Data)
; IN A,(Z84.SIO.Ch_A.Ctrl)
; RRCA
; JR C,.Clear_loop
; ;
; DI
; POP AF
; JP PO,KBD_Receiver_Overrun.reset_errors
; EI
; JP KBD_Receiver_Overrun.reset_errors
;;;;;;;;;;;;;;;;
;;;;;;;;
; K_SETUP: INC B
; DEC B
; JP Z,KEYMAP
; DEC B
; JP Z,K_SND_R
; DEC B
; JP Z,K_SND_W
; LD A,DSS_Error.sys.INVALID_ACCESS
; SCF
; RET
; ;
; K_SND_R: LD A,(SOUND_K)
; AND A
; RET
; ;
; K_SND_W: LD (SOUND_K),A
; AND A
; RET
; ;
; KEYMAP: LD BC,ENDNORM-NORMTAB
; BIT 7,A
; JR NZ,READMAP
; ;
; LD DE,NORMTAB
; OR A
; JR Z,.LTAB
; LD DE,SHIFTAB
; DEC A
; JR Z,.LTAB
; LD DE,CAPSTAB
; DEC A
; JR Z,.LTAB
; LD DE,SHF2TAB
; DEC A
; JR Z,.LTAB
; LD DE,NORMRUS
; DEC A
; JR Z,.LTAB
; LD DE,SHIFRUS
; DEC A
; JR Z,.LTAB
; LD DE,CAPSRUS
; DEC A
; JR Z,.LTAB
; LD DE,SHF2RUS
; DEC A
; JR Z,.LTAB
; ;
; XOR A ; ????? <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> .INVALID_COMMAND ?
; SCF
; RET
; ;
; .LTAB: LDIR
; XOR A
; RET
; READMAP: RES 7,A
; LD DE,NORMTAB
; OR A
; JR Z,.RTAB
; LD DE,SHIFTAB
; DEC A
; JR Z,.RTAB
; LD DE,CAPSTAB
; DEC A
; JR Z,.RTAB
; LD DE,SHF2TAB
; DEC A
; JR Z,.RTAB
; LD DE,NORMRUS
; DEC A
; JR Z,.RTAB
; LD DE,SHIFRUS
; DEC A
; JR Z,.RTAB
; LD DE,CAPSRUS
; DEC A
; JR Z,.RTAB
; LD DE,SHF2RUS
; DEC A
; JR Z,.RTAB
; XOR A ; ????? <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> .INVALID_COMMAND ?
; SCF
; RET
; ;
; .RTAB: EX DE,HL
; LDIR
; XOR A
; RET
; ;
;-----------------------------------------------------------------------
;!FIXIT <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD>
; DE - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; HL - <20><EFBFBD><E0AEA4><EFBFBD><EFBFBD>⥫쭮<E2A5AB><ECADAE><EFBFBD>
BEEP: LD A,#10
CALL .beep_loop
; A = 0
CALL .beep_loop
;
DEC HL
LD A,H
OR L
JR NZ,BEEP
RET
;
.beep_loop: OUT (ZX_Beeper),A
LD B,D
LD C,E
;
.loop: DEC BC
LD A,B
OR C
JR NZ,.loop
RET
KEYBOARD_INIT: DI
; reg 0
XOR A
OUT (Z84.SIO.Ch_A.Ctrl),A
; reg 4
LD A,4
OUT (Z84.SIO.Ch_A.Ctrl),A
;LD A,5 ; parity
OUT (Z84.SIO.Ch_A.Ctrl),A
; reg 3
LD A,3
OUT (Z84.SIO.Ch_A.Ctrl),A
LD A,#C1
OUT (Z84.SIO.Ch_A.Ctrl),A
; reg 5
LD A,5
OUT (Z84.SIO.Ch_A.Ctrl),A
LD A,#62
OUT (Z84.SIO.Ch_A.Ctrl),A
; reg 1
LD A,1
OUT (Z84.SIO.Ch_A.Ctrl),A
IF KEYBOARD_INT_ENABLED
LD A,%0001'1001
ELSE
XOR A
ENDIF
OUT (Z84.SIO.Ch_A.Ctrl),A
;
EI
RET
;
;[x] 18/02/2024 <20><EFBFBD><20><> <20><><EFBFBD><E0A5AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
KBD_Receiver_Overrun:
; empty the buffer
IN A,(Z84.SIO.Ch_A.Data)
IN A,(Z84.SIO.Ch_A.Ctrl)
RRCA
JR C,KBD_Receiver_Overrun
; reg 0 - error reset
.reset_errors: LD A,%0011'0000
OUT (Z84.SIO.Ch_A.Ctrl),A
;!TODO <20><><EFBFBD> <20><><EFBFBD><E2A5AA> <20><><EFBFBD><E0A5AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> #FE ᯥ<><E1AFA5><EFBFBD>
;
XOR A
LD (KEYCTRL),A
LD (KEY_FLG),A
;LD (UNCODE),A
RET
;
; [ ] <20><><EFBFBD><EFBFBD> <20><EFBFBD>
; Break_Process: LD A,(TASK)
; XOR 2 ; 2 - task of primary shell
; RET Z
; LD B,DSS_Error.sys.USER_ABORT
; JP LEAVE
; `
; 0
; Esc, "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-", "=", Back
; 1 2 3 4 5 6 7 8 9 A B C D E
; Tab, "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "[", "]"
; F 10 11 12 13 14 15 16 17 18 19 1A 1B
; Cps, "A", "S", "D", "F", "G", "H", "J", "K", "L", ";", "'", Enter
; 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28
; LSh, "Z", "X", "C", "V", "B", "N", "M", ",", ".", "/", RSh, #5C
; 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35
; LCl, LAt, SPC, Rat, RCl, F01, F02, F03, F04, F05, F06, F07, F08
; 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42
; F09, F10, F11, F12, prn, scr, num, "/", "*", "-", "+", ent, Del
; 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
; Ins, End, Dwn, PgD, Lft, "5", Rgh, Hom, Upp, PgU
; 50 51 52 53 54 55 56 57 58 59
;
;
;================================
Esc EQU #1B
Bcs EQU #08
Tab EQU #09
Cps EQU #00
Spc EQU #20
Ent EQU #0D
;Standart ASCII tables
NORMTAB DB "`",Esc,"1","2","3","4","5","6","7","8","9","0","-","=",Bcs
DB Tab,"q","w","e","r","t","y","u","i","o","p","[","]"
DB Cps,"a","s","d","f","g","h","j","k","l",";","'",Ent
DB #00,"z","x","c","v","b","n","m",#2C,".","/",#00,#5C
DB #00,#00,Spc,#00,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00
DB #00,#00,#00,"/","*","-","+",Ent,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00
ENDNORM
SHIFTAB DB "~",Esc,"!","@","#","$","%","^","&","*","(",")","_","+",Bcs
DB Tab,"Q","W","E","R","T","Y","U","I","O","P","{","}"
DB Cps,"A","S","D","F","G","H","J","K","L",":",#22,Ent
DB #00,"Z","X","C","V","B","N","M","<",">","?",#00,"|"
DB #00,#00,Spc,#00,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00
DB #00,#00,#00,"/","*","-","+",Ent,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00
CAPSTAB DB "`",Esc,"1","2","3","4","5","6","7","8","9","0","-","=",Bcs
DB Tab,"Q","W","E","R","T","Y","U","I","O","P","[","]"
DB Cps,"A","S","D","F","G","H","J","K","L",";","'",Ent
DB #00,"Z","X","C","V","B","N","M",#2C,".","/",#00,#5C
DB #00,#00,Spc,#00,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00
DB #00,#00,#00,"/","*","-","+",Ent,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00
SHF2TAB DB "~",Esc,"!","@","#","$","%","^","&","*","(",")","_","+",Bcs
DB Tab,"q","w","e","r","t","y","u","i","o","p","{","}"
DB Cps,"a","s","d","f","g","h","j","k","l",":",#22,Ent
DB #00,"z","x","c","v","b","n","m","<",">","?",#00,"|"
DB #00,#00,Spc,#00,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00
DB #00,#00,#00,"/","*","-","+",Ent,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00
;Standart Russian tables
NORMRUS DB #F1,Esc,"1","2","3","4","5","6","7","8","9","0","-","=",Bcs
DB Tab,#A9,#E6,#E3,#AA,#A5,#AD,#A3,#E8,#E9,#A7,#E5,#EA
DB Cps,#E4,#EB,#A2,#A0,#AF,#E0,#AE,#AB,#A4,#A6,#ED,Ent
DB #00,#EF,#E7,#E1,#AC,#A8,#E2,#EC,#A1,#EE,".",#00,#5C
DB #00,#00,Spc,#00,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00
DB #00,#00,#00,"/","*","-","+",Ent,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00
SHIFRUS DB #F0,Esc,"!",#22,"#","$",":",#2C,".",";","?","%","_","+",Bcs
DB Tab,#89,#96,#93,#8A,#85,#8D,#83,#98,#99,#87,#95,#9A
DB Cps,#94,#9B,#82,#80,#8F,#90,#8E,#8B,#84,#86,#9D,Ent
DB #00,#9F,#97,#91,#8C,#88,#92,#9C,#81,#9E,#2C,#00,"|"
DB #00,#00,Spc,#00,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00
DB #00,#00,#00,"/","*","-","+",Ent,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00
CAPSRUS DB #F0,Esc,"1","2","3","4","5","6","7","8","9","0","-","=",Bcs
DB Tab,#89,#96,#93,#8A,#85,#8D,#83,#98,#99,#87,#95,#9A
DB Cps,#94,#9B,#82,#80,#8F,#90,#8E,#8B,#84,#86,#9D,Ent
DB #00,#9F,#97,#91,#8C,#88,#92,#9C,#81,#9E,".",#00,#5C
DB #00,#00,Spc,#00,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00
DB #00,#00,#00,"/","*","-","+",Ent,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00
SHF2RUS DB #F1,Esc,"!",#22,"#","$",":",#2C,".",";","?","%","_","+",Bcs
DB Tab,#A9,#E6,#E3,#AA,#A5,#AD,#A3,#E8,#E9,#A7,#E5,#EA
DB Cps,#E4,#EB,#A2,#A0,#AF,#E0,#AE,#AB,#A4,#A6,#ED,Ent
DB #00,#EF,#E7,#E1,#AC,#A8,#E2,#EC,#A1,#EE,#2C,#00,"|"
DB #00,#00,Spc,#00,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00,#00
DB #00,#00,#00,"/","*","-","+",Ent,#00
DB #00,#00,#00,#00,#00,#00,#00,#00,#00,#00
;================================
;//MODULE: KEYINTER
;[END]
; ENDMODULE