summaryrefslogtreecommitdiffstats
path: root/private/mvdm/wow16/drivers/keyboard/keyboard.asm
diff options
context:
space:
mode:
Diffstat (limited to 'private/mvdm/wow16/drivers/keyboard/keyboard.asm')
-rw-r--r--private/mvdm/wow16/drivers/keyboard/keyboard.asm155
1 files changed, 155 insertions, 0 deletions
diff --git a/private/mvdm/wow16/drivers/keyboard/keyboard.asm b/private/mvdm/wow16/drivers/keyboard/keyboard.asm
new file mode 100644
index 000000000..e234209b9
--- /dev/null
+++ b/private/mvdm/wow16/drivers/keyboard/keyboard.asm
@@ -0,0 +1,155 @@
+;++
+;
+; WOW v1.0
+;
+; Copyright (c) 1991, Microsoft Corporation
+;
+; KBD.ASM
+; Win16 KEYBOARD thunks
+;
+; History:
+;
+; Created 06-Jan-1992 by NanduriR
+;--
+
+ TITLE KEYBOARD.ASM
+ PAGE ,132
+
+ .286p
+
+ .xlist
+ include wow.inc
+ include wowkbd.inc
+ include cmacros.inc
+ include windefs.inc
+ include vdmtib.inc
+ .list
+
+ __acrtused = 0
+ public __acrtused ;satisfy external C ref.
+
+
+createSeg _TEXT,CODE,WORD,PUBLIC,CODE
+createSeg _DATA,DATA,WORD,PUBLIC,DATA,DGROUP
+defgrp DGROUP,DATA
+
+sBegin DATA
+Reserved db 16 dup (0) ;reserved for Windows
+KEYBOARD_Identifier db 'KEYBOARD16 Data Segment'
+externD bios_proc
+
+sEnd DATA
+
+
+sBegin CODE
+assumes CS,CODE
+assumes DS,DATA
+assumes ES,NOTHING
+
+; Hung App Support
+; If USER32 is unable to terminate an app via End Task then it calls
+; WOW32 to kill the app. We do this by generating a keyboard h/w
+; interrupt 9. Since in WOW all keyboard input comes via USER32 the
+; keyboard h/w interrupt is unused for anything else so we can reuse
+; this interrupt.
+
+
+cProc KEYBOARD16,<PUBLIC,FAR>
+cBegin
+ mov ax,3500h or 09h
+ int 21h ; vector is in ES:BX
+ mov word ptr [bios_proc][0], bx
+ mov word ptr [bios_proc][2], es
+
+; Setup keyboard interrupt vector to point to our interrupt routine
+ mov ax,2500h or 09h
+ mov dx,OFFSET keybd_int
+ push ds ; save DS
+ push cs
+ pop ds ; set DS = CS
+ int 21h ; set the vector
+ pop ds ; restore DS
+ mov ax,1
+cEnd
+
+
+INTA0 equ 20h ;X'20' 8259 Interrupt Control Port
+EOI equ 20h ;X'20' 8259 End-of-Interrupt ack
+
+public keybd_int
+keybd_int PROC FAR
+ push ax
+ push bx
+ push es
+
+ mov al,EOI ; Send Non-Specific EOI
+ out INTA0,al
+
+;
+; Now we test the bit in low memory that is set by wow32 to see if this
+; is really a keyboard int forced in by the hung app support.
+;
+ mov ax, 40h ;use bios data selector
+ mov es, ax
+ mov bx, FIXED_NTVDMSTATE_LINEAR - 400h
+
+ .386 ;make it assemble
+.errnz VDM_WOWHUNGAPP AND 0ff00ffffh ;make sure it's the third byte
+ test byte ptr es:[bx+2], VDM_WOWHUNGAPP SHR 16
+
+ jnz short hungapp_exit ;jump if this is really a hung app
+
+ pop es
+ pop bx
+ pop ax
+ iret
+
+hungapp_exit:
+ and byte ptr es:[bx+2], 255 - (VDM_WOWHUNGAPP SHR 16) ; turn it off
+ pop es
+ pop bx
+ pop ax
+ .286p
+
+ mov ax,4CFFH ; They said OK to Nuke app.
+ int 21h
+keybd_int ENDP
+
+
+
+cProc WEP,<PUBLIC,FAR,PASCAL,NODATA,NOWIN,ATOMIC>
+ parmW iExit ;DLL exit code
+
+ cBegin
+ mov ax,1 ;always indicate success
+ cEnd
+
+
+assumes DS,NOTHING
+
+;;; KbdThunk INQUIRE ;Internal LOCALAPI
+;;; KbdThunk ENABLE ;Internal
+;;; KbdThunk DISABLE ;Internal
+ KbdThunk TOASCII
+ KbdThunk ANSITOOEM
+ KbdThunk OEMTOANSI
+;;; KbdThunk SETSPEED ;Internal
+;;; KbdThunk SCREENSWITCHENABLE ;Internal
+;;; KbdThunk GETTABLESEG ;Internal
+;;; KbdThunk NEWTABLE ;Internal
+ KbdThunk OEMKEYSCAN
+ KbdThunk VKKEYSCAN
+ KbdThunk GETKEYBOARDTYPE
+ KbdThunk MAPVIRTUALKEY
+ KbdThunk GETKBCODEPAGE
+ KbdThunk GETKEYNAMETEXT
+ KbdThunk ANSITOOEMBUFF
+ KbdThunk OEMTOANSIBUFF
+;;; KbdThunk ENABLEKBSYSREQ ;Internal LOCALAPI
+;;; KbdThunk GETBIOSKEYPROC ; in kbdlocal.asm
+
+
+
+sEnd CODE
+
+end KEYBOARD16