By: Dave M. Walker Subj: Command Line Parms ____________________________________________________________________________ Let's see... we'll start with a listing of the parameters for @PARAM from TRSDOS 6.x: Parses an optional parameter string. Its primary function is to parse command parameters contained in a command line starting with a parentheses. The acceptable parameter format is: PARM=X'nnnn' ... hexadecimal entry PARM=nnnnn ... decimal entry PARM="string"... alphanumeric entry PARM=flag ... ON, OFF, Y, N, YES, or NO Note: Entering a parameter with no equal sign or value is the same as using PARM=ON. Entering PARM= with no value is the same as using PARM=OFF. Entry Conditions: A = 17 [SVC number, akin to function in AH] DE = Pointer to beginning of your parameter table HL = Pointer to command line to parse [unnecessary for the PC] Exit Conditions: Success always. If Z is set, either valid parameters or no parameters were found. If NZ is set, a bad parameter was found. General: NZ is not returned if parameter types other than those specified are entered. The application must check the validity of the response byte. The valid parameters are contained in a user table which must be in one of the following formats. (Parameter names must consist of alphanumeric characters, the first of which is a letter.) For use with TRSDOS Version 6 [Model IV], use this format: The parameter table starts with a single byte X'80'. Each parameter is stored in a variable length field as described below. 1) Type Byte (Type and length byte) Bit 7 - If set, accept numeric value Bit 6 - If set, accept flag parameter Bit 5 - If set, accept "string" value Bit 4 - If set, accept first character of name as abbreviation Bits 3-0 - Length of parameter name 2) Actual parameter name 3) Response byte (Type and length found) Bit 7 - Numeric value found Bit 6 - Flag parameter found Bit 5 - String parameter found Bits 4-0 - Length of parameter entered. If length is 0 and the 2-byte vector points to a quotation mark (X'22'), then the parameter was a null string. Otherwise, a length of 0 indicates that the parameter was longer than 31 characters. 4) 2-byte address vector to receive the parsed parameter values. The 2-byte memory area pointed to by the address field of your table receives the value of PARM if PARM is non-string. If a string is entered, the 2-byte memory area receives the address of the first byte of "string". The entries ON, YES, and Y return a value of X'FFFF'; OFF NO, and N return X'0000'. If a paraemter name is specified on the command line and is followed by an equal sign and no value, then X'0000' or NO is returned. If a parameter name is used on the command line without the equal sign, then a value of X'FFFF' or ON is assumed. For any allowed parameter that is unchanged and the response byte is 0. The parameter table is terminated with a single byte X'00'. The other parameter format that was alluded to was used in LDOS for the TRS-80 I/III. Briefly, this format was: - A 6-character parameter name, left-justified, padded with blanks. - An address to store the parsed values [repeat for all parms] - A null to terminate the table So the table would look like this using PC-eze: VidType dw -1 ;Parameters & default values PortNum dw 1 db 'VIDEO ' ;Parameter name dw OFFSET VidType ;Address to store response db 'PORT ' ;Another... dw OFFSET PortNumber db 0 ;Terminating null No distinction was made between paramater types. The programmer was left to figure that one out. The first method described is a little more complicated, but easier on the applications programmer. (That's the point to all this, right?) This idea probably won't catch on... (I can see the error message now: "This program requires TOADPARM because Microsoft can't design a decent Operating System.") ... but it would be an EXCELLENT idea for Rex Conn to implement in the next version of 4DOS. I suppose the two things that really bug me the most about MS-DOS are: 1. Lack of a task scheduler for the NMI (IRQ 8). LDOS had system routines that kept track of the system timer and issued vectors upon request. No need to save registers or fool with resetting the hardware timer... just call the system with the address of your routine and it's done. It even had 2 priority levels, fast and slow. 2. Lack of chained device support. LDOS would allow you to chain your driver, filter, hotkey, or whatever via system calls. No need to mess around with grabbing interrupts and such. Ah well, maybe IBM has developed a better interface with OS/2. Somehow I don't really think so, though. *sigh*