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

wirehaze git hosting

MZ is back!
[MS-DOS.git] / v4.0 / src / CMD / KEYB / PARSER.ASM
1 PAGE ,132
2 TITLE 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
48 INCLUDE KEYBDCL.INC ;AN000
49
50 ID_VALID EQU 0 ;AN000; ;AN000
51 ID_INVALID EQU 1 ;AN000; ;AN000
52 NO_ID EQU 2 ;AN000; ;AN000
53
54 LANGUAGE_VALID EQU 0 ;AN000; ;AN000
55 LANGUAGE_INVALID EQU 1 ;AN000; ;AN000
56 NO_LANGUAGE EQU 2 ;AN000; ;AN000
57
58 NO_IDLANG EQU 3 ;AN000; ;AN000
59
60 CODE_PAGE_VALID EQU 0 ;AN000; ;AN000
61 CODE_PAGE_INVALID EQU 1 ;AN000; ;AN000
62 NO_CODE_PAGE EQU 2 ;AN000; ;AN000
63 VALID_SYNTAX EQU 0 ;AN000; ;AN000
64 INVALID_SYNTAX EQU 1 ;AN000; ;AN000
65
66 COMMAND_LINE_START EQU 81H ;AN000; ;AN000
67 RC_EOL EQU -1 ;AN000; ;AN000
68 RC_NO_ERROR EQU 0 ;AN000; ;AN000
69 RC_OP_MISSING EQU 2 ;AN000; ;AN000
70 RC_NOT_IN_SW EQU 3 ;AN000; ;AN000
71 ;***CNS P4867 1st CHECK for /ID:ALPHA
72 RC_SW_FIRST EQU 9 ;AN004; ;AN000
73 ;***CNS P4867 1st CHECK for /ID:ALPHA
74 ERROR_COND EQU -1 ;AN000; ;AN000
75 NUMBER EQU 1 ;AN000; ;AN000
76 STRING EQU 3 ;AN000; ;AN000
77 FILE_SPEC EQU 5 ;AN000; ;AN000
78 MAX_ID EQU 999 ;AN000; ;AN000
79 LANG_LENGTH EQU 2 ;AN000; ;AN000
80
81 INVALID_SWITCH EQU 3
82 TOO_MANY EQU 1
83 INVALID_PARAM EQU 10
84 VALUE_DISALLOW EQU 8
85
86 .XLIST
87 INCLUDE STRUC.INC ; Structured macros ;AN000
88 .LIST
89
90 PUBLIC PARSE_PARAMETERS ;AN003;; near procedure for parsing command line ;AN000
91 PUBLIC CUR_PTR ;AN003;; near procedure for parsing command line ;AN000
92 PUBLIC OLD_PTR ;AN003;; near procedure for parsing command line ;AN000
93 PUBLIC ERR_PART;AN003;; near procedure for parsing command line ;AN000
94 EXTRN BAD_ID:BYTE ;; WGR to match old code ;AN000; ;AN000
95 EXTRN FOURTH_PARM:BYTE ;; WGR to match old code ;AN000; ;AN000
96 EXTRN ONE_PARMID:BYTE ;; WGR to match old code ;AN000; ;AN000
97 EXTRN FTH_PARMID:BYTE ;; WGR to match old code ;AN000; ;AN000
98 EXTRN 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
106 DateSW EQU 0 ;AN000; ;AN000
107 TimeSW EQU 0 ;AN000; ;AN000
108 CmpxSW EQU 0 ;AN000; ;AN000
109 DrvSW EQU 0 ;AN000; ;AN000
110 QusSW EQU 0 ;AN000; ;AN000
111 KeySW EQU 0 ;AN000; ;AN000
112 Val1SW EQU 0 ;AN000; ;AN000
113 Val2SW EQU 0 ;AN000; ;AN000
114 Val3SW EQU 0 ;AN000; ;AN000
115
116
117 CODE SEGMENT PUBLIC 'CODE' BYTE ;AN000; ;AN000
118 ASSUME CS:CODE,DS:CODE ;AN000; ;AN000
119
120 .XLIST
121 INCLUDE 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
133 PARMS LABEL WORD ;AN000; ;AN000
134 DW PARMSX ;AN000; ;AN000
135 DB 0 ;AN000;; no extra delimeters or EOLs. ;AN000
136
137 PARMSX 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
146 LANG 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
153 CP 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
160 FILE_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
167 ID_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
175 NOVALS LABEL BYTE ;AN000; ;AN000
176 DB 0 ;AN000;; no value checking done ;AN000
177
178 RESULT_BUF LABEL BYTE ;AN000; ;AN000
179 RESULT_TYPE DB 0 ;AN000;; type returned (number, string, etc.) ;AN000
180 DB ? ;AN000;; matched item tag (if applicable) ;AN000
181 RESULT_SYN_PTR DW ? ;AN000;; synonym ptr (if applicable) ;AN000
182 RESULT_VAL DD ? ;AN000;; value ;AN000
183
184 LOOP_COUNT DB 0 ;AN000;; keeps track of parameter position ;AN000
185 ;***CNS
186 CUR_PTR DW 0 ;AN003;; keeps track of parameter position ;AN000
187 OLD_PTR DW 0 ;AN003;; keeps track of parameter position ;AN000
188 ERR_PART DW 0 ;AN003;; keeps track of parameter position ;AN000
189 ;***CNS
190 ;AN000;; ..and reports an error condition ;AN000
191 TEMP_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
210 PARSE_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
340 PARSE_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
360 PROCESS_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
420 PROCESS_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
440 PROCESS_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
465 PROCESS_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
485 PROCESS_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
514 PROCESS_3RD_PARM ENDP ;AN000; ;AN000
515 ;AN000;
516 CODE ENDS ;AN000;
517 END ;AN000;