; _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 ;------------------------------;????? разобраться