diff options
Diffstat (limited to 'v4.0/src/CMD/DISKCOMP/DCOMPPAR.ASM')
| -rw-r--r-- | v4.0/src/CMD/DISKCOMP/DCOMPPAR.ASM | 427 |
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 | ; = = = = = = = = = = = = | ||
| 91 | HEADER 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; | ||
| 99 | CHAR_A EQU "A" ;AN000;ASCII VALUE OF CHARACTER "A" | ||
| 100 | NUL EQU 0 ;AN003;ASCIIZ STRING DELIMITER | ||
| 101 | ; EXIT CODES FROM SYSPARSE (WHEN CY=0) | ||
| 102 | |||
| 103 | SYSPRM_EX_OK EQU 0 ;AN000; no error | ||
| 104 | SYSPRM_EX_MANY EQU 1 ;AN000; too many operands | ||
| 105 | SYSPRM_EX_MISSING EQU 2 ;AN000; required operand missing | ||
| 106 | SYSPRM_EX_NOT_SWLIST EQU 3 ;AN000; not in switch list provided | ||
| 107 | SYSPRM_EX_NOT_KEYLIST EQU 4 ;AN000; not in keyword list provided | ||
| 108 | SYSPRM_EX_RANGE EQU 6 ;AN000; out of range specified | ||
| 109 | SYSPRM_EX_VALUE EQU 7 ;AN000; not in value list provided | ||
| 110 | SYSPRM_EX_STRING EQU 8 ;AN000; not in string list provided | ||
| 111 | SYSPRM_EX_SYNTAX EQU 9 ;AN000; syntax error | ||
| 112 | SYSPRM_EX_EOL EQU -1 ;AN000; end of command line | ||
| 113 | ; = = = = = = = = = = = = | ||
| 114 | HEADER <STRUC - DEFINITIONS OF EXTERNAL CONTROL BLOCKS> ;AN000; | ||
| 115 | PSP STRUC ;AN000; | ||
| 116 | DB 80H DUP (?) ;AN000;SKIP OVER FIRST HALF OF PSP | ||
| 117 | PSP_PARMLEN DB ? ;AN000;NUMBER OF BYTES IN DOS COMMAND LINE | ||
| 118 | PSP_COMMAND DB 127 DUP(?) ;AN000;TEXT OF DOS COMMAND LINE | ||
| 119 | PSP ENDS ;AN000; | ||
| 120 | |||
| 121 | MSG_DESC STRUC ;AN003; | ||
| 122 | MSG_NUM DW ? ;AN003;MESSAGE NUMBER (TO AX) | ||
| 123 | MSG_HANDLE DW ? ;AN003;HANDLE OF OUTPUT DEVICE (TO BX) | ||
| 124 | MSG_SUBLIST DW ? ;AN003;POINTER TO SUBLIST (TO SI) | ||
| 125 | MSG_COUNT DW ? ;AN003;SUBSTITUTION COUNT (TO CX) | ||
| 126 | MSG_CLASS DW ? ;AN003;MESSAGE CLASS (IN HIGH BYTE, TO DH) | ||
| 127 | ; LOW BYTE HAS 0 (FUNCTION "NO INPUT", TO DL);AN003; | ||
| 128 | MSG_DESC ENDS ;AN003; | ||
| 129 | |||
| 130 | ONE_SUBS EQU 1 ;AN003;NUMBER OF VARIABLES | ||
| 131 | |||
| 132 | SUBLIST STRUC ;AN000; | ||
| 133 | SUB_SIZE DB ? ;AN003;SUBLIST SIZE (POINTER TO NEXT SUBLIST) | ||
| 134 | SUB_RES DB ? ;AN003;RESERVED | ||
| 135 | ;NEXT FIELD IS TO BE USED AS A DOUBLE WORD ;AN003; | ||
| 136 | SUB_VALUE DW ? ;AN003;TIME, DATE, OR PTR TO DATA ITEM | ||
| 137 | SUB_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; | ||
| 140 | SUB_ID DB ? ;AN003;N OF %N | ||
| 141 | SUB_FLAGS DB ? ;AN003;DATA TYPE FLAGS | ||
| 142 | SUB_MAX_WIDTH DB ? ;AN003;MAXIMUM FIELD WIDTH (0=UNLIMITED) | ||
| 143 | SUB_MIN_WIDTH DB ? ;AN003;MINIMUM FIELD WIDTH | ||
| 144 | SUB_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; | ||
| 148 | SUBLIST 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 | |||
| 156 | BLANK EQU " " ;AN002;WIPE OUT SWITCH TO AVOID DUPLICATE | ||
| 157 | |||
| 158 | CSEG 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) | ||
| 168 | NO_OPTION EQU -1 ;AN000;OPTION NOT SPECIFIED | ||
| 169 | OPTION_1 EQU 1 ;AN000;OPTION "/1" SPECIFIED | ||
| 170 | OPTION_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 | |||
| 178 | CURRENT_PARM DW 81H ;AN000;POINTER INTO COMMAND OF NEXT OPERAND | ||
| 179 | PUBLIC CURRENT_PARM ;AN000; | ||
| 180 | |||
| 181 | ORDINAL 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 | ||
| 190 | PARMS 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 | ||
| 199 | PARMSX 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 | ||
| 219 | CONTROL_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 | ||
| 248 | NOVALS DB 0 ;AN000;NO VALUE DEFINITIONS | ||
| 249 | |||
| 250 | ;RESULTS CONTROL BLOCK FOR THE POSITIONAL PARAMETER | ||
| 251 | RESULT1 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 | ||
| 258 | RESULT_TAG DB 0FFH ;AN000; MATCHED ITEM TAG | ||
| 259 | DW 0 ;AN000;POINTER TO SYNONYM | ||
| 260 | |||
| 261 | RESULT_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 | ||
| 271 | CONTROL_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 | ||
| 296 | SINGLE_SIDED LABEL BYTE ;AN002; | ||
| 297 | SW_1 DB "/1",0 ;AN000; IF n >0, KEYWORD 1 | ||
| 298 | SW_8 DB "/8",0 ;AN000;SECOND KEYWORD | ||
| 299 | |||
| 300 | ;RESULTS CONTROL BLOCK FOR THE SWITCHES | ||
| 301 | RESULTSW1 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 | |||
| 310 | RESULTSWSYN DW 0 ;AN000; SYNONYM POINTER (BASED ON ES:) | ||
| 311 | RESULT_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; | ||
| 316 | PARSER 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 | ||
| 394 | PARSER ENDP ;AN000; | ||
| 395 | ; = = = = = = = = = = = = | ||
| 396 | HEADER <PARSE_ERROR - DISPLAY REASON FOR PARSE ERROR> ;AN000; | ||
| 397 | PARSE_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 | ||
| 422 | PARSE_ERROR ENDP ;AN000; | ||
| 423 | ; = = = = = = = = = = = = | ||
| 424 | PATHLABL DCOMPPAR ;AN013; | ||
| 425 | CSEG ENDS ;AN000; | ||
| 426 | END ;AN000; | ||
| 427 | \ No newline at end of file | ||