summaryrefslogtreecommitdiff
path: root/v4.0/src/CMD/KEYB/KEYBCMD.ASM
diff options
context:
space:
mode:
Diffstat (limited to 'v4.0/src/CMD/KEYB/KEYBCMD.ASM')
-rw-r--r--v4.0/src/CMD/KEYB/KEYBCMD.ASM2072
1 files changed, 2072 insertions, 0 deletions
diff --git a/v4.0/src/CMD/KEYB/KEYBCMD.ASM b/v4.0/src/CMD/KEYB/KEYBCMD.ASM
new file mode 100644
index 0000000..57033f3
--- /dev/null
+++ b/v4.0/src/CMD/KEYB/KEYBCMD.ASM
@@ -0,0 +1,2072 @@
1
2 PAGE ,132
3 TITLE DOS - KEYB Command - Transient Command Processing
4
5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6;; DOS - NLS Support - KEYB Command
7;; (C) Copyright 1988 Microsoft
8;;
9;; File Name: KEYBCMD.ASM
10;; ----------
11;;
12;; Description:
13;; ------------
14;; Contains transient command processing modules for KEYB command.
15;;
16;; Documentation Reference:
17;; ------------------------
18;; PC DOS 3.3 Detailed Design Document - May ?? 1986
19;;
20;; Procedures contained in this file:
21;; ----------------------------------
22;; KEYB_COMMAND: Main routine for command processing.
23;; PARSE_PARAMETERS: Validate syntax of parameters included
24;; on command line.
25;; BUILD_PATH: Find KEYBOARD.SYS file and validate language and/or
26;; code page.
27;; INSTALL_INT_VECTORS: Install our INT 9, INT 2F, INT48 Drivers
28;; REMOVE_INT_VECTORS: Remove our INT 9, INT 2F, INT48 Drivers
29;; NUMLK_ON: Turn on the NUM LOCK LED
30;; FIND_FIRST_CP: Determine first code page for given language in the
31;; Keyboard Definition file.
32;;
33;; Include Files Required:
34;; -----------------------
35;; KEYBMSG.INC
36;; KEYBEQU.INC
37;; KEYBSYS.INC
38;; KEYBI9C.INC
39;; KEYBI9.INC
40;; KEYBI2F.INC
41;; KEYBI48.INC
42;; KEYBSHAR.INC
43;; KEYBDCL.INC
44;; KEYBTBBL.INC
45;; COMMSUBS.INC
46;; KEYBCPSD.INC
47;; POSTEQU.INC
48;; DSEG.INC
49;;
50;; External Procedure References:
51;; ------------------------------
52;; FROM FILE KEYBTBBL.ASM:
53;; TABLE_BUILD - Create the shared area containing all keyboard tables.
54;; STATE_BUILD - Build all states within the table area
55;; FROM FILE KEYBMSG.ASM:
56;; KEYB_MESSAGES - All messages
57;;
58;; Change History:
59;;
60;; Revised for DOS 4.00 - NickS
61;; A000 - WilfR
62;; AN002- DCR ???? -KEYBAORD SECURITY LOCK - CNS
63;;
64;;
65;; an003 PTM 3906 - KEYB messages do not conform
66;; to spec. Error message does
67;; 3/24/88 not pass back the bogus command
68;; line argument. - CNS
69;;
70;;
71;;
72;;
73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
74 ;;
75 PUBLIC KEYB_COMMAND ;;
76 ;;
77;*****************CNS********************
78 PUBLIC ID_TAB_OFFSET ;AN000;
79;*****************CNS********************
80 PUBLIC CP_TAB_OFFSET ;;
81 PUBLIC STATE_LOGIC_OFFSET ;;
82 PUBLIC SYS_CODE_PAGE ;;
83 PUBLIC KEYBCMD_LANG_ENTRY_PTR ;;
84 PUBLIC DESIG_CP_BUFFER ;;
85 PUBLIC DESIG_CP_OFFSET ;;
86 PUBLIC KEYBSYS_FILE_HANDLE ;;
87 PUBLIC NUM_DESIG_CP ;;
88 PUBLIC TB_RETURN_CODE ;;
89 PUBLIC FILE_BUFFER ;;
90 PUBLIC FILE_BUFFER_SIZE
91 PUBLIC FB ;;
92;*****************CNS********************
93 PUBLIC ID_PTR_SIZE ;AN000;
94 PUBLIC LANG_PTR_SIZE ;AN000;
95 PUBLIC CP_PTR_SIZE ;AN000;
96 PUBLIC NUM_ID ;AN000;
97 PUBLIC NUM_LANG ;AN000;
98 PUBLIC NUM_CP ;AN000;
99 PUBLIC SHARED_AREA_PTR ;;
100;*****************CNS********************
101 PUBLIC SD_SOURCE_PTR ;;
102 PUBLIC TEMP_SHARED_DATA ;;
103 ;;
104 PUBLIC FOURTH_PARM ;AN000; ;AN000
105 PUBLIC ONE_PARMID ;AN000; ;AN000
106 PUBLIC FTH_PARMID ;AN000; ;AN000
107 PUBLIC ID_FOUND ;AN000; ;AN000
108 PUBLIC BAD_ID ;AN000; ;AN000
109 PUBLIC ALPHA ;AN000; ;AN000
110 EXTRN PARSE_PARAMETERS:NEAR ;AN000; ;AN000
111;***CNS
112 EXTRN SECURE_FL:BYTE ;an002;
113 EXTRN CUR_PTR:WORD ;an003;
114 EXTRN OLD_PTR:WORD ;an003;
115 EXTRN ERR_PART:WORD ;an003;
116;***CNS
117.xlist
118 INCLUDE STRUC.INC ;AN000;;; WGR structured macros ;AN000
119 INCLUDE SYSMSG.INC ;AN000;;; WGR message retriever ;AN000
120.list
121 ;;
122MSG_UTILNAME <KEYB> ;AN000;;; WGR identify to message retriever ;AN000
123 ;;
124CODE SEGMENT PUBLIC 'CODE' ;;
125 ;;
126.xlist ;;
127 INCLUDE KEYBEQU.INC ;;
128 INCLUDE KEYBSYS.INC ;;
129 INCLUDE KEYBI9.INC ;;
130 INCLUDE KEYBI9C.INC ;;
131 INCLUDE KEYBI2F.INC ;;
132 INCLUDE KEYBI48.INC ;;
133 INCLUDE KEYBSHAR.INC ;;
134 INCLUDE KEYBDCL.INC ;;
135 INCLUDE KEYBTBBL.INC ;;
136 INCLUDE COMMSUBS.INC ;;
137 INCLUDE KEYBCPSD.INC ;;
138.xlist
139 INCLUDE POSTEQU.INC ;;
140 INCLUDE DSEG.INC ;;
141 ;;
142.list
143 ASSUME CS:CODE,DS:CODE ;;
144 ;;
145;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
146;;
147;; Module: KEYB_COMMAND
148;;
149;; Description:
150;; Main routine for transient command processing.
151;;
152;; Input Registers:
153;; DS - points to our data segment
154;;
155;; Output Registers:
156;; Upon termination, if an error has occurred in which a keyboard table
157;; was not loaded, the AL register will contain the a error flag. This
158;; flag is defined as follows:
159;; AL:= 1 - Invalid language, code page, or syntax
160;; 2 - Bad or missing Keyboard Definition File
161;; 3 - KEYB could not create a table in resident memory
162;; 4 - An error condition was received when communicating
163;; with the CON device
164;; 5 - Code page requested has not been designated
165;; 6 - The keyboard table for the requested code page cannot
166;; be found in resident keyboard table.
167;;
168;; Logic:
169;; IF KEYB has NOT been previously loaded THEN
170;; Set SHARED_AREA_PTR to TEMP_SHARED_AREA
171;; INSTALLED_KEYB := 0
172;; Get HW_TYPE (set local variable)
173;; ELSE
174;; Set SHARED_AREA_PTR to ES:SHARED_AREA
175;; Get HW_TYPE (set local variable)
176;; Set TABLE_OK := 0
177;; INSTALLED_KEYB := 1
178;;
179;; IF CPS-CON has been loaded THEN
180;; INSTALLED_CON := 1
181;;
182;;*********************************** CNS *************************************
183;; Call PARSE_PARAMETERS := Edit ID or language, code page,
184;; and path parameters,ID on command line
185;;*********************************** CNS *************************************
186;; Check all return codes:
187;; IF any parameters are invalid THEN
188;; Display ERROR message
189;; ELSE
190;; IF no language parm specified
191;; AND code page is not invalid
192;; AND syntax is valid THEN
193;; Process QUERY:
194;; IF KEYB is installed THEN
195;; Get and display active language from SHARED_DATA_AREA
196;; Get invoked code page from SHARED_DATA_AREA
197;; Convert to ASCII
198;; Display ASCII representation of code page, CR/LF
199;;*********************************** CNS *************************************
200;; IF ALTERNATE FLAG SET
201;; Get and display active ID from SHARED_DATA_AREA
202;; Convert to ASCII
203;; Display ASCII representation of ID, CR/LF
204;;*********************************** CNS *************************************
205;; IF CPS-CON is installed THEN
206;; Get selected code page info from CON
207;; Convert to ASCII
208;; Display ASCII representation of code page, CR/LF
209;; EXIT without staying resident
210;;
211;; ELSE
212;; Call BUILD_PATH := Determine location of Keyboard definition file
213;; Open the file
214;; IF error in opening file THEN
215;; Display ERROR message and EXIT
216;; ELSE
217;; Save handle
218;; Set address of buffer
219;; READ header of Keyboard definition file
220;; IF error in reading file THEN
221;; Display ERROR message and EXIT
222;; ELSE
223;; Check signature for correct file
224;; IF file signature is correct THEN
225;; READ language table
226;; IF error in reading file THEN
227;; Display ERROR message and EXIT
228;; ELSE
229;; Use table to verify language parm
230;; Set pointer values
231;; IF code page was specified
232;; READ language entry
233;; IF error in reading file THEN
234;; Display ERROR message and EXIT
235;; ELSE
236;; READ Code page table
237;; IF error in reading file THEN
238;; Display ERROR message and EXIT
239;; ELSE
240;; Use table to verify code page parm
241;; Set pointer values
242;; IF CPS-CON is not installed THEN
243;; Set number of code pages = 1
244;; IF CODE_PAGE_PARM was specified THEN
245;; Copy CODE_PAGE_PARM into table of code pages to build
246;; ELSE
247;; Call FIND_FIRST_CP := Define the system code page (1st in Keyb Def file)
248;; Copy SYSTEM_CP into table of code pages to build
249;; ELSE
250;; Issue INT 2F ; 0AD03H to get table of Designated code pages
251;; Set number of designated code pages (HWCP + Desig CP)
252;; Issue INT 2F ; 0AD02H to get invoked code page
253;; IF CODE_PAGE_PARM was specified THEN
254;; Check that CODE_PAGE_PARM is in the list of designated code pages
255;; IF CODE_PAGE_PARM is in the list of designated code pages THEN
256;; Copy specified CP into table of code pages to build
257;; IF a CP has been selected AND is inconsistent with specified CP
258;; Issue WARNING message
259;; ELSE
260;; Display ERROR message
261;; ELSE
262;; IF a code page has been invoked THEN
263;; Copy invoked code page into table of code pages to build
264;; ELSE
265;; Call FIND_FIRST_CP := Define the system code page (1st in Keyb Def file)
266;; Copy SYSTEM_CP into table of code pages to build
267;;
268;; IF KEYB has not been previously installed THEN
269;; Call FIND_SYS_TYPE := Determine system type
270;; IF system type is PCjr THEN
271;; IF multilingual ROM is present THEN
272;; Set language code
273;; EXIT without staying resident
274;; Call INSTALL_INT_9 := Install INT 9 handler
275;; Call FIND_KEYB_TYPE := Determine the keyboard type
276;;
277;; Call TABLE_BUILD := Build the TEMP_SHARED_DATA_AREA
278;;
279;; IF return codes from TABLE_BUILD are INVALID THEN
280;; IF KEYB_INSTALLED := 0 THEN
281;; Call REMOVE_INT_9
282;; Display corresponding ERROR message
283;; EXIT without staying resident
284;; ELSE
285;; IF any of the designated CPs were invalid in the build THEN
286;; Issue WARNING message
287;; Close the Keyboard definition file
288;; IF KEYB had NOT already been installed THEN
289;; IF keyboard is a Ferrari_G AND system is not an XT THEN
290;; Call NUMLK_ON := Turn the NUM LOCK LED on
291;; IF extended INT 16 support required THEN
292;; Install extended INT 16 support
293;; Call INSTALL_INT_9_NET := Let network know about INT 9
294;; Call INSTALL_INT_2F_48 := Install the INT 2F and INT 48 drivers
295;; Activate language
296;; Get resident end and copy TEMP_SHARED_DATA_AREA into SHARED_DATA_AREA
297;; EXIT but stay resident
298;; ELSE
299;; IF this was not a query call AND exit code was valid THEN
300;; Activate language
301;; Get resident end and copy TEMP_SHARED_DATA_AREA into SHARED_DATA_AREA
302;; EXIT without staying resident
303;; END
304;;
305;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
306 ;;
307INVALID_PARMS EQU 1 ;; EXIT return codes
308BAD_KEYB_DEF_FILE EQU 2 ;;
309MEMORY_OVERFLOW EQU 3 ;;
310CONSOLE_ERROR EQU 4 ;;
311CP_NOT_DESIGNATED EQU 5 ;;
312KEYB_TABLE_NOT_LOAD EQU 6 ;;
313BAD_DOS_VER EQU 7 ;AN000;;; WGR ;AN000
314 ;;
315EXIT_RET_CODE DB 0 ;;
316;******************** CNS *********** ;AN000;;;
317ID_VALID EQU 0 ;AN000;;;
318ID_INVALID EQU 1 ;AN000;;;
319NO_ID EQU 2 ;AN000;;;
320LANGUAGE_VALID EQU 0 ;AN000;;;
321LANGUAGE_INVALID EQU 1 ;AN000;;; Return Codes
322NO_LANGUAGE EQU 2 ;AN000;;; from
323NO_IDLANG EQU 3 ;AN000;;;
324;******************** CNS *********** ;;
325CODE_PAGE_VALID EQU 0 ;; EDIT_LANGUAGE_CODE
326CODE_PAGE_INVALID EQU 1 ;;
327NO_CODE_PAGE EQU 2 ;;
328VALID_SYNTAX EQU 0 ;;
329INVALID_SYNTAX EQU 1 ;;;;;;;
330 ;;
331ACT_KEYB EQU 2 ;AC000;;; WGR ;AN000
332ACT_ID EQU 3 ;AC000;;; WGR ;AN000
333ACT_KEYB_CP EQU 4 ;AC000;;; WGR ;AN000
334ACT_CON_CP EQU 5 ;AC000;;; WGR ;AN000
335INV_L EQU 6 ;AC000;;; WGR message numbers... ;AN000
336INV_I EQU 7 ;AC000;;; WGR ;AN000
337INV_CP EQU 8 ;AC000;;; WGR ;AN000
338INV_S EQU 18 ;AC000;;; WGR ;AN000
339INV_FN EQU 9 ;AC000;;; WGR ;AN000
340INV_KEYB_Q EQU 10 ;AC000;;; WGR ;AN000
341INV_CON_Q EQU 11 ;AC000;;; WGR ;AN000
342NOT_DESIG EQU 12 ;AC000;;; WGR ;AN000
343NOT_SUPP EQU 13 ;AC000;;; WGR ;AN000
344NOT_VALID EQU 14 ;AC000;;; WGR ;AN000
345WARNING_1 EQU 15 ;AC000;;; WGR ;AN000
346INV_COMBO EQU 16 ;AC000;;; WGR ;AN000
347MEMORY_OVERF EQU 17 ;AC000;;; WGR ;AN000
348CR_LF DB 10,13,'$' ;; WGR ;AN000
349 ;;
350FOURTH_PARM DB 0 ;AN000;;; WGR switch was specified ;AN000
351ONE_PARMID DB 0 ;AN000;;; WGR id given as positional ;AN000
352FTH_PARMID DB 0 ;AN000;;; WGR id given as switch ;AN000
353ID_FOUND DB 0 ;AN000;;; WGR id was good (in k.d. file) ;AN000
354BAD_ID DB 0 ;AN000;;; WGR id was bad (from parse) ;AN000
355ALPHA DB 0 ;AN000;;; WGR first parm a language id ;AN000
356 ;;
357ID_DISPLAYED DB 0 ;AN000;;; WGR Indicating ID already displayed ;AN000
358 ;; WGR ;AN000
359SUBLIST_NUMBER LABEL BYTE ;AN000;;; WGR sublist for numbers ;AN000
360 DB 11 ;AN000;;; WGR size ;AN000
361 DB 0 ;AN000;;; WGR ;AN000
362PTR_TO_NUMBER DW ? ;AN000;;; WGR offset ptr ;AN000
363SEG_OF_NUMBER DW ? ;AN000;;; WGR segment ;AN000
364 DB 1 ;AN000;;; WGR ;AN000
365 DB 10100001B ;AN000;;; WGR flag ;AN000
366 DB 3 ;AN000;;; WGR max width ;AN000
367 DB 1 ;AN000;;; WGR min width ;AN000
368 DB " " ;AN000;;; WGR filler ;AN000
369 ;AN000;;; WGR
370 ;AN000;;; WGR
371SUBLIST_ASCIIZ LABEL BYTE ;AN000;;; WGR sublist for asciiz ;AN000
372 DB 11 ;AN000;;; WGR size ;AN000
373 DB 0 ;AN000;;; WGR ;AN000
374PTR_TO_ASCIIZ DW ? ;AN000;;; WGR offset ptr ;AN000
375SEG_OF_ASCIIZ DW ? ;AN000;;; WGR segment ;AN000
376 DB 1 ;AN000;;; WGR ;AN000
377 DB 00010000B ;AN000;;; WGR flag ;AN000
378 DB 2 ;AN000;;; WGR max width ;AN000
379 DB 2 ;AN000;;; WGR min width ;AN000
380 DB " " ;AN000;;; WGR filler ;AN000
381 ;AN000;;; WGR ;AN000
382NUMBER_HOLDER DW ? ;AN000;;; WGR used for message retriever ;AN000
383;***CNS
384SUBLIST_COMLIN LABEL BYTE ;an003;;; WGR sublist for asciiz ;AN000
385 DB 11 ;an003;;; WGR size ;AN000
386 DB 0 ;an003;;; WGR ;AN000
387PTR_TO_COMLIN DW ? ;an003;;; WGR offset ptr ;AN000
388SEG_OF_COMLIN DW ?
389 DB 0 ;an003;;; WGR ;AN000
390 DB LEFT_ALIGN+CHAR_FIELD_ASCIIZ ;AN000;;; WGR flag ;AN000
391
392 DB 0 ;an003;;; WGR max width ;AN000
393 DB 1 ;an003;;; WGR min width ;AN000
394 DB " " ;an003;;; WGR filler ;AN000
395
396
397STRING_HOLDER DB 64 DUP(0)
398;***CNS ;;
399 ;;
400FILE_BUFFER_SIZE EQU 50*6
401FILE_BUFFER DB FILE_BUFFER_SIZE DUP(0) ;AC000;;; Buffer for Keyboard Def file
402FB EQU FILE_BUFFER ;AC000;m for 32 language entries)
403DESIG_CP_BUFFER DW 28 DUP(?) ;; (Room for 25 code pages)
404DESIG_CP_BUF_LEN DW $-DESIG_CP_BUFFER ;; Length of code page buffer
405NUM_DESIG_CP DW 0 ;;
406CP_TAB_OFFSET DD ? ;;
407;****************** CNS ******************;AN000;
408TOTAL_SIZE DW 0 ;AN000;
409PASS_LANG DW 0 ;AN000;
410ID_TAB_OFFSET DD ? ;AN000;
411;****************** CNS ******************;;
412STATE_LOGIC_OFFSET DD -1 ;;
413KEYBSYS_FILE_HANDLE DW ? ;;;;;;;;;;;
414TB_RETURN_CODE DW 1 ;;
415DESIG_CP_OFFSET DW OFFSET DESIG_CP_BUFFER ;;
416SYS_CODE_PAGE DW 0 ;;
417DESIG_LIST DW 0 ;;
418QUERY_CALL DB 0 ;;
419 ;;
420KB_MASK EQU 02h ;;
421 ;;
422SIGNATURE DB 0FFh,'KEYB ' ;;
423SIGNATURE_LENGTH DW 8 ;;
424;****************** CNS ***************************;AN000;
425NUM_ID DW 0 ;AN000;
426ERR4ID DB 0 ;AN000;
427NUM_LANG DW 0 ;AN000;
428NUM_CP DW 0 ;AN000;
429ID_PTR_SIZE DW SIZE KEYBSYS_ID_PTRS ;AN000;
430;****************** CNS *****************************
431LANG_PTR_SIZE DW SIZE KEYBSYS_LANG_PTRS ;;
432CP_PTR_SIZE DW SIZE KEYBSYS_CP_PTRS ;;
433KEYBCMD_LANG_ENTRY_PTR DD ? ;;
434 ;;
435KEYB_INSTALLED DW 0 ;;
436CON_INSTALLED DW 0 ;;
437SHARED_AREA_PTR DD 0 ;;
438GOOD_MATCH DW 0 ;;
439;****************** CNS ***************************;;
440LANGUAGE_ASCII DB '??',0 ;; WGR ;AC000
441 ;;
442CMD_PARM_LIST PARM_LIST <> ;;
443 ;;
444JR_LANGUAGE_CODES DW 'FR','GR','IT','SP','UK' ;;
445 ;;
446JR_NUM_CODES EQU 5 ;;
447 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
448;---------- TABLES FOR EXTENDED KEYBOARD SUPPORT CTRL CASE --------- RWV 11-06-85 ;;
449 ;;
450RPL_K8 LABEL BYTE ;-------- CHARACTERS --------- ;;
451 DB 27,-1,00,-1,-1,-1 ; Esc, 1, 2, 3, 4, 5 ;;
452 DB 30,-1,-1,-1,-1,31 ; 6, 7, 8, 9, 0, - ;;
453 DB -1,127,148,17,23,5 ; =, Bksp, Tab, Q, W, E ;;
454 DB 18,20,25,21,09,15 ; R, T, Y, U, I, O ;;
455 DB 16,27,29,10,-1,01 ; P, [, ], Enter, Ctrl, A ;;
456 DB 19,04,06,07,08,10 ; S, D, F, G, H, J ;;
457 DB 11,12,-1,-1,-1,-1 ; K, L, ;, ', `, LShift ;;
458 DB 28,26,24,03,22,02 ; \, Z, X, C, V, B ;;
459 DB 14,13,-1,-1,-1,-1 ; N, M, ,, ., /, RShift ;;
460 DB 150,-1,' ',-1 ; *, Alt, Space, CL ;;
461 ;--------- FUNCTIONS --------- ;;
462 DB 94,95,96,97,98,99 ; F1 - F6 ;;
463 DB 100,101,102,103,-1,-1 ; F7 - F10, NL, SL ;;
464 DB 119,141,132,142,115,143 ; Home, Up, PgUp, -, Left, Pad5 ;;
465 DB 116,144,117,145,118,146 ; Right, +, End, Down, PgDn, Ins ;;
466 DB 147,-1,-1,-1,137,138 ; Del, SysReq, Undef, WT, F11, F12 ;;
467L_CTRL_TAB EQU $-RPL_K8 ;;
468 ;;
469;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
470;; Program Code
471;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
472 ;;
473KEYB_COMMAND PROC NEAR ;;
474 ;;
475 CALL SYSLOADMSG ;AN000;load messages ;AN000
476 JNC VERSION_OK ;AN000;if no carry then version ok ;AN000
477 CALL SYSDISPMSG ;AN000;error..display version error ;AN000
478 MOV AL,BAD_DOS_VER ;AN000;bad DOS version ;AN000
479 MOV EXIT_RET_CODE,AL ;AN000; ;AN000
480 JMP KEYB_EXIT_NOT_RESIDENT ;AN000;exit..non resident ;AN000
481VERSION_OK: ;; WGR ;AN000
482 MOV SEG_OF_NUMBER,CS ;AN000;initialize.. ;AN000
483 MOV SEG_OF_ASCIIZ,CS ;AN000; ..sublists ;AN000
484 MOV BP,OFFSET CMD_PARM_LIST ;AN000;pointer for parm list
485 MOV WORD PTR SHARED_AREA_PTR,ES ;AN000; ES segment
486 ;;
487KEYB_INSTALL_CHECK: ;;
488 MOV AX,0AD80H ;; KEYB install check
489 INT 2FH ;;
490 CMP AL,-1 ;; If flag is not 0FFh THEN
491 JE INSTALLED_KEYB ;;
492 MOV WORD PTR SHARED_AREA_PTR+2,OFFSET TSD ;;
493 JMP CON_INSTALL_CHECK ;;
494 ;;;;;;;;;;
495INSTALLED_KEYB: ;;
496 MOV KEYB_INSTALLED,1 ;; Set KEYB_INSTALLED flag = YES
497 MOV WORD PTR SHARED_AREA_PTR,ES ;; Save segment of SHARED_DATA_AREA
498 MOV WORD PTR SHARED_AREA_PTR+2,DI ;; Save offset of SHARED_DATA_AREA
499 MOV AX,ES:[DI].KEYB_TYPE ;;
500 MOV HW_TYPE,AX ;;
501 MOV ES:[DI].TABLE_OK,0 ;; Do not allow processing
502 PUSH CS ;; while building table
503 POP ES ;; Reset ES until required
504 ;;
505CON_INSTALL_CHECK: ;;;;;;;
506 MOV AX,0AD00H ;; CONSOLE install check
507 INT 2FH ;;
508 CMP AL,-1 ;; If flag is not 0FFh THEN
509 JE INSTALLED_CON ;;
510 JMP CALL_FIRST_STAGE ;;
511 ;;
512INSTALLED_CON: ;;
513 MOV CON_INSTALLED,1 ;; Set CON_INSTALLED flag = YES
514 ;;
515CALL_FIRST_STAGE: ;;
516 PUSH CS ;;
517 POP ES ;;
518 CALL PARSE_PARAMETERS ;; Validate parameter list
519 ;;
520BEGIN_PARM_CHECK: ;; CHECK ALL RETURN CODES
521 MOV DL,[BP].RET_CODE_3 ;;
522 CMP DL,1 ;; Check for invalid syntax
523 JNE VALID1 ;;
524 JMP ERROR3 ;;
525 ;;
526VALID1: ;;
527 MOV DL,[BP].RET_CODE_1 ;; Check for invalid language parm
528 CMP DL,1 ;;
529 JNE VALID2 ;;
530 JMP ERROR1 ;;
531 ;;
532VALID2: ;;
533 MOV DL,[BP].RET_CODE_2 ;; Check for invalid code page parm
534 CMP DL,1 ;;
535 JNE VALID3 ;;
536 JMP ERROR2 ;;
537 ;;
538VALID3: ;;
539 MOV DL,[BP].RET_CODE_1 ;; Check for query command
540 CMP DL,2 ;;
541 JE QUERY ;;
542;******************************* CNS **;;
543 MOV DL,[BP].RET_CODE_1 ;AN000;k for query command
544 CMP DL,3 ;AN000;;; Get a status of the codepage
545 JE QUERY ;AN000;;; language, and possible ID code
546;******************************* CNS **;;
547 JMP NOT_QUERY ;;
548 ;; IF QUERY is requested THEN
549QUERY: ;;
550 MOV QUERY_CALL,DL ;;
551 MOV AX,KEYB_INSTALLED ;; If KEYB is installed THEN
552 CMP AX,0 ;;
553 JE QUERY_CONTINUE1 ;;;;;;;;;;;;;;;;
554 ;;
555 MOV DI,WORD PTR SHARED_AREA_PTR+2 ;; Get offset of
556 MOV ES,WORD PTR SHARED_AREA_PTR ;; shared area
557 MOV BX,WORD PTR ES:[DI].ACTIVE_LANGUAGE ;; Get active language
558 CMP BX,0 ;; WGR if no language.. ;AN000
559 JE I_MESSAGE ;; WGR then id was specified ;AN000
560 ;;
561 ;;;;;;;;;;;;
562L_MESSAGE: ;;
563 MOV WORD PTR LANGUAGE_ASCII,BX ;AC000;;; Display Language
564 LEA SI,LANGUAGE_ASCII ;AN000;;; WGR sublist points to... ;AN000
565 MOV PTR_TO_ASCIIZ,SI ;AN000;;; WGR language code asciiz string ;AN000
566 MOV AX,ACT_KEYB ;AC000;;; WGR display 'Current keyboard code' ;AN000
567 MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000
568 MOV CX,1 ;AN000;;; WGR one replacement ;AN000
569 MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000
570 XOR DL,DL ;AN000;;; WGR no input ;AN000
571 LEA SI,SUBLIST_ASCIIZ ;AN000;;; WGR ptr to sublist ;AN000
572 CALL SYSDISPMSG ;AN000;;; WGR ;AN000
573 JMP KEYB_L_FINISHED ;;
574 ;;;;;;;
575I_MESSAGE: ;;
576 MOV BX,WORD PTR ES:[DI].INVOKED_KBD_ID;AN000;;; WGR get id code. ;AN000
577 MOV NUMBER_HOLDER,BX ;AN000;;; WGR transfer number to temp loc. ;AN000
578 LEA SI,NUMBER_HOLDER ;AN000;;; WGR sublist points to... ;AN000
579 MOV PTR_TO_NUMBER,SI ;AN000;;; WGR code page word ;AN000
580 MOV AX,ACT_ID ;AN000;;; WGR display 'Current ID: ' ;AN000
581 MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000
582 MOV CX,1 ;AN000;;; WGR one replacement ;AN000
583 MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000
584 XOR DL,DL ;AN000;;; WGR no input ;AN000
585 LEA SI,SUBLIST_NUMBER ;AN000;;; WGR ptr to sublist ;AN000
586 CALL SYSDISPMSG ;AN000;;; WGR ;AN000
587 MOV ID_DISPLAYED,1 ;AN000;;; WGR ID was displayed. ;AN000
588 JMP KEYB_L_FINISHED ;AN000;;; WGR ;AN000
589 ;;;;;;;;;;;
590QUERY_CONTINUE1: ;;
591 MOV AX,INV_KEYB_Q ;AC000;;; WGR ;AN000
592 MOV BX,STDOUT ;AN000;;; WGR Else ;AN000
593 XOR CX,CX ;AC000;;; WGR Display message that KEYB ;AN000
594 MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR has not been installed ;AN000
595 XOR DL,DL ;AN000;;; WGR ;AN000
596 CALL SYSDISPMSG ;AN000;;; WGR ;AN000
597 JMP KEYB_CP_FINISHED ;AC000;;;
598 ;;;;;;;;;;;
599KEYB_L_FINISHED: ;;
600 MOV BX,ES:[DI].INVOKED_CP_TABLE ;; Get invoked code page
601 ;;
602 MOV NUMBER_HOLDER,BX ;AN000;;; WGR transfer number to temp loc. ;AN000
603 LEA SI,NUMBER_HOLDER ;AN000;;; WGR sublist points to... ;AN000
604 MOV PTR_TO_NUMBER,SI ;AN000;;; WGR code page word ;AN000
605 MOV AX,ACT_KEYB_CP ;AC000;;; WGR display ' code page: ' ;AN000
606 MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000
607 MOV CX,1 ;AN000;;; WGR one replacement ;AN000
608 MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000
609 XOR DL,DL ;AN000;;; WGR no input ;AN000
610 LEA SI,SUBLIST_NUMBER ;AN000;;; WGR ptr to sublist ;AN000
611 CALL SYSDISPMSG ;AN000;;; WGR ;AN000
612 CMP ID_DISPLAYED,1 ;AN000;;; WGR was id displayed? ;AN000
613 JE KEYB_CP_FINISHED ;AN000;;; WGR yes..continue. ;AN000
614 ;;
615 MOV BX,WORD PTR ES:[DI].INVOKED_KBD_ID;AN000;;; WGR get id code. ;AN000
616 CMP BX,0 ;AN000;;; WGR no id given.. ;AN000
617 JE KEYB_CP_FINISHED ;AN000;;; WGR ;AN000
618 ;;
619 MOV NUMBER_HOLDER,BX ;AN000;;; WGR transfer number to temp loc. ;AN000
620 LEA SI,NUMBER_HOLDER ;AN000;;; WGR sublist points to... ;AN000
621 MOV PTR_TO_NUMBER,SI ;AN000;;; WGR code page word ;AN000
622 MOV AX,ACT_ID ;AC000;;; WGR display 'Current ID: ' ;AN000
623 MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000
624 MOV CX,1 ;AN000;;; WGR one replacement ;AN000
625 MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000
626 XOR DL,DL ;AN000;;; WGR no input ;AN000
627 LEA SI,SUBLIST_NUMBER ;AN000;;; WGR ptr to sublist ;AN000
628 CALL SYSDISPMSG ;AN000;;; WGR ;AN000
629 MOV AH,09H ;AC000;;; WGR need a CR_LF here. ;AN000
630 MOV DX,OFFSET CR_LF ;AC000;;; WGR ;AN000
631 INT 21H ;; WGR ;AN000
632 ;;;;;;;;;;;
633KEYB_CP_FINISHED: ;;
634 MOV AX,CON_INSTALLED ;; If CON has been installed THEN
635 CMP AX,0 ;;
636 JNE GET_ACTIVE_CP ;;
637 JMP CON_NOT_INSTALLED ;;
638 ;;
639GET_ACTIVE_CP: ;;
640 MOV AX,0AD02H ;; Get active code page
641 INT 2FH ;; information from the console
642 JNC DISPLAY_ACTIVE_CP ;;
643 JMP ERROR5 ;;
644 ;;
645DISPLAY_ACTIVE_CP: ;;
646 MOV NUMBER_HOLDER,BX ;AC000;;; WGR transfer number to temp loc. ;AN000
647 LEA SI,NUMBER_HOLDER ;AC000;;; WGR sublist points to... ;AN000
648 MOV PTR_TO_NUMBER,SI ;AC000;;; WGR code page word ;AN000
649 MOV AX,ACT_CON_CP ;AN000;;; WGR display 'Current CON code page: ' ;AN000
650 MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000
651 MOV CX,1 ;AN000;;; WGR one replacement ;AN000
652 MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000
653 XOR DL,DL ;AN000;;; WGR no input ;AN000
654 LEA SI,SUBLIST_NUMBER ;AN000;;; WGR ptr to sublist ;AN000
655 CALL SYSDISPMSG ;AN000;;; WGR ;AN000
656 ;;
657 JMP KEYB_EXIT_NOT_RESIDENT ;; Exit from Proc
658 ;;
659CON_NOT_INSTALLED: ;; ELSE
660 MOV AX,INV_CON_Q ;AC000;WGR ;AN000
661 MOV BX,STDOUT ;AN000;;; WGR Else ;AN000
662 XOR CX,CX ;AN000;;; WGR Display message that CON does ;AN000
663 MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR not have active code page ;AN000
664 XOR DL,DL ;AN000;;; WGR ;AN000
665 CALL SYSDISPMSG ;AN000;;; WGR ;AN000
666 JMP KEYB_EXIT_NOT_RESIDENT ;; Exit from Proc
667 ;;
668NOT_QUERY: ;; IF not a query function requested
669 CALL BUILD_PATH ;; Determine location of KEYBOARD.SYS
670 ;; WGR ...and open file. ;AC000
671 ;;
672 JNC VALID4 ;; If no error in opening file then
673 JMP ERROR4 ;;
674 ;;
675VALID4: ;;
676 MOV KEYBSYS_FILE_HANDLE,AX ;; Save handle
677 MOV BP,OFFSET CMD_PARM_LIST ;; Set base pointer for structures
678 MOV BX,KEYBSYS_FILE_HANDLE ;; Retrieve the file handle
679 MOV DX,OFFSET FILE_BUFFER ;; Set address of buffer
680;************************* CNS ********;;
681 cmp [BP].RET_CODE_4,ID_VALID ;AN000; ;; CNS is there an ID available
682 je ID_TYPED ;AN000; ;; if so go find out if it is
683 jmp GET_LANG ;AN000; ;; a 1st or 4th parm, if not must
684 ;AN000; ;; must be a language
685ID_TYPED: ;AN000;
686
687 call SCAN_ID ;AN000; ;; scan the table for the ID
688 cmp ID_FOUND,1 ;AN000; ;; if a legal ID check and see if
689 jne LOST_ID ;AN000; ;; it is a first or fourth parm
690 cmp FTH_PARMID,1 ;AN000; ;; if it is a fourth parm go
691 je GET_ID ;AN000; ;; check for language compatibility
692 jmp Language_found ;AN000; ;; otherwise it must be a first
693 ;; parm id value
694
695LOST_ID: ;AN000; ;; otherwise must be a bogus match
696 ;; between language and ID codes
697 ;; or the ID code does not exist
698 jmp ERR1ID ;AN000; ;; in the table
699;************************* CNS ***********;;
700GET_LANG: ;; Must be a language/or a 1st parm ID
701 ;;;;;
702 ;;
703 XOR DI,DI ;; Set number
704 LEA CX,[DI].KH_NUM_LANG+2 ;; bytes to read header
705 ;;
706 MOV AH,3FH ;; Read header of the Keyb Def file
707 INT 21H ;;
708 JNC VALID5 ;; If no error in opening file then
709 JMP ERROR4 ;;
710 ;;;;
711VALID5: ;;
712 CLD ;; WGR all moves/scans forward ;AN000
713 MOV CX,SIGNATURE_LENGTH ;;
714 MOV DI,OFFSET SIGNATURE ;; Verify matching
715 MOV SI,OFFSET FB.KH_SIGNATURE ;; signatures
716 REPE CMPSB ;;
717 JE LANGUAGE_SPECIFIED ;;
718 JMP ERROR4 ;;;;
719 ;; READ the language table
720LANGUAGE_SPECIFIED: ;;
721 MOV AX,FB.KH_NUM_LANG ;;
722 MOV NUM_LANG,AX ;; Save the number of languages
723 MUL LANG_PTR_SIZE ;; Determine # of bytes to read
724 MOV DX,OFFSET FILE_BUFFER ;; Establish beginning of buffer
725 MOV CX,AX ;;
726 CMP CX,FILE_BUFFER_SIZE ;; Make sure buffer is not to small
727 JBE READ_LANG_TAB ;;
728 JMP ERROR4 ;;
729 ;;
730READ_LANG_TAB: ;;
731 MOV AH,3FH ;; Read language table from
732 INT 21H ;; Keyb Def file
733 JNC READ_VALID ;; If no error in opening file then
734 JMP ERROR4 ;; Else display ERROR message
735 ;;
736READ_VALID: ;;
737 MOV CX,NUM_LANG ;; Number of valid codes
738 MOV DI,OFFSET FILE_BUFFER ;; Point to correct word in table
739 ;;
740SCAN_LANG_TABLE: ;; FOR language parm
741 MOV AX,[BP].LANGUAGe_PARM ;; Get parameter
742 CMP [DI].KP_LANG_CODE,AX ;; Valid Code ??
743 JE LANGUAGE_FOUND ;; If not found AND more entries THEN
744 ADD DI,LANG_PTR_SIZE ;; Check next entry
745 DEC CX ;; Decrement count of entries
746 JNE SCAN_LANG_TABLE ;; Else
747 JMP ERROR1 ;; Display error message
748 ;;;;;;;;;;;;;;
749;**************************** CNS ****;;;;
750GET_ID: ;AN000;;; CNS - Must be an ID value
751 mov cx,1 ;AN000;;; initialize ctr value for # of ids
752 ;;
753SEARCH_ID: ;AN000;;; minimum per country
754;.WHILE <cx ne 0> ;AN000;;; There is atleast 1 ID for each country
755 cmp cx,0 ;AN000;;; Check for any more IDs left to check
756 jne FINDID ;AN000;;; Country has more than one ID check
757 jmp END_IDCHK ;AN000;;; Country & ID has been found or value
758 ;; is zero
759FINDID: ;AN000;
760
761 push di ;AN000;;; save the current language entry ptr
762 push cx ;AN000;;; save the minimum # of ids before
763 ;; reading the table data from the disk
764;**************************** CNS *****************;;
765LANGUAGE_FOUND: ;;
766 MOV CX,WORD PTR [DI].KP_ENTRY_PTR+2 ;; Get offset of lang entry
767 MOV DX,WORD PTR [DI].KP_ENTRY_PTR ;; in the Keyb Def file
768 MOV WORD PTR KEYBCMD_LANG_ENTRY_PTR,DX ;; Save
769 MOV WORD PTR KEYBCMD_LANG_ENTRY_PTR+2,CX ;; offset
770 MOV AH,42H ;; Move file pointer to
771 MOV AL,0 ;;;;;;; location of language
772 INT 21H ;; entry
773 JNC LSEEK_VALID ;;
774 JMP ERROR4 ;;
775 ;;
776LSEEK_VALID: ;;
777 MOV DI,AX ;;
778 MOV CX,SIZE KEYBSYS_LANG_ENTRY-1 ;; Set number
779 ;; bytes to read header
780 MOV DX,OFFSET FILE_BUFFER ;;;;;;;;;
781 MOV AH,3FH ;; Read language entry in
782 INT 21H ;; Keyb Def file
783 JNC VALID6a ;; If no error in file then
784 JMP ERROR4 ;;;;;;;;;;
785;**************************** CNS **********************************************
786
787
788valid6a:
789 cmp FOURTH_PARM,1 ;AN000;;; Is the ID a 4th Parm
790 jne VALID6 ;AN000;;; if not get out of routine, otherwise
791 pop cx ;AN000;;;restore # of ids for the country
792 ; .IF <cx eq 1> ;AN000;;;Check to see if this is the first
793 ;AN000;;;time checking the primary ID
794 cmp cx,1 ;AN000;;;if there is just one ID check to make
795 jne CHK4PARM ;AN000;;;sure both flags are not set
796 ;AN000;;; this should not be necessary w/ new parser
797 cmp FTH_PARMID,1 ;AN000;;; is the ID flag for switch set
798 jne CHK1N4 ;AN000;;; is the flag set only for the 4th
799 cmp FOURTH_PARM,1 ;AN000;;; if set only for the switch proceed
800 jne CHK1N4 ;AN000;;; if not must be a positional
801 mov cl,fb.kl_num_id ;AN000;;; get the number of IDs available from the table
802 mov FTH_PARMID,0 ;AN000;;; turn switch flag off so the table
803 ;AN000;;; counter will not be reset
804
805 ;;ids available for the
806CHK1N4: ;AN000; ;;country
807 cmp ONE_PARMID,1 ;AN000; ;; this was to be done if
808 jne CHK4PARM ;AN000; ;; two the positional
809 cmp FOURTH_PARM,0 ;AN000; ;; and switch was specified
810 jne CHK4PARM ;AN000; ;; this should never happen
811 pop di ;AN000; ;; if the parser is intact
812 jmp error3 ;AN000; ;; report error & exit
813
814CHK4PARM: ;AN000; ;; check on the first ID
815 ; .IF <FOURTH_PARM EQ 1> ;AN000; ;;switch specified
816 ; call IDLANG_CHK ;AN000; ;;check the lang-id combo
817 ; .ELSE ;AN000;
818 ; xor cx,cx ;AN000; ;;clear to exit loop
819 ; .ENDIF ;AN000;
820 ;
821 cmp FOURTH_PARM,1 ;AN000; ;; ID was a switch
822 jne ABORT_LOOP ;AN000; ;; otherwise get out of routine
823 call IDLANG_CHK ;AN000; ;; check the ID
824 jmp ADVANCE_PTR ;AN000; ;; advance to the next position
825
826ABORT_LOOP: ;AN000;
827 xor cx,cx ;AN000; ;; end loop
828
829ADVANCE_PTR: ;AN000;
830 pop di ;AN000; ;;restore entry value
831
832 dec cx ;AN000; ;;# of ids left to check
833 cmp cx,0 ;AN000; ;; if at 0 don't advance to next
834 je NO_ADVANCE ;AN000; ;; table position
835 cmp GOOD_MATCH,1 ;AN000; ;; check to see if ID matched language
836 je NO_ADVANCE ;AN000; ;; if equal do not advance
837 add di,LANG_PTR_SIZE ;AN000; ;;step to the next entry
838 ;;in the table
839
840NO_ADVANCE: ;AN000;
841
842 jmp SEARCH_ID ;AN000; ;;for the country
843
844;.ENDWHILE ;;end of ID check for country
845
846END_IDCHK: ;AN000;
847
848 cmp FOURTH_PARM,1 ;AN000; ;; see if id was found
849 jne VALID6 ;AN000;
850 cmp GOOD_MATCH,0 ;AN000; ;; none found
851 jne VALID6 ;AN000; ;; report error
852 mov [bp].ret_code_4,1 ;AN000; ;; incompatible lang code
853 mov al,[bp].ret_code_4 ;AN000; ;; id combo
854 jmp err2id ;AN000;
855
856 ;; otherwise found it
857 ;; continue to build tbl
858;**************************** CNS **********************************************
859 ;;
860VALID6: ;;
861 MOV AX,WORD PTR FB.KL_LOGIC_PTR ;; Save the offset of the state
862 MOV WORD PTR STATE_LOGIC_OFFSET,AX ;; logic section
863 MOV AX,WORD PTR FB.KL_LOGIC_PTR+2 ;; Save the offset of the state
864 MOV WORD PTR STATE_LOGIC_OFFSET+2,AX ;; logic section
865 ;;
866 MOV DL,[BP].RET_CODE_2 ;;;;;;;;;; IF code page was specified
867 CMP DL,2 ;;
868 JNE CODE_PAGE_SPECIFIED ;;
869 JMP DONE ;;
870 ;;
871CODE_PAGE_SPECIFIED: ;; Then
872;************************** CNS ***********************************************
873 xor ah,ah ;AN000;
874 MOV Al,FB.KL_NUM_CP ;AN000;;;
875;************************** CNS ***********************************************
876 MOV NUM_CP,AX ;; Save the number of code pages
877 MUL CP_PTR_SIZE ;; Determine # of bytes to read
878 MOV DX,OFFSET FILE_BUFFER ;; Establish beginning of buffer
879 MOV CX,AX ;;
880 CMP CX,FILE_BUFFER_SIZE ;; Make sure buffer is not to small
881 JBE VALID7 ;;
882 JMP ERROR4 ;;
883 ;;
884VALID7: ;;
885 MOV AH,3FH ;; Read code page table from
886 INT 21H ;; Keyb Def file
887 JNC VALID8 ;; If no error in opening file then
888 JMP ERROR4 ;;
889 ;;
890VALID8: ;;
891 MOV CX,NUM_CP ;; Number of valid codes
892 MOV DI,OFFSET FILE_BUFFER ;; Point to correct word in table
893 ;;
894SCAN_CP_TABLE: ;; FOR code page parm
895 MOV AX,[BP].CODE_PAGE_PARM ;; Get parameter
896 CMP [DI].KC_CODE_PAGE,AX ;; Valid Code ??
897 JE CODE_PAGE_FOUND ;; If not found AND more entries THEN
898 ADD DI,CP_PTR_SIZE ;; Check next entry
899 DEC CX ;; Decrement count of entries
900 JNE SCAN_CP_TABLE ;; Else
901 JMP ERROR2 ;; Display error message
902 ;;;;;;;;;
903CODE_PAGE_FOUND: ;;
904 MOV AX,WORD PTR [DI].KC_ENTRY_PTR ;;
905 MOV WORD PTR CP_TAB_OFFSET,AX ;;
906 MOV AX,WORD PTR [DI].KC_ENTRY_PTR+2 ;;
907 MOV WORD PTR CP_TAB_OFFSET+2,AX ;;
908 ;;;;;;
909DONE: ;;
910 MOV SI,OFFSET DESIG_CP_BUFFER ;;
911 ;;
912 MOV AX,CON_INSTALLED ;;;;; If CON is NOT installed THEN
913 CMP AX,0 ;;
914 JE SYSTEM_CP ;;
915 JMP GET_DESIG_CPS ;;
916 ;;
917SYSTEM_CP: ;;
918 MOV CX,1 ;;
919 MOV NUM_DESIG_CP,CX ;; Set number of CPs = 1
920 MOV [SI].NUM_DESIGNATES,CX ;;
921 ;;
922 MOV DL,[BP].RET_CODE_2 ;; Check if code page parm
923 CMP DL,0 ;; was specified
924 JNE SET_TO_SYSTEM_CP ;;
925 MOV DX,[BP].CODE_PAGE_PARM ;;
926 MOV [SI].DESIG_CP_ENTRY,DX ;; Load specified code page into
927 JMP READY_TO_BUILD_TABLE ;; designated code page list
928 ;;
929SET_TO_SYSTEM_CP: ;;
930 CALL FIND_FIRST_CP ;; Call routine that sets the first
931 CMP AX,0 ;; table found in the Keyb Def file
932 JE SET_TO_SYSTEM_CP2 ;; to the system code page
933 JMP ERROR4 ;;
934 ;;
935SET_TO_SYSTEM_CP2: ;;
936 MOV SYS_CODE_PAGE,BX ;;
937 MOV [BP].CODE_PAGE_PARM,BX ;;
938 MOV [SI].DESIG_CP_ENTRY,BX ;; Move sys CP into desig list
939 JMP READY_TO_BUILD_TABLE ;;
940 ;;
941GET_DESIG_CPS: ;; ELSE
942 MOV AX,0AD03H ;;
943 PUSH CS ;; Make sure ES is set
944 POP ES ;;
945 LEA DI,DESIG_CP_BUFFER ;;
946 MOV CX,DESIG_CP_BUF_LEN ;;
947 INT 2FH ;; Get all designated code pages
948 JNC SET_DESIG_VARIABLES ;; from console
949 JMP ERROR5 ;;
950 ;;
951SET_DESIG_VARIABLES: ;;
952 MOV CX,[SI].NUM_DESIGNATES ;;
953 ADD CX,[SI].NUM_HW_CPS ;;
954 MOV NUM_DESIG_CP,CX ;; Set number of Designated CPs
955 ;;
956BUFFER_CREATED: ;;
957 MOV AX,0AD02H ;;
958 INT 2FH ;; Get invoked code page
959 ;;
960SET_TO_CP_INVOKED: ;;
961 MOV DL,[BP].RET_CODE_2 ;; IF code page parm was specified
962 CMP DL,0 ;;
963 JNE SET_TO_INVOKED_CP ;;
964 MOV CX,NUM_DESIG_CP ;;
965 MOV DESIG_LIST,SI ;;
966 JMP TEST_IF_DESIGNATED ;;
967 ;;
968SET_TO_INVOKED_CP: ;;
969 CMP AX,1 ;; IF a code page has been invoked
970 JNE SET_TO_INVOKED_CP3 ;;
971 CALL FIND_FIRST_CP ;; Call the routine that sets the
972 CMP AX,0 ;; first code page in the Keyb Def
973 JE SET_TO_INVOKED_CP2 ;; file to the system code page
974 JMP ERROR4 ;;
975 ;;
976SET_TO_INVOKED_CP2: ;;
977 MOV [BP].CODE_PAGE_PARM,BX ;;
978 MOV SYS_CODE_PAGE,BX ;;
979 ;;
980 JMP TEST_IF_DESIGNATED ;;
981 ;;
982SET_TO_INVOKED_CP3: ;;
983 MOV [BP].CODE_PAGE_PARM,BX ;;
984 ;;
985TEST_IF_DESIGNATED: ;;
986 MOV DX,[BP].CODE_PAGE_PARM ;;
987 CMP [SI].DESIG_CP_ENTRY,DX ;; Is Code page specified in the list
988 JE CODE_PAGE_DESIGNATED ;; of designated code pages ?
989 ;;
990NEXT_DESIG_CP: ;;
991 ADD SI,2 ;; Check next code page
992 DEC CX ;; If all designated code pages have
993 JNZ TEST_IF_DESIGNATED ;; been checked Then ERROR
994 JMP ERROR6 ;;
995 ;;
996CODE_PAGE_DESIGNATED: ;;
997 CMP SYS_CODE_PAGE,0 ;;
998 JNE READY_TO_BUILD_TABLE ;;
999 CMP AX,1 ;; IF a code page has been invoked
1000 JE READY_TO_BUILD_TABLE ;;
1001 CMP [BP].CODE_PAGE_PARM,BX ;; IF Invoked CP <> Specified CP
1002 JE READY_TO_BUILD_TABLE ;; Issue warning
1003;;***************************************************************************
1004 PUSH BX ;AN000;;; WGR ;AN000
1005 PUSH CX ;AN000;;; WGR ;AN000
1006 MOV AX,WARNING_1 ;AN000;;; WGR ;AN000
1007 MOV BX,STDOUT ;AN000;;; WGR ;AN000
1008 XOR CX,CX ;AN000;;; WGR ;AN000
1009 MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR ;AN000
1010 XOR DL,DL ;AN000;;; WGR ;AN000
1011 CALL SYSDISPMSG ;AN000;;; WGR ;AN000
1012 POP CX ;AN000;;; WGR ;AN000
1013 POP BX ;AN000;;; WGR ;AN000
1014;;***************************************************************************
1015 ;;
1016READY_TO_BUILD_TABLE: ;;
1017 ;;
1018 MOV AX,KEYB_INSTALLED ;;
1019 CMP AX,0 ;; Else if KEYB has not been installed
1020 JNE BUILD_THE_TABLE ;;
1021 ;;
1022 CALL FIND_SYS_TYPE ;; Determine system type for INT 9 use
1023 ;;
1024 TEST SD.SYSTEM_FLAG,PC_JR ;; IS THIS ROM MULTILINGUAL? (JR.) AAD
1025 JZ CONTINUE_INSTALL ; NO, LOAD THE NEW INT9 CODE
1026 ; SEE IF MULTILINGUAL OPTION IS PRESENT
1027 MOV AH,5 ; ADDRESS THE MULTILINGUAL SUPPORT
1028 MOV AL,80H ; REQUEST CURRENT LANGUAGE BE IDENTIFIED
1029 INT 16H ; CALL KEYBOARD TO IDENTIFY ITSELF
1030
1031;IF THE MULTILINGUAL OPTION IS NOT PRESENT, THE ROM DOES NOT RECOGNIZE THE
1032;OPTION 5 AND JUST RETURNS THE REGS INTACT.
1033;RESPONSE IN AL INDICATES THE CURRENT LANGUAGE:
1034
1035 CMP AL,80H ; DID I GET BACK JUST WHAT I SENT?
1036 JE CONTINUE_INSTALL ; SINCE RESPONSE WAS THE SAME MUST NOT BE
1037 ; MULTILINGUAL, RELOCATE RESIDENT KBD ROUTINE
1038
1039;I AM GOING TO IGNORE WHAT LANGUAGE IS CURRENTLY SET. I WILL SET THE
1040;MULTILINGUAL KEYBOARD TO BECOME MY LANGUAGE.
1041
1042 MOV AX,[BP].LANGUAGE_PARM ;;
1043 XCHG AH,AL ;;
1044 MOV DI,OFFSET JR_LANGUAGE_CODES ;;
1045 MOV CX,JR_NUM_CODES ;;
1046 PUSH CS ;;
1047 POP ES ;;
1048 REPNE SCASW ;;
1049 JNE CONTINUE_INSTALL ;;
1050 ;;
1051 MOV AH,5 ; ADDRESS THE MULTILINGUAL KEYBOARD
1052 MOV AL,JR_NUM_CODES ; SELECT MY LANGUAGE
1053 SUB AL,CL ;;
1054 INT 16H ; SET THE KEYBOARD ACCORDINGLY
1055 INT 20H ; JOB DONE, ROM IS MULTILINGUAL
1056 ; NO NEED TO STAY RESIDENT
1057 ;;
1058;------ LOAD IN SPECIAL INT 9 HANDLER AND SPECIAL TABLES (IF NEEDED)
1059
1060CONTINUE_INSTALL: ;;
1061 CALL INSTALL_INT_9 ;; Install INT 9
1062 ;;
1063 CALL FIND_KEYB_TYPE ;; Determine keyboard type table use
1064 ;;
1065BUILD_THE_TABLE: ;;
1066 CALL TABLE_BUILD ;; Build the TEMP_SHARED_DATA_AREA
1067 ;;
1068CHECK_ERRORS: ;;
1069 XOR CX,CX ;; Take appropriate action considering
1070 MOV CX,TB_RETURN_CODE ;; return codes from TABLE_BUILD
1071 CMP CX,0 ;;
1072 JE CHECK_FOR_INV_CP ;; If return code is not 0
1073 ;;
1074 MOV AX,KEYB_INSTALLED ;;
1075 CMP AX,0 ;; If KEYB has not been installed
1076 JNE CHECK_ERROR_CONTINUE ;;
1077 CALL REMOVE_INT_9 ;; remove installed vector
1078 ;;
1079CHECK_ERROR_CONTINUE: ;;
1080 CMP CX,1 ;; If return code = 1
1081 JNE CHECK_ERROR2 ;;
1082 JMP ERROR1 ;; display error message
1083 ;;
1084CHECK_ERROR2: ;;
1085 CMP CX,2 ;; If return code = 2
1086 JNE CHECK_ERROR3 ;;
1087 JMP ERROR2 ;;
1088 ;;
1089CHECK_ERROR3: ;;
1090 CMP CX,3 ;; If return code = 3
1091 JNE CHECK_ERROR4 ;;
1092 JMP ERROR3 ;; display error message
1093 ;;
1094CHECK_ERROR4: ;;
1095 CMP CX,4 ;; If return code = 4
1096 JNE CHECK_ERROR5A ;;
1097 JMP ERROR4 ;; display error message
1098 ;;
1099CHECK_ERROR5A: ;;
1100 CMP CX,5 ;; If return code = 5
1101 JNE CHECK_ERROR6A ;;
1102 JMP ERROR5A ;; display error message
1103 ;;
1104CHECK_ERROR6A: ;;
1105 JMP ERROR6A ;; If return code not 0,1,2,3,4 then
1106 ;; display error message
1107CHECK_FOR_INV_CP: ;;
1108 MOV CX,CPN_INVALID ;; Check if any CPs were not loaded
1109 CMP CX,0 ;;
1110 JE TERMINATE ;; If some were invalid, issue
1111 ;; warning message
1112;;***************************************************************************
1113 PUSH BX ;AN000;;; WGR ;AN000
1114 PUSH CX ;AN000;;; WGR ;AN000
1115 MOV AX,NOT_SUPP ;AN000;;; WGR ;AN000
1116 MOV BX,STDOUT ;AN000;;; WGR WARNING ;AN000
1117 XOR CX,CX ;AN000;;; WGR MESSAGE ;AN000
1118 MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR ;AN000
1119 XOR DL,DL ;AN000;;; WGR ;AN000
1120 CALL SYSDISPMSG ;AN000;;; WGR ;AN000
1121 POP CX ;AN000;;; WGR ;AN000
1122 POP BX ;AN000;;; WGR ;AN000
1123;;***************************************************************************
1124 ;;
1125TERMINATE: ;;
1126 MOV AH,3EH ;; Close the KEYBOARD.SYS file
1127 MOV BX,KEYBSYS_FILE_HANDLE ;; if open
1128 CMP BX,0 ;;
1129 JE KEYB_EXIT ;;
1130 INT 21H ;;
1131 ;;
1132 MOV AX,KEYB_INSTALLED ;;
1133 CMP AX,0 ;;
1134 JE KEYB_EXIT ;;
1135 JMP KEYB_EXIT_NOT_RESIDENT ;;
1136 ;;
1137KEYB_EXIT: ;;
1138 TEST SD.KEYB_TYPE,G_KB ;; Q..FERRARI G??
1139 JZ NO_FERRARI_G ;; N..LEAVE NUMLK ALONE
1140 TEST SD.SYSTEM_FLAG,PC_XT ;; Q..PC/XT?
1141 JNZ NO_FERRARI_G ;; Y..LEAVE NUMLK ALONE
1142 TEST SD.KEYB_TYPE,P_KB ;; Q..FERRARI P?? ***RPS
1143 JNZ NO_FERRARI_G ;; Y..LEAVE NUMLK ALONE ***RPS
1144;***CNS
1145 CMP SECURE_FL,1 ;AN002;; IF SECURITY FLAG SET
1146 JNE NO_FERRARI_G ;AN002;; DON'T TURN ON NUM_LK
1147
1148;***CNS
1149 CALL NUMLK_ON ;; N..TURN NUMLK ON
1150 ;;
1151NO_FERRARI_G: ;;
1152 TEST SD.SYSTEM_FLAG,EXT_16 ;; extended INT 16 support?
1153 JZ SKIP_CTRL_COPY ;;
1154 ;; Yes, load extened CTRL case table
1155 MOV CX,L_CTRL_TAB ;; CX = LENGTH OF EXTENDED TABLE
1156 MOV SI,OFFSET CS:RPL_K8 ;; POINT TO EXT. CTRL TABLES
1157 MOV DI,OFFSET CS:K8 ;; POINT TO REGULAR CTRL TABLE
1158 CLD ;;
1159 REP MOVSB ;; OVERLAY WITH EXT. CTRL TABLE
1160 ;;
1161SKIP_CTRL_COPY: ;;
1162 CALL INSTALL_INT_9_NET ;; Let the network know about INT 9
1163 ;; (if the network is installed)
1164 CALL INSTALL_INT_2F_48 ;; Install INT 2F and INT 48 (If PCjr)
1165 ;;
1166 MOV AX,0AD82H ;; Activate language
1167 MOV BL,-1 ;;
1168 INT 2FH ;;
1169 ;;
1170 MOV DX,ES:TSD.RESIDENT_END ;; Get resident end
1171 MOV CL,4 ;; Convert into paragrahs
1172 SHR DX,CL ;;
1173 INC DX ;;
1174 MOV AH,31H ;; Function call to terminate but stay
1175 XOR AL,AL ;; resident
1176 ;;
1177 MOV DI,OFFSET SD_DEST_PTR ;; Initialize destination ptr
1178 MOV SI,OFFSET SD_SOURCE_PTR ;; Initialize source ptr
1179 XOR BP,BP ;;
1180 LEA BX,[BP].ACTIVE_LANGUAGE ;;
1181 ADD DI,BX ;; Adjust for portion not copied
1182 ADD SI,BX ;; Adjust for portion not copied
1183 ;;
1184 MOV CX,SD_LENGTH ;; Set length of SHARED_DATA_AREA
1185 SUB CX,BX ;; Adjust for portion not copied
1186 ;;
1187 JMP COPY_SD_AREA ;; Jump to proc that copies area in new
1188 ;; part of memory
1189;***************************** CNS *********************************************
1190ERR1ID: ;AN000;
1191;;***************************************************************************
1192 MOV AX,INV_I ;AN000;;; WGR invalid ID message ;AN000
1193 MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000
1194 XOR CX,CX ;AN000;;; WGR no substitutions ;AN000
1195 MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000
1196 XOR DL,DL ;AN000;;; WGR no input ;AN000
1197 CALL SYSDISPMSG ;AN000;;; WGR display message ;AN000
1198 MOV AL,INVALID_PARMS ;AN000;;; |
1199 MOV EXIT_RET_CODE,AL ;AN000;;; |
1200;;***************************************************************************
1201 JMP KEYB_EXIT_NOT_RESIDENT ;;
1202ERR2ID:
1203;;***************************************************************************
1204 MOV AX,INV_COMBO ;AN000;;; WGR invalid combination message ;AN000
1205 MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000
1206 XOR CX,CX ;AN000;;; WGR no substitutions ;AN000
1207 MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000
1208 XOR DL,DL ;AN000;;; WGR no input ;AN000
1209 CALL SYSDISPMSG ;AN000;;; WGR display message ;AN000
1210 MOV AL,INVALID_PARMS ;AN000;;; |
1211 MOV EXIT_RET_CODE,AL ;AN000;;; |
1212;;***************************************************************************
1213 JMP KEYB_EXIT_NOT_RESIDENT ;;
1214;***************************** CNS *********************************************
1215ERROR1:
1216;;***************************************************************************
1217 MOV AX,INV_L ;AN000;;; WGR invalid language code ;AN000
1218 MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000
1219 XOR CX,CX ;AN000;;; WGR no substitutions ;AN000
1220 MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000
1221 XOR DL,DL ;AN000;;; WGR no input ;AN000
1222 CALL SYSDISPMSG ;AN000;;; WGR display message ;AN000
1223 MOV AL,INVALID_PARMS ;AN000;;; |
1224 MOV EXIT_RET_CODE,AL ;AN000;;; |
1225;;***************************************************************************
1226 JMP KEYB_EXIT_NOT_RESIDENT ;;
1227ERROR2:
1228;;***************************************************************************
1229 MOV AX,INV_CP ;AN000;;; WGR invalid code page message ;AN000
1230 MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000
1231 XOR CX,CX ;AN000;;; WGR no substitutions ;AN000
1232 MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000
1233 XOR DL,DL ;AN000;;; WGR no input ;AN000
1234 CALL SYSDISPMSG ;AN000;;; WGR display message ;AN000
1235 MOV AL,INVALID_PARMS ;AN000;;; |
1236 MOV EXIT_RET_CODE,AL ;AN000;;; |
1237;;***************************************************************************
1238 JMP KEYB_EXIT_NOT_RESIDENT ;;
1239ERROR3:
1240;;***************************************************************************
1241 MOV AX,INV_S ;AN000;;; WGR invalid syntax message ;AN000
1242 MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000
1243;***CNS
1244
1245 LEA DI,STRING_HOLDER ;AN003;Set PTR to look at the STRING
1246 PUSH SI ;AN003;Save current SI index
1247 PUSH AX
1248 MOV AX,OLD_PTR ;AN003;Last locale of the end of a PARAM
1249 SUB CUR_PTR,AX ;AN003;Get the length via the PSP
1250 MOV SI,CUR_PTR
1251 MOV CX,SI ;AN003;Save it in CX to move in the chars
1252 POP AX ;AN003;Restore the PTR to the command line position
1253
1254 MOV SI,OLD_PTR ;AN003;Last locale of the end of a PARAM
1255 REP MOVSB ;AN003;Move in the chars until no more
1256
1257 LEA DI,STRING_HOLDER ;AN003;Set PTR to look at the STRING
1258
1259
1260 POP SI ;AN003;Restore the PTR to the command line position
1261
1262 MOV CX,1 ;AN003;One replacement
1263 MOV PTR_TO_COMLIN,DI ;AN003;;; WGR language code asciiz string ;AN000
1264
1265
1266 PUSH AX ;AN003;
1267 MOV AX,DS ;AN003;;; WGR language code asciiz string ;AN000
1268 MOV SEG_OF_COMLIN,AX ;AN003;
1269 POP AX ;AN003;
1270 ;XOR CX,CX ;AN000;;; WGR no substitutions ;AN000
1271
1272 MOV AX,ERR_PART ;AN003;
1273 LEA SI,SUBLIST_COMLIN ;AN003;
1274; MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR parse error message ;AN000
1275 MOV DH,PARSE_ERR_CLASS ;AN000;;; WGR parse error message ;AN000
1276 XOR DL,DL ;AN000;;; WGR no input ;AN000
1277 CALL SYSDISPMSG ;AN000;;; WGR display message ;AN000
1278 MOV AL,INVALID_PARMS ;AN000;;; |
1279 MOV EXIT_RET_CODE,AL ;AN000;;; |
1280;;***************************************************************************
1281 JMP KEYB_EXIT_NOT_RESIDENT ;;
1282ERROR4:
1283;;***************************************************************************
1284 MOV AX,INV_FN ;AN000;;; WGR bad or missing file message ;AN000
1285 MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000
1286 XOR CX,CX ;AN000;;; WGR no substitutions ;AN000
1287 MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000
1288 XOR DL,DL ;AN000;;; WGR no input ;AN000
1289 CALL SYSDISPMSG ;AN000;;; WGR display message ;AN000
1290 MOV AL,BAD_KEYB_DEF_FILE ;AN000;;; |
1291 MOV EXIT_RET_CODE,AL ;AN000;;; |
1292;;***************************************************************************
1293 JMP KEYB_EXIT_NOT_RESIDENT ;;
1294ERROR5:
1295;;***************************************************************************
1296 MOV AX,INV_CON_Q ;AC000;;; WGR CON code page not available. ;AN000
1297 MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000
1298 XOR CX,CX ;AN000;;; WGR no substitutions ;AN000
1299 MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000
1300 XOR DL,DL ;AN000;;; WGR no input ;AN000
1301 CALL SYSDISPMSG ;AN000;;; WGR display message ;AN000
1302 MOV AL,CONSOLE_ERROR ;AN000;;; |
1303 MOV EXIT_RET_CODE,AL ;AN000;;; |
1304;;***************************************************************************
1305 JMP KEYB_EXIT_NOT_RESIDENT ;;
1306ERROR5A:
1307;;***************************************************************************
1308 MOV AX,MEMORY_OVERF ;AC000;;; WGR not enough resident memory. ;AN000
1309 MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000
1310 XOR CX,CX ;AN000;;; WGR no substitutions ;AN000
1311 MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000
1312 XOR DL,DL ;AN000;;; WGR no input ;AN000
1313 CALL SYSDISPMSG ;AN000;;; WGR display message ;AN000
1314 MOV AL,MEMORY_OVERFLOW ;AN000;;; |
1315 MOV EXIT_RET_CODE,AL ;AN000;;; |
1316;;***************************************************************************
1317 JMP KEYB_EXIT_NOT_RESIDENT ;;
1318ERROR6:
1319;;***************************************************************************
1320 MOV AX,NOT_DESIG ;AC000;;; WGR code page not prepared. ;AN000
1321 MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000
1322 XOR CX,CX ;AN000;;; WGR no substitutions ;AN000
1323 MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000
1324 XOR DL,DL ;AN000;;; WGR no input ;AN000
1325 CALL SYSDISPMSG ;AN000;;; WGR display message ;AN000
1326 MOV AL,CP_NOT_DESIGNATED ;AN000;;; |
1327 MOV EXIT_RET_CODE,AL ;AN000;;; |
1328;;***************************************************************************
1329 JMP KEYB_EXIT_NOT_RESIDENT ;;
1330ERROR6A:
1331;;***************************************************************************
1332 MOV NUMBER_HOLDER,BX ;AN000;;; WGR transfer number to temp loc. ;AN000
1333 LEA SI,NUMBER_HOLDER ;AN000;;; WGR sublist points to... ;AN000
1334 MOV PTR_TO_NUMBER,SI ;AN000;;; WGR code page word ;AN000
1335 MOV AX,NOT_VALID ;AN000;;; WGR display 'Code page requested....' ;AN000
1336 MOV BX,STDOUT ;AN000;;; WGR to standard out ;AN000
1337 MOV CX,1 ;AN000;;; WGR one replacement ;AN000
1338 MOV DH,UTILITY_MSG_CLASS ;AN000;;; WGR utility message ;AN000
1339 XOR DL,DL ;AN000;;; WGR no input ;AN000
1340 LEA SI,SUBLIST_NUMBER ;AN000;;; WGR ptr to sublist ;AN000
1341 CALL SYSDISPMSG ;AN000;;; WGR ;AN000
1342 MOV AL,KEYB_TABLE_NOT_LOAD ;AN000;;; |
1343 MOV EXIT_RET_CODE,AL ;AN000;;; |
1344;;***************************************************************************
1345 ;;
1346KEYB_EXIT_NOT_RESIDENT: ;;
1347 MOV AH,04CH ;;
1348 MOV AL,QUERY_CALL ;; Check if this was a query call
1349 CMP AL,0 ;;
1350 JNE KEYB_EXIT3 ;; IF yes then EXIT
1351 MOV AL,EXIT_RET_CODE ;; Check if return code was valid
1352 CMP AL,0 ;;
1353 JNE KEYB_EXIT3 ;; IF not then EXIT
1354 ;;
1355COPY_INTO_SDA: ;;
1356 MOV AX,0AD82H ;; Activate language
1357 MOV BL,-1 ;;
1358 INT 2FH ;;
1359 ;;
1360 MOV AH,04CH ;;;;;;;;;;;
1361 MOV AL,EXIT_RET_CODE ;;
1362 MOV DI,WORD PTR SHARED_AREA_PTR+2 ;; Initialize destination ptr
1363 MOV ES,WORD PTR SHARED_AREA_PTR ;;
1364 MOV DX,[BP].RESIDENT_END ;;;;;;;;;;;
1365 MOV CL,4 ;; Calculate resident end in paragraphs
1366 SHR DX,CL ;;
1367 INC DX ;;
1368 ;;
1369 MOV SI,OFFSET SD_SOURCE_PTR ;; Initialize source ptr
1370 XOR BP,BP ;;
1371 LEA BX,[BP].ACTIVE_LANGUAGE ;;
1372 ADD DI,BX ;;
1373 ADD SI,BX ;;
1374 MOV CX,SD_LENGTH ;; Set length of SHARED_DATA_AREA
1375 SUB CX,BX ;;
1376 ;;
1377 JMP COPY_SD_AREA ;; Jump to proc that copies area in new
1378 ;;
1379KEYB_EXIT3: ;;;;;;;;;;;
1380 MOV AL,EXIT_RET_CODE ;;
1381 MOV DI,WORD PTR SHARED_AREA_PTR+2 ;; Initialize destination ptr
1382 MOV ES,WORD PTR SHARED_AREA_PTR ;;
1383 MOV ES:[DI].TABLE_OK,1 ;;
1384 INT 21H ;;;;;;;;;;;
1385 ;;
1386KEYB_COMMAND ENDP ;;
1387 ;;
1388;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1389;;
1390;; Procedure: NUMLK_ON
1391;;
1392;; Description:
1393;; Turn Num Lock On.
1394;;
1395;; Input Registers:
1396;; N/A
1397;;
1398;; Output Registers:
1399;; N/A
1400;;
1401;; Logic:
1402;; Set Num Lock bit in BIOS KB_FLAG
1403;; Issue Int 16 to update lights
1404;;
1405;;
1406;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1407 ;;
1408NUMLK_ON PROC ;;
1409 ;;
1410 PUSH ES ;;
1411 PUSH AX ;;
1412 ;;
1413 MOV AX,DATA ;;
1414 MOV ES,AX ;;
1415 ;;
1416 OR ES:KB_FLAG,NUM_STATE ;; Num Lock state active
1417 MOV AH,1 ;; Issue keyboard query call to
1418 INT 16H ;; have BIOS update the lights
1419 ;;
1420 POP AX ;;
1421 POP ES ;;
1422 RET ;;
1423 ;;
1424NUMLK_ON ENDP ;;
1425 ;;
1426;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1427;;
1428;; Module: INSTALL_INT_9
1429;;
1430;; Description:
1431;; Install our INT 9 driver.
1432;;
1433;; Input Registers:
1434;; DS - points to our data segment
1435;; BP - points to ES to find SHARED_DATA_AREA
1436;;
1437;; Output Registers:
1438;; DS - points to our data segment
1439;; AX, BX, DX, ES Trashed
1440;;
1441;; Logic:
1442;; Get existing vector
1443;; Install our vector
1444;; Return
1445;;
1446;; Notes:
1447;;
1448;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1449 ;;
1450REPLACE_INT_SEGMENT1 DW ? ;;
1451 ;;
1452;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1453;; Program Code
1454;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1455 ;;
1456INSTALL_INT_9 PROC ;;
1457 ;;
1458 PUSH ES ;;
1459 ;;
1460 MOV AH,35H ;; Get int 9 vector
1461 MOV AL,9 ;;
1462 INT 21H ;; Vector in ES:BX
1463 MOV REPLACE_INT_SEGMENT1,ES ;;
1464 PUSH CS ;;
1465 POP ES ;;
1466 MOV WORD PTR ES:SD.OLD_INT_9,BX ;; Offset
1467 MOV AX,REPLACE_INT_SEGMENT1 ;;
1468 MOV WORD PTR ES:SD.OLD_INT_9+2,AX ;; Segment
1469 MOV AH,25H ;;
1470 MOV AL,9 ;;
1471 MOV DX,OFFSET KEYB_INT_9 ;; Let DOS know about our handler
1472 INT 21H ;;
1473 ;;
1474 POP ES ;;
1475 RET ;;
1476 ;;
1477INSTALL_INT_9 ENDP ;;
1478 ;;
1479;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1480;;
1481;; Module: INSTALL_INT_9_NET
1482;;
1483;; Description:
1484;;
1485;;
1486;; Input Registers:
1487;; DS - points to our data segment
1488;; BP - points to ES to find SHARED_DATA_AREA
1489;;
1490;; Output Registers:
1491;; DS - points to our data segment
1492;; AX, BX, DX, ES Trashed
1493;;
1494;; Logic:
1495;; IF network is installed THEN
1496;; Let it know about our INT 9
1497;; Return
1498;;
1499;; Notes:
1500;;
1501;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1502 ;;
1503;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1504;; Program Code
1505;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1506 ;;
1507INSTALL_INT_9_NET PROC ;;
1508 ;;
1509 PUSH ES ;;
1510 ;;
1511 TEST SD.SYSTEM_FLAG,PC_NET ;; TEST FOR PC_NETWORK
1512 JNZ NET_HAND_SHAKE ;; JUMP IF NETWORK INSTALLED
1513 JMP INSTALL_9_DONE_NET ;; SKIP THE PC NETWORK HANDSHAKE
1514 ;;
1515NET_HAND_SHAKE: ;;
1516 ;; ES:BX TO CONTAIN INT 9 ADDR
1517 MOV BX,OFFSET KEYB_INT_9 ;;
1518 MOV AX,0B808H ;; FUNCTION FOR PC NETWORK TO INSTALL
1519 ;; THIS ADDRESS FOR THEIR JUMP TABLE
1520 INT 02FH ;; TELL PC_NET TO USE MY ADDR TO CHAIN TO
1521 ;;
1522INSTALL_9_DONE_NET: ;;
1523 POP ES ;;
1524 RET ;;
1525 ;;
1526INSTALL_INT_9_NET ENDP ;;
1527 ;;
1528;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1529;;
1530;; Module: INSTALL_INT_2F_48
1531;;
1532;; Description:
1533;; Install our INT 2F, INT 48 drivers.
1534;;
1535;; Input Registers:
1536;; DS - points to our data segment
1537;; BP - points to ES to find SHARED_DATA_AREA
1538;;
1539;; Output Registers:
1540;; DS - points to our data segment
1541;; AX, BX, DX, ES Trashed
1542;;
1543;; Logic:
1544;; Get existing vectors
1545;; Install our vectors
1546;; Return
1547;;
1548;; Notes:
1549;;
1550;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1551 ;;
1552REPLACE_INT_SEGMENT2 DW ? ;;
1553 ;;
1554;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1555;; Program Code
1556;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1557 ;;
1558INSTALL_INT_2F_48 PROC ;;
1559 ;;
1560 MOV AH,35H ;; Get int 2f vector
1561 MOV AL,2FH ;;
1562 INT 21H ;; Vector in ES:BX
1563 MOV REPLACE_INT_SEGMENT2,ES ;;
1564 PUSH CS ;;
1565 POP ES ;;
1566 MOV WORD PTR ES:SD.OLD_INT_2F,BX ;; Offset
1567 MOV AX,REPLACE_INT_SEGMENT2 ;;
1568 MOV WORD PTR ES:SD.OLD_INT_2F+2,AX ;; Segment
1569 MOV AH,25H ;; Set int 9 vector
1570 MOV AL,2FH ;;
1571 MOV DX,OFFSET KEYB_INT_2F ;; Vector in DS:DX
1572 INT 21H ;;
1573 ;;
1574ARE_WE_A_PCJR: ;;
1575 ;;
1576 MOV AX,SD.SYSTEM_FLAG ;; Test if we are a PCjr
1577 CMP AX,PC_JR ;;
1578 JNE INSTALL_DONE ;; IF yes then
1579 MOV AH,35H ;; Get int 48 vector
1580 MOV AL,48H ;;
1581 INT 21H ;; Vector in ES:BX
1582 MOV REPLACE_INT_SEGMENT2,ES ;;
1583 PUSH CS ;;
1584 POP ES ;;
1585 MOV WORD PTR ES:SD.OLD_INT_48,BX ;; Offset
1586 MOV AX,REPLACE_INT_SEGMENT2 ;;
1587 MOV WORD PTR ES:SD.OLD_INT_48+2,AX ;; Segment
1588 MOV AH,25H ;; Set int 48 vector
1589 MOV AL,48H ;;
1590 MOV DX,OFFSET KEYB_INT_48 ;; Vector in DS:DX
1591 INT 21H ;;
1592 ;;
1593INSTALL_DONE: ;;
1594
1595
1596 RET ;;
1597 ;;
1598INSTALL_INT_2F_48 ENDP ;;
1599 ;;
1600;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1601;;
1602;; Module: REMOVE_INT_9
1603;;
1604;; Description:
1605;; Remove our INT 9 driver.
1606;;
1607;; Input Registers:
1608;; DS - points to our data segment
1609;; BP - points to ES to find SHARED_DATA_AREA
1610;;
1611;; Output Registers:
1612;; DS - points to our data segment
1613;; AX, BX, DX, ES Trashed
1614;;
1615;; Logic:
1616;; Get old vector
1617;; Install old vector
1618;; Return
1619;;
1620;; Notes:
1621;;
1622;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1623 ;;
1624;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1625;; Program Code
1626;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1627 ;;
1628REMOVE_INT_9 PROC ;;
1629 ;;
1630 PUSH DS ;;
1631 PUSH ES ;;
1632 MOV ES,WORD PTR SHARED_AREA_PTR ;;
1633 MOV AX,WORD PTR ES:SD.OLD_INT_9+2 ;; int 9 vector - segment
1634 MOV DS,AX ;;
1635 MOV DX,WORD PTR ES:SD.OLD_INT_9 ;; int 9 vector - offset
1636 ;;
1637 MOV AH,25H ;;;;;;;;; Set int 9 vector
1638 MOV AL,9 ;;
1639 INT 21H ;;
1640 ;;
1641REMOVE_9_DONE: ;;
1642 POP ES ;;
1643 POP DS ;;
1644 RET ;;
1645 ;;
1646REMOVE_INT_9 ENDP ;;
1647 ;;
1648;*********************** CNS **********;;
1649PURPOSE: ;;
1650INPUT: ;;
1651OUTPUT: ;;
1652;**************************************;;
1653 ;AN000;;;
1654 ;AN000;;;
1655 ;AN000;;;
1656 IDLANG_CHK PROC NEAR ;AN000;;;
1657 ;AN000;;;
1658 mov ax,fb.kl_id_code ;AN000;;;get the id code from the table
1659 cmp ax,[bp].id_parm ;AN000;;;;;;;;;;;compare it to value taken
1660 jne end_match ;AN000; ;from the switch-- if found
1661 cmp ALPHA,0 ;AN000; ;a keyboard code was specified
1662 je a_match ;AN000; ;no lang & a match
1663 ;AN000; ;
1664 mov ax,fb.kl_lang_code ;AN000; ;compare lang codes
1665 cmp ax,[BP].LANGUAGE_PARM ;AN000; ;they are equal
1666 je a_match ;AN000; ;
1667 ;AN000; ;
1668 jmp end_match ;AN000; ;if not found go check next
1669 ;AN000; ;id for the same country
1670 ;AN000; ;
1671 a_match: ;AN000; ;
1672 ;
1673 mov good_match,1 ;AN000; ;report the ids match
1674 ;
1675 end_match: ;AN000; ;
1676 ;
1677 ret ;AN000; ;
1678 ;
1679 IDLANG_CHK ENDP ;AN000; ;
1680;*********************** CNS *******************;
1681;**********************************SCAN_ID***********************;
1682; New variables defined - NUM_ID,ADRSS_LANG,ID_PTR_SIZE,ID_FOUND ;
1683;****************************************************************;
1684 ;
1685 ;
1686 SCAN_ID PROC NEAR ;
1687 ;
1688 xor di,di ;AN000;;clear di to set at the
1689 ;AN000;;beginning of KEYBSYS STRUCTURE
1690 ;;;;;;;;;;
1691 ;
1692 lea cx,[di].kh_num_ID+4 ;AN000;; set number of bytes to read header
1693 ;
1694 mov ah,3fh ;AN000;;
1695 int 21h ;AN000;;
1696 jnc VAL5ID ;AN000;;
1697 jmp BAD_TAB ;AN000;;;bad table message
1698 ;
1699 VAL5ID: ;AN000; ;
1700 ;
1701 mov cx,SIGNATURE_LENGTH ;AN000; ;
1702 mov di,offset SIGNATURE ;AN000; ;
1703 mov si,offset FB.KH_SIGNATURE;AN000; ;
1704 repe CMPSB ;AN000; ;
1705 je ID_SPECIFIED ;AN000; ;
1706 jmp BAD_TAB ;AN000; ;
1707 ;
1708 ;
1709 ;
1710 ID_SPECIFIED: ;AN000; ;
1711 ;
1712 mov ax,FB.KH_NUM_ID ;AN000; ;;;;;;;;;;;;;;;
1713 mov NUM_ID,ax ;AN000; ;save # of IDs
1714 mul ID_PTR_SIZE ;AN000; ;determine # of bytes to read
1715 push ax ;AN000; ;save current # of bytes to read for
1716 ;AN000; ;ID values only
1717 mov ax,FB.KH_NUM_LANG ;AN000; ;add on lang data in table
1718 mul LANG_PTR_SIZE ;AN000; ;data that comes before the ID data
1719 mov cx,ax ;AN000; ;save that value for the size compare
1720 mov PASS_LANG,cx ;AN000; ;
1721 pop ax ;AN000; ;restore the info for # of ID bytes to read
1722 add cx,ax ;AN000; ;add that value to get total in CX
1723 mov TOTAL_SIZE,cx ;AN000; ;save the total size
1724 cmp cx,FILE_BUFFER_SIZE ;AN000; ;
1725 jbe READ_ID_TAB ;AN000; ;
1726 jmp BAD_TAB ;AN000; ;
1727 ;
1728 ;
1729 READ_ID_TAB: ;AN000; ;
1730 ;
1731 mov dx,offset FILE_BUFFER ;AN000; ;
1732 mov ah,3fh ;;AN000;read language table from
1733 int 21h ;;AN000;keyb defn file
1734 jnc READ_IDVAL ;;AN000;
1735 jmp BAD_TAB ;;AN000;
1736 ;
1737 READ_IDVAL: ;;AN000;
1738 ;;AN000;
1739 mov cx,NUM_ID ;;AN000;
1740 mov di,offset FILE_BUFFER ;;AN000;;;;;;;;;;
1741 add di,PASS_LANG ;AN000; ;
1742 ;
1743 SCAN_ID_TAB: ;AN000; ;
1744 ;
1745 mov ax,[bp].ID_PARM ;AN000; ;
1746 cmp [di].KP_ID_CODE,ax ;AN000; ;
1747 je ID_HERE ;AN000; ;
1748 add di,ID_PTR_SIZE ;AN000; ;
1749 dec cx ;AN000; ;
1750 jne SCAN_ID_TAB ;AN000; ;
1751 jmp FINALE ;AN000; ;
1752 ;
1753 BAD_TAB: ;AN000;;
1754 ;
1755 mov ERR4ID,1 ;AN000; ;
1756 jmp FINALE ;AN000; ;
1757 ;
1758 ;
1759 ;
1760 ID_HERE: ;AN000; ;
1761 ;
1762 mov ID_FOUND,1 ;AN000;;reset ptr for ;
1763 ;AN000;;current country ;
1764 ;
1765
1766 ;
1767 FINALE: ;AN000; ;
1768 ;
1769 ret ;AN000; ;
1770 ;
1771 ;
1772 SCAN_ID ENDP ;AN000; ;
1773 ;
1774;*******************************SCAN_ID END******;
1775;;
1776;; Module: BUILD_PATH
1777;;
1778;; Description:
1779;; Build the complete filename of the Keyboard Definition File
1780;;*************************************WGR*********************
1781;; and open the file.
1782;;+++++++++++++++++++++++++++++++++++++WGR+++++++++++++++++++++
1783;;
1784;; Input Registers:
1785;; DS - points to our data segment
1786;; ES - points to our data segment
1787;; BP - offset of parmeter list
1788;;
1789;; Output Registers:
1790;;************************************WGR**********************
1791;; CARRY CLEAR
1792;; AX = HANDLE
1793;; CARRY SET (ERROR)
1794;; NONE
1795;;++++++++++++++++++++++++++++++++++++WGR++++++++++++++++++++++
1796;; The complete filename will be available in FILE_NAME
1797;;
1798;; Logic:
1799;;
1800;; Determine whether path parameter was specified
1801;; IF length is zero THEN
1802;;****************************************WGR******************
1803;; Try to open file in ACTIVE directory
1804;; IF failed THEN
1805;; Try to open file in ARGV(0) directory
1806;; IF failed THEN
1807;; Try to open file in ROOT directory (for DOS 3.3 compatibility)
1808;; ENDIF
1809;; ENDIF
1810;; ENDIF
1811;; ELSE
1812;; Copy path from PSP to FILE_NAME memory area
1813;; Try to open USER SPECIFIED file
1814;;++++++++++++++++++++++++++++++++++++++++WGR++++++++++++++++++
1815;;
1816;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1817 ;;
1818KEYBOARD_SYS DB '\KEYBOARD.SYS',00 ;AN000;;;
1819KEYB_SYS_ACTIVE DB 'KEYBOARD.SYS',00 ;AN000;;; WGR ;AN000
1820KEYB_SYS_LENG EQU 14 ;AN000;;;
1821KEYB_SYS_A_LENG EQU 13 ;AN000;;; WGR ;AN000
1822 ;;
1823FILE_NAME DB 128 DUP(0) ;AN000;;;
1824 ;;
1825FILE_NOT_FOUND EQU 2 ;AN000;;; WGR ;AN000
1826PATH_NOT_FOUND EQU 3 ;AN000;;; WGR ;AN000
1827;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1828;; Program Code
1829;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1830 ;;
1831BUILD_PATH PROC NEAR ;;
1832 CLD ;AN000;;; WGR ;AN000
1833 MOV DI,OFFSET FILE_NAME ;; Get the offset of the filename
1834 MOV CX,[BP].PATH_LENGTH ;; If path is specified then
1835 CMP CX,0 ;;
1836 JE APPEND_KEYB_SYS ;;
1837 MOV SI,[BP].PATH_OFFSET ;; Get the offset of the path
1838 ;;
1839 REPE MOVSB ;AC000;;; Copy each char of the specified
1840 MOV AX,3D00H ;AC000;;; WGR Open the KEYBOARD.SYS file ;AN000
1841 MOV DX,OFFSET FILE_NAME ;AC000;;; WGR ;AN000
1842 INT 21H ;AC000;;; WGR ;AN000
1843 RET ;; path into the filename location
1844 ;;
1845APPEND_KEYB_SYS: ;;;;;
1846 MOV SI,OFFSET KEYB_SYS_ACTIVE ;AC000;;; WGR copy name for active directory ;AN000
1847 MOV CX,KEYB_SYS_A_LENG ;AC000;;;;;; WGR to file name variable. ;AN000
1848 REPE MOVSB ;AC000;;; WGR ;AN000
1849 MOV AX,3D00H ;AC000;;; WGR try to open it. ;AN000
1850 MOV DX,OFFSET FILE_NAME ;AC000;;; WGR ;AN000
1851 INT 21H ;AC000;;; WGR ;AN000
1852 .IF C ;AC000;;; WGR error in opening...was it.. ;AN000
1853 .IF <AX EQ PATH_NOT_FOUND> OR ;AN000;;; WGR path or.. ;AN000
1854 .IF <AX EQ FILE_NOT_FOUND> ;AN000;;; WGR file not found?... ;AN000
1855 CALL COPY_ARGV0 ;AC000;;; WGR yes....try ARGV(0) directory. ;AN000
1856 MOV AX,3D00H ;AC000;;; WGR ;AN000
1857 MOV DX,OFFSET FILE_NAME ;AC000;;; WGR ;AN000
1858 INT 21H ;AC000;;; WGR ;AN000
1859 .IF C ;AC000;;; WGR error in opening....was it.. ;AN000
1860 .IF <AX EQ PATH_NOT_FOUND> OR ;AC000;;; WGR path or.. ;AN000
1861 .IF <AX EQ FILE_NOT_FOUND> ;AC000;;; WGR file not found? ;AN000
1862 MOV SI,OFFSET KEYBOARD_SYS ;AC000;;; WGR try ROOT directory. ;AN000
1863 MOV DI,OFFSET FILE_NAME ;AC000;;; WGR ;AN000
1864 MOV CX,KEYB_SYS_LENG ;AC000;;; WGR ;AN000
1865 REPE MOVSB ;AC000;;; WGR ;AN000
1866 MOV AX,3D00H ;AC000;;; WGR ;AN000
1867 MOV DX,OFFSET FILE_NAME ;AC000;;; WGR ;AN000
1868 INT 21H ;AC000;;; WGR ;AN000
1869 .ELSE ;AC000;;; WGR if failed then carry set.. ;AN000
1870 STC ;AC000;;; WGR some other error..set flag ;AN000
1871 .ENDIF ;AC000;;; WGR ;AN000
1872 .ENDIF ;AC000;;; WGR ;AN000
1873 .ELSE ;AN000;;; WGR ;AN000
1874 STC ;AN000;;; WGR some other error..set flag. ;AN000
1875 .ENDIF ;AN000;;; WGR ;AN000
1876 .ENDIF ;AN000;;; WGR ;AN000
1877 ;;
1878 RET ;AN000;;;
1879 ;;
1880BUILD_PATH ENDP ;;
1881 ;;
1882;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WGR
1883;; WGR
1884;; Module Name: WGR
1885;; COPY_ARGV0 WGR
1886;; WGR
1887;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WGR
1888 ;; WGR
1889 ;; WGR
1890COPY_ARGV0 PROC ;; WGR ;AN000
1891 ;; WGR ;AN000
1892 PUSH ES ;AN000;;; WGR ;AN000
1893 PUSH DI ;AN000;;; WGR ;AN000
1894 PUSH SI ;AN000;;; WGR ;AN000
1895 PUSH CX ;AN000;;; WGR ;AN000
1896 ;AN000;;; WGR ;AN000
1897 MOV DI,2CH ;AN000;;; WGR Locate environment string ;AN000
1898 MOV ES,[DI] ;AN000;;; WGR ;AN000
1899 XOR SI,SI ;AN000;;; WGR ;AN000
1900 .WHILE <<WORD PTR ES:[SI]> NE 0> ;AN000;;; WGR find ARGV(0) string. ;AN000
1901 INC SI ;AN000;;; WGR ;AN000
1902 .ENDWHILE ;AN000;;; WGR ;AN000
1903 ADD SI,4 ;AN000;;; WGR ;AN000
1904 LEA DI,FILE_NAME ;AN000;;; WGR move string to work area ;AN000
1905 .REPEAT ;AN000;;; WGR ;AN000
1906 MOV AL,ES:[SI] ;AN000;;; WGR ;AN000
1907 MOV [DI],AL ;AN000;;; WGR ;AN000
1908 INC SI ;AN000;;; WGR ;AN000
1909 INC DI ;AN000;;; WGR ;AN000
1910 .UNTIL <<BYTE PTR ES:[SI]> EQ 0> ;AN000;;; WGR ;AN000
1911 .REPEAT ;AN000;;; WGR ;AN000
1912 DEC DI ;AN000;;; WGR ;AN000
1913 .UNTIL <<BYTE PTR [DI]> EQ '\'> OR ;AN000;;; WGR ;AN000
1914 .UNTIL <<BYTE PTR [DI]> EQ 0> ;AN000;;; WGR scan back to.. ;AN000
1915 INC DI ;AN000;;; WGR first character after "\" ;AN000
1916 PUSH CS ;AN000;;; WGR ;AN000
1917 POP ES ;AN000;;; WGR ;AN000
1918 LEA SI,KEYB_SYS_ACTIVE ;AN000;;; WGR copy in "KEYBOARD.SYS" ;AN000
1919 MOV CX,KEYB_SYS_A_LENG ;AN000;;; WGR ;AN000
1920 REPE MOVSB ;AN000;;; WGR ;AN000
1921 ;AN000;;; WGR ;AN000
1922 POP CX ;AN000;;; WGR ;AN000
1923 POP SI ;AN000;;; WGR ;AN000
1924 POP DI ;AN000;;; WGR ;AN000
1925 POP ES ;AN000;;; WGR ;AN000
1926 RET ;AN000;;; WGR ;AN000
1927 ;AN000;;; WGR ;AN000
1928COPY_ARGV0 ENDP ;AN000;;;
1929 ;AN000;;;
1930;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1931;;
1932;; Module: FIND_FIRST_CP
1933;;
1934;; Description:
1935;; Check the keyboard definition file for the first code page
1936;;
1937;; Input Registers:
1938;; DS - points to our data segment
1939;; ES - points to our data segment
1940;; BP - offset of parmeter list
1941;;
1942;; Output Registers:
1943;; NONE
1944;;
1945;; Logic:
1946;; Open the file
1947;; IF error in opening file THEN
1948;; Display ERROR message and EXIT
1949;; ELSE
1950;; Save handle
1951;; Set address of buffer
1952;; READ header of Keyboard definition file
1953;; IF error in reading file THEN
1954;; Display ERROR message and EXIT
1955;; ELSE
1956;; Check signature for correct file
1957;; IF file signature is correct THEN
1958;; READ language table
1959;; IF error in reading file THEN
1960;; Display ERROR message and EXIT
1961;; ELSE
1962;; Use table to verify language parm
1963;; Set pointer values
1964;; IF code page was specified
1965;; READ language entry
1966;; IF error in reading file THEN
1967;; Display ERROR message and EXIT
1968;; ELSE
1969;; READ first code page
1970;; IF error in reading file THEN
1971;; Display ERROR message and EXIT
1972;; RET
1973;;
1974;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1975 ;;
1976;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1977;; Program Code
1978;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1979 ;;
1980FIND_FIRST_CP PROC NEAR ;;
1981 ;;
1982 PUSH CX ;; Save everything that
1983 PUSH DX ;; that will be changed
1984 PUSH SI ;;
1985 PUSH DI ;;
1986 ;;
1987 MOV BX,KEYBSYS_FILE_HANDLE ;; Get handle
1988 MOV DX,WORD PTR KEYBCMD_LANG_ENTRY_PTR ;; LSEEK file pointer
1989 MOV CX,WORD PTR KEYBCMD_LANG_ENTRY_PTR+2 ;; to top of language entry
1990 MOV AH,42H ;;
1991 MOV AL,0 ;;;;;;;;;;;;;; If no problem with
1992 INT 21H ;; Keyb Def file Then
1993 JNC FIND_FIRST_BEGIN ;;
1994 JMP FIND_FIRST_CP_ERROR4 ;;
1995 ;;;;;;;;;
1996FIND_FIRST_BEGIN: ;;
1997 MOV DI,AX ;;
1998 MOV CX,SIZE KEYBSYS_LANG_ENTRY-1 ;; Set number
1999 ;; bytes to read header
2000 MOV DX,OFFSET FILE_BUFFER ;;;;;;;;;
2001 MOV AH,3FH ;; Read language entry in
2002 INT 21H ;; keyboard definition file
2003 JNC FIND_FIRST_VALID4 ;; If no error in opening file then
2004 JMP FIND_FIRST_CP_ERROR4 ;;
2005 ;;
2006FIND_FIRST_VALID4: ;;
2007;************************** CNS *******;;
2008 xor ah,ah ;AC000;;;
2009 MOV Al,FB.KL_NUM_CP ;AC000;;;
2010;************************** CNS *******;;
2011 MUL CP_PTR_SIZE ;; Determine # of bytes to read
2012 MOV DX,OFFSET FILE_BUFFER ;; Establish beginning of buffer
2013 MOV CX,AX ;;
2014 CMP CX,FILE_BUFFER_SIZE ;; Make sure buffer is not to small
2015 JBE FIND_FIRST_VALID5 ;;
2016 JMP FIND_FIRST_CP_ERROR4 ;;
2017 ;;
2018FIND_FIRST_VALID5: ;;
2019 MOV AH,3FH ;; Read code page table from
2020 INT 21H ;; keyboard definition file
2021 JNC FIND_FIRST_VALID6 ;; If no error in opening file then
2022 JMP FIND_FIRST_CP_ERROR4 ;;
2023 ;;
2024FIND_FIRST_VALID6: ;;
2025 MOV CX,NUM_CP ;; Number of valid codes
2026 MOV DI,OFFSET FILE_BUFFER ;; Point to correct word in table
2027 ;;
2028 MOV BX,[DI].KC_CODE_PAGE ;; Get parameter
2029 XOR AX,AX ;;
2030 JMP FIND_FIRST_RETURN ;;
2031 ;;
2032FIND_FIRST_CP_ERROR4: ;;
2033 MOV AX,4 ;;
2034 ;;
2035FIND_FIRST_RETURN: ;;
2036 POP DI ;;
2037 POP SI ;;
2038 POP DX ;;
2039 POP CX ;;
2040 ;;
2041 RET ;;
2042 ;;
2043FIND_FIRST_CP ENDP ;;
2044 ;;;;;;;;;;;;;
2045.xlist ;;
2046MSG_SERVICES <MSGDATA> ;AN000;;; WGR ;AN000
2047MSG_SERVICES <LOADmsg,DISPLAYmsg,CHARmsg,NUMmsg> ;AN000;;; WGR ;AN000
2048MSG_SERVICES <KEYB.CL1> ;AN000;;; WGR ;AN000
2049MSG_SERVICES <KEYB.CL2> ;AN000;;; WGR ;AN000
2050MSG_SERVICES <KEYB.CLA> ;AN000;;; WGR ;AN000
2051.list ;;
2052;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2053;; Temp Shared Data Area
2054;; Contains data which is required by
2055;; both the resident and transient KEYB code.
2056;; All keyboard tables are stored in this area
2057;; Structures for this area are in file KEYBSHAR.INC
2058;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2059 ;;
2060 ;;
2061 db 'TEMP SHARED DATA' ;;
2062SD_SOURCE_PTR LABEL BYTE ;;
2063TEMP_SHARED_DATA SHARED_DATA_STR <> ;;
2064 ;;
2065;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2066
2067CODE ENDS
2068
2069include msgdcl.inc
2070
2071 END
2072 \ No newline at end of file