windows-nt/Source/XPSP1/NT/base/mvdm/wow16/drivers/keyboard/kbdlocal.asm
2020-09-26 16:20:57 +08:00

325 lines
8.4 KiB
NASM

;++
;
; WOW v1.0
;
; Copyright (c) 1991, Microsoft Corporation
;
; KBDLOCAL.ASM
;
; Win16 KEYBOARD APIS that are 'internal'
; We make these apis a 'nop'. Relevant code has been copied from WIN31.
; The intention here is to maintain the stack. Any arguments to the apis
; are popped and that is it.
;
; History:
;
; Created 06-Jan-1992 by NanduriR
;--
TITLE KBDLOCAL.ASM
PAGE ,132
.286p
.xlist
include wow.inc
include wowkbd.inc
include cmacros.inc
include windefs.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
; Double byte range values for the East Asia.
; The values defined here are for the Rest Of the World.
; These values are for the inquireData (KBINFO) structure defined below.
; ('KeyInfo' in the Kernel, pState in USER)
;
; KKFIX 10/19/96 #56665
ifdef JAPAN
BeginRange1 equ 129 ; 81h
EndRange1 equ 159 ; 9Fh
BeginRange2 equ 224 ; E0h
EndRange2 equ 252 ; FCh
else ; not JAPAN
ifdef TAIWAN ; Big-5 lead byte range, pisuih, 3/16/95'
BeginRange1 equ 129 ; 81h
EndRange1 equ 254 ; FEh
else ; TAIWAN
ifdef PRC ; GB2312 lead byte range, pisuih, 3/16/95'
BeginRange1 equ 129 ; 81h Change to GBK lead byte, shanxu 2/22/96
EndRange1 equ 254 ; FEh
else ; PRC
ifdef KOREA
BeginRange1 equ 129
EndRange1 equ 254
else ; not KOREA
BeginRange1 equ 255
EndRange1 equ 254
endif ; KOREA
endif ; PRC
endif ; TAIWAN
BeginRange2 equ 255
EndRange2 equ 254
endif ;
sBegin DATA
globalD bios_proc, 0
globalD nmi_vector, 0
;externD nmi_vector
public fSysReq
fSysReq db 0 ; Enables CTRL-ALT-SysReq if NZ
; Keyboard information block (copied to 'KeyInfo' in the kernel)
; this is a KBINFO data structure.. defined in KERNEL.INC, USER.INC, USER.H
; and WINDEFS.INC.
;
; As of 3.0, build 1.30, KBINFO includes the number of function keys
; As of 3.0, build 1.59, the number of bytes in the state block is
; fixed at 4 MAX, for compatibility with Excel 2.1c!!!
;
PUBLIC inquireData
PUBLIC iqdNumFunc
inquireData LABEL BYTE
DB BeginRange1
DB EndRange1
DB BeginRange2
DB EndRange2
DW 4 ; #bytes of state info for ToAscii()
iqdNumFunc label word
dw 10 ; number of function keys
sEnd DATA
sBegin CODE
assumes CS,CODE
assumes DS,NOTHING
assumes ES,NOTHING
assumes DS,DATA
;***************************************************************************
;
; Inquire( pKBINFO ) - copies information about the keyboard hardware into
; the area pointer to by the long pointer argument. Returns a count of the
; number of bytes copied.
;
; The Windows kernel calls this to copy information to its 'KeyInfo' data
; structure.
;
;***************************************************************************
cProc Inquire,<PUBLIC,FAR>,<si,di>
parmD pKBINFO
cBegin Inquire
; .. now pass data to Windows ..
les di,pKBINFO ; Get far pointer of destination area
mov si, OFFSET inquireData ; Get source
mov ax,size KBINFO ; Get number of bytes to move
mov cx,ax ; (Return byte count in AX)
rep movsb ; Move the bytes
cEnd Inquire
;---------------------------------------------------------------------
;
;---- ScreenSwitchEnable( fEnable ) ----------------------------------
;
; This function is called by the display driver to inform the keyboard
; driver that the display driver is in a critical section and to ignore
; all OS/2 screen switches until the display driver leaves its
; critical section. The fEnable parameter is set to 0 to disable
; screen switches, and a NONZERO value to re-enable them. At startup,
; screen switches are enabled.
;---------------------------------------------------------------------
;
cProc ScreenSwitchEnable,<PUBLIC,FAR>
parmW fEnable
cBegin ScreenSwitchEnable
mov ax,fEnable ; get WORD parameter
or al,ah ; stuff any NZ bits into AL
;;; mov fSwitchEnable,al ; save BYTE.
cEnd ScreenSwitchEnable
;---------------------------------------------------------------------
;
;---- EnableKBSysReq( fSys ) ----------------------------------
;
; This function enables and shuttles off NMI interrupt simulation
; (trap to debugger) when CTRL-ALT-SysReq is pressed.
; CVWBreak overides int 2.
; fSysParm = 01 enable int 2
; = 02 disable int 2
; = 04 enable CVWBreak
; = 08 disable CVWBreak
;
;---------------------------------------------------------------------
;
cProc EnableKBSysReq,<PUBLIC,FAR>
parmW fSysParm
cBegin EnableKBSysReq
mov ax, fSysParm ; get WORD parameter
test al,01 ; turn on int 2?
jz @F
or fSysReq,01 ; yes, turn it on!
@@: test al,02 ; turn off int 2?
jz @F
and fSysReq,NOT 01 ; yes, turn it off!
@@: test al,04 ; turn on CVWBreak?
jz @F
or fSysReq,02 ; yes, turn it on!
@@: test al,08 ; turn off CVWBreak?
jz @F
and fSysReq,NOT 02 ; yes, turn it off!
@@:
xor ah,ah
mov al,fSysReq
ifdef NEWNMI
push ax ; save return value
call short GetNmi ; save NMI
pop ax ; restore ..
endif
cEnd EnableKBSysReq
; save NMI vector. Called above in EnableKBSysReq() and in Enable().
ifdef NEWNMI
GetNmi proc near
mov ax,3502h
int 21h
mov word ptr ds:[nmi_vector][0],bx
mov word ptr ds:[nmi_vector][2],es
ret
GetNmi endp
endif
;***************************************************************************
;
; Enable( eventProc ) - enable hardware keyboard interrupts, with the passed
; procedure address being the target of all keyboard events.
;
; lpKeyState is a long pointer to the Windows 256 byte keystate table
;
;***************************************************************************
cProc Enable,<PUBLIC,FAR>,<si,di>
parmD eventProc
parmD lpKeyState
cBegin Enable
sub ax, ax
cEnd Enable
;***************************************************************************
; Disable( eventProc ) - disable hardware keyboard interrupts, restoring
; the previous IBM BIOS keyboard interrupt handler.
;
;***************************************************************************
cProc Disable,<PUBLIC,FAR>,<si,di>
cBegin Disable
sub ax,ax
cEnd Disable
; ** GetTableSeg() ***************************************
;
; This finds the paragraph of the TABS segment and stores
; it in TableSeg.
;
; Calling this will force the segment to be loaded.
;
; This segment isn't written to.
;
; REMEMBER that AX is TRASHED !!
cProc GetTableSeg,<PUBLIC,FAR>,<si,di>
cBegin GetTableSeg
;;; mov ax,cs
;;; mov TableSeg,ax
cEnd GetTableSeg
;***************************************************************************
;
; NewTable()
;
; Change keyboard tables, if a keyboard table DLL is defined in
; SYSTEM.INI and the function GetKbdTable() exists and returns
; successfully.
;
; This function is passed no parameters by the caller -- it obtains
; the following from SYSTEM.INI:
;
; [keyboard]
; TYPE = 4 ; 1..6. 4 is enhanced kbd.
; SUBTYPE = 0 ; 0 for all but Olivetti
; ; 8086 systems & AT&T 6300+
; KEYBOARD.DLL = kbdus.dll ; name of DLL file
; OEMANSI.BIN = XLATNO.BIN ; oem/ansi tables file
;
; The module name of the DLL is expected to be the root of the DLL's
; file name. In any event, the module name must be different for
; each keyboard-table DLL!
;
;***************************************************************************
cProc NewTable,<PUBLIC,FAR>,<si,di>
; LOCAL variables on stack:
cBegin NewTable
sub ax,ax
cEnd NewTable
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; SetSpeed.asm
;
;
; Sets 'typematic' speed of AT-type keyboards (type code 3 or 4 in this
; driver).
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
cProc SetSpeed,<FAR,PASCAL,PUBLIC>
parmW rate_of_speed
cBegin
SS_error_return:
mov ax,-1 ; error return
SS_end:
cEnd
cProc GetBIOSKeyProc, <FAR, PUBLIC>
cBegin
mov ax, word ptr [bios_proc][0]
mov dx, word ptr [bios_proc][2]
cEnd
sEnd CODE
end