; SCCSID = @(#)kbdxlat.asm 12.21 89/07/25 ;OS2SS- Page 58,132 ;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ;$$ ;$$ Module: kbdxlat.asm Version: 1.2 ABIOS ;$$ ;$$ History: This module was derived from the 1.2 AT source code. ;$$ ABIOS changes were made according to the deltas between ;$$ the 1.1 ABIOS and 1.1 AT drivers. The 1.1 ABIOS driver ;$$ was done by John Nels Fuller (Wyse). The 1.2 ABIOS ;$$ driver was done by Alan J. Cotterman (NCR). ;$$ ;$$ Notes: Wherever possible the original 1.2 AT code is preserved. ;$$ All changes are marked with ";$$". ;$$ ;$$ The only modification to this module is in testing for ;$$ keyboard type. References to "IDFlags" have been ;$$ replaced with tests of the contents of "KbdHWIDs". ;$$ ;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ Title KBDXLAT - Translation Process Name KBDXLAT ;*********************************************************************** ;** ** ;** Keyboard Device Driver Scan Code Translation ** ;** ** ;** ** ;** This file contains the scan code to character translation process ** ;** code. The code in this file is only called once by KBDDD and is ** ;** not accessed by anyone else. So the entire translation process ** ;** can be replaced by replacing the routine in this file. The data ** ;** that is only used by the code in this file is in the file ** ;** KBDXDATA.ASM and it too would be replaced if this code is to be ** ;** replaced. ** ;** ** ;** 6/22/93 MJarus line with os2ss were modified by os2ss. ** ;*********************************************************************** .386p ;OS2SS-.286 .sall .xcref ;@@ The following files are included, but xlist'd out: .xlist Include struc.inc ;Structured assembly macros. Include kbddd.inc ;Keyboard Device Driver structures & equates. Include kbdxlat.inc ;Translation structures & equates. .list Extrn _Ow2MiscFlags:Byte ; 704,747,771,931,1188 (EnhancedKbd) Extrn _Ow2MiscFlags3:Byte ; 1089,1154,1166,...(AltPacket SecAltNumPad PauseLatch E0Packet) Extrn _Ow2KCBShFlgs:Word ; 2299 Extrn _Ow2KbdHWIDs:Word ;$$ Extrn IDFlags:Word ;Extrn OtherFlags:Byte ; (Test OtherFlags,InterruptTime) moved to [EDI] ;Extrn AltTable:Byte ; 275 ;Extrn AltPadMap:Byte ; 562 ;Extrn CtlPadMap:Byte ; 601 ;Extrn NewExtSC:Byte ; only CheckExtended() ;Extrn NewExtSCLen:ABS ; only CheckExtended() _TEXT SEGMENT DWORD USE32 PUBLIC 'CODE' ASSUME CS:FLAT, DS:FLAT, ES:FLAT, SS:NOTHING, FS:NOTHING, GS:NOTHING AltPadMap Label Byte db 7,8,9,-1 db 4,5,6,-1 db 1,2,3 db 0,-1 CtlPadMap Label Byte ; db 119,-1,132,-1 ; db 115,-1,116,-1 ; db 117,-1,118 ; db -1,-1 db 119,141,132,142 ;@@ Keypad 7, 8, 9, - (PTM 5024) db 115,143,116,144 ;@@ Keypad 4, 5, 6, + (PTM 5024) db 117,145,118 ;@@ Keypad 1, 2, 3 (PTM 5024) db 146,147 ;@@ Keypad 0, . (PTM 5024) ;***** ;* Translation for keypresses on AlphaKeys with Alt pressed. This ;* translation is ALWAYS indexed by the Char1 value less 96 (which ;* is ascii "a"). The translation value is the scan code that ;* would come in on a regular PC keyboard (or PC/AT keyboard in ;* compatability mode). ;***** AltTable Label Byte ; a, b, c, d, e, f, g, h, i, j, k, l, m db 30,48,46,32,18,33,34,35,23,36,37,38,50 ; ; n, o, p, q, r, s, t, u, v, w, x, y, z db 49,24,25,16,19,31,20,22,47,17,45,21,44 ; NewExtSC LABEL BYTE ;@@ ALT+ ;@@ [ ] ; ' ` \ , . / Tab db 1Ah,1Bh,27h,28h,29h,2Bh,33h,34h,35h,0Fh NewExtSCLen equ $-NewExtSC ;@@ Used by interrupt handler. Even ;Make sure we're an even number of bytes. * ; * ; * ;*** END OF THE TRANSLATION TABLE ********************************** ;OS2SS-... ; ULONG ; Ow2KbdXlate( ; ULONG ScanCode, ; PKBD_XLATE_VARS pFlagArea, ; PKBD_MON_PACKAGE pMonitorPack, ; PVOID pTransTable ; ); Public _Ow2KbdXlate@16 _Ow2KbdXlate@16 Proc ;------------------------------------------------------\ push ebp mov ebp,esp sub esp,8 ; for local arguments push ebx push ecx push edx push edi push esi ; ; now: ; ; ebp-8 Pointer to DD of XlateTable entry for this scan code. ; ebp-4 Pointer to DD holding Offset of top of XlateTable ; ; ebp+0 old ebp ; ebp+4 Return Address ; ebp+8 ScanCode ; ebp+12 pFlagArea ; ebp+16 pMonitorPack ; ebp+20 pTransTable ; mov eax, [ebp+8] mov edi, [ebp+12] mov esi, [ebp+16] mov ebx, [ebp+20] ; cmp ebx,0 ; jnz HaveTable ; ; if no translate table ; mov ebx,Offset XlateTable ; set the default one ; ;HaveTable: call KbdXlate mov al,0 ; Error ? jnc EndXlate ; yes - no packet test [esi].DDFlags,MultiMake jnz EndXlate ; ignore multiple make of toggle key test [edi].XPSGFlags, PrevAccent jnz EndXlate ; ignore accent char till next keystroke mov ah,byte ptr [esi].DDFlags and ah,KeyTypeMask cmp ah,UndefKey ; Is this key undefined? je EndXlate ; yes - ignore cmp byte Ptr [esi+KeyPacketLen].MonFlags,-1 ; do we have two packets? mov al,1 ; assume not jnz EndXlate mov al,2 ; 2 packets EndXlate: and eax,0FFh ; returns in al number of packets pop esi pop edi pop edx pop ecx pop ebx mov esp,ebp pop ebp ret 16 _Ow2KbdXlate@16 Endp ;-------------------------------------------------------/ KbdXlate Proc ;------------------------------------------------------\ ;*********************************************************************** ;* * ;* Subroutine Name: KbdXlate * ;* * ;* Descriptive Name: Keyboard Scan Code Translation * ;* * ;* Function: This routine translates the scan code received from * ;* the keyboard and places it in the Monitor Key Packet. * ;* It also sets all flags that are based on the scan code * ;* received. * ;* * ;* Entry Point: KbdXlate Linkage: Near * ;* * ;* Input: AL=Raw Scan Code EDI = Ptr to translation flag area * ;* ESI = Ptr to Monitor KeyPacket * ;* EBX = Ptr to Translate Table * ;* * ;* Exit-Normal: Monitor Key Packet filled in * ;* AL=Raw scan code if translation successful * ;* * ;* Exit-Error: If found a break of a shift key that had seen no * ;* make, returns 0 and CX hold the unexpected shift bits. * ;* * ;* Effects: All regs except SI, DI and the Seg regs may be altered * ;* Key Packet filled in * ;* * ;* Internal References: * ;* Routines: UnPauseChk * ;* AccCheckout * ;* * ;* External References: * ;* Routines: None. * ;* * ;* * ;*********************************************************************** Or Byte Ptr [ESI].MonFlags,NotInserted ;OS2SS-Key isn't monitor inserted. And [EDI].XlateFlags,Not NormalAlt ;OS2SS-@@ Turn flag off to start Mov AH,AL ;Copy scan code into AH Or AH,AH ;Check if key break bit in .If ;If it is Or [ESI].DDFlags,KeyBreak ;OS2SS-Set Flag And AH,Not BreakBit ;Clear the break bit from the scan code .Endif ;Endif key break bit on Mov DL,AL ;OS2SS-Now calculate... And EDX,07Fh ;OS2SS-...the index into... Dec EDX ;OS2SS- ...XlateTable for... IMul EDX,KDefLen ;OS2SS- ...this scan code. Add EDX,KDefs ;OS2SS-Point past header to keydefs. Add EDX,EBX ;OS2SS-Add offset into table. Mov [EBP-8],EDX ;OS2SS-Save Pointer to XlateTable entry for this scan code. Mov [EBP-4],EBX ;OS2SS-Put table start offset on the stack. Mov BX,[EDX].XlateOp ;OS2SS-Get Xlate Operation word. And EBX,ActionMask ;OS2SS-Isolate translate action field. Mov [ESI].Key.Scan,AH ;OS2SS-Put scan code in key packet Test [EDI].XlateFlags,SecPrefix ;OS2SS-@@ Check if saw E0 prefix last time .If ;If we did Or [ESI].DDFlags,SecondaryKey ;OS2SS-@@ Indicate so. ;@@ PTM 4359 .If ;@@ If this is '/' on Numpad Test [ESI].Key.Shift,AltFlag ;OS2SS-@@ PTM 5024 .If ;@@ If ALT Key is down Mov [ESI].Key.Scan,0A4h ;OS2SS-@@ Set extended scan code .Else ;@@ Else no Alt down Test [ESI].Key.Shift,CtlFlag ;OS2SS-@@ Check if Ctl key down .If ;@@ If it is Mov [ESI].Key.Scan,095h ;OS2SS-@@ Set extended scan code .Else ;@@ Else no Alt or Ctl key down Mov [ESI].Key.Char,'/' ;OS2SS-@@ then it is always '/' regardless Mov [ESI].Key.Scan,OtherKey ;OS2SS-@@ and the scan code is EO .Endif ;@@ Endif Ctl key down .Endif ;@@ End PTM 5024 Jmp EndActionCase ;@@ of country/code page. .Endif .Endif ;From now on, ES:EDX (;OS2SS-)points to the Xlate table entry. If running in ;3xBox(;OS2SS-can't be), that pointer may have been created by a LOADALL, so don't ;allow interrupts, nor change Seg Regs. Also, the beginning offset ;of the translate table itself is on the top of stack. Mov CX,Word Ptr [EDX+2] ;OS2SS-@@ Get Char1 and Char2 values. Mov DX,[ESI].Key.Shift ;OS2SS-Get the current shift status from Key. .If AND ;@@ If not a padkey clear possible Alt-nnn entry. .If ;@@ Don't clear on Alt key, either. Mov [EDI].XAltKeyPad,0 ;OS2SS-@@ Clear Alt-nnn entry. .Endif Mov AL,CL ;Copy Char1 for use later. .If ;@@ Was the action number too big? Jmp NoXlate ;Yes, so don't try to translate. .Endif Shl BX,2 ;Make action number an offset. Add EBX,Offset XJumpTable ;OS2SS-@@ Point to processor address. Jmp [EBX] ;OS2SS-Go translate. ;Following is the branch table for the various actions that ;can be performed on a keystroke. Processing re-merges at the ;bottom of this CASE structure, at label "EndActionCase". Public NoXlate, AlphaKey, SpecKey, SpecKeyC, SpecKeyA, SpecKeyCA Public FuncKey, PadKey, SpecCtlKey, PrtScr, SysReq, AccentKeyType Public ShiftKeys, ToggleKey, AltKey, NumLock, CapsLock, ScrollLock Public XShiftKey, XToggleKey, SpecKeyCS, SpecKeyAS Even XJumpTable: dd NoXlate ;0 Invalid action code, no translate done. dd AlphaKey ;1 Alphabetical character key. dd SpecKey ;2 Special non-alpha key, no CAPSLOCK or ALT. dd SpecKeyC ;3 Special non-alpha key, with CAPSLOCK. dd SpecKeyA ;4 Special non-alpha key, with ALT. dd SpecKeyCA ;5 Special non-alpha key, w/CAPSLOCK and ALT. dd FuncKey ;6 Function keys. dd PadKey ;7 Numeric keypad keys. dd SpecCtlKey ;8 Keys that do special things with CTL. dd PrtScr ;9 The print screen key. dd SysReq ;A The system request key. dd AccentKeyType ;B A key that affects the NEXT key (dead key). dd ShiftKeys ;C The LSHIFT, RSHIFT, and CTL keys. dd ToggleKey ;D General Toggle key. dd AltKey ;E The ALT key. dd NumLock ;F The NUMLOCK key. dd CapsLock ;10 The CAPSLOCK key. dd ScrollLock ;11 The SCROLL LOCK key. dd XShiftKey ;12 Extended shift key (for DBCS use). dd XToggleKey ;13 Extended toggle key (for DBCS use). dd SpecKeyCS ;14 Special key for NLS support. dd SpecKeyAS ;15 Special key for NLS support. ; On entering the following routines, the following regs are set: ; ; CL = Char1 and CH = Char2 (both from XlateTable entry) ; DX = ShiftFlags (same as in Key CharData record) ; AL = Char1 also AH = Received scan code (Breakbit cleared) ;OS2SS- ESI = Pointer to Key Packet ;OS2SS- EDI = Pointer to current PSG ;OS2SS- [EBP-8] = Pointer to XlateTable entry for this scan code. ;OS2SS- [EBP-4] = Pointer to Offset of top of XlateTable ; ; Also, Key.Scan = AH and Key.Char = 0 on entry to the routines. AlphaKey: ;Alphabetical character key. ifdef JAPAN ; MSKK Aug.15.1993 V-AkihiS ; Support SBCS katakana Test [ESI].Key.DShift, Katakana ;OS2SS Check if Katakana or not .If Mov EBX,[EBP-8] ;OS2SS- Mov AL,[EBX].Char4 ;OS2SS-Get Char4 and Char5 values. Mov CX,Word Ptr [EBX+5] ;OS2SS- .Endif endif Test DL,AltFlag ;Check if Alt key is pressed. .If ;Is it? And [EDI].XlateFlags,Not Use3Index ;OS2SS-@@ Use Char3 if AltGraph Call AltGraphCheck ;@@ Process if AltGraph Test [EDI].XlateFlags,NormalAlt ;OS2SS-@@ Check if it's not the AltGraph .If ;@@ If alt key is normal Alt Xor EBX,EBX ;OS2SS-Yes, so make Char1 an offset. Mov BL,AL ;OS2SS-Now make it the base. Mov AH,[AltTable+EBX-"a"] ;OS2SS-Fetch Alt-[] mapped code. Mov [ESI].Key.Scan,AH ;OS2SS-Put in Key record. Xor AL,AL ;Set `extended char' code. .Endif Jmp NewLbl1 .Endif ;OS2SS- (A2053)## Endif Alt is down. ;OS2SS- .Else Test DL,CtlFlag ;Else, check if Ctl key is pressed. ;@@ for this KCB ;@@ PTM 5992 - Begin .If OR ;@@ Is it OR? Test [EDI].XHotKeyShift,CtlFlag ;OS2SS-@@ Also check in interrupt shift ;@@ state .If AND ;@@ Is it being held down at all Test [EDI].OtherFlags,InterruptTime ;OS2SS-&& PTM 3191: Make sure KBDXlate .If ;&& translations are independent. ;@@ PTM 5992 - End ;Check limit on char1 value! Sub AL,"a"-1 ;Yes, so convert Char1 to control code. .If ;Is this Ctrl-C? ;@@ Tell dd it's the PSUEDO-BREAK KEY. Or [ESI].DDFlags,PSBreakKey ;OS2SS- Jmp NoPauseCheck ;@@ Do not check if paused, Ctl-C ;@@ has priority over resuming output .ElseIf ;Is this Ctrl-P? ;@@ Tell dd it's PSUEDO-PRTECHO KEY. Or [ESI].DDFlags,PSPrintEchoKey ;OS2SS- Jmp NoPauseCheck ;@@ Do not check if paused, Ctl-P ;@@ has priority over resuming output .ElseIf ;Is this Ctrl-S? ;1.3-## PTR b790266 Test [ESI].DDFlags,KeyBreak ;OS2SS-1.3-## Make sure it isn't key break .If AND ;1.3-## If zero, then its a make .If <[EDI].XInputMode eq 0> ;OS2SS-@@ Right, are we in cooked mode? ;@@ Yes, tell dd it's PSUEDO-PAUSE KEY. Or [ESI].DDFlags,PSPauseKey ;OS2SS- .Endif .Endif .Else ;Check for regular shifts/capslock. ifdef JAPAN ; MSKK Aug.15.1993 V-AkihiS ; When Mode is katakana, CapsLock has no affect on this key. Test [ESI].Key.DShift, Katakana ;OS2SS Check if Katakana or not .If ;OS2SS Mov BL,0 ;OS2SS indicate that CapsTogl has no ;OS2SS affect on this key. .Else Mov BL, CapsTogl ;OS2SS Set indicator that CapsLock and ;OS2SS ShiftLock affect key. .Endif else Mov BL, CapsTogl ;## Set indicator that CapsLock and ;## ShiftLock affect key. endif Call CapsCheck ;## Determine the shifting of the char. .Endif ;## Endif Ctrl or Interrupt time. ;OS2SS- .Endif ;## Endif Alt is down. NewLbl1: ;OS2SS- Test [EDI].OtherFlags,InterruptTime ;OS2SS-@@ If it's interrupt time .If ;@@ Call UnPauseChk ;Go check if in pause state. .Endif ;@@ NoPauseCheck: Mov [ESI].Key.Char,AL ;OS2SS-Put xlated character into Key rec. ;&& PTM 2217 BEGIN: Test [ESI].DDFlags,KeyBreak ;OS2SS-&& Check if this a break or make. .If ;&& If it isn't then go and check accent. ;@@ PTM 6860 - Begin Call AccCheckout ;Go check if accent combo going on. ;@@ PTM 6860 - End .Endif ;&& Endif this is a make. ;&& PTM 2217 END: Jmp EndActionCase ;Go to bottom of Xlate Action case table. SpecKey: ;Special non-alpha key, no CAPSLOCK or ALT. Test [EDI].OtherFlags,InterruptTime ;OS2SS-@@ If it's interrupt time .If ;@@ Call UnPauseChk ;Go check if in pause state. .Endif ;@@ Test DL,AltFlag ;Check if Alt key is pressed. .If ;Is it? And [EDI].XlateFlags,Not Use3Index ;OS2SS-@@ Use Char3 if AltGraph Call AltGraphCheck ;@@ Process if AltGraph Test [EDI].XlateFlags,NormalAlt ;OS2SS-## Check if it's the AltGraph .If ;## If alt key is AltGraph ;## which is undefined for this key Mov [ESI].Key.Char,AL ;OS2SS-## put it in CDR Call AccCheckout ;## Go check if acc. combo going on. Jmp EndActionCase ;## Go to bottom of Xlate Action .Endif ;## case table Jmp NoXlate ;## then Key combo is undefined .Endif ;@@ Endif Alt Key down ;## PTM 2287: BEGIN Mov EBX,[EBP-8] ;OS2SS-## Put it in BX Test [EBX].XTFlags1,ShiftLock ;OS2SS-## Check if SHIFTLOCK keyboard. .If ;## If it is Mov BL,CapsTogl ;## Indicate a CAPSLOCK check. .Endif ;## PTM 2287: END Test DL, CtlFlag ;## Check if Ctrl key down. .If ;## If so ... Call SKCtlCheck ;## check if char has special ;## control code. .Else ;## Else Ctrl key not down, Mov BL,0 ;1.3-@@ PTR B713838 Clear ShifLock Flag Call CapsCheck ;## Check for shifting. .Endif ;## Endif Ctrl down. Mov [ESI].Key.Char,AL ;OS2SS-## Put Char in Key rec. Call AccCheckout ;## PTR B705184 Jmp EndActionCase ;## Go to bottom of Xlate Action. SpecKeyC: ;Special non-alpha key, with CAPSLOCK. Test [EDI].OtherFlags,InterruptTime ;OS2SS-@@ If it's interrupt time .If ;@@ Call UnPauseChk ;Go check if in pause state. .Endif ;@@ Test DL,AltFlag ;Check if Alt key is pressed. .If ;Is it? And [EDI].XlateFlags,Not Use3Index ;OS2SS-@@ Use Char3 if AltGraph Call AltGraphCheck ;@@ Process if AltGraph Test [EDI].XlateFlags,NormalAlt ;OS2SS-@@ Check if it's not the AltGraph .If ;@@ If alt key is normal Alt Mov EBX,[EBP-8] ;OS2SS- .If <[EBX].Char4 eq 0> ;OS2SS-@@ then check if char 4 is 0 ;@@ PTM 5024 - Begin Call CheckExtended ;@@ See if new extended code ;@@ is defined .If ;## If it is defined. Call AccCheckout ;## Go check if acc. combo going on. Jmp EndActionCase ;## Go to bottom of Xlate Action .Endif ;@@ PTM 5024 - End Jmp NoXlate ;## the key combo is undefined .Else ;@@ else if char 4 isn't 0 Mov AL,[EBX].Char4 ;OS2SS-@@ then use it .Endif ;@@ Endif Char 4 is 0 .Endif ;@@ Endif Alt key is normal Alt. Jmp SpecAccent ;@@ Go check if this is an accent .Endif ;@@ Endif Alt Key down Test DL, CtlFlag ;## Check if Ctrl key down. .If ;## If so ... Call SKCtlCheck ;## check if char has special ;## control code. .Else ;## Else Ctrl is not down. ;## PTR B704944 CapsCheck in Else Mov BL,CapsTogl ;Indicate check CAPSLOCK. Call CapsCheck ;## Check for shifting. .Endif SpecAccent: .If ;@@ Indicate this is unprocessed Or [ESI].DDFlags,AccentKey ;OS2SS-@@ accent. Test [ESI].DDFlags,KeyBreak ;OS2SS-@@ Check for the key BREAK. .If ;@@ Is it? And [EDI].XPSGFlags,Not PrevAccent ;OS2SS-@@ No, clear previous ;@@ accent number. Or Byte Ptr [EDI].XPSGFlags,AL ;OS2SS-&& Save accent number ;&& for the next key. .Endif Jmp EndActionCase ;## Go to bottom of Xlate Action case table. .Endif Mov [ESI].Key.Char,AL ;OS2SS-## Put Char in Key rec. Call AccCheckout ;## PTR B705184 Jmp EndActionCase ;@@ Go to bottom of Xlate Action case table. SpecKeyA: ;Special non-alpha key, with ALT. ifdef JAPAN ; MSKK Aug.15.1993 V-AkihiS ; Support SBCS katakana Test [ESI].Key.DShift, Katakana ;OS2SS Check if Katakana or not .If Mov EBX,[EBP-8] ;OS2SS- Mov AL,[EBX].Char4 ;OS2SS-Get Char4 and Char5 values. Mov CX,Word Ptr [EBX+5] ;OS2SS- .Endif endif Test [EDI].OtherFlags,InterruptTime ;OS2SS-@@ If it's interrupt time .If ;@@ Call UnPauseChk ;Go check if in pause state. .Endif ;@@ ;## PTM 2287: BEGIN Mov EBX,[EBP-8] ;OS2SS-## Put it in BX Test [EBX].XTFlags1,ShiftLock ;OS2SS-## Check if SHIFTLOCK keyboard. .If ;## If it is Mov BL,CapsTogl ;## Indicate a CAPSLOCK check. .Endif ;## PTM 2287: END Test DL, AltFlag ;## Check if Alt is down, .If ;## If it is... Call SKAltCheck ;## Check for extended code. .Else ;## If it is not down, .if ;## PTM 3327 start Call SKCtlCheck ;## Check for spec. Ctrl code. .else Mov BL,0 ;1.3-@@ PTR B713838 Clear ShifLock Flag Call CapsCheck ;## Check for Shifting. .endif ;## PTM 3327 end Mov [ESI].Key.Char,AL ;OS2SS-## Put Char in Key rec. .Endif ;## Endif Alt is down. Call AccCheckout ;## PTM 3126 fix stand alone accent Jmp EndActionCase ;## Go to bottom of Xlate Action. SpecKeyCA: ;Special non-alpha key, w/CAPSLOCK and ALT. Test [EDI].OtherFlags,InterruptTime ;OS2SS-@@ If it's interrupt time .If ;@@ Call UnPauseChk ;Go check if in pause state. .Endif ;@@ Mov BL,CapsTogl ;Indicate check CAPSLOCK. Test DL, AltFlag ;## Check if Alt is down, .If ;## If it is... Call SKAltCheck ;## Check for extended code. .Else ;## If it is not down, Call CapsCheck ;## Check for Shifting. Test DL, CtlFlag ;## Check if Ctrl is down, .If ;## If it is then... Call SKCtlCheck ;## Check for spec. Ctrl code. .Endif ;## Endif Ctrl is down. .Endif ;## Endif Alt is down. Mov [ESI].Key.Char,AL ;OS2SS-## Put Char in Key rec. Jmp EndActionCase ;## Go to bottom of Xlate Action. FuncKey: ;Function keys. Test [EDI].OtherFlags,InterruptTime ;OS2SS-@@ If it's interrupt time .If ;@@ Call UnPauseChk ;Go check if in pause state. .Endif ;@@ Test DL,AltFlag ;Check Alt Key. .If ;Is it down? And [EDI].XlateFlags,Not Use3Index ;OS2SS-@@ Use Char3 if AltGraph Call AltGraphCheck ;@@ Process if AltGraph Test [EDI].XlateFlags,NormalAlt ;OS2SS-@@ Check if it's not the AltGraph .If ;@@ If alt key is normal Alt .If ;Yes, so check if F11 or F12. Add CL,128 ;If so, extended code is 139 or 140 .Else Add CL,103 ;Extended code is range 104-113. .Endif ;@@ .Else ;@@ Else ALt key was Atl-Graph ;@@ PTM 6860 - Begin Mov [ESI].Key.Char,AL ;OS2SS-@@ Move char 3 to key packet Mov CL,[ESI].Key.Scan ;OS2SS-@@ Move scan to CL ;@@ PTM 6860 - End .Endif ;@@ Endif Alt or AltGraph check .Else ;@@ Endif no Alt key down Test DL,CtlFlag ;Check Ctl Key. .If ;Is it down? .If ;Yes, so check if F11 or F12. Add CL,126 ;If so, extended code is 137 or 138. .Else Add CL,93 ;Extended code is range 94-103. .Endif .Else Test DL,RShiftFlag+LShiftFlag ;Check Shift Keys. .If ;Is one down? .If ;Yes, so check if F11 or F12. Add CL,124 ;If so, extended code is 135 or 136. .Else Add CL,83 ;Extended code is range 84-93. .Endif .Else ;Else this is a non-shifted FKey. .If ;Check if F11 or F12. Add CL,122 ;If so, extended code is 133 or 134. .Else Add CL,58 ;Extended code is range 59-68. .Endif .Endif .Endif .Endif Mov [ESI].Key.Scan,CL ;OS2SS-Put code in CharData rec. ;@@ PTM 6860 - Begin Call AccCheckout ;Go check if accent combo going on. ;@@ PTM 6860 - End Jmp EndActionCase ;Go to bottom of Xlate Action case table. PadKey: ;Numeric keypad keys. Test [EDI].OtherFlags,InterruptTime ;OS2SS-@@ If it's interrupt time .If ;@@ Call UnPauseChk ;Go check if in pause state. .Endif ;@@ Xor EBX,EBX ;OS2SS-Clear for use later. Test DL,AltFlag ;Check if Alt key down. .If NEAR ;Are we entering Alt-nnn? ;Maybe. First check for reboot request. .If AND ;@@ And is current key mapped to Del? ;@@ PTM 6350 - Begin Test [ESI].DDFlags,KeyBreak ;OS2SS-@@ Check if this a break .If AND ;@@ If it isn't (only reboot on make of Del) ;@@ PTM 6350 - End Test DL,CtlFlag ;Maybe. First check for reboot request. .If OR ;Is Ctl down too ;@@ for this KCB OR ;@@ PTM 5992 - Begin Test [EDI].XHotKeyShift,CtlFlag ;OS2SS-@@ Also check in interrupt shift ;@@ state .If AND ;@@ Is it being held down at all Test [EDI].OtherFlags,InterruptTime ;OS2SS-&& PTM 3191: Make sure KBDXlate .If ;&& translations are independent. ;@@ PTM 5992 - End ;@@ Tell dd it's the REBOOT KEY. ;OS2SS-BUGBUG shouldn't get here Or [ESI].DDFlags,RebootKey ;OS2SS-@@ Jmp EndActionCase ;Quit now. .Endif And [EDI].XlateFlags,Not Use3Index ;OS2SS-@@ Use Char3 if AltGraph Call AltGraphCheck ;@@ Process if AltGraph Test [EDI].XlateFlags,NormalAlt ;OS2SS-@@ Check if it's not the AltGraph .If ;@@ If alt key is normal Alt ;@@ PTM 5024 - BEGIN Test [EDI].XlateFlags,SecPrefix ;OS2SS-@@ Check if secondary key .If ;@@ If it is Add [ESI].Key.Scan,50h ;OS2SS-@@ Make scan extended code Mov [ESI].Key.Char,0 ;OS2SS-@@ Make char extended code .Else ;@@ Else primary pad key Test [ESI].DDFlags,KeyBreak ;OS2SS-Check if is a key break. .If ;Is it? Mov BL,CL ;No, so make Char1 value the index. Mov CL,[EBX+AltPadMap] ;OS2SS-Get numeric value of the key. Or CL,CL ;Check if value is -1. .If ;Is it. Mov [EDI].XAltKeyPad,0 ;OS2SS-@@ Not numeric, reset. .If ;@@ If this is DEL key Jmp NoXlate ;@@ No extended value, undefined .Else ;@@ Else extended char Jmp EndActionCase ;@@ Mark char defined .Endif ;@@ Endif Extended Char exists .Else Mov AL,10 ;Else multiply old... Mul [EDI].XAltKeyPad ;OS2SS-@@ ...accumulator by 10. Add AL,CL ;And add new key. Mov [EDI].XAltKeyPad,AL ;OS2SS-@@ Save modified accum. Jmp NoXlate ;Mark keystroke undefined .Endif .Else ;@@ PTM 6860 - Begin Else a break Jmp NoXlate ;@@ Mark keystroke undefined .Endif .Endif ;@@ Endif primary or secondary key ;@@ End PTM 5024 .Else ;@@ Mov [ESI].Key.Char,AL ;OS2SS-@@ Put Char into Key rec. Test [ESI].DDFlags,SecondaryKey ;OS2SS-@@ Check if G keyboard dup key. .If ;@@ Is it? Mov [ESI].Key.Scan,OtherKey ;OS2SS-@@ Yes, so mark it so. .Endif ;@@ .Endif ;@@ Endif normal ALT .Else NEAR ;No Alt key down. ;@@ PTM 5024 Test [EDI].XlateFlags,SecPrefix ;OS2SS-@@ Check if secondary key .If ;@@ If it is Mov AL,OtherKey ;@@ Set Char to E0 .Else ;@@ Else regular pad key Xor AL,AL ;@@ Set Char to "extended" .Endif ;@@ End PTM 5024 Test DL,CtlFlag ;Check if Ctl key down. .If ;Is it? Mov BL,CL ;Yes, so make Char1 value the index. Mov AH,[EBX+CtlPadMap] ;OS2SS-Get extended value of the key. Mov [ESI].Key.Scan,AH ;OS2SS-Set extended code for this key. .Else ;Not Alt- or Ctl-, so figure out Num status. .If OR ;Is this the minus key? .If ;Or is this the plus key? Mov AL,CH ;Yes, so use Char2 regarless of shifts. .Else Test DL,RShiftFlag+LShiftFlag ;Check for shift key. .If ;Is one down? Or BL,NumTogl ;Yes, so set NumLock bit. .Endif And DL,NumTogl ;Clear all shift bits but NumLock. Xor DL,BL ;Flip it if shift key was down. .If ;Is the case Num Lock? Mov AL,CH ;Yes, so use Char2. .Endif ;@@ PTM 7358 - Begin .If OR ;@@ If we should not shift Test [ESI].DDFlags,SecondaryKey ;OS2SS-@@ if G keyboard dup key. .If ;@@ If it is .If ;Is this the Ins key? Test [ESI].DDFlags,KeyBreak ;OS2SS-Yes check if key BREAK. .If ;Is it? And [EDI].ToggleFlags,Not InsKeyDown ;OS2SS-@@ Yes clear latch. .Else ;Not Ins Key Break. Test [EDI].ToggleFlags,InsKeyDown ;OS2SS-@@ Check if seen Ins. .If ;Have we? Or [EDI].ToggleFlags,InsKeyDown ;OS2SS-@@ No, so set latch. Xor Byte Ptr [ESI].Key.Shift,InsTogl ;OS2SS-Toggle in CDR .Else ;Otherwise this is a repeat of the make. Or [ESI].DDFlags,MultiMake ;OS2SS-So indicate so. .Endif .Endif .Endif .Endif ;@@ Endif we should set/clear insert toggle ;@@ PTM 7358 - End .Endif .Endif Mov [ESI].Key.Char,AL ;OS2SS-Put character value in Key rec. Test [ESI].DDFlags,SecondaryKey ;OS2SS-Check if G keyboard dup key. .If ;Is it? Mov [ESI].Key.Char,OtherKey ;OS2SS-Yes, so mark it so. .Endif .Endif ;Endif Alt key down or not check ;@@ PTM 6860 - Begin Call AccCheckout ;Go check if accent combo going on. ;@@ PTM 6860 - End Jmp EndActionCase ;Go to bottom of Xlate Action case table. SpecCtlKey: ;Keys that do special things with CTL. Test [EDI].OtherFlags,InterruptTime ;OS2SS-@@ If it's interrupt time .If ;@@ Call UnPauseChk ;Go check if in pause state. .Endif ;@@ Test DL,AltFlag ;Check if Alt key down. .If ;Is it? And [EDI].XlateFlags,Not Use3Index ;OS2SS-@@ Use Char3 if AltGraph Call AltGraphCheck ;@@ Process if AltGraph Test [EDI].XlateFlags,NormalAlt ;OS2SS-@@ Check if it's not the AltGraph .If ;@@ If alt key is normal Alt ;@@ PTM 5024 - Begin Xor AL,AL ;@@ Set Char to be extended .If AND ;@@ If this is the Enter key Test [ESI].DDFlags,SecondaryKey ;OS2SS- .If ;@@ on the pad keys ;&& PTM 1270 - Don't overwrite scan Mov [ESI].Key.Scan,0A6h ;OS2SS-@@ Set extended code .Endif .Endif ;@@ PTM 5024 End Jmp SetCharField ;&& PTM 1520 now go set char field .Endif ;&& PTM 1270 - Begin Test [ESI].DDFlags,SecondaryKey ;OS2SS-@@ Check if G keyboard dup key. .If ;@@ Is it? Mov [ESI].Key.Scan,OtherKey ;OS2SS-@@ Yes, so mark it so. .Endif Test DL,CtlFlag ;Check if Ctl key down. .If ;Is it? Mov AL,CH ;Yes, so use Char2. .Endif SetCharField: ;&& PTM 1520 Alt should have ;&& precedence when Ctrl and Alt ;&& are down. Mov [ESI].Key.Char,AL ;OS2SS-Put Char into Key rec. ;&& PTM 1270 - End ;@@ PTM 6860 - Begin Call AccCheckout ;Go check if accent combo going on. ;@@ PTM 6860 - End Jmp EndActionCase ;Go to bottom of Xlate Action case table. ;OS2SS-BUGBUG-shouldn't get here PrtScr: ;The print screen key. Test [EDI].OtherFlags,InterruptTime ;OS2SS-@@ If it's interrupt time .If ;@@ Call UnPauseChk ;Go check if in pause state. .Endif ;@@ Test DL,AltFlag ;Check if Alt key down. .If ;Is it? Test [EDI].XlateFlags,SecPrefix ;OS2SS-@@ Check if secondary key .If OR ;@@ If it is OR... Test _Ow2MiscFlags,EnhancedKbd ;@@ Check if enhanced kbd .If OR ;@@ OR...If it's a regular kbd ;$$ ;$$ 'IDFlags' does not exist in the 1.2 ABIOS ;$$ version. We need to get this information from KbdHWIDs. ;$$ ;$$ Test IDFlags, SuperSport ;## Check if it is a 122 kbd .If < _Ow2KbdHWIDs e 0AB85h > ;$$ If it is a 122 kbd Test DL,CtlFlag ;@@ Check if Ctl key is down .If OR ;@@ If it is ;@@ for this KCB ;@@ PTM 5992 - Begin Test [EDI].XHotKeyShift,CtlFlag ;OS2SS-@@ Also check in interrupt shift ;@@ state .If AND ;@@ Is it being held down at all Test [EDI].OtherFlags,InterruptTime ;OS2SS-&& PTM 3191: Make sure KBDXlate .If ;&& translations are independent. ;@@ PTM 5992 - End Or [ESI].DDFlags,PrintFlushKey ;OS2SS-@@ Indicate this is FlushPrtbuf Jmp EndActionCase ;@@ Go to bottom of Xlate Action ;@@ case table. .Endif Jmp NoXlate ;Else that's undefined for this key. ;@@ PTM 5024 begin .Else ;@@ Else it Pad Key * on G kbd Xor AL,AL ;@@ Set extended code .Endif ;@@ Endif PrtScr or * .Else NEAR ;@@ Else no Alt key down Test DL,CtlFlag ;Check if Ctl key down. ;@@ for this KCB ;@@ PTM 5992 - Begin .If OR ;@@ Is it OR? Test [EDI].XHotKeyShift,CtlFlag ;OS2SS-@@ Also check in interrupt shift ;@@ state .If AND ;@@ Is it being held down at all Test [EDI].OtherFlags,InterruptTime ;OS2SS-&& PTM 3191: Make sure KBDXlate ;&& translations are independent. .If ;@@ PTM 5992 - End Test [EDI].XlateFlags,SecPrefix ;OS2SS-@@ Check if secondary key .If OR ;@@ If it is OR... Test _Ow2MiscFlags,EnhancedKbd ;@@ Check if enhanced kbd .If OR ;@@ OR...If it's a regular kbd ;$$ ;$$ 'IDFlags' does not exist in the 1.2 ABIOS ;$$ version. We need to get this information from KbdHWIDs. ;$$ ;$$ Test IDFlags, SuperSport ;## Check if it is a 122 kbd .If < _Ow2KbdHWIDs e 0AB85h > ;$$ If it is a 122 kbd Xor AL,AL ;Yes so set extended code... Mov [ESI].Key.Scan,CH ;OS2SS-...for the Ctl-PrSc combination. Or [ESI].DDFlags,PrintEchoKey ;OS2SS-@@ Tell dd it's the PRINT ;@@ ECHO KEY. ;@@ PTM 5024 - Begin .Else ;@@ Else its the keypad * Xor AL,AL ;@@ so set extended code... Mov [ESI].Key.Scan,96h ;OS2SS-@@ for scan and char .Endif ;@@ PTM 5024 - end .Else ;@@ Else Ctrl key not down. Test [EDI].XlateFlags,SecPrefix ;OS2SS-@@ Check if secondary key .If OR ;@@ If it is OR... Test DL,RShiftFlag+LShiftFlag ;@@ Check if a shift flag down. .If AND ;@@ If a shift key is down AND... Test _Ow2MiscFlags,EnhancedKbd ;@@ Check if enhanced kbd .If OR ;@@ AND...If it's a regular kbd ;$$ Test IDFlags, SuperSport ;## Check if it is a 122 kbd ;$$ ;$$ 'IDFlags' does not exist in the 1.2 ABIOS ;$$ version. We need to get this information from KbdHWIDs. ;$$ .If < _Ow2KbdHWIDs e 0AB85h > ;$$ If it is a 122 kbd Xor AL,AL ;Yes, so clear char code. Or [ESI].DDFlags,PrtScrKey ;OS2SS-@@ Tell dd it's PRINT SCREEN KEY. Test [ESI].DDFlags,KeyBreak ;OS2SS-Check for the key BREAK. .If ;Is it? And [EDI].XlateFlags,Not PSKeyDown ;OS2SS-@@ Yes, clear PS Key latch .Else Test [EDI].XlateFlags,PSKeyDown ;OS2SS-@@ Check if seen PS key yet. .If ;Have we? Or [EDI].XlateFlags,PSKeyDown ;OS2SS-@@ No, set latch saying have. .Else ;Otherwise this is a repeat of the make. Or [ESI].DDFlags,MultiMake ;OS2SS-So indicate so. .Endif ;Endif no PS key yet check .Endif ;Endif Key break or not check .Else ;@@ PTM 2606: Shift keys not ;@@ down or not enhanced kbd. Test [ESI].DDFlags, KeyBreak ;OS2SS-@@ If this is a break of the .If < nz > ;@@ PrtScr key, And [EDI].XlateFlags,Not PSKeyDown ;OS2SS-@@ Ensure latch is ;@@ cleared. .Endif ;@@ Endif PrtScr break. .Endif ;Endif shift key down .Endif ;Endif Ctl down or not check .Endif ;@@ Endif Alt key down check Mov [ESI].Key.Char,AL ;OS2SS-Put character in Key rec. ;@@ PTM 6860 - Begin Call AccCheckout ;Go check if accent combo going on. ;@@ PTM 6860 - End Jmp EndActionCase ;Go to bottom of Xlate Action case table. AccentKeyType: ;A key that affects the NEXT key (dead key). Test [EDI].OtherFlags,InterruptTime ;OS2SS-@@ If it's interrupt time .If ;@@ Call UnPauseChk ;Go check if in pause state. .Endif ;@@ Test DL,AltFlag ;Check if ALT down. .If ;Is one? Or [EDI].XlateFlags,Use3Index ;OS2SS-@@ Use Char3 if AltGraph Call AltGraphCheck ;@@ Process if AltGraph Test [EDI].XlateFlags,NormalAlt ;OS2SS-@@ check if it was Altgraph key .If ;@@ If it was AltGraph key .If ;@@ If char 3 wasn't accent Mov [ESI].Key.Char,CL ;OS2SS-@@ Put char in CDR Mov [ESI].Key.Scan,AH ;OS2SS-@@ Put scan in CDR Call AccCheckOut ;@@ Go check if accent combo (p6860) Jmp EndActionCase ;@@ And quit now .Else ;@@ Else char3 was an accent or 0 .If ;@@ If Char 3 was 0 Jmp NoXlate ;@@ Mark Key packet undefined .Else ;@@ Else it was an accent Xor BH,BH ;@@ Flag no shift check Jmp ShiftAccent .Endif ;@@ Endif Char3 was 0 or not .Endif ;@@ Endif Char3 accent or not .Endif ;@@ Endif Altgraph key down .Endif ;@@ Endif ANY Alt key down Test [EDI].XlateFlags,NormalAlt ;OS2SS-@@ Check if it's not the AltGraph .If OR ;@@ If alt key is normal Alt Test DL,CtlFlag .If ;@@ OR CTL key is down Mov EBX,[EBP-8] ;OS2SS- Mov CL,[EBX].Char5 ;OS2SS-@@ Get accent entry index ;@@ for CTL or ALT character XOR EBX,EBX ;OS2SS- Test [EDI].XlateFlags,NormalAlt ;OS2SS-@@ Check if it's not the AltGraph .If ;@@ If alt key is normal Alt Mov EBX,AltAcChar ;OS2SS-@@ So get Alt-Accent offset. .Endif Test DL,CtlFlag .If ;@@ If its the CTL key Mov EBX,CtlAcChar ;OS2SS-@@ So get Ctl-Accent offset. .Endif And ECX,0FFh ;OS2SS-Make accent number a word. Dec ECX ;OS2SS-Accent 1 is offset zero. IMul ECX,AccEntryLen ;OS2SS-Set offset of accent table entry. Add ECX,Accents ;OS2SS-Add offset of accent entries. Add ECX,EBX ;OS2SS-@@ Add offset for Ctl or Alt ;@@ accent Add ECX,[EBP-4] ;OS2SS-Point into translate table. Mov EBX,ECX ;OS2SS-Put pointer in base reg. Mov BX,Word Ptr [EBX] ;OS2SS-Fetch char and scan. Or BX,BX ;Check if a Scan/Char mapping for this key. .If ;Is there? Jmp NoXlate ;No, so go mark untranslated. .Endif ;Else, use the mapping. Mov Word Ptr [ESI].Key.Char,BX ;OS2SS-Put them into Key. ;@@ PTM 6860 Call AccCheckout ;Go check if accent combo going on Jmp EndActionCase ;Quit now. .Endif ;## PTR B700738 Move 0 into BL to Mov BL,0 ;## indicate that CapsTogl has no ;## affect on this key. Call CapsCheck ;## Determine shifting of character. ShiftAccent: ;@@ Merge here for accent process .If ;@@ If we should shift Mov CL,CH .Endif .If ;@@ Is translate table entry ;@@ actually a character Mov [ESI].Key.Char,CL ;OS2SS-@@ Put character in CDR .IF ;OS2SS-## PTM 3324 start Call AccCheckOut ;@@ Go check if accent combo .ENDIF ;## PTM 3324 end Jmp EndActionCase ;Go to bottom of Xlate Action case table. .Else ;@@ Else actually an accent Or CL,CL ;@@ check if accent defined. .If ;@@ Is it? Jmp NoXlate ;@@ No, so go mark undefined. .Endif Xor CH,CH ;Make accent number a word. Mov BX,[EDI].XPSGFlags ;OS2SS-&& Get the translation flags And BX,PrevAccent ;&& Clear all bits but previous ;&& accent number (in BL) Mov AL,CL ;@@ Save accent number .If AND ;@@ If this is same accent number ;@@ as last time AND Test [ESI].DDFlags,KeyBreak ;OS2SS-@@ Check if this is a BREAK .If AND ;@@ AND it is not a break Mov EBX,[EBP-8] ;OS2SS- Mov BX,[EBX].XlateOp ;OS2SS-@@ Get accent flags Mov CL,7 ;@@ Set highest accent number Sub CL,AL ;@@ Subtract actual accent number Shl BX,CL ;@@ Put accent flag in high bit .If ;@@ AND if an accent is defined Mov DX,[ESI].Key.Shift ;OS2SS-@@ Get the current shift status from Key. Call AccCheckOut ;@@ Go process this key .Endif ;Indicate this is an unprocessed accent. Or [ESI].DDFlags,AccentKey ;OS2SS-@@ Test [ESI].DDFlags,KeyBreak ;OS2SS-Check for the key BREAK. .If NEAR ;Is it? And [EDI].XPSGFlags,Not PrevAccent ;OS2SS-@@ No, clear prev accent Or Byte Ptr [EDI].XPSGFlags,AL ;OS2SS-&& Save accent number for next ;&& key. .Endif Jmp EndActionCase ;Go to bottom of Xlate Action case table. .Endif ;@@ SysReq: ;The system request key. ;@@ PTM 4247 - the PrtScr key on an Enhanced Keyboard ;@@ sends the SysReq scan code if the Alt Key is down ;@@ which it must be for the Print Buffer flush key combo ;@@ (Ctl-Alt-PrtScr). Therefore we must check for it here. Test _Ow2MiscFlags,EnhancedKbd ;@@ Check if enhanced kbd .If AND ;@@ If it is AND.... Test [ESI].DDFlags,KeyBreak ;@@ Check if this is a break .If AND ;@@ ...AND If it's NOT (a make) Test DL,AltFlag ;@@ Check if Alt key down. .If AND ;@@ If it is AND.... Test DL,CtlFlag ;@@ Check if Ctl key is down ;@@ for this KCB ;@@ PTM 5992 - Begin .If OR ;@@ Is it OR? Test [EDI].XHotKeyShift,CtlFlag ;OS2SS-@@ Also check in interrupt shift ;@@ state .If AND ;@@ Is it being held down at all Test [EDI].OtherFlags,InterruptTime ;OS2SS-&& PTM 3191: Make sure KBDXlate ;&& translations are independent. .If ;@@ PTM 5992 - End ;@@ No, so make sure this shift key's flag is set. Or [ESI].Key.Shift,CX ;OS2SS- Test [EDI].OtherFlags,InterruptTime ;OS2SS-&& PTM 3191: Make sure KBDXlate ;&& translations are independent. .If Or [EDI].XHotKeyShift,CX ;OS2SS-@@ Also set in hot key shift state .Endif ;@@ Indicate this is Flush Prt buf Or [ESI].DDFlags,PrintFlushKey ;OS2SS- Jmp EndActionCase ;@@ Go to bottom of Xlate Action ;@@ case table. .Else ;@@ Else (PTM 4990) Or [ESI].DDFlags,SysReqKey ;OS2SS-@@ Indicate this is SysReq key .Endif ShiftKeys: ;The LSHIFT, RSHIFT, and CTL keys. AltKey: ;And the ALT key. Test [EDI].XlateFlags,E1Prefix ;OS2SS-@@ CHeck if scan code proceeded .If AND ;@@ by E1, if so AND Test CX,CtlFlag ;@@ check if this is Ctrl key .If ;@@ AND if it is Ctrl Test [ESI].DDFlags,KeyBreak ;OS2SS-@@ Check if this is a break .If ;@@ if it is not Or [EDI].XlateFlags,PseudoCtl ;OS2SS-@@ Flag this as not actually ;@@ a Ctrl key but a code ;@@ sent by Enhanced Kbd .Endif Jmp NoXlate ;@@ Mark key packet undefined .Endif ;&& PTM 3002 BEGIN: ;&& Setup alternate shift bits ;&& before checking for MultiMake. Mov EBX,[EBP-8] ;OS2SS-Put XlateTable offset into a base reg. Mov AH,[EBX].Char3 ;OS2SS-Get alternate shift bits from entry. Mov EBX,[EBP-4] ;OS2SS- Mov BX,[EBX].XTFlags1 ;OS2SS-@@ Get the XT header flags Test [ESI].DDFlags,SecondaryKey ;OS2SS-Check if G keyboard dup key. .If ;Is it? Test CX,RShiftFlag+LShiftFlag ;@@ Is the key a shift key .If ;@@ If so.... ;@@ If it is then this is coming from a "G" keyboard secondary ;@@ pad key, and NUMLOCK is on. This combination sends ;@@ the following scan codes: E0, left shift make, E0, ;@@ pad key make, E0, pad key break, E0, left shift break. ;@@ In this case, we don't want to change the shift flags ;@@ anywhere. Jmp NoXlate ;@@ Mark key packet undefined .Endif ;@@ Endif shift key Xchg CH,AH ;Yes, so swap shift bit mask with alternate. .Endif ;&& PTM 3002 END: ;@@ PTM 6446 - BEGIN Test [ESI].DDFlags,KeyBreak ;OS2SS-@@ Check if this is a MAKE .If ;@@ If it is Test [EDI].OtherFlags,InterruptTime ;OS2SS-&& PTM 3191: Make sure KBDXlate ;&& translations are independent. .If AND Test Byte Ptr [EDI].XHotKeyShift+1,CH ;OS2SS-@@ Check if this key down ;@@ In the system already ;@@ for Ctl and Alt .If OR ;@@ If it is OR Test CX,RShiftFlag+LShiftFlag ;@@ Is the key a shift key .If AND ;@@ If so AND.... Test [ESI].DDFlags,SecondaryKey ;OS2SS-@@ And if this is NOT a secondary .If AND ;@@ shift key code sent by a pad ;@@ key (PTM 7506) Test Byte Ptr [EDI].XHotKeyShift,CL ;OS2SS-@@ Check if this key down .If ;@@ If it is ;@@ In the system already ;@@ PTM 3138 BEGIN: Flag as shift ;@@ key also, do not put in KIB. Or [ESI].DDFlags,MultiMake+ShiftMask ;OS2SS-@@ Indicate so and do not ;@@ update shift state. ;@@ PTM 3138 END: Jmp EndActionCase ;@@ Complete translation .Endif ;@@ Endif this is a multimake .Endif ;@@ Endif this is a key make ;@@ PTM 6446 - END Test [ESI].DDFlags,KeyBreak ;OS2SS-Check if this is key break. .If AND ;If it is AND... Test DX,CX ;And is a key make pending for this shift flag? .If ;If not, this key belongs in another SG. Xor AL,AL ;Indicate not our keystroke. ClC ;Differentiate from other key-break return above. Ret ;Quit now. .Endif Test CX,RShiftFlag+LShiftFlag+SysRqFlag ;Is the key other... .If ;...than Ctl or Alt? And [EDI].XlateFlags,NOT DumpKeyOnce ;OS2SS-@@ Cancel Dump sequence. .Endif Or [ESI].DDFlags,ShiftMask ;OS2SS-@@ Indicate this is a shift key. Test BX,ShiftLock ;@@ ShiftLock keyboard? .If AND ;Is it shift lock and... Test BX,ShiftToggle ;@@ ShiftToggle Kbd? .If AND ;@@ Is it NOT shift toggle and.. Test CL,RShiftFlag+LShiftFlag ;...is this key one of.. .If AND ; ...two shift keys? Test [ESI].DDFlags,KeyBreak ;Check for the key BREAK. .If ;If not, make sure ShiftLock is off. And DL,Not CapsTogl ;Turn it off. ;@@ Turn it off in the interrupt driven shift state for ;@@ hot keys also Test [EDI].OtherFlags,InterruptTime ;OS2SS-&& PTM 3191: Make sure KBDXlate ;&& translations are independent. .If And Byte Ptr [EDI].XHotKeyShift+1,Not CapsTogl ;OS2SS- .Endif .Endif Test [ESI].DDFlags,KeyBreak ;OS2SS-Check for the key BREAK. .If ;Is it? Test CX,DX ;@@ No, its a MAKE .If ;@@ So check if we've seen it Or [ESI].DDFlags,MultiMake ;@@ If we have, indicate so. .Endif ;@@ Endif Multimake Or DX,CX ;No, so make sure this shift key's flag is set. Test [EDI].OtherFlags,InterruptTime ;OS2SS-&& PTM 3191: Make sure KBDXlate ;&& translations are independent. .If Or [EDI].XHotKeyShift,CX ;OS2SS-@@ Also set in hot key shift state .Endif jmp NewLbl2 .Endif ;OS2SS- (A2053)## Endif Alt is down. ;OS2SS- .Else ;Else process key-break. .If ;Check is this the AltKey? Xor AL,AL ;@@ Clear out a reg Xchg AL,[EDI].XAltKeyPad ;OS2SS-@@ Swap with the ALT-nnn accumulator. Or AL,AL ;Check if any accumulation going on. .If ;Was there? Mov [ESI].Key.Char,AL ;OS2SS-Yes so make a Char from total. Mov [ESI].Key.Scan,0 ;OS2SS-And make the scan code zero. ;## PTR AK00370 Test [ESI].DDFlags,SecondaryKey ;OS2SS-## If this isn't an AltPad seq. .If ;## with right (secondary) Alt key. And [ESI].DDFlags,Not (KeyBreak+KeyTypeMask) ;OS2SS-Fix flags. .Endif ;## Endif right Alt key. ;## PTR AK00370 Or _Ow2MiscFlags3,AltPacket ;&& DCR 1713 : Indicate that ;&& we will send two packets. ;@@ PTM 6860 - Begin Call AccCheckout ;@@ check if accent combo going on. ;@@ PTM 6860 - End .Endif ;Endif accumulation going on .Endif ;@@ Endif this was an ALT key Mov BX,CX ;Save shift key values Not CX ;Make shift flags into a mask. ;@@ PTM 3905 - Topview does not send cursor key scan codes through ;@@ and if this is a Ferrari keyboard, we only get E0s from the ;@@ secondary cursor keys. Then if the left ALT is pressed ;@@ to remove the popup, we think the ALT make was actually ;@@ the right alt make because it was preceded by an E0 from a ;@@ cursor key. And the break does not clear things up. Test BL,RShiftFlag+LShiftFlag ;...is this key one of.. .If ; ...two shift keys? Test DH,BH ;@@ Check if this key is actually ;@@ the one that's down .If ;@@ If it isn't And DH,CL ;@@ Clear bit for key actually down .Else ;@@ Else we've got the right key And DH,CH ;Clear upper byte shift flag for this shift key. .Endif Test DH,AH ;Check if other shift key is down. .If ;Is primary or secondary shift key still down? And DL,CL ;No, so clear lower byte shift flag. .Endif ;@@ PTM 4075 - A system wide word for the shift state ;@@ must be maintained that is only modified by interrupts ;@@ and is only used for Hot Key Checking Test [EDI].OtherFlags,InterruptTime ;OS2SS-&& PTM 3191: Make sure KBDXlate ;&& translations are independent. ;&& translations are independent. .If Push EDX ;OS2SS-@@ Save new key packet shift Mov DX,[EDI].XHotKeyShift ;OS2SS-@@ Get hot key shift state Test DH,BH ;@@ Check if this key is actually ;@@ the one that's down .If ;@@ If it isn't And DH,CL ;@@ Clear bit for key actually down .Else ;@@ Else we've got the right key And DH,CH ;Clear upper byte shift flag for this shift .Endif Test DH,AH ;Check if other shift key is down. .If ;Is primary or secondary shift key still down? And DL,CL ;No, so clear lower byte shift flag. .Endif Mov [EDI].XHotKeyShift,DX ;OS2SS- Pop EDX ;OS2SS- .Endif .Else And DL,CL ;No, so clear lower byte shift flag. Test [EDI].OtherFlags,InterruptTime ;OS2SS-&& PTM 3191: Make sure KBDXlate ;&& translations are independent. .If And Byte Ptr [EDI].XHotKeyShift,CL ;OS2SS- .Endif .Endif ;OS2SS- .Endif NewLbl2: ;OS2SS- Mov [ESI].Key.Shift,DX ;OS2SS-Also save in Key rec. Test _Ow2MiscFlags3,AltPacket ;&& DCR 1713 BEGIN: Check to see if an ;&& Alt-Num operation was completed. .If ;&& If so then.. ;## PTR AK00370: BEGIN Test [ESI].DDFlags,SecondaryKey ;OS2SS-## If this is an AltPad seq. .If ;## with Left (normal) Alt key. Call AltPadPacket ;&& setup second of two packets for ;&& Alt-Numpad sequence. .Else ;## Else this is an AltPad seq. with ;## the right (secondary) Alt key. Test [ESI].DDFlags,KeyBreak ;OS2SS-## If this is a break for the right .If ;## Alt key then... Or _Ow2MiscFlags3, SecAltNumPad ;## Flag that we will have to send an .Endif ;## accumulation packet after break ;## of the Alt key in Int Handler. .Endif ;## PTR AK00370: END .Endif ;&& DCR 1713: END ;## AltPadPacket is only called for ;## AltNumPad seq. with left Alt. key. ;## PTR AK00370: END Jmp EndActionCase ;Go to bottom of Xlate Action case table. ScrollLock: ;The SCROLL LOCK key. ;@@ This is special case of ToggleKeys because of Ctl-Break. ;@@ On an Enhanced keyboard, the Ctl-Break sends the following ;@@ set of scan codes: ;@@ Ctrl make-E0-ScrollLock make-E0-ScrollLock break-Ctrl break ;@@ so we must check if it was an AT keyboard or preceded by EO ;@@ before identifying it as Ctl-Break. And [EDI].XlateFlags,NOT DumpKeyOnce ;OS2SS-@@ Cancel Dump sequence. Test [EDI].XlateFlags,SecPrefix ;OS2SS-@@ Check if secondary key .If OR ;@@ If it is OR... Test _Ow2MiscFlags,EnhancedKbd ;@@ Check if enhanced kbd .If OR ;@@ OR...If it's a regular kbd ;$$ ;$$ 'IDFlags' does not exist in the 1.2 ABIOS ;$$ version. We need to get this information from KbdHWIDs. ;$$ ;$$ Test IDFlags, SuperSport ;## Check if it is a 122 kbd .If < _Ow2KbdHWIDs e 0AB85h > ;$$ If it is a 122 kbd Test DL,CtlFlag ;Check if Ctl also pressed. ;@@ for this KCB ;@@ PTM 5992 - Begin .If OR ;@@ Is it OR? Test [EDI].XHotKeyShift,CtlFlag ;OS2SS-@@ Also check in interrupt shift ;@@ state .If AND ;@@ Is it being held down at all Test [EDI].OtherFlags,InterruptTime ;OS2SS-&& PTM 3191: Make sure KBDXlate ;&& translations are independent. .If ;@@ PTM 5992 - End Mov [ESI].Key.Scan,0 ;OS2SS-Set Ctl-Break extended code. ;Tell dev driver it's the BREAK KEY. Or [ESI].DDFlags,BreakKey ;OS2SS-@@ Test [ESI].DDFlags,KeyBreak ;OS2SS-Check if this is the key break. .If ;If so, clear Scroll Lock down bit in Packet & PSG. And Byte Ptr [ESI].Key.Shift+1,Not (ScrollFlag ShR 8) ;OS2SS-@@ Clear bit in hot key shift status also Test [EDI].OtherFlags,InterruptTime ;OS2SS-&& PTM 3191: Make sure KBDXlate ;&& translations are independent. .If And Byte Ptr [EDI].XHotKeyShift+1,Not (ScrollFlag ShR 8) ;OS2SS- .Endif .Else ;Set Scroll Lock down bit in packet & PSG. Or Byte Ptr [ESI].Key.Shift+1,(ScrollFlag ShR 8) ;OS2SS-@@ Set bit in hot key shift status also Test [EDI].OtherFlags,InterruptTime ;OS2SS-&& PTM 3191: Make sure KBDXlate ;&& translations are independent. .If Or Byte Ptr [EDI].XHotKeyShift+1,(ScrollFlag ShR 8) ;OS2SS- .Endif .Endif Jmp EndActionCase ;@@ PTM 4106: Leave translation. .Else ;Not Ctl-Break, fall thru to ToggleKey processing. Jmp ToggleKey ;@@ .Endif .Else ;Not Ctl-Break, fall thru to ToggleKey processing. Jmp ToggleKey ;@@ .Endif NumLock: ;The NUMLOCK key. ;@@ We must check if this is the Enhanced keyboard ;@@ which will emulate Ctrl being down (PseudoCtl Flag ;@@ will be set) for the PAUSE key or an AT kbd w/ Ctl down. Test [EDI].XlateFlags,PseudoCtl ;OS2SS-@@ Check if secondary kbd ;@@ emuating the Ctl key .If OR ;@@ If it is OR... ;## PTM 3128 BEGIN: .If <_Ow2KbdHWIDs ne FERRARI_P> AND ;## If it's not an 88/89 AND .If <_Ow2KbdHWIDs ne FERRARI_G> AND ;## If it's not a 101/102 AND .If AND ;1.3-## If it's not a 122 Key JAGUAR ;## PTM 3128 END: Test DL,CtlFlag ;@@ Check if Ctl also pressed. ;@@ for this KCB ;@@ PTM 5992 - Begin .If OR ;@@ Is it OR? Test [EDI].XHotKeyShift,CtlFlag ;OS2SS-@@ Also check in interrupt shift ;@@ state .If AND ;@@ Is it being held down at all Test [EDI].OtherFlags,InterruptTime ;OS2SS-&& PTM 3191: Make sure KBDXlate ;&& translations are independent. .If ;@@ PTM 5992 - End ;@@ PTM 4004: Test DL, AltFlag ;@@ Check for Alt key down. .If < z > ;@@ No alt key, process Ctl-NumLk, Test [ESI].DDFlags,KeyBreak ;OS2SS-@@ Check if this is a key break .If And [EDI].XlateFlags,Not PseudoCtl ;OS2SS-@@ Clear flag Test _Ow2MiscFlags3,PauseLatch ;&& PTM 2344 BEGIN: If the NumLock ;&& make preceded the Ctrl make .If ;&& then this is not the break of ;&& of a Pause. Therefore do not ;&& throw the key away. Treat it Jmp ToggleKey ;&& as a normal shift break. .Endif ;&& Endif this was not the Pause. And _Ow2MiscFlags3,Not PauseLatch ;&& Reset the Pause sequence flag. ;&& PTM 2344 END: Jmp NoXlate ;@@ Mark Key Packet undefined .Else ;@@ Else it's a make scan code Or [ESI].DDFlags,PauseKey ;OS2SS-@@ So tell dd it's the PAUSE KEY. Or _Ow2MiscFlags3,PauseLatch ;&& PTM 2344: Flag the make of the ;&& NumLock to be used as a latch. Jmp EndActionCase ;@@ Completed translation .Endif ;@@ Endif key break or not .Else ;&& PTM 2383: Else Alt is down And [EDI].XlateFlags,Not PseudoCtl ;OS2SS-@@ Clear flag Test DL,CtlFlag ;&& so test if Ctrl is also down. .If ;&& If Ctrl is not down then the Jmp NoXlate ;&& key sequence Alt-Pause Key ;&& is undefined. .Endif ;&& Endif Ctrl is down with Alt. .Endif ;@@ End alt key down check. PTM 4004 .Endif Test DL,CtlFlag ;Check if Ctl also pressed. ;@@ for this KCB ;@@ PTM 5992 - Begin .If OR ;@@ Is it OR? Test [EDI].XHotKeyShift,CtlFlag ;@@ Also check in interrupt shift ;@@ state .If AND ;@@ Is it being held down at all Test [EDI].OtherFlags,InterruptTime ;OS2SS-&& PTM 3191: Make sure KBDXlate ;&& translations are independent. .If ;@@ PTM 5992 - End Test DL,AltFlag ;Yes, check Alt key also. .If ;Is it? Test [EDI].XlateFlags,DumpKeyOnce ;OS2SS-@@ Yes check if second time. .If ;Is it? Or [ESI].DDFlags,DumpKey ;OS2SS-@@ So tell dd it's the DUMP KEY. .Else Test [ESI].DDFlags,KeyBreak ;OS2SS-Check if this's key break. .If ;Is it? Or [EDI].XlateFlags,DumpKeyOnce ;OS2SS-@@ Yes indicate seen once. .Endif .Endif .Endif Test [ESI].DDFlags,KeyBreak ;OS2SS-Check if this's the key break. .If ;If so, clear Num Lock down bit in Packet & PSG. And Byte Ptr [ESI].Key.Shift+1,Not (NumFlag ShR 8) ;@@ Clear bit in hot key shift status also Test [EDI].OtherFlags,InterruptTime ;OS2SS-&& PTM 3191: Make sure KBDXlate ;&& translations are independent. .If And Byte Ptr [EDI].XHotKeyShift+1,Not (NumFlag ShR 8) ;OS2SS- .Endif Test [EDI].XlateFlags,DumpKeyOnce ;OS2SS-@@ PTM 7078 - Begin .If ;@@ If this wasn't the dump key Or [ESI].DDFlags,ShiftMask ;OS2SS-@@ PTM 6937 ;@@ Indicate this is a shift key. .Endif ;@@ PTM 7078 - End Test _Ow2MiscFlags3,PauseLatch ;&& PTM 2344 BEGIN: If the NumLock ;&& make preceded the Ctrl make .If ;&& then this is not the break of ;&& of a Pause. Therefore do not ;&& throw the key away. Treat it Jmp ToggleKey ;&& as a normal shift break. .Endif ;&& Endif this was not the Pause. And _Ow2MiscFlags3,Not PauseLatch ;&& Reset the Pause sequence flag. ;&& PTM 2344 END: .Else ;Set Num Lock down bit in packet & PSG. Or Byte Ptr [ESI].Key.Shift+1,(NumFlag ShR 8) ;OS2SS- ;@@ Set bit in hot key shift status also Test [EDI].OtherFlags,InterruptTime ;OS2SS-&& PTM 3191: Make sure KBDXlate ;&& translations are independent. .If Or Byte Ptr [EDI].XHotKeyShift+1, (NumFlag ShR 8) ;OS2SS- .Endif Test [EDI].XlateFlags,DumpKeyOnce ;OS2SS-@@ PTM 7078 - Begin .If ;@@ If this wasn't the dump key Or [ESI].DDFlags,ShiftMask ;OS2SS-@@ PTM 6937 ;@@ Indicate this is a shift key. .Endif ;@@ PTM 7078 - End Or _Ow2MiscFlags3,PauseLatch ;&& PTM 2344: Flag the make of the ;&& NumLock to be used as a latch. .Endif .Else NEAR ;Not Ctl-Numlock, fall thru to common Toggle key check. CapsLock: ;The CapsLock key itself. ToggleKey: ;Or any general Toggle key. Mov EBX,[EBP-8] ;OS2SS-Get translate table offset. Test [ESI].DDFlags,SecondaryKey ;OS2SS-Check if G kbd dup key. .If ;Is it? Mov CH,[EBX].Char3 ;OS2SS-Yes, so get mask for that key. .Endif And [EDI].XlateFlags,NOT DumpKeyOnce ;OS2SS-@@ Cancel Dump sequence. Mov EBX,[EBP-4] ;OS2SS-Get translate table offset. Or [ESI].DDFlags,ShiftMask ;OS2SS-@@ Indicate this is a shift key. Test Word Ptr [EBX+XTFlags1],ShiftLock ;OS2SS-ShiftLock type? .If AND ;Is it shift lock and... Test Word Ptr [EBX+XTFlags1],ShiftToggle ;OS2SS-@@ ShiftLock Toggle? .If AND ;@@ Is it shift lock latch and... .If ;...is it the CapsLock key? Test [ESI].DDFlags,KeyBreak ;OS2SS-Check for the key BREAK. .If ;If not, set ShiftLock on. Or [ESI].Key.Shift,CX ;OS2SS-And in the Key rec. ;@@ Set bit in hot key shift status also Test [EDI].OtherFlags,InterruptTime ;OS2SS-&& PTM 3191: Make sure KBDXlate ;&& translations are independent. .If Or [EDI].XHotKeyShift,CX ;OS2SS- .Endif .Else ;On key-break, only clear DOWN bit. Not CX ;Make shift bits a mask. And Byte Ptr [ESI].Key.Shift+1,CH ;OS2SS-And in the Key rec. ;@@ Clear bit in hot key shift status also Test [EDI].OtherFlags,InterruptTime ;OS2SS-&& PTM 3191: Make sure KBDXlate ;&& translations are independent. .If And Byte Ptr [EDI].XHotKeyShift+1,CH ;OS2SS- .Endif .Endif .Else ;This is not a shift-lock keyboard. Test [ESI].DDFlags,KeyBreak ;OS2SS-Check for the key BREAK. .If ;Is it? Not CX ;Yes, so make shift bits a mask. And Byte Ptr [ESI].Key.Shift+1,CH ;OS2SS-And in the Key rec. ;@@ Clear bit in hot key shift status also Test [EDI].OtherFlags,InterruptTime ;OS2SS-&& PTM 3191: Make sure KBDXlate ;&& translations are independent. .If And Byte Ptr [EDI].XHotKeyShift+1,CH ;OS2SS- .Endif And [EDI].ToggleFlags,CL ;OS2SS-@@ Clear latch for this key. .Else Or Byte Ptr [ESI].Key.Shift+1,CH ;OS2SS-And in the Key rec. ;@@ Set bit in hot key shift status also Test [EDI].OtherFlags,InterruptTime ;OS2SS-&& PTM 3191: Make sure KBDXlate ;&& translations are independent. .If Or Byte Ptr [EDI].XHotKeyShift+1,CH ;OS2SS- .Endif Test [EDI].ToggleFlags,CL ;OS2SS-@@ Check if seen this key yet. .If ;Have we? Or [EDI].ToggleFlags,CL ;OS2SS-@@ No so set latch saying we have. Xor Byte Ptr [ESI].Key.Shift,CL ;OS2SS-And in the Key rec. ;@@ Set Latch in hot key shift status also Test [EDI].OtherFlags,InterruptTime ;OS2SS-&& PTM 3191: Make sure KBDXlate ;&& translations are independent. .If Xor Byte Ptr [EDI].XHotKeyShift,CL .Endif .Else ;Otherwise this is a repeat of the make. Or [ESI].DDFlags,MultiMake ;OS2SS-So indicate so. .Endif .Endif .Endif .Endif ;Endif from NumLock plus Ctl test above. Jmp EndActionCase ;Go bottom of Xlate Action case table. SpecKeyCS: ;@@ Special key for NLS support. Test [EDI].OtherFlags,InterruptTime ;OS2SS-@@ If it's interrupt time .If ;@@ Call UnPauseChk ;Go check if in pause state. .Endif ;@@ Test DL,AltFlag ;@@ Check if Alt key down. .If ;@@ Is it? And [EDI].XlateFlags,Not Use3Index ;OS2SS-@@ Use Char3 if AltGraph Call AltGraphCheck ;@@ Process if AltGraph Test [EDI].XlateFlags,NormalAlt ;OS2SS-@@ Check if it's not the AltGraph .If ;@@ If alt key is normal Alt ;@@ PTM 5024 - Begin Call CheckExtended ;@@ See if new extended code ;@@ is defined .If ;## If it is ... Jmp EndActionCase ;## the key combo is defined .Endif ;## Endif there was one defined Jmp NoXlate ;## get out now. .Endif ;## Endif normal Alt. Jmp SKCSEnd ;## .Else NEAR ;@@ Else no Alt key down Test DL,RShiftFlag+LShiftFlag ;@@ Is a shift key down Mov EBX,[EBP-8] ;OS2SS-Get translate table offset. .If ;@@ Yes so, Test DL,CapsTogl ;@@ See if capslock is on .If ;@@ If it is Mov AL,[EBX].Char5 ;OS2SS-@@ Use character 5 .Else ;@@ If it is not then... Mov AL,CH ;@@ Use char 2 .Endif ;@@ Endif CapsLock is on. .Else NEAR ;@@ Else no shift key down Test DL,CapsTogl ;@@ See if capslock is on .If ;@@ If it is Mov AL,[EBX].Char4 ;OS2SS-@@ Use character 4 .Endif .Endif ;## Endif shift key down. Test DL, CtlFlag ;## Check if Ctrl is down, .If ;## If it is then... Call SKCtlCheck ;## Check for spec. Ctrl code. .Endif ;## Endif Ctrl is down. .Endif ;## Endif Alt is down. SKCSEnd: .If AND ;## If this was an accent key index .If ;## Or [ESI].DDFlags,AccentKey ;OS2SS-## Indicate this is an ;## unprocessed accent. Test [ESI].DDFlags,KeyBreak ;OS2SS-## Check for the key BREAK. .If ;## Is it? And [EDI].XPSGFlags,Not PrevAccent;OS2SS-## No, clear prev accent num Or Byte Ptr [EDI].XPSGFlags,AL ;OS2SS-## Save accent num for next key .Endif .Else ;## Else this is not an accent table entry Mov [ESI].Key.Char,AL ;OS2SS-## Put character into key packet Call AccCheckOut ;## Check for valid accent .Endif ;## Endif this is an accent index. Jmp EndActionCase ;## Go to bottom of Xlate Action case table. SpecKeyAS: ;@@ Special key for NLS support. Test [EDI].OtherFlags,InterruptTime ;OS2SS-@@ If it's interrupt time .If ;@@ Call UnPauseChk ;Go check if in pause state. .Endif ;@@ Test DL,AltFlag ;@@ Check if Alt key down. .If ;@@ Is it? And [EDI].XlateFlags,Not Use3Index ;OS2SS-@@ Use Char3 if AltGraph Call AltGraphCheck ;@@ Process if AltGraph Test [EDI].XlateFlags,NormalAlt ;OS2SS-@@ Check if it's not the AltGraph .If ;@@ If alt key is normal Alt Mov EBX,[EBP-8] ;OS2SS-Get translate table offset. Mov AL,[EBX].Char4 ;OS2SS-@@ Use char4 Mov [ESI].Key.Scan,AL ;OS2SS-@@ Put it in the scan code field to Jmp SpecKeyEnd ;@@ Go to merge .Endif .Else ;@@ Else no Alt key down Test DL,RShiftFlag+LShiftFlag ;@@ Is a shift key down .If ;@@ Yes so, Mov AL,CH ;@@ Use char 2 Jmp SpecKeyEnd ;@@ Go to merge .Endif ;@@ Else no shift key down .Endif ;## Endif Alt key down. Test DL, CtlFlag ;## Check if Ctrl is down .If ;## If it is then... Call SKCtlCheck ;## Check for special control code. .Endif ;## Endif Ctrl is down SpecKeyEnd: .If AND ;@@ If this was an accent key index .If Or [ESI].DDFlags,AccentKey ;OS2SS-@@ Indicate this is an ;@@ unprocessed accent. Test [ESI].DDFlags,KeyBreak ;OS2SS-@@ Check for the key BREAK. .If ;@@ Is it? And [EDI].XPSGFlags,Not PrevAccent ;OS2SS-## No, clear prev accent num Or Byte Ptr [EDI].XPSGFlags,AL ;OS2SS-## Save accent num for next key .Endif .Else ;## Else this is not an accent table entry Mov [ESI].Key.Char,AL ;OS2SS-## Put character into key packet Call AccCheckOut ;## Check for vaild accent. .Endif ;## Endif this is an accent table entry. Jmp EndActionCase ;## Go to bottom of Xlate Action case table. XShiftKey: ;Extended shift key (for DBCS use). XToggleKey: ;Extended toggle key (for DBCS use). NoXlate: ;Invalid action code, no translate done. And [EDI].XlateFlags,NOT DumpKeyOnce ;OS2SS-@@ Cancel Dump sequence. Or [ESI].DDFlags,UndefKey ;OS2SS-@@ Mark this key undefined. EndActionCase: ;*** This is the end of the Xlate Action case table ***. Test [ESI].DDFlags, UndefKey ;OS2SS-## DCR 357: BEGIN .If AND ;## This logic tests to see if the Test _Ow2MiscFlags3, AltPacket ;## current keypacket is for an .If ;## extended keystroke or not. Mov BL,[ESI].Key.Char ;OS2SS-## If it is then bit 1 of the Status .If OR ;## field in the keypacket is turned Test [EDI].XlateFlags, SecPrefix ;OS2SS-## on. .If ;## Or [ESI].Key.Status, EXTENDEDCODE ;OS2SS-## Turn the bit on in the Status. .Endif ;## .Endif ;## DCR 357: END ;## PTR B702484: BEGIN Test [EDI].OtherFlags,InterruptTime ;OS2SS-@@ If it's interrupt time ;## create an extra packet for the E0. .If AND ;## PTR B702484: END Test [EDI].XlateFlags,SecPrefix ;OS2SS-&& PTM 2382: Test to see if an E0 or E1 ;&& came before this packet. .If AND ;&& If E0 or E1 did precede then, Test [EDI].XlateFlags, E1Prefix ;OS2SS-&& Check to see if it was an E0. .If ;&& If it was the E0 then, Or _Ow2MiscFlags3, E0Packet ;&& signal an E0 packet coming up. Call MakeE0Packet ;&& Call MakeE0Packet to manufacture an ;&& extra packet to precede this one. .Endif ;&& Endif an E0 preceded this packet. Mov BX,[ESI].DDFlags ;OS2SS-&& PTM 965 - Always zero out .If OR ;&& char and scan fields for .If OR ;&& shift packets .If OR .If Mov Word Ptr [ESI].Key.Char, 0 ;OS2SS-@@ PTM 2244: Zero out Character/ ;@@ Scan Code fields in CharData ;@@ Record for Japan compatability. And [ESI].Key.Status, NOT EXTENDEDCODE ;OS2SS-## DCR 357: Do NOT indicate that this ;## is an extended scan instead of ;## an E0 char., if this is a shift pac. Test [EDI].XInputMode,SHIFTREPORT ;OS2SS-&& (P13303) Are we in Shift rep. mode? .If ;@@ If so...... Or [ESI].Key.Status,1 ;OS2SS-@@ Flag as shift report packet .Endif ;@@ Endif Shift Report .Endif ;@@ Endif Shift Report And [EDI].XlateFlags,Not SecPrefix+E1Prefix ;OS2SS-Clear indicator. Mov AL,Byte Ptr [ESI].MonFlags+1 ;OS2SS-Get the original scan code back. Stc ;OS2SS- Ret KbdXlate Endp ;-------------------------------------------------------/ Public CapsCheck CapsCheck Proc ;-----------------------------------------------------\ ;************** START OF SPECIFICATIONS ******************************** ;* * ;* Subroutine Name: CapsCheck * ;* * ;* Descriptive Name: Check IF character should be shifted * ;* * ;* Function: This routine checks IF a characer should be shifted. * ;* It checks IF CapsLock, ShiftLock or the shift key * ;* effect this key. IF the char should be shifted, * ;* then it places Char2 in AL. * ;* * ;* Notes: * ;* * ;* Entry Point: CapsCheck Linkage: Near * ;* * ;* Input: AL = CHAR1 from translate table * ;* CH = CHAR2 from translate table * ;* DX = ShiftFlags * ;* AH = Scan code w/ break bit cleared * ;* BX = SHIFTLOCK & CAPSLOCK effect indicators * ;* * ;* Exit-Normal: AL = ASCII character after shift checking * ;* * ;* Exit-Error: None * ;* * ;* Effects: AX, BX, registers, carry flag changed. * ;* * ;* Internal References: * ;* Routines: None * ;* * ;* External References: * ;* Routines: None * ;* * ;*********************************************************************** Xor BH,BH ;## Prepare a byte. Test DL,RShiftFlag+LShiftFlag ;## Check if Shift key down. .If ;## Is one of them? Or BH,CapsTogl ;## Yes, so prepare to check Capslock. .Endif ;## Endif a shift key is down And DL,BL ;## Isolate Capslock flag. Push EBX ;OS2SS-## Save BX for now Mov EBX,[EBP-4] ;OS2SS-## And put it in BX Test [EBX].XTFlags1,ShiftLock ;OS2SS-## Check if Shiftlock kbd Pop EBX ;OS2SS-## Restore BX .If ;## If it is then... Test BL, CapsTogl ;## Check if shift lock effects key type. .If ;## If it does then... Or BH,DL ;## either Capslock, Shift, ;## or both will cause shifting .Else ;## If it does not Or BH,BH ;## fix the zero flag. .Endif ;## Endif shift lock effects key type. .Else ;## Else its a CapsLock kbd Test BL, CapsTogl ;## Check if CapsLock effects key type. .If ;## If it does then... Xor BH,DL ;## Add Capslock & ShiftFlag to decide state. .Else ;## If it does not Or BH,BH ;## fix the zero flag. .Endif ;## Endif CapsLock effects key type. .Endif ;## Endif shift lock keyboard. .If ;## Should key be capitalized? Mov AL,CH ;## Yes, so use Char2. .Endif ;## Ret CapsCheck Endp ;-------------------------------------------------------/ Public SKCtlCheck SKCtlCheck Proc ;-----------------------------------------------------\ ;************** START OF SPECIFICATIONS ******************************** ;* * ;* Subroutine Name: SKCtlCheck * ;* * ;* Descriptive Name: Check IF character has special control code * ;* * ;* Function: This routine checks IF a character or scan code has a * ;* special control code associated with it. * ;* IF it does then it sets the appropriate ASCII/scan * ;* codes. * ;* * ;* Notes: Ctl key is already known to be down * ;* * ;* Entry Point: SKCtlCheck Linkage: Near * ;* * ;* Input: AH = Scan code w/ break bit cleared * ;* * ;* Exit-Normal: AL = ASCII character after special control code check * ;* * ;* Exit-Error: None * ;* * ;* Effects: AX * ;* * ;* Internal References: * ;* Routines: None * ;* * ;* External References: * ;* Routines: None * ;* * ;*********************************************************************** .If ;@@ Is this Ctl-2? Xor AL,AL ;@@ Yes, so set extended code. .ElseIf ;@@ Is this Ctl-6? Mov AL,30 ;@@ Yes, so set ASCII "RS" code. ;@@ PTR B702484 and PTM 5024 - Begin .ElseIf ;@@ Is this Ctl-Tab? Xor AL,AL ;@@ Yes, so set extended code. Mov [ESI].Key.Scan,94h ;OS2SS-@@ Yes, so set extended code. ;@@ PTR B702484 and PTM 5024 - End .ElseIf ;@@ Is this Ctl-[? Mov AL,27 ;@@ Yes, so set "Esc" code. .ElseIf ;@@ Is this Ctl-]? Mov AL,29 ;@@ Yes, so set ASCII "GS" code. .ElseIf ;@@ Is this Ctl-\? Mov AL,28 ;@@ Yes, so set ASCII "FS" code. .ElseIf ;@@ Is this Ctl-dash? Mov AL,31 ;@@ Yes, so set ASCII "US" code. ;1.3-## PTR 4862 BEGIN: .ElseIf ;1.3-## Is this the key for scan code 12. Mov AL,31 ;1.3-## Yes, so set ASCII "US" code. ;1.3-## PTR 4862 END. .ElseIf ;@@ Is this the space key? ;Value in AL is correct. ;@@ Yes, so leave as is. .Else ;@@ If here, combo is undefined. Mov AL, -1 ;@@ Go mark Undefined. Or [ESI].DDFlags,UndefKey ;OS2SS-## PTR B702142 Mark this key undefined. .Endif ;@@ Ret ;@@ Endif Ctl key down check SKCtlCheck Endp ;-------------------------------------------------------/ Public SKAltCheck SKAltCheck Proc ;-----------------------------------------------------\ ;************** START OF SPECIFICATIONS ******************************** ;* * ;* Subroutine Name: SKAltCheck * ;* * ;* Descriptive Name: Check IF character has extended code * ;* * ;* Function: This routine checks IF a characer or scan code has a * ;* special extended code associated with it. * ;* IF it does then it sets the appropriate ASCII/scan * ;* codes. * ;* * ;* Notes: Alt key is already known to be down * ;* * ;* Entry Point: SKAltCheck Linkage: Near * ;* * ;* Input: DI = Per Session Data Area Address * ;* SI = Key Packet Address * ;* DX = ShiftFlags * ;* AH = Scan code w/ break bit cleared * ;* * ;* Exit-Normal: AL = ASCII character after special control code check * ;* * ;* Exit-Error: None * ;* * ;* Effects: AX, BX, registers, carry flag changed. * ;* * ;* Internal References: * ;* Routines: AltGraphCheck CheckExtended * ;* * ;* External References: * ;* Routines: None * ;* * ;*********************************************************************** And [EDI].XlateFlags,Not Use3Index ;OS2SS-@@ Use Char3 if AltGraph Call AltGraphCheck ;@@ Process if AltGraph Test [EDI].XlateFlags,NormalAlt ;OS2SS-@@ Check if it's not the AltGraph .If ;@@ If alt key is normal Alt .If ;@@ Is this the space key? Mov [ESI].Key.Char,AL ;OS2SS-@@ Yes, so leave as is. ;@@ PTM 5024 - Begin .Else ;@@ Set extended code for others Call CheckExtended ;@@ Go check if this is new extended ;@@ scan code .If ;@@ If it is, everything is set up ;@@ otherwise it's old so Add AH,118 ;@@ calculate extended code. Mov [ESI].Key.Scan,AH ;OS2SS-@@ Put extended code in Key rec. .Endif ;@@ PTM 5024 - End .Endif .Else ;@@ else it was AltGraph Mov [ESI].Key.Char,AL ;OS2SS-@@ Yes, so leave as is. .Endif ;@@ Endif UNDEFINED or normal ALT Ret SKAltCheck Endp ;-----------------------------------------------------/ Public AccCheckOut AccCheckout Proc ;-----------------------------------------------------\ ;*********************************************************************** ;* * ;* Subroutine Name: AccCheckout * ;* * ;* Descriptive Name: Check and Process Valid Accents * ;* * ;* Function: This routine is called from KbdXlate and checks if an * ;* accent key was hit prior to the current key. If so, * ;* a check is made to see if the key is affected by that * ;* accent and if it is * ;* the value specified by the accent table entry is put in * ;* the key packet and control returns to KbdXlate. * ;* If the key is not affected by that accent, then it is * ;* put in a seperate keypacket and control returns to * ;* KbdXlate to process the current key. * ;* * ;* Entry Point: AccCheckout Linkage: Near * ;* * ;* Input: Beginning offset of translate table on the stack * ;* * ;* Exit-Normal: Monitor Key Packet filled in * ;* * ;* Exit-Error: N/A * ;* * ;* Effects: BX * ;* * ;* Internal References: * ;* Routines: BadAccent * ;* * ;* External References: * ;* Routines: None * ;* * ;*********************************************************************** ;Check if last key seen was an accent key. Push EBX ;OS2SS-@@ Save BX Mov BX,[EDI].XPSGFlags ;OS2SS-&& Get flags from PSG. And BX,PrevAccent ;&& Isolate previous accent number ;&& field. .If NEAR ;Was there one? Push EDI ;OS2SS-Yes, save index reg for now. ;Translate table offset now four words back on the stack. And EBX,0FFh ;OS2SS-Clear upper byte of accent number. Mov EDI,EBX ;OS2SS-Put accent number in index reg. Dec EDI ;OS2SS-Accent entry 1 has offset zero. IMul EDI,AccEntryLen ;OS2SS-Set offset of correct accent table entry. Add EDI,Accents ;OS2SS-Set offset within overall translate table. Add EDI,[EBP-4] ;OS2SS-Add offset of translate table itself. Push ECX ;OS2SS-And save... Push EDX ;OS2SS-..other regs. Mov EDX,[EBP-8] ;OS2SS-Get Xlate Operation word. Mov DX,[EDX].XlateOp ;OS2SS-Get Xlate Operation word. Mov CL,7 ;Set # of bits to highest accent no. Sub CL,BL ;Subtract actual accent number. Mov EBX,EDI ;OS2SS-Save accent table entry offset. Or DX,DX ;## PTM 2329: Make sure that if the max. number ;## of accents are used that the flags bits are ;## correctly for DX. Shl DX,CL ;Shift Accent Flags left by calculated count. .If ;So is this key affected by the previous accent? Mov ECX,[EBP-4] ;OS2SS-@@ Get the XT header Mov CX,[ECX].XTFlags1 ;OS2SS-@@ Get the XT header flags. Mov EDI,[ESP+8] ;OS2SS- Restore OtherFlag index. Call BadAccent ;No! Go take care of things. .Else ;Accent flags say this key is accented. Pop EDX ;OS2SS-Restore shift flags for now. Push EDX ;OS2SS-But leave them saved. Push EAX ;OS2SS-Save AX for now. Mov AL,[ESI].Key.Char ;OS2SS-@@ PTM 6860 Mov ECX,20 ;OS2SS-Set max pairs in Accent table entry. Add EDI,AcMap1 ;Point to first pair in accent table entry. TLoop: ;Top of loop looking for current scan code in accent table entry. Mov DX,[EDI] ;OS2SS-Pick up next pair. .If ;@@ PTM 6860 - Begin If we are at the end ;@@ of the list Mov ECX,1 ;OS2SS-@@ Set end of loop condition .ElseIf ;@@ Else Have we found a match? Jmp Short XLoop ;Yes, so exit from loop. .Endif Add EDI,2 ;Increment our pointer. Loop TLoop ;Repeat. XLoop: Or CX,CX ;Check if no match before end of entry. .If ;Is that true? Mov ECX,[EBP-4] ;OS2SS-@@ Get the XT header Mov CX,[ECX].XTFlags1 ;OS2SS-@@ Get the XT header flags. Mov EDI,[ESP+12] ;OS2SS- Restore OtherFlag index. Call BadAccent ;No! Go take care of things. .Else ;Else we found our accented character value! Mov [ESI].Key.Char,DH ;OS2SS-Put it in CharData rec. ; Mov [ESI].Key.Scan,0 ;OS2SS-Zero scan code for accented chars. Or [ESI].DDFlags,AccentedKey ;OS2SS-Indicate accent affected key. .Endif Pop EAX ;Restore AX. .Endif Pop EDX ;Restore the... Pop ECX ;..altered regs. Pop EDI ;Restore PSG index. And [EDI].XPSGFlags,Not PrevAccent ;OS2SS-@@ Clear previous accent field. .Endif Pop EBX ;@@ Restore BX Test [ESI].DDFlags,AccentedKey ;OS2SS-Check if accent affected key. .If OR ;Did it? .If <[ESI].DDFlags e BadKeyCombo> ;OS2SS-@@ check if this was an invalid combo? Pop EBX ;OS2SS-Throw away original return address. Jmp EndActionCase ;And quit now. .Endif Ret ;Else return. AccCheckout Endp ;-----------------------------------------------------/ Public BadAccent BadAccent Proc ;------------------------------------------------------\ ;*********************************************************************** ;* * ;* Subroutine Name: BadAccent * ;* * ;* Descriptive Name: Process an Accent that does Not Apply to a Char * ;* * ;* Function: Set up a KeyPacket that must be passed as a standalone * ;* character * ;* * ;* Entry Point: BadAccent Linkage: Near * ;* * ;* Input: SI = @ of KeyPacket * ;* Empty KeyPacket2 immediately follows KeyPacket * ;* ES:BX = @ of Accent Table Entry for accent to pass * ;* CX = Translate Table Header Flags * ;* * ;* Exit-Normal: Monitor Key Packet filled in * ;* * ;* Exit-Error: N/A * ;* * ;* Effects: CX * ;* * ;* Internal References: * ;* Routines: CopyPacket * ;* * ;* External References: * ;* Routines: None * ;* * ;*********************************************************************** Push ESI ;OS2SS- Push EDI ;OS2SS- Test CX,AccentPass ;@@ Check if key packets should be passed .If OR ;@@ If not... OR Test [EDI].OtherFlags,InterruptTime ;OS2SS-@@ If it's interrupt time .If ;@@ Tell Int Handler to beep Mov [ESI].DDFlags,BadKeyCombo ;OS2SS-@@ or strategy proc to return invalid parm. .Else ;@@ Else key packets should be passed Call CopyPacket ;&& PTM 2382: Make a copy of the first ;&& packet into the extra packet. ;Now ESI has incremented to point to KeyPacket2. Mov Byte Ptr [ESI].MonFlags+1,0 ;OS2SS-Zero the original scan code field. Mov [ESI].DDFlags,AccentedKey+AccentKey ;OS2SS-@@ Indicate printable accent char. Mov CX,[EBX] ;OS2SS-Get char/scan to pass from accent entry. Mov Word Ptr [ESI].Key.Char,CX ;OS2SS-Put in KeyPacket2. Mov Byte Ptr [ESI].MonFlags,-1 ;OS2SS-Tell KBDDD to pass two packets. .Endif Pop EDI Pop ESI Ret BadAccent Endp ;------------------------------------------------------/ Public AltPadPacket AltPadPacket Proc ;---------------------------------------------\ ;*********************************************************************** ;* * ;* Subroutine Name: AltPadPacket * ;* * ;* Descriptive Name: Set up a KeyPacket for the Break of the Alt Key * ;* * ;* Function: A monitor packet is set up so that on Alt-Numpad * ;* sequences the break of the Alt key is not lost. * ;* * ;* Entry Point: AltPadPacket Linkage: Near * ;* * ;* Input: SI = @ of KeyPacket * ;* Empty KeyPacket2 immediately follows KeyPacket * ;* * ;* Exit-Normal: Monitor Key Packet filled in * ;* * ;* Exit-Error: N/A * ;* * ;* Effects: None, Registers are preserved. * ;* * ;* Internal References: * ;* Routines: CopyPacket * ;* * ;* External References: * ;* Routines: None * ;* * ;*********************************************************************** ;&& DCR 1713 BEGIN: Push ESI ;OS2SS-&& Save the registers Push EDI ;OS2SS-&& that we will use here Push ECX ;OS2SS-&& to duplicate the first packet. Call CopyPacket ;&& PTM 2382: Make a copy of the first ;&& packet into the extra packet. ;&& Now ESI has been incremented to point to KeyPacket2. Or [ESI].DDFlags,ShiftMask+KeyBreak ;OS2SS-&& Indicate that this is shift packet. Mov word ptr [ESI].Key.Char,0 ;OS2SS-&& Zero out the original char field. Mov Byte Ptr [ESI].MonFlags,-1 ;OS2SS-&& Tell KBDDD to pass two packets. Pop ECX ;OS2SS-&& Restore registers. Pop EDI ;OS2SS-&& Test [EDI].XInputMode,SHIFTREPORT ;OS2SS-&& Are we in shift report mode ? .If ;&& If so then... Or [ESI].Key.Status,1 ;OS2SS-&& flag this as a shift report packet. .Endif ;&& Endif a shift report packet. Pop ESI ;OS2SS-&& Ret ;&& DCR 1713 END: AltPadPacket Endp ;------------------------------------------------------/ Public MakeE0Packet MakeE0Packet Proc ;---------------------------------------------\ ;*********************************************************************** ;* * ;* Subroutine Name: MakeE0Packet * ;* * ;* Descriptive Name: Set up a KeyPacket for the E0 scan code * ;* * ;* Function: A monitor packet is set up for the E0 scan code packet * ;* that should have preceded the current scan code. * ;* * ;* Note: This routine added for CP111 PTM 2382. An E0 keypacket * ;* is now manufactured and passed in combination with the * ;* packet that follows the E0 scan code. This change was * ;* made in order to ensure that the E0 packet would always * ;* end up in the correct screen group. * ;* * ;* Entry Point: MakeE0Packet Linkage: Near * ;* * ;* Input: SI = @ of KeyPacket * ;* Empty KeyPacket2 immediately follows KeyPacket * ;* * ;* Exit-Normal: Monitor Key Packet filled in * ;* * ;* Exit-Error: N/A * ;* * ;* Effects: None, Registers are preserved. * ;* * ;* Internal References: * ;* Routines: CopyPacket * ;* * ;* External References: * ;* Routines: None * ;* * ;*********************************************************************** ;&& PTM 2382 BEGIN: Push ESI ;OS2SS-&& Save the registers Push EDI ;OS2SS-&& that we will use here Push ECX ;OS2SS-&& to duplicate the first packet. Call CopyPacket ;&& PTM 2382: Make a copy of the first ;&& packet into the extra packet. ;&& Now ESI has been incremented to point to KeyPacket2. Mov Byte Ptr [ESI].MonFlags,0 ;OS2SS-&& Init monitor flags low byte to zero. Mov Byte Ptr [ESI].MonFlags+1,OtherKey ;OS2SS-&& Put Scan Code in MonFlags high byte. Mov [ESI].DDFlags, 0 ;OS2SS-&& Clear the flag bits for new packet. Or [ESI].DDFlags, SecPrefixCode ;OS2SS-&& Indicate this is a secondary prefix. Mov CX, [_Ow2KCBShFlgs] ;&& Get the saved Shift Flags. Mov [ESI].Key.Shift,CX ;OS2SS-&& Put Shift Flags in packet. Mov [ESI].Key.Char,0 ;OS2SS-&& Zero out the original char field. Mov [ESI].Key.Scan,0 ;OS2SS-&& Zero out the original Scan field. Mov Byte Ptr [ESI].MonFlags,-1 ;OS2SS-&& Tell KBDDD to pass two packets. Pop ECX ;OS2SS-&& Restore registers. Pop EDI ;OS2SS-&& Pop ESI ;OS2SS-&& Ret ;&& PTM 2382 END: MakeE0Packet Endp ;------------------------------------------------------/ Public CopyPacket CopyPacket Proc ;-----------------------------------------------------\ ;*********************************************************************** ;* * ;* Subroutine Name: CopyPacket * ;* * ;* Descriptive Name: Copy KeyPacket1 to KeyPacket2 * ;* * ;* Function: This routine is called from BadAccent, AltPadPacket, * ;* and MakeE0Packet. It's purpose is to duplicate the * ;* first keypacket to the extra keypacket which follows * ;* the first. This is done so that the Interrupt Handler * ;* can pass both keypackets on the same interrupt. * ;* * ;* Entry Point: CopyPacket Linkage: Near * ;* * ;* Input: SI = @ of KeyPacket * ;* Empty KeyPacket2 immediately follows KeyPacket * ;* * ;* Exit-Normal: Monitor Key Packet copyed * ;* * ;* Exit-Error: N/A * ;* * ;* Effects: * ;* * ;* Internal References: * ;* Routines: None * ;* * ;* External References: * ;* Routines: None * ;* * ;*********************************************************************** Mov ECX,KeyPacketLen ;OS2SS-&& Set length of packets. Mov EDI,ESI ;OS2SS-&& Point to... Add EDI,ECX ;OS2SS-&& ...KeyPacket2. CopyLoop: ;&& Loop copying packet. Mov CH,[ESI] ;OS2SS-&& Get byte from first packet. Mov [EDI],CH ;OS2SS-&& Put in Packet2. Xor CH,CH ;&& Fix counter reg. Inc ESI ;OS2SS-&& Increment source ptr. Inc EDI ;OS2SS-&& Increment dest ptr. Loop CopyLoop ;&& Repeat for all bytes. Ret CopyPacket Endp ;------------------------------------------------------/ Public UnPauseChk UnPauseChk Proc ;-----------------------------------------------------\ ;*********************************************************************** ;* * ;* Subroutine Name: UnPauseChk * ;* * ;* Descriptive Name: Check For Key to End Pause Mode * ;* * ;* Function: Checks if key signalled the end of Pause mode. * ;* If it did, this routine resets the flag and * ;* returns to the the end of KbdXlate. Otherwise * ;* it just returns * ;* * ;* Entry Point: UnPauseChk Linkage: Near * ;* * ;* Input: None * ;* * ;* Exit-Normal: Nothing affected * ;* * ;* Exit-Error: N/A * ;* * ;* Effects: Nothing * ;* * ;* Internal References: * ;* Routines: None * ;* * ;* External References: * ;* Routines: None * ;* * ;*********************************************************************** And [EDI].XlateFlags,NOT DumpKeyOnce ;OS2SS-@@ If here, also cancels Dump sequence. Test [EDI].XPSGFlags,NowPaused ;OS2SS-@@ Check if in paused state. .If AND ;Are we? Test [ESI].DDFlags,KeyBreak ;OS2SS-Yes, and is this a key Make? .If ;Is it? And [ESI].DDFlags, NOT KeyTypeMask ;OS2SS-&& PTM 3940: Indicate Wake-Up key. Or [ESI].DDFlags,WakeUpKey ;OS2SS-&& PTM 3940: Pop ECX ;OS2SS-Purge return address. Jmp EndActionCase ;That's all. .Endif Ret UnPauseChk Endp ;-----------------------------------------------------/ Public AltGraphCheck AltGraphCheck Proc ;@@ ------------------------------------------\ ;@@ B ;************** START OF SPECIFICATIONS ******************************** ;* * ;* Subroutine Name: AtlGraphCheck * ;* * ;* Descriptive Name: Process an Alt-Graph character input * ;* * ;* Function: This routine processes a key type that is affected * ;* by Alt-Graph if an Alt key is down. If the Alt key * ;* down is not the Alt-Graph key or the Alt-Graph combo, * ;* it will set the carry and return. * ;* * ;* Notes: Upon entry to this routine, an Alt key is known to be * ;* down * ;* * ;* Entry Point: AltGraphCheck Linkage: Near * ;* * ;* Input: DI = Per Session Data Area Address * ;* SI = Key Packet Address * ;* ES = Translate Table Selector * ;* SS:SP+2 = Offset of translate table * ;* BP = Offset of scan code entry in translate table * ;* DX = ShiftFlags * ;* CharToUse = Which character to use if Alt-Graph is down * ;* * ;* Exit-Normal: Carry set = process as normal Alt key down * ;* Carry clear = key has been processed * ;* AL= ASCII character to use * ;* OR * ;* CharToUse = UNDEFINED * ;* Exit-Error: None * ;* * ;* Effects: AX, registers, carry flag changed. * ;* * ;* Internal References: * ;* Routines: None * ;* * ;* External References: * ;* Routines: None * ;* * ;*********************************************************************** ;@@ E Push EBX ;OS2SS- Push ESI ;OS2SS- Mov EBX, [EBP-8] ;OS2SS-Pointer to XlateTable entry for this scan code. Mov ESI, [EBP-4] ;OS2SS-Pointer to XlateTable top .If <[EBX].Char3 eq 0> ;OS2SS-@@ If Char 3 is 0 Or [EDI].XlateFlags,NormalAlt ;OS2SS-@@ indicate that only Normal ALT is down .Else NEAR ;@@ Else Alt-Graph character is defined Mov AL,[EBX].Char3 ;OS2SS-@@ Get Char3 from translate table .If <[ESI].XTKbdType eq ATKbd> ;OS2SS-@@ If an AT kbd translate table Test [ESI].XTFlags1,ShftAlt ;OS2SS-@@ check if we should use Shift-Alt as .If ;@@ as the Alt-Graph combo, if so... Test DL,RShiftFlag+LShiftFlag ;@@ Check if a shift key is down .If ;@@ If it is And [EDI].XlateFlags,Not NormalAlt ;OS2SS-@@ specify to caller ;@@ that it's Alt-Graph Test [EDI].XlateFlags,Use3Index ;OS2SS-@@ if we're supposed to use it .If ;@@ as an index Mov CL,AL Xor AL,AL .Endif .Else ;@@ supposed to use Shift-Alt combo, but shift isn't down Mov AL,[EBX].Char1 ;OS2SS-@@ Restore Char1 Or [EDI].XlateFlags,NormalAlt ;OS2SS-@@ indicate that only Normal ALT is down .Endif ;@@ Endif shift key down check .Else ;@@ Shift-Alt is not Alt-Graph combo, so it is Ctl-Alt Test DL,CtlFlag ;@@ Check if a ctl key is down .If ;@@ If it is And [EDI].XlateFlags,Not NormalAlt ;OS2SS-@@ specify to caller ;@@ that it's Alt-Graph Test [EDI].XlateFlags,Use3Index ;OS2SS-@@ if we're supposed to use it .If ;@@ as an index Mov CL,AL Xor AL,AL .Endif .Else ;@@ supposed to use Ctl-Alt combo, but Ctl isn't down Or [EDI].XlateFlags,NormalAlt ;OS2SS-@@ indicate only Normal ALT is down Mov AL,[EBX].Char1 ;OS2SS-@@ Restore Char1 .Endif ;@@ Endif Ctlt key down check .Endif ;@@ Endif Shift-Alt is Alt-Graph combo or not check .Else ;@@ Else it's an Enhanced Keyboard Test [ESI].XTFlags1,AltGrafL ;OS2SS-@@ check if we should use Left Alt key .If ;@@ as the Alt-Graph key, if so... Test DX,LAltFlag ;@@ Check if left Alt key is down .If ;@@ If it is And [EDI].XlateFlags,Not NormalAlt ;OS2SS-@@ specify to caller ;@@ that it's Alt-Graph Test [EDI].XlateFlags,Use3Index ;OS2SS-@@ if we're supposed to use it .If ;@@ as an index Mov CL,AL Xor AL,AL .Endif .Else ;@@ supposed to use Left Alt key, but it isn't the one down Or [EDI].XlateFlags,NormalAlt ;OS2SS-@@ indicate that only ;@@ Normal ALT is down Mov AL,[EBX].Char1 ;OS2SS-@@ Restore Char1 .Endif ;@@ Endif Left Alt key down check .Else ;@@ Left Alt Key is not Alt-Graph key, so check if it is Right Test [ESI].XTFlags1,AltGrafR ;OS2SS-@@ check if we should use Right Alt key .If ;@@ as the Alt-Graph key, if so... Test DX,RAltFlag ;@@ Check if right Alt Key is down .If ;@@ If it is And [EDI].XlateFlags,Not NormalAlt ;OS2SS-@@ specify that it's Alt-Graph Test [EDI].XlateFlags,Use3Index ;OS2SS-@@ if we're supposed to use it .If ;@@ as an index Mov CL,AL Xor AL,AL .Endif .Else ;@@ supposed to use Right Alt Key, but it isn't down Or [EDI].XlateFlags,NormalAlt ;OS2SS-@@ indicate that only Normal Mov AL,[EBX].Char1 ;@@ Restore Char1 .Endif ;@@ Endif Right Alt Key down check .Else ;@@ Else Alt-Graph is neither Left nor Right Alt Key Or [EDI].XlateFlags,NormalAlt ;OS2SS-@@ indicate that only Normal Mov AL,[EBX].Char1 ;@@ Restore Char1 .Endif ;@@ Endif Right key is Alt-Graph or not check .Endif ;@@ Endif Left ALt key is Alt-Graph or not check .Endif ;@@ Endif At or Enhanced Keyboard .Endif ;@@ Endif Char 3 is 0 or not Pop ESI ;OS2SS- Pop EBX ;OS2SS- Ret AltGraphCheck Endp ;@@-------------------------------------------/ Public CheckExtended CheckExtended Proc ;@@ ------------------------------------------\ ;@@ B ;************** START OF SPECIFICATIONS ******************************** ;* * ;* Subroutine Name: CheckExtended * ;* * ;* Descriptive Name: Checks for extended codes. * ;* * ;* Function: This routine checks if a scan code has an associated * ;* extended scan code that goes with it. If it does, * ;* it sets the appropriate fields (scan & char) in the * ;* key packet and returns. * ;* * ;* Notes: Upon entry to this routine, an Alt key is known to be * ;* down * ;* * ;* Entry Point: CheckExtended Linkage: Near * ;* * ;* Input: DI = Per Session Data Area Address * ;* SI = Key Packet Address * ;* DX = ShiftFlags * ;* AH = Scan code w/ break bit cleared * ;* * ;* Exit-Normal: Carry set = Key has new extended code associated w/ it * ;* Carry clear = Key does not have new extended code * ;* * ;* Exit-Error: None * ;* * ;OS2SS- Effects: AX, registers, carry flag changed. * ;* * ;* Internal References: * ;* Routines: None * ;* * ;* External References: * ;* Routines: None * ;* * ;*********************************************************************** Push EBX ;OS2SS- ;@@ PTM 5024 - BEGIN Mov EBX, Offset NewExtSC ;OS2SS-@@ Get the offset of the table that ;@@ contains the scan codes that have new ;@@ extended codes associated with them Mov CX,0 ;@@ Start at beginning of table .While ;@@ While we haven't searched entire table .If ;OS2SS-@@ If we found the scan code Mov [ESI].Key.Char,0 ;OS2SS-@@ Say its an extended Mov CX,NewExtSCLen ;@@ Set end of loop condition Mov EBX,0 ;OS2SS-@@ Set found indicator .Else ;@@ Else this isn't the scan code Inc CX ;@@ Increment loop counter Inc EBX ;OS2SS-@@ Increment pointer into table .Endif ;@@ Endif found scan code we're looking for .EndWhile ;@@ EndWhile we haven't searched entire table .If ;OS2SS-@@ If we found the scan code .If ;@@ If it's the tab key Mov [ESI].Key.Scan,0A5h ;OS2SS-@@ Set extended code for tab key .Endif ;@@ Endif it's the tab key Stc ;@@ Tell caller extended char. exists. .Else ;@@ Else we didn't find Scan code in table Clc ;@@ tell caller .Endif ;@@ Pop EBX ;OS2SS- Ret ;@@ ;@@ PTM 5024 - END ;@@ E CheckExtended Endp ;@@-------------------------------------------/ _TEXT ends End