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