2 TITLE PARSE
CODE AND CONTROL BLOCKS FOR KEYB
.COM
4 ;****************** START OF SPECIFICATIONS **************************
6 ; MODULE NAME: PARSER.ASM
8 ; DESCRIPTIVE NAME: PARSES THE COMMAND LINE PARAMETERS FOR KEYB.COM
10 ; FUNCTION: THE COMMAND LINE IN THE PSP IS PARSED FOR PARAMETERS.
12 ; ENTRY POINT: PARSE_PARAMETERS
14 ; INPUT: BP POINTS TO PARAMETER LIST
15 ; DS & ES POINT TO PSP
18 ; PARAMETER LIST FILLED IN AS REQUIRED.
20 ; INTERNAL REFERENCES:
22 ; ROUTINES: SYSPARSE - PARSING CODE
24 ; DATA AREAS: PARMS - PARSE CONTROL BLOCK FOR SYSPARSE
26 ; EXTERNAL REFERENCES:
30 ; DATA AREAS: PARAMETER LIST BLOCK TO BE FILLED.
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
40 ; COPYRIGHT: "The KEYB.COM Keyboard Driver"
41 ; "Version 4.00 (C) Copyright 1988 Microsoft"
42 ; "Licensed Material - Program Property of Microsoft"
46 ;****************** END OF SPECIFICATIONS ****************************
48 INCLUDE KEYBDCL
.INC ;AN000
50 ID_VALID EQU
0 ;AN000; ;AN000
51 ID_INVALID EQU
1 ;AN000; ;AN000
52 NO_ID EQU
2 ;AN000; ;AN000
54 LANGUAGE_VALID EQU
0 ;AN000; ;AN000
55 LANGUAGE_INVALID EQU
1 ;AN000; ;AN000
56 NO_LANGUAGE EQU
2 ;AN000; ;AN000
58 NO_IDLANG EQU
3 ;AN000; ;AN000
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
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
87 INCLUDE STRUC.INC ; Structured macros ;AN000
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
100 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
102 ; Set assemble switches for parse code that is not required!!
104 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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
117 CODE SEGMENT PUBLIC 'CODE' BYTE ;AN000; ;AN000
118 ASSUME
CS:CODE,DS:CODE ;AN000; ;AN000
121 INCLUDE PARSE
.ASM
; Parsing code ;AN000
125 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
126 ; PARM control blocks for KEYB
127 ; Parsing command line as follows:
129 ; KEYB [lang],[cp],[[d:][path]KEYBOARD.SYS][/ID:id]
131 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
133 PARMS
LABEL WORD ;AN000; ;AN000
134 DW PARMSX
;AN000; ;AN000
135 DB 0 ;AN000;; no extra delimeters or EOLs. ;AN000
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
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
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
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
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
175 NOVALS
LABEL BYTE ;AN000; ;AN000
176 DB 0 ;AN000;; no value checking done ;AN000
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
184 LOOP_COUNT
DB 0 ;AN000;; keeps track of parameter position ;AN000
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
190 ;AN000;; ..and reports an error condition ;AN000
191 TEMP_FILE_NAME
DB 128 DUP(0) ;AN000;; place for file name ;AN000
193 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
195 ; PROCEDURE_NAME: PARSE_PARAMETERS
198 ; THIS PROCEDURE PARSES THE COMMAND LINE PARAMETERS IN THE PSP FOR
199 ; KEYB.COM. THE PARAMETER LIST BLOCK IS FILLED IN ACCORDINGLY.
201 ; AT ENTRY: AS ABOVE.
208 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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
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
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
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
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
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
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
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
288 .WHEN
<LOOP_COUNT
EQ 2> ;AN000;; check for code page ;AN000
289 CALL PROCESS_2ND_PARM
;AN000;; ;AN000
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
298 .WHEN
<LOOP_COUNT
EQ 3> ;AN000;; check for file name ;AN000
299 CALL PROCESS_3RD_PARM
;AN000;; ;AN000
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
308 .OTHERWISE
;AN000;; ;AN000
309 MOV [BP].RET_CODE_3
,INVALID_SYNTAX
;AN000;; too many parms ;AN000
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
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
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
338 .ENDIF
;AN000;; ;AN000
340 PARSE_PARAMETERS ENDP
;AN000; ;AN000
343 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
345 ; PROCEDURE_NAME: PROCESS_1ST_PARM
348 ; THIS PROCEDURE PROCESSES THE FIRST POSITIONAL PARAMETER. THIS SHOULD
349 ; BE THE LANGUAGE ID OR THE KEYBOARD ID.
351 ; AT ENTRY: PARSE RESULT BLOCK CONTAINS VALUES IF AX HAS NO ERROR.
354 ; PARAMETER CONTROL BLOCK UPDATED FOR LANGUAGE ID.
358 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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
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
420 PROCESS_1ST_PARM ENDP
;AN000; ;AN000
423 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
425 ; PROCEDURE_NAME: PROCESS_2ND_PARM
428 ; THIS PROCEDURE PROCESSES THE 2ND POSITIONAL PARAMETER. THIS SHOULD
429 ; BE THE CODE PAGE, IF REQUESTED.
431 ; AT ENTRY: PARSE RESULT BLOCK CONTAINS VALUES IF AX HAS NO ERROR.
434 ; PARAMETER CONTROL BLOCK UPDATED FOR CODE PAGE.
438 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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
465 PROCESS_2ND_PARM ENDP
;AN000; ;AN000
468 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
470 ; PROCEDURE_NAME: PROCESS_3RD_PARM
473 ; THIS PROCEDURE PROCESSES THE 3RD POSITIONAL PARAMETER. THIS SHOULD
474 ; BE THE KEYBOARD DEFINITION FILE PATH, IF SPECIFIED.
476 ; AT ENTRY: PARSE RESULT BLOCK CONTAINS VALUES IF AX HAS NO ERROR.
479 ; PARAMETER CONTROL BLOCK UPDATED FOR FILE NAME.
483 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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
514 PROCESS_3RD_PARM ENDP
;AN000; ;AN000