Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-1


					PAGE	,132			;
					TITLE	COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER
				;****************** START OF SPECIFICATIONS *****************************
				; MODULE NAME: COMPP.SAL
				;
				; DESCRIPTIVE NAME: Include the DOS system PARSER in the SEGMENT
				;		    configuration expected by the modules of COMP.
				;
				;FUNCTION: The common code of the DOS command line PARSER is optimized by
				;	   the setting of certain switches that cause the conditional
				;	   assembly of only the required portions of the common PARSER.
				;	   The segment registers are ASSUMED according to the type .COM.
				;	   The Common PARSER is then INCLUDEd.
				;
				; ENTRY POINT: SYSPARSE, near
				;
				; INPUT:
				;	ES - has seg id of the SEGMENT
				;	     that contains the input control blocks,
				;	     defined below.
				;
				;	DI - offset into ES of the PARMS INPUT BLOCK
				;
				;	DS - has seg id of the SEGMENT
				;	     that contains the DOS input COMMAND
				;	     string, which is originally presented at 81h
				;	     in the PSP.
				;
				;	SI - offset into DS of the text of the DOS input COMMAND string
				;	     as originally presented at 81H in the PSP.
				;
				;	DX - zero
				;
				;	CX - ordinal value, intially zero, updated on each subsequent call
				;	     to the value returned in CX on the previous call.
				;
				;	CS - points to the segment containing the
				;	     INCLUDE PARSE.ASM statement
				;
				;	DS - also points to the segment containing the INCLUDE
				;	     PARSE.ASM statement.
				;
				; EXIT-NORMAL:	Output registers:
				;	 AX - return code:
				;	    RC_No_Error     equ     0	 ; No error
				;	    RC_EOL	    equ     -1	 ; End of command line
				;
				;	 DX - Offset into ES of the selected RESULT BLOCK.
				;	 BL - terminated delimiter code
				;	 CX - new operand ordinal
				;	 SI - set past scanned operand
				;
				; EXIT-ERROR: Output registers:
				;	 AX - return code:
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-2


				;	    RC_Too_Many     equ     1	 ; Too many operands
				;	    RC_Op_Missing   equ     2	 ; Required operand missing
				;	    RC_Not_In_SW    equ     3	 ; Not in switch list provided
				;	    RC_Not_In_Key   equ     4	 ; Not in keyword list provided
				;	    RC_Out_Of_Range equ     6	 ; Out of range specified
				;	    RC_Not_In_Val   equ     7	 ; Not in value list provided
				;	    RC_Not_In_Str   equ     8	 ; Not in string list provided
				;	    RC_Syntax	    equ     9	 ; Syntax error
				;
				; INTERNAL REFERENCES:
				;    ROUTINES: SYSPARSE:near (INCLUDEd in PARSE.ASM)
				;
				;    DATA AREAS: none
				;
				; EXTERNAL REFERENCES:
				;    ROUTINES: none
				;
				;    DATA AREAS: control blocks pointed to by input registers.
				;
				; NOTES:
				;	 This module should be processed with the SALUT preprocessor
				;	 with the re-alignment not requested, as:
				;
				;		SALUT COMPP,NUL,;
				;
				;	 To assemble these modules, the alphabetical or sequential
				;	 ordering of segments may be used.
				;
				;	 For LINK instructions, refer to the PROLOG of the main module,
				;	 COMP1.ASM.
				;
				; REVISION HISTORY: A000 Version 4.00: add PARSER, System Message Handler,
				;		  Add compare of code page extended attribute, if present.
				;
				; COPYRIGHT: "The DOS COMP Utility"
				;	     "Version 4.0  (C)Copyright 1988 Microsoft"
				;	     "Licensed Material - Property of Microsoft"
				;
				;PROGRAM AUTHOR: DOS 4.0  Edwin M. K., Bill L.
				;
				;****************** END OF SPECIFICATIONS *****************************
				
 0000				CSEG	SEGMENT PARA PUBLIC  'CODE'	;AN000;
					ASSUME	CS:CSEG,DS:CSEG,ES:CSEG,SS:CSEG ;AN000;
				
					PUBLIC	SYSPARSE		;SUBROUTINE ENTRY POINT 		 ;AN000;
				
 = 0000				FARSW	EQU	0			;CALL THE PARSER BY NEAR CALL		 ;AN000;
 = 0000				DATESW	EQU	0			;SUPPRESS DATE CHECKING 		 ;AN000;
 = 0000				TIMESW	EQU	0			;SUPPRESS TIME CHECKING 		 ;AN000;
 = 0001				FILESW	EQU	1			;DO CHECK FILE SPECIFICATION		 ;AN000;
 = 0001				CAPSW	EQU	1			;DO USE FILE TABLE CAPS 		 ;AN000;
 = 0000				CMPXSW	EQU	0			;SUPPRESS CHECKING COMPLEX LIST 	 ;AN000;
 = 0001				DRVSW	EQU	1			;DO SUPPORT DRIVE ONLY FORMAT		 ;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-3


 = 0000				QUSSW	EQU	0			;SUPPRESS SUPPORT OF QUOTED STRING FORMT ;AN000;
 = 0000				NUMSW	EQU	0			;SUPPRESS CHECKING NUMERIC VALUE	 ;AN000;
 = 0000				KEYSW	EQU	0			;SUPPRESS KEYWORD SUPPORT		 ;AN000;
 = 0001				SWSW	EQU	1			;DO SUPPORT SWITCHES			 ;AN000;
 = 0000				VAL1SW	EQU	0			;SUPPRESS SUPPORT OF VALUE DEFINITION 1  ;AN000;
 = 0000				VAL2SW	EQU	0			;SUPPRESS SUPPORT OF VALUE DEFINITION 2  ;AN000;
 = 0000				VAL3SW	EQU	0			;SUPPRESS SUPPORT OF VALUE DEFINITION 3  ;AN000;
 = 0000				INCSW	EQU	0			;DON'T INCLUDE PSDATA.INC
 = 0001				BASESW	EQU	1			;use DS to index off of for PSDATA
				
				
					INCLUDE PSDATA.INC		;AN000;
			     C	;*******************************************************************
			     C	; Parser include file
			     C	;*******************************************************************
			     C	;
			     C	;**** Default assemble switches definition *************************
			     C	
			     C	
			     C	
			     C	
			     C	
			     C	
			     C	
			     C	
			     C	
			     C	
			     C	
			     C	
			     C	
			     C	
			     C	
			     C	
			     C	;**** Equation field
			     C	;-------- Character code definition
			     C	
 = 0081                      C	$P_DBSP1	   equ	81h		;AN000; 1st byte of DBCS blank
 = 0040                      C	$P_DBSP2	   equ	40h		;AN000; 2nd byte of DBCS blank
 = 002E                      C	$P_Period	   equ	"."             ;AN020;
 = 002F                      C	$P_Slash	   equ	"/"             ;AN020;
 = 0020                      C	$P_Space	   equ	" "             ;AN000; SBCS blank
 = 002C                      C	$P_Comma	   equ	","             ;AN000;
 = 002F                      C	$P_Switch	   equ	"/"             ;AN000;
 = 003D                      C	$P_Keyword	   equ	"="             ;AN000;
 = 003A                      C	$P_Colon	   equ	":"             ;AN000;
 = 002B                      C	$P_Plus 	   equ	"+"             ;AN000;
 = 002D                      C	$P_Minus	   equ	"-"             ;AN000;
 = 0029                      C	$P_Rparen	   equ	")"             ;AN000;
 = 0028                      C	$P_Lparen	   equ	"("             ;AN000;
			     C	;(deleted ;AN025;) $P_SQuote	      equ  "'"
 = 0022                      C	$P_DQuote	   equ	'"'             ;AN000;
 = 0000                      C	$P_NULL 	   equ	0		;AN000;
 = 0009                      C	$P_TAB		   equ	9		;AN000;
 = 000D                      C	$P_CR		   equ	0Dh		;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-4


 = 000A                      C	$P_LF		   equ	0Ah		;AN000;
 = 0080                      C	$P_ASCII80	   equ	80h		;AN000; ASCII 80h character code
			     C	
			     C	;-------- Masks
 = 0020                      C	$P_Make_Lower	   equ	20h		;AN000; make lower case character
 = 00DF                      C	$P_Make_Upper	   equ	0ffh-$P_Make_Lower ;AN000; make upper case character
			     C	
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-5


			     C			   PAGE 		   ;AN000;
			     C	;-------- DOS function call related equs
			     C	
 = 3800                      C	$P_DOS_Get_CDI	   equ	3800h		;AN000; get country dependent information
			     C						; by this call, following information
			     C	$P_CDI		   struc		;AN000; is returned.
 0000  0000                  C	$P_CDI_DateF	   dw	0		;AN000;
 0002  00 00 00 00 00        C	$P_CDI_Money	   db	0,0,0,0,0	;AN000;
 0007  00 00                 C	$P_CDI_1000	   db	0,0		;AN000;
 0009  00 00                 C	$P_CDI_Dec	   db	0,0		;AN000;
 000B  00 00                 C	$P_CDI_DateS	   db	0,0		;AN000;
 000D  00 00                 C	$P_CDI_TimeS	   db	0,0		;AN000;
 000F  00                    C			   db	0		;AN000;
 0010  00                    C			   db	0		;AN000;
 0011  00                    C	$P_CDI_TimeF	   db	0		;AN000;
 0012  0000 0000             C			   dw	0,0		;AN000;
 0016  00 00                 C			   db	0,0		;AN000;
 0018  0005[                 C			   dw	5 dup(0)	;AN000;
	   0000              C	
			 ]   C	
			     C	
 0022                        C	$P_CDI		   ends 		;AN000;
			     C	
 = 0000                      C	$P_Date_MDY	   equ	0		;AN000;
 = 0001                      C	$P_Date_DMY	   equ	1		;AN000;
 = 0002                      C	$P_Date_YMD	   equ	2		;AN000;
			     C	;-------------
 = 6300                      C	$P_DOS_GetEV	   equ	6300h		;AN000; get DBCS EV call
			     C						;AN000; DS:SI will points to DBCS EV
			     C	;-------------
 = 0065                      C	$P_DOS_Get_TBL	   equ	65h		;AN000; get uppercase table call
			     C						;AN000; following parameters are set
			     C						;AN000; to get casemap table.
 =-0001                      C	$P_DOSTBL_Def	   equ	-1		;AN000; get default
 = 0005                      C	$P_DOSTBL_BL	   equ	5		;AN000; buffer length for Tbl pointer
 = 0004                      C	$P_DOSTBL_File	   equ	4		;AN000; get file uppercase table
 = 0002                      C	$P_DOSTBL_Char	   equ	2		;AN000; get character uppercase table
			     C						; By this call following information
			     C						; is returned.
			     C	$P_DOS_TBL	   struc		;AN000;
 0000  00                    C	$P_DOS_InfoID	   db	0		;AN000; information id for the table
 0001  0000                  C	$P_DOS_TBL_Off	   dw	0		;AN000; offset address of the table
 0003  0000                  C	$P_DOS_TBL_Seg	   dw	0		;AN000; segment address of the table
 0005                        C	$P_DOS_TBL	   ends 		;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-6


			     C			   PAGE 		;AN000;
			     C	;---------------------------------------------------------------------------------------------------
				------
			     C	; PARMS 	LABEL	BYTE
			     C	;		DW	PARMSX
			     C	;		DB	2			; NUMBER OF STRINGS (0, 1, 2)
			     C	;		DB	length			; LENGTH OF THE NEXT LIST, 0 IF NONE
			     C	;		DB	" .. "                  ; EXTRA DELIMITER LIST,
			     C	;						; TYPICAL ARE ";", "="
			     C	;						; "," & WHITESPACE ALWAYS
			     C	;		DB	length			; LENGTH OF THE NEXT LIST, 0 IF NONE
			     C	;		DB	" .. "                  ; EXTRA END OF LINE LIST, CR, LF OR 0 ALWAYS
			     C	;---------------------------------------------------------------------------------------------------
				------
			     C	
			     C	;-------------------------------- PARMS block structure
			     C	$P_PARMS_Blk	   struc		;AN000;
 0000  0000                  C	$P_PARMSX_Address  dw	0		;AN000; Address of PARMSX
 0002  00                    C	$P_Num_Extra	   db	0		;AN000; Number of extra stuff
 0003  00                    C	$P_Len_Extra_Delim db	0		;AN000; Length of extra delimiter
 0004                        C	$P_PARMS_Blk	   ends 		;AN000;
			     C	
 = 0004                      C	$P_Len_PARMS	   equ	4		;AN000;
 = 0000                      C	$P_I_Use_Default   equ	0		;AN000; no extra stuff specified
 = 0001                      C	$P_I_Have_Delim    equ	1		;AN000; extra delimiter specified
 = 0002                      C	$P_I_Have_EOL	   equ	2		;AN000; extra EOL specified
			     C	
			     C	;---------------------------------------------------------------------------------------------------
				------
			     C	; PARMSX	LABEL	BYTE
			     C	;		DB	minp,maxp		; MIN, MAX POSITIONAL OPERANDS ALLOWED
			     C	;		DW	CONTROL 		; DESCRIPTION OF POSITIONAL 1
			     C	;		:				; REPEATS maxp-1 TIMES
			     C	;		DB	maxs			; # OF SWITCHES
			     C	;		DW	CONTROL 		; DESCRIPTION OF SWITCH 1
			     C	;		:				; REPEATS maxs-1 TIMES
			     C	;		DB	maxk			; # OF KEYWORD
			     C	;		DW	CONTROL 		; DESCRIPTION OF KEYWORD 1
			     C	;		:				; REPEATS maxk-1 TIMES
			     C	;---------------------------------------------------------------------------------------------------
				------
			     C	
			     C	;-------------------------------- PARMSX block structure
			     C	$P_PARMSX_Blk	   struc		;AN000;
 0000  00                    C	$P_MinP 	   db	0		;AN000; Minimum positional number
 0001  00                    C	$P_Maxp 	   db	0		;AN000; Maximum positional number
 0002  0000                  C	$P_1st_Control	   dw	0		;AN000; Address of the 1st CONTROL block
 0004                        C	$P_PARMSX_Blk	   ends 		;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-7


			     C			   PAGE 		;AN000;
			     C	;---------------------------------------------------------------------------------------------------
				------
			     C	; << Control field definition  >>
			     C	;
			     C	;
			     C	;CONTROL   LABEL   BYTE
			     C	;	   DW	   MATCH_FLAGS	   ; CONTROLS TYPE MATCHED
			     C	;				   ; 8000H=NUMERIC VALUE, (VALUE LIST WILL BE CHECKED)
			     C	;				   ; 4000H=SIGNED NUMERIC VALUE (VALUE LIST WILL BE CHECKED)
			     C	;				   ; 2000H=SIMPLE STRING(VALUE LIST WILL BE CHECKED)
			     C	;				   ; 1000H=DATE STRING (VALUE LIST WON'T BE CHECKED)
			     C	;				   ; 0800H=TIME STRING (VALUE LIST WON'T BE CHECKED)
			     C	;				   ; 0400H=COMPLEX LIST (VALUE LIST WON'T BE CHECKED)
			     C	;				   ; 0200H=FILE SPEC (VALUE LIST WON'T BE CHECKED)
			     C	;				   ; 0100H=DRIVE ONLY (VALUE LIST WON'T BE CHECKED)
			     C	;				   ; 0080H=QUOTED STRING (VALUE LIST WON'T BE CHECKED)
			     C	;				   ; 0010H=IGNORE ":" AT END IN MATCH
			     C	;				   ; 0002H=REPEATS ALLOWED
			     C	;				   ; 0001H=OPTIONAL
			     C	;	   DW	   FUNCTION_FLAGS
			     C	;				   ; 0001H=CAP RESULT BY FILE TABLE
			     C	;				   ; 0002H=CAP RESULT BY CHAR TABLE
			     C	;				   ; 0010H=REMOVE ":" AT END
			     C	; (tm10)			   ; 0020H=colon is not necessary for switch
			     C	;	   DW	   RESULT	   ; RESULT BUFFER
			     C	;	   DW	   VALUES	   ; VALUE LISTS
			     C	;	   DB	   nid		   ; NUMBER OF KEYWORD/SWITCH SYNONYMS IN FOLLOWING LIST
			     C	;	   DB	   "...",0         ; IF n >0, KEYWORD 1
			     C	;	   :
			     C	;
			     C	;Note:
			     C	;    - The MATCH_FLAG is bit significant. You can set, for example, TIME bit and
			     C	;      DATE bit simalteniously.
			     C	;
			     C	;      The parser examins each bit along with the following priority.
			     C	;
			     C	;      COMPLEX -> DATE -> TIME -> NUMERIC VAL -> SIGNED NUMERIC VAL -> DRIVE ->
			     C	;      FILE SPEC -> SIMPLE STRING.
			     C	;
			     C	;
			     C	;    - When the FUNCTION_FLAG is 0001 or 0002, the STRING pointed to by a pointer
			     C	;      in the result buffer is capitalized.
			     C	;
			     C	;    - Match_Flags 0001H and 0002H have meaning only for the positional.
			     C	;
			     C	;
			     C	;    - The "...",0 (bottom most line) does require '=' or '/'. When you need a
			     C	;      switch, for example, '/A', then STRING points to;
			     C	;
			     C	;			DB    1 	; number of following synonyms
			     C	;			DB   '/A',0
			     C	;
			     C	;      When you need a keyword, for example, 'CODEPAGE=', then "...",0 will be;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-8


			     C	;
			     C	;			DB    1 	; number of following synonyms
			     C	;			DB   'CODEPAGE=',0
			     C	;
			     C	;
			     C	;    - "..." must consist of upper case characters only because the parser
			     C	;      performs pattern matching after converting input to upper case (by
			     C	;      using the current country upper case table)
			     C	;
			     C	;
			     C	;    - One "..." can contain only one switch or keyword. If you need, for
			     C	;      example /A and /B, the format will be;
			     C	;
			     C	;			DB    2 	; number of following synonyms
			     C	;			DB    '/A',0
			     C	;			DB    '/B',0
			     C	;---------------------------------------------------------------------------------------------------
				------
			     C	
			     C	;**** Match_Flags
			     C	
 = 8000                      C	$P_Num_Val	   equ	8000h		;AN000; Numeric Value
 = 4000                      C	$P_SNum_Val	   equ	4000h		;AN000; Signed numeric value
 = 2000                      C	$P_Simple_S	   equ	2000h		;AN000; Simple string
 = 1000                      C	$P_Date_S	   equ	1000h		;AN000; Date string
 = 0800                      C	$P_Time_S	   equ	0800h		;AN000; Time string
 = 0400                      C	$P_Cmpx_S	   equ	0400h		;AN000; Complex string
 = 0200                      C	$P_File_Spc	   equ	0200h		;AN000; File Spec
 = 0100                      C	$P_Drv_Only	   equ	0100h		;AN000; Drive Only
 = 0080                      C	$P_Qu_String	   equ	0080h		;AN000; Quoted string
 = 0010                      C	$P_Ig_Colon	   equ	0010h		;AN000; Ignore colon at end in match
 = 0002                      C	$P_Repeat	   equ	0002h		;AN000; Repeat allowed
 = 0001                      C	$P_Optional	   equ	0001h		;AN000; Optional
			     C	
			     C	;**** Function flags
			     C	
 = 0001                      C	$P_CAP_File	   equ	0001h		;AN000; CAP result by file table
 = 0002                      C	$P_CAP_Char	   equ	0002h		;AN000; CAP result by character table
 = 0010                      C	$P_Rm_Colon	   equ	0010h		;AN000; Remove ":" at the end
 = 0020                      C	$P_colon_is_not_necessary equ 0020h	;AN000;(tm10) /+10 and /+:10
			     C	
			     C	;-------------------------------- Control block structure
			     C	$P_Control_Blk	   struc		;AN000;
 0000  0000                  C	$P_Match_Flag	   dw	0		;AN000; Controls type matched
 0002  0000                  C	$P_Function_Flag   dw	0		;AN000; Function should be taken
 0004  0000                  C	$P_Result_Buf	   dw	0		;AN000; Result buffer address
 0006  0000                  C	$P_Value_List	   dw	0		;AN000; Value list address
 0008  00                    C	$P_nid		   db	0		;AN000; # of keyword/SW synonyms
 0009  00                    C	$P_KeyorSW	   db	0		;AN000; keyword or sw
 000A                        C	$P_Control_Blk	   ends 		;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-9


			     C			   PAGE 		;AN000;
			     C	;---------------------------------------------------------------------------------------------------
				------
			     C	; << Value List Definition >>
			     C	;
			     C	;VALUES 	LABEL	BYTE
			     C	;		DB	nval			; NUMBER OF VALUE DEFINITIONS (0 - 3)
			     C	;	     Ú
			     C	;	     ³	DB	nrng			; NUMBER OF RANGES
			     C	;	     ³ ÚDB	ITEM_TAG		; RETURN VALUE IF RANGE MATCHED
			     C	;	     ³ ÀDD	X,Y			; RANGE OF VALUES
			     C	;	     ³	:
			     C	;	     ³	DB	nnval			; NUMBER OF CHOICES
			     C	;	     ³ ÚDB	ITEM_TAG		; RETURN VALUE IF NUMBER CHOICE MATCHED
			     C	;	     ³ ÀDD	VALUE			; SPECIFIC CHOICE IF NUMBER
			     C	;	     ³	:
			     C	;	     ³	DB	nstrval 		; NUMBER OF CHOICES
			     C	;	     ³ ÚDB	ITEM_TAG		; RETURN VALUE IF STRING CHOICE MATCHED
			     C	;	     ³ ÀDW	STRING			; SPECIFIC CHOICE IF STING
			     C	;	     À	:
			     C	;
			     C	;STRING 	DB	"...",0                 ; ASCIIZ STRING IMAGE
			     C	;
			     C	;Note:
			     C	;    - ITEM_TAG must not be 0FFH, which will be used in the result buffer
			     C	;      when no choice lists are provided.
			     C	;
			     C	;    - STRING must consist of upper case characters only because the parser
			     C	;      performs pattern matching after converting input to upper case (by
			     C	;      using the current country upper case table)
			     C	;---------------------------------------------------------------------------------------------------
				------
			     C	
 = 0000                      C	$P_nval_None	   equ	0		;AN000; no value list ID
 = 0001                      C	$P_nval_Range	   equ	1		;AN000; range list ID
 = 0002                      C	$P_nval_Value	   equ	2		;AN000; value list ID
 = 0003                      C	$P_nval_String	   equ	3		;AN000; string list ID
 = 0009                      C	$P_Len_Range	   equ	9		;AN000; Length of a range choice(two DD plus one DB)
 = 0005                      C	$P_Len_Value	   equ	5		;AN000; Length of a value choice(one DD plus one DB)
 = 0003                      C	$P_Len_String	   equ	3		;AN000; Length of a string choice(one DW plus one DB)
 = 0000                      C	$P_No_nrng	   equ	0		;AN000; (tm07) no nrng. nnval must not be 0.
			     C	
			     C	$P_Val_List	   struc		;AN000;
 0000  00                    C	$P_NumofList	   db	0		;AN000; number of following choice
 0001  0000                  C	$P_Val_XL	   dw	0		;AN000; lower word of value
 0003  0000                  C	$P_Val_XH	   dw	0		;AN000; higher word of value
 0005  0000                  C	$P_Val_YL	   dw	0		;AN000; lower word of another value
 0007  0000                  C	$P_Val_YH	   dw	0		;AN000; higher word of another value
 0009                        C	$P_Val_List	   ends 		;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-10


			     C			   PAGE 		;AN000;
			     C	;---------------------------------------------------------------------------------------------------
				------
			     C	; << Result Buffer Definition  >>
			     C	;
			     C	;RESULT 	LABEL	BYTE			; BELOW FILLED IN FOR DEFAULTS
			     C	;		DB	type			; TYPE RETURNED: 0=RESERVED,
			     C	;						;	1=NUMBER, 2=LIST INDEX,
			     C	;						;	3=STRING, 4=COMPLEX,
			     C	;						;	5=FILESPEC, 6=DRIVE
			     C	;						;	7=DATE, 8=TIME
			     C	;						;	9=QUOTED STRING
			     C	;		DB	ITEM_TAG		; MATCHED ITEM TAG
			     C	;
			     C	;		dw	synonym@		; es:@ points to found SYNONYM if provided.
			     C	;
			     C	;
			     C	;	    Ú	DD	n			; VALUE IF NUMBER
			     C	;	    ³ or
			     C	;	    ³	DW	i			; INDEX (OFFSET) INTO VALUE LIST
			     C	;	    ³					; (ES presents Segment address)
			     C	;	    ³ or
			     C	;	    ³	DD	STRING			; OFFSET OF STRING VALUE
			     C	;	    ³ or
			     C	;	    ³	DB	drv			; DRIVE NUMBER (1-A, 2-B,..., 26-Z)
			     C	;	    ³ or
			     C	;	    ³	DW	YEAR	   ;(1980-2099)  IN CASE OF DATE
			     C	;	    ³	DB	MONTH	   ;(1-12)	 Note: Range check is not performed.
			     C	;	    ³	DB	DATE	   ;(1-31)	       0 is filled when the corresponding field was 
				not specified.
			     C	;	    ³ or
			     C	;	    ³	DB	HOUR	   ;(0-23)	  IN CASE OF TIME
			     C	;	    ³	DB	MINUTES    ;(0-59)	  Note: Range check is not performed .
			     C	;	    ³	DB	SECONDS    ;(0-59)		0 is filled when the corresponding field was
				 not specified .
			     C	;	    ³	DB	HUNDREDTHS ;(0-99)
			     C	;	    À
			     C	;
			     C	;
			     C	;Note: ITEM_TAG is 0FFH when the caller does not specify the choice
			     C	;      list.
			     C	;
			     C	;      YEAR: If the input value for the year is less than 100, parser
			     C	;	     adds 1900 to it.  For example, when 87 is input to parser for
			     C	;	     the year value, he returns 1987.
			     C	;---------------------------------------------------------------------------------------------------
				------
			     C	
			     C	;-------------------------------- Result block structure
			     C	$P_Result_Blk	   struc		;AN000;
 0000  00                    C	$P_Type 	   db	0		;AN000; Type returned
 0001  00                    C	$P_Item_Tag	   db	0		;AN000; Matched item tag
 0002  0000                  C	$P_SYNONYM_Ptr	   dw	0		;AN000; pointer to Synonym list returned
 0004  00 00 00 00           C	$P_Picked_Val	   db	0,0,0,0 	;AN000; value
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-11


 0008                        C	$P_Result_Blk	   ends 		;AN000;
			     C	;--------------------------------
			     C	;**** values for the type field in the result block
			     C	
 = 0000                      C	$P_EOL		   equ	0		;AN000; End of line
 = 0001                      C	$P_Number	   equ	1		;AN000; Number
 = 0002                      C	$P_List_Idx	   equ	2		;AN000; List Index
 = 0003                      C	$P_String	   equ	3		;AN000; String
 = 0004                      C	$P_Complex	   equ	4		;AN000; Complex
 = 0005                      C	$P_File_Spec	   equ	5		;AN000; File Spec
 = 0006                      C	$P_Drive	   equ	6		;AN000; Drive
 = 0007                      C	$P_Date_F	   equ	7		;AN000; Date
 = 0008                      C	$P_Time_F	   equ	8		;AN000; Time
 = 0009                      C	$P_Quoted_String   equ	9		;AN000; Quoted String
			     C	
 = 00FF                      C	$P_No_Tag	   equ	0FFH		;AN000; No ITEM_TAG found
			     C	;**** Return code
			     C	;
			     C	; following return code will be returned in the AX register.
			     C	
 = 0000                      C	$P_No_Error	   equ	0		;AN000; No error
 = 0001                      C	$P_Too_Many	   equ	1		;AN000; Too many operands
 = 0002                      C	$P_Op_Missing	   equ	2		;AN000; Required operand missing
 = 0003                      C	$P_Not_In_SW	   equ	3		;AN000; Not in switch list provided
 = 0004                      C	$P_Not_In_Key	   equ	4		;AN000; Not in keyword list provided
 = 0006                      C	$P_Out_Of_Range    equ	6		;AN000; Out of range specified
 = 0007                      C	$P_Not_In_Val	   equ	7		;AN000; Not in value list provided
 = 0008                      C	$P_Not_In_Str	   equ	8		;AN000; Not in string list provided
 = 0009                      C	$P_Syntax	   equ	9		;AN000; Syntax error
 =-0001                      C	$P_RC_EOL	   equ	-1		;AN000; End of command line
			     C	
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-12


			     C			   PAGE 		;AN000;
			     C	;********************** Local Data *************************************
 0000  0000                  C	$P_ORDINAL	   dw	0		;AN000; Operand ordinal save area
 0002  0000                  C	$P_RC		   dw	0		;AN000; Return code from parser
 0004  0000                  C	$P_SI_Save	   dw	0		;AN000; Pointer of command buffer
 0006  0000                  C	$P_DX		   dw	0		;AN000; Return result buffer address
 0008  00                    C	$P_Terminator	   db	0		;AN000; Terminator code (ASCII)
 0009  0000                  C	$P_DBCSEV_OFF	   dw	0		;AN000; Offset of DBCS EV
 000B  0000                  C	$P_DBCSEV_SEG	   dw	0		;AN000; Segment of DBCS EV
 000D  0000                  C	$P_Flags	   dw	0		;AN000; Parser internal flags
 = 000D                      C	$P_Flags1	   equ	byte ptr $P_Flags ;AN038; to reference first byte flags
 = 000E                      C	$P_Flags2	   equ	byte ptr $P_Flags+1 ;AN038; to reference second byte flags only
			     C	
			     C	;in second byte of $P_Flags, referenced as $P_Flags2:
 = 0001                      C	$P_equ		   equ	01h	      ;AN000; "=" packed in string buffet
 = 0002                      C	$P_Neg		   equ	02h	      ;AN000; Negative value
 = 0004                      C	$P_Time12	   equ	04h	      ;AN000; set when PM is specified
 = 0008                      C	$P_Key_Cmp	   equ	08h	      ;AN000; set when keyword compare
 = 0010                      C	$P_SW_Cmp	   equ	10h	      ;AN000; set when switch compare
 = 0020                      C	$P_Extra	   equ	20h	      ;AN000; set when extra delimiter found
 = 0040                      C	$P_SW		   equ	40h	      ;AN000; set when switch found (tm08)
 = 0080                      C	$P_Signed	   equ	80h	      ;AN000; signed numeric specified
			     C	
			     C	;in first byte of $P_Flags, referenced as $P_Flags1:
 = 0001                      C	$P_time12am	   equ	01h	      ;AN038; set when AM is specified on time
 = 0002                      C	$P_TIME_AGAIN	   EQU	02H	      ;AN039; SET WHEN READY TO RE-PARSE TIME
			     C	
 000F  0000                  C	$P_SaveSI_Cmpx	   dw	0		;AN000; save si for later use by complex
 0011  0000                  C	$P_KEYorSW_Ptr	   dw	0		;AN000; points next to "=" or ":" code
 0013  0000                  C	$P_Save_EOB	   dw	0		;AN000; save pointer to EOB
 0015  0000                  C	$P_Found_SYNONYM   dw	0		;AN000; es:@ points to found synonym
			     C	
 0017  0080[                 C	$P_STRING_BUF	   db	128 dup(0)	;AN000; Pick a operand from command line
	   00                C	
			 ]   C	
			     C	
 = 0097                      C	$P_STRING_BUF_END  equ	$		;AN000;
 0097  FF                    C	$P_Char_CAP_Ptr    db	0ffh		;AN000; info id
 0098  0000                  C			   dw	0		;AN000; offset	of char case map table
 009A  0000                  C			   dw	0		;AN000; segment of char case map table
			     C	IF		   CAPSW		;AN000;(Check if uppercase conversion is supported)
 009C  FF                    C	$P_File_CAP_Ptr    db	0ffh		;AN000; info id
 009D  0000                  C			   dw	0		;AN000; offset	of file case map table
 009F  0000                  C			   dw	0		;AN000; segment of file case map table
			     C	ENDIF					;AN000;(of CAPSW)
			     C	; (tm06) IF	   FileSW		;AN000;(Check if file spec is supported)
			     C	IF		   FileSW+DrvSW 	;AN000;(Check if file spec is supported)
 00A1  5B 5D 7C 3C 3E 2B     C	$P_FileSp_Char	   db	'[]|<>+=;"'     ;AN000; delimitter of file spec
       3D 3B 22              C	
 = 0009                      C	$P_FileSp_Len	   equ	$-$P_FileSp_Char ;AN000;
			     C	ENDIF					;AN000;(of FileSW)
			     C	; (tm05) IF	   QusSW		;AN000;(Check if quoted string is supported)
			     C	;(deleted ;AN025;) IF		      QusSW+CmpxSW	   ; (tm05) ;AN000;(Check if quoted string i
				s supported)
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-13


			     C	;(deleted ;AN025;) $P_SorD_Quote      db   0		   ;AN000; keep double or single quote
			     C	;(deleted ;AN025;) ENDIF				   ;AN000;(of QueSW)
			     C	
			     C	; delimiter parsing
 = 0001                      C	$P_colon_period    equ	01		;AN032; check for colon & period
 = 0002                      C	$P_period_only	   equ	02		;AN032; check only for period
			     C	
			     C	;filespec error flag
 00AA  00                    C	$P_err_flag	   db	00		;AN033; flag set if filespec parsing error
			     C						;AN033;  was detected.
 = 0001                      C	$P_error_filespec  equ	01		;AN033; mask to set flag
			     C	;***********************************************************************
					INCLUDE PARSE.ASM		;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-14


			     C		PAGE				;AN000;
			     C	;  $SALUT (4,4,8,41)
			     C	;(deleted).XLIST
			     C	;(deleted)INCLUDE   STRUC.INC ;AN020;structured macro definitions for .IF,.ELSE etc.
			     C	;(deleted).LIST
			     C	;
			     C	; NOTE:   basesw must be set properly to allow the PARSER to access psdata.
			     C	;	   - basesw undefined	 means	 CS seg. override for psdata access.
			     C	;	   - basesw = 1 	 means	 DS seg. override for psdata access &
			     C	;					 DS must point to psdata.
			     C	;	   - basesw = 0 	 means	 ES seg. override for psdata access &
			     C	;					 ES must point to psdata.
			     C	;
			     C	;
			     C	ELSE					;AN022;
			     C	   IF  basesw				;AN022;IF "basesw  EQU  1" specified by caller THEN
 =                           C	       psdata_seg EQU	DS		;AN022;
			     C	   ENDIF				;AN022;
			     C	ENDIF					;AN022;
			     C	
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-15


			     C	   PAGE 				;AN000;
			     C	;***********************************************************************
			     C	; SysParse;
			     C	;
			     C	;  Function : Parser Entry
			     C	;
			     C	;  Input: DS:SI -> command line
			     C	;	  ES:DI -> parameter block
			     C	;	  psdata_seg -> psdata.inc
			     C	;	  CX = operand ordinal
			     C	;
			     C	;	  Note:  ES is the segment containing all the control blocks defined
			     C	;		 by the caller, except for the DOS COMMAND line parms, which
			     C	;		 is in DS.
			     C	;
			     C	;  Output: CY = 1   error of caller, means invalid parameter block or
			     C	;		    invalid value list. But this parser does NOT implement
			     C	;		    this feature. Therefore CY always zero.
			     C	;
			     C	;	   CY = 0   AX = return code
			     C	;		    BL = terminated delimiter code
			     C	;		    CX = new operand ordinal
			     C	;		    SI = set past scaned operand
			     C	;		    DX = selected result buffer
			     C	;
			     C	; Use:	$P_Skip_Delim, $P_Chk_EOL, $P_Chk_Delim, $P_Chk_DBCS
			     C	;	$P_Chk_Swtch, $P_Chk_Pos_Control, $P_Chk_Key_Control
			     C	;	$P_Chk_Sw_Control, $P_Fill_Result
			     C	;
			     C	; Vars: $P_Ordinal(RW), $P_RC(RW), $P_SI_Save(RW), $P_DX(R), $P_Terminator(R)
			     C	;	$P_SaveSI_Cmpx(W), $P_Flags(RW), $P_Found_SYNONYM(R), $P_Save_EOB(W)
			     C	;
			     C	;-------- Modification History -----------------------------------------
			     C	;
			     C	;  4/04/87 : Created by K. K,
			     C	;  4/28/87 : $P_Val_YH assemble error (tm01)
			     C	;	   : JMP SHORT assemble error (tm02)
			     C	;  5/14/87 : Someone doesn't want to include psdata (tm03)
			     C	;  6/12/87 : $P_Bridge is missing when TimeSw equ 0 and (CmpxSw equ 1 or
			     C	;	     DateSW equ 1)	      (tm04)
			     C	;  6/12/87 : $P_SorD_Quote is missing when QusSw equ 0 and CmpxSW equ 1
			     C	;				      (tm05) in PSDATA.INC
			     C	;  6/12/87 : $P_FileSp_Char and $P_FileSP_Len are missing
			     C	;	     when FileSW equ 0 and DrvSW equ 1 (tm06) in PSDATA.INC
			     C	;  6/18/87 : $VAL1 and $VAL3, $VAL2 and $VAL3 can be used in the same
			     C	;	     value-list block	      (tm07)
			     C	;  6/20/87 : Add $P_SW to check if there's an omiting parameter after
			     C	;	     switch (keyword) or not. If there is, backup si for next call
			     C	;	     (tm08)
			     C	;  6/24/87 : Complex Item checking does not work correctly when CmpSW equ 1
			     C	;	     and DateSW equ 0 and TimeSW equ 0 (tm09)
			     C	;  6/24/87 : New function flag $P_colon_is_not_necessary for switch
			     C	;	     /+15 and /+:15 are allowed for user (tm10)
			     C	;  6/29/87 : ECS call changes DS register but it causes the address problem
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-16


			     C	;	     in user's routines. $P_Chk_DBCS (tm11)
			     C	;  7/10/87 : Switch with no_match flag (0x0000H) does not work correctly
			     C	;					  (tm12)
			     C	;  7/10/87 : Invalid switch/keyword does not work correctly
			     C	;					  (tm13)
			     C	;  7/10/87 : Drive_only breaks 3 bytes after the result buffer
			     C	;					  (tm14)
			     C	;  7/12/87 : Too_Many_Operands sets DX=0 as the PARSE result
			     C	;					  (tm15)
			     C	;  7/24/87 : Negative lower bound on numeric ranges cause trouble
			     C	
			     C	;  7/24/87 : Quoted strings being returned with quotes.
			     C	
			     C	;  7/28/87 : Kerry S (;AN018;)
			     C	;	     Non optional value on switch (match flags<>0 and <>1) not flagged
			     C	;	     as an error when missing.	Solution: return error 2.  Modules
			     C	;	     affected: $P_Chk_SW_Control.
			     C	
			     C	;  7/29/87 : Kerry S (;AN019;)
			     C	;	     Now allow the optional bit in match flags for switches.  This
			     C	;	     allows the switch to be encountered with a value or without a
			     C	;	     value and no error is returned.
			     C	;
			     C	
			     C	;  8/28/87 : Ed K, Kerry S (;AN020;)
			     C	;  9/14/87   In PROC $P_Get_DecNum, when checking for field separators
			     C	;	     within a date response, instead of checking just for the one
			     C	;	     character defined by the COUNTRY DEPENDENT INFO, check for
			     C	;	     all three chars, "-", "/", and ".". Change $P_Chk_Switch to allow
			     C	;	     slashes in date strings when DateSw (assembler switch) is set.
			     C	
			     C	;  9/1/87  : Kerry S (;AN021)
			     C	;	     In PROC $P_String_Comp, when comparing the switch or keyword on
			     C	;	     the command line with the string in the control block the
			     C	;	     comparing was stopping at a colon (switch) or equal (keyword)
			     C	;	     on the command line and assuming a match.	This allowed a shorter
			     C	;	     string on the command line than in the synonym list in the control
			     C	;	     block.  I put in a test for a null in the control block so the
			     C	;	     string in the control block must be the same length as the string
			     C	;	     preceeding the colon or equal on the command line.
			     C	
			     C	;  8/28/87 : Kerry S (;AN022;)
			     C	;	     All references to data in PSDATA.INC had CS overrides.  This caused
			     C	;	     problems for people who included it themselves in a segment other
			     C	;	     than CS.  Added switch to allow including PSDATA.INC in any
			     C	;	     segment.
			     C	
			     C	;  9/16/87 : Ed K (;AN023;) PTM1040
			     C	;	     in $p_set_cdi PROC, it assumes CS points to psdata. Change Push CS
			     C	;	     into PUSH PSDATA_SEG.  In $P_Get_DecNum PROC, fix AN020
			     C	;	     forced both TIME and DATE to use the delims, "-","/",".".
			     C	;	     Created FLag, in $P_time_Format PROC, to request the delim in
			     C	;	     BL be used if TIME is being parsed.
			     C	
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-17


			     C	;  9/24/87 : Ed K
			     C	;	     Removed the include to STRUC.INC.	Replaced the STRUC macro
			     C	;	     invocations with their normally expanded code; made comments
			     C	;	     out of the STRUC macro invocation statements to maintain readability.
			     C	
			     C	;  9/24/87 : Ed K (;AN024;) PTM1222
			     C	;	     When no CONTROL for a keyword found, tried to fill in RESULT
			     C	;	     pointed to by non-existant CONTROL.
			     C	
			     C	; 10/15/87 : Ed K (;AN025;) PTM1672
			     C	;	     A quoted text string can be framed only by double quote.  Remove
			     C	;	     support to frame quoted text string with single quote.
			     C	;	     (apostrophe) $P_SorD_Quote is removed from PSDATA.INC.
			     C	;	     $P_SQuote EQU also removed from PSDATA.INC.  Any references to
			     C	;	     single quote in PROC prologues are left as is for history reasons.
			     C	
			     C	;	     This fixes another bug, not mentioned in p1672, in that two
			     C	;	     quote chars within a quoted string is supposed to be reported as
			     C	;	     one quote character, but is reported as two quotes.  This changed
			     C	;	     two instructions in PROC $P_Quoted_Str.
			     C	
			     C	;	     Also fixed are several JMP that caused a NOP, these changed to
			     C	;	     have the SHORT operator to avoid the unneeded NOP.
			     C	
			     C	;	     The code and PSDATA.INC have been aligned for ease of reading.
			     C	
			     C	; 10/26/87 : Ed K (;AN026;) PTM2041, DATE within SWITCH, BX reference to
			     C	;	     psdata buffer should have psdata_seg.
			     C	
			     C	; 10/27/87 : Ed K (;AN027;) PTM2042 comma between keywords implies
			     C	;	     positional missing.
			     C	
			     C	; 11/06/87 : Ed K (;AN028;) PTM 2315 Parser should not use line feed
			     C	;	     as a line delimiter, should use carriage return.
			     C	;	     Define switch: LFEOLSW, if on, accept LF as end of line char.
			     C	
			     C	; 11/11/87 : Ed K (;AN029;) PTM 1651 GET RID OF WHITESPACE AROUND "=".
			     C	
			     C	; 11/18/87 : Ed K (;AN030;) PTM 2551 If filename is just "", then
			     C	;	     endless loop since SI is returned still pointing to start
			     C	;	     of that parm.
			     C	
			     C	; 11/19/87 : Ed K (;AN031;) PTM 2585 date & time getting bad values.
			     C	;	     Vector to returned string has CS instead of Psdata_Seg, but
			     C	;	     when tried to fix it on previous version, changed similar
			     C	;	     but wrong place.
			     C	
			     C	; 12/09/87 : Bill L (;AN032;) PTM 2772 colon and period are now valid
			     C	;	     delimiters between hours, minutes, seconds for time. And period
			     C	;	     and comma are valid delimiters between seconds and 100th second.
			     C	
			     C	; 12/14/87 : Bill L (;AN033;) PTM 2722 if illegal delimiter characters
			     C	;	     in a filespec, then flag an error.
			     C	
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-18


			     C	; 12/22/87 : Bill L (;AN034;)	    All local data to parser is now
			     C	;	     indexed off of the psdata_seg equate instead of the DS register.
			     C	;	     Using this method, DS can point to the segment of PSP or to psdata
			     C	;  -->	     local parser data. Why were some references to local data changed
			     C	;	     to do this before, but not all ?????
			     C	
			     C	; 02/02/88 : Ed K (;AC035;) INSPECT utility, suggests optimizations.
			     C	
			     C	; 02/05/88 : Ed K (;AN036;) P3372-UPPERCASE TRANSLATION, PSDATA_SEG HOSED.
			     C	;
			     C	; 02/08/88 : Ed K (;AN037;) P3410-AVOID POP OF CS, CHECK BASESW FIRST.
			     C	
			     C	; 02/19/88 : Ed K (;AN038;) p3524 above noon and "am" should be error
			     C	
			     C	; 02/23/88 : Ed K (;AN039;) p3518 accept "comma" and "period" as decimal
			     C	;	     separator in TIME before hundredths field.
			     C	;
			     C	;***********************************************************************
			     C	ELSE					;AN000;
 00AB                        C	SysParse proc near			;AN000;
			     C	ENDIF					;AN000;(of FarSW)
			     C	;	$SALUT	(4,9,17,41)
 00AB  C7 06 000D R 0000     C		mov	psdata_seg:$P_Flags,0	;AC034; Clear all internal flags
 00B1  FC                    C		cld				      ;AN000; confirm forward direction
 00B2  89 0E 0000 R          C		mov	psdata_seg:$P_ordinal,cx      ;AC034; save operand ordinal
 00B6  C7 06 0002 R 0000     C		mov	psdata_seg:$P_RC,$P_No_Error  ;AC034; Assume no error
 00BC  C7 06 0015 R 0000     C		mov	psdata_seg:$P_Found_SYNONYM,0 ;AC034; initalize synonym pointer
			     C	
 00C2  C7 06 0006 R 0000     C		mov	word ptr psdata_seg:$P_DX,0   ;AC034; (tm15)
 00C8  E8 05B6 R             C		call	$P_Skip_Delim		;AN000; Move si to 1st non white space
 00CB  73 13                 C		jnc	$P_Start		;AN000; If EOL is not encountered, do parse
			     C	
			     C	;--------------------------- End of Line
 00CD  B8 FFFF               C		mov	ax,$P_RC_EOL		;AN000; set exit code to -1
 00D0  53                    C		push	bx			;AN000;
 00D1  26: 8B 1D             C		mov	bx,es:[di].$P_PARMSX_Address ;AN000; Get the PARMSX address to
 00D4  26: 3A 0F             C		cmp	cl,es:[bx].$P_MinP	;AN000; check ORDINAL to see if the minimum
 00D7  73 03                 C		jae	$P_Fin			;AN000; positional found.
			     C	
 00D9  B8 0002               C		mov	ax,$P_Op_Missing	;AN000; If no, set exit code to missing operand
 00DC                        C	$P_Fin: 				;AN000;
 00DC  5B                    C		pop	bx			;AN000;
 00DD  E9 01E7 R             C		jmp	$P_Single_Exit		;AN000; return to the caller
			     C	
			     C	;---------------------------
 00E0                        C	$P_Start:				;AN000;
 00E0  89 36 000F R          C		mov	psdata_seg:$P_SaveSI_Cmpx,si ;AN000;AC034;  save ptr to command line for later use b
				y complex,
 00E4  53                    C		push	bx			;AN000; quoted string or file spec.
 00E5  57                    C		push	di			;AN000;
 00E6  55                    C		push	bp			;AN000;
 00E7  8D 1E 0017 R          C		lea	bx,psdata_seg:$P_STRING_BUF ;AC034; set buffer to copy from command string
 00EB  F6 06 000E R 20       C		test	psdata_seg:$P_Flags2,$P_Extra ;AC034; 3/9 extra delimiter encountered ?
 00F0  75 3E                 C		jne	$P_Pack_End		;AN000; 3/9 if yes, no need to copy
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-19


			     C	
 00F2                        C	$P_Pack_Loop:				;AN000;
 00F2  AC                    C		lodsb				;AN000; Pick a operand from buffer
 00F3  E8 066C R             C		call	$P_Chk_Switch		;AN000; Check switch character
 00F6  72 37                 C		jc	$P_Pack_End_BY_EOL	;AN020; if carry set found delimiter type slash, need backup
				 si, else continue
			     C	
 00F8  E8 05DA R             C		call	$P_Chk_EOL		;AN000; Check EOL character
 00FB  74 32                 C		je	$P_Pack_End_BY_EOL	;AN000; need backup si
			     C	
 00FD  E8 0610 R             C		call	$P_Chk_Delim		;AN000; Check delimiter
 0100  75 16                 C		jne	$P_PL01 		;AN000; If no, process next byte
			     C	
 0102  F6 06 000E R 20       C		test	psdata_seg:$P_Flags2,$P_Extra ;AC034; 3/9 If yes and white spec,
			     C	; (tm08)jne	$P_Pack_End		;AN000; 3/9 then
 0107  75 05                 C		jne	$P_Pack_End_backup_si	;AN000; (tm08)
			     C	
 0109  E8 05B6 R             C		call	$P_Skip_Delim		;AN000; skip subsequent white space,too
 010C  EB 22                 C		jmp	short $P_Pack_End	;AN000; finish copy by placing NUL at end
			     C	
 010E                        C	$P_PAck_End_backup_si:			;AN000; (tm08)
 010E  F6 06 000E R 41       C		test	psdata_seg:$P_Flags2,$P_SW+$P_equ ;AN000;AC034;  (tm08)
 0113  74 1B                 C		je	$P_Pack_End		;AN000; (tm08)
			     C	
 0115  4E                    C		dec	si			;AN000; (tm08)
 0116  EB 18                 C		jmp	short $P_Pack_End	;AN025; (tm08)
			     C	
 0118                        C	$P_PL01:				;AN000;
 0118  88 07                 C		mov	psdata_seg:[bx],al	;AN000; move byte to STRING_BUF
 011A  3C 3D                 C		cmp	al,$P_Keyword		;AN000; if it is equal character,
 011C  75 05                 C		jne	$P_PL00 		;AN000; then
			     C	
 011E  80 0E 000E R 01       C		or	psdata_seg:$P_Flags2,$P_equ ;AC034; remember it in flag
 0123                        C	$P_PL00:				;AN000;
 0123  43                    C		inc	bx			;AN000; ready to see next byte
 0124  E8 0689 R             C		call	$P_Chk_DBCS		;AN000; was it 1st byte of DBCS ?
 0127  73 C9                 C		jnc	$P_Pack_Loop		;AN000; if no, process to next byte
			     C	
 0129  AC                    C		lodsb				;AN000; if yes, store
 012A  88 07                 C		mov	psdata_seg:[bx],al	;AN000;    2nd byte of DBCS
 012C  43                    C		inc	bx			;AN000; update pointer
 012D  EB C3                 C		jmp	short $P_Pack_Loop	;AN000; process to next byte
			     C	
 012F                        C	$P_Pack_End_BY_EOL:			;AN000;
 012F  4E                    C		dec	si			;AN000; backup si pointer
 0130                        C	$P_Pack_End:				;AN000;
 0130  89 36 0004 R          C		mov	psdata_seg:$P_SI_Save,si     ;AC034; save next pointer, SI
 0134  C6 07 00              C		mov	byte ptr psdata_seg:[bx],$P_NULL ;AN000; put NULL at the end
 0137  89 1E 0013 R          C		mov	psdata_seg:$P_Save_EOB,bx    ;AC034; 3/17/87 keep the address for later use of compl
				ex
 013B  26: 8B 1D             C		mov	bx,es:[di].$P_PARMSX_Address ;AN000; get PARMSX address
 013E  8D 36 0017 R          C		lea	si,psdata_seg:$P_STRING_BUF  ;AC034;
 0142  80 3C 2F              C		cmp	byte ptr psdata_seg:[si],$P_Switch ;AN000; the operand begins w/ switch char ?
 0145  74 2C                 C		je	$P_SW_Manager		     ;AN000; if yes, process as switch
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-20


			     C	
 0147  F6 06 000E R 01       C		test	psdata_seg:$P_Flags2,$P_equ   ;AC034; the operand includes equal char ?
 014C  75 50                 C		jne	$P_Key_manager		     ;AN000; if yes, process as keyword
			     C	
 014E                        C	$P_Positional_Manager:			;AN000; else process as positional
 014E  26: 8A 47 01          C		mov	al,es:[bx].$P_MaxP	;AN000; get maxp
 0152  32 E4                 C		xor	ah,ah			;AN000; ax = maxp
 0154  39 06 0000 R          C		cmp	psdata_seg:$P_ORDINAL,ax ;AC034; too many positional ?
 0158  73 11                 C		jae	$P_Too_Many_Error	;AN000; if yes, set exit code to too many
			     C	
 015A  A1 0000 R             C		mov	ax,psdata_seg:$P_ORDINAL ;AC034; see what the current ordinal
 015D  D1 E0                 C		shl	ax,1			;AN000; ax = ax*2
 015F  43                    C		inc	bx			;AC035; add '2' to
 0160  43                    C		inc	bx			;AC035;  BX reg
			     C						;AN000; now bx points to 1st CONTROL
			     C	;(changed ;AC035;) add	   bx,2 	;AN000; now bx points to 1st CONTROL
 0161  03 D8                 C		add	bx,ax			;AN000; now bx points to specified CONTROL address
 0163  26: 8B 1F             C		mov	bx,es:[bx]		;AN000; now bx points to specified CONTROL itself
 0166  E8 01E9 R             C		call	$P_Chk_Pos_Control	;AN000; Do process for positional
 0169  EB 66                 C		jmp	short $P_Return_to_Caller ;AN000; and return to the caller
			     C	
 016B                        C	$P_Too_Many_Error:			;AN000;
 016B  C7 06 0002 R 0001     C		mov	psdata_seg:$P_RC,$P_Too_Many ;AC034; set exit code
 0171  EB 5E                 C		jmp	short $P_Return_to_Caller ;AN000; and return to the caller
			     C	;
 0173                        C	$P_SW_Manager:				;AN000;
 0173  26: 8A 47 01          C		mov	al,es:[bx].$P_MaxP	;AN000; get maxp
 0177  32 E4                 C		xor	ah,ah			;AN000; ax = maxp
 0179  40                    C		inc	ax			;AN000;
 017A  D1 E0                 C		shl	ax,1			;AN000; ax = (ax+1)*2
 017C  03 D8                 C		add	bx,ax			;AN000; now bx points to maxs
 017E  26: 8A 0F             C		mov	cl,es:[bx]		;AN000;
 0181  32 ED                 C		xor	ch,ch			;AN000; cx = maxs
 0183  0B C9                 C		or	cx,cx			;AN000; at least one switch ?
 0185  74 0F                 C		je	$P_SW_Not_Found 	;AN000;
			     C	
 0187  43                    C		inc	bx			;AN000; now bx points to 1st CONTROL address
			     C	
 0188                        C	$P_SW_Mgr_Loop: 			;AN000;
 0188  53                    C		push	bx			;AN000;
 0189  26: 8B 1F             C		mov	bx,es:[bx]		;AN000; bx points to Switch CONTROL itself
 018C  E8 024A R             C		call	$P_Chk_SW_Control	;AN000; do process for switch
 018F  5B                    C		pop	bx			;AN000;
 0190  73 3F                 C		jnc	$P_Return_to_Caller	;AN000; if the CONTROL is for the switch, exit
			     C	
 0192  43                    C		inc	bx			;AC035; add '2' to
 0193  43                    C		inc	bx			;AC035;  BX reg
			     C						;AN000; else bx points to the next CONTROL
			     C	;(changed ;AC035;)  add     bx,2	;AN000; else bx points to the next CONTROL
 0194  E2 F2                 C		loop	$P_SW_Mgr_Loop		;AN000; and loop
			     C	
 0196                        C	$P_SW_Not_Found:			;AN000;
 0196  C7 06 0002 R 0003     C		mov	psdata_seg:$P_RC,$P_Not_In_SW ;AC034; here no CONTROL for the switch has
 019C  EB 33                 C		jmp	short $P_Return_to_Caller0    ;AN000; not been found, means error.
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-21


			     C	;
 019E                        C	$P_Key_Manager: 			;AN000;
 019E  26: 8A 47 01          C		mov	al,es:[bx].$P_MaxP	;AN000; get maxp
 01A2  32 E4                 C		xor	ah,ah			;AN000; ax = maxp
 01A4  40                    C		inc	ax			;AN000;
 01A5  D1 E0                 C		shl	ax,1			;AN000; ax = (ax+1)*2
 01A7  03 D8                 C		add	bx,ax			;AN000; now bx points to maxs
 01A9  26: 8A 07             C		mov	al,es:[bx]		;AN000;
 01AC  32 E4                 C		xor	ah,ah			;AN000; ax = maxs
 01AE  D1 E0                 C		shl	ax,1			;AN000;
 01B0  40                    C		inc	ax			;AN000; ax = ax*2+1
 01B1  03 D8                 C		add	bx,ax			;AN000; now bx points to maxk
 01B3  26: 8A 0F             C		mov	cl,es:[bx]		;AN000;
 01B6  32 ED                 C		xor	ch,ch			;AN000; cx = maxk
 01B8  0B C9                 C		or	cx,cx			;AN000; at least one keyword ?
 01BA  74 0F                 C		je	$P_Key_Not_Found	;AN000;
			     C	
 01BC  43                    C		inc	bx			;AN000; now bx points to 1st CONTROL
			     C	
 01BD                        C	$P_Key_Mgr_Loop:			;AN000;
 01BD  53                    C		push	bx			;AN000;
 01BE  26: 8B 1F             C		mov	bx,es:[bx]		;AN000; bx points to keyword CONTROL itself
 01C1  E8 0218 R             C		call	$P_Chk_Key_Control	;AN000; do process for keyword
 01C4  5B                    C		pop	bx			;AN000;
 01C5  73 0A                 C		jnc	$P_Return_to_Caller	;AN000; if the CONTROL is for the keyword, exit
			     C	
 01C7  43                    C		inc	bx			;AC035; add '2' to
 01C8  43                    C		inc	bx			;AC035;  BX reg
			     C						;AN000; else bx points to the next CONTROL
			     C	;(changed ;AC035;)  add     bx,2	;AN000; else bx points to the next CONTROL
 01C9  E2 F2                 C		loop	$P_Key_Mgr_Loop 	;AN000; and loop
			     C	
 01CB                        C	$P_Key_Not_Found:			;AN000;
 01CB  C7 06 0002 R 0004     C		mov	psdata_seg:$P_RC,$P_Not_In_Key ;AC034; here no CONTROL for the keyword has
 01D1                        C	$P_Return_to_Caller0:			;AN000; not been found, means error.
			     C	
			     C	;(deleted ;AN024;)	 mov	 bx,es:[bx-2]		 ;AN000; (tm13) backup bx
			     C	
			     C	;(deleted ;AN024;)	 mov	 al,$P_String		 ;AN000; Set
			     C	;(deleted ;AN024;)	 mov	 ah,$P_No_Tag		 ;AN000;     result
			     C	;(deleted ;AN024;)	 call	 $P_Fill_Result 	 ;AN000;	    buffer
			     C	
 01D1                        C	$P_Return_to_Caller:			;AN000;
 01D1  5D                    C		pop	bp			;AN000;
 01D2  5F                    C		pop	di			;AN000;
 01D3  5B                    C		pop	bx			;AN000;
 01D4  8B 0E 0000 R          C		mov	cx,psdata_seg:$P_Ordinal    ;AC034; return next ordinal
 01D8  A1 0002 R             C		mov	ax,psdata_seg:$P_RC	    ;AC034; return exit code
 01DB  8B 36 0004 R          C		mov	si,psdata_seg:$P_SI_Save    ;AC034; return next operand pointer
 01DF  8B 16 0006 R          C		mov	dx,psdata_seg:$P_DX	    ;AC034; return result buffer address
 01E3  8A 1E 0008 R          C		mov	bl,psdata_seg:$P_Terminator ;AC034; return delimiter code found
 01E7                        C	$P_Single_Exit: 			;AN000;
 01E7  F8                    C		clc				;AN000;
 01E8  C3                    C		ret				;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-22


 01E9                        C	SysParse endp				;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-23


			     C	PAGE					;AN000;
			     C	;***********************************************************************
			     C	; $P_Chk_Pos_Control
			     C	;
			     C	; Function: Parse CONTROL block for a positional
			     C	;
			     C	; Input:     ES:BX -> CONTROL block
			     C	;	     psdata_seg:SI -> $P_STRING_BUF
			     C	;
			     C	; Output:    None
			     C	;
			     C	; Use:	 $P_Fill_Result, $P_Check_Match_Flags
			     C	;
			     C	; Vars: $P_Ordinal(W), $P_RC(W)
			     C	;***********************************************************************
 01E9                        C	$P_Chk_Pos_Control proc 		;AN000;
 01E9  50                    C		push	ax			;AN000;
 01EA  26: 8B 07             C		mov	ax,es:[bx].$P_Match_Flag ;AN000;
 01ED  A9 0002               C		test	ax,$P_Repeat		;AN000; repeat allowed ?
 01F0  75 04                 C		jne	$P_CPC00		;AN000; then do not increment ORDINAL
			     C	
 01F2  FF 06 0000 R          C		inc	psdata_seg:$P_ORDINAL	;AC034; update the ordinal
 01F6                        C	$P_CPC00:				;AN000;
 01F6  80 3C 00              C		cmp	byte ptr psdata_seg:[si],$P_NULL ;AN000; no data ?
 01F9  75 18                 C		jne	$P_CPC01		;AN000;
			     C	
 01FB  A9 0001               C		test	ax,$P_Optional		;AN000; yes, then is it optional ?
 01FE  75 08                 C		jne	$P_CPC02		;AN000;
			     C	
 0200  C7 06 0002 R 0002     C		mov	psdata_seg:$P_RC,$P_Op_Missing ;AC034; no, then error	     3/17/87
 0206  EB 0E                 C		jmp	short $P_CPC_Exit	;AN000;
			     C	
 0208                        C	$P_CPC02:				;AN000;
 0208  50                    C		push	ax			;AN000;
 0209  B0 03                 C		mov	al,$P_String		;AN000; if it is optional return NULL
 020B  B4 FF                 C		mov	ah,$P_No_Tag		;AN000; no item tag indication
 020D  E8 02A4 R             C		call	$P_Fill_Result		;AN000;
 0210  58                    C		pop	ax			;AN000;
 0211  EB 03                 C		jmp	short $P_CPC_Exit	;AN000;
			     C	
 0213                        C	$P_CPC01:				;AN000;
 0213  E8 0326 R             C		call	$P_Check_Match_Flags	;AN000;
 0216                        C	$P_CPC_Exit:				;AN000;
 0216  58                    C		pop	ax			;AN000;
 0217  C3                    C		ret				;AN000;
 0218                        C	$P_Chk_Pos_Control endp 		;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-24


			     C	PAGE					;AN000;
			     C	;***********************************************************************
			     C	; $P_Chk_Key_Control
			     C	;
			     C	; Function: Parse CONTROL block for a keyword
			     C	;
			     C	; Input:     ES:BX -> CONTROL block
			     C	;	     psdata_seg:SI -> $P_STRING_BUF
			     C	;
			     C	; Output:    CY = 1 : not match
			     C	;
			     C	; Use:	 $P_Fill_Result, $P_Search_KEYorSW, $P_Check_Match_Flags
			     C	;
			     C	; Vars: $P_RC(W), $P_SaveSI_Cmpx(W), $P_KEYorSW_Ptr(R), $P_Flags(W)
			     C	;***********************************************************************
 0218                        C	$P_Chk_Key_Control proc 		;AN000;
			     C	ELSE					;AN000;(of IF KeySW)
 0218  F9                    C		stc				;AN000;this logic works when the KeySW
 0219  C3                    C		ret				;AN000;is reset.
			     C	ENDIF					;AN000;(of KeySW)
 021A                        C	$P_Chk_Key_Control endp 		;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-25


			     C	PAGE					;AN000;
			     C	;***********************************************************************
			     C	IF	KeySW+SwSW			;AN000;(Check if keyword or switch is supported)
			     C	; $P_Search_KEYorSW:
			     C	;
			     C	; Function: Seach specified keyword or switch from CONTROL
			     C	;
			     C	; Input:     ES:BX -> CONTROL block
			     C	;	     psdata_seg:SI -> $P_STRING_BUF
			     C	;
			     C	; Output:    CY = 1 : not match
			     C	;
			     C	; Use:	 $P_String_Comp, $P_MoveBP_NUL, $P_Found_SYNONYM
			     C	;***********************************************************************
 021A                        C	$P_Search_KEYorSW proc			;AN000;
 021A  55                    C		push	bp			;AN000;
 021B  51                    C		push	cx			;AN000;
 021C  26: 8A 4F 08          C		mov	cl,es:[bx].$P_nid	;AN000; Get synonym count
 0220  32 ED                 C		xor	ch,ch			;AN000; and set it to cx
 0222  0B C9                 C		or	cx,cx			;AN000; No synonyms specified ?
 0224  74 0D                 C		je	$P_KEYorSW_Not_Found	;AN000; then indicate not found by CY
			     C	
 0226  8D 6F 09              C		lea	bp,es:[bx].$P_KEYorSW	;AN000; BP points to the 1st synonym
 0229                        C	$P_KEYorSW_Loop:			;AN000;
 0229  E8 045E R             C		call	$P_String_Comp		;AN000; compare string in buffer w/ the synonym
 022C  73 08                 C		jnc	$P_KEYorSW_Found	;AN000; If match, set it to synonym pointer
			     C	
 022E  E8 023E R             C		call	$P_MoveBP_NUL		;AN000; else, bp points to the next string
 0231  E2 F6                 C		loop	$P_KEYorSW_Loop 	;AN000; loop nid times
 0233                        C	$P_KEYorSW_Not_Found:			;AN000;
 0233  F9                    C		stc				;AN000; indicate not found in synonym list
 0234  EB 05                 C		jmp	short $P_KEYorSW_Exit	;AN000; and exit
			     C	
 0236                        C	$P_KEYorSW_Found:			;AN000;
 0236  89 2E 0015 R          C		mov	psdata_seg:$P_Found_SYNONYM,bp ;AC034; set synonym pointer
 023A  F8                    C		clc				;AN000; indicate found
 023B                        C	$P_KEYorSW_Exit:			;AN000;
 023B  59                    C		pop	cx			;AN000;
 023C  5D                    C		pop	bp			;AN000;
 023D  C3                    C		ret				;AN000;
 023E                        C	$P_Search_KEYorSW endp			;AN000;
			     C	;***********************************************************************
			     C	; $P_MoveBP_NUL
			     C	;***********************************************************************
 023E                        C	$P_MoveBP_NUL proc			;AN000;
 023E                        C	$P_MBP_Loop:				;AN000;
 023E  26: 80 7E 00 00       C		cmp	byte ptr es:[bp],$P_NULL ;AN000; Increment BP that points
 0243  74 03                 C		je	$P_MBP_Exit		;AN000; to the synomym list
			     C	
 0245  45                    C		inc	bp			;AN000; until
 0246  EB F6                 C		jmp	short $P_MBP_Loop	;AN000; NULL encountered.
			     C	
 0248                        C	$P_MBP_Exit:				;AN000;
 0248  45                    C		inc	bp			;AN000; bp points to next to NULL
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-26


 0249  C3                    C		ret				;AN000;
 024A                        C	$P_MoveBP_NUL endp			;AN000;
			     C	ENDIF					;AN000;(of KeySW+SwSW)
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-27


			     C	PAGE					;AN000;
			     C	;***********************************************************************
			     C	; $P_Chk_SW_Control
			     C	;
			     C	; Function: Parse CONTROL block for a switch
			     C	;
			     C	; Input:     ES:BX -> CONTROL block
			     C	;	     psdata_seg:SI -> $P_STRING_BUF
			     C	;
			     C	; Output:    CY = 1 : not match
			     C	;
			     C	; Use:	 $P_Fill_Result, $P_Search_KEYorSW, $P_Check_Match_Flags
			     C	;
			     C	; Vars:  $P_SaveSI_Cmpx(W), $P_KEYorSW_Ptr(R), $P_Flags(W)
			     C	;***********************************************************************
 024A                        C	$P_Chk_SW_Control proc			;AN000;
			     C	
			     C	
			     C	IF	SwSW				;AN000;(Check if switch is supported)
 024A  80 0E 000E R 10       C		or	psdata_seg:$P_Flags2,$P_Sw_Cmp ;AC034; Indicate switch for later string comparison
 024F  E8 021A R             C		call	$P_Search_KEYorSW	;AN000; Search the switch in the CONTROL block
 0252  72 42                 C		jc	$P_Chk_SW_Err0		;AN000; not found, then try next CONTROL
			     C	
 0254  80 26 000E R EF       C		and	psdata_seg:$P_Flags2,0ffh-$P_Sw_Cmp ;AC034; reset the indicator previously set
			     C	;
 0259  50                    C		push	ax			;AN000; 	      /switch:
 025A  A1 0011 R             C		mov	ax,psdata_seg:$P_KEYorSW_Ptr ;AC034;	      ^       ^
 025D  2B C6                 C		sub	ax,si			;AN000;  SI	KEYorSW
 025F  01 06 000F R          C		add	psdata_seg:$P_SaveSI_Cmpx,ax ;AC034; update for complex list
 0263  58                    C		pop	ax			;AN000;
			     C	;
 0264  8B 36 0011 R          C		mov	si,psdata_seg:$P_KEYorSW_Ptr ;AC034; set si at the end or colon
 0268  80 3C 00              C		cmp	byte ptr psdata_seg:[si],$P_NULL ;AN000; any data after colon
 026B  75 23                 C		jne	$P_CSW00		;AN000; if yes, process match flags
			     C	
 026D  80 7C FF 3A           C		cmp	byte ptr psdata_seg:[si-1],$P_Colon ;AN000; if no, the switch terminated by colon ?
 0271  75 08                 C		jne	$P_Chk_if_data_required ;AN000; if yes,
			     C	
 0273  C7 06 0002 R 0009     C		mov	psdata_seg:$P_RC,$P_Syntax ;AC034; return syntax error
 0279  EB 1E                 C		jmp	short $P_Chk_SW_Exit	;AN000;
			     C	
 027B                        C	$P_Chk_if_data_required:		;AN018; no data, no colon
 027B  26: 83 3F 00          C		cmp	es:[bx].$P_Match_Flag,0 ;AN018; should have data? zero match flag means switch follo
				wed by nothing is OK
 027F  74 18                 C		je	$P_Chk_SW_Exit		;AN018; match flags not zero so should have something if opt
				ional bit is not on
			     C	
 0281  26: F7 07 0001        C		test	es:[bx].$P_Match_Flag,$P_Optional ;AN019; see if no value is valid
 0286  75 11                 C		jnz	$P_Chk_SW_Exit		;AN019; if so, then leave, else yell
			     C	
 0288  C7 06 0002 R 0002     C		mov	psdata_seg:$P_RC,$P_Op_Missing ;AC034; return required operand missing
 028E  EB 09                 C		jmp	short $P_Chk_SW_Exit	;AN018;
			     C	
 0290                        C	$P_CSW00:				;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-28


 0290  E8 0326 R             C		call	$P_Check_Match_Flags	;AN000; process match flag
 0293  F8                    C		clc				;AN000; indicate match
 0294  EB 0D                 C		jmp	short $P_Chk_SW_Single_Exit ;AN000;
			     C	
 0296                        C	$P_Chk_SW_Err0: 			;AN000;
 0296  F9                    C		stc				;AN000; not found in switch synonym list
 0297  EB 0A                 C		jmp	short $P_Chk_SW_Single_Exit ;AN000;
			     C	
 0299                        C	$P_Chk_SW_Exit: 			;AN000;
 0299  50                    C		push	ax			;AN000;
 029A  B0 03                 C		mov	al,$P_String		;AN000; set
 029C  B4 FF                 C		mov	ah,$P_No_Tag		;AN000;    result
 029E  E8 02A4 R             C		call	$P_Fill_Result		;AN000; 	 buffer
 02A1  58                    C		pop	ax			;AN000;
 02A2  F8                    C		clc				;AN000;
 02A3                        C	$P_Chk_SW_Single_Exit:			;AN000;
 02A3  C3                    C		ret				;AN000;
			     C	ENDIF					;AN000;(of SwSW)
 02A4                        C	$P_Chk_SW_Control endp			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-29


			     C	PAGE					;AN000;
			     C	;***********************************************************************
			     C	; $P_Fill_Result
			     C	;
			     C	; Function: Fill the result buffer
			     C	;
			     C	; Input:    AH = Item tag
			     C	;	    AL = type
			     C	;		  AL = 1: CX,DX has 32bit number (CX = high)
			     C	;		  AL = 2: DX has index(offset) into value list
			     C	;		  AL = 6: DL has driver # (1-A, 2-B, ... , 26 - Z)
			     C	;		  AL = 7: DX has year, CL has month and CH has date
			     C	;		  AL = 8: DL has hours, DH has minutes, CL has secondsn,
			     C	;			  amd CH has hundredths
			     C	;		  AL = else: psdata_seg:SI points to returned string buffer
			     C	;	    ES:BX -> CONTROL block
			     C	;
			     C	; Output:   None
			     C	;
			     C	; Use:	$P_Do_CAPS_String, $P_Remove_Colon, $P_Found_SYNONYM
			     C	;
			     C	; Vars: $P_DX(W)
			     C	;***********************************************************************
 02A4                        C	$P_Fill_Result proc			;AN000;
 02A4  57                    C		push	di			;AN000;
 02A5  26: 8B 7F 04          C		mov	di,es:[bx].$P_Result_Buf ;AN000; di points to result buffer
 02A9  89 3E 0006 R          C		mov	psdata_seg:$P_DX,di	;AC034; set returned result address
 02AD  26: 88 05             C		mov	es:[di].$P_Type,al	;AN000; store type
 02B0  26: 88 65 01          C		mov	es:[di].$P_Item_Tag,ah	;AN000; store item tag
 02B4  50                    C		push	ax			;AN000;
 02B5  A1 0015 R             C		mov	ax,psdata_seg:$P_Found_SYNONYM ;AC034; if yes,
 02B8  26: 89 45 02          C		mov	es:[di].$P_SYNONYM_Ptr,ax ;AN000;   then set it to the result
 02BC  58                    C		pop	ax			;AN000;
 02BD                        C	$P_RLT04:				;AN000;
 02BD  3C 01                 C		cmp	al,$P_Number		;AN000; if number
 02BF  75 0A                 C		jne	$P_RLT00		;AN000;
			     C	
 02C1                        C	$P_RLT02:				;AN000;
 02C1  26: 89 55 04          C		mov	word ptr es:[di].$P_Picked_Val,dx ;AN000; then store 32bit
 02C5  26: 89 4D 06          C		mov	word ptr es:[di+2].$P_Picked_Val,cx ;AN000;	number
 02C9  EB 59                 C		jmp	short $P_RLT_Exit	;AN000;
			     C	
 02CB                        C	$P_RLT00:				;AN000;
 02CB  3C 02                 C		cmp	al,$P_List_Idx		;AN000; if list index
 02CD  75 06                 C		jne	$P_RLT01		;AN000;
			     C	
 02CF  26: 89 55 04          C		mov	word ptr es:[di].$P_Picked_Val,dx ;AN000; then store list index
 02D3  EB 4F                 C		jmp	short $P_RLT_Exit	;AN000;
			     C	
 02D5                        C	$P_RLT01:				;AN000;
 02D5  3C 07                 C		cmp	al,$P_Date_F		;AN000; Date format ?
 02D7  74 E8                 C		je	$P_RLT02		;AN000;
			     C	
 02D9  3C 08                 C		cmp	al,$P_Time_F		;AN000; Time format ?
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-30


 02DB  74 E4                 C		je	$P_RLT02		;AN000;
			     C	;
 02DD  3C 06                 C		cmp	al,$P_Drive		;AN000; drive format ?
 02DF  75 06                 C		jne	$P_RLT03		;AN000;
			     C	
 02E1  26: 88 55 04          C		mov	byte ptr es:[di].$P_Picked_Val,dl ;AN000; store drive number
 02E5  EB 3D                 C		jmp	short $P_RLT_Exit	;AN000;
			     C	
 02E7                        C	$P_RLT03:				;AN000;
 02E7  3C 04                 C		cmp	al,$P_Complex		;AN000; complex format ?
 02E9  75 0E                 C		jne	$P_RLT05		;AN000;
			     C	
 02EB  A1 000F R             C		mov	ax,psdata_seg:$P_SaveSI_Cmpx ;AC034; then get pointer in command buffer
 02EE  40                    C		inc	ax			;AN000; skip left Parentheses
 02EF  26: 89 45 04          C		mov	word ptr es:[di].$P_Picked_Val,ax ;AN000; store offset
 02F3  26: 8C 5D 06          C		mov	word ptr es:[di+2].$P_Picked_Val,ds ;AN000; store segment
 02F7  EB 2B                 C		jmp	short $P_RLT_Exit	;AN000;
			     C	
 02F9                        C	$P_RLT05:				;AN000;
			     C	;------------------------  AL = 3, 5, or 9
 02F9  26: 89 75 04          C		mov	word ptr es:[di].$P_Picked_Val,si ;AN000; store offset of STRING_BUF
			     C	;(replaced ;AN031;)  mov word ptr es:[di+word].$P_Picked_Val,cs ;AN000; store segment of STRING_BUF
 02FD  26: 8C 5D 06          C		mov	word ptr es:[di+2].$P_Picked_Val,Psdata_Seg ;AN031; store segment of STRING_BUF
			     C	;
 0301  50                    C		push	ax			;AN000;
 0302  26: F6 47 02 01       C		test	byte ptr es:[bx].$P_Function_Flag,$P_CAP_File ;AN000; need CAPS by file table?
 0307  74 04                 C		je	$P_RLT_CAP00		;AN000;
			     C	
 0309  B0 04                 C		mov	al,$P_DOSTBL_File	;AN000; use file upper case table
 030B  EB 09                 C		jmp	short $P_RLT_CAP02	;AN000;
			     C	
 030D                        C	$P_RLT_CAP00:				;AN000;
 030D  26: F6 47 02 02       C		test	byte ptr es:[bx].$P_Function_Flag,$P_CAP_Char ;AN000; need CAPS by char table ?
 0312  74 05                 C		je	$P_RLT_CAP01		;AN000;
			     C	
 0314  B0 02                 C		mov	al,$P_DOSTBL_Char	;AN000; use character upper case table
 0316                        C	$P_RLT_CAP02:				;AN000;
 0316  E8 03C3 R             C		call	$P_Do_CAPS_String	;AN000;  process CAPS along the table
 0319                        C	$P_RLT_CAP01:				;AN000;
 0319  58                    C		pop	ax			;AN000;
 031A  26: F6 47 02 10       C		test	byte ptr es:[bx].$P_Function_Flag,$P_Rm_Colon ;AN000; removing colon at end ?
 031F  74 03                 C		je	$P_RLT_Exit		;AN000;
			     C	
 0321  E8 03A0 R             C		call	$P_Remove_Colon 	;AN000; then process it.
 0324                        C	$P_RLT_Exit:				;AN000;
 0324  5F                    C		pop	di			;AN000;
 0325  C3                    C		ret				;AN000;
 0326                        C	$P_Fill_Result endp			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-31


			     C	PAGE					;AN000;
			     C	;***********************************************************************
			     C	; $P_Check_Match_Flags
			     C	;
			     C	; Function:  Check the mutch_flags and make the exit code and set the
			     C	;	     result buffer
			     C	;
			     C	;	    Check for types in this order:
			     C	;		Complex
			     C	;		Date
			     C	;		Time
			     C	;		Drive
			     C	;		Filespec
			     C	;		Quoted String
			     C	;		Simple String
			     C	;
			     C	; Input:     psdata_seg:SI -> $P_STRING_BUF
			     C	;	     ES:BX -> CONTROL block
			     C	;
			     C	; Output:    None
			     C	;
			     C	; Use:	     $P_Value, P$_SValue, $P_Simple_String, $P_Date_Format
			     C	;	     $P_Time_Format, $P_Complex_Format, $P_File_Foemat
			     C	;	     $P_Drive_Format
			     C	;***********************************************************************
 0326                        C	$P_Check_Match_Flags proc		;AN000;
 0326  C6 06 00AA R 00       C		mov	psdata_seg:$P_err_flag,$P_NULL ;AN033;AC034;; clear filespec error flag.
 032B  50                    C		push	ax			;AN000;
 032C  26: 8B 07             C		mov	ax,es:[bx].$P_Match_Flag ;AN000; load match flag(16bit) to ax
			     C	
 032F  0B C0                 C		or	ax,ax			;AC035; test ax for zero
			     C	;(changed ;AC035;)  cmp     ax,0	;AN000; (tm12)
 0331  75 17                 C		jne	$P_Mat			;AN000; (tm12)
			     C	
 0333  50                    C		push	ax			;AN000; (tm12)
 0334  53                    C		push	bx			;AN000; (tm12)
 0335  52                    C		push	dx			;AN000; (tm12)
 0336  57                    C		push	di			;AN000; (tm12)
 0337  C7 06 0002 R 0009     C		mov	psdata_seg:$P_RC,$P_Syntax ;AC034; (tm12)
 033D  B4 FF                 C		mov	ah,$P_No_Tag		;AN000; (tm12)
 033F  B0 03                 C		mov	al,$P_String		;AN000; (tm12)
 0341  E8 02A4 R             C		call	$P_Fill_Result		;AN000; (tm12)
 0344  5F                    C		pop	di			;AN000; (tm12)
 0345  5A                    C		pop	dx			;AN000; (tm12)
 0346  5B                    C		pop	bx			;AN000; (tm12)
 0347  58                    C		pop	ax			;AN000; (tm12)
 0348  EB 02                 C		jmp	short $P_Bridge 	;AC035; (tm12)
			     C	
 034A                        C	$P_Mat: 				;AN000; (tm12)
			     C	
 034A  EB 03                 C		jmp	short $P_Match03	;AN025; (tm09)
			     C	
 034C                        C	$P_Bridge:				;AN000;
			     C	;	jmp	short $P_Match_Exit (tm02)
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-32


			     C	
 034C  EB 3C 90              C		jmp	$P_Match_Exit		;AN000; (tm02)
			     C	
 034F                        C	$P_Match03:				;AN000;
			     C	; ENDIF ;AN000;(of TimeSW) (tm04)
			     C	IF	DrvSW				;AN000;(Check if drive only is supported)
 034F  A9 0100               C		test	ax,$P_Drv_Only		;AN000; Drive only
 0352  74 13                 C		je	$P_Match06		;AN000;
			     C	
 0354  C7 06 0002 R 0000     C		mov	psdata_seg:$P_RC,$P_No_Error ;AC034; assume no error
 035A  E8 04FB R             C		call	$P_File_Format		;AN000; 1st, call file format
 035D  E8 0576 R             C		call	$P_Drive_Format 	;AN000; check drive format, next
 0360  83 3E 0002 R 09       C		cmp	psdata_seg:$P_RC,$P_Syntax ;AC034; if error, examinee the next type
 0365  75 23                 C		jne	$P_Match_Exit		;AN000;
			     C	
 0367                        C	$P_Match06:				;AN000;
			     C	ENDIF					;AN000;(of DrvSW)
			     C	IF	FileSW				;AN000;(Check if file spec is supported)
 0367  A9 0200               C		test	ax,$P_File_Spc		;AN000; File spec
 036A  74 10                 C		je	$P_Match07		;AN000;
			     C	
 036C  C7 06 0002 R 0000     C		mov	psdata_seg:$P_RC,$P_No_Error ;AC034; assume no error
 0372  E8 04FB R             C		call	$P_File_Format		;AN000; do process
 0375  83 3E 0002 R 09       C		cmp	psdata_seg:$P_RC,$P_Syntax ;AC034; if error, examine the next type
 037A  75 0E                 C		jne	$P_Match_Exit		;AN000;
			     C	
 037C                        C	$P_Match07:				;AN000;
			     C	ENDIF					;AN000;(of FileSW)
 037C  A9 2000               C		test	ax,$P_Simple_S		;AN000; Simple string
 037F  74 09                 C		je	$P_Match09		;AN000;
			     C	
 0381  C7 06 0002 R 0000     C		mov	psdata_seg:$P_RC,$P_No_Error ;AC034; assume no error
 0387  E8 0439 R             C		call	$P_Simple_String	;AN000; do process
			     C	;;;;	cmp	psdata_seg:$P_RC,$P_Syntax ;AC034; These two lines will be alive
			     C	;;;;	jne	$P_Match_Exit			   ;when extending the match_flags.
 038A                        C	$P_Match09:				;AN000;
 038A                        C	$P_Match_Exit:				;AN000;
 038A  80 3E 00AA R 01       C		cmp	psdata_seg:$P_err_flag,$P_error_filespec ;AC034; bad filespec ?
 038F  75 0D                 C		jne	$P_Match2_Exit		;AN033; no, continue
 0391  83 3E 0002 R 00       C		cmp	psdata_seg:$P_RC,$P_No_Error ;AN033;AC034;; check for other errors ?
 0396  75 06                 C		jne	$P_Match2_Exit		;AN033; no, continue
 0398  C7 06 0002 R 0009     C		mov	psdata_seg:$P_RC,$P_Syntax ;AN033;AC034;; set error flag
 039E                        C	$P_Match2_Exit: 			;AN033;
 039E  58                    C		pop	ax			;AN000;
 039F  C3                    C		ret				;AN000;
 03A0                        C	$P_Check_Match_Flags endp		;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-33


			     C	PAGE					;AN000;
			     C	;***********************************************************************
			     C	; $P_Remove_Colon;
			     C	;
			     C	; Function: Remove colon at end
			     C	;
			     C	; Input:    psdata_seg:SI points to string buffer to be examineed
			     C	;
			     C	; Output:   None
			     C	;
			     C	; Use:	$P_Chk_DBCS
			     C	;***********************************************************************
 03A0                        C	$P_Remove_Colon proc			;AN000;
 03A0  50                    C		push	ax			;AN000;
 03A1  56                    C		push	si			;AN000;
 03A2                        C	$P_RCOL_Loop:				;AN000;
 03A2  8A 04                 C		mov	al,psdata_seg:[si]	;AN000; get character
 03A4  0A C0                 C		or	al,al			;AN000; end of string ?
 03A6  74 18                 C		je	$P_RCOL_Exit		;AN000; if yes, just exit
			     C	
 03A8  3C 3A                 C		cmp	al,$P_Colon		;AN000; is it colon ?
 03AA  75 0B                 C		jne	$P_RCOL00		;AN000;
			     C	
 03AC  80 7C 01 00           C		cmp	byte ptr psdata_seg:[si+byte],$P_NULL ;AN000; if so, next is NULL ?
 03B0  75 05                 C		jne	$P_RCOL00		;AN000; no, then next char
			     C	
 03B2  C6 04 00              C		mov	byte ptr psdata_seg:[si],$P_NULL ;AN000; yes, remove colon
 03B5  EB 09                 C		jmp	short $P_RCOL_Exit	;AN000; and exit.
			     C	
 03B7                        C	$P_RCOL00:				;AN000;
 03B7  E8 0689 R             C		call	$P_Chk_DBCS		;AN000; if not colon, then check if
 03BA  73 01                 C		jnc	$P_RCOL01		;AN000; DBCS leading byte.
			     C	
 03BC  46                    C		inc	si			;AN000; if yes, skip trailing byte
 03BD                        C	$P_RCOL01:				;AN000;
 03BD  46                    C		inc	si			;AN000; si points to next byte
 03BE  EB E2                 C		jmp	short $P_RCOL_Loop	;AN000; loop until NULL encountered
			     C	
 03C0                        C	$P_RCOL_Exit:				;AN000;
 03C0  5E                    C		pop	si			;AN000;
 03C1  58                    C		pop	ax			;AN000;
 03C2  C3                    C		ret				;AN000;
 03C3                        C	$P_Remove_Colon endp			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-34


			     C	PAGE					;AN000;
			     C	;***********************************************************************
			     C	; $P_Do_CAPS_String;
			     C	;
			     C	; Function: Perform capitalization along with the file case map table
			     C	;	    or character case map table.
			     C	;
			     C	; Input:    AL = 2 : Use character table
			     C	;	    AL = 4 : Use file table
			     C	;	    psdata_seg:SI points to string buffer to be capitalized
			     C	;
			     C	; Output:   None
			     C	;
			     C	; Use:	$P_Do_CAPS_Char, $P_Chk_DBCS
			     C	;***********************************************************************
 03C3                        C	$P_Do_CAPS_String proc			;AN000;
 03C3  56                    C		push	si			;AN000;
 03C4  52                    C		push	dx			;AN000;
 03C5  8A D0                 C		mov	dl,al			;AN000; save info id
			     C	
 03C7                        C	$P_DCS_Loop:				;AN000;
 03C7  8A 04                 C		mov	al,psdata_seg:[si]	;AN000; load charater and
 03C9  E8 0689 R             C		call	$P_Chk_DBCS		;AN000; check if DBCS leading byte
 03CC  72 0B                 C		jc	$P_DCS00		;AN000; if yes, do not need CAPS
			     C	
 03CE  0A C0                 C		or	al,al			;AN000; end of string ?
 03D0  74 0B                 C		je	$P_DCS_Exit		;AN000; then exit.
			     C	
 03D2  E8 03E0 R             C		call	$P_Do_CAPS_Char 	;AN000; Here a SBCS char need to be CAPS
 03D5  88 04                 C		mov	psdata_seg:[si],al	;AN000; stored upper case char to buffer
 03D7  EB 01                 C		jmp	short $P_DCS01		;AN000; process nexit
 03D9                        C	$P_DCS00:				;AN000;
 03D9  46                    C		inc	si			;AN000; skip DBCS leading and trailing byte
 03DA                        C	$P_DCS01:				;AN000;
 03DA  46                    C		inc	si			;AN000; si point to next byte
 03DB  EB EA                 C		jmp	short $P_DCS_Loop	;AN000; loop until NULL encountered
 03DD                        C	$P_DCS_Exit:				;AN000;
 03DD  5A                    C		pop	dx			;AN000;
 03DE  5E                    C		pop	si			;AN000;
 03DF  C3                    C		ret				;AN000;
 03E0                        C	$P_Do_CAPS_String endp			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-35


			     C	PAGE					;AN000;
			     C	;***********************************************************************
			     C	; $P_Do_CAPS_Char;
			     C	;
			     C	; Function: Perform capitalization along with the file case map table
			     C	;	    or character case map table.
			     C	;
			     C	; Input:    DL = 2 : Use character table
			     C	;	    DL = 4 : Use file table
			     C	;	    AL = character to be capitalized
			     C	;
			     C	; Output:   None
			     C	;
			     C	; Use:	INT 21h /w AH=65h
			     C	;***********************************************************************
 03E0                        C	$P_Do_CAPS_Char proc			;AN000;
 03E0  3C 80                 C		cmp	al,$P_ASCII80		;AN000; need upper case table ?
 03E2  73 0C                 C		jae	$P_DCC_Go		;AN000;
			     C	
 03E4  3C 61                 C		cmp	al,"a"                  ;AN000; if no,
 03E6  72 42                 C		jb	$P_CAPS_Ret		;AN000;   check if  "a" <= AL <= "z"
			     C	
 03E8  3C 7A                 C		cmp	al,"z"                  ;AN000;
 03EA  77 3E                 C		ja	$P_CAPS_Ret		;AN000;   if yes, make CAPS
			     C	
 03EC  24 DF                 C		and	al,$P_Make_Upper	;AN000;   else do nothing.
 03EE  EB 3A                 C		jmp	short $P_CAPS_Ret	;AN000;
			     C	
 03F0                        C	$P_DCC_Go:				;AN000;
 03F0  53                    C		push	bx			;AN000;
 03F1  06                    C		push	es			;AN000;
 03F2  57                    C		push	di			;AN000;
			     C	IF	CAPSW				;AN000;(Check if uppercase conversion is supported)
 03F3  8D 3E 009C R          C		lea	di,psdata_seg:$P_File_CAP_Ptr ;AC034;
 03F7  80 FA 04              C		cmp	dl,$P_DOSTBL_File	;AN000; Use file CAPS table ?
 03FA  74 04                 C		je	$P_DCC00		;AN000;
			     C	
			     C	ENDIF					;AN000;(of CAPSW)
 03FC  8D 3E 0097 R          C		lea	di,psdata_seg:$P_Char_CAP_Ptr ;AC034; or use char CAPS table ?
 0400                        C	$P_DCC00:				;AN000;
 0400  38 15                 C		cmp	psdata_seg:[di],dl	;AN000; already got table address ?
 0402  74 17                 C		je	$P_DCC01		;AN000; if no,
			     C	
			     C	;In this next section, ES will be used to pass a 5 byte workarea to INT 21h,
			     C	; the GET COUNTYRY INFO call.  This usage of ES is required by the function
			     C	; call, regardless of what base register is currently be defined as PSDATA_SEG.
			     C	;BASESW EQU 0 means that ES is the psdata_seg reg.
			     C	
			     C	IFDEF BASESW				;AN037; If BASESW has been defined, and
			     C	ENDIF					;AN037;
			     C	
 0404  50                    C		push	ax			;AN000; get CAPS table thru DOS call
 0405  51                    C		push	cx			;AN000;
 0406  52                    C		push	dx			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-36


			     C	
			     C	
 0407  1E                    C		push	PSDATA_SEG		;AC036; pass current base seg into
			     C						;(Note: this used to push CS.  BUG...
 0408  07                    C		pop	es			;AN000;   ES reg, required for
			     C						;get extended country information
 0409  B4 65                 C		mov	ah,$P_DOS_Get_TBL	;AN000; get extended CDI
 040B  8A C2                 C		mov	al,dl			;AN000; upper case table
 040D  BB FFFF               C		mov	bx,$P_DOSTBL_Def	;AN000; get active CON
 0410  B9 0005               C		mov	cx,$P_DOSTBL_BL 	;AN000; buffer length
 0413  BA FFFF               C		mov	dx,$P_DOSTBL_Def	;AN000; get for default code page
			     C						;DI already set to point to buffer
 0416  CD 21                 C		int	21h			;AN000; es:di point to buffer that
			     C						;now has been filled in with info
 0418  5A                    C		pop	dx			;AN000;
 0419  59                    C		pop	cx			;AN000;
 041A  58                    C		pop	ax			;AN000;
			     C	IFDEF BASESW				;AN037; If BASESW has been defined, and
			     C	ENDIF					;AN037;
 041B                        C	$P_DCC01:				;AN000;
			     C	
			     C	;In this next section, ES will be used as the base of the XLAT table, provided
			     C	; by the previous GET COUNTRY INFO DOS call.  This usage of ES is made
			     C	; regardless of which base reg is currently the PSDATA_SEG reg.
			     C	
			     C	IFDEF BASESW				;AN037; If BASESW has been defined, and
			     C	ENDIF					;AN037;
 041B  8B 5D 01              C		mov	bx,psdata_seg:[di+$P_DOS_TBL_Off] ;AN000; get offset of table
 041E  8E 45 03              C		mov	es,psdata_seg:[di+$P_DOS_TBL_Seg] ;AN000; get segment of table
 0421  43                    C		inc	bx			;AC035; add '2' to
 0422  43                    C		inc	bx			;AC035;  BX reg
			     C						;AN000; skip length field
			     C	;(changed ;AN035;) add	   bx,word	;AN000; skip length field
 0423  2C 80                 C		sub	al,$P_ASCII80		;AN000; make char to index
 0425  26: D7                C		xlat	es:[bx] 		;AN000; perform case map
			     C	
			     C	IFDEF BASESW				;AN037; If BASESW has been defined, and
			     C	ENDIF					;AN037;
 0427  5F                    C		pop	di			;AN000;
 0428  07                    C		pop	es			;AN000;
 0429  5B                    C		pop	bx			;AN000;
 042A                        C	$P_CAPS_Ret:				;AN000;
 042A  C3                    C		ret				;AN000;
 042B                        C	$P_Do_CAPS_Char endp			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-37


			     C	PAGE					;AN000;
			     C	;***********************************************************************
			     C	;***********************************************************************
			     C	; $P_0099;
			     C	;
			     C	; Function:  Make ASCII 0-9 to Binary 0-9
			     C	;
			     C	; Input:     AL = character code
			     C	;
			     C	; Output:    CY = 1 : AL is not number
			     C	;	     CY = 0 : AL contains binary value
			     C	;***********************************************************************
 042B                        C	$P_0099 proc				;AN000;
 042B  3C 30                 C		cmp	al,"0"                  ;AN000;
 042D  72 08                 C		jb	$P_0099Err		;AN000;  must be 0 =< al =< 9
			     C	
 042F  3C 39                 C		cmp	al,"9"                  ;AN000;
 0431  77 04                 C		ja	$P_0099Err		;AN000;  must be 0 =< al =< 9
			     C	
 0433  2C 30                 C		sub	al,"0"                  ;AN000; make char -> bin
 0435  F8                    C		clc				;AN000; indicate no error
 0436  C3                    C		ret				;AN000;
			     C	
 0437                        C	$P_0099Err:				;AN000;
 0437  F9                    C		stc				;AN000; indicate error
 0438  C3                    C		ret				;AN000;
 0439                        C	$P_0099 endp				;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-38


			     C	PAGE					;AN000;
			     C	;***********************************************************************
			     C	; $P_Simple_String
			     C	;
			     C	; Function:  See value list for the simple string
			     C	;	     and make result buffer.
			     C	;
			     C	; Input:     psdata_seg:SI -> $P_STRING_BUF
			     C	;	     ES:BX -> CONTROL block
			     C	;
			     C	; Output:    None
			     C	;
			     C	; Use:	$P_Fill_Result, $P_String_Comp
			     C	;
			     C	; Vars: $P_RC(W)
			     C	;***********************************************************************
 0439                        C	$P_Simple_String proc			;AN000;
 0439  50                    C		push	ax			;AN000;
 043A  53                    C		push	bx			;AN000;
 043B  52                    C		push	dx			;AN000;
 043C  57                    C		push	di			;AN000;
 043D  26: 8B 7F 06          C		mov	di,es:[bx].$P_Value_List ;AN000; di points to value list
 0441  26: 8A 05             C		mov	al,es:[di]		;AN000; get nval
 0444  0A C0                 C		or	al,al			;AN000; no value list ?
 0446  75 04                 C		jne	$P_Sim00		;AN000; then
			     C	
 0448  B4 FF                 C		mov	ah,$P_No_Tag		;AN000; No ITEM_TAG set
 044A  EB 08                 C		jmp	short $P_Sim_Exit	;AN000; and set result buffer
			     C	
 044C                        C	$P_Sim00:				;AN000;
 044C                        C	$P_Sim01:				;AN000;
 044C  C7 06 0002 R 0009     C		mov	psdata_seg:$P_RC,$P_Syntax ;AC034;
 0452  B4 FF                 C		mov	ah,$P_No_Tag		;AN000; No ITEM_TAG set
 0454                        C	$P_Sim_Exit:				;AN000;
 0454  B0 03                 C		mov	al,$P_String		;AN000; Set type
 0456                        C	$P_Sim_Exit0:				;AN000;
 0456  E8 02A4 R             C		call	$P_Fill_Result		;AN000;
 0459  5F                    C		pop	di			;AN000;
 045A  5A                    C		pop	dx			;AN000;
 045B  5B                    C		pop	bx			;AN000;
 045C  58                    C		pop	ax			;AN000;
 045D  C3                    C		ret				;AN000;
 045E                        C	$P_Simple_String endp			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-39


			     C	PAGE					;AN000;
			     C	;***********************************************************************
			     C	; $P_String_Comp:
			     C	;
			     C	; Function:  Compare two string
			     C	;
			     C	; Input:     psdata_seg:SI -> 1st string
			     C	;	     ES:BP -> 2nd string  (Must be upper case)
			     C	;	     ES:BX -> CONTROL block
			     C	;
			     C	; Output:    CY = 1 if not match
			     C	;
			     C	; Use:	$P_Chk_DBCS, $P_Do_CAPS_Char
			     C	;
			     C	; Vars: $P_KEYor_SW_Ptr(W), $P_Flags(R). $P_KEYorSW_Ptr
			     C	;***********************************************************************
 045E                        C	$P_String_Comp proc			;AN000;
 045E  50                    C		push	ax			;AN000;
 045F  55                    C		push	bp			;AN000;
 0460  52                    C		push	dx			;AN000;
 0461  56                    C		push	si			;AN000;
 0462  B2 02                 C		mov	dl,$P_DOSTBL_Char	;AN000; use character case map table
 0464                        C	$P_SCOM_Loop:				;AN000;
 0464  8A 04                 C		mov	al,psdata_seg:[si]	;AN000; get command character
 0466  E8 0689 R             C		call	$P_Chk_DBCS		;AN000; DBCS ?
 0469  72 3A                 C		jc	$P_SCOM00		;AN000; yes,DBCS
			     C	
 046B  E8 03E0 R             C		call	$P_Do_CAPS_Char 	;AN000; else, upper case map before comparison
			     C	IF	KeySW+SwSW			;AN000;(Check if keyword or switch is supported)
 046E  F6 06 000E R 08       C		test	psdata_seg:$P_Flags2,$P_Key_Cmp ;AC034; keyword search ?
 0473  74 0D                 C		je	$P_SCOM04		;AN000;
			     C	
 0475  3C 3D                 C		cmp	al,$P_Keyword		;AN000; "=" is delimiter
 0477  75 1E                 C		jne	$P_SCOM03		;AN000;IF "=" on command line AND  (bp+1=> char after the "=
				" in synonym list)
			     C	
 0479  26: 80 7E 01 00       C		cmp	byte ptr es:[bp+1],$P_NULL ;AN021;   at end of keyword string in the control block T
				HEN
 047E  75 6E                 C		jne	$P_SCOM_DIFFER		;AN021;
			     C	
 0480  EB 12                 C		jmp	short $P_SCOM05 	;AN000;   keyword found in synonym list
			     C	
 0482                        C	$P_SCOM04:				;AN000;
 0482  F6 06 000E R 10       C		test	psdata_seg:$P_Flags2,$P_SW_Cmp ;AC034; switch search ?
 0487  74 0E                 C		je	$P_SCOM03		;AN000;
			     C	
 0489  3C 3A                 C		cmp	al,$P_Colon		;AN000; ":" is delimiter, at end of switch on command line
 048B  75 0A                 C		jne	$P_SCOM03		;AN000; continue compares
			     C	
 048D  26: 80 7E 00 00       C		cmp	byte ptr es:[bp],$P_NULL ;AN021; IF at end of switch on command AND
 0492  75 5A                 C		jne	$P_SCOM_DIFFER		;AN021;   at end of switch string in the control block THEN
			     C	
 0494                        C	$P_SCOM05:				;AN000;   found a match
 0494  46                    C		inc	si			;AN000; si points to just after "=" or ":"
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-40


 0495  EB 5A                 C		jmp	short $P_SCOM_Same	;AN000; exit
			     C	
 0497                        C	$P_SCOM03:				;AN000;
			     C	ENDIF					;AN000;(of KeySW+SwSW)
 0497  26: 3A 46 00          C		cmp	al,es:[bp]		;AN000; compare operand w/ a synonym
 049B  75 1C                 C		jne	$P_SCOM_Differ0 	;AN000; if different, check ignore colon option
			     C	
 049D  0A C0                 C		or	al,al			;AN000; end of line
 049F  74 50                 C		je	$P_SCOM_Same		;AN000; if so, exit
			     C	
 04A1  46                    C		inc	si			;AN000; update operand pointer
 04A2  45                    C		inc	bp			;AN000; 	   and synonym pointer
 04A3  EB 12                 C		jmp	short $P_SCOM01 	;AN000; loop until NULL or "=" or ":" found in case
			     C	
 04A5                        C	$P_SCOM00:				;AN000; Here al is DBCS leading byte
 04A5  26: 3A 46 00          C		cmp	al,es:[bp]		;AN000; compare leading byte
 04A9  75 43                 C		jne	$P_SCOM_Differ		;AN000; if not match, say different
			     C	
 04AB  46                    C		inc	si			;AN000; else, load next byte
 04AC  8A 04                 C		mov	al,psdata_seg:[si]	;AN000; and
 04AE  45                    C		inc	bp			;AN000;
 04AF  26: 3A 46 00          C		cmp	al,es:[bp]		;AN000; compare 2nd byte
 04B3  75 39                 C		jne	$P_SCOM_Differ		;AN000; if not match, say different, too
			     C	
 04B5  46                    C		inc	si			;AN000; else update operand pointer
 04B6  45                    C		inc	bp			;AN000; 		and synonym pointer
 04B7                        C	$P_SCOM01:				;AN000;
 04B7  EB AB                 C		jmp	short $P_SCOM_Loop	;AN000; loop until NULL or "=" or "/" found in case
			     C	
 04B9                        C	$P_SCOM_Differ0:			;AN000;
			     C	
			     C	IF	SwSW				;AN000;(tm10)
 04B9  F6 06 000E R 40       C		test	psdata_seg:$P_Flags2,$P_SW ;AC034;(tm10)
 04BE  74 0F                 C		je	$P_not_applicable	;AN000;(tm10)
			     C	
 04C0  26: F7 47 02 0020     C		test	es:[bx].$P_Function_Flag,$P_colon_is_not_necessary ;AN000;(tm10)
 04C6  74 07                 C		je	$P_not_applicable	;AN000;(tm10)
			     C	
 04C8  26: 80 7E 00 00       C		cmp	byte ptr es:[bp],$P_NULL ;AN000;(tm10)
			     C	;(deleted ;AN025;) jne $P_not_applicable ;AN000;(tm10)
 04CD  74 22                 C		je	$P_SCOM_Same		;AN025;(tm10)
			     C	
 04CF                        C	$P_not_applicable:			;AN000;(tm10)
			     C	ENDIF					;AN000;(tm10)
			     C	
 04CF  26: F7 07 0010        C		test	es:[bx].$P_Match_Flag,$P_Ig_Colon ;AN000; ignore colon option specified ?
 04D4  74 18                 C		je	$P_SCOM_Differ		;AN000; if no, say different.
			     C	
 04D6  3C 3A                 C		cmp	al,$P_Colon		;AN000; End up with ":" and
 04D8  75 09                 C		jne	$P_SCOM02		;AN000;    subseqently
			     C	
 04DA  26: 80 7E 00 00       C		cmp	byte ptr es:[bp],$P_NULL ;AN000;       NULL ?
 04DF  75 0D                 C		jne	$P_SCOM_Differ		;AN000; if no, say different
			     C	
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-41


 04E1  EB 0E                 C		jmp	short $p_SCOM_Same	;AN000; else, say same
			     C	
 04E3                        C	$P_SCOM02:				;AN000;
 04E3  3C 00                 C		cmp	al,$P_NULL		;AN000; end up NULL and :
 04E5  75 07                 C		jne	$P_SCOM_Differ		;AN000;
			     C	
 04E7  26: 80 7E 00 3A       C		cmp	byte ptr es:[bp],$P_Colon ;AN000; if no, say different
 04EC  74 03                 C		je	$p_SCOM_Same		;AN000; else, say same
			     C	
 04EE                        C	$P_SCOM_Differ: 			;AN000;
 04EE  F9                    C		stc				;AN000; indicate not found
 04EF  EB 05                 C		jmp	short $P_SCOM_Exit	;AN000;
			     C	
 04F1                        C	$P_SCOM_Same:				;AN000;
 04F1  89 36 0011 R          C		mov	psdata_seg:$P_KEYorSW_Ptr,si ;AC034; for later use by keyword or switch
 04F5  F8                    C		clc				;AN000; indicate found
 04F6                        C	$P_SCOM_Exit:				;AN000;
 04F6  5E                    C		pop	si			;AN000;
 04F7  5A                    C		pop	dx			;AN000;
 04F8  5D                    C		pop	bp			;AN000;
 04F9  58                    C		pop	ax			;AN000;
 04FA  C3                    C		ret				;AN000;
 04FB                        C	$P_String_Comp endp			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-42


			     C	PAGE					;AN000;
			     C	;***********************************************************************
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-43


			     C	PAGE					;AN000;
			     C	;***********************************************************************
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-44


			     C	PAGE					;AN000;
			     C	;***********************************************************************
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-45


			     C	PAGE					;AN000;
			     C	;***********************************************************************
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-46


			     C	PAGE					;AN000;
			     C	;***********************************************************************
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-47


			     C	PAGE					;AN000;
			     C	;***********************************************************************
			     C	; $P_Chk_DSQuote;
			     C	;
			     C	; Function: Check if AL is double quotation or single quotation
			     C	;
			     C	; Input:    AL = byte to be examineed
			     C	;
			     C	; Output:   ZF on if AL is single or double quotetaion
			     C	;
			     C	; Vars:  $P_SorD_Quote(W)
			     C	;***********************************************************************
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-48


			     C	PAGE					;AN000;
			     C	;***********************************************************************
			     C	IF	FileSW+DrvSW			;AN000;(Check if file spec or drive only is supported)
			     C	; $P_File_Format;
			     C	;
			     C	; Function:  Check if the input string is valid file spec format.
			     C	;	     And set the result buffer.
			     C	;
			     C	; Input:     psdata_seg:SI -> $P_STRING_BUF
			     C	;	     ES:BX -> CONTROL block
			     C	;
			     C	; Output:    None
			     C	;
			     C	; Use:	$P_Fill_Result, $P_Chk_DBCS, $P_FileSp_Chk
			     C	;
			     C	; Vars: $P_RC(W), $P_SI_Save(W), $P_Terminator(W), $P_SaveSI_Cmpx(R)
			     C	;	$P_SaveSI_Cmpx(R)
			     C	;***********************************************************************
 04FB                        C	$P_File_Format proc			;AN000;
 04FB  50                    C		push	ax			;AN000;
 04FC  57                    C		push	di			;AN000;
 04FD  56                    C		push	si			;AN000;
 04FE  8B 3E 000F R          C		mov	di,psdata_seg:$P_SaveSI_cmpx ;AC034; get user buffer address
 0502                        C	$P_FileF_Loop0: 			;AN000; / skip special characters
 0502  8A 04                 C		mov	al,psdata_seg:[si]	;AN000; load character
 0504  0A C0                 C		or	al,al			;AN000; end of line ?
 0506  74 11                 C		je	$P_FileF_Err		;AN000; if yes, error exit
			     C	
 0508  E8 0562 R             C		call	$P_FileSp_Chk		;AN000; else, check if file special character
 050B  75 20                 C		jne	$P_FileF03		;AN000; if yes,
			     C	
			     C	;AN033; deleted   inc	  di			  ;skip
			     C	;AN033; deleted   inc	  si			  ;   the
			     C	;AN033; deleted   jmp	  short $P_FileF_Loop0	  ;	  character
 050D  C6 06 00AA R 01       C		mov	psdata_seg:$P_err_flag,$P_error_filespec ;AN033;AC034;; set error flag- bad char.
 0512  5E                    C		pop	si			;AN033;
 0513  C6 04 00              C		mov	byte ptr psdata_seg:[si],$P_NULL ;AN033;
 0516  5F                    C		pop	di			;AN033;
 0517  EB 39                 C		jmp	short $P_FileF02	;AN033;
			     C	
			     C	
 0519                        C	$P_FileF_Err:				;AN000;
 0519  5E                    C		pop	si			;AN000;
 051A  C6 04 00              C		mov	byte ptr psdata_seg:[si],$P_NULL ;AN000;
			     C	;(deleted ;AN030;) mov di,$P_SaveSI_cmpx ;AN000; get user buffer address
			     C	;(deleted ;AN030;) mov $P_SI_Save,di	 ;AN000; update pointer to user buffer
 051D  5F                    C		pop	di			;AN000;
 051E  26: F7 07 0001        C		test	es:[bx].$P_Match_Flag,$P_Optional ;AN000; is it optional ?
 0523  75 2D                 C		jne	$P_FileF02		;AN000;
			     C	
 0525  C7 06 0002 R 0002     C		mov	psdata_seg:$P_RC,$P_Op_Missing ;AC034; 3/17/87
 052B  EB 25                 C		jmp	short $P_FileF02	;AN000;
			     C	
 052D                        C	$P_FileF03:				;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-49


 052D  58                    C		pop	ax			;AN000; discard save si
 052E  56                    C		push	si			;AN000; save new si
 052F                        C	$P_FileF_Loop1: 			;AN000;
 052F  8A 04                 C		mov	al,psdata_seg:[si]	;AN000; load character (not special char)
 0531  0A C0                 C		or	al,al			;AN000; end of line ?
 0533  74 1B                 C		je	$P_FileF_RLT		;AN000;
			     C	
 0535  E8 0562 R             C		call	$P_FileSp_Chk		;AN000; File special character ?
 0538  74 0B                 C		je	$P_FileF00		;AN000;
			     C	
 053A  E8 0689 R             C		call	$P_Chk_DBCS		;AN000; no, then DBCS ?
 053D  73 02                 C		jnc	$P_FileF01		;AN000;
 053F  47                    C		inc	di			;AN000; if yes, skip next byte
 0540  46                    C		inc	si			;AN000;
 0541                        C	$P_FileF01:				;AN000;
 0541  47                    C		inc	di			;AN000;
 0542  46                    C		inc	si			;AN000;
 0543  EB EA                 C		jmp	short $P_FileF_Loop1	;AN000;
			     C	;
 0545                        C	$P_FileF00:				;AN000;
 0545  A2 0008 R             C		mov	psdata_seg:$P_Terminator,al ;AC034;
 0548  C6 04 00              C		mov	byte ptr psdata_seg:[si],$P_NULL ;AN000; update end of string
 054B  47                    C		inc	di			;AN000;
 054C  89 3E 0004 R          C		mov	psdata_seg:$P_SI_Save,di ;AC034; update next pointer in command line
 0550                        C	$P_FileF_RLT:				;AN000;
 0550  5E                    C		pop	si			;AN000;
 0551  5F                    C		pop	di			;AN000;
 0552                        C	$P_FileF02:				;AN000;
			     C	
 0552  58                    C		pop	ax			;AN000; (tm14)
 0553  A9 0200               C		test	ax,$P_File_Spc		;AN000; (tm14)
 0556  74 09                 C		je	$P_Drv_Only_Exit	;AN000; (tm14)
			     C	
 0558  50                    C		push	ax			;AN000;  (tm14)
			     C	
 0559  B4 FF                 C		mov	ah,$P_No_Tag		;AN000; set
 055B  B0 05                 C		mov	al,$P_File_Spec 	;AN000;    result
 055D  E8 02A4 R             C		call	$P_Fill_Result		;AN000; 	 buffer to file spec
 0560  58                    C		pop	ax			;AN000;
			     C	
 0561                        C	$P_Drv_Only_Exit:			;AN000; (tm14)
			     C	
 0561  C3                    C		ret				;AN000;
 0562                        C	$P_File_Format endp			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-50


			     C	PAGE					;AN000;
			     C	;***********************************************************************
			     C	; $P_FileSp_Chk
			     C	;
			     C	; Function:  Check if the input byte is one of file special characters
			     C	;
			     C	; Input:     psdata_seg:SI -> $P_STRING_BUF
			     C	;	     AL = character code to be examineed
			     C	;
			     C	; Output:    ZF = 1 , AL is one of special characters
			     C	;***********************************************************************
 0562                        C	$P_FileSp_Chk proc			;AN000;
 0562  53                    C		push	bx			;AN000;
 0563  51                    C		push	cx			;AN000;
 0564  8D 1E 00A1 R          C		lea	bx,psdata_seg:$P_FileSp_Char ;AC034; special character table
 0568  B9 0009               C		mov	cx,$P_FileSp_Len	;AN000; load length of it
 056B                        C	$P_FileSp_Loop: 			;AN000;
 056B  3A 07                 C		cmp	al,psdata_seg:[bx]	;AN000; is it one of special character ?
 056D  74 04                 C		je	$P_FileSp_Exit		;AN000;
			     C	
 056F  43                    C		inc	bx			;AN000;
 0570  E2 F9                 C		loop	$P_FileSp_Loop		;AN000;
			     C	
 0572  41                    C		inc	cx			;AN000; reset ZF
 0573                        C	$P_FileSp_Exit: 			;AN000;
 0573  59                    C		pop	cx			;AN000;
 0574  5B                    C		pop	bx			;AN000;
 0575  C3                    C		ret				;AN000;
 0576                        C	$P_FileSp_Chk endp			;AN000;
			     C	ENDIF					;AN000;(of FileSW+DrvSW)
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-51


			     C	PAGE					;AN000;
			     C	;***********************************************************************
			     C	IF	DrvSW				;AN000;(Check if drive only is supported)
			     C	; $P_Drive_Format;
			     C	;
			     C	; Function:  Check if the input string is valid drive only format.
			     C	;	     And set the result buffer.
			     C	;
			     C	; Input:     psdata_seg:SI -> $P_STRING_BUF
			     C	;	     ES:BX -> CONTROL block
			     C	;
			     C	; Output:    None
			     C	;
			     C	; Use:	$P_Fill_Result, $P_Chk_DBCS
			     C	;
			     C	; Vars: $P_RC(W)
			     C	;***********************************************************************
 0576                        C	$P_Drive_Format proc			;AN000;
 0576  50                    C		push	ax			;AN000;
 0577  52                    C		push	dx			;AN000;
 0578  8A 04                 C		mov	al,psdata_seg:[si]	;AN000;
 057A  0A C0                 C		or	al,al			;AN000; if null string
 057C  74 35                 C		je	$P_Drv_Exit		;AN000; do nothing
			     C	
 057E  E8 0689 R             C		call	$P_Chk_DBCS		;AN000; is it leading byte ?
 0581  72 2A                 C		jc	$P_Drv_Err		;AN000;
			     C	
 0583  83 7C 01 3A           C		cmp	word ptr psdata_seg:[si+byte],$P_Colon ;AN000; "d", ":", 0  ?
 0587  74 0D                 C		je	$P_DrvF00		;AN000;
			     C	
 0589  26: F7 07 0010        C		test	es:[bx].$P_Match_Flag,$P_Ig_Colon ;AN000; colon can be ignored?
 058E  74 1D                 C		je	$P_Drv_Err		;AN000;
			     C	
 0590  80 7C 01 00           C		cmp	byte ptr psdata_seg:[si+byte],$P_NULL ;AN000; "d", 0  ?
 0594  75 17                 C		jne	$P_Drv_Err		;AN000;
			     C	
 0596                        C	$P_DrvF00:				;AN000;
 0596  0C 20                 C		or	al,$P_Make_Lower	;AN000; lower case
 0598  3C 61                 C		cmp	al,"a"                  ;AN000; drive letter must
 059A  72 11                 C		jb	$P_Drv_Err		;AN000; in range of
			     C	
 059C  3C 7A                 C		cmp	al,"z"                  ;AN000; "a" - "z"
 059E  77 0D                 C		ja	$P_Drv_Err		;AN000; if no, error
			     C	
 05A0  2C 60                 C		sub	al,"a"-1                ;AN000; make text drive to binary drive
 05A2  8A D0                 C		mov	dl,al			;AN000; set
 05A4  B4 FF                 C		mov	ah,$P_No_Tag		;AN000;    result
 05A6  B0 06                 C		mov	al,$P_Drive		;AN000; 	 buffer
 05A8  E8 02A4 R             C		call	$P_Fill_Result		;AN000; 	       to drive
 05AB  EB 06                 C		jmp	short $P_Drv_Exit	;AN000;
			     C	
 05AD                        C	$P_Drv_Err:				;AN000;
 05AD  C7 06 0002 R 0009     C		mov	psdata_seg:$P_RC,$P_Syntax ;AC034;
 05B3                        C	$P_Drv_Exit:				;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-52


 05B3  5A                    C		pop	dx			;AN000;
 05B4  58                    C		pop	ax			;AN000;
 05B5  C3                    C		ret				;AN000;
 05B6                        C	$P_Drive_Format endp			;AN000;
			     C	ENDIF					;AN000;(of DrvSW)
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-53


			     C	PAGE					;AN000;
			     C	;***********************************************************************
			     C	; $P_Skip_Delim;
			     C	;
			     C	; Function: Skip delimiters specified in the PARMS list, white space
			     C	;	    and comma.
			     C	;
			     C	; Input:    DS:SI -> Command String
			     C	;	    ES:DI -> Parameter List
			     C	;
			     C	; Output:   CY = 1 if the end of line encounterd
			     C	;	    CY = 0 then SI move to 1st non-delimiter character
			     C	;	    AL = Last examineed character
			     C	;
			     C	; Use:	    $P_Chk_EOL, $P_Chk_Delim,
			     C	;
			     C	; Vars:     $P_Flags(R)
			     C	;***********************************************************************
 05B6                        C	$P_Skip_Delim proc			;AN000;
 05B6                        C	$P_Skip_Delim_Loop:			;AN000;
 05B6  AC                    C		LODSB				;AN000;
 05B7  E8 05DA R             C		call	$P_Chk_EOL		;AN000; is it EOL character ?
 05BA  74 16                 C		je	$P_Skip_Delim_CY	;AN000; if yes, exit w/ CY on
			     C	
 05BC  E8 0610 R             C		call	$P_Chk_Delim		;AN000; is it one of delimiters ?
 05BF  75 14                 C		jne	$P_Skip_Delim_NCY	;AN000; if no, exit w/ CY off
			     C	
 05C1  F6 06 000E R 20       C		test	psdata_seg:$P_Flags2,$P_Extra ;AC034; extra delim or comma found ?
 05C6  74 EE                 C		je	$P_Skip_Delim_Loop	;AN000; if no, loop
			     C	
 05C8  F6 06 000E R 41       C		test	psdata_seg:$P_Flags2,$P_SW+$P_equ ;AC034; /x , or xxx=zzz , (tm08)
 05CD  74 09                 C		je	short $P_Exit_At_Extra	;AN000; no switch, no keyword (tm08)
			     C	
 05CF  4E                    C		dec	si			;AN000; backup si for next call (tm08)
 05D0  EB 06                 C		jmp	short $P_Exit_At_Extra	;AN000; else exit w/ CY off
			     C	
 05D2                        C	$P_Skip_Delim_CY:			;AN000;
 05D2  F9                    C		stc				;AN000; indicate EOL
 05D3  EB 01                 C		jmp	short $P_Skip_Delim_Exit ;AN000;
			     C	
 05D5                        C	$P_Skip_Delim_NCY:			;AN000;
 05D5  F8                    C		clc				;AN000; indicate non delim
 05D6                        C	$P_Skip_Delim_Exit:			;AN000; in this case, need
 05D6  4E                    C		dec	si			;AN000;  backup index pointer
 05D7  C3                    C		ret				;AN000;
			     C	
 05D8                        C	$P_Exit_At_Extra:			;AN000;
 05D8  F8                    C		clc				;AN000; indicate extra delim
 05D9  C3                    C		ret				;AN000;
 05DA                        C	$P_Skip_Delim endp			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-54


			     C	PAGE					;AN000;
			     C	;***********************************************************************
			     C	; $P_Chk_EOL;
			     C	;
			     C	; Function: Check if AL is one of End of Line characters.
			     C	;
			     C	; Input:    AL = character code
			     C	;	    ES:DI -> Parameter List
			     C	;
			     C	; Output:   ZF = 1 if one of End of Line characters
			     C	;**********************************************************************
 05DA                        C	$P_Chk_EOL proc 			;AN000;
 05DA  53                    C		push	bx			;AN000;
 05DB  51                    C		push	cx			;AN000;
 05DC  3C 0D                 C		cmp	al,$P_CR		;AN000; Carriage return ?
 05DE  74 2D                 C		je	$P_Chk_EOL_Exit 	;AN000;
			     C	
 05E0  3C 00                 C		cmp	al,$P_NULL		;AN000; zero ?
 05E2  74 29                 C		je	$P_Chk_EOL_Exit 	;AN000;
			     C	
			     C	IF LFEOLSW				;AN028; IF LF TO BE ACCEPTED AS EOL
 05E4  3C 0A                 C		cmp	al,$P_LF		;AN000; Line feed ?
 05E6  74 25                 C		je	$P_Chk_EOL_Exit 	;AN000;
			     C	ENDIF					;AN028;
			     C	
 05E8  26: 80 7D 02 02       C		cmp	byte ptr es:[di].$P_Num_Extra,$P_I_Have_EOL ;AN000; EOL character specified ?
 05ED  72 1E                 C		jb	$P_Chk_EOL_Exit 	;AN000;
			     C	
 05EF  33 DB                 C		xor	bx,bx			;AN000;
 05F1  26: 8A 5D 03          C		mov	bl,es:[di].$P_Len_Extra_Delim ;AN000; get length of delimiter list
 05F5  83 C3 04              C		add	bx,$P_Len_PARMS 	;AN000; skip it
 05F8  26: 80 39 00          C		cmp	byte ptr es:[bx+di],$P_I_Use_Default ;AN000; No extra EOL character ?
 05FC  74 0D                 C		je	$P_Chk_EOL_NZ		;AN000;
			     C	
 05FE  33 C9                 C		xor	cx,cx			;AN000; Get number of extra chcracter
 0600  26: 8A 09             C		mov	cl,es:[bx+di]		;AN000;
 0603                        C	$P_Chk_EOL_Loop:			;AN000;
 0603  43                    C		inc	bx			;AN000;
 0604  26: 3A 01             C		cmp	al,es:[bx+di]		;AN000; Check extra EOL character
 0607  74 04                 C		je	$P_Chk_EOL_Exit 	;AN000;
			     C	
 0609  E2 F8                 C		loop	$P_Chk_EOL_Loop 	;AN000;
			     C	
 060B                        C	$P_Chk_EOL_NZ:				;AN000;
 060B  3C 0D                 C		cmp	al,$P_CR		;AN000; reset ZF
 060D                        C	$P_Chk_EOL_Exit:			;AN000;
 060D  59                    C		pop	cx			;AN000;
 060E  5B                    C		pop	bx			;AN000;
 060F  C3                    C		ret				;AN000;
 0610                        C	$P_Chk_EOL endp 			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-55


			     C	PAGE					;AN000;
			     C	;***********************************************************************
			     C	; $P_Chk_Delim;
			     C	;
			     C	; Function: Check if AL is one of delimiter characters.
			     C	;	    if AL+[si] is DBCS blank, it is replaced with two SBCS
			     C	;	    blanks.
			     C	;
			     C	; Input:    AL = character code
			     C	;	    DS:SI -> Next Character
			     C	;	    ES:DI -> Parameter List
			     C	;
			     C	; Output:   ZF = 1 if one of delimiter characters
			     C	;	    SI points to the next character
			     C	; Vars:  $P_Terminator(W), $P_Flags(W)
			     C	;***********************************************************************
 0610                        C	$P_Chk_Delim proc			;AN000;
 0610  53                    C		push	bx			;AN000;
 0611  51                    C		push	cx			;AN000;
 0612  C6 06 0008 R 20       C		mov	psdata_seg:$P_Terminator,$P_Space   ;AC034; Assume terminated by space
 0617  80 26 000E R DF       C		and	psdata_seg:$P_Flags2,0ffh-$P_Extra ;AC034;
 061C  3C 20                 C		cmp	al,$P_Space		;AN000; Space ?
 061E  74 36                 C		je	$P_Chk_Delim_Exit	;AN000;
			     C	
 0620  3C 09                 C		cmp	al,$P_TAB		;AN000; TAB ?
 0622  74 32                 C		je	$P_Chk_Delim_Exit	;AN000;
			     C	
 0624  3C 2C                 C		cmp	al,$P_Comma		;AN000; Comma ?
 0626  74 31                 C		je	$P_Chk_Delim_Exit0	;AN000;
			     C	
 0628                        C	$P_Chk_Delim00: 			;AN000;
 0628  3C 81                 C		cmp	al,$P_DBSP1		;AN000; 1st byte of DBCS Space ?
 062A  75 0C                 C		jne	$P_Chk_Delim01		;AN000;
			     C	
 062C  80 3C 40              C		cmp	byte ptr [si],$P_DBSP2	;AN000; 2nd byte of DBCS Space ?
 062F  75 07                 C		jne	$P_Chk_Delim01		;AN000;
			     C	
 0631  B0 20                 C		mov	al,$P_Space		;AN000;
 0633  46                    C		inc	si			;AN000; make si point to next character
 0634  3A C0                 C		cmp	al,al			;AN000; Set ZF
 0636  EB 1E                 C		jmp	short $P_Chk_Delim_Exit ;AN000;
			     C	
 0638                        C	$P_Chk_Delim01: 			;AN000;
 0638  26: 80 7D 02 01       C		cmp	byte ptr es:[di].$P_Num_Extra,$P_I_Have_Delim ;AN000; delimiter character specified 
				?
 063D  72 17                 C		jb	$P_Chk_Delim_Exit	;AN000;
			     C	
 063F  33 C9                 C		xor	cx,cx			;AN000;
 0641  26: 8A 4D 03          C		mov	cl,es:[di].$P_Len_Extra_Delim ;AN000; get length of delimiter list
 0645  0B C9                 C		or	cx,cx			;AN000; No extra Delim character ?
 0647  74 0B                 C		je	$P_Chk_Delim_NZ 	;AN000;
			     C	
 0649  BB 0003               C		mov	bx,$P_Len_PARMS-1	;AN000; set bx to 1st extra delimiter
 064C                        C	$P_Chk_Delim_Loop:			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-56


 064C  43                    C		inc	bx			;AN000;
 064D  26: 3A 01             C		cmp	al,es:[bx+di]		;AN000; Check extra Delim character
 0650  74 07                 C		je	$P_Chk_Delim_Exit0	;AN000;
			     C	
 0652  E2 F8                 C		loop	$P_Chk_Delim_Loop	;AN000; examine all extra delimiter
			     C	
 0654                        C	$P_Chk_Delim_NZ:			;AN000;
 0654  3C 20                 C		cmp	al,$P_Space		;AN000; reset ZF
 0656                        C	$P_Chk_Delim_Exit:			;AN000;
			     C	;;;;	jne	$P_ChkDfin
			     C	;;;;	mov	psdata_seg:$P_Terminator,al ;AN034;
 0656                        C	$P_ChkDfin:				;AN000;
 0656  59                    C		pop	cx			;AN000;
 0657  5B                    C		pop	bx			;AN000;
 0658  C3                    C		ret				;AN000;
			     C	
 0659                        C	$P_Chk_Delim_Exit0:			;AN000;
 0659  A2 0008 R             C		mov	psdata_seg:$P_Terminator,al ;AC034; keep terminated delimiter
 065C  F6 06 000E R 01       C		test	psdata_seg:$P_Flags2,$P_Equ  ;AN027;AC034;; if terminating a key=
 0661  75 05                 C		jnz	$P_No_Set_Extra 	;AN027; then do not set the EXTRA bit
			     C	
 0663  80 0E 000E R 20       C		or	psdata_seg:$P_Flags2,$P_Extra ;AC034; flag terminated extra delimiter or comma
 0668                        C	$P_No_Set_Extra:			;AN027;
 0668  3A C0                 C		cmp	al,al			;AN000; set ZF
 066A  EB EA                 C		jmp	short $P_Chk_Delim_Exit ;AN000;
			     C	
 066C                        C	$P_Chk_Delim endp			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-57


			     C	PAGE					;AN000;
			     C	;***********************************************************************
			     C	; $P_Chk_Switch;
			     C	;
			     C	; Function: Check if AL is the switch character not in first position of
			     C	;	    $P_STRING_BUF
			     C	;
			     C	; Input:    AL = character code
			     C	;	    BX = current pointer within $P_String_Buf
			     C	;	    SI =>next char on command line (following the one in AL)
			     C	;
			     C	; Output:   CF = 1 (set)if AL is switch character, and not in first
			     C	;		 position, and has no chance of being part of a date string,
			     C	;		 i.e. should be treated as a delimiter.
			     C	
			     C	;	    CF = 0 (reset, cleared) if AL is not a switch char, is in the first
			     C	;		 position, or is a slash but may be part of a date string, i.e.
			     C	;		 should not be treated as a delimiter.
			     C	;
			     C	; Vars:  $P_Terminator(W)
			     C	
			     C	; Use:	 $P_0099
			     C	;***********************************************************************
 066C                        C	$P_Chk_Switch proc			;AN000;
			     C	
			     C	;AN020;; Function: Check if AL is the switch character from 2nd position of $P_STRING_BUF
			     C	;AN020;; Output:   ZF = 1 if switch character
			     C	;AN020;;	lea	bp,$P_STRING_BUF ;AN000;
			     C	;AN020;;	cmp	bx,bp		 ;AN000; 1st position ?
			     C	;AN020;;	je	$P_Chk_S_Exit_1  ;AN000;
			     C	;AN020;;	cmp	al,$P_Switch	 ;AN000;
			     C	;AN020;;	jmp	short $P_Chk_S_Exit_0  ;AN000;
			     C	;AN020;;$P_Chk_S_Exit_1:		       ;AN000;
			     C	;AN020;;	cmp	al,$P_Switch	 ;AN000; (tm08)
			     C	;AN020;;	jne	$P_Nop		;AN000; (tm08)
			     C	;AN020;;	or	$P_Flags2,$P_SW  ;AN000; (tm08) It could be valid switch
			     C	;AN020;;$P_Nop: 			;AN000; (tm08)
			     C	;AN020;;	inc	bp		       ;AN000;
			     C	;AN020;;	cmp	bx,bp		       ;AN000; reset ZF
			     C	;AN020;;$P_Chk_S_Exit_0:		       ;AN000;
			     C	;AN020;;	jne	$P_Chk_S_Exit	       ;AN000;
			     C	;AN020;;	mov	   $P_Terminator,al    ;AN000; store switch character
			     C	;AN020;;$P_Chk_S_Exit:			       ;AN000;
			     C	
 066C  8D 2E 0017 R          C		LEA	BP,psdata_seg:$P_String_Buf ;AN020;AC034; BP=OFFSET of $P_String_Buf even in group a
				ddressing
			     C	;	.IF <BX NE BP> THEN		;AN020;IF not first char THEN
 0670  3B DD                 C		cmp	BX,BP			;AN000;
 0672  74 0A                 C		je	$P_STRUC_L2		;AN000;
			     C	
			     C	;	    .IF <AL EQ $P_Switch> THEN	;AN020;otherwise see if a slash
 0674  3C 2F                 C		    cmp     AL,$P_Switch	;AN000;
 0676  75 03                 C		    jne     $P_STRUC_L5 	;AN000;
			     C	
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-58


 0678  F9                    C			STC			;AN020;not in first position and is slash, now see if might 
				be in date string
			     C	;	    .ELSE			;AN020;
 0679  EB 0D                 C		    jmp     short $P_STRUC_L1	;AN000;
			     C	
 067B                        C	$P_STRUC_L5:				;AN000;
 067B  F8                    C			CLC			;AN020;not a slash
			     C	;	    .ENDIF			;AN020;
			     C	;	.ELSE				;AN020;is first char in the buffer, ZF=0
 067C  EB 0A                 C		jmp	short $P_STRUC_L1	;AN000;
			     C	
 067E                        C	$P_STRUC_L2:				;AN000;
			     C	;	    .IF <AL EQ $P_Switch> THEN	;AN020;
 067E  3C 2F                 C		    cmp     AL,$P_Switch	;AN000;
 0680  75 05                 C		    jne     $P_STRUC_L12	;AN000;
			     C	
 0682  80 0E 000E R 40       C			OR	psdata_seg:$P_Flags2,$P_SW ;AN020;AC034;;could be valid switch, first char a
				nd is slash
			     C	;	    .ENDIF			;AN020;
 0687                        C	$P_STRUC_L12:				;AN000;
 0687  F8                    C		    CLC 			;AN020;CF=0 indicating first char
			     C	;	.ENDIF				;AN020;
 0688                        C	$P_STRUC_L1:				;AN000;
			     C	
 0688  C3                    C		ret				;AN000;
 0689                        C	$P_Chk_Switch endp			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-59


			     C		PAGE				;AN000;
			     C	;**************************************************************************
			     C	; $P_Chk_DBCS:
			     C	;
			     C	;  Function: Check if a specified byte is in ranges of the DBCS lead bytes
			     C	;
			     C	;  Input:
			     C	;	  AL	= Code to be examineed
			     C	;
			     C	;  Output:
			     C	;	  If CF is on then a lead byte of DBCS
			     C	;
			     C	; Use: INT 21h w/AH=63
			     C	;
			     C	; Vars:  $P_DBCSEV_Seg(RW), $P_DBCSEV_Off(RW)
			     C	;***************************************************************************
 0689                        C	$P_Chk_DBCS PROC			;AN000;
			     C	;
 0689  1E                    C		PUSH	DS			;AN000;
 068A  56                    C		PUSH	SI			;AN000;
 068B  53                    C		PUSH	bx			;AN000; (tm11)
 068C  83 3E 000B R 00       C		CMP	psdata_seg:$P_DBCSEV_SEG,0 ;AC034; ALREADY SET ?
 0691  75 25                 C		JNE	$P_DBCS00		;AN000;
			     C	
 0693  50                    C		PUSH	AX			;AN000;
			     C	;	PUSH	BX			;AN000; (tm11)
 0694  1E                    C		PUSH	ds			;AN000; (tm11)
 0695  51                    C		PUSH	CX			;AN000;
 0696  52                    C		PUSH	DX			;AN000;
 0697  57                    C		PUSH	DI			;AN000;
 0698  55                    C		PUSH	BP			;AN000;
 0699  06                    C		PUSH	ES			;AN000;
 069A  33 F6                 C		XOR	SI,SI			;AN000;
 069C  8E DE                 C		MOV	DS,SI			;AN000;
 069E  B8 6300               C		MOV	AX,$P_DOS_GetEV 	;AN000; GET DBCS EV CALL
 06A1  CD 21                 C		INT	21H			;AN000;
			     C	
			     C	;	MOV	AX,DS			;AN000; (tm11)
			     C	;	OR	AX,AX			;AN000; (tm11)
 06A3  8C DB                 C		MOV	bx,DS			;AN000; (tm11)
 06A5  0B DB                 C		OR	bx,bx			;AN000; (tm11)
 06A7  07                    C		POP	ES			;AN000;
 06A8  5D                    C		POP	BP			;AN000;
 06A9  5F                    C		POP	DI			;AN000;
 06AA  5A                    C		POP	DX			;AN000;
 06AB  59                    C		POP	CX			;AN000;
			     C	;	POP	BX			;AN000; (tm11)
 06AC  1F                    C		POP	ds			;AN000; (tm11)
 06AD  58                    C		POP	AX			;AN000;
 06AE  74 25                 C		JE	$P_NON_DBCS		;AN000;
			     C	
 06B0                        C	$P_DBCS02:				;AN000;
 06B0  89 36 0009 R          C		MOV	psdata_seg:$P_DBCSEV_OFF,SI ;AC034; save EV offset
			     C	;	MOV	psdata_seg:$P_DBCSEV_SEG,DS ;AC034; save EV segment
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Page     1-60


 06B4  89 1E 000B R          C		MOV	psdata_seg:$P_DBCSEV_SEG,bx ;AC034; save EV segment (tm11)
 06B8                        C	$P_DBCS00:				;AN000;
 06B8  8B 36 0009 R          C		MOV	SI,psdata_seg:$P_DBCSEV_OFF ;AC034; load EV offset
 06BC  8E 1E 000B R          C		MOV	DS,psdata_seg:$P_DBCSEV_SEG ;AC034; and segment
			     C	
 06C0                        C	$P_DBCS_LOOP:				;AN000;
 06C0  83 3C 00              C		CMP	WORD PTR [SI],0 	;AN000; zero vector ?
 06C3  74 10                 C		JE	$P_NON_DBCS		;AN000; then exit
			     C	
 06C5  3A 04                 C		CMP	AL,[SI] 		;AN000;
 06C7  72 08                 C		JB	$P_DBCS01		;AN000; Check if AL is in
			     C	
 06C9  3A 44 01              C		CMP	AL,[SI+BYTE]		;AN000;   range of
 06CC  77 03                 C		JA	$P_DBCS01		;AN000;      the vector
			     C	
 06CE  F9                    C		STC				;AN000; if yes, indicate DBCS and exit
 06CF  EB 05                 C		JMP	short $P_DBCS_EXIT	;AN000;
			     C	
 06D1                        C	$P_DBCS01:				;AN000;
 06D1  46                    C		INC	SI			;AC035; add '2' to
 06D2  46                    C		INC	SI			;AC035;  SI reg
			     C						;AN000; get next vector
			     C	;(changed ;AC035;) ADD	   SI,2 	;AN000; get next vector
 06D3  EB EB                 C		JMP	short $P_DBCS_LOOP	;AN000; loop until zero vector found
			     C	
 06D5                        C	$P_NON_DBCS:				;AN000;
 06D5  F8                    C		CLC				;AN000; indicate SBCS
 06D6                        C	$P_DBCS_EXIT:				;AN000;
 06D6  5B                    C		POP	bx			;AN000; (tm11)
 06D7  5E                    C		POP	SI			;AN000;
 06D8  1F                    C		POP	DS			;AN000;
 06D9  C3                    C		RET				;AN000;
 06DA                        C	$P_Chk_DBCS ENDP			;AN000;
 06DA				CSEG	ENDS				;AN000;
					END				;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Symbols-1


Structures and Records:

                N a m e                 Width   # fields
                                        Shift   Width   Mask    Initial

$P_CDI . . . . . . . . . . . . .  	0022	000C
  $P_CDI_DATEF . . . . . . . . .  	0000
  $P_CDI_MONEY . . . . . . . . .  	0002
  $P_CDI_1000  . . . . . . . . .  	0007
  $P_CDI_DEC . . . . . . . . . .  	0009
  $P_CDI_DATES . . . . . . . . .  	000B
  $P_CDI_TIMES . . . . . . . . .  	000D
  $P_CDI_TIMEF . . . . . . . . .  	0011
$P_CONTROL_BLK . . . . . . . . .  	000A	0006
  $P_MATCH_FLAG  . . . . . . . .  	0000
  $P_FUNCTION_FLAG . . . . . . .  	0002
  $P_RESULT_BUF  . . . . . . . .  	0004
  $P_VALUE_LIST  . . . . . . . .  	0006
  $P_NID . . . . . . . . . . . .  	0008
  $P_KEYORSW . . . . . . . . . .  	0009
$P_DOS_TBL . . . . . . . . . . .  	0005	0003
  $P_DOS_INFOID  . . . . . . . .  	0000
  $P_DOS_TBL_OFF . . . . . . . .  	0001
  $P_DOS_TBL_SEG . . . . . . . .  	0003
$P_PARMSX_BLK  . . . . . . . . .  	0004	0003
  $P_MINP  . . . . . . . . . . .  	0000
  $P_MAXP  . . . . . . . . . . .  	0001
  $P_1ST_CONTROL . . . . . . . .  	0002
$P_PARMS_BLK . . . . . . . . . .  	0004	0003
  $P_PARMSX_ADDRESS  . . . . . .  	0000
  $P_NUM_EXTRA . . . . . . . . .  	0002
  $P_LEN_EXTRA_DELIM . . . . . .  	0003
$P_RESULT_BLK  . . . . . . . . .  	0008	0004
  $P_TYPE  . . . . . . . . . . .  	0000
  $P_ITEM_TAG  . . . . . . . . .  	0001
  $P_SYNONYM_PTR . . . . . . . .  	0002
  $P_PICKED_VAL  . . . . . . . .  	0004
$P_VAL_LIST  . . . . . . . . . .  	0009	0005
  $P_NUMOFLIST . . . . . . . . .  	0000
  $P_VAL_XL  . . . . . . . . . .  	0001
  $P_VAL_XH  . . . . . . . . . .  	0003
  $P_VAL_YL  . . . . . . . . . .  	0005
  $P_VAL_YH  . . . . . . . . . .  	0007

Segments and Groups:

                N a m e         	Length	 Align	Combine Class

CSEG . . . . . . . . . . . . . .  	06DA	PARA	PUBLIC	'CODE'
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Symbols-2


Symbols:            

                N a m e         	Type	 Value	 Attr

BASESW . . . . . . . . . . . . .  	NUMBER	0001	

CAPSW  . . . . . . . . . . . . .  	NUMBER	0001	
CMPXSW . . . . . . . . . . . . .  	NUMBER	0000	

DATESW . . . . . . . . . . . . .  	NUMBER	0000	
DRVSW  . . . . . . . . . . . . .  	NUMBER	0001	

FARSW  . . . . . . . . . . . . .  	NUMBER	0000	
FILESW . . . . . . . . . . . . .  	NUMBER	0001	

INCSW  . . . . . . . . . . . . .  	NUMBER	0000	

KEYSW  . . . . . . . . . . . . .  	NUMBER	0000	

LFEOLSW  . . . . . . . . . . . .  	NUMBER	0001	

NUMSW  . . . . . . . . . . . . .  	NUMBER	0000	

PSDATA_SEG . . . . . . . . . . .  	ALIAS	 DS		

QUSSW  . . . . . . . . . . . . .  	NUMBER	0000	

SWSW . . . . . . . . . . . . . .  	NUMBER	0001	
SYSPARSE . . . . . . . . . . . .  	N PROC	00AB	CSEG	Global	Length = 013E

TIMESW . . . . . . . . . . . . .  	NUMBER	0000	

VAL1SW . . . . . . . . . . . . .  	NUMBER	0000	
VAL2SW . . . . . . . . . . . . .  	NUMBER	0000	
VAL3SW . . . . . . . . . . . . .  	NUMBER	0000	

$P_0099  . . . . . . . . . . . .  	N PROC	042B	CSEG	Length = 000E
$P_0099ERR . . . . . . . . . . .  	L NEAR	0437	CSEG
$P_ASCII80 . . . . . . . . . . .  	NUMBER	0080	
$P_BRIDGE  . . . . . . . . . . .  	L NEAR	034C	CSEG
$P_CAPS_RET  . . . . . . . . . .  	L NEAR	042A	CSEG
$P_CAP_CHAR  . . . . . . . . . .  	NUMBER	0002	
$P_CAP_FILE  . . . . . . . . . .  	NUMBER	0001	
$P_CHAR_CAP_PTR  . . . . . . . .  	L BYTE	0097	CSEG
$P_CHECK_MATCH_FLAGS . . . . . .  	N PROC	0326	CSEG	Length = 007A
$P_CHKDFIN . . . . . . . . . . .  	L NEAR	0656	CSEG
$P_CHK_DBCS  . . . . . . . . . .  	N PROC	0689	CSEG	Length = 0051
$P_CHK_DELIM . . . . . . . . . .  	N PROC	0610	CSEG	Length = 005C
$P_CHK_DELIM00 . . . . . . . . .  	L NEAR	0628	CSEG
$P_CHK_DELIM01 . . . . . . . . .  	L NEAR	0638	CSEG
$P_CHK_DELIM_EXIT  . . . . . . .  	L NEAR	0656	CSEG
$P_CHK_DELIM_EXIT0 . . . . . . .  	L NEAR	0659	CSEG
$P_CHK_DELIM_LOOP  . . . . . . .  	L NEAR	064C	CSEG
$P_CHK_DELIM_NZ  . . . . . . . .  	L NEAR	0654	CSEG
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Symbols-3


$P_CHK_EOL . . . . . . . . . . .  	N PROC	05DA	CSEG	Length = 0036
$P_CHK_EOL_EXIT  . . . . . . . .  	L NEAR	060D	CSEG
$P_CHK_EOL_LOOP  . . . . . . . .  	L NEAR	0603	CSEG
$P_CHK_EOL_NZ  . . . . . . . . .  	L NEAR	060B	CSEG
$P_CHK_IF_DATA_REQUIRED  . . . .  	L NEAR	027B	CSEG
$P_CHK_KEY_CONTROL . . . . . . .  	N PROC	0218	CSEG	Length = 0002
$P_CHK_POS_CONTROL . . . . . . .  	N PROC	01E9	CSEG	Length = 002F
$P_CHK_SWITCH  . . . . . . . . .  	N PROC	066C	CSEG	Length = 001D
$P_CHK_SW_CONTROL  . . . . . . .  	N PROC	024A	CSEG	Length = 005A
$P_CHK_SW_ERR0 . . . . . . . . .  	L NEAR	0296	CSEG
$P_CHK_SW_EXIT . . . . . . . . .  	L NEAR	0299	CSEG
$P_CHK_SW_SINGLE_EXIT  . . . . .  	L NEAR	02A3	CSEG
$P_CMPX_S  . . . . . . . . . . .  	NUMBER	0400	
$P_COLON . . . . . . . . . . . .  	NUMBER	003A	
$P_COLON_IS_NOT_NECESSARY  . . .  	NUMBER	0020	
$P_COLON_PERIOD  . . . . . . . .  	NUMBER	0001	
$P_COMMA . . . . . . . . . . . .  	NUMBER	002C	
$P_COMPLEX . . . . . . . . . . .  	NUMBER	0004	
$P_CPC00 . . . . . . . . . . . .  	L NEAR	01F6	CSEG
$P_CPC01 . . . . . . . . . . . .  	L NEAR	0213	CSEG
$P_CPC02 . . . . . . . . . . . .  	L NEAR	0208	CSEG
$P_CPC_EXIT  . . . . . . . . . .  	L NEAR	0216	CSEG
$P_CR  . . . . . . . . . . . . .  	NUMBER	000D	
$P_CSW00 . . . . . . . . . . . .  	L NEAR	0290	CSEG
$P_DATE_DMY  . . . . . . . . . .  	NUMBER	0001	
$P_DATE_F  . . . . . . . . . . .  	NUMBER	0007	
$P_DATE_MDY  . . . . . . . . . .  	NUMBER	0000	
$P_DATE_S  . . . . . . . . . . .  	NUMBER	1000	
$P_DATE_YMD  . . . . . . . . . .  	NUMBER	0002	
$P_DBCS00  . . . . . . . . . . .  	L NEAR	06B8	CSEG
$P_DBCS01  . . . . . . . . . . .  	L NEAR	06D1	CSEG
$P_DBCS02  . . . . . . . . . . .  	L NEAR	06B0	CSEG
$P_DBCSEV_OFF  . . . . . . . . .  	L WORD	0009	CSEG
$P_DBCSEV_SEG  . . . . . . . . .  	L WORD	000B	CSEG
$P_DBCS_EXIT . . . . . . . . . .  	L NEAR	06D6	CSEG
$P_DBCS_LOOP . . . . . . . . . .  	L NEAR	06C0	CSEG
$P_DBSP1 . . . . . . . . . . . .  	NUMBER	0081	
$P_DBSP2 . . . . . . . . . . . .  	NUMBER	0040	
$P_DCC00 . . . . . . . . . . . .  	L NEAR	0400	CSEG
$P_DCC01 . . . . . . . . . . . .  	L NEAR	041B	CSEG
$P_DCC_GO  . . . . . . . . . . .  	L NEAR	03F0	CSEG
$P_DCS00 . . . . . . . . . . . .  	L NEAR	03D9	CSEG
$P_DCS01 . . . . . . . . . . . .  	L NEAR	03DA	CSEG
$P_DCS_EXIT  . . . . . . . . . .  	L NEAR	03DD	CSEG
$P_DCS_LOOP  . . . . . . . . . .  	L NEAR	03C7	CSEG
$P_DOSTBL_BL . . . . . . . . . .  	NUMBER	0005	
$P_DOSTBL_CHAR . . . . . . . . .  	NUMBER	0002	
$P_DOSTBL_DEF  . . . . . . . . .  	NUMBER	-0001	
$P_DOSTBL_FILE . . . . . . . . .  	NUMBER	0004	
$P_DOS_GETEV . . . . . . . . . .  	NUMBER	6300	
$P_DOS_GET_CDI . . . . . . . . .  	NUMBER	3800	
$P_DOS_GET_TBL . . . . . . . . .  	NUMBER	0065	
$P_DO_CAPS_CHAR  . . . . . . . .  	N PROC	03E0	CSEG	Length = 004B
$P_DO_CAPS_STRING  . . . . . . .  	N PROC	03C3	CSEG	Length = 001D
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Symbols-4


$P_DQUOTE  . . . . . . . . . . .  	NUMBER	0022	
$P_DRIVE . . . . . . . . . . . .  	NUMBER	0006	
$P_DRIVE_FORMAT  . . . . . . . .  	N PROC	0576	CSEG	Length = 0040
$P_DRVF00  . . . . . . . . . . .  	L NEAR	0596	CSEG
$P_DRV_ERR . . . . . . . . . . .  	L NEAR	05AD	CSEG
$P_DRV_EXIT  . . . . . . . . . .  	L NEAR	05B3	CSEG
$P_DRV_ONLY  . . . . . . . . . .  	NUMBER	0100	
$P_DRV_ONLY_EXIT . . . . . . . .  	L NEAR	0561	CSEG
$P_DX  . . . . . . . . . . . . .  	L WORD	0006	CSEG
$P_EOL . . . . . . . . . . . . .  	NUMBER	0000	
$P_EQU . . . . . . . . . . . . .  	NUMBER	0001	
$P_ERROR_FILESPEC  . . . . . . .  	NUMBER	0001	
$P_ERR_FLAG  . . . . . . . . . .  	L BYTE	00AA	CSEG
$P_EXIT_AT_EXTRA . . . . . . . .  	L NEAR	05D8	CSEG
$P_EXTRA . . . . . . . . . . . .  	NUMBER	0020	
$P_FILEF00 . . . . . . . . . . .  	L NEAR	0545	CSEG
$P_FILEF01 . . . . . . . . . . .  	L NEAR	0541	CSEG
$P_FILEF02 . . . . . . . . . . .  	L NEAR	0552	CSEG
$P_FILEF03 . . . . . . . . . . .  	L NEAR	052D	CSEG
$P_FILEF_ERR . . . . . . . . . .  	L NEAR	0519	CSEG
$P_FILEF_LOOP0 . . . . . . . . .  	L NEAR	0502	CSEG
$P_FILEF_LOOP1 . . . . . . . . .  	L NEAR	052F	CSEG
$P_FILEF_RLT . . . . . . . . . .  	L NEAR	0550	CSEG
$P_FILESP_CHAR . . . . . . . . .  	L BYTE	00A1	CSEG
$P_FILESP_CHK  . . . . . . . . .  	N PROC	0562	CSEG	Length = 0014
$P_FILESP_EXIT . . . . . . . . .  	L NEAR	0573	CSEG
$P_FILESP_LEN  . . . . . . . . .  	NUMBER	0009	
$P_FILESP_LOOP . . . . . . . . .  	L NEAR	056B	CSEG
$P_FILE_CAP_PTR  . . . . . . . .  	L BYTE	009C	CSEG
$P_FILE_FORMAT . . . . . . . . .  	N PROC	04FB	CSEG	Length = 0067
$P_FILE_SPC  . . . . . . . . . .  	NUMBER	0200	
$P_FILE_SPEC . . . . . . . . . .  	NUMBER	0005	
$P_FILL_RESULT . . . . . . . . .  	N PROC	02A4	CSEG	Length = 0082
$P_FIN . . . . . . . . . . . . .  	L NEAR	00DC	CSEG
$P_FLAGS . . . . . . . . . . . .  	L WORD	000D	CSEG
$P_FLAGS1  . . . . . . . . . . .  	BYTE	000D	CSEG
$P_FLAGS2  . . . . . . . . . . .  	BYTE	000E	CSEG
$P_FOUND_SYNONYM . . . . . . . .  	L WORD	0015	CSEG
$P_IG_COLON  . . . . . . . . . .  	NUMBER	0010	
$P_I_HAVE_DELIM  . . . . . . . .  	NUMBER	0001	
$P_I_HAVE_EOL  . . . . . . . . .  	NUMBER	0002	
$P_I_USE_DEFAULT . . . . . . . .  	NUMBER	0000	
$P_KEYORSW_EXIT  . . . . . . . .  	L NEAR	023B	CSEG
$P_KEYORSW_FOUND . . . . . . . .  	L NEAR	0236	CSEG
$P_KEYORSW_LOOP  . . . . . . . .  	L NEAR	0229	CSEG
$P_KEYORSW_NOT_FOUND . . . . . .  	L NEAR	0233	CSEG
$P_KEYORSW_PTR . . . . . . . . .  	L WORD	0011	CSEG
$P_KEYWORD . . . . . . . . . . .  	NUMBER	003D	
$P_KEY_CMP . . . . . . . . . . .  	NUMBER	0008	
$P_KEY_MANAGER . . . . . . . . .  	L NEAR	019E	CSEG
$P_KEY_MGR_LOOP  . . . . . . . .  	L NEAR	01BD	CSEG
$P_KEY_NOT_FOUND . . . . . . . .  	L NEAR	01CB	CSEG
$P_LEN_PARMS . . . . . . . . . .  	NUMBER	0004	
$P_LEN_RANGE . . . . . . . . . .  	NUMBER	0009	
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Symbols-5


$P_LEN_STRING  . . . . . . . . .  	NUMBER	0003	
$P_LEN_VALUE . . . . . . . . . .  	NUMBER	0005	
$P_LF  . . . . . . . . . . . . .  	NUMBER	000A	
$P_LIST_IDX  . . . . . . . . . .  	NUMBER	0002	
$P_LPAREN  . . . . . . . . . . .  	NUMBER	0028	
$P_MAKE_LOWER  . . . . . . . . .  	NUMBER	0020	
$P_MAKE_UPPER  . . . . . . . . .  	NUMBER	00DF	
$P_MAT . . . . . . . . . . . . .  	L NEAR	034A	CSEG
$P_MATCH03 . . . . . . . . . . .  	L NEAR	034F	CSEG
$P_MATCH06 . . . . . . . . . . .  	L NEAR	0367	CSEG
$P_MATCH07 . . . . . . . . . . .  	L NEAR	037C	CSEG
$P_MATCH09 . . . . . . . . . . .  	L NEAR	038A	CSEG
$P_MATCH2_EXIT . . . . . . . . .  	L NEAR	039E	CSEG
$P_MATCH_EXIT  . . . . . . . . .  	L NEAR	038A	CSEG
$P_MBP_EXIT  . . . . . . . . . .  	L NEAR	0248	CSEG
$P_MBP_LOOP  . . . . . . . . . .  	L NEAR	023E	CSEG
$P_MINUS . . . . . . . . . . . .  	NUMBER	002D	
$P_MOVEBP_NUL  . . . . . . . . .  	N PROC	023E	CSEG	Length = 000C
$P_NEG . . . . . . . . . . . . .  	NUMBER	0002	
$P_NON_DBCS  . . . . . . . . . .  	L NEAR	06D5	CSEG
$P_NOT_APPLICABLE  . . . . . . .  	L NEAR	04CF	CSEG
$P_NOT_IN_KEY  . . . . . . . . .  	NUMBER	0004	
$P_NOT_IN_STR  . . . . . . . . .  	NUMBER	0008	
$P_NOT_IN_SW . . . . . . . . . .  	NUMBER	0003	
$P_NOT_IN_VAL  . . . . . . . . .  	NUMBER	0007	
$P_NO_ERROR  . . . . . . . . . .  	NUMBER	0000	
$P_NO_NRNG . . . . . . . . . . .  	NUMBER	0000	
$P_NO_SET_EXTRA  . . . . . . . .  	L NEAR	0668	CSEG
$P_NO_TAG  . . . . . . . . . . .  	NUMBER	00FF	
$P_NULL  . . . . . . . . . . . .  	NUMBER	0000	
$P_NUMBER  . . . . . . . . . . .  	NUMBER	0001	
$P_NUM_VAL . . . . . . . . . . .  	NUMBER	8000	
$P_NVAL_NONE . . . . . . . . . .  	NUMBER	0000	
$P_NVAL_RANGE  . . . . . . . . .  	NUMBER	0001	
$P_NVAL_STRING . . . . . . . . .  	NUMBER	0003	
$P_NVAL_VALUE  . . . . . . . . .  	NUMBER	0002	
$P_OPTIONAL  . . . . . . . . . .  	NUMBER	0001	
$P_OP_MISSING  . . . . . . . . .  	NUMBER	0002	
$P_ORDINAL . . . . . . . . . . .  	L WORD	0000	CSEG
$P_OUT_OF_RANGE  . . . . . . . .  	NUMBER	0006	
$P_PACK_END  . . . . . . . . . .  	L NEAR	0130	CSEG
$P_PACK_END_BACKUP_SI  . . . . .  	L NEAR	010E	CSEG
$P_PACK_END_BY_EOL . . . . . . .  	L NEAR	012F	CSEG
$P_PACK_LOOP . . . . . . . . . .  	L NEAR	00F2	CSEG
$P_PERIOD  . . . . . . . . . . .  	NUMBER	002E	
$P_PERIOD_ONLY . . . . . . . . .  	NUMBER	0002	
$P_PL00  . . . . . . . . . . . .  	L NEAR	0123	CSEG
$P_PL01  . . . . . . . . . . . .  	L NEAR	0118	CSEG
$P_PLUS  . . . . . . . . . . . .  	NUMBER	002B	
$P_POSITIONAL_MANAGER  . . . . .  	L NEAR	014E	CSEG
$P_QUOTED_STRING . . . . . . . .  	NUMBER	0009	
$P_QU_STRING . . . . . . . . . .  	NUMBER	0080	
$P_RC  . . . . . . . . . . . . .  	L WORD	0002	CSEG
$P_RCOL00  . . . . . . . . . . .  	L NEAR	03B7	CSEG
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Symbols-6


$P_RCOL01  . . . . . . . . . . .  	L NEAR	03BD	CSEG
$P_RCOL_EXIT . . . . . . . . . .  	L NEAR	03C0	CSEG
$P_RCOL_LOOP . . . . . . . . . .  	L NEAR	03A2	CSEG
$P_RC_EOL  . . . . . . . . . . .  	NUMBER	-0001	
$P_REMOVE_COLON  . . . . . . . .  	N PROC	03A0	CSEG	Length = 0023
$P_REPEAT  . . . . . . . . . . .  	NUMBER	0002	
$P_RETURN_TO_CALLER  . . . . . .  	L NEAR	01D1	CSEG
$P_RETURN_TO_CALLER0 . . . . . .  	L NEAR	01D1	CSEG
$P_RLT00 . . . . . . . . . . . .  	L NEAR	02CB	CSEG
$P_RLT01 . . . . . . . . . . . .  	L NEAR	02D5	CSEG
$P_RLT02 . . . . . . . . . . . .  	L NEAR	02C1	CSEG
$P_RLT03 . . . . . . . . . . . .  	L NEAR	02E7	CSEG
$P_RLT04 . . . . . . . . . . . .  	L NEAR	02BD	CSEG
$P_RLT05 . . . . . . . . . . . .  	L NEAR	02F9	CSEG
$P_RLT_CAP00 . . . . . . . . . .  	L NEAR	030D	CSEG
$P_RLT_CAP01 . . . . . . . . . .  	L NEAR	0319	CSEG
$P_RLT_CAP02 . . . . . . . . . .  	L NEAR	0316	CSEG
$P_RLT_EXIT  . . . . . . . . . .  	L NEAR	0324	CSEG
$P_RM_COLON  . . . . . . . . . .  	NUMBER	0010	
$P_RPAREN  . . . . . . . . . . .  	NUMBER	0029	
$P_SAVESI_CMPX . . . . . . . . .  	L WORD	000F	CSEG
$P_SAVE_EOB  . . . . . . . . . .  	L WORD	0013	CSEG
$P_SCOM00  . . . . . . . . . . .  	L NEAR	04A5	CSEG
$P_SCOM01  . . . . . . . . . . .  	L NEAR	04B7	CSEG
$P_SCOM02  . . . . . . . . . . .  	L NEAR	04E3	CSEG
$P_SCOM03  . . . . . . . . . . .  	L NEAR	0497	CSEG
$P_SCOM04  . . . . . . . . . . .  	L NEAR	0482	CSEG
$P_SCOM05  . . . . . . . . . . .  	L NEAR	0494	CSEG
$P_SCOM_DIFFER . . . . . . . . .  	L NEAR	04EE	CSEG
$P_SCOM_DIFFER0  . . . . . . . .  	L NEAR	04B9	CSEG
$P_SCOM_EXIT . . . . . . . . . .  	L NEAR	04F6	CSEG
$P_SCOM_LOOP . . . . . . . . . .  	L NEAR	0464	CSEG
$P_SCOM_SAME . . . . . . . . . .  	L NEAR	04F1	CSEG
$P_SEARCH_KEYORSW  . . . . . . .  	N PROC	021A	CSEG	Length = 0024
$P_SIGNED  . . . . . . . . . . .  	NUMBER	0080	
$P_SIM00 . . . . . . . . . . . .  	L NEAR	044C	CSEG
$P_SIM01 . . . . . . . . . . . .  	L NEAR	044C	CSEG
$P_SIMPLE_S  . . . . . . . . . .  	NUMBER	2000	
$P_SIMPLE_STRING . . . . . . . .  	N PROC	0439	CSEG	Length = 0025
$P_SIM_EXIT  . . . . . . . . . .  	L NEAR	0454	CSEG
$P_SIM_EXIT0 . . . . . . . . . .  	L NEAR	0456	CSEG
$P_SINGLE_EXIT . . . . . . . . .  	L NEAR	01E7	CSEG
$P_SI_SAVE . . . . . . . . . . .  	L WORD	0004	CSEG
$P_SKIP_DELIM  . . . . . . . . .  	N PROC	05B6	CSEG	Length = 0024
$P_SKIP_DELIM_CY . . . . . . . .  	L NEAR	05D2	CSEG
$P_SKIP_DELIM_EXIT . . . . . . .  	L NEAR	05D6	CSEG
$P_SKIP_DELIM_LOOP . . . . . . .  	L NEAR	05B6	CSEG
$P_SKIP_DELIM_NCY  . . . . . . .  	L NEAR	05D5	CSEG
$P_SLASH . . . . . . . . . . . .  	NUMBER	002F	
$P_SNUM_VAL  . . . . . . . . . .  	NUMBER	4000	
$P_SPACE . . . . . . . . . . . .  	NUMBER	0020	
$P_START . . . . . . . . . . . .  	L NEAR	00E0	CSEG
$P_STRING  . . . . . . . . . . .  	NUMBER	0003	
$P_STRING_BUF  . . . . . . . . .  	L BYTE	0017	CSEG	Length = 0080
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:53
COMPP.SAL - COMP SYSTEM COMMAND LINE PARSER                 Symbols-7


$P_STRING_BUF_END  . . . . . . .  	NEAR	0097	CSEG
$P_STRING_COMP . . . . . . . . .  	N PROC	045E	CSEG	Length = 009D
$P_STRUC_L1  . . . . . . . . . .  	L NEAR	0688	CSEG
$P_STRUC_L12 . . . . . . . . . .  	L NEAR	0687	CSEG
$P_STRUC_L2  . . . . . . . . . .  	L NEAR	067E	CSEG
$P_STRUC_L5  . . . . . . . . . .  	L NEAR	067B	CSEG
$P_SW  . . . . . . . . . . . . .  	NUMBER	0040	
$P_SWITCH  . . . . . . . . . . .  	NUMBER	002F	
$P_SW_CMP  . . . . . . . . . . .  	NUMBER	0010	
$P_SW_MANAGER  . . . . . . . . .  	L NEAR	0173	CSEG
$P_SW_MGR_LOOP . . . . . . . . .  	L NEAR	0188	CSEG
$P_SW_NOT_FOUND  . . . . . . . .  	L NEAR	0196	CSEG
$P_SYNTAX  . . . . . . . . . . .  	NUMBER	0009	
$P_TAB . . . . . . . . . . . . .  	NUMBER	0009	
$P_TERMINATOR  . . . . . . . . .  	L BYTE	0008	CSEG
$P_TIME12  . . . . . . . . . . .  	NUMBER	0004	
$P_TIME12AM  . . . . . . . . . .  	NUMBER	0001	
$P_TIME_AGAIN  . . . . . . . . .  	NUMBER	0002	
$P_TIME_F  . . . . . . . . . . .  	NUMBER	0008	
$P_TIME_S  . . . . . . . . . . .  	NUMBER	0800	
$P_TOO_MANY  . . . . . . . . . .  	NUMBER	0001	
$P_TOO_MANY_ERROR  . . . . . . .  	L NEAR	016B	CSEG
@CPU . . . . . . . . . . . . . .  	TEXT  0101h		
@FILENAME  . . . . . . . . . . .  	TEXT  compp		
@VERSION . . . . . . . . . . . .  	TEXT  510		


   3607 Source  Lines
   3607 Total   Lines
    320 Symbols

  46346 + 237552 Bytes symbol space free

      0 Warning Errors
      0 Severe  Errors
