You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2007 lines
84 KiB
2007 lines
84 KiB
PAGE ,132
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;;
|
|
;; (C) Copyright Microsoft Corp. 1987-1990
|
|
;; MS-DOS 5.00 - NLS Support - KEYB Command
|
|
;;
|
|
; File Name: KEYBI9C.ASM
|
|
; ----------
|
|
;
|
|
;
|
|
; Description:
|
|
; ------------
|
|
; Interrupt 9 mainline.
|
|
; This routine handles all US keyboard support for the following
|
|
; system units: PC, PC-XT, PC-AT, PC Convertible, PC-XT/286
|
|
; Models 25 and 30 (PALACE),
|
|
; PS/2's - all 8042 based 80286, 80386 and 80486.
|
|
; - all PATRIOT and SEBRING based systems.
|
|
; KEYB_STATE_PROCESSOR is called for non-US keyboard support.
|
|
;
|
|
;
|
|
;
|
|
; Procedures Contained in This File:
|
|
; ----------------------------------
|
|
; KEYB_INT_9 - Interrupt 9
|
|
;
|
|
; External Procedure References:
|
|
; ------------------------------
|
|
; FROM FILE KEYBI9.ASM:
|
|
; KEYB_STATE_PROCESSOR - Non US keyboard support.
|
|
;
|
|
; Linkage Information: Refer to file KEYB.ASM
|
|
; --------------------
|
|
;
|
|
; Change History:
|
|
; ---------------
|
|
; ; - DCR 478 - KEYBOARD INT SPLICING Nick Savage ;deleted by AN005
|
|
; ; - PTM 3090 ENABLING RIGHT CTL FOR RE-BOOTING
|
|
; ; - PTM 60XX PICK UP ALL KEYBOARD BIOS PTR's AND DCR's TO BRING
|
|
; INT 9h UP TO THE TOPHAT (80486) SUPPORT LEVEL. '89 jwg
|
|
; PTR 6600736 Keep INT's disabled till after PORT 60h read.
|
|
; PTR 6600756 EXTRA EOI ISSUED IF INTERRUPTS SATURATED **********
|
|
; NOTE: This is a fix for a BIOS bug that goes all
|
|
; the way back to the first AT. The rationale for
|
|
; the fix is as follows:
|
|
; (deleted AN005) A stack frame is created upon entry (BP) and
|
|
; CHK_EOI is called to check the frame. If no
|
|
; EOI has been issued, CHK_EOI does it and
|
|
; resets the frame, preventing any additinal
|
|
; EOI's from being issued on subsequent calls
|
|
; to CHK_EOI. All direct EOI's in the code
|
|
; have been replaced with calls to CHK_EOI.
|
|
;
|
|
; ;Ax004; - PTM 2555 KEYB command locks keyboard. 10/5/89;cja
|
|
; ; jwg 11/09/98 Updates - Wild Mouse, etc workaround.....
|
|
; ; - PTM 5802 Restructure Interrupt Splicing to correct lost Mouse
|
|
; interrupt when LED's are updated. Make it apply to
|
|
; all systems. Essentially remove all code added by AN001.
|
|
; Remove stack frame logic of AN003 and PTR 6600756 and do
|
|
; an early EOI. Requires a CLI at K38B and other places.
|
|
; Remove Chk_ibf before 60h.
|
|
; Re-write ERROR_BEEP to make processor speed independent
|
|
; for AT and PS/2 systems and right tone if interrupts.
|
|
; Make SHIP_IT handle call on PC machines.
|
|
; Use BP to hold system flags during interrupt processing.
|
|
; PTR 6602049 Fix problem with Pause Key hanging system if Mouse
|
|
; driver is using polled mode. (Port 60h hangs.)
|
|
; PTR 6602247 Change JMP at K40 to stop extra Enable Keyboard cmd.
|
|
; PTR 6602319 Fix interrupt window on System Request key allowing
|
|
; following scan code(s) to be processed out of sequence.
|
|
; PTR 6602355 Fix Print Screen clearing E0 state flags too late.
|
|
; ; - ;deleted Add code the clear "Wild Mouse" condition at PAUSE wait.
|
|
; ; - PTM 6660 Move determination code for original PC1 to COMMSUBS.ASM
|
|
; - ;jwg 2/90 Add Patriot/Sebring HOT REPLUG code so keyboard can be
|
|
; switched back to Scan Code Set 1 if repluged. LIB LITE
|
|
; ; - PTM 6680 Remove code attempting to re-sync BIOS flags with reset
|
|
; Keyboard. Test case simulators can/are sending invalid
|
|
; sequence of AA,AA. Must leave BIOS flags alone on POR.
|
|
; ; - PTM 6716 MicroSoft WORKS (German version) reentrancy problem with
|
|
; - ;jwg 3/90 NLS state processor and save scan code. LED update ACK
|
|
; overlays memory before NLS processing of scan code.
|
|
; Remove AN006 "Wild Mouse" reset code, field tests done.
|
|
; ; - PTM ???? Fix read ID logic to recognize 122 keyboards and set the
|
|
; ;jwg 8/90 KBX flag on any enhansed keyboard.
|
|
; ; - PTM ???? Add 122 Keyboard key support tables.
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
INCLUDE KEYBEQU.INC
|
|
INCLUDE DSEG.INC ; System data segments
|
|
INCLUDE POSTEQU.INC ; System equates
|
|
INCLUDE KEYBSHAR.INC
|
|
INCLUDE KEYBI2F.INC
|
|
INCLUDE KEYBI9.INC
|
|
INCLUDE KEYBCPSD.INC
|
|
INCLUDE KEYBCMD.INC
|
|
|
|
include bop.inc
|
|
include vint.inc
|
|
|
|
PUBLIC KEYB_INT_9
|
|
PUBLIC K8 ; CTRL case tables
|
|
PUBLIC SCAN_CODE
|
|
PUBLIC BUFFER_FILL
|
|
PUBLIC COUNTRY_FLAG
|
|
|
|
|
|
PUBLIC COPY_NLS1_FLAG ;; (YST)
|
|
|
|
|
|
PUBLIC BEEP_PENDING
|
|
PUBLIC ERROR_BEEP
|
|
PUBLIC CHK_IBF
|
|
ifdef JAPAN
|
|
PUBLIC S_122_MARKER ; 122 KEYBOARD F8/00 marker
|
|
PUBLIC BEEP_DELAY ; Error beep delay, default=19
|
|
PUBLIC SCAN_CODE_SET ; Keyboard Scan Code Set in use
|
|
PUBLIC READ_ID2 ; Second byte read on last READ ID
|
|
endif ; JAPAN
|
|
|
|
|
|
|
|
ID_1 EQU 0ABH ; 1ST ID CHARACTER FOR KBX
|
|
TID_2 EQU 041H ; US G-LAYOUT
|
|
TID_2A EQU 054H ; US P-LAYOUT
|
|
|
|
;UNTRANSLATED 2ND ID CHAR FOR KBDX
|
|
ID_2U EQU 083H ; US G-LAYOUT (PATRIOT)
|
|
ID_2AU EQU 084H ; US P-LAYOUT (PATRIOT)
|
|
ID_122 EQU 086H ; 2ND ID CHARACTER FOR 122-KEYBOARD
|
|
ID_2JG EQU 090H ; JPN G-LAYOUT
|
|
ID_2JP EQU 091H ; JPN P-LAYOUT
|
|
ID_2JA EQU 092H ; JPN A-LAYOUT
|
|
|
|
ifdef JAPAN
|
|
S_XKBD_SCAN EQU 0A6h ; Highest Character Code For Enhanced
|
|
S_122_MARK EQU 0F8h ; Marker for EXTENDED 122 keys DCR 1815
|
|
endif ; JAPAN
|
|
|
|
DIAGS SEGMENT AT 0FFFFH
|
|
ORG 0
|
|
RESET LABEL FAR
|
|
DIAGS ENDS
|
|
|
|
|
|
CODE SEGMENT PUBLIC 'CODE'
|
|
ASSUME CS:CODE,DS:DATA
|
|
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;
|
|
; TABLE OF SHIFT KEYS AND MASK VALUES
|
|
;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
;------ KEY_TABLE
|
|
K6 LABEL BYTE
|
|
DB INS_KEY ; INSERT KEY
|
|
DB CAPS_KEY,NUM_KEY,SCROLL_KEY,ALT_KEY,CTL_KEY
|
|
DB LEFT_KEY,RIGHT_KEY
|
|
K6L EQU $-K6
|
|
|
|
;------ MASK_TABLE
|
|
K7 LABEL BYTE
|
|
DB INS_SHIFT ; INSERT MODE SHIFT
|
|
DB CAPS_SHIFT,NUM_SHIFT,SCROLL_SHIFT,ALT_SHIFT,CTL_SHIFT
|
|
DB LEFT_SHIFT,RIGHT_SHIFT
|
|
|
|
;---------- TABLES FOR ALT CASE -----
|
|
;------ ALT-INPUT-TABLE
|
|
K30 LABEL BYTE
|
|
DB 82,79,80,81,75
|
|
DB 76,77,71,72,73 ; 10 NUMBERS ON KEYPAD
|
|
;------ SUPER-SHIFT-TABLE
|
|
DB 16,17,18,19,20,21 ; A-Z TYPEWRITER CHARS
|
|
DB 22,23,24,25,30,31
|
|
DB 32,33,34,35,36,37
|
|
DB 38,44,45,46,47,48
|
|
DB 49,50
|
|
K30_LEN EQU $-K30-10
|
|
|
|
;------ ALT-INPUT-FUNCTION-TABLE 53H - 7EH
|
|
K30A LABEL BYTE
|
|
DB -1,-1,-1,-1,139,140 ; Del, SysReq, Undef, WT, F11, F12
|
|
DB -1,235,218,219,220 ; Undef, PA1, F13, F14, F15
|
|
DB -1,-1,-1,-1,-1 ; Pause, Undef 5F-62
|
|
DB 221,222,223,226,227 ; F16, F17, F18, F19, F20,
|
|
DB 228,229,230,231 ; F21, F22, F23, F24,
|
|
DB -1,243,-1,-1 ; K#69, ErEOF, Break, Play,
|
|
DB -1,-1,-1,-1,-1 ; Undef, Attn, CrSel, K#56, ExSel
|
|
DB -1,253 ; K#74, Clear,
|
|
ifdef NOT_NTVDM
|
|
;;* DB -1,-1,-1 ; Undef, K#109, Undef
|
|
;;* DB -1,-1,-1,-1,-1 ; Undef, Undef, K#94, K#14, Undef
|
|
else
|
|
DB -1,-1,-1 ; Undef, K#109, Undef
|
|
DB -1,-1,-1,-1,-1 ; Undef, Undef, K#94, K#14, K#107
|
|
endif
|
|
ifdef JAPAN
|
|
DB -1 ; 07Eh, 07Fh. DBCS Pseudo codes.
|
|
; H_LAST_SCAN must be 07Fh for DBCS
|
|
endif ; JAPAN
|
|
|
|
H_LAST_SCAN EQU $-K30A+52h ; Largest valid scan code in table
|
|
; K30A K8 K15 K14 must have same ends
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
; K8 is overlaid by K8_RPL (from module KEYB_COMMAND)
|
|
; if extended INT 16 support is available
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
K8 LABEL BYTE ;-------- CHARACTERS ---------
|
|
DB 27,-1,00,-1,-1,-1 ; Esc, 1, 2, 3, 4, 5
|
|
DB 30,-1,-1,-1,-1,31 ; 6, 7, 8, 9, 0, -
|
|
DB -1,127,-1,17,23,5 ; =, Bksp, Tab, Q, W, E
|
|
DB 18,20,25,21,09,15 ; R, T, Y, U, I, O
|
|
DB 16,27,29,10,-1,01 ; P, [, ], Enter, Ctrl, A
|
|
DB 19,04,06,07,08,10 ; S, D, F, G, H, J
|
|
DB 11,12,-1,-1,-1,-1 ; K, L, ;, ', `, LShift
|
|
DB 28,26,24,03,22,02 ; \, Z, X, C, V, B
|
|
DB 14,13,-1,-1,-1,-1 ; N, M, ,, ., /, RShift
|
|
DB '*',-1,' ',-1 ; *, Alt, Space, CL
|
|
;--------- FUNCTIONS ---------
|
|
DB 94,95,96,97,98,99 ; F1 - F6
|
|
DB 100,101,102,103,-1,-1 ; F7 - F10, NL, SL
|
|
DB 119,-1,132,-1,115,-1 ; Home, Up, PgUp, -, Left, Pad5
|
|
DB 116,-1,117,-1,118,-1 ; Right, +, End, Down, PgDn, Ins
|
|
DB -1,-1,-1,-1,137,138 ; Del, SysReq, Undef, WT, F11, F12
|
|
;---------- 122 KEYBOARD not overlaid
|
|
DB -1,234,206,207,208 ; Undef, PA1, F13, F14, F15
|
|
DB -1,-1,-1,-1,-1 ; Pause, Undef 5F-62
|
|
DB 209,210,211,212,213 ; F16, F17, F18, F19, F20,
|
|
DB 214,215,216,217 ; F21, F22, F23, F24,
|
|
DB -1,242,-1,-1 ; K#69, ErEOF, Break, Play,
|
|
DB -1,-1,-1,-1,-1 ; Undef, Attn, CrSel, K#56, ExSel
|
|
DB -1,252 ; K#74, Clear,
|
|
ifdef NOT_NTVDM
|
|
;;* DB -1,-1,-1 ; Undef, K#109, Undef
|
|
;;* DB -1,-1,-1,-1,-1 ; Undef, Undef, K#94, K#14, Undef
|
|
else
|
|
DB -1,-1,-1 ; Undef, K#109, Undef
|
|
DB -1,-1,-1,-1,-1 ; Undef, Undef, K#94, K#14, K#107
|
|
endif
|
|
ifdef JAPAN
|
|
DB -1 ; 07Eh, 07Fh. DBCS Pseudo codes.
|
|
endif ; JAPAN
|
|
|
|
;----- TABLES FOR LOWER CASE (USA) --
|
|
|
|
K10 LABEL BYTE
|
|
DB 27,'12345'
|
|
DB '67890-'
|
|
DB '=',08,09,'qwe'
|
|
DB 'rtyuio'
|
|
DB 'p[]',0DH,-1,'a' ; LETTERS, Return, Ctrl
|
|
DB 'sdfghj'
|
|
DB "kl;'`",-1 ; LETTERS, L Shift
|
|
DB '\zxcvb'
|
|
DB 'nm,./'
|
|
DB -1,'*',-1,' \' ; R Shift, *, Alt, Sp, CL (REALLY WT KEY)
|
|
|
|
;------ LC TABLE SCAN
|
|
DB 59,60,61,62,63 ; BASE STATE OF F1 - F10
|
|
DB 64,65,66,67,68
|
|
DB -1,-1 ; NL, SL
|
|
|
|
;------ KEYPAD TABLE
|
|
K15 LABEL BYTE
|
|
DB 71,72,73,-1,75,-1 ; Home, Up, PgUp, -1, Left, -1
|
|
DB 77,-1,79,80,81,82 ; Right, -1, End, Down, PgDn, Ins
|
|
DB 83 ; Del
|
|
DB -1,-1,'\',133,134 ; SysRq, Undef, WT, F11, F12
|
|
ifndef JAPAN
|
|
DB -1,232,182,183,184 ; Undef, PA1, F13, F14, F15
|
|
else ; JAPAN
|
|
DB -1,232,236,237,238 ; Undef, PA1, F13, F14, F15
|
|
endif ; JAPAN
|
|
DB -1,-1,-1,-1,-1 ; Pause, Undef 5F-62
|
|
ifndef JAPAN
|
|
DB 185,186,187,188,189 ; F16, F17, F18, F19, F20,
|
|
DB 190,191,192,193 ; F21, F22, F23, F24,
|
|
else ; JAPAN
|
|
DB 239,244,245,246,247 ; F16, F17, F18, F19, F20,
|
|
DB 248,249,250,192 ; F21, F22, F23, F24,
|
|
endif ; JAPAN
|
|
DB -1,240,-1,-1 ; K#69, ErEOF, Break, Play,
|
|
DB -1,-1,-1,-1,-1 ; Undef, Attn, CrSel, K#56, ExSel
|
|
DB -1,251 ; K#74, Clear,
|
|
ifdef NOT_NTVDM
|
|
;;* DB -1,-1,-1 ; Undef, K#109, Undef
|
|
;;* DB -1,-1,-1,-1,-1 ; Undef, Undef, K#94, K#14, Undef
|
|
else
|
|
DB -1,-1,-1 ; Undef, K#109, Undef
|
|
DB -1,-1,-1,-1,-1 ; Undef, Undef, K#94, K#14, K#107
|
|
endif
|
|
ifdef JAPAN
|
|
DB -1 ; 07Eh, 07Fh. DBCS Pseudo codes.
|
|
endif ; JAPAN
|
|
|
|
;------- TABLES FOR UPPER CASE (USA)
|
|
|
|
K11 LABEL BYTE
|
|
DB 27,'!@#$%'
|
|
DB '^&*()_'
|
|
DB '+',08,00,'QWE'
|
|
DB 'RTYUIO'
|
|
DB 'P{}',0DH,-1,'A' ; LETTERS, Return, Ctrl
|
|
DB 'SDFGHJ'
|
|
DB 'KL:"~',-1 ; LETTERS, L Shift
|
|
DB '|ZXCVB'
|
|
DB 'NM<>?'
|
|
DB -1,'*',-1,' |' ; R Shift, *, Alt, Sp, CL (REALLY WT KEY)
|
|
|
|
;------ UC TABLE SCAN
|
|
K12 LABEL BYTE
|
|
DB 84,85,86,87,88 ; SHIFTED STATE OF F1 - F10
|
|
DB 89,90,91,92,93
|
|
DB -1,-1 ; NL, SL
|
|
|
|
;------ NUM STATE TABLE
|
|
K14 LABEL BYTE
|
|
DB '789-456+1230.' ; NUMLOCK STATE OF KEYPAD KEYS
|
|
DB -1,-1,'|',135,136 ; SysRq, Undef, WT, F11, F12
|
|
ifndef JAPAN
|
|
DB -1,233,194,195,196 ; Undef, PA1, F13, F14, F15
|
|
else ; JAPAN
|
|
DB -1,233,193,195,196 ; Undef, PA1, F13, F14, F15
|
|
endif ; JAPAN
|
|
DB -1,-1,-1,-1,-1 ; Pause, Undef 5F-62
|
|
DB 197,198,199,200,201 ; F16, F17, F18, F19, F20,
|
|
DB 202,203,204,205 ; F21, F22, F23, F24,
|
|
DB -1,241,-1,-1 ; K#69, ErEOF, Break, Play,
|
|
DB -1,-1,-1,-1,-1 ; Undef, Attn, CrSel, K#56, ExSel
|
|
DB -1,251 ; K#74, Clear,
|
|
ifdef NOT_NTVDM
|
|
;;* DB -1,-1,-1 ; Undef, K#109, Undef
|
|
;;* DB -1,-1,-1,-1,-1 ; Undef, Undef, K#94, K#14, Undef
|
|
else
|
|
DB -1,-1,-1 ; Undef, K#109, Undef
|
|
DB -1,-1,-1,-1,-1 ; Undef, Undef, K#94, K#14, K#107
|
|
endif
|
|
ifdef JAPAN
|
|
DB -1 ; 07Eh, 07Fh. DBCS Pseudo codes.
|
|
endif ; JAPAN
|
|
PAGE
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;
|
|
; Procedure: KEYB_INT_9
|
|
;
|
|
; Description:
|
|
; Entry point for interrupt 9 processing.
|
|
;
|
|
; Input Registers:
|
|
; None
|
|
;
|
|
; Output Registers:
|
|
; None
|
|
;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
EVEN ; Keep KEYB_INT_9 entry on even boundry
|
|
BEEP_PENDING DB NO ; YES if a beep is needed
|
|
SCAN_CODE DB 0 ; Last SCAN code read
|
|
|
|
KEYB_INT_9 PROC NEAR
|
|
|
|
JMP SHORT KB_INT_1 ;; (YST)
|
|
COPY_NLS1_FLAG DB 0 ;; (YST)
|
|
COUNTRY_FLAG DB -1 ; WHERE THE INT9 VECTOR POINTS
|
|
ifdef JAPAN
|
|
READ_ID2 DB 0 ; Second byte from last READ ID
|
|
BEEP_DELAY DW 19 ; Error beep delay, 19=Refresh loop,
|
|
; the half cycle time for 1745 hz
|
|
SCAN_CODE_SET DB 01h ; In case of old DBCS keyboards, this
|
|
; may be 81h or 82h. Default is 01
|
|
S_122_MARKER DB 0F8h ; Marker for 122-KEYBOARD KEYS DCR 1815
|
|
; Changed to E0 depending on INT 16h
|
|
EVEN ; Force to even location
|
|
endif ; JAPAN
|
|
KB_INT_1:
|
|
|
|
; Do NOT enable interrupts untill after
|
|
; PORT 60h has been read. INT 15h has
|
|
; interrupt window, do EOI, fast pass.
|
|
PUSH BP ; Reserved in KEYBi9c for SD.SYSTEM_FLAG
|
|
PUSH AX
|
|
PUSH BX
|
|
PUSH CX
|
|
PUSH DX
|
|
PUSH SI
|
|
PUSH DI
|
|
PUSH DS
|
|
PUSH ES
|
|
CLD ; FORWARD DIRECTION
|
|
MOV BX,DATA ; SET UP ADDRESSING
|
|
MOV DS,BX ; DS POINTS AT THE ROM BIOS DATA AREA
|
|
MOV BP,CS:SD.SYSTEM_FLAG ; GET CS:SD.SYSTEM_FLAG, AND USE BP
|
|
|
|
|
|
ifdef NOT_NTVDM
|
|
;/* -- WAIT TILL KEYBOARD DISABLE COMMAND CAN BE ACCEPTED
|
|
MOV AL,DIS_KBD ; DISABLE THE KEYBOARD COMMAND
|
|
CALL SHIP_IT ; EXECUTE DISABLE
|
|
else
|
|
mov ah, 1 ; notify I9 entry to softpc
|
|
BOP 09h
|
|
nop ; Carbon copy traces for
|
|
nop ; "in al,PORT_A"
|
|
endif ; keep it traceable
|
|
|
|
IN AL,PORT_A ; READ IN THE CHARACTER
|
|
|
|
|
|
;/* -- SYSTEM HOOK INT 15H - FUNCTION 4FH (ON HARDWARE INTERRUPT LEVEL 9H)
|
|
|
|
MOV AH,04FH ; SYSTEM INTERCEPT - KEY CODE FUNCTION
|
|
STC ; SET CY= 1 (IN CASE OF IRET)
|
|
INT 15H ; CASSETTE CALL (AL)= KEY SCAN CODE
|
|
; RETURNS CY= 1 FOR INVALID FUNCTION
|
|
|
|
ifdef NOT_NTVDM
|
|
; EARLY EOI for all interrupts done
|
|
; after INT 15h to prevent re-entrancy
|
|
XCHG BX,AX ; SAVE SCAN CODE
|
|
MOV AL,EOI ; END OF INTERRUPT COMMAND (EARLY EOI)
|
|
OUT INTA00,AL ; SEND EOI TO INTERRUPT CONTROL PORT
|
|
XCHG BX,AX ; RECOVER SCAN CODE
|
|
endif
|
|
|
|
JC KB_INT_02 ; CONTINUE IF CARRY FLAG SET ((AL)=CODE)
|
|
JMP K26 ; EXIT IF SYSTEM HANDLED SCAN CODE
|
|
; EXIT HANDLES ENABLE
|
|
|
|
;/* --- CHECK FOR A POSSIBLE HOT REPLUG AND A POR COMPLETE CODE
|
|
KB_INT_02: ; (AL)= SCAN CODE
|
|
|
|
ifdef NOT_NTVDM
|
|
; ntvdm we don't do keyboard resets\power on stuff
|
|
;
|
|
; CHECK FOR POR
|
|
CMP AL,KB_OK ; CHECK FOR POSSIBLE KEYBOARD POR CHAR
|
|
JNE KB_INT_03 ; CONTINUE NOT A POR OF AA
|
|
; CHECK FOR ENHANSED KEYB
|
|
TEST KB_FLAG_3,LC_E0 ; WAS E0h LAST SCAN CODE? DCR467
|
|
JNZ KB_INT_03 ; SKIP KB POR IF IT WAS
|
|
; CHECK FOR LEFT SHIFT BREAK
|
|
TEST KB_FLAG,LEFT_SHIFT ; IS LEFT SHIFT ACTIVE?
|
|
JNZ KB_INT_03 ; SKIP KB POR IF IT WAS
|
|
; KEYBOARD POWER ON DETECTED
|
|
MOV CS:BEEP_PENDING,YES ; INDICATE WE NEED A BEEP
|
|
MOV KB_FLAG_2,0 ; CLEAR ALL LED FLAGS TO FORCE UPDATE
|
|
; LEAVE OTHERS SO KB SIMULATORS WORK
|
|
|
|
TEST BP,PS_8042 ; SYSTEM USING 8042 & SCAN CODE SET 01?
|
|
JZ KB_INT_03 ; SKIP IF SYSTEM USES DEFAULT SCS 02
|
|
; PATRIOT/SEBRING 8042 GATE ARRAY
|
|
MOV AL,SCAN_CODE_CMD ; SELECT SCAN CODE SET COMMAND
|
|
CALL SND_DATA ; SEND IT DIRECTLY TO THE KEYBOARD
|
|
MOV AL,01h ; SELECT SCAN CODE SET 01
|
|
CALL SND_DATA ; SEND IT TO THE KEYBOARD
|
|
MOV AL,KB_OK ; RESTORE POR SCAN CODE IN (AL)
|
|
endif
|
|
|
|
KB_INT_03:
|
|
|
|
;/* --- CHECK FOR A RESEND COMMAND TO KEYBOARD
|
|
|
|
;; NTVDM STI ; ENABLE INTERRUPTS AGAIN
|
|
CMP AL,KB_RESEND ; IS THE INPUT A RESEND
|
|
JE KB_INT_4 ; GO IF RESEND
|
|
|
|
;/* --- CHECK FOR RESPONSE TO A COMMAND TO KEYBOARD
|
|
|
|
CMP AL,KB_ACK ; IS THE INPUT AN ACKNOWLEDGE
|
|
JNZ KB_INT_2 ; GO IF NOT
|
|
|
|
;/* --- A COMMAND TO THE KEYBOARD WAS ISSUED
|
|
|
|
;; NTVDM CLI ; DISABLE INTERRUPTS
|
|
OR KB_FLAG_2,KB_FA ; INDICATE ACK RECEIVED
|
|
JMP K26 ; RETURN IF NOT (ACK RETURNED FOR DATA)
|
|
|
|
;/* --- RESEND THE LAST BYTE
|
|
|
|
KB_INT_4:
|
|
;; NTVDM CLI ; DISABLE INTERRUPTS
|
|
OR KB_FLAG_2,KB_FE ; INDICATE RESEND RECEIVED
|
|
JMP K26 ; RETURN IF NOT (ACK RETURNED FOR DATA)
|
|
|
|
|
|
;/* --- UPDATE MODE INDICATORS IF CHANGE IN STATE
|
|
|
|
KB_INT_2:
|
|
PUSH AX ; SAVE DATA IN
|
|
CALL MAKE_LED ; GO GET MODE INDICATOR DATA BYTE
|
|
MOV BL, KB_FLAG_2 ; GET PREVIOUS BITS
|
|
XOR BL,AL ; SEE IF ANY DIFFERENT
|
|
AND BL,KB_LEDS ; ISOLATE INDICATOR BITS
|
|
JZ UP0 ; IF NO CHANGE BYPASS UPDATE
|
|
CALL SND_LED ; GO TURN ON MODE INDICATORS
|
|
UP0: POP AX ; RESTORE DATA IN
|
|
|
|
;---------------------------------------------------------------------
|
|
; START OF KEY PROCESSING -
|
|
;---------------------------------------------------------------------
|
|
|
|
MOV AH,AL ; SAVE SCAN CODE IN AH ALSO
|
|
; END OF RE-ENTRANT CODE PATHS
|
|
MOV CS:SCAN_CODE,AL ; SAVE SCAN CODE TO BE PROCESSED BY KEYB
|
|
|
|
;------ TEST FOR OVERRUN SCAN CODE FROM KEYBOARD
|
|
|
|
CMP AL,KB_OVER_RUN ; IS THIS AN OVERRUN CHAR?
|
|
JNZ K16 ; NO, TEST FOR SHIFT KEY
|
|
|
|
MOV CS:BEEP_PENDING,YES
|
|
JMP K26 ; BUFFER_FULL_BEEP, EXIT
|
|
|
|
K16:
|
|
|
|
PUSH CS
|
|
POP ES ; ESTABLISH ADDRESS OF TABLES
|
|
MOV BH, KB_FLAG_3 ; LOAD FLAGS FOR TESTING
|
|
|
|
;------ TEST TO SEE IF A READ_ID IS IN PROGRESS
|
|
|
|
TEST BH,RD_ID+LC_AB ; ARE WE DOING A READ ID?
|
|
JZ NOT_ID ; CONTINUE IF NOT
|
|
JNS TST_ID_2 ; IS THE RD_ID FLAG ON?
|
|
CMP AL,ID_1 ; IS THIS THE 1ST ID CHARACTER?
|
|
JNE RST_RD_ID
|
|
OR KB_FLAG_3,LC_AB ; INDICATE 1ST ID WAS OK
|
|
RST_RD_ID:
|
|
AND KB_FLAG_3,NOT RD_ID ; RESET THE READ ID FLAG
|
|
JMP SHORT ID_EX ; AND EXIT
|
|
|
|
|
|
;------ CHECK 2ND US KBD ID - FOR SETTING NUM LOCK ON
|
|
TST_ID_2:
|
|
AND KB_FLAG_3,NOT LC_AB ; RESET FLAG
|
|
OR KB_FLAG_3,KBX ; INDICATE ENHANCED KEYBOARD WAS FOUND
|
|
ifdef JAPAN
|
|
; If it responds to a read ID command
|
|
MOV CS:READ_ID2,AL ; Save ID just read for ID checks
|
|
endif ; JAPAN
|
|
CMP AL,TID_2 ; IS THIS US G-LAYOUT KBD w 8042
|
|
JE NUM_LOCK_000 ; JUMP IF SO
|
|
CMP AL,ID_2U ; IS THIS US G-LAYOUT KBD w/o 8042
|
|
JE NUM_LOCK_000 ; JUMP IF SO
|
|
CMP AL,ID_122 ; IS THIS THE 122 KEY ENHANCED KEYBOARD
|
|
JE NUM_LOCK_000 ; JUMP IF SO
|
|
|
|
;------ CHECK 2ND JAPANESE KBD ID ;DCR355
|
|
|
|
CMP AL,ID_2JG ; IS THIS JPN KBD - G ?
|
|
JE NUM_LOCK_000 ; JUMP IF SO
|
|
CMP AL,ID_2JA ; IS THIS JPN KBD - A ?
|
|
JNE ID_EX ; EXIT IF NUM LOCK NOT REQUIRED
|
|
; These ID's do not set NUM LOCK ON
|
|
; ID_2AU = US P-LAYOUT KBD w/o 8042
|
|
; TID_2A = US P-LAYOUT KBD w 8042
|
|
; ID_2JP = JPN KBD - P
|
|
|
|
;------ A READ ID SAID THAT IT WAS ENHANCED KEYBOARD
|
|
|
|
NUM_LOCK_000:
|
|
TEST BH,SET_NUM_LK ; SHOULD WE SET NUM LOCK?
|
|
JZ ID_EX ; EXIT IF NOT
|
|
OR KB_FLAG,NUM_STATE ; FORCE NUM LOCK ON
|
|
CALL SND_LED ; GO SET THE NUM LOCK INDICATOR
|
|
ID_EX:
|
|
JMP K26 ; EXIT
|
|
PAGE
|
|
NOT_ID:
|
|
ifdef JAPAN
|
|
; M005 -- Kermit merge changes + AN013 ;AN013
|
|
|
|
TEST BP,DBCS_OK ; Is a DBCS keyboard active? ;JP9009;AN013
|
|
JZ NOT_DBCS ; Skip DBCS shift case checks ;AN013
|
|
|
|
MOV BL,KB_FLAG ; Get shift key state flags now ;JP9009;AN013
|
|
; ntraid:mskkbug#3516: Alt+Capslock does not work 11/9/93 yasuho
|
|
CALL DBCS_keyboard_support ; Go check for special shift key;JP9009;AN013
|
|
; We can't call because this is edited
|
|
; scan code directly. I comment it.
|
|
; 8/31/93 NT-J
|
|
NOT_DBCS: ;AN013
|
|
; M005 -- End changes + AN013
|
|
endif ; JAPAN
|
|
CMP AL,MC_E0 ; IS THIS THE GENERAL MARKER CODE?
|
|
JNE TEST_E1
|
|
OR KB_FLAG_3,LC_E0+KBX ; SET FLAG BIT, SET KBX, AND
|
|
JMP SHORT EXIT ; THROW AWAY THIS CODE
|
|
|
|
TEST_E1:
|
|
CMP AL,MC_E1 ; IS THIS THE PAUSE KEY?
|
|
JNE NOT_HC
|
|
OR KB_FLAG_3,LC_E1+KBX ; SET FLAG, PAUSE KEY MARKER CODE
|
|
EXIT: JMP K26A ; THROW AWAY THIS CODE
|
|
|
|
NOT_HC:
|
|
AND AL,07FH ; TURN OFF THE BREAK BIT
|
|
TEST BH,LC_E0 ; LAST CODE THE E0 MARKER CODE?
|
|
JZ NOT_LC_E0 ; JUMP IF NOT
|
|
|
|
MOV CX,2 ; LENGTH OF SEARCH
|
|
MOV DI,OFFSET K6+6 ; IS THIS A SHIFT KEY?
|
|
REPNE SCASB ; CHECK IT
|
|
JNE K16A ; NO, CONTINUE KEY PROCESSING
|
|
JMP SHORT K16B ; YES, THROW AWAY & RESET FLAG
|
|
|
|
NOT_LC_E0:
|
|
TEST BH,LC_E1 ; LAST CODE THE E1 MARKER CODE?
|
|
JZ T_SYS_KEY ; JUMP IF NOT
|
|
|
|
MOV CX,4 ; LENGTH OF SEARCH
|
|
MOV DI,OFFSET K6+4 ; IS THIS AN ALT, CTL, OR SHIFT?
|
|
REPNE SCASB ; CHECK IT
|
|
JE EXIT ; THROW AWAY IF SO
|
|
|
|
CMP AL,NUM_KEY ; IS IT THE PAUSE KEY?
|
|
JNE K16B ; NO, THROW AWAY & RESET FLAG
|
|
TEST AH,80H ; YES, IS IT THE BREAK OF THE KEY?
|
|
JNZ K16B ; YES, THROW THIS AWAY, TOO
|
|
TEST KB_FLAG_1,HOLD_STATE ; NO, ARE WE PAUSED ALREADY?
|
|
JNZ K16B ; YES, THROW AWAY
|
|
JMP K39P ; NO, THIS IS THE REAL PAUSE STATE
|
|
PAGE
|
|
;------ TEST FOR SYSTEM KEY
|
|
|
|
T_SYS_KEY:
|
|
CMP AL,SYS_KEY ; IS IT THE SYSTEM KEY?
|
|
JNE K16A ; CONTINUE IF NOT
|
|
|
|
TEST AH,080H ; CHECK IF THIS A BREAK CODE
|
|
;; NTVDM CLI ; DISABLE INTERRUPTS PTR 6602319
|
|
JNZ K16C ; DON'T TOUCH SYSTEM INDICATOR IF TRUE
|
|
|
|
TEST KB_FLAG_1,SYS_SHIFT ; SEE IF IN SYSTEM KEY HELD DOWN
|
|
JNZ K16B ; IF YES, DON'T PROCESS SYSTEM INDICATOR
|
|
|
|
OR KB_FLAG_1,SYS_SHIFT ; INDICATE SYSTEM KEY DEPRESSED
|
|
|
|
ifdef NOT_NTVDM
|
|
MOV AL,ENA_KBD ; INSURE KEYBOARD IS ENABLED
|
|
CALL SHIP_IT ; EXECUTE ENABLE
|
|
else
|
|
mov ah, 3 ; K27A exit notify
|
|
BOP 09h
|
|
endif
|
|
MOV AX,08500H ; FUNCTION VALUE FOR MAKE OF SYSTEM KEY
|
|
INT 15H ; USER INTERRUPT
|
|
JMP K27A ; END PROCESSING
|
|
|
|
K16B: JMP K26 ; IGNORE SYSTEM KEY
|
|
|
|
K16C: AND KB_FLAG_1,NOT SYS_SHIFT; TURN OFF SHIFT KEY HELD DOWN
|
|
|
|
ifdef NOT_NTVDM
|
|
MOV AL,ENA_KBD ; INSURE KEYBOARD IS ENABLED
|
|
CALL SHIP_IT ; EXECUTE ENABLE
|
|
else
|
|
mov ah, 3 ; K27A exit notify
|
|
BOP 09h
|
|
endif
|
|
|
|
MOV AX,08501H ; FUNCTION VALUE FOR BREAK OF SYSTEM KEY
|
|
INT 15H ; USER INTERRUPT
|
|
JMP K27A ; IGNORE SYSTEM KEY
|
|
PAGE
|
|
;------ TEST FOR SHIFT KEYS
|
|
;
|
|
; HERE IS WHERE KB_FLAGS ARE SET. WHAT HAPPENS IS, THE SYSTEM SEARCHES TABLE
|
|
; 'K6' FOR THE KEY. IF FOUND, IT GETS THE APPROPRIATE BIT FROM TABLE 'K7'
|
|
; AND SETS IT ON. (TABLES ARE ALL AT THE TOP OF THIS ROUTINE) FLAGS FOR THE
|
|
; SECOND ALT AND CTRL ARE SET IN KB_FLAG_3 AND HAVE THE SAME BIT POSITIONS AS
|
|
; THEIR ORIGINAL COUNTERPARTS IN KB_FLAG
|
|
|
|
K16A: MOV BL, KB_FLAG ; PUT STATE FLAGS IN BL
|
|
MOV DI,OFFSET K6 ; SHIFT KEY TABLE
|
|
MOV CX,K6L ; LENGTH
|
|
REPNE SCASB ; LOOK THROUGH THE TABLE FOR A MATCH
|
|
MOV AL,AH ; RECOVER SCAN CODE
|
|
JE K17 ; JUMP IF MATCH FOUND
|
|
JMP K25 ; IF NO MATCH, THEN SHIFT NOT FOUND
|
|
|
|
;------ SHIFT KEY FOUND
|
|
|
|
K17: SUB DI,OFFSET K6+1 ; ADJUST PTR TO SCAN CODE MTCH
|
|
MOV AH,CS:K7[DI] ; GET MASK INTO AH
|
|
MOV CL,2 ; SET UP COUNT FOR FLAG SHIFTS
|
|
TEST AL,80H ; TEST FOR BREAK KEY
|
|
JZ K17C
|
|
JMP K23 ; JUMP IF BREAK
|
|
|
|
;------ SHIFT MAKE FOUND, DETERMINE SET OR TOGGLE
|
|
|
|
K17C: CMP AH,SCROLL_SHIFT
|
|
JAE K18 ; IF SCROLL SHIFT OR ABOVE, TOGGLE KEY
|
|
|
|
;------ PLAIN SHIFT KEY, SET SHIFT ON
|
|
|
|
CMP COUNTRY_FLAG,0FFh ; ARE WE IN FOREIGN LANG MODE?
|
|
JNE K17C1 ; NO, US MODE, JUMP
|
|
CMP AL,ALT_KEY ; IS THIS THE ALT KEY?
|
|
JNE K17C1 ; NO, NORMAL KEY
|
|
;**CNS
|
|
|
|
K17C1: OR KB_FLAG,AH ; TURN ON SHIFT BIT
|
|
K17C2: TEST AH,CTL_SHIFT+ALT_SHIFT ; IS IT ALT OR CTRL?
|
|
JZ K17F ; NO, JUMP
|
|
K17D: TEST BH,LC_E0 ; IS THIS ONE OF THE NEW KEYS?
|
|
JZ K17E ; NO, JUMP
|
|
OR KB_FLAG_3,AH ; SET BITS FOR RIGHT CTRL, ALT
|
|
; JMP K26 ; INTERRUPT_RETURN
|
|
jmp short K17G ; (YST)
|
|
|
|
K17E: SHR AH,CL ; MOVE FLAG BITS TWO POSITIONS
|
|
OR KB_FLAG_1,AH ; SET BITS FOR LEFT CTRL, ALT
|
|
; JMP K26 ; INTERRUPT RETURN
|
|
jmp short K17G ; (YST)
|
|
|
|
K17F:
|
|
TEST CS:SD.SPECIAL_FEATURES,TYPEWRITER_CAPS_LK
|
|
JZ K17G ; N..all done
|
|
CMP COUNTRY_FLAG,0FFh ; ARE WE IN LANG MODE?
|
|
JNE K17G ; NO, ALL DONE WITH SHIFT KEY
|
|
|
|
;------ If keyboard is P12 then we still need to release caps_lk
|
|
|
|
TEST BP,PC_LAP ; IS THIS A P12 KEYBOARD?
|
|
JNZ REMOVE_CAPS_SHIFT
|
|
|
|
TEST BH,KBX ; THIS THE ENHANCED KEYBOARD?
|
|
JZ K17G ; NO, ALL DONE WITH SHIFT KEY
|
|
REMOVE_CAPS_SHIFT:
|
|
AND KB_FLAG,NOT CAPS_SHIFT ; YES, TAKE KB OUT OF C_L STATE
|
|
CALL SND_LED ; AND UPDATE THE LED INDICATORS
|
|
K17G:
|
|
|
|
|
|
; ===========================================
|
|
; Russian Keyboard (YST)
|
|
; ===========================================
|
|
CMP COUNTRY_FLAG,0FFh ; ARE WE IN FOREIGN LANG MODE? (YST)
|
|
JNE K17H ; NO, US MODE, RETURN (YST)
|
|
TEST CS:SD.SPECIAL_FEATURES,SHIFTS_TO_LOGIC; CAN OUR STATE (YST)
|
|
; LOGIC SUPPORT THIS CALL? (YST)
|
|
JZ K17H ; NO, RETURN (YST)
|
|
OR CS:FLAGS_TO_TEST[EXT_KB_FLAG_ID],SHIFTS_PRESSED; (YST)
|
|
; SET FLAG FOR STATE LOGIC (YST)
|
|
CALL KEYB_STATE_PROCESSOR ; ******** (YST)
|
|
AND CS:FLAGS_TO_TEST[EXT_KB_FLAG_ID],NOT SHIFTS_PRESSED; (YST)
|
|
; CLEAR FLAG AFTER USE (YST)
|
|
; ===========================================
|
|
; End of Russian Keyboard (YST)
|
|
; ===========================================
|
|
|
|
|
|
K17H: JMP K26 ; RETURN
|
|
|
|
;------ TOGGLED SHIFT KEY, TEST FOR 1ST MAKE OR NOT
|
|
|
|
K18: ; SHIFT-TOGGLE
|
|
TEST BL,CTL_SHIFT ; CHECK CTL SHIFT STATE
|
|
JZ K18A ; JUMP IF NOT CTL STATE
|
|
JMP K25 ; JUMP IF CTL STATE
|
|
K18A: CMP AL,INS_KEY ; CHECK FOR INSERT KEY
|
|
JNE K22 ; JUMP IF NOT INSERT KEY
|
|
TEST BL,ALT_SHIFT ; CHECK FOR ALTERNATE SHIFT
|
|
JZ K18B ; JUMP IF NOT ALTERNATE SHIFT
|
|
JMP K25 ; JUMP IF ALTERNATE SHIFT
|
|
K18B: TEST BH,LC_E0 ; IS THIS THE NEW INSERT KEY?
|
|
JNZ K22 ; YES, THIS ONE'S NEVER A "0"
|
|
K19: TEST BL,NUM_STATE ; CHECK FOR BASE STATE
|
|
JNZ K21 ; JUMP IF NUM LOCK IS ON
|
|
TEST BL,LEFT_SHIFT+RIGHT_SHIFT ; TEST FOR SHIFT STATE
|
|
JZ K22 ; JUMP IF BASE STATE
|
|
K20: MOV AH,AL ; PUT SCAN CODE BACK IN AH
|
|
JMP K25 ; NUMERAL "0", STNDRD. PROCESSING
|
|
|
|
K21: TEST BL,LEFT_SHIFT+RIGHT_SHIFT ; MIGHT BE NUMERIC
|
|
JZ K20 ; IS NUMERIC, STD. PROC.
|
|
|
|
K22: ; SHIFT TOGGLE KEY HIT; PROCESS IT
|
|
TEST AH, KB_FLAG_1 ; IS KEY ALREADY DEPRESSED?
|
|
JZ K22A
|
|
JMP K26 ; JUMP IF KEY ALREADY DEPRESSED
|
|
K22A: OR KB_FLAG_1,AH ; INDICATE THAT THE KEY IS DEPRESSED
|
|
XOR KB_FLAG,AH ; TOGGLE THE SHIFT STATE
|
|
|
|
TEST CS:SD.SPECIAL_FEATURES,TYPEWRITER_CAPS_LK
|
|
JZ K22C ; N..all done
|
|
|
|
;------ If keyboard is P12 then we do not toggle
|
|
|
|
TEST BP,PC_LAP ; IS THIS A P12 KEYBOARD?
|
|
JNZ LAP_SO_DONT_TOGGLE
|
|
|
|
TEST BH,KBX ; THIS THE ENHANCED KEYBOARD?
|
|
JZ K22C ; NO, ALL DONE WITH TOGGLE KEYS
|
|
|
|
LAP_SO_DONT_TOGGLE:
|
|
CMP CS:COUNTRY_FLAG,0FFh ; ARE WE IN FOREIGN LANG MODE?
|
|
JNE K22C ; NO, NO SPECIAL STUFF FOR U.S.
|
|
TEST AH,CAPS_SHIFT ; IS IT THE CAPS_LOCK KEY?
|
|
JZ K22C ; NO, NOTHING ELSE TO DO
|
|
OR KB_FLAG,AH ; YES, SET CAPS_LOCK (NOT TOGGLE)
|
|
|
|
K22C:
|
|
|
|
;------ TOGGLE LED IF CAPS, NUM, OR SCROLL KEY DEPRESSED
|
|
|
|
TEST AH,CAPS_SHIFT+NUM_SHIFT+SCROLL_SHIFT ; SHIFT TOGGLE?
|
|
JZ K22B ; GO IF NOT
|
|
PUSH AX ; SAVE SCAN CODE AND SHIFT MASK
|
|
CALL SND_LED ; GO TURN MODE INDICATORS ON
|
|
POP AX ; RESTORE SCAN CODE
|
|
|
|
K22B: CMP AL,INS_KEY ; TEST FOR 1ST MAKE OF INSERT KEY
|
|
JNE K26 ; JUMP IF NOT INSERT KEY
|
|
MOV AH,AL ; SCAN CODE IN BOTH HALVES OF AX
|
|
JMP K28 ; FLAGS UPDATED, PROC. FOR BUFFER
|
|
|
|
;------ BREAK SHIFT FOUND
|
|
|
|
K23: ; BREAK-SHIFT-FOUND
|
|
CMP AH,SCROLL_SHIFT ; IS THIS A TOGGLE KEY?
|
|
NOT AH ; INVERT MASK
|
|
JAE K24 ; YES, HANDLE BREAK TOGGLE
|
|
AND KB_FLAG,AH ; TURN OFF SHIFT BIT
|
|
CMP AH,NOT CTL_SHIFT ; IS THIS ALT OR CTL?
|
|
JA K23D ; NO, ALL DONE
|
|
|
|
TEST BH,LC_E0 ; 2ND ALT OR CTL?
|
|
JZ K23A ; NO, HANDLE NORMALLY
|
|
AND KB_FLAG_3,AH ; RESET BIT FOR RIGHT ALT OR CTL
|
|
JMP SHORT K23B ; CONTINUE
|
|
K23A: SAR AH,CL ; MOVE THE MASK BIT TWO POSITIONS
|
|
AND KB_FLAG_1,AH ; RESET BIT FOR LEFT ALT OR CTL
|
|
K23B: MOV AH,AL ; SAVE SCAN CODE
|
|
MOV AL, KB_FLAG_3 ; GET RIGHT ALT & CTRL FLAGS
|
|
CMP COUNTRY_FLAG,0FFH ; ARE WE IN LANGUAGE MODE?
|
|
JNE K23C ; NO, LEAVE RIGHT FLAGS AS IS
|
|
;**CNS
|
|
AND AL,NOT GRAPH_ON ; YES, FILTER OUT THE ALT_GR KEY
|
|
;**CNS
|
|
K23C: SHR AL,CL ; MOVE TO BITS 1 & 0
|
|
OR AL, KB_FLAG_1 ; PUT IN LEFT ALT & CTL FLAGS
|
|
SHL AL,CL ; MOVE BACK TO BITS 3 & 2
|
|
AND AL,ALT_SHIFT+CTL_SHIFT ; FILTER OUT OTHER GARBAGE
|
|
OR KB_FLAG,AL ; PUT RESULT IN THE REAL FLAGS
|
|
MOV AL,AH ; RECOVER SAVED SCAN CODE
|
|
|
|
K23D: CMP AL,ALT_KEY+80H ; IS THIS ALTERNATE SHIFT RELEASE
|
|
JNE K26 ; INTERRUPT_RETURN
|
|
|
|
;------ ALTERNATE SHIFT KEY RELEASED, GET THE VALUE INTO BUFFER
|
|
|
|
MOV AL, ALT_INPUT
|
|
xor ah,ah ; scan code of 0
|
|
MOV ALT_INPUT,AH ; ZERO OUT THE FIELD
|
|
or al,al ; was the input = 0?
|
|
JE K26 ; INTERRUPT_RETURN
|
|
CALL BUFFER_FILL_ANY_CHAR ; Put in buffer, but use this
|
|
; entry point to avoid trashing
|
|
; an ASCII code of 255
|
|
JMP SHORT K26 ; INTERRUPT_RETURN
|
|
|
|
K24: ; BREAK-TOGGLE
|
|
AND KB_FLAG_1,AH ; INDICATE NO LONGER DEPRESSED
|
|
JMP SHORT K26 ; INTERRUPT_RETURN
|
|
|
|
;------ TEST FOR HOLD STATE
|
|
; AL, AH = SCAN CODE
|
|
K25: ; NO-SHIFT-FOUND
|
|
CMP AL,80H ; TEST FOR BREAK KEY
|
|
JAE K26 ; NOTHING FOR BREAK CHARS FROM HERE ON
|
|
TEST KB_FLAG_1,HOLD_STATE ; ARE WE IN HOLD STATE
|
|
JZ K28 ; BRANCH AROUND TEST IF NOT
|
|
CMP AL,NUM_KEY
|
|
JE K26 ; CAN'T END HOLD ON NUM_LOCK
|
|
AND KB_FLAG_1,NOT HOLD_STATE ; TURN OFF THE HOLD STATE BIT
|
|
|
|
K26:
|
|
AND KB_FLAG_3,NOT LC_E0+LC_E1 ; RESET LAST CHAR H.C. FLAG
|
|
|
|
K26A: ; INTERRUPT-RETURN
|
|
ifdef NOT_NTVDM
|
|
;; NTVDM CLI ; TURN OFF INTERRUPTS
|
|
CALL ERROR_BEEP ; CHECK FOR ERROR BEEP PENDING
|
|
|
|
CMP CS:BUFFER_ENTRY_OK,YES ; HAS A CHARACTER BEEN PLACED IN BUFFER
|
|
JNE K27 ; NO, SKIP POST
|
|
|
|
MOV byte ptr CS:BUFFER_ENTRY_OK,NO ; CLEAR POST CHARACTER IN BUFFER FLAG
|
|
MOV AX,09102H ; MOVE IN POST CODE & TYPE
|
|
INT 15H ; PERFORM OTHER FUNCTION
|
|
K27:
|
|
MOV AL,ENA_KBD ; ENSURE KEYBOARD IS ENABLED (AT PS/2)
|
|
CALL SHIP_IT ; EXECUTE ENABLE
|
|
else
|
|
|
|
mov ah, 2
|
|
mov bh, CS:BEEP_PENDING
|
|
mov bl, CS:BUFFER_ENTRY_OK
|
|
MOV byte ptr CS:BUFFER_ENTRY_OK,NO
|
|
MOV byte ptr CS:BEEP_PENDING,NO
|
|
BOP 09h
|
|
endif
|
|
|
|
|
|
K27A: ;; NTVDM CLI ; DISABLE INTERRUPTS
|
|
POP ES ; RESTORE REGISTERS
|
|
POP DS ; *
|
|
POP DI ; *
|
|
POP SI ; *
|
|
POP DX ; *
|
|
POP CX ; *
|
|
POP BX ; *
|
|
POP AX ; *
|
|
POP BP ; *
|
|
|
|
jmp DOIRET ; RETURN
|
|
PAGE
|
|
;------ NOT IN HOLD STATE
|
|
; AL, AH = SCAN CODE (ALL MAKES)
|
|
K28: ; NO-HOLD-STATE
|
|
CMP AL,H_LAST_SCAN ; TEST FOR OUT-OF-RANGE SCAN CODES
|
|
JA SHORT K26 ; IGNORE IF OUT-OF-RANGE
|
|
ifndef JAPAN
|
|
TEST BP,EXT_122 ; IS EXTENDED 122 KEYBOARD SUPPORT OK
|
|
else ; JAPAN
|
|
; Must pass 07Eh and 07Fh DBCS pseudo's;AN013
|
|
; IS DBCS KEYBOARD support code active ;AN013
|
|
TEST BP,EXT_122+DBCS_OK ; or EXTENDED 122 KEYBOARD support OK ;AN013
|
|
endif ; JAPAN
|
|
JNZ K28_122 ; SKIP NON-122 OUT-OF-RANGE CHECK
|
|
|
|
ifdef NOT_NTVDM
|
|
CMP AL,88 ; TEST FOR OUT-OF-RANGE SCAN CODES
|
|
else
|
|
CMP AL,7Eh ; MAX SCANCODE ON BRAZILIAN ABNT KBD
|
|
endif
|
|
JA K26 ; IGNORE IF OUT-OF-RANGE
|
|
|
|
K28_122:
|
|
TEST BL,ALT_SHIFT ; ARE WE IN ALTERNATE SHIFT?
|
|
JZ K28A ; JUMP IF NOT ALTERNATE
|
|
|
|
TEST BH,KBX ; IS THIS THE ENHANCED KEYBOARD?
|
|
JZ K29 ; NO, ALT STATE IS REAL
|
|
|
|
TEST KB_FLAG_1,SYS_SHIFT ; YES, IS SYSREQ KEY DOWN?
|
|
JZ K29 ; NO, ALT STATE IS REAL
|
|
;**CNS
|
|
TEST AH,LC_E0 ; IS IT THE ALT_GR KEY?
|
|
JZ K28A ; YES, DON'T SET KB_FLAG
|
|
|
|
TEST AL,R_ALT_SHIFT ; TURN ON SHIFT BIT
|
|
JNZ K29 ; TURN ON SHIFT BIT
|
|
;**CNS
|
|
|
|
K28A: JMP K38 ; YES, THIS IS PHONY ALT STATE
|
|
; DUE TO PRESSING SYSREQ
|
|
|
|
;------ TEST FOR RESET KEY SEQUENCE (CTL ALT DEL) OR HOT KEY DEPRESSED
|
|
|
|
K29: ; TEST-RESET
|
|
TEST BL,CTL_SHIFT ; ARE WE IN CONTROL SHIFT ALSO?
|
|
ifndef JAPAN
|
|
JZ K31 ; NO_RESET
|
|
else ; JAPAN
|
|
JZ K31C ; NO_RESET, Not in Ctrl state
|
|
endif ; JAPAN
|
|
CMP AL,DEL_KEY ; SHIFT STATE IS THERE, TEST KEY
|
|
JNE K31A ; NO_RESET, TRANSLATE TABLE SWAP
|
|
|
|
;------ CTL-ALT-DEL HAS BEEN FOUND, DO I/O CLEANUP
|
|
|
|
MOV RESET_FLAG,1234H ; SET FLAG FOR RESET FUNCTION
|
|
AND WORD PTR KB_FLAG_3,KBX ; CLEAR ALL FLAG BITS EXCEPT KBX PED 6-25-86
|
|
JMP RESET ; JUMP TO POWER ON DIAGNOSTICS
|
|
|
|
ifdef JAPAN
|
|
;------ SET COUNTRY FLAG TO INDICATE WHICH TABLE WE'RE USING, FOREIGN OR DOMESTIC
|
|
|
|
K31A: CMP AL,CS:SD.HOT_KEY_ON_SCAN ; TEST FOR HOT KEY TO US
|
|
JNE K31B
|
|
MOV CS:COUNTRY_FLAG,00 ; SET FLAG FOR DOMESTIC KEY'S
|
|
JMP K26 ; INTERRUPT RETURN
|
|
|
|
K31B: CMP AL,CS:SD.HOT_KEY_OFF_SCAN ; TEST FOR HOT KEY TO FOREIGN
|
|
JNE K31C ; IF NOT TEST FOR FRONT ENGRAV
|
|
MOV CS:COUNTRY_FLAG,0FFH ; SET FLAGS FOR FOREIGN KEY'S
|
|
JMP K26 ; INTERRUPT RETURN
|
|
|
|
|
|
;------ ALT STATE, OR CTRL AND ALT DOWN BUT NO HOT KEY F1/F2 OR DEL KEY ;AN014
|
|
|
|
K31C: CMP CS:COUNTRY_FLAG,0FFH ; Check for country translate flag set ;AN014
|
|
JNE K31 ; Else try ALT_KEY_PAD special cases ;AN014
|
|
|
|
CALL KEYB_STATE_PROCESSOR ; Let NLS handle it's differences ;AN014
|
|
JC K32A ;K26 ; TRANSLATIONS FOUND - EXIT
|
|
endif ; JAPAN
|
|
|
|
;------ IN ALTERNATE SHIFT, RESET NOT FOUND
|
|
|
|
K31: ; NO-RESET
|
|
CALL KEYB_STATE_PROCESSOR
|
|
ifndef JAPAN
|
|
JC K26 ; TRANSLATIONS FOUND - EXIT
|
|
else ; JAPAN
|
|
JNC K310
|
|
JMP K26 ; TRANSLATIONS FOUND - EXIT
|
|
K310:
|
|
endif ; JAPAN
|
|
|
|
CMP AL,57 ; TEST FOR SPACE KEY
|
|
JNE K311 ; NOT THERE
|
|
MOV AL,' ' ; SET SPACE CHAR
|
|
JMP K57 ; BUFFER_FILL
|
|
K311:
|
|
TEST BP,EXT_16 ; IS EXTENDED INT 16 LOADED?
|
|
JZ K32 ; NO, SKIP THIS EXTENDED STUFF
|
|
CMP AL,15 ; TEST FOR TAB KEY
|
|
JNE K312 ; NOT THERE
|
|
MOV AX,0A500h ; SET SPECIAL CODE FOR ALT-TAB
|
|
JMP K57 ; BUFFER_FILL
|
|
K312:
|
|
CMP AL,74 ; TEST FOR KEYPAD -
|
|
JE K312A ; GO PROCESS
|
|
CMP AL,78 ; TEST FOR KEYPAD +
|
|
JNE K32 ; SKIP TEST FOR LANG SWAP & CONT.
|
|
K312A: JMP K37B ; GO PROCESS
|
|
|
|
ifndef JAPAN
|
|
;------ SET COUNTRY FLAG TO INDICATE WHICH TABLE WE'RE USING, FOREIGN OR DOMESTIC
|
|
|
|
K31A: CMP AL,CS:SD.HOT_KEY_ON_SCAN ; TEST FOR HOT KEY TO US
|
|
JNE K31B
|
|
MOV CS:COUNTRY_FLAG,00 ; SET FLAG FOR DOMESTIC KEY'S
|
|
JMP K26 ; INTERRUPT RETURN
|
|
|
|
K31B: CMP AL,CS:SD.HOT_KEY_OFF_SCAN ; TEST FOR HOT KEY TO FOREIGN
|
|
JNE K31C ; IF NOT TEST FOR FRONT ENGRAV
|
|
MOV CS:COUNTRY_FLAG,0FFH ; SET FLAGS FOR FOREIGN KEY'S
|
|
JMP K26 ; INTERRUPT RETURN
|
|
|
|
|
|
;------ ALT, CTRL DOWN ; NO HOT KEY
|
|
|
|
K31C: CMP CS:COUNTRY_FLAG,0FFH
|
|
JNE K32 ; TRY ALT_KEY_PAD
|
|
CALL KEYB_STATE_PROCESSOR
|
|
JC K32A ;K26 ; TRANSLATIONS FOUND - EXIT
|
|
endif ; !JAPAN
|
|
|
|
;------ LOOK FOR KEY PAD ENTRY
|
|
|
|
K32: ; ALT-KEY-PAD
|
|
MOV DI,OFFSET K30 ; ALT-INPUT-TABLE
|
|
MOV CX,10 ; LOOK FOR ENTRY USING KEYPAD
|
|
REPNE SCASB ; LOOK FOR MATCH
|
|
JNE K33 ; NO_ALT_KEYPAD
|
|
TEST BH,LC_E0 ; IS THIS ONE OF THE NEW KEYS?
|
|
JNZ K37C ; YES, JUMP, NOT NUMPAD KEY
|
|
SUB DI,OFFSET K30+1 ; DI NOW HAS ENTRY VALUE
|
|
MOV AL, ALT_INPUT ; GET THE CURRENT BYTE
|
|
MOV AH,10 ; MULTIPLY BY 10
|
|
MUL AH
|
|
ADD AX,DI ; ADD IN THE LATEST ENTRY
|
|
MOV ALT_INPUT,AL ; STORE IT AWAY
|
|
K32A: JMP K26 ; THROW AWAY THAT KEYSTROKE
|
|
|
|
;------ LOOK FOR SUPERSHIFT ENTRY
|
|
|
|
K33: ; NO-ALT-KEYPAD
|
|
MOV ALT_INPUT,0 ; ZERO ANY PREVIOUS ENTRY INTO INPUT
|
|
; DI,ES ALREADY POINTING
|
|
MOV CX,K30_LEN ; NORMALLY 26, BUT 27 FOR FR, DUE
|
|
; TO THE ";" KEY BEING "M"
|
|
REPNE SCASB ; LOOK FOR MATCH IN ALPHABET
|
|
JE K37A ; MATCH FOUND, GO FILL THE BUFFER
|
|
|
|
;------ LOOK FOR TOP ROW OF ALTERNATE SHIFT
|
|
|
|
K34: ; ALT-TOP-ROW
|
|
CMP AL,2 ; KEY WITH '1' ON IT
|
|
JB K37B ; MUST BE ESCAPE
|
|
CMP AL,13 ; IS IT IN THE REGION
|
|
JA K35 ; NO, ALT-SOMETHING ELSE
|
|
ADD AH,118 ; CONVERT PSEUDO SCAN CODE TO RANGE
|
|
JMP SHORT K37A ; GO FILL THE BUFFER
|
|
|
|
;------ TRANSLATE ALTERNATE SHIFT PSEUDO SCAN CODES
|
|
|
|
K35: ; ALT-FUNCTION
|
|
CMP AL,F11_M ; IS IT F11 or GREATER ?
|
|
JB K35A ; NO, BRANCH
|
|
SUB AL,52h ; SET UP TO SEARCH ALT-FUNCTION-TABLE
|
|
MOV BX,OFFSET K30A ; BASE CASE TABLE
|
|
JMP K64 ; CONVERT TO PSEUDO SCAN
|
|
|
|
K35A: TEST BH,LC_E0 ; DO WE HAVE ONE OF THE NEW KEYS?
|
|
JZ K37 ; NO, JUMP
|
|
TEST BP,EXT_16 ; IS THE EXTENDED INT 16 LOADED?
|
|
JZ K37 ; NO, DO COMPATIBLE OUTPUT
|
|
CMP AL,28 ; TEST FOR KEYPAD ENTER
|
|
JNE K35B ; NOT THERE
|
|
MOV AX,0A600h ; SPECIAL CODE
|
|
JMP K57 ; BUFFER FILL
|
|
K35B: CMP AL,83 ; TEST FOR DELETE KEY
|
|
JE K37C ; HANDLE WITH OTHER EDIT KEYS
|
|
CMP AL,53 ; TEST FOR KEYPAD /
|
|
JNE K32A ; NOT THERE, NO OTHER E0 SPECIALS
|
|
MOV AX,0A400h ; SPECIAL CODE
|
|
JMP K57 ; BUFFER FILL
|
|
|
|
K37: CMP AL,59 ; TEST FOR FUNCTION KEYS (F1)
|
|
JB K37B ; NO FN, HANDLE W/OTHER EXTENDED
|
|
CMP AL,68 ; IN KEYPAD REGION?
|
|
; OR NUMLOCK, SCROLLOCK?
|
|
JA K32A ; IF SO, IGNORE
|
|
ADD AH,45 ; CONVERT TO PSEUDO SCAN CODE
|
|
|
|
K37A: xor al,al ; ASCII CODE OF ZERO
|
|
JMP K57 ; PUT IT IN THE BUFFER
|
|
|
|
K37B:
|
|
TEST BP,EXT_16 ; IS THE EXTENDED INT 16 LOADED?
|
|
JZ K32A ;K26 ; NO, IGNORE THIS ONE
|
|
MOV AL,0F0h ; USE SPECIAL ASCII CODE
|
|
JMP K57 ; PUT IT IN THE BUFFER
|
|
|
|
K37C:
|
|
TEST BP,EXT_16 ; IS THE EXTENDED INT 16 LOADED?
|
|
JZ K37A ; NO, DO COMPATIBLE OUTPUT
|
|
ADD AL,80 ; CONVERT SCAN CODE (EDIT KEYS)
|
|
MOV AH,AL ; (SCAN CODE NOT IN AH FOR INSERT)
|
|
JMP K37A ; PUT IT IN THE BUFFER
|
|
PAGE
|
|
;------ NOT IN ALTERNATE SHIFT
|
|
|
|
K38: ; NOT-ALT-SHIFT
|
|
; BL STILL HAS SHIFT FLAGS
|
|
TEST BL,CTL_SHIFT ; ARE WE IN CONTROL SHIFT?
|
|
JNZ K38A ; YES, START PROCESSING
|
|
JMP K44 ; NOT-CTL-SHIFT
|
|
|
|
;------ CONTROL SHIFT, TEST SPECIAL CHARACTERS
|
|
|
|
;------ TEST FOR BREAK
|
|
|
|
K38A: CMP AL,SCROLL_KEY ; TEST FOR BREAK
|
|
JNE K39 ; JUMP, NO-BREAK
|
|
TEST BP,PC_LAP ; IS THIS THE LAP COMPUTER?
|
|
JNZ K38B ; YES, THIS IS CTRL-BREAK
|
|
TEST BH,KBX ; IS THIS THE ENHANCED KEYBOARD?
|
|
JZ K38B ; NO, BREAK IS VALID
|
|
TEST BH,LC_E0 ; YES, WAS LAST CODE AN E0?
|
|
JZ K39 ; NO-BREAK, TEST FOR PAUSE
|
|
|
|
K38B:
|
|
;; NTVDM CLI ; Disable interrupts because EOI issued
|
|
MOV BX, BUFFER_HEAD ; RESET BUFFER TAIL TO BUFFER HEAD
|
|
MOV BUFFER_TAIL,BX
|
|
MOV BIOS_BREAK,80H ; TURN ON BIOS_BREAK BIT
|
|
|
|
;-------- ENABLE KEYBOARD
|
|
|
|
ifdef NOT_NTVDM
|
|
MOV AL,ENA_KBD ; ENABLE KEYBOARD
|
|
CALL SHIP_IT ; EXECUTE ENABLE
|
|
else
|
|
mov ah, 4
|
|
BOP 09h
|
|
endif
|
|
INT 1BH ; BREAK INTERRUPT VECTOR
|
|
SUB AX,AX ; PUT OUT DUMMY CHARACTER
|
|
JMP K57 ; BUFFER_FILL
|
|
|
|
;-------- TEST FOR PAUSE
|
|
|
|
K39: ; NO-BREAK
|
|
CMP AL,NUM_KEY ; LOOK FOR PAUSE KEY
|
|
JNE K41 ; NO-PAUSE
|
|
TEST BH,KBX ; IS THIS THE ENHANCED KEYBOARD?
|
|
JZ K39P ; NO, THIS IS A VALID PAUSE
|
|
TEST BP,PC_LAP ; IS THIS THE LAP COMPUTER?
|
|
JZ K41 ; NO, IT'S NOT PAUSE THIS TIME
|
|
K39P: OR KB_FLAG_1,HOLD_STATE ; TURN ON THE HOLD FLAG
|
|
|
|
;-------- ENABLE KEYBOARD
|
|
|
|
MOV AL,ENA_KBD ; ENABLE KEYBOARD
|
|
CALL SHIP_IT ; EXECUTE ENABLE
|
|
|
|
ifdef NOT_NTVDM
|
|
|
|
;------ DURING PAUSE INTERVAL, TURN CRT BACK ON
|
|
|
|
CMP CRT_MODE,7 ; IS THIS BLACK AND WHITE CARD
|
|
JAE K40 ; YES, NOT CGA MODES NOTHING TO DO
|
|
MOV DX,03D8H ; PORT FOR COLOR CARD
|
|
MOV AL,CRT_MODE_SET ; GET THE VALUE OF THE CURRENT MODE
|
|
OUT DX,AL ; SET THE CRT MODE, SO THAT CRT IS ON
|
|
K40: ; PAUSE-LOOP
|
|
TEST BP,PC_LAP ; IS THIS THE LAP COMPUTER?
|
|
JZ K40A ; NO, SKIP THE BATTERY LIFE STUFF
|
|
MOV AX,4104H ; FUNCTION 41, AL=04=RETURN IF 0
|
|
MOV BX,HOLD_STATE*100H ; BH=HOLD_STATE, BL=0=NO TIME OUT
|
|
PUSH DS ; MAKE ES:DI POINT TO KB_FLAG_1
|
|
POP ES
|
|
MOV DI,OFFSET KB_FLAG_1
|
|
INT 15H ; SLEEP UNTIL OUT OF HOLD
|
|
|
|
;------ CHECK FOR AUX ADAPTER INPUT PENDING
|
|
K40A:
|
|
MOV CX,100 ; COUNT FOR WAIT LOOP
|
|
else
|
|
mov ah, 3 ; K27A exit notify
|
|
BOP 09h
|
|
call DOSTI
|
|
K40A:
|
|
mov cx, 16
|
|
xor ax, ax
|
|
BOP BOP_WAITIFIDLE ; idle bop
|
|
endif
|
|
K40B:
|
|
TEST KB_FLAG_1,HOLD_STATE ; ARE WE IN HOLD STATE
|
|
JZ K40E ; EXIT IF NOT
|
|
|
|
ifdef NOT_NTVDM
|
|
TEST BP,PC_XT+PC_LAP ; Check for systems without AUX BIOS
|
|
JNZ K40B ; For them, just loop on hold flag
|
|
|
|
IN AL,STATUS_PORT ; READ CURRENT STATUS
|
|
AND AL,MOUSE_OBF+OUT_BUF_FULL ; MASK OFF ALL BUT MOUSE DATA BITS
|
|
CMP AL,MOUSE_OBF+OUT_BUF_FULL ; IS THERE STILL MOUSE DATA PENDING?
|
|
endif
|
|
LOOPE K40B ; WAIT FOR MOUSE DATA TO GO
|
|
JNE K40A ; CONTINUE IF PAUSE STATE ;an005
|
|
K40E:
|
|
ifndef NOT_NTVDM
|
|
call DOCLI
|
|
endif
|
|
AND KB_FLAG_1,NOT HOLD_STATE ; CLEAR HOLD STATE FLAG
|
|
JMP K27A ; INTERRUPT_RETURN_NO_EOI PTR 2247
|
|
|
|
;------ TEST SPECIAL CASE KEY 55
|
|
|
|
K41: ; NO-PAUSE
|
|
CMP AL,55 ; TEST FOR */PRTSC KEY
|
|
JNE K42 ; NOT-KEY-55
|
|
TEST BP,PC_LAP ; IS THIS THE LAP COMPUTER?
|
|
JZ K41B ; NO, JUMP
|
|
TEST BH,LC_E0 ; YES, WAS LAST CODE AN E0?
|
|
JZ K41A ; NO, THIS IS THE PRTSC KEY
|
|
JMP SHORT K42B ; YES, E0 MEANS THE "*" KEY
|
|
|
|
K41B: TEST BH,KBX ; IS THIS THE ENHANCED KEYBOARD?
|
|
JZ K41A ; NO, CTL-PRTSC IS VALID
|
|
TEST BH,LC_E0 ; YES, WAS LAST CODE AN E0?
|
|
JZ K42B ; NO, TRANSLATE TO A FUNCTION
|
|
K41A: MOV AX,114*256 ; START/STOP PRINTING SWITCH
|
|
JMP K57 ; BUFFER_FILL
|
|
|
|
;------ SET UP TO TRANSLATE CONTROL SHIFT
|
|
|
|
K42: ; NOT-KEY-55
|
|
ifdef JAPAN
|
|
CMP CS:COUNTRY_FLAG,0FFH ; Check for country translate flag set
|
|
JNE K42US ; Skip overhead if not in country mode
|
|
endif ; JAPAN
|
|
CALL KEYB_STATE_PROCESSOR
|
|
JC K449 ;K26 ; TRANSLATIONS FOUND - EXIT
|
|
ifdef JAPAN
|
|
K42US:
|
|
endif ; JAPAN
|
|
CMP AL,15 ; IS IT THE TAB KEY?
|
|
JE K42B ; YES, XLATE TO FUNCTION CODE
|
|
CMP AL,53 ; IS IT THE / KEY?
|
|
JNE K42A ; NO, NO MORE SPECIAL CASES
|
|
TEST BH,LC_E0 ; YES, IS IT FROM THE KEYPAD?
|
|
JZ K42A ; NO, JUST TRANSLATE
|
|
MOV AX,9500h ; YES, SPECIAL CODE FOR THIS ONE
|
|
JMP K57 ; BUFFER FILL
|
|
|
|
K42A: MOV BX,OFFSET K8 ; SET UP TO TRANSLATE CTL
|
|
CMP AL,59 ; IS IT IN CHARACTER TABLE?
|
|
JB K45F ; YES, GO TRANSLATE CHAR
|
|
K42B: MOV BX,OFFSET K8 ; SET UP TO TRANSLATE CTL
|
|
JMP K64 ; NO, GO TRANSLATE_SCAN
|
|
PAGE
|
|
;------ NOT IN CONTROL SHIFT
|
|
|
|
K44:
|
|
ifdef JAPAN
|
|
CMP CS:COUNTRY_FLAG,0FFH ; Check for country translate flag set
|
|
JNE K44US ; Skip overhead if not in country mode
|
|
endif ;JAPAN
|
|
CALL KEYB_STATE_PROCESSOR
|
|
JC K449 ;K26 ; TRANSLATIONS FOUND - EXIT
|
|
ifdef JAPAN
|
|
K44US:
|
|
endif ; JAPAN
|
|
CMP AL,55 ; PRINT SCREEN KEY?
|
|
JNE K45 ; NOT-PRINT-SCREEN
|
|
TEST BP,PC_LAP ; IS THIS THE LAP COMPUTER?
|
|
JZ K441 ; NO, JUMP
|
|
TEST BH,LC_E0 ; YES, WAS LAST CODE THE MARKER?
|
|
JZ K44A ; NO, TEST THE SHIFT STATE
|
|
JMP SHORT K45C ; YES, XLATE TO "*" CHAR
|
|
K441: TEST BH,KBX ; IS THIS ENHANCED KEYBOARD?
|
|
JZ K44A ; NO, TEST FOR SHIFT STATE
|
|
TEST BH,LC_E0 ; YES, LAST CODE A MARKER?
|
|
JNZ K44B ; YES, IS PRINT SCREEN
|
|
JMP SHORT K45C ; NO, XLATE TO "*" CHARACTER
|
|
K44A: TEST BL,LEFT_SHIFT+RIGHT_SHIFT ;NOT 101 KBD, SHIFT KEY DOWN?
|
|
JZ K45C ; NO, XLATE TO "*" CHARACTER
|
|
|
|
;------ ISSUE INTERRUPT TO PERFORM PRINT SCREEN FUNCTION
|
|
K44B:
|
|
;; NTVDM CLI ; DISABLE INTERRUPTS PTR 2355
|
|
AND KB_FLAG_3,NOT LC_E0+LC_E1 ;ZERO OUT THESE FLAGS
|
|
|
|
ifdef NOT_NTVDM
|
|
MOV AL,ENA_KBD ; INSURE KEYBOARD IS ENABLED
|
|
CALL SHIP_IT ; EXECUTE ENABLE
|
|
else
|
|
mov ah, 3 ; K27A exit notify
|
|
BOP 09h
|
|
endif
|
|
PUSH BP ; SAVE POINTER (compatibility)
|
|
INT 5H ; ISSUE PRINT SCREEN INTERRUPT
|
|
POP BP ; RESTORE POINTER
|
|
JMP K27A ; EXIT WITHOUT EXTRA EOI OR ENABLE
|
|
|
|
K449:
|
|
JMP K26 ; EXIT
|
|
|
|
;------ HANDLE THE IN-CORE KEYS
|
|
K45: ; NOT-PRINT-SCREEN
|
|
CMP AL,58 ; TEST FOR IN-CORE AREA
|
|
JA K46 ; JUMP IF NOT
|
|
|
|
TEST BH,GRAPH_ON ; IS ALT GRAPHICS ON? AEV
|
|
JNZ K449 ;K26 ; YES, TRASH KEYSTROKE
|
|
|
|
CMP AL,53 ; IS THIS THE "/" KEY?
|
|
JNE K45A ; NO, JUMP
|
|
TEST BH,LC_E0 ; WAS LAST CODE THE MARKER?
|
|
JNZ K45C ; YES, TRANSLATE TO CHARACTER
|
|
|
|
K45A: MOV CX,K30_LEN ; LENGTH OF SEARCH
|
|
MOV DI,OFFSET K30+10 ; POINT TO TABLE OF A-Z CHARS
|
|
REPNE SCASB ; IS THIS A LETTER KEY?
|
|
JNE K45B ; NO, SYMBOL KEY
|
|
|
|
TEST BL,CAPS_STATE ; ARE WE IN CAPS_LOCK?
|
|
JNZ K45D ; TEST FOR SURE
|
|
K45B: TEST BL,LEFT_SHIFT+RIGHT_SHIFT ; ARE WE IN SHIFT STATE?
|
|
JNZ K45E ; YES, UPPERCASE
|
|
; NO, LOWERCASE
|
|
K45C: MOV BX,OFFSET K10 ; TRANSLATE TO LOWERCASE LETTERS
|
|
JMP SHORT K56
|
|
K45D: ; ALMOST-CAPS-STATE
|
|
TEST BL,LEFT_SHIFT+RIGHT_SHIFT ; CL ON. IS SHIFT ON, TOO?
|
|
JNZ K45C ; SHIFTED TEMP OUT OF CAPS STATE
|
|
K45E: MOV BX,OFFSET K11 ; TRANSLATE TO UPPERCASE LETTERS
|
|
K45F: JMP SHORT K56
|
|
|
|
|
|
;------ TEST FOR KEYS F1 - F10
|
|
K46: ; NOT IN-CORE AREA
|
|
CMP AL,68 ; TEST FOR F1 - F10
|
|
JA K47 ; JUMP IF NOT
|
|
JMP SHORT K53A ; YES, GO DO FN KEY PROCESS
|
|
|
|
|
|
;------ HANDLE THE NUMERIC PAD KEYS
|
|
|
|
K47: ; NOT F1 - F10
|
|
CMP AL,83 ; TEST FOR NUMPAD KEYS
|
|
JA K52 ; JUMP IF NOT
|
|
|
|
;------ KEYPAD KEYS, MUST TEST NUM LOCK FOR DETERMINATION
|
|
K48: CMP AL,74 ; SPECIAL CASE FOR MINUS
|
|
JE K45E ; GO TRANSLATE (US & WT ARE SAME)
|
|
CMP AL,78 ; SPECIAL CASE FOR PLUS
|
|
JE K45E ; GO TRANSLATE (US & WT ARE SAME)
|
|
TEST BH,LC_E0 ; IS THIS ONE OF THE NEW KEYS?
|
|
JNZ K49 ; YES, TRANSLATE TO BASE STATE
|
|
|
|
TEST BL,NUM_STATE ; ARE WE IN NUM_LOCK?
|
|
JNZ K50 ; TEST FOR SURE
|
|
TEST BL,LEFT_SHIFT+RIGHT_SHIFT ; ARE WE IN SHIFT STATE?
|
|
JNZ K51 ; IF SHIFTED, REALLY NUM STATE
|
|
|
|
;------ BASE CASE FOR KEYPAD
|
|
K49: CMP AL,76 ; SPECIAL CASE FOR BASE STATE 5
|
|
JNE K49A ; CONTINUE IF NOT KEYPAD 5
|
|
TEST BP,EXT_16 ; IS THE EXTENDED INT 16 LOADED?
|
|
JZ K59 ;K26 ; NO, INGORE
|
|
|
|
MOV AL,0F0h ; SPECIAL ASCII CODE
|
|
JMP SHORT K57 ; BUFFER FILL
|
|
K49A: MOV BX,OFFSET K10 ; BASE CASE TABLE
|
|
JMP SHORT K64 ; CONVERT TO PSEUDO SCAN
|
|
|
|
;------ MIGHT BE NUM LOCK, TEST SHIFT STATUS
|
|
K50: TEST BL,LEFT_SHIFT+RIGHT_SHIFT ;ALMOST-NUM-STATE
|
|
JNZ K49 ; SHIFTED TEMP OUT OF NUM STATE
|
|
K51: JMP SHORT K45E ; REALLY_NUM_STATE
|
|
; (US & WT ARE SAME)
|
|
|
|
;------ TEST FOR THE NEW KEY ON WT KEYBOARDS
|
|
|
|
K52: ; NOT A NUMPAD KEY
|
|
CMP AL,86 ; IS IT THE NEW WT KEY?
|
|
JNE K53 ; JUMP IF NOT
|
|
MOV AL,58 ; WE'RE GOING TO PULL A SNEAKY
|
|
JMP K45 ; TRICK HERE. WT TABLES ARE TOO SHORT TO
|
|
; XLATE 86, SO WE'LL CHANGE IT TO CAPS_LOCK
|
|
; AND PUT THE CHAR IN THE TABLES IN THE C_L
|
|
; POSITION, SINCE C_L SCAN CODES NEVER GET
|
|
; HERE ANYWAY.
|
|
|
|
;------ MUST BE F11 OR F12
|
|
|
|
K53: TEST BP,EXT_16 ; IS THE EXTENDED INT 16 THERE?
|
|
JZ K59 ; NO, INGORE F11 & F12 (NEAR RET)
|
|
; F1 - F10 COME HERE, TOO
|
|
K53A: TEST BL,LEFT_SHIFT+RIGHT_SHIFT ;TEST SHIFT STATE
|
|
JZ K49 ; JUMP, LOWERCASE PSEUDO SC'S
|
|
|
|
MOV BX,OFFSET K11 ; UPPER CASE PSEUDO SCAN CODES
|
|
JMP SHORT K64 ; TRANSLATE_SCAN
|
|
PAGE
|
|
;------ TRANSLATE THE CHARACTER
|
|
|
|
K56: ; TRANSLATE-CHAR
|
|
DEC AL ; CONVERT ORIGIN
|
|
XLAT CS:K11 ; CONVERT THE SCAN CODE TO ASCII
|
|
TEST KB_FLAG_3,LC_E0 ; IS THIS A NEW KEY?
|
|
JZ K57 ; NO, GO FILL BUFFER
|
|
TEST BP,EXT_16 ; IS THE EXTENDED INT 16 THERE?
|
|
JZ K57 ; NO, DO COMPATIBLE OUTPUT
|
|
MOV AH,MC_E0 ; YES, PUT SPECIAL MARKER IN AH
|
|
JMP SHORT K57 ; PUT IT INTO THE BUFFER
|
|
|
|
;------ TRANSLATE SCAN FOR PSEUDO SCAN CODES
|
|
|
|
K64: ; TRANSLATE-SCAN-ORGD
|
|
DEC AL ; CONVERT ORIGIN
|
|
XLAT CS:K8 ; CTL TABLE SCAN
|
|
MOV AH,AL ; PUT VALUE INTO AH
|
|
xor al,al ; ZERO ASCII CODE
|
|
TEST KB_FLAG_3,LC_E0 ; IS THIS A NEW KEY?
|
|
JZ K57 ; NO, GO FILL BUFFER
|
|
TEST BP,EXT_16 ; IS THE EXTENDED INT 16 THERE?
|
|
JZ K57 ; NO, DO COMPATIBLE OUTPUT
|
|
MOV AL,MC_E0 ; YES, PUT SPECIAL MARKER IN AL
|
|
|
|
;------ PUT CHARACTER INTO BUFFER
|
|
|
|
K57: ; BUFFER-FILL
|
|
ifdef JAPAN
|
|
CMP AH,0E0h ; Was this the Ctrl-Enter key? DCR 1815;AN013
|
|
JE Short K57N122 ; Do not add 122 key marker DCR 1815;AN013
|
|
CMP AH,S_XKBD_SCAN ; Is it non 122-keyboard key? DCR 1815;AN013
|
|
JBE Short K57N122 ; Yes, skip add of 122 marker DCR 1815;AN013
|
|
CMP CS:S_122_MARKER,0 ; Check special INT 16h case flag ;AN013
|
|
JE K57N122 ; Skip F8 marker, if INT 16h broken ;AN013
|
|
MOV AL,S_122_MARK ; Add special marker F8 if 122 DCR 1815;AN013
|
|
K57N122: ;AN013
|
|
endif ; JAPAN
|
|
CALL BUFFER_FILL
|
|
K59:
|
|
JMP K26 ;-- THAT'S ALL FOLKS --
|
|
|
|
KEYB_INT_9 ENDP
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;
|
|
; Procedure: BUFFER_FILL
|
|
;
|
|
; Description:
|
|
; Generate keyboard buffer entry
|
|
;
|
|
; Input Registers:
|
|
; AX - the buffer entry
|
|
; DS - BIOS data segment
|
|
;
|
|
; Output Registers:
|
|
; None
|
|
;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
BUFFER_ENTRY_OK DB NO ; YES if character put into buffer
|
|
|
|
BUFFER_FILL PROC NEAR
|
|
|
|
; CMP AL,-1 ; IS THIS AN IGNORE CHAR
|
|
; JE K61B ; YES, EXIT (commented YST)
|
|
CMP AH,-1 ; LOOK FOR -1 PSEUDO SCAN
|
|
JE K61B ; EXIT
|
|
;
|
|
; BUFFER_FILL_ANY_CHAR is an alternate entry point to this PROC.
|
|
; Entry at this point will avoid trashing ASCII values of 255.
|
|
;
|
|
BUFFER_FILL_ANY_CHAR LABEL NEAR
|
|
|
|
PUSH SI
|
|
PUSH BX
|
|
PUSH DS ; This routine may be called
|
|
; externally so make sure DS points
|
|
MOV BX,DATA ; to BIOS data
|
|
MOV DS,BX
|
|
|
|
;; NTVDM cli ; disable interrupts P724
|
|
MOV BX, BUFFER_TAIL ; GET THE END POINTER TO THE BUFFER
|
|
MOV SI,BX ; SAVE THE VALUE
|
|
INC BX ; MOVE TO NEXT WORD IN LIST
|
|
INC BX
|
|
|
|
;; VERIFY IF THE CURRENT ROM LEVEL IN THE SYSTEM IS FOR THE ORIGINAL PC1
|
|
|
|
TEST BP,PC_81 ; CHECK FOR '81 DATE FLAG SET
|
|
ifndef JAPAN
|
|
JNE NOT_PC1 ; IF IT'S A LATER ROM RELEASE, BRANCH
|
|
else ; JAPAN
|
|
JZ NOT_PC1 ; IF IT'S A LATER ROM RELEASE, BRANCH
|
|
endif ; JAPAN
|
|
|
|
CMP BX,OFFSET KB_BUFFER_END ; AT END OF BUFFER?
|
|
JNE K5 ; NO, CONTINUE
|
|
MOV BX,OFFSET KB_BUFFER ; YES, RESET TO BUFFER BEGINNING
|
|
JMP SHORT K5
|
|
NOT_PC1:
|
|
CMP BX, BUFFER_END ; AT END OF BUFFER?
|
|
JNE K5 ; NO, CONTINUE
|
|
MOV BX, BUFFER_START ; YES, RESET TO BUFFER BEGINNING
|
|
K5:
|
|
CMP BX,BUFFER_HEAD ; HAS THE BUFFER WRAPPED AROUND
|
|
JE K62 ; BUFFER_FULL_BEEP
|
|
MOV [SI],AX ; STORE THE VALUE
|
|
MOV BUFFER_TAIL,BX ; MOVE THE POINTER UP
|
|
MOV CS:BUFFER_ENTRY_OK,YES ; INDICATE WE PUT SOMETHING IN BUFFER
|
|
JMP SHORT K61A
|
|
K62:
|
|
MOV CS:BEEP_PENDING,YES ; INDICATE WE NEED A BEEP
|
|
K61A:
|
|
POP DS
|
|
POP BX
|
|
POP SI
|
|
;; NTVDM sti ; enable interrupts P724
|
|
K61B:
|
|
RET
|
|
BUFFER_FILL ENDP
|
|
|
|
PAGE
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;
|
|
; Procedure: ERROR_BEEP
|
|
;
|
|
; Description:
|
|
; General routine to generate beep tones
|
|
;
|
|
; Input Registers:
|
|
; None
|
|
;
|
|
; Output Registers:
|
|
; None
|
|
;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
|
|
ERROR_BEEP PROC NEAR
|
|
|
|
CMP CS:BEEP_PENDING,YES ; Q..SHOULD WE BEEP?
|
|
JNE NO_BEEP
|
|
|
|
MOV CS:BEEP_PENDING,NO ; Reset BEEP required
|
|
ifndef NOT_NTVDM
|
|
mov ah, 0eh
|
|
mov al, 07h
|
|
int 10h
|
|
|
|
else
|
|
MOV CX,216-32 ; NUMBER OF CYCLES FOR 1/8 SECOND TONE
|
|
IN AL,PORT_B ; Get control info
|
|
PUSH AX
|
|
LOOP01:
|
|
AND AL,0FCH ; Turn off timer gate and speaker
|
|
OUT PORT_B,AL ; output to control - speaker off
|
|
CALL WAITFB ; half cycle time for tone
|
|
OR AL,2 ; turn on speaker
|
|
CLI ; Disable interrupts for 1/2 cycle, 300u
|
|
OUT PORT_B,AL ; output to control
|
|
CALL WAITFB ; another half cycle
|
|
STI ; Enable interrupts between 1/2 cycle
|
|
LOOP LOOP01
|
|
|
|
POP AX
|
|
OUT PORT_B,AL ; Restore control
|
|
MOV CX,32*2 ; Short delay count of 32 cycles
|
|
LOOP02:
|
|
CALL WAITFB ; Add a short delay to complete 1/8 sec
|
|
LOOP LOOP02 ; Repeat
|
|
CLI ; Disable interrupts
|
|
endif
|
|
|
|
NO_BEEP:
|
|
RET ; RETURN
|
|
ERROR_BEEP ENDP
|
|
|
|
|
|
ifdef NOT_NTVDM
|
|
WAITFB PROC NEAR ; DELAY FOR (CX)*15.085737 US
|
|
PUSH AX ; SAVE WORK REGISTER (AH)
|
|
PUSH CX ; SAVE COUNT
|
|
MOV CX,19 ; The half cycle time for 1745 hz
|
|
TEST BP,PC_AT+PC_386 ; IF THE SYSTEM IS AN 80x86
|
|
JNZ WAITF1 ; SKIP TO REFRESH BIT DELAY
|
|
|
|
WAITF0:
|
|
NOP ; Force two fetch cycles on Model 30
|
|
LOOP WAITF0 ; SOFTWARE DELAY LOOP ON 808x MACHINES
|
|
|
|
JMP SHORT WAITFE ; EXIT
|
|
|
|
WAITF1: ; USE TIMER 1 OUTPUT BITS
|
|
IN AL,PORT_B ; READ CURRENT COUNTER OUTPUT STATUS
|
|
AND AL,REFRESH_BIT ; MASK FOR REFRESH DETERMINE BIT
|
|
CMP AL,AH ; DID IT JUST CHANGE
|
|
JE WAITF1 ; WAIT FOR A CHANGE IN OUTPUT LINE
|
|
|
|
MOV AH,AL ; SAVE NEW FLAG STATE
|
|
LOOP WAITF1 ; DECREMENT HALF CYCLES TILL COUNT END
|
|
WAITFE:
|
|
|
|
POP CX ; RESTORE COUNT
|
|
POP AX ; RESTORE (AH)
|
|
RET ; RETURN (CX)= 0
|
|
|
|
WAITFB ENDP
|
|
endif
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;
|
|
; SHIP_IT
|
|
;
|
|
; THIS ROUTINE HANDLES TRANSMISSION OF COMMAND AND DATA BYTES
|
|
; TO THE KEYBOARD CONTROLLER.
|
|
;
|
|
; On entry the AL contains the command byte.
|
|
; On Enable keyboard commands, the reset keyboard input latch is done
|
|
; if the system is the old PC type.
|
|
;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
SHIP_IT PROC NEAR
|
|
|
|
ifdef NOT_NTVDM
|
|
;------- TEST SYSTEM TYPE
|
|
PUSHF ; SAVE FLAGS P725
|
|
CLI ; DISABLE INTERRUPTS TILL DATA SENT
|
|
|
|
TEST BP,PC_XT+PC_LAP
|
|
JZ SI5 ; USE AT 8042 COMMAND IF NOT PC TYPE
|
|
|
|
CMP AL,ENA_KBD ; CHECK FOR ENABLE KEYBOARD COMMAND
|
|
JNE SI9 ; SKIP ENABLE RESET
|
|
; FOR PC, XT, P12: RESET THE KEYBOARD
|
|
PUSH AX ; SAVE AX
|
|
IN AL,KB_CTL ; GET THE CONTROL PORT
|
|
MOV AH,AL ; SAVE VALUE
|
|
OR AL,80H ; RESET BIT FOR KEYBOARD ON PC/PC-XT
|
|
OUT KB_CTL,AL
|
|
XCHG AH,AL ; GET BACK ORIGINAL CONTROL
|
|
OUT KB_CTL,AL ; KB HAS BEEN RESET
|
|
POP AX ; RESTORE AX
|
|
; EXIT as NOT next system
|
|
SI5:
|
|
TEST BP,PC_AT+PC_386 ; IF THE SYSTEM IS NOT AN 80x86
|
|
JZ SI9 ; MACHINE, EXIT THIS PROC.
|
|
|
|
;------- WAIT FOR COMMAND TO BE ACCEPTED;
|
|
|
|
CALL chk_ibf ; GO READ KEYBOARD CONTROLLER STATUS
|
|
endif
|
|
|
|
OUT STATUS_PORT,AL ; SEND TO KEYBOARD CONTROLLER
|
|
|
|
ifdef NOT_NTVDM
|
|
SI9: ; ENABLE INTERRUPTS AGAIN
|
|
POPF ; RESTORE FLAGS P725
|
|
endif
|
|
RET ; RETURN TO CALLER
|
|
SHIP_IT ENDP
|
|
|
|
ifdef NOT_NTVDM
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;
|
|
; SND_DATA
|
|
;
|
|
; THIS ROUTINE HANDLES TRANSMISSION OF COMMAND AND DATA BYTES
|
|
; TO THE KEYBOARD AND RECEIPT OF ACKNOWLEDGEMENTS. IT ALSO
|
|
; HANDLES ANY RETRIES IF REQUIRED
|
|
;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
SND_DATA PROC NEAR
|
|
PUSH AX ; SAVE REGISTERS
|
|
PUSH BX ; *
|
|
PUSH CX
|
|
MOV BH,AL ; SAVE TRANSMITTED BYTE FOR RETRIES
|
|
|
|
MOV BL,3 ; LOAD RETRY COUNT
|
|
SD0:
|
|
CLI ; DISABLE INTERRUPTS
|
|
AND KB_FLAG_2,NOT (KB_FE+KB_FA+kb_err) ; CLEAR ACK, RESEND and
|
|
; error flags
|
|
|
|
CALL CHK_IBF ; Wait for command accepted
|
|
|
|
MOV AL,BH ; REESTABLISH BYTE TO TRANSMIT
|
|
OUT PORT_A,AL ; SEND BYTE
|
|
STI ; ENABLE INTERRUPTS
|
|
MOV CX,DLY_15MS ; DELAY FOR 15 ms TIMEOUT
|
|
SD1: TEST KB_FLAG_2,KB_FE+KB_FA ; SEE IF EITHER BIT SET
|
|
JNZ SD3 ; IF SET, SOMETHING RECEIVED GO PROCESS
|
|
IN AL,PORT_B ; WAIT LOOP USING REFRESH BIT
|
|
AND AL,REFRESH_BIT
|
|
CMP AL,AH
|
|
JE SD1 ; KEEP TESTING
|
|
MOV AH,AL ; DEC CX ON REFRESH TIC
|
|
LOOP SD1 ; KEEP TESTING
|
|
; !! TIMEOUT !!
|
|
|
|
SD2: DEC BL ; DECREMENT RETRY COUNT
|
|
JNZ SD0 ; RETRY TRANSMISSION
|
|
OR KB_FLAG_2,KB_ERR ; TURN ON TRANSMIT ERROR FLAG
|
|
JMP SHORT SD4 ; RETRIES EXHAUSTED FORGET TRANSMISSION
|
|
|
|
SD3: TEST KB_FLAG_2,KB_FA ; SEE IF THIS IS AN ACKNOWLEDGE
|
|
JZ SD2 ; IF NOT, GO RESEND
|
|
|
|
SD4: POP CX ; RESTORE REGISTERS
|
|
POP BX
|
|
POP AX ; *
|
|
RET ; RETURN, GOOD TRANSMISSION
|
|
SND_DATA ENDP
|
|
endif
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;
|
|
; SND_LED
|
|
;
|
|
; THIS ROUTINE TURNS ON THE MODE INDICATORS.
|
|
;
|
|
; NTVDM - we do not need to update led's as this is controlled
|
|
; by the host\system. We also assume that interrupts are
|
|
; off upon entry
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
SND_LED PROC NEAR
|
|
ifdef NOT_NTVDM
|
|
CLI ; TURN OFF INTERRUPTS
|
|
|
|
TEST BP,PC_AT+PC_386 ; IF THE SYSTEM IS NOT A 80x86
|
|
JZ SL1 ; MACHINE, EXIT THIS PROC
|
|
endif
|
|
|
|
TEST KB_FLAG_2,KB_PR_LED ; CHECK FOR MODE INDICATOR UPDATE
|
|
JNZ SL1 ; DONT UPDATE AGAIN IF UPDATE UNDERWAY
|
|
OR KB_FLAG_2,KB_PR_LED ; TURN ON UPDATE IN PROCESS
|
|
ifdef NOT_NTVDM
|
|
MOV AL,LED_CMD ; LED CMD BYTE
|
|
CALL SND_DATA ; SEND DATA TO KEYBOARD
|
|
CLI
|
|
endif
|
|
CALL MAKE_LED ; GO FORM INDICATOR DATA BYTE
|
|
AND KB_FLAG_2,0F8H ; CLEAR MODE INDICATOR BITS
|
|
OR KB_FLAG_2,AL ; SAVE PRESENT INDICATORS FOR NEXT TIME
|
|
|
|
mov ah, 3 ; inform softpc to set lights
|
|
BOP 16h
|
|
|
|
|
|
ifdef NOT_NTVDM
|
|
TEST KB_FLAG_2,KB_ERR ; TRANSMIT ERROR DETECTED
|
|
JNZ SL2 ; YES, BYPASS SECOND BYTE TRANSMISSION
|
|
CALL SND_DATA ; SEND DATA TO KEYBOARD
|
|
CLI ; TURN OFF INTERRUPTS
|
|
TEST KB_FLAG_2,KB_ERR ; TRANSMIT ERROR DETECTED
|
|
JZ SL3 ; IF NOT, DONT SEND AN ENABLE COMMAND
|
|
SL2: MOV AL,KB_ENABLE ; GET KEYBOARD CSA ENABLE COMMAND
|
|
CALL SND_DATA ; SEND DATA TO KEYBOARD
|
|
CLI ; TURN OFF INTERRUPTS
|
|
endif
|
|
|
|
SL3: AND KB_FLAG_2,NOT(KB_PR_LED+KB_ERR) ; TURN OFF MODE INDICATOR
|
|
; UPDATE AND TRANSMIT ERROR FLAG
|
|
SL1:
|
|
ifdef NOT_NTVDM
|
|
STI ; ENABLE INTERRUPTS
|
|
endif
|
|
RET ; RETURN TO CALLER
|
|
SND_LED ENDP
|
|
PAGE
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;
|
|
; MAKE_LED
|
|
;
|
|
; THIS ROUTINE FORMS THE DATA BYTE NECESSARY TO TURN ON/OFF
|
|
; THE MODE INDICATORS
|
|
;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
MAKE_LED PROC NEAR
|
|
PUSH CX ; SAVE CX
|
|
MOV AL, KB_FLAG ; GET CAPS & NUM LOCK INDICATORS
|
|
AND AL,CAPS_STATE+NUM_STATE+SCROLL_STATE ; ISOLATE INDICATORS
|
|
MOV CL,4 ; SHIFT COUNT
|
|
ROL AL,CL ; SHIFT BITS OVER TO TURN ON INDICATORS
|
|
AND AL,07H ; MAKE SURE ONLY MODE BITS ON
|
|
POP CX
|
|
RET ; RETURN TO CALLER
|
|
MAKE_LED ENDP
|
|
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;
|
|
; CHK_IBF
|
|
;
|
|
; Description:
|
|
; Waits for a keyboard command to be accepted
|
|
; wait until ibf = 0 (empty)
|
|
;
|
|
; Input Registers:
|
|
; None
|
|
;
|
|
; Output Registers:
|
|
; ZF=0 time out & IBF still full
|
|
; ZF=1 IBF is empty
|
|
;
|
|
; ---------------------------------------------------------------
|
|
; This procedure replaces the previous one which used a software
|
|
; timing loop. (For 80286, 80386 and 80486 based machines.)
|
|
; ---------------------------------------------------------------
|
|
;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
chk_ibf proc near
|
|
|
|
push ax ; Save register used
|
|
push cx
|
|
mov cx,DLY_15MS ; Timeout 15 milleseconds (15000/15.086;
|
|
chk_ibfl:
|
|
ifdef JAPAN
|
|
in al,status_port ; Read status port
|
|
test al,inpt_buf_full ; Check for input buffer empty
|
|
jz chk_ibfe ; Exit if IBF off, no command pending
|
|
endif ; JAPAN
|
|
in al,PORT_B ; Read current refresh output bit
|
|
and al,refresh_bit ; Mask all but refresh bit
|
|
cmp al,ah ; Did it change? (or first pass thru)
|
|
jz short chk_ibfl ; No, wait for change, else continue
|
|
|
|
mov ah,al ; Save new refresh bit state
|
|
ifndef JAPAN
|
|
in al,status_port ; Read status port
|
|
test al,inpt_buf_full ; Check for input buffer empty
|
|
loopnz chk_ibfl ; Loop until input buf empty or timeout;
|
|
else ; JAPAN
|
|
loop chk_ibfl ; Loop until timeout
|
|
chk_ibfe: ; or exit when Input Buffer Full off
|
|
endif ; JAPAN
|
|
pop cx
|
|
pop ax ; Restore register used
|
|
ret ; Return to caller
|
|
|
|
chk_ibf endp
|
|
|
|
ifdef JAPAN
|
|
;***********************************************************************;JP9009
|
|
;* *;JP9009
|
|
;* DBCS Common Keyboard Support *;JP9009
|
|
;* *;JP9009
|
|
;* The DBCS common keyboard unique scan code is mapped to the *;JP9009
|
|
;* temporary scan code. It is again mapped to the corresponding *;JP9009
|
|
;* scan code/character code according the current shift staes. *;JP9009
|
|
;* *;JP9009
|
|
;***********************************************************************;JP9009
|
|
;JP9009
|
|
DBCS_keyboard_support proc near ;JP9009
|
|
cmp al, 80h ; Ignore break keys ;JP9009
|
|
jae leave_it_to_common_method ;JP9009
|
|
;AN013 test cs:SD.KEYB_TYPE, DBCS_KB ; DBCS keyboard? ;JP9009
|
|
;AN013 jz leave_it_to_common_method ;JP9009
|
|
cmp cs:SD.INVOKED_CP_TABLE, 932 ; DBCS code page? ;JP9009
|
|
jb leave_it_to_common_method ;JP9009
|
|
call DBCS_keyboard_common_support ;JP9009
|
|
test cs:SD.KEYB_TYPE, DBCS_OLD_KB ;JP9009
|
|
jz leave_it_to_common_method_1 ;JP9009
|
|
call DBCS_old_keyboard_support ;JP9009
|
|
leave_it_to_common_method_1: ;JP9009
|
|
mov ah, al ; ah = al = 'make' scan code ;JP9009
|
|
mov cs:scan_code, al; Set this because we don't know;JP9009
|
|
; who will use it later. ;JP9009
|
|
leave_it_to_common_method: ;JP9009
|
|
ret ;JP9009
|
|
DBCS_keyboard_support endp ;JP9009
|
|
;JP9009
|
|
PSEUDO_SC_ALPHANUMERIC equ 7eh ;JP9009
|
|
PSEUDO_SC_HIRAGANA equ 7fh ;JP9009
|
|
;JP9009
|
|
DBCS_keyboard_common_support proc near ;JP9009
|
|
; Check if it is the Alphanumeric key or Kanji NO key ;JP9009
|
|
; of the DBCS new keyboard. ;JP9009
|
|
cmp al, 3ah ; CAPS key ? ;JP9009
|
|
jne leave_it_to_common_method_2 ; if not ;JP9009
|
|
|
|
mov cx,cs:SD.KEYB_TYPE ;QFESP4
|
|
and cx,07h
|
|
cmp cx,2 ; 106 kbd?
|
|
jz check_key_status
|
|
cmp cx,3 ; IBM-5576 002/003 kbd?
|
|
jz check_key_status
|
|
cmp cx,0 ; 101 kbd?
|
|
jnz leave_it_to_common_method_2
|
|
|
|
test bl,(ALT_SHIFT or CTL_SHIFT or LEFT_SHIFT or RIGHT_SHIFT)
|
|
jz leave_it_to_common_method_2
|
|
push bx
|
|
and bl,(ALT_SHIFT or CTL_SHIFT)
|
|
cmp bl,(ALT_SHIFT or CTL_SHIFT) ;press alt and ctl ?
|
|
pop bx
|
|
jz leave_it_to_common_method_2
|
|
jmp short convert_to_alphanumeric_2
|
|
|
|
check_key_status: ;QFESP4
|
|
test bl, ALT_SHIFT ;JP9009
|
|
jnz convert_to_alphanumeric ;JP9009
|
|
test bl, (LEFT_SHIFT or RIGHT_SHIFT) ;JP9009
|
|
jnz leave_it_to_common_method_2 ;JP9009
|
|
jmp short convert_to_alphanumeric_2 ;JP9009
|
|
convert_to_alphanumeric: ;JP9009
|
|
test cs:SD.KEYB_TYPE, DBCS_OLD_A_KB ;JP9009
|
|
jnz leave_it_to_common_method_2 ;JP9009
|
|
convert_to_alphanumeric_2: ;JP9009
|
|
mov al, PSEUDO_SC_ALPHANUMERIC ;JP9009
|
|
leave_it_to_common_method_2: ;JP9009
|
|
ret ;JP9009
|
|
DBCS_keyboard_common_support endp ;JP9009
|
|
;JP9009
|
|
|
|
;***********************************************************************;JP9009
|
|
;* *;JP9009
|
|
;* DBCS Old Keyboard Support *;JP9009
|
|
;* *;JP9009
|
|
;* The old DBCS keyboard unique scan codes is mapped to the *;JP9009
|
|
;* temporary scan code. It is again mapped to the corresponding *;JP9009
|
|
;* scan code/character code according the current shift staes. *;JP9009
|
|
;* *;JP9009
|
|
;***********************************************************************;JP9009
|
|
;JP9009
|
|
DBCS_old_keyboard_support proc near ;JP9009
|
|
mov cx,cs:SD.KEYB_TYPE
|
|
and cx,07h
|
|
cmp cx,2 ; 106 kbd?
|
|
jz check_old_key_status
|
|
cmp cx,3 ; IBM-5576 002/003 kb?
|
|
jne not_right_ALT_nor_hiragana
|
|
check_old_key_status:
|
|
|
|
cmp al, 38h ;JP9009
|
|
jne not_right_ALT_nor_hiragana ;JP9009
|
|
test ds:KB_FLAG_3, LC_E0 ;JP9009
|
|
jz not_right_ALT_nor_hiragana ;JP9009
|
|
mov al, PSEUDO_SC_HIRAGANA ;JP9009
|
|
and ds:KB_FLAG_3, not LC_E0 ;JP9009
|
|
not_right_ALT_nor_hiragana: ;JP9009
|
|
ret ;JP9009
|
|
DBCS_old_keyboard_support endp ;JP9009
|
|
endif ; JAPAN
|
|
|
|
DOSTI proc near
|
|
FSTI
|
|
ret
|
|
DOSTI endp
|
|
|
|
DOCLI proc near
|
|
FCLI
|
|
ret
|
|
DOCLI endp
|
|
|
|
DOIRET:
|
|
FIRET
|
|
|
|
CODE ENDS
|
|
END
|