summaryrefslogtreecommitdiff
path: root/v4.0/src/CMD/DISKCOMP/DCOMPPAR.ASM
diff options
context:
space:
mode:
Diffstat (limited to 'v4.0/src/CMD/DISKCOMP/DCOMPPAR.ASM')
-rw-r--r--v4.0/src/CMD/DISKCOMP/DCOMPPAR.ASM427
1 files changed, 427 insertions, 0 deletions
diff --git a/v4.0/src/CMD/DISKCOMP/DCOMPPAR.ASM b/v4.0/src/CMD/DISKCOMP/DCOMPPAR.ASM
new file mode 100644
index 0000000..7a549d2
--- /dev/null
+++ b/v4.0/src/CMD/DISKCOMP/DCOMPPAR.ASM
@@ -0,0 +1,427 @@
1 PAGE 90,132 ;AN000;A2
2 TITLE DCOMPPAR.SAL - LOOK AT COMMAND LINE PARMS
3;****************** START OF SPECIFICATIONS *****************************
4; MODULE NAME: DCOMPPAR.SAL
5
6; DESCRIPTIVE NAME: Handle the definition of the DOS command line parameters
7; and the interface to the DOS system PARSER.
8
9;FUNCTION: The static data areas are prescribed by the DOS system PARSER
10; to define the several parameters presented to DISKCOMP. These
11; data areas are passed to the PARSER, and its responses checked
12; to determine the nature of the user's specifications. Any errors
13; found in the user's parameters are defined in messages back
14; to the user.
15
16; ENTRY POINT: PARSER, near
17
18; INPUT: (DOS COMMAND LINE PARAMETERS)
19
20; [d:][path] DISKCOMP [d: [d:]] [/1] [/8]
21
22; WHERE
23; [d:][path] - Path where the DISKCOMP command resides.
24
25; [d:] - To specify the Source drive
26;
27; [d:] - To specify the Target drive
28;
29; [/1] - To compare only the first side of the diskette,
30; regardless of the diskette or drive type.
31
32; [/8] - To compare only the first 8 sectors per track,
33; even if the first diskette contains 9/15 sectors
34; per track.
35;
36; Upon entry to PARSER in this module,
37; "CURRENT_PARM" = offset to start of parm text in command string
38; "ORDINAL" = initialized to zero
39; PSP+81H = text of DOS command line parms string
40
41; EXIT-NORMAL:
42; "SOURCE_DRIVE" = CHAR OF FIRST DRIVE ID SPECIFIED, BLANK IF NONE
43; "TARGET_DRIVE" = CHAR OF SECOND DRIVE ID IF BOTH SPECIFIED, BLANK
44; IF NONE OR ONLY ONE SPECIFIED
45; "USER_OPTION" = 01 ON IF /1, -1 IF /1 NOT SPECIFIED.
46; "USER_OPTION_8" = 01 ON IF /8, -1 IF /8 NOT SPECIFIED.
47
48; EXIT-ERROR:
49; IF ERROR, ERROR MESSAGE IS DISPLAYED, AND "EXITFL" HAS "EXPAR".
50
51; INTERNAL REFERENCES:
52; ROUTINES:
53; PARSER:NEAR Call the system Parser to decode command line
54; PARSE_ERROR:NEAR Display the appropriate Parse error message.
55
56; DATA AREAS:
57; The several parameter control blocks, defined by the System
58; PARSER interface, defining the DISKCOMP parameters.
59
60; EXTERNAL REFERENCES:
61; ROUTINES:
62; SENDMSG:NEAR Uses Msg Descriptor to drive message handler.
63; SYSPARSE:NEAR System Command Line Common Parser.
64
65; DATA AREAS:
66; EXITFL:BYTE Errorlevel return code.
67; MSGNUM_PARSE:WORD Message descriptor for all parse errors.
68; USER_OPTION:BYTE /1 parm indicator
69; USER_OPTION_8:BYTE /8 parm indicator
70; SOURCE_DRIVE:BYTE character of first specified drive
71; TARGET_DRIVE:BYTE character of second specified drive
72
73; NOTES:
74; This module should be processed with the SALUT preprocessor
75; with the re-alignment not requested, as:
76
77; SALUT DCOMPPAR,NUL
78
79; To assemble these modules, the alphabetical or sequential
80; ordering of segments may be used.
81
82; For LINK instructions, refer to the PROLOG of the main module,
83; DISKCOMP.SAL.
84
85;****************** END OF SPECIFICATIONS *****************************
86 IF1 ;AN000;
87 %OUT COMPONENT=DISKCOMP, MODULE=DCOMPPAR.SAL... ;AN000;
88 ENDIF ;AN000;
89 INCLUDE PATHMAC.INC ;AN013;
90; = = = = = = = = = = = =
91HEADER MACRO TEXT ;;AN000;
92.XLIST ;AN000;
93 SUBTTL TEXT ;AN000;
94.LIST ;AN000;
95 PAGE ;;AN000;
96 ENDM ;;AN000;
97; = = = = = = = = = = = =
98; $SALUT (4,23,28,36) ;AN000;
99CHAR_A EQU "A" ;AN000;ASCII VALUE OF CHARACTER "A"
100NUL EQU 0 ;AN003;ASCIIZ STRING DELIMITER
101; EXIT CODES FROM SYSPARSE (WHEN CY=0)
102
103SYSPRM_EX_OK EQU 0 ;AN000; no error
104SYSPRM_EX_MANY EQU 1 ;AN000; too many operands
105SYSPRM_EX_MISSING EQU 2 ;AN000; required operand missing
106SYSPRM_EX_NOT_SWLIST EQU 3 ;AN000; not in switch list provided
107SYSPRM_EX_NOT_KEYLIST EQU 4 ;AN000; not in keyword list provided
108SYSPRM_EX_RANGE EQU 6 ;AN000; out of range specified
109SYSPRM_EX_VALUE EQU 7 ;AN000; not in value list provided
110SYSPRM_EX_STRING EQU 8 ;AN000; not in string list provided
111SYSPRM_EX_SYNTAX EQU 9 ;AN000; syntax error
112SYSPRM_EX_EOL EQU -1 ;AN000; end of command line
113; = = = = = = = = = = = =
114 HEADER <STRUC - DEFINITIONS OF EXTERNAL CONTROL BLOCKS> ;AN000;
115PSP STRUC ;AN000;
116 DB 80H DUP (?) ;AN000;SKIP OVER FIRST HALF OF PSP
117PSP_PARMLEN DB ? ;AN000;NUMBER OF BYTES IN DOS COMMAND LINE
118PSP_COMMAND DB 127 DUP(?) ;AN000;TEXT OF DOS COMMAND LINE
119PSP ENDS ;AN000;
120
121MSG_DESC STRUC ;AN003;
122MSG_NUM DW ? ;AN003;MESSAGE NUMBER (TO AX)
123MSG_HANDLE DW ? ;AN003;HANDLE OF OUTPUT DEVICE (TO BX)
124MSG_SUBLIST DW ? ;AN003;POINTER TO SUBLIST (TO SI)
125MSG_COUNT DW ? ;AN003;SUBSTITUTION COUNT (TO CX)
126MSG_CLASS DW ? ;AN003;MESSAGE CLASS (IN HIGH BYTE, TO DH)
127 ; LOW BYTE HAS 0 (FUNCTION "NO INPUT", TO DL);AN003;
128MSG_DESC ENDS ;AN003;
129
130ONE_SUBS EQU 1 ;AN003;NUMBER OF VARIABLES
131
132SUBLIST STRUC ;AN000;
133SUB_SIZE DB ? ;AN003;SUBLIST SIZE (POINTER TO NEXT SUBLIST)
134SUB_RES DB ? ;AN003;RESERVED
135 ;NEXT FIELD IS TO BE USED AS A DOUBLE WORD ;AN003;
136SUB_VALUE DW ? ;AN003;TIME, DATE, OR PTR TO DATA ITEM
137SUB_VALUE_SEG DW ? ;AN003;SEG ID OF PTR
138 ;(ABOVE FIELD MUST BE FILLED AT EXECUTION TIME ;AN003;
139 ; IF THIS IS A .COM FILE) ;AN003;
140SUB_ID DB ? ;AN003;N OF %N
141SUB_FLAGS DB ? ;AN003;DATA TYPE FLAGS
142SUB_MAX_WIDTH DB ? ;AN003;MAXIMUM FIELD WIDTH (0=UNLIMITED)
143SUB_MIN_WIDTH DB ? ;AN003;MINIMUM FIELD WIDTH
144SUB_PAD_CHAR DB ? ;AN003;CHARACTER FOR PAD FIELD
145 ; CAN BE " ", "0" OR ",". ;AN003;
146 ; "," CAUSES INSERTION OF THE ACTIVE ;AN003;
147 ; THOUSANDS SEPARATOR BETWEEN EVERY 3 DIGITS. ;AN003;
148SUBLIST ENDS ;AN003;
149
150; = = = = = = = = = = = =
151 HEADER <PARSING WORKAREAS> ;AN000;
152; $SALUT (4,14,19,36) ;AN000;
153 EXTRN EXPAR:ABS ;AN000;ERRORLEVEL VALUE FOR BAD PARMS
154 EXTRN FINE:ABS ;AN000;RETURN STATUS INDICATOR
155
156BLANK EQU " " ;AN002;WIPE OUT SWITCH TO AVOID DUPLICATE
157
158CSEG SEGMENT PARA PUBLIC 'CODE' ;AN000;
159 ASSUME CS:CSEG,DS:CSEG,ES:CSEG,SS:CSEG ;AN000;
160
161 EXTRN SENDMSG:NEAR ;AN000;USES MSG DESCRIPTOR TO DRIVE MESSAGE HANDLR
162 EXTRN SYSPARSE:NEAR ;AN000;SYSTEM COMMAND LINE PARSER
163
164 EXTRN EXITFL:BYTE ;AN000;ERRORLEVEL RETURN CODE
165
166 EXTRN SOURCE_DRIVE:BYTE ;AN000;FIRST DRIVE LETTER SPECIFIED IN PARMS
167 EXTRN USER_OPTION:BYTE ;AN000;NO OPTION (-1) /1 (1), INVALID (9)
168NO_OPTION EQU -1 ;AN000;OPTION NOT SPECIFIED
169OPTION_1 EQU 1 ;AN000;OPTION "/1" SPECIFIED
170OPTION_8 EQU 1 ;AN000;OPTION "/8" SPECIFIED
171 EXTRN USER_OPTION_8:BYTE ;AN000;NO OPTION (-1) /8 (1), INVALID (9)
172
173 EXTRN MSGNUM_PARSE:WORD ;AN000;MESSAGE DESCRIPTOR FOR ALL PARSE ERRORS
174 EXTRN MSGNUM_INVALID_PARM2:WORD ;AN005;HELP MESSAGE DESCRIPTOR
175 EXTRN SUBLIST_PARSE:WORD ;AN003;POINTS TO INVALID PARM
176; = = = = = = = = = = = =
177
178CURRENT_PARM DW 81H ;AN000;POINTER INTO COMMAND OF NEXT OPERAND
179 PUBLIC CURRENT_PARM ;AN000;
180
181ORDINAL DW 0 ;AN000;ORDINAL NUMBER OF WHICH PARM TO PARSE
182 PUBLIC ORDINAL ;AN000;
183
184; = = = = = = = = = = = =
185 HEADER <DOS COMMAND LINE PARSER CONTROL BLOCKS> ;AN000;
186
187;INPUT PARAMETERS CONTROL BLOCK, POINTED TO BY ES:DI WHEN CALLING PARSER
188
189 PUBLIC PARMS ;AN000;LET LINK MAKE PARMS BLOCK ADDRESSABLE
190PARMS LABEL BYTE ;AN000;PARMS CONTROL BLOCK
191 DW PARMSX ;AN000;POINTER TO PARMS EXTENSION
192 DB 0 ;AN000; NUMBER OF STRINGS (0, 1, 2)
193 ; NEXT LIST WOULD BE EXTRA DELIM LIST
194 ; (,& WHITESPACE ALWAYS)
195 ; NEXT LIST WOULD BE EXTRA END OF LINE LIST
196 ; (CR,LF,0 ALWAYS)
197
198;SYSTEM PARSER PARAMETER EXTENSION CONTROL BLOCK
199PARMSX LABEL BYTE ;AN000;PARMS EXTENSION CONTROL BLOCK
200 DB 0,2 ;AN000; MIN, MAX POSITIONAL OPERANDS ALLOWED
201 DW CONTROL_POS ;AN000; DESCRIPTION OF POSITIONAL 1
202 DW CONTROL_POS ;AN000; DESCRIPTION OF POSITIONAL 2
203
204 DB 1 ;AN000; MAX SWITCH OPERANDS ALLOWED
205 DW CONTROL_SW ;AN000; DESCRIPTION OF SWITCH
206
207 DB 0 ;AN000; MAX KEYWORD OPERANDS ALLOWED
208 ; THERE IS NO CONTROL BLOCK
209 ; DEFINING KEYWORDS
210
211; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
212 HEADER <POSITIONAL PARM DESCRIPTOR BLOCK> ;AN000;
213;PARSER CONTROL BLOCK DEFINING THE ONLY POSITIONAL PARAMETER, OPTIONAL
214
215;FIRST POSITIONAL PARAMETER IS:
216; [D:] - SPECIFY THE SOURCE DRIVE.
217
218 PUBLIC CONTROL_POS ;AN000;LET LINK MAKE THIS ADDRESSABLE
219CONTROL_POS LABEL BYTE ;AN000;FIRST POSITIONAL DESCRIPTOR FOR FILESPEC,
220 ; OPTIONAL
221 DW 0101H ;AN000; CONTROLS TYPE MATCHED
222 ; SELECTED BITS: "DRIVE ONLY" AND "OPTIONAL"
223
224 ; 8000H=NUMERIC VALUE, (VALUE LIST WILL BE CHECKED)
225 ; 4000H=SIGNED NUMERIC VALUE (VALUE LIST WILL BE
226 ; CHECKED)
227 ; 2000H=SIMPLE STRING(VALUE LIST WILL BE CHECKED)
228 ; 1000H=DATE STRING (VALUE LIST WON'T BE CHECKED)
229 ; 0800H=TIME STRING (VALUE LIST WON'T BE CHECKED)
230 ; 0400H=COMPLEX LIST (VALUE LIST WON'T BE CHECKED)
231 ; 0200H=FILE SPEC (VALUE LIST WON'T BE CHECKED)
232 ; 0100H=DRIVE ONLY (VALUE LIST WON'T BE CHECKED)
233 ; 0080H=QUOTED STRING (VALUE LIST WON'T BE CHECKED)
234 ; 0010H=IGNORE ":" AT END IN MATCH
235 ; 0002H=REPEATS ALLOWED
236 ; 0001H=OPTIONAL
237
238 DW 0000H ;AN000;FUNCTION_FLAGS (NO CAPITALIZATION NEEDED)
239 ; 0001H=CAP RESULT BY FILE TABLE
240 ; 0002H=CAP RESULT BY CHAR TABLE
241 ; 0010H=REMOVE ":" AT END
242 DW RESULT1 ;AN000; RESULT BUFFER
243 DW NOVALS ;AN000; NO VALUE LISTS
244 DB 0 ;AN000; NUMBER OF KEYWORD/SWITCH SYNONYMS
245 ; IN FOLLOWING LIST
246
247;VALUE CONTROL BLOCK FOR THE POSITIONAL PARAMETERS
248NOVALS DB 0 ;AN000;NO VALUE DEFINITIONS
249
250;RESULTS CONTROL BLOCK FOR THE POSITIONAL PARAMETER
251RESULT1 LABEL BYTE ;AN000; BELOW FILLED IN FOR DEFAULTS
252 DB 3 ;AN000; TYPE RETURNED: 0=RESERVED,
253 ; 1=NUMBER, 2=LIST INDEX,
254 ; 3=STRING, 4=COMPLEX,
255 ; 5=FILESPEC, 6=DRIVE
256 ; 7=DATE, 8=TIME
257 ; 9=QUOTED STRING
258RESULT_TAG DB 0FFH ;AN000; MATCHED ITEM TAG
259 DW 0 ;AN000;POINTER TO SYNONYM
260
261RESULT_PTR1 DB ? ;AN000;DRIVE NUMBER (A=1, B=2, ETC)
262
263; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
264 HEADER <SWITCH PARM DESCRIPTOR BLOCK> ;AN000;
265;PARSER CONTROL BLOCK DEFINING THE TWO SWITCHES, OPTIONAL
266
267;THE SWITCH IS "/1", MEANING ONLY COMPARE THE FIRST SIDE.
268;THE SECOND SWITCH IS "/8", MEANING ONLY LOOK AT FIRST 8 SECTORS PER TRACK.
269
270 PUBLIC CONTROL_SW ;AN000;LET LINK MAKE THIS ADDRESSABLE
271CONTROL_SW LABEL BYTE ;AN000;SWITCH DESCRIPTOR FOR /1 OR /8
272 DW 0000H ;AN000; CONTROLS TYPE MATCHED
273 ; 8000H=NUMERIC VALUE, (VALUE LIST WILL BE CHECKED)
274 ; 4000H=SIGNED NUMERIC VALUE (VALUE LIST WILL BE
275 ; CHECKED)
276 ; 2000H=SIMPLE STRING(VALUE LIST WILL BE CHECKED)
277 ; 1000H=DATE STRING (VALUE LIST WON'T BE CHECKED)
278 ; 0800H=TIME STRING (VALUE LIST WON'T BE CHECKED)
279 ; 0400H=COMPLEX LIST (VALUE LIST WON'T BE CHECKED)
280 ; 0200H=FILE SPEC (VALUE LIST WON'T BE CHECKED)
281 ; 0100H=DRIVE ONLY (VALUE LIST WON'T BE CHECKED)
282 ; 0080H=QUOTED STRING (VALUE LIST WON'T BE CHECKED)
283 ; 0010H=IGNORE ":" AT END IN MATCH
284 ; 0002H=REPEATS ALLOWED
285 ; 0001H=OPTIONAL
286
287 DW 0000H ;AN000;FUNCTION_FLAGS (NO CAPITALIZATION)
288 ; 0001H=CAP RESULT BY FILE TABLE
289 ; 0002H=CAP RESULT BY CHAR TABLE
290 ; 0010H=REMOVE ":" AT END
291
292 DW RESULTSW1 ;AN000; RESULT BUFFER
293 DW NOVALS ;AN000; VALUE LISTS
294 DB 2 ;AN000; NUMBER OF KEYWORD/SWITCH SYNONYMS
295 ; IN FOLLOWING LIST
296SINGLE_SIDED LABEL BYTE ;AN002;
297SW_1 DB "/1",0 ;AN000; IF n >0, KEYWORD 1
298SW_8 DB "/8",0 ;AN000;SECOND KEYWORD
299
300;RESULTS CONTROL BLOCK FOR THE SWITCHES
301RESULTSW1 LABEL BYTE ;AN000; BELOW FILLED IN FOR DEFAULTS
302 DB 3 ;AN000; TYPE RETURNED: 0=RESERVED,
303 ; 1=NUMBER, 2=LIST INDEX,
304 ; 3=STRING, 4=COMPLEX,
305 ; 5=FILESPEC, 6=DRIVE
306 ; 7=DATE, 8=TIME
307 ; 9=QUOTED STRING
308 DB 0FFh ;AN000; MATCHED ITEM TAG
309
310RESULTSWSYN DW 0 ;AN000; SYNONYM POINTER (BASED ON ES:)
311RESULT_PTR2 DD ? ;AN000; OFFSET OF STRING VALUE
312; = = = = = = = = = = = =
313 PATHLABL DCOMPPAR ;AN013;
314 HEADER <PARSER - ASK SYSPARM TO DECODE PARAMETERS> ;AN000;
315; $SALUT (4,4,9,36) ;AN000;
316PARSER PROC NEAR ;AN000;
317 PUBLIC PARSER ;AN000;
318
319;INPUT: "CURRENT_PARM" = OFFSET TO NEXT PARM IN COMMAND STRING
320; "ORDINAL" = COUNT OF NEXT PARM TO PARSE
321; PSP+81H = TEXT OF DOS COMMAND LINE PARMS STRING
322;OUTPUT: "SOURCE_DRIVE" = A=1, B=2, 0 IF NONE
323; "TARGET_DRIVE" = A=1, B=2, 0 IF NONE
324; "USER_OPTION" = 01 ON IF /1, -1 IF /1 NOT SPECIFIED.
325; "USER_OPTION_8" = 01 ON IF /8, -1 IF /8 NOT SPECIFIED.
326; IF ERROR, ERROR MESSAGE IS DISPLAYED, AND "EXITFL" HAS "EXPAR".
327; = = = = = = = = = = = =
328 MOV USER_OPTION,NO_OPTION ;AN000;SET DEFAULT, SWITCH NOT FOUND
329 MOV USER_OPTION_8,NO_OPTION ;AN000;SET DEFAULT, SWITCH NOT FOUND
330
331; $SEARCH COMPLEX ;AN000;LOOP THRU COMMAND LINE
332 JMP SHORT $$SS1
333$$DO1:
334 ;LOOKING AT RETURN CODE FROM SYSPARSE... ;AN000;
335 CMP AX,SYSPRM_EX_OK ;AN000;WERE THERE ANY ERRORS?
336; $EXITIF NE ;AN000;HAD A PROBLEM
337 JE $$IF1
338 CALL PARSE_ERROR ;AN000;DISPLAY REASON FOR ERROR
339
340; $ORELSE ;AN000;SINCE NO PROBLEM, SO FAR
341 JMP SHORT $$SR1
342$$IF1:
343 MOV ORDINAL,CX ;AN000;SAVE UPDATED COUNT
344 MOV CURRENT_PARM,SI ;AN000;REMEMBER HOW FAR I GOT
345 MOV BX,DX ;AN000;SET DATA BASE REG TO POINT TO THIS OPERAND
346 CMP BX,OFFSET RESULT1 ;AN000;WAS POSITIONAL PARM SPECIFIED?
347; $IF E ;AN000;IF POSITIONAL PARM SPECIFIED,
348 JNE $$IF4
349 MOV SI,CX ;AN000;USE COUNT OF POSITIONALS AS INDEX
350 MOV AL,RESULT_PTR1 ;AN000;GET VALUE OF DRIVE (A=1, B=2, ETC)
351 MOV SOURCE_DRIVE-1[SI],AL ;AN000;SAVE RESPONSE DRIVE VALUE
352 ;IN EITHER SOURCE_DRIVE OR TARGET_DRIVE
353 ;ACCORDING TO ORDINAL IN SI (FROM CX)
354; $ELSE ;AN000;SINCE NOT POSITIONAL PARM SPECIFIED
355 JMP SHORT $$EN4
356$$IF4:
357 MOV AL,SINGLE_SIDED+BYTE ;AN000;GET ID PORTION OF SWITCH
358 MOV BX,RESULTSWSYN ;AN000;GET OFFSET TO MATCHING SWITCH
359 CMP [BX]+BYTE,AL ;AN000;WAS IT /1?
360; $IF E ;AN000;YES IT WAS /1
361 JNE $$IF6
362 MOV SW_1,BLANK ;AN002;AVOID GETTING /1 AGAIN
363 MOV USER_OPTION,OPTION_1 ;AN000;MUST HAVE BEEN THE SWITCH, /1
364; $ELSE ;AN000;SINCE IT WAS NOT /1, MUST BE /8
365 JMP SHORT $$EN6
366$$IF6:
367 MOV SW_8,BLANK ;AN002;AVOID GETTING /8 AGAIN
368 MOV USER_OPTION_8,OPTION_8 ;AN000;REPORT BACK, IT WAS /8
369; $ENDIF ;AN000;
370$$EN6:
371; $ENDIF ;AN000;
372$$EN4:
373; $STRTSRCH ;AN000;
374$$SS1:
375 LEA DI,PARMS ;AN000; ES:DI = PARSE CONTROL DEFINITON
376 MOV SI,CURRENT_PARM ;AN000; DS:SI = COMMAND STRING, NEXT PARM
377 XOR DX,DX ;AN000; RESERVED, INIT TO ZERO
378 MOV CX,ORDINAL ;AN000; OPERAND ORDINAL, INITIALLY ZERO
379 CALL SYSPARSE ;AN000;LOOK AT DOS PARMS
380 ; AX=EXIT CODE
381 ; BL=TERMINATED DELIMETER CODE
382 ; CX=NEW OPERAND ORDINAL
383 ; SI=SET TO PAST SCANNED OPERAND
384 ; DX=SELECTED RESULT BUFFER
385 CMP AX,SYSPRM_EX_EOL ;AN000; IS THAT THE END OF THE PARMS?
386 ;IF NOT, LOOP BACK AND FIND OUT
387 ; WHAT THAT PARM IS
388; $ENDLOOP E ;AN000;END OF LIST
389 JNE $$DO1
390 MOV DX,FINE ;AN000;REPORT THAT PARSER WENT OK
391; $ENDSRCH ;AN000;FINISHED WITH DOS COMMAND LINE
392$$SR1:
393 RET ;AN000;RETURN TO CALLER
394PARSER ENDP ;AN000;
395; = = = = = = = = = = = =
396 HEADER <PARSE_ERROR - DISPLAY REASON FOR PARSE ERROR> ;AN000;
397PARSE_ERROR PROC NEAR ;AN000;
398;INPUT: AX - ERROR NUMBER RETURNED FROM PARSE.
399; "CURRENT_PARM" - OFFSET INTO COMMAND OF WHERE TO START LOOKING FOR PARM
400;OUTPUT: APPROPRIATE ERROR MESSAGE IS PREPARED FOR DISPLAY.
401; DX IS SET TO OFFSET OF PARSE ERROR DESCRIPTOR.
402; = = = = = = = = = = = =
403
404 MOV MSGNUM_PARSE,AX ;AN000;PASS MESSAGE NUMBER TO DESCRIPTOR
405 MOV EXITFL,EXPAR ;AN000;ERRORLEVEL CODE TO "PARM ERROR"
406 MOV AX,CURRENT_PARM ;AN003;GET POINTER TO START OF BAD PARM
407 CMP SI,AX ;AN003;HAS THE INDEX TO COMMAND LINE MOVED?
408; $IF NE ;AN003;YES, THERE IS A FAULTY PARM
409 JE $$IF13
410 MOV BYTE PTR [SI],NUL ;AN003;DELIMIT THE BAD PARM
411 MOV SUBLIST_PARSE.SUB_VALUE,AX ;AN000;POINT SUBLIST TO BAD PARM
412
413 MOV MSGNUM_PARSE.MSG_SUBLIST,OFFSET SUBLIST_PARSE ;AN003;POINT TO SUBLIST
414 MOV MSGNUM_PARSE.MSG_COUNT,ONE_SUBS ;AN003;SET COUNT OF SUBLISTS TO ONE
415; $ENDIF ;AN003;INDEX MOVED?
416$$IF13:
417 MOV DI,OFFSET MSGNUM_PARSE ;AC005;OFFSET TO PARSE ERR DESCRIPTOR
418 CALL SENDMSG ;AN005;DISPLAY ERROR MSG
419
420 MOV DX,OFFSET MSGNUM_INVALID_PARM2 ;AN005;PASS BACK OFFSET TO HELP MSG
421 RET ;AN000;RETURN TO CALLER
422PARSE_ERROR ENDP ;AN000;
423; = = = = = = = = = = = =
424 PATHLABL DCOMPPAR ;AN013;
425CSEG ENDS ;AN000;
426 END ;AN000;
427 \ No newline at end of file