Sprinter-BIOS/src/bios/rom/SETUP/KEY.asm
Anatoliy Belyanskiy 91c22e8e58 ...
2023-12-30 03:05:24 +10:00

736 lines
21 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.

;
_mInfoALIGN 256,0 ; ¢ëà ¢­¨¢ ­¨¥ ­   ¤à¥á #XX00
SBUF: BLOCK 64,0
HEAD: DB 0
HOST: DB 0
;
K_LOCK EQU $-KEYFLAG
LANG_L EQU 7
PAUSE_L EQU 6
RES5_L EQU 5
RES4_L EQU 4
NUM_L EQU 3
SCRL_L EQU 2
INS_L EQU 1
CAPS_L EQU 0
KEYFLAG: DB 2 ;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 0
;
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 0
;
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 3
;
UNCODE: DW 0000
;
; 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
CTRLKEY:
LD HL,HOST
LD A,(HEAD)
CP (HL)
LD BC,(KEYFLAG)
LD A,#00
RET Z
DEC A
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
KEYSCAN:
LD IX,KEYFLAG
RESCANN:
IN A,(Z84.SIO.Ch_A.Ctrl)
BIT 0,A
RET Z
IN A,(Z84.SIO.Ch_A.Data)
CP #F0
JR Z,F0_KEY
CP #E0
JR Z,E0_KEY
CP #E1
JR Z,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)
RET Z ;IT'S SHIFT KEY
CALL INPCODE ;L - AT POS. CODE
.PUTCODE:
LD HL,#1C00 ;Caps Lock
AND A
SBC HL,DE
CALL Z,CAPS_X
; !TODO ¢¥à­ãâì àãá᪨©? € § ç¥¬?
; LD HL,#B800 ;Ctrl + Space
; AND A
; SBC HL,DE
; CALL Z,RUS_X
LD HL,#5000 ;Insert
AND A
SBC HL,DE
CALL Z,INS_X
LD HL,#4900 ;Num Lock
AND A
SBC HL,DE
CALL Z,NUM_X
LD HL,#C900 ;Pause Lock
AND A
SBC HL,DE
CALL Z,PAUSE_X
LD HL,#4800 ;Scroll Lock
AND A
SBC HL,DE
CALL Z,SCL_X
;-----------------------; !!!!! à¥á¥â ¯® Š€„
; LD HL,#CF00 ; ; Ctrl + Alt + Del
; AND A ;
; SBC HL,DE ;
; CALL Z,RST_X ;
;-----------------------;
LD BC,(KEYFLAG)
CALL PUTSYM
RET
E0_KEY: SET FLAG_E0,(IX+KEYFLG)
JR RESCANN
F0_KEY: SET FLAG_F0,(IX+KEYFLG)
JR RESCANN
E1_KEY: SET FLAG_E1,(IX+KEYFLG)
JR RESCANN
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
CAPS_X: LD A,(IX+K_LOCK)
XOR #01
LD (IX+K_LOCK),A
RET
INS_X: LD A,(IX+K_LOCK)
XOR #02
LD (IX+K_LOCK),A
RET
NUM_X: LD A,(IX+K_LOCK)
XOR #08
LD (IX+K_LOCK),A
RET
PAUSE_X:
BIT X_CTRL,(IX+K_SHIFT)
RET Z
POP HL
LD A,(IX+K_LOCK)
XOR #40
LD (IX+K_LOCK),A
BIT PAUSE_L,(IX+K_LOCK)
RET Z
EI
.loop: HALT
BIT PAUSE_L,(IX+K_LOCK)
JR NZ,.loop
DI
RET
SCL_X: LD A,(IX+K_LOCK)
XOR #04
LD (IX+K_LOCK),A
RET
;///////////////////////////////////////////////////////////////////////
;///////////////////////////////////////////////////////////////////////
; !TODO £«ï­ãâì, ¬®¦¥â ¯à¨£®¤¨âáï
;ECHOKEY: CALL SCANKEY
; JR Z,ECHOKEY
; PUSH DE
; PUSH BC
; CALL PUTCHAR
; POP BC
; POP DE
; LD A,E
; AND A
; RET
; !TODO £«ï­ãâì, ¬®¦¥â ¯à¨£®¤¨âáï
; 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
; !TODO £«ï­ãâì, ¬®¦¥â ¯à¨£®¤¨âáï
; K_CLEAR:
; LD A,(HOST)
; LD (HEAD),A
; LD A,#2F
; CP B
; JR C,.K_C2
; LD A,1
; SCF
; RET
; .K_C2: LD A,#35
; CP B
; JR NC,.K_C3
; LD A,1
; SCF
; RET
; .K_C3: LD C,B
; RST #10
; RET
; !TODO ¢¥à­ãâì àãá᪨©? € § ç¥¬?
;RUS_X BIT X_CTRL,(IX+K_SHIFT)
; RET Z
; LD A,(IX+K_LOCK)
; XOR #80
; LD (IX+K_LOCK),A
; BIT SF_ALT,(IX+SOUND_K)
; RET Z
; EXX
; LD DE,190
; LD HL,20
; CALL BEEP
; EXX
; RET
;---------------------------- ;!!!!! à¥á¥â ¯® Š€„
; RST_X:
; BIT X_CTRL,(IX+K_SHIFT)
; RET Z
; BIT X_ALT,(IX+K_SHIFT)
; RET Z
; XOR A
; LD BC,#02FD
; RST_to_BIOS
; RET
;----------------------------
;///////////////////////////////////////////////////////////////////////
;///////////////////////////////////////////////////////////////////////
;
;;
UNSHIFT:
LD A,L
CP #37 ;L ALT
JR Z,.L_ALT
CP #39 ;R ALT
JR Z,.R_ALT
CP #36 ;L CTRL
JR Z,.L_CTRL
CP #3A ;R CTRL
JR Z,.R_CTRL
CP #29 ;L SHIFT
JR Z,.L_SHIFT
CP #34 ;R SHIFT
RET NZ
;.R_SHIFT:
RES R_SHIFT,(IX+K_SHIFT)
RET
.L_ALT:
RES L_ALT,(IX+K_SHIFT)
BIT R_ALT,(IX+K_SHIFT)
RET NZ
RES X_ALT,(IX+K_SHIFT)
RET
.R_ALT:
RES R_ALT,(IX+K_SHIFT)
BIT L_ALT,(IX+K_SHIFT)
RET NZ
RES X_ALT,(IX+K_SHIFT)
RET
.L_CTRL:
RES L_CTRL,(IX+K_SHIFT)
BIT R_CTRL,(IX+K_SHIFT)
RET NZ
RES X_CTRL,(IX+K_SHIFT)
RET
.R_CTRL:
RES R_CTRL,(IX+K_SHIFT)
BIT L_CTRL,(IX+K_SHIFT)
RET NZ
RES X_CTRL,(IX+K_SHIFT)
RET
.L_SHIFT:
RES L_SHIFT,(IX+K_SHIFT)
RET
;;
SHIFTS:
LD A,L
CP #37 ;L ALT
JR Z,.L_ALT
CP #39 ;R ALT
JR Z,.R_ALT
CP #36 ;L CTRL
JR Z,.L_CTRL
CP #3A ;R CTRL
JR Z,.R_CTRL
CP #29 ;L SHIFT
JR Z,.L_SHIFT
CP #34 ;R SHIFT
RET NZ
;R SHIFT:
SET R_SHIFT,(IX+K_SHIFT)
RET
.L_ALT:
SET L_ALT,(IX+K_SHIFT)
SET X_ALT,(IX+K_SHIFT)
RET
.R_ALT:
SET R_ALT,(IX+K_SHIFT)
SET X_ALT,(IX+K_SHIFT)
RET
.L_CTRL:
SET L_CTRL,(IX+K_SHIFT)
SET X_CTRL,(IX+K_SHIFT)
RET
.R_CTRL:
SET R_CTRL,(IX+K_SHIFT)
SET X_CTRL,(IX+K_SHIFT)
RET
.L_SHIFT:
SET L_SHIFT,(IX+K_SHIFT)
RET
;;
;
;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
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
_mInfoALIGN 256,0
XLAT_T:
; 0 1 2 3 4 5 6 7 8 9 A B C D E F
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
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
; !TODO ¯®á¬®âà¥âì
;INPCODE:
; BIT 1,(IX+1) ;00110000
; JR NZ,FN_KEY ;LRCAcaRP
INPCODE:
LD D,L
LD E,0
; BIT LANG_L,(IX+K_LOCK) ; !TODO ¢¥à­ãâì àãá᪨©? € § ç¥¬?
; 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
LD BC,NORMTAB
CONVER:
LD H,0
ADD HL,BC
LD E,(HL)
RET
SHIFT_L:
LD BC,SHIFTAB
BIT CAPS_L,(IX+K_LOCK)
JR Z,CONVER5
LD BC,SHF2TAB
CONVER5:
LD H,0
ADD HL,BC
LD E,(HL)
SET 7,D
RET
; !TODO ¢¥à­ãâì àãá᪨©? € § ç¥¬?
;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,CONVER2
; LD BC,NORMRUS
;CONVER2 LD H,0
; ADD HL,BC
; LD E,(HL)
; RET
;
;SHIFT_R LD BC,SHIFRUS
; BIT CAPS_L,(IX+K_LOCK)
; JR Z,CONVER4
; LD BC,SHF2RUS
;CONVER4 LD H,0
; ADD HL,BC
; LD E,(HL)
; SET 7,D
; 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,#0E
; SCF
; RET
;
;K_SND_R LD A,(SOUND_K)
; AND A
; RET
;
;K_SND_W LD (SOUND_K),A
; 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,"\"
; 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
; !TODO ¢¥à­ãâì àãá᪨©? € § ç¥¬?
;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,"\"
; 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,"\"
; 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
;
;================================
BEEP: LD A,#10
OUT (#FE),A
LD B,D
LD C,E
BPP: DEC BC
LD A,B
OR C
JR NZ,BPP
LD A,#00
OUT (#FE),A
LD B,D
LD C,E
BPP2:
DEC BC
LD A,B
OR C
JR NZ,BPP2
DEC HL
LD A,H
OR L
JR NZ,BEEP
RET
;COM_A EQU #19 Z84.SIO.Ch_A.Ctrl
;DAT_A EQU #18 Z84.SIO.Ch_A.Data
;------------------------------;????? à §®¡à âìáï
; !TODO £«ï­ãâì, ¬®¦¥â ¯à¨£®¤¨âáï
; KINIT: LD A,0
; OUT (Z84.SIO.Ch_A.Ctrl),A
; LD A,1
; OUT (Z84.SIO.Ch_A.Ctrl),A
; LD A,#00 ;#18
; OUT (Z84.SIO.Ch_A.Ctrl),A
; LD A,3
; OUT (Z84.SIO.Ch_A.Ctrl),A
; LD A,#C1
; OUT (Z84.SIO.Ch_A.Ctrl),A
; LD A,4
; OUT (Z84.SIO.Ch_A.Ctrl),A
; LD A,#07 ;#05
; OUT (Z84.SIO.Ch_A.Ctrl),A
; LD A,5
; OUT (Z84.SIO.Ch_A.Ctrl),A
; LD A,#62
; OUT (Z84.SIO.Ch_A.Ctrl),A
; RET
;------------------------------;????? à §®¡à âìáï