;[BEGIN] ;//MODULE: KEYINTER ;//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 ; _mInfoALIGN 256,0 ;KEYBOARD BUFFER SBUF: BLOCK 64,0 HEAD DB #00 HOST DB #00 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 #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 FLAG_00 EQU 0 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 ; 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 UNCODE DW 0 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 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 ;LD A,8 ; BACKSPACE ;CALL PUTCHAR POP DE POP AF PUSH DE ;R01 [v] CALL PUTCHAR.NO_SCROLL POP DE CALL LOCATE POP BC POP DE LD A,E AND A RET ELSE ;------------------------------; delay_curs: EQU 11 ; частота мигания курсора INS_CUR_ZG: EQU #19 CURSOR_ZG: EQU #1A NORM_ZG: EQU #1B ECHOKEY: CALL Cursor_On ; вкл. курсор, установить фокус на "Input Line" EI .loop: CALL SCANKEY JR Z,.loop PUSH DE PUSH BC PUSH AF CALL Cursor_Off ; выкл. курсор POP AF OR A ;!FIXIT scroll заменить на вывод символа биосом или WRCHAR ; LD BC,1*256 + BIOS.LP_PRINT_SYM ; RST ToBIOS CALL NZ,PUTCHAR.NO_SCROLL ; добавил вывод "a" на экран ; POP BC POP DE LD A,E AND A RET Cursor: .Flag+1: LD A,0 ; флаг курсора 00-нет/01-есть CPL LD (.Flag),A ; Включить курсор Cursor_On: LD C,BIOS.LP_GET_PLACE ; узнать полож. курсора RST ToBIOS LD (Cursor_Off.pos),DE XOR A LD C,BIOS.WIN_GET_SYM ; получить символ RST ToBIOS LD BC,NORM_ZG*256+BIOS.WIN_PUT_SYM ; b=знакоген., с=символ на экран LD A,(Cursor.Flag) OR A JR Z,.put LD B,CURSOR_ZG ; черта LD A,(KEYFLAG) ; флаги клавы ;BIT 1,A ; бит Ins AND %0000'0010 ; бит Ins JR NZ,.put LD B,INS_CUR_ZG ; блок .put: XOR A ; номер окна RST ToBIOS LD DE,(Cursor_Off.pos) CALL LOCATE LD A,1 LD (Cursor_Off.Flag),A LD A,delay_curs RET ; Выключить курсор Cursor_Off: .Flag+1: LD A,0 ; флаг курсора: 00-выкл/01-вкл 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 полож. BIT 7,E RET NZ LD C,BIOS.WIN_GET_SYM ; получить символ XOR A RST ToBIOS XOR A LD BC,NORM_ZG*256+BIOS.WIN_PUT_SYM ; символ на экран RST ToBIOS LD DE,(Cursor_Off.pos) CALL LOCATE RET ; Вектор обслуживания курсора cursor_interrupt: LD A,(Cursor_Off.Flag) OR A RET Z .timer+1: LD A,1 ; пауза мигания DEC A CALL Z,Cursor LD (.timer),A RET ; Настройка знакогенератора курсора черточкой SETUP_CURSORS: in a,(SLOT2) push af ; сохр. порт ld a,(BANKTBL+TXTPAGE) ; 2-й лог. номер страницы расш. ДОС out (SLOT2),a ; получить сист. знакоген. ld de,#8000 ;!HARDCODE буфер для 2048 байт данных push de ld c,BIOS.WIN_GET_ZG ; получить знакоген. rst ToBIOS ; заполнить кодом #FF 2 нижние линии ld hl,#8000+(2048-(2*256)) ;!HARDCODE последние 512 байт ld bc,511 ld a,CURSOR_ZG; ; номер знакоген. "черточка" call .fill_data_font pop hl ; заполнить остальные 6 линий (полный блок) ld bc,2048-513 ;!HARDCODE ld a,INS_CUR_ZG ; номер знакоген. "блок" call .fill_data_font pop af out (SLOT2),a ; восст. порт ret ; Настройка знакоген. и его регистрация ; вход: a=номер знакоген. ; hl=данные ; bc=размер данных .fill_data_font: ld e,l ld d,h ld (hl),#FF inc de ldir ld de,#8000 ; знакоген. ld c,BIOS.WIN_SET_ZG ; уст. знакоген. 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,SBUF/256 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,#2F CP B JR NC,.error LD A,#34 ;R02 CP B JR C,.error LD C,B JP #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,SBUF/256 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,SBUF/256 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 RESCAN F0_KEY SET FLAG_F0,(IX+KEYFLG) JR RESCAN E1_KEY SET FLAG_E1,(IX+KEYFLG) JR RESCAN KEYSCAN LD IX,KEYFLAG RESCAN IN A,(COM_A) BIT 0,A RET Z IN A,(DAT_A) 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 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 ;small optimization ; LD HL,#CF00 ;Ctrl + Alt + Del ; AND A ; SBC HL,DE ; CALL Z,RST_X ;;; LD BC,(KEYFLAG) CALL PUTSYM RET 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 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 ;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 ;================================ 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 ;!FIXIT sp2000.inc DAT_A EQU #18 ;!FIXIT sp2000.inc KINIT XOR A ;LD A,0 OUT (COM_A),A INC A ;LD A,1 OUT (COM_A),A XOR A ;LD A,0 ;#18 OUT (COM_A),A LD A,3 OUT (COM_A),A LD A,#C1 OUT (COM_A),A LD A,4 OUT (COM_A),A LD A,#07 ;#05 OUT (COM_A),A LD A,5 OUT (COM_A),A LD A,#62 OUT (COM_A),A RET ;//MODULE: KEYINTER ;[END]