;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; RDOS operating system ; Copyright (C) 1988-2000, Leif Ekblad ; ; This program is free software; you can redistribute it and/or modify ; it under the terms of the GNU General Public License as published by ; the Free Software Foundation; either version 2 of the License, or ; (at your option) any later version. The only exception to this rule ; is for commercial usage in embedded systems. For information on ; usage in commercial embedded systems, contact embedded@rdos.net ; ; This program is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU General Public License for more details. ; ; You should have received a copy of the GNU General Public License ; along with this program; if not, write to the Free Software ; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ; ; The author of this program may be contacted at leif@rdos.net ; ; KEY.ASM ; Basic keyboard support module. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; INCLUDE protseg.def INCLUDE ..\driver.def INCLUDE port.def INCLUDE ..\user.def INCLUDE ..\os.def INCLUDE system.inc INCLUDE ..\user.inc INCLUDE ..\os.inc INCLUDE key.inc COM_BASE = 3F8h COM_IRQ = 4 COM_BAUD_DIV = 1 .386p code SEGMENT byte public use16 'CODE' assume cs:code extrn scan_code_tab:near ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: dummy_scan ; ; DESCRIPTION: Handle unsupported keys ; ; PARAMETERS: AL scan code ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; dummy_scan PROC near stc ret dummy_scan ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: state_scan ; ; DESCRIPTION: Handle state key ; ; PARAMETERS: AL scan code ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; state_scan PROC near and ax,80h clc ret state_scan ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: del_scan ; ; DESCRIPTION: Handle DEL key ; ; PARAMETERS: AL scan code ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; del_scan PROC near push ax GetKeyboardState mov cx,ax pop ax ; and cx,alt_pressed OR ctrl_pressed cmp cx,alt_pressed OR ctrl_pressed jne num_scan ; cli wait_gate1: in al,64h and al,2 jnz wait_gate1 mov al,0D1h out 64h,al wait_gate2: in al,64h and al,2 jnz wait_gate2 mov al,0FEh out 60h,al ; xor eax,eax mov cr3,eax ret del_scan Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: handle_scan ; ; DESCRIPTION: Handle a scan ; ; PARAMETERS: AL scan code ; CX State ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; handle_scan Proc near test cx,ctrl_pressed jz handle_not_ctrl ; mov ah,cs:[bx].ctrl_code cmp ah,-1 jne handle_check handle_not_ctrl: test cx,alt_pressed jz handle_not_alt ; mov ah,cs:[bx].alt_code cmp ah,-1 jne handle_check handle_not_alt: test cx,shift_pressed jz handle_not_shift ; mov ah,cs:[bx].shift_code cmp ah,-1 jne handle_check handle_not_shift: mov ah,cs:[bx].normal_code handle_check: or ah,ah jne handle_no_ext ; mov cl,al movzx ax,byte ptr cs:[bx].ext_code and cl,80h or al,cl handle_no_ext: clc ret handle_scan Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: simple_scan ; ; DESCRIPTION: Handle normal keys ; ; PARAMETERS: AL scan code ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; simple_scan PROC near push ax GetKeyboardState mov cx,ax pop ax call handle_scan ret simple_scan ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: caps_scan ; ; DESCRIPTION: Handle case sensitive keys ; ; PARAMETERS: AL scan code ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; caps_scan PROC near push ax GetKeyboardState mov cx,ax pop ax ; and cx,107h xor cl,ch and cx,7 call handle_scan ret caps_scan ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: num_scan ; ; DESCRIPTION: Handle numeric keys ; ; PARAMETERS: AL scan code ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; num_scan PROC near push ax GetKeyboardState mov cx,ax pop ax ; and cx,205h shr ch,1 xor cl,ch xor ch,ch add bx,cx cmp cx,1 jne num_sc_no_num ; mov ah,cs:[bx] jmp num_sc_end num_sc_no_num: mov cl,al movzx ax,byte ptr cs:[bx] and cl,80h or al,cl num_sc_end: clc ret num_scan ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: f_key_scan ; ; DESCRIPTION: Handle function keys ; ; PARAMETERS: AL scan code ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; f_key_scan PROC near push ax GetKeyboardState mov cx,ax pop ax call handle_scan xor ah,ah ret f_key_scan ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: decode_scan_code ; ; DESCRIPTION: Decode scan code ; ; PARAMETERS: AL scan code ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; key_type_tab: kt00 DW OFFSET dummy_scan kt01 DW OFFSET simple_scan kt02 DW OFFSET caps_scan kt03 DW OFFSET state_scan kt04 DW OFFSET num_scan kt05 DW OFFSET del_scan kt06 DW OFFSET f_key_scan decode_scan_code PROC near push di ; movzx bx,al and bl,NOT 80h mov dh,al shl bx,3 add bx,OFFSET scan_code_tab ; xor di,di push ax GetKeyboardState mov cx,ax pop ax test cx,ext_numpad_active jz decode_scan_get_vk ; inc di decode_scan_get_vk: mov dl,byte ptr cs:[bx+di].vk_code ; movzx di,byte ptr cs:[bx].key_type add di,di call word ptr cs:[di].key_type_tab jc decode_scan_done ; PutKeyboardCode decode_scan_done: pop di ret decode_scan_code ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: normal_scan ; ; DESCRIPTION: Handle normal key pressed / release ; ; PARAMETERS: AL scan code ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; normal_scan PROC near clc ret normal_scan Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: shift_press_scan ; ; DESCRIPTION: Handle Shift pressed ; ; PARAMETERS: AL scan code ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; shift_press_scan PROC near push ax GetKeyboardState or ax,shift_pressed SetKeyboardState pop ax clc ret shift_press_scan ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: shift_rel_scan ; ; DESCRIPTION: Handle Shift released ; ; PARAMETERS: AL scan code ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; shift_rel_scan PROC near push ax GetKeyboardState and ax,NOT shift_pressed SetKeyboardState pop ax clc ret shift_rel_scan ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: alt_press_scan ; ; DESCRIPTION: Handle Alt pressed ; ; PARAMETERS: AL scan code ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; alt_press_scan PROC near push ax GetKeyboardState or ax,alt_pressed SetKeyboardState pop ax clc ret alt_press_scan ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: alt_rel_scan ; ; DESCRIPTION: Handle Alt released ; ; PARAMETERS: AL scan code ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; alt_rel_scan PROC near push ax GetKeyboardState and ax,NOT alt_pressed SetKeyboardState pop ax clc ret alt_rel_scan ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: ctrl_press_scan ; ; DESCRIPTION: Handle Ctrl pressed ; ; PARAMETERS: AL scan code ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ctrl_press_scan PROC near push ax GetKeyboardState or ax,ctrl_pressed SetKeyboardState pop ax clc ret ctrl_press_scan ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: ctrl_rel_scan ; ; DESCRIPTION: Handle Ctrl released ; ; PARAMETERS: AL scan code ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ctrl_rel_scan PROC near push ax GetKeyboardState and ax,NOT ctrl_pressed SetKeyboardState pop ax clc ret ctrl_rel_scan ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: caps_press_scan ; ; DESCRIPTION: Handle Caps Lock ; ; PARAMETERS: AL scan code ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; caps_press_scan PROC near push ax GetKeyboardState xor ax,caps_active SetKeyboardState pop ax ret caps_press_scan ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: num_press_scan ; ; DESCRIPTION: Handle Num Lock ; ; PARAMETERS: AL scan code ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; num_press_scan PROC near push ax GetKeyboardState xor ax,num_active SetKeyboardState pop ax ret num_press_scan ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: print_press_scan ; ; DESCRIPTION: Handle print press ; ; PARAMETERS: AL scan code ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; print_press_scan PROC near push ax GetKeyboardState or ax,print_pressed SetKeyboardState pop ax clc ret print_press_scan ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: print_rel_scan ; ; DESCRIPTION: Handle print released ; ; PARAMETERS: AL scan code ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; print_rel_scan PROC near push ax GetKeyboardState and ax,NOT print_pressed SetKeyboardState pop ax clc ret print_rel_scan ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: scroll_press_scan ; ; DESCRIPTION: Handle scroll press ; ; PARAMETERS: AL scan code ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; scroll_press_scan PROC near push ax GetKeyboardState or ax,scroll_pressed SetKeyboardState pop ax clc ret scroll_press_scan ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: scroll_rel_scan ; ; DESCRIPTION: Handle scroll release ; ; PARAMETERS: AL scan code ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; scroll_rel_scan PROC near push ax GetKeyboardState and ax,NOT scroll_pressed SetKeyboardState pop ax clc ret scroll_rel_scan ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: pause_break_press_scan ; ; DESCRIPTION: Pause / break press ; ; PARAMETERS: AL scan code ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; pause_break_press_scan PROC near push ax GetKeyboardState or ax,pause_pressed SetKeyboardState pop ax clc ret pause_break_press_scan ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: pause_break_rel_scan ; ; DESCRIPTION: Pause / break rel ; ; PARAMETERS: AL scan code ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; pause_break_rel_scan PROC near push ax GetKeyboardState and ax,NOT pause_pressed SetKeyboardState pop ax int 4Ah clc ret pause_break_rel_scan ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: f_press_scan ; ; DESCRIPTION: Function key press scan ; ; PARAMETERS: AL scan code ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; f_press_scan PROC near SetFocus clc ret f_press_scan ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: f_rel_scan ; ; DESCRIPTION: Function key release scan ; ; PARAMETERS: AL scan code ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; f_rel_scan PROC near push ax GetKeyboardState mov cx,ax pop ax ; test cx,ctrl_pressed jz f_rel_norm ; stc ret f_rel_norm: clc ret f_rel_scan ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: handle_scan_code_tab ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; handle_scan_code_tab: p00 DW OFFSET normal_scan p01 DW OFFSET normal_scan p02 DW OFFSET normal_scan p03 DW OFFSET normal_scan p04 DW OFFSET normal_scan p05 DW OFFSET normal_scan p06 DW OFFSET normal_scan p07 DW OFFSET normal_scan p08 DW OFFSET normal_scan p09 DW OFFSET normal_scan p0A DW OFFSET normal_scan p0B DW OFFSET normal_scan p0C DW OFFSET normal_scan p0D DW OFFSET normal_scan p0E DW OFFSET normal_scan p0F DW OFFSET normal_scan p10 DW OFFSET normal_scan p11 DW OFFSET normal_scan p12 DW OFFSET normal_scan p13 DW OFFSET normal_scan p14 DW OFFSET normal_scan p15 DW OFFSET normal_scan p16 DW OFFSET normal_scan p17 DW OFFSET normal_scan p18 DW OFFSET normal_scan p19 DW OFFSET normal_scan p1A DW OFFSET normal_scan p1B DW OFFSET normal_scan p1C DW OFFSET normal_scan p1D DW OFFSET ctrl_press_scan p1E DW OFFSET normal_scan p1F DW OFFSET normal_scan p20 DW OFFSET normal_scan p21 DW OFFSET normal_scan p22 DW OFFSET normal_scan p23 DW OFFSET normal_scan p24 DW OFFSET normal_scan p25 DW OFFSET normal_scan p26 DW OFFSET normal_scan p27 DW OFFSET normal_scan p28 DW OFFSET normal_scan p29 DW OFFSET normal_scan p2A DW OFFSET shift_press_scan p2B DW OFFSET normal_scan p2C DW OFFSET normal_scan p2D DW OFFSET normal_scan p2E DW OFFSET normal_scan p2F DW OFFSET normal_scan p30 DW OFFSET normal_scan p31 DW OFFSET normal_scan p32 DW OFFSET normal_scan p33 DW OFFSET normal_scan p34 DW OFFSET normal_scan p35 DW OFFSET normal_scan p36 DW OFFSET shift_press_scan p37 DW OFFSET print_press_scan p38 DW OFFSET alt_press_scan p39 DW OFFSET normal_scan p3A DW OFFSET caps_press_scan p3B DW OFFSET f_press_scan p3C DW OFFSET f_press_scan p3D DW OFFSET f_press_scan p3E DW OFFSET f_press_scan p3F DW OFFSET f_press_scan p40 DW OFFSET f_press_scan p41 DW OFFSET f_press_scan p42 DW OFFSET f_press_scan p43 DW OFFSET f_press_scan p44 DW OFFSET f_press_scan p45 DW OFFSET num_press_scan p46 DW OFFSET scroll_press_scan p47 DW OFFSET normal_scan p48 DW OFFSET normal_scan p49 DW OFFSET normal_scan p4A DW OFFSET normal_scan p4B DW OFFSET normal_scan p4C DW OFFSET normal_scan p4D DW OFFSET normal_scan p4E DW OFFSET normal_scan p4F DW OFFSET normal_scan p50 DW OFFSET normal_scan p51 DW OFFSET normal_scan p52 DW OFFSET normal_scan p53 DW OFFSET normal_scan p54 DW OFFSET normal_scan p55 DW OFFSET normal_scan p56 DW OFFSET normal_scan p57 DW OFFSET normal_scan p58 DW OFFSET normal_scan p59 DW OFFSET normal_scan p5A DW OFFSET normal_scan p5B DW OFFSET normal_scan p5C DW OFFSET normal_scan p5D DW OFFSET normal_scan p5E DW OFFSET normal_scan p5F DW OFFSET normal_scan p60 DW OFFSET normal_scan p61 DW OFFSET normal_scan p62 DW OFFSET normal_scan p63 DW OFFSET normal_scan p64 DW OFFSET normal_scan p65 DW OFFSET normal_scan p66 DW OFFSET normal_scan p67 DW OFFSET normal_scan p68 DW OFFSET normal_scan p69 DW OFFSET normal_scan p6A DW OFFSET normal_scan p6B DW OFFSET normal_scan p6C DW OFFSET normal_scan p6D DW OFFSET normal_scan p6E DW OFFSET normal_scan p6F DW OFFSET normal_scan p70 DW OFFSET normal_scan p71 DW OFFSET normal_scan p72 DW OFFSET normal_scan p73 DW OFFSET normal_scan p74 DW OFFSET normal_scan p75 DW OFFSET normal_scan p76 DW OFFSET normal_scan p77 DW OFFSET normal_scan p78 DW OFFSET normal_scan p79 DW OFFSET normal_scan p7A DW OFFSET normal_scan p7B DW OFFSET normal_scan p7C DW OFFSET normal_scan p7D DW OFFSET normal_scan p7E DW OFFSET normal_scan p7F DW OFFSET normal_scan p80 DW OFFSET normal_scan p81 DW OFFSET normal_scan p82 DW OFFSET normal_scan p83 DW OFFSET normal_scan p84 DW OFFSET normal_scan p85 DW OFFSET normal_scan p86 DW OFFSET normal_scan p87 DW OFFSET normal_scan p88 DW OFFSET normal_scan p89 DW OFFSET normal_scan p8A DW OFFSET normal_scan p8B DW OFFSET normal_scan p8C DW OFFSET normal_scan p8D DW OFFSET normal_scan p8E DW OFFSET normal_scan p8F DW OFFSET normal_scan p90 DW OFFSET normal_scan p91 DW OFFSET normal_scan p92 DW OFFSET normal_scan p93 DW OFFSET normal_scan p94 DW OFFSET normal_scan p95 DW OFFSET normal_scan p96 DW OFFSET normal_scan p97 DW OFFSET normal_scan p98 DW OFFSET normal_scan p99 DW OFFSET normal_scan p9A DW OFFSET normal_scan p9B DW OFFSET normal_scan p9C DW OFFSET normal_scan p9D DW OFFSET ctrl_rel_scan p9E DW OFFSET normal_scan p9F DW OFFSET normal_scan pA0 DW OFFSET normal_scan pA1 DW OFFSET normal_scan pA2 DW OFFSET normal_scan pA3 DW OFFSET normal_scan pA4 DW OFFSET normal_scan pA5 DW OFFSET normal_scan pA6 DW OFFSET normal_scan pA7 DW OFFSET normal_scan pA8 DW OFFSET normal_scan pA9 DW OFFSET normal_scan pAA DW OFFSET shift_rel_scan pAB DW OFFSET normal_scan pAC DW OFFSET normal_scan pAD DW OFFSET normal_scan pAE DW OFFSET normal_scan pAF DW OFFSET normal_scan pB0 DW OFFSET normal_scan pB1 DW OFFSET normal_scan pB2 DW OFFSET normal_scan pB3 DW OFFSET normal_scan pB4 DW OFFSET normal_scan pB5 DW OFFSET normal_scan pB6 DW OFFSET shift_rel_scan pB7 DW OFFSET print_rel_scan pB8 DW OFFSET alt_rel_scan pB9 DW OFFSET normal_scan pBA DW OFFSET normal_scan pBB DW OFFSET f_rel_scan pBC DW OFFSET f_rel_scan pBD DW OFFSET f_rel_scan pBE DW OFFSET f_rel_scan pBF DW OFFSET f_rel_scan pC0 DW OFFSET f_rel_scan pC1 DW OFFSET f_rel_scan pC2 DW OFFSET f_rel_scan pC3 DW OFFSET f_rel_scan pC4 DW OFFSET f_rel_scan pC5 DW OFFSET f_rel_scan pC6 DW OFFSET scroll_rel_scan pC7 DW OFFSET normal_scan pC8 DW OFFSET normal_scan pC9 DW OFFSET normal_scan pCA DW OFFSET normal_scan pCB DW OFFSET normal_scan pCC DW OFFSET normal_scan pCD DW OFFSET normal_scan pCE DW OFFSET normal_scan pCF DW OFFSET normal_scan pD0 DW OFFSET normal_scan pD1 DW OFFSET normal_scan pD2 DW OFFSET normal_scan pD3 DW OFFSET normal_scan pD4 DW OFFSET normal_scan pD5 DW OFFSET normal_scan pD6 DW OFFSET normal_scan pD7 DW OFFSET normal_scan pD8 DW OFFSET normal_scan pD9 DW OFFSET normal_scan pDA DW OFFSET normal_scan pDB DW OFFSET normal_scan pDC DW OFFSET normal_scan pDD DW OFFSET normal_scan pDE DW OFFSET normal_scan pDF DW OFFSET normal_scan pE0 DW OFFSET normal_scan pE1 DW OFFSET normal_scan pE2 DW OFFSET normal_scan pE3 DW OFFSET normal_scan pE4 DW OFFSET normal_scan pE5 DW OFFSET normal_scan pE6 DW OFFSET normal_scan pE7 DW OFFSET normal_scan pE8 DW OFFSET normal_scan pE9 DW OFFSET normal_scan pEA DW OFFSET normal_scan pEB DW OFFSET normal_scan pEC DW OFFSET normal_scan pED DW OFFSET normal_scan pEE DW OFFSET normal_scan pEF DW OFFSET normal_scan pF0 DW OFFSET normal_scan pF1 DW OFFSET normal_scan pF2 DW OFFSET normal_scan pF3 DW OFFSET normal_scan pF4 DW OFFSET normal_scan pF5 DW OFFSET normal_scan pF6 DW OFFSET normal_scan pF7 DW OFFSET normal_scan pF8 DW OFFSET normal_scan pF9 DW OFFSET normal_scan pFA DW OFFSET normal_scan pFB DW OFFSET normal_scan pFC DW OFFSET normal_scan pFD DW OFFSET normal_scan pFE DW OFFSET normal_scan pFF DW OFFSET normal_scan ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: keyboard_pr ; ; DESCRIPTION: Keyboard thread ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; keyboard_name DB 'Serial Keyboard',0 wait_handle = -2 com_handle = -4 keyboard_pr: push bp mov bp,sp sub sp,4 mov dx,COM_BASE mov al,COM_IRQ mov ah,8 mov bl,1 mov bh,'N' mov cx,COM_BAUD_DIV mov si,100h mov di,100h OpenCom mov [bp].com_handle,bx CreateWait mov [bp].wait_handle,bx mov ax,[bp].com_handle AddWaitForCom keyboard_loop: mov bx,[bp].wait_handle WaitWithoutTimeout mov bx,[bp].com_handle ReadCom ; movzx bx,al add bx,bx call word ptr cs:[bx].handle_scan_code_tab jc keyboard_loop ; call decode_scan_code jmp keyboard_loop ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: init_keyb_thread ; ; DESCRIPTION: Init keyboard threads ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; init_keyb_thread PROC far push ds push es pusha ; mov ax,cs mov ds,ax mov es,ax mov si,OFFSET keyboard_pr mov di,OFFSET keyboard_name mov cx,stack0_size mov ax,4 CreateThread ; popa pop es pop ds ret init_keyb_thread ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: init ; ; DESCRIPTION: Init device-driver ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; init PROC far push ds push es pusha mov bx,ser_key_code_sel InitDevice ; mov ax,cs mov es,ax mov di,OFFSET init_keyb_thread HookInitTasking ; popa pop es pop ds ret init ENDP code ENDS END init