diff --git a/programs/emulator/e80/trunk/utils/keyZXtst/compile.bat b/programs/emulator/e80/trunk/utils/keyZXtst/compile.bat new file mode 100644 index 0000000000..e9359826c8 --- /dev/null +++ b/programs/emulator/e80/trunk/utils/keyZXtst/compile.bat @@ -0,0 +1,3 @@ +fasm keyZXtst.asm keyZXtst +kpack keyZXtst +pause \ No newline at end of file diff --git a/programs/emulator/e80/trunk/utils/keyZXtst/keyZXtst.asm b/programs/emulator/e80/trunk/utils/keyZXtst/keyZXtst.asm new file mode 100644 index 0000000000..2d86a55b51 --- /dev/null +++ b/programs/emulator/e80/trunk/utils/keyZXtst/keyZXtst.asm @@ -0,0 +1,176 @@ +; Text CodePage = cp1251 + +; <--- include all MeOS stuff ---> + +include "../../../../../macros.inc" + + +; <--- start of MenuetOS application ---> +MEOS_APP_START + +include "key_read.inc" + +; <--- start of code ---> +CODE + + mov eax,48 ; get system colors + mov ebx,3 + mov ecx,sc + mov edx,sizeof.system_colors + mcall + + xor ecx, ecx + inc ecx + mcall 66,1 ; установка режима ввода сканкодов + + + + redraw: ; redraw event handler + call draw_window ; at first create and draw the window + + wait_event: ; main cycle + + mcall 10 ; ожидать событие + +; mcall 23, 2 ; вариант постоянный опрос +; or eax, eax +; jz key.1 + + dec eax ; if event = 1 + jz redraw ; jump to redraw handler + dec eax ; else if event = 2 + jz key ; jump to key handler + + + button: ; button event handler + mov al, 17 ; get button identifier + mcall + + cmp ah, 1 + jne wait_event ; return if button id != 1 + + or eax, -1 ; exit application + mcall + + key: ; key event handler + ; get key code + call load_keys + ; преобразование +.1: + mov ah, 0xfe + mov edx, txt_data.fe + call load_ports + + mov ah, 0xfd + mov edx, txt_data.fd + call load_ports + + mov ah, 0xfb + mov edx, txt_data.fb + call load_ports + + mov ah, 0xf7 + mov edx, txt_data.f7 + call load_ports + + mov ah, 0xef + mov edx, txt_data.ef + call load_ports + + mov ah, 0xdf + mov edx, txt_data.df + call load_ports + + mov ah, 0xbf + mov edx, txt_data.bf + call load_ports + + mov ah, 0x7f + mov edx, txt_data.7f + call load_ports + + mov ah, 0x00 + mov edx, txt_data.00 + call load_ports + + + + jmp redraw + + draw_window: + mov eax, 12 ; start drawing + mov ebx, 1 + mcall + + xor eax, eax ; create and draw the window + mov ebx, 40*65536+560 ; (window_cx)*65536+(window_sx) + mov ecx, 40*65536+240 ; (window_cy)*65536+(window_sy) + mov edx, [sc.work] ; work area color + or edx, 0x33000000 ; & window type 3 + mov edi, title ; window title + int 0x40 + + mov ecx, [sc.work_text] + or ecx, 0x80000000 + mov edx, txt_data + mcall 4, 10*65536+40 + mov edx, txt_data.2s + mcall 4, 10*65536+60 + mov edx, txt_data.3s + mcall 4, 10*65536+80 + + + mov eax, 12 ; finish drawing + mov ebx, 2 + mcall + + ret + + +load_ports: ; вход ah - старший байт порта + ; edx - адрес текста + mov al, 0xFE + call load_port_FE + +rept 8 +{ + mov bl, '1' + shl al,1 + jc @f + mov bl, '0' +@@: + mov byte [edx], bl + inc edx +} + + ret + + + + +; <--- initialised data ---> +DATA + + +title db 'Key ZX-Spectrum TEST',0 + +txt_data db '#FE: ' +.fe db '******** #FD: ' +.fd db '******** #FB: ' +.fb db '******** #F7: ' +.f7 db '******** ', 0 +.2s db '#EF: ' +.ef db '******** #DF: ' +.df db '******** #BF: ' +.bf db '******** #7F: ' +.7f db '******** ', 0 +.3s db '#00: ' +.00 db '******** ', 0 + + +; <--- uninitialised data ---> +UDATA +sc system_colors + +MEOS_APP_END +; <--- end of MenuetOS application ---> \ No newline at end of file diff --git a/programs/emulator/e80/trunk/utils/keyZXtst/key_read.inc b/programs/emulator/e80/trunk/utils/keyZXtst/key_read.inc new file mode 100644 index 0000000000..3f4193c916 --- /dev/null +++ b/programs/emulator/e80/trunk/utils/keyZXtst/key_read.inc @@ -0,0 +1,407 @@ +; Text CodePage = cp1251 + +; Предварительно необходимо установить режим ввода сканкодов +;set_ckancode_mode: +; xor ecx, ecx +; inc ecx +; mcall 66,1 ; установка режима ввода сканкодов +; ret + + + + + +;----------------------------------------------------- +load_port_FE: ; дешифровка пора FE - клавиатура Spectruma + + ; вход ax - номер порта al = 0xFE ah = [старший байт адреса порта] + ; выход - al - содержимое порта клавиатуры остальные байты произвольны + ; производится полная дешифрация порта c произвольными значениями + ; старшего байта (как в настоящем спекке) + cmp al, 0xFE + jne .ret + push esi + push ebx + mov esi, zx_keys ; будем вычитывать из буфера клавы + mov bl, 0xFF + cld +rept 8 +{ + lodsb + shr ah, 1 + jc @f + and bl, al +@@: +} + mov al, bl + + pop ebx + pop esi + +.ret: + ret + + + + + + + +;------------------------------------------------------ +; Чтение клавиатуры PC и перевод ее состояния в буфер порта FE спектрума + +load_keys: ; регистры не сохраняет + + mov edi, scancodes_tbl ; Адрес таблицы обработки сканкодов + mov ebx, 0xFFFFFFE0 ; вспомогательная маска + + mov edx, dword [zx_keys] ; буфер клавиатуры спектрума + mov esi, dword [zx_keys+4] ; + + + +.loop: ; цикл выбора клавиш из буфера + mov ecx, ebx ; сохранить ebx + mcall 66,3 ; проверить управляющие клавиши + mov ebx, ecx ; восстановить ebx + and al, 0x80 ; проверить NumLock + mov byte [num_lock_flag], al +.loop_1: + mcall 2 ; забрать код нажатой клавиши + cmp eax, 1 + jne .load ; если буфер не пуст + +.exit: + mov dword [zx_keys], edx + mov dword [zx_keys+4], esi +.ret: + ret + + + +.ext_key: + mov byte [ext_flag], 1 + jmp .loop + +.load: + cmp ah, 250 + jne @f + or edx, 0x02000001 ; стираем CAPS LOCK {, NumLock, ScrollLock - ?} +; or esi, 0x00000000 + mov byte [ ext_flag], 0 + jmp .loop_1 +@@: + cmp ah, 224 + je .ext_key ; если расширенная клавиша + + mov cl, ah + and cl, 0x7F + cmp cl, 71 ; если клавиши из NumPad + jc .l1 + cmp cl, 84 + jnc .l1 + + cmp byte [ ext_flag], 1 ; если клавиша нажата после EXT + je .l1 + ; если клавиша без ext - + cmp byte [num_lock_flag], 0 ; если установлен режим курсора + jne .lnorm + ; дополнительное извращение для ввода цифр на NumPade + sub cl, 71 + and eax, 0x00008000 + mov al, cl + jz .l1_2 + xor ah, ah + jz ._1_2 +.l1: + mov byte [ext_flag], 0 +.lnorm: + mov al, ah ; scancode в al + and eax, 0x000000FF ;отрезание старшей части от al + or al, al + js ._1 + ; Если выдан сканкод нажатия клавиши +.l1_1: add al, 13 +.l1_2: + shl eax, 1 ; *2 + mov ax, word [ edi+eax] ; al - 1 клав , ah - 2 клав + mov ecx, eax + call .L_proc_set ; 1 - клавиша + shr ecx, 8 + mov eax, ecx + call .L_proc_set ; 2 - клавиша + jmp .loop_1 ; продолжить выбор из буфера + +._1: ;Если выдан сканкод отпускания клавиши + and al, 0x7f + add al, 13 +._1_2: + shl eax, 1 ; *2 + mov ax, word [ edi+eax] ; al - 1 клав , ah - 2 клав + mov ecx, eax + call .L_proc_res ; 1 - клавиша + shr ecx, 8 + mov eax, ecx + call .L_proc_res ; 2 - клавиша + jmp .loop_1 + + + + +.L_proc_set: + or cl, cl + jz .ret + or eax, ebx + and cl, bl ; маска порта *32 + or cl, cl + js @f + ; порт расположен в edx + ror cl, 2 ; циклическое смещение + rol eax, cl + and edx, eax ; сохранение клавиши + ret +@@: ; порт расположен в esi + and cl, 0x60 ; нормировка маски + ror cl, 2 + rol eax, cl + and esi, eax + ret + +.L_proc_res: + or cl, cl + jz .ret + or eax, ebx + xor eax, -1 + and cl, bl ; маска порта *32 + or cl, cl + js @f + ; порт расположен в edx + ror cl, 2 ; циклическое смещение + rol eax, cl + or edx, eax ; удаление клавиши + ret +@@: ; порт расположен в esi + and cl, 0x60 ; нормировка маски + ror cl, 2 + rol eax, cl + or esi, eax + ret +;-------------------------------------------------------- + + + +; Клавиатура для Спектрума +;----------------------------------------------------- +; SHIFT - CAPS SHIFT (CS) +; CTRL - SIMBOL SHIFT (SS) +; ALT - EXTEND MODE (CS/SS) ; Обычным способом CS/SS не набирается +; +; BACKSPACE - DELETE (CS/0) +; ESC - BREAK (CS/Space) +; TAB - EDIT (CS/1) +; '~' - GRAPH (CS/9) +; PAGE UP - TRUE VIDEO (CS/3) +; PAGE DOWN - INV. VIDEO (CS/4) +; UP - UP (CS/7) +; DOWN - DOWN (CS/6) +; LEFT - LEFT (CS/5) +; RIGHT - RIGHT (CS/8) +; CAPS LOCK - /CAPS LOCK/ - не работает набирать только как (CS/2) + + + + +not_used_code equ 0x1F1F ; код для неиспользуемого сканкода + +; код сканкода - 0x[байт префикса][байт клавиши] +; [байт клавиши / префикса] - биты=PPPKKKKK +; где PPP - код порта +; KKKKK - код клавиши + + + + + + ; таблица соответствия сканкодов кодам обработки клавиш - 256 - байт + +scancodes_tbl dw 0x0097 ; 71 - Num7 + dw 0x009B ; 72 - Num8 + dw 0x009D ; 73 - Num9 + dw 0xFDD7 ; 74 - Num- + dw 0x0077 ; 75 - Num4 + dw 0x006F ; 76 - Num5 + dw 0x008F ; 77 - Num6 + dw 0xFDDB ; 78 - Num+ + dw 0x007E ; 79 - Num1 + + dw 0x007D ; 80 - Num2 + dw 0x007B ; 81 - Num3 + dw 0x009E ; 82 - Num0 + dw 0xFDFB ; 83 - Num. + dw not_used_code ; 0 ; ------------------------------------------- + dw 0x1EFE ; 1 - ESC - Break (CS/Space) + dw 0x007E ; 2 - 1 + dw 0x007D ; 3 - 2 + dw 0x007B ; 4 - 3 + dw 0x0077 ; 5 - 4 + dw 0x006F ; 6 - 5 + dw 0x008F ; 7 - 6 + dw 0x0097 ; 8 - 7 + dw 0x009B ; 9 - 8 + + dw 0x009D ; 10 - 9 + dw 0x009E ; 11 - 0 + dw 0xFDD7 ; 12 - - + dw 0xFDDD ; 13 - = + dw 0x1E9E ; 14 - BackSpace - Delete(backspace) (CS/0) + dw 0x1E7E ; 15 - TAB - EDIT (CS/1) + dw 0x005E ; 16 - q + dw 0x005D ; 17 - w + dw 0x005B ; 18 - e + dw 0x0057 ; 19 - r + + dw 0x004F ; 20 - t + dw 0x00AF ; 21 - y + dw 0x00B7 ; 22 - u + dw 0x00BB ; 23 - i + dw 0x00BD ; 24 - o + dw 0x00BE ; 25 - p + dw 0xFDAF ; 26 - [ - SS/Y + dw 0xFDB7 ; 27 - ] - SS/U + dw 0x00DE ; 28 - Enter + dw 0x00FD ; 29 - L_Control - Simbol Shift (SS) + + dw 0x003E ; 30 - a + dw 0x003D ; 31 - s + dw 0x003B ; 32 - d + dw 0x0037 ; 33 - f + dw 0x002F ; 34 - g + dw 0x00CF ; 35 - h + dw 0x00D7 ; 36 - j + dw 0x00DB ; 37 - k + dw 0x00DD ; 38 - l + dw 0xFDBD ; 39 - ; - ; (SS/O) + + dw 0xFD97 ; 40 - ' - ' (SS/7) + dw 0x1E9D ; 41 - ~ - GRAPH (CS/9) + dw 0x001E ; 42 - L_Shift (эм caps ) + dw 0xFD3B ; 43 - \ - SS/D + dw 0x001D ; 44 - z + dw 0x001B ; 45 - x + dw 0x0017 ; 46 - c + dw 0x000F ; 47 - v + dw 0x00EF ; 48 - b + dw 0x00F7 ; 49 - n + + dw 0x00FB ; 50 - m + dw 0xFDF7 ; 51 - , + dw 0xFDFB ; 52 - . + dw 0xFD0F ; 53 - / + dw 0x001E ; 54 - R_Shift - CAPS (CS) + dw 0xFDEF ; 55 - Num * - * (SS/B) + dw 0xFD1E ; 56 - ALT - Extend Mode (CS/SS) + dw 0x00FE ; 57 - Space + dw 0x1E7D ; 58 - Caps Lock - Caps Lock (CS/2) + dw not_used_code ; 59 - F1 + + dw not_used_code ; 60 - F2 + dw not_used_code ; 61 - F3 + dw not_used_code ; 62 - F4 + dw not_used_code ; 63 - F5 + dw not_used_code ; 64 - F6 + dw not_used_code ; 65 - F7 + dw not_used_code ; 66 - F8 + dw not_used_code ; 67 - F9 + dw not_used_code ; 68 - F10 + dw not_used_code ; 69 - NumLock (отпуск M 250) + ; BREAK совместно (225,29,69) (225 - EXT2) (29 -L_Control) + + dw not_used_code ; 70 - Scroll Lock ( отпуск М 250) + dw not_used_code ; 71 - Home (после EXT) (ем + dw 0x1E97 ; 72 - Up (после EXT) - UP (CS/7) + dw 0x1E7B ; 73 - Page Up (после EXT - 224) - True video (CS/3) + dw 0xFDD7 ; 74 - Num- - - (SS/J) + dw 0x1E6F ; 75 - Left (после EXT) - <-- (CS/5) + dw not_used_code ; 76 - Num5 + dw 0x1E9B ; 77 - Right (после EXT) - --> (CS/8) + dw 0xFDDB ; 78 - Num+ + dw not_used_code ; 79 - END (после EXT) + + dw 0x1E8F ; 80 - Down (после EXT) - DOWN (CS/6) + dw 0x1E77 ; 81 - Page Down (после EXT) - Inv. Video (CS/4) + dw not_used_code ; 82 - Insert (после EXT) + dw not_used_code ; 83 - Delete (после EXT) + dw not_used_code ; 84 + dw not_used_code ; 85 + dw not_used_code ; 86 + dw not_used_code ; 87 - F11 + dw not_used_code ; 88 - F12 + dw not_used_code ; 89 + + dw not_used_code ; 90 + dw not_used_code ; 91 + dw not_used_code ; 92 + dw not_used_code ; 93 - Меню 3 (после ext) + dw not_used_code ; 94 + dw not_used_code ; 95 + dw not_used_code ; 96 - (224) - ext - доп. функция сканкодов + dw not_used_code ; 97 - (225) - ext2 + dw not_used_code ; 98 + dw not_used_code ; 99 + + dw not_used_code ; 100 + dw not_used_code ; 101 + dw not_used_code ; 102 + dw not_used_code ; 103 + dw not_used_code ; 104 + dw not_used_code ; 105 + dw not_used_code ; 106 + dw not_used_code ; 107 + dw not_used_code ; 108 + dw not_used_code ; 109 + + dw not_used_code ; 110 + dw not_used_code ; 111 + dw not_used_code ; 112 + dw not_used_code ; 113 + dw not_used_code ; 114 + dw not_used_code ; 115 + dw not_used_code ; 116 + dw not_used_code ; 117 + dw not_used_code ; 118 + dw not_used_code ; 119 + + dw not_used_code ; 120 + dw not_used_code ; 121 + dw not_used_code ; 122 - (250) M Отпуск (Capslock, Numlock и т.п.) + dw not_used_code ; 123 + dw not_used_code ; 124 + dw not_used_code ; 125 + dw not_used_code ; 126 + dw not_used_code ; 127 + dw 0 + + + + +; Флаги клавиатуры +ext_flag db 0 ; флаг расширенного сканкода +num_lock_flag db 0 ; флаг num клавы + + +;Буфер ZX-Spectrum клавиатуры. + +zx_keys dd 0xFFFFFFFF, 0xFFFFFFFF +;позиция байта/старший байт порта: + +; +0 - FE +; +1 - FD +; +2 - FB +; +3 - F7 +; +4 - EF +; +5 - DF +; +6 - BF +; +7 - 7F + + +