Estex-DSS/DSS/KEYINTER.ASM

1099 lines
22 KiB
NASM
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;[BEGIN]
;//MODULE: KEYINTER
;//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
;
_mInfoALIGN 256,0
;KEYBOARD BUFFER
SBUF: BLOCK 64,0
HEAD DB #00
HOST DB #00
K_LOCK EQU $-KEYFLAG
LANG_L EQU 7
PAUSE_L EQU 6
LANG_R EQU 5 ; á®ç¥â ­¨¥ ª« ¢¨è ¤«ï ¯¥à¥ª«î祭¨ï ï§ëª  ®â¦ â®
LANG_S EQU 4 ; á®ç¥â ­¨¥ ª« ¢¨è ¤«ï ¯¥à¥ª«î祭¨ï ï§ëª  ­ ¦ â®
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
FLAG_00 EQU 0
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 DW 0 ; ¯®á«¥¤­ïï ®â¦ â ï ª« ¢¨è 
; D15 - LShift
; D14 - RShift
; D13 - CTRL
; D12 - ALT
; D11 - LCTRL
; D10 - LALT
; D9 - RCTRL
; D8 - RALT
; D7 - Language Lock
; D6 - Reserved
; 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 ;------------------------------;
delay_curs: EQU 11 ; ç áâ®â  ¬¨£ ­¨ï ªãàá®à 
INS_CUR_ZG: EQU #19
CURSOR_ZG: EQU #1A
NORM_ZG: EQU #1B
ECHOKEY: CALL Cursor_On ; ¢ª«. ªãàá®à, ãáâ ­®¢¨âì 䮪ãá ­  "Input Line"
EI
.loop: CALL SCANKEY
JR Z,.loop
PUSH DE
PUSH BC
PUSH AF
CALL Cursor_Off ; ¢ëª«. ªãàá®à
POP AF
OR A
; [x] -bug with Vasil's version of cursor
CALL NZ,PUTCHAR.NO_SCROLL ; ¤®¡ ¢¨« ¢ë¢®¤ "a" ­  íªà ­
POP BC
POP DE
LD A,E
AND A
RET
Cursor:
.Flag+1: LD A,0 ; ä« £ ªãàá®à  00-­¥â/01-¥áâì
CPL
LD (.Flag),A
; ‚ª«îç¨âì ªãàá®à
Cursor_On: LD C,BIOS.LP_GET_PLACE ; ã§­ âì ¯®«®¦. ªãàá®à 
RST ToBIOS
LD (Cursor_Off.pos),DE
XOR A
LD C,BIOS.WIN_GET_SYM ; ¯®«ãç¨âì ᨬ¢®«
RST ToBIOS
LD BC,NORM_ZG*256+BIOS.WIN_PUT_SYM ; b=§­ ª®£¥­., á=ᨬ¢®« ­  íªà ­
LD A,(Cursor.Flag)
OR A
JR Z,.put
LD B,CURSOR_ZG ; ç¥àâ 
LD A,(KEYFLAG) ; ä« £¨ ª« ¢ë
;BIT 1,A ; ¡¨â Ins
AND %0000'0010 ; ¡¨â Ins
JR NZ,.put
LD B,INS_CUR_ZG ; ¡«®ª
.put: XOR A ; ­®¬¥à ®ª­ 
RST ToBIOS
LD DE,(Cursor_Off.pos)
CALL LOCATE
LD A,1
LD (Cursor_Off.Flag),A
LD A,delay_curs
RET
; ‚몫îç¨âì ªãàá®à
Cursor_Off:
.Flag+1: LD A,0 ; ä« £ ªãàá®à : 00-¢ëª«/01-¢ª«
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 ¯®«®¦.
BIT 7,E
RET NZ
LD C,BIOS.WIN_GET_SYM ; ¯®«ãç¨âì ᨬ¢®«
XOR A
RST ToBIOS
XOR A
LD BC,NORM_ZG*256+BIOS.WIN_PUT_SYM ; ᨬ¢®« ­  íªà ­
RST ToBIOS
LD DE,(Cursor_Off.pos)
CALL LOCATE
RET
; ‚¥ªâ®à ®¡á«ã¦¨¢ ­¨ï ªãàá®à 
cursor_interrupt:
LD A,(Cursor_Off.Flag)
OR A
RET Z
.timer+1: LD A,1 ; ¯ ã§  ¬¨£ ­¨ï
DEC A
CALL Z,Cursor
LD (.timer),A
RET
; <20> áâனª  §­ ª®£¥­¥à â®à  ªãàá®à  ç¥àâ®çª®©
SETUP_CURSORS:
.buffer EQU #C000
;
in a,(SLOT3)
push af ; á®åà. ¯®àâ
ld a,(BANKTBL+TXTPAGE) ; 2-© «®£. ­®¬¥à áâà ­¨æë à áè. „Ž‘
out (SLOT3),a
; ¯®«ãç¨âì á¨áâ. §­ ª®£¥­.
ld de,.buffer ;!HARDCODE ¡ãä¥à ¤«ï 2048 ¡ ©â ¤ ­­ëå
push de
ld c,BIOS.WIN_GET_ZG ; ¯®«ãç¨âì §­ ª®£¥­.
rst ToBIOS
; § ¯®«­¨âì ª®¤®¬ #FF 2 ­¨¦­¨¥ «¨­¨¨
ld hl,.buffer+(2048-(2*256)) ;!HARDCODE ¯®á«¥¤­¨¥ 512 ¡ ©â
ld bc,511
ld a,CURSOR_ZG; ; ­®¬¥à §­ ª®£¥­. "ç¥àâ®çª "
call .fill_data_font
pop hl
; § ¯®«­¨âì ®áâ «ì­ë¥ 6 «¨­¨© (¯®«­ë© ¡«®ª)
ld bc,2048-513 ;!HARDCODE
ld a,INS_CUR_ZG ; ­®¬¥à §­ ª®£¥­. "¡«®ª"
call .fill_data_font
pop af
out (SLOT3),a ; ¢®ááâ. ¯®àâ
ret
; <20> áâனª  §­ ª®£¥­. ¨ ¥£® ॣ¨áâà æ¨ï
; ¢å®¤: a=­®¬¥à §­ ª®£¥­.
; hl=¤ ­­ë¥
; bc=à §¬¥à ¤ ­­ëå
.fill_data_font:
ld e,l
ld d,h
ld (hl),#FF
inc de
ldir
ld de,.buffer ; §­ ª®£¥­.
ld c,BIOS.WIN_SET_ZG ; ãáâ. §­ ª®£¥­.
rst 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,SBUF/256
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,SBUF/256
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,SBUF/256
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
.E1_KEY:
SET FLAG_E1,(IX+KEYFLG)
JR KEYSCAN.RESCAN
;
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 ¯à®¢¥àª  ­  ¯¥à¥¯®«­¥­¨¥ ¡ãä¥à 
; 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
JR Z,FULL_BF.E1_KEY
;
BIT FLAG_F0,(IX+KEYFLG)
JR NZ,UN_KEY
;
LD L,A
CALL XLAT
CALL SHIFTS
RES FLAG_E0,(IX+KEYFLG)
RES FLAG_E1,(IX+KEYFLG)
;[ ] ¢ë£à¥¡á⨠¢¥áì ¡ãä¥à
JR Z,.RESCAN
; RET Z ;IT'S SHIFT 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
;
LD BC,(KEYFLAG)
CALL PUTSYM
;[ ] 29/02/2024 ¢ë£à¥¡á⨠¢¥áì ¡ãä¥à
JR .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,(IX+K_LOCK)
XOR 1<<CAPS_L
LD (IX+K_LOCK),A
RET
;
LANG_X: IFN CHANGE_LANG_CTRL_SHIFT
BIT X_CTRL,(IX+K_SHIFT)
RET Z
ENDIF
LD A,(IX+K_LOCK)
XOR 1<<LANG_L
LD (IX+K_LOCK),A
BIT SF_ALT,(IX+SOUND_K)
RET Z
EXX
LD DE,190
LD HL,20
CALL BEEP
EXX
RET
;
INS_X: LD A,(IX+K_LOCK)
XOR 1<<INS_L
LD (IX+K_LOCK),A
RET
;
NUM_X: LD A,(IX+K_LOCK)
XOR 1<<NUM_L
LD (IX+K_LOCK),A
RET
;
PAUSE_X: BIT X_CTRL,(IX+K_SHIFT)
RET Z
POP HL ; ¡ « ­á á⥪ 
LD A,(IX+K_LOCK)
XOR 1<<PAUSE_L
LD (IX+K_LOCK),A
BIT PAUSE_L,A
RET Z
EI
.loop: HALT
BIT PAUSE_L,(IX+K_LOCK)
JR NZ,.loop
DI
RET
;
SCL_X: LD A,(IX+K_LOCK)
XOR 1<<SCRL_L
LD (IX+K_LOCK),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)
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)
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)
RET
;
.USH5: CP #34 ;R SHIFT
;JR NZ,.USH6
RET NZ
RES R_SHIFT,(IX+K_SHIFT)
.USH6: RET
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)
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)
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,(IX+K_SHIFT)
AND #C0
JR NZ,SHIFT_L
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,CONVER.NO_SET
LD BC,NORMTAB
JR CONVER.NO_SET
;
; CONVER: LD H,0
; ADD HL,BC
; LD E,(HL)
; RET
SHIFT_L: LD BC,SHIFTAB
BIT CAPS_L,(IX+K_LOCK)
JR Z,CONVER.SET
LD BC,SHF2TAB
CONVER: ;
.SET: SET 7,D
.NO_SET: LD H,0
ADD HL,BC
LD E,(HL)
RET
RUSCODE: LD A,(IX+K_SHIFT)
AND #C0
JR NZ,SHIFT_R
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,CONVER.NO_SET
LD BC,NORMRUS
JR CONVER.NO_SET
; LD H,0
; ADD HL,BC
; LD E,(HL)
; RET
SHIFT_R: LD BC,SHIFRUS
BIT CAPS_L,(IX+K_LOCK)
JR Z,CONVER.SET
LD BC,SHF2RUS
JR CONVER.SET
; .CONVER: SET 7,D
; LD H,0
; ADD HL,BC
; LD E,(HL)
; RET
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
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_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 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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 ; ????? ¬®¦¥â âãâ ­ ¤® .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 ; ????? ¬®¦¥â âãâ ­ ¤® .INVALID_COMMAND ?
SCF
RET
;
.RTAB: EX DE,HL
LDIR
XOR A
RET
;
BEEP: LD A,#10
OUT (ZX_Beeper),A
LD B,D
LD C,E
.loop1: DEC BC
LD A,B
OR C
JR NZ,.loop1
XOR A ;LD A,#00
OUT (ZX_Beeper),A
LD B,D
LD C,E
.loop2: DEC BC
LD A,B
OR C
JR NZ,.loop2
DEC HL
LD A,H
OR L
JR NZ,BEEP
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 ¯à®¢¥àª  ­  ¯¥à¥¯®«­¥­¨¥ ¡ãä¥à 
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
LD A,%0011'0000
OUT (Z84.SIO.Ch_A.Ctrl),A
;!TEST SIO INT
; reg 0 - return from int
IF KEYBOARD_INT_ENABLED
LD A,%0011'1000
OUT (Z84.SIO.Ch_A.Ctrl),A
ENDIF
;
;!TODO ¯à¨ ¤¥â¥ªâ¥ ¯¥à¥¯®«­¥­¨ï ¡ãä¥à  ¯à®æ  á­ïâì ª« ¢¨è¨ ¨§ ¯®àâ  #FE ᯥªâà㬠
;
LD (IX+K_SHIFT),0
LD (IX+KEYFLG),0
;
;AND A
RET
; `
; 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]