3 TITLE DOS
- KEYB Command
- Transient Command Processing
5 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6 ;; DOS - NLS Support - KEYB Command
7 ;; (C) Copyright 1988 Microsoft
9 ;; File Name: KEYBCMD.ASM
14 ;; Contains transient command processing modules for KEYB command.
16 ;; Documentation Reference:
17 ;; ------------------------
18 ;; PC DOS 3.3 Detailed Design Document - May ?? 1986
20 ;; Procedures contained in this file:
21 ;; ----------------------------------
22 ;; KEYB_COMMAND: Main routine for command processing.
23 ;; PARSE_PARAMETERS: Validate syntax of parameters included
25 ;; BUILD_PATH: Find KEYBOARD.SYS file and validate language and/or
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.
33 ;; Include Files Required:
34 ;; -----------------------
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
60 ;; Revised for DOS 4.00 - NickS
62 ;; AN002- DCR ???? -KEYBAORD SECURITY LOCK - CNS
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
73 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
75 PUBLIC KEYB_COMMAND
;;
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
;;
90 PUBLIC FILE_BUFFER_SIZE
92 ;*****************CNS********************
93 PUBLIC ID_PTR_SIZE
;AN000;
94 PUBLIC LANG_PTR_SIZE
;AN000;
95 PUBLIC CP_PTR_SIZE
;AN000;
97 PUBLIC NUM_LANG
;AN000;
99 PUBLIC SHARED_AREA_PTR
;;
100 ;*****************CNS********************
101 PUBLIC SD_SOURCE_PTR
;;
102 PUBLIC TEMP_SHARED_DATA
;;
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
112 EXTRN SECURE_FL
:BYTE ;an002;
113 EXTRN CUR_PTR
:WORD ;an003;
114 EXTRN OLD_PTR
:WORD ;an003;
115 EXTRN ERR_PART
:WORD ;an003;
118 INCLUDE STRUC.INC ;AN000;;; WGR structured macros ;AN000
119 INCLUDE SYSMSG
.INC ;AN000;;; WGR message retriever ;AN000
122 MSG_UTILNAME
<KEYB
> ;AN000;;; WGR identify to message retriever ;AN000
124 CODE SEGMENT PUBLIC 'CODE' ;;
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 ;;
139 INCLUDE POSTEQU
.INC ;;
143 ASSUME
CS:CODE,DS:CODE ;;
145 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
147 ;; Module: KEYB_COMMAND
150 ;; Main routine for transient command processing.
153 ;; DS - points to our data segment
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.
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)
174 ;; Set SHARED_AREA_PTR to ES:SHARED_AREA
175 ;; Get HW_TYPE (set local variable)
177 ;; INSTALLED_KEYB := 1
179 ;; IF CPS-CON has been loaded THEN
180 ;; INSTALLED_CON := 1
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
190 ;; IF no language parm specified
191 ;; AND code page is not invalid
192 ;; AND syntax is valid THEN
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
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
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
208 ;; Display ASCII representation of code page, CR/LF
209 ;; EXIT without staying resident
212 ;; Call BUILD_PATH := Determine location of Keyboard definition file
214 ;; IF error in opening file THEN
215 ;; Display ERROR message and EXIT
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
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
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
236 ;; READ Code page table
237 ;; IF error in reading file THEN
238 ;; Display ERROR message and EXIT
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
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
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
260 ;; Display ERROR message
262 ;; IF a code page has been invoked THEN
263 ;; Copy invoked code page into table of code pages to build
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
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
273 ;; EXIT without staying resident
274 ;; Call INSTALL_INT_9 := Install INT 9 handler
275 ;; Call FIND_KEYB_TYPE := Determine the keyboard type
277 ;; Call TABLE_BUILD := Build the TEMP_SHARED_DATA_AREA
279 ;; IF return codes from TABLE_BUILD are INVALID THEN
280 ;; IF KEYB_INSTALLED := 0 THEN
282 ;; Display corresponding ERROR message
283 ;; EXIT without staying resident
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
296 ;; Get resident end and copy TEMP_SHARED_DATA_AREA into SHARED_DATA_AREA
297 ;; EXIT but stay resident
299 ;; IF this was not a query call AND exit code was valid THEN
301 ;; Get resident end and copy TEMP_SHARED_DATA_AREA into SHARED_DATA_AREA
302 ;; EXIT without staying resident
305 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
307 INVALID_PARMS EQU
1 ;; EXIT return codes
308 BAD_KEYB_DEF_FILE EQU
2 ;;
309 MEMORY_OVERFLOW EQU
3 ;;
310 CONSOLE_ERROR EQU
4 ;;
311 CP_NOT_DESIGNATED EQU
5 ;;
312 KEYB_TABLE_NOT_LOAD EQU
6 ;;
313 BAD_DOS_VER EQU
7 ;AN000;;; WGR ;AN000
315 EXIT_RET_CODE
DB 0 ;;
316 ;******************** CNS *********** ;AN000;;;
317 ID_VALID EQU
0 ;AN000;;;
318 ID_INVALID EQU
1 ;AN000;;;
319 NO_ID EQU
2 ;AN000;;;
320 LANGUAGE_VALID EQU
0 ;AN000;;;
321 LANGUAGE_INVALID EQU
1 ;AN000;;; Return Codes
322 NO_LANGUAGE EQU
2 ;AN000;;; from
323 NO_IDLANG EQU
3 ;AN000;;;
324 ;******************** CNS *********** ;;
325 CODE_PAGE_VALID EQU
0 ;; EDIT_LANGUAGE_CODE
326 CODE_PAGE_INVALID EQU
1 ;;
327 NO_CODE_PAGE EQU
2 ;;
328 VALID_SYNTAX EQU
0 ;;
329 INVALID_SYNTAX EQU
1 ;;;;;;;
331 ACT_KEYB EQU
2 ;AC000;;; WGR ;AN000
332 ACT_ID EQU
3 ;AC000;;; WGR ;AN000
333 ACT_KEYB_CP EQU
4 ;AC000;;; WGR ;AN000
334 ACT_CON_CP EQU
5 ;AC000;;; WGR ;AN000
335 INV_L EQU
6 ;AC000;;; WGR message numbers... ;AN000
336 INV_I EQU
7 ;AC000;;; WGR ;AN000
337 INV_CP EQU
8 ;AC000;;; WGR ;AN000
338 INV_S EQU
18 ;AC000;;; WGR ;AN000
339 INV_FN EQU
9 ;AC000;;; WGR ;AN000
340 INV_KEYB_Q EQU
10 ;AC000;;; WGR ;AN000
341 INV_CON_Q EQU
11 ;AC000;;; WGR ;AN000
342 NOT_DESIG EQU
12 ;AC000;;; WGR ;AN000
343 NOT_SUPP EQU
13 ;AC000;;; WGR ;AN000
344 NOT_VALID EQU
14 ;AC000;;; WGR ;AN000
345 WARNING_1 EQU
15 ;AC000;;; WGR ;AN000
346 INV_COMBO EQU
16 ;AC000;;; WGR ;AN000
347 MEMORY_OVERF EQU
17 ;AC000;;; WGR ;AN000
348 CR_LF
DB 10,13,'$' ;; WGR ;AN000
350 FOURTH_PARM
DB 0 ;AN000;;; WGR switch was specified ;AN000
351 ONE_PARMID
DB 0 ;AN000;;; WGR id given as positional ;AN000
352 FTH_PARMID
DB 0 ;AN000;;; WGR id given as switch ;AN000
353 ID_FOUND
DB 0 ;AN000;;; WGR id was good (in k.d. file) ;AN000
354 BAD_ID
DB 0 ;AN000;;; WGR id was bad (from parse) ;AN000
355 ALPHA
DB 0 ;AN000;;; WGR first parm a language id ;AN000
357 ID_DISPLAYED
DB 0 ;AN000;;; WGR Indicating ID already displayed ;AN000
359 SUBLIST_NUMBER
LABEL BYTE ;AN000;;; WGR sublist for numbers ;AN000
360 DB 11 ;AN000;;; WGR size ;AN000
361 DB 0 ;AN000;;; WGR ;AN000
362 PTR_TO_NUMBER
DW ?
;AN000;;; WGR offset ptr ;AN000
363 SEG_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
371 SUBLIST_ASCIIZ
LABEL BYTE ;AN000;;; WGR sublist for asciiz ;AN000
372 DB 11 ;AN000;;; WGR size ;AN000
373 DB 0 ;AN000;;; WGR ;AN000
374 PTR_TO_ASCIIZ
DW ?
;AN000;;; WGR offset ptr ;AN000
375 SEG_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
382 NUMBER_HOLDER
DW ?
;AN000;;; WGR used for message retriever ;AN000
384 SUBLIST_COMLIN
LABEL BYTE ;an003;;; WGR sublist for asciiz ;AN000
385 DB 11 ;an003;;; WGR size ;AN000
386 DB 0 ;an003;;; WGR ;AN000
387 PTR_TO_COMLIN
DW ?
;an003;;; WGR offset ptr ;AN000
389 DB 0 ;an003;;; WGR ;AN000
390 DB LEFT_ALIGN
+CHAR_FIELD_ASCIIZ
;AN000;;; WGR flag ;AN000
392 DB 0 ;an003;;; WGR max width ;AN000
393 DB 1 ;an003;;; WGR min width ;AN000
394 DB " " ;an003;;; WGR filler ;AN000
397 STRING_HOLDER
DB 64 DUP(0)
400 FILE_BUFFER_SIZE EQU
50*6
401 FILE_BUFFER
DB FILE_BUFFER_SIZE
DUP(0) ;AC000;;; Buffer for Keyboard Def file
402 FB EQU FILE_BUFFER
;AC000;m for 32 language entries)
403 DESIG_CP_BUFFER
DW 28 DUP(?
) ;; (Room for 25 code pages)
404 DESIG_CP_BUF_LEN
DW $-DESIG_CP_BUFFER
;; Length of code page buffer
406 CP_TAB_OFFSET
DD ?
;;
407 ;****************** CNS ******************;AN000;
408 TOTAL_SIZE
DW 0 ;AN000;
409 PASS_LANG
DW 0 ;AN000;
410 ID_TAB_OFFSET
DD ?
;AN000;
411 ;****************** CNS ******************;;
412 STATE_LOGIC_OFFSET
DD -1 ;;
413 KEYBSYS_FILE_HANDLE
DW ?
;;;;;;;;;;;
414 TB_RETURN_CODE
DW 1 ;;
415 DESIG_CP_OFFSET
DW OFFSET DESIG_CP_BUFFER
;;
416 SYS_CODE_PAGE
DW 0 ;;
422 SIGNATURE
DB 0FFh,'KEYB ' ;;
423 SIGNATURE_LENGTH
DW 8 ;;
424 ;****************** CNS ***************************;AN000;
427 NUM_LANG
DW 0 ;AN000;
429 ID_PTR_SIZE
DW SIZE KEYBSYS_ID_PTRS
;AN000;
430 ;****************** CNS *****************************
431 LANG_PTR_SIZE
DW SIZE KEYBSYS_LANG_PTRS
;;
432 CP_PTR_SIZE
DW SIZE KEYBSYS_CP_PTRS
;;
433 KEYBCMD_LANG_ENTRY_PTR
DD ?
;;
435 KEYB_INSTALLED
DW 0 ;;
436 CON_INSTALLED
DW 0 ;;
437 SHARED_AREA_PTR
DD 0 ;;
439 ;****************** CNS ***************************;;
440 LANGUAGE_ASCII
DB '??',0 ;; WGR ;AC000
442 CMD_PARM_LIST PARM_LIST
<> ;;
444 JR_LANGUAGE_CODES
DW 'FR','GR','IT','SP','UK' ;;
446 JR_NUM_CODES EQU
5 ;;
447 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
448 ;---------- TABLES FOR EXTENDED KEYBOARD SUPPORT CTRL CASE --------- RWV 11-06-85 ;;
450 RPL_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 ;;
467 L_CTRL_TAB EQU
$-RPL_K8
;;
469 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
471 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
473 KEYB_COMMAND PROC
NEAR ;;
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
481 VERSION_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
487 KEYB_INSTALL_CHECK: ;;
488 MOV AX,0AD80H ;; KEYB install check
490 CMP AL,-1 ;; If flag is not 0FFh THEN
492 MOV WORD PTR SHARED_AREA_PTR
+2,OFFSET TSD
;;
493 JMP CON_INSTALL_CHECK
;;
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
;;
501 MOV ES:[DI].TABLE_OK
,0 ;; Do not allow processing
502 PUSH CS ;; while building table
503 POP ES ;; Reset ES until required
505 CON_INSTALL_CHECK: ;;;;;;;
506 MOV AX,0AD00H ;; CONSOLE install check
508 CMP AL,-1 ;; If flag is not 0FFh THEN
510 JMP CALL_FIRST_STAGE
;;
513 MOV CON_INSTALLED
,1 ;; Set CON_INSTALLED flag = YES
518 CALL PARSE_PARAMETERS
;; Validate parameter list
520 BEGIN_PARM_CHECK: ;; CHECK ALL RETURN CODES
521 MOV DL,[BP].RET_CODE_3
;;
522 CMP DL,1 ;; Check for invalid syntax
527 MOV DL,[BP].RET_CODE_1
;; Check for invalid language parm
533 MOV DL,[BP].RET_CODE_2
;; Check for invalid code page parm
539 MOV DL,[BP].RET_CODE_1
;; Check for query command
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 **;;
548 ;; IF QUERY is requested THEN
551 MOV AX,KEYB_INSTALLED
;; If KEYB is installed THEN
553 JE QUERY_CONTINUE1
;;;;;;;;;;;;;;;;
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
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
;;
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
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;;;
600 MOV BX,ES:[DI].INVOKED_CP_TABLE
;; Get invoked code page
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
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
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
634 MOV AX,CON_INSTALLED
;; If CON has been installed THEN
637 JMP CON_NOT_INSTALLED
;;
640 MOV AX,0AD02H ;; Get active code page
641 INT 2FH
;; information from the console
642 JNC DISPLAY_ACTIVE_CP
;;
645 DISPLAY_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
657 JMP KEYB_EXIT_NOT_RESIDENT
;; Exit from Proc
659 CON_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
668 NOT_QUERY: ;; IF not a query function requested
669 CALL BUILD_PATH
;; Determine location of KEYBOARD.SYS
670 ;; WGR ...and open file. ;AC000
672 JNC VALID4
;; If no error in opening file then
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
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
695 LOST_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 ***********;;
700 GET_LANG: ;; Must be a language/or a 1st parm ID
703 XOR DI,DI ;; Set number
704 LEA CX,[DI].KH_NUM_LANG
+2 ;; bytes to read header
706 MOV AH,3FH
;; Read header of the Keyb Def file
708 JNC VALID5
;; If no error in opening file then
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
717 JE LANGUAGE_SPECIFIED
;;
719 ;; READ the language table
720 LANGUAGE_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
726 CMP CX,FILE_BUFFER_SIZE
;; Make sure buffer is not to small
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
737 MOV CX,NUM_LANG
;; Number of valid codes
738 MOV DI,OFFSET FILE_BUFFER
;; Point to correct word in table
740 SCAN_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
749 ;**************************** CNS ****;;;;
750 GET_ID: ;AN000;;; CNS - Must be an ID value
751 mov cx,1 ;AN000;;; initialize ctr value for # of ids
753 SEARCH_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
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 *****************;;
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
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 **********************************************
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
805 ;;ids available for the
806 CHK1N4: ;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
814 CHK4PARM: ;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
818 ; xor cx,cx ;AN000; ;;clear to exit loop
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
827 xor cx,cx ;AN000; ;; end loop
830 pop di ;AN000; ;;restore entry value
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
842 jmp SEARCH_ID
;AN000; ;;for the country
844 ;.ENDWHILE ;;end of ID check for country
848 cmp FOURTH_PARM
,1 ;AN000; ;; see if id was found
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
856 ;; otherwise found it
857 ;; continue to build tbl
858 ;**************************** CNS **********************************************
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
866 MOV DL,[BP].RET_CODE_2
;;;;;;;;;; IF code page was specified
868 JNE CODE_PAGE_SPECIFIED
;;
871 CODE_PAGE_SPECIFIED: ;; Then
872 ;************************** CNS ***********************************************
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
880 CMP CX,FILE_BUFFER_SIZE
;; Make sure buffer is not to small
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
891 MOV CX,NUM_CP
;; Number of valid codes
892 MOV DI,OFFSET FILE_BUFFER
;; Point to correct word in table
894 SCAN_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
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 ;;
910 MOV SI,OFFSET DESIG_CP_BUFFER
;;
912 MOV AX,CON_INSTALLED
;;;;; If CON is NOT installed THEN
919 MOV NUM_DESIG_CP
,CX ;; Set number of CPs = 1
920 MOV [SI].NUM_DESIGNATES
,CX ;;
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
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
935 SET_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
;;
941 GET_DESIG_CPS: ;; ELSE
943 PUSH CS ;; Make sure ES is set
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
951 SET_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
958 INT 2FH
;; Get invoked code page
960 SET_TO_CP_INVOKED: ;;
961 MOV DL,[BP].RET_CODE_2
;; IF code page parm was specified
963 JNE SET_TO_INVOKED_CP
;;
964 MOV CX,NUM_DESIG_CP
;;
966 JMP TEST_IF_DESIGNATED
;;
968 SET_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
976 SET_TO_INVOKED_CP2: ;;
977 MOV [BP].CODE_PAGE_PARM
,BX ;;
978 MOV SYS_CODE_PAGE
,BX ;;
980 JMP TEST_IF_DESIGNATED
;;
982 SET_TO_INVOKED_CP3: ;;
983 MOV [BP].CODE_PAGE_PARM
,BX ;;
985 TEST_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 ?
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
996 CODE_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 ;;***************************************************************************
1016 READY_TO_BUILD_TABLE: ;;
1018 MOV AX,KEYB_INSTALLED
;;
1019 CMP AX,0 ;; Else if KEYB has not been installed
1020 JNE BUILD_THE_TABLE
;;
1022 CALL FIND_SYS_TYPE
;; Determine system type for INT 9 use
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
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:
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
1039 ;I AM GOING TO IGNORE WHAT LANGUAGE IS CURRENTLY SET. I WILL SET THE
1040 ;MULTILINGUAL KEYBOARD TO BECOME MY LANGUAGE.
1042 MOV AX,[BP].LANGUAGE_PARM
;;
1044 MOV DI,OFFSET JR_LANGUAGE_CODES
;;
1045 MOV CX,JR_NUM_CODES
;;
1049 JNE CONTINUE_INSTALL
;;
1051 MOV AH,5 ; ADDRESS THE MULTILINGUAL KEYBOARD
1052 MOV AL,JR_NUM_CODES
; SELECT MY LANGUAGE
1054 INT 16H
; SET THE KEYBOARD ACCORDINGLY
1055 INT 20H
; JOB DONE, ROM IS MULTILINGUAL
1056 ; NO NEED TO STAY RESIDENT
1058 ;------ LOAD IN SPECIAL INT 9 HANDLER AND SPECIAL TABLES (IF NEEDED)
1060 CONTINUE_INSTALL: ;;
1061 CALL INSTALL_INT_9
;; Install INT 9
1063 CALL FIND_KEYB_TYPE
;; Determine keyboard type table use
1066 CALL TABLE_BUILD
;; Build the TEMP_SHARED_DATA_AREA
1069 XOR CX,CX ;; Take appropriate action considering
1070 MOV CX,TB_RETURN_CODE
;; return codes from TABLE_BUILD
1072 JE CHECK_FOR_INV_CP
;; If return code is not 0
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
1079 CHECK_ERROR_CONTINUE: ;;
1080 CMP CX,1 ;; If return code = 1
1082 JMP ERROR1
;; display error message
1085 CMP CX,2 ;; If return code = 2
1090 CMP CX,3 ;; If return code = 3
1092 JMP ERROR3
;; display error message
1095 CMP CX,4 ;; If return code = 4
1096 JNE CHECK_ERROR5A
;;
1097 JMP ERROR4
;; display error message
1100 CMP CX,5 ;; If return code = 5
1101 JNE CHECK_ERROR6A
;;
1102 JMP ERROR5A
;; display error message
1105 JMP ERROR6A
;; If return code not 0,1,2,3,4 then
1106 ;; display error message
1107 CHECK_FOR_INV_CP: ;;
1108 MOV CX,CPN_INVALID
;; Check if any CPs were not loaded
1110 JE TERMINATE
;; If some were invalid, issue
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 ;;***************************************************************************
1126 MOV AH,3EH
;; Close the KEYBOARD.SYS file
1127 MOV BX,KEYBSYS_FILE_HANDLE
;; if open
1132 MOV AX,KEYB_INSTALLED
;;
1135 JMP KEYB_EXIT_NOT_RESIDENT
;;
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
1145 CMP SECURE_FL
,1 ;AN002;; IF SECURITY FLAG SET
1146 JNE NO_FERRARI_G
;AN002;; DON'T TURN ON NUM_LK
1149 CALL NUMLK_ON
;; N..TURN NUMLK ON
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
1159 REP MOVSB ;; OVERLAY WITH EXT. CTRL TABLE
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)
1166 MOV AX,0AD82H ;; Activate language
1170 MOV DX,ES:TSD
.RESIDENT_END
;; Get resident end
1171 MOV CL,4 ;; Convert into paragrahs
1174 MOV AH,31H
;; Function call to terminate but stay
1175 XOR AL,AL ;; resident
1177 MOV DI,OFFSET SD_DEST_PTR
;; Initialize destination ptr
1178 MOV SI,OFFSET SD_SOURCE_PTR
;; Initialize source ptr
1180 LEA BX,[BP].ACTIVE_LANGUAGE
;;
1181 ADD DI,BX ;; Adjust for portion not copied
1182 ADD SI,BX ;; Adjust for portion not copied
1184 MOV CX,SD_LENGTH
;; Set length of SHARED_DATA_AREA
1185 SUB CX,BX ;; Adjust for portion not copied
1187 JMP COPY_SD_AREA
;; Jump to proc that copies area in new
1189 ;***************************** CNS *********************************************
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
;;
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 *********************************************
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
;;
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
;;
1240 ;;***************************************************************************
1241 MOV AX,INV_S
;AN000;;; WGR invalid syntax message ;AN000
1242 MOV BX,STDOUT
;AN000;;; WGR to standard out ;AN000
1245 LEA DI,STRING_HOLDER
;AN003;Set PTR to look at the STRING
1246 PUSH SI ;AN003;Save current SI index
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
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
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
1257 LEA DI,STRING_HOLDER
;AN003;Set PTR to look at the STRING
1260 POP SI ;AN003;Restore the PTR to the command line position
1262 MOV CX,1 ;AN003;One replacement
1263 MOV PTR_TO_COMLIN
,DI ;AN003;;; WGR language code asciiz string ;AN000
1267 MOV AX,DS ;AN003;;; WGR language code asciiz string ;AN000
1268 MOV SEG_OF_COMLIN
,AX ;AN003;
1270 ;XOR CX,CX ;AN000;;; WGR no substitutions ;AN000
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
;;
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
;;
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
;;
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
;;
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
;;
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 ;;***************************************************************************
1346 KEYB_EXIT_NOT_RESIDENT: ;;
1348 MOV AL,QUERY_CALL
;; Check if this was a query call
1350 JNE KEYB_EXIT3
;; IF yes then EXIT
1351 MOV AL,EXIT_RET_CODE
;; Check if return code was valid
1353 JNE KEYB_EXIT3
;; IF not then EXIT
1356 MOV AX,0AD82H ;; Activate language
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
1369 MOV SI,OFFSET SD_SOURCE_PTR
;; Initialize source ptr
1371 LEA BX,[BP].ACTIVE_LANGUAGE
;;
1374 MOV CX,SD_LENGTH
;; Set length of SHARED_DATA_AREA
1377 JMP COPY_SD_AREA
;; Jump to proc that copies area in new
1379 KEYB_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 ;;
1386 KEYB_COMMAND ENDP
;;
1388 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1390 ;; Procedure: NUMLK_ON
1393 ;; Turn Num Lock On.
1398 ;; Output Registers:
1402 ;; Set Num Lock bit in BIOS KB_FLAG
1403 ;; Issue Int 16 to update lights
1406 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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
1426 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1428 ;; Module: INSTALL_INT_9
1431 ;; Install our INT 9 driver.
1434 ;; DS - points to our data segment
1435 ;; BP - points to ES to find SHARED_DATA_AREA
1437 ;; Output Registers:
1438 ;; DS - points to our data segment
1439 ;; AX, BX, DX, ES Trashed
1442 ;; Get existing vector
1443 ;; Install our vector
1448 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1450 REPLACE_INT_SEGMENT1
DW ?
;;
1452 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1454 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1456 INSTALL_INT_9 PROC
;;
1460 MOV AH,35H
;; Get int 9 vector
1462 INT 21H
;; Vector in ES:BX
1463 MOV REPLACE_INT_SEGMENT1
,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
1471 MOV DX,OFFSET KEYB_INT_9
;; Let DOS know about our handler
1477 INSTALL_INT_9 ENDP
;;
1479 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1481 ;; Module: INSTALL_INT_9_NET
1487 ;; DS - points to our data segment
1488 ;; BP - points to ES to find SHARED_DATA_AREA
1490 ;; Output Registers:
1491 ;; DS - points to our data segment
1492 ;; AX, BX, DX, ES Trashed
1495 ;; IF network is installed THEN
1496 ;; Let it know about our INT 9
1501 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1503 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1505 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1507 INSTALL_INT_9_NET PROC
;;
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
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
1522 INSTALL_9_DONE_NET: ;;
1526 INSTALL_INT_9_NET ENDP
;;
1528 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1530 ;; Module: INSTALL_INT_2F_48
1533 ;; Install our INT 2F, INT 48 drivers.
1536 ;; DS - points to our data segment
1537 ;; BP - points to ES to find SHARED_DATA_AREA
1539 ;; Output Registers:
1540 ;; DS - points to our data segment
1541 ;; AX, BX, DX, ES Trashed
1544 ;; Get existing vectors
1545 ;; Install our vectors
1550 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1552 REPLACE_INT_SEGMENT2
DW ?
;;
1554 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1556 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1558 INSTALL_INT_2F_48 PROC
;;
1560 MOV AH,35H
;; Get int 2f vector
1562 INT 21H
;; Vector in ES:BX
1563 MOV REPLACE_INT_SEGMENT2
,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
1571 MOV DX,OFFSET KEYB_INT_2F
;; Vector in DS:DX
1576 MOV AX,SD
.SYSTEM_FLAG
;; Test if we are a PCjr
1578 JNE INSTALL_DONE
;; IF yes then
1579 MOV AH,35H
;; Get int 48 vector
1581 INT 21H
;; Vector in ES:BX
1582 MOV REPLACE_INT_SEGMENT2
,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
1590 MOV DX,OFFSET KEYB_INT_48
;; Vector in DS:DX
1598 INSTALL_INT_2F_48 ENDP
;;
1600 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1602 ;; Module: REMOVE_INT_9
1605 ;; Remove our INT 9 driver.
1608 ;; DS - points to our data segment
1609 ;; BP - points to ES to find SHARED_DATA_AREA
1611 ;; Output Registers:
1612 ;; DS - points to our data segment
1613 ;; AX, BX, DX, ES Trashed
1617 ;; Install old vector
1622 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1624 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1626 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1628 REMOVE_INT_9 PROC
;;
1632 MOV ES,WORD PTR SHARED_AREA_PTR
;;
1633 MOV AX,WORD PTR ES:SD
.OLD_INT_9
+2 ;; int 9 vector - segment
1635 MOV DX,WORD PTR ES:SD
.OLD_INT_9
;; int 9 vector - offset
1637 MOV AH,25H
;;;;;;;;; Set int 9 vector
1646 REMOVE_INT_9 ENDP
;;
1648 ;*********************** CNS **********;;
1652 ;**************************************;;
1656 IDLANG_CHK PROC
NEAR ;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
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; ;
1668 jmp end_match
;AN000; ;if not found go check next
1669 ;AN000; ;id for the same country
1673 mov good_match
,1 ;AN000; ;report the ids match
1675 end_match: ;AN000; ;
1679 IDLANG_CHK ENDP
;AN000; ;
1680 ;*********************** CNS *******************;
1681 ;**********************************SCAN_ID***********************;
1682 ; New variables defined - NUM_ID,ADRSS_LANG,ID_PTR_SIZE,ID_FOUND ;
1683 ;****************************************************************;
1688 xor di,di ;AN000;;clear di to set at the
1689 ;AN000;;beginning of KEYBSYS STRUCTURE
1692 lea cx,[di].kh_num_ID
+4 ;AN000;; set number of bytes to read header
1697 jmp BAD_TAB
;AN000;;;bad table message
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; ;
1710 ID_SPECIFIED: ;AN000; ;
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; ;
1729 READ_ID_TAB: ;AN000; ;
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;
1737 READ_IDVAL: ;;AN000;
1739 mov cx,NUM_ID
;;AN000;
1740 mov di,offset FILE_BUFFER
;;AN000;;;;;;;;;;
1741 add di,PASS_LANG
;AN000; ;
1743 SCAN_ID_TAB: ;AN000; ;
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; ;
1750 jne SCAN_ID_TAB
;AN000; ;
1751 jmp FINALE
;AN000; ;
1755 mov ERR4ID
,1 ;AN000; ;
1756 jmp FINALE
;AN000; ;
1762 mov ID_FOUND
,1 ;AN000;;reset ptr for ;
1763 ;AN000;;current country ;
1772 SCAN_ID ENDP
;AN000; ;
1774 ;*******************************SCAN_ID END******;
1776 ;; Module: BUILD_PATH
1779 ;; Build the complete filename of the Keyboard Definition File
1780 ;;*************************************WGR*********************
1781 ;; and open the file.
1782 ;;+++++++++++++++++++++++++++++++++++++WGR+++++++++++++++++++++
1785 ;; DS - points to our data segment
1786 ;; ES - points to our data segment
1787 ;; BP - offset of parmeter list
1789 ;; Output Registers:
1790 ;;************************************WGR**********************
1793 ;; CARRY SET (ERROR)
1795 ;;++++++++++++++++++++++++++++++++++++WGR++++++++++++++++++++++
1796 ;; The complete filename will be available in FILE_NAME
1800 ;; Determine whether path parameter was specified
1801 ;; IF length is zero THEN
1802 ;;****************************************WGR******************
1803 ;; Try to open file in ACTIVE directory
1805 ;; Try to open file in ARGV(0) directory
1807 ;; Try to open file in ROOT directory (for DOS 3.3 compatibility)
1812 ;; Copy path from PSP to FILE_NAME memory area
1813 ;; Try to open USER SPECIFIED file
1814 ;;++++++++++++++++++++++++++++++++++++++++WGR++++++++++++++++++
1816 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1818 KEYBOARD_SYS
DB '\KEYBOARD.SYS',00 ;AN000;;;
1819 KEYB_SYS_ACTIVE
DB 'KEYBOARD.SYS',00 ;AN000;;; WGR ;AN000
1820 KEYB_SYS_LENG EQU
14 ;AN000;;;
1821 KEYB_SYS_A_LENG EQU
13 ;AN000;;; WGR ;AN000
1823 FILE_NAME
DB 128 DUP(0) ;AN000;;;
1825 FILE_NOT_FOUND EQU
2 ;AN000;;; WGR ;AN000
1826 PATH_NOT_FOUND EQU
3 ;AN000;;; WGR ;AN000
1827 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1829 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1831 BUILD_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
1836 JE APPEND_KEYB_SYS
;;
1837 MOV SI,[BP].PATH_OFFSET
;; Get the offset of the path
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
1845 APPEND_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
1882 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WGR
1887 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WGR
1890 COPY_ARGV0 PROC
;; 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,2
CH ;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
1928 COPY_ARGV0 ENDP ;AN000;;;
1930 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1932 ;; Module: FIND_FIRST_CP
1935 ;; Check the keyboard definition file for the first code page
1938 ;; DS - points to our data segment
1939 ;; ES - points to our data segment
1940 ;; BP - offset of parmeter list
1942 ;; Output Registers:
1947 ;; IF error in opening file THEN
1948 ;; Display ERROR message and EXIT
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
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
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
1969 ;; READ first code page
1970 ;; IF error in reading file THEN
1971 ;; Display ERROR message and EXIT
1974 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1976 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1978 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1980 FIND_FIRST_CP PROC NEAR ;;
1982 PUSH CX ;; Save everything that
1983 PUSH DX ;; that will be changed
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
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 ;;
1996 FIND_FIRST_BEGIN: ;;
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 ;;
2006 FIND_FIRST_VALID4: ;;
2007 ;************************** CNS *******;;
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
2014 CMP CX,FILE_BUFFER_SIZE ;; Make sure buffer is not to small
2015 JBE FIND_FIRST_VALID5 ;;
2016 JMP FIND_FIRST_CP_ERROR4 ;;
2018 FIND_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 ;;
2024 FIND_FIRST_VALID6: ;;
2025 MOV CX,NUM_CP ;; Number of valid codes
2026 MOV DI,OFFSET FILE_BUFFER ;; Point to correct word in table
2028 MOV BX,[DI].KC_CODE_PAGE ;; Get parameter
2030 JMP FIND_FIRST_RETURN ;;
2032 FIND_FIRST_CP_ERROR4: ;;
2035 FIND_FIRST_RETURN: ;;
2043 FIND_FIRST_CP ENDP ;;
2046 MSG_SERVICES <MSGDATA> ;AN000;;; WGR ;AN000
2047 MSG_SERVICES <LOADmsg,DISPLAYmsg,CHARmsg,NUMmsg> ;AN000;;; WGR ;AN000
2048 MSG_SERVICES <KEYB.CL1> ;AN000;;; WGR ;AN000
2049 MSG_SERVICES <KEYB.CL2> ;AN000;;; WGR ;AN000
2050 MSG_SERVICES <KEYB.CLA> ;AN000;;; WGR ;AN000
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 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2061 db 'TEMP SHARED
DATA' ;;
2062 SD_SOURCE_PTR LABEL BYTE ;;
2063 TEMP_SHARED_DATA SHARED_DATA_STR <> ;;
2065 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;