diff options
Diffstat (limited to 'v4.0/src/CMD/DISKCOPY/DCOPYPAR.ASM')
| -rw-r--r-- | v4.0/src/CMD/DISKCOPY/DCOPYPAR.ASM | 413 |
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 | ; = = = = = = = = = = = = | ||
| 87 | HEADER 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 | |||
| 97 | FALSE EQU 0 ;AN000;RETURN VALUES FOR | ||
| 98 | TRUE EQU NOT FALSE ;AN000; /1 SWITCH | ||
| 99 | CHAR_A EQU "A" ;AN000;ASCII VALUE OF CHARACTER "A" | ||
| 100 | BLANK EQU " " ;AN001; | ||
| 101 | NUL EQU 0 ;AN003; | ||
| 102 | ; = = = = = = = = = = = = | ||
| 103 | ; EXIT CODES FROM SYSPARSE (WHEN CY=0) | ||
| 104 | |||
| 105 | SYSPRM_EX_OK EQU 0 ;AN000; no error | ||
| 106 | SYSPRM_EX_MANY EQU 1 ;AN000; too many operands | ||
| 107 | SYSPRM_EX_MISSING EQU 2 ;AN000; required operand missing | ||
| 108 | SYSPRM_EX_NOT_SWLIST EQU 3 ;AN000; not in switch list provided | ||
| 109 | SYSPRM_EX_NOT_KEYLIST EQU 4 ;AN000; not in keyword list provided | ||
| 110 | SYSPRM_EX_RANGE EQU 6 ;AN000; out of range specified | ||
| 111 | SYSPRM_EX_VALUE EQU 7 ;AN000; not in value list provided | ||
| 112 | SYSPRM_EX_STRING EQU 8 ;AN000; not in string list provided | ||
| 113 | SYSPRM_EX_SYNTAX EQU 9 ;AN000; syntax error | ||
| 114 | SYSPRM_EX_EOL EQU -1 ;AN000; end of command line | ||
| 115 | ; = = = = = = = = = = = = | ||
| 116 | HEADER <STRUC - DEFINITIONS OF EXTERNAL CONTROL BLOCKS> ;AN000; | ||
| 117 | PSP STRUC ;AN000; | ||
| 118 | DB 80H DUP (?) ;AN000;SKIP OVER FIRST HALF OF PSP | ||
| 119 | PSP_PARMLEN DB ? ;AN000;NUMBER OF BYTES IN DOS COMMAND LINE | ||
| 120 | PSP_COMMAND DB 127 DUP(?) ;AN000;TEXT OF DOS COMMAND LINE | ||
| 121 | PSP ENDS ;AN000; | ||
| 122 | |||
| 123 | MSG_DESC STRUC ;AN003; | ||
| 124 | MSG_NUM DW ? ;AN003;MESSAGE NUMBER (TO AX) | ||
| 125 | MSG_HANDLE DW ? ;AN003;HANDLE OF OUTPUT DEVICE (TO BX) | ||
| 126 | MSG_SUBLIST DW ? ;AN003;POINTER TO SUBLIST (TO SI) | ||
| 127 | MSG_COUNT DW ? ;AN003;SUBSTITUTION COUNT (TO CX) | ||
| 128 | MSG_CLASS DW ? ;AN003;MESSAGE CLASS (IN HIGH BYTE, TO DH) | ||
| 129 | ; LOW BYTE HAS 0 (FUNCTION "NO INPUT", TO DL) | ||
| 130 | MSG_DESC ENDS ;AN003; | ||
| 131 | |||
| 132 | ONE_SUBS EQU 1 ;AN003;NUMBER OF VARIABLES | ||
| 133 | |||
| 134 | SUBLIST STRUC ;AN000; | ||
| 135 | SUB_SIZE DB ? ;AN003;SUBLIST SIZE (POINTER TO NEXT SUBLIST) | ||
| 136 | SUB_RES DB ? ;AN003;RESERVED | ||
| 137 | ;NEXT FIELD IS TO BE USED AS A DOUBLE WORD | ||
| 138 | SUB_VALUE DW ? ;AN003;TIME, DATE, OR PTR TO DATA ITEM | ||
| 139 | SUB_VALUE_SEG DW ? ;AN003;SEG ID OF PTR | ||
| 140 | ;(ABOVE FIELD MUST BE FILLED AT EXECUTION TIME | ||
| 141 | ; IF THIS IS A .COM FILE) | ||
| 142 | SUB_ID DB ? ;AN003;N OF %N | ||
| 143 | SUB_FLAGS DB ? ;AN003;DATA TYPE FLAGS | ||
| 144 | SUB_MAX_WIDTH DB ? ;AN003;MAXIMUM FIELD WIDTH (0=UNLIMITED) | ||
| 145 | SUB_MIN_WIDTH DB ? ;AN003;MINIMUM FIELD WIDTH | ||
| 146 | SUB_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. | ||
| 150 | SUBLIST 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 | ||
| 157 | CSEG 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) | ||
| 169 | NO_OPTION EQU -1 ;AN000;NO OPTION "/1" SPECIFIED | ||
| 170 | OPTION_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 | |||
| 176 | CURRENT_PARM DW 81H ;AN000;POINTER INTO COMMAND OF NEXT OPERAND | ||
| 177 | PUBLIC CURRENT_PARM ;AN000; | ||
| 178 | |||
| 179 | ORDINAL 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 | ||
| 188 | PARMS 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 | ||
| 197 | PARMSX 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 | ||
| 217 | CONTROL_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 | ||
| 246 | NOVALS DB 0 ;AN000;NO VALUE DEFINITIONS | ||
| 247 | |||
| 248 | ;RESULTS CONTROL BLOCK FOR THE POSITIONAL PARAMETER | ||
| 249 | RESULT1 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 | ||
| 256 | RESULT_TAG DB 0FFH ;AN000; MATCHED ITEM TAG | ||
| 257 | DW 0 ;AN000;POINTER TO SYNONYM | ||
| 258 | |||
| 259 | RESULT_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 | ||
| 268 | CONTROL_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 | ||
| 294 | SW_1 DB "/1",0 ;AN000; IF n >0, SWITCH 1 | ||
| 295 | |||
| 296 | ;RESULTS CONTROL BLOCK FOR THE SWITCHES | ||
| 297 | RESULTSW1 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:) | ||
| 307 | RESULT_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; | ||
| 312 | PARSER 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 | ||
| 378 | PARSER ENDP ;AN000; | ||
| 379 | ; = = = = = = = = = = = = | ||
| 380 | HEADER <PARSE_ERROR - DISPLAY REASON FOR PARSE ERROR> ;AN000; | ||
| 381 | PARSE_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 | ||
| 408 | PARSE_ERROR ENDP ;AN000; | ||
| 409 | ; = = = = = = = = = = = = | ||
| 410 | PATHLABL DCOPYPAR ;AN015; | ||
| 411 | CSEG ENDS ;AN000; | ||
| 412 | END ;AN000; | ||
| 413 | \ No newline at end of file | ||