summaryrefslogtreecommitdiff
path: root/v4.0/src/CMD/KEYB/COMMSUBS.ASM
diff options
context:
space:
mode:
Diffstat (limited to 'v4.0/src/CMD/KEYB/COMMSUBS.ASM')
-rw-r--r--v4.0/src/CMD/KEYB/COMMSUBS.ASM603
1 files changed, 603 insertions, 0 deletions
diff --git a/v4.0/src/CMD/KEYB/COMMSUBS.ASM b/v4.0/src/CMD/KEYB/COMMSUBS.ASM
new file mode 100644
index 0000000..3810ed2
--- /dev/null
+++ b/v4.0/src/CMD/KEYB/COMMSUBS.ASM
@@ -0,0 +1,603 @@
1 PAGE ,132
2 TITLE DOS - KEYB Command - Transient Command Processing
3
4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5;; DOS - NLS Support - KEYB Command
6;; (C) Copyright 1988 Microsoft
7;;
8;; File Name: COMMSUBS.ASM
9;; ----------
10;;
11;; Description:
12;; ------------
13;; Common subroutines used by NLS support
14;;
15;; Documentation Reference:
16;; ------------------------
17;; None
18;;
19;; Procedures Contained in This File:
20;; ----------------------------------
21;;
22;; FIND_HW_TYPE - Determine the keyboard and system unit types and
23;; set the corresponding flags.
24;;
25;; Include Files Required:
26;; -----------------------
27;; None
28;;
29;; External Procedure References:
30;; ------------------------------
31;; FROM FILE ????????.ASM:
32;; ????????? - ????????????????????????????????????????????
33;;
34;; Change History:
35;; ---------------
36;;
37;;
38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
39 ;;
40 PUBLIC FIND_SYS_TYPE ;;
41 PUBLIC FIND_KEYB_TYPE ;;
42 PUBLIC HW_TYPE ;;
43 PUBLIC SECURE_FL ;;
44
45 ;;
46 INCLUDE KEYBEQU.INC ;;
47 INCLUDE KEYBCPSD.INC ;;
48 INCLUDE KEYBSHAR.INC ;;
49 INCLUDE KEYBCMD.INC ;;
50 INCLUDE DSEG.INC ;;
51 INCLUDE POSTEQU.INC ;;
52 ;;
53CODE SEGMENT PUBLIC 'CODE' ;;
54 ;;
55 ASSUME CS:CODE,DS:CODE ;;
56 ;;
57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
58;;
59;; Module: FIND_SYS_TYPE
60;;
61;; Description:
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.
66;;
67;;
68;; Input Registers:
69;; DS - points to our data segment
70;;
71;; Output Registers:
72;; NONE
73;;
74;; Logic:
75;;
76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
77 ;;
78ROM SEGMENT AT 0F000H ;;
79 ORG 0FFFEH ;;
80ROMID DB ? ;;
81 ;; SEGMENT F000. (F000:FFFE)
82 ;;
83ROMPC1 EQU 0FFH ;; ID OF PC1 hardware
84ROMXT EQU 0FEH ;; ID OF PC-XT/PORTABLE hardware
85ROMJR EQU 0FDH ;; ID OF PCjr & Optional ROM
86ROMAT EQU 0FCH ;; ID OF PCAT
87ROMXT_ENHAN EQU 0FBH ;; ID OF ENHANCED PCXT
88ROMPAL EQU 0FAH ;; ID FOR PALACE
89ROMLAP EQU 0F9H ;; ID FOR PC LAP (P-14)
90ROM_RU_386 EQU 0F8H ;; ID FOR ROUNDUP-386
91 ;;
92ROM ENDS ;;
93 ;;
94 ;; ******** CNS
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)
101 ROMEXT ENDS ;;
102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
103;***CNS
104
105
106
107
108
109
110
111
112;; Program Code
113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
114 ;;
115FIND_SYS_TYPE PROC NEAR ;;
116 ;;
117 MOV AX,ROM ;; Set segmant to look at ROM
118 MOV DS,AX ;; using the data segment
119 ASSUME DS:ROM ;;
120 ;;
121 MOV AL,ROMID ;; Get hardware ID
122 PUSH AX ;; save it
123 ;;
124 PUSH CS ;; Set data seg back to code
125 POP DS ;;
126 ASSUME DS:CODE ;;
127 ;;
128 MOV AH,92H ;; SET INVALID CALL FOR INT16
129 INT 16H ;; CALL BIOS
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
133 ;;
134CHECK_PC_NET: ;;
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
145 POP ES ;;
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
149 INT 2FH ;;
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
154 ;;
155CHECK_SYSTEM: ;;
156 POP AX ;; get code back
157 ;; Is the hardware a PCjr
158 CMP AL,ROMJR ;;
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
162 ;;
163TEST_PC_XT: ;;
164 ;; Is the hardware a PC1 or XT ?
165 CMP AL,ROMXT ;;
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
169ITS_AN_XT: ;;
170 OR SD.SYSTEM_FLAG,PC_XT ;; system type
171 JMP FIND_SYS_END ;;
172 ;;
173TEST_PC_AT: ;;
174 ;; Is the hardware an AT ?
175 CMP AL,ROMAT ;;
176 JNE TEST_P12 ;; IF not then check for next type
177 ;;
178 OR SD.SYSTEM_FLAG,PC_AT ;; system type
179 ;;
180 JMP FIND_SYS_END ;;
181 ;;
182TEST_P12: ;;
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
186 JMP FIND_SYS_END ;;
187 ;;
188TEST_PAL: ;;
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
192 JMP FIND_SYS_END ;;
193 ;;
194TEST_RU_386: ;;
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
199 ;;
200FIND_SYS_END: ;;
201 ;;
202 RET ;;
203 ;;
204FIND_SYS_TYPE ENDP ;;
205 ;;
206;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
207;;
208;; Module: FIND_KEYB_TYPE
209;;
210;; Description:
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.
215;;
216;;
217;; Input Registers:
218;; DS - points to our data segment
219;;
220;; Output Registers:
221;; NONE
222;;
223;; Logic:
224;;
225;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
226 ;;
227HW_TYPE DW 0 ;;
228;***CNS ;;
229
230SECURE_FL DB 0
231;RESERVED ADDRESS 013h BITS 1 & 2
232
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;
238
239;***CNS
240G_KEYBOARD EQU 0AB41h ;;????? ;; Keyboard ID for FERRARI_G
241P_KEYBOARD EQU 0AB54h ;;????? ;; Keyboard ID for FERRARI_P
242 ;;
243P_KB_ID DB 08 ;;
244 ;;
245;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
246;; Program Code
247;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
248 ;;
249FIND_KEYB_TYPE PROC NEAR ;;
250 ;;
251 PUSH ES ;;
252 PUSH DS ;;
253 ;;
254 MOV AX,ROM ;; Set segmant to look at ROM
255 MOV DS,AX ;; using the data segment
256 ASSUME DS:ROM ;;
257 ;;
258 MOV AX,DATA ;;
259 MOV ES,AX ;; ES points to BIOS data
260 ;;
261 MOV AL,ROMID ;; Get hardware ID
262 ;;
263 PUSH CS ;; Set data seg back to code
264 POP DS ;;
265 ASSUME DS:CODE ;;
266 ;;
267 ;;
268 MOV HW_TYPE,G_KB ;; Default keyboard is G_KB
269 ;;
270 ;; Is the hardware a PCjr
271 CMP AL,ROMJR ;;
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
275 ;;
276TEST_PC_XT_2: ;;
277 ;; Is the hardware a PC1 or XT ?
278 CMP AL,ROMXT ;;
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
282ITS_AN_XT_2: ;;
283 TEST ES:KB_FLAG_3,KBX ;; IS THE ENHANCED KEYBOARD INSTALLED?
284 JZ ITS_AN_XT_3 ;;
285 JMP FIND_KEYB_END ;; Yes, exit
286 ;;
287ITS_AN_XT_3: ;;
288 MOV HW_TYPE,XT_KB ;; NO, normal XT keyboard
289 JMP FIND_KEYB_END ;;
290 ;;
291TEST_PC_AT_2: ;;
292 ;; Is the hardware an AT ?
293 CMP AL,ROMAT ;;
294 JNE TEST_P12_2 ;; IF not then check for next type
295 ;;
296 ;; CHECK FOR ENHANCED KEYBOARD...
297 OR ES:KB_FLAG_2,08H ;; FROM COMNBODY.ASM - DON'T KNOW WHY
298 ;;
299 ;; READ ID COMMAND TO TEST FOR A KBX
300 ;;
301 MOV ES:KB_FLAG_3,RD_ID ;; INDICATE THAT A READ ID IS BEING
302 ;; DONE
303 MOV AL,0F2H ;; SEND THE READ ID COMMAND
304 CALL SND_DATA_AT ;;
305 ;;
306 MOV CX,03F00H ;; LOAD COUNT FOR ABOUT 37MS
307WT_ID: TEST ES:KB_FLAG_3,KBX ;; TEST FOR KBX SET
308 LOOPZ WT_ID ;; WAIT OTHERWISE
309 ;; BE SURE FLAGS GOT RESET
310;***CNS
311 ;; SAVE ALL REGISTERS BEFORE ENTRY
312 ;; INTO CHECKING KEYBOARD SECURITY
313 PUSH AX ;AN000; ;SAVE THE CURRENT ENVIRONMENT
314 PUSH BX ;AN000;
315 PUSH CX ;AN000;
316 PUSH DX ;AN000;
317 PUSH DS ;AN000;
318 PUSH ES ;AN000;
319 PUSH SI ;AN000;
320 PUSH DI ;AN000;
321
322
323
324 CALL KEYB_SECURE ;SEE IF THE KEYBOARD SECURITY IS
325 ;ACTIVATED AT THIS POINT
326
327
328 POP DI ;AN000;
329 POP SI ;AN000;
330 POP ES ;AN000;
331 POP DS ;AN000;
332 POP DX ;AN000;
333 POP CX ;AN000;
334 POP BX ;AN000;
335 POP AX ;AN000;SAVE THE CURRENT ENVIRONMENT
336
337 JNC ASSUME_AT ;AN000;SECURITY UNAVAILABLE OR AN AT KB
338
339
340 MOV SECURE_FL,1 ;AN000;SECURITY IS ACTIVE
341 JMP FIND_KEYB_END ;AN000;ASSUME IT IS A G_KB WITH
342 ;AN000;NUM LOCK OFF
343ASSUME_AT:
344;***CNS
345 AND ES:KB_FLAG_3,NOT RD_ID+LC_AB
346 ;;
347 TEST ES:KB_FLAG_3,KBX ;; WAS IT A KBX?
348 JNZ DONE_AT_2 ;; YES, WE ARE DONE
349 ;;
350 MOV HW_TYPE,AT_KB ;; NO, AT KBD
351DONE_AT_2: ;;
352 JMP FIND_KEYB_END ;;
353 ;;
354TEST_P12_2: ;;
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
358 ;;
359TEST_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
363 ;;
364GET_KEYB_ID: ;;
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;***************************************************************************
371
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
377 ;; in the ES
378 ;; save the starting seg address value
379 ;; needs to start at locale 0003BH
380;****************************************************************************
381NEW_SYSTEM:
382;**CNS
383 ;; Set segment to look at extended ROM
384 ;; using the data segment
385 PUSH ES ;; SEG value returned from INT15h -- C1 call
386 POP DS
387 ASSUME DS:ROMEXT ;;
388 ;;
389 MOV AX,DATA ;;
390 MOV ES,AX ;; BP points to BIOS data
391
392 ;;
393 MOV AL,KEYBID1 ;; Get keyboard ID ********** CNS
394;**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 ;;
399; ;;
400; MOV AX,DATA ;;
401;old MOV ES,AX ;; ES points to BIOS data
402;code ;;
403; MOV AL,KEYBID1 ;; Get keyboard ID
404;******************************************************************************
405 PUSH CS ;; Set data seg back to code
406 POP DS ;;
407 ASSUME DS:CODE ;;
408 ;;
409 AND AL,0FH ;; Remove high nibble
410 CMP AL,P_KB_ID ;; IF keyboard is a FERRARI P THEN
411 JNE FIND_KEYB_END ;;
412 OR HW_TYPE,P_KB ;; Set the HW_TYPE flag
413 ;;
414FIND_KEYB_END: ;; ELSE
415 MOV AX,HW_TYPE ;; Leave default alone
416 MOV SD.KEYB_TYPE,AX ;;
417 ;;
418 POP DS ;;
419 POP ES ;;
420 RET ;;
421 ;;
422FIND_KEYB_TYPE ENDP ;;
423 ;;
424;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
425;;
426;; Module: SND_DATA_AT
427;;
428;; Description:
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
432;;
433;;
434;; Input Registers:
435;; DS - points to our data segment
436;; ES - points to the BIOS data segment
437;;
438;; Output Registers:
439;;
440;; Logic:
441;;
442;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
443
444SND_DATA_AT PROC NEAR
445 PUSH AX ; SAVE REGISTERS
446 PUSH BX ; *
447 PUSH CX
448 MOV BH,AL ; SAVE TRANSMITTED BY FOR RETRIES
449 MOV BL,3 ; LOAD RETRY COUNT
450SD0: CLI ; DISABLE INTERRUPTS
451 AND ES:KB_FLAG_2,NOT (KB_FE+KB_FA) ; CLEAR ACK AND RESEND FLAGS
452
453;------- WAIT FOR COMMAND TO BE ACCEPTED
454
455 SUB CX,CX
456SD5:
457 IN AL,STATUS_PORT
458 TEST AL,INPT_BUF_FULL
459 LOOPNZ SD5 ; WAIT FOR COMMAND TO BE ACCEPTED
460;
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+
465SD1: TEST ES:KB_FLAG_2,KB_FE+KB_FA ; SEE IF EITHER BIT SET
466 JNZ SD3 ; IF SET, SOMETHING RECEIVED GO PROCESS
467;
468 LOOP SD1 ; OTHERWISE WAIT
469;
470SD2: DEC BL ; DECREMENT RETRY COUNT
471 JNZ SD0 ; RETRY TRANSMISSION
472;
473 OR ES:KB_FLAG_2,KB_ERR ; TURN ON TRANSMIT ERROR FLAG
474 JMP SHORT SD4 ; RETRIES EXHAUSTED FORGET TRANSMISSION
475;
476SD3: TEST ES:KB_FLAG_2,KB_FA ; SEE IF THIS IS AN ACKNOWLEDGE
477 JZ SD2 ; IF NOT, GO RESEND
478;
479 ;; If this was an acknowledge, determine*RPS
480 ;; if keyboard is FERRARI G or P *RPS
481 MOV CX,1000 ;;
482IO_DELAY1: ;;
483 LOOP IO_DELAY1 ;;
484 JMP SHORT $+2 ;; Allow for recovery time
485 IN AL,PORT_A ;; READ IN THE CHARACTER *RPS
486 MOV CX,1000 ;;
487IO_DELAY2: ;;
488 LOOP IO_DELAY2 ;;
489 JMP SHORT $+2 ;; Allow for recovery time
490 MOV BH,AL ;; *RPS
491 ;;
492 IN AL,PORT_A ;; READ IN THE CHARACTER *RPS
493 MOV BL,AL ;; *RPS
494 ;; *RPS
495 CMP BX,P_KEYBOARD ;; Set HW_TYPE appropriately *RPS
496 JNE SD4 ;; *RPS
497 OR HW_TYPE,P_KB ;; *RPS
498 ;;
499SD4: POP CX ; RESTORE REGISTERS
500 POP BX
501 POP AX ; *
502 RET ; RETURN, GOOD TRANSMISSION
503SND_DATA_AT ENDP
504
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
514
515; PROPOSED KEYBOARD SYNTAX
516
517; KEYB [lang],[cp],[[d:][path]KEYBOARD.SYS][/ID:id]
518
519
520
521;************************************************************************
522
523KEYB_SECURE PROC NEAR
524
525
526
527;RESERVED ADDRESS 013h BITS 1 & 2
528
529; PASS_MODE equ 00000001B ;AN000;
530; SERVER_MODE equ 00000010B ;AN000;
531
532
533
534; SECRET_ADD equ 13h ;AN000;
535; PORT_70 equ 70h ;AN000;
536; PORT_71 equ 71h ;AN000;
537
538; PUSH AX ;AN000; ;SAVE THE CURRENT ENVIRONMENT
539; PUSH BX ;AN000;
540; PUSH CX ;AN000;
541; PUSH DX ;AN000;
542; PUSH CS ;AN000;
543; PUSH DS ;AN000;
544; PUSH ES ;AN000;
545; PUSH SI ;AN000;
546; PUSH DI ;AN000;
547 CLI ;AN000;;DISABLE THE INTERRUPT TO AVOID
548 ;AN000;;THE CMOS REGISTER BEFORE
549 ;AN000;;THE READ & WRITE IS DONE
550
551 XOR AX,AX
552 MOV AL,SECRET_ADD
553 OUT PORT_70,AL ;AN000;;SEND THE ADDRESS CONTAINING THE
554 ;BITS FOR THE PASSWORD AND SERVER
555 ;MODE STATE TO PORT 70H
556
557
558
559
560
561 IN AL,PORT_71 ;AN000;;READ THE DATA IN TO GET THE
562 ;RESULTS OF THE CHECK FOR THE
563 ;EXISTENCE OF SECURITY.
564
565 MOV DX,AX
566
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
570 JMP SECURE_RET
571
572KEYB_LOCKED:
573
574 STC ; MOV AX,1 ;AN000;SET THE SECURITY FLAG
575 ;ON;
576 ;PROCEED - EITHER SYSTEM IS AN
577 ;AT OR THE SYSTEM IS UNLOCKED
578SECURE_RET:
579
580 STI ;AN000;;ENABLE THE INTERRUPT
581
582
583; POP DI ;AN000;
584; POP SI ;AN000;
585; POP ES ;AN000;
586; POP DS ;AN000;
587; POP CS ;AN000;
588; POP DX ;AN000;
589; POP CX ;AN000;
590; POP BX ;AN000;
591; POP AX ;AN000; ;SAVE THE CURRENT ENVIRONMENT
592
593
594 RET
595
596
597KEYB_SECURE ENDP
598
599
600
601
602CODE ENDS
603 END