summaryrefslogtreecommitdiff
path: root/v4.0/src/CMD/KEYB
diff options
context:
space:
mode:
authorGravatar Mark Zbikowski2024-04-25 21:24:10 +0100
committerGravatar Microsoft Open Source2024-04-25 22:32:27 +0000
commit2d04cacc5322951f187bb17e017c12920ac8ebe2 (patch)
tree80ee017efa878dfd5344b44249e6a241f2a7f6e2 /v4.0/src/CMD/KEYB
parentMerge pull request #430 from jpbaltazar/typoptbr (diff)
downloadms-dos-main.tar.gz
ms-dos-main.tar.xz
ms-dos-main.zip
MZ is back!HEADmain
Diffstat (limited to 'v4.0/src/CMD/KEYB')
-rw-r--r--v4.0/src/CMD/KEYB/COMMSUBS.ASM603
-rw-r--r--v4.0/src/CMD/KEYB/COMMSUBS.INC30
-rw-r--r--v4.0/src/CMD/KEYB/KBMSG.INC21
-rw-r--r--v4.0/src/CMD/KEYB/KEYB.ASM71
-rw-r--r--v4.0/src/CMD/KEYB/KEYB.LNK3
-rw-r--r--v4.0/src/CMD/KEYB/KEYB.SKL37
-rw-r--r--v4.0/src/CMD/KEYB/KEYBCMD.ASM2072
-rw-r--r--v4.0/src/CMD/KEYB/KEYBCMD.INC53
-rw-r--r--v4.0/src/CMD/KEYB/KEYBCPSD.ASM128
-rw-r--r--v4.0/src/CMD/KEYB/KEYBCPSD.INC29
-rw-r--r--v4.0/src/CMD/KEYB/KEYBDCL.INC50
-rw-r--r--v4.0/src/CMD/KEYB/KEYBEQU.INC31
-rw-r--r--v4.0/src/CMD/KEYB/KEYBI2F.ASM225
-rw-r--r--v4.0/src/CMD/KEYB/KEYBI2F.INC26
-rw-r--r--v4.0/src/CMD/KEYB/KEYBI48.ASM174
-rw-r--r--v4.0/src/CMD/KEYB/KEYBI48.INC27
-rw-r--r--v4.0/src/CMD/KEYB/KEYBI9.ASM672
-rw-r--r--v4.0/src/CMD/KEYB/KEYBI9.INC29
-rw-r--r--v4.0/src/CMD/KEYB/KEYBI9C.ASM1894
-rw-r--r--v4.0/src/CMD/KEYB/KEYBI9C.INC41
-rw-r--r--v4.0/src/CMD/KEYB/KEYBMAC.INC319
-rw-r--r--v4.0/src/CMD/KEYB/KEYBMSG.INC44
-rw-r--r--v4.0/src/CMD/KEYB/KEYBSHAR.INC307
-rw-r--r--v4.0/src/CMD/KEYB/KEYBSYS.INC137
-rw-r--r--v4.0/src/CMD/KEYB/KEYBTBBL.ASM855
-rw-r--r--v4.0/src/CMD/KEYB/KEYBTBBL.INC33
-rw-r--r--v4.0/src/CMD/KEYB/MAKEFILE72
-rw-r--r--v4.0/src/CMD/KEYB/PARSER.ASM517
28 files changed, 8500 insertions, 0 deletions
diff --git a/v4.0/src/CMD/KEYB/COMMSUBS.ASM b/v4.0/src/CMD/KEYB/COMMSUBS.ASM
new file mode 100644
index 0000000..3810ed2
--- /dev/null
+++ b/v4.0/src/CMD/KEYB/COMMSUBS.ASM
@@ -0,0 +1,603 @@
1 PAGE ,132
2 TITLE DOS - KEYB Command - Transient Command Processing
3
4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5;; DOS - NLS Support - KEYB Command
6;; (C) Copyright 1988 Microsoft
7;;
8;; File Name: COMMSUBS.ASM
9;; ----------
10;;
11;; Description:
12;; ------------
13;; Common subroutines used by NLS support
14;;
15;; Documentation Reference:
16;; ------------------------
17;; None
18;;
19;; Procedures Contained in This File:
20;; ----------------------------------
21;;
22;; FIND_HW_TYPE - Determine the keyboard and system unit types and
23;; set the corresponding flags.
24;;
25;; Include Files Required:
26;; -----------------------
27;; None
28;;
29;; External Procedure References:
30;; ------------------------------
31;; FROM FILE ????????.ASM:
32;; ????????? - ????????????????????????????????????????????
33;;
34;; Change History:
35;; ---------------
36;;
37;;
38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
39 ;;
40 PUBLIC FIND_SYS_TYPE ;;
41 PUBLIC FIND_KEYB_TYPE ;;
42 PUBLIC HW_TYPE ;;
43 PUBLIC SECURE_FL ;;
44
45 ;;
46 INCLUDE KEYBEQU.INC ;;
47 INCLUDE KEYBCPSD.INC ;;
48 INCLUDE KEYBSHAR.INC ;;
49 INCLUDE KEYBCMD.INC ;;
50 INCLUDE DSEG.INC ;;
51 INCLUDE POSTEQU.INC ;;
52 ;;
53CODE SEGMENT PUBLIC 'CODE' ;;
54 ;;
55 ASSUME CS:CODE,DS:CODE ;;
56 ;;
57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
58;;
59;; Module: FIND_SYS_TYPE
60;;
61;; Description:
62;; Determine the type of system we are running on.
63;; SYSTEM_FLAG (in active SHARED_DATA) are set to
64;; indicate the system type.
65;; This routine is only called the first time KEYB is being installed.
66;;
67;;
68;; Input Registers:
69;; DS - points to our data segment
70;;
71;; Output Registers:
72;; NONE
73;;
74;; Logic:
75;;
76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
77 ;;
78ROM SEGMENT AT 0F000H ;;
79 ORG 0FFFEH ;;
80ROMID DB ? ;;
81 ;; SEGMENT F000. (F000:FFFE)
82 ;;
83ROMPC1 EQU 0FFH ;; ID OF PC1 hardware
84ROMXT EQU 0FEH ;; ID OF PC-XT/PORTABLE hardware
85ROMJR EQU 0FDH ;; ID OF PCjr & Optional ROM
86ROMAT EQU 0FCH ;; ID OF PCAT
87ROMXT_ENHAN EQU 0FBH ;; ID OF ENHANCED PCXT
88ROMPAL EQU 0FAH ;; ID FOR PALACE
89ROMLAP EQU 0F9H ;; ID FOR PC LAP (P-14)
90ROM_RU_386 EQU 0F8H ;; ID FOR ROUNDUP-386
91 ;;
92ROM ENDS ;;
93 ;;
94 ;; ******** CNS
95 ROMEXT SEGMENT AT 00000H ;; ADDRESS SHOULD NOT BE FIXED AT
96 ORG 0003BH ;;AT 09FC0H -- This is just a ;;
97 KEYBID1 DB ? ;;a dummy value of 000H INT 15H call
98 ;; will load dynamically depending
99 ;; upon system mem size- 9FC0 was only for 640K system
100 ;; *** UNTRUE SEGMENT 9FC0. (9FC0:003B)
101 ROMEXT ENDS ;;
102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
103;***CNS
104
105
106
107
108
109
110
111
112;; Program Code
113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
114 ;;
115FIND_SYS_TYPE PROC NEAR ;;
116 ;;
117 MOV AX,ROM ;; Set segmant to look at ROM
118 MOV DS,AX ;; using the data segment
119 ASSUME DS:ROM ;;
120 ;;
121 MOV AL,ROMID ;; Get hardware ID
122 PUSH AX ;; save it
123 ;;
124 PUSH CS ;; Set data seg back to code
125 POP DS ;;
126 ASSUME DS:CODE ;;
127 ;;
128 MOV AH,92H ;; SET INVALID CALL FOR INT16
129 INT 16H ;; CALL BIOS
130 CMP AH,80H ;; IS EXTENDED INTERFACE THERE?
131 JA CHECK_PC_NET ;; NO, SKIP FLAG
132 OR SD.SYSTEM_FLAG,EXT_16 ;; default is extended INT 16 support
133 ;;
134CHECK_PC_NET: ;;
135 MOV AH,30H ;; GET DOS VERSION NUMBER
136 INT 21H ;; MAJOR # IN AL, MINOR # IN AH
137 CMP AX,0A03H ;; SENSITIVE TO 3.10 OR >
138 JB CHECK_SYSTEM ;; EARLIER VERSION OF DOS NOTHING
139 ;; WAS ESTABLISHED FOR THIS SITUATION
140 PUSH ES ;; Save ES just in case
141 MOV AX,3509H ;; GET INT VECTOR 9 CONTENTS
142 INT 21H ;; ES:BX WILL = CURRENT INT9 VECTOR
143 ;; WE WANT TO SEE IF WE ARE THE 1ST ONES LOADED
144 MOV CX,ES ;; INTO THE INT VECTOR 9. WITH DOS 3.1 WE CAN
145 POP ES ;;
146 CMP CX,0F000H ;; HANDSHAKE WITH THE PC NETWORK BUT NO ONE ELSE
147 JE CHECK_SYSTEM ;; INT VECTOR 9 POINTS TO ROM, OK
148 MOV AX,0B800H ;; ASK IF PC NETWORK IS INSTALLED
149 INT 2FH ;;
150 CMP AL,0 ;; NOT INSTALLED IF AL=0
151 JE CHECK_SYSTEM ;; SOMEBODY ELSE HAS LINKED INTO THE INT VECTOR
152 ;; 9 & I'M GOING TO DROP RIGHT IN AS USUAL
153 OR SD.SYSTEM_FLAG,PC_NET ;; INDICATE PC NET IS RUNNING
154 ;;
155CHECK_SYSTEM: ;;
156 POP AX ;; get code back
157 ;; Is the hardware a PCjr
158 CMP AL,ROMJR ;;
159 JNE TEST_PC_XT ;; IF not then check for next type
160 OR SD.SYSTEM_FLAG,PC_JR ;; system type
161 JMP FIND_SYS_END ;; Done
162 ;;
163TEST_PC_XT: ;;
164 ;; Is the hardware a PC1 or XT ?
165 CMP AL,ROMXT ;;
166 JAE ITS_AN_XT ;; IF FE OR FF THEN ITS AN XT
167 CMP AL,ROMXT_ENHAN ;; IF FB IT IS ALSO AN XT
168 JNE TEST_PC_AT ;; IF not then check for next type
169ITS_AN_XT: ;;
170 OR SD.SYSTEM_FLAG,PC_XT ;; system type
171 JMP FIND_SYS_END ;;
172 ;;
173TEST_PC_AT: ;;
174 ;; Is the hardware an AT ?
175 CMP AL,ROMAT ;;
176 JNE TEST_P12 ;; IF not then check for next type
177 ;;
178 OR SD.SYSTEM_FLAG,PC_AT ;; system type
179 ;;
180 JMP FIND_SYS_END ;;
181 ;;
182TEST_P12: ;;
183 CMP AL,ROMLAP ;; IS this a P12?
184 JNE TEST_PAL ;; IF not then check for next type
185 OR SD.SYSTEM_FLAG,PC_LAP ;; system type
186 JMP FIND_SYS_END ;;
187 ;;
188TEST_PAL: ;;
189 CMP AL,ROMPAL ;; IS this a PALACE?
190 JNE TEST_RU_386 ;; IF not then check for next type
191 OR SD.SYSTEM_FLAG,PC_PAL ;; system type
192 JMP FIND_SYS_END ;;
193 ;;
194TEST_RU_386: ;;
195 CMP AL,ROM_RU_386 ;; IS this a ROUNDUP with a 386?
196 JNE FIND_SYS_END ;; IF not then check for next type
197 OR SD.SYSTEM_FLAG,PC_386 ;; system type
198 MOV SD.TIMING_FACTOR,2 ;; Bump scale factor to account for 386
199 ;;
200FIND_SYS_END: ;;
201 ;;
202 RET ;;
203 ;;
204FIND_SYS_TYPE ENDP ;;
205 ;;
206;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
207;;
208;; Module: FIND_KEYB_TYPE
209;;
210;; Description:
211;; Determine the type of keyboard we are running on.
212;; KEYB_TYPE (in SHARED_DATA) is set to
213;; indicate the keyboard type.
214;; This routine is only called the first time KEYB is being installed.
215;;
216;;
217;; Input Registers:
218;; DS - points to our data segment
219;;
220;; Output Registers:
221;; NONE
222;;
223;; Logic:
224;;
225;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
226 ;;
227HW_TYPE DW 0 ;;
228;***CNS ;;
229
230SECURE_FL DB 0
231;RESERVED ADDRESS 013h BITS 1 & 2
232
233 PASS_MODE equ 00000001B ;AN000;
234 SERVER_MODE equ 00000010B ;AN000;
235 SECRET_ADD equ 13h ;AN000;
236 PORT_70 equ 70h ;AN000;
237 PORT_71 equ 71h ;AN000;
238
239;***CNS
240G_KEYBOARD EQU 0AB41h ;;????? ;; Keyboard ID for FERRARI_G
241P_KEYBOARD EQU 0AB54h ;;????? ;; Keyboard ID for FERRARI_P
242 ;;
243P_KB_ID DB 08 ;;
244 ;;
245;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
246;; Program Code
247;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
248 ;;
249FIND_KEYB_TYPE PROC NEAR ;;
250 ;;
251 PUSH ES ;;
252 PUSH DS ;;
253 ;;
254 MOV AX,ROM ;; Set segmant to look at ROM
255 MOV DS,AX ;; using the data segment
256 ASSUME DS:ROM ;;
257 ;;
258 MOV AX,DATA ;;
259 MOV ES,AX ;; ES points to BIOS data
260 ;;
261 MOV AL,ROMID ;; Get hardware ID
262 ;;
263 PUSH CS ;; Set data seg back to code
264 POP DS ;;
265 ASSUME DS:CODE ;;
266 ;;
267 ;;
268 MOV HW_TYPE,G_KB ;; Default keyboard is G_KB
269 ;;
270 ;; Is the hardware a PCjr
271 CMP AL,ROMJR ;;
272 JNE TEST_PC_XT_2 ;; IF not then check for next type
273 MOV HW_TYPE,JR_KB ;; keyboard type
274 JMP FIND_KEYB_END ;; Done
275 ;;
276TEST_PC_XT_2: ;;
277 ;; Is the hardware a PC1 or XT ?
278 CMP AL,ROMXT ;;
279 JAE ITS_AN_XT_2 ;; IF FE OR FF THEN ITS AN XT
280 CMP AL,ROMXT_ENHAN ;; IF FB IT IS ALSO AN XT
281 JNE TEST_PC_AT_2 ;; IF not then check for next type
282ITS_AN_XT_2: ;;
283 TEST ES:KB_FLAG_3,KBX ;; IS THE ENHANCED KEYBOARD INSTALLED?
284 JZ ITS_AN_XT_3 ;;
285 JMP FIND_KEYB_END ;; Yes, exit
286 ;;
287ITS_AN_XT_3: ;;
288 MOV HW_TYPE,XT_KB ;; NO, normal XT keyboard
289 JMP FIND_KEYB_END ;;
290 ;;
291TEST_PC_AT_2: ;;
292 ;; Is the hardware an AT ?
293 CMP AL,ROMAT ;;
294 JNE TEST_P12_2 ;; IF not then check for next type
295 ;;
296 ;; CHECK FOR ENHANCED KEYBOARD...
297 OR ES:KB_FLAG_2,08H ;; FROM COMNBODY.ASM - DON'T KNOW WHY
298 ;;
299 ;; READ ID COMMAND TO TEST FOR A KBX
300 ;;
301 MOV ES:KB_FLAG_3,RD_ID ;; INDICATE THAT A READ ID IS BEING
302 ;; DONE
303 MOV AL,0F2H ;; SEND THE READ ID COMMAND
304 CALL SND_DATA_AT ;;
305 ;;
306 MOV CX,03F00H ;; LOAD COUNT FOR ABOUT 37MS
307WT_ID: TEST ES:KB_FLAG_3,KBX ;; TEST FOR KBX SET
308 LOOPZ WT_ID ;; WAIT OTHERWISE
309 ;; BE SURE FLAGS GOT RESET
310;***CNS
311 ;; SAVE ALL REGISTERS BEFORE ENTRY
312 ;; INTO CHECKING KEYBOARD SECURITY
313 PUSH AX ;AN000; ;SAVE THE CURRENT ENVIRONMENT
314 PUSH BX ;AN000;
315 PUSH CX ;AN000;
316 PUSH DX ;AN000;
317 PUSH DS ;AN000;
318 PUSH ES ;AN000;
319 PUSH SI ;AN000;
320 PUSH DI ;AN000;
321
322
323
324 CALL KEYB_SECURE ;SEE IF THE KEYBOARD SECURITY IS
325 ;ACTIVATED AT THIS POINT
326
327
328 POP DI ;AN000;
329 POP SI ;AN000;
330 POP ES ;AN000;
331 POP DS ;AN000;
332 POP DX ;AN000;
333 POP CX ;AN000;
334 POP BX ;AN000;
335 POP AX ;AN000;SAVE THE CURRENT ENVIRONMENT
336
337 JNC ASSUME_AT ;AN000;SECURITY UNAVAILABLE OR AN AT KB
338
339
340 MOV SECURE_FL,1 ;AN000;SECURITY IS ACTIVE
341 JMP FIND_KEYB_END ;AN000;ASSUME IT IS A G_KB WITH
342 ;AN000;NUM LOCK OFF
343ASSUME_AT:
344;***CNS
345 AND ES:KB_FLAG_3,NOT RD_ID+LC_AB
346 ;;
347 TEST ES:KB_FLAG_3,KBX ;; WAS IT A KBX?
348 JNZ DONE_AT_2 ;; YES, WE ARE DONE
349 ;;
350 MOV HW_TYPE,AT_KB ;; NO, AT KBD
351DONE_AT_2: ;;
352 JMP FIND_KEYB_END ;;
353 ;;
354TEST_P12_2: ;;
355 CMP AL,ROMLAP ;; IS this a P12?
356 JNE TEST_XT_ENH_OR_NEWER ;; IF not then check for next type
357 MOV HW_TYPE,P12_KB ;; IF yes then set flag
358 ;;
359TEST_XT_ENH_OR_NEWER: ;;
360 CMP AL,ROMXT_ENHAN ;;
361 JNA GET_KEYB_ID ;; ** assume all new systems will have ext
362 JMP FIND_KEYB_END ;; ** ROM or else test previous to this
363 ;;
364GET_KEYB_ID: ;;
365;***************************** CNS ****************************************
366;* This area has been Revised to allow the extended ROM support added
367;* flexibility for the PALACE or FLASHLIGHT with less than 640k; AN extended
368;* BIOS DATA call is to be made returning the segment of the extended
369;* BIOS area which should be in maximum memory - 1k area.
370;***************************************************************************
371
372 MOV AH,0C1H ;; Make the extended bios data area
373 INT 15H ;; call to get the segment address for
374 JNC NEW_SYSTEM ;; accessing the keyboard byte area
375 JMP FIND_KEYB_END ;; JNC SOMEWHERE&REPORT
376 ;; otherwise EXTENDED BIOS DATA RETURNED
377 ;; in the ES
378 ;; save the starting seg address value
379 ;; needs to start at locale 0003BH
380;****************************************************************************
381NEW_SYSTEM:
382;**CNS
383 ;; Set segment to look at extended ROM
384 ;; using the data segment
385 PUSH ES ;; SEG value returned from INT15h -- C1 call
386 POP DS
387 ASSUME DS:ROMEXT ;;
388 ;;
389 MOV AX,DATA ;;
390 MOV ES,AX ;; BP points to BIOS data
391
392 ;;
393 MOV AL,KEYBID1 ;; Get keyboard ID ********** CNS
394;**CNS
395;*****************************************************************************
396;old MOV AX,ROMEXT ;; Set segment to look at extended ROM
397;code MOV DS,AX ;; using the data segment
398; ASSUME DS:ROMEXT ;;
399; ;;
400; MOV AX,DATA ;;
401;old MOV ES,AX ;; ES points to BIOS data
402;code ;;
403; MOV AL,KEYBID1 ;; Get keyboard ID
404;******************************************************************************
405 PUSH CS ;; Set data seg back to code
406 POP DS ;;
407 ASSUME DS:CODE ;;
408 ;;
409 AND AL,0FH ;; Remove high nibble
410 CMP AL,P_KB_ID ;; IF keyboard is a FERRARI P THEN
411 JNE FIND_KEYB_END ;;
412 OR HW_TYPE,P_KB ;; Set the HW_TYPE flag
413 ;;
414FIND_KEYB_END: ;; ELSE
415 MOV AX,HW_TYPE ;; Leave default alone
416 MOV SD.KEYB_TYPE,AX ;;
417 ;;
418 POP DS ;;
419 POP ES ;;
420 RET ;;
421 ;;
422FIND_KEYB_TYPE ENDP ;;
423 ;;
424;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
425;;
426;; Module: SND_DATA_AT
427;;
428;; Description:
429;; THIS ROUTINE HANDLES TRANSMISSION OF PC/AT COMMAND AND DATA BYTES
430;; TO THE KEYBOARD AND RECEIPT OF ACKNOWLEDGEMENTS. IT ALSO
431;; HANDLES ANY RETRIES IF REQUIRED
432;;
433;;
434;; Input Registers:
435;; DS - points to our data segment
436;; ES - points to the BIOS data segment
437;;
438;; Output Registers:
439;;
440;; Logic:
441;;
442;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
443
444SND_DATA_AT PROC NEAR
445 PUSH AX ; SAVE REGISTERS
446 PUSH BX ; *
447 PUSH CX
448 MOV BH,AL ; SAVE TRANSMITTED BY FOR RETRIES
449 MOV BL,3 ; LOAD RETRY COUNT
450SD0: CLI ; DISABLE INTERRUPTS
451 AND ES:KB_FLAG_2,NOT (KB_FE+KB_FA) ; CLEAR ACK AND RESEND FLAGS
452
453;------- WAIT FOR COMMAND TO BE ACCEPTED
454
455 SUB CX,CX
456SD5:
457 IN AL,STATUS_PORT
458 TEST AL,INPT_BUF_FULL
459 LOOPNZ SD5 ; WAIT FOR COMMAND TO BE ACCEPTED
460;
461 MOV AL,BH ; REESTABLISH BYTE TO TRANSMIT
462 OUT PORT_A,AL ; SEND BYTE
463 STI ; ENABLE INTERRUPTS
464 MOV CX,01A00H ; LOAD COUNT FOR 10mS+
465SD1: TEST ES:KB_FLAG_2,KB_FE+KB_FA ; SEE IF EITHER BIT SET
466 JNZ SD3 ; IF SET, SOMETHING RECEIVED GO PROCESS
467;
468 LOOP SD1 ; OTHERWISE WAIT
469;
470SD2: DEC BL ; DECREMENT RETRY COUNT
471 JNZ SD0 ; RETRY TRANSMISSION
472;
473 OR ES:KB_FLAG_2,KB_ERR ; TURN ON TRANSMIT ERROR FLAG
474 JMP SHORT SD4 ; RETRIES EXHAUSTED FORGET TRANSMISSION
475;
476SD3: TEST ES:KB_FLAG_2,KB_FA ; SEE IF THIS IS AN ACKNOWLEDGE
477 JZ SD2 ; IF NOT, GO RESEND
478;
479 ;; If this was an acknowledge, determine*RPS
480 ;; if keyboard is FERRARI G or P *RPS
481 MOV CX,1000 ;;
482IO_DELAY1: ;;
483 LOOP IO_DELAY1 ;;
484 JMP SHORT $+2 ;; Allow for recovery time
485 IN AL,PORT_A ;; READ IN THE CHARACTER *RPS
486 MOV CX,1000 ;;
487IO_DELAY2: ;;
488 LOOP IO_DELAY2 ;;
489 JMP SHORT $+2 ;; Allow for recovery time
490 MOV BH,AL ;; *RPS
491 ;;
492 IN AL,PORT_A ;; READ IN THE CHARACTER *RPS
493 MOV BL,AL ;; *RPS
494 ;; *RPS
495 CMP BX,P_KEYBOARD ;; Set HW_TYPE appropriately *RPS
496 JNE SD4 ;; *RPS
497 OR HW_TYPE,P_KB ;; *RPS
498 ;;
499SD4: POP CX ; RESTORE REGISTERS
500 POP BX
501 POP AX ; *
502 RET ; RETURN, GOOD TRANSMISSION
503SND_DATA_AT ENDP
504
505;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
506;************************************************************************
507; KEYBOARD SECURITY LOGIC
508; CHECK THE CMOS RAM @ ADDRESS HEX 013H
509; CHECK TO SEE IF EITHER BITS 1 (PASSWORD) OR 2 (SERVER MODE) ARE SET ON
510; IF EITHER BIT IS SET ON THE SYSTEM IS A MOD 50 on up
511; REPORT MESSAGE KEYBOARD LOCKED UNABLE TO LOAD KEYBOARD TABLES
512; OTHERWISE AN INVALID RESPONSE OR ZERO SHOULD BE RETURNED
513; PROCEED AS WITH LOADING OF THE CORRECT TABLES
514
515; PROPOSED KEYBOARD SYNTAX
516
517; KEYB [lang],[cp],[[d:][path]KEYBOARD.SYS][/ID:id]
518
519
520
521;************************************************************************
522
523KEYB_SECURE PROC NEAR
524
525
526
527;RESERVED ADDRESS 013h BITS 1 & 2
528
529; PASS_MODE equ 00000001B ;AN000;
530; SERVER_MODE equ 00000010B ;AN000;
531
532
533
534; SECRET_ADD equ 13h ;AN000;
535; PORT_70 equ 70h ;AN000;
536; PORT_71 equ 71h ;AN000;
537
538; PUSH AX ;AN000; ;SAVE THE CURRENT ENVIRONMENT
539; PUSH BX ;AN000;
540; PUSH CX ;AN000;
541; PUSH DX ;AN000;
542; PUSH CS ;AN000;
543; PUSH DS ;AN000;
544; PUSH ES ;AN000;
545; PUSH SI ;AN000;
546; PUSH DI ;AN000;
547 CLI ;AN000;;DISABLE THE INTERRUPT TO AVOID
548 ;AN000;;THE CMOS REGISTER BEFORE
549 ;AN000;;THE READ & WRITE IS DONE
550
551 XOR AX,AX
552 MOV AL,SECRET_ADD
553 OUT PORT_70,AL ;AN000;;SEND THE ADDRESS CONTAINING THE
554 ;BITS FOR THE PASSWORD AND SERVER
555 ;MODE STATE TO PORT 70H
556
557
558
559
560
561 IN AL,PORT_71 ;AN000;;READ THE DATA IN TO GET THE
562 ;RESULTS OF THE CHECK FOR THE
563 ;EXISTENCE OF SECURITY.
564
565 MOV DX,AX
566
567 TEST DL,PASS_MODE+SERVER_MODE ;AN000;;CHECK & SEE IF THE BITS ARE ON
568 JNZ KEYB_LOCKED ;AN000;;YES THEY ARE ON SO EXIT AND REPORT
569 CLC ;XOR AX,AX ;ASSUME THIS IS AN AT KEYBOARD
570 JMP SECURE_RET
571
572KEYB_LOCKED:
573
574 STC ; MOV AX,1 ;AN000;SET THE SECURITY FLAG
575 ;ON;
576 ;PROCEED - EITHER SYSTEM IS AN
577 ;AT OR THE SYSTEM IS UNLOCKED
578SECURE_RET:
579
580 STI ;AN000;;ENABLE THE INTERRUPT
581
582
583; POP DI ;AN000;
584; POP SI ;AN000;
585; POP ES ;AN000;
586; POP DS ;AN000;
587; POP CS ;AN000;
588; POP DX ;AN000;
589; POP CX ;AN000;
590; POP BX ;AN000;
591; POP AX ;AN000; ;SAVE THE CURRENT ENVIRONMENT
592
593
594 RET
595
596
597KEYB_SECURE ENDP
598
599
600
601
602CODE ENDS
603 END
diff --git a/v4.0/src/CMD/KEYB/COMMSUBS.INC b/v4.0/src/CMD/KEYB/COMMSUBS.INC
new file mode 100644
index 0000000..96bea5d
--- /dev/null
+++ b/v4.0/src/CMD/KEYB/COMMSUBS.INC
@@ -0,0 +1,30 @@
1.XLIST
2
3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4;; DOS - NLS Support - KEYB Command
5;; (C) Copyright 1988 Microsoft
6;;
7;; File Name: CONVERT.INC
8;; ----------
9;;
10;; Root File Name: KEYBCMD.ASM
11;; ---------------
12;;
13;; Description:
14;; ------------
15;; External declarations for procedures in file KEYBCMD.ASM.
16;;
17;; Change History:
18;; ---------------
19;;
20;;
21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
22 ;;
23 EXTRN FIND_SYS_TYPE :NEAR ;;
24 EXTRN FIND_KEYB_TYPE :NEAR ;;
25 ;;
26 EXTRN HW_TYPE :WORD ;;
27 ;;
28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
29
30.LIST
diff --git a/v4.0/src/CMD/KEYB/KBMSG.INC b/v4.0/src/CMD/KEYB/KBMSG.INC
new file mode 100644
index 0000000..f7beb54
--- /dev/null
+++ b/v4.0/src/CMD/KEYB/KBMSG.INC
@@ -0,0 +1,21 @@
1 ;;
2ACT_KEYB DB 'Current keyboard code: ','$' ;;
3ACT_KEYB_CP DB ' code page: ','$' ;;
4ACT_CON_CP DB 'Current CON code page: ','$' ;;
5INV_L DB 'Invalid keyboard code specified',10,13,'$' ;;
6INV_I DB 'Invalid keyboard ID specified',10,13,'$' ;;
7INV_CP DB 'Invalid code page specified',10,13,'$' ;;
8INV_S DB 'Invalid syntax',10,13,'$' ;;
9INV_FN DB 'Bad or missing Keyboard Definition File',10,13,'$' ;;
10INV_KEYB_Q DB 'KEYB has not been installed',10,13,'$' ;;
11INV_CON_Q DB 'Active code page not available from CON device',10,13,'$' ;;
12NOT_DESIG DB 'Code page specified has not been prepared',10,13,'$' ;;
13NOT_SUPP DB 'One or more CON code pages invalid for given keyboard code',10,13,'$' ;;
14NOT_VALID1 DB 'Code page requested (','$' ;;
15NOT_VALID2 DB ') is not valid for given keyboard code',10,13,'$' ;;
16WARNING_1 DB 'Code page specified is inconsistent with the selected code page',10,13,'$' ;;
17INV_COMBO DB 'ID code specified is inconsistent with the selected keyboard code',13,'$' ;;
18MEMORY_OVERF DB 'Unable to create KEYB table in resident memory',10,13,'$' ;;
19CR_LF DB 10,13,'$' ;;
20 ;;
21 \ No newline at end of file
diff --git a/v4.0/src/CMD/KEYB/KEYB.ASM b/v4.0/src/CMD/KEYB/KEYB.ASM
new file mode 100644
index 0000000..fffce04
--- /dev/null
+++ b/v4.0/src/CMD/KEYB/KEYB.ASM
@@ -0,0 +1,71 @@
1
2 PAGE ,132
3 TITLE DOS - KEYB Command - Root Module
4
5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6;; DOS - NLS Support - KEYB Command
7;; (c) Copyright 1988 Microsoft
8;;
9;; File Name: KEYB.ASM
10;; ----------
11;;
12;; Description:
13;; ------------
14;; Contains root module for KEYB command. This module is the
15;; KEYB command entry point. KEYB is an external command included
16;; with PC DOS 3.3 to provide keyboard support for 14 languages.
17;; KEYB will jump immediately into the command processing in
18;; file KEYBCMD. All resident code is included before KEYBCMD
19;; in the linkage list.
20;;
21;; Documentation Reference:
22;; ------------------------
23;; PC DOS 3.3 NLS Interface Specification - May ?? 1986
24;; PC DOS 3.3 Detailed Design Document - May ?? 1986
25;;
26;; Procedures Contained in This File:
27;; ----------------------------------
28;;
29;;
30;; Include Files Required:
31;; -----------------------
32;; KEYBCMD.INC - External declarations for transient command
33;; processing routines
34;;
35;; External Procedure References:
36;; ------------------------------
37;; FROM FILE KEYCMD.ASM:
38;; KEYB_COMMAND - Main routine for transient command processing.
39;;
40;; Linkage Instructions:
41;; --------------------
42;; Link in .COM format. Resident code/data is in files KEYB thru
43;; KEYBCPSD.
44;;
45;; LINK KEYB+KEYBI9+KEYBI9C+KEYBI2F+KEYBI48+KEYBCPSD+KEYBMSG+
46;; COMMSUBS+KEYBTBBL+KEYBCMD;
47;; EXE2BIN KEYB.EXE KEYB.COM
48;;
49;; Change History:
50;; ---------------
51;;
52;;
53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
54 ;;
55 ;;
56CODE SEGMENT PUBLIC 'CODE' BYTE ;;
57 ;;
58 INCLUDE KEYBCMD.INC ;; Bring in external declarations
59 ;; for transient command processing
60 ASSUME CS:CODE,DS:CODE ;;
61 ORG 100H ;; required for .COM
62 ;;
63 ;;
64START: ;;
65 ;;
66 JMP KEYB_COMMAND ;;
67 ;;
68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
69
70CODE ENDS
71 END START
diff --git a/v4.0/src/CMD/KEYB/KEYB.LNK b/v4.0/src/CMD/KEYB/KEYB.LNK
new file mode 100644
index 0000000..4ef13e5
--- /dev/null
+++ b/v4.0/src/CMD/KEYB/KEYB.LNK
@@ -0,0 +1,3 @@
1Keyb+keybi9+KEYBI9C+keybi2f+keybi48+
2keybcpsd+commsubs+keybtbbl+parser+KEYBCMD;
3 \ No newline at end of file
diff --git a/v4.0/src/CMD/KEYB/KEYB.SKL b/v4.0/src/CMD/KEYB/KEYB.SKL
new file mode 100644
index 0000000..7bb2b5c
--- /dev/null
+++ b/v4.0/src/CMD/KEYB/KEYB.SKL
@@ -0,0 +1,37 @@
1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2;
3; Message Skeleton file for KEYB.COM
4;
5; Author: WGR
6;
7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8
9:util KEYB ;AN000;ty name
10:class 2
11:use PARSE1 ;AN000;
12:use PARSE2 ;AN000;
13:use PARSE3 ;AN000;
14:use PARSE4 ;AN000;
15:use PARSE6 ;AN000;
16:use PARSE7 ;AN000;
17:use PARSE10 ;AN003;
18:class A
19:use 1 COMMON1 ;AN000;rrect DOS version'
20:def 2 "Current keyboard code: %1" ;AN000;
21:def 3 "Current keyboard ID: %1" ;AN000;
22:def 4 " code page: %1",CR,LF ;AN000;
23:def 5 "Current CON code page: %1",CR,LF ;AN000;
24:def 6 "Invalid keyboard code specified",CR,LF ;AN000;
25:def 7 "Invalid keyboard ID specified",CR,LF ;AN000;
26:def 8 "Invalid code page specified",CR,LF ;AN000;
27:def 9 "Bad or missing Keyboard Definition File",CR,LF ;AN000;
28:def 10 "KEYB has not been installed",CR,LF ;AN000;
29:def 11 "Active code page not available from CON device",CR,LF ;AN000;
30:def 12 "Code page specified has not been prepared",CR,LF ;AN000;
31:def 13 "One or more CON code pages invalid for given keyboard code",CR,LF ;AN000;
32:def 14 "Code page requested (%1) is not valid for given keyboard code",CR,LF ;AN000;
33:def 15 "Code page specified is inconsistent with the selected code page",CR,LF ;AN000;
34:def 16 "ID code specified is inconsistent with the selected keyboard code",CR,LF ;AN000;
35:def 17 "Unable to create KEYB table in resident memory",CR,LF ;AN000;
36:use 18 PARSE8 ; 'Parameter format not correct' ;AN000;
37:end ;AN000;
diff --git a/v4.0/src/CMD/KEYB/KEYBCMD.ASM b/v4.0/src/CMD/KEYB/KEYBCMD.ASM
new file mode 100644
index 0000000..57033f3
--- /dev/null
+++ b/v4.0/src/CMD/KEYB/KEYBCMD.ASM
@@ -0,0 +1,2072 @@
1
2 PAGE ,132
3 TITLE DOS - KEYB Command - Transient Command Processing
4
5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6;; DOS - NLS Support - KEYB Command
7;; (C) Copyright 1988 Microsoft
8;;
9;; File Name: KEYBCMD.ASM
10;; ----------
11;;
12;; Description:
13;; ------------
14;; Contains transient command processing modules for KEYB command.
15;;
16;; Documentation Reference:
17;; ------------------------
18;; PC DOS 3.3 Detailed Design Document - May ?? 1986
19;;
20;; Procedures contained in this file:
21;; ----------------------------------
22;; KEYB_COMMAND: Main routine for command processing.
23;; PARSE_PARAMETERS: Validate syntax of parameters included
24;; on command line.
25;; BUILD_PATH: Find KEYBOARD.SYS file and validate language and/or
26;; code page.
27;; INSTALL_INT_VECTORS: Install our INT 9, INT 2F, INT48 Drivers
28;; REMOVE_INT_VECTORS: Remove our INT 9, INT 2F, INT48 Drivers
29;; NUMLK_ON: Turn on the NUM LOCK LED
30;; FIND_FIRST_CP: Determine first code page for given language in the
31;; Keyboard Definition file.
32;;
33;; Include Files Required:
34;; -----------------------
35;; KEYBMSG.INC
36;; KEYBEQU.INC
37;; KEYBSYS.INC
38;; KEYBI9C.INC
39;; KEYBI9.INC
40;; KEYBI2F.INC
41;; KEYBI48.INC
42;; KEYBSHAR.INC
43;; KEYBDCL.INC
44;; KEYBTBBL.INC
45;; COMMSUBS.INC
46;; KEYBCPSD.INC
47;; POSTEQU.INC
48;; DSEG.INC
49;;
50;; External Procedure References:
51;; ------------------------------
52;; FROM FILE KEYBTBBL.ASM:
53;; TABLE_BUILD - Create the shared area containing all keyboard tables.
54;; STATE_BUILD - Build all states within the table area
55;; FROM FILE KEYBMSG.ASM:
56;; KEYB_MESSAGES - All messages
57;;
58;; Change History:
59;;
60;; Revised for DOS 4.00 - NickS
61;; A000 - WilfR
62;; AN002- DCR ???? -KEYBAORD SECURITY LOCK - CNS
63;;
64;;
65;; an003 PTM 3906 - KEYB messages do not conform
66;; to spec. Error message does
67;; 3/24/88 not pass back the bogus command
68;; line argument. - CNS
69;;
70;;
71;;
72;;
73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
74 ;;
75 PUBLIC KEYB_COMMAND ;;
76 ;;
77;*****************CNS********************
78 PUBLIC ID_TAB_OFFSET ;AN000;
79;*****************CNS********************
80 PUBLIC CP_TAB_OFFSET ;;
81 PUBLIC STATE_LOGIC_OFFSET ;;
82 PUBLIC SYS_CODE_PAGE ;;
83 PUBLIC KEYBCMD_LANG_ENTRY_PTR ;;
84 PUBLIC DESIG_CP_BUFFER ;;
85 PUBLIC DESIG_CP_OFFSET ;;
86 PUBLIC KEYBSYS_FILE_HANDLE ;;
87 PUBLIC NUM_DESIG_CP ;;
88 PUBLIC TB_RETURN_CODE ;;
89 PUBLIC FILE_BUFFER ;;
90 PUBLIC FILE_BUFFER_SIZE
91 PUBLIC FB ;;
92;*****************CNS********************
93 PUBLIC ID_PTR_SIZE ;AN000;
94 PUBLIC LANG_PTR_SIZE ;AN000;
95 PUBLIC CP_PTR_SIZE ;AN000;
96 PUBLIC NUM_ID ;AN000;
97 PUBLIC NUM_LANG ;AN000;
98 PUBLIC NUM_CP ;AN000;
99 PUBLIC SHARED_AREA_PTR ;;
100;*****************CNS********************
101 PUBLIC SD_SOURCE_PTR ;;
102 PUBLIC TEMP_SHARED_DATA ;;
103 ;;
104 PUBLIC FOURTH_PARM ;AN000; ;AN000
105 PUBLIC ONE_PARMID ;AN000; ;AN000
106 PUBLIC FTH_PARMID ;AN000; ;AN000
107 PUBLIC ID_FOUND ;AN000; ;AN000
108 PUBLIC BAD_ID ;AN000; ;AN000
109 PUBLIC ALPHA ;AN000; ;AN000
110 EXTRN PARSE_PARAMETERS:NEAR ;AN000; ;AN000
111;***CNS
112 EXTRN SECURE_FL:BYTE ;an002;
113 EXTRN CUR_PTR:WORD ;an003;
114 EXTRN OLD_PTR:WORD ;an003;
115 EXTRN ERR_PART:WORD ;an003;
116;***CNS
117.xlist
118 INCLUDE STRUC.INC ;AN000;;; WGR structured macros ;AN000
119 INCLUDE SYSMSG.INC ;AN000;;; WGR message retriever ;AN000
120.list
121 ;;
122MSG_UTILNAME <KEYB> ;AN000;;; WGR identify to message retriever ;AN000
123 ;;
124CODE SEGMENT PUBLIC 'CODE' ;;
125 ;;
126.xlist ;;
127 INCLUDE KEYBEQU.INC ;;
128 INCLUDE KEYBSYS.INC ;;
129 INCLUDE KEYBI9.INC ;;
130 INCLUDE KEYBI9C.INC ;;
131 INCLUDE KEYBI2F.INC ;;
132 INCLUDE KEYBI48.INC ;;
133 INCLUDE KEYBSHAR.INC ;;
134 INCLUDE KEYBDCL.INC ;;
135 INCLUDE KEYBTBBL.INC ;;
136 INCLUDE COMMSUBS.INC ;;
137 INCLUDE KEYBCPSD.INC ;;
138.xlist
139 INCLUDE POSTEQU.INC ;;
140 INCLUDE DSEG.INC ;;
141 ;;
142.list
143 ASSUME CS:CODE,DS:CODE ;;
144 ;;
145;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
146;;
147;; Module: KEYB_COMMAND
148;;
149;; Description:
150;; Main routine for transient command processing.
151;;
152;; Input Registers:
153;; DS - points to our data segment
154;;
155;; Output Registers:
156;; Upon termination, if an error has occurred in which a keyboard table
157;; was not loaded, the AL register will contain the a error flag. This
158;; flag is defined as follows:
159;; AL:= 1 - Invalid language, code page, or syntax
160;; 2 - Bad or missing Keyboard Definition File
161;; 3 - KEYB could not create a table in resident memory
162;; 4 - An error condition was received when communicating
163;; with the CON device
164;; 5 - Code page requested has not been designated
165;; 6 - The keyboard table for the requested code page cannot
166;; be found in resident keyboard table.
167;;
168;; Logic:
169;; IF KEYB has NOT been previously loaded THEN
170;; Set SHARED_AREA_PTR to TEMP_SHARED_AREA
171;; INSTALLED_KEYB := 0
172;; Get HW_TYPE (set local variable)
173;; ELSE
174;; Set SHARED_AREA_PTR to ES:SHARED_AREA
175;; Get HW_TYPE (set local variable)
176;; Set TABLE_OK := 0
177;; INSTALLED_KEYB := 1
178;;
179;; IF CPS-CON has been loaded THEN
180;; INSTALLED_CON := 1
181;;
182;;*********************************** CNS *************************************
183;; Call PARSE_PARAMETERS := Edit ID or language, code page,
184;; and path parameters,ID on command line
185;;*********************************** CNS *************************************
186;; Check all return codes:
187;; IF any parameters are invalid THEN
188;; Display ERROR message
189;; ELSE
190;; IF no language parm specified
191;; AND code page is not invalid
192;; AND syntax is valid THEN
193;; Process QUERY:
194;; IF KEYB is installed THEN
195;; Get and display active language from SHARED_DATA_AREA
196;; Get invoked code page from SHARED_DATA_AREA
197;; Convert to ASCII
198;; Display ASCII representation of code page, CR/LF
199;;*********************************** CNS *************************************
200;; IF ALTERNATE FLAG SET
201;; Get and display active ID from SHARED_DATA_AREA
202;; Convert to ASCII
203;; Display ASCII representation of ID, CR/LF
204;;*********************************** CNS *************************************
205;; IF CPS-CON is installed THEN
206;; Get selected code page info from CON
207;; Convert to ASCII
208;; Display ASCII representation of code page, CR/LF
209;; EXIT without staying resident
210;;
211;; ELSE
212;; Call BUILD_PATH := Determine location of Keyboard definition file
213;; Open the file
214;; IF error in opening file THEN
215;; Display ERROR message and EXIT
216;; ELSE
217;; Save handle
218;; Set address of buffer
219;; READ header of Keyboard definition file
220;; IF error in reading file THEN
221;; Display ERROR message and EXIT
222;; ELSE
223;; Check signature for correct file
224;; IF file signature is correct THEN
225;; READ language table
226;; IF error in reading file THEN
227;; Display ERROR message and EXIT
228;; ELSE
229;; Use table to verify language parm
230;; Set pointer values
231;; IF code page was specified
232;; READ language entry
233;; IF error in reading file THEN
234;; Display ERROR message and EXIT
235;; ELSE
236;; READ Code page table
237;; IF error in reading file THEN
238;; Display ERROR message and EXIT
239;; ELSE
240;; Use table to verify code page parm
241;; Set pointer values
242;; IF CPS-CON is not installed THEN
243;; Set number of code pages = 1
244;; IF CODE_PAGE_PARM was specified THEN
245;; Copy CODE_PAGE_PARM into table of code pages to build
246;; ELSE
247;; Call FIND_FIRST_CP := Define the system code page (1st in Keyb Def file)
248;; Copy SYSTEM_CP into table of code pages to build
249;; ELSE
250;; Issue INT 2F ; 0AD03H to get table of Designated code pages
251;; Set number of designated code pages (HWCP + Desig CP)
252;; Issue INT 2F ; 0AD02H to get invoked code page
253;; IF CODE_PAGE_PARM was specified THEN
254;; Check that CODE_PAGE_PARM is in the list of designated code pages
255;; IF CODE_PAGE_PARM is in the list of designated code pages THEN
256;; Copy specified CP into table of code pages to build
257;; IF a CP has been selected AND is inconsistent with specified CP
258;; Issue WARNING message
259;; ELSE
260;; Display ERROR message
261;; ELSE
262;; IF a code page has been invoked THEN
263;; Copy invoked code page into table of code pages to build
264;; ELSE
265;; Call FIND_FIRST_CP := Define the system code page (1st in Keyb Def file)
266;; Copy SYSTEM_CP into table of code pages to build
267;;
268;; IF KEYB has not been previously installed THEN
269;; Call FIND_SYS_TYPE := Determine system type
270;; IF system type is PCjr THEN
271;; IF multilingual ROM is present THEN
272;; Set language code
273;; EXIT without staying resident
274;; Call INSTALL_INT_9 := Install INT 9 handler
275;; Call FIND_KEYB_TYPE := Determine the keyboard type
276;;
277;; Call TABLE_BUILD := Build the TEMP_SHARED_DATA_AREA
278;;
279;; IF return codes from TABLE_BUILD are INVALID THEN
280;; IF KEYB_INSTALLED := 0 THEN
281;; Call REMOVE_INT_9
282;; Display corresponding ERROR message
283;; EXIT without staying resident
284;; ELSE
285;; IF any of the designated CPs were invalid in the build THEN
286;; Issue WARNING message
287;; Close the Keyboard definition file
288;; IF KEYB had NOT already been installed THEN
289;; IF keyboard is a Ferrari_G AND system is not an XT THEN
290;; Call NUMLK_ON := Turn the NUM LOCK LED on
291;; IF extended INT 16 support required THEN
292;; Install extended INT 16 support
293;; Call INSTALL_INT_9_NET := Let network know about INT 9
294;; Call INSTALL_INT_2F_48 := Install the INT 2F and INT 48 drivers
295;; Activate language
296;; Get resident end and copy TEMP_SHARED_DATA_AREA into SHARED_DATA_AREA
297;; EXIT but stay resident
298;; ELSE
299;; IF this was not a query call AND exit code was valid THEN
300;; Activate language
301;; Get resident end and copy TEMP_SHARED_DATA_AREA into SHARED_DATA_AREA
302;; EXIT without staying resident
303;; END
304;;
305;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
306 ;;
307INVALID_PARMS EQU 1 ;; EXIT return codes
308BAD_KEYB_DEF_FILE EQU 2 ;;
309MEMORY_OVERFLOW EQU 3 ;;
310CONSOLE_ERROR EQU 4 ;;
311CP_NOT_DESIGNATED EQU 5 ;;
312KEYB_TABLE_NOT_LOAD EQU 6 ;;
313BAD_DOS_VER EQU 7 ;AN000;;; WGR ;AN000
314 ;;
315EXIT_RET_CODE DB 0 ;;
316;******************** CNS *********** ;AN000;;;
317ID_VALID EQU 0 ;AN000;;;
318ID_INVALID EQU 1 ;AN000;;;
319NO_ID EQU 2 ;AN000;;;
320LANGUAGE_VALID EQU 0 ;AN000;;;
321LANGUAGE_INVALID EQU 1 ;AN000;;; Return Codes
322NO_LANGUAGE EQU 2 ;AN000;;; from
323NO_IDLANG EQU 3 ;AN000;;;
324;******************** CNS *********** ;;
325CODE_PAGE_VALID EQU 0 ;; EDIT_LANGUAGE_CODE
326CODE_PAGE_INVALID EQU 1 ;;
327NO_CODE_PAGE EQU 2 ;;
328VALID_SYNTAX EQU 0 ;;
329INVALID_SYNTAX EQU 1 ;;;;;;;
330 ;;
331ACT_KEYB EQU 2 ;AC000;;; WGR ;AN000
332ACT_ID EQU 3 ;AC000;;; WGR ;AN000
333ACT_KEYB_CP EQU 4 ;AC000;;; WGR ;AN000
334ACT_CON_CP EQU 5 ;AC000;;; WGR ;AN000
335INV_L EQU 6 ;AC000;;; WGR message numbers... ;AN000
336INV_I EQU 7 ;AC000;;; WGR ;AN000
337INV_CP EQU 8 ;AC000;;; WGR ;AN000
338INV_S EQU 18 ;AC000;;; WGR ;AN000
339INV_FN EQU 9 ;AC000;;; WGR ;AN000
340INV_KEYB_Q EQU 10 ;AC000;;; WGR ;AN000
341INV_CON_Q EQU 11 ;AC000;;; WGR ;AN000
342NOT_DESIG EQU 12 ;AC000;;; WGR ;AN000
343NOT_SUPP EQU 13 ;AC000;;; WGR ;AN000
344NOT_VALID EQU 14 ;AC000;;; WGR ;AN000
345WARNING_1 EQU 15 ;AC000;;; WGR ;AN000
346INV_COMBO EQU 16 ;AC000;;; WGR ;AN000
347MEMORY_OVERF EQU 17 ;AC000;;; WGR ;AN000
348CR_LF DB 10,13,'$' ;; WGR ;AN000
349 ;;
350FOURTH_PARM DB 0 ;AN000;;; WGR switch was specified ;AN000
351ONE_PARMID DB 0 ;AN000;;; WGR id given as positional ;AN000
352FTH_PARMID DB 0 ;AN000;;; WGR id given as switch ;AN000
353ID_FOUND DB 0 ;AN000;;; WGR id was good (in k.d. file) ;AN000
354BAD_ID DB 0 ;AN000;;; WGR id was bad (from parse) ;AN000
355ALPHA DB 0 ;AN000;;; WGR first parm a language id ;AN000
356 ;;
357ID_DISPLAYED DB 0 ;AN000;;; WGR Indicating ID already displayed ;AN000
358 ;; WGR ;AN000
359SUBLIST_NUMBER LABEL BYTE ;AN000;;; WGR sublist for numbers ;AN000
360 DB 11 ;AN000;;; WGR size ;AN000
361 DB 0 ;AN000;;; WGR ;AN000
362PTR_TO_NUMBER DW ? ;AN000;;; WGR offset ptr ;AN000
363SEG_OF_NUMBER DW ? ;AN000;;; WGR segment ;AN000
364 DB 1 ;AN000;;; WGR ;AN000
365 DB 10100001B ;AN000;;; WGR flag ;AN000
366 DB 3 ;AN000;;; WGR max width ;AN000
367 DB 1 ;AN000;;; WGR min width ;AN000
368 DB " " ;AN000;;; WGR filler ;AN000
369 ;AN000;;; WGR
370 ;AN000;;; WGR
371SUBLIST_ASCIIZ LABEL BYTE ;AN000;;; WGR sublist for asciiz ;AN000
372 DB 11 ;AN000;;; WGR size ;AN000
373 DB 0 ;AN000;;; WGR ;AN000
374PTR_TO_ASCIIZ DW ? ;AN000;;; WGR offset ptr ;AN000
375SEG_OF_ASCIIZ DW ? ;AN000;;; WGR segment ;AN000
376 DB 1 ;AN000;;; WGR ;AN000
377 DB 00010000B ;AN000;;; WGR flag ;AN000
378 DB 2 ;AN000;;; WGR max width ;AN000
379 DB 2 ;AN000;;; WGR min width ;AN000
380 DB " " ;AN000;;; WGR filler ;AN000
381 ;AN000;;; WGR ;AN000
382NUMBER_HOLDER DW ? ;AN000;;; WGR used for message retriever ;AN000
383;***CNS
384SUBLIST_COMLIN LABEL BYTE ;an003;;; WGR sublist for asciiz ;AN000
385 DB 11 ;an003;;; WGR size ;AN000
386 DB 0 ;an003;;; WGR ;AN000
387PTR_TO_COMLIN DW ? ;an003;;; WGR offset ptr ;AN000
388SEG_OF_COMLIN DW ?
389 DB 0 ;an003;;; WGR ;AN000
390 DB LEFT_ALIGN+CHAR_FIELD_ASCIIZ ;AN000;;; WGR flag ;AN000
391
392 DB 0 ;an003;;; WGR max width ;AN000
393 DB 1 ;an003;;; WGR min width ;AN000
394 DB " " ;an003;;; WGR filler ;AN000
395
396
397STRING_HOLDER DB 64 DUP(0)
398;***CNS ;;
399 ;;
400FILE_BUFFER_SIZE EQU 50*6
401FILE_BUFFER DB FILE_BUFFER_SIZE DUP(0) ;AC000;;; Buffer for Keyboard Def file
402FB EQU FILE_BUFFER ;AC000;m for 32 language entries)
403DESIG_CP_BUFFER DW 28 DUP(?) ;; (Room for 25 code pages)
404DESIG_CP_BUF_LEN DW $-DESIG_CP_BUFFER ;; Length of code page buffer
405NUM_DESIG_CP DW 0 ;;
406CP_TAB_OFFSET DD ? ;;
407;****************** CNS ******************;AN000;
408TOTAL_SIZE DW 0 ;AN000;
409PASS_LANG DW 0 ;AN000;
410ID_TAB_OFFSET DD ? ;AN000;
411;****************** CNS ******************;;
412STATE_LOGIC_OFFSET DD -1 ;;
413KEYBSYS_FILE_HANDLE DW ? ;;;;;;;;;;;
414TB_RETURN_CODE DW 1 ;;
415DESIG_CP_OFFSET DW OFFSET DESIG_CP_BUFFER ;;
416SYS_CODE_PAGE DW 0 ;;
417DESIG_LIST DW 0 ;;
418QUERY_CALL DB 0 ;;
419 ;;
420KB_MASK EQU 02h ;;
421 ;;
422SIGNATURE DB 0FFh,'KEYB ' ;;
423SIGNATURE_LENGTH DW 8 ;;
424;****************** CNS ***************************;AN000;
425NUM_ID DW 0 ;AN000;
426ERR4ID DB 0 ;AN000;
427NUM_LANG DW 0 ;AN000;
428NUM_CP DW 0 ;AN000;
429ID_PTR_SIZE DW SIZE KEYBSYS_ID_PTRS ;AN000;
430;****************** CNS *****************************
431LANG_PTR_SIZE DW SIZE KEYBSYS_LANG_PTRS ;;
432CP_PTR_SIZE DW SIZE KEYBSYS_CP_PTRS ;;
433KEYBCMD_LANG_ENTRY_PTR DD ? ;;
434 ;;
435KEYB_INSTALLED DW 0 ;;
436CON_INSTALLED DW 0 ;;
437SHARED_AREA_PTR DD 0 ;;
438GOOD_MATCH DW 0 ;;
439;****************** CNS ***************************;;
440LANGUAGE_ASCII DB '??',0 ;; WGR ;AC000
441 ;;
442CMD_PARM_LIST PARM_LIST <> ;;
443 ;;
444JR_LANGUAGE_CODES DW 'FR','GR','IT','SP','UK' ;;
445 ;;
446JR_NUM_CODES EQU 5 ;;
447 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
448;---------- TABLES FOR EXTENDED KEYBOARD SUPPORT CTRL CASE --------- RWV 11-06-85 ;;
449 ;;
450RPL_K8 LABEL BYTE ;-------- CHARACTERS --------- ;;
451 DB 27,-1,00,-1,-1,-1 ; Esc, 1, 2, 3, 4, 5 ;;
452 DB 30,-1,-1,-1,-1,31 ; 6, 7, 8, 9, 0, - ;;
453 DB -1,127,148,17,23,5 ; =, Bksp, Tab, Q, W, E ;;
454 DB 18,20,25,21,09,15 ; R, T, Y, U, I, O ;;
455 DB 16,27,29,10,-1,01 ; P, [, ], Enter, Ctrl, A ;;
456 DB 19,04,06,07,08,10 ; S, D, F, G, H, J ;;
457 DB 11,12,-1,-1,-1,-1 ; K, L, ;, ', `, LShift ;;
458 DB 28,26,24,03,22,02 ; \, Z, X, C, V, B ;;
459 DB 14,13,-1,-1,-1,-1 ; N, M, ,, ., /, RShift ;;
460 DB 150,-1,' ',-1 ; *, Alt, Space, CL ;;
461 ;--------- FUNCTIONS --------- ;;
462 DB 94,95,96,97,98,99 ; F1 - F6 ;;
463 DB 100,101,102,103,-1,-1 ; F7 - F10, NL, SL ;;
464 DB 119,141,132,142,115,143 ; Home, Up, PgUp, -, Left, Pad5 ;;
465 DB 116,144,117,145,118,146 ; Right, +, End, Down, PgDn, Ins ;;
466 DB 147,-1,-1,-1,137,138 ; Del, SysReq, Undef, WT, F11, F12 ;;
467L_CTRL_TAB EQU $-RPL_K8 ;;
468 ;;
469;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
470;; Program Code
471;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
472 ;;
473KEYB_COMMAND PROC NEAR ;;
474 ;;
475 CALL SYSLOADMSG ;AN000;load messages ;AN000
476 JNC VERSION_OK ;AN000;if no carry then version ok ;AN000
477 CALL SYSDISPMSG ;AN000;error..display version error ;AN000
478 MOV AL,BAD_DOS_VER ;AN000;bad DOS version ;AN000
479 MOV EXIT_RET_CODE,AL ;AN000; ;AN000
480 JMP KEYB_EXIT_NOT_RESIDENT ;AN000;exit..non resident ;AN000
481VERSION_OK: ;; WGR ;AN000
482 MOV SEG_OF_NUMBER,CS ;AN000;initialize.. ;AN000
483 MOV SEG_OF_ASCIIZ,CS ;AN000; ..sublists ;AN000
484 MOV BP,OFFSET CMD_PARM_LIST ;AN000;pointer for parm list
485 MOV WORD PTR SHARED_AREA_PTR,ES ;AN000; ES segment
486 ;;
487KEYB_INSTALL_CHECK: ;;
488 MOV AX,0AD80H ;; KEYB install check
489 INT 2FH ;;
490 CMP AL,-1 ;; If flag is not 0FFh THEN
491 JE INSTALLED_KEYB ;;
492 MOV WORD PTR SHARED_AREA_PTR+2,OFFSET TSD ;;
493 JMP CON_INSTALL_CHECK ;;
494 ;;;;;;;;;;
495INSTALLED_KEYB: ;;
496 MOV KEYB_INSTALLED,1 ;; Set KEYB_INSTALLED flag = YES
497 MOV WORD PTR SHARED_AREA_PTR,ES ;; Save segment of SHARED_DATA_AREA
498 MOV WORD PTR SHARED_AREA_PTR+2,DI ;; Save offset of SHARED_DATA_AREA
499 MOV AX,ES:[DI].KEYB_TYPE ;;
500 MOV HW_TYPE,AX ;;
501 MOV ES:[DI].TABLE_OK,0 ;; Do not allow processing
502 PUSH CS ;; while building table
503 POP ES ;; Reset ES until required
504 ;;
505CON_INSTALL_CHECK: ;;;;;;;
506 MOV AX,0AD00H ;; CONSOLE install check
507 INT 2FH ;;
508 CMP AL,-1 ;; If flag is not 0FFh THEN
509 JE INSTALLED_CON ;;
510 JMP CALL_FIRST_STAGE ;;
511 ;;
512INSTALLED_CON: ;;
513 MOV CON_INSTALLED,1 ;; Set CON_INSTALLED flag = YES
514 ;;
515CALL_FIRST_STAGE: ;;
516 PUSH CS ;;
517 POP ES ;;
518 CALL PARSE_PARAMETERS ;; Validate parameter list
519 ;;
520BEGIN_PARM_CHECK: ;; CHECK ALL RETURN CODES
521 MOV DL,[BP].RET_CODE_3 ;;
522 CMP DL,1 ;; Check for invalid syntax
523 JNE VALID1 ;;
524 JMP ERROR3 ;;
525 ;;
526VALID1: ;;
527 MOV DL,[BP].RET_CODE_1 ;; Check for invalid language parm
528 CMP DL,1 ;;
529 JNE VALID2 ;;
530 JMP ERROR1 ;;
531 ;;
532VALID2: ;;
533 MOV DL,[BP].RET_CODE_2 ;; Check for invalid code page parm
534 CMP DL,1 ;;
535 JNE VALID3 ;;
536 JMP ERROR2 ;;
537 ;;
538VALID3: ;;
539 MOV DL,[BP].RET_CODE_1 ;; Check for query command
540 CMP DL,2 ;;
541 JE QUERY ;;
542;******************************* CNS **;;
543 MOV DL,[BP].RET_CODE_1 ;AN000;k for query command
544 CMP DL,3 ;AN000;;; Get a status of the codepage
545 JE QUERY ;AN000;;; language, and possible ID code
546;******************************* CNS **;;
547 JMP NOT_QUERY ;;
548 ;; IF QUERY is requested THEN
549QUERY: ;;
550 MOV QUERY_CALL,DL ;;
551 MOV AX,KEYB_INSTALLED ;; If KEYB is installed THEN
552 CMP AX,0 ;;
553 JE QUERY_CONTINUE1 ;;;;;;;;;;;;;;;;
554 ;;
555 MOV DI,WORD PTR SHARED_AREA_PTR+2 ;; Get offset of
556 MOV ES,WORD PTR SHARED_AREA_PTR ;; shared area
557 MOV BX,WORD PTR ES:[DI].ACTIVE_LANGUAGE ;; Get active language
558 CMP BX,0 ;; WGR if no language.. ;AN000
559 JE I_MESSAGE ;; WGR then id was specified ;AN000
560 ;;
561 ;;;;;;;;;;;;
562L_MESSAGE: ;;
563 MOV WORD PTR LANGUAGE_ASCII,BX ;AC000;;; Display Language
564 LEA SI,LANGUAGE_ASCII ;AN000;;; WGR sublist points to... ;AN000
565 MOV PTR_TO_ASCIIZ,SI ;AN000;;; WGR language code asciiz string ;AN000
566 MOV AX,ACT_KEYB ;AC000;;; WGR display 'Current keyboard code' ;AN000
567 MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000
568 MOV CX,1 ;AN000;;; WGR one replacement ;AN000
569 MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000
570 XOR DL,DL ;AN000;;; WGR no input ;AN000
571 LEA SI,SUBLIST_ASCIIZ ;AN000;;; WGR ptr to sublist ;AN000
572 CALL SYSDISPMSG ;AN000;;; WGR ;AN000
573 JMP KEYB_L_FINISHED ;;
574 ;;;;;;;
575I_MESSAGE: ;;
576 MOV BX,WORD PTR ES:[DI].INVOKED_KBD_ID;AN000;;; WGR get id code. ;AN000
577 MOV NUMBER_HOLDER,BX ;AN000;;; WGR transfer number to temp loc. ;AN000
578 LEA SI,NUMBER_HOLDER ;AN000;;; WGR sublist points to... ;AN000
579 MOV PTR_TO_NUMBER,SI ;AN000;;; WGR code page word ;AN000
580 MOV AX,ACT_ID ;AN000;;; WGR display 'Current ID: ' ;AN000
581 MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000
582 MOV CX,1 ;AN000;;; WGR one replacement ;AN000
583 MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000
584 XOR DL,DL ;AN000;;; WGR no input ;AN000
585 LEA SI,SUBLIST_NUMBER ;AN000;;; WGR ptr to sublist ;AN000
586 CALL SYSDISPMSG ;AN000;;; WGR ;AN000
587 MOV ID_DISPLAYED,1 ;AN000;;; WGR ID was displayed. ;AN000
588 JMP KEYB_L_FINISHED ;AN000;;; WGR ;AN000
589 ;;;;;;;;;;;
590QUERY_CONTINUE1: ;;
591 MOV AX,INV_KEYB_Q ;AC000;;; WGR ;AN000
592 MOV BX,STDOUT ;AN000;;; WGR Else ;AN000
593 XOR CX,CX ;AC000;;; WGR Display message that KEYB ;AN000
594 MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR has not been installed ;AN000
595 XOR DL,DL ;AN000;;; WGR ;AN000
596 CALL SYSDISPMSG ;AN000;;; WGR ;AN000
597 JMP KEYB_CP_FINISHED ;AC000;;;
598 ;;;;;;;;;;;
599KEYB_L_FINISHED: ;;
600 MOV BX,ES:[DI].INVOKED_CP_TABLE ;; Get invoked code page
601 ;;
602 MOV NUMBER_HOLDER,BX ;AN000;;; WGR transfer number to temp loc. ;AN000
603 LEA SI,NUMBER_HOLDER ;AN000;;; WGR sublist points to... ;AN000
604 MOV PTR_TO_NUMBER,SI ;AN000;;; WGR code page word ;AN000
605 MOV AX,ACT_KEYB_CP ;AC000;;; WGR display ' code page: ' ;AN000
606 MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000
607 MOV CX,1 ;AN000;;; WGR one replacement ;AN000
608 MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000
609 XOR DL,DL ;AN000;;; WGR no input ;AN000
610 LEA SI,SUBLIST_NUMBER ;AN000;;; WGR ptr to sublist ;AN000
611 CALL SYSDISPMSG ;AN000;;; WGR ;AN000
612 CMP ID_DISPLAYED,1 ;AN000;;; WGR was id displayed? ;AN000
613 JE KEYB_CP_FINISHED ;AN000;;; WGR yes..continue. ;AN000
614 ;;
615 MOV BX,WORD PTR ES:[DI].INVOKED_KBD_ID;AN000;;; WGR get id code. ;AN000
616 CMP BX,0 ;AN000;;; WGR no id given.. ;AN000
617 JE KEYB_CP_FINISHED ;AN000;;; WGR ;AN000
618 ;;
619 MOV NUMBER_HOLDER,BX ;AN000;;; WGR transfer number to temp loc. ;AN000
620 LEA SI,NUMBER_HOLDER ;AN000;;; WGR sublist points to... ;AN000
621 MOV PTR_TO_NUMBER,SI ;AN000;;; WGR code page word ;AN000
622 MOV AX,ACT_ID ;AC000;;; WGR display 'Current ID: ' ;AN000
623 MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000
624 MOV CX,1 ;AN000;;; WGR one replacement ;AN000
625 MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000
626 XOR DL,DL ;AN000;;; WGR no input ;AN000
627 LEA SI,SUBLIST_NUMBER ;AN000;;; WGR ptr to sublist ;AN000
628 CALL SYSDISPMSG ;AN000;;; WGR ;AN000
629 MOV AH,09H ;AC000;;; WGR need a CR_LF here. ;AN000
630 MOV DX,OFFSET CR_LF ;AC000;;; WGR ;AN000
631 INT 21H ;; WGR ;AN000
632 ;;;;;;;;;;;
633KEYB_CP_FINISHED: ;;
634 MOV AX,CON_INSTALLED ;; If CON has been installed THEN
635 CMP AX,0 ;;
636 JNE GET_ACTIVE_CP ;;
637 JMP CON_NOT_INSTALLED ;;
638 ;;
639GET_ACTIVE_CP: ;;
640 MOV AX,0AD02H ;; Get active code page
641 INT 2FH ;; information from the console
642 JNC DISPLAY_ACTIVE_CP ;;
643 JMP ERROR5 ;;
644 ;;
645DISPLAY_ACTIVE_CP: ;;
646 MOV NUMBER_HOLDER,BX ;AC000;;; WGR transfer number to temp loc. ;AN000
647 LEA SI,NUMBER_HOLDER ;AC000;;; WGR sublist points to... ;AN000
648 MOV PTR_TO_NUMBER,SI ;AC000;;; WGR code page word ;AN000
649 MOV AX,ACT_CON_CP ;AN000;;; WGR display 'Current CON code page: ' ;AN000
650 MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000
651 MOV CX,1 ;AN000;;; WGR one replacement ;AN000
652 MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000
653 XOR DL,DL ;AN000;;; WGR no input ;AN000
654 LEA SI,SUBLIST_NUMBER ;AN000;;; WGR ptr to sublist ;AN000
655 CALL SYSDISPMSG ;AN000;;; WGR ;AN000
656 ;;
657 JMP KEYB_EXIT_NOT_RESIDENT ;; Exit from Proc
658 ;;
659CON_NOT_INSTALLED: ;; ELSE
660 MOV AX,INV_CON_Q ;AC000;WGR ;AN000
661 MOV BX,STDOUT ;AN000;;; WGR Else ;AN000
662 XOR CX,CX ;AN000;;; WGR Display message that CON does ;AN000
663 MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR not have active code page ;AN000
664 XOR DL,DL ;AN000;;; WGR ;AN000
665 CALL SYSDISPMSG ;AN000;;; WGR ;AN000
666 JMP KEYB_EXIT_NOT_RESIDENT ;; Exit from Proc
667 ;;
668NOT_QUERY: ;; IF not a query function requested
669 CALL BUILD_PATH ;; Determine location of KEYBOARD.SYS
670 ;; WGR ...and open file. ;AC000
671 ;;
672 JNC VALID4 ;; If no error in opening file then
673 JMP ERROR4 ;;
674 ;;
675VALID4: ;;
676 MOV KEYBSYS_FILE_HANDLE,AX ;; Save handle
677 MOV BP,OFFSET CMD_PARM_LIST ;; Set base pointer for structures
678 MOV BX,KEYBSYS_FILE_HANDLE ;; Retrieve the file handle
679 MOV DX,OFFSET FILE_BUFFER ;; Set address of buffer
680;************************* CNS ********;;
681 cmp [BP].RET_CODE_4,ID_VALID ;AN000; ;; CNS is there an ID available
682 je ID_TYPED ;AN000; ;; if so go find out if it is
683 jmp GET_LANG ;AN000; ;; a 1st or 4th parm, if not must
684 ;AN000; ;; must be a language
685ID_TYPED: ;AN000;
686
687 call SCAN_ID ;AN000; ;; scan the table for the ID
688 cmp ID_FOUND,1 ;AN000; ;; if a legal ID check and see if
689 jne LOST_ID ;AN000; ;; it is a first or fourth parm
690 cmp FTH_PARMID,1 ;AN000; ;; if it is a fourth parm go
691 je GET_ID ;AN000; ;; check for language compatibility
692 jmp Language_found ;AN000; ;; otherwise it must be a first
693 ;; parm id value
694
695LOST_ID: ;AN000; ;; otherwise must be a bogus match
696 ;; between language and ID codes
697 ;; or the ID code does not exist
698 jmp ERR1ID ;AN000; ;; in the table
699;************************* CNS ***********;;
700GET_LANG: ;; Must be a language/or a 1st parm ID
701 ;;;;;
702 ;;
703 XOR DI,DI ;; Set number
704 LEA CX,[DI].KH_NUM_LANG+2 ;; bytes to read header
705 ;;
706 MOV AH,3FH ;; Read header of the Keyb Def file
707 INT 21H ;;
708 JNC VALID5 ;; If no error in opening file then
709 JMP ERROR4 ;;
710 ;;;;
711VALID5: ;;
712 CLD ;; WGR all moves/scans forward ;AN000
713 MOV CX,SIGNATURE_LENGTH ;;
714 MOV DI,OFFSET SIGNATURE ;; Verify matching
715 MOV SI,OFFSET FB.KH_SIGNATURE ;; signatures
716 REPE CMPSB ;;
717 JE LANGUAGE_SPECIFIED ;;
718 JMP ERROR4 ;;;;
719 ;; READ the language table
720LANGUAGE_SPECIFIED: ;;
721 MOV AX,FB.KH_NUM_LANG ;;
722 MOV NUM_LANG,AX ;; Save the number of languages
723 MUL LANG_PTR_SIZE ;; Determine # of bytes to read
724 MOV DX,OFFSET FILE_BUFFER ;; Establish beginning of buffer
725 MOV CX,AX ;;
726 CMP CX,FILE_BUFFER_SIZE ;; Make sure buffer is not to small
727 JBE READ_LANG_TAB ;;
728 JMP ERROR4 ;;
729 ;;
730READ_LANG_TAB: ;;
731 MOV AH,3FH ;; Read language table from
732 INT 21H ;; Keyb Def file
733 JNC READ_VALID ;; If no error in opening file then
734 JMP ERROR4 ;; Else display ERROR message
735 ;;
736READ_VALID: ;;
737 MOV CX,NUM_LANG ;; Number of valid codes
738 MOV DI,OFFSET FILE_BUFFER ;; Point to correct word in table
739 ;;
740SCAN_LANG_TABLE: ;; FOR language parm
741 MOV AX,[BP].LANGUAGe_PARM ;; Get parameter
742 CMP [DI].KP_LANG_CODE,AX ;; Valid Code ??
743 JE LANGUAGE_FOUND ;; If not found AND more entries THEN
744 ADD DI,LANG_PTR_SIZE ;; Check next entry
745 DEC CX ;; Decrement count of entries
746 JNE SCAN_LANG_TABLE ;; Else
747 JMP ERROR1 ;; Display error message
748 ;;;;;;;;;;;;;;
749;**************************** CNS ****;;;;
750GET_ID: ;AN000;;; CNS - Must be an ID value
751 mov cx,1 ;AN000;;; initialize ctr value for # of ids
752 ;;
753SEARCH_ID: ;AN000;;; minimum per country
754;.WHILE <cx ne 0> ;AN000;;; There is atleast 1 ID for each country
755 cmp cx,0 ;AN000;;; Check for any more IDs left to check
756 jne FINDID ;AN000;;; Country has more than one ID check
757 jmp END_IDCHK ;AN000;;; Country & ID has been found or value
758 ;; is zero
759FINDID: ;AN000;
760
761 push di ;AN000;;; save the current language entry ptr
762 push cx ;AN000;;; save the minimum # of ids before
763 ;; reading the table data from the disk
764;**************************** CNS *****************;;
765LANGUAGE_FOUND: ;;
766 MOV CX,WORD PTR [DI].KP_ENTRY_PTR+2 ;; Get offset of lang entry
767 MOV DX,WORD PTR [DI].KP_ENTRY_PTR ;; in the Keyb Def file
768 MOV WORD PTR KEYBCMD_LANG_ENTRY_PTR,DX ;; Save
769 MOV WORD PTR KEYBCMD_LANG_ENTRY_PTR+2,CX ;; offset
770 MOV AH,42H ;; Move file pointer to
771 MOV AL,0 ;;;;;;; location of language
772 INT 21H ;; entry
773 JNC LSEEK_VALID ;;
774 JMP ERROR4 ;;
775 ;;
776LSEEK_VALID: ;;
777 MOV DI,AX ;;
778 MOV CX,SIZE KEYBSYS_LANG_ENTRY-1 ;; Set number
779 ;; bytes to read header
780 MOV DX,OFFSET FILE_BUFFER ;;;;;;;;;
781 MOV AH,3FH ;; Read language entry in
782 INT 21H ;; Keyb Def file
783 JNC VALID6a ;; If no error in file then
784 JMP ERROR4 ;;;;;;;;;;
785;**************************** CNS **********************************************
786
787
788valid6a:
789 cmp FOURTH_PARM,1 ;AN000;;; Is the ID a 4th Parm
790 jne VALID6 ;AN000;;; if not get out of routine, otherwise
791 pop cx ;AN000;;;restore # of ids for the country
792 ; .IF <cx eq 1> ;AN000;;;Check to see if this is the first
793 ;AN000;;;time checking the primary ID
794 cmp cx,1 ;AN000;;;if there is just one ID check to make
795 jne CHK4PARM ;AN000;;;sure both flags are not set
796 ;AN000;;; this should not be necessary w/ new parser
797 cmp FTH_PARMID,1 ;AN000;;; is the ID flag for switch set
798 jne CHK1N4 ;AN000;;; is the flag set only for the 4th
799 cmp FOURTH_PARM,1 ;AN000;;; if set only for the switch proceed
800 jne CHK1N4 ;AN000;;; if not must be a positional
801 mov cl,fb.kl_num_id ;AN000;;; get the number of IDs available from the table
802 mov FTH_PARMID,0 ;AN000;;; turn switch flag off so the table
803 ;AN000;;; counter will not be reset
804
805 ;;ids available for the
806CHK1N4: ;AN000; ;;country
807 cmp ONE_PARMID,1 ;AN000; ;; this was to be done if
808 jne CHK4PARM ;AN000; ;; two the positional
809 cmp FOURTH_PARM,0 ;AN000; ;; and switch was specified
810 jne CHK4PARM ;AN000; ;; this should never happen
811 pop di ;AN000; ;; if the parser is intact
812 jmp error3 ;AN000; ;; report error & exit
813
814CHK4PARM: ;AN000; ;; check on the first ID
815 ; .IF <FOURTH_PARM EQ 1> ;AN000; ;;switch specified
816 ; call IDLANG_CHK ;AN000; ;;check the lang-id combo
817 ; .ELSE ;AN000;
818 ; xor cx,cx ;AN000; ;;clear to exit loop
819 ; .ENDIF ;AN000;
820 ;
821 cmp FOURTH_PARM,1 ;AN000; ;; ID was a switch
822 jne ABORT_LOOP ;AN000; ;; otherwise get out of routine
823 call IDLANG_CHK ;AN000; ;; check the ID
824 jmp ADVANCE_PTR ;AN000; ;; advance to the next position
825
826ABORT_LOOP: ;AN000;
827 xor cx,cx ;AN000; ;; end loop
828
829ADVANCE_PTR: ;AN000;
830 pop di ;AN000; ;;restore entry value
831
832 dec cx ;AN000; ;;# of ids left to check
833 cmp cx,0 ;AN000; ;; if at 0 don't advance to next
834 je NO_ADVANCE ;AN000; ;; table position
835 cmp GOOD_MATCH,1 ;AN000; ;; check to see if ID matched language
836 je NO_ADVANCE ;AN000; ;; if equal do not advance
837 add di,LANG_PTR_SIZE ;AN000; ;;step to the next entry
838 ;;in the table
839
840NO_ADVANCE: ;AN000;
841
842 jmp SEARCH_ID ;AN000; ;;for the country
843
844;.ENDWHILE ;;end of ID check for country
845
846END_IDCHK: ;AN000;
847
848 cmp FOURTH_PARM,1 ;AN000; ;; see if id was found
849 jne VALID6 ;AN000;
850 cmp GOOD_MATCH,0 ;AN000; ;; none found
851 jne VALID6 ;AN000; ;; report error
852 mov [bp].ret_code_4,1 ;AN000; ;; incompatible lang code
853 mov al,[bp].ret_code_4 ;AN000; ;; id combo
854 jmp err2id ;AN000;
855
856 ;; otherwise found it
857 ;; continue to build tbl
858;**************************** CNS **********************************************
859 ;;
860VALID6: ;;
861 MOV AX,WORD PTR FB.KL_LOGIC_PTR ;; Save the offset of the state
862 MOV WORD PTR STATE_LOGIC_OFFSET,AX ;; logic section
863 MOV AX,WORD PTR FB.KL_LOGIC_PTR+2 ;; Save the offset of the state
864 MOV WORD PTR STATE_LOGIC_OFFSET+2,AX ;; logic section
865 ;;
866 MOV DL,[BP].RET_CODE_2 ;;;;;;;;;; IF code page was specified
867 CMP DL,2 ;;
868 JNE CODE_PAGE_SPECIFIED ;;
869 JMP DONE ;;
870 ;;
871CODE_PAGE_SPECIFIED: ;; Then
872;************************** CNS ***********************************************
873 xor ah,ah ;AN000;
874 MOV Al,FB.KL_NUM_CP ;AN000;;;
875;************************** CNS ***********************************************
876 MOV NUM_CP,AX ;; Save the number of code pages
877 MUL CP_PTR_SIZE ;; Determine # of bytes to read
878 MOV DX,OFFSET FILE_BUFFER ;; Establish beginning of buffer
879 MOV CX,AX ;;
880 CMP CX,FILE_BUFFER_SIZE ;; Make sure buffer is not to small
881 JBE VALID7 ;;
882 JMP ERROR4 ;;
883 ;;
884VALID7: ;;
885 MOV AH,3FH ;; Read code page table from
886 INT 21H ;; Keyb Def file
887 JNC VALID8 ;; If no error in opening file then
888 JMP ERROR4 ;;
889 ;;
890VALID8: ;;
891 MOV CX,NUM_CP ;; Number of valid codes
892 MOV DI,OFFSET FILE_BUFFER ;; Point to correct word in table
893 ;;
894SCAN_CP_TABLE: ;; FOR code page parm
895 MOV AX,[BP].CODE_PAGE_PARM ;; Get parameter
896 CMP [DI].KC_CODE_PAGE,AX ;; Valid Code ??
897 JE CODE_PAGE_FOUND ;; If not found AND more entries THEN
898 ADD DI,CP_PTR_SIZE ;; Check next entry
899 DEC CX ;; Decrement count of entries
900 JNE SCAN_CP_TABLE ;; Else
901 JMP ERROR2 ;; Display error message
902 ;;;;;;;;;
903CODE_PAGE_FOUND: ;;
904 MOV AX,WORD PTR [DI].KC_ENTRY_PTR ;;
905 MOV WORD PTR CP_TAB_OFFSET,AX ;;
906 MOV AX,WORD PTR [DI].KC_ENTRY_PTR+2 ;;
907 MOV WORD PTR CP_TAB_OFFSET+2,AX ;;
908 ;;;;;;
909DONE: ;;
910 MOV SI,OFFSET DESIG_CP_BUFFER ;;
911 ;;
912 MOV AX,CON_INSTALLED ;;;;; If CON is NOT installed THEN
913 CMP AX,0 ;;
914 JE SYSTEM_CP ;;
915 JMP GET_DESIG_CPS ;;
916 ;;
917SYSTEM_CP: ;;
918 MOV CX,1 ;;
919 MOV NUM_DESIG_CP,CX ;; Set number of CPs = 1
920 MOV [SI].NUM_DESIGNATES,CX ;;
921 ;;
922 MOV DL,[BP].RET_CODE_2 ;; Check if code page parm
923 CMP DL,0 ;; was specified
924 JNE SET_TO_SYSTEM_CP ;;
925 MOV DX,[BP].CODE_PAGE_PARM ;;
926 MOV [SI].DESIG_CP_ENTRY,DX ;; Load specified code page into
927 JMP READY_TO_BUILD_TABLE ;; designated code page list
928 ;;
929SET_TO_SYSTEM_CP: ;;
930 CALL FIND_FIRST_CP ;; Call routine that sets the first
931 CMP AX,0 ;; table found in the Keyb Def file
932 JE SET_TO_SYSTEM_CP2 ;; to the system code page
933 JMP ERROR4 ;;
934 ;;
935SET_TO_SYSTEM_CP2: ;;
936 MOV SYS_CODE_PAGE,BX ;;
937 MOV [BP].CODE_PAGE_PARM,BX ;;
938 MOV [SI].DESIG_CP_ENTRY,BX ;; Move sys CP into desig list
939 JMP READY_TO_BUILD_TABLE ;;
940 ;;
941GET_DESIG_CPS: ;; ELSE
942 MOV AX,0AD03H ;;
943 PUSH CS ;; Make sure ES is set
944 POP ES ;;
945 LEA DI,DESIG_CP_BUFFER ;;
946 MOV CX,DESIG_CP_BUF_LEN ;;
947 INT 2FH ;; Get all designated code pages
948 JNC SET_DESIG_VARIABLES ;; from console
949 JMP ERROR5 ;;
950 ;;
951SET_DESIG_VARIABLES: ;;
952 MOV CX,[SI].NUM_DESIGNATES ;;
953 ADD CX,[SI].NUM_HW_CPS ;;
954 MOV NUM_DESIG_CP,CX ;; Set number of Designated CPs
955 ;;
956BUFFER_CREATED: ;;
957 MOV AX,0AD02H ;;
958 INT 2FH ;; Get invoked code page
959 ;;
960SET_TO_CP_INVOKED: ;;
961 MOV DL,[BP].RET_CODE_2 ;; IF code page parm was specified
962 CMP DL,0 ;;
963 JNE SET_TO_INVOKED_CP ;;
964 MOV CX,NUM_DESIG_CP ;;
965 MOV DESIG_LIST,SI ;;
966 JMP TEST_IF_DESIGNATED ;;
967 ;;
968SET_TO_INVOKED_CP: ;;
969 CMP AX,1 ;; IF a code page has been invoked
970 JNE SET_TO_INVOKED_CP3 ;;
971 CALL FIND_FIRST_CP ;; Call the routine that sets the
972 CMP AX,0 ;; first code page in the Keyb Def
973 JE SET_TO_INVOKED_CP2 ;; file to the system code page
974 JMP ERROR4 ;;
975 ;;
976SET_TO_INVOKED_CP2: ;;
977 MOV [BP].CODE_PAGE_PARM,BX ;;
978 MOV SYS_CODE_PAGE,BX ;;
979 ;;
980 JMP TEST_IF_DESIGNATED ;;
981 ;;
982SET_TO_INVOKED_CP3: ;;
983 MOV [BP].CODE_PAGE_PARM,BX ;;
984 ;;
985TEST_IF_DESIGNATED: ;;
986 MOV DX,[BP].CODE_PAGE_PARM ;;
987 CMP [SI].DESIG_CP_ENTRY,DX ;; Is Code page specified in the list
988 JE CODE_PAGE_DESIGNATED ;; of designated code pages ?
989 ;;
990NEXT_DESIG_CP: ;;
991 ADD SI,2 ;; Check next code page
992 DEC CX ;; If all designated code pages have
993 JNZ TEST_IF_DESIGNATED ;; been checked Then ERROR
994 JMP ERROR6 ;;
995 ;;
996CODE_PAGE_DESIGNATED: ;;
997 CMP SYS_CODE_PAGE,0 ;;
998 JNE READY_TO_BUILD_TABLE ;;
999 CMP AX,1 ;; IF a code page has been invoked
1000 JE READY_TO_BUILD_TABLE ;;
1001 CMP [BP].CODE_PAGE_PARM,BX ;; IF Invoked CP <> Specified CP
1002 JE READY_TO_BUILD_TABLE ;; Issue warning
1003;;***************************************************************************
1004 PUSH BX ;AN000;;; WGR ;AN000
1005 PUSH CX ;AN000;;; WGR ;AN000
1006 MOV AX,WARNING_1 ;AN000;;; WGR ;AN000
1007 MOV BX,STDOUT ;AN000;;; WGR ;AN000
1008 XOR CX,CX ;AN000;;; WGR ;AN000
1009 MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR ;AN000
1010 XOR DL,DL ;AN000;;; WGR ;AN000
1011 CALL SYSDISPMSG ;AN000;;; WGR ;AN000
1012 POP CX ;AN000;;; WGR ;AN000
1013 POP BX ;AN000;;; WGR ;AN000
1014;;***************************************************************************
1015 ;;
1016READY_TO_BUILD_TABLE: ;;
1017 ;;
1018 MOV AX,KEYB_INSTALLED ;;
1019 CMP AX,0 ;; Else if KEYB has not been installed
1020 JNE BUILD_THE_TABLE ;;
1021 ;;
1022 CALL FIND_SYS_TYPE ;; Determine system type for INT 9 use
1023 ;;
1024 TEST SD.SYSTEM_FLAG,PC_JR ;; IS THIS ROM MULTILINGUAL? (JR.) AAD
1025 JZ CONTINUE_INSTALL ; NO, LOAD THE NEW INT9 CODE
1026 ; SEE IF MULTILINGUAL OPTION IS PRESENT
1027 MOV AH,5 ; ADDRESS THE MULTILINGUAL SUPPORT
1028 MOV AL,80H ; REQUEST CURRENT LANGUAGE BE IDENTIFIED
1029 INT 16H ; CALL KEYBOARD TO IDENTIFY ITSELF
1030
1031;IF THE MULTILINGUAL OPTION IS NOT PRESENT, THE ROM DOES NOT RECOGNIZE THE
1032;OPTION 5 AND JUST RETURNS THE REGS INTACT.
1033;RESPONSE IN AL INDICATES THE CURRENT LANGUAGE:
1034
1035 CMP AL,80H ; DID I GET BACK JUST WHAT I SENT?
1036 JE CONTINUE_INSTALL ; SINCE RESPONSE WAS THE SAME MUST NOT BE
1037 ; MULTILINGUAL, RELOCATE RESIDENT KBD ROUTINE
1038
1039;I AM GOING TO IGNORE WHAT LANGUAGE IS CURRENTLY SET. I WILL SET THE
1040;MULTILINGUAL KEYBOARD TO BECOME MY LANGUAGE.
1041
1042 MOV AX,[BP].LANGUAGE_PARM ;;
1043 XCHG AH,AL ;;
1044 MOV DI,OFFSET JR_LANGUAGE_CODES ;;
1045 MOV CX,JR_NUM_CODES ;;
1046 PUSH CS ;;
1047 POP ES ;;
1048 REPNE SCASW ;;
1049 JNE CONTINUE_INSTALL ;;
1050 ;;
1051 MOV AH,5 ; ADDRESS THE MULTILINGUAL KEYBOARD
1052 MOV AL,JR_NUM_CODES ; SELECT MY LANGUAGE
1053 SUB AL,CL ;;
1054 INT 16H ; SET THE KEYBOARD ACCORDINGLY
1055 INT 20H ; JOB DONE, ROM IS MULTILINGUAL
1056 ; NO NEED TO STAY RESIDENT
1057 ;;
1058;------ LOAD IN SPECIAL INT 9 HANDLER AND SPECIAL TABLES (IF NEEDED)
1059
1060CONTINUE_INSTALL: ;;
1061 CALL INSTALL_INT_9 ;; Install INT 9
1062 ;;
1063 CALL FIND_KEYB_TYPE ;; Determine keyboard type table use
1064 ;;
1065BUILD_THE_TABLE: ;;
1066 CALL TABLE_BUILD ;; Build the TEMP_SHARED_DATA_AREA
1067 ;;
1068CHECK_ERRORS: ;;
1069 XOR CX,CX ;; Take appropriate action considering
1070 MOV CX,TB_RETURN_CODE ;; return codes from TABLE_BUILD
1071 CMP CX,0 ;;
1072 JE CHECK_FOR_INV_CP ;; If return code is not 0
1073 ;;
1074 MOV AX,KEYB_INSTALLED ;;
1075 CMP AX,0 ;; If KEYB has not been installed
1076 JNE CHECK_ERROR_CONTINUE ;;
1077 CALL REMOVE_INT_9 ;; remove installed vector
1078 ;;
1079CHECK_ERROR_CONTINUE: ;;
1080 CMP CX,1 ;; If return code = 1
1081 JNE CHECK_ERROR2 ;;
1082 JMP ERROR1 ;; display error message
1083 ;;
1084CHECK_ERROR2: ;;
1085 CMP CX,2 ;; If return code = 2
1086 JNE CHECK_ERROR3 ;;
1087 JMP ERROR2 ;;
1088 ;;
1089CHECK_ERROR3: ;;
1090 CMP CX,3 ;; If return code = 3
1091 JNE CHECK_ERROR4 ;;
1092 JMP ERROR3 ;; display error message
1093 ;;
1094CHECK_ERROR4: ;;
1095 CMP CX,4 ;; If return code = 4
1096 JNE CHECK_ERROR5A ;;
1097 JMP ERROR4 ;; display error message
1098 ;;
1099CHECK_ERROR5A: ;;
1100 CMP CX,5 ;; If return code = 5
1101 JNE CHECK_ERROR6A ;;
1102 JMP ERROR5A ;; display error message
1103 ;;
1104CHECK_ERROR6A: ;;
1105 JMP ERROR6A ;; If return code not 0,1,2,3,4 then
1106 ;; display error message
1107CHECK_FOR_INV_CP: ;;
1108 MOV CX,CPN_INVALID ;; Check if any CPs were not loaded
1109 CMP CX,0 ;;
1110 JE TERMINATE ;; If some were invalid, issue
1111 ;; warning message
1112;;***************************************************************************
1113 PUSH BX ;AN000;;; WGR ;AN000
1114 PUSH CX ;AN000;;; WGR ;AN000
1115 MOV AX,NOT_SUPP ;AN000;;; WGR ;AN000
1116 MOV BX,STDOUT ;AN000;;; WGR WARNING ;AN000
1117 XOR CX,CX ;AN000;;; WGR MESSAGE ;AN000
1118 MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR ;AN000
1119 XOR DL,DL ;AN000;;; WGR ;AN000
1120 CALL SYSDISPMSG ;AN000;;; WGR ;AN000
1121 POP CX ;AN000;;; WGR ;AN000
1122 POP BX ;AN000;;; WGR ;AN000
1123;;***************************************************************************
1124 ;;
1125TERMINATE: ;;
1126 MOV AH,3EH ;; Close the KEYBOARD.SYS file
1127 MOV BX,KEYBSYS_FILE_HANDLE ;; if open
1128 CMP BX,0 ;;
1129 JE KEYB_EXIT ;;
1130 INT 21H ;;
1131 ;;
1132 MOV AX,KEYB_INSTALLED ;;
1133 CMP AX,0 ;;
1134 JE KEYB_EXIT ;;
1135 JMP KEYB_EXIT_NOT_RESIDENT ;;
1136 ;;
1137KEYB_EXIT: ;;
1138 TEST SD.KEYB_TYPE,G_KB ;; Q..FERRARI G??
1139 JZ NO_FERRARI_G ;; N..LEAVE NUMLK ALONE
1140 TEST SD.SYSTEM_FLAG,PC_XT ;; Q..PC/XT?
1141 JNZ NO_FERRARI_G ;; Y..LEAVE NUMLK ALONE
1142 TEST SD.KEYB_TYPE,P_KB ;; Q..FERRARI P?? ***RPS
1143 JNZ NO_FERRARI_G ;; Y..LEAVE NUMLK ALONE ***RPS
1144;***CNS
1145 CMP SECURE_FL,1 ;AN002;; IF SECURITY FLAG SET
1146 JNE NO_FERRARI_G ;AN002;; DON'T TURN ON NUM_LK
1147
1148;***CNS
1149 CALL NUMLK_ON ;; N..TURN NUMLK ON
1150 ;;
1151NO_FERRARI_G: ;;
1152 TEST SD.SYSTEM_FLAG,EXT_16 ;; extended INT 16 support?
1153 JZ SKIP_CTRL_COPY ;;
1154 ;; Yes, load extened CTRL case table
1155 MOV CX,L_CTRL_TAB ;; CX = LENGTH OF EXTENDED TABLE
1156 MOV SI,OFFSET CS:RPL_K8 ;; POINT TO EXT. CTRL TABLES
1157 MOV DI,OFFSET CS:K8 ;; POINT TO REGULAR CTRL TABLE
1158 CLD ;;
1159 REP MOVSB ;; OVERLAY WITH EXT. CTRL TABLE
1160 ;;
1161SKIP_CTRL_COPY: ;;
1162 CALL INSTALL_INT_9_NET ;; Let the network know about INT 9
1163 ;; (if the network is installed)
1164 CALL INSTALL_INT_2F_48 ;; Install INT 2F and INT 48 (If PCjr)
1165 ;;
1166 MOV AX,0AD82H ;; Activate language
1167 MOV BL,-1 ;;
1168 INT 2FH ;;
1169 ;;
1170 MOV DX,ES:TSD.RESIDENT_END ;; Get resident end
1171 MOV CL,4 ;; Convert into paragrahs
1172 SHR DX,CL ;;
1173 INC DX ;;
1174 MOV AH,31H ;; Function call to terminate but stay
1175 XOR AL,AL ;; resident
1176 ;;
1177 MOV DI,OFFSET SD_DEST_PTR ;; Initialize destination ptr
1178 MOV SI,OFFSET SD_SOURCE_PTR ;; Initialize source ptr
1179 XOR BP,BP ;;
1180 LEA BX,[BP].ACTIVE_LANGUAGE ;;
1181 ADD DI,BX ;; Adjust for portion not copied
1182 ADD SI,BX ;; Adjust for portion not copied
1183 ;;
1184 MOV CX,SD_LENGTH ;; Set length of SHARED_DATA_AREA
1185 SUB CX,BX ;; Adjust for portion not copied
1186 ;;
1187 JMP COPY_SD_AREA ;; Jump to proc that copies area in new
1188 ;; part of memory
1189;***************************** CNS *********************************************
1190ERR1ID: ;AN000;
1191;;***************************************************************************
1192 MOV AX,INV_I ;AN000;;; WGR invalid ID message ;AN000
1193 MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000
1194 XOR CX,CX ;AN000;;; WGR no substitutions ;AN000
1195 MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000
1196 XOR DL,DL ;AN000;;; WGR no input ;AN000
1197 CALL SYSDISPMSG ;AN000;;; WGR display message ;AN000
1198 MOV AL,INVALID_PARMS ;AN000;;; |
1199 MOV EXIT_RET_CODE,AL ;AN000;;; |
1200;;***************************************************************************
1201 JMP KEYB_EXIT_NOT_RESIDENT ;;
1202ERR2ID:
1203;;***************************************************************************
1204 MOV AX,INV_COMBO ;AN000;;; WGR invalid combination message ;AN000
1205 MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000
1206 XOR CX,CX ;AN000;;; WGR no substitutions ;AN000
1207 MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000
1208 XOR DL,DL ;AN000;;; WGR no input ;AN000
1209 CALL SYSDISPMSG ;AN000;;; WGR display message ;AN000
1210 MOV AL,INVALID_PARMS ;AN000;;; |
1211 MOV EXIT_RET_CODE,AL ;AN000;;; |
1212;;***************************************************************************
1213 JMP KEYB_EXIT_NOT_RESIDENT ;;
1214;***************************** CNS *********************************************
1215ERROR1:
1216;;***************************************************************************
1217 MOV AX,INV_L ;AN000;;; WGR invalid language code ;AN000
1218 MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000
1219 XOR CX,CX ;AN000;;; WGR no substitutions ;AN000
1220 MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000
1221 XOR DL,DL ;AN000;;; WGR no input ;AN000
1222 CALL SYSDISPMSG ;AN000;;; WGR display message ;AN000
1223 MOV AL,INVALID_PARMS ;AN000;;; |
1224 MOV EXIT_RET_CODE,AL ;AN000;;; |
1225;;***************************************************************************
1226 JMP KEYB_EXIT_NOT_RESIDENT ;;
1227ERROR2:
1228;;***************************************************************************
1229 MOV AX,INV_CP ;AN000;;; WGR invalid code page message ;AN000
1230 MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000
1231 XOR CX,CX ;AN000;;; WGR no substitutions ;AN000
1232 MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000
1233 XOR DL,DL ;AN000;;; WGR no input ;AN000
1234 CALL SYSDISPMSG ;AN000;;; WGR display message ;AN000
1235 MOV AL,INVALID_PARMS ;AN000;;; |
1236 MOV EXIT_RET_CODE,AL ;AN000;;; |
1237;;***************************************************************************
1238 JMP KEYB_EXIT_NOT_RESIDENT ;;
1239ERROR3:
1240;;***************************************************************************
1241 MOV AX,INV_S ;AN000;;; WGR invalid syntax message ;AN000
1242 MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000
1243;***CNS
1244
1245 LEA DI,STRING_HOLDER ;AN003;Set PTR to look at the STRING
1246 PUSH SI ;AN003;Save current SI index
1247 PUSH AX
1248 MOV AX,OLD_PTR ;AN003;Last locale of the end of a PARAM
1249 SUB CUR_PTR,AX ;AN003;Get the length via the PSP
1250 MOV SI,CUR_PTR
1251 MOV CX,SI ;AN003;Save it in CX to move in the chars
1252 POP AX ;AN003;Restore the PTR to the command line position
1253
1254 MOV SI,OLD_PTR ;AN003;Last locale of the end of a PARAM
1255 REP MOVSB ;AN003;Move in the chars until no more
1256
1257 LEA DI,STRING_HOLDER ;AN003;Set PTR to look at the STRING
1258
1259
1260 POP SI ;AN003;Restore the PTR to the command line position
1261
1262 MOV CX,1 ;AN003;One replacement
1263 MOV PTR_TO_COMLIN,DI ;AN003;;; WGR language code asciiz string ;AN000
1264
1265
1266 PUSH AX ;AN003;
1267 MOV AX,DS ;AN003;;; WGR language code asciiz string ;AN000
1268 MOV SEG_OF_COMLIN,AX ;AN003;
1269 POP AX ;AN003;
1270 ;XOR CX,CX ;AN000;;; WGR no substitutions ;AN000
1271
1272 MOV AX,ERR_PART ;AN003;
1273 LEA SI,SUBLIST_COMLIN ;AN003;
1274; MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR parse error message ;AN000
1275 MOV DH,PARSE_ERR_CLASS ;AN000;;; WGR parse error message ;AN000
1276 XOR DL,DL ;AN000;;; WGR no input ;AN000
1277 CALL SYSDISPMSG ;AN000;;; WGR display message ;AN000
1278 MOV AL,INVALID_PARMS ;AN000;;; |
1279 MOV EXIT_RET_CODE,AL ;AN000;;; |
1280;;***************************************************************************
1281 JMP KEYB_EXIT_NOT_RESIDENT ;;
1282ERROR4:
1283;;***************************************************************************
1284 MOV AX,INV_FN ;AN000;;; WGR bad or missing file message ;AN000
1285 MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000
1286 XOR CX,CX ;AN000;;; WGR no substitutions ;AN000
1287 MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000
1288 XOR DL,DL ;AN000;;; WGR no input ;AN000
1289 CALL SYSDISPMSG ;AN000;;; WGR display message ;AN000
1290 MOV AL,BAD_KEYB_DEF_FILE ;AN000;;; |
1291 MOV EXIT_RET_CODE,AL ;AN000;;; |
1292;;***************************************************************************
1293 JMP KEYB_EXIT_NOT_RESIDENT ;;
1294ERROR5:
1295;;***************************************************************************
1296 MOV AX,INV_CON_Q ;AC000;;; WGR CON code page not available. ;AN000
1297 MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000
1298 XOR CX,CX ;AN000;;; WGR no substitutions ;AN000
1299 MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000
1300 XOR DL,DL ;AN000;;; WGR no input ;AN000
1301 CALL SYSDISPMSG ;AN000;;; WGR display message ;AN000
1302 MOV AL,CONSOLE_ERROR ;AN000;;; |
1303 MOV EXIT_RET_CODE,AL ;AN000;;; |
1304;;***************************************************************************
1305 JMP KEYB_EXIT_NOT_RESIDENT ;;
1306ERROR5A:
1307;;***************************************************************************
1308 MOV AX,MEMORY_OVERF ;AC000;;; WGR not enough resident memory. ;AN000
1309 MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000
1310 XOR CX,CX ;AN000;;; WGR no substitutions ;AN000
1311 MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000
1312 XOR DL,DL ;AN000;;; WGR no input ;AN000
1313 CALL SYSDISPMSG ;AN000;;; WGR display message ;AN000
1314 MOV AL,MEMORY_OVERFLOW ;AN000;;; |
1315 MOV EXIT_RET_CODE,AL ;AN000;;; |
1316;;***************************************************************************
1317 JMP KEYB_EXIT_NOT_RESIDENT ;;
1318ERROR6:
1319;;***************************************************************************
1320 MOV AX,NOT_DESIG ;AC000;;; WGR code page not prepared. ;AN000
1321 MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000
1322 XOR CX,CX ;AN000;;; WGR no substitutions ;AN000
1323 MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000
1324 XOR DL,DL ;AN000;;; WGR no input ;AN000
1325 CALL SYSDISPMSG ;AN000;;; WGR display message ;AN000
1326 MOV AL,CP_NOT_DESIGNATED ;AN000;;; |
1327 MOV EXIT_RET_CODE,AL ;AN000;;; |
1328;;***************************************************************************
1329 JMP KEYB_EXIT_NOT_RESIDENT ;;
1330ERROR6A:
1331;;***************************************************************************
1332 MOV NUMBER_HOLDER,BX ;AN000;;; WGR transfer number to temp loc. ;AN000
1333 LEA SI,NUMBER_HOLDER ;AN000;;; WGR sublist points to... ;AN000
1334 MOV PTR_TO_NUMBER,SI ;AN000;;; WGR code page word ;AN000
1335 MOV AX,NOT_VALID ;AN000;;; WGR display 'Code page requested....' ;AN000
1336 MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000
1337 MOV CX,1 ;AN000;;; WGR one replacement ;AN000
1338 MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000
1339 XOR DL,DL ;AN000;;; WGR no input ;AN000
1340 LEA SI,SUBLIST_NUMBER ;AN000;;; WGR ptr to sublist ;AN000
1341 CALL SYSDISPMSG ;AN000;;; WGR ;AN000
1342 MOV AL,KEYB_TABLE_NOT_LOAD ;AN000;;; |
1343 MOV EXIT_RET_CODE,AL ;AN000;;; |
1344;;***************************************************************************
1345 ;;
1346KEYB_EXIT_NOT_RESIDENT: ;;
1347 MOV AH,04CH ;;
1348 MOV AL,QUERY_CALL ;; Check if this was a query call
1349 CMP AL,0 ;;
1350 JNE KEYB_EXIT3 ;; IF yes then EXIT
1351 MOV AL,EXIT_RET_CODE ;; Check if return code was valid
1352 CMP AL,0 ;;
1353 JNE KEYB_EXIT3 ;; IF not then EXIT
1354 ;;
1355COPY_INTO_SDA: ;;
1356 MOV AX,0AD82H ;; Activate language
1357 MOV BL,-1 ;;
1358 INT 2FH ;;
1359 ;;
1360 MOV AH,04CH ;;;;;;;;;;;
1361 MOV AL,EXIT_RET_CODE ;;
1362 MOV DI,WORD PTR SHARED_AREA_PTR+2 ;; Initialize destination ptr
1363 MOV ES,WORD PTR SHARED_AREA_PTR ;;
1364 MOV DX,[BP].RESIDENT_END ;;;;;;;;;;;
1365 MOV CL,4 ;; Calculate resident end in paragraphs
1366 SHR DX,CL ;;
1367 INC DX ;;
1368 ;;
1369 MOV SI,OFFSET SD_SOURCE_PTR ;; Initialize source ptr
1370 XOR BP,BP ;;
1371 LEA BX,[BP].ACTIVE_LANGUAGE ;;
1372 ADD DI,BX ;;
1373 ADD SI,BX ;;
1374 MOV CX,SD_LENGTH ;; Set length of SHARED_DATA_AREA
1375 SUB CX,BX ;;
1376 ;;
1377 JMP COPY_SD_AREA ;; Jump to proc that copies area in new
1378 ;;
1379KEYB_EXIT3: ;;;;;;;;;;;
1380 MOV AL,EXIT_RET_CODE ;;
1381 MOV DI,WORD PTR SHARED_AREA_PTR+2 ;; Initialize destination ptr
1382 MOV ES,WORD PTR SHARED_AREA_PTR ;;
1383 MOV ES:[DI].TABLE_OK,1 ;;
1384 INT 21H ;;;;;;;;;;;
1385 ;;
1386KEYB_COMMAND ENDP ;;
1387 ;;
1388;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1389;;
1390;; Procedure: NUMLK_ON
1391;;
1392;; Description:
1393;; Turn Num Lock On.
1394;;
1395;; Input Registers:
1396;; N/A
1397;;
1398;; Output Registers:
1399;; N/A
1400;;
1401;; Logic:
1402;; Set Num Lock bit in BIOS KB_FLAG
1403;; Issue Int 16 to update lights
1404;;
1405;;
1406;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1407 ;;
1408NUMLK_ON PROC ;;
1409 ;;
1410 PUSH ES ;;
1411 PUSH AX ;;
1412 ;;
1413 MOV AX,DATA ;;
1414 MOV ES,AX ;;
1415 ;;
1416 OR ES:KB_FLAG,NUM_STATE ;; Num Lock state active
1417 MOV AH,1 ;; Issue keyboard query call to
1418 INT 16H ;; have BIOS update the lights
1419 ;;
1420 POP AX ;;
1421 POP ES ;;
1422 RET ;;
1423 ;;
1424NUMLK_ON ENDP ;;
1425 ;;
1426;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1427;;
1428;; Module: INSTALL_INT_9
1429;;
1430;; Description:
1431;; Install our INT 9 driver.
1432;;
1433;; Input Registers:
1434;; DS - points to our data segment
1435;; BP - points to ES to find SHARED_DATA_AREA
1436;;
1437;; Output Registers:
1438;; DS - points to our data segment
1439;; AX, BX, DX, ES Trashed
1440;;
1441;; Logic:
1442;; Get existing vector
1443;; Install our vector
1444;; Return
1445;;
1446;; Notes:
1447;;
1448;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1449 ;;
1450REPLACE_INT_SEGMENT1 DW ? ;;
1451 ;;
1452;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1453;; Program Code
1454;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1455 ;;
1456INSTALL_INT_9 PROC ;;
1457 ;;
1458 PUSH ES ;;
1459 ;;
1460 MOV AH,35H ;; Get int 9 vector
1461 MOV AL,9 ;;
1462 INT 21H ;; Vector in ES:BX
1463 MOV REPLACE_INT_SEGMENT1,ES ;;
1464 PUSH CS ;;
1465 POP ES ;;
1466 MOV WORD PTR ES:SD.OLD_INT_9,BX ;; Offset
1467 MOV AX,REPLACE_INT_SEGMENT1 ;;
1468 MOV WORD PTR ES:SD.OLD_INT_9+2,AX ;; Segment
1469 MOV AH,25H ;;
1470 MOV AL,9 ;;
1471 MOV DX,OFFSET KEYB_INT_9 ;; Let DOS know about our handler
1472 INT 21H ;;
1473 ;;
1474 POP ES ;;
1475 RET ;;
1476 ;;
1477INSTALL_INT_9 ENDP ;;
1478 ;;
1479;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1480;;
1481;; Module: INSTALL_INT_9_NET
1482;;
1483;; Description:
1484;;
1485;;
1486;; Input Registers:
1487;; DS - points to our data segment
1488;; BP - points to ES to find SHARED_DATA_AREA
1489;;
1490;; Output Registers:
1491;; DS - points to our data segment
1492;; AX, BX, DX, ES Trashed
1493;;
1494;; Logic:
1495;; IF network is installed THEN
1496;; Let it know about our INT 9
1497;; Return
1498;;
1499;; Notes:
1500;;
1501;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1502 ;;
1503;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1504;; Program Code
1505;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1506 ;;
1507INSTALL_INT_9_NET PROC ;;
1508 ;;
1509 PUSH ES ;;
1510 ;;
1511 TEST SD.SYSTEM_FLAG,PC_NET ;; TEST FOR PC_NETWORK
1512 JNZ NET_HAND_SHAKE ;; JUMP IF NETWORK INSTALLED
1513 JMP INSTALL_9_DONE_NET ;; SKIP THE PC NETWORK HANDSHAKE
1514 ;;
1515NET_HAND_SHAKE: ;;
1516 ;; ES:BX TO CONTAIN INT 9 ADDR
1517 MOV BX,OFFSET KEYB_INT_9 ;;
1518 MOV AX,0B808H ;; FUNCTION FOR PC NETWORK TO INSTALL
1519 ;; THIS ADDRESS FOR THEIR JUMP TABLE
1520 INT 02FH ;; TELL PC_NET TO USE MY ADDR TO CHAIN TO
1521 ;;
1522INSTALL_9_DONE_NET: ;;
1523 POP ES ;;
1524 RET ;;
1525 ;;
1526INSTALL_INT_9_NET ENDP ;;
1527 ;;
1528;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1529;;
1530;; Module: INSTALL_INT_2F_48
1531;;
1532;; Description:
1533;; Install our INT 2F, INT 48 drivers.
1534;;
1535;; Input Registers:
1536;; DS - points to our data segment
1537;; BP - points to ES to find SHARED_DATA_AREA
1538;;
1539;; Output Registers:
1540;; DS - points to our data segment
1541;; AX, BX, DX, ES Trashed
1542;;
1543;; Logic:
1544;; Get existing vectors
1545;; Install our vectors
1546;; Return
1547;;
1548;; Notes:
1549;;
1550;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1551 ;;
1552REPLACE_INT_SEGMENT2 DW ? ;;
1553 ;;
1554;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1555;; Program Code
1556;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1557 ;;
1558INSTALL_INT_2F_48 PROC ;;
1559 ;;
1560 MOV AH,35H ;; Get int 2f vector
1561 MOV AL,2FH ;;
1562 INT 21H ;; Vector in ES:BX
1563 MOV REPLACE_INT_SEGMENT2,ES ;;
1564 PUSH CS ;;
1565 POP ES ;;
1566 MOV WORD PTR ES:SD.OLD_INT_2F,BX ;; Offset
1567 MOV AX,REPLACE_INT_SEGMENT2 ;;
1568 MOV WORD PTR ES:SD.OLD_INT_2F+2,AX ;; Segment
1569 MOV AH,25H ;; Set int 9 vector
1570 MOV AL,2FH ;;
1571 MOV DX,OFFSET KEYB_INT_2F ;; Vector in DS:DX
1572 INT 21H ;;
1573 ;;
1574ARE_WE_A_PCJR: ;;
1575 ;;
1576 MOV AX,SD.SYSTEM_FLAG ;; Test if we are a PCjr
1577 CMP AX,PC_JR ;;
1578 JNE INSTALL_DONE ;; IF yes then
1579 MOV AH,35H ;; Get int 48 vector
1580 MOV AL,48H ;;
1581 INT 21H ;; Vector in ES:BX
1582 MOV REPLACE_INT_SEGMENT2,ES ;;
1583 PUSH CS ;;
1584 POP ES ;;
1585 MOV WORD PTR ES:SD.OLD_INT_48,BX ;; Offset
1586 MOV AX,REPLACE_INT_SEGMENT2 ;;
1587 MOV WORD PTR ES:SD.OLD_INT_48+2,AX ;; Segment
1588 MOV AH,25H ;; Set int 48 vector
1589 MOV AL,48H ;;
1590 MOV DX,OFFSET KEYB_INT_48 ;; Vector in DS:DX
1591 INT 21H ;;
1592 ;;
1593INSTALL_DONE: ;;
1594
1595
1596 RET ;;
1597 ;;
1598INSTALL_INT_2F_48 ENDP ;;
1599 ;;
1600;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1601;;
1602;; Module: REMOVE_INT_9
1603;;
1604;; Description:
1605;; Remove our INT 9 driver.
1606;;
1607;; Input Registers:
1608;; DS - points to our data segment
1609;; BP - points to ES to find SHARED_DATA_AREA
1610;;
1611;; Output Registers:
1612;; DS - points to our data segment
1613;; AX, BX, DX, ES Trashed
1614;;
1615;; Logic:
1616;; Get old vector
1617;; Install old vector
1618;; Return
1619;;
1620;; Notes:
1621;;
1622;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1623 ;;
1624;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1625;; Program Code
1626;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1627 ;;
1628REMOVE_INT_9 PROC ;;
1629 ;;
1630 PUSH DS ;;
1631 PUSH ES ;;
1632 MOV ES,WORD PTR SHARED_AREA_PTR ;;
1633 MOV AX,WORD PTR ES:SD.OLD_INT_9+2 ;; int 9 vector - segment
1634 MOV DS,AX ;;
1635 MOV DX,WORD PTR ES:SD.OLD_INT_9 ;; int 9 vector - offset
1636 ;;
1637 MOV AH,25H ;;;;;;;;; Set int 9 vector
1638 MOV AL,9 ;;
1639 INT 21H ;;
1640 ;;
1641REMOVE_9_DONE: ;;
1642 POP ES ;;
1643 POP DS ;;
1644 RET ;;
1645 ;;
1646REMOVE_INT_9 ENDP ;;
1647 ;;
1648;*********************** CNS **********;;
1649PURPOSE: ;;
1650INPUT: ;;
1651OUTPUT: ;;
1652;**************************************;;
1653 ;AN000;;;
1654 ;AN000;;;
1655 ;AN000;;;
1656 IDLANG_CHK PROC NEAR ;AN000;;;
1657 ;AN000;;;
1658 mov ax,fb.kl_id_code ;AN000;;;get the id code from the table
1659 cmp ax,[bp].id_parm ;AN000;;;;;;;;;;;compare it to value taken
1660 jne end_match ;AN000; ;from the switch-- if found
1661 cmp ALPHA,0 ;AN000; ;a keyboard code was specified
1662 je a_match ;AN000; ;no lang & a match
1663 ;AN000; ;
1664 mov ax,fb.kl_lang_code ;AN000; ;compare lang codes
1665 cmp ax,[BP].LANGUAGE_PARM ;AN000; ;they are equal
1666 je a_match ;AN000; ;
1667 ;AN000; ;
1668 jmp end_match ;AN000; ;if not found go check next
1669 ;AN000; ;id for the same country
1670 ;AN000; ;
1671 a_match: ;AN000; ;
1672 ;
1673 mov good_match,1 ;AN000; ;report the ids match
1674 ;
1675 end_match: ;AN000; ;
1676 ;
1677 ret ;AN000; ;
1678 ;
1679 IDLANG_CHK ENDP ;AN000; ;
1680;*********************** CNS *******************;
1681;**********************************SCAN_ID***********************;
1682; New variables defined - NUM_ID,ADRSS_LANG,ID_PTR_SIZE,ID_FOUND ;
1683;****************************************************************;
1684 ;
1685 ;
1686 SCAN_ID PROC NEAR ;
1687 ;
1688 xor di,di ;AN000;;clear di to set at the
1689 ;AN000;;beginning of KEYBSYS STRUCTURE
1690 ;;;;;;;;;;
1691 ;
1692 lea cx,[di].kh_num_ID+4 ;AN000;; set number of bytes to read header
1693 ;
1694 mov ah,3fh ;AN000;;
1695 int 21h ;AN000;;
1696 jnc VAL5ID ;AN000;;
1697 jmp BAD_TAB ;AN000;;;bad table message
1698 ;
1699 VAL5ID: ;AN000; ;
1700 ;
1701 mov cx,SIGNATURE_LENGTH ;AN000; ;
1702 mov di,offset SIGNATURE ;AN000; ;
1703 mov si,offset FB.KH_SIGNATURE;AN000; ;
1704 repe CMPSB ;AN000; ;
1705 je ID_SPECIFIED ;AN000; ;
1706 jmp BAD_TAB ;AN000; ;
1707 ;
1708 ;
1709 ;
1710 ID_SPECIFIED: ;AN000; ;
1711 ;
1712 mov ax,FB.KH_NUM_ID ;AN000; ;;;;;;;;;;;;;;;
1713 mov NUM_ID,ax ;AN000; ;save # of IDs
1714 mul ID_PTR_SIZE ;AN000; ;determine # of bytes to read
1715 push ax ;AN000; ;save current # of bytes to read for
1716 ;AN000; ;ID values only
1717 mov ax,FB.KH_NUM_LANG ;AN000; ;add on lang data in table
1718 mul LANG_PTR_SIZE ;AN000; ;data that comes before the ID data
1719 mov cx,ax ;AN000; ;save that value for the size compare
1720 mov PASS_LANG,cx ;AN000; ;
1721 pop ax ;AN000; ;restore the info for # of ID bytes to read
1722 add cx,ax ;AN000; ;add that value to get total in CX
1723 mov TOTAL_SIZE,cx ;AN000; ;save the total size
1724 cmp cx,FILE_BUFFER_SIZE ;AN000; ;
1725 jbe READ_ID_TAB ;AN000; ;
1726 jmp BAD_TAB ;AN000; ;
1727 ;
1728 ;
1729 READ_ID_TAB: ;AN000; ;
1730 ;
1731 mov dx,offset FILE_BUFFER ;AN000; ;
1732 mov ah,3fh ;;AN000;read language table from
1733 int 21h ;;AN000;keyb defn file
1734 jnc READ_IDVAL ;;AN000;
1735 jmp BAD_TAB ;;AN000;
1736 ;
1737 READ_IDVAL: ;;AN000;
1738 ;;AN000;
1739 mov cx,NUM_ID ;;AN000;
1740 mov di,offset FILE_BUFFER ;;AN000;;;;;;;;;;
1741 add di,PASS_LANG ;AN000; ;
1742 ;
1743 SCAN_ID_TAB: ;AN000; ;
1744 ;
1745 mov ax,[bp].ID_PARM ;AN000; ;
1746 cmp [di].KP_ID_CODE,ax ;AN000; ;
1747 je ID_HERE ;AN000; ;
1748 add di,ID_PTR_SIZE ;AN000; ;
1749 dec cx ;AN000; ;
1750 jne SCAN_ID_TAB ;AN000; ;
1751 jmp FINALE ;AN000; ;
1752 ;
1753 BAD_TAB: ;AN000;;
1754 ;
1755 mov ERR4ID,1 ;AN000; ;
1756 jmp FINALE ;AN000; ;
1757 ;
1758 ;
1759 ;
1760 ID_HERE: ;AN000; ;
1761 ;
1762 mov ID_FOUND,1 ;AN000;;reset ptr for ;
1763 ;AN000;;current country ;
1764 ;
1765
1766 ;
1767 FINALE: ;AN000; ;
1768 ;
1769 ret ;AN000; ;
1770 ;
1771 ;
1772 SCAN_ID ENDP ;AN000; ;
1773 ;
1774;*******************************SCAN_ID END******;
1775;;
1776;; Module: BUILD_PATH
1777;;
1778;; Description:
1779;; Build the complete filename of the Keyboard Definition File
1780;;*************************************WGR*********************
1781;; and open the file.
1782;;+++++++++++++++++++++++++++++++++++++WGR+++++++++++++++++++++
1783;;
1784;; Input Registers:
1785;; DS - points to our data segment
1786;; ES - points to our data segment
1787;; BP - offset of parmeter list
1788;;
1789;; Output Registers:
1790;;************************************WGR**********************
1791;; CARRY CLEAR
1792;; AX = HANDLE
1793;; CARRY SET (ERROR)
1794;; NONE
1795;;++++++++++++++++++++++++++++++++++++WGR++++++++++++++++++++++
1796;; The complete filename will be available in FILE_NAME
1797;;
1798;; Logic:
1799;;
1800;; Determine whether path parameter was specified
1801;; IF length is zero THEN
1802;;****************************************WGR******************
1803;; Try to open file in ACTIVE directory
1804;; IF failed THEN
1805;; Try to open file in ARGV(0) directory
1806;; IF failed THEN
1807;; Try to open file in ROOT directory (for DOS 3.3 compatibility)
1808;; ENDIF
1809;; ENDIF
1810;; ENDIF
1811;; ELSE
1812;; Copy path from PSP to FILE_NAME memory area
1813;; Try to open USER SPECIFIED file
1814;;++++++++++++++++++++++++++++++++++++++++WGR++++++++++++++++++
1815;;
1816;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1817 ;;
1818KEYBOARD_SYS DB '\KEYBOARD.SYS',00 ;AN000;;;
1819KEYB_SYS_ACTIVE DB 'KEYBOARD.SYS',00 ;AN000;;; WGR ;AN000
1820KEYB_SYS_LENG EQU 14 ;AN000;;;
1821KEYB_SYS_A_LENG EQU 13 ;AN000;;; WGR ;AN000
1822 ;;
1823FILE_NAME DB 128 DUP(0) ;AN000;;;
1824 ;;
1825FILE_NOT_FOUND EQU 2 ;AN000;;; WGR ;AN000
1826PATH_NOT_FOUND EQU 3 ;AN000;;; WGR ;AN000
1827;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1828;; Program Code
1829;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1830 ;;
1831BUILD_PATH PROC NEAR ;;
1832 CLD ;AN000;;; WGR ;AN000
1833 MOV DI,OFFSET FILE_NAME ;; Get the offset of the filename
1834 MOV CX,[BP].PATH_LENGTH ;; If path is specified then
1835 CMP CX,0 ;;
1836 JE APPEND_KEYB_SYS ;;
1837 MOV SI,[BP].PATH_OFFSET ;; Get the offset of the path
1838 ;;
1839 REPE MOVSB ;AC000;;; Copy each char of the specified
1840 MOV AX,3D00H ;AC000;;; WGR Open the KEYBOARD.SYS file ;AN000
1841 MOV DX,OFFSET FILE_NAME ;AC000;;; WGR ;AN000
1842 INT 21H ;AC000;;; WGR ;AN000
1843 RET ;; path into the filename location
1844 ;;
1845APPEND_KEYB_SYS: ;;;;;
1846 MOV SI,OFFSET KEYB_SYS_ACTIVE ;AC000;;; WGR copy name for active directory ;AN000
1847 MOV CX,KEYB_SYS_A_LENG ;AC000;;;;;; WGR to file name variable. ;AN000
1848 REPE MOVSB ;AC000;;; WGR ;AN000
1849 MOV AX,3D00H ;AC000;;; WGR try to open it. ;AN000
1850 MOV DX,OFFSET FILE_NAME ;AC000;;; WGR ;AN000
1851 INT 21H ;AC000;;; WGR ;AN000
1852 .IF C ;AC000;;; WGR error in opening...was it.. ;AN000
1853 .IF <AX EQ PATH_NOT_FOUND> OR ;AN000;;; WGR path or.. ;AN000
1854 .IF <AX EQ FILE_NOT_FOUND> ;AN000;;; WGR file not found?... ;AN000
1855 CALL COPY_ARGV0 ;AC000;;; WGR yes....try ARGV(0) directory. ;AN000
1856 MOV AX,3D00H ;AC000;;; WGR ;AN000
1857 MOV DX,OFFSET FILE_NAME ;AC000;;; WGR ;AN000
1858 INT 21H ;AC000;;; WGR ;AN000
1859 .IF C ;AC000;;; WGR error in opening....was it.. ;AN000
1860 .IF <AX EQ PATH_NOT_FOUND> OR ;AC000;;; WGR path or.. ;AN000
1861 .IF <AX EQ FILE_NOT_FOUND> ;AC000;;; WGR file not found? ;AN000
1862 MOV SI,OFFSET KEYBOARD_SYS ;AC000;;; WGR try ROOT directory. ;AN000
1863 MOV DI,OFFSET FILE_NAME ;AC000;;; WGR ;AN000
1864 MOV CX,KEYB_SYS_LENG ;AC000;;; WGR ;AN000
1865 REPE MOVSB ;AC000;;; WGR ;AN000
1866 MOV AX,3D00H ;AC000;;; WGR ;AN000
1867 MOV DX,OFFSET FILE_NAME ;AC000;;; WGR ;AN000
1868 INT 21H ;AC000;;; WGR ;AN000
1869 .ELSE ;AC000;;; WGR if failed then carry set.. ;AN000
1870 STC ;AC000;;; WGR some other error..set flag ;AN000
1871 .ENDIF ;AC000;;; WGR ;AN000
1872 .ENDIF ;AC000;;; WGR ;AN000
1873 .ELSE ;AN000;;; WGR ;AN000
1874 STC ;AN000;;; WGR some other error..set flag. ;AN000
1875 .ENDIF ;AN000;;; WGR ;AN000
1876 .ENDIF ;AN000;;; WGR ;AN000
1877 ;;
1878 RET ;AN000;;;
1879 ;;
1880BUILD_PATH ENDP ;;
1881 ;;
1882;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WGR
1883;; WGR
1884;; Module Name: WGR
1885;; COPY_ARGV0 WGR
1886;; WGR
1887;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WGR
1888 ;; WGR
1889 ;; WGR
1890COPY_ARGV0 PROC ;; WGR ;AN000
1891 ;; WGR ;AN000
1892 PUSH ES ;AN000;;; WGR ;AN000
1893 PUSH DI ;AN000;;; WGR ;AN000
1894 PUSH SI ;AN000;;; WGR ;AN000
1895 PUSH CX ;AN000;;; WGR ;AN000
1896 ;AN000;;; WGR ;AN000
1897 MOV DI,2CH ;AN000;;; WGR Locate environment string ;AN000
1898 MOV ES,[DI] ;AN000;;; WGR ;AN000
1899 XOR SI,SI ;AN000;;; WGR ;AN000
1900 .WHILE <<WORD PTR ES:[SI]> NE 0> ;AN000;;; WGR find ARGV(0) string. ;AN000
1901 INC SI ;AN000;;; WGR ;AN000
1902 .ENDWHILE ;AN000;;; WGR ;AN000
1903 ADD SI,4 ;AN000;;; WGR ;AN000
1904 LEA DI,FILE_NAME ;AN000;;; WGR move string to work area ;AN000
1905 .REPEAT ;AN000;;; WGR ;AN000
1906 MOV AL,ES:[SI] ;AN000;;; WGR ;AN000
1907 MOV [DI],AL ;AN000;;; WGR ;AN000
1908 INC SI ;AN000;;; WGR ;AN000
1909 INC DI ;AN000;;; WGR ;AN000
1910 .UNTIL <<BYTE PTR ES:[SI]> EQ 0> ;AN000;;; WGR ;AN000
1911 .REPEAT ;AN000;;; WGR ;AN000
1912 DEC DI ;AN000;;; WGR ;AN000
1913 .UNTIL <<BYTE PTR [DI]> EQ '\'> OR ;AN000;;; WGR ;AN000
1914 .UNTIL <<BYTE PTR [DI]> EQ 0> ;AN000;;; WGR scan back to.. ;AN000
1915 INC DI ;AN000;;; WGR first character after "\" ;AN000
1916 PUSH CS ;AN000;;; WGR ;AN000
1917 POP ES ;AN000;;; WGR ;AN000
1918 LEA SI,KEYB_SYS_ACTIVE ;AN000;;; WGR copy in "KEYBOARD.SYS" ;AN000
1919 MOV CX,KEYB_SYS_A_LENG ;AN000;;; WGR ;AN000
1920 REPE MOVSB ;AN000;;; WGR ;AN000
1921 ;AN000;;; WGR ;AN000
1922 POP CX ;AN000;;; WGR ;AN000
1923 POP SI ;AN000;;; WGR ;AN000
1924 POP DI ;AN000;;; WGR ;AN000
1925 POP ES ;AN000;;; WGR ;AN000
1926 RET ;AN000;;; WGR ;AN000
1927 ;AN000;;; WGR ;AN000
1928COPY_ARGV0 ENDP ;AN000;;;
1929 ;AN000;;;
1930;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1931;;
1932;; Module: FIND_FIRST_CP
1933;;
1934;; Description:
1935;; Check the keyboard definition file for the first code page
1936;;
1937;; Input Registers:
1938;; DS - points to our data segment
1939;; ES - points to our data segment
1940;; BP - offset of parmeter list
1941;;
1942;; Output Registers:
1943;; NONE
1944;;
1945;; Logic:
1946;; Open the file
1947;; IF error in opening file THEN
1948;; Display ERROR message and EXIT
1949;; ELSE
1950;; Save handle
1951;; Set address of buffer
1952;; READ header of Keyboard definition file
1953;; IF error in reading file THEN
1954;; Display ERROR message and EXIT
1955;; ELSE
1956;; Check signature for correct file
1957;; IF file signature is correct THEN
1958;; READ language table
1959;; IF error in reading file THEN
1960;; Display ERROR message and EXIT
1961;; ELSE
1962;; Use table to verify language parm
1963;; Set pointer values
1964;; IF code page was specified
1965;; READ language entry
1966;; IF error in reading file THEN
1967;; Display ERROR message and EXIT
1968;; ELSE
1969;; READ first code page
1970;; IF error in reading file THEN
1971;; Display ERROR message and EXIT
1972;; RET
1973;;
1974;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1975 ;;
1976;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1977;; Program Code
1978;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1979 ;;
1980FIND_FIRST_CP PROC NEAR ;;
1981 ;;
1982 PUSH CX ;; Save everything that
1983 PUSH DX ;; that will be changed
1984 PUSH SI ;;
1985 PUSH DI ;;
1986 ;;
1987 MOV BX,KEYBSYS_FILE_HANDLE ;; Get handle
1988 MOV DX,WORD PTR KEYBCMD_LANG_ENTRY_PTR ;; LSEEK file pointer
1989 MOV CX,WORD PTR KEYBCMD_LANG_ENTRY_PTR+2 ;; to top of language entry
1990 MOV AH,42H ;;
1991 MOV AL,0 ;;;;;;;;;;;;;; If no problem with
1992 INT 21H ;; Keyb Def file Then
1993 JNC FIND_FIRST_BEGIN ;;
1994 JMP FIND_FIRST_CP_ERROR4 ;;
1995 ;;;;;;;;;
1996FIND_FIRST_BEGIN: ;;
1997 MOV DI,AX ;;
1998 MOV CX,SIZE KEYBSYS_LANG_ENTRY-1 ;; Set number
1999 ;; bytes to read header
2000 MOV DX,OFFSET FILE_BUFFER ;;;;;;;;;
2001 MOV AH,3FH ;; Read language entry in
2002 INT 21H ;; keyboard definition file
2003 JNC FIND_FIRST_VALID4 ;; If no error in opening file then
2004 JMP FIND_FIRST_CP_ERROR4 ;;
2005 ;;
2006FIND_FIRST_VALID4: ;;
2007;************************** CNS *******;;
2008 xor ah,ah ;AC000;;;
2009 MOV Al,FB.KL_NUM_CP ;AC000;;;
2010;************************** CNS *******;;
2011 MUL CP_PTR_SIZE ;; Determine # of bytes to read
2012 MOV DX,OFFSET FILE_BUFFER ;; Establish beginning of buffer
2013 MOV CX,AX ;;
2014 CMP CX,FILE_BUFFER_SIZE ;; Make sure buffer is not to small
2015 JBE FIND_FIRST_VALID5 ;;
2016 JMP FIND_FIRST_CP_ERROR4 ;;
2017 ;;
2018FIND_FIRST_VALID5: ;;
2019 MOV AH,3FH ;; Read code page table from
2020 INT 21H ;; keyboard definition file
2021 JNC FIND_FIRST_VALID6 ;; If no error in opening file then
2022 JMP FIND_FIRST_CP_ERROR4 ;;
2023 ;;
2024FIND_FIRST_VALID6: ;;
2025 MOV CX,NUM_CP ;; Number of valid codes
2026 MOV DI,OFFSET FILE_BUFFER ;; Point to correct word in table
2027 ;;
2028 MOV BX,[DI].KC_CODE_PAGE ;; Get parameter
2029 XOR AX,AX ;;
2030 JMP FIND_FIRST_RETURN ;;
2031 ;;
2032FIND_FIRST_CP_ERROR4: ;;
2033 MOV AX,4 ;;
2034 ;;
2035FIND_FIRST_RETURN: ;;
2036 POP DI ;;
2037 POP SI ;;
2038 POP DX ;;
2039 POP CX ;;
2040 ;;
2041 RET ;;
2042 ;;
2043FIND_FIRST_CP ENDP ;;
2044 ;;;;;;;;;;;;;
2045.xlist ;;
2046MSG_SERVICES <MSGDATA> ;AN000;;; WGR ;AN000
2047MSG_SERVICES <LOADmsg,DISPLAYmsg,CHARmsg,NUMmsg> ;AN000;;; WGR ;AN000
2048MSG_SERVICES <KEYB.CL1> ;AN000;;; WGR ;AN000
2049MSG_SERVICES <KEYB.CL2> ;AN000;;; WGR ;AN000
2050MSG_SERVICES <KEYB.CLA> ;AN000;;; WGR ;AN000
2051.list ;;
2052;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2053;; Temp Shared Data Area
2054;; Contains data which is required by
2055;; both the resident and transient KEYB code.
2056;; All keyboard tables are stored in this area
2057;; Structures for this area are in file KEYBSHAR.INC
2058;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2059 ;;
2060 ;;
2061 db 'TEMP SHARED DATA' ;;
2062SD_SOURCE_PTR LABEL BYTE ;;
2063TEMP_SHARED_DATA SHARED_DATA_STR <> ;;
2064 ;;
2065;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2066
2067CODE ENDS
2068
2069include msgdcl.inc
2070
2071 END
2072 \ No newline at end of file
diff --git a/v4.0/src/CMD/KEYB/KEYBCMD.INC b/v4.0/src/CMD/KEYB/KEYBCMD.INC
new file mode 100644
index 0000000..ac40fe5
--- /dev/null
+++ b/v4.0/src/CMD/KEYB/KEYBCMD.INC
@@ -0,0 +1,53 @@
1.XLIST
2
3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4;; DOS - NLS Support - KEYB Command
5;; (C) Copyright 1988 Microsoft
6;;
7;; File Name: KEYBCMD.INC
8;; ----------
9;;
10;; Root File Name: KEYB.ASM
11;; ---------------
12;;
13;; Description:
14;; ------------
15;; External declarations for procedures in file KEYCMD.ASM.
16;;
17;; Change History:
18;; ---------------
19;;
20;;
21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
22 ;;
23 EXTRN KEYB_COMMAND :NEAR ;;
24 ;;
25 EXTRN KEYBSYS_FILE_HANDLE:WORD ;;
26 EXTRN CP_TAB_OFFSET:DWORD ;;
27 EXTRN STATE_LOGIC_OFFSET:DWORD ;;
28 EXTRN SYS_CODE_PAGE:WORD ;;
29 EXTRN KEYBCMD_LANG_ENTRY_PTR:DWORD ;;
30 EXTRN DESIG_CP_BUFFER:WORD ;;
31 EXTRN DESIG_CP_OFFSET:WORD ;;
32 EXTRN NUM_DESIG_CP:WORD ;;
33 EXTRN TB_RETURN_CODE:WORD ;;
34 EXTRN FILE_BUFFER_SIZE:ABS
35 EXTRN FILE_BUFFER:WORD ;;
36;****************CNS****************************
37 EXTRN ID_PTR_SIZE:WORD ;;
38;****************CNS****************************
39 EXTRN LANG_PTR_SIZE:WORD ;;
40 EXTRN CP_PTR_SIZE:WORD ;;
41;****************CNS****************************
42 EXTRN NUM_ID:WORD ;;
43;****************CNS****************************
44 EXTRN NUM_LANG:WORD ;;
45 EXTRN NUM_CP:WORD ;;
46 EXTRN SHARED_AREA_PTR:DWORD ;;
47 EXTRN SD_SOURCE_PTR:BYTE ;;
48 EXTRN TEMP_SHARED_DATA:BYTE ;;
49 ;;
50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
51.LIST
52
53 \ No newline at end of file
diff --git a/v4.0/src/CMD/KEYB/KEYBCPSD.ASM b/v4.0/src/CMD/KEYB/KEYBCPSD.ASM
new file mode 100644
index 0000000..2cae9fe
--- /dev/null
+++ b/v4.0/src/CMD/KEYB/KEYBCPSD.ASM
@@ -0,0 +1,128 @@
1 PAGE ,132
2 TITLE DOS - KEYB Command - Copy Shared_Data_Area
3
4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5;; DOS - NLS Support - KEYB Command
6;; (C) Copyright 1988 Microsoft
7;;
8;; File Name: KEYBCPSD.ASM
9;; ----------
10;;
11;; Description:
12;; ------------
13;; Copies the SHARED_DATA_AREA into a part of memory that
14;; can be left resident. All relative pointers must already
15;; be recalculated to this new position.
16;; THIS FILE MUST BE THE LAST OF THE RESIDENT FILES WHEN KEYB IS LINKED.
17;;
18;; Documentation Reference:
19;; ------------------------
20;; PC DOS 3.3 Detailed Design Document - May ?? 1986
21;;
22;; Procedures Contained in This File:
23;; ----------------------------------
24;;
25;; Include Files Required:
26;; -----------------------
27;; INCLUDE KEYBSHAR.INC
28;; INCLUDE KEYBCMD.INC
29;; INCLUDE KEYBTBBL.INC
30;;
31;; External Procedure References:
32;; ------------------------------
33;; FROM FILE ????????.ASM:
34;; procedure - description????????????????????????????????
35;;
36;; Linkage Information: Refer to file KEYB.ASM
37;; --------------------
38;;
39;; Change History:
40;; ---------------
41;; PTMP3955 ;AN004;KEYB component to free environment and close handles 0 - 4
42;; 3/24/88
43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
44 ;;
45 PUBLIC SD_DEST_PTR ;;
46 PUBLIC COPY_SD_AREA ;;
47 PUBLIC SHARED_DATA ;;
48 ;;
49 INCLUDE STRUC.INC
50 INCLUDE KEYBSHAR.INC ;;
51 INCLUDE KEYBCMD.INC ;;
52 INCLUDE KEYBTBBL.INC ;;
53 ;;
54CODE SEGMENT PUBLIC 'CODE' ;;
55 ;;
56 ASSUME CS:CODE,DS:CODE ;;
57 ;;
58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
59;;
60;; Module: COPY_SD_AREA
61;;
62;; Description:
63;;
64;; Input Registers:
65;;
66;; Output Registers:
67;; N/A
68;;
69;; Logic:
70;;
71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
72 ;;
73SD EQU SHARED_DATA ;;
74TSD EQU TEMP_SHARED_DATA ;;
75 ;;
76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
77;;
78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
79 ;;
80COPY_SD_AREA PROC NEAR ;;
81 ;;
82 REP MOVS ES:BYTE PTR [DI],DS:[SI] ;; Copy SHARED_DATA_AREA to
83
84 push ax ;AN004;save existing values
85 push es ;AN004;;
86 xor ax,ax ;AN004;clear out ax
87 mov ax,cs:[2ch] ;AN004;check offset for address containin environ.
88 cmp ax,0 ;AN004;
89 je NO_FREEDOM ;AN004;
90 mov es,ax ;AN004;
91 mov ax,4900H ;AN004;make the free allocate mem func
92 int 21h ;AN004;;
93
94
95NO_FREEDOM:
96 pop es ;AN004;restore existing values
97 pop ax ;AN004;;
98
99 push ax ;AN004;
100 push bx ;AN004;
101
102 ;AN004; ;Terminate and stay resident
103 mov bx,4 ;AN004; ;1st close file handles
104 .REPEAT ;AN004; ;STDIN,STDOUT,STDERR
105 mov ah,3eh ;AN004; ;
106 int 21h ;AN004; ;
107 dec bx ;AN004; ;
108 .UNTIL <BX eq 0> ;AN004; ;
109
110 pop bx ;AN004;
111 pop ax ;AN004;
112 ;AN004; new part of memory
113 MOV BYTE PTR ES:SD.TABLE_OK,1 ;; Activate processing flag
114 INT 21H ;; Exit
115 ;;
116 ;;
117COPY_SD_AREA ENDP ;;
118;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
119;;
120;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
121 ;;
122 db 'SHARED DATA' ;;
123SD_DEST_PTR LABEL BYTE ;;
124 ;;
125SHARED_DATA SHARED_DATA_STR <> ;;
126;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
127CODE ENDS
128 END
diff --git a/v4.0/src/CMD/KEYB/KEYBCPSD.INC b/v4.0/src/CMD/KEYB/KEYBCPSD.INC
new file mode 100644
index 0000000..bb4f036
--- /dev/null
+++ b/v4.0/src/CMD/KEYB/KEYBCPSD.INC
@@ -0,0 +1,29 @@
1.XLIST
2
3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4;; DOS - NLS Support - KEYB Command
5;; (C) Copyright 1988 Microsoft
6;;
7;; File Name: KEYBCPSD.INC
8;; ----------
9;;
10;; Description:
11;; ------------
12;; External declarations and equates for procedures in file
13;; KEYBCPSD.ASM
14;;
15;; Change History:
16;; ---------------
17;;
18;;
19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
20 ;;
21 EXTRN COPY_SD_AREA:NEAR ;;
22 ;;
23 EXTRN SD_DEST_PTR :BYTE ;;
24 EXTRN SHARED_DATA :BYTE ;;
25 ;;
26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
27
28.LIST
29
diff --git a/v4.0/src/CMD/KEYB/KEYBDCL.INC b/v4.0/src/CMD/KEYB/KEYBDCL.INC
new file mode 100644
index 0000000..43b40a4
--- /dev/null
+++ b/v4.0/src/CMD/KEYB/KEYBDCL.INC
@@ -0,0 +1,50 @@
1
2.XLIST
3
4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5;; DOS - NLS Support - KEYB Command
6;; (C) Copyright 1988 Microsoft
7;;
8;; File Name: KEYBDCL.INC
9;; ----------
10;;
11;; Root File Name: KEYB.ASM
12;; ---------------
13;;
14;; Description:
15;; ------------
16;; Common declarations for structures in procedures for KEYB.COM
17;;
18;; Change History:
19;; ---------------
20;;
21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
22 ;;
23PARM_LIST STRUC ;;
24;*******************CNS******************
25;*******************CNS******************
26 RET_CODE_1 DB 0 ;; \
27 RET_CODE_2 DB 0 ;; |
28 RET_CODE_3 DB 0 ;; |
29;*******************CNS******************
30 RET_CODE_4 DB 0 ;; |;AN000;
31;*******************CNS******************
32 LANGUAGE_PARM DW ? ;; } PARAMETER
33 CODE_PAGE_PARM DW ? ;; | LIST
34 PATH_OFFSET DW ? ;; |
35 PATH_LENGTH DW 0 ;; /
36;*******************CNS******************
37 ID_PARM DW ? ;AN000;
38;*******************CNS******************
39PARM_LIST ENDS ;;
40 ;;
41DESIG_CP_STRUC STRUC ;;
42 NUM_DESIGNATES DW ? ;;
43 NUM_FONTS DW ? ;;
44 NUM_HW_CPS DW ? ;;
45 DESIG_CP_ENTRY DW ? ;;
46DESIG_CP_STRUC ENDS ;;
47 ;;
48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
49.LIST
50
diff --git a/v4.0/src/CMD/KEYB/KEYBEQU.INC b/v4.0/src/CMD/KEYB/KEYBEQU.INC
new file mode 100644
index 0000000..f12f7f3
--- /dev/null
+++ b/v4.0/src/CMD/KEYB/KEYBEQU.INC
@@ -0,0 +1,31 @@
1.XLIST
2
3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4;; DOS - NLS Support - KEYB Command
5;; (C) Copyright 1988 Microsoft
6;;
7;; File Name: KEYBEQU.INC
8;; ----------
9;;
10;; Root File Name: KEYB.ASM
11;; ---------------
12;;
13;; Description:
14;; ------------
15;; Include file containing equates used by all KEYB modules.
16;;
17;; Change History:
18;; ---------------
19;;
20;;
21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
22 ;;
23YES EQU 1 ;;
24NO EQU 0 ;;
25 ;;
26INT_2F_SUB_FUNC EQU 0ADH ;; our subfunction code for int 2f
27SD EQU SHARED_DATA ;;
28TSD EQU TEMP_SHARED_DATA ;;
29 ;;
30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
31.LIST
diff --git a/v4.0/src/CMD/KEYB/KEYBI2F.ASM b/v4.0/src/CMD/KEYB/KEYBI2F.ASM
new file mode 100644
index 0000000..30dce7e
--- /dev/null
+++ b/v4.0/src/CMD/KEYB/KEYBI2F.ASM
@@ -0,0 +1,225 @@
1
2 PAGE ,132
3 TITLE DOS - KEYB Command - Interrupt 2F Handler
4
5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6;; DOS - NLS Support - KEYB Command
7;; (C) Copyright 1988 Microsoft
8;;
9;; File Name: KEYBI2F.ASM
10;; ----------
11;;
12;; Description:
13;; ------------
14;; Contains Interrupt 2F handler.
15;;
16;; Documentation Reference:
17;; ------------------------
18;; PC DOS 3.3 Detailed Design Document - May ?? 1986
19;;
20;; Procedures Contained in This File:
21;; ----------------------------------
22;; KEYB_INT_2F - Interupt 2F handler
23;;
24;; Include Files Required:
25;; -----------------------
26;; INCLUDE KEYBEQU.INC
27;; INCLUDE KEYBSHAR.INC
28;; INCLUDE KEYBMAC.INC
29;; INCLUDE KEYBCMD.INC
30;; INCLUDE KEYBCPSD.INC
31;; INCLUDE KEYBI9C.INC
32;;
33;; External Procedure References:
34;; ------------------------------
35;; FROM FILE ????????.ASM:
36;; procedure - description????????????????????????????????
37;;
38;; Linkage Information: Refer to file KEYB.ASM
39;; --------------------
40;;
41;; Change History:
42;; ---------------
43;;
44;;
45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
46 ;;
47 INCLUDE KEYBEQU.INC ;;
48 INCLUDE KEYBSHAR.INC ;;
49 INCLUDE KEYBMAC.INC ;;
50 INCLUDE KEYBCMD.INC ;;
51 INCLUDE KEYBCPSD.INC ;;
52 INCLUDE KEYBI9C.INC ;;
53 ;;
54 PUBLIC KEYB_INT_2F ;;
55 ;;
56 EXTRN ERROR_BEEP:NEAR ;;
57 ;;
58CODE SEGMENT PUBLIC 'CODE' ;;
59 ;;
60 ASSUME CS:CODE,DS:CODE ;;
61 ;;
62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
63;;
64;; Module: KEYB_INT_2F
65;;
66;; Description:
67;;
68;; Input Registers:
69;; AH = 0ADH
70;; AL = 80,81,82
71;;
72;; Output Registers:
73;; N/A
74;;
75;; Logic:
76;; IF AH = 0ADh THEN (this call is for us)
77;; Set carry flag to 0
78;; IF AL = 80 THEN
79;; Get major and minor
80;; Get SEG:OFFSET of SHARED_DATA_AREA
81;;
82;; IF AL = 81 THEN
83;; Get FIRST_XLAT_PTR
84;; FOR each table
85;; IF code page requested = code page value at pointer THEN
86;; Set INVOKED_CODE_PAGE
87;; Set ACTIVE_XLAT_PTR
88;; EXIT
89;; ELSE
90;; Get NEXT_SECT_PTR
91;; NEXT table
92;; IF no corresponding code page found THEN
93;; Set carry flag
94;;
95;; IF AL = 82 THEN
96;; IF BL = 00 THEN
97;; Set COUNTRY_FLAG = 00
98;; ELSE IF BL = 0FFH THEN
99;; Set COUNTRY_FLAG = 0FFH
100;; ELSE
101;; Set carry flag
102;; IRET or JMP to another INT 2FH handler (if installed)
103;;
104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
105 ;;
106CP_QUERY EQU 80H ;;
107CP_INVOKE EQU 81H ;;
108CP_LANGUAGE EQU 82H ;;
109 ;;
110VERSION_MAJOR EQU 01H ;;
111VERSION_MINOR EQU 00H ;;
112 ;;
113CARRY_FLAG EQU 01H ;;
114RESTORE_BP DW ? ;;
115 ;;
116;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
117;;
118;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
119 ;;
120KEYB_INT_2F PROC ;;
121 ;;
122 PUSH DS ;;
123 PUSH BX ;;
124 PUSH CX ;;
125 PUSH SI ;;
126 ;;
127 PUSH CS ;;
128 POP DS ;; Set DATA SEGMENT register
129 ;;
130 CMP AH,INT_2F_SUB_FUNC ;; Q..is this call for us?
131 JE CHECK_REQUEST_CODE ;; Y..check request code
132 JMP INT_2F_DONE ;; N..get out
133 ;;
134CHECK_REQUEST_CODE: ;; Y..check request code
135 MOV RESTORE_BP,BP ;;;;;;;;;;;
136 MOV BP,SP ;; Clear CARRY flag
137 AND WORD PTR [BP]+12,NOT CARRY_FLAG ;;
138 MOV BP,RESTORE_BP ;;
139 ;;;;;;;;;;;
140 ;;
141INT_2F_CP_QUERY: ;;
142 CMP AL,CP_QUERY ;; Q..query CP?
143 JNE INT_2F_CP_INVOKE ;; N..next
144 MOV AX,-1 ;; Y..process query
145 MOV BH,VERSION_MAJOR ;;
146 MOV BL,VERSION_MINOR ;;
147 MOV DI,OFFSET SD ;;
148 PUSH CS ;;
149 POP ES ;;
150 JMP INT_2F_DONE ;;
151 ;;
152INT_2F_CP_INVOKE: ;;
153 CMP AL,CP_INVOKE ;; Q..invoke CP?
154 JNE INT_2F_CP_LANGUAGE ;; N..next
155 ;;
156 MOV SI,SD.FIRST_XLAT_PTR ;; Get FIRST_XLAT_PTR
157 ;;
158INT_2F_NEXT_SECTION: ;;
159 CMP SI,-1 ;;
160 JE INT_2F_ERROR_FLAG ;;
161 MOV CX,[SI].XS_CP_ID ;; Read in the code page value
162 CMP CX,BX ;; Is this the table to make active?
163 JNE INT_2F_CP_INVOKE_CONT1 ;;
164 MOV SD.ACTIVE_XLAT_PTR,SI ;; IF Yes, Set the ACTIVE_XLAT_PTR
165 MOV SD.INVOKED_CP_TABLE,BX ;; record new code page
166 JMP INT_2F_DONE ;;
167 ;;
168INT_2F_CP_INVOKE_CONT1: ;; Else
169 MOV DI,[SI].XS_NEXT_SECT_PTR ;; IF No,
170 MOV SI,DI ;; Get NEXT_SECT_PTR
171 JMP INT_2F_NEXT_SECTION ;; NEXT_SECTION
172 ;;
173INT_2F_ERROR_FLAG: ;;
174 MOV AX,1 ;;
175 MOV RESTORE_BP,BP ;;;;;;
176 MOV BP,SP ;;
177 OR WORD PTR [BP]+12,CARRY_FLAG ;; Set carry flag
178 MOV BP,RESTORE_BP ;;
179 ;;;;;;
180 JMP INT_2F_DONE ;;
181 ;;
182INT_2F_CP_LANGUAGE: ;;
183 CMP AL,CP_LANGUAGE ;; Q..Set default language??
184 JNE INT_2F_DONE ;; N..next
185 ;;
186 CMP BL,0 ;; Y..Check if Language is to be US437
187 JNE INT_2F_CONTINUE1 ;; IF yes THEN,
188 MOV COUNTRY_FLAG,BL ;; Set COUNTRY_FLAG to 0
189 JMP INT_2F_DONE ;;
190 ;;
191INT_2F_CONTINUE1: ;; ELSE
192 CMP BL,-1 ;; Check if language is to be national
193 JNE INT_2F_LANG_ERROR_FLAG ;; IF yes THEN,
194 MOV COUNTRY_FLAG,BL ;; Set COUNTRY_FLAG to -1 (0FFH)
195 JMP INT_2F_DONE ;;
196 ;;
197INT_2F_LANG_ERROR_FLAG: ;; ELSE
198 MOV RESTORE_BP,BP ;;;;;; Set CARRY flag
199 MOV BP,SP ;;
200 OR WORD PTR [BP]+12,CARRY_FLAG ;;
201 MOV BP,RESTORE_BP ;;
202 ;;;;;;
203 JMP INT_2F_DONE ;;
204 ;;
205INT_2F_DONE: ;;
206 POP SI ;;
207 POP CX ;;
208 POP BX ;;;;;;;
209 POP DS ;;
210 CMP WORD PTR CS:SD.OLD_INT_2F,0 ;; Q..are we the last in the chain?
211 JNE INT_2F_JMP ;; N..call next in chain
212 CMP WORD PTR CS:SD.OLD_INT_2F+2,0 ;; Q..are we the last in the chain?
213 JNE INT_2F_JMP ;; N..call next in chain
214 ;;;;;;;
215 IRET ;; Y..return to caller
216 ;;
217INT_2F_JMP: ;;
218 ;;
219 JMP CS:SD.OLD_INT_2F ;;
220 ;;
221KEYB_INT_2F ENDP ;;
222;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
223
224CODE ENDS
225 END
diff --git a/v4.0/src/CMD/KEYB/KEYBI2F.INC b/v4.0/src/CMD/KEYB/KEYBI2F.INC
new file mode 100644
index 0000000..57067f4
--- /dev/null
+++ b/v4.0/src/CMD/KEYB/KEYBI2F.INC
@@ -0,0 +1,26 @@
1.XLIST
2
3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4;; DOS - NLS Support - KEYB Command
5;; (C) Copyright 1988 Microsoft
6;;
7;; File Name: KEYBI2F.INC
8;; ----------
9;;
10;; Description:
11;; ------------
12;; External declarations and equates for procedures in file
13;; KEYBI2F.ASM
14;;
15;; Change History:
16;; ---------------
17;;
18;;
19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
20 ;;
21 EXTRN KEYB_INT_2F:NEAR ;;
22 ;;
23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
24
25.LIST
26
diff --git a/v4.0/src/CMD/KEYB/KEYBI48.ASM b/v4.0/src/CMD/KEYB/KEYBI48.ASM
new file mode 100644
index 0000000..05ed786
--- /dev/null
+++ b/v4.0/src/CMD/KEYB/KEYBI48.ASM
@@ -0,0 +1,174 @@
1
2
3 PAGE ,132
4 TITLE DOS - KEYB Command - Interrupt 48H Handler
5
6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7;; DOS - NLS Support - KEYB Command
8;; (C) Copyright 1988 Microsoft
9;;
10;; File Name: KEYBI48.ASM
11;; ----------
12;;
13;; Description:
14;; ------------
15;; Contains Interrupt 48H handler.
16;;
17;; Documentation Reference:
18;; ------------------------
19;; PC DOS 3.3 Detailed Design Document - May ?? 1986
20;;
21;; Procedures Contained in This File:
22;; ----------------------------------
23;;
24;; Include Files Required:
25;; -----------------------
26;; INCLUDE KEYBEQU.INC
27;; INCLUDE KEYBSHAR.INC
28;; INCLUDE KEYBMAC.INC
29;; INCLUDE KEYBCMD.INC
30;; INCLUDE KEYBCPSD.INC
31;; INCLUDE POSTEQU.inc
32;; INCLUDE DSEG.inc
33;;
34;; External Procedure References:
35;; ------------------------------
36;; FROM FILE ????????.ASM:
37;; procedure - description????????????????????????????????
38;;
39;; Linkage Information: Refer to file KEYB.ASM
40;; --------------------
41;;
42;; Change History:
43;; ---------------
44;;
45;;
46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
47 ;;
48 INCLUDE KEYBEQU.INC ;;
49 INCLUDE KEYBSHAR.INC ;;
50 INCLUDE KEYBMAC.INC ;;
51 INCLUDE KEYBCMD.INC ;;
52 INCLUDE KEYBCPSD.INC ;;
53 INCLUDE POSTEQU.inc ;;
54 INCLUDE DSEG.inc ;;
55 ;;
56 PUBLIC KEYB_INT_48 ;;
57 ;;
58 EXTRN ERROR_BEEP:NEAR ;;
59 ;;
60CODE SEGMENT PUBLIC 'CODE' ;;
61 ;;
62 ASSUME CS:CODE,DS:CODE,ES:DATA;;
63 ;;
64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
65;;
66;; Module: KEYB_INT_48
67;;
68;; Description:
69;;
70;; Input Registers:
71;; AL := Scan Code
72;;
73;; Output Registers:
74;; N/A
75;;
76;; Logic:
77;; IF scan code is not a break code THEN
78;; IF CNTL was not entered THEN
79;; IF ALT+SHIFT was pressed THEN
80;; Set JB_KB_FLAG in SHARED_DATA_AREA
81;; Clear ALT and SHIFT states in KB_FLAG
82;; IRET or JMP to a chained INT48 routine
83;;
84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
85 ;;
86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
87;; Program Code
88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
89 ;;
90KEYB_INT_48 PROC ;;
91 ;;
92 STI ;; allow NON-KB interrupts
93 PUSH BX ;;
94 PUSH BP ;;
95 PUSH CX ;;
96 PUSH DX ;;
97 PUSH DI ;;
98 PUSH SI ;;
99 PUSH DS ;;
100 PUSH ES ;;
101 PUSH AX ;;
102 ;;
103 MOV SD.JR_KB_FLAG,0 ;; Clear the flag
104 ;;
105 CMP AL,80H ;; Test for break code
106 JA INT48_EXIT ;; IF not a break code THEN
107 ;;
108 PUSH DS ;; Save segment registers
109 PUSH ES ;;
110 ;;
111 PUSH CS ;; Set up addressing
112 POP DS ;; for DATA SEGMENT (=CODE SEGMENT)
113 MOV BX,DATA ;; Set up addressing
114 MOV ES,BX ;; for EXTRA SEGMENT (=BIOS RAM AREA)
115 ;;
116 MOV AH,KB_FLAG ;; Get the flag status
117 AND AH,0FH ;; Clear all shift states
118 ;;
119 TEST AH,CTL_SHIFT ;; Test if CNTL was entered?
120 JNE INT48_PASS ;;;;;;;;;;;;;;;; IF yes THEN
121 ;; pass to ROM INT48
122 AND AH,ALT_SHIFT+RIGHT_SHIFT+LEFT_SHIFT ;; Test if both ALT and
123 CMP AH,ALT_SHIFT ;; SHIFT were pressed
124 JBE INT48_PASS ;; IF no THEN
125 ;; pass to ROM INT48
126 MOV BH,KB_FLAG ;;;;;;;;;;;; IF yes then
127 MOV SD.JR_KB_FLAG,BH ;; Setup JR flag
128 AND SD.JR_KB_FLAG,ALT_SHIFT+RIGHT_SHIFT+LEFT_SHIFT ;; Pass flags
129 ;; (ALT and
130 ;;;;;;;;;;;;;;;;;;;;;;;;;; EITHER/BOTH SHIFT)
131 XOR KB_FLAG,AH ;; Clear the ALT state and SHIFT state
132 ;; Reset the KB_FLAG to permit
133 ;; third shifts to go through
134INT48_PASS: ;;
135 POP ES ;;
136 POP DS ;;
137 ;;;;;;;
138INT48_EXIT: ;;
139 CMP WORD PTR CS:SD.OLD_INT_48,0 ;; Q..are we the last in the chain?
140 JNE INT_48_JMP ;; N..call next in chain
141 CMP WORD PTR CS:SD.OLD_INT_48+2,0 ;; Q..are we the last in the chain?
142 JNE INT_48_JMP ;; N..call next in chain
143 ;;;;;;;
144 POP AX ;; restore regs
145 POP ES ;;
146 POP DS ;;
147 POP SI ;;
148 POP DI ;;
149 POP DX ;;
150 POP CX ;;
151 POP BP ;;
152 POP BX ;;
153 ;;
154 IRET ;; Y..return to caller
155 ;;
156INT_48_JMP: ;;
157 ;;
158 POP AX ;; restore regs
159 POP ES ;;
160 POP DS ;;
161 POP SI ;;
162 POP DI ;;
163 POP DX ;;
164 POP CX ;;
165 POP BP ;;
166 POP BX ;;
167 ;;
168 JMP CS:SD.OLD_INT_48 ;;
169 ;;
170KEYB_INT_48 ENDP ;;
171;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
172
173CODE ENDS
174 END
diff --git a/v4.0/src/CMD/KEYB/KEYBI48.INC b/v4.0/src/CMD/KEYB/KEYBI48.INC
new file mode 100644
index 0000000..592223c
--- /dev/null
+++ b/v4.0/src/CMD/KEYB/KEYBI48.INC
@@ -0,0 +1,27 @@
1
2.XLIST
3
4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5;; DOS - NLS Support - KEYB Command
6;; (C) Copyright 1988 Microsoft
7;;
8;; File Name: KEYBI48.INC
9;; ----------
10;;
11;; Description:
12;; ------------
13;; External declarations and equates for procedures in file
14;; KEYBI48.ASM
15;;
16;; Change History:
17;; ---------------
18;;
19;;
20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
21 ;;
22 EXTRN KEYB_INT_48:NEAR ;;
23 ;;
24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
25
26.LIST
27
diff --git a/v4.0/src/CMD/KEYB/KEYBI9.ASM b/v4.0/src/CMD/KEYB/KEYBI9.ASM
new file mode 100644
index 0000000..d32b096
--- /dev/null
+++ b/v4.0/src/CMD/KEYB/KEYBI9.ASM
@@ -0,0 +1,672 @@
1
2 PAGE ,132
3 TITLE DOS KEYB Command - Interrupt 9 Non-US Support
4
5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6;; DOS - NLS Support - KEYB Command
7;; (C) Copyright 1988 Microsoft
8;;
9;; File Name: KEYBI9.ASM
10;; ----------
11;;
12;; Description:
13;; ------------
14;; Converts scan codes to ASCII for non-US keyboards.
15;; This orutine uses the tables loaded into the SHARED_DATA_AREA
16;; from KEYBOARD.SYS by the KEYB_COMMAND module.
17;;
18;; Documentation Reference:
19;; ------------------------
20;; PC DOS 3.3 Detailed Design Document - May 1986
21;;
22;; Procedures Contained in This File:
23;; ----------------------------------
24;; KEYB_STATE_PROCESSOR - Scan to ASCII translator.
25;;
26;; External Procedure References:
27;; ------------------------------
28;; None.
29;;
30;; Linkage Information: Refer to file KEYB.ASM
31;; --------------------
32;;
33;; Change History:
34;; ---------------
35;;
36;;
37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
38 ;;
39;****
40 INCLUDE KEYBEQU.INC ;;
41 INCLUDE DSEG.inc ;; System data segments
42 INCLUDE POSTEQU.inc ;; System equates
43 INCLUDE KEYBSHAR.INC ;;
44 INCLUDE KEYBI2F.INC ;;
45 INCLUDE KEYBI9C.INC ;;
46 INCLUDE KEYBCPSD.INC ;;
47 INCLUDE KEYBCMD.INC ;;
48 ;;
49 PUBLIC KEYB_STATE_PROCESSOR ;;
50 ;;
51CODE SEGMENT PUBLIC 'CODE' ;;
52 ;;
53 ASSUME CS:CODE,DS:CODE ;;
54 ;;
55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
56;;
57;; Procedure: KEYB_STATE_PROCESSOR
58;;
59;; Description:
60;; Convert scan to ASCII using the tables loaded into the
61;; SHARED_DATA_AREA. Conversion is directed by the STATE LOGIC
62;; commands contained in the SHARED_DATA_AREA. This routine
63;; interprets those commands.
64;;
65;; Input Registers:
66;; N/A
67;;
68;; Output Registers:
69;; N/A
70;;
71;; Logic:
72;; Enable interrupts
73;; Save registers
74;;
75;;
76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
77 ;;
78BREAK_CODE EQU 80H ;;
79 ;;
80HOT_KEY_ACTIVE DB 0 ;; 1 if hot key is active
81 ;;
82 ;;
83 ;; These are copies of the BIOS FLAGS
84FLAGS_TO_TEST LABEL BYTE ;; KB_FLAG, KB_FLAG_1,2,3
85KB_SHADOW_FLAGS DB NUM_BIOS_FLAGS DUP(0) ;;
86EXT_KB_FLAG DB 0 ;; Extended KB Flag for shift states
87NLS_FLAG_1 DB 0 ;; NLS Flags for dead key etc
88NLS_FLAG_2 DB 0 ;; .
89 ;;
90SAVED_NLS_FLAGS DB 0,0 ;; Saved copy of the NLS flags
91 ;;
92OPTION_BYTE DB 0 ;; Set by OPTION command
93 ;;
94KB_FLAG_PTRS DW OFFSET KB_FLAG ;; These are pointers to the BIOS flags
95 DW OFFSET KB_FLAG_1 ;; we must test
96 DW OFFSET KB_FLAG_2 ;;
97 DW OFFSET KB_FLAG_3 ;;
98 ;;
99XLAT_TAB_PTR DW 0 ;; pointer to xlat tables for cur state
100 ;;
101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
102
103
104NEST_LEVEL DB 0 ;;
105PROCESS_LEVEL DB 0 ;;
106TAKE_ELSE DB 0 ;;
107BUSY_FLAG DB 0 ;; Flag to prevent re-entry
108 ;;
109CMD_JUMP_TABLE LABEL WORD ;;
110 DW OFFSET IFF_PROC ;; CODE 0
111 DW OFFSET ANDF_PROC ;; 1
112 DW OFFSET ELSEF_PROC ;; 2
113 DW OFFSET ENDIFF_PROC ;; 3
114 DW OFFSET XLATT_PROC ;; 4
115 DW OFFSET OPTION_PROC ;; 5
116 DW OFFSET SET_FLAG_PROC ;; 6
117 DW OFFSET PUT_ERROR_PROC ;; 7
118 DW OFFSET IFKBD_PROC ;; 8
119 DW OFFSET GOTO_PROC ;; 9
120 DW OFFSET BEEP_PROC ;; A
121 DW OFFSET RESET_NLS_PROC ;; B
122 DW OFFSET UNKNOWN_COMMAND ;; C
123 DW OFFSET UNKNOWN_COMMAND ;; D
124 DW OFFSET UNKNOWN_COMMAND ;; E
125 DW OFFSET UNKNOWN_COMMAND ;; F
126 ;;
127 ;;
128;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
129 ;;
130KEYB_STATE_PROCESSOR PROC NEAR ;;
131 ;;
132 TEST CS:SD.TABLE_OK,1 ;;
133 JNZ WE_HAVE_A_TABLE ;;
134 CLC ;; BACK TO US INT 9
135 RET ;;
136
137 EVEN
138
139WE_HAVE_A_TABLE: ;;
140
141 PUSH DS ;; save DS
142 PUSH ES ;; save ES
143 PUSH AX ;; save scan code for caller
144 PUSH BX ;; save shift states for caller
145
146 PUSH CS ;;
147 POP DS ;; DS = our seg
148 MOV BX,DATA ;;
149 MOV ES,BX ;; addressability to BIOS data
150 ;;
151 ;;
152 CMP COUNTRY_FLAG,0FFH ;; Q..country mode?
153 JE INIT_STATE_PROCESSING ;; Y..continue
154 JMP GOTO_BIOS ;; N..exit
155 ;;
156;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
157;; -------STATE SECTION PROCESSING-------
158;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
159 ;;
160INIT_STATE_PROCESSING: ;;
161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
162;; Set NLS shift flags EITHER_SHIFT, EITHER_ALT, EITHER_CTRL
163;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
164 ;;
165 ;; Q..in shift state?
166 TEST ES:KB_FLAG,RIGHT_SHIFT+LEFT_SHIFT
167 JNZ IN_SHIFT_STATE ;; Y..go set bit
168 AND EXT_KB_FLAG,NOT EITHER_SHIFT ;; N..clear bit
169 JMP SHORT TEST_CTL ;;
170IN_SHIFT_STATE: ;;
171 OR EXT_KB_FLAG,EITHER_SHIFT ;;
172TEST_CTL: ;;
173 TEST ES:KB_FLAG,CTL_SHIFT ;; Q..in control state?
174 JNZ IN_CTL_STATE ;; Y..go set bit
175 TEST ES:KB_FLAG_3,R_CTL_SHIFT ;; Q..how bout the right ctl?
176 JNZ IN_CTL_STATE ;; Y..go set the bit
177 AND EXT_KB_FLAG,NOT EITHER_CTL ;; N..clear the bit
178 JMP SHORT TEST_ALT ;;
179IN_CTL_STATE: ;;
180 OR EXT_KB_FLAG,EITHER_CTL ;;
181TEST_ALT: ;;
182 TEST ES:KB_FLAG,ALT_SHIFT ;; Q..in alt state?
183 JNZ IN_ALT_STATE ;; Y..go set bit
184 TEST ES:KB_FLAG_3,R_ALT_SHIFT ;; Q..how bout the right alt?
185 JNZ IN_ALT_STATE ;; Y..go set the bit
186 AND EXT_KB_FLAG,NOT EITHER_ALT ;; N..clear the bit
187 JMP SHORT COPY_FLAGS ;;
188IN_ALT_STATE: ;;
189 OR EXT_KB_FLAG,EITHER_ALT ;;
190 ;;
191;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
192;; Copy BIOS KB flags from BIOS data seg into the
193;; FLAGS_TO_TEST structure.
194;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
195 ;;
196COPY_FLAGS: ;;
197 MOV CX,NUM_BIOS_FLAGS ;;
198 MOV SI,0 ;; pointers to the BIOS flags
199 MOV DI,0 ;; create shadow copies
200MOVE_NEXT_FLAG: ;;
201 MOV BX,KB_FLAG_PTRS[SI] ;; pointer to next flag
202 MOV AL,ES:[BX] ;; flag in AL
203 MOV KB_SHADOW_FLAGS[DI],AL ;; save it in the shadow table
204 INC DI ;;
205 INC SI ;;
206 INC SI ;;
207 LOOP MOVE_NEXT_FLAG ;;
208 ;;
209;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
210;; Interpret State Logic Commands
211;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
212 ;;
213PROCESS_STATES: ;;
214 MOV OPTION_BYTE,0 ;; clear options
215 MOV SI,SD.LOGIC_PTR ;;
216 LEA SI,[SI].SL_LOGIC_CMDS ;;
217NEXT_COMMAND: ;;
218 MOV BL,[SI] ;; command byte in BL
219 SHR BL,1 ;;
220 SHR BL,1 ;;
221 SHR BL,1 ;;
222 SHR BL,1 ;; ISOLATE COMMAND CODE
223 SHL BL,1 ;; command code * 2
224 JMP CMD_JUMP_TABLE[BX] ;; go process command
225UNKNOWN_COMMAND: ;;
226 JMP FATAL_ERROR ;; bad news
227 ;;
228 ;;
229;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
230IFKBD_PROC: ;;
231 MOV AL,NEST_LEVEL ;;
232 CMP AL,PROCESS_LEVEL ;; Q..nest level = process level?
233 JNE IFKBD_DONE ;; N..don't process
234
235 MOV AX,[SI+1] ;; Keyboard Type Flag
236 ;;
237 TEST SD.KEYB_TYPE,AX ;; Q..are we the right system?
238 JNZ IFKBD_TEST_OK ;; Y..
239IFKBD_TEST_FAILED: ;;
240 MOV TAKE_ELSE,YES ;; test failed - take ELSE
241 JMP SHORT IFKBD_DONE ;;
242IFKBD_TEST_OK: ;;
243 INC PROCESS_LEVEL ;; process commands within IF
244 MOV TAKE_ELSE,NO ;;
245IFKBD_DONE: ;;
246 INC NEST_LEVEL ;; IFKBD increments nest level
247 INC SI ;; bump past IFKBD
248 INC SI ;;
249 INC SI ;;
250 JMP NEXT_COMMAND ;;
251 ;;
252;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
253 ;;
254PUT_ERROR_PROC: ;;
255 MOV AL,NEST_LEVEL ;;
256 CMP AL,PROCESS_LEVEL ;; Q..nest level = process level?
257 JNE PUT_ERROR_DONE ;; N..don't process
258 MOV DI,SD.ACTIVE_XLAT_PTR ;; pointer to active Xlat Section
259 MOV AL,[SI+1] ;; state id in AL
260 CALL PUT_ERROR ;; check active section
261 JC PUT_ERROR_DONE ;; carry set if translation found
262 MOV DI,SD.COMMON_XLAT_PTR ;; check common Xlat Section
263 MOV AL,[SI+1] ;; state id for XLATT in AL
264 CALL PUT_ERROR ;;
265 ;;
266PUT_ERROR_DONE: ;;
267 INC SI ;;
268 INC SI ;;
269 JMP NEXT_COMMAND ;;
270 ;;
271PUT_ERROR PROC ;;
272;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
273;; Search for a state whose ID matches the ID
274;; on the PUT_ERROR command
275;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
276 ;;
277 CLC ;;
278 LEA DI,[DI].XS_FIRST_STATE ;; point to first state in section
279PE_NEXT_STATE: ;;
280 CMP [DI].XS_STATE_LEN,0 ;; Q..out of states?
281 JE PE_EXIT ;; Y..exit
282 CMP AL,[DI].XS_STATE_ID ;; Q..is this the requested state?
283 JE PE_STATE_MATCH ;;
284 ADD DI,[DI].XS_STATE_LEN ;; N..check next state
285 JMP SHORT PE_NEXT_STATE ;;
286 ;;
287PE_STATE_MATCH: ;;
288 MOV AX,[DI].XS_ERROR_CHAR ;; get error char in AX
289 CALL BUFFER_FILL ;;
290 STC ;; indicate that we found the state
291PE_EXIT: ;;
292 RET ;;
293 ;;
294PUT_ERROR ENDP ;;
295 ;;
296;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
297 ;;
298GOTO_BIOS: ;;
299 CLC ;; clear carry flag indicating
300 POP BX ;; we should continue INT 9
301 POP AX ;; processing
302 POP ES ;;
303 POP DS ;;
304 RET ;;
305 ;;
306;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
307 ;;
308IFF_PROC: ;;
309 MOV AL,NEST_LEVEL ;;
310 CMP AL,PROCESS_LEVEL ;; Q..nest level = process level?
311 JNE IFF_DONE ;; N..don't process IFF
312 MOV BL,[SI] ;; command byte
313 AND BL,FLAG_ID_BITS ;; isolate flag id
314 XOR BH,BH ;;
315 MOV AL,FLAGS_TO_TEST[BX] ;; flag in AL
316 TEST BYTE PTR[SI],NOT_TEST ;; Q..is this a NOT test?
317 JNZ ITS_A_NOT ;;
318 TEST AL,[SI]+1 ;; Y..check for bit set
319 JNZ IFF_MATCH ;;
320 JZ IFF_NO_MATCH ;;
321ITS_A_NOT: ;;
322 TEST AL,[SI]+1 ;; Y..check for bit clear
323 JZ IFF_MATCH ;;
324IFF_NO_MATCH: ;;
325 MOV TAKE_ELSE,YES ;; flag test failed - take ELSE
326 JMP SHORT IFF_DONE ;;
327IFF_MATCH: ;;
328 INC PROCESS_LEVEL ;; process commands within IF
329 MOV TAKE_ELSE,NO ;;
330 ;;
331IFF_DONE: ;;
332 INC NEST_LEVEL ;; IFF increments nest level
333 INC SI ;; bump past IFF
334 INC SI ;;
335 JMP NEXT_COMMAND ;;
336 ;;
337;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
338 ;;
339ELSEF_PROC: ;;
340 MOV AL,PROCESS_LEVEL ;;
341 CMP AL,NEST_LEVEL ;; Q..nest level = process level?
342 JNE CHECK_TAKE_ELSEF ;; N..check for take_else
343 DEC PROCESS_LEVEL ;; Y..we just finished the "IF" block
344 JMP ELSEF_DONE ;; so we are finished with IFF/ELSEF
345CHECK_TAKE_ELSEF: ;;
346 CMP TAKE_ELSE,YES ;; Q..are we scanning for ELSE?
347 JNE ELSEF_DONE ;; N..done
348 DEC NEST_LEVEL ;; ELSEF itself is back a level
349 CMP AL,NEST_LEVEL ;; Q..nest level = process level?
350 JNE NOT_THIS_ELSEF ;; N..this else is not the one
351 INC PROCESS_LEVEL ;; Y..process ELSEF block
352 MOV TAKE_ELSE,NO ;; reset
353NOT_THIS_ELSEF: ;;
354 INC NEST_LEVEL ;; stuff within the ELSEF is up a level
355 ;;
356ELSEF_DONE: ;;
357 INC SI ;; bump past ELSEF
358 JMP NEXT_COMMAND ;;
359 ;;
360;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
361ENDIFF_PROC: ;;
362 MOV AL,PROCESS_LEVEL ;;
363 CMP AL,NEST_LEVEL ;; Q..nest level = process level?
364 JNE ENDIFF_DONE ;; N..don't adjust process level
365 DEC PROCESS_LEVEL ;; Y..we just finished the IF/ELSE
366ENDIFF_DONE: ;;
367 DEC NEST_LEVEL ;; ENDIF decrements nest level
368 INC SI ;; bump past ENDIF
369 JMP NEXT_COMMAND ;;
370 ;;
371;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
372;; Translations may be in the Common or Specific
373;; Sections. Search the Specific section first
374;; then the common section.
375;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
376XLATT_PROC: ;;
377 MOV AL,PROCESS_LEVEL ;;
378 CMP AL,NEST_LEVEL ;; Q..nest level = process level?
379 JNE XLATT_DONE ;; N..next command
380 MOV DI,SD.ACTIVE_XLAT_PTR ;; pointer to active Xlat Section
381 MOV AL,[SI+1] ;; state id for XLATT in AL
382 CALL TRANSLATE ;; check active section
383 JC XLATT_FOUND ;; carry set if translation found
384 MOV DI,SD.COMMON_XLAT_PTR ;; check common Xlat Section
385 MOV AL,[SI+1] ;; state id for XLATT in AL
386 CALL TRANSLATE ;;
387 JNC XLATT_DONE ;;
388XLATT_FOUND: ;;
389 OR EXT_KB_FLAG,SCAN_MATCH ;; set flag indicating scan matched
390 TEST OPTION_BYTE,EXIT_IF_FOUND ;; Q..exit
391 JZ XLATT_DONE ;;
392 JMP EXIT ;; Y..BYE
393 ;;
394XLATT_DONE: ;;
395 INC SI ;;
396 INC SI ;;
397 JMP NEXT_COMMAND ;;
398 ;;
399TRANSLATE PROC ;;
400;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
401;; Search for a state whose ID matches the ID
402;; on the XLATT command
403;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
404 ;;
405 CLC ;;
406 LEA DI,[DI].XS_FIRST_STATE ;; point to first state in section
407TP_NEXT_STATE: ;;
408 CMP [DI].XS_STATE_LEN,0 ;; Q..out of states?
409 JE TP_EXIT ;; Y..exit
410 CMP AL,[DI].XS_STATE_ID ;; Q..is this the requested state?
411 JE TP_STATE_MATCH ;;
412 ADD DI,[DI].XS_STATE_LEN ;; N..check next state
413 JMP SHORT TP_NEXT_STATE ;;
414 ;;
415TP_STATE_MATCH: ;;
416 AND EXT_KB_FLAG,NOT SCAN_MATCH ;; reset flag before search
417 PUSH SI ;; save pointer to next command
418 LEA SI,[DI].XS_FIRST_TAB ;; point to first xlat table
419 MOV XLAT_TAB_PTR,SI ;; start of XLAT tables
420 MOV AL,SCAN_CODE ;; restore incoming scan code
421 JMP SHORT NEXT_XLAT_TAB ;;
422TP_DONE: ;; return here from XLAT
423 POP SI ;;
424TP_EXIT: ;;
425 RET ;;
426 ;;
427;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
428;; Check xlate tables for matching scan code
429;; The xlate table can be in one of two forms:
430;; Type 1 = Table contains buffer entries only.
431;; Scan code is used as an index into xlat table
432;; Type 2 = Table contains pairs of SCAN/BUFFER_ENTRY.
433;; Table must be searched for matching scan.
434;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
435 ;;
436NEXT_XLAT_TAB: ;;
437 MOV SI,XLAT_TAB_PTR ;; pointer to xlat tables
438 CMP [SI].XLAT_TAB_SIZE,0 ;; Q..any more xlat tables?
439 JNE PROCESS_XLAT_TAB ;; Y..check um
440 JMP TP_DONE ;; N..done
441PROCESS_XLAT_TAB: ;;
442 MOV DL,[SI].XLAT_OPTIONS ;; save translate options IN DL
443 MOV BX,[SI].XLAT_TAB_SIZE ;; Y..calc pointer to next xlat tab
444 ADD BX,SI ;;
445 MOV XLAT_TAB_PTR,BX ;; pointer to next xlat tab
446 TEST DL,TYPE_2_TAB ;; Q..is this a type 2 table?
447 JZ TYPE_1_LOOKUP ;; N..go do table lookup
448TYPE_2_SEARCH: ;; Y..search table
449 XOR CH,CH ;;
450 MOV CL,[SI].XLAT_NUM ;; number of xlat entries
451 MOV BX,DEFAULT_TAB_2_ENT_SZ ;; default entry size
452 TEST DL,ASCII_ONLY+ZERO_SCAN ;; Q..are buffer entries ASCII only?
453 JZ NEXT_TAB_2_ENTRY ;; N..continue
454 MOV BX,ASC_ONLY_TAB_2_ENT_SZ ;; Y..set size in BX
455NEXT_TAB_2_ENTRY: ;; entry size is in BX
456 CMP CX,0 ;; Q..last entry?
457 JE NEXT_XLAT_TAB ;; y..go to next table
458 CMP AL,[SI].XLAT_SCAN ;; Q..scan match?
459 JE FOUND_TAB_2_ENTRY ;; Y..go create buffer entry
460 ADD SI,BX ;; point to next entry
461 LOOP NEXT_TAB_2_ENTRY ;;
462 JMP SHORT NEXT_XLAT_TAB ;;
463FOUND_TAB_2_ENTRY: ;; Q..set scan code to 0?
464 MOV AH,AL ;; default scan code in AH
465 MOV AL,[SI].XLAT_2_BUF_ENTRY ;; ASCII code from table in AL
466 TEST DL,ASCII_ONLY+ZERO_SCAN ;; Q..are buffer entries ASCII only?
467 JNZ BUFFER_ENTRY_READY ;; Y..buffer entry is ready
468 MOV AH,[SI].XLAT_2_BUF_ENTRY+1 ;; N..scan code from table as well
469 JMP SHORT BUFFER_ENTRY_READY ;; go put entry in buffer
470 ;;
471TYPE_1_LOOKUP: ;;
472 CMP AL,[SI].XLAT_SCAN_LO ;; Q..is scan in range of this table?
473 JB NEXT_XLAT_TAB ;; N..next table
474 CMP AL,[SI].XLAT_SCAN_HI ;; Q..is scan in range of this table?
475 JA NEXT_XLAT_TAB ;; N..next table
476 SUB AL,[SI].XLAT_SCAN_LO ;; convert scan code to xlat index
477 TEST DL,ASCII_ONLY+ZERO_SCAN ;; Q..ASCII only in xlat ?
478 JZ TWO_BYTE_LOOKUP ;; N..go do 2-byte lookup
479 LEA BX,[SI].XLAT_1_BUF_ENTRY ;; Y..do 1-byte lookup
480 XLAT [SI].XLAT_1_BUF_ENTRY ;; ASCII code in AL
481 MOV AH,SCAN_CODE ;; SCAN in AH
482 JMP SHORT BUFFER_ENTRY_READY ;; go put entry in buffer
483TWO_BYTE_LOOKUP: ;;
484 MOV BL,2 ;; multiply scan index
485 MUL BL ;; by two
486 MOV BX,AX ;; real index in BX
487 MOV AX,WORD PTR [SI].XLAT_1_BUF_ENTRY[BX] ;; get 2-byte buffer entry
488 ;; AL=ASCII AH=SCAN
489BUFFER_ENTRY_READY: ;;
490 TEST DL,ZERO_SCAN ;; Q..set scan part to zero?
491 JZ NO_ZERO_SCAN ;; N..
492 XOR AH,AH ;; scan = 0
493NO_ZERO_SCAN: ;;
494 CALL BUFFER_FILL ;; go put entry in buffer
495 STC ;; indicate translation found
496 JMP TP_DONE ;;
497 ;;
498TRANSLATE ENDP ;;
499 ;;
500;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
501OPTION_PROC: ;;
502 MOV AL,PROCESS_LEVEL ;;
503 CMP AL,NEST_LEVEL ;; Q..nest level = process level?
504 JNE DONE_OPTION ;; N..done
505 MOV AL,[SI]+1 ;; mask in AL
506 TEST BYTE PTR[SI],NOT_TEST ;; Q..is this a NOT?
507 JNZ AND_MASK ;;
508 OR OPTION_BYTE,AL ;; N..OR in the mask bits
509 JMP DONE_OPTION ;;
510AND_MASK: ;;
511 NOT AL ;;
512 AND OPTION_BYTE,AL ;; Y..AND out the mask bits
513DONE_OPTION: ;;
514 INC SI ;;
515 INC SI ;;
516 JMP NEXT_COMMAND ;;
517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
518RESET_NLS_PROC: ;;
519 MOV AL,NEST_LEVEL ;;
520 CMP AL,PROCESS_LEVEL ;; Q..nest level = process level?
521 JNE RN_DONE ;; N..don't process
522 MOV NLS_FLAG_1,0 ;;
523 MOV NLS_FLAG_2,0 ;;
524RN_DONE: ;;
525 INC SI ;;
526 JMP NEXT_COMMAND ;;
527;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
528BEEP_PROC: ;;
529 MOV AL,NEST_LEVEL ;;
530 CMP AL,PROCESS_LEVEL ;; Q..nest level = process level?
531 JNE BP_DONE ;; N..don't process
532 MOV BEEP_PENDING,YES ;; set beep pending flag. the beep
533 ;; will be done just before iret
534BP_DONE: ;;
535 INC SI ;;
536 JMP NEXT_COMMAND ;;
537;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
538GOTO_PROC: ;;
539 MOV AL,NEST_LEVEL ;;
540 CMP AL,PROCESS_LEVEL ;; Q..nest level = process level?
541 JNE GOTO_DONE ;; N..don't process
542 MOV BL,[SI] ;; command byte in BL
543 AND BL,NOT COMMAND_BITS ;; remove command code
544 OR BL,BL ;; Q..goto label?
545 JZ GOTO_LABEL ;; Y..go jump
546 CMP BL,EXIT_INT_9_FLAG ;; Q..SPECIAL - Exit Int 9?
547 JNE NOT_EXIT_INT_9 ;; N..
548 JMP EXIT ;; Y..bye bye
549NOT_EXIT_INT_9: ;;
550 CMP BL,EXIT_STATE_LOGIC_FLAG ;; Q..SPECIAL - Exit State Logic?
551 JNE NOT_EXIT_S_L ;; N..
552 JMP GOTO_BIOS ;; Y..goto bios
553NOT_EXIT_S_L: ;;
554 JMP FATAL_ERROR ;; garbage in that command
555GOTO_LABEL: ;;
556 ADD SI,[SI]+1 ;; bump by relative offset
557 MOV PROCESS_LEVEL,0 ;; reset process and nest level
558 MOV NEST_LEVEL,0 ;;
559GOTO_DONE: ;;
560 ADD SI,3 ;; bump to next command
561 JMP NEXT_COMMAND ;;
562;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
563 ;;
564ANDF_PROC: ;;
565 MOV AL,NEST_LEVEL ;;
566 CMP AL,PROCESS_LEVEL ;; Q..nest level = process level?
567 JNE ANDF_DONE ;; N..don't process ANDF
568 MOV BL,[SI] ;; command byte
569 AND BL,FLAG_ID_BITS ;; isolate flag id
570 XOR BH,BH ;;
571 MOV AL,FLAGS_TO_TEST[BX] ;; flag in AL
572 TEST BYTE PTR[SI],NOT_TEST ;; Q..is this a NOT test?
573 JNZ ANDF_NOT ;;
574 TEST AL,[SI]+1 ;; Y..check for bit set
575 JNZ ANDF_DONE ;; if set then remain in IFF
576 JZ ANDF_NO_MATCH ;;
577ANDF_NOT: ;;
578 TEST AL,[SI]+1 ;; Y..check for bit clear
579 JZ ANDF_DONE ;; if clear then remain in IFF
580ANDF_NO_MATCH: ;;
581 MOV TAKE_ELSE,YES ;; flag test failed - take ELSE
582 DEC PROCESS_LEVEL ;; IFF would have inc'd - so dec
583ANDF_DONE: ;;
584 INC SI ;; bump past ANDF
585 INC SI ;;
586 JMP NEXT_COMMAND ;;
587 ;;
588;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
589;; SET_FLAG Command.
590;; Flag Table must be in the Common Section
591;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
592 ;;
593SET_FLAG_PROC: ;;
594 MOV AL,NEST_LEVEL ;;
595 CMP AL,PROCESS_LEVEL ;; Q..nest level = process level?
596 JNE SF_DONE ;; N..don't process
597 ;;
598 MOV DI,SD.COMMON_XLAT_PTR ;; check common Xlat Section
599 MOV AL,[SI+1] ;; state id in AL
600 LEA DI,[DI].XS_FIRST_STATE ;; point to first state in section
601SF_NEXT_STATE: ;;
602 CMP [DI].XS_STATE_LEN,0 ;; Q..out of states?
603 JE SF_DONE ;; Y..exit
604 CMP AL,[DI].XS_STATE_ID ;; Q..is this the requested state?
605 JE SF_STATE_MATCH ;;
606 ADD DI,[DI].XS_STATE_LEN ;; N..check next state
607 JMP SHORT SF_NEXT_STATE ;;
608 ;;
609SF_STATE_MATCH: ;;
610 AND EXT_KB_FLAG,NOT SCAN_MATCH ;; reset flag before search
611 PUSH SI ;; save pointer to next command
612 LEA SI,[DI].XS_FIRST_TAB ;; point to table
613 MOV AL,SCAN_CODE ;; restore incoming scan code
614 MOV CX,[SI] ;; number of entries
615 CMP CX,0 ;; Q..any entries?
616 JE SF_RESTORE ;; N..done
617 INC SI ;; Y..Bump to first entry
618 INC SI ;;
619NEXT_SF_ENTRY: ;;
620 CMP AL,[SI] ;; Q..scan match?
621 JE FOUND_SF_ENTRY ;; Y..go set flag
622 ADD SI,3 ;; point to next entry
623 LOOP NEXT_SF_ENTRY ;;
624 JMP SHORT SF_RESTORE ;; no match found
625FOUND_SF_ENTRY: ;;
626 MOV NLS_FLAG_1,0 ;; clear all NLS bits
627 MOV NLS_FLAG_2,0 ;;
628 MOV BL,[SI]+1 ;; flag id in BX
629 XOR BH,BH ;;
630 MOV AL,[SI]+2 ;; mask in AL
631 OR FLAGS_TO_TEST[BX],AL ;; set the bit
632 OR EXT_KB_FLAG,SCAN_MATCH ;; set flag indicating scan matched
633 TEST OPTION_BYTE,EXIT_IF_FOUND ;; Q..exit
634 JZ SF_RESTORE ;;
635 POP SI ;;
636 JMP EXIT ;;
637SF_RESTORE: ;;
638 POP SI ;;
639SF_DONE: ;;
640 INC SI ;; bump past command
641 INC SI ;;
642 JMP NEXT_COMMAND ;;
643 ;;
644 ;;
645;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
646;; Fatal Error routine. Come here when
647;; we have a critical error such as an
648;; invalid State Logic Command.
649;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
650 ;;
651FATAL_ERROR: ;;
652 JMP SHORT EXIT ;; end the int 9 processing
653 ;;
654;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
655;; Exit point.
656;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
657 ;;
658EXIT: ;;
659 MOV BUSY_FLAG,NO ;;
660 STC ;; indicate we should end INT 9
661 POP BX ;; processing
662 POP AX ;;
663 POP ES ;;
664 POP DS ;;
665 RET ;;
666 ;;
667KEYB_STATE_PROCESSOR ENDP ;;
668 ;;
669 ;;
670
671CODE ENDS
672 END
diff --git a/v4.0/src/CMD/KEYB/KEYBI9.INC b/v4.0/src/CMD/KEYB/KEYBI9.INC
new file mode 100644
index 0000000..0541cb9
--- /dev/null
+++ b/v4.0/src/CMD/KEYB/KEYBI9.INC
@@ -0,0 +1,29 @@
1.XLIST
2
3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4;; DOS - NLS Support - KEYB Command
5;; (C) Copyright 1988 Micrsoft
6;;
7;; File Name: KEYBI9.INC
8;; ----------
9;;
10;; Root File Name: KEYB.ASM
11;; ---------------
12;;
13;; Description:
14;; ------------
15;; External declarations and equates for procedures in file
16;; KEYBI9.ASM
17;;
18;; Change History:
19;; ---------------
20;;
21;;
22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
23 ;;
24 EXTRN KEYB_STATE_PROCESSOR:NEAR
25 ;;
26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
27
28.LIST
29
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
diff --git a/v4.0/src/CMD/KEYB/KEYBI9C.INC b/v4.0/src/CMD/KEYB/KEYBI9C.INC
new file mode 100644
index 0000000..7848a1b
--- /dev/null
+++ b/v4.0/src/CMD/KEYB/KEYBI9C.INC
@@ -0,0 +1,41 @@
1.XLIST
2
3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4;; DOS - NLS Support - KEYB Command
5;; (C) Copyright 1988 Microsoft
6;;
7;; File Name: KEYBI9C.INC
8;; ----------
9;;
10;; Root File Name: KEYB.ASM
11;; ---------------
12;;
13;; Description:
14;; ------------
15;; External declarations and equates for procedures in file
16;; KEYBI9C.ASM
17;;
18;; Change History:
19;; ---------------
20;;
21;;
22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
23 ;;
24 EXTRN KEYB_INT_9:NEAR ;;
25 EXTRN BUFFER_FILL:NEAR ;;
26 EXTRN ERROR_BEEP :NEAR ;;
27 EXTRN COUNTRY_FLAG:BYTE ;;
28 EXTRN BEEP_PENDING:BYTE ;;
29 EXTRN SCAN_CODE:BYTE ;;
30 EXTRN K8:BYTE ;;
31 EXTRN TEMP_HEAD:WORD ;;
32 EXTRN TEMP_TAIL:WORD ;;
33 EXTRN BUSY_TFLAG:BYTE ;;
34 EXTRN MYBUFF:BYTE ;;
35 EXTRN ENABLE_FL:BYTE ;;
36 EXTRN NEW_BUFF_CTR :BYTE ;;
37 ;;
38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
39
40.LIST
41
diff --git a/v4.0/src/CMD/KEYB/KEYBMAC.INC b/v4.0/src/CMD/KEYB/KEYBMAC.INC
new file mode 100644
index 0000000..5666666
--- /dev/null
+++ b/v4.0/src/CMD/KEYB/KEYBMAC.INC
@@ -0,0 +1,319 @@
1.XLIST
2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3;; DOS - NLS Support - Keyboard Definition File
4;; (C) Copyright 1988 Microsoft
5;;
6;; File Name: KEYBMAC.INC
7;; ----------
8;;
9;; Description:
10;; ------------
11;; Include file containing macros for the Keyboard Definition File.
12;;
13;; Change History:
14;; ---------------
15;;
16;;
17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
18 ;;
19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
20;; Dead key flags
21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
22 ;;
23ACUTE EQU 80H ;; NLS_FLAG_1
24GRAVE EQU 40H ;;
25DIARESIS EQU 20H ;;
26CIRCUMFLEX EQU 10H ;;
27CEDILLA EQU 08H ;;
28TILDE EQU 04H ;;
29 ;; NLS_FLAG_2 : nothing defined yet
30 ;;
31 ;;
32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
33;; State IDs
34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
35 ;;
36DEAD_LOWER EQU 1 ;; dead keys on lower shift
37DEAD_UPPER EQU 2 ;;
38ALPHA_LOWER EQU 3 ;;
39ALPHA_UPPER EQU 4 ;;
40NON_ALPHA_LOWER EQU 5 ;;
41NON_ALPHA_UPPER EQU 6 ;;
42THIRD_SHIFT EQU 7 ;;
43ACUTE_LOWER EQU 8 ;;
44ACUTE_UPPER EQU 9 ;;
45ACUTE_SPACE EQU 10 ;;
46GRAVE_LOWER EQU 11 ;;
47GRAVE_UPPER EQU 12 ;;
48GRAVE_SPACE EQU 13 ;;
49DIARESIS_LOWER EQU 14 ;;
50DIARESIS_UPPER EQU 15 ;;
51DIARESIS_SPACE EQU 16 ;;
52CIRCUMFLEX_LOWER EQU 17 ;;
53CIRCUMFLEX_UPPER EQU 18 ;;
54CIRCUMFLEX_SPACE EQU 19 ;;
55CEDILLA_LOWER EQU 20 ;;
56CEDILLA_UPPER EQU 21 ;;
57CEDILLA_SPACE EQU 22 ;;
58CEDILLA_CEDILLA EQU 23 ;;
59DEAD_THIRD EQU 24 ;;
60ACUTE_ACUTE EQU 25 ;;
61GRAVE_GRAVE EQU 26 ;;
62DIARESIS_DIARESIS EQU 27 ;;
63CIRCUMFLEX_CIRCUMFLEX EQU 28 ;;
64FOURTH_SHIFT EQU 29 ;;
65DEAD_FOURTH EQU 30 ;;
66TILDE_LOWER EQU 31 ;;
67TILDE_UPPER EQU 32 ;;
68TILDE_SPACE EQU 33 ;;
69ALT_CASE EQU 34 ;;
70CTRL_CASE EQU 35 ;;
71NUMERIC_PAD EQU 36 ;;
72DIVIDE_SIGN EQU 37 ;;
73 ;;
74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
75;; Logic Macros
76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
77 ;;
78
79UNKNOWN = 255
80
81FIND_FLAG MACRO FLAG_MASK
82 IFIDN <FLAG_MASK>,<SCAN_MATCH>
83 FLAG_ID = EXT_KB_FLAG_ID
84 ELSE
85 IFIDN <FLAG_MASK>,<EITHER_SHIFT>
86 FLAG_ID = EXT_KB_FLAG_ID
87 ELSE
88 IFIDN <FLAG_MASK>,<CAPS_STATE>
89 FLAG_ID = KB_FLAG_ID
90 ELSE
91 IFIDN <FLAG_MASK>,<NUM_STATE>
92 FLAG_ID = KB_FLAG_ID
93 ELSE
94 IFIDN <FLAG_MASK>,<EITHER_CTL>
95 FLAG_ID = EXT_KB_FLAG_ID
96 ELSE
97 IFIDN <FLAG_MASK>,<EITHER_ALT>
98 FLAG_ID = EXT_KB_FLAG_ID
99 ELSE
100 IFIDN <FLAG_MASK>,<LEFT_SHIFT>
101 FLAG_ID = KB_FLAG_ID
102 ELSE
103 IFIDN <FLAG_MASK>,<RIGHT_SHIFT>
104 FLAG_ID = KB_FLAG_ID
105 ELSE
106 IFIDN <FLAG_MASK>,<ALT_SHIFT>
107 FLAG_ID = KB_FLAG_ID
108 ELSE
109 IFIDN <FLAG_MASK>,<CTL_SHIFT>
110 FLAG_ID = KB_FLAG_ID
111 ELSE
112 IFIDN <FLAG_MASK>,<R_ALT_SHIFT>
113 FLAG_ID = KB_FLAG_3_ID
114 ELSE
115 IFIDN <FLAG_MASK>,<R_CTL_SHIFT>
116 FLAG_ID = KB_FLAG_3_ID
117 ELSE
118 IFIDN <FLAG_MASK>,<TILDE>
119 FLAG_ID = NLS_FLAG_1_ID
120 ELSE
121 IFIDN <FLAG_MASK>,<ACUTE>
122 FLAG_ID = NLS_FLAG_1_ID
123 ELSE
124 IFIDN <FLAG_MASK>,<GRAVE>
125 FLAG_ID = NLS_FLAG_1_ID
126 ELSE
127 IFIDN <FLAG_MASK>,<DIARESIS>
128 FLAG_ID = NLS_FLAG_1_ID
129 ELSE
130 IFIDN <FLAG_MASK>,<CEDILLA>
131 FLAG_ID = NLS_FLAG_1_ID
132 ELSE
133 IFIDN <FLAG_MASK>,<CIRCUMFLEX>
134 FLAG_ID = NLS_FLAG_1_ID
135 ELSE
136 IFIDN <FLAG_MASK>,<LC_E0>
137 FLAG_ID = KB_FLAG_3_ID
138 ELSE
139 FLAG_ID = UNKNOWN
140 ENDIF
141 ENDIF
142 ENDIF
143 ENDIF
144 ENDIF
145 ENDIF
146 ENDIF
147 ENDIF
148 ENDIF
149 ENDIF
150 ENDIF
151 ENDIF
152 ENDIF
153 ENDIF
154 ENDIF
155 ENDIF
156 ENDIF
157 ENDIF
158 ENDIF
159 ENDM
160
161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
162FLAG MACRO FLAG_MASK
163 FIND_FLAG FLAG_MASK
164 IF (FLAG_ID EQ UNKNOWN)
165 IF2
166 %OUT Unknown parameter FLAG_MASK on FLAG MACRO
167 ENDIF
168 ELSE
169 DB FLAG_ID
170 DB FLAG_MASK
171 ENDIF
172 ENDM
173
174;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
175IFF MACRO FLAG_MASK,MASK_TYPE
176 MAC_OK = 1
177 IFB <MASK_TYPE>
178 NOT_BIT = 00000000B
179 ELSE
180 IFIDN <MASK_TYPE>,<NOT>
181 NOT_BIT = 00001000B
182 ELSE
183 MAC_OK = 0
184 IF2
185 %OUT Unknown parameter MASK_TYPE on IFF MACRO
186 ENDIF
187 ENDIF
188 ENDIF
189 IF MAC_OK
190 FIND_FLAG FLAG_MASK
191 IF (FLAG_ID EQ UNKNOWN)
192 IF2
193 %OUT Unknown parameter FLAG_MASK on IFF MACRO
194 ENDIF
195 ELSE
196 DB IFF_COMMAND+NOT_BIT+FLAG_ID
197 DB FLAG_MASK
198 ENDIF
199 ENDIF
200 ENDM
201
202;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
203IFKBD MACRO SYS
204 DB IFKBD_COMMAND
205 DW SYS
206 ENDM
207
208;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
209ANDF MACRO FLAG_MASK,MASK_TYPE
210 MAC_OK = 1
211 IFB <MASK_TYPE>
212 NOT_BIT = 00000000B
213 ELSE
214 IFIDN <MASK_TYPE>,<NOT>
215 NOT_BIT = 00001000B
216 ELSE
217 MAC_OK = 0
218 IF2
219 %OUT Unknown parameter MASK_TYPE on ANDF MACRO
220 ENDIF
221 ENDIF
222 ENDIF
223 IF MAC_OK
224 FIND_FLAG FLAG_MASK
225 IF (FLAG_ID EQ UNKNOWN)
226 IF2
227 %OUT Unknown parameter FLAG_MASK on ANDF MACRO
228 ENDIF
229 ELSE
230 DB ANDF_COMMAND+NOT_BIT+FLAG_ID
231 DB FLAG_MASK
232 ENDIF
233 ENDIF
234 ENDM
235
236;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
237ELSEF MACRO
238 DB ELSEF_COMMAND
239 ENDM
240
241;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
242ENDIFF MACRO
243 DB ENDIFF_COMMAND
244 ENDM
245
246;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
247XLATT MACRO STATE
248 DB XLATT_COMMAND
249 DB STATE
250 ENDM
251
252;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
253PUT_ERROR_CHAR MACRO STATE
254 DB PUT_ERROR_COMMAND
255 DB STATE
256 ENDM
257
258;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
259OPTION MACRO MASK,MASK_TYPE
260 MAC_OK = 1
261 IFB <MASK_TYPE>
262 NOT_BIT = 00000000B
263 ELSE
264 IFIDN <MASK_TYPE>,<NOT>
265 NOT_BIT = 00001000B
266 ELSE
267 MAC_OK = 0
268 IF2
269 %OUT Unknown parameter MASK_TYPE on OPTION MACRO
270 ENDIF
271 ENDIF
272 ENDIF
273 IF MAC_OK
274 DB OPTION_COMMAND+NOT_BIT
275 DB MASK
276 ENDIF
277 ENDM
278
279;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
280SET_FLAG MACRO STATE
281 DB SET_FLAG_COMMAND
282 DB STATE
283 ENDM
284
285;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
286RESET_NLS MACRO
287 DB RESET_NLS_COMMAND
288 ENDM
289
290;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
291BEEP MACRO
292 DB BEEP_COMMAND
293 ENDM
294
295;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
296GOTO MACRO GOTO_OFFSET
297 DB GOTO_COMMAND
298 DW GOTO_OFFSET-$-2
299 ENDM
300
301;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
302EXIT_INT_9 MACRO
303 DB GOTO_COMMAND+EXIT_INT_9_FLAG
304 DW 0
305 ENDM
306
307;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
308EXIT_STATE_LOGIC MACRO
309 DB GOTO_COMMAND+EXIT_STATE_LOGIC_FLAG
310 DW 0
311 ENDM
312
313;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
314CHECK_FOR_CORE_KEY MACRO
315 DB CHECK_CORE_COMMAND
316 ENDM
317
318;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
319.LIST
diff --git a/v4.0/src/CMD/KEYB/KEYBMSG.INC b/v4.0/src/CMD/KEYB/KEYBMSG.INC
new file mode 100644
index 0000000..3bcb061
--- /dev/null
+++ b/v4.0/src/CMD/KEYB/KEYBMSG.INC
@@ -0,0 +1,44 @@
1.XLIST
2
3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4;; DOS - NLS Support - KEYB Command
5;; (C) Copyright 1988 Microsoft
6;;
7;; File Name: KEYBMSG.INC
8;; ----------
9;;
10;; Root File Name: KEYBCMD.ASM (KEYB.ASM)
11;; ---------------
12;;
13;; Description:
14;; ------------
15;; External declarations for procedures in file KEYBCMD.ASM.
16;;
17;; Change History:
18;; ---------------
19;;
20;;
21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
22 ;;
23 EXTRN ACT_KEYB_CP :BYTE ;;
24 EXTRN ACT_CON_CP :BYTE ;;
25 EXTRN ACT_KEYB :BYTE ;;
26 EXTRN INV_L :BYTE ;;
27 EXTRN INV_I :BYTE ;;
28 EXTRN INV_CP :BYTE ;;
29 EXTRN INV_S :BYTE ;;
30 EXTRN INV_FN :BYTE ;;
31 EXTRN INV_KEYB_Q :BYTE ;;
32 EXTRN INV_CON_Q :BYTE ;;
33 EXTRN NOT_DESIG :BYTE ;;
34 EXTRN NOT_SUPP :BYTE ;;
35 EXTRN NOT_VALID1 :BYTE ;;
36 EXTRN NOT_VALID2 :BYTE ;;
37 EXTRN WARNING_1 :BYTE ;;
38 EXTRN INV_COMBO :BYTE ;;
39 EXTRN CR_LF :BYTE ;;
40 EXTRN MEMORY_OVERF :BYTE ;;
41 ;;
42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
43
44.LIST
diff --git a/v4.0/src/CMD/KEYB/KEYBSHAR.INC b/v4.0/src/CMD/KEYB/KEYBSHAR.INC
new file mode 100644
index 0000000..75bbc13
--- /dev/null
+++ b/v4.0/src/CMD/KEYB/KEYBSHAR.INC
@@ -0,0 +1,307 @@
1.XLIST
2
3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4;; DOS - NLS Support - KEYB Command
5;; (C) Copyright 1988 Microsoft
6;;
7;; File Name: KEYBSHAR.INC
8;; ----------
9;;
10;; Description:
11;; ------------
12;; Include file containing structure definitions Shared Data Area
13;; for the Shared Data Area.
14;; The Shared Data Area contains data which is required by
15;; both the resident and transient KEYB code. The Shared
16;; Data Area is allocated in the KEYBI2F file and will be
17;; resident following initial installation.
18;;
19;; Change History:
20;; ---------------
21;;
22;;
23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
24 ;;
25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
26;; SHARED_DATA_STR defines the initial fixed length portion of the
27;; Shared Data Area.
28;; Tables are loaded beginning at TABLE_AREA in the following order:
29;; State Logic
30;; Common Translate Section
31;; Specific Translate Sections for
32;; each code page
33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
34 ;; SPECIAL_FEATURES equates:
35TYPEWRITER_CAPS_LK EQU 8000H ;; typewriter style caps lock
36JR_HOT_KEY_1_2 EQU 4000H ;; on PCjr use 1/2 as the hot keys
37 ;; instead of F1/F2
38 ;;
39 ;; Some useful scan codes:
40F1_SCAN EQU 59 ;; F1
41F2_SCAN EQU 60 ;; F2
42ONE_SCAN EQU 2 ;; "1"
43TWO_SCAN EQU 3 ;; "2"
44 ;;
45 ;; SYSTEM_FLAG equates:
46EXT_16 EQU 8000H ;; extended int16 support is there
47PC_AT EQU 4000H ;; code for pcat
48PC_LAP EQU 2000H ;; code for pc lap computer (p-12)
49PC_XT EQU 1000H ;; code for PC, PC/XT, PORTABLE
50PC_JR EQU 0800H ;; code for PCjr
51PC_PAL EQU 0400H ;; code for PALACE
52PC_386 EQU 0200H ;; code for WRANGLER
53PC_NET EQU 0100H ;; PC Net is installed
54 ;;
55 ;; HOT_KEY_FLAG EQUATES:
56US_MODE EQU 0 ;; hot key is active => US
57LANG_MODE EQU 0FFH ;; hot key is inactive
58 ;;
59 ;; -----------------------------------
60SHARED_DATA_STR STRUC ;; SHARED DATA AREA
61 ;;
62OLD_INT_9 DD 0 ;; saved int 9 vector
63OLD_INT_2F DD 0 ;; saved int 2F vector
64OLD_INT_48 DD 0 ;; saved int 48 vector (if PCjr)
65KEYB_TYPE DW 0 ;; type of keyboard
66SYSTEM_FLAG DW 0 ;; system configuration flags
67TABLE_OK DB 0 ;; flag to INT 9 that table is built
68JR_KB_FLAG DB 0 ;; flag for special PCjr processing
69TIMING_FACTOR DW 1 ;; Scale factor for INT 9 timing loops
70 ;; PC_AT = 1
71 DB 2 DUP(0) ;; reserved
72 ;;
73 ;; Table copy begins here:
74ACTIVE_LANGUAGE DB 'US' ;; language code
75INVOKED_CP_TABLE DW 437 ;; ptr to table for invoked code page
76INVOKED_KBD_ID DW 0 ;; WGR invoked keyboard id. ;AN000
77ACTIVE_XLAT_PTR DW -1 ;; ptr to active Specific Translate Sect
78FIRST_XLAT_PTR DW -1 ;; ptr to first Specific Translate Sect
79RESIDENT_END DW 0ffffh ;; offset of last byte in resident mem
80LOGIC_PTR DW -1 ;; ptr to State Logic
81COMMON_XLAT_PTR DW -1 ;; ptr to Common Translate Section
82SPECIAL_FEATURES DW ? ;; special Features
83TABLE_OVERFLOW DB 0 ;; overflow flag for table rebuild
84HOT_KEY_ON_SCAN DB ? ;; scan codes to use with ALT+CTRL
85HOT_KEY_OFF_SCAN DB ? ;; to turn hot key on and off
86 DB 4 DUP(0) ;; reserved
87TABLE_AREA DB ? ;; tables loaded here:
88 ;; State Logic
89 ;; Common Translate Section
90 ;; Specific Translate Sections for
91 ;; each code page
92SHARED_DATA_STR ENDS ;;
93 ;;
94 ;;
95 ;;
96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
97;; State Logic equates.
98;; Contains equates for our NLS Flags and for the State Logic
99;; commands.
100;; State Logic command macros are defined in KEYBMAC.INC
101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
102 ;;
103STATE_LOGIC_STR STRUC ;;
104 ;;
105SL_LOGIC_LEN DW ? ;; length of state logic
106SL_SPECIAL_FEATURES DW ? ;;
107SL_LOGIC_CMDS DB 0 ;; state logic commands begin here
108 ;;
109STATE_LOGIC_STR ENDS ;;
110 ;;
111 ;;
112NUM_BIOS_FLAGS EQU 4 ;;
113NUM_NLS_FLAGS EQU 2 ;; '+1' below is the EXT_KB_FLAG
114NUM_FLAGS EQU NUM_BIOS_FLAGS+NUM_NLS_FLAGS+1
115 ;;
116 ;;
117EITHER_SHIFT EQU 80H ;; EXT_KB_FLAG : our own shift state
118EITHER_CTL EQU 40H ;; flags
119EITHER_ALT EQU 20H ;;
120SCAN_MATCH EQU 08H ;; set if scan code found in XLATT
121 ;; or SET_FLAG searches
122 ;;
123 ;;
124KB_FLAG_ID EQU 0 ;; Flag ID's as coded in IFF and ANDF
125KB_FLAG_1_ID EQU 1 ;; commands
126KB_FLAG_2_ID EQU 2 ;;
127KB_FLAG_3_ID EQU 3 ;;
128EXT_KB_FLAG_ID EQU 4 ;;
129NLS_FLAG_1_ID EQU 5 ;;
130NLS_FLAG_2_ID EQU 6 ;;
131 ;;
132COMMAND_BITS EQU 0F0H ;; Mask to isolate command code
133SUB_CMD_BITS EQU 0FH ;; mask to isolate sub command code
134NOT_TEST EQU 08H ;; NOT bit in IFF, ANDF
135COMMAND_SHIFT EQU 4 ;; shift amount for command code
136FLAG_ID_BITS EQU 07H ;; mask to isolate flag id in IFF, ANDF
137NUM_COMMANDS EQU 0CH ;; number of commands
138 ;;
139IFF_COMMAND EQU 00H ;;
140ANDF_COMMAND EQU 10H ;;
141ELSEF_COMMAND EQU 20H ;;
142ENDIFF_COMMAND EQU 30H ;;
143XLATT_COMMAND EQU 40H ;;
144OPTION_COMMAND EQU 50H ;;
145SET_FLAG_COMMAND EQU 60H ;;
146PUT_ERROR_COMMAND EQU 70H ;;
147IFKBD_COMMAND EQU 80H ;;
148GOTO_COMMAND EQU 90H ;;
149BEEP_COMMAND EQU 0A0H ;;
150RESET_NLS_COMMAND EQU 0B0H ;;
151CHECK_CORE_COMMAND EQU 0C0H ;;
152 ;;
153 ;;
154EXIT_INT_9_FLAG EQU 01H ;; Special forms of GOTO. These
155EXIT_STATE_LOGIC_FLAG EQU 02H ;; values are in the right nibble
156 ;; of the GOTO command.
157 ;;
158 ;; PROCESSING OPTIONS:
159EXIT_IF_FOUND EQU 80H ;; exit INT 9 if a translation
160 ;; match is found
161 ;;
162ANY_KB EQU 0FFFFH ;;
163JR_KB EQU 8000H ;; Keyboard types
164XT_KB EQU 4000H ;;
165AT_KB EQU 2000H ;;
166G_KB EQU 1000H ;;
167P_KB EQU 0800H ;;
168P12_KB EQU 0400H ;;
169 ;;
170;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
171;; Translate Table Sections. Both the Specific and Common
172;; Translate Sections are formatted as follows.
173;;
174;; The Specific Translate Sections are chained together using the
175;; XS_NEXT_SECT_PTR field (-1 if last section).
176;; Translate Sections contains multiple States.
177;; A State contains the translate tables for a single
178;; shift state (IE lower case, upper case ....)
179;; Each State may contain multiple translate tables.
180;;
181;; The Translate Section layout is defined using several STRUCs.
182;; These STRUCs are allocated in the Shared Data Area as follows:
183;;
184;; XLAT_SECT_STR ; header info for the section
185;; STATE_STR ; header for state #1
186;; XLAT_STR ; first translate tab for state #1
187;; XLAT_TYPE_1_STR or XLAT_TYPE_2_STR
188;; XLAT_STR ; second translate tab
189;; XLAT_TYPE_1_STR or XLAT_TYPE_2_STR
190;; ...
191;; STATE_STR ; header for state #2
192;; XLAT_STR
193;; XLAT_TYPE_1_STR or XLAT_TYPE_2_STR
194;; ...
195;; ...
196;;
197;; A State may contain a "Set_Flag" table instead of translate tables.
198;; These tables are used to set the NLS flags instead of generating
199;; ASCII codes (for example: to remember dead key states).
200;; There can be only on Set_Flag table per state.
201;; The Set_Flag table layout is defined in the SET_FLAG_STR STRUC.
202;;
203;; So some states will contain translate tables (to generate ASCII codes)
204;; and some states will contain a Set_Flag table (to record dead key
205;; status).
206;;
207;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
208 ;;
209XLAT_SECT_STR STRUC ;;
210 ;;
211XS_NEXT_SECT_PTR DW ? ;; Pointer to next Specific Translate
212 ;; Section
213XS_CP_ID DW ? ;; code page id
214XS_FIRST_STATE DB ? ;;
215 ;;
216XLAT_SECT_STR ENDS ;;
217 ;;
218;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
219;; State structure.
220;; The last State is a null State containing only the
221;; XS_STATE_LEN field with a value of 0.
222;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
223 ;;
224STATE_STR STRUC ;;
225 ;;
226XS_STATE_LEN DW ? ;; length of state section
227XS_STATE_ID DB ? ;; State ID
228XS_KBD_TYPE DW ? ;; Keyboard Type
229XS_ERROR_CHAR DW ? ;; Buffer entry for error character
230XS_FIRST_TAB DB ? ;;
231 ;;
232STATE_STR ENDS ;;
233 ;;
234;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
235;; Translate Table structures.
236;; There may be many translate tables in a State. The last
237;; table is a null table containing only the XLAT_TAB_SIZE field with
238;; a value of 0.
239;; The xlate table can be in one of two forms:
240;; Type 1 = Table contains buffer entries only.
241;; Scan code is used as an index into xlat table
242;; Type 2 = Table contains pairs of SCAN/BUFFER_ENTRY.
243;; Table must be searched for matching scan.
244;; Type 1 is the default. Type 2 tables should be identified by setting
245;; the TYPE_2_TAB bit in XLAT_OPTIONS.
246;; Buffer entries default to 2-bytes per entry.
247;; Optionally the table may contain ASCII codes only
248;; (1-byte entries). This is specified by setting the ASCII_ONLY bit
249;; in XLAT_OPTIONS. 2-byte buffer entries are coded ASCII,SCAN.
250;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
251 ;;
252 ;; Translate options:
253ASCII_ONLY EQU 80H ;; Only ASCII codes listed - use
254 ;; incoming scan for buffer entry
255TYPE_2_TAB EQU 40H ;; search xlat table for matching scan
256ZERO_SCAN EQU 20H ;; set the scan half of the buffer
257 ;; entry to 0
258 ;;
259NULL_ASCII_CODE EQU -1 ;;
260 ;;
261DEFAULT_TAB_2_ENT_SZ EQU 3 ;;
262ASC_ONLY_TAB_2_ENT_SZ EQU 2 ;;
263 ;;
264 ;;
265XLAT_STR STRUC ;;
266 ;;
267XLAT_TAB_SIZE DW ? ;; Size in bytes of this table -
268 ;; includes this field, options etc.
269XLAT_OPTIONS DB ? ;; xlat options
270 ;; XLAT TABLE IS HERE
271XLAT_STR ENDS ;;
272 ;;
273XLAT_TYPE_1_STR STRUC ;; use scan code as index into table
274 DB TYPE XLAT_STR DUP(?) ;; filler
275XLAT_SCAN_LO DB ? ;; Scan code
276XLAT_SCAN_HI DB ? ;; range
277XLAT_1_BUF_ENTRY DB ? ;; The table itself
278XLAT_TYPE_1_STR ENDS ;;
279 ;;
280XLAT_TYPE_2_STR STRUC ;; search table for scan
281 DB TYPE XLAT_STR DUP(?) ;; filler
282XLAT_NUM DB ? ;; number of scans
283XLAT_SCAN DB ? ;; Scan code
284XLAT_2_BUF_ENTRY DB ? ;; The table itself
285XLAT_TYPE_2_STR ENDS ;;
286 ;;
287;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
288;; Set_Flag Tables.
289;; State Sections immediately following the LAST_ENTRYs.
290;; Dead key definitions. If the scan matches then
291;; set the bit in NLS_FLAGs indicated in DK_MASK
292;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
293 ;;
294SF_ENT_SZ EQU 3 ;; size of entry
295 ;;
296SET_FLAG_STR STRUC ;;
297 ;;
298SF_NUM DB 0 ;; Number of entries
299SF_SCAN_CODE DB 0 ;; scan code
300SF_FLAG_ID DB 0 ;; flag id
301SF_FLAG_MASK DB 0 ;; flag mask
302 ;;
303SET_FLAG_STR ENDS ;;
304 ;;
305 ;;
306;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
307.LIST
diff --git a/v4.0/src/CMD/KEYB/KEYBSYS.INC b/v4.0/src/CMD/KEYB/KEYBSYS.INC
new file mode 100644
index 0000000..4b42fbe
--- /dev/null
+++ b/v4.0/src/CMD/KEYB/KEYBSYS.INC
@@ -0,0 +1,137 @@
1.XLIST
2
3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4;; DOS - NLS Support - KEYB Command
5;; (C) Copyright 1988 Microsoft
6;;
7;; File Name: KEYBSYS.INC
8;; ----------
9;;
10;; Root File Name: KEYB.ASM
11;; ---------------
12;;
13;; Description:
14;; ------------
15;; Include file containing structure definitions and equates
16;; for the KEYBOARD.SYS file.
17;;
18;; Change History:
19;; ---------------
20;;
21;;
22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
23 ;;
24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
25;; File header - contains pointers to keyboard tables for each language
26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
27 ;;
28KEYBSYS_HEADER STRUC ;;
29 ;;
30KH_SIGNATURE DB 0FFh,'KEYB ' ;; signature
31KH_RESV_1 DB 8 DUP(0) ;; reserved
32KH_MAX_COM_SZ DW 0 ;AN000;**chg ;; maximum size of Common Xlat Sect
33KH_MAX_SPEC_SZ DW 0 ;AN000;;**chg ;; max size of Specific Xlat Sect
34KH_MAX_LOGIC_SZ DW 0 ;AN000;;**chg ;; max size of State Logic
35KH_RESV_2 Dw 0 ;AN000;;**chg ;; reserved CNS
36KH_NUM_ID Dw 0 ;AN000;;; ************* CNS
37KH_NUM_LANG DW 0 ;; number of languages
38KH_LANG_PTRS DB 0 ;; language pointers start here
39;********************* CNS **********************
40;KH_NUM_ID DW 0 ;; number of languages
41;KH_ID_PTRS DB 0 ;; id pointers start here
42;********************* CNS **********************
43KEYBSYS_HEADER ENDS ;;
44;******************CNS*******************
45KEYBSYS_ID_PTRS STRUC
46
47KP_ID_CODE DW 0 ;AN000;
48KP_LANG_PTR DD 0 ;AN000;
49
50KEYBSYS_ID_PTRS ENDS
51 ;;
52;*****************CNS********************
53KEYBSYS_LANG_PTRS STRUC ;;
54 ;; Next two entries repeat:
55KP_LANG_CODE DW 0 ;; language code
56KP_ENTRY_PTR DD 0 ;; language entry pointer
57 ;;
58KEYBSYS_LANG_PTRS ENDS ;;
59 ;;
60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
61;; Language Entry - pointed to by KH_ENTRY_PTR in KEYBSYS_HEADER
62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
63 ;;
64KEYBSYS_LANG_ENTRY STRUC ;;
65 ;;
66KL_LANG_CODE DW 'XX' ;; language code
67KL_ID_CODE DW 0 ;; reserved (ID CODE)
68KL_LOGIC_PTR DD 0 ;AC000;;**chg ;; State Logic pointer
69KL_NUM_ID DB 0 ;AN000;;CNS ;; number of valid IDs for this lang
70KL_NUM_CP DB 0 ;; number of valid CPs for this lang
71KL_CP_PTRS DB 0 ;; CP table pointers start here
72 ;;
73KEYBSYS_LANG_ENTRY ENDS ;;
74 ;;
75KEYBSYS_CP_PTRS STRUC ;;
76 ;; Next two entries repeat:
77KC_CODE_PAGE DW 0 ;; code page
78KC_ENTRY_PTR DD 0 ;; ptr to Specific Translate Section
79 ;;
80KEYBSYS_CP_PTRS ENDS ;;
81 ;;
82 ;;
83;; Everything from here down is new
84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
85;; State Logic - pointed to by KL_LOGIC_PTR in KEYBSYS_LANG_ENTRY
86;; Common Translate Section follows immediately after the State Logic.
87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
88 ;;
89KEYBSYS_STATE_LOGIC STRUC ;;
90 ;;
91KT_LOGIC_LEN DW ? ;; length of state logic
92KT_SPECIAL_FEATURES DW ? ;; Special Features (see KEYBSHAR.INC)
93KT_LOGIC_CMDS DB 0 ;; state logic commands begin here
94 ;;
95KEYBSYS_STATE_LOGIC ENDS ;;
96 ;;
97 ;;
98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
99;; Translate Section - Common and Specific Translate Sections
100;; are both in this form.
101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
102 ;;
103KEYBSYS_XLAT_SECT STRUC ;;
104 ;;
105KX_SECTION_LEN DW ? ;; Length of this section
106KX_CP_ID DW ? ;; code page id
107KX_FIRST_STATE DB ? ;;
108 ;;
109KEYBSYS_XLAT_SECT ENDS ;;
110 ;;
111 ;;
112KEYBSYS_STATE STRUC ;;
113 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
114 ;; Translate Sections contains multiple States.
115 ;; A State contains the translate tables for a single
116 ;; shift state (IE lower case, upper case ....)
117 ;; The last State is a null State containing only the
118 ;; KX_STATE_LEN field with a value of 0.
119 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
120KX_STATE_LEN DW ? ;; length of state section
121KX_STATE_ID DB ? ;; State ID
122KX_KBD_TYPE DW ? ;; Keyboard Type
123KX_ERROR_CHAR DW ? ;; Buffer entry for error character
124KX_FIRST_XLAT DB ? ;; XLAT tables begin here
125 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
126 ;; Each State consists of multiple translate tables.
127 ;; The last translate table within a state is a null
128 ;; table containing only the
129 ;; KX_XLAT_LEN field with a value of 0.
130 ;; Refer to KEYBSHAR.INC for translate table format.
131 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
132 ;;
133KEYBSYS_STATE ENDS ;;
134 ;;
135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
136.LIST
137
diff --git a/v4.0/src/CMD/KEYB/KEYBTBBL.ASM b/v4.0/src/CMD/KEYB/KEYBTBBL.ASM
new file mode 100644
index 0000000..b28f08c
--- /dev/null
+++ b/v4.0/src/CMD/KEYB/KEYBTBBL.ASM
@@ -0,0 +1,855 @@
1
2 PAGE ,132
3 TITLE DOS KEYB Command - Transient Command Processing
4
5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6;; DOS - NLS Support - KEYB Command
7;; (C) Copyright 1988 Microsoft
8;;
9;; File Name: KEYBTBBL.ASM
10;; ----------
11;;
12;; Description:
13;; ------------
14;; Build SHARED_DATA_AREA with parameters specified
15;; in KEYBCMD.ASM
16;;
17;; Documentation Reference:
18;; ------------------------
19;; None
20;;
21;; Procedures Contained in This File:
22;; ----------------------------------
23;; TABLE_BUILD: Build the header sections of the SHARED_DATA_AREA
24;; STATE_BUILD: Build the state sections in the table area
25;; FIND_CP_TABLE: Given the language and code page parm, determine the
26;; offset of the code page table in KEYBOARD.SYS
27;;
28;; Include Files Required:
29;; -----------------------
30;; KEYBSHAR.INC
31;; KEYBSYS.INC
32;; KEYBDCL.INC
33;; KEYBI2F.INC
34;;
35;; External Procedure References:
36;; ------------------------------
37;; None
38;;
39;; Change History:
40;; ---------------
41;;
42;;
43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
44 ;;
45 PUBLIC TABLE_BUILD ;;
46 PUBLIC FIND_CP_TABLE ;;
47 PUBLIC CPN_INVALID ;;
48 PUBLIC SD_LENGTH ;;
49 ;;
50CODE SEGMENT PUBLIC 'CODE' ;;
51 ;;
52 INCLUDE KEYBEQU.INC ;;
53 INCLUDE KEYBSHAR.INC ;;
54 INCLUDE KEYBSYS.INC ;;
55 INCLUDE KEYBCMD.INC ;;
56 INCLUDE KEYBDCL.INC ;;
57 INCLUDE COMMSUBS.INC ;;
58 INCLUDE KEYBCPSD.INC ;;
59 ;;
60 ASSUME CS:CODE,DS:CODE ;;
61 ;;
62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
63;;
64;; Module: TABLE_BUILD
65;;
66;; Description:
67;; Create the table area within the shared data structure. Each
68;; table is made up of a descriptor plus the state sections.
69;; Translate tables are found in the Keyboard definition file and are
70;; copied into the shared data area by means of the STATE_BUILD
71;; routine.
72;;
73;; Input Registers:
74;; DS - points to our data segment
75;; ES - points to our data segment
76;; BP - points at beginning of CMD_PARM_LIST
77;;
78;; SHARED_DATA_STR must be allocated in memory
79;;
80;; The following variables must also be passed from KEYB_COMMAND
81;; KEYBSYS_FILE_HANDLE is set to file handle after opening file
82;; CP_TAB_OFFSET is the offset of the CP table in the SHARED_DATA_AREA
83;; STATE_LOGIC_OFFSET is the offset of the state section in the SHARED_DATA_AREA
84;; SYS_CODE_PAGE is the binary representation of the system CP
85;; KEYBCMD_LANG_ENTRY_PTR is a pointer to the lang entry in KEY DEF file
86;; DESIG_CP_BUFFER is the buffer which holds a list of designated CPs
87;; DESIG_CP_OFFSET:WORD is the offset of that list
88;; NUM_DESIG_CP is the number of CPs designated
89;; FILE_BUFFER is the buffer to read in the KEY DEF file
90;**********CNS ***************************************
91;; ID_PTR_SIZE is the size of the ID ptr structure
92;**********CNS ***************************************
93;; LANG_PTR_SIZE is the size of the lang ptr structure
94;; CP_PTR_SIZE is the size of the CP ptr structure
95;; NUM_CP is the number of CPs in the KEYB DEF file for that lang
96;; SHARED_AREA_PTR segment and offset of the SHARED_DATA_AREA
97;;
98;;
99;; Output Registers:
100;; CX - RETURN_CODE := 0 - Table build successful
101;; 1 - Table build unsuccessful - ERROR 1
102;; (Invalid language parm)
103;; 2 - Table build unsuccessful - ERROR 2
104;; (Invalid Code Page parm)
105;; 3 - Table build unsuccessful - ERROR 3
106;; (Machine type unavaliable)
107;; 4 - Table build unsuccessful - ERROR 4
108;; (Bad or missing keyboard def file)
109;; 5 - Table build unsuccessful - ERROR 5
110;; (Memory overflow occurred)
111;; Logic:
112;; Calculate Offset difference between TEMP and SHARED_DATA_AREAs
113;; Get LANGUAGE_PARM and CODE_PAGE_PARM from parm list
114;; Call FIND_CP_TABLE := Determine whether CP is valid for given language
115;; IF CP is valid THEN
116;; Store them in the SHARED_DATA_AREA
117;; Prepare to read Keyboard definition file by LSEEKing to the top
118;; READ the header
119;; Store maximum table values for calculation of RES_END
120;; Set DI to point at TABLE_AREA within SHARED_DATA_AREA
121;; FOR the state logic section of the specified language:
122;; IF STATE_LOGIC_PTR is not -1 THEN
123;; LSEEK to state logic section in keyboard definition file
124;; READ the state logic section into the TABLE_AREA
125;; Set the hot keyb scan codes
126;; Set the LOGIC_PTR in the header
127;; FOR the common translate section:
128;; IF Length parameter is not 0 THEN
129;; Build state
130;; Set the COMMON_XLAT_PTR in the header
131;; FOR the specific translate sections:
132;; Establish addressibility to list of designated code pages
133;; FOR each code page
134;; IF CP_ENTRY_PTR is not -1 THEN
135;; Determine offset of CP table in Keyb Def file
136;; IF CP table not avaliable THEN
137;; Set CPN_INVALID flag
138;; ELSE
139;; LSEEK to CPn state section in keyboard definition file
140;; IF this is the invoked code page THEN
141;; Set ACTIVE_XLAT_PTR in SHARED_DATA_AREA
142;; Update RESIDENT_END ptr
143;; Build state
144;; Update RESIDENT_END ptr
145;; End
146;;
147;;
148;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
149 ;;
150FB EQU FILE_BUFFER ;;
151KB_MASK EQU 02H ;;
152 ;;
153FIRST_XLAT_TAB DW 0 ;;
154NEXT_SECT_PTR DW -1 ;;
155 ;;
156MAX_COM_SIZE DW ? ;;
157MAX_SPEC_SIZE DW ? ;;
158MAX_LOGIC_SIZE DW ? ;;
159 ;;
160RESIDENT_END_ACC DW 0 ;;
161SA_HEADER_SIZE DW SIZE SHARED_DATA_STR;;
162PARM_LIST_OFFSET DW ? ;;
163;********************CNS*************************
164TB_ID_PARM DW 0
165;********************CNS*************************
166TB_LANGUAGE_PARM DW 0 ;;
167TB_CODE_PAGE_PARM DW 0 ;;
168 ;;
169CPN_INVALID DW 0 ;;
170 ;;
171KEYB_INSTALLED DW 0 ;;
172SD_AREA_DIFFERENCE DW 0 ;;
173SD_LENGTH DW 2000 ;;
174 ;;
175;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
176;; Program Code
177;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
178 ;;
179TABLE_BUILD PROC NEAR ;;
180 ;;
181 MOV AX,OFFSET SD_SOURCE_PTR ;; Setup the difference
182 SUB AX,OFFSET SD_DEST_PTR ;; value used to calculate
183 MOV SD_AREA_DIFFERENCE,AX ;; new ptr values for
184 ;; SHARED_DATA_AREA
185 MOV AX,[BP].ID_PARM ;; WGR Get id parameter ;AN000
186 MOV TB_ID_PARM,AX ;; WGR ;AN000
187 MOV AX,[BP].LANGUAGE_PARM ;; Get language parameter
188 MOV TB_LANGUAGE_PARM,AX ;;
189 MOV BX,[BP].CODE_PAGE_PARM ;; Get code page parameter
190 MOV TB_CODE_PAGE_PARM,BX ;;
191 ;; Make sure code page is
192 CALL FIND_CP_TABLE ;; valid for the language
193 CMP CX,0 ;; Test return codes
194 JE TB_CHECK_CONTINUE1 ;; IF code page is found
195 JMP TB_ERROR6 ;; for language THEN
196 ;;
197TB_CHECK_CONTINUE1: ;;;;;;;;
198 MOV BP,OFFSET SD_SOURCE_PTR ;; Put language parm and ;AN000
199 MOV AX,TB_ID_PARM ;; WGR id parm and.. ;AN000
200 MOV ES:[BP].INVOKED_KBD_ID,AX ;; WGR
201 MOV BX,TB_CODE_PAGE_PARM ;;
202 MOV ES:[BP].INVOKED_CP_TABLE,BX ;;;;;; code page parm into the
203 MOV AX,TB_LANGUAGE_PARM ;; SHARED_DATA_AREA
204 MOV WORD PTR ES:[BP].ACTIVE_LANGUAGE,AX ;;
205 ;;
206 MOV BX,KEYBSYS_FILE_HANDLE ;;;;;;;;;;;;;;; Get handle
207 XOR DX,DX ;; LSEEK file pointer
208 XOR CX,CX ;; back to top of file
209 MOV AH,42H ;;
210 MOV AL,0 ;; If no problem with
211 INT 21H ;; Keyboard Def file THEN
212 JNC TB_START ;;
213 JMP TB_ERROR4 ;;
214 ;;
215TB_START: ;; Else
216 XOR DI,DI ;; Set number
217 LEA CX,[DI].KH_MAX_LOGIC_SZ+2;; bytes to read header
218 MOV DX,OFFSET FILE_BUFFER ;; Move contents into file buffer
219 MOV AH,3FH ;; READ
220 PUSH CS ;;
221 POP DS ;;
222 INT 21H ;; File
223 JNC TB_CONTINUE1 ;;
224 JMP TB_ERROR4 ;;
225 ;;
226TB_CONTINUE1: ;;
227 CMP CX,AX ;;
228 JE TB_ERROR_CHECK1 ;;
229 MOV CX,4 ;;
230 JMP TB_CPN_INVALID ;;
231 ;;
232TB_ERROR_CHECK1: ;;
233 MOV CX,FB.KH_MAX_COM_SZ ;; Save values for RESIDENT_END
234 MOV MAX_COM_SIZE,CX ;; calculation
235 MOV CX,FB.KH_MAX_SPEC_SZ ;;
236 MOV MAX_SPEC_SIZE,CX ;;
237 MOV CX,FB.KH_MAX_LOGIC_SZ ;;
238 MOV MAX_LOGIC_SIZE,CX ;;
239 ;;
240 LEA DI,[BP].TABLE_AREA ;; Point at beginning of table area
241 ;; DI ---> TABLE_AREA
242;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
243;; ** FOR STATE LOGIC SECTION FOR LANG **
244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
245 ;;
246TB_STATE_BEGIN: ;;
247 MOV BX,KEYBSYS_FILE_HANDLE ;; Get handle
248 MOV CX,WORD PTR STATE_LOGIC_OFFSET+2 ;;
249 MOV DX,WORD PTR STATE_LOGIC_OFFSET ;; Get LSEEK file pointer
250 ;;
251 CMP DX,-1 ;;;;;;;;;; If no language table then
252 JNE TB_STATE_CONTINUE1 ;; jump to code page begin
253 JMP TB_CP_BEGIN ;;
254 ;;
255TB_STATE_CONTINUE1: ;; Else
256 MOV AH,42H ;; LSEEK to beginning of state logic sect
257 MOV AL,0 ;; If no problem with
258 INT 21H ;; Keyboard Def file THEN
259 JNC TB_STATE_CONTINUE2 ;;
260 JMP TB_ERROR4 ;;
261 ;;;;;;;;;;
262TB_STATE_CONTINUE2: ;;
263 MOV DX,AX ;;
264 MOV WORD PTR SB_STATE_OFFSET+2,CX ;; Save the offset of the
265 MOV WORD PTR SB_STATE_OFFSET,DX ;; states in Keyb Def file
266 ;;
267 SUB DI,SD_AREA_DIFFERENCE ;; Adjust for relocation
268 MOV ES:[BP].LOGIC_PTR,DI ;;;;;;;;;; Set because this is state
269 ADD DI,SD_AREA_DIFFERENCE ;; Adjust for relocation
270 ;;
271 MOV CX,4 ;; Set number bytes to read length and
272 ;; special features
273 MOV DX,OFFSET FILE_BUFFER ;; Set the buffer address
274 MOV AH,3FH ;; Read from the Keyb Def file
275 INT 21H ;;
276 JNC TB_STATE_CONTINUE3 ;;
277 JMP TB_ERROR4 ;;
278 ;;
279TB_STATE_CONTINUE3: ;;
280 CMP CX,AX ;;
281 JE TB_ERROR_CHECK2 ;;
282 MOV CX,4 ;;
283 JMP TB_CPN_INVALID ;;
284 ;;;;;
285TB_ERROR_CHECK2: ;;
286 MOV AX,FB.KT_SPECIAL_FEATURES ;; Save the special features in the
287 MOV ES:[BP].SPECIAL_FEATURES,AX ;; SHARED_DATA_AREA
288 ;;
289 CMP HW_TYPE,JR_KB ;;;;;;;;
290 JNE USE_F1_F2 ;;
291 TEST AX,JR_HOT_KEY_1_2 ;;
292 JZ USE_F1_F2 ;;
293 MOV ES:[BP].HOT_KEY_ON_SCAN,ONE_SCAN ;;
294 MOV ES:[BP].HOT_KEY_OFF_SCAN,TWO_SCAN ;;
295 JMP HOT_KEY_SET ;;
296 ;;
297USE_F1_F2: ;;
298 MOV ES:[BP].HOT_KEY_ON_SCAN,F1_SCAN ;;
299 MOV ES:[BP].HOT_KEY_OFF_SCAN,F2_SCAN ;;
300 ;;
301HOT_KEY_SET: ;;;;;;;;
302 MOV CX,FB.KT_LOGIC_LEN ;; Set length of section to read
303 CMP CX,0 ;;
304 JNE TB_STATE_CONTINUE4 ;;
305 MOV CX,-1 ;;;;;
306 MOV ES:[BP].LOGIC_PTR,CX ;;
307 JMP SB_COMM_BEGIN ;;
308 ;;
309TB_STATE_CONTINUE4: ;;
310 MOV ES:[DI],CX ;; Store length parameter in
311 ADD DI,2 ;; SHARED_DATA_AREA
312 MOV CX,FB.KT_SPECIAL_FEATURES;; Save the special features
313 MOV ES:[DI],CX ;;
314 ADD DI,2 ;;
315 MOV CX,FB.KT_LOGIC_LEN ;; Set length of section to read
316 SUB CX,4 ;; Adjust for what we have already read
317 MOV DX,DI ;; Set the address of SHARED_DATA_AREA
318 PUSH ES ;;
319 POP DS ;;
320 MOV AH,3FH ;; Read logic section from the
321 INT 21H ;; Keyb Def file
322 PUSH CS ;;
323 POP DS ;;
324 JNC TB_STATE_CONTINUE5 ;;
325 JMP TB_ERROR4 ;;
326 ;;
327TB_STATE_CONTINUE5: ;;
328 CMP CX,AX ;;
329 JE TB_ERROR_CHECK3 ;;
330 MOV CX,4 ;;
331 JMP TB_CPN_INVALID ;;
332 ;;
333TB_ERROR_CHECK3: ;;
334 ADD DI,CX ;; Set DI at new beginning of area
335 ;; TABLE_AREA
336 ;; STATE_LOGIC
337 MOV CX,RESIDENT_END_ACC ;; DI --->
338 ADD CX,SA_HEADER_SIZE ;;
339 ADD CX,MAX_LOGIC_SIZE ;;
340 MOV RESIDENT_END_ACC,CX ;; Refresh resident end size
341 ;;
342;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
343;; ** FOR COMMON TRANSLATE SECTION FOR LANG **
344;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
345 ;;
346SB_COMM_BEGIN: ;;
347 MOV CX,SIZE KEYBSYS_XLAT_SECT-1 ;; Set number bytes to read header
348 MOV DX,DI ;; Set the SHARED_DATA_AREA address
349 PUSH ES ;;
350 POP DS ;;
351 MOV AH,3FH ;; Read from the Keyb Def file
352 INT 21H ;;
353 PUSH CS ;;
354 POP DS ;;
355 JNC TB_STATE_CONTINUE6 ;;
356 JMP TB_ERROR4 ;;
357 ;;
358TB_STATE_CONTINUE6: ;;
359 MOV CX,ES:[DI].KX_SECTION_LEN;; Set length of section to read
360 CMP CX,0 ;;
361 JNE TB_STATE_CONTINUE7 ;;
362 JMP TB_CP_BEGIN ;;
363 ;;;;;;;
364TB_STATE_CONTINUE7: ;;
365 MOV CX,WORD PTR SB_STATE_OFFSET ;; Save the offset of the
366 ADD CX,FB.KT_LOGIC_LEN ;;
367 MOV WORD PTR SB_STATE_OFFSET,CX ;; Save the offset of the
368 SUB DI,SD_AREA_DIFFERENCE ;; Adjust for relocation
369 MOV ES:[BP].COMMON_XLAT_PTR,DI ;;
370 ADD DI,SD_AREA_DIFFERENCE ;; Adjust for relocation
371 ;;;;;;;
372 CALL STATE_BUILD ;;
373 ;; DI set at new beginning of area
374 ;; TABLE_AREA
375 ;; STATE_LOGIC
376 ;; COMMON_XLAT_SECTION
377 MOV CX,RESIDENT_END_ACC ;;
378 ADD CX,MAX_COM_SIZE ;;
379 MOV RESIDENT_END_ACC,CX ;; Refresh resident end size
380 ;;
381;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
382;; FOR ALL DESIGNATED OR INVOKED CODE PAGES
383;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
384 ;;
385TB_CP_BEGIN: ;; Get the offset to
386 MOV CX,OFFSET DESIG_CP_BUFFER.DESIG_CP_ENTRY ;; the beginning of the
387 MOV DESIG_CP_OFFSET,CX ;; table of designated
388 ;;;;;; code pages
389TB_CPN_BEGIN: ;;
390 MOV AX,WORD PTR ES:[BP].ACTIVE_LANGUAGE ;; Get the active language
391 MOV CX,NUM_DESIG_CP ;;;;;;;;;;;;;; Get the number of CPs
392 CMP CX,0 ;; IF we have done all requested CPs
393 JNE TB_CPN_VALID1 ;;
394 JMP TB_DONE ;; Then done
395 ;;
396TB_CPN_VALID1: ;;
397 MOV SI,[DESIG_CP_OFFSET] ;;
398 MOV BX,[SI] ;; Get the CP
399 CMP BX,-1 ;;
400 JNE TB_CPN_CONTINUE1 ;;
401 JMP TB_CPN_REPEAT ;;
402 ;;
403TB_CPN_CONTINUE1: ;; ELSE
404 PUSH DI ;;
405 CALL FIND_CP_TABLE ;; Find offset of code page table
406 POP DI ;;
407 ;;
408 CMP CX,0 ;; Test return codes
409 JE TB_CPN_VALID ;; IF code page is not found for language
410 MOV CPN_INVALID,CX ;; Set flag and go to next CP
411 JMP TB_CPN_REPEAT ;; Else
412 ;;
413TB_CPN_VALID: ;;;;;;
414 MOV BX,KEYBSYS_FILE_HANDLE ;; Get handle
415 MOV CX,WORD PTR CP_TAB_OFFSET+2 ;; Get offset of the code page
416 MOV DX,WORD PTR CP_TAB_OFFSET ;; in the Keyb Def file
417 ;;
418 CMP DX,-1 ;;;;;; Test if code page is blank
419 JNE TB_CPN_CONTINUE2 ;;
420 JMP TB_CPN_REPEAT ;; If it is then go get next CP
421 ;;
422TB_CPN_CONTINUE2: ;;
423 MOV AH,42H ;; LSEEK to table in Keyb Def file
424 MOV AL,0 ;; If no problem with
425 INT 21H ;; Keyb Def file Then
426 JNC TB_CPN_CONTINUE3 ;;
427 JMP TB_ERROR4 ;;
428 ;;;;;;;;;;
429TB_CPN_CONTINUE3: ;;
430 MOV DX,AX ;;
431 MOV WORD PTR SB_STATE_OFFSET+2,CX ;; Save the offset of the
432 MOV WORD PTR SB_STATE_OFFSET,DX ;; states in Keyb Def file
433 ;;
434 MOV CX,TB_CODE_PAGE_PARM ;;;;; If this code page is the
435 MOV SI,[DESIG_CP_OFFSET] ;; invoked code page
436 CMP CX,[SI] ;;
437 JNE TB_CPN_CONTINUE4 ;; Then
438 ;;
439 SUB DI,SD_AREA_DIFFERENCE ;; Adjust for relocation
440 MOV ES:[BP].ACTIVE_XLAT_PTR,DI ;; Set active xlat section
441 ADD DI,SD_AREA_DIFFERENCE ;; Adjust for relocation
442 ;;;;;;;
443TB_CPN_CONTINUE4: ;;
444 SUB DI,SD_AREA_DIFFERENCE ;; Adjust for relocation
445 MOV ES:[BP].FIRST_XLAT_PTR,DI;; Set flag
446 ADD DI,SD_AREA_DIFFERENCE ;; Adjust for relocation
447 ;;
448TB_CPN_CONTINUE5: ;;
449 CALL STATE_BUILD ;; Build state
450 ;; TABLE_AREA
451 CMP CX,0 ;; COMMON_XLAT_SECTION
452 JE TB_CPN_REPEAT ;; SPECIFIC_XLAT_SECTION(S)
453 JMP TB_ERROR4 ;; DI --->
454 ;;
455TB_CPN_REPEAT: ;;
456 MOV CX,RESIDENT_END_ACC ;;
457 ADD CX,MAX_SPEC_SIZE ;; Refresh resident end size
458 MOV RESIDENT_END_ACC,CX ;;
459 ;;
460 MOV CX,DESIG_CP_OFFSET ;;
461 ADD CX,2 ;; Adjust offset to find next code page
462 MOV DESIG_CP_OFFSET,CX ;;
463 ;;
464 MOV CX,NUM_DESIG_CP ;; Adjust the number of code pages left
465 DEC CX ;;
466 MOV NUM_DESIG_CP,CX ;;
467 ;;
468 JMP TB_CPN_BEGIN ;;
469;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
470;;
471;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
472 ;;
473TB_DONE: ;;
474 MOV CX,RESIDENT_END_ACC ;; Set final calculated value
475 ADD CX,BP ;;;;;;;;;;;
476 SUB CX,SD_AREA_DIFFERENCE ;; Adjust for relocation
477 MOV ES,WORD PTR SHARED_AREA_PTR ;; Set segment
478 MOV BP,WORD PTR SHARED_AREA_PTR+2 ;;
479 CMP CX,ES:[BP].RESIDENT_END ;;
480 JNA TB_DONE_CONTINUE1 ;;;;;;;;;;;
481 JMP TB_ERROR5 ;;
482 ;;
483TB_DONE_CONTINUE1: ;;
484 CMP ES:[BP].RESIDENT_END,-1 ;;
485 JNE DONT_REPLACE ;;
486 PUSH CS ;;
487 POP ES ;;
488 MOV BP,OFFSET SD_SOURCE_PTR ;;
489 MOV ES:[BP].RESIDENT_END,CX ;; Save resident end
490 JMP CONTINUE_2_END ;;
491 ;;
492DONT_REPLACE: ;;
493 PUSH CS ;;
494 POP ES ;;
495 MOV BP,OFFSET SD_SOURCE_PTR ;;
496 ;;
497CONTINUE_2_END: ;;
498 SUB CX,OFFSET SD_DEST_PTR ;; Calculate # of bytes to copy
499 MOV SD_LENGTH,CX ;;
500 ;;
501 XOR CX,CX ;; Set valid completion return code
502 MOV TB_RETURN_CODE,CX ;;
503 RET ;;
504 ;;
505TB_CPN_INVALID: ;;
506 CMP CX,1 ;; Set error 1 return code
507 JNE TB_ERROR2 ;;
508 MOV TB_RETURN_CODE,CX ;;
509 RET ;;
510 ;;
511TB_ERROR2: ;;
512 CMP CX,2 ;; Set error 2 return code
513 JNE TB_ERROR3 ;;
514 MOV TB_RETURN_CODE,CX ;;
515 RET ;;
516 ;;
517TB_ERROR3: ;;
518 CMP CX,3 ;; Set error 3 return code
519 JNE TB_ERROR4 ;;
520 MOV TB_RETURN_CODE,CX ;;
521 RET ;;
522 ;;
523TB_ERROR4: ;;
524 CMP CX,4 ;; Set error 4 return code
525 JNE TB_ERROR5 ;;
526 MOV TB_RETURN_CODE,CX ;;
527 RET ;;
528 ;;
529TB_ERROR5: ;;
530 MOV CX,5 ;; Set error 5 return code
531 MOV TB_RETURN_CODE,CX ;;
532 RET ;;
533 ;;
534TB_ERROR6: ;;
535 MOV BX,TB_CODE_PAGE_PARM ;;
536 MOV CX,6 ;;
537 MOV TB_RETURN_CODE,CX ;; Set error 6 return code
538 RET ;;
539 ;;
540TABLE_BUILD ENDP ;;
541 ;;
542;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
543;;
544;; Module: STATE_BUILD
545;;
546;; Description:
547;; Create the state/xlat section within the specific translate section.
548;;
549;; Input Registers:
550;; DS - points to our data segment
551;; ES - points to our data segment
552;; SB_STATE_OFFSET - offset to the beginning of the info in Keyb Def SYS
553;; DI - offset of the beginning of the area used to build states
554;;
555;; KEYBSYS_FILE_HANDLE - handle of the KEYBOARD.SYS file
556;;
557;; Output Registers:
558;; DI - offset of the end of the area used by STATE_BUILD
559;;
560;; CX - Return Code := 0 - State build successful
561;; 4 - State build unsuccessful
562;; (Bad or missing Keyboard Def file)
563;;
564;; Logic:
565;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
566 ;;
567END_OF_AREA_PTR DW 0 ;;
568SB_FIRST_STATE DW 0 ;;
569SB_STATE_LENGTH DW 0 ;;
570SB_STATE_OFFSET DD 0 ;;
571STATE_LENGTH DW 0 ;;
572RESTORE_BP DW ? ;;
573 ;;
574;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
575;; Program Code
576;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
577 ;;
578STATE_BUILD PROC NEAR ;;
579 ;;
580 MOV SI,DI ;; Get the tally pointer
581 MOV END_OF_AREA_PTR,DI ;; Save pointer
582 ;;
583 MOV RESTORE_BP,BP ;; Save the base pointer
584 ;;;;;;;;;
585 MOV BX,KEYBSYS_FILE_HANDLE ;; Get handle
586 MOV DX,WORD PTR SB_STATE_OFFSET ;; LSEEK file pointer
587 MOV CX,WORD PTR SB_STATE_OFFSET+2 ;; back to top of XLAT table
588 MOV AH,42H ;;
589 MOV AL,0 ;;;;;;;;; If no problem with
590 INT 21H ;; Keyboard Def file THEN
591 JNC SB_FIRST_HEADER ;;
592 JMP SB_ERROR4 ;;
593 ;;
594SB_FIRST_HEADER: ;;
595 XOR BP,BP ;;
596 LEA CX,[BP].KX_FIRST_STATE ;; Set number of bytes to read header
597 MOV DX,DI ;;
598 PUSH ES ;;
599 POP DS ;;
600 MOV AH,3FH ;; read in the header
601 INT 21H ;;
602 PUSH CS ;;
603 POP DS ;;
604 JNC SB_HEAD_CONTINUE1 ;;
605 JMP SB_ERROR4 ;;
606 ;;
607SB_HEAD_CONTINUE1: ;;
608 MOV DX,NEXT_SECT_PTR ;;
609 CMP DX,-1 ;;
610 JE SB_HEAD_CONTINUE2 ;;
611 SUB DX,SD_AREA_DIFFERENCE ;; Adjust for relocation
612 ;;;;;
613SB_HEAD_CONTINUE2: ;;
614 MOV ES:[DI].XS_NEXT_SECT_PTR,DX ;;
615 CMP DX,-1 ;;
616 JE SB_HEAD_CONTINUE3 ;;;;;
617 ADD DX,SD_AREA_DIFFERENCE ;; Adjust for relocation
618 ;;
619SB_HEAD_CONTINUE3: ;;
620 ADD DI,CX ;; Update the DI pointer
621 ;;
622SB_NEXT_STATE: ;;
623 XOR BP,BP ;; Set number
624 LEA CX,[BP].KX_STATE_ID ;; bytes to read state length
625 MOV DX,DI ;; Read the header into the
626 MOV BX,KEYBSYS_FILE_HANDLE ;; SHARED_DATA_AREA
627 PUSH ES ;;
628 POP DS ;;
629 MOV AH,3FH ;;
630 INT 21H ;;
631 ;;
632SB_CONTINUE1: ;;
633 PUSH CS ;; Reset the data segment
634 POP DS ;;
635 MOV CX,ES:[DI].KX_STATE_LEN ;; If the length of the state section
636 MOV STATE_LENGTH,CX ;;
637 ADD DI,2 ;; is zero then done
638 CMP CX,0 ;;
639 JE SB_DONE ;;
640 XOR BP,BP ;; Set number
641 LEA CX,[BP].KX_FIRST_XLAT-2 ;; bytes to read state length
642 MOV DX,DI ;; Read the header into the
643 MOV BX,KEYBSYS_FILE_HANDLE ;; SHARED_DATA_AREA
644 PUSH ES ;;
645 POP DS ;;
646 MOV AH,3FH ;;
647 INT 21H ;;
648 ;;
649SB_CONTINUE1A: ;;
650 PUSH CS ;; Reset the data segment
651 POP DS ;;
652 SUB DI,2 ;;
653 MOV AX,ES:[DI].XS_KBD_TYPE ;; Get the keyboard type def
654 TEST AX,HW_TYPE ;; Does it match our hardware?
655 JNZ SB_CONTINUE2 ;;
656 MOV DX,ES:[DI].XS_STATE_LEN ;; No, then
657 LEA CX,[BP].KX_FIRST_XLAT ;;
658 SUB DX,CX ;;
659 XOR CX,CX ;;
660 MOV AH,42H ;; LSEEK past this state
661 MOV AL,01H ;;
662 INT 21H ;;
663 JMP SB_NEXT_STATE ;;
664 ;;
665SB_CONTINUE2: ;; Yes, then
666 MOV AX,SIZE STATE_STR-1 ;;
667 ADD DI,AX ;; Set PTR and end of header
668 ;;
669SB_XLAT_TAB_BEGIN: ;; Begin getting xlat tables
670 MOV BX,KEYBSYS_FILE_HANDLE ;;
671 LEA DX,[BP].KX_FIRST_XLAT ;; Adjust for what we have already read
672 MOV CX,STATE_LENGTH ;;
673 SUB CX,DX ;;
674 MOV DX,DI ;;
675 PUSH ES ;;
676 POP DS ;;
677 MOV AH,3FH ;; Read in the xlat tables
678 INT 21H ;;
679 PUSH CS ;;
680 POP DS ;;
681 JNC SB_CONTINUE4 ;;
682 JMP SB_ERROR4 ;;
683 ;;
684SB_CONTINUE4: ;;
685 CMP CX,AX ;;
686 JE SB_ERROR_CHECK1 ;;
687 JMP SB_ERROR4 ;;
688 ;;
689SB_ERROR_CHECK1: ;;
690 ADD DI,CX ;; Update the end of area ptr
691 ;;
692 MOV SI,DI ;;
693 JMP SB_NEXT_STATE ;;
694 ;;
695SB_DONE: ;;
696 MOV AX,-1 ;;
697 MOV SI,END_OF_AREA_PTR ;;
698 MOV NEXT_SECT_PTR,SI ;;
699 ;;
700 MOV BP,RESTORE_BP ;;
701 RET ;;
702 ;;
703SB_ERROR1: ;;
704 MOV CX,1 ;;
705 RET ;;
706 ;;
707SB_ERROR2: ;;
708 MOV CX,2 ;;
709 RET ;;
710 ;;
711SB_ERROR3: ;;
712 MOV CX,3 ;;
713 RET ;;
714 ;;
715SB_ERROR4: ;;
716 MOV CX,4 ;;
717 RET ;;
718 ;;
719 ;;
720STATE_BUILD ENDP ;;
721 ;;
722;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
723;;
724;; Module: FIND_CP_TABLE
725;;
726;; Description:
727;; Determine the offset of the specified code page table in KEYBOARD.SYS
728;;
729;; Input Registers:
730;; DS - points to our data segment
731;; ES - points to our data segment
732;; AX - ASCII representation of the language parm
733;; BX - binary representation of the code page
734;;
735;; KEYBSYS_FILE_HANDLE - handle of the KEYBOARD.SYS file
736;;
737;; Output Registers:
738;; CP_TAB_OFFSET - offset of the CP table in KEYBOARD.SYS
739;;
740;; CX - Return Code := 0 - State build successful
741;; 2 - Invalid Code page for language
742;; 4 - Bad or missing Keyboard Def file
743;; Logic:
744;;
745;; READ language table
746;; IF error in reading file THEN
747;; Display ERROR message and EXIT
748;; ELSE
749;; Use table to verify language parm
750;; Set pointer values
751;; IF code page was specified
752;; READ language entry
753;; IF error in reading file THEN
754;; Display ERROR message and EXIT
755;; ELSE
756;; READ Code page table
757;; IF error in reading file THEN
758;; Display ERROR message and EXIT
759;; ELSE
760;; Use table to get the offset of the code page parm
761;; RET
762;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
763 ;;
764FIND_CP_PARM DW ? ;;
765 ;;
766;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
767;; Program Code
768;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
769 ;;
770FIND_CP_TABLE PROC NEAR ;;
771 ;;
772 ;;
773 MOV FIND_CP_PARM,BX ;; Save Code page
774 ;;;;;;;;;;;;;;
775 MOV BX,KEYBSYS_FILE_HANDLE ;; Get handle
776 MOV DX,WORD PTR KEYBCMD_LANG_ENTRY_PTR ;; LSEEK file pointer
777 MOV CX,WORD PTR KEYBCMD_LANG_ENTRY_PTR+2 ;; to top of language entry
778 MOV AH,42H ;;
779 MOV AL,0 ;;;;;;;;;;;;;; If no problem with
780 INT 21H ;; Keyb Def file Then
781 JNC FIND_BEGIN ;;
782 JMP FIND_CP_ERROR4 ;;
783 ;;;;;;;;;
784FIND_BEGIN: ;;
785 MOV DI,AX ;;
786 MOV CX,SIZE KEYBSYS_LANG_ENTRY-1 ;; Set number
787 ;; bytes to read header
788 MOV DX,OFFSET FILE_BUFFER ;;;;;;;;;
789 MOV AH,3FH ;; Read language entry in
790 INT 21H ;; KEYBOARD.SYS file
791 JNC FIND_VALID4 ;; If no error in opening file then
792 JMP FIND_CP_ERROR4 ;;
793 ;;
794FIND_VALID4: ;;
795;****************************** CNS *******************************************
796 xor ah,ah
797 mov al,FB.KL_NUM_CP
798;****************************** CNS *******************************************
799 MOV NUM_CP,AX ;; Save the number of code pages
800 MUL CP_PTR_SIZE ;; Determine # of bytes to read
801 MOV DX,OFFSET FILE_BUFFER ;; Establish beginning of buffer
802 MOV CX,AX ;;
803 CMP CX,FILE_BUFFER_SIZE ;; Make sure buffer is not to small
804 JBE FIND_VALID5 ;;
805 JMP FIND_CP_ERROR4 ;;
806 ;;
807FIND_VALID5: ;;
808 MOV AH,3FH ;; Read code page table from
809 INT 21H ;; KEYBOARD.SYS file
810 JNC FIND_VALID6 ;; If no error in opening file then
811 JMP FIND_CP_ERROR4 ;;
812 ;;
813FIND_VALID6: ;;
814 MOV CX,NUM_CP ;; Number of valid codes
815 MOV DI,OFFSET FILE_BUFFER ;; Point to correct word in table
816 ;;
817F_SCAN_CP_TABLE: ;; FOR code page parm
818 MOV AX,FIND_CP_PARM ;; Get parameter
819 CMP [DI].KC_CODE_PAGE,AX ;; Valid Code ??
820 JE F_CODE_PAGE_FOUND ;; If not found AND more entries THEN
821 ADD DI,LANG_PTR_SIZE ;; Check next entry
822 DEC CX ;; Decrement count of entries
823 JNE F_SCAN_CP_TABLE ;; Else
824 JMP FIND_CP_ERROR2 ;; Display error message
825 ;;;;;;;;;;
826F_CODE_PAGE_FOUND: ;;
827 MOV AX,WORD PTR [DI].KC_ENTRY_PTR ;;
828 MOV WORD PTR CP_TAB_OFFSET,AX ;;
829 MOV AX,WORD PTR [DI].KC_ENTRY_PTR+2 ;;
830 MOV WORD PTR CP_TAB_OFFSET+2,AX ;;
831 ;;
832 XOR CX,CX ;;;;;;;;;;
833 RET ;;
834 ;;
835FIND_CP_ERROR1: ;;
836 MOV CX,1 ;;
837 RET ;;
838 ;;
839FIND_CP_ERROR2: ;;
840 MOV CX,2 ;;
841 RET ;;
842 ;;
843FIND_CP_ERROR3: ;;
844 MOV CX,3 ;;
845 RET ;;
846 ;;
847FIND_CP_ERROR4: ;;
848 MOV CX,4 ;;
849 RET ;;
850 ;;
851FIND_CP_TABLE ENDP ;;
852;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
853CODE ENDS
854 END TABLE_BUILD
855 \ No newline at end of file
diff --git a/v4.0/src/CMD/KEYB/KEYBTBBL.INC b/v4.0/src/CMD/KEYB/KEYBTBBL.INC
new file mode 100644
index 0000000..c5ea73a
--- /dev/null
+++ b/v4.0/src/CMD/KEYB/KEYBTBBL.INC
@@ -0,0 +1,33 @@
1
2.XLIST
3
4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5;; DOS - NLS Support - KEYB Command
6;; (C) Copyright 1988 Microsoft
7;;
8;; File Name: KEYBTBBL.INC
9;; ----------
10;;
11;; Description:
12;; ------------
13;; Include file containing structure definitions Shared Data Area
14;; for the Shared Data Area.
15;; The Shared Data Area contains data which is required by
16;; both the resident and transient KEYB code. The Shared
17;; Data Area is allocated in the KEYBI2F file and will be
18;; resident following initial installation.
19;;
20;; Change History:
21;; ---------------
22;;
23;;
24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
25 ;;
26 EXTRN TABLE_BUILD :NEAR ;;
27 EXTRN FIND_CP_TABLE :NEAR ;;
28 ;;
29 EXTRN CPN_INVALID :WORD ;;
30 EXTRN SD_LENGTH :WORD ;;
31 ;;
32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
33.LIST
diff --git a/v4.0/src/CMD/KEYB/MAKEFILE b/v4.0/src/CMD/KEYB/MAKEFILE
new file mode 100644
index 0000000..509b679
--- /dev/null
+++ b/v4.0/src/CMD/KEYB/MAKEFILE
@@ -0,0 +1,72 @@
1#************************* Makefile for KEYB *************************
2
3inc =..\..\inc
4msg =..\..\messages
5dos =..\..\dos
6hinc =..\..\h
7
8#
9###################### Dependencies begin here. ######################
10#
11
12all: keyb.com
13
14keyb.ctl: keyb.skl $(msg)\$(COUNTRY).msg
15
16keybcmd.obj: keybcmd.asm \
17 $(inc)\struc.inc \
18 $(inc)\sysmsg.inc \
19 $(inc)\versiona.inc \
20 keybequ.inc \
21 keybsys.inc \
22 keybi9.inc \
23 keybi9c.inc \
24 keybi2f.inc \
25 keybi48.inc \
26 keybshar.inc \
27 keyb.ctl \
28 keyb.cl1 \
29 keyb.cl2 \
30 keyb.cla \
31 keybdcl.inc \
32 keybtbbl.inc \
33 commsubs.inc \
34 keybcpsd.inc \
35 $(inc)\postequ.inc \
36 $(inc)\dseg.inc
37
38keybtbbl.obj: keybtbbl.asm
39
40commsubs.obj: commsubs.asm
41
42keybi2f.obj: keybi2f.asm
43
44keybi48.obj: keybi48.asm
45
46keyb.obj: keyb.asm
47
48keybcpsd.obj: keybcpsd.asm
49
50keybi9.obj: keybi9.asm
51
52keybi9c.obj: keybi9c.asm
53
54parser.obj: parser.asm \
55 $(inc)\parse.asm \
56 $(inc)\struc.inc \
57 keybdcl.inc \
58 makefile
59
60keyb.com: keyb.obj \
61 parser.obj \
62 keybcmd.obj \
63 keybtbbl.obj \
64 commsubs.obj \
65 keybi2f.obj \
66 keybi48.obj \
67 keybcpsd.obj \
68 keybi9.obj \
69 keybi9c.obj
70 link @keyb.lnk
71 exe2bin keyb.exe keyb.com
72 del keyb.exe
diff --git a/v4.0/src/CMD/KEYB/PARSER.ASM b/v4.0/src/CMD/KEYB/PARSER.ASM
new file mode 100644
index 0000000..808f37a
--- /dev/null
+++ b/v4.0/src/CMD/KEYB/PARSER.ASM
@@ -0,0 +1,517 @@
1PAGE ,132
2TITLE PARSE CODE AND CONTROL BLOCKS FOR KEYB.COM
3
4;****************** START OF SPECIFICATIONS **************************
5;
6; MODULE NAME: PARSER.ASM
7;
8; DESCRIPTIVE NAME: PARSES THE COMMAND LINE PARAMETERS FOR KEYB.COM
9;
10; FUNCTION: THE COMMAND LINE IN THE PSP IS PARSED FOR PARAMETERS.
11;
12; ENTRY POINT: PARSE_PARAMETERS
13;
14; INPUT: BP POINTS TO PARAMETER LIST
15; DS & ES POINT TO PSP
16;
17; AT EXIT:
18; PARAMETER LIST FILLED IN AS REQUIRED.
19;
20; INTERNAL REFERENCES:
21;
22; ROUTINES: SYSPARSE - PARSING CODE
23;
24; DATA AREAS: PARMS - PARSE CONTROL BLOCK FOR SYSPARSE
25;
26; EXTERNAL REFERENCES:
27;
28; ROUTINES: N/A
29;
30; DATA AREAS: PARAMETER LIST BLOCK TO BE FILLED.
31;
32; NOTES:
33;
34; REVISION HISTORY:
35; A000 - DOS Version 4.00
36; 3/24/88 AN003 - P3906 PARSER changes to return "bogus" parameter on the
37; "Parameter value not allowed " message - CNS
38; 5/12/88 AN004 - P4867 /ID:NON-Numeric hangs the sytem as a 1st positional
39;
40; COPYRIGHT: "The KEYB.COM Keyboard Driver"
41; "Version 4.00 (C) Copyright 1988 Microsoft"
42; "Licensed Material - Program Property of Microsoft"
43;
44; PROGRAM AUTHOR: WGR
45;
46;****************** END OF SPECIFICATIONS ****************************
47
48INCLUDE KEYBDCL.INC ;AN000
49
50ID_VALID EQU 0 ;AN000; ;AN000
51ID_INVALID EQU 1 ;AN000; ;AN000
52NO_ID EQU 2 ;AN000; ;AN000
53
54LANGUAGE_VALID EQU 0 ;AN000; ;AN000
55LANGUAGE_INVALID EQU 1 ;AN000; ;AN000
56NO_LANGUAGE EQU 2 ;AN000; ;AN000
57
58NO_IDLANG EQU 3 ;AN000; ;AN000
59
60CODE_PAGE_VALID EQU 0 ;AN000; ;AN000
61CODE_PAGE_INVALID EQU 1 ;AN000; ;AN000
62NO_CODE_PAGE EQU 2 ;AN000; ;AN000
63VALID_SYNTAX EQU 0 ;AN000; ;AN000
64INVALID_SYNTAX EQU 1 ;AN000; ;AN000
65
66COMMAND_LINE_START EQU 81H ;AN000; ;AN000
67RC_EOL EQU -1 ;AN000; ;AN000
68RC_NO_ERROR EQU 0 ;AN000; ;AN000
69RC_OP_MISSING EQU 2 ;AN000; ;AN000
70RC_NOT_IN_SW EQU 3 ;AN000; ;AN000
71;***CNS P4867 1st CHECK for /ID:ALPHA
72RC_SW_FIRST EQU 9 ;AN004; ;AN000
73;***CNS P4867 1st CHECK for /ID:ALPHA
74ERROR_COND EQU -1 ;AN000; ;AN000
75NUMBER EQU 1 ;AN000; ;AN000
76STRING EQU 3 ;AN000; ;AN000
77FILE_SPEC EQU 5 ;AN000; ;AN000
78MAX_ID EQU 999 ;AN000; ;AN000
79LANG_LENGTH EQU 2 ;AN000; ;AN000
80
81INVALID_SWITCH EQU 3
82TOO_MANY EQU 1
83INVALID_PARAM EQU 10
84VALUE_DISALLOW EQU 8
85
86.XLIST
87INCLUDE STRUC.INC ; Structured macros ;AN000
88.LIST
89
90PUBLIC PARSE_PARAMETERS ;AN003;; near procedure for parsing command line ;AN000
91PUBLIC CUR_PTR ;AN003;; near procedure for parsing command line ;AN000
92PUBLIC OLD_PTR ;AN003;; near procedure for parsing command line ;AN000
93PUBLIC ERR_PART;AN003;; near procedure for parsing command line ;AN000
94EXTRN BAD_ID:BYTE ;; WGR to match old code ;AN000; ;AN000
95EXTRN FOURTH_PARM:BYTE ;; WGR to match old code ;AN000; ;AN000
96EXTRN ONE_PARMID:BYTE ;; WGR to match old code ;AN000; ;AN000
97EXTRN FTH_PARMID:BYTE ;; WGR to match old code ;AN000; ;AN000
98EXTRN ALPHA:BYTE ;; WGR to match old code ;AN000; ;AN000
99
100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
101;
102; Set assemble switches for parse code that is not required!!
103;
104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
105
106DateSW EQU 0 ;AN000; ;AN000
107TimeSW EQU 0 ;AN000; ;AN000
108CmpxSW EQU 0 ;AN000; ;AN000
109DrvSW EQU 0 ;AN000; ;AN000
110QusSW EQU 0 ;AN000; ;AN000
111KeySW EQU 0 ;AN000; ;AN000
112Val1SW EQU 0 ;AN000; ;AN000
113Val2SW EQU 0 ;AN000; ;AN000
114Val3SW EQU 0 ;AN000; ;AN000
115
116
117CODE SEGMENT PUBLIC 'CODE' BYTE ;AN000; ;AN000
118 ASSUME CS:CODE,DS:CODE ;AN000; ;AN000
119
120.XLIST
121INCLUDE PARSE.ASM ; Parsing code ;AN000
122.LIST
123
124
125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
126; PARM control blocks for KEYB
127; Parsing command line as follows:
128;
129; KEYB [lang],[cp],[[d:][path]KEYBOARD.SYS][/ID:id]
130;
131;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
132
133PARMS LABEL WORD ;AN000; ;AN000
134 DW PARMSX ;AN000; ;AN000
135 DB 0 ;AN000;; no extra delimeters or EOLs. ;AN000
136
137PARMSX LABEL BYTE ;AN000; ;AN000
138 DB 0,3 ;AN000;; min,max positional operands ;AN000
139 DW LANG ;AN000;; pointer to control block ;AN000
140 DW CP ;AN000;; pointer to control block ;AN000
141 DW FILE_NAME ;AN000;; pointer to control block ;AN000
142 DB 1 ;AN000;; 1 switch ;AN000
143 DW ID_VALUE ;AN000;; pointer to control block ;AN000
144 DB 0 ;AN000;; no keywords ;AN000
145
146LANG LABEL WORD ;AN000; ;AN000
147 DW 0A001H ;AN000;; sstring or numeric value (optional) ;AN000
148 DW 0002H ;AN000;; cap result by char table (sstring) ;AN000
149 DW RESULT_BUF ;AN000;; result ;AN000
150 DW NOVALS ;AN000;; no value checking done ;AN000
151 DB 0 ;AN000;; no keyword/switch synonyms ;AN000
152
153CP LABEL WORD ;AN000; ;AN000
154 DW 8001H ;AN000;; numeric ;AN000
155 DW 0 ;AN000;; no functions ;AN000
156 DW RESULT_BUF ;AN000;; result ;AN000
157 DW NOVALS ;AN000;; no value checking done ;AN000
158 DB 0 ;AN000;; no keyword/switch synonyms ;AN000
159
160FILE_NAME LABEL WORD ;AN000; ;AN000
161 DW 0201H ;AN000;; file spec ;AN000
162 DW 0001H ;AN000;; cap by file table ;AN000
163 DW RESULT_BUF ;AN000;; result ;AN000
164 DW NOVALS ;AN000;; no value checking done ;AN000
165 DB 0 ;AN000;; no keyword/switch synonyms ;AN000
166
167ID_VALUE LABEL WORD ;AN000; ;AN000
168 DW 8010H ;AN000;; numeric ;AN000
169 DW 0 ;AN000;; no functions ;AN000
170 DW RESULT_BUF ;AN000;; result ;AN000
171 DW NOVALS ;AN000;; no value checking done ;AN000
172 DB 1 ;AN000;; 1 switch synonym ;AN000
173 DB "/ID",0 ;AN000;; ID switch ;AN000
174
175NOVALS LABEL BYTE ;AN000; ;AN000
176 DB 0 ;AN000;; no value checking done ;AN000
177
178RESULT_BUF LABEL BYTE ;AN000; ;AN000
179RESULT_TYPE DB 0 ;AN000;; type returned (number, string, etc.) ;AN000
180 DB ? ;AN000;; matched item tag (if applicable) ;AN000
181RESULT_SYN_PTR DW ? ;AN000;; synonym ptr (if applicable) ;AN000
182RESULT_VAL DD ? ;AN000;; value ;AN000
183
184LOOP_COUNT DB 0 ;AN000;; keeps track of parameter position ;AN000
185;***CNS
186CUR_PTR DW 0 ;AN003;; keeps track of parameter position ;AN000
187OLD_PTR DW 0 ;AN003;; keeps track of parameter position ;AN000
188ERR_PART DW 0 ;AN003;; keeps track of parameter position ;AN000
189;***CNS
190 ;AN000;; ..and reports an error condition ;AN000
191TEMP_FILE_NAME DB 128 DUP(0) ;AN000;; place for file name ;AN000
192
193;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
194;
195; PROCEDURE_NAME: PARSE_PARAMETERS
196;
197; FUNCTION:
198; THIS PROCEDURE PARSES THE COMMAND LINE PARAMETERS IN THE PSP FOR
199; KEYB.COM. THE PARAMETER LIST BLOCK IS FILLED IN ACCORDINGLY.
200;
201; AT ENTRY: AS ABOVE.
202;
203; AT EXIT:
204; AS ABOVE.
205;
206; AUTHOR: WGR
207;
208;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
209
210PARSE_PARAMETERS PROC NEAR ;AN000
211 XOR AX,AX ;AN000;; setup default parameters. ;AN000
212 MOV [BP].RET_CODE_1,NO_IDLANG ;AN000;; ;AN000
213 MOV [BP].RET_CODE_2,NO_CODE_PAGE ;AN000;; ;AN000
214 MOV [BP].RET_CODE_3,VALID_SYNTAX ;AN000;; ;AN000
215 MOV [BP].RET_CODE_4,NO_ID ;AN000;; ;AN000
216 MOV [BP].PATH_LENGTH,AX ;AN000;; ;AN000
217 LEA DI,PARMS ;AN000;; setup parse blocks ;AN000
218 MOV SI,COMMAND_LINE_START ;AN000;; ;AN000
219;***CNS
220
221 PUSH AX ;AN003;Save environment
222 MOV AX,CUR_PTR ;AN003;Set advancing ptr to end of argument
223 MOV OLD_PTR,AX ;AN003;after saving the beginning the string
224 MOV CUR_PTR,SI ;AN003;
225 POP AX ;AN003;Restore the environment
226
227;***CNS
228 XOR CX,CX ;AN000;; ;AN000
229 XOR DX,DX ;AN000;; ;AN000
230 CALL SYSPARSE ;AN000;; ;AN000
231 .WHILE <AX NE RC_EOL> near AND ;AN000;; while not end of line and.. ;AN000
232 .WHILE <LOOP_COUNT NE ERROR_COND> near ;AN000;; parameters valid do. ;AN000
233 .IF <AX EQ RC_NOT_IN_SW> near OR ;AN000;; invalid switch? ;AN000
234 .IF <AX EQ RC_SW_FIRST> near ;AN000;; invalid switch? ;AN000
235 MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; set invalid syntax flag. ;AN000
236 MOV LOOP_COUNT,ERROR_COND ;AN000;; set error flag to exit parse. ;AN000
237;***CNS
238 MOV ERR_PART,INVALID_SWITCH
239 PUSH AX ;AN003;Save environment
240 MOV AX,CUR_PTR ;AN003;Set advancing ptr to end of argument
241 MOV OLD_PTR,AX ;AN003;after saving the beginning the string
242 MOV CUR_PTR,SI ;AN003;
243 POP AX ;AN003;Restore the environment
244
245;***CNS
246 .ELSE ;AN000;; ;AN000
247 .IF <RESULT_SYN_PTR NE 0> ;AN000;; was the switch found? ;AN000
248 MOV AX,WORD PTR RESULT_VAL+2 ;AN000;; is it valid? ;AN000
249 OR AX,AX ;AN000;; ;AN000
250 .IF NZ OR ;AN000;; ;AN000
251 MOV AX,WORD PTR RESULT_VAL ;AN000;; ;AN000
252 .IF <AX A MAX_ID> ;AN000;; ;AN000
253 MOV [BP].RET_CODE_1,ID_INVALID ;AN000;; no...invalid id. ;AN000
254 MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; syntax error. ;AN000
255 MOV LOOP_COUNT,ERROR_COND ;AN000;; set flag to exit parse ;AN000
256 mov bad_id,1 ;AN000;; ;AN000
257;***CNS
258
259 PUSH AX ;AN003;Save environment
260 MOV AX,CUR_PTR ;AN003;Set advancing ptr to end of argument
261 MOV OLD_PTR,AX ;AN003;after saving the beginning the string
262 MOV CUR_PTR,SI ;AN003;
263 POP AX ;AN003;Restore the environment
264
265;***CNS
266 .ELSE ;AN000;; ;AN000
267 MOV [BP].RET_CODE_4,ID_VALID ;AN000;; yes...set return code 4. ;AN000
268 MOV [BP].ID_PARM,AX ;AN000;; ;AN000
269 mov fourth_parm,1 ;AN000;; ;AN000
270 mov fth_parmid,1 ;AN000;; ;AN000
271 .ENDIF ;AN000;; ;AN000
272 .ELSE ;AN000;; ;AN000
273 INC LOOP_COUNT ;AN000;; positional encountered... ;AN000
274 .SELECT ;AN000;; ;AN000
275 .WHEN <LOOP_COUNT EQ 1> ;AN000;; check for language ;AN000
276 CALL PROCESS_1ST_PARM ;AN000;; ;AN000
277
278;***CNS
279
280 PUSH AX ;AN003;Save environment
281 MOV AX,CUR_PTR ;AN003;Set advancing ptr to end of argument
282 MOV OLD_PTR,AX ;AN003;after saving the beginning the string
283 MOV CUR_PTR,SI ;AN003;
284 POP AX ;AN003;Restore the environment
285;***CNS
286
287
288 .WHEN <LOOP_COUNT EQ 2> ;AN000;; check for code page ;AN000
289 CALL PROCESS_2ND_PARM ;AN000;; ;AN000
290;***CNS
291
292 PUSH AX ;AN003;Save environment
293 MOV AX,CUR_PTR ;AN003;Set advancing ptr to end of argument
294 MOV OLD_PTR,AX ;AN003;after saving the beginning the string
295 MOV CUR_PTR,SI ;AN003;
296 POP AX ;AN003;Restore the environment
297;***CNS
298 .WHEN <LOOP_COUNT EQ 3> ;AN000;; check for file name ;AN000
299 CALL PROCESS_3RD_PARM ;AN000;; ;AN000
300;***CNS
301
302 PUSH AX ;AN003;Save environment
303 MOV AX,CUR_PTR ;AN003;Set advancing ptr to end of argument
304 MOV OLD_PTR,AX ;AN003;after saving the beginning the string
305 MOV CUR_PTR,SI ;AN003;
306 POP AX ;AN003;Restore the environment
307;***CNS
308 .OTHERWISE ;AN000;; ;AN000
309 MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; too many parms ;AN000
310;***CNS
311
312 PUSH AX ;AN003;Save environment
313 MOV AX,CUR_PTR ;AN003;Set advancing ptr to end of argument
314 MOV OLD_PTR,AX ;AN003;after saving the beginning the string
315 MOV CUR_PTR,SI ;AN003;
316 POP AX ;AN003;Restore the environment
317;***CNS
318 MOV ERR_PART,TOO_MANY
319 MOV LOOP_COUNT,ERROR_COND ;AN000;; set error flag to exit parse. ;AN000
320 .ENDSELECT ;AN000;; ;AN000
321 .ENDIF ;AN000;; ;AN000
322 MOV RESULT_TYPE,0 ;AN000;; reset result block. ;AN000
323 CALL SYSPARSE ;AN000;; parse next parameter. ;AN000
324 .ENDIF ;AN000;; ;AN000
325 .ENDWHILE ;AN000;; ;AN000
326 .IF <[BP].RET_CODE_4 EQ ID_VALID> AND ;AN000;; ensure that if the switch ;AN000
327 .IF <[BP].RET_CODE_1 NE LANGUAGE_VALID> ;AN000;; was used..that a valid keyboard ;AN000
328 MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; code was used.. ;AN000
329;***CNS
330
331 PUSH AX ;AN003;Save environment
332 MOV AX,CUR_PTR ;AN003;Set advancing ptr to end of argument
333 MOV OLD_PTR,AX ;AN003;after saving the beginning the string
334 MOV CUR_PTR,SI ;AN003;
335 POP AX ;AN003;Restore the environment
336 MOV ERR_PART,VALUE_DISALLOW
337;***CNS
338 .ENDIF ;AN000;; ;AN000
339 RET ;AN000;; ;AN000
340PARSE_PARAMETERS ENDP ;AN000; ;AN000
341
342
343;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
344;
345; PROCEDURE_NAME: PROCESS_1ST_PARM
346;
347; FUNCTION:
348; THIS PROCEDURE PROCESSES THE FIRST POSITIONAL PARAMETER. THIS SHOULD
349; BE THE LANGUAGE ID OR THE KEYBOARD ID.
350;
351; AT ENTRY: PARSE RESULT BLOCK CONTAINS VALUES IF AX HAS NO ERROR.
352;
353; AT EXIT:
354; PARAMETER CONTROL BLOCK UPDATED FOR LANGUAGE ID.
355;
356; AUTHOR: WGR
357;
358;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
359
360PROCESS_1ST_PARM PROC NEAR ;AN000
361 .IF <AX GT RC_NO_ERROR> ;AN000;; error on parse? ;AN000
362 MOV [BP].RET_CODE_1,LANGUAGE_INVALID ;AN000;; yes...set invalid language ;AN000
363 MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; and syntax error.. ;AN000
364 MOV LOOP_COUNT,ERROR_COND ;AN000;; set flag to exit parse. ;AN000
365 MOV ERR_PART,AX ;AN003;;
366 .ELSE near ;AN000;; ;AN000
367
368 .IF <RESULT_TYPE EQ NUMBER> ;AN000;; was this a number (id)? ;AN000
369 MOV AX,WORD PTR RESULT_VAL+2 ;AN000;; yes...check to see if ;AN000
370 OR AX,AX ;AN000;; within range. ;AN000
371 .IF NZ OR ;AN000;; ;AN000
372 MOV AX,WORD PTR RESULT_VAL ;AN000;; ;AN000
373 .IF <AX A MAX_ID> ;AN000;; ;AN000
374 MOV [BP].RET_CODE_1,ID_INVALID ;AN000;; no...invalid id. ;AN000
375 MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; syntax error. ;AN000
376 MOV LOOP_COUNT,ERROR_COND ;AN000;; set flag to exit parse ;AN000
377 mov bad_id,1 ;AN000;; ;AN000
378 .ELSE ;AN000;; ;AN000
379 MOV [BP].RET_CODE_1,ID_VALID ;AN000;; valid id...set ;AN000
380 MOV [BP].RET_CODE_4,ID_VALID ;AN000;; valid id...set ;AN000
381 MOV [BP].ID_PARM,AX ;AN000;; and value moved into block ;AN000
382 MOV LOOP_COUNT,4 ;AN000;; there should be no more parms ;AN000
383 mov one_parmid,1 ;AN000;; ;AN000
384 .ENDIF ;AN000;; ;AN000
385 .ELSEIF <RESULT_TYPE EQ STRING> ;AN000;; must be a string then.. ;AN000
386 PUSH SI ;AN000;; ;AN000
387 PUSH DI ;AN000;; ;AN000
388 PUSH CX ;AN000;; ;AN000
389 PUSH DS ;AN000;; ;AN000
390 LDS SI,RESULT_VAL ;AN000;; get ptr to string ;AN000
391 MOV DI,BP ;AN000;; ;AN000
392 ADD DI,LANGUAGE_PARM ;AN000;; point to block for copy. ;AN000
393 MOV CX,LANG_LENGTH ;AN000;; maximum length = 2 ;AN000
394 LODSB ;AN000;; load AL with 1st char.. ;AN000
395 .WHILE <CX NE 0> AND ;AN000;; do twice....unless ;AN000
396 .WHILE <AL NE 0> ;AN000;; there is only 1 character. ;AN000
397 STOSB ;AN000;; store ;AN000
398 DEC CX ;AN000;; dec count ;AN000
399 LODSB ;AN000;; load ;AN000
400 .ENDWHILE ;AN000;; ;AN000
401 .IF <CX NE 0> OR ;AN000;; if there was less than 2 or.. ;AN000
402 .IF <AL NE 0> ;AN000;; greater than 2 characters then.. ;AN000
403 MOV [BP].RET_CODE_1,LANGUAGE_INVALID ;AN000;; invalid. ;AN000
404 MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; syntax error ;AN000
405 MOV ERR_PART,INVALID_PARAM
406 MOV LOOP_COUNT,ERROR_COND ;AN000;; set flag to exit parse. ;AN000
407 .ELSE ;AN000;; ;AN000
408 MOV [BP].RET_CODE_1,LANGUAGE_VALID ;AN000;; valid language has been copied ;AN000
409 MOV ALPHA,1 ;AN000;; language found ;AN000
410 .ENDIF ;AN000;; ;AN000
411 POP DS ;AN000;; ;AN000
412 POP CX ;AN000;; ;AN000
413 POP DI ;AN000;; ;AN000
414 POP SI ;AN000;; ;AN000
415 .ELSE ;AN000;; ommited parameter... ;AN000
416 MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; invalid since further parameters.;AN000
417 .ENDIF ;AN000;; ;AN000
418 .ENDIF ;AN000;; ;AN000
419 RET ;AN000;; ;AN000
420PROCESS_1ST_PARM ENDP ;AN000; ;AN000
421
422
423;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
424;
425; PROCEDURE_NAME: PROCESS_2ND_PARM
426;
427; FUNCTION:
428; THIS PROCEDURE PROCESSES THE 2ND POSITIONAL PARAMETER. THIS SHOULD
429; BE THE CODE PAGE, IF REQUESTED.
430;
431; AT ENTRY: PARSE RESULT BLOCK CONTAINS VALUES IF AX HAS NO ERROR.
432;
433; AT EXIT:
434; PARAMETER CONTROL BLOCK UPDATED FOR CODE PAGE.
435;
436; AUTHOR: WGR
437;
438;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
439
440PROCESS_2ND_PARM PROC NEAR ;AN000
441 .IF <AX GT RC_NO_ERROR> ;AN000;; if parse error.. ;AN000
442 MOV [BP].RET_CODE_2,CODE_PAGE_INVALID ;AN000;; mark invalid.. ;AN000
443 MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; syntax error ;AN000
444 MOV LOOP_COUNT,ERROR_COND ;AN000;; set flag to exit parse ;AN000
445 MOV ERR_PART,AX ;AN003;;
446 .ELSE ;AN000;; ;AN000
447 .IF <RESULT_TYPE EQ NUMBER> ;AN000;; was parameter specified? ;AN000
448 MOV AX,WORD PTR RESULT_VAL+2 ;AN000;; yes..if code page not.. ;AN000
449 OR AX,AX ;AN000;; ;AN000
450 .IF NZ OR ;AN000;; ;AN000
451 MOV AX,WORD PTR RESULT_VAL ;AN000;; valid..then ;AN000
452 .IF <AX A MAX_ID> ;AN000;; ;AN000
453 MOV [BP].RET_CODE_2,CODE_PAGE_INVALID ;AN000;; mark invalid.. ;AN000
454 MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; syntax error ;AN000
455 MOV LOOP_COUNT,ERROR_COND ;AN000;; set flag to exit parse ;AN000
456 .ELSE ;AN000;; ;AN000
457 MOV [BP].RET_CODE_2,CODE_PAGE_VALID;AN000;; else...valid code page ;AN000
458 MOV [BP].CODE_PAGE_PARM,AX ;AN000;; move into parm ;AN000
459 .ENDIF ;AN000;; ;AN000
460 .ELSE ;AN000;; ;AN000
461 MOV [BP].RET_CODE_2,NO_CODE_PAGE ;AN000;; mark as not specified. ;AN000
462 .ENDIF ;AN000;; ;AN000
463 .ENDIF ;AN000;; ;AN000
464 RET ;AN000;; ;AN000
465PROCESS_2ND_PARM ENDP ;AN000; ;AN000
466
467
468;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
469;
470; PROCEDURE_NAME: PROCESS_3RD_PARM
471;
472; FUNCTION:
473; THIS PROCEDURE PROCESSES THE 3RD POSITIONAL PARAMETER. THIS SHOULD
474; BE THE KEYBOARD DEFINITION FILE PATH, IF SPECIFIED.
475;
476; AT ENTRY: PARSE RESULT BLOCK CONTAINS VALUES IF AX HAS NO ERROR.
477;
478; AT EXIT:
479; PARAMETER CONTROL BLOCK UPDATED FOR FILE NAME.
480;
481; AUTHOR: WGR
482;
483;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
484
485PROCESS_3RD_PARM PROC NEAR ;AN000; ;AN000
486 .IF <AX GT RC_NO_ERROR> ;AN000;; if parse error then.. ;AN000
487 MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; syntax error. ;AN000
488 MOV LOOP_COUNT,ERROR_COND ;AN000;; set flag to exit parse ;AN000
489 MOV ERR_PART,AX ;AN003;;
490 .ELSE ;AN000;; ;AN000
491 .IF <RESULT_TYPE EQ FILE_SPEC> ;AN000;; ;AN000
492 PUSH DS ;AN000;; ;AN000
493 PUSH SI ;AN000;; ;AN000
494 PUSH DI ;AN000;; ;AN000
495 PUSH CX ;AN000;; ;AN000
496 LDS SI,RESULT_VAL ;AN000;; load offset of file name ;AN000
497 LEA DI,TEMP_FILE_NAME ;AN000;; ;AN000
498 MOV [BP].PATH_OFFSET,DI ;AN000;; copy to parameter block ;AN000
499 XOR CX,CX ;AN000;; ;AN000
500 LODSB ;AN000;; count the length of the path. ;AN000
501 .WHILE <AL NE 0> ;AN000;; ;AN000
502 STOSB ;AN000;; ;AN000
503 LODSB ;AN000;; ;AN000
504 INC CX ;AN000;; ;AN000
505 .ENDWHILE ;AN000;; ;AN000
506 MOV [BP].PATH_LENGTH,CX ;AN000;; copy to parameter block ;AN000
507 POP CX ;AN000;; ;AN000
508 POP DI ;AN000;; ;AN000
509 POP SI ;AN000;; ;AN000
510 POP DS ;AN000;; ;AN000
511 .ENDIF ;AN000;; ;AN000
512 .ENDIF ;AN000;; ;AN000
513 RET ;AN000;; ;AN000
514PROCESS_3RD_PARM ENDP ;AN000; ;AN000
515 ;AN000;
516CODE ENDS ;AN000;
517 END ;AN000;