; _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 ; CALL GetSymAddr ; LD (HL),E INC L LD (HL),D INC L LD (HL),B INC L LD (HL),C RET GetSymAddr: LD A,(HL) INC (HL) INC (HL) INC (HL) INC (HL) RES 6,(HL) LD L,A LD H,high SBUF RET GETSYM: LD HL,HOST LD A,(HEAD) CP (HL) RET Z AND A ; CALL GetSymAddr ; 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) AND 1 RET Z ;[x] 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,Receiver_Overrun ; IN A,(Z84.SIO.Ch_A.Data) CP #F0 JR Z,F0_KEY CP #E0 JR Z,E0_KEY ; CP #E1 IF USE_E1_SCANCODE JR Z,E1_KEY ELSE JR Z,RESCANN 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 ; ;[x] 29/02/2024 выгребсти весь буфер JR Z,RESCANN ;IT'S SHIFT KEY ; 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 JP RESCANN E0_KEY: SET FLAG_E0,(IX+KEYFLG) JR RESCANN F0_KEY: SET FLAG_F0,(IX+KEYFLG) JR RESCANN IF USE_E1_SCANCODE E1_KEY: SET FLAG_E1,(IX+KEYFLG) JR RESCANN ENDIF 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,(KEYFLAG) XOR 1<","?",#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_T.Size EQU $-XLAT_T /////////////////////////////////////////////////////////////////////// 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: ; таблица с выравниванием на 256 ; LD H,high XLAT_T ; LD L,(HL) ; ; без выравнивания ; [x] 31/03/2024 исправлен баг с выходом за границы таблицы 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 RET ; !TODO посмотреть ;INPCODE: ; BIT 1,(IX+1) ;00110000 ; JR NZ,FN_KEY ;LRCAcaRP INPCODE: LD D,L LD E,0 ; !TODO вернуть русский? А зачем? ; BIT LANG_L,(IX+K_LOCK) ; JP NZ,RUSCODE LD A,(KEYCTRL) AND 1<