mirror of
https://github.com/Tolik-Trek/Estex-DSS.git
synced 2026-06-15 09:21:47 +03:00
1354 lines
27 KiB
NASM
1354 lines
27 KiB
NASM
|
||
; 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
|
||
.buffer.size EQU 2048
|
||
;
|
||
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
|
||
; .set: 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
|
||
;
|
||
; [ ] 31/03/2025
|
||
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||
call .get_font
|
||
; <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+(.buffer.size - (2*256)) ; <20><><EFBFBD><E1ABA5><EFBFBD><EFBFBD> 512 <20><><EFBFBD><EFBFBD>
|
||
ld e,l
|
||
ld d,h
|
||
ld bc,512-1
|
||
ld (hl),#FF
|
||
inc de
|
||
ldir
|
||
ld a,CURSOR_ZG; ; <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. "<22><><EFBFBD><EFBFBD><EFBFBD>窠"
|
||
call .set_font
|
||
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||
call .get_font
|
||
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㥬 䮭<>
|
||
ld hl,.buffer
|
||
ld bc,.buffer.size
|
||
.loop_font: ld a,(hl)
|
||
cpl
|
||
ld (hl),a
|
||
cpi
|
||
jp pe,.loop_font
|
||
;
|
||
ld a,INS_CUR_ZG ; <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. "<22><><EFBFBD><EFBFBD>"
|
||
call .set_font
|
||
;
|
||
pop af
|
||
out (SLOT3),a ; <20><><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD>
|
||
ret
|
||
;
|
||
.set_font: ld c,BIOS.WIN_SET_ZG ; <20><><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||
jr ._font
|
||
;
|
||
.get_font: ld c,BIOS.WIN_GET_ZG ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||
._font: ld de,.buffer ; <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> 2048 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
jp ToBIOS
|
||
|
||
|
||
;
|
||
; 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_CURSOR_ON ; [ ] 26/04/2025 <20><>ࠢ<EFBFBD><E0A0A2><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
;
|
||
LD (SOUND_K),A
|
||
AND A
|
||
RET
|
||
;
|
||
|
||
; [ ] 26/04/2025 <20><>ࠢ<EFBFBD><E0A0A2><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
K_CURSOR_ON: DJNZ K_CURSOR_OFF
|
||
LD A,(VMODE)
|
||
RLA
|
||
JP NC,Cursor_On
|
||
RET
|
||
;
|
||
|
||
; [ ] 26/04/2025 <20><>ࠢ<EFBFBD><E0A0A2><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
K_CURSOR_OFF: DJNZ K_SETUP.ERROR
|
||
LD A,(VMODE)
|
||
RLA
|
||
JP NC,Cursor_Off
|
||
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 |