2 TITLE DOS
- KEYB Command
- Transient Command Processing
4 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5 ;; DOS - NLS Support - KEYB Command
6 ;; (C) Copyright 1988 Microsoft
8 ;; File Name: COMMSUBS.ASM
13 ;; Common subroutines used by NLS support
15 ;; Documentation Reference:
16 ;; ------------------------
19 ;; Procedures Contained in This File:
20 ;; ----------------------------------
22 ;; FIND_HW_TYPE - Determine the keyboard and system unit types and
23 ;; set the corresponding flags.
25 ;; Include Files Required:
26 ;; -----------------------
29 ;; External Procedure References:
30 ;; ------------------------------
31 ;; FROM FILE ????????.ASM:
32 ;; ????????? - ????????????????????????????????????????????
38 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
40 PUBLIC FIND_SYS_TYPE
;;
41 PUBLIC FIND_KEYB_TYPE
;;
46 INCLUDE KEYBEQU
.INC ;;
47 INCLUDE KEYBCPSD
.INC ;;
48 INCLUDE KEYBSHAR
.INC ;;
49 INCLUDE KEYBCMD
.INC ;;
51 INCLUDE POSTEQU
.INC ;;
53 CODE SEGMENT PUBLIC 'CODE' ;;
55 ASSUME
CS:CODE,DS:CODE ;;
57 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
59 ;; Module: FIND_SYS_TYPE
62 ;; Determine the type of system we are running on.
63 ;; SYSTEM_FLAG (in active SHARED_DATA) are set to
64 ;; indicate the system type.
65 ;; This routine is only called the first time KEYB is being installed.
69 ;; DS - points to our data segment
76 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
78 ROM
SEGMENT AT 0F000H ;;
81 ;; SEGMENT F000. (F000:FFFE)
83 ROMPC1 EQU
0FFH ;; ID OF PC1 hardware
84 ROMXT EQU
0FEH ;; ID OF PC-XT/PORTABLE hardware
85 ROMJR EQU
0FDH ;; ID OF PCjr & Optional ROM
86 ROMAT EQU
0FCH ;; ID OF PCAT
87 ROMXT_ENHAN EQU
0FBH ;; ID OF ENHANCED PCXT
88 ROMPAL EQU
0FAH ;; ID FOR PALACE
89 ROMLAP EQU
0F9H ;; ID FOR PC LAP (P-14)
90 ROM_RU_386 EQU
0F8H ;; ID FOR ROUNDUP-386
95 ROMEXT
SEGMENT AT 00000H ;; ADDRESS SHOULD NOT BE FIXED AT
96 ORG 0003BH ;;AT 09FC0H -- This is just a ;;
97 KEYBID1
DB ?
;;a dummy value of 000H INT 15H call
98 ;; will load dynamically depending
99 ;; upon system mem size- 9FC0 was only for 640K system
100 ;; *** UNTRUE SEGMENT 9FC0. (9FC0:003B)
102 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
113 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
115 FIND_SYS_TYPE PROC
NEAR ;;
117 MOV AX,ROM
;; Set segmant to look at ROM
118 MOV DS,AX ;; using the data segment
121 MOV AL,ROMID
;; Get hardware ID
124 PUSH CS ;; Set data seg back to code
128 MOV AH,92H
;; SET INVALID CALL FOR INT16
130 CMP AH,80H
;; IS EXTENDED INTERFACE THERE?
131 JA CHECK_PC_NET
;; NO, SKIP FLAG
132 OR SD
.SYSTEM_FLAG
,EXT_16
;; default is extended INT 16 support
135 MOV AH,30H
;; GET DOS VERSION NUMBER
136 INT 21H
;; MAJOR # IN AL, MINOR # IN AH
137 CMP AX,0A03H ;; SENSITIVE TO 3.10 OR >
138 JB CHECK_SYSTEM
;; EARLIER VERSION OF DOS NOTHING
139 ;; WAS ESTABLISHED FOR THIS SITUATION
140 PUSH ES ;; Save ES just in case
141 MOV AX,3509H
;; GET INT VECTOR 9 CONTENTS
142 INT 21H
;; ES:BX WILL = CURRENT INT9 VECTOR
143 ;; WE WANT TO SEE IF WE ARE THE 1ST ONES LOADED
144 MOV CX,ES ;; INTO THE INT VECTOR 9. WITH DOS 3.1 WE CAN
146 CMP CX,0F000H ;; HANDSHAKE WITH THE PC NETWORK BUT NO ONE ELSE
147 JE CHECK_SYSTEM
;; INT VECTOR 9 POINTS TO ROM, OK
148 MOV AX,0B800H ;; ASK IF PC NETWORK IS INSTALLED
150 CMP AL,0 ;; NOT INSTALLED IF AL=0
151 JE CHECK_SYSTEM
;; SOMEBODY ELSE HAS LINKED INTO THE INT VECTOR
152 ;; 9 & I'M GOING TO DROP RIGHT IN AS USUAL
153 OR SD
.SYSTEM_FLAG
,PC_NET
;; INDICATE PC NET IS RUNNING
156 POP AX ;; get code back
157 ;; Is the hardware a PCjr
159 JNE TEST_PC_XT
;; IF not then check for next type
160 OR SD
.SYSTEM_FLAG
,PC_JR
;; system type
161 JMP FIND_SYS_END
;; Done
164 ;; Is the hardware a PC1 or XT ?
166 JAE ITS_AN_XT
;; IF FE OR FF THEN ITS AN XT
167 CMP AL,ROMXT_ENHAN
;; IF FB IT IS ALSO AN XT
168 JNE TEST_PC_AT
;; IF not then check for next type
170 OR SD
.SYSTEM_FLAG
,PC_XT
;; system type
174 ;; Is the hardware an AT ?
176 JNE TEST_P12
;; IF not then check for next type
178 OR SD
.SYSTEM_FLAG
,PC_AT
;; system type
183 CMP AL,ROMLAP
;; IS this a P12?
184 JNE TEST_PAL
;; IF not then check for next type
185 OR SD
.SYSTEM_FLAG
,PC_LAP
;; system type
189 CMP AL,ROMPAL
;; IS this a PALACE?
190 JNE TEST_RU_386
;; IF not then check for next type
191 OR SD
.SYSTEM_FLAG
,PC_PAL
;; system type
195 CMP AL,ROM_RU_386
;; IS this a ROUNDUP with a 386?
196 JNE FIND_SYS_END
;; IF not then check for next type
197 OR SD
.SYSTEM_FLAG
,PC_386
;; system type
198 MOV SD
.TIMING_FACTOR
,2 ;; Bump scale factor to account for 386
204 FIND_SYS_TYPE ENDP
;;
206 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
208 ;; Module: FIND_KEYB_TYPE
211 ;; Determine the type of keyboard we are running on.
212 ;; KEYB_TYPE (in SHARED_DATA) is set to
213 ;; indicate the keyboard type.
214 ;; This routine is only called the first time KEYB is being installed.
218 ;; DS - points to our data segment
225 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
231 ;RESERVED ADDRESS 013h BITS 1 & 2
233 PASS_MODE equ
00000001B ;AN000;
234 SERVER_MODE equ
00000010B ;AN000;
235 SECRET_ADD equ 13h
;AN000;
236 PORT_70 equ 70h
;AN000;
237 PORT_71 equ 71h
;AN000;
240 G_KEYBOARD EQU
0AB41h ;;????? ;; Keyboard ID for FERRARI_G
241 P_KEYBOARD EQU
0AB54h ;;????? ;; Keyboard ID for FERRARI_P
245 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
247 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
249 FIND_KEYB_TYPE PROC
NEAR ;;
254 MOV AX,ROM
;; Set segmant to look at ROM
255 MOV DS,AX ;; using the data segment
259 MOV ES,AX ;; ES points to BIOS data
261 MOV AL,ROMID
;; Get hardware ID
263 PUSH CS ;; Set data seg back to code
268 MOV HW_TYPE
,G_KB
;; Default keyboard is G_KB
270 ;; Is the hardware a PCjr
272 JNE TEST_PC_XT_2
;; IF not then check for next type
273 MOV HW_TYPE
,JR_KB
;; keyboard type
274 JMP FIND_KEYB_END
;; Done
277 ;; Is the hardware a PC1 or XT ?
279 JAE ITS_AN_XT_2
;; IF FE OR FF THEN ITS AN XT
280 CMP AL,ROMXT_ENHAN
;; IF FB IT IS ALSO AN XT
281 JNE TEST_PC_AT_2
;; IF not then check for next type
283 TEST ES:KB_FLAG_3
,KBX
;; IS THE ENHANCED KEYBOARD INSTALLED?
285 JMP FIND_KEYB_END
;; Yes, exit
288 MOV HW_TYPE
,XT_KB
;; NO, normal XT keyboard
292 ;; Is the hardware an AT ?
294 JNE TEST_P12_2
;; IF not then check for next type
296 ;; CHECK FOR ENHANCED KEYBOARD...
297 OR ES:KB_FLAG_2
,08H ;; FROM COMNBODY.ASM - DON'T KNOW WHY
299 ;; READ ID COMMAND TO TEST FOR A KBX
301 MOV ES:KB_FLAG_3
,RD_ID
;; INDICATE THAT A READ ID IS BEING
303 MOV AL,0F2H ;; SEND THE READ ID COMMAND
306 MOV CX,03F00H ;; LOAD COUNT FOR ABOUT 37MS
307 WT_ID: TEST ES:KB_FLAG_3
,KBX
;; TEST FOR KBX SET
308 LOOPZ WT_ID
;; WAIT OTHERWISE
309 ;; BE SURE FLAGS GOT RESET
311 ;; SAVE ALL REGISTERS BEFORE ENTRY
312 ;; INTO CHECKING KEYBOARD SECURITY
313 PUSH AX ;AN000; ;SAVE THE CURRENT ENVIRONMENT
324 CALL KEYB_SECURE
;SEE IF THE KEYBOARD SECURITY IS
325 ;ACTIVATED AT THIS POINT
335 POP AX ;AN000;SAVE THE CURRENT ENVIRONMENT
337 JNC ASSUME_AT
;AN000;SECURITY UNAVAILABLE OR AN AT KB
340 MOV SECURE_FL
,1 ;AN000;SECURITY IS ACTIVE
341 JMP FIND_KEYB_END
;AN000;ASSUME IT IS A G_KB WITH
345 AND ES:KB_FLAG_3
,NOT RD_ID
+LC_AB
347 TEST ES:KB_FLAG_3
,KBX
;; WAS IT A KBX?
348 JNZ DONE_AT_2
;; YES, WE ARE DONE
350 MOV HW_TYPE
,AT_KB
;; NO, AT KBD
355 CMP AL,ROMLAP
;; IS this a P12?
356 JNE TEST_XT_ENH_OR_NEWER
;; IF not then check for next type
357 MOV HW_TYPE
,P12_KB
;; IF yes then set flag
359 TEST_XT_ENH_OR_NEWER: ;;
360 CMP AL,ROMXT_ENHAN
;;
361 JNA GET_KEYB_ID
;; ** assume all new systems will have ext
362 JMP FIND_KEYB_END
;; ** ROM or else test previous to this
365 ;***************************** CNS ****************************************
366 ;* This area has been Revised to allow the extended ROM support added
367 ;* flexibility for the PALACE or FLASHLIGHT with less than 640k; AN extended
368 ;* BIOS DATA call is to be made returning the segment of the extended
369 ;* BIOS area which should be in maximum memory - 1k area.
370 ;***************************************************************************
372 MOV AH,0C1H ;; Make the extended bios data area
373 INT 15H
;; call to get the segment address for
374 JNC NEW_SYSTEM
;; accessing the keyboard byte area
375 JMP FIND_KEYB_END
;; JNC SOMEWHERE&REPORT
376 ;; otherwise EXTENDED BIOS DATA RETURNED
378 ;; save the starting seg address value
379 ;; needs to start at locale 0003BH
380 ;****************************************************************************
383 ;; Set segment to look at extended ROM
384 ;; using the data segment
385 PUSH ES ;; SEG value returned from INT15h -- C1 call
390 MOV ES,AX ;; BP points to BIOS data
393 MOV AL,KEYBID1
;; Get keyboard ID ********** CNS
395 ;*****************************************************************************
396 ;old MOV AX,ROMEXT ;; Set segment to look at extended ROM
397 ;code MOV DS,AX ;; using the data segment
398 ; ASSUME DS:ROMEXT ;;
401 ;old MOV ES,AX ;; ES points to BIOS data
403 ; MOV AL,KEYBID1 ;; Get keyboard ID
404 ;******************************************************************************
405 PUSH CS ;; Set data seg back to code
409 AND AL,0FH ;; Remove high nibble
410 CMP AL,P_KB_ID
;; IF keyboard is a FERRARI P THEN
412 OR HW_TYPE
,P_KB
;; Set the HW_TYPE flag
414 FIND_KEYB_END: ;; ELSE
415 MOV AX,HW_TYPE
;; Leave default alone
416 MOV SD
.KEYB_TYPE
,AX ;;
422 FIND_KEYB_TYPE ENDP
;;
424 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
426 ;; Module: SND_DATA_AT
429 ;; THIS ROUTINE HANDLES TRANSMISSION OF PC/AT COMMAND AND DATA BYTES
430 ;; TO THE KEYBOARD AND RECEIPT OF ACKNOWLEDGEMENTS. IT ALSO
431 ;; HANDLES ANY RETRIES IF REQUIRED
435 ;; DS - points to our data segment
436 ;; ES - points to the BIOS data segment
442 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
444 SND_DATA_AT PROC
NEAR
445 PUSH AX ; SAVE REGISTERS
448 MOV BH,AL ; SAVE TRANSMITTED BY FOR RETRIES
449 MOV BL,3 ; LOAD RETRY COUNT
450 SD0: CLI ; DISABLE INTERRUPTS
451 AND ES:KB_FLAG_2
,NOT (KB_FE
+KB_FA
) ; CLEAR ACK AND RESEND FLAGS
453 ;------- WAIT FOR COMMAND TO BE ACCEPTED
458 TEST AL,INPT_BUF_FULL
459 LOOPNZ SD5
; WAIT FOR COMMAND TO BE ACCEPTED
461 MOV AL,BH ; REESTABLISH BYTE TO TRANSMIT
462 OUT PORT_A
,AL ; SEND BYTE
463 STI ; ENABLE INTERRUPTS
464 MOV CX,01A00H ; LOAD COUNT FOR 10mS+
465 SD1: TEST ES:KB_FLAG_2
,KB_FE
+KB_FA
; SEE IF EITHER BIT SET
466 JNZ SD3
; IF SET, SOMETHING RECEIVED GO PROCESS
468 LOOP SD1
; OTHERWISE WAIT
470 SD2: DEC BL ; DECREMENT RETRY COUNT
471 JNZ SD0
; RETRY TRANSMISSION
473 OR ES:KB_FLAG_2
,KB_ERR
; TURN ON TRANSMIT ERROR FLAG
474 JMP SHORT SD4
; RETRIES EXHAUSTED FORGET TRANSMISSION
476 SD3: TEST ES:KB_FLAG_2
,KB_FA
; SEE IF THIS IS AN ACKNOWLEDGE
477 JZ SD2
; IF NOT, GO RESEND
479 ;; If this was an acknowledge, determine*RPS
480 ;; if keyboard is FERRARI G or P *RPS
484 JMP SHORT $+2 ;; Allow for recovery time
485 IN AL,PORT_A
;; READ IN THE CHARACTER *RPS
489 JMP SHORT $+2 ;; Allow for recovery time
492 IN AL,PORT_A
;; READ IN THE CHARACTER *RPS
495 CMP BX,P_KEYBOARD
;; Set HW_TYPE appropriately *RPS
497 OR HW_TYPE
,P_KB
;; *RPS
499 SD4: POP CX ; RESTORE REGISTERS
502 RET ; RETURN, GOOD TRANSMISSION
505 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
506 ;************************************************************************
507 ; KEYBOARD SECURITY LOGIC
508 ; CHECK THE CMOS RAM @ ADDRESS HEX 013H
509 ; CHECK TO SEE IF EITHER BITS 1 (PASSWORD) OR 2 (SERVER MODE) ARE SET ON
510 ; IF EITHER BIT IS SET ON THE SYSTEM IS A MOD 50 on up
511 ; REPORT MESSAGE KEYBOARD LOCKED UNABLE TO LOAD KEYBOARD TABLES
512 ; OTHERWISE AN INVALID RESPONSE OR ZERO SHOULD BE RETURNED
513 ; PROCEED AS WITH LOADING OF THE CORRECT TABLES
515 ; PROPOSED KEYBOARD SYNTAX
517 ; KEYB [lang],[cp],[[d:][path]KEYBOARD.SYS][/ID:id]
521 ;************************************************************************
523 KEYB_SECURE PROC
NEAR
527 ;RESERVED ADDRESS 013h BITS 1 & 2
529 ; PASS_MODE equ 00000001B ;AN000;
530 ; SERVER_MODE equ 00000010B ;AN000;
534 ; SECRET_ADD equ 13h ;AN000;
535 ; PORT_70 equ 70h ;AN000;
536 ; PORT_71 equ 71h ;AN000;
538 ; PUSH AX ;AN000; ;SAVE THE CURRENT ENVIRONMENT
547 CLI ;AN000;;DISABLE THE INTERRUPT TO AVOID
548 ;AN000;;THE CMOS REGISTER BEFORE
549 ;AN000;;THE READ & WRITE IS DONE
553 OUT PORT_70
,AL ;AN000;;SEND THE ADDRESS CONTAINING THE
554 ;BITS FOR THE PASSWORD AND SERVER
555 ;MODE STATE TO PORT 70H
561 IN AL,PORT_71
;AN000;;READ THE DATA IN TO GET THE
562 ;RESULTS OF THE CHECK FOR THE
563 ;EXISTENCE OF SECURITY.
567 TEST DL,PASS_MODE
+SERVER_MODE
;AN000;;CHECK & SEE IF THE BITS ARE ON
568 JNZ KEYB_LOCKED
;AN000;;YES THEY ARE ON SO EXIT AND REPORT
569 CLC ;XOR AX,AX ;ASSUME THIS IS AN AT KEYBOARD
574 STC ; MOV AX,1 ;AN000;SET THE SECURITY FLAG
576 ;PROCEED - EITHER SYSTEM IS AN
577 ;AT OR THE SYSTEM IS UNLOCKED
580 STI ;AN000;;ENABLE THE INTERRUPT
591 ; POP AX ;AN000; ;SAVE THE CURRENT ENVIRONMENT