Estex-DSS/DSS/KEYINTER.ASM
Anatoliy Belyanskiy b1d75de608 fix
2024-03-31 03:33:40 +10:00

1282 lines
25 KiB
NASM
Raw Blame History

;[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 ;------------------------------;
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 #19
CURSOR_ZG: EQU #1A
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:
.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 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: XOR A ; <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
.put_: 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
XOR A
LD BC,NORM_ZG*256+BIOS.WIN_PUT_SYM ; ᨬ<><E1A8AC><EFBFBD> <20><> <20><>
RST ToBIOS
LD DE,(Cursor_Off.pos)
CALL LOCATE
RET
; <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>.
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,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
;
; [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)
; [ ] 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
;BIT X_SHIFT,(IX+K_LOCK)
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
;BIT X_SHIFT,(IX+K_LOCK)
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
; ;
;-----------------------------------------------------------------------
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 <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
;!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 <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
; [x] <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]