summaryrefslogtreecommitdiff
path: root/v4.0/src/CMD/KEYB/PARSER.ASM
diff options
context:
space:
mode:
Diffstat (limited to 'v4.0/src/CMD/KEYB/PARSER.ASM')
-rw-r--r--v4.0/src/CMD/KEYB/PARSER.ASM517
1 files changed, 517 insertions, 0 deletions
diff --git a/v4.0/src/CMD/KEYB/PARSER.ASM b/v4.0/src/CMD/KEYB/PARSER.ASM
new file mode 100644
index 0000000..808f37a
--- /dev/null
+++ b/v4.0/src/CMD/KEYB/PARSER.ASM
@@ -0,0 +1,517 @@
1PAGE ,132
2TITLE PARSE CODE AND CONTROL BLOCKS FOR KEYB.COM
3
4;****************** START OF SPECIFICATIONS **************************
5;
6; MODULE NAME: PARSER.ASM
7;
8; DESCRIPTIVE NAME: PARSES THE COMMAND LINE PARAMETERS FOR KEYB.COM
9;
10; FUNCTION: THE COMMAND LINE IN THE PSP IS PARSED FOR PARAMETERS.
11;
12; ENTRY POINT: PARSE_PARAMETERS
13;
14; INPUT: BP POINTS TO PARAMETER LIST
15; DS & ES POINT TO PSP
16;
17; AT EXIT:
18; PARAMETER LIST FILLED IN AS REQUIRED.
19;
20; INTERNAL REFERENCES:
21;
22; ROUTINES: SYSPARSE - PARSING CODE
23;
24; DATA AREAS: PARMS - PARSE CONTROL BLOCK FOR SYSPARSE
25;
26; EXTERNAL REFERENCES:
27;
28; ROUTINES: N/A
29;
30; DATA AREAS: PARAMETER LIST BLOCK TO BE FILLED.
31;
32; NOTES:
33;
34; REVISION HISTORY:
35; A000 - DOS Version 4.00
36; 3/24/88 AN003 - P3906 PARSER changes to return "bogus" parameter on the
37; "Parameter value not allowed " message - CNS
38; 5/12/88 AN004 - P4867 /ID:NON-Numeric hangs the sytem as a 1st positional
39;
40; COPYRIGHT: "The KEYB.COM Keyboard Driver"
41; "Version 4.00 (C) Copyright 1988 Microsoft"
42; "Licensed Material - Program Property of Microsoft"
43;
44; PROGRAM AUTHOR: WGR
45;
46;****************** END OF SPECIFICATIONS ****************************
47
48INCLUDE KEYBDCL.INC ;AN000
49
50ID_VALID EQU 0 ;AN000; ;AN000
51ID_INVALID EQU 1 ;AN000; ;AN000
52NO_ID EQU 2 ;AN000; ;AN000
53
54LANGUAGE_VALID EQU 0 ;AN000; ;AN000
55LANGUAGE_INVALID EQU 1 ;AN000; ;AN000
56NO_LANGUAGE EQU 2 ;AN000; ;AN000
57
58NO_IDLANG EQU 3 ;AN000; ;AN000
59
60CODE_PAGE_VALID EQU 0 ;AN000; ;AN000
61CODE_PAGE_INVALID EQU 1 ;AN000; ;AN000
62NO_CODE_PAGE EQU 2 ;AN000; ;AN000
63VALID_SYNTAX EQU 0 ;AN000; ;AN000
64INVALID_SYNTAX EQU 1 ;AN000; ;AN000
65
66COMMAND_LINE_START EQU 81H ;AN000; ;AN000
67RC_EOL EQU -1 ;AN000; ;AN000
68RC_NO_ERROR EQU 0 ;AN000; ;AN000
69RC_OP_MISSING EQU 2 ;AN000; ;AN000
70RC_NOT_IN_SW EQU 3 ;AN000; ;AN000
71;***CNS P4867 1st CHECK for /ID:ALPHA
72RC_SW_FIRST EQU 9 ;AN004; ;AN000
73;***CNS P4867 1st CHECK for /ID:ALPHA
74ERROR_COND EQU -1 ;AN000; ;AN000
75NUMBER EQU 1 ;AN000; ;AN000
76STRING EQU 3 ;AN000; ;AN000
77FILE_SPEC EQU 5 ;AN000; ;AN000
78MAX_ID EQU 999 ;AN000; ;AN000
79LANG_LENGTH EQU 2 ;AN000; ;AN000
80
81INVALID_SWITCH EQU 3
82TOO_MANY EQU 1
83INVALID_PARAM EQU 10
84VALUE_DISALLOW EQU 8
85
86.XLIST
87INCLUDE STRUC.INC ; Structured macros ;AN000
88.LIST
89
90PUBLIC PARSE_PARAMETERS ;AN003;; near procedure for parsing command line ;AN000
91PUBLIC CUR_PTR ;AN003;; near procedure for parsing command line ;AN000
92PUBLIC OLD_PTR ;AN003;; near procedure for parsing command line ;AN000
93PUBLIC ERR_PART;AN003;; near procedure for parsing command line ;AN000
94EXTRN BAD_ID:BYTE ;; WGR to match old code ;AN000; ;AN000
95EXTRN FOURTH_PARM:BYTE ;; WGR to match old code ;AN000; ;AN000
96EXTRN ONE_PARMID:BYTE ;; WGR to match old code ;AN000; ;AN000
97EXTRN FTH_PARMID:BYTE ;; WGR to match old code ;AN000; ;AN000
98EXTRN ALPHA:BYTE ;; WGR to match old code ;AN000; ;AN000
99
100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
101;
102; Set assemble switches for parse code that is not required!!
103;
104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
105
106DateSW EQU 0 ;AN000; ;AN000
107TimeSW EQU 0 ;AN000; ;AN000
108CmpxSW EQU 0 ;AN000; ;AN000
109DrvSW EQU 0 ;AN000; ;AN000
110QusSW EQU 0 ;AN000; ;AN000
111KeySW EQU 0 ;AN000; ;AN000
112Val1SW EQU 0 ;AN000; ;AN000
113Val2SW EQU 0 ;AN000; ;AN000
114Val3SW EQU 0 ;AN000; ;AN000
115
116
117CODE SEGMENT PUBLIC 'CODE' BYTE ;AN000; ;AN000
118 ASSUME CS:CODE,DS:CODE ;AN000; ;AN000
119
120.XLIST
121INCLUDE PARSE.ASM ; Parsing code ;AN000
122.LIST
123
124
125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
126; PARM control blocks for KEYB
127; Parsing command line as follows:
128;
129; KEYB [lang],[cp],[[d:][path]KEYBOARD.SYS][/ID:id]
130;
131;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
132
133PARMS LABEL WORD ;AN000; ;AN000
134 DW PARMSX ;AN000; ;AN000
135 DB 0 ;AN000;; no extra delimeters or EOLs. ;AN000
136
137PARMSX LABEL BYTE ;AN000; ;AN000
138 DB 0,3 ;AN000;; min,max positional operands ;AN000
139 DW LANG ;AN000;; pointer to control block ;AN000
140 DW CP ;AN000;; pointer to control block ;AN000
141 DW FILE_NAME ;AN000;; pointer to control block ;AN000
142 DB 1 ;AN000;; 1 switch ;AN000
143 DW ID_VALUE ;AN000;; pointer to control block ;AN000
144 DB 0 ;AN000;; no keywords ;AN000
145
146LANG LABEL WORD ;AN000; ;AN000
147 DW 0A001H ;AN000;; sstring or numeric value (optional) ;AN000
148 DW 0002H ;AN000;; cap result by char table (sstring) ;AN000
149 DW RESULT_BUF ;AN000;; result ;AN000
150 DW NOVALS ;AN000;; no value checking done ;AN000
151 DB 0 ;AN000;; no keyword/switch synonyms ;AN000
152
153CP LABEL WORD ;AN000; ;AN000
154 DW 8001H ;AN000;; numeric ;AN000
155 DW 0 ;AN000;; no functions ;AN000
156 DW RESULT_BUF ;AN000;; result ;AN000
157 DW NOVALS ;AN000;; no value checking done ;AN000
158 DB 0 ;AN000;; no keyword/switch synonyms ;AN000
159
160FILE_NAME LABEL WORD ;AN000; ;AN000
161 DW 0201H ;AN000;; file spec ;AN000
162 DW 0001H ;AN000;; cap by file table ;AN000
163 DW RESULT_BUF ;AN000;; result ;AN000
164 DW NOVALS ;AN000;; no value checking done ;AN000
165 DB 0 ;AN000;; no keyword/switch synonyms ;AN000
166
167ID_VALUE LABEL WORD ;AN000; ;AN000
168 DW 8010H ;AN000;; numeric ;AN000
169 DW 0 ;AN000;; no functions ;AN000
170 DW RESULT_BUF ;AN000;; result ;AN000
171 DW NOVALS ;AN000;; no value checking done ;AN000
172 DB 1 ;AN000;; 1 switch synonym ;AN000
173 DB "/ID",0 ;AN000;; ID switch ;AN000
174
175NOVALS LABEL BYTE ;AN000; ;AN000
176 DB 0 ;AN000;; no value checking done ;AN000
177
178RESULT_BUF LABEL BYTE ;AN000; ;AN000
179RESULT_TYPE DB 0 ;AN000;; type returned (number, string, etc.) ;AN000
180 DB ? ;AN000;; matched item tag (if applicable) ;AN000
181RESULT_SYN_PTR DW ? ;AN000;; synonym ptr (if applicable) ;AN000
182RESULT_VAL DD ? ;AN000;; value ;AN000
183
184LOOP_COUNT DB 0 ;AN000;; keeps track of parameter position ;AN000
185;***CNS
186CUR_PTR DW 0 ;AN003;; keeps track of parameter position ;AN000
187OLD_PTR DW 0 ;AN003;; keeps track of parameter position ;AN000
188ERR_PART DW 0 ;AN003;; keeps track of parameter position ;AN000
189;***CNS
190 ;AN000;; ..and reports an error condition ;AN000
191TEMP_FILE_NAME DB 128 DUP(0) ;AN000;; place for file name ;AN000
192
193;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
194;
195; PROCEDURE_NAME: PARSE_PARAMETERS
196;
197; FUNCTION:
198; THIS PROCEDURE PARSES THE COMMAND LINE PARAMETERS IN THE PSP FOR
199; KEYB.COM. THE PARAMETER LIST BLOCK IS FILLED IN ACCORDINGLY.
200;
201; AT ENTRY: AS ABOVE.
202;
203; AT EXIT:
204; AS ABOVE.
205;
206; AUTHOR: WGR
207;
208;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
209
210PARSE_PARAMETERS PROC NEAR ;AN000
211 XOR AX,AX ;AN000;; setup default parameters. ;AN000
212 MOV [BP].RET_CODE_1,NO_IDLANG ;AN000;; ;AN000
213 MOV [BP].RET_CODE_2,NO_CODE_PAGE ;AN000;; ;AN000
214 MOV [BP].RET_CODE_3,VALID_SYNTAX ;AN000;; ;AN000
215 MOV [BP].RET_CODE_4,NO_ID ;AN000;; ;AN000
216 MOV [BP].PATH_LENGTH,AX ;AN000;; ;AN000
217 LEA DI,PARMS ;AN000;; setup parse blocks ;AN000
218 MOV SI,COMMAND_LINE_START ;AN000;; ;AN000
219;***CNS
220
221 PUSH AX ;AN003;Save environment
222 MOV AX,CUR_PTR ;AN003;Set advancing ptr to end of argument
223 MOV OLD_PTR,AX ;AN003;after saving the beginning the string
224 MOV CUR_PTR,SI ;AN003;
225 POP AX ;AN003;Restore the environment
226
227;***CNS
228 XOR CX,CX ;AN000;; ;AN000
229 XOR DX,DX ;AN000;; ;AN000
230 CALL SYSPARSE ;AN000;; ;AN000
231 .WHILE <AX NE RC_EOL> near AND ;AN000;; while not end of line and.. ;AN000
232 .WHILE <LOOP_COUNT NE ERROR_COND> near ;AN000;; parameters valid do. ;AN000
233 .IF <AX EQ RC_NOT_IN_SW> near OR ;AN000;; invalid switch? ;AN000
234 .IF <AX EQ RC_SW_FIRST> near ;AN000;; invalid switch? ;AN000
235 MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; set invalid syntax flag. ;AN000
236 MOV LOOP_COUNT,ERROR_COND ;AN000;; set error flag to exit parse. ;AN000
237;***CNS
238 MOV ERR_PART,INVALID_SWITCH
239 PUSH AX ;AN003;Save environment
240 MOV AX,CUR_PTR ;AN003;Set advancing ptr to end of argument
241 MOV OLD_PTR,AX ;AN003;after saving the beginning the string
242 MOV CUR_PTR,SI ;AN003;
243 POP AX ;AN003;Restore the environment
244
245;***CNS
246 .ELSE ;AN000;; ;AN000
247 .IF <RESULT_SYN_PTR NE 0> ;AN000;; was the switch found? ;AN000
248 MOV AX,WORD PTR RESULT_VAL+2 ;AN000;; is it valid? ;AN000
249 OR AX,AX ;AN000;; ;AN000
250 .IF NZ OR ;AN000;; ;AN000
251 MOV AX,WORD PTR RESULT_VAL ;AN000;; ;AN000
252 .IF <AX A MAX_ID> ;AN000;; ;AN000
253 MOV [BP].RET_CODE_1,ID_INVALID ;AN000;; no...invalid id. ;AN000
254 MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; syntax error. ;AN000
255 MOV LOOP_COUNT,ERROR_COND ;AN000;; set flag to exit parse ;AN000
256 mov bad_id,1 ;AN000;; ;AN000
257;***CNS
258
259 PUSH AX ;AN003;Save environment
260 MOV AX,CUR_PTR ;AN003;Set advancing ptr to end of argument
261 MOV OLD_PTR,AX ;AN003;after saving the beginning the string
262 MOV CUR_PTR,SI ;AN003;
263 POP AX ;AN003;Restore the environment
264
265;***CNS
266 .ELSE ;AN000;; ;AN000
267 MOV [BP].RET_CODE_4,ID_VALID ;AN000;; yes...set return code 4. ;AN000
268 MOV [BP].ID_PARM,AX ;AN000;; ;AN000
269 mov fourth_parm,1 ;AN000;; ;AN000
270 mov fth_parmid,1 ;AN000;; ;AN000
271 .ENDIF ;AN000;; ;AN000
272 .ELSE ;AN000;; ;AN000
273 INC LOOP_COUNT ;AN000;; positional encountered... ;AN000
274 .SELECT ;AN000;; ;AN000
275 .WHEN <LOOP_COUNT EQ 1> ;AN000;; check for language ;AN000
276 CALL PROCESS_1ST_PARM ;AN000;; ;AN000
277
278;***CNS
279
280 PUSH AX ;AN003;Save environment
281 MOV AX,CUR_PTR ;AN003;Set advancing ptr to end of argument
282 MOV OLD_PTR,AX ;AN003;after saving the beginning the string
283 MOV CUR_PTR,SI ;AN003;
284 POP AX ;AN003;Restore the environment
285;***CNS
286
287
288 .WHEN <LOOP_COUNT EQ 2> ;AN000;; check for code page ;AN000
289 CALL PROCESS_2ND_PARM ;AN000;; ;AN000
290;***CNS
291
292 PUSH AX ;AN003;Save environment
293 MOV AX,CUR_PTR ;AN003;Set advancing ptr to end of argument
294 MOV OLD_PTR,AX ;AN003;after saving the beginning the string
295 MOV CUR_PTR,SI ;AN003;
296 POP AX ;AN003;Restore the environment
297;***CNS
298 .WHEN <LOOP_COUNT EQ 3> ;AN000;; check for file name ;AN000
299 CALL PROCESS_3RD_PARM ;AN000;; ;AN000
300;***CNS
301
302 PUSH AX ;AN003;Save environment
303 MOV AX,CUR_PTR ;AN003;Set advancing ptr to end of argument
304 MOV OLD_PTR,AX ;AN003;after saving the beginning the string
305 MOV CUR_PTR,SI ;AN003;
306 POP AX ;AN003;Restore the environment
307;***CNS
308 .OTHERWISE ;AN000;; ;AN000
309 MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; too many parms ;AN000
310;***CNS
311
312 PUSH AX ;AN003;Save environment
313 MOV AX,CUR_PTR ;AN003;Set advancing ptr to end of argument
314 MOV OLD_PTR,AX ;AN003;after saving the beginning the string
315 MOV CUR_PTR,SI ;AN003;
316 POP AX ;AN003;Restore the environment
317;***CNS
318 MOV ERR_PART,TOO_MANY
319 MOV LOOP_COUNT,ERROR_COND ;AN000;; set error flag to exit parse. ;AN000
320 .ENDSELECT ;AN000;; ;AN000
321 .ENDIF ;AN000;; ;AN000
322 MOV RESULT_TYPE,0 ;AN000;; reset result block. ;AN000
323 CALL SYSPARSE ;AN000;; parse next parameter. ;AN000
324 .ENDIF ;AN000;; ;AN000
325 .ENDWHILE ;AN000;; ;AN000
326 .IF <[BP].RET_CODE_4 EQ ID_VALID> AND ;AN000;; ensure that if the switch ;AN000
327 .IF <[BP].RET_CODE_1 NE LANGUAGE_VALID> ;AN000;; was used..that a valid keyboard ;AN000
328 MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; code was used.. ;AN000
329;***CNS
330
331 PUSH AX ;AN003;Save environment
332 MOV AX,CUR_PTR ;AN003;Set advancing ptr to end of argument
333 MOV OLD_PTR,AX ;AN003;after saving the beginning the string
334 MOV CUR_PTR,SI ;AN003;
335 POP AX ;AN003;Restore the environment
336 MOV ERR_PART,VALUE_DISALLOW
337;***CNS
338 .ENDIF ;AN000;; ;AN000
339 RET ;AN000;; ;AN000
340PARSE_PARAMETERS ENDP ;AN000; ;AN000
341
342
343;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
344;
345; PROCEDURE_NAME: PROCESS_1ST_PARM
346;
347; FUNCTION:
348; THIS PROCEDURE PROCESSES THE FIRST POSITIONAL PARAMETER. THIS SHOULD
349; BE THE LANGUAGE ID OR THE KEYBOARD ID.
350;
351; AT ENTRY: PARSE RESULT BLOCK CONTAINS VALUES IF AX HAS NO ERROR.
352;
353; AT EXIT:
354; PARAMETER CONTROL BLOCK UPDATED FOR LANGUAGE ID.
355;
356; AUTHOR: WGR
357;
358;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
359
360PROCESS_1ST_PARM PROC NEAR ;AN000
361 .IF <AX GT RC_NO_ERROR> ;AN000;; error on parse? ;AN000
362 MOV [BP].RET_CODE_1,LANGUAGE_INVALID ;AN000;; yes...set invalid language ;AN000
363 MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; and syntax error.. ;AN000
364 MOV LOOP_COUNT,ERROR_COND ;AN000;; set flag to exit parse. ;AN000
365 MOV ERR_PART,AX ;AN003;;
366 .ELSE near ;AN000;; ;AN000
367
368 .IF <RESULT_TYPE EQ NUMBER> ;AN000;; was this a number (id)? ;AN000
369 MOV AX,WORD PTR RESULT_VAL+2 ;AN000;; yes...check to see if ;AN000
370 OR AX,AX ;AN000;; within range. ;AN000
371 .IF NZ OR ;AN000;; ;AN000
372 MOV AX,WORD PTR RESULT_VAL ;AN000;; ;AN000
373 .IF <AX A MAX_ID> ;AN000;; ;AN000
374 MOV [BP].RET_CODE_1,ID_INVALID ;AN000;; no...invalid id. ;AN000
375 MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; syntax error. ;AN000
376 MOV LOOP_COUNT,ERROR_COND ;AN000;; set flag to exit parse ;AN000
377 mov bad_id,1 ;AN000;; ;AN000
378 .ELSE ;AN000;; ;AN000
379 MOV [BP].RET_CODE_1,ID_VALID ;AN000;; valid id...set ;AN000
380 MOV [BP].RET_CODE_4,ID_VALID ;AN000;; valid id...set ;AN000
381 MOV [BP].ID_PARM,AX ;AN000;; and value moved into block ;AN000
382 MOV LOOP_COUNT,4 ;AN000;; there should be no more parms ;AN000
383 mov one_parmid,1 ;AN000;; ;AN000
384 .ENDIF ;AN000;; ;AN000
385 .ELSEIF <RESULT_TYPE EQ STRING> ;AN000;; must be a string then.. ;AN000
386 PUSH SI ;AN000;; ;AN000
387 PUSH DI ;AN000;; ;AN000
388 PUSH CX ;AN000;; ;AN000
389 PUSH DS ;AN000;; ;AN000
390 LDS SI,RESULT_VAL ;AN000;; get ptr to string ;AN000
391 MOV DI,BP ;AN000;; ;AN000
392 ADD DI,LANGUAGE_PARM ;AN000;; point to block for copy. ;AN000
393 MOV CX,LANG_LENGTH ;AN000;; maximum length = 2 ;AN000
394 LODSB ;AN000;; load AL with 1st char.. ;AN000
395 .WHILE <CX NE 0> AND ;AN000;; do twice....unless ;AN000
396 .WHILE <AL NE 0> ;AN000;; there is only 1 character. ;AN000
397 STOSB ;AN000;; store ;AN000
398 DEC CX ;AN000;; dec count ;AN000
399 LODSB ;AN000;; load ;AN000
400 .ENDWHILE ;AN000;; ;AN000
401 .IF <CX NE 0> OR ;AN000;; if there was less than 2 or.. ;AN000
402 .IF <AL NE 0> ;AN000;; greater than 2 characters then.. ;AN000
403 MOV [BP].RET_CODE_1,LANGUAGE_INVALID ;AN000;; invalid. ;AN000
404 MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; syntax error ;AN000
405 MOV ERR_PART,INVALID_PARAM
406 MOV LOOP_COUNT,ERROR_COND ;AN000;; set flag to exit parse. ;AN000
407 .ELSE ;AN000;; ;AN000
408 MOV [BP].RET_CODE_1,LANGUAGE_VALID ;AN000;; valid language has been copied ;AN000
409 MOV ALPHA,1 ;AN000;; language found ;AN000
410 .ENDIF ;AN000;; ;AN000
411 POP DS ;AN000;; ;AN000
412 POP CX ;AN000;; ;AN000
413 POP DI ;AN000;; ;AN000
414 POP SI ;AN000;; ;AN000
415 .ELSE ;AN000;; ommited parameter... ;AN000
416 MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; invalid since further parameters.;AN000
417 .ENDIF ;AN000;; ;AN000
418 .ENDIF ;AN000;; ;AN000
419 RET ;AN000;; ;AN000
420PROCESS_1ST_PARM ENDP ;AN000; ;AN000
421
422
423;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
424;
425; PROCEDURE_NAME: PROCESS_2ND_PARM
426;
427; FUNCTION:
428; THIS PROCEDURE PROCESSES THE 2ND POSITIONAL PARAMETER. THIS SHOULD
429; BE THE CODE PAGE, IF REQUESTED.
430;
431; AT ENTRY: PARSE RESULT BLOCK CONTAINS VALUES IF AX HAS NO ERROR.
432;
433; AT EXIT:
434; PARAMETER CONTROL BLOCK UPDATED FOR CODE PAGE.
435;
436; AUTHOR: WGR
437;
438;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
439
440PROCESS_2ND_PARM PROC NEAR ;AN000
441 .IF <AX GT RC_NO_ERROR> ;AN000;; if parse error.. ;AN000
442 MOV [BP].RET_CODE_2,CODE_PAGE_INVALID ;AN000;; mark invalid.. ;AN000
443 MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; syntax error ;AN000
444 MOV LOOP_COUNT,ERROR_COND ;AN000;; set flag to exit parse ;AN000
445 MOV ERR_PART,AX ;AN003;;
446 .ELSE ;AN000;; ;AN000
447 .IF <RESULT_TYPE EQ NUMBER> ;AN000;; was parameter specified? ;AN000
448 MOV AX,WORD PTR RESULT_VAL+2 ;AN000;; yes..if code page not.. ;AN000
449 OR AX,AX ;AN000;; ;AN000
450 .IF NZ OR ;AN000;; ;AN000
451 MOV AX,WORD PTR RESULT_VAL ;AN000;; valid..then ;AN000
452 .IF <AX A MAX_ID> ;AN000;; ;AN000
453 MOV [BP].RET_CODE_2,CODE_PAGE_INVALID ;AN000;; mark invalid.. ;AN000
454 MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; syntax error ;AN000
455 MOV LOOP_COUNT,ERROR_COND ;AN000;; set flag to exit parse ;AN000
456 .ELSE ;AN000;; ;AN000
457 MOV [BP].RET_CODE_2,CODE_PAGE_VALID;AN000;; else...valid code page ;AN000
458 MOV [BP].CODE_PAGE_PARM,AX ;AN000;; move into parm ;AN000
459 .ENDIF ;AN000;; ;AN000
460 .ELSE ;AN000;; ;AN000
461 MOV [BP].RET_CODE_2,NO_CODE_PAGE ;AN000;; mark as not specified. ;AN000
462 .ENDIF ;AN000;; ;AN000
463 .ENDIF ;AN000;; ;AN000
464 RET ;AN000;; ;AN000
465PROCESS_2ND_PARM ENDP ;AN000; ;AN000
466
467
468;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
469;
470; PROCEDURE_NAME: PROCESS_3RD_PARM
471;
472; FUNCTION:
473; THIS PROCEDURE PROCESSES THE 3RD POSITIONAL PARAMETER. THIS SHOULD
474; BE THE KEYBOARD DEFINITION FILE PATH, IF SPECIFIED.
475;
476; AT ENTRY: PARSE RESULT BLOCK CONTAINS VALUES IF AX HAS NO ERROR.
477;
478; AT EXIT:
479; PARAMETER CONTROL BLOCK UPDATED FOR FILE NAME.
480;
481; AUTHOR: WGR
482;
483;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
484
485PROCESS_3RD_PARM PROC NEAR ;AN000; ;AN000
486 .IF <AX GT RC_NO_ERROR> ;AN000;; if parse error then.. ;AN000
487 MOV [BP].RET_CODE_3,INVALID_SYNTAX ;AN000;; syntax error. ;AN000
488 MOV LOOP_COUNT,ERROR_COND ;AN000;; set flag to exit parse ;AN000
489 MOV ERR_PART,AX ;AN003;;
490 .ELSE ;AN000;; ;AN000
491 .IF <RESULT_TYPE EQ FILE_SPEC> ;AN000;; ;AN000
492 PUSH DS ;AN000;; ;AN000
493 PUSH SI ;AN000;; ;AN000
494 PUSH DI ;AN000;; ;AN000
495 PUSH CX ;AN000;; ;AN000
496 LDS SI,RESULT_VAL ;AN000;; load offset of file name ;AN000
497 LEA DI,TEMP_FILE_NAME ;AN000;; ;AN000
498 MOV [BP].PATH_OFFSET,DI ;AN000;; copy to parameter block ;AN000
499 XOR CX,CX ;AN000;; ;AN000
500 LODSB ;AN000;; count the length of the path. ;AN000
501 .WHILE <AL NE 0> ;AN000;; ;AN000
502 STOSB ;AN000;; ;AN000
503 LODSB ;AN000;; ;AN000
504 INC CX ;AN000;; ;AN000
505 .ENDWHILE ;AN000;; ;AN000
506 MOV [BP].PATH_LENGTH,CX ;AN000;; copy to parameter block ;AN000
507 POP CX ;AN000;; ;AN000
508 POP DI ;AN000;; ;AN000
509 POP SI ;AN000;; ;AN000
510 POP DS ;AN000;; ;AN000
511 .ENDIF ;AN000;; ;AN000
512 .ENDIF ;AN000;; ;AN000
513 RET ;AN000;; ;AN000
514PROCESS_3RD_PARM ENDP ;AN000; ;AN000
515 ;AN000;
516CODE ENDS ;AN000;
517 END ;AN000;