]>
wirehaze git hosting - MS-DOS.git/blob - v4.0/src/CMD/KEYB/KEYBI9C.ASM
3 TITLE DOS KEYB Command
- Interrupt
9 (US support
)
5 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6 ;; DOS - NLS Support - KEYB Command
7 ;; (C) Copyright 1988 Microsoft
9 ;; File Name: KEYBI9C.ASM
14 ;; Interrupt 9 mainline.
15 ;; This routine handles all US keyboard support for the following
16 ;; system units: PCjr, PC, PCXT, PCAT, PALACE, ROUNDUP, PC Convertible
17 ;; KEYB_STATE_PROCESSOR is called for non-US keyboard support.
20 ;; Documentation Reference:
21 ;; ------------------------
22 ;; PC DOS 3.3 Detailed Design Document - May 1986
24 ;; Procedures Contained in This File:
25 ;; ----------------------------------
26 ;; KEYB_INT_9 - Interrupt 9
28 ;; External Procedure References:
29 ;; ------------------------------
30 ;; FROM FILE KEYBI9.ASM:
31 ;; KEYB_STATE_PROCESSOR - Non US keyboard support.
33 ;; Linkage Information: Refer to file KEYB.ASM
34 ;; --------------------
38 ;; ;AN001; - DCR 478 - KEYBOARD INT SPLICING NickS
39 ;; ;AN002; - PTM 3090 ENABLING RIGHT CTL FOR RE-BOOTING
40 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
42 INCLUDE KEYBEQU
.INC ;;
43 INCLUDE DSEG
.inc ;; System data segments
44 INCLUDE POSTEQU
.inc ;; System equates
45 INCLUDE KEYBSHAR
.INC ;;
46 INCLUDE KEYBI2F
.INC ;;
48 INCLUDE KEYBCPSD
.INC ;;
49 INCLUDE KEYBCMD
.INC ;;
52 PUBLIC K8
;; CTRL case tables
54 PUBLIC COUNTRY_FLAG
;;
55 PUBLIC BEEP_PENDING
;;
63 PUBLIC NEW_BUFF_CTR
;;
66 ROM_SEG EQU
0F000H ;; BIOS ROM SEGMENT
67 PC1DATE_ID EQU
03138H ;; YEAR ROM WAS RELEASED IN ASCII
68 SYSROM_DATE EQU
0FFFBH ;; OFFSET OF ROM YEAR DIGIT
70 DIAGS
SEGMENT AT 0FFFFH ;;
77 CODE SEGMENT PUBLIC 'CODE' ;;
78 ASSUME
CS:CODE,DS:DATA ;;
82 END_OF_BUFF EQU
16 ;AN000;END OF TEMP BUFF VALUE
83 ACTIVE_ON EQU
-1 ;AN000;
84 ACTIVE_OFF EQU
0 ;AN000;
85 TEMP_HEAD
DW 0 ;AN000;
86 TEMP_TAIL
DW 0 ;AN000;
87 BUSY_TFLAG
DB ACTIVE_OFF
;AN000;FLAG TO CHECK BUFFER ACTIVITY
88 MYBUFF
DB 16 DUP(0) ;AN000;
89 ENABLE_FL
DB 0 ;NEW BUFFER TO BE USED
90 NEW_BUFF_CTR
DB 0 ;ON THE FRONT END OF THE
95 BUFFER_ENTRY_OK
DB 0 ;;
98 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
100 ;; TABLE OF SHIFT KEYS AND MASK VALUES
102 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
106 DB INS_KEY
;; INSERT KEY
107 DB CAPS_KEY
,NUM_KEY
,SCROLL_KEY
,ALT_KEY
,CTL_KEY
108 DB LEFT_KEY
,RIGHT_KEY
;;
111 ;------ MASK_TABLE ;;
113 DB INS_SHIFT
;; INSERT MODE SHIFT
114 DB CAPS_SHIFT
,NUM_SHIFT
,SCROLL_SHIFT
,ALT_SHIFT
,CTL_SHIFT
115 DB LEFT_SHIFT
,RIGHT_SHIFT
;;
117 ;---------- TABLES FOR ALT CASE -----;;
118 ;------ ALT-INPUT-TABLE ;;
121 DB 76,77,71,72,73 ;; 10 NUMBERS ON KEYPAD
122 ;------ SUPER-SHIFT-TABLE ;;
123 DB 16,17,18,19,20,21 ;; A-Z TYPEWRITER CHARS
124 DB 22,23,24,25,30,31 ;;
125 DB 32,33,34,35,36,37 ;;
127 DB 44,45,46,47,48,49 ;;
129 K30_LEN EQU
$-K30
-10 ;;
131 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
132 ;; K8 is overlaid by K8_RPL (from module KEYB_COMMAND)
133 ;; if extended INT 16 support is available
134 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
136 K8
LABEL BYTE ;;-------- CHARACTERS ---------
137 DB 27,-1,00,-1,-1,-1 ;; Esc, 1, 2, 3, 4, 5
138 DB 30,-1,-1,-1,-1,31 ;; 6, 7, 8, 9, 0, -
139 DB -1,127,-1,17,23,5 ;; =, Bksp, Tab, Q, W, E
140 DB 18,20,25,21,09,15 ;; R, T, Y, U, I, O
141 DB 16,27,29,10,-1,01 ;; P, [, ], Enter, Ctrl, A
142 DB 19,04,06,07,08,10 ;; S, D, F, G, H, J
143 DB 11,12,-1,-1,-1,-1 ;; K, L, ;, ', `, LShift
144 DB 28,26,24,03,22,02 ;; \, Z, X, C, V, B
145 DB 14,13,-1,-1,-1,-1 ;; N, M, ,, ., /, RShift
146 DB '*',-1,' ',-1 ;; *, Alt, Space, CL
147 ;;--------- FUNCTIONS ---------
148 DB 94,95,96,97,98,99 ;; F1 - F6
149 DB 100,101,102,103,-1,-1 ;; F7 - F10, NL, SL
150 DB 119,-1,132,-1,115,-1 ;; Home, Up, PgUp, -, Left, Pad5
151 DB 116,-1,117,-1,118,-1 ;; Right, +, End, Down, PgDn, Ins
152 DB -1,-1,-1,-1,137,138 ;; Del, SysReq, Undef, WT, F11, F12
154 ;----- TABLES FOR LOWER CASE (USA) --;;
159 DB '=',08,09,'qwe' ;;
161 DB 'p[]',0DH,-1,'a' ;; LETTERS, Return, Ctrl
163 DB "kl;'`",-1 ;; LETTERS, L Shift
166 DB -1,'*',-1,' \' ;; R Shift, *, Alt, Sp, CL (REALLY WT KEY)
168 ;------ LC TABLE SCAN ;;
169 DB 59,60,61,62,63 ;; BASE STATE OF F1 - F10
173 ;------ KEYPAD TABLE ;;
175 DB 71,72,73,-1,75,-1 ;; BASE STATE OF KEYPAD KEYS
176 DB 77,-1,79,80,81,82 ;;
178 DB -1,-1,'\',133,134 ;; SysRq, Undef, WT, F11, F12
180 ;------- TABLES FOR UPPER CASE (USA) ;;
185 DB '+',08,00,'QWE' ;;
187 DB 'P{}',0DH,-1,'A' ;; LETTERS, Return, Ctrl
189 DB 'KL:"~',-1 ;; LETTERS, L Shift
192 DB -1,'*',-1,' |' ;; R Shift, *, Alt, Sp, CL (REALLY WT KEY)
194 ;------ UC TABLE SCAN ;;
196 DB 84,85,86,87,88 ;; SHIFTED STATE OF F1 - F10
200 ;------ NUM STATE TABLE ;;
202 DB '789-456+1230.' ;; NUMLOCK STATE OF KEYPAD KEYS
203 DB -1,-1,'|',135,136 ;; SysRq, Undef, WT, F11, F12
205 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
207 ;; Procedure: KEYB_INT_9
210 ;; Entry point for interrupt 9 processing.
218 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
220 KEYB_INT_9 PROC
NEAR ;;
221 JMP KB_INT_1
; THIS JUMP AND ENSUING BYTE MUST BE HERE TO BE
222 COUNTRY_FLAG
DB -1 ; COMPATIBLE WITH APL. APL WILL FORCE THIS
223 ; BYTE TO BE ZERO, ONLY BECAUSE IT'S 3 BYTES
224 KB_INT_1: ; AWAY FROM WHERE THE INT9 VECTOR POINTS
232 ; mov ax,word ptr ds:[bx] ;ICE
233 ; mov word ptr ds:[bx],ax ;ICE
247 STI ; ENABLE INTERRUPTS
248 CLD ; FORWARD DIRECTION
250 MOV BX,DATA ; SET UP ADDRESSING
251 MOV DS,BX ;; DS POINTS AT THE
252 MOV CS:BEEP_PENDING
,NO
;; ROM DATA AREA
253 MOV CS:BUFFER_ENTRY_OK
,NO
;; INITIALIZE ALL FLAGS
254 ;***CNS ;; FOR LOADING AND UNLOADING THE
255 CMP CS:BUSY_TFLAG
,ACTIVE_ON
258 MOV DI,OFFSET
CS:MYBUFF
262 ; MOV CS:NEW_BUFF_CTR,0 ;;CLEAR OUT NEW BUFFER CTR
266 ;------- TEST SYSTEM TYPE ;CHECK TO SEE IF THE SYSTEM IS
271 TEST CS:SD
.SYSTEM_FLAG
,PC_AT
+PC_386
; IF THE SYSTEM WE'RE RUNNING ON IS A
272 JNZ KB_INT_00
; PC3, THEN DO PC3 CODE
274 ;------ PC1, XT, HOME COMPUTER POST CODE
276 TEST CS:SD
.SYSTEM_FLAG
,PC_JR
;; Q..PCjr?
277 JZ READ_CHAR_PORT
;; N..go read port
278 MOV BL,CS:SD
.JR_KB_FLAG
;; Its a JR so incorporate flag bits
279 OR KB_FLAG
,BL ;; from INT 48 preprocessor
280 MOV CS:SD
.JR_KB_FLAG
,0 ;; Clear JR KB_Flag
281 JMP UP1MORE
;UP1 ;; Skip to key processing
284 IN AL,KB_DATA
;; READ IN THE CHARACTER
285 ;; FOR PC, XT, P12: RESET THE KEYBOARD
286 TEST CS:SD
.SYSTEM_FLAG
,PC_XT
+PC_LAP
289 IN AL,KB_CTL
; GET THE CONTROL PORT
290 MOV AH,AL ; SAVE VALUE
291 OR AL,80H
; RESET BIT FOR KEYBOARD
293 XCHG AH,AL ; GET BACK ORIGINAL CONTROL
294 OUT KB_CTL
,AL ; KB HAS BEEN RESET
295 POP AX ; GET SCAN CODE BACK RWV 11-06-85
297 ;----- SYSTEM HOOK INT 15H - FUNCTION 4FH (ON HARDWARE INTERRUPT LEVEL 9H)
300 MOV AH,04FH ; SYSTEM INTERCEPT - KEY CODE FUNCTION
301 STC ; SET CY= 1 (IN CASE OF IRET)
302 INT 15H
; CASSETTE CALL (AL)= KEY SCAN CODE
303 ; RETURNS CY= 1 FOR INVALID FUNCTION
304 STI ; MAKE SURE INT'S STAY ENABLED RWV 11-11-85
305 JC UP1MORE
; CONTINUE IF CARRY FLAG SET ((AL)=CODE)
306 JMP PREP_EXIT
; EXIT IF SYSTEM HANDLED SCAN CODE
307 ; EXIT HANDLES HARDWARE EOI AND ENABLE
317 ;------ PCAT POST CODE
319 ;------ WAIT FOR KEYBOARD DISABLE COMMAND TO BE ACCEPTED
321 MOV AL,DIS_KBD
; DISABLE THE KEYBOARD COMMAND
322 CALL SHIP_IT
; EXECUTE DISABLE
323 CLI ; DISABLE INTERRUPTS
324 ; SUB CX,CX ; SET MAXIMUM TIMEOUT
326 ; IN AL,STATUS_PORT ; READ ADAPTER STATUS
327 ; TEST AL,INPT_BUF_FULL ; CHECK INPUT BUFFER FULL STATUS BIT
328 ; LOOPNZ KB_INT_01 ; WAIT FOR COMMAND TO BE ACCEPTED
330 CALL WAIT_ON_STATUS_PORT
;;
332 ;----- READ CHARACTER FROM KEYBOARD INTERFACE
336 IN AL,PORT_A
;;AN000;GET SCAN CODE VALUE FROM PORT 60H
344 ; mov ax,word ptr ds:[bx] ;ICE
345 ; mov word ptr ds:[bx],ax ;ICE
350 ;----- SYSTEM HOOK INT 15H - FUNCTION 4FH (ON HARDWARE INTERRUPT LEVEL 9H)
352 MOV AH,04FH ; SYSTEM INTERCEPT - KEY CODE FUNCTION
353 STC ; SET CY= 1 (IN CASE OF IRET)
354 INT 15H
; CASSETTE CALL (AL)= KEY SCAN CODE
355 ; RETURNS CY= 1 FOR INVALID FUNCTION
356 JC LOAD_TBUFF
; CONTINUE IF CARRY FLAG SET ((AL)=CODE)
357 JMP PREP_EXIT
; EXIT IF SYSTEM HANDLED SCAN CODE
358 ; EXIT HANDLES HARDWARE EOI AND ENABLE
364 CMP CS:NEW_BUFF_CTR
,END_OF_BUFF
+1 ;;AN000;CHECK TO SEE IF THE SECONDARY BUFFER IS FULL
370 CALL CLEAR_BUFFER
;;CLEAR OUT NEW BUFFER
373 MOV CS:TEMP_HEAD
,DI ;;AN000;RESET POINTER BACK TO THE BEGINNING
374 MOV CS:TEMP_TAIL
,DI ;;AN000;RESET POINTER BACK TO THE BEGINNING
375 MOV CS:BUSY_TFLAG
,ACTIVE_OFF
;;AN000;
376 MOV CS:NEW_BUFF_CTR
,0 ;;CLEAR OUT NEW BUFFER CTR
381 MOV DI,CS:TEMP_TAIL
;;AN003;MOVE PTR TO LATEST INSERT POSITION
382 MOV BYTE PTR CS:[DI],AL ;;AN000;LOAD CHARACTER INTO MY BUFFER
383 INC CS:NEW_BUFF_CTR
;;AN000;
384 INC DI ;;AN000;TAIL POINTER NEEDS TO BE ADVANCED
385 MOV CS:TEMP_TAIL
,DI ;;AN000;ADD ONE TO TAIL POINTER
386 ;;AN000;GET ANOTHER CHAR. IF AVAILABLE
387 TEST CS:BUSY_TFLAG
,ACTIVE_ON
;;AN000;CHECK TO SEE IF WE ARE IN A BUSY STATE
388 JZ KEEP_BUSY
;;AN000;IF YES ROUTINE TO UNLOAD TEMP BUFFER
389 CLI ; TURN OFF INTERRUPTS
393 MOV AL,EOI
; END OF INTERRUPT COMMAND
394 OUT 020H,AL ; SEND COMMAND TO INTERRUPT CONTROL PORT
404 ; mov ax,word ptr ds:[bx] ;ICE
405 ; mov word ptr ds:[bx],ax ;ICE
409 ;;AN000;OTHERWISE FREE UP THE PROCESSOR
410 MOV CS:BUSY_TFLAG
,ACTIVE_OFF
;;AN000;
411 JMP KEY_EXIT
; KEY_EXIT
427 AND KB_FLAG_3
,NOT LC_E0
+LC_E1
; RESET LAST CHAR H.C. FLAG RWV 7-23-85
430 CHK_BEEPER: ; INTERRUPT-RETURN
432 CMP CS:BEEP_PENDING
,YES
;; Q..SHOULD WE BEEP?
434 MOV CS:BEEP_PENDING
,NO
;;
438 TEST CS:SD
.SYSTEM_FLAG
,PC_JR
;;
439 JNZ KEY_EXIT
;K27A ;;
440 CLI ; TURN OFF INTERRUPTS
441 MOV AL,EOI
; END OF INTERRUPT COMMAND
442 OUT 020H,AL ; SEND COMMAND TO INTERRUPT CONTROL PORT
444 ENABLE_CHK: ; INTERRUPT-RETURN-NO-EOI
446 MOV AL,ENA_KBD
; ENSURE KEYBOARD IS ENABLED (AT ONLY)
447 CALL SHIP_IT
; EXECUTE ENABLE
448 CMP CS:BUFFER_ENTRY_OK
,YES
;; ENTRY IN BUFFER?
449 JNE GOOD_ENTRY
;K271 ;; NO, SKIP POST
450 MOV AX,09102H ; MOVE IN POST CODE & TYPE
451 INT 15H
; PERFORM OTHER FUNCTION
458 CLI ; DISABLE INTERRUPTS
459 POP ES ; RESTORE REGISTERS
468 IRET ; RETURN, INTERRUPTS BACK ON WITH FLAG CHANGE
469 ;;AND RETURN INT OFF OF THE STACK
475 CALL CLEAR_BUFFER
;;UNLOAD THE TEMPORARY BUFFER
482 ;(*EQUIVALENT TO PREP_EXIT*)
483 ;; Procedure: CLEAR_BUFFER
484 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
490 MOV DI,CS:TEMP_HEAD
;;AN000;RESET POINTER BACK TO THE BEGINNING
491 MOV CS:BUSY_TFLAG
,ACTIVE_ON
;;AN000;
496 MOV AL,EOI
;;AN000; END OF INTERRUPT COMMAND
497 OUT 020H,AL ;;AN000; SEND COMMAND TO INTERRUPT CONTROL PORT
503 ;;AN000; INTERRUPT-RETURN-NO-EOI
504 GET_KB: ;;AN000;AN000;
506 CLI ;;AN000;DO NOT PROCESS UNTIL UNLOADED
508 MOV AL,BYTE PTR CS:[DI] ;;AN000;TEMPORARY BUFFER
509 STI ;;AN000;ENABLE SO I CAN KEEP PROCESSING
517 PUSH DI ;;AN000;SAVE THE POINTER
519 CALL OLD_METHOD
;;AN000;LOAD USING EXISTING METHOD
521 POP DI ;;AN000;RESTORE THE POINTER
532 INC DI ;;AN000;INCREMENT POINTER
533 CMP DI,CS:TEMP_TAIL
;;AN000;IS THE BUFFER EMPTY YET?
534 JE EMPTY_BUFF
;;AN000;YES - MARK INACTIVE & RETURN
538 JMP GET_KB
;;AN000;NO - GET ANOTHER CHARACTER
544 CLI ;;AN000;OTHERWISE DISABLE INTERRUPTS
545 MOV CS:BUSY_TFLAG
,ACTIVE_OFF
;;AN000;LET SYSTEM KNOW NOT BUSY ANYMORE
546 MOV CS:NEW_BUFF_CTR
,0 ;;CLEAR OUT NEW BUFFER CTR
556 KB_INT_02: ; (AL)= SCAN CODE
557 STI ; ENABLE INTERRUPTS AGAIN
558 CMP AL,KB_RESEND
; IS THE INPUT A RESEND
559 JE KB_INT_4
; GO IF RESEND
561 ;------ CHECK FOR RESPONSE TO A COMMAND TO KEYBOARD
563 CMP AL,KB_ACK
; IS THE INPUT AN ACKNOWLEDGE
564 JNZ KB_INT_2
; GO IF NOT
566 ;------ A COMMAND TO THE KEYBOARD WAS ISSUED
568 CLI ; DISABLE INTERRUPTS
569 OR KB_FLAG_2
,KB_FA
; INDICATE ACK RECEIVED
571 ; JMP PREP_EXIT ; RETURN IF NOT (ACK RETURNED FOR DATA)
573 ;------ RESEND THE LAST BYTE
576 CLI ; DISABLE INTERRUPTS
577 OR KB_FLAG_2
,KB_FE
; INDICATE RESEND RECEIVED
579 ; JMP PREP_EXIT ; RETURN IF NOT (ACK RETURNED FOR DATA)
582 ;------ UPDATE MODE INDICATORS IF CHANGE IN STATE
585 PUSH AX ; SAVE DATA IN
586 CALL MAKE_LED
; GO GET MODE INDICATOR DATA BYTE
587 MOV BL,KB_FLAG_2
; GET PREVIOUS BITS
588 XOR BL,AL ; SEE IF ANY DIFFERENT
589 AND BL,07H ; ISOLATE INDICATOR BITS
590 JZ UP0
; IF NO CHANGE BYPASS UPDATE
591 CALL SND_LED
; GO TURN ON MODE INDICATORS
593 ;------ PROCESSING COMES BACK TOGETHER HERE
595 UP0: POP AX ; RESTORE DATA IN
597 ;---------------------------------------------------------------------
598 ; START OF KEY PROCESSING -
599 ;---------------------------------------------------------------------
601 UP1: MOV AH,AL ; SAVE SCAN CODE IN AH ALSO
602 MOV CS:SCAN_CODE
,AL ;; SAVE SCAN CODE
604 ;------ TEST FOR OVERRUN SCAN CODE FROM KEYBOARD
606 CMP AL,0FFH ; IS THIS AN OVERRUN CHAR?
607 JNZ K16
; NO, TEST FOR SHIFT KEY
608 MOV CS:BEEP_PENDING
,YES
;;
609 TEST CS:SD
.SYSTEM_FLAG
,PC_JR
;; ON JR WE HAVE TO CLEAR SOME FLAGS
611 AND KB_FLAG
,0F0H ;; CLEAR SHIFTS
613 AND KB_FLAG_2
,1FH
;; CLEAR FUNCTION STATES
616 ; JMP PREP_EXIT ; BUFFER_FULL_BEEP
619 POP ES ; ESTABLISH ADDRESS OF TABLES
620 MOV BH,KB_FLAG_3
; LOAD FLAGS FOR TESTING RWV 10-08-85
622 ;------ TEST TO SEE IF A READ_ID IS IN PROGRESS
624 TEST BH,RD_ID
+LC_AB
; ARE WE DOING A READ ID? RWV 10-08-85
625 JZ NOT_ID
; CONTINUE IF NOT
626 JNS TST_ID_2
; IS THE RD_ID FLAG ON?
627 CMP AL,ID_1
; IS THIS THE 1ST ID CHARACTER?
629 OR KB_FLAG_3
,LC_AB
; INDICATE 1ST ID WAS OK
631 AND KB_FLAG_3
,NOT RD_ID
; RESET THE READ ID FLAG
632 JMP SHORT ID_EX
; AND EXIT RWV 8-02-85
635 AND KB_FLAG_3
,NOT LC_AB
; RESET FLAG
636 CMP AL,ID_2A
; IS THIS THE 2ND ID CHARACTER?
637 JE KX_BIT
; JUMP IF SO
638 CMP AL,ID_2
; IS THIS THE 2ND ID CHARACTER?
639 JNE ID_EX
; LEAVE IF NOT
641 ;------ A READ ID SAID THAT IT WAS ENHANCED KEYBOARD
643 TEST BH,SET_NUM_LK
; SHOULD WE SET NUM LOCK? RWV 10-08-85
644 JZ KX_BIT
; EXIT IF NOT
645 OR KB_FLAG
,NUM_STATE
; FORCE NUM LOCK ON
646 CALL SND_LED
; GO SET THE NUM LOCK INDICATOR
647 KX_BIT: OR KB_FLAG_3
,KBX
; INDICATE ENHANCED KEYBOARD WAS FOUND
648 ID_EX: ;JMP PREP_EXIT ; EXIT
652 CMP AL,MC_E0
; IS THIS THE GENERAL MARKER CODE? RWV 7-19-85
653 JNE TEST_E1
; RWV 7-19-85
654 OR KB_FLAG_3
,LC_E0
+KBX
; SET FLAG BIT, SET KBX, AND RWV 7-19-85
655 JMP SHORT EXIT
; THROW AWAY THIS CODE RWV 7-19-85
658 CMP AL,MC_E1
; IS THIS THE PAUSE KEY? RWV 7-19-85
659 JNE NOT_HC
; RWV 7-19-85
660 OR KB_FLAG_3
,LC_E1
+KBX
; SET FLAG, PAUSE KEY MARKER CODE RWV 7-19-85
664 RET;JMP CHK_BEEPER ; THROW AWAY THIS CODE RWV 7-19-85
667 AND AL,07FH ; TURN OFF THE BREAK BIT RWV 7-28-85
668 TEST BH,LC_E0
; LAST CODE THE E0 MARKER CODE? RWV 10-08-85
669 JZ NOT_LC_E0
; JUMP IF NOT RWV
671 MOV CX,2 ; LENGTH OF SEARCH RWV
672 MOV DI,OFFSET
K6+6 ; IS THIS A SHIFT KEY? RWV
673 REPNE SCASB ; CHECK IT RWV
674 JNE K16A
; NO, CONTINUE KEY PROCESSING RWV
675 JMP SHORT K16B
; YES, THROW AWAY & RESET FLAG RWV
678 TEST BH,LC_E1
; LAST CODE THE E1 MARKER CODE? RWV 10-08-85
679 JZ T_SYS_KEY
; JUMP IF NOT RWV
681 MOV CX,4 ; LENGTH OF SEARCH RWV
682 MOV DI,OFFSET
K6+4 ; IS THIS AN ALT, CTL, OR SHIFT? RWV
683 REPNE SCASB ; CHECK IT RWV
684 JE EXIT
; THROW AWAY IF SO RWV
686 CMP AL,NUM_KEY
; IS IT THE PAUSE KEY? RWV
687 JNE K16B
; NO, THROW AWAY & RESET FLAG RWV
688 TEST AH,80H
; YES, IS IT THE BREAK OF THE KEY? RWV
689 JNZ K16B
; YES, THROW THIS AWAY, TOO RWV
690 TEST KB_FLAG_1
,HOLD_STATE
; NO, ARE WE PAUSED ALREADY? PED 6-25-86
691 JNZ K16B
; YES, THROW AWAY PED 6-25-86
692 JMP K39P
; NO, THIS IS THE REAL PAUSE STATE RWV
694 ;------ TEST FOR SYSTEM KEY
697 CMP AL,SYS_KEY
; IS IT THE SYSTEM KEY?
698 JNE K16A
; CONTINUE IF NOT
700 ;;;;;; TEST cs:SD.SYSTEM_FLAG,PC_AT+PC_386 ; LET ALL SYSTEMS ISSUE INT15 RWV 8-02-85
701 ;;;;;; JZ K16A ; IGNORE SYSTEM KEY IF NOT PC3
703 TEST AH,080H ; CHECK IF THIS A BREAK CODE
704 JNZ K16C
; DON'T TOUCH SYSTEM INDICATOR IF TRUE
706 TEST KB_FLAG_1
,SYS_SHIFT
; SEE IF IN SYSTEM KEY HELD DOWN
707 JNZ K16B
; IF YES, DON'T PROCESS SYSTEM INDICATOR
709 OR KB_FLAG_1
,SYS_SHIFT
; INDICATE SYSTEM KEY DEPRESSED
713 MOV AL,EOI
; END OF INTERRUPT COMMAND
714 OUT 020H,AL ; SEND COMMAND TO INTERRUPT CONTROL PORT
718 ; INTERRUPT-RETURN-NO-EOI
720 MOV AL,ENA_KBD
; INSURE KEYBOARD IS ENABLED
721 CALL SHIP_IT
; EXECUTE ENABLE
723 MOV AX,08500H ; FUNCTION VALUE FOR MAKE OF SYSTEM KEY
724 STI ; MAKE SURE INTERRUPTS ENABLED
725 INT 15H
; USER INTERRUPT
728 RET;JMP KEY_EXIT ; END PROCESSING
730 K16B: ;JMP PREP_EXIT ; IGNORE SYSTEM KEY
732 K16C: AND KB_FLAG_1
,NOT SYS_SHIFT
; TURN OFF SHIFT KEY HELD DOWN
736 MOV AL,EOI
; END OF INTERRUPT COMMAND
737 OUT 020H,AL ; SEND COMMAND TO INTERRUPT CONTROL PORT
741 ; INTERRUPT-RETURN-NO-EOI
742 MOV AL,ENA_KBD
; ENSURE KEYBOARD IS ENABLED
743 CALL SHIP_IT
; EXECUTE ENABLE
745 MOV AX,08501H ; FUNCTION VALUE FOR BREAK OF SYSTEM KEY
746 STI ; MAKE SURE INTERRUPTS ENABLED
747 INT 15H
; USER INTERRUPT
750 RET;JMP KEY_EXIT ; IGNORE SYSTEM KEY
753 ;------ TEST FOR SHIFT KEYS
755 ; HERE IS WHERE KBFLAGS ARE SET. WHAT HAPPENS IS, THE SYSTEM SEARCHES TABLE
756 ; 'K6' FOR THE KEY. IF FOUND, IT GETS THE APPROPRIATE BIT FROM TABLE 'K7'
757 ; AND SETS IT ON. (TABLES ARE ALL AT THE END OF THIS ROUTINE) FLAGS FOR THE
758 ; SECOND ALT AND CTRL ARE SET IN KB_FLAG_3 AND HAVE THE SAME BIT POSITIONS AS
759 ; THEIR ORIGINAL COUNTERPARTS IN KB_FLAG
761 K16A: MOV BL,KB_FLAG
; PUT STATE FLAGS IN BL RWV 8-28-85
762 MOV DI,OFFSET
K6 ; SHIFT KEY TABLE
764 REPNE SCASB ; LOOK THROUGH THE TABLE FOR A MATCH
765 MOV AL,AH ; RECOVER SCAN CODE
766 JE K17
; JUMP IF MATCH FOUND
767 JMP K25
; IF NO MATCH, THEN SHIFT NOT FOUND
769 ;------ SHIFT KEY FOUND
771 K17: SUB DI,OFFSET
K6+1 ; ADJUST PTR TO SCAN CODE MTCH
772 MOV AH,CS:K7[DI] ; GET MASK INTO AH
773 MOV CL,2 ; SET UP COUNT FOR FLAG SHIFTS RWV 9-11-85
774 TEST AL,80H
; TEST FOR BREAK KEY
776 JMP K23
; JUMP IF BREAK RWV 8-14-85
778 ;------ SHIFT MAKE FOUND, DETERMINE SET OR TOGGLE
780 K17C: CMP AH,SCROLL_SHIFT
781 JAE K18
; IF SCROLL SHIFT OR ABOVE, TOGGLE KEY
783 ;------ PLAIN SHIFT KEY, SET SHIFT ON
785 CMP COUNTRY_FLAG
,0FFh ; ARE WE IN FOREIGN LANG MODE? RWV 8-29-85
786 JNE K17C1
; NO, US MODE, JUMP RWV 8-29-85
787 CMP AL,ALT_KEY
; IS THIS THE ALT KEY? RWV 8-29-85
788 JNE K17C1
; NO, NORMAL KEY RWV 8-29-85
790 ;;AD000TEST KB_FLAG_3,LC_E0 ; IS IT THE ALT_GR KEY? RWV 8-29-85
791 ;;AD000JNZ K17C2 ; YES, DON'T SET KB_FLAG RWV 8-29-85
794 K17C1: OR KB_FLAG
,AH ; TURN ON SHIFT BIT RWV 8-28-85
795 K17C2: TEST AH,CTL_SHIFT
+ALT_SHIFT
; IS IT ALT OR CTRL? RWV 8-28-85
796 JZ K17F
; NO, JUMP RWV 8-28-85
797 K17D: TEST BH,LC_E0
; IS THIS ONE OF THE NEW KEYS? RWV 10-08-85
798 JZ K17E
; NO, JUMP RWV 7-22-85
799 OR KB_FLAG_3
,AH ; SET BITS FOR RIGHT CTRL, ALT RWV 7-22-85
801 ; JMP PREP_EXIT ; INTERRUPT_RETURN RWV 7-22-85
802 K17E: SHR AH,CL ; MOVE FLAG BITS TWO POSITIONS RWV 8-28-85
803 OR KB_FLAG_1
,AH ; SET BITS FOR LEFT CTRL, ALT RWV 7-22-85
806 ;; Q..typewriter caps locks
808 TEST CS:SD
.SPECIAL_FEATURES
,TYPEWRITER_CAPS_LK
809 JZ K17G
;; N..all done
810 CMP COUNTRY_FLAG
,0FFh ; ARE WE IN LANG MODE? RWV 8-28-85
811 JNE K17G
; NO, ALL DONE WITH SHIFT KEY RWV 8-28-85
813 ;; If keyboard is P12 then we still need to release caps_lk ***RPS 10-3-86
815 TEST CS:SD
.SYSTEM_FLAG
,PC_LAP
;; IS THIS A P12 KEYBOARD? ***RPS 10-3-86
816 JNZ REMOVE_CAPS_SHIFT
;; ***RPS 10-3-86
818 TEST BH,KBX
; THIS THE ENHANCED KEYBOARD? RWV 11-06-85
819 JZ K17G
; NO, ALL DONE WITH SHIFT KEY RWV 8-13-85
820 REMOVE_CAPS_SHIFT: ;; ***RPS 10-3-86
821 AND KB_FLAG
,NOT CAPS_SHIFT
; YES, TAKE KB OUT OF C_L STATE RWV 8-13-85
822 TEST CS:SD
.SYSTEM_FLAG
,PC_AT
+PC_386
; IF THIS IS A PC1 OR XT, RWV 9-18-85
823 JZ K17G
; THEN SKIP THE LEDs RWV 9-18-85
824 CALL SND_LED
; AND UPDATE THE INDICATOR RWV 8-13-85
825 K17G: RET;JMP PREP_EXIT
827 ;------ TOGGLED SHIFT KEY, TEST FOR 1ST MAKE OR NOT
830 TEST BL,CTL_SHIFT
; CHECK CTL SHIFT STATE RWV 7-30-85
831 JZ K18A
; JUMP IF NOT CTL STATE
832 JMP K25
; JUMP IF CTL STATE
833 K18A: CMP AL,INS_KEY
; CHECK FOR INSERT KEY
834 JNE K22
; JUMP IF NOT INSERT KEY
835 TEST BL,ALT_SHIFT
; CHECK FOR ALTERNATE SHIFT RWV 7-30-85
836 JZ K18B
; JUMP IF NOT ALTERNATE SHIFT RWV 7-30-85
837 JMP K25
; JUMP IF ALTERNATE SHIFT
838 K18B: TEST BH,LC_E0
; IS THIS THE NEW INSERT KEY? RWV 10-08-85
839 JNZ K22
; YES, THIS ONE'S NEVER A "0" RWV 7-23-85
840 K19: TEST BL,NUM_STATE
; CHECK FOR BASE STATE RWV 7-30-85
841 JNZ K21
; JUMP IF NUM LOCK IS ON
842 TEST BL,LEFT_SHIFT
+RIGHT_SHIFT
; TEST FOR SHIFT STATE RWV 7-30-85
843 JZ K22
; JUMP IF BASE STATE
844 K20: MOV AH,AL ; PUT SCAN CODE BACK IN AH RWV 11-07-85
845 JMP K25
; NUMERAL "0", STNDRD. PROCESSING RWV 7-22-85
847 K21: TEST BL,LEFT_SHIFT
+RIGHT_SHIFT
; MIGHT BE NUMERIC RWV 7-30-85
848 JZ K20
; IS NUMERIC, STD. PROC. RWV 7-23-85
850 K22: ; SHIFT TOGGLE KEY HIT; PROCESS IT
851 TEST AH,KB_FLAG_1
; IS KEY ALREADY DEPRESSED?
853 RET;JMP PREP_EXIT ; JUMP IF KEY ALREADY DEPRESSED
854 K22A: OR KB_FLAG_1
,AH ; INDICATE THAT THE KEY IS DEPRESSED
855 XOR KB_FLAG
,AH ; TOGGLE THE SHIFT STATE
857 TEST CS:SD
.SPECIAL_FEATURES
,TYPEWRITER_CAPS_LK
858 JZ K22C
;; N..all done
860 ;; If keyboard is P12 then we do not toggle ***RPS 10-3-86
862 TEST CS:SD
.SYSTEM_FLAG
,PC_LAP
;; IS THIS A P12 KEYBOARD? ***RPS 10-3-86
863 JNZ LAP_SO_DONT_TOGGLE
;; ***RPS 10-3-86
865 TEST BH,KBX
; THIS THE ENHANCED KEYBOARD? RWV 11-06-85
866 JZ K22C
; NO, ALL DONE WITH TOGGLE KEYS RWV 8-13-85
868 LAP_SO_DONT_TOGGLE: ;; ***RPS 10-3-86
869 CMP CS:COUNTRY_FLAG
,0FFh ; ARE WE IN FOREIGN LANG MODE? RWV 9-11-85
870 JNE K22C
; NO, NO SPECIAL STUFF FOR U.S. RWV 9-11-85
871 TEST AH,CAPS_SHIFT
; IS IT THE CAPS_LOCK KEY? RWV 8-13-85
872 JZ K22C
; NO, NOTHING ELSE TO DO RWV 8-13-85
873 OR KB_FLAG
,AH ; YES, SET CAPS_LOCK (NOT TOGGLE) RWV 8-13-85
875 ;------- TEST SYSTEM TYPE
877 K22C: TEST CS:SD
.SYSTEM_FLAG
,PC_AT
+PC_386
; IF THE SYSTEM WE'RE RUNNING ON IS
878 JZ K22B
; A PC1 OR XT, THEN SKIP THE LEDs
880 ;------ TOGGLE LED IF CAPS, NUM, OR SCROLL KEY DEPRESSED
882 TEST AH,CAPS_SHIFT
+NUM_SHIFT
+SCROLL_SHIFT
; SHIFT TOGGLE?
884 PUSH AX ; SAVE SCAN CODE AND SHIFT MASK
885 CALL SND_LED
; GO TURN MODE INDICATORS ON
886 POP AX ; RESTORE SCAN CODE
888 K22B: CMP AL,INS_KEY
; TEST FOR 1ST MAKE OF INSERT KEY
890 JE INS_CHK
; JUMP IF NOT INSERT KEY
897 MOV AH,AL ; SCAN CODE IN BOTH HALVES OF AX RWV 7-24-85
898 JMP K28
; FLAGS UPDATED, PROC. FOR BUFFER RWV 7-23-85
900 ;------ BREAK SHIFT FOUND
902 K23: ; BREAK-SHIFT-FOUND
903 CMP AH,SCROLL_SHIFT
; IS THIS A TOGGLE KEY?
905 JAE K24
; YES, HANDLE BREAK TOGGLE
906 AND KB_FLAG
,AH ; TURN OFF SHIFT BIT
907 CMP AH,NOT CTL_SHIFT
; IS THIS ALT OR CTL? RWV 8-29-85
908 JA K23D
; NO, ALL DONE RWV 8-29-85
912 TEST BH,LC_E0
; 2ND ALT OR CTL? RWV 10-08-85
913 JZ K23A
; NO, HANDLE NORMALLY RWV 7-22-85
914 AND KB_FLAG_3
,AH ; RESET BIT FOR RIGHT ALT OR CTL RWV 7-22-85
915 JMP SHORT K23B
; CONTINUE RWV 7-22-85
916 K23A: SAR AH,CL ; MOVE THE MASK BIT TWO POSITIONS RWV 8-28-85
917 AND KB_FLAG_1
,AH ; RESET BIT FOR LEFT ALT OR CTL RWV 8-28-85
918 K23B: MOV AH,AL ; SAVE SCAN CODE RWV 8-28-85
919 MOV AL,KB_FLAG_3
; GET RIGHT ALT & CTRL FLAGS RWV 8-28-85
920 CMP COUNTRY_FLAG
,0FFH ; ARE WE IN LANGUAGE MODE? RWV 8-28-85
921 JNE K23C
; NO, LEAVE RIGHT FLAGS AS IS RWV 8-28-85
923 AND AL,NOT GRAPH_ON
; YES, FILTER OUT THE ALT_GR KEY RWV 8-28-85
925 K23C: SHR AL,CL ; MOVE TO BITS 1 & 0 RWV 8-28-85
926 OR AL,KB_FLAG_1
; PUT IN LEFT ALT & CTL FLAGS RWV 8-28-85
927 SHL AL,CL ; MOVE BACK TO BITS 3 & 2 RWV 8-28-85
928 AND AL,ALT_SHIFT
+CTL_SHIFT
; FILTER OUT OTHER GARBAGE RWV 8-28-85
929 OR KB_FLAG
,AL ; PUT RESULT IN THE REAL FLAGS RWV 8-28-85
930 MOV AL,AH ; RECOVER SAVED SCAN CODE RWV 8-28-85
932 K23D: CMP AL,ALT_KEY
+80H
; IS THIS ALTERNATE SHIFT RELEASE
933 JE ALT_SHFT
; INTERRUPT_RETURN
936 ;------ ALTERNATE SHIFT KEY RELEASED, GET THE VALUE INTO BUFFER
941 MOV AH,0 ; SCAN CODE OF 0
942 MOV ALT_INPUT
,AH ; ZERO OUT THE FIELD
943 CMP AL,0 ; WAS THE INPUT = 0?
944 JNE GOOD_ALTCHAR
; INTERRUPT_RETURN
949 CALL BUFFER_FILL_ANY_CHAR
;; Put in buffer, but use this
950 ;; entry point to avoid trashing
951 ;; an ASCII code of 255
952 RET;JMP PREP_EXIT ; INTERRUPT_RETURN
955 AND KB_FLAG_1
,AH ; INDICATE NO LONGER DEPRESSED
956 RET;JMP PREP_EXIT ; INTERRUPT_RETURN
958 ;------ TEST FOR HOLD STATE
960 K25: ; NO-SHIFT-FOUND
961 CMP AL,80H
; TEST FOR BREAK KEY
962 JB NO_BREAK
; NOTHING FOR BREAK CHARS FROM HERE ON
967 TEST KB_FLAG_1
,HOLD_STATE
; ARE WE IN HOLD STATE
968 JZ K28
; BRANCH AROUND TEST IF NOT
970 JNE HOLD_OFF
; CAN'T END HOLD ON NUM_LOCK
975 AND KB_FLAG_1
,NOT HOLD_STATE
; TURN OFF THE HOLD STATE BIT
977 ;------ EXIT POINT ;;
982 ;------ NOT IN HOLD STATE
983 ; AL, AH = SCAN CODE (ALL MAKES)
985 CMP AL,88 ; TEST FOR OUT-OF-RANGE SCAN CODES RWV 8-01-85
986 JBE SCAN_INRANGE
; IGNORE IF OUT-OF-RANGE RWV 8-01-85
992 TEST BL,ALT_SHIFT
; ARE WE IN ALTERNATE SHIFT? RWV 7-30-85
993 JZ K28A
; JUMP IF NOT ALTERNATE RWV 7-26-85
995 TEST BH,KBX
; IS THIS THE ENHANCED KEYBOARD? RWV 10-08-85
996 JZ K29
; NO, ALT STATE IS REAL RWV 7-24-85
998 TEST KB_FLAG_1
,SYS_SHIFT
; YES, IS SYSREQ KEY DOWN? RWV 7-24-85
999 JZ K29
; NO, ALT STATE IS REAL RWV 7-24-85
1002 TEST AH,LC_E0
; IS IT THE ALT_GR KEY? RWV 8-29-85
1003 JZ K28A
; YES, DON'T SET KB_FLAG RWV 8-29-85
1005 TEST AL,R_ALT_SHIFT
; TURN ON SHIFT BIT RWV 8-28-85
1006 JNZ K29
; TURN ON SHIFT BIT RWV 8-28-85
1010 K28A: JMP K38
; YES, THIS IS PHONY ALT STATE RWV 7-24-85
1011 ; DUE TO PRESSING SYSREQ RWV 7-24-85
1013 ;------ TEST FOR RESET KEY SEQUENCE (CTL ALT DEL)
1016 TEST BL,CTL_SHIFT
; ARE WE IN CONTROL SHIFT ALSO? RWV 7-30-85
1018 CMP AL,DEL_KEY
; SHIFT STATE IS THERE, TEST KEY
1019 JNE K31A
; NO_RESET, TRANSLATE TABLE SWAP
1021 ;------ CTL-ALT-DEL HAS BEEN FOUND, DO I/O CLEANUP
1023 MOV RESET_FLAG
,1234H
; SET FLAG FOR RESET FUNCTION
1024 AND WORD PTR KB_FLAG_3
,KBX
; CLEAR ALL FLAG BITS EXCEPT KBX PED 6-25-86
1025 JMP RESET
; JUMP TO POWER ON DIAGNOSTICS
1027 ;------ IN ALTERNATE SHIFT, RESET NOT FOUND
1030 CALL KEYB_STATE_PROCESSOR
;;
1031 JNC K3105
;; NO TRANSLATIONS FOUND - CONTINUE
1032 RET;JMP PREP_EXIT ;; TRANSLATIONS FOUND - EXIT
1035 CMP AL,57 ; TEST FOR SPACE KEY
1036 JNE K311
; NOT THERE
1037 MOV AL,' ' ; SET SPACE CHAR
1038 JMP K57
; BUFFER_FILL
1040 TEST CS:SD
.SYSTEM_FLAG
,EXT_16
; IS EXTENDED INT 16 LOADED? RWV 11-06-85
1041 JZ K32
; NO, SKIP THIS EXTENDED STUFF RWV 11-06-85
1042 CMP AL,15 ; TEST FOR TAB KEY RWV 10-04-85
1043 JNE K312
; NOT THERE RWV 10-04-85
1044 MOV AX,0A500h ; SET SPECIAL CODE FOR ALT-TAB RWV 10-04-85
1045 JMP K57
; BUFFER_FILL RWV 10-04-85
1047 CMP AL,74 ; TEST FOR KEYPAD - RWV 10-04-85
1048 JE K312A
; GO PROCESS RWV 10-04-85
1049 CMP AL,78 ; TEST FOR KEYPAD + RWV 10-04-85
1050 JNE K32
; SKIP TEST FOR LANG SWAP & CONT. RWV 11-06-85
1051 K312A: JMP K37B
; GO PROCESS RWV 10-04-85
1053 ;------ SET COUNTRY FLAG TO INDICATE WHICH TABLE WE'RE USING, FOREIGN OR DOMESTIC
1055 K31A: CMP AL,CS:SD
.HOT_KEY_ON_SCAN
; TEST FOR HOT KEY TO US
1057 MOV CS:COUNTRY_FLAG
,00 ; SET FLAG FOR DOMESTIC KEY'S
1058 RET;JMP PREP_EXIT ; INTERRUPT RETURN
1060 K31B: CMP AL,CS:SD
.HOT_KEY_OFF_SCAN
; TEST FOR HOT KEY TO FOREIGN
1061 JNE K31C
; IF NOT TEST FOR FRONT ENGRAV
1062 MOV CS:COUNTRY_FLAG
,0FFH ; SET FLAGS FOR FOREIGN KEY'S
1063 RET;JMP PREP_EXIT ; INTERRUPT RETURN
1066 ;------ ALT, CTRL DOWN ; NO HOT KEY
1068 K31C: CMP CS:COUNTRY_FLAG
,0FFH
1069 JNE K32
; TRY ALT_KEY_PAD
1070 CALL KEYB_STATE_PROCESSOR
;;
1071 JNC K32
;; NO TRANSLATIONS FOUND - CONTINUE
1072 RET;JMP PREP_EXIT ;; TRANSLATIONS FOUND - EXIT
1075 ;------ LOOK FOR KEY PAD ENTRY
1078 MOV DI,OFFSET K30
; ALT-INPUT-TABLE
1079 MOV CX,10 ; LOOK FOR ENTRY USING KEYPAD
1080 REPNE SCASB ; LOOK FOR MATCH
1081 JNE K33
; NO_ALT_KEYPAD
1082 TEST BH,LC_E0
; IS THIS ONE OF THE NEW KEYS? RWV 10-08-85
1083 JZ K321
; NO, PROCESS AS ALT-NUMPAD RWV 11-06-85
1084 JMP K37C
; YES, JUMP, NOT NUMPAD KEY RWV 7-24-85
1085 K321: SUB DI,OFFSET K30
+1 ; DI NOW HAS ENTRY VALUE
1086 MOV AL,ALT_INPUT
; GET THE CURRENT BYTE
1087 MOV AH,10 ; MULTIPLY BY 10
1089 ADD AX,DI ; ADD IN THE LATEST ENTRY
1090 MOV ALT_INPUT
,AL ; STORE IT AWAY
1091 K32A: RET;JMP PREP_EXIT ; THROW AWAY THAT KEYSTROKE
1093 ;------ LOOK FOR SUPERSHIFT ENTRY
1095 K33: ; NO-ALT-KEYPAD
1096 MOV ALT_INPUT
,0 ; ZERO ANY PREVIOUS ENTRY INTO INPUT
1097 ; DI,ES ALREADY POINTING
1098 MOV CX, K30_LEN
; NORMALLY 26, BUT 27 FOR FR, DUE RWV 8-06-85
1099 ; TO THE ";" KEY BEING "M" RWV 8-06-85
1100 REPNE SCASB ; LOOK FOR MATCH IN ALPHABET
1101 JNE K34
; NOT FOUND, FUNCTION KEY OR OTHER
1102 JMP SHORT K37A
; PUT IT IN THE BUFFER RWV 8-06-85
1104 ;------ LOOK FOR TOP ROW OF ALTERNATE SHIFT
1107 CMP AL,2 ; KEY WITH '1' ON IT
1108 JB K37B
; MUST BE ESCAPE RWV 10-04-85
1109 CMP AL,13 ; IS IT IN THE REGION
1110 JA K35
; NO, ALT-SOMETHING ELSE
1111 ADD AH,118 ; CONVERT PSEUDO SCAN CODE TO RANGE
1112 JMP SHORT K37A
; GO FILL THE BUFFER RWV 8-06-85
1114 ;------ TRANSLATE ALTERNATE SHIFT PSEUDO SCAN CODES
1117 CMP AL,F11_M
; IS IT F11? RWV 7-24-85
1118 JB K35A
; NO, BRANCH RWV 7-24-85
1119 CMP AL,F12_M
; IS IT F12? RWV 7-24-85
1120 JA K35A
; NO, BRANCH RWV 7-24-85
1121 ADD AH,52 ; CONVERT TO PSEUDO SCAN CODE RWV 7-24-85
1122 JMP SHORT K37A
; GO FILL THE BUFFER RWV 8-06-85
1124 K35A: TEST BH,LC_E0
; DO WE HAVE ONE OF THE NEW KEYS? RWV 10-08-85
1125 JZ K37
; NO, JUMP RWV 10-04-85
1126 TEST CS:SD
.SYSTEM_FLAG
,EXT_16
; IS THE EXTENDED INT 16 LOADED? RWV 11-06-85
1127 JZ K37
; NO, DO COMPATIBLE OUTPUT RWV 11-06-85
1128 CMP AL,28 ; TEST FOR KEYPAD ENTER RWV 10-04-85
1129 JNE K35B
; NOT THERE RWV 10-04-85
1130 MOV AX,0A600h ; SPECIAL CODE RWV 10-04-85
1131 JMP K57
; BUFFER FILL RWV 10-04-85
1132 K35B: CMP AL,83 ; TEST FOR DELETE KEY RWV 10-04-85
1133 JE K37C
; HANDLE WITH OTHER EDIT KEYS RWV 10-04-85
1134 CMP AL,53 ; TEST FOR KEYPAD / RWV 10-04-85
1135 JNE K32A
; NOT THERE, NO OTHER E0 SPECIALS RWV 10-04-85
1136 MOV AX,0A400h ; SPECIAL CODE RWV 10-04-85
1137 JMP K57
; BUFFER FILL RWV 10-04-85
1139 K37: CMP AL,59 ; TEST FOR FUNCTION KEYS (F1) RWV 10-04-85
1140 JB K37B
; NO FN, HANDLE W/OTHER EXTENDED RWV 10-04-85
1141 CMP AL,68 ; IN KEYPAD REGION? RWV 7-26-85
1142 ; OR NUMLOCK, SCROLLOCK? RWV 7-26-85
1143 JA K32A
; IF SO, IGNORE
1144 ADD AH,45 ; CONVERT TO PSEUDO SCAN CODE RWV 8-06-85
1146 K37A: MOV AL,0 ; ASCII CODE OF ZERO RWV 8-06-85
1147 JMP K57
; PUT IT IN THE BUFFER RWV 8-06-85
1150 TEST CS:SD
.SYSTEM_FLAG
,EXT_16
; IS THE EXTENDED INT 16 LOADED? RWV 11-06-85
1151 JNZ K37B1
; YES, TRANSLATE AS EXTENDED RWV 11-06-85
1152 RET;JMP PREP_EXIT ; NO, INGORE THIS ONE RWV 11-06-85
1153 K37B1: MOV AL,0F0h ; USE SPECIAL ASCII CODE RWV 10-04-85
1154 JMP K57
; PUT IT IN THE BUFFER RWV 10-04-85
1157 TEST CS:SD
.SYSTEM_FLAG
,EXT_16
; IS THE EXTENDED INT 16 LOADED? RWV 11-06-85
1158 JZ K37A
; NO, DO COMPATIBLE OUTPUT RWV 11-06-85
1159 ADD AL,80 ; CONVERT SCAN CODE (EDIT KEYS) RWV 10-07-85
1160 MOV AH,AL ; (SCAN CODE NOT IN AH FOR INSERT) RWV 10-07-85
1161 JMP K37A
; PUT IT IN THE BUFFER RWV 10-07-85
1163 ;------ NOT IN ALTERNATE SHIFT
1165 K38: ; NOT-ALT-SHIFT
1166 ; BL STILL HAS SHIFT FLAGS RWV 7-26-85
1167 TEST BL,CTL_SHIFT
; ARE WE IN CONTROL SHIFT? RWV 7-26-85
1168 JNZ K38A
; YES, START PROCESSING RWV 8-01-85
1169 JMP K44
; NOT-CTL-SHIFT
1171 ;------ CONTROL SHIFT, TEST SPECIAL CHARACTERS
1173 ;------ TEST FOR BREAK
1175 K38A: CMP AL,SCROLL_KEY
; TEST FOR BREAK
1176 JNE K39
; JUMP, NO-BREAK
1177 TEST CS:SD
.SYSTEM_FLAG
,PC_LAP
; IS THIS THE LAP COMPUTER? RWV 12-02-85
1178 JNZ K38B
; YES, THIS IS CTRL-BREAK RWV 12-02-85
1179 TEST BH,KBX
; NO, IS THIS THE ENHANCED KBD? RWV 10-08-85
1180 JZ K38B
; NO, BREAK IS VALID RWV 7-26-85
1181 TEST BH,LC_E0
; YES, WAS LAST CODE AN E0? RWV 10-08-85
1182 JZ K39
; NO-BREAK, TEST FOR PAUSE RWV 7-26-85
1184 K38B: MOV BX,BUFFER_HEAD
; RESET BUFFER TO EMPTY RWV 10-23-85
1185 MOV BUFFER_TAIL
,BX ;
1186 MOV BIOS_BREAK
,80H
; TURN ON BIOS_BREAK BIT
1188 ;-------- ENABLE KEYBOARD
1190 MOV AL,ENA_KBD
; ENABLE KEYBOARD
1191 CALL SHIP_IT
; EXECUTE ENABLE
1192 INT 1
BH ; BREAK INTERRUPT VECTOR
1193 SUB AX,AX ; PUT OUT DUMMY CHARACTER
1194 JMP K57
; BUFFER_FILL
1196 ;-------- TEST FOR PAUSE
1199 CMP AL,NUM_KEY
; LOOK FOR PAUSE KEY
1201 TEST BH,KBX
; IS THIS THE ENHANCED KEYBOARD? RWV 10-08-85
1202 JZ K39P
; NO, THIS IS A VALID PAUSE RWV 9-26-85
1203 TEST CS:SD
.SYSTEM_FLAG
,PC_LAP
; IS THIS THE LAP COMPUTER? RWV 9-26-85
1204 JZ K41
; NO, IT'S NOT PAUSE THIS TIME RWV 9-26-85
1205 K39P: OR KB_FLAG_1
,HOLD_STATE
; TURN ON THE HOLD FLAG
1206 MOV BUSY_TFLAG
,ACTIVE_OFF
;TURN THE BUSY FLAG OFF - THIS IS
1207 ;A SPECIAL CASE FOR THE SPLICER
1208 DEC CS:TEMP_TAIL
;DELETE THE PAUSE KEY FROM THE BUFFER
1209 ;IN CASE A INTERRUPT COMES IN
1210 ;SO IT IS NOT DONE REPEATEDLY
1211 ;-------- ENABLE KEYBOARD
1213 MOV AL,ENA_KBD
; ENABLE KEYBOARD
1214 CALL SHIP_IT
; EXECUTE ENABLE
1219 MOV AL,EOI
; END OF INTERRUPT TO CONTROL PORT
1220 OUT 020H,AL ; ALLOW FURTHER KEYSTROKE INTS
1225 ;------ DURING PAUSE INTERVAL, TURN CRT BACK ON
1227 CMP CRT_MODE
,7 ; IS THIS BLACK AND WHITE CARD
1228 JE K40
; YES, NOTHING TO DO
1229 MOV DX,03D8H ; PORT FOR COLOR CARD
1230 MOV AL,CRT_MODE_SET
; GET THE VALUE OF THE CURRENT MODE
1231 OUT DX,AL ; SET THE CRT MODE, SO THAT CRT IS ON
1240 ; mov ax,word ptr ds:[bx] ;ICE
1241 ; mov word ptr ds:[bx],ax ;ICE
1246 TEST CS:SD
.SYSTEM_FLAG
,PC_LAP
; IS THIS THE LAP COMPUTER? RWV 9-26-85
1247 JZ K40A
; NO, SKIP THE BATTERY LIFE STUFF RWV 9-26-85
1248 MOV AX,4104H
; FUNCTION 41, AL=04=RETURN IF 0 RWV from AAD
1249 MOV BX,HOLD_STATE
*100H
; BH=HOLD_STATE, BL=0=NO TIME OUT RWV from AAD
1250 PUSH DS ; MAKE ES:DI POINT TO KB_FLAG_1 RWV from AAD
1251 POP ES ; RWV from AAD
1252 MOV DI,OFFSET KB_FLAG_1
; RWV from AAD
1253 INT 15H
; SLEEP UNTIL OUT OF HOLD RWV from AAD
1257 TEST KB_FLAG_1
,HOLD_STATE
1258 JNZ K40
; LOOP UNTIL FLAG TURNED OFF
1261 RET;JMP ENABLE_CHK ; INTERRUPT_RETURN_NO_EOI
1263 ;------ TEST SPECIAL CASE KEY 55
1266 CMP AL,55 ; TEST FOR */PRTSC KEY
1267 JNE K42
; NOT-KEY-55
1268 TEST CS:SD
.SYSTEM_FLAG
,PC_LAP
; IS THIS THE LAP COMPUTER? RWV 9-23-85
1269 JZ K41B
; NO, JUMP RWV 9-23-85
1270 TEST BH,LC_E0
; YES, WAS LAST CODE AN E0? RWV 10-24-85
1271 JZ K41A
; NO, THIS IS THE PRTSC KEY RWV 9-23-85
1272 JMP SHORT K42B
; YES, E0 MEANS THE "*" KEY RWV 9-23-85
1274 K41B: TEST BH,KBX
; IS THIS THE ENHANCED KEYBOARD? RWV 10-08-85
1275 JZ K41A
; NO, CTL-PRTSC IS VALID RWV 8-01-85
1276 TEST BH,LC_E0
; YES, WAS LAST CODE AN E0? RWV 10-08-85
1277 JZ K42B
; NO, TRANSLATE TO A FUNCTION RWV 10-04-85
1278 K41A: MOV AX,114*256 ; START/STOP PRINTING SWITCH
1279 JMP K57
; BUFFER_FILL
1281 ;------ SET UP TO TRANSLATE CONTROL SHIFT
1284 CALL KEYB_STATE_PROCESSOR
;;
1285 JNC K421
;; NO TRANSLATIONS FOUND - CONTINUE
1286 RET;JMP PREP_EXIT ;; TRANSLATIONS FOUND - EXIT
1289 CMP AL,15 ; IS IT THE TAB KEY? RWV 10-04-85
1290 JE K42B
; YES, XLATE TO FUNCTION CODE RWV 10-04-85
1291 CMP AL,53 ; IS IT THE / KEY? RWV 10-04-85
1292 JNE K42A
; NO, NO MORE SPECIAL CASES RWV 10-04-85
1293 TEST BH,LC_E0
; YES, IS IT FROM THE KEYPAD? RWV 10-08-85
1294 JZ K42A
; NO, JUST TRANSLATE RWV 10-04-85
1295 MOV AX,9500h
; YES, SPECIAL CODE FOR THIS ONE RWV 10-04-85
1296 JMP K57
; BUFFER FILL RWV 10-04-85
1298 K42A: MOV BX,OFFSET K8
; SET UP TO TRANSLATE CTL
1299 CMP AL,59 ; IS IT IN CHARACTER TABLE?
1300 JAE K42B
; NO, CTL-TABLE-TRANSLATE-SCAN RWV 11-06-85
1301 JMP K56
; GO TRANSLATE CHAR
1302 K42B: MOV BX,OFFSET K8
; SET UP TO TRANSLATE CTL RWV 10-07-85
1303 JMP K64
; GO TRANSLATE_SCAN RWV 8-06-85
1305 ;------ NOT IN CONTROL SHIFT
1308 CALL KEYB_STATE_PROCESSOR
;;
1309 JNC K4401
;; NO TRANSLATIONS FOUND - CONTINUE
1310 RET;JMP PREP_EXIT ;; TRANSLATIONS FOUND - EXIT
1312 CMP AL,55 ; PRINT SCREEN KEY?
1313 JNE K45
; NOT-PRINT-SCREEN
1314 TEST CS:SD
.SYSTEM_FLAG
,PC_LAP
; IS THIS THE LAP COMPUTER? RWV 9-12-85
1315 JZ K441
; NO, JUMP RWV 9-12-85
1316 TEST BH,LC_E0
; YES, WAS LAST CODE THE MARKER? RWV 10-08-85
1317 JZ K44A
; NO, TEST THE SHIFT STATE RWV 9-12-85
1318 JMP K45C
; YES, XLATE TO "*" CHAR RWV 9-12-85
1319 K441: TEST BH,KBX
; IS THIS ENHANCED KEYBOARD? RWV 10-08-85
1320 JZ K44A
; NO, TEST FOR SHIFT STATE RWV 7-30-85
1321 TEST BH,LC_E0
; YES, LAST CODE A MARKER? RWV 10-08-85
1322 JNZ K44B
; YES, IS PRINT SCREEN RWV 7-30-85
1323 JMP SHORT K45C
; NO, XLATE TO "*" CHARACTER RWV 7-31-85
1324 K44A: TEST BL,LEFT_SHIFT
+RIGHT_SHIFT
;NOT 101 KBD, SHIFT KEY DOWN? RWV 7-30-85
1325 JZ K45C
; NO, XLATE TO "*" CHARACTER RWV 7-30-85
1327 ;------ ISSUE INTERRUPT TO PERFORM PRINT SCREEN FUNCTION
1328 K44B: MOV AL,ENA_KBD
; INSURE KEYBOARD IS ENABLED
1329 CALL SHIP_IT
; EXECUTE ENABLE
1333 MOV AL,EOI
; END OF CURRENT INTERRUPT
1334 OUT 020H,AL ; SO FURTHER THINGS CAN HAPPEN
1338 PUSH BP ; SAVE POINTER
1339 INT 5H
; ISSUE PRINT SCREEN INTERRUPT
1340 POP BP ; RESTORE POINTER
1341 AND KB_FLAG_3
,NOT LC_E0
+LC_E1
;ZERO OUT THESE FLAGS RWV 8-13-85
1344 RET;JMP ENABLE_CHK ; GO BACK WITHOUT EOI OCCURRING
1348 ;------ HANDLE THE IN-CORE KEYS
1349 K45: ; NOT-PRINT-SCREEN
1350 CMP AL,58 ; TEST FOR IN-CORE AREA RWV 7-30-85
1351 JA K46
; JUMP IF NOT RWV 8-13-85
1353 K450: TEST BH,GRAPH_ON
; IS ALT GRAPHICS ON? AEV
1354 JZ K456
; GO ON IF NOT AEV
1355 RET;JMP PREP_EXIT ;; YES, TRASH KEYSTROKE
1357 K456: CMP AL,53 ; IS THIS THE "/" KEY? RWV 8-01-85
1358 JNE K45A
; NO, JUMP RWV 8-01-85
1359 TEST BH,LC_E0
; WAS LAST CODE THE MARKER? RWV 10-08-85
1360 JNZ K45C1
; YES, TRANSLATE TO US CHARACTER RWV 8-01-85
1364 K45A1: MOV CX,K30_LEN
; LENGTH OF SEARCH RWV 7-30-85
1365 MOV DI,OFFSET K30
+10 ; POINT TO TABLE OF A-Z CHARS RWV 7-30-85
1366 REPNE SCASB ; IS THIS A LETTER KEY? RWV 7-30-85
1367 JNE K45B
; NO, SYMBOL KEY RWV 7-30-85
1369 K45A2: TEST BL,CAPS_STATE
; ARE WE IN CAPS_LOCK? RWV 7-30-85
1370 JNZ K45D
; TEST FOR SURE RWV 7-30-85
1371 K45B: TEST BL,LEFT_SHIFT
+RIGHT_SHIFT
; ARE WE IN SHIFT STATE? RWV 7-30-85
1372 JNZ K45E
; YES, UPPERCASE RWV 7-30-85
1373 ; NO, LOWERCASE RWV 7-30-85
1375 K45C1: MOV BX,OFFSET K10
; XLATE TO LOWERCASE US LETTERS RWV 8-06-85
1377 K45D: ; ALMOST-CAPS-STATE RWV 7-30-85
1378 TEST BL,LEFT_SHIFT
+RIGHT_SHIFT
; CL ON. IS SHIFT ON, TOO? RWV 7-30-85
1379 JNZ K45C1
; SHIFTED TEMP OUT OF CAPS STATE RWV 7-30-85
1381 K45E1: MOV BX,OFFSET K11
; XLATE TO UPPERCASE US LETTERS RWV 8-06-85
1382 K45E2: JMP SHORT K56
; GO TRANSLATE RWV 8-06-85
1385 ;------ TEST FOR KEYS F1 - F10
1386 K46: ; NOT IN-CORE AREA RWV 7-30-85
1387 CMP AL,68 ; TEST FOR F1 - F10 RWV 7-30-85
1388 JA K47
; JUMP IF NOT RWV 7-30-85
1389 JMP SHORT K53A
; YES, GO DO FN KEY PROCESS RWV 7-30-85
1392 ;------ HANDLE THE NUMERIC PAD KEYS
1394 K47: ; NOT F1 - F10 RWV 7-30-85
1395 CMP AL,83 ; TEST FOR NUMPAD KEYS RWV 7-30-85
1396 JA K52
; JUMP IF NOT RWV 7-30-85
1398 ;------ KEYPAD KEYS, MUST TEST NUM LOCK FOR DETERMINATION
1399 K48: CMP AL,74 ; SPECIAL CASE FOR MINUS
1400 JE K45E1
; GO TRANSLATE (US & WT ARE SAME) RWV 8-06-85
1401 CMP AL,78 ; SPECIAL CASE FOR PLUS
1402 JE K45E1
; GO TRANSLATE (US & WT ARE SAME) RWV 8-06-85
1403 TEST BH,LC_E0
; IS THIS ONE OF THE NEW KEYS? RWV 10-08-85
1404 JNZ K49
; YES, TRANSLATE TO BASE STATE RWV 8-06-85
1406 TEST BL,NUM_STATE
; ARE WE IN NUM_LOCK? RWV 7-30-85
1407 JNZ K50
; TEST FOR SURE
1408 TEST BL,LEFT_SHIFT
+RIGHT_SHIFT
; ARE WE IN SHIFT STATE? RWV 7-30-85
1409 JNZ K51
; IF SHIFTED, REALLY NUM STATE
1411 ;------ BASE CASE FOR KEYPAD
1412 K49: CMP AL,76 ; SPECIAL CASE FOR BASE STATE 5 RWV 10-04-85
1413 JNE K49A
; CONTINUE IF NOT KEYPAD 5 RWV 10-04-85
1414 TEST CS:SD
.SYSTEM_FLAG
,EXT_16
; IS THE EXTENDED INT 16 LOADED? RWV 11-06-85
1415 JNZ K491
; YES, TRANSLATE AS EXTENDED RWV 11-06-85
1416 RET;JMP PREP_EXIT ; NO, INGORE RWV 11-06-85
1418 K491: MOV AL,0F0h ; SPECIAL ASCII CODE RWV 10-04-85
1419 JMP K57
; BUFFER FILL RWV 10-04-85
1420 K49A: MOV BX,OFFSET K10
; BASE CASE TABLE RWV 7-30-85
1421 JMP SHORT K64
; CONVERT TO PSEUDO SCAN
1423 ;------ MIGHT BE NUM LOCK, TEST SHIFT STATUS
1424 K50: TEST BL,LEFT_SHIFT
+RIGHT_SHIFT
;ALMOST-NUM-STATE RWV 7-30-85
1425 JNZ K49
; SHIFTED TEMP OUT OF NUM STATE
1426 K51: ; REALLY_NUM_STATE RWV 8-06-85
1427 JMP SHORT K45E1
; (US & WT ARE SAME) RWV 8-06-85
1429 ;------ TEST FOR THE NEW KEY ON WT KEYBOARDS
1431 K52: ; NOT A NUMPAD KEY RWV 7-30-85
1432 CMP AL,86 ; IS IT THE NEW WT KEY? RWV 7-30-85
1433 JNE K53
; JUMP IF NOT RWV 7-30-85
1434 MOV AL,58 ; WE'RE GOING TO PULL A SNEAKY RWV 8-06-85
1435 JMP K45
; TRICK HERE. WT TABLES ARE TOO SHORT TO
1436 ; XLATE 86, SO WE'LL CHANGE IT TO CAPS_LOCK
1437 ; AND PUT THE CHAR IN THE TABLES IN THE C_L
1438 ; POSITION, SINCE C_L SCAN CODES NEVER GET
1439 ; HERE ANYWAY. RWV 8-06-85
1441 ;------ MUST BE F11 OR F12
1443 K53: TEST CS:SD
.SYSTEM_FLAG
,EXT_16
; IS THE EXTENDED INT 16 THERE? RWV 11-06-85
1445 JZ K59
; NO, INGORE F11 & F12 (NEAR RET) RWV 11-06-85
1446 ; F1 - F10 COME HERE, TOO RWV 7-30-85
1447 K53A: TEST BL,LEFT_SHIFT
+RIGHT_SHIFT
;TEST SHIFT STATE RWV 7-30-85
1448 JZ K49
; JUMP, LOWERCASE PSEUDO SC'S RWV 7-30-85
1450 MOV BX,OFFSET K11
; UPPER CASE PSEUDO SCAN CODES
1451 JMP SHORT K64
; TRANSLATE_SCAN
1453 ;------ TRANSLATE THE CHARACTER
1455 K56: ; TRANSLATE-CHAR
1456 DEC AL ; CONVERT ORIGIN
1457 XLAT CS:K11
; CONVERT THE SCAN CODE TO ASCII
1458 K56C: TEST KB_FLAG_3
,LC_E0
; IS THIS A NEW KEY? RWV 10-08-85
1459 JZ K57
; NO, GO FILL BUFFER RWV 10-04-85
1460 TEST CS:SD
.SYSTEM_FLAG
,EXT_16
; IS THE EXTENDED INT 16 THERE? RWV 11-06-85
1461 JZ K57
; NO, DO COMPATIBLE OUTPUT RWV 11-06-85
1462 MOV AH,MC_E0
; YES, PUT SPECIAL MARKER IN AH RWV 10-04-85
1463 JMP SHORT K57
; PUT IT INTO THE BUFFER
1465 ;------ TRANSLATE SCAN FOR PSEUDO SCAN CODES
1467 K64: ; TRANSLATE-SCAN-ORGD
1468 DEC AL ; CONVERT ORIGIN RWV 8-06-85
1469 XLAT CS:K8
; CTL TABLE SCAN
1470 MOV AH,AL ; PUT VALUE INTO AH
1471 MOV AL,0 ; ZERO ASCII CODE
1472 TEST KB_FLAG_3
,LC_E0
; IS THIS A NEW KEY? RWV 10-08-85
1473 JZ K57
; NO, GO FILL BUFFER RWV 10-04-85
1474 TEST CS:SD
.SYSTEM_FLAG
,EXT_16
; IS THE EXTENDED INT 16 THERE? RWV 11-06-85
1475 JZ K57
; NO, DO COMPATIBLE OUTPUT RWV 11-06-85
1476 MOV AL,MC_E0
; YES, PUT SPECIAL MARKER IN AL RWV 10-04-85
1478 ;------ PUT CHARACTER INTO BUFFER
1483 RET ;; return to unload the buffer
1485 ; JMP PREP_EXIT ;; THAT'S ALL FOLKS
1491 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1493 ;; Procedure: BUFFER_FILL
1496 ;; Generate keyboard buffer entry
1499 ;; AX - the buffer entry
1500 ;; DS - BIOS data segment
1502 ;; Output Registers:
1505 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1507 BUFFER_FILL PROC
NEAR ;;
1509 CMP AL,-1 ;; IS THIS AN IGNORE CHAR
1510 JE K61B
;; YES, EXIT
1511 CMP AH,-1 ;; LOOK FOR -1 PSEUDO SCAN
1514 ;; BUFFER_FILL_ANY_CHAR is an alternate entry point to this PROC.
1515 ;; Entry at this point will avoid trashing ASCII values of 255.
1517 BUFFER_FILL_ANY_CHAR
LABEL NEAR ;;
1521 PUSH DS ;; This routine may be called
1522 PUSH AX ;; externally so make sure DS points
1523 MOV AX,DATA ;; to BIOS data
1529 MOV BX,BUFFER_TAIL
; GET THE END POINTER TO THE BUFFER
1530 MOV SI,BX ; SAVE THE VALUE
1531 INC BX ;; MOVE TO NEXT WORD IN LIST
1534 ;; VERIFY IF THE CURRENT ROM LEVEL IN THE SYSTEM IS FOR THE ORIGINAL PC1
1536 PUSH AX ;; SAVE AX,DS
1538 MOV AX,ROM_SEG
;; SET DS TO POINT AT BIOS ROM SEGMENT
1539 MOV DS,AX ;; TEST FOR PC1 ROM INSTALLED
1540 CMP WORD PTR DS:SYSROM_DATE
,PC1DATE_ID
1541 POP DS ;; RESTORE DS,AX
1543 JNE NOT_PC1
;; IF IT'S A LATER ROM RELEASE, BRANCH
1545 CMP BX,OFFSET KB_BUFFER_END
; AT END OF BUFFER?
1546 JNE K5 ;; NO, CONTINUE
1547 MOV BX,OFFSET KB_BUFFER
;; YES, RESET TO BUFFER BEGINNING
1550 CMP BX,BUFFER_END
;; AT END OF BUFFER?
1551 JNE K5 ;; NO, CONTINUE
1552 MOV BX,BUFFER_START
;; YES, RESET TO BUFFER BEGINNING
1554 CMP BX,BUFFER_HEAD
;; HAS THE BUFFER WRAPPED AROUND
1555 JE K62
;; BUFFER_FULL_BEEP
1556 MOV [SI],AX ;; STORE THE VALUE
1557 MOV BUFFER_TAIL
,BX ;; MOVE THE POINTER UP
1558 MOV CS:BUFFER_ENTRY_OK
,YES
;; INDICATE WE PUT SOMETHING IN BUFFER
1561 MOV CS:BEEP_PENDING
,YES
;; INDICATE WE NEED A BEEP
1562 TEST CS:SD
.SYSTEM_FLAG
,PC_JR
;; ON JR WE HAVE TO CLEAR SOME FLAGS
1564 AND KB_FLAG
,0F0H ;; CLEAR SHIFTS
1565 AND KB_FLAG_1
,0FH ;;
1566 AND KB_FLAG_2
,1FH
;; CLEAR FUNCTION STATES
1576 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1578 ;; Procedure: KB_NOISE
1581 ;; General routine to generate beep tones
1584 ;; BX - length of tone
1585 ;; CX - tone frequency (larger CX = lower pitch)
1587 ;; Output Registers:
1590 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1592 BEEPING
DB 0 ;; 1 if beep already in progress
1595 CMP CS:BEEPING
,0 ;; ARE WE BEEPING?
1596 JE NOT_BEEPING_YET
;;
1599 MOV CS:BEEPING
,1 ;; beep in progress
1603 IN AL,061H ;; Get control info
1606 AND AL,0FCH ;; Turn off timer gate and speaker
1607 OUT 061H,AL ;; output to control
1608 PUSH CX ;; half cycle time for tone
1610 LOOP LOOP02
;; speaker off
1611 OR AL,2 ;; turn on speaker
1612 OUT 061H,AL ;; output to control
1616 LOOP LOOP03
;; another half cycle
1617 DEC BX ;; time count
1618 POP CX ;; another cycle
1621 OUT 061H,AL ;; restore control
1624 MOV CS:BEEPING
,0 ;; indicate beep over
1628 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1629 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1631 ;; Procedure: DUMBJMP
1634 ;; Dummy JUMP used to allow smooth exit
1635 ;; for XT & older machines
1636 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1639 JMP UP1
;; ARE WE BEEPING?
1642 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1644 ;; Procedure: ERROR_BEEP
1647 ;; Call KB_NOISE to generate a beep.
1652 ;; Output Registers:
1655 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1658 ERROR_BEEP PROC
NEAR ;;
1660 PUSH AX ;; SAVE REGS
1667 MOV AL,EOI
;; ENABLE INTR. CTL. CHIP
1673 TEST CS:SD
.SYSTEM_FLAG
,PC_JR
1674 JZ EB_TEST_1
;; The JR
1675 MOV BX,80H
;; NUMBER OF CYCLES FOR 1/8 SECOND TONE
1676 MOV CX,021H ;; FREQUENCY
1677 JMP SHORT BEEP_IT
;;
1679 TEST CS:SD
.SYSTEM_FLAG
,PC_XT
+PC_PAL
+PC_LAP
1680 JZ EB_TEST_2
;; 8088/8886 MACHINE
1681 MOV BX,80H
;; NUMBER OF CYCLES FOR 1/8 SECOND TONE
1682 MOV CX,048H ;; FREQUENCY
1683 JMP SHORT BEEP_IT
;;
1685 TEST CS:SD
.SYSTEM_FLAG
,PC_386
1686 JZ EB_TEST_3
;; 386 MACHINE
1688 MOV CX,19
CH ;; FREQUENCY
1689 JMP SHORT BEEP_IT
;;
1691 MOV BX,80H
;; DEFAULT TO 286 MACHINE
1692 MOV CX,0CEH ;; FREQUENCY
1696 POP CX ;; RESTORE REGS
1702 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1706 ;; THIS ROUTINE HANDLES TRANSMISSION OF COMMAND AND DATA BYTES
1707 ;; TO THE KEYBOARD CONTROLLER.
1709 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1711 SHIP_IT PROC
NEAR ;;
1713 ;------- TEST SYSTEM TYPE ;;
1715 TEST CS:SD
.SYSTEM_FLAG
,PC_AT
+PC_386
; IF THE SYSTEM WE'RE RUNNING ON IS A
1716 JNZ SI1
;; PCAT, EXECUTE THIS ROUTINE,
1720 SI1: PUSH AX ;; SAVE DATA TO SEND
1722 ;;;-- WAIT FOR COMMAND TO BE ACCEPTED ;;
1723 CLI ;; DISABLE INTERRUPTS
1725 CALL WAIT_ON_STATUS_PORT
;;
1727 POP AX ;; GET DATA TO SEND
1728 OUT STATUS_PORT
,AL ;; SEND TO KEYBOARD CONTROLLER
1729 STI ;; ENABLE INTERRUPTS AGAIN
1730 RET ;; RETURN TO CALLER
1733 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1735 ;; Procedure: WAIT_ON_STATUS_PORT
1738 ;; Waits for a keyboard command to be accepted
1743 ;; Output Registers:
1746 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1748 WAIT_ON_STATUS_PORT PROC
NEAR ;;
1750 ;---- WAIT FOR COMMAND TO BE ACCEPTED ;;
1752 MOV CX,CS:SD
.TIMING_FACTOR
;; PROCESSOR SCALE FACTOR; PCAT = 1
1757 IN AL,STATUS_PORT
;;
1758 TEST AL,INPT_BUF_FULL
;;
1759 LOOPNZ W02
;; WAIT FOR COMMAND TO BE ACCEPTED
1765 WAIT_ON_STATUS_PORT ENDP
;;
1767 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1771 ;; THIS ROUTINE HANDLES TRANSMISSION OF COMMAND AND DATA BYTES
1772 ;; TO THE KEYBOARD AND RECEIPT OF ACKNOWLEDGEMENTS. IT ALSO
1773 ;; HANDLES ANY RETRIES IF REQUIRED
1775 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1777 SND_DATA PROC
NEAR ;;
1778 PUSH AX ;; SAVE REGISTERS
1781 MOV BH,AL ;; SAVE TRANSMITTED BY FOR RETRIES
1782 MOV BL,3 ;; LOAD RETRY COUNT
1783 SD0: CLI ;; DISABLE INTERRUPTS
1784 AND KB_FLAG_2
,NOT (KB_FE
+KB_FA
) ; CLEAR ACK AND RESEND FLAGS
1786 CALL WAIT_ON_STATUS_PORT
;;
1788 MOV AL,BH ;; REESTABLISH BYTE TO TRANSMIT
1789 OUT PORT_A
,AL ;; SEND BYTE
1790 STI ;; ENABLE INTERRUPTS
1791 MOV AX,01A00H ;; LOAD COUNT FOR 10mS+
1792 MUL CS:SD
.TIMING_FACTOR
;; ACCOUNT FOR PROCESSOR SPEED
1794 SD1: TEST KB_FLAG_2
,KB_FE
+KB_FA
;; SEE IF EITHER BIT SET
1795 JNZ SD3
;; IF SET, SOMETHING RECEIVED GO PROCESS
1797 LOOP SD1
;; OTHERWISE WAIT
1799 SD2: DEC BL ;; DECREMENT RETRY COUNT
1800 JNZ SD0
;; RETRY TRANSMISSION
1802 OR KB_FLAG_2
,KB_ERR
;; TURN ON TRANSMIT ERROR FLAG
1803 JMP SHORT SD4
;; RETRIES EXHAUSTED FORGET TRANSMISSION
1805 SD3: TEST KB_FLAG_2
,KB_FA
;; SEE IF THIS IS AN ACKNOWLEDGE
1806 JZ SD2
;; IF NOT, GO RESEND
1808 SD4: POP CX ;; RESTORE REGISTERS
1811 RET ;; RETURN, GOOD TRANSMISSION
1814 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1818 ;; THIS ROUTINE TURNS ON THE MODE INDICATORS.
1820 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1822 SND_LED PROC
NEAR ;;
1823 CLI ;; TURN OFF INTERRUPTS
1824 TEST KB_FLAG_2
,KB_PR_LED
;; CHECK FOR MODE INDICATOR UPDATE
1825 JNZ SL1
;; DONT UPDATE AGAIN IF UPDATE UNDERWAY
1827 OR KB_FLAG_2
,KB_PR_LED
;; TURN ON UPDATE IN PROCESS
1831 MOV AL,EOI
;; END OF INTERRUPT COMMAND
1832 OUT 020H,AL ;; SEND COMMAND TO INTERRUPT CONTROL PORT
1836 JMP SHORT SL0
;; GO SEND MODE INDICATOR COMMAND
1839 CLI ;; TURN OFF INTERRUPTS
1840 TEST KB_FLAG_2
,KB_PR_LED
;; CHECK FOR MODE INDICATOR UPDATE
1841 JNZ SL1
;; DONT UPDATE AGAIN IF UPDATE UNDERWAY
1843 OR KB_FLAG_2
,KB_PR_LED
;; TURN ON UPDATE IN PROCESS
1844 SL0: MOV AL,LED_CMD
;; LED CMD BYTE
1845 CALL SND_DATA
;; SEND DATA TO KEYBOARD
1847 CALL MAKE_LED
;; GO FORM INDICATOR DATA BYTE
1848 AND KB_FLAG_2
,0F8H ;; CLEAR MODE INDICATOR BITS
1849 OR KB_FLAG_2
,AL ;; SAVE PRESENT INDICATORS STATES FOR NEXT TIME
1850 TEST KB_FLAG_2
,KB_ERR
;; TRANSMIT ERROR DETECTED
1851 JNZ SL2
;; IF YES, BYPASS SECOND BYTE TRANSMISSION
1853 CALL SND_DATA
;; SEND DATA TO KEYBOARD
1854 CLI ;; TURN OFF INTERRUPTS
1855 TEST KB_FLAG_2
,KB_ERR
;; TRANSMIT ERROR DETECTED
1856 JZ SL3
;; IF NOT, DONT SEND AN ENABLE COMMAND
1858 SL2: MOV AL,KB_ENABLE
;; GET KEYBOARD CSA ENABLE COMMAND
1859 CALL SND_DATA
;; SEND DATA TO KEYBOARD
1860 CLI ;; TURN OFF INTERRUPTS
1861 SL3: AND KB_FLAG_2
,NOT(KB_PR_LED
+KB_ERR
) ; TURN OFF MODE INDICATOR
1862 ;; UPDATE AND TRANSMIT ERROR FLAG
1863 SL1: STI ;; ENABLE INTERRUPTS
1864 RET ;; RETURN TO CALLER
1868 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1872 ;; THIS ROUTINE FORMS THE DATA BYTE NECESSARY TO TURN ON/OFF
1873 ;; THE MODE INDICATORS
1875 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1877 MAKE_LED PROC
NEAR ;;
1879 MOV AL,KB_FLAG
;; GET CAPS & NUM LOCK INDICATORS
1880 AND AL,CAPS_STATE
+NUM_STATE
+SCROLL_STATE
; ISOLATE INDICATORS
1881 MOV CL,4 ;; SHIFT COUNT
1882 ROL AL,CL ;; SHIFT BITS OVER TO TURN ON INDICATORS
1883 AND AL,07H ;; MAKE SURE ONLY MODE BITS ON
1885 RET ;; RETURN TO CALLER
1888 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;