summaryrefslogtreecommitdiff
path: root/v4.0/src/CMD/KEYB/KEYBI9C.ASM
diff options
context:
space:
mode:
Diffstat (limited to 'v4.0/src/CMD/KEYB/KEYBI9C.ASM')
-rw-r--r--v4.0/src/CMD/KEYB/KEYBI9C.ASM1894
1 files changed, 1894 insertions, 0 deletions
diff --git a/v4.0/src/CMD/KEYB/KEYBI9C.ASM b/v4.0/src/CMD/KEYB/KEYBI9C.ASM
new file mode 100644
index 0000000..9cf8f5d
--- /dev/null
+++ b/v4.0/src/CMD/KEYB/KEYBI9C.ASM
@@ -0,0 +1,1894 @@
1
2 PAGE ,132
3 TITLE DOS KEYB Command - Interrupt 9 (US support)
4
5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6;; DOS - NLS Support - KEYB Command
7;; (C) Copyright 1988 Microsoft
8;;
9;; File Name: KEYBI9C.ASM
10;; ----------
11;;
12;; Description:
13;; ------------
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.
18;;
19;;
20;; Documentation Reference:
21;; ------------------------
22;; PC DOS 3.3 Detailed Design Document - May 1986
23;;
24;; Procedures Contained in This File:
25;; ----------------------------------
26;; KEYB_INT_9 - Interrupt 9
27;;
28;; External Procedure References:
29;; ------------------------------
30;; FROM FILE KEYBI9.ASM:
31;; KEYB_STATE_PROCESSOR - Non US keyboard support.
32;;
33;; Linkage Information: Refer to file KEYB.ASM
34;; --------------------
35;;
36;; Change History:
37;; ---------------
38;; ;AN001; - DCR 478 - KEYBOARD INT SPLICING NickS
39;; ;AN002; - PTM 3090 ENABLING RIGHT CTL FOR RE-BOOTING
40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
41 ;;
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 ;;
47 INCLUDE KEYBI9.INC ;;
48 INCLUDE KEYBCPSD.INC ;;
49 INCLUDE KEYBCMD.INC ;;
50 ;;
51 PUBLIC KEYB_INT_9 ;;
52 PUBLIC K8 ;; CTRL case tables
53 PUBLIC BUFFER_FILL ;;
54 PUBLIC COUNTRY_FLAG ;;
55 PUBLIC BEEP_PENDING ;;
56 PUBLIC SCAN_CODE ;;
57 PUBLIC ERROR_BEEP ;;
58 PUBLIC TEMP_HEAD ;;
59 PUBLIC TEMP_TAIL ;;
60 PUBLIC BUSY_TFLAG ;;
61 PUBLIC MYBUFF ;;
62 PUBLIC ENABLE_FL ;;
63 PUBLIC NEW_BUFF_CTR ;;
64
65
66ROM_SEG EQU 0F000H ;; BIOS ROM SEGMENT
67PC1DATE_ID EQU 03138H ;; YEAR ROM WAS RELEASED IN ASCII
68SYSROM_DATE EQU 0FFFBH ;; OFFSET OF ROM YEAR DIGIT
69 ;;
70DIAGS SEGMENT AT 0FFFFH ;;
71 ORG 0 ;;
72RESET LABEL FAR ;;
73DIAGS ENDS ;;
74 ;;
75 ;;
76 ;;
77CODE SEGMENT PUBLIC 'CODE' ;;
78 ASSUME CS:CODE,DS:DATA ;;
79 ;;
80
81;CNS***
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
91;CNS***
92
93
94BEEP_PENDING DB 0 ;;
95BUFFER_ENTRY_OK DB 0 ;;
96SCAN_CODE DB 0 ;;
97 ;;
98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
99;;
100;; TABLE OF SHIFT KEYS AND MASK VALUES
101;;
102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
103 ;;
104;------ KEY_TABLE ;;
105K6 LABEL BYTE ;;
106 DB INS_KEY ;; INSERT KEY
107 DB CAPS_KEY,NUM_KEY,SCROLL_KEY,ALT_KEY,CTL_KEY
108 DB LEFT_KEY,RIGHT_KEY ;;
109K6L EQU $-K6 ;;
110 ;;
111;------ MASK_TABLE ;;
112K7 LABEL BYTE ;;
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 ;;
116 ;;
117;---------- TABLES FOR ALT CASE -----;;
118;------ ALT-INPUT-TABLE ;;
119K30 LABEL BYTE ;;
120 DB 82,79,80,81,75 ;;
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 ;;
126 DB 38 ;;
127 DB 44,45,46,47,48,49 ;;
128 DB 50 ;;
129K30_LEN EQU $-K30-10 ;;
130 ;;
131;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
132;; K8 is overlaid by K8_RPL (from module KEYB_COMMAND)
133;; if extended INT 16 support is available
134;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
135 ;;
136K8 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
153PAGE ;;
154;----- TABLES FOR LOWER CASE (USA) --;;
155 ;;
156K10 LABEL BYTE ;;
157 DB 27,'12345' ;;
158 DB '67890-' ;;
159 DB '=',08,09,'qwe' ;;
160 DB 'rtyuio' ;;
161 DB 'p[]',0DH,-1,'a' ;; LETTERS, Return, Ctrl
162 DB 'sdfghj' ;;
163 DB "kl;'`",-1 ;; LETTERS, L Shift
164 DB '\zxcvb' ;;
165 DB 'nm,./' ;;
166 DB -1,'*',-1,' \' ;; R Shift, *, Alt, Sp, CL (REALLY WT KEY)
167 ;;
168;------ LC TABLE SCAN ;;
169 DB 59,60,61,62,63 ;; BASE STATE OF F1 - F10
170 DB 64,65,66,67,68 ;;
171 DB -1,-1 ;; NL, SL
172 ;;
173;------ KEYPAD TABLE ;;
174K15 LABEL BYTE ;;
175 DB 71,72,73,-1,75,-1 ;; BASE STATE OF KEYPAD KEYS
176 DB 77,-1,79,80,81,82 ;;
177 DB 83 ;;
178 DB -1,-1,'\',133,134 ;; SysRq, Undef, WT, F11, F12
179 ;;
180;------- TABLES FOR UPPER CASE (USA) ;;
181 ;;
182K11 LABEL BYTE ;;
183 DB 27,'!@#$%' ;;
184 DB '^&*()_' ;;
185 DB '+',08,00,'QWE' ;;
186 DB 'RTYUIO' ;;
187 DB 'P{}',0DH,-1,'A' ;; LETTERS, Return, Ctrl
188 DB 'SDFGHJ' ;;
189 DB 'KL:"~',-1 ;; LETTERS, L Shift
190 DB '|ZXCVB' ;;
191 DB 'NM<>?' ;;
192 DB -1,'*',-1,' |' ;; R Shift, *, Alt, Sp, CL (REALLY WT KEY)
193 ;;
194;------ UC TABLE SCAN ;;
195K12 LABEL BYTE ;;
196 DB 84,85,86,87,88 ;; SHIFTED STATE OF F1 - F10
197 DB 89,90,91,92,93 ;;
198 DB -1,-1 ;; NL, SL
199 ;;
200;------ NUM STATE TABLE ;;
201K14 LABEL BYTE ;;
202 DB '789-456+1230.' ;; NUMLOCK STATE OF KEYPAD KEYS
203 DB -1,-1,'|',135,136 ;; SysRq, Undef, WT, F11, F12
204 ;;
205;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
206;;
207;; Procedure: KEYB_INT_9
208;;
209;; Description:
210;; Entry point for interrupt 9 processing.
211;;
212;; Input Registers:
213;; None
214;;
215;; Output Registers:
216;; None
217;;
218;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
219 ;;
220KEYB_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
224KB_INT_1: ; AWAY FROM WHERE THE INT9 VECTOR POINTS
225
226; PUSH DS ;ICE
227; push bx ;ICE
228; push ax ;ICE
229; mov bx,0140H ;ICE
230; xor ax,ax ;ICE
231; mov ds,ax ;ICE
232; mov ax,word ptr ds:[bx] ;ICE
233; mov word ptr ds:[bx],ax ;ICE
234; POP ax ;ICE
235; pop bx ;ICE
236; pop ds ;ICE
237
238 PUSH BP
239 PUSH AX
240 PUSH BX
241 PUSH CX
242 PUSH DX
243 PUSH SI
244 PUSH DI
245 PUSH DS
246 PUSH ES
247 STI ; ENABLE INTERRUPTS
248 CLD ; FORWARD DIRECTION
249
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
256 JE NO_INIT
257
258 MOV DI,OFFSET CS:MYBUFF
259 MOV CS:TEMP_HEAD,DI
260 MOV CS:TEMP_TAIL,DI
261 MOV CS:ENABLE_FL,0
262; MOV CS:NEW_BUFF_CTR,0 ;;CLEAR OUT NEW BUFFER CTR
263;***CNS
264 ;; BUFFER
265NO_INIT:
266;------- TEST SYSTEM TYPE ;CHECK TO SEE IF THE SYSTEM IS
267 ;NEW ******
268
269
270
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
273
274;------ PC1, XT, HOME COMPUTER POST CODE
275
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
282EVEN ;;
283READ_CHAR_PORT: ;;
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
287 JZ SYSTEM_HOOK ;;
288 PUSH AX ; SAVE IT
289 IN AL,KB_CTL ; GET THE CONTROL PORT
290 MOV AH,AL ; SAVE VALUE
291 OR AL,80H ; RESET BIT FOR KEYBOARD
292 OUT KB_CTL,AL
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
296
297;----- SYSTEM HOOK INT 15H - FUNCTION 4FH (ON HARDWARE INTERRUPT LEVEL 9H)
298
299SYSTEM_HOOK: ;;
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
308
309UP1MORE:
310
311
312 CALL DUMBJMP
313 JMP EXIT_CHK
314
315
316
317;------ PCAT POST CODE
318
319;------ WAIT FOR KEYBOARD DISABLE COMMAND TO BE ACCEPTED
320KB_INT_00:
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
325;KB_INT_01:
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
329 ;;
330 CALL WAIT_ON_STATUS_PORT ;;
331
332;----- READ CHARACTER FROM KEYBOARD INTERFACE
333
334
335
336 IN AL,PORT_A ;;AN000;GET SCAN CODE VALUE FROM PORT 60H
337
338; PUSH DS ;ICE
339; push bx ;ICE
340; push ax ;ICE
341; mov bx,0140H ;ICE
342; xor ax,ax ;ICE
343; mov ds,ax ;ICE
344; mov ax,word ptr ds:[bx] ;ICE
345; mov word ptr ds:[bx],ax ;ICE
346; POP ax ;ICE
347; pop bx ;ICE
348; pop ds ;ICE
349
350;----- SYSTEM HOOK INT 15H - FUNCTION 4FH (ON HARDWARE INTERRUPT LEVEL 9H)
351
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
359
360
361
362LOAD_TBUFF:
363
364 CMP CS:NEW_BUFF_CTR,END_OF_BUFF+1 ;;AN000;CHECK TO SEE IF THE SECONDARY BUFFER IS FULL
365 JB LOAD_CHAR
366
367;***CNS
368 PUSH DI ;;
369 PUSH AX ;;
370 CALL CLEAR_BUFFER ;;CLEAR OUT NEW BUFFER
371 POP AX ;;
372 POP DI ;;
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
377;***CNS
378
379LOAD_CHAR:
380
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
390;***CNS
391 JMP SHORT $+2
392;***CNS
393 MOV AL,EOI ; END OF INTERRUPT COMMAND
394 OUT 020H,AL ; SEND COMMAND TO INTERRUPT CONTROL PORT
395;***CNS
396 JMP SHORT $+2
397;***CNS
398; PUSH DS ;ICE
399; push bx ;ICE
400; push ax ;ICE
401; mov bx,0140H ;ICE
402; xor ax,ax ;ICE
403; mov ds,ax ;ICE
404; mov ax,word ptr ds:[bx] ;ICE
405; mov word ptr ds:[bx],ax ;ICE
406; POP ax ;ICE
407; pop bx ;ICE
408; pop ds ;ICE
409 ;;AN000;OTHERWISE FREE UP THE PROCESSOR
410 MOV CS:BUSY_TFLAG,ACTIVE_OFF ;;AN000;
411 JMP KEY_EXIT ; KEY_EXIT
412
413EXIT_CHK:
414
415 CMP CS:ENABLE_FL,1
416 JE ENABLE_CHK
417
418 CMP CS:ENABLE_FL,2
419 JE KEY_EXIT
420
421 CMP CS:ENABLE_FL,-1
422 JE CHK_BEEPER
423
424
425PREP_EXIT:
426
427 AND KB_FLAG_3,NOT LC_E0+LC_E1 ; RESET LAST CHAR H.C. FLAG RWV 7-23-85
428
429
430CHK_BEEPER: ; INTERRUPT-RETURN
431
432 CMP CS:BEEP_PENDING,YES ;; Q..SHOULD WE BEEP?
433 JNE JR_EXIT ;;
434 MOV CS:BEEP_PENDING,NO ;;
435 CALL ERROR_BEEP ;;
436
437JR_EXIT: ;;
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
443
444ENABLE_CHK: ; INTERRUPT-RETURN-NO-EOI
445
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
452
453GOOD_ENTRY: ;;
454
455KEY_EXIT:
456
457
458 CLI ; DISABLE INTERRUPTS
459 POP ES ; RESTORE REGISTERS
460 POP DS ; *
461 POP DI ; *
462 POP SI ; *
463 POP DX ; *
464 POP CX ; *
465 POP BX ; *
466 POP AX ; *
467 POP BP
468 IRET ; RETURN, INTERRUPTS BACK ON WITH FLAG CHANGE
469 ;;AND RETURN INT OFF OF THE STACK
470
471
472
473KEEP_BUSY:
474
475 CALL CLEAR_BUFFER ;;UNLOAD THE TEMPORARY BUFFER
476
477TBUFF_EMPTY:
478 JMP EXIT_CHK
479
480; RET
481
482;(*EQUIVALENT TO PREP_EXIT*)
483;; Procedure: CLEAR_BUFFER
484;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
485 ;;
486 ;;
487CLEAR_BUFFER: ;;
488 ;;
489 ;;
490 MOV DI,CS:TEMP_HEAD ;;AN000;RESET POINTER BACK TO THE BEGINNING
491 MOV CS:BUSY_TFLAG,ACTIVE_ON ;;AN000;
492 ;;
493;***CNS
494 JMP SHORT $+2
495;***CNS
496 MOV AL,EOI ;;AN000; END OF INTERRUPT COMMAND
497 OUT 020H,AL ;;AN000; SEND COMMAND TO INTERRUPT CONTROL PORT
498;***CNS
499 JMP SHORT $+2
500;***CNS
501 ;;
502 ;;
503 ;;AN000; INTERRUPT-RETURN-NO-EOI
504GET_KB: ;;AN000;AN000;
505 XOR BX,BX ;;AN000;
506 CLI ;;AN000;DO NOT PROCESS UNTIL UNLOADED
507 ;;AN000;
508 MOV AL,BYTE PTR CS:[DI] ;;AN000;TEMPORARY BUFFER
509 STI ;;AN000;ENABLE SO I CAN KEEP PROCESSING
510 PUSH AX
511 PUSH BX
512 PUSH CX
513 PUSH DX
514 PUSH DS
515 PUSH ES
516 PUSH SI
517 PUSH DI ;;AN000;SAVE THE POINTER
518 PUSH CS:TEMP_TAIL
519 CALL OLD_METHOD ;;AN000;LOAD USING EXISTING METHOD
520 POP CS:TEMP_TAIL
521 POP DI ;;AN000;RESTORE THE POINTER
522 POP SI
523 POP ES
524 POP DS
525 POP DX
526 POP CX
527 POP BX
528 POP AX
529
530CHK_BUFF_EMPTY:
531
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
535 ;;AN000;
536 ;;AN000;
537 ;;AN000;
538 JMP GET_KB ;;AN000;NO - GET ANOTHER CHARACTER
539
540
541
542EMPTY_BUFF:
543
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
547
548
549
550 RET ;;AN000;
551
552
553OLD_METHOD:
554
555
556KB_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
560
561;------ CHECK FOR RESPONSE TO A COMMAND TO KEYBOARD
562
563 CMP AL,KB_ACK ; IS THE INPUT AN ACKNOWLEDGE
564 JNZ KB_INT_2 ; GO IF NOT
565
566;------ A COMMAND TO THE KEYBOARD WAS ISSUED
567
568 CLI ; DISABLE INTERRUPTS
569 OR KB_FLAG_2,KB_FA ; INDICATE ACK RECEIVED
570 RET
571; JMP PREP_EXIT ; RETURN IF NOT (ACK RETURNED FOR DATA)
572
573;------ RESEND THE LAST BYTE
574
575KB_INT_4:
576 CLI ; DISABLE INTERRUPTS
577 OR KB_FLAG_2,KB_FE ; INDICATE RESEND RECEIVED
578 RET
579; JMP PREP_EXIT ; RETURN IF NOT (ACK RETURNED FOR DATA)
580
581
582;------ UPDATE MODE INDICATORS IF CHANGE IN STATE
583
584KB_INT_2:
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
592
593;------ PROCESSING COMES BACK TOGETHER HERE
594
595UP0: POP AX ; RESTORE DATA IN
596PAGE
597;---------------------------------------------------------------------
598; START OF KEY PROCESSING -
599;---------------------------------------------------------------------
600
601UP1: MOV AH,AL ; SAVE SCAN CODE IN AH ALSO
602 MOV CS:SCAN_CODE,AL ;; SAVE SCAN CODE
603
604;------ TEST FOR OVERRUN SCAN CODE FROM KEYBOARD
605
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
610 JZ OVERRUN ;;
611 AND KB_FLAG,0F0H ;; CLEAR SHIFTS
612 AND KB_FLAG_1,0FH ;;
613 AND KB_FLAG_2,1FH ;; CLEAR FUNCTION STATES
614OVERRUN: ;;
615 RET
616; JMP PREP_EXIT ; BUFFER_FULL_BEEP
617
618K16: PUSH CS
619 POP ES ; ESTABLISH ADDRESS OF TABLES
620 MOV BH,KB_FLAG_3 ; LOAD FLAGS FOR TESTING RWV 10-08-85
621
622;------ TEST TO SEE IF A READ_ID IS IN PROGRESS
623
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?
628 JNE RST_RD_ID
629 OR KB_FLAG_3,LC_AB ; INDICATE 1ST ID WAS OK
630RST_RD_ID:
631 AND KB_FLAG_3,NOT RD_ID ; RESET THE READ ID FLAG
632 JMP SHORT ID_EX ; AND EXIT RWV 8-02-85
633
634TST_ID_2:
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
640
641;------ A READ ID SAID THAT IT WAS ENHANCED KEYBOARD
642
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
647KX_BIT: OR KB_FLAG_3,KBX ; INDICATE ENHANCED KEYBOARD WAS FOUND
648ID_EX: ;JMP PREP_EXIT ; EXIT
649 RET
650PAGE
651NOT_ID:
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
656
657TEST_E1:
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
661EXIT:
662;***CNS
663 MOV CS:ENABLE_FL,-1
664 RET;JMP CHK_BEEPER ; THROW AWAY THIS CODE RWV 7-19-85
665;***CNS
666NOT_HC:
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
670
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
676
677NOT_LC_E0:
678 TEST BH,LC_E1 ; LAST CODE THE E1 MARKER CODE? RWV 10-08-85
679 JZ T_SYS_KEY ; JUMP IF NOT RWV
680
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
685
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
693PAGE
694;------ TEST FOR SYSTEM KEY
695
696T_SYS_KEY:
697 CMP AL,SYS_KEY ; IS IT THE SYSTEM KEY?
698 JNE K16A ; CONTINUE IF NOT
699
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
702
703 TEST AH,080H ; CHECK IF THIS A BREAK CODE
704 JNZ K16C ; DON'T TOUCH SYSTEM INDICATOR IF TRUE
705
706 TEST KB_FLAG_1,SYS_SHIFT ; SEE IF IN SYSTEM KEY HELD DOWN
707 JNZ K16B ; IF YES, DON'T PROCESS SYSTEM INDICATOR
708
709 OR KB_FLAG_1,SYS_SHIFT ; INDICATE SYSTEM KEY DEPRESSED
710;***CNS
711 JMP SHORT $+2
712;***CNS
713 MOV AL,EOI ; END OF INTERRUPT COMMAND
714 OUT 020H,AL ; SEND COMMAND TO INTERRUPT CONTROL PORT
715;***CNS
716 JMP SHORT $+2
717;***CNS
718 ; INTERRUPT-RETURN-NO-EOI
719 ;;
720 MOV AL,ENA_KBD ; INSURE KEYBOARD IS ENABLED
721 CALL SHIP_IT ; EXECUTE ENABLE
722
723 MOV AX,08500H ; FUNCTION VALUE FOR MAKE OF SYSTEM KEY
724 STI ; MAKE SURE INTERRUPTS ENABLED
725 INT 15H ; USER INTERRUPT
726;***CNS
727 MOV CS:ENABLE_FL,2
728 RET;JMP KEY_EXIT ; END PROCESSING
729;***CNS
730K16B: ;JMP PREP_EXIT ; IGNORE SYSTEM KEY
731 RET
732K16C: AND KB_FLAG_1,NOT SYS_SHIFT ; TURN OFF SHIFT KEY HELD DOWN
733;***CNS
734 JMP SHORT $+2
735;***CNS
736 MOV AL,EOI ; END OF INTERRUPT COMMAND
737 OUT 020H,AL ; SEND COMMAND TO INTERRUPT CONTROL PORT
738;***CNS
739 JMP SHORT $+2
740;***CNS
741 ; INTERRUPT-RETURN-NO-EOI
742 MOV AL,ENA_KBD ; ENSURE KEYBOARD IS ENABLED
743 CALL SHIP_IT ; EXECUTE ENABLE
744
745 MOV AX,08501H ; FUNCTION VALUE FOR BREAK OF SYSTEM KEY
746 STI ; MAKE SURE INTERRUPTS ENABLED
747 INT 15H ; USER INTERRUPT
748;***CNS
749 MOV CS:ENABLE_FL,2
750 RET;JMP KEY_EXIT ; IGNORE SYSTEM KEY
751;***CNS
752PAGE
753;------ TEST FOR SHIFT KEYS
754;
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
760
761K16A: MOV BL,KB_FLAG ; PUT STATE FLAGS IN BL RWV 8-28-85
762 MOV DI,OFFSET K6 ; SHIFT KEY TABLE
763 MOV CX,K6L ; LENGTH
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
768
769;------ SHIFT KEY FOUND
770
771K17: 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
775 JZ K17C
776 JMP K23 ; JUMP IF BREAK RWV 8-14-85
777
778;------ SHIFT MAKE FOUND, DETERMINE SET OR TOGGLE
779
780K17C: CMP AH,SCROLL_SHIFT
781 JAE K18 ; IF SCROLL SHIFT OR ABOVE, TOGGLE KEY
782
783;------ PLAIN SHIFT KEY, SET SHIFT ON
784
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
789 ;**CNS
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
792
793
794K17C1: OR KB_FLAG,AH ; TURN ON SHIFT BIT RWV 8-28-85
795K17C2: TEST AH,CTL_SHIFT+ALT_SHIFT ; IS IT ALT OR CTRL? RWV 8-28-85
796 JZ K17F ; NO, JUMP RWV 8-28-85
797K17D: 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
800 RET
801; JMP PREP_EXIT ; INTERRUPT_RETURN RWV 7-22-85
802K17E: 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
804 RET
805; JMP PREP_EXIT ;;
806 ;; Q..typewriter caps locks
807K17F: ;;
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
812
813;; If keyboard is P12 then we still need to release caps_lk ***RPS 10-3-86
814
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
817
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
820REMOVE_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
825K17G: RET;JMP PREP_EXIT
826
827;------ TOGGLED SHIFT KEY, TEST FOR 1ST MAKE OR NOT
828
829K18: ; SHIFT-TOGGLE
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
833K18A: 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
838K18B: 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
840K19: 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
844K20: MOV AH,AL ; PUT SCAN CODE BACK IN AH RWV 11-07-85
845 JMP K25 ; NUMERAL "0", STNDRD. PROCESSING RWV 7-22-85
846
847K21: TEST BL,LEFT_SHIFT+RIGHT_SHIFT ; MIGHT BE NUMERIC RWV 7-30-85
848 JZ K20 ; IS NUMERIC, STD. PROC. RWV 7-23-85
849
850K22: ; SHIFT TOGGLE KEY HIT; PROCESS IT
851 TEST AH,KB_FLAG_1 ; IS KEY ALREADY DEPRESSED?
852 JZ K22A
853 RET;JMP PREP_EXIT ; JUMP IF KEY ALREADY DEPRESSED
854K22A: OR KB_FLAG_1,AH ; INDICATE THAT THE KEY IS DEPRESSED
855 XOR KB_FLAG,AH ; TOGGLE THE SHIFT STATE
856
857 TEST CS:SD.SPECIAL_FEATURES,TYPEWRITER_CAPS_LK
858 JZ K22C ;; N..all done
859
860;; If keyboard is P12 then we do not toggle ***RPS 10-3-86
861
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
864
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
867
868LAP_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
874
875;------- TEST SYSTEM TYPE
876
877K22C: 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
879
880;------ TOGGLE LED IF CAPS, NUM, OR SCROLL KEY DEPRESSED
881
882 TEST AH,CAPS_SHIFT+NUM_SHIFT+SCROLL_SHIFT ; SHIFT TOGGLE?
883 JZ K22B ; GO IF NOT
884 PUSH AX ; SAVE SCAN CODE AND SHIFT MASK
885 CALL SND_LED ; GO TURN MODE INDICATORS ON
886 POP AX ; RESTORE SCAN CODE
887
888K22B: CMP AL,INS_KEY ; TEST FOR 1ST MAKE OF INSERT KEY
889;**CNS
890 JE INS_CHK ; JUMP IF NOT INSERT KEY
891 RET;JMP PREP_EXIT
892
893
894;**CNS
895INS_CHK:
896
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
899
900;------ BREAK SHIFT FOUND
901
902K23: ; BREAK-SHIFT-FOUND
903 CMP AH,SCROLL_SHIFT ; IS THIS A TOGGLE KEY?
904 NOT AH ; INVERT MASK
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
909
910
911
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
916K23A: 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
918K23B: 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
922;**CNS
923 AND AL,NOT GRAPH_ON ; YES, FILTER OUT THE ALT_GR KEY RWV 8-28-85
924;**CNS
925K23C: 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
931
932K23D: CMP AL,ALT_KEY+80H ; IS THIS ALTERNATE SHIFT RELEASE
933 JE ALT_SHFT ; INTERRUPT_RETURN
934 RET;JMP PREP_EXIT
935
936;------ ALTERNATE SHIFT KEY RELEASED, GET THE VALUE INTO BUFFER
937
938ALT_SHFT:
939
940 MOV AL,ALT_INPUT
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
945 RET;JMP PREP_EXIT
946
947GOOD_ALTCHAR:
948
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
953
954K24: ; BREAK-TOGGLE
955 AND KB_FLAG_1,AH ; INDICATE NO LONGER DEPRESSED
956 RET;JMP PREP_EXIT ; INTERRUPT_RETURN
957
958;------ TEST FOR HOLD STATE
959 ; AL, AH = SCAN CODE
960K25: ; NO-SHIFT-FOUND
961 CMP AL,80H ; TEST FOR BREAK KEY
962 JB NO_BREAK ; NOTHING FOR BREAK CHARS FROM HERE ON
963 RET;JMP PREP_EXIT
964
965NO_BREAK:
966
967 TEST KB_FLAG_1,HOLD_STATE ; ARE WE IN HOLD STATE
968 JZ K28 ; BRANCH AROUND TEST IF NOT
969 CMP AL,NUM_KEY
970 JNE HOLD_OFF ; CAN'T END HOLD ON NUM_LOCK
971 RET;JMP PREP_EXIT
972
973HOLD_OFF:
974
975 AND KB_FLAG_1,NOT HOLD_STATE ; TURN OFF THE HOLD STATE BIT
976
977;------ EXIT POINT ;;
978
979 RET;JMP PREP_EXIT
980
981PAGE
982;------ NOT IN HOLD STATE
983 ; AL, AH = SCAN CODE (ALL MAKES)
984K28: ; NO-HOLD-STATE
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
987 RET;JMP PREP_EXIT
988
989
990SCAN_INRANGE:
991
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
994
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
997
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
1000;**CNS
1001
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
1004
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
1007
1008;**CNS
1009
1010K28A: JMP K38 ; YES, THIS IS PHONY ALT STATE RWV 7-24-85
1011 ; DUE TO PRESSING SYSREQ RWV 7-24-85
1012
1013;------ TEST FOR RESET KEY SEQUENCE (CTL ALT DEL)
1014
1015K29: ; TEST-RESET
1016 TEST BL,CTL_SHIFT ; ARE WE IN CONTROL SHIFT ALSO? RWV 7-30-85
1017 JZ K31 ; NO_RESET
1018 CMP AL,DEL_KEY ; SHIFT STATE IS THERE, TEST KEY
1019 JNE K31A ; NO_RESET, TRANSLATE TABLE SWAP
1020
1021;------ CTL-ALT-DEL HAS BEEN FOUND, DO I/O CLEANUP
1022
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
1026
1027;------ IN ALTERNATE SHIFT, RESET NOT FOUND
1028
1029K31: ; NO-RESET
1030 CALL KEYB_STATE_PROCESSOR ;;
1031 JNC K3105 ;; NO TRANSLATIONS FOUND - CONTINUE
1032 RET;JMP PREP_EXIT ;; TRANSLATIONS FOUND - EXIT
1033K3105: ;;
1034 ;;
1035 CMP AL,57 ; TEST FOR SPACE KEY
1036 JNE K311 ; NOT THERE
1037 MOV AL,' ' ; SET SPACE CHAR
1038 JMP K57 ; BUFFER_FILL
1039K311:
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
1046K312:
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
1051K312A: JMP K37B ; GO PROCESS RWV 10-04-85
1052
1053;------ SET COUNTRY FLAG TO INDICATE WHICH TABLE WE'RE USING, FOREIGN OR DOMESTIC
1054
1055K31A: CMP AL,CS:SD.HOT_KEY_ON_SCAN ; TEST FOR HOT KEY TO US
1056 JNE K31B ;
1057 MOV CS:COUNTRY_FLAG,00 ; SET FLAG FOR DOMESTIC KEY'S
1058 RET;JMP PREP_EXIT ; INTERRUPT RETURN
1059
1060K31B: 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
1064
1065
1066;------ ALT, CTRL DOWN ; NO HOT KEY
1067
1068K31C: 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
1073
1074
1075;------ LOOK FOR KEY PAD ENTRY
1076
1077K32: ; ALT-KEY-PAD
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
1085K321: 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
1088 MUL AH
1089 ADD AX,DI ; ADD IN THE LATEST ENTRY
1090 MOV ALT_INPUT,AL ; STORE IT AWAY
1091K32A: RET;JMP PREP_EXIT ; THROW AWAY THAT KEYSTROKE
1092
1093;------ LOOK FOR SUPERSHIFT ENTRY
1094
1095K33: ; 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
1103
1104;------ LOOK FOR TOP ROW OF ALTERNATE SHIFT
1105
1106K34: ; ALT-TOP-ROW
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
1113
1114;------ TRANSLATE ALTERNATE SHIFT PSEUDO SCAN CODES
1115
1116K35: ; ALT-FUNCTION
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
1123
1124K35A: 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
1132K35B: 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
1138
1139K37: 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
1145
1146K37A: MOV AL,0 ; ASCII CODE OF ZERO RWV 8-06-85
1147 JMP K57 ; PUT IT IN THE BUFFER RWV 8-06-85
1148
1149K37B:
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
1153K37B1: MOV AL,0F0h ; USE SPECIAL ASCII CODE RWV 10-04-85
1154 JMP K57 ; PUT IT IN THE BUFFER RWV 10-04-85
1155
1156K37C:
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
1162PAGE
1163;------ NOT IN ALTERNATE SHIFT
1164
1165K38: ; 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
1170
1171;------ CONTROL SHIFT, TEST SPECIAL CHARACTERS
1172
1173;------ TEST FOR BREAK
1174
1175K38A: 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
1183
1184K38B: 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
1187
1188;-------- ENABLE KEYBOARD
1189
1190 MOV AL,ENA_KBD ; ENABLE KEYBOARD
1191 CALL SHIP_IT ; EXECUTE ENABLE
1192 INT 1BH ; BREAK INTERRUPT VECTOR
1193 SUB AX,AX ; PUT OUT DUMMY CHARACTER
1194 JMP K57 ; BUFFER_FILL
1195
1196;-------- TEST FOR PAUSE
1197
1198K39: ; NO-BREAK
1199 CMP AL,NUM_KEY ; LOOK FOR PAUSE KEY
1200 JNE K41 ; NO-PAUSE
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
1205K39P: 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
1212
1213 MOV AL,ENA_KBD ; ENABLE KEYBOARD
1214 CALL SHIP_IT ; EXECUTE ENABLE
1215K39A:
1216;***CNS
1217 JMP SHORT $+2
1218;***CNS
1219 MOV AL,EOI ; END OF INTERRUPT TO CONTROL PORT
1220 OUT 020H,AL ; ALLOW FURTHER KEYSTROKE INTS
1221;***CNS
1222 JMP SHORT $+2
1223;***CNS
1224
1225;------ DURING PAUSE INTERVAL, TURN CRT BACK ON
1226
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
1232K40: ; PAUSE-LOOP
1233
1234; PUSH DS ;ICE
1235; push bx ;ICE
1236; push ax ;ICE
1237; mov bx,0140H ;ICE
1238; xor ax,ax ;ICE
1239; mov ds,ax ;ICE
1240; mov ax,word ptr ds:[bx] ;ICE
1241; mov word ptr ds:[bx],ax ;ICE
1242; POP ax ;ICE
1243; pop bx ;ICE
1244; pop ds ;ICE
1245
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
1254K40A:
1255
1256
1257 TEST KB_FLAG_1,HOLD_STATE
1258 JNZ K40 ; LOOP UNTIL FLAG TURNED OFF
1259;***CNS
1260 MOV CS:ENABLE_FL,1
1261 RET;JMP ENABLE_CHK ; INTERRUPT_RETURN_NO_EOI
1262;***CNS
1263;------ TEST SPECIAL CASE KEY 55
1264
1265K41: ; NO-PAUSE
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
1273
1274K41B: 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
1278K41A: MOV AX,114*256 ; START/STOP PRINTING SWITCH
1279 JMP K57 ; BUFFER_FILL
1280
1281;------ SET UP TO TRANSLATE CONTROL SHIFT
1282
1283K42:
1284 CALL KEYB_STATE_PROCESSOR ;;
1285 JNC K421 ;; NO TRANSLATIONS FOUND - CONTINUE
1286 RET;JMP PREP_EXIT ;; TRANSLATIONS FOUND - EXIT
1287
1288K421: ; NOT-KEY-55
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
1297
1298K42A: 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
1302K42B: MOV BX,OFFSET K8 ; SET UP TO TRANSLATE CTL RWV 10-07-85
1303 JMP K64 ; GO TRANSLATE_SCAN RWV 8-06-85
1304PAGE
1305;------ NOT IN CONTROL SHIFT
1306
1307K44:
1308 CALL KEYB_STATE_PROCESSOR ;;
1309 JNC K4401 ;; NO TRANSLATIONS FOUND - CONTINUE
1310 RET;JMP PREP_EXIT ;; TRANSLATIONS FOUND - EXIT
1311K4401:
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
1319K441: 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
1324K44A: 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
1326
1327;------ ISSUE INTERRUPT TO PERFORM PRINT SCREEN FUNCTION
1328K44B: MOV AL,ENA_KBD ; INSURE KEYBOARD IS ENABLED
1329 CALL SHIP_IT ; EXECUTE ENABLE
1330;***CNS
1331 JMP SHORT $+2
1332;***CNS
1333 MOV AL,EOI ; END OF CURRENT INTERRUPT
1334 OUT 020H,AL ; SO FURTHER THINGS CAN HAPPEN
1335;***CNS
1336 JMP SHORT $+2
1337;***CNS
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
1342;***CNS
1343 MOV CS:ENABLE_FL,1
1344 RET;JMP ENABLE_CHK ; GO BACK WITHOUT EOI OCCURRING
1345;***CNS
1346
1347
1348;------ HANDLE THE IN-CORE KEYS
1349K45: ; 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
1352
1353K450: 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
1356
1357K456: 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
1361
1362K45A:
1363
1364K45A1: 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
1368
1369K45A2: TEST BL,CAPS_STATE ; ARE WE IN CAPS_LOCK? RWV 7-30-85
1370 JNZ K45D ; TEST FOR SURE RWV 7-30-85
1371K45B: 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
1374K45C: ;;
1375K45C1: MOV BX,OFFSET K10 ; XLATE TO LOWERCASE US LETTERS RWV 8-06-85
1376 JMP SHORT K45E2
1377K45D: ; 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
1380K45E:
1381K45E1: MOV BX,OFFSET K11 ; XLATE TO UPPERCASE US LETTERS RWV 8-06-85
1382K45E2: JMP SHORT K56 ; GO TRANSLATE RWV 8-06-85
1383
1384
1385;------ TEST FOR KEYS F1 - F10
1386K46: ; 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
1390
1391
1392;------ HANDLE THE NUMERIC PAD KEYS
1393
1394K47: ; 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
1397
1398;------ KEYPAD KEYS, MUST TEST NUM LOCK FOR DETERMINATION
1399K48: 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
1405
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
1410
1411;------ BASE CASE FOR KEYPAD
1412K49: 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
1417
1418K491: MOV AL,0F0h ; SPECIAL ASCII CODE RWV 10-04-85
1419 JMP K57 ; BUFFER FILL RWV 10-04-85
1420K49A: MOV BX,OFFSET K10 ; BASE CASE TABLE RWV 7-30-85
1421 JMP SHORT K64 ; CONVERT TO PSEUDO SCAN
1422
1423;------ MIGHT BE NUM LOCK, TEST SHIFT STATUS
1424K50: TEST BL,LEFT_SHIFT+RIGHT_SHIFT ;ALMOST-NUM-STATE RWV 7-30-85
1425 JNZ K49 ; SHIFTED TEMP OUT OF NUM STATE
1426K51: ; REALLY_NUM_STATE RWV 8-06-85
1427 JMP SHORT K45E1 ; (US & WT ARE SAME) RWV 8-06-85
1428
1429;------ TEST FOR THE NEW KEY ON WT KEYBOARDS
1430
1431K52: ; 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
1440
1441;------ MUST BE F11 OR F12
1442
1443K53: TEST CS:SD.SYSTEM_FLAG,EXT_16 ; IS THE EXTENDED INT 16 THERE? RWV 11-06-85
1444;*** CNS
1445 JZ K59 ; NO, INGORE F11 & F12 (NEAR RET) RWV 11-06-85
1446 ; F1 - F10 COME HERE, TOO RWV 7-30-85
1447K53A: 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
1449
1450 MOV BX,OFFSET K11 ; UPPER CASE PSEUDO SCAN CODES
1451 JMP SHORT K64 ; TRANSLATE_SCAN
1452PAGE
1453;------ TRANSLATE THE CHARACTER
1454
1455K56: ; TRANSLATE-CHAR
1456 DEC AL ; CONVERT ORIGIN
1457 XLAT CS:K11 ; CONVERT THE SCAN CODE TO ASCII
1458K56C: 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
1464
1465;------ TRANSLATE SCAN FOR PSEUDO SCAN CODES
1466
1467K64: ; 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
1477
1478;------ PUT CHARACTER INTO BUFFER
1479
1480K57: ; BUFFER-FILL
1481 CALL BUFFER_FILL ;;
1482K59: ;;
1483 RET ;; return to unload the buffer
1484;OLDK59:
1485; JMP PREP_EXIT ;; THAT'S ALL FOLKS
1486
1487 ;;
1488 ;;
1489KEYB_INT_9 ENDP ;;
1490 ;;
1491;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1492;;
1493;; Procedure: BUFFER_FILL
1494;;
1495;; Description:
1496;; Generate keyboard buffer entry
1497;;
1498;; Input Registers:
1499;; AX - the buffer entry
1500;; DS - BIOS data segment
1501;;
1502;; Output Registers:
1503;; None
1504;;
1505;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1506 ;;
1507BUFFER_FILL PROC NEAR ;;
1508 ;;
1509 CMP AL,-1 ;; IS THIS AN IGNORE CHAR
1510 JE K61B ;; YES, EXIT
1511 CMP AH,-1 ;; LOOK FOR -1 PSEUDO SCAN
1512 JE K61B ;; EXIT
1513;;
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.
1516;;
1517BUFFER_FILL_ANY_CHAR LABEL NEAR ;;
1518 ;;
1519 PUSH SI ;;
1520 PUSH BX ;;
1521 PUSH DS ;; This routine may be called
1522 PUSH AX ;; externally so make sure DS points
1523 MOV AX,DATA ;; to BIOS data
1524 MOV DS,AX ;;
1525 POP AX ;;
1526 ;;
1527 CLC ;;
1528
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
1532 INC BX ;;
1533 ;;
1534;; VERIFY IF THE CURRENT ROM LEVEL IN THE SYSTEM IS FOR THE ORIGINAL PC1
1535 ;;
1536 PUSH AX ;; SAVE AX,DS
1537 PUSH 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
1542 POP AX ;;
1543 JNE NOT_PC1 ;; IF IT'S A LATER ROM RELEASE, BRANCH
1544 ;;
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
1548 JMP K5 ;;
1549NOT_PC1: ;;
1550 CMP BX,BUFFER_END ;; AT END OF BUFFER?
1551 JNE K5 ;; NO, CONTINUE
1552 MOV BX,BUFFER_START ;; YES, RESET TO BUFFER BEGINNING
1553K5: ;;
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
1559 JMP SHORT K61A
1560K62:
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
1563 JZ K61A ;;
1564 AND KB_FLAG,0F0H ;; CLEAR SHIFTS
1565 AND KB_FLAG_1,0FH ;;
1566 AND KB_FLAG_2,1FH ;; CLEAR FUNCTION STATES
1567K61A: ;;
1568 POP DS ;;
1569 POP BX ;;
1570 POP SI ;;
1571K61B: ;;
1572 RET ;;
1573BUFFER_FILL ENDP ;;
1574PAGE ;;
1575 ;;
1576;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1577;;
1578;; Procedure: KB_NOISE
1579;;
1580;; Description:
1581;; General routine to generate beep tones
1582;;
1583;; Input Registers:
1584;; BX - length of tone
1585;; CX - tone frequency (larger CX = lower pitch)
1586;;
1587;; Output Registers:
1588;; AX,BX,CX trashed
1589;;
1590;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1591 ;;
1592BEEPING DB 0 ;; 1 if beep already in progress
1593 ;;
1594KB_NOISE PROC ;;
1595 CMP CS:BEEPING,0 ;; ARE WE BEEPING?
1596 JE NOT_BEEPING_YET ;;
1597 RET ;; YES - RETURN
1598NOT_BEEPING_YET: ;;
1599 MOV CS:BEEPING,1 ;; beep in progress
1600 ;;
1601 STI ;;
1602 ;;
1603 IN AL,061H ;; Get control info
1604 PUSH AX ;;
1605LOOP01: ;;
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
1609LOOP02: ;;
1610 LOOP LOOP02 ;; speaker off
1611 OR AL,2 ;; turn on speaker
1612 OUT 061H,AL ;; output to control
1613 POP CX ;;
1614 PUSH CX ;;
1615LOOP03: ;;
1616 LOOP LOOP03 ;; another half cycle
1617 DEC BX ;; time count
1618 POP CX ;; another cycle
1619 JNZ LOOP01 ;;
1620 POP AX ;;
1621 OUT 061H,AL ;; restore control
1622 ;;
1623 ;;
1624 MOV CS:BEEPING,0 ;; indicate beep over
1625 RET ;;
1626KB_NOISE ENDP ;;
1627 ;;
1628;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1629;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1630;;
1631;; Procedure: DUMBJMP
1632;;
1633;; Description:
1634;; Dummy JUMP used to allow smooth exit
1635;; for XT & older machines
1636;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1637 ;;
1638DUMBJMP PROC ;;
1639 JMP UP1 ;; ARE WE BEEPING?
1640DUMBJMP ENDP ;;
1641 ;;
1642;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1643;;
1644;; Procedure: ERROR_BEEP
1645;;
1646;; Description:
1647;; Call KB_NOISE to generate a beep.
1648;;
1649;; Input Registers:
1650;; None
1651;;
1652;; Output Registers:
1653;; None
1654;;
1655;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1656 ;;
1657 ;;
1658ERROR_BEEP PROC NEAR ;;
1659 ;;
1660 PUSH AX ;; SAVE REGS
1661 PUSH BX ;;
1662 PUSH CX ;;
1663 ;;
1664;***CNS
1665 JMP SHORT $+2
1666;***CNS
1667 MOV AL,EOI ;; ENABLE INTR. CTL. CHIP
1668 OUT INTA00,AL ;;
1669;***CNS
1670 JMP SHORT $+2
1671;***CNS
1672 ;;
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 ;;
1678EB_TEST_1: ;;
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 ;;
1684EB_TEST_2: ;;
1685 TEST CS:SD.SYSTEM_FLAG,PC_386
1686 JZ EB_TEST_3 ;; 386 MACHINE
1687 MOV BX,80H ;;
1688 MOV CX,19CH ;; FREQUENCY
1689 JMP SHORT BEEP_IT ;;
1690EB_TEST_3: ;;
1691 MOV BX,80H ;; DEFAULT TO 286 MACHINE
1692 MOV CX,0CEH ;; FREQUENCY
1693BEEP_IT: ;;
1694 CALL KB_NOISE ;;
1695 ;;
1696 POP CX ;; RESTORE REGS
1697 POP BX ;;
1698 POP AX ;;
1699 RET ;; RETURN
1700ERROR_BEEP ENDP ;;
1701 ;;
1702;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1703;;
1704;; SHIP_IT
1705;;
1706;; THIS ROUTINE HANDLES TRANSMISSION OF COMMAND AND DATA BYTES
1707;; TO THE KEYBOARD CONTROLLER.
1708;;
1709;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1710 ;;
1711SHIP_IT PROC NEAR ;;
1712 ;;
1713;------- TEST SYSTEM TYPE ;;
1714 ;;
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,
1717 RET ;; ELSE RET
1718 ;;
1719 ;;
1720SI1: PUSH AX ;; SAVE DATA TO SEND
1721 ;;
1722;;;-- WAIT FOR COMMAND TO BE ACCEPTED ;;
1723 CLI ;; DISABLE INTERRUPTS
1724 ;;
1725 CALL WAIT_ON_STATUS_PORT ;;
1726 ;;
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
1731SHIP_IT ENDP ;;
1732 ;;
1733;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1734;;
1735;; Procedure: WAIT_ON_STATUS_PORT
1736;;
1737;; Description:
1738;; Waits for a keyboard command to be accepted
1739;;
1740;; Input Registers:
1741;; None
1742;;
1743;; Output Registers:
1744;; None
1745;;
1746;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1747 ;;
1748WAIT_ON_STATUS_PORT PROC NEAR ;;
1749 ;;
1750;---- WAIT FOR COMMAND TO BE ACCEPTED ;;
1751 ;;
1752 MOV CX,CS:SD.TIMING_FACTOR ;; PROCESSOR SCALE FACTOR; PCAT = 1
1753W01: ;;
1754 PUSH CX ;;
1755 SUB CX,CX ;;
1756W02: ;;
1757 IN AL,STATUS_PORT ;;
1758 TEST AL,INPT_BUF_FULL ;;
1759 LOOPNZ W02 ;; WAIT FOR COMMAND TO BE ACCEPTED
1760 POP CX ;;
1761 LOOPNZ W01 ;;
1762 ;;
1763 RET ;;
1764 ;;
1765WAIT_ON_STATUS_PORT ENDP ;;
1766 ;;
1767;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1768;;
1769;; SND_DATA
1770;;
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
1774;;
1775;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1776 ;;
1777SND_DATA PROC NEAR ;;
1778 PUSH AX ;; SAVE REGISTERS
1779 PUSH BX ;; *
1780 PUSH CX ;;
1781 MOV BH,AL ;; SAVE TRANSMITTED BY FOR RETRIES
1782 MOV BL,3 ;; LOAD RETRY COUNT
1783SD0: CLI ;; DISABLE INTERRUPTS
1784 AND KB_FLAG_2,NOT (KB_FE+KB_FA) ; CLEAR ACK AND RESEND FLAGS
1785 ;;
1786 CALL WAIT_ON_STATUS_PORT ;;
1787 ;;
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
1793 MOV CX,AX ;;
1794SD1: TEST KB_FLAG_2,KB_FE+KB_FA ;; SEE IF EITHER BIT SET
1795 JNZ SD3 ;; IF SET, SOMETHING RECEIVED GO PROCESS
1796 ;;
1797 LOOP SD1 ;; OTHERWISE WAIT
1798 ;;
1799SD2: DEC BL ;; DECREMENT RETRY COUNT
1800 JNZ SD0 ;; RETRY TRANSMISSION
1801 ;;
1802 OR KB_FLAG_2,KB_ERR ;; TURN ON TRANSMIT ERROR FLAG
1803 JMP SHORT SD4 ;; RETRIES EXHAUSTED FORGET TRANSMISSION
1804 ;;
1805SD3: TEST KB_FLAG_2,KB_FA ;; SEE IF THIS IS AN ACKNOWLEDGE
1806 JZ SD2 ;; IF NOT, GO RESEND
1807 ;;
1808SD4: POP CX ;; RESTORE REGISTERS
1809 POP BX ;;
1810 POP AX ;; *
1811 RET ;; RETURN, GOOD TRANSMISSION
1812SND_DATA ENDP ;;
1813 ;;
1814;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1815;;
1816;; SND_LED
1817;;
1818;; THIS ROUTINE TURNS ON THE MODE INDICATORS.
1819;;
1820;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1821 ;;
1822SND_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
1826 ;;
1827 OR KB_FLAG_2,KB_PR_LED ;; TURN ON UPDATE IN PROCESS
1828;***CNS
1829 JMP SHORT $+2
1830;***CNS
1831 MOV AL,EOI ;; END OF INTERRUPT COMMAND
1832 OUT 020H,AL ;; SEND COMMAND TO INTERRUPT CONTROL PORT
1833;***CNS
1834 JMP SHORT $+2
1835;***CNS
1836 JMP SHORT SL0 ;; GO SEND MODE INDICATOR COMMAND
1837 ;;
1838SND_LED1: ;;
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
1842 ;;
1843 OR KB_FLAG_2,KB_PR_LED ;; TURN ON UPDATE IN PROCESS
1844SL0: MOV AL,LED_CMD ;; LED CMD BYTE
1845 CALL SND_DATA ;; SEND DATA TO KEYBOARD
1846 CLI ;;
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
1852 ;;
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
1857 ;;
1858SL2: MOV AL,KB_ENABLE ;; GET KEYBOARD CSA ENABLE COMMAND
1859 CALL SND_DATA ;; SEND DATA TO KEYBOARD
1860 CLI ;; TURN OFF INTERRUPTS
1861SL3: AND KB_FLAG_2,NOT(KB_PR_LED+KB_ERR) ; TURN OFF MODE INDICATOR
1862 ;; UPDATE AND TRANSMIT ERROR FLAG
1863SL1: STI ;; ENABLE INTERRUPTS
1864 RET ;; RETURN TO CALLER
1865SND_LED ENDP ;;
1866PAGE ;;
1867 ;;
1868;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1869;;
1870;; MAKE_LED
1871;;
1872;; THIS ROUTINE FORMS THE DATA BYTE NECESSARY TO TURN ON/OFF
1873;; THE MODE INDICATORS
1874;;
1875;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1876 ;;
1877MAKE_LED PROC NEAR ;;
1878 PUSH CX ;; SAVE CX
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
1884 POP CX ;;
1885 RET ;; RETURN TO CALLER
1886MAKE_LED ENDP ;;
1887 ;;
1888;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1889
1890
1891;CNS***
1892
1893CODE ENDS
1894 END