]> wirehaze git hosting - MS-DOS.git/blob - v4.0/src/CMD/KEYB/KEYBCMD.ASM

wirehaze git hosting

MZ is back!
[MS-DOS.git] / v4.0 / src / CMD / KEYB / KEYBCMD.ASM
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 ;;
122 MSG_UTILNAME <KEYB> ;AN000;;; WGR identify to message retriever ;AN000
123 ;;
124 CODE 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 ;;
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
314 ;;
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 ;;;;;;;
330 ;;
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
349 ;;
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
356 ;;
357 ID_DISPLAYED DB 0 ;AN000;;; WGR Indicating ID already displayed ;AN000
358 ;; WGR ;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
369 ;AN000;;; WGR
370 ;AN000;;; WGR
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
381 ;AN000;;; WGR ;AN000
382 NUMBER_HOLDER DW ? ;AN000;;; WGR used for message retriever ;AN000
383 ;***CNS
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
388 SEG_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
397 STRING_HOLDER DB 64 DUP(0)
398 ;***CNS ;;
399 ;;
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
405 NUM_DESIG_CP DW 0 ;;
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 ;;
417 DESIG_LIST DW 0 ;;
418 QUERY_CALL DB 0 ;;
419 ;;
420 KB_MASK EQU 02h ;;
421 ;;
422 SIGNATURE DB 0FFh,'KEYB ' ;;
423 SIGNATURE_LENGTH DW 8 ;;
424 ;****************** CNS ***************************;AN000;
425 NUM_ID DW 0 ;AN000;
426 ERR4ID DB 0 ;AN000;
427 NUM_LANG DW 0 ;AN000;
428 NUM_CP 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 ? ;;
434 ;;
435 KEYB_INSTALLED DW 0 ;;
436 CON_INSTALLED DW 0 ;;
437 SHARED_AREA_PTR DD 0 ;;
438 GOOD_MATCH DW 0 ;;
439 ;****************** CNS ***************************;;
440 LANGUAGE_ASCII DB '??',0 ;; WGR ;AC000
441 ;;
442 CMD_PARM_LIST PARM_LIST <> ;;
443 ;;
444 JR_LANGUAGE_CODES DW 'FR','GR','IT','SP','UK' ;;
445 ;;
446 JR_NUM_CODES EQU 5 ;;
447 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
448 ;---------- TABLES FOR EXTENDED KEYBOARD SUPPORT CTRL CASE --------- RWV 11-06-85 ;;
449 ;;
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 ;;
468 ;;
469 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
470 ;; Program Code
471 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
472 ;;
473 KEYB_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
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
486 ;;
487 KEYB_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 ;;;;;;;;;;
495 INSTALLED_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 ;;
505 CON_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 ;;
512 INSTALLED_CON: ;;
513 MOV CON_INSTALLED,1 ;; Set CON_INSTALLED flag = YES
514 ;;
515 CALL_FIRST_STAGE: ;;
516 PUSH CS ;;
517 POP ES ;;
518 CALL PARSE_PARAMETERS ;; Validate parameter list
519 ;;
520 BEGIN_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 ;;
526 VALID1: ;;
527 MOV DL,[BP].RET_CODE_1 ;; Check for invalid language parm
528 CMP DL,1 ;;
529 JNE VALID2 ;;
530 JMP ERROR1 ;;
531 ;;
532 VALID2: ;;
533 MOV DL,[BP].RET_CODE_2 ;; Check for invalid code page parm
534 CMP DL,1 ;;
535 JNE VALID3 ;;
536 JMP ERROR2 ;;
537 ;;
538 VALID3: ;;
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
549 QUERY: ;;
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 ;;;;;;;;;;;;
562 L_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 ;;;;;;;
575 I_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 ;;;;;;;;;;;
590 QUERY_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 ;;;;;;;;;;;
599 KEYB_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 ;;;;;;;;;;;
633 KEYB_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 ;;
639 GET_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 ;;
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
656 ;;
657 JMP KEYB_EXIT_NOT_RESIDENT ;; Exit from Proc
658 ;;
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
667 ;;
668 NOT_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 ;;
675 VALID4: ;;
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
685 ID_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
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
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 ;;;;
711 VALID5: ;;
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
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
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 ;;
730 READ_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 ;;
736 READ_VALID: ;;
737 MOV CX,NUM_LANG ;; Number of valid codes
738 MOV DI,OFFSET FILE_BUFFER ;; Point to correct word in table
739 ;;
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
748 ;;;;;;;;;;;;;;
749 ;**************************** CNS ****;;;;
750 GET_ID: ;AN000;;; CNS - Must be an ID value
751 mov cx,1 ;AN000;;; initialize ctr value for # of ids
752 ;;
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
758 ;; is zero
759 FINDID: ;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 *****************;;
765 LANGUAGE_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 ;;
776 LSEEK_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
788 valid6a:
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
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
813
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
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
826 ABORT_LOOP: ;AN000;
827 xor cx,cx ;AN000; ;; end loop
828
829 ADVANCE_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
840 NO_ADVANCE: ;AN000;
841
842 jmp SEARCH_ID ;AN000; ;;for the country
843
844 ;.ENDWHILE ;;end of ID check for country
845
846 END_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 ;;
860 VALID6: ;;
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 ;;
871 CODE_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 ;;
884 VALID7: ;;
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 ;;
890 VALID8: ;;
891 MOV CX,NUM_CP ;; Number of valid codes
892 MOV DI,OFFSET FILE_BUFFER ;; Point to correct word in table
893 ;;
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
902 ;;;;;;;;;
903 CODE_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 ;;;;;;
909 DONE: ;;
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 ;;
917 SYSTEM_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 ;;
929 SET_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 ;;
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 ;;
940 ;;
941 GET_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 ;;
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
955 ;;
956 BUFFER_CREATED: ;;
957 MOV AX,0AD02H ;;
958 INT 2FH ;; Get invoked code page
959 ;;
960 SET_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 ;;
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
974 JMP ERROR4 ;;
975 ;;
976 SET_TO_INVOKED_CP2: ;;
977 MOV [BP].CODE_PAGE_PARM,BX ;;
978 MOV SYS_CODE_PAGE,BX ;;
979 ;;
980 JMP TEST_IF_DESIGNATED ;;
981 ;;
982 SET_TO_INVOKED_CP3: ;;
983 MOV [BP].CODE_PAGE_PARM,BX ;;
984 ;;
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 ?
989 ;;
990 NEXT_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 ;;
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 ;;***************************************************************************
1015 ;;
1016 READY_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
1060 CONTINUE_INSTALL: ;;
1061 CALL INSTALL_INT_9 ;; Install INT 9
1062 ;;
1063 CALL FIND_KEYB_TYPE ;; Determine keyboard type table use
1064 ;;
1065 BUILD_THE_TABLE: ;;
1066 CALL TABLE_BUILD ;; Build the TEMP_SHARED_DATA_AREA
1067 ;;
1068 CHECK_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 ;;
1079 CHECK_ERROR_CONTINUE: ;;
1080 CMP CX,1 ;; If return code = 1
1081 JNE CHECK_ERROR2 ;;
1082 JMP ERROR1 ;; display error message
1083 ;;
1084 CHECK_ERROR2: ;;
1085 CMP CX,2 ;; If return code = 2
1086 JNE CHECK_ERROR3 ;;
1087 JMP ERROR2 ;;
1088 ;;
1089 CHECK_ERROR3: ;;
1090 CMP CX,3 ;; If return code = 3
1091 JNE CHECK_ERROR4 ;;
1092 JMP ERROR3 ;; display error message
1093 ;;
1094 CHECK_ERROR4: ;;
1095 CMP CX,4 ;; If return code = 4
1096 JNE CHECK_ERROR5A ;;
1097 JMP ERROR4 ;; display error message
1098 ;;
1099 CHECK_ERROR5A: ;;
1100 CMP CX,5 ;; If return code = 5
1101 JNE CHECK_ERROR6A ;;
1102 JMP ERROR5A ;; display error message
1103 ;;
1104 CHECK_ERROR6A: ;;
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
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 ;;
1125 TERMINATE: ;;
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 ;;
1137 KEYB_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 ;;
1151 NO_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 ;;
1161 SKIP_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 *********************************************
1190 ERR1ID: ;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 ;;
1202 ERR2ID:
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 *********************************************
1215 ERROR1:
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 ;;
1227 ERROR2:
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 ;;
1239 ERROR3:
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 ;;
1282 ERROR4:
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 ;;
1294 ERROR5:
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 ;;
1306 ERROR5A:
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 ;;
1318 ERROR6:
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 ;;
1330 ERROR6A:
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 ;;
1346 KEYB_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 ;;
1355 COPY_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 ;;
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 ;;
1384 INT 21H ;;;;;;;;;;;
1385 ;;
1386 KEYB_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 ;;
1408 NUMLK_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 ;;
1424 NUMLK_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 ;;
1450 REPLACE_INT_SEGMENT1 DW ? ;;
1451 ;;
1452 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1453 ;; Program Code
1454 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1455 ;;
1456 INSTALL_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 ;;
1477 INSTALL_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 ;;
1507 INSTALL_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 ;;
1515 NET_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 ;;
1522 INSTALL_9_DONE_NET: ;;
1523 POP ES ;;
1524 RET ;;
1525 ;;
1526 INSTALL_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 ;;
1552 REPLACE_INT_SEGMENT2 DW ? ;;
1553 ;;
1554 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1555 ;; Program Code
1556 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1557 ;;
1558 INSTALL_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 ;;
1574 ARE_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 ;;
1593 INSTALL_DONE: ;;
1594
1595
1596 RET ;;
1597 ;;
1598 INSTALL_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 ;;
1628 REMOVE_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 ;;
1641 REMOVE_9_DONE: ;;
1642 POP ES ;;
1643 POP DS ;;
1644 RET ;;
1645 ;;
1646 REMOVE_INT_9 ENDP ;;
1647 ;;
1648 ;*********************** CNS **********;;
1649 PURPOSE: ;;
1650 INPUT: ;;
1651 OUTPUT: ;;
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 ;;
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
1822 ;;
1823 FILE_NAME DB 128 DUP(0) ;AN000;;;
1824 ;;
1825 FILE_NOT_FOUND EQU 2 ;AN000;;; WGR ;AN000
1826 PATH_NOT_FOUND EQU 3 ;AN000;;; WGR ;AN000
1827 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1828 ;; Program Code
1829 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1830 ;;
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
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 ;;
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
1877 ;;
1878 RET ;AN000;;;
1879 ;;
1880 BUILD_PATH ENDP ;;
1881 ;;
1882 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WGR
1883 ;; WGR
1884 ;; Module Name: WGR
1885 ;; COPY_ARGV0 WGR
1886 ;; WGR
1887 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WGR
1888 ;; WGR
1889 ;; WGR
1890 COPY_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
1928 COPY_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 ;;
1980 FIND_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 ;;;;;;;;;
1996 FIND_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 ;;
2006 FIND_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 ;;
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 ;;
2023 ;;
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
2027 ;;
2028 MOV BX,[DI].KC_CODE_PAGE ;; Get parameter
2029 XOR AX,AX ;;
2030 JMP FIND_FIRST_RETURN ;;
2031 ;;
2032 FIND_FIRST_CP_ERROR4: ;;
2033 MOV AX,4 ;;
2034 ;;
2035 FIND_FIRST_RETURN: ;;
2036 POP DI ;;
2037 POP SI ;;
2038 POP DX ;;
2039 POP CX ;;
2040 ;;
2041 RET ;;
2042 ;;
2043 FIND_FIRST_CP ENDP ;;
2044 ;;;;;;;;;;;;;
2045 .xlist ;;
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
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' ;;
2062 SD_SOURCE_PTR LABEL BYTE ;;
2063 TEMP_SHARED_DATA SHARED_DATA_STR <> ;;
2064 ;;
2065 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2066
2067 CODE ENDS
2068
2069 include msgdcl.inc
2070
2071 END
2072 \1a