Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-1


				.ALPHA					;AN000;
				;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
				;
				;	DUMMY DATA SEGMENT
				;
				;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 0000				DATA	SEGMENT BYTE PUBLIC 'DATA'      ;AN000;
 0000				DATA	       ENDS			;AN000;
				DATA
				;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
				;
				;	PARSER INFORMATION
				;
				;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
				.LIST					;AN000;
				;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 0000				PARSER	SEGMENT PARA PUBLIC 'PARSER'    ;AN000;
					ASSUME	CS:PARSER,DS:DATA,ES:DATA;AN000
				;
				;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
					PUBLIC	SYSPARSE		;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-2


				PAGE					;AN000;
					INCLUDE PARSE.ASM		;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-3


			     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 mus
				t point to psdata.
			     C	;	   - basesw = 0 	 means	 ES seg
				. override for psdata access &
			     C	;					 ES mus
				t point to psdata.
			     C	;
			     C	;
			     C	IFNDEF basesw				;AN022;
 =                           C	   psdata_seg EQU   CS			;AN022;
			     C	ENDIF					;AN022;
			     C	
			     C	if incsw				;AN000;
				 If incsw = 1 then (tm03)
			     C	   include psdata.inc			;AN000;
				    include psdata.inc (tm03)
			     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
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-4


			     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;
 = 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 ;AN0
				00; make upper case character
			     C	
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-5


			     C			   PAGE 		   ;AN0
				00;
			     C	;-------- DOS function call related equs
			     C	
 = 3800                      C	$P_DOS_Get_CDI	   equ	3800h		;AN000;
				 get country dependent information
			     C						; by th
				is 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 th
				is call following information
			     C						; is re
				turned.
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-6


			     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                  5/17/24 09:44:33
                                                             Page     1-7


			     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 s
				tructure
			     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		
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-8


					; # 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                  5/17/24 09:44:33
                                                             Page     1-9


			     C			   PAGE 		;AN000;
			     C	;----------------------------------------------
				-----------------------------------------------
				------------
			     C	; << Control field definition  >>
			     C	;
			     C	;
			     C	;CONTROL   LABEL   BYTE
			     C	;	   DW	   MATCH_FLAGS	   ; CONTROLS T
				YPE MATCHED
			     C	;				   ; 8000H=NUME
				RIC VALUE, (VALUE LIST WILL BE CHECKED)
			     C	;				   ; 4000H=SIGN
				ED NUMERIC VALUE (VALUE LIST WILL BE CHECKED)
			     C	;				   ; 2000H=SIMP
				LE 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=COMP
				LEX LIST (VALUE LIST WON'T BE CHECKED)
			     C	;				   ; 0200H=FILE
				 SPEC (VALUE LIST WON'T BE CHECKED)
			     C	;				   ; 0100H=DRIV
				E ONLY (VALUE LIST WON'T BE CHECKED)
			     C	;				   ; 0080H=QUOT
				ED STRING (VALUE LIST WON'T BE CHECKED)
			     C	;				   ; 0010H=IGNO
				RE ":" AT END IN MATCH
			     C	;				   ; 0002H=REPE
				ATS ALLOWED
			     C	;				   ; 0001H=OPTI
				ONAL
			     C	;	   DW	   FUNCTION_FLAGS
			     C	;				   ; 0001H=CAP 
				RESULT BY FILE TABLE
			     C	;				   ; 0002H=CAP 
				RESULT BY CHAR TABLE
			     C	;				   ; 0010H=REMO
				VE ":" AT END
			     C	; (tm10)			   ; 0020H=colo
				n is not necessary for switch
			     C	;	   DW	   RESULT	   ; RESULT BUF
				FER
			     C	;	   DW	   VALUES	   ; VALUE LIST
				S
			     C	;	   DB	   nid		   ; NUMBER OF 
				KEYWORD/SWITCH SYNONYMS IN FOLLOWING LIST
			     C	;	   DB	   "...",0         ; IF n >0, K
				EYWORD 1
			     C	;	   :
			     C	;
			     C	;Note:
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-10


			     C	;    - The MATCH_FLAG is bit significant. You c
				an set, for example, TIME bit and
			     C	;      DATE bit simalteniously.
			     C	;
			     C	;      The parser examins each bit along with t
				he 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 requ
				ire '=' or '/'. When you need a
			     C	;      switch, for example, '/A', then STRING p
				oints to;
			     C	;
			     C	;			DB    1 	; numbe
				r of following synonyms
			     C	;			DB   '/A',0
			     C	;
			     C	;      When you need a keyword, for example, 'C
				ODEPAGE=', then "...",0 will be;
			     C	;
			     C	;			DB    1 	; numbe
				r of following synonyms
			     C	;			DB   'CODEPAGE=',0
			     C	;
			     C	;
			     C	;    - "..." must consist of upper case charact
				ers only because the parser
			     C	;      performs pattern matching after converti
				ng input to upper case (by
			     C	;      using the current country upper case tab
				le)
			     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 	; numbe
				r of following synonyms
			     C	;			DB    '/A',0
			     C	;			DB    '/B',0
			     C	;----------------------------------------------
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-11


				-----------------------------------------------
				------------
			     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
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-12


 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                  5/17/24 09:44:33
                                                             Page     1-13


			     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 charac
				ters only because the parser
			     C	;      performs pattern matching after converti
				ng input to upper case (by
			     C	;      using the current country upper case tab
				le)
			     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
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-14


 = 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                  5/17/24 09:44:33
                                                             Page     1-15


			     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 provi
				ded.
			     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 correspondi
				ng 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 .
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-16


			     C	;	    ³	DB	SECONDS    ;(0-59)
						0 is filled when the correspond
				ing field was not specified .
			     C	;	    ³	DB	HUNDREDTHS ;(0-99)
			     C	;	    À
			     C	;
			     C	;
			     C	;Note: ITEM_TAG is 0FFH when the caller does no
				t 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, whe
				n 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
 0008                        C	$P_Result_Blk	   ends 		;AN000;
			     C	;--------------------------------
			     C	;**** values for the type field in the result b
				lock
			     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
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-17


 = 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                  5/17/24 09:44:33
                                                             Page     1-18


			     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 ;AN03
				8; to reference first byte flags
 = 000E                      C	$P_Flags2	   equ	byte ptr $P_Flags+1 ;AN
				038; to reference second byte flags only
			     C	
			     C	;in second byte of $P_Flags, referenced as $P_F
				lags2:
 = 0001                      C	$P_equ		   equ	01h	      ;AN000; "
				=" packed in string buffet
 = 0002                      C	$P_Neg		   equ	02h	      ;AN000; N
				egative value
 = 0004                      C	$P_Time12	   equ	04h	      ;AN000; s
				et when PM is specified
 = 0008                      C	$P_Key_Cmp	   equ	08h	      ;AN000; s
				et when keyword compare
 = 0010                      C	$P_SW_Cmp	   equ	10h	      ;AN000; s
				et when switch compare
 = 0020                      C	$P_Extra	   equ	20h	      ;AN000; s
				et when extra delimiter found
 = 0040                      C	$P_SW		   equ	40h	      ;AN000; s
				et when switch found (tm08)
 = 0080                      C	$P_Signed	   equ	80h	      ;AN000; s
				igned numeric specified
			     C	
			     C	;in first byte of $P_Flags, referenced as $P_Fl
				ags1:
 = 0001                      C	$P_time12am	   equ	01h	      ;AN038; s
				et when AM is specified on time
 = 0002                      C	$P_TIME_AGAIN	   EQU	02H	      ;AN039; S
				ET 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
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-19


 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	; (tm06) IF	   FileSW		;AN000;
				(Check if file spec is supported)
			     C	; (tm05) IF	   QusSW		;AN000;
				(Check if quoted string is supported)
			     C	;(deleted ;AN025;) IF		      QusSW+Cmp
				xSW	   ; (tm05) ;AN000;(Check if quoted str
				ing is supported)
			     C	;(deleted ;AN025;) $P_SorD_Quote      db   0
						   ;AN000; keep double or singl
				e quote
			     C	;(deleted ;AN025;) ENDIF		
						   ;AN000;(of QueSW)
			     C	IF		   KeySW		;AN029;
				 if keywords supported
 009C  0000                  C	$P_count_to_eol    dw	0		;AN029;
				 count of chars not including EOL
			     C	;	REGISTER EQUATES - SPECIAL USAGE FOR RE
				GISTERS
 =                           C	$P_REG_BH_CG_SW    EQU	BH		;AN029;
				0="NO CHANGES MADE", FF=CHANGES MADE
 =                           C	$P_REG_BL_DQ_SW    EQU	BL		;AN029;
				0=NOT IN QUOTES,FF=IN QUOTES
			     C	
 = 0022                      C	$P_DOUBLE_QUOTE    EQU	""""            ;AN029;
 = 203D                      C	$P_BL_EQ	   EQU	" ="            ;AN029;
 = 3D20                      C	$P_EQ_BL	   EQU	"= "            ;AN029;
 = 093D                      C	$P_TB_EQ	   EQU	093DH		;AN029;
				 ;"<TAB>="
 = 3D09                      C	$P_EQ_TB	   EQU	3D09H		;AN029;
				 ;"=<TAB>"
			     C	ENDIF					;AN029;
				 IF KeySW Supported
			     C	
			     C	; delimiter parsing
 = 0001                      C	$P_colon_period    equ	01		;AN032;
				 check for colon & period
 = 0002                      C	$P_period_only	   equ	02		;AN032;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-20


				 check only for period
			     C	
			     C	;filespec error flag
 009E  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	;**********************************************
				*************************
			     C	endif					;AN000;
				 endif		  (tm03)
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-21


			     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 a
				ll 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 inva
				lid parameter block or
			     C	;		    invalid value list. But thi
				s parser does NOT implement
			     C	;		    this feature. Therefore CY 
				always zero.
			     C	;
			     C	;	   CY = 0   AX = return code
			     C	;		    BL = terminated delimiter c
				ode
			     C	;		    CX = new operand ordinal
			     C	;		    SI = set past scaned operan
				d
			     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_Ch
				k_Key_Control
			     C	;	$P_Chk_Sw_Control, $P_Fill_Result
			     C	;
			     C	; Vars: $P_Ordinal(RW), $P_RC(RW), $P_SI_Save(R
				W), $P_DX(R), $P_Terminator(R)
			     C	;	$P_SaveSI_Cmpx(W), $P_Flags(RW), $P_Fou
				nd_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 ps
				data (tm03)
			     C	;  6/12/87 : $P_Bridge is missing when TimeSw e
				qu 0 and (CmpxSw equ 1 or
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-22


			     C	;	     DateSW equ 1)	      (tm04)
			     C	;  6/12/87 : $P_SorD_Quote is missing when QusS
				w equ 0 and CmpxSW equ 1
			     C	;				      (tm05) in
				 PSDATA.INC
			     C	;  6/12/87 : $P_FileSp_Char and $P_FileSP_Len a
				re missing
			     C	;	     when FileSW equ 0 and DrvSW equ 1 
				(tm06) in PSDATA.INC
			     C	;  6/18/87 : $VAL1 and $VAL3, $VAL2 and $VAL3 c
				an be used in the same
			     C	;	     value-list block	      (tm07)
			     C	;  6/20/87 : Add $P_SW to check if there's an o
				miting 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 wor
				k 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 use
				r (tm10)
			     C	;  6/29/87 : ECS call changes DS register but i
				t causes the address problem
			     C	;	     in user's routines. $P_Chk_DBCS (t
				m11)
			     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 wo
				rk correctly
			     C	;					  (tm13
				)
			     C	;  7/10/87 : Drive_only breaks 3 bytes after th
				e 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 ra
				nges 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 (matc
				h flags<>0 and <>1) not flagged
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-23


			     C	;	     as an error when missing.	Solutio
				n: 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 matc
				h flags for switches.  This
			     C	;	     allows the switch to be encountere
				d 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 checki
				ng for field separators
			     C	;	     within a date response, instead of
				 checking just for the one
			     C	;	     character defined by the COUNTRY D
				EPENDENT INFO, check for
			     C	;	     all three chars, "-", "/", and "."
				. Change $P_Chk_Switch to allow
			     C	;	     slashes in date strings when DateS
				w (assembler switch) is set.
			     C	
			     C	;  9/1/87  : Kerry S (;AN021)
			     C	;	     In PROC $P_String_Comp, when compa
				ring the switch or keyword on
			     C	;	     the command line with the string i
				n 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 b
				e the same length as the string
			     C	;	     preceeding the colon or equal on t
				he command line.
			     C	
			     C	;  8/28/87 : Kerry S (;AN022;)
			     C	;	     All references to data in PSDATA.I
				NC had CS overrides.  This caused
			     C	;	     problems for people who included i
				t themselves in a segment other
			     C	;	     than CS.  Added switch to allow in
				cluding 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
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-24


			     C	;	     into PUSH PSDATA_SEG.  In $P_Get_D
				ecNum PROC, fix AN020
			     C	;	     forced both TIME and DATE to use t
				he delims, "-","/",".".
			     C	;	     Created FLag, in $P_time_Format PR
				OC, to request the delim in
			     C	;	     BL be used if TIME is being parsed
				.
			     C	
			     C	;  9/24/87 : Ed K
			     C	;	     Removed the include to STRUC.INC.
					Replaced the STRUC macro
			     C	;	     invocations with their normally ex
				panded 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 foun
				d, 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 strin
				g with single quote.
			     C	;	     (apostrophe) $P_SorD_Quote is remo
				ved from PSDATA.INC.
			     C	;	     $P_SQuote EQU also removed from PS
				DATA.INC.  Any references to
			     C	;	     single quote in PROC prologues are
				 left as is for history reasons.
			     C	
			     C	;	     This fixes another bug, not mentio
				ned in p1672, in that two
			     C	;	     quote chars within a quoted string
				 is supposed to be reported as
			     C	;	     one quote character, but is report
				ed as two quotes.  This changed
			     C	;	     two instructions in PROC $P_Quoted
				_Str.
			     C	
			     C	;	     Also fixed are several JMP that ca
				used a NOP, these changed to
			     C	;	     have the SHORT operator to avoid t
				he 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 withi
				n SWITCH, BX reference to
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-25


			     C	;	     psdata buffer should have psdata_s
				eg.
			     C	
			     C	; 10/27/87 : Ed K (;AN027;) PTM2042 comma betwe
				en keywords implies
			     C	;	     positional missing.
			     C	
			     C	; 11/06/87 : Ed K (;AN028;) PTM 2315 Parser sho
				uld not use line feed
			     C	;	     as a line delimiter, should use ca
				rriage return.
			     C	;	     Define switch: LFEOLSW, if on, acc
				ept 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 filenam
				e 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 & tim
				e getting bad values.
			     C	;	     Vector to returned string has CS i
				nstead of Psdata_Seg, but
			     C	;	     when tried to fix it on previous v
				ersion, changed similar
			     C	;	     but wrong place.
			     C	
			     C	; 12/09/87 : Bill L (;AN032;) PTM 2772 colon an
				d period are now valid
			     C	;	     delimiters between hours, minutes,
				 seconds for time. And period
			     C	;	     and comma are valid delimiters bet
				ween seconds and 100th second.
			     C	
			     C	; 12/14/87 : Bill L (;AN033;) PTM 2722 if illeg
				al delimiter characters
			     C	;	     in a filespec, then flag an error.
			     C	
			     C	; 12/22/87 : Bill L (;AN034;)	    All local d
				ata to parser is now
			     C	;	     indexed off of the psdata_seg equa
				te 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 r
				eferences to local data changed
			     C	;	     to do this before, but not all ???
				??
			     C	
			     C	; 02/02/88 : Ed K (;AC035;) INSPECT utility, su
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-26


				ggests optimizations.
			     C	
			     C	; 02/05/88 : Ed K (;AN036;) P3372-UPPERCASE TRA
				NSLATION, 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 an
				d "am" should be error
			     C	
			     C	; 02/23/88 : Ed K (;AN039;) p3518 accept "comma
				" and "period" as decimal
			     C	;	     separator in TIME before hundredth
				s field.
			     C	;
			     C	;**********************************************
				*************************
			     C	IF FarSW				;AN000;
				(Check if need far return)
 009F                        C	SysParse proc far			;AN000;
			     C	ENDIF					;AN000;
				(of FarSW)
			     C	;	$SALUT	(4,9,17,41)
 009F  2E: C7 06 000D R 0000 C		mov	psdata_seg:$P_Flags,0	;AC034;
				 Clear all internal flags
 00A6  FC                    C		cld				      ;
				AN000; confirm forward direction
 00A7  2E: 89 0E 0000 R      C		mov	psdata_seg:$P_ordinal,cx      ;
				AC034; save operand ordinal
 00AC  2E: C7 06 0002 R 0000 C		mov	psdata_seg:$P_RC,$P_No_Error  ;
				AC034; Assume no error
 00B3  2E: C7 06 0015 R 0000 C		mov	psdata_seg:$P_Found_SYNONYM,0 ;
				AC034; initalize synonym pointer
			     C	
 00BA  2E: C7 06 0006 R 0000 C		mov	word ptr psdata_seg:$P_DX,0   ;
				AC034; (tm15)
			     C	IF KeySW				;AN029;
			     C	;IN CASE THE USER PUT OPTIONAL WHITESPACE CHARS
				 AROUND THE "=" USED IN
			     C	;KEYWORD DEFINITIONS, SCAN THE COMMAND LINE AND
				 COMPRESS OUT ANY WHITESPACES
			     C	;NEXT TO "=" BEFORE STARTING THE USUAL PARSING.
 00C1  51                    C	       push	 cx			;AN029;
 00C2  52                    C	       push	 dx			;AN029;
 00C3  57                    C	       push	 di			;AN029;
			     C	
 00C4  56                    C	       push	 si			;AN029;
				 remember where command line starts
 00C5  B9 FFFF               C	       mov	 cx,-1			;AN029;
				 init counter
			     C	;      $do
 00C8                        C	$P_loc_eol:				;AN029;
 00C8  41                    C		  inc	    cx			;AN029;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-27


				 bump counter of chars up to EOL
 00C9  AC                    C		  lodsb 			;AN029;
				 get a char from command line
 00CA  E8 0710 R             C		  CALL	    $P_Chk_EOL		;AN029;
				 see if AL is EOL char
			     C	
			     C	;      enddo z
 00CD  75 F9                 C	       jnz	 $P_loc_EOL		;AN029;
				 not found that EOL char
			     C	
 00CF  2E: 89 0E 009C R      C	       mov	 psdata_seg:$P_count_to_EOL,cx 
				;AN029;AC034;; save count of chars up to EOL
 00D4  5E                    C	       pop	 si			;AN029;
				 restore start of command line
			     C	
			     C	;scan command string for combinations including
				 "=",
			     C	;      and replace each with just the simple "=
				"
			     C	
			     C	;REPEAT UNTIL ONE PASS IS MADE WHEREIN NO CHANG
				ES WERE MADE
			     C	;  $do
 00D5                        C	$P_DO1: 			   ;AN029;
 00D5  56                    C	       push si			   ;AN029; reme
				mber where string started
 00D6  2E: 8B 0E 009C R      C	       MOV  CX,psdata_seg:$P_COUNT_TO_EOL ;AN02
				9;AC034;; set  count to no. chars in string,
			     C					   ;AN029; not 
				counting the EOL char
 00DB  33 DB                 C	       XOR  BX,BX		   ;AN029;SET $
				P_REG_BL_DQ_SW TO "NOT IN QUOTES", AND...
			     C					   ;AN029;SET $
				P_REG_BH_CG_SW TO "NO CHANGES MADE"
			     C	;MAKE ONE PASS THRU THE STRING, LOOKING AT EACH
				 CHARACTER
			     C	;      $do			   ;AN029;
 00DD                        C	$P_DO2: 			   ;AN029;
 00DD  80 3C 22              C		   cmp	BYTE PTR [SI],$P_double_quote ;
				AN029;
			     C	;	   $if	e		   ;AN029;if a 
				double quote was found
 00E0  75 02                 C		   JNE $P_IF3		   ;AN029;
 00E2  F6 D3                 C		       NOT  $P_REG_BL_DQ_SW ;AN029;TOGG
				LE THE DOUBLE QUOTE STATE SWITCH
			     C	;	   $endif		   ;AN029;
 00E4                        C	$P_IF3: 			   ;AN029;
 00E4  0A DB                 C		   OR	$P_REG_BL_DQ_SW,$P_REG_BL_DQ_SW
				 ;AN029;IS THE DOUBLE QUOTE SWITCH SET?
			     C	;	   $if	Z		   ;AN029;IF NO
				T IN DOUBLE QUOTES
 00E6  75 30                 C		   JNZ $P_IF5		   ;AN029;
 00E8  8B 04                 C		       mov  ax,word ptr [si] ;AN029; ge
				t pair to be checked out
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-28


 00EA  3D 203D               C		       cmp  ax,$P_BL_EQ    ;AN029;" ="
			     C	;	       $if  e,or	   ;AN029;
 00ED  74 0F                 C		       JE $P_LL6	   ;AN029;
 00EF  3D 3D20               C		       cmp  ax,$P_EQ_BL    ;AN029;"= "
			     C	;	       $if  e,or	   ;AN029;
 00F2  74 0A                 C		       JE $P_LL6	   ;AN029;
 00F4  3D 3D09               C		       cmp  ax,$P_EQ_TB    ;AN029; "=<t
				ab>"
			     C	;	       $if  e,or	   ;AN029;
 00F7  74 05                 C		       JE $P_LL6	   ;AN029;
 00F9  3D 093D               C		       cmp  ax,$P_TB_EQ    ;AN029;"<tab
				>="
			     C	;	       $if  e		   ;AN029;if th
				is pair to be replaced with a single "="
 00FC  75 1A                 C		       JNE $P_IF6	   ;AN029;
 00FE                        C	$P_LL6: 			   ;AN029;
 00FE  C6 04 3D              C			   mov	BYTE PTR [SI],$P_Keywor
				d ;AN029; "="
 0101  46                    C			   inc	si	   ;AN029;point
				 to next char after the new "="
 0102  8B FE                 C			   mov	di,si	   ;AN029;move 
				target right after new "="
			     C	
 0104  56                    C			   push si	   ;AN029;remem
				ber where i am, right after new "="
 0105  51                    C			   PUSH CX	   ;AN029;SAVE 
				CURRENT COUNT
 0106  46                    C			   inc	si	   ;AN029;sourc
				e is one beyond that
 0107  06                    C			   push es	   ;AN029;remem
				ber the extra segment
 0108  1E                    C			   push ds	   ;AN029;tempo
				rarily, set source seg and
 0109  07                    C			   pop	es	   ;AN029; targ
				et seg to the command line seg
 010A  F3/ A4                C			   rep	movsb	   ;AN029;move 
				chars left one position
 010C  07                    C			   pop	es	   ;AN029;resto
				re the extra segment
 010D  59                    C			   POP	CX	   ;AN029;RESTO
				RE CURRENT COUNT
 010E  5E                    C			   pop	si	   ;AN029;back 
				to where I was
			     C	
 010F  4E                    C			   DEC	SI	   ;AN029;LOOK 
				AT FIRST CHAR JUST MOVED
 0110  B7 FF                 C			   MOV	$P_REG_BH_CG_SW,-1 ;AN0
				29;set switch to say "a change was made"
 0112  2E: FF 0E 009C R      C			   DEC	psdata_seg:$P_COUNT_TO_
				EOL ;AN029;AC034;;because just threw away a cha
				r
 0117  49                    C			   dec	CX	   ;AN029;DITTO
			     C	;	       $endif		   ;AN029;compa
				rand pair found?
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-29


 0118                        C	$P_IF6: 			   ;AN029;
			     C	;	   $endif		   ;AN029;doubl
				e quote switch?
 0118                        C	$P_IF5: 			   ;AN029;
 0118  46                    C		   inc	si		   ;AN029;bump 
				index to look at next char in command string
 0119  49                    C		   dec	CX		   ;AN029;one l
				ess char to look at
			     C	;(deleted ;AC035;)  CMP  CX,0		    ;AN
				029;is char count all gone yet?
			     C	;      $enddo LE		   ;AN029;quit 
				if no more chars
 011A  7F C1                 C	       JNLE $P_DO2		   ;AN029;
 011C  5E                    C	       pop  si			   ;AN029;remem
				ber where string started
 011D  0A FF                 C	       OR   $P_REG_BH_CG_SW,$P_REG_BH_CG_SW ;AN
				029;WAS "A CHANGE MADE"?
			     C	;  $enddo Z			   ;AN029;QUIT 
				when no changes were made
 011F  75 B4                 C	   JNZ $P_DO1			   ;AN029;
 0121  5F                    C	   pop	di			   ;AN029;
 0122  5A                    C	   pop	dx			   ;AN029;
 0123  59                    C	   pop	cx			   ;AN029;
			     C	
			     C	;NOW THAT ALL WHITESPACE SURROUNDING "=" HAVE B
				EEN COMPRESSED OUT,
			     C	;RESUME NORMAL PARSING...
			     C	ENDIF					;AN029;
				 KEYWORDS SUPPORTED?
 0124  E8 06EA R             C		call	$P_Skip_Delim		;AN000;
				 Move si to 1st non white space
 0127  73 13                 C		jnc	$P_Start		;AN000;
				 If EOL is not encountered, do parse
			     C	
			     C	;--------------------------- End of Line
 0129  B8 FFFF               C		mov	ax,$P_RC_EOL		;AN000;
				 set exit code to -1
 012C  53                    C		push	bx			;AN000;
 012D  26: 8B 1D             C		mov	bx,es:[di].$P_PARMSX_Address ;A
				N000; Get the PARMSX address to
 0130  26: 3A 0F             C		cmp	cl,es:[bx].$P_MinP	;AN000;
				 check ORDINAL to see if the minimum
 0133  73 03                 C		jae	$P_Fin			;AN000;
				 positional found.
			     C	
 0135  B8 0002               C		mov	ax,$P_Op_Missing	;AN000;
				 If no, set exit code to missing operand
 0138                        C	$P_Fin: 				;AN000;
 0138  5B                    C		pop	bx			;AN000;
 0139  E9 0259 R             C		jmp	$P_Single_Exit		;AN000;
				 return to the caller
			     C	
			     C	;---------------------------
 013C                        C	$P_Start:				;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-30


 013C  2E: 89 36 000F R      C		mov	psdata_seg:$P_SaveSI_Cmpx,si ;A
				N000;AC034;  save ptr to command line for later
				 use by complex,
 0141  53                    C		push	bx			;AN000;
				 quoted string or file spec.
 0142  57                    C		push	di			;AN000;
 0143  55                    C		push	bp			;AN000;
 0144  8D 1E 0017 R          C		lea	bx,psdata_seg:$P_STRING_BUF ;AC
				034; set buffer to copy from command string
 0148  2E: F6 06 000E R 20   C		test	psdata_seg:$P_Flags2,$P_Extra ;
				AC034; 3/9 extra delimiter encountered ?
 014E  75 43                 C		jne	$P_Pack_End		;AN000;
				 3/9 if yes, no need to copy
			     C	
 0150                        C	$P_Pack_Loop:				;AN000;
 0150  AC                    C		lodsb				;AN000;
				 Pick a operand from buffer
 0151  E8 07A7 R             C		call	$P_Chk_Switch		;AN000;
				 Check switch character
 0154  72 3C                 C		jc	$P_Pack_End_BY_EOL	;AN020;
				 if carry set found delimiter type slash, need 
				backup si, else continue
			     C	
 0156  E8 0710 R             C		call	$P_Chk_EOL		;AN000;
				 Check EOL character
 0159  74 37                 C		je	$P_Pack_End_BY_EOL	;AN000;
				 need backup si
			     C	
 015B  E8 0746 R             C		call	$P_Chk_Delim		;AN000;
				 Check delimiter
 015E  75 18                 C		jne	$P_PL01 		;AN000;
				 If no, process next byte
			     C	
 0160  2E: 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
 0166  75 05                 C		jne	$P_Pack_End_backup_si	;AN000;
				 (tm08)
			     C	
 0168  E8 06EA R             C		call	$P_Skip_Delim		;AN000;
				 skip subsequent white space,too
 016B  EB 26                 C		jmp	short $P_Pack_End	;AN000;
				 finish copy by placing NUL at end
			     C	
 016D                        C	$P_PAck_End_backup_si:			;AN000;
				 (tm08)
 016D  2E: F6 06 000E R 41   C		test	psdata_seg:$P_Flags2,$P_SW+$P_e
				qu ;AN000;AC034;  (tm08)
 0173  74 1E                 C		je	$P_Pack_End		;AN000;
				 (tm08)
			     C	
 0175  4E                    C		dec	si			;AN000;
				 (tm08)
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-31


 0176  EB 1B                 C		jmp	short $P_Pack_End	;AN025;
				 (tm08)
			     C	
 0178                        C	$P_PL01:				;AN000;
 0178  2E: 88 07             C		mov	psdata_seg:[bx],al	;AN000;
				 move byte to STRING_BUF
 017B  3C 3D                 C		cmp	al,$P_Keyword		;AN000;
				 if it is equal character,
 017D  75 06                 C		jne	$P_PL00 		;AN000;
				 then
			     C	
 017F  2E: 80 0E 000E R 01   C		or	psdata_seg:$P_Flags2,$P_equ ;AC
				034; remember it in flag
 0185                        C	$P_PL00:				;AN000;
 0185  43                    C		inc	bx			;AN000;
				 ready to see next byte
 0186  E8 07C5 R             C		call	$P_Chk_DBCS		;AN000;
				 was it 1st byte of DBCS ?
 0189  73 C5                 C		jnc	$P_Pack_Loop		;AN000;
				 if no, process to next byte
			     C	
 018B  AC                    C		lodsb				;AN000;
				 if yes, store
 018C  2E: 88 07             C		mov	psdata_seg:[bx],al	;AN000;
				    2nd byte of DBCS
 018F  43                    C		inc	bx			;AN000;
				 update pointer
 0190  EB BE                 C		jmp	short $P_Pack_Loop	;AN000;
				 process to next byte
			     C	
 0192                        C	$P_Pack_End_BY_EOL:			;AN000;
 0192  4E                    C		dec	si			;AN000;
				 backup si pointer
 0193                        C	$P_Pack_End:				;AN000;
 0193  2E: 89 36 0004 R      C		mov	psdata_seg:$P_SI_Save,si     ;A
				C034; save next pointer, SI
 0198  2E: C6 07 00          C		mov	byte ptr psdata_seg:[bx],$P_NUL
				L ;AN000; put NULL at the end
 019C  2E: 89 1E 0013 R      C		mov	psdata_seg:$P_Save_EOB,bx    ;A
				C034; 3/17/87 keep the address for later use of
				 complex
 01A1  26: 8B 1D             C		mov	bx,es:[di].$P_PARMSX_Address ;A
				N000; get PARMSX address
 01A4  8D 36 0017 R          C		lea	si,psdata_seg:$P_STRING_BUF  ;A
				C034;
 01A8  2E: 80 3C 2F          C		cmp	byte ptr psdata_seg:[si],$P_Swi
				tch ;AN000; the operand begins w/ switch char ?
 01AC  74 30                 C		je	$P_SW_Manager		     ;A
				N000; if yes, process as switch
			     C	
 01AE  2E: F6 06 000E R 01   C		test	psdata_seg:$P_Flags2,$P_equ   ;
				AC034; the operand includes equal char ?
 01B4  75 54                 C		jne	$P_Key_manager		     ;A
				N000; if yes, process as keyword
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-32


			     C	
 01B6                        C	$P_Positional_Manager:			;AN000;
				 else process as positional
 01B6  26: 8A 47 01          C		mov	al,es:[bx].$P_MaxP	;AN000;
				 get maxp
 01BA  32 E4                 C		xor	ah,ah			;AN000;
				 ax = maxp
 01BC  2E: 39 06 0000 R      C		cmp	psdata_seg:$P_ORDINAL,ax ;AC034
				; too many positional ?
 01C1  73 12                 C		jae	$P_Too_Many_Error	;AN000;
				 if yes, set exit code to too many
			     C	
 01C3  2E: A1 0000 R         C		mov	ax,psdata_seg:$P_ORDINAL ;AC034
				; see what the current ordinal
 01C7  D1 E0                 C		shl	ax,1			;AN000;
				 ax = ax*2
 01C9  43                    C		inc	bx			;AC035;
				 add '2' to
 01CA  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
 01CB  03 D8                 C		add	bx,ax			;AN000;
				 now bx points to specified CONTROL address
 01CD  26: 8B 1F             C		mov	bx,es:[bx]		;AN000;
				 now bx points to specified CONTROL itself
 01D0  E8 025B R             C		call	$P_Chk_Pos_Control	;AN000;
				 Do process for positional
 01D3  EB 69                 C		jmp	short $P_Return_to_Caller ;AN00
				0; and return to the caller
			     C	
 01D5                        C	$P_Too_Many_Error:			;AN000;
 01D5  2E: C7 06 0002 R 0001 C		mov	psdata_seg:$P_RC,$P_Too_Many ;A
				C034; set exit code
 01DC  EB 60                 C		jmp	short $P_Return_to_Caller ;AN00
				0; and return to the caller
			     C	;
 01DE                        C	$P_SW_Manager:				;AN000;
 01DE  26: 8A 47 01          C		mov	al,es:[bx].$P_MaxP	;AN000;
				 get maxp
 01E2  32 E4                 C		xor	ah,ah			;AN000;
				 ax = maxp
 01E4  40                    C		inc	ax			;AN000;
 01E5  D1 E0                 C		shl	ax,1			;AN000;
				 ax = (ax+1)*2
 01E7  03 D8                 C		add	bx,ax			;AN000;
				 now bx points to maxs
 01E9  26: 8A 0F             C		mov	cl,es:[bx]		;AN000;
 01EC  32 ED                 C		xor	ch,ch			;AN000;
				 cx = maxs
 01EE  0B C9                 C		or	cx,cx			;AN000;
				 at least one switch ?
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-33


 01F0  74 0F                 C		je	$P_SW_Not_Found 	;AN000;
			     C	
 01F2  43                    C		inc	bx			;AN000;
				 now bx points to 1st CONTROL address
			     C	
 01F3                        C	$P_SW_Mgr_Loop: 			;AN000;
 01F3  53                    C		push	bx			;AN000;
 01F4  26: 8B 1F             C		mov	bx,es:[bx]		;AN000;
				 bx points to Switch CONTROL itself
 01F7  E8 0302 R             C		call	$P_Chk_SW_Control	;AN000;
				 do process for switch
 01FA  5B                    C		pop	bx			;AN000;
 01FB  73 41                 C		jnc	$P_Return_to_Caller	;AN000;
				 if the CONTROL is for the switch, exit
			     C	
 01FD  43                    C		inc	bx			;AC035;
				 add '2' to
 01FE  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
 01FF  E2 F2                 C		loop	$P_SW_Mgr_Loop		;AN000;
				 and loop
			     C	
 0201                        C	$P_SW_Not_Found:			;AN000;
 0201  2E: C7 06 0002 R 0003 C		mov	psdata_seg:$P_RC,$P_Not_In_SW ;
				AC034; here no CONTROL for the switch has
 0208  EB 34                 C		jmp	short $P_Return_to_Caller0    ;
				AN000; not been found, means error.
			     C	;
 020A                        C	$P_Key_Manager: 			;AN000;
 020A  26: 8A 47 01          C		mov	al,es:[bx].$P_MaxP	;AN000;
				 get maxp
 020E  32 E4                 C		xor	ah,ah			;AN000;
				 ax = maxp
 0210  40                    C		inc	ax			;AN000;
 0211  D1 E0                 C		shl	ax,1			;AN000;
				 ax = (ax+1)*2
 0213  03 D8                 C		add	bx,ax			;AN000;
				 now bx points to maxs
 0215  26: 8A 07             C		mov	al,es:[bx]		;AN000;
 0218  32 E4                 C		xor	ah,ah			;AN000;
				 ax = maxs
 021A  D1 E0                 C		shl	ax,1			;AN000;
 021C  40                    C		inc	ax			;AN000;
				 ax = ax*2+1
 021D  03 D8                 C		add	bx,ax			;AN000;
				 now bx points to maxk
 021F  26: 8A 0F             C		mov	cl,es:[bx]		;AN000;
 0222  32 ED                 C		xor	ch,ch			;AN000;
				 cx = maxk
 0224  0B C9                 C		or	cx,cx			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-34


				 at least one keyword ?
 0226  74 0F                 C		je	$P_Key_Not_Found	;AN000;
			     C	
 0228  43                    C		inc	bx			;AN000;
				 now bx points to 1st CONTROL
			     C	
 0229                        C	$P_Key_Mgr_Loop:			;AN000;
 0229  53                    C		push	bx			;AN000;
 022A  26: 8B 1F             C		mov	bx,es:[bx]		;AN000;
				 bx points to keyword CONTROL itself
 022D  E8 028D R             C		call	$P_Chk_Key_Control	;AN000;
				 do process for keyword
 0230  5B                    C		pop	bx			;AN000;
 0231  73 0B                 C		jnc	$P_Return_to_Caller	;AN000;
				 if the CONTROL is for the keyword, exit
			     C	
 0233  43                    C		inc	bx			;AC035;
				 add '2' to
 0234  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
 0235  E2 F2                 C		loop	$P_Key_Mgr_Loop 	;AN000;
				 and loop
			     C	
 0237                        C	$P_Key_Not_Found:			;AN000;
 0237  2E: C7 06 0002 R 0004 C		mov	psdata_seg:$P_RC,$P_Not_In_Key 
				;AC034; here no CONTROL for the keyword has
 023E                        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	
 023E                        C	$P_Return_to_Caller:			;AN000;
 023E  5D                    C		pop	bp			;AN000;
 023F  5F                    C		pop	di			;AN000;
 0240  5B                    C		pop	bx			;AN000;
 0241  2E: 8B 0E 0000 R      C		mov	cx,psdata_seg:$P_Ordinal    ;AC
				034; return next ordinal
 0246  2E: A1 0002 R         C		mov	ax,psdata_seg:$P_RC	    ;AC
				034; return exit code
 024A  2E: 8B 36 0004 R      C		mov	si,psdata_seg:$P_SI_Save    ;AC
				034; return next operand pointer
 024F  2E: 8B 16 0006 R      C		mov	dx,psdata_seg:$P_DX	    ;AC
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-35


				034; return result buffer address
 0254  2E: 8A 1E 0008 R      C		mov	bl,psdata_seg:$P_Terminator ;AC
				034; return delimiter code found
 0259                        C	$P_Single_Exit: 			;AN000;
 0259  F8                    C		clc				;AN000;
 025A  CB                    C		ret				;AN000;
 025B                        C	SysParse endp				;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-36


			     C	PAGE					;AN000;
			     C	;**********************************************
				*************************
			     C	; $P_Chk_Pos_Control
			     C	;
			     C	; Function: Parse CONTROL block for a positiona
				l
			     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	;**********************************************
				*************************
 025B                        C	$P_Chk_Pos_Control proc 		;AN000;
 025B  50                    C		push	ax			;AN000;
 025C  26: 8B 07             C		mov	ax,es:[bx].$P_Match_Flag ;AN000
				;
 025F  A9 0002               C		test	ax,$P_Repeat		;AN000;
				 repeat allowed ?
 0262  75 05                 C		jne	$P_CPC00		;AN000;
				 then do not increment ORDINAL
			     C	
 0264  2E: FF 06 0000 R      C		inc	psdata_seg:$P_ORDINAL	;AC034;
				 update the ordinal
 0269                        C	$P_CPC00:				;AN000;
 0269  2E: 80 3C 00          C		cmp	byte ptr psdata_seg:[si],$P_NUL
				L ;AN000; no data ?
 026D  75 19                 C		jne	$P_CPC01		;AN000;
			     C	
 026F  A9 0001               C		test	ax,$P_Optional		;AN000;
				 yes, then is it optional ?
 0272  75 09                 C		jne	$P_CPC02		;AN000;
			     C	
 0274  2E: C7 06 0002 R 0002 C		mov	psdata_seg:$P_RC,$P_Op_Missing 
				;AC034; no, then error	     3/17/87
 027B  EB 0E                 C		jmp	short $P_CPC_Exit	;AN000;
			     C	
 027D                        C	$P_CPC02:				;AN000;
 027D  50                    C		push	ax			;AN000;
 027E  B0 03                 C		mov	al,$P_String		;AN000;
				 if it is optional return NULL
 0280  B4 FF                 C		mov	ah,$P_No_Tag		;AN000;
				 no item tag indication
 0282  E8 0304 R             C		call	$P_Fill_Result		;AN000;
 0285  58                    C		pop	ax			;AN000;
 0286  EB 03                 C		jmp	short $P_CPC_Exit	;AN000;
			     C	
 0288                        C	$P_CPC01:				;AN000;
 0288  E8 0389 R             C		call	$P_Check_Match_Flags	;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-37


 028B                        C	$P_CPC_Exit:				;AN000;
 028B  58                    C		pop	ax			;AN000;
 028C  C3                    C		ret				;AN000;
 028D                        C	$P_Chk_Pos_Control endp 		;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-38


			     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	;**********************************************
				*************************
 028D                        C	$P_Chk_Key_Control proc 		;AN000;
			     C	IF	KeySW				;AN000;
				(Check if keyword is supported)
 028D  2E: 80 0E 000E R 08   C		or	psdata_seg:$P_Flags2,$P_Key_Cmp
				 ;AC034; Indicate keyword for later string comp
				arison
 0293  E8 02D1 R             C		call	$P_Search_KEYorSW	;AN000;
				 Search the keyword in the CONTROL block
 0296  72 24                 C		jc	$P_Chk_Key_Err0 	;AN000;
				 not found, then try next CONTROL
			     C	
 0298  2E: 80 26 000E R F7   C		and	psdata_seg:$P_Flags2,0ffh-$P_Ke
				y_Cmp ;AC034; reset the indicator previously se
				t
			     C	;
 029E  50                    C		push	ax			     ;A
				N000;	      keyword=
 029F  2E: A1 0011 R         C		mov	ax,psdata_seg:$P_KEYorSW_Ptr ;A
				C034;	      ^       ^
 02A3  2B C6                 C		sub	ax,si			;AN000;
				  SI	KEYorSW
 02A5  2E: 01 06 000F R      C		add	psdata_seg:$P_SaveSI_Cmpx,ax ;A
				C034; update for complex, quoted or file spec.
 02AA  58                    C		pop	ax			;AN000;
			     C	;
 02AB  2E: 8B 36 0011 R      C		mov	si,psdata_seg:$P_KEYorSW_Ptr ;A
				C034; set si just after equal char
 02B0  2E: 80 3C 00          C		cmp	byte ptr psdata_seg:[si],$P_NUL
				L ;AN000; any data after equal ?
 02B4  74 09                 C		je	$P_Chk_Key_Err1 	;AN000;
				 if no, syntax error
			     C	
 02B6  E8 0389 R             C		call	$P_Check_Match_Flags	;AN000;
				 else, process match flags
 02B9  F8                    C		clc				;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-39


 02BA  EB 14                 C		jmp	short $P_Chk_Key_Exit	;AN000;
			     C	
 02BC                        C	$P_Chk_Key_Err0:			;AN000;
 02BC  F9                    C		stc				;AN000;
				 not found in keyword synonym list
 02BD  EB 11                 C		jmp	short $P_Chk_Key_Exit	;AN000;
			     C	
 02BF                        C	$P_Chk_Key_Err1:			;AN000;
 02BF  2E: C7 06 0002 R 0009 C		mov	psdata_seg:$P_RC,$P_Syntax ;AC0
				34; no parameter is not specified after "="
 02C6                        C	$P_Chk_Key_ErrExit:			;AN000;
 02C6  50                    C		push	ax			;AN000;
 02C7  B0 03                 C		mov	al,$P_String		;AN000;
				 set
 02C9  B4 FF                 C		mov	ah,$P_No_Tag		;AN000;
				    result
 02CB  E8 0304 R             C		call	$P_Fill_Result		;AN000;
				 	 buffer
 02CE  58                    C		pop	ax			;AN000;
 02CF  F8                    C		clc				;AN000;
 02D0                        C	$P_Chk_Key_Exit:			;AN000;
 02D0  C3                    C		ret				;AN000;
			     C	ENDIF					;AN000;
				(of KeySW)
 02D1                        C	$P_Chk_Key_Control endp 		;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-40


			     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 f
				rom 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_Foun
				d_SYNONYM
			     C	;**********************************************
				*************************
 02D1                        C	$P_Search_KEYorSW proc			;AN000;
 02D1  55                    C		push	bp			;AN000;
 02D2  51                    C		push	cx			;AN000;
 02D3  26: 8A 4F 08          C		mov	cl,es:[bx].$P_nid	;AN000;
				 Get synonym count
 02D7  32 ED                 C		xor	ch,ch			;AN000;
				 and set it to cx
 02D9  0B C9                 C		or	cx,cx			;AN000;
				 No synonyms specified ?
 02DB  74 0D                 C		je	$P_KEYorSW_Not_Found	;AN000;
				 then indicate not found by CY
			     C	
 02DD  8D 6F 09              C		lea	bp,es:[bx].$P_KEYorSW	;AN000;
				 BP points to the 1st synonym
 02E0                        C	$P_KEYorSW_Loop:			;AN000;
 02E0  E8 065E R             C		call	$P_String_Comp		;AN000;
				 compare string in buffer w/ the synonym
 02E3  73 08                 C		jnc	$P_KEYorSW_Found	;AN000;
				 If match, set it to synonym pointer
			     C	
 02E5  E8 02F6 R             C		call	$P_MoveBP_NUL		;AN000;
				 else, bp points to the next string
 02E8  E2 F6                 C		loop	$P_KEYorSW_Loop 	;AN000;
				 loop nid times
 02EA                        C	$P_KEYorSW_Not_Found:			;AN000;
 02EA  F9                    C		stc				;AN000;
				 indicate not found in synonym list
 02EB  EB 06                 C		jmp	short $P_KEYorSW_Exit	;AN000;
				 and exit
			     C	
 02ED                        C	$P_KEYorSW_Found:			;AN000;
 02ED  2E: 89 2E 0015 R      C		mov	psdata_seg:$P_Found_SYNONYM,bp 
				;AC034; set synonym pointer
 02F2  F8                    C		clc				;AN000;
				 indicate found
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-41


 02F3                        C	$P_KEYorSW_Exit:			;AN000;
 02F3  59                    C		pop	cx			;AN000;
 02F4  5D                    C		pop	bp			;AN000;
 02F5  C3                    C		ret				;AN000;
 02F6                        C	$P_Search_KEYorSW endp			;AN000;
			     C	;**********************************************
				*************************
			     C	; $P_MoveBP_NUL
			     C	;**********************************************
				*************************
 02F6                        C	$P_MoveBP_NUL proc			;AN000;
 02F6                        C	$P_MBP_Loop:				;AN000;
 02F6  26: 80 7E 00 00       C		cmp	byte ptr es:[bp],$P_NULL ;AN000
				; Increment BP that points
 02FB  74 03                 C		je	$P_MBP_Exit		;AN000;
				 to the synomym list
			     C	
 02FD  45                    C		inc	bp			;AN000;
				 until
 02FE  EB F6                 C		jmp	short $P_MBP_Loop	;AN000;
				 NULL encountered.
			     C	
 0300                        C	$P_MBP_Exit:				;AN000;
 0300  45                    C		inc	bp			;AN000;
				 bp points to next to NULL
 0301  C3                    C		ret				;AN000;
 0302                        C	$P_MoveBP_NUL endp			;AN000;
			     C	ENDIF					;AN000;
				(of KeySW+SwSW)
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-42


			     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	;**********************************************
				*************************
 0302                        C	$P_Chk_SW_Control proc			;AN000;
			     C	
			     C	
			     C	ELSE					;AN000;
				(of IF SwSW)
 0302  F9                    C		stc				;AN000;
				 this logic works when the SwSW
 0303  C3                    C		ret				;AN000;
				 is reset.
			     C	ENDIF					;AN000;
				(of SwSW)
 0304                        C	$P_Chk_SW_Control endp			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-43


			     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 numbe
				r (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 m
				onth 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 poin
				ts 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	;**********************************************
				*************************
 0304                        C	$P_Fill_Result proc			;AN000;
 0304  57                    C		push	di			;AN000;
 0305  26: 8B 7F 04          C		mov	di,es:[bx].$P_Result_Buf ;AN000
				; di points to result buffer
 0309  2E: 89 3E 0006 R      C		mov	psdata_seg:$P_DX,di	;AC034;
				 set returned result address
 030E  26: 88 05             C		mov	es:[di].$P_Type,al	;AN000;
				 store type
 0311  26: 88 65 01          C		mov	es:[di].$P_Item_Tag,ah	;AN000;
				 store item tag
 0315  50                    C		push	ax			;AN000;
 0316  2E: A1 0015 R         C		mov	ax,psdata_seg:$P_Found_SYNONYM 
				;AC034; if yes,
 031A  26: 89 45 02          C		mov	es:[di].$P_SYNONYM_Ptr,ax ;AN00
				0;   then set it to the result
 031E  58                    C		pop	ax			;AN000;
 031F                        C	$P_RLT04:				;AN000;
 031F  3C 01                 C		cmp	al,$P_Number		;AN000;
				 if number
 0321  75 0A                 C		jne	$P_RLT00		;AN000;
			     C	
 0323                        C	$P_RLT02:				;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-44


 0323  26: 89 55 04          C		mov	word ptr es:[di].$P_Picked_Val,
				dx ;AN000; then store 32bit
 0327  26: 89 4D 06          C		mov	word ptr es:[di+2].$P_Picked_Va
				l,cx ;AN000;	number
 032B  EB 5A                 C		jmp	short $P_RLT_Exit	;AN000;
			     C	
 032D                        C	$P_RLT00:				;AN000;
 032D  3C 02                 C		cmp	al,$P_List_Idx		;AN000;
				 if list index
 032F  75 06                 C		jne	$P_RLT01		;AN000;
			     C	
 0331  26: 89 55 04          C		mov	word ptr es:[di].$P_Picked_Val,
				dx ;AN000; then store list index
 0335  EB 50                 C		jmp	short $P_RLT_Exit	;AN000;
			     C	
 0337                        C	$P_RLT01:				;AN000;
 0337  3C 07                 C		cmp	al,$P_Date_F		;AN000;
				 Date format ?
 0339  74 E8                 C		je	$P_RLT02		;AN000;
			     C	
 033B  3C 08                 C		cmp	al,$P_Time_F		;AN000;
				 Time format ?
 033D  74 E4                 C		je	$P_RLT02		;AN000;
			     C	;
 033F  3C 06                 C		cmp	al,$P_Drive		;AN000;
				 drive format ?
 0341  75 06                 C		jne	$P_RLT03		;AN000;
			     C	
 0343  26: 88 55 04          C		mov	byte ptr es:[di].$P_Picked_Val,
				dl ;AN000; store drive number
 0347  EB 3E                 C		jmp	short $P_RLT_Exit	;AN000;
			     C	
 0349                        C	$P_RLT03:				;AN000;
 0349  3C 04                 C		cmp	al,$P_Complex		;AN000;
				 complex format ?
 034B  75 0F                 C		jne	$P_RLT05		;AN000;
			     C	
 034D  2E: A1 000F R         C		mov	ax,psdata_seg:$P_SaveSI_Cmpx ;A
				C034; then get pointer in command buffer
 0351  40                    C		inc	ax			;AN000;
				 skip left Parentheses
 0352  26: 89 45 04          C		mov	word ptr es:[di].$P_Picked_Val,
				ax ;AN000; store offset
 0356  26: 8C 5D 06          C		mov	word ptr es:[di+2].$P_Picked_Va
				l,ds ;AN000; store segment
 035A  EB 2B                 C		jmp	short $P_RLT_Exit	;AN000;
			     C	
 035C                        C	$P_RLT05:				;AN000;
			     C	;------------------------  AL = 3, 5, or 9
 035C  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 STRIN
				G_BUF
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-45


 0360  26: 8C 4D 06          C		mov	word ptr es:[di+2].$P_Picked_Va
				l,Psdata_Seg ;AN031; store segment of STRING_BU
				F
			     C	;
 0364  50                    C		push	ax			;AN000;
 0365  26: F6 47 02 01       C		test	byte ptr es:[bx].$P_Function_Fl
				ag,$P_CAP_File ;AN000; need CAPS by file table?
 036A  74 04                 C		je	$P_RLT_CAP00		;AN000;
			     C	
 036C  B0 04                 C		mov	al,$P_DOSTBL_File	;AN000;
				 use file upper case table
 036E  EB 09                 C		jmp	short $P_RLT_CAP02	;AN000;
			     C	
 0370                        C	$P_RLT_CAP00:				;AN000;
 0370  26: F6 47 02 02       C		test	byte ptr es:[bx].$P_Function_Fl
				ag,$P_CAP_Char ;AN000; need CAPS by char table 
				?
 0375  74 05                 C		je	$P_RLT_CAP01		;AN000;
			     C	
 0377  B0 02                 C		mov	al,$P_DOSTBL_Char	;AN000;
				 use character upper case table
 0379                        C	$P_RLT_CAP02:				;AN000;
 0379  E8 0430 R             C		call	$P_Do_CAPS_String	;AN000;
				  process CAPS along the table
 037C                        C	$P_RLT_CAP01:				;AN000;
 037C  58                    C		pop	ax			;AN000;
 037D  26: F6 47 02 10       C		test	byte ptr es:[bx].$P_Function_Fl
				ag,$P_Rm_Colon ;AN000; removing colon at end ?
 0382  74 03                 C		je	$P_RLT_Exit		;AN000;
			     C	
 0384  E8 040A R             C		call	$P_Remove_Colon 	;AN000;
				 then process it.
 0387                        C	$P_RLT_Exit:				;AN000;
 0387  5F                    C		pop	di			;AN000;
 0388  C3                    C		ret				;AN000;
 0389                        C	$P_Fill_Result endp			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-46


			     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_Str
				ing, $P_Date_Format
			     C	;	     $P_Time_Format, $P_Complex_Format,
				 $P_File_Foemat
			     C	;	     $P_Drive_Format
			     C	;**********************************************
				*************************
 0389                        C	$P_Check_Match_Flags proc		;AN000;
 0389  2E: C6 06 009E R 00   C		mov	psdata_seg:$P_err_flag,$P_NULL 
				;AN033;AC034;; clear filespec error flag.
 038F  50                    C		push	ax			;AN000;
 0390  26: 8B 07             C		mov	ax,es:[bx].$P_Match_Flag ;AN000
				; load match flag(16bit) to ax
			     C	
 0393  0B C0                 C		or	ax,ax			;AC035;
				 test ax for zero
			     C	;(changed ;AC035;)  cmp     ax,0	;AN000;
				 (tm12)
 0395  75 18                 C		jne	$P_Mat			;AN000;
				 (tm12)
			     C	
 0397  50                    C		push	ax			;AN000;
				 (tm12)
 0398  53                    C		push	bx			;AN000;
				 (tm12)
 0399  52                    C		push	dx			;AN000;
				 (tm12)
 039A  57                    C		push	di			;AN000;
				 (tm12)
 039B  2E: C7 06 0002 R 0009 C		mov	psdata_seg:$P_RC,$P_Syntax ;AC0
				34; (tm12)
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-47


 03A2  B4 FF                 C		mov	ah,$P_No_Tag		;AN000;
				 (tm12)
 03A4  B0 03                 C		mov	al,$P_String		;AN000;
				 (tm12)
 03A6  E8 0304 R             C		call	$P_Fill_Result		;AN000;
				 (tm12)
 03A9  5F                    C		pop	di			;AN000;
				 (tm12)
 03AA  5A                    C		pop	dx			;AN000;
				 (tm12)
 03AB  5B                    C		pop	bx			;AN000;
				 (tm12)
 03AC  58                    C		pop	ax			;AN000;
				 (tm12)
 03AD  EB 02                 C		jmp	short $P_Bridge 	;AC035;
				 (tm12)
			     C	
 03AF                        C	$P_Mat: 				;AN000;
				 (tm12)
			     C	
 03AF  EB 03                 C		jmp	short $P_Match03	;AN025;
				 (tm09)
			     C	
 03B1                        C	$P_Bridge:				;AN000;
			     C	;	jmp	short $P_Match_Exit (tm02)
			     C	
 03B1  EB 3E 90              C		jmp	$P_Match_Exit		;AN000;
				 (tm02)
			     C	
 03B4                        C	$P_Match03:				;AN000;
			     C	; ENDIF ;AN000;(of TimeSW) (tm04)
			     C	IF	NumSW				;AN000;
				(Check if numeric value is supported)
 03B4  A9 8000               C		test	ax,$P_Num_Val		;AN000;
				 Numeric value
 03B7  74 12                 C		je	$P_Match04		;AN000;
			     C	
 03B9  2E: C7 06 0002 R 0000 C		mov	psdata_seg:$P_RC,$P_No_Error ;A
				C034; assume no error
 03C0  E8 04B8 R             C		call	$P_Value		;AN000;
				 do process
 03C3  2E: 83 3E 0002 R 09   C		cmp	psdata_seg:$P_RC,$P_Syntax ;AC0
				34; if error, examine the next type
 03C9  75 26                 C		jne	$P_Match_Exit		;AN000;
			     C	
 03CB                        C	$P_Match04:				;AN000;
 03CB  A9 4000               C		test	ax,$P_SNUM_Val		;AN000;
				 Signed numeric value
 03CE  74 12                 C		je	$P_Match05		;AN000;
			     C	
 03D0  2E: C7 06 0002 R 0000 C		mov	psdata_seg:$P_RC,$P_No_Error ;A
				C034; assume no error
 03D7  E8 0494 R             C		call	$P_SValue		;AN000;
				 do process
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-48


 03DA  2E: 83 3E 0002 R 09   C		cmp	psdata_seg:$P_RC,$P_Syntax ;AC0
				34; if error, examine the next type
 03E0  75 0F                 C		jne	$P_Match_Exit		;AN000;
			     C	
 03E2                        C	$P_Match05:				;AN000;
			     C	ENDIF					;AN000;
				(of NumSW)
 03E2  A9 2000               C		test	ax,$P_Simple_S		;AN000;
				 Simple string
 03E5  74 0A                 C		je	$P_Match09		;AN000;
			     C	
 03E7  2E: C7 06 0002 R 0000 C		mov	psdata_seg:$P_RC,$P_No_Error ;A
				C034; assume no error
 03EE  E8 05F5 R             C		call	$P_Simple_String	;AN000;
				 do process
			     C	;;;;	cmp	psdata_seg:$P_RC,$P_Syntax ;AC0
				34; These two lines will be alive
			     C	;;;;	jne	$P_Match_Exit		
					   ;when extending the match_flags.
 03F1                        C	$P_Match09:				;AN000;
 03F1                        C	$P_Match_Exit:				;AN000;
 03F1  2E: 80 3E 009E R 01   C		cmp	psdata_seg:$P_err_flag,$P_error
				_filespec ;AC034; bad filespec ?
 03F7  75 0F                 C		jne	$P_Match2_Exit		;AN033;
				 no, continue
 03F9  2E: 83 3E 0002 R 00   C		cmp	psdata_seg:$P_RC,$P_No_Error ;A
				N033;AC034;; check for other errors ?
 03FF  75 07                 C		jne	$P_Match2_Exit		;AN033;
				 no, continue
 0401  2E: C7 06 0002 R 0009 C		mov	psdata_seg:$P_RC,$P_Syntax ;AN0
				33;AC034;; set error flag
 0408                        C	$P_Match2_Exit: 			;AN033;
 0408  58                    C		pop	ax			;AN000;
 0409  C3                    C		ret				;AN000;
 040A                        C	$P_Check_Match_Flags endp		;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-49


			     C	PAGE					;AN000;
			     C	;**********************************************
				*************************
			     C	; $P_Remove_Colon;
			     C	;
			     C	; Function: Remove colon at end
			     C	;
			     C	; Input:    psdata_seg:SI points to string buff
				er to be examineed
			     C	;
			     C	; Output:   None
			     C	;
			     C	; Use:	$P_Chk_DBCS
			     C	;**********************************************
				*************************
 040A                        C	$P_Remove_Colon proc			;AN000;
 040A  50                    C		push	ax			;AN000;
 040B  56                    C		push	si			;AN000;
 040C                        C	$P_RCOL_Loop:				;AN000;
 040C  2E: 8A 04             C		mov	al,psdata_seg:[si]	;AN000;
				 get character
 040F  0A C0                 C		or	al,al			;AN000;
				 end of string ?
 0411  74 1A                 C		je	$P_RCOL_Exit		;AN000;
				 if yes, just exit
			     C	
 0413  3C 3A                 C		cmp	al,$P_Colon		;AN000;
				 is it colon ?
 0415  75 0D                 C		jne	$P_RCOL00		;AN000;
			     C	
 0417  2E: 80 7C 01 00       C		cmp	byte ptr psdata_seg:[si+byte],$
				P_NULL ;AN000; if so, next is NULL ?
 041C  75 06                 C		jne	$P_RCOL00		;AN000;
				 no, then next char
			     C	
 041E  2E: C6 04 00          C		mov	byte ptr psdata_seg:[si],$P_NUL
				L ;AN000; yes, remove colon
 0422  EB 09                 C		jmp	short $P_RCOL_Exit	;AN000;
				 and exit.
			     C	
 0424                        C	$P_RCOL00:				;AN000;
 0424  E8 07C5 R             C		call	$P_Chk_DBCS		;AN000;
				 if not colon, then check if
 0427  73 01                 C		jnc	$P_RCOL01		;AN000;
				 DBCS leading byte.
			     C	
 0429  46                    C		inc	si			;AN000;
				 if yes, skip trailing byte
 042A                        C	$P_RCOL01:				;AN000;
 042A  46                    C		inc	si			;AN000;
				 si points to next byte
 042B  EB DF                 C		jmp	short $P_RCOL_Loop	;AN000;
				 loop until NULL encountered
			     C	
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-50


 042D                        C	$P_RCOL_Exit:				;AN000;
 042D  5E                    C		pop	si			;AN000;
 042E  58                    C		pop	ax			;AN000;
 042F  C3                    C		ret				;AN000;
 0430                        C	$P_Remove_Colon endp			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-51


			     C	PAGE					;AN000;
			     C	;**********************************************
				*************************
			     C	; $P_Do_CAPS_String;
			     C	;
			     C	; Function: Perform capitalization along with t
				he 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 buff
				er to be capitalized
			     C	;
			     C	; Output:   None
			     C	;
			     C	; Use:	$P_Do_CAPS_Char, $P_Chk_DBCS
			     C	;**********************************************
				*************************
 0430                        C	$P_Do_CAPS_String proc			;AN000;
 0430  56                    C		push	si			;AN000;
 0431  52                    C		push	dx			;AN000;
 0432  8A D0                 C		mov	dl,al			;AN000;
				 save info id
			     C	
 0434                        C	$P_DCS_Loop:				;AN000;
 0434  2E: 8A 04             C		mov	al,psdata_seg:[si]	;AN000;
				 load charater and
 0437  E8 07C5 R             C		call	$P_Chk_DBCS		;AN000;
				 check if DBCS leading byte
 043A  72 0C                 C		jc	$P_DCS00		;AN000;
				 if yes, do not need CAPS
			     C	
 043C  0A C0                 C		or	al,al			;AN000;
				 end of string ?
 043E  74 0C                 C		je	$P_DCS_Exit		;AN000;
				 then exit.
			     C	
 0440  E8 044F R             C		call	$P_Do_CAPS_Char 	;AN000;
				 Here a SBCS char need to be CAPS
 0443  2E: 88 04             C		mov	psdata_seg:[si],al	;AN000;
				 stored upper case char to buffer
 0446  EB 01                 C		jmp	short $P_DCS01		;AN000;
				 process nexit
 0448                        C	$P_DCS00:				;AN000;
 0448  46                    C		inc	si			;AN000;
				 skip DBCS leading and trailing byte
 0449                        C	$P_DCS01:				;AN000;
 0449  46                    C		inc	si			;AN000;
				 si point to next byte
 044A  EB E8                 C		jmp	short $P_DCS_Loop	;AN000;
				 loop until NULL encountered
 044C                        C	$P_DCS_Exit:				;AN000;
 044C  5A                    C		pop	dx			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-52


 044D  5E                    C		pop	si			;AN000;
 044E  C3                    C		ret				;AN000;
 044F                        C	$P_Do_CAPS_String endp			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-53


			     C	PAGE					;AN000;
			     C	;**********************************************
				*************************
			     C	; $P_Do_CAPS_Char;
			     C	;
			     C	; Function: Perform capitalization along with t
				he 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	;**********************************************
				*************************
 044F                        C	$P_Do_CAPS_Char proc			;AN000;
 044F  3C 80                 C		cmp	al,$P_ASCII80		;AN000;
				 need upper case table ?
 0451  73 0C                 C		jae	$P_DCC_Go		;AN000;
			     C	
 0453  3C 61                 C		cmp	al,"a"                  ;AN000;
				 if no,
 0455  72 3C                 C		jb	$P_CAPS_Ret		;AN000;
				   check if  "a" <= AL <= "z"
			     C	
 0457  3C 7A                 C		cmp	al,"z"                  ;AN000;
 0459  77 38                 C		ja	$P_CAPS_Ret		;AN000;
				   if yes, make CAPS
			     C	
 045B  24 DF                 C		and	al,$P_Make_Upper	;AN000;
				   else do nothing.
 045D  EB 34                 C		jmp	short $P_CAPS_Ret	;AN000;
			     C	
 045F                        C	$P_DCC_Go:				;AN000;
 045F  53                    C		push	bx			;AN000;
 0460  06                    C		push	es			;AN000;
 0461  57                    C		push	di			;AN000;
 0462  8D 3E 0097 R          C		lea	di,psdata_seg:$P_Char_CAP_Ptr ;
				AC034; or use char CAPS table ?
 0466                        C	$P_DCC00:				;AN000;
 0466  2E: 38 15             C		cmp	psdata_seg:[di],dl	;AN000;
				 already got table address ?
 0469  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 cur
				rently be defined as PSDATA_SEG.
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-54


			     C	;BASESW EQU 0 means that ES is the psdata_seg r
				eg.
			     C	
			     C	
 046B  50                    C		push	ax			;AN000;
				 get CAPS table thru DOS call
 046C  51                    C		push	cx			;AN000;
 046D  52                    C		push	dx			;AN000;
			     C	
			     C	
 046E  0E                    C		push	PSDATA_SEG		;AC036;
				 pass current base seg into
			     C						;(Note:
				 this used to push CS.  BUG...
 046F  07                    C		pop	es			;AN000;
				   ES reg, required for
			     C						;get ex
				tended country information
 0470  B4 65                 C		mov	ah,$P_DOS_Get_TBL	;AN000;
				 get extended CDI
 0472  8A C2                 C		mov	al,dl			;AN000;
				 upper case table
 0474  BB FFFF               C		mov	bx,$P_DOSTBL_Def	;AN000;
				 get active CON
 0477  B9 0005               C		mov	cx,$P_DOSTBL_BL 	;AN000;
				 buffer length
 047A  BA FFFF               C		mov	dx,$P_DOSTBL_Def	;AN000;
				 get for default code page
			     C						;DI alr
				eady set to point to buffer
 047D  CD 21                 C		int	21h			;AN000;
				 es:di point to buffer that
			     C						;now ha
				s been filled in with info
 047F  5A                    C		pop	dx			;AN000;
 0480  59                    C		pop	cx			;AN000;
 0481  58                    C		pop	ax			;AN000;
 0482                        C	$P_DCC01:				;AN000;
			     C	
			     C	;In this next section, ES will be used as the b
				ase of the XLAT table, provided
			     C	; by the previous GET COUNTRY INFO DOS call.  T
				his usage of ES is made
			     C	; regardless of which base reg is currently the
				 PSDATA_SEG reg.
			     C	
 0482  2E: 8B 5D 01          C		mov	bx,psdata_seg:[di+$P_DOS_TBL_Of
				f] ;AN000; get offset of table
 0486  2E: 8E 45 03          C		mov	es,psdata_seg:[di+$P_DOS_TBL_Se
				g] ;AN000; get segment of table
 048A  43                    C		inc	bx			;AC035;
				 add '2' to
 048B  43                    C		inc	bx			;AC035;
				  BX reg
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-55


			     C						;AN000;
				 skip length field
			     C	;(changed ;AN035;) add	   bx,word	;AN000;
				 skip length field
 048C  2C 80                 C		sub	al,$P_ASCII80		;AN000;
				 make char to index
 048E  26: D7                C		xlat	es:[bx] 		;AN000;
				 perform case map
			     C	
 0490  5F                    C		pop	di			;AN000;
 0491  07                    C		pop	es			;AN000;
 0492  5B                    C		pop	bx			;AN000;
 0493                        C	$P_CAPS_Ret:				;AN000;
 0493  C3                    C		ret				;AN000;
 0494                        C	$P_Do_CAPS_Char endp			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-56


			     C	PAGE					;AN000;
			     C	;**********************************************
				*************************
			     C	IF	NumSW				;AN000;
				(Check if numeric value is supported)
			     C	; $P_Value / $P_SValue
			     C	;
			     C	; Function:  Make 32bit value from psdata_seg:S
				I and see value list
			     C	;	     and make result buffer.
			     C	;	     $P_SValue is an entry point for th
				e signed value
			     C	;	     and this will simply call $P_Value
				 after the handling
			     C	;	     of the sign character, "+" or "-"
			     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_Check_OVF
			     C	;
			     C	; Vars: $P_RC(W), $P_Flags(RW)
			     C	;**********************************************
				*************************
 0494                        C	$P_SValue proc				;AN000;
				 when signed value here
 0494  50                    C		push	ax			;AN000;
 0495  2E: 80 0E 000E R 80   C		or	psdata_seg:$P_Flags2,$P_Signed
					    ;AC034; indicate a signed numeric
 049B  2E: 80 26 000E R FD   C		and	psdata_seg:$P_Flags2,0ffh-$P_Ne
				g  ;AC034; assume positive value
 04A1  2E: 8A 04             C		mov	al,psdata_seg:[si]	;AN000;
				 get sign
 04A4  3C 2B                 C		cmp	al,$P_Plus		;AN000;
				 "+" ?
 04A6  74 0A                 C		je	$P_SVal00		;AN000;
			     C	
 04A8  3C 2D                 C		cmp	al,$P_Minus		;AN000;
				 "-" ?
 04AA  75 07                 C		jne	$P_Sval01		;AN000;
				 else
			     C	
 04AC  2E: 80 0E 000E R 02   C		or	psdata_seg:$P_Flags2,$P_Neg ;AC
				034; set this is negative value
 04B2                        C	$P_SVal00:				;AN000;
 04B2  46                    C		inc	si			;AN000;
				 skip sign char
 04B3                        C	$P_Sval01:				;AN000;
 04B3  E8 04B8 R             C		call	$P_Value		;AN000;
				 and process value
 04B6  58                    C		pop	ax			;AN000;
 04B7  C3                    C		ret				;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-57


 04B8                        C	$P_SValue endp				;AN000;
			     C	;**********************************************
				*************************
 04B8                        C	$P_Value proc				;AN000;
 04B8  50                    C		push	ax			;AN000;
 04B9  51                    C		push	cx			;AN000;
 04BA  52                    C		push	dx			;AN000;
 04BB  56                    C		push	si			;AN000;
 04BC  33 C9                 C		xor	cx,cx			;AN000;
				 cx = higher 16 bits
 04BE  33 D2                 C		xor	dx,dx			;AN000;
				 dx = lower 16 bits
 04C0  53                    C		push	bx			;AN000;
				 save control pointer
 04C1                        C	$P_Value_Loop:				;AN000;
 04C1  2E: 8A 04             C		mov	al,psdata_seg:[si]	;AN000;
				 get character
 04C4  0A C0                 C		or	al,al			;AN000;
				 end of line ?
 04C6  74 42                 C		je	$P_Value00		;AN000;
			     C	
 04C8  E8 05E7 R             C		call	$P_0099 		;AN000;
				 make asc(0..9) to bin(0..9)
 04CB  72 39                 C		jc	$P_Value_Err0		;AN000;
			     C	
 04CD  32 E4                 C		xor	ah,ah			;AN000;
 04CF  8B E8                 C		mov	bp,ax			;AN000;
				 save binary number
 04D1  D1 E2                 C		shl	dx,1			;AN000;
				 to have 2*x
 04D3  D1 D1                 C		rcl	cx,1			;AN000;
				 shift left w/ carry
 04D5  E8 05D5 R             C		call	$P_Check_OVF		;AN000;
				 Overflow occurred ?
 04D8  72 2C                 C		jc	$P_Value_Err0		;AN000;
				 then error, exit
			     C	
 04DA  8B DA                 C		mov	bx,dx			;AN000;
				 save low(2*x)
 04DC  8B C1                 C		mov	ax,cx			;AN000;
				 save high(2*x)
 04DE  D1 E2                 C		shl	dx,1			;AN000;
				 to have 4*x
 04E0  D1 D1                 C		rcl	cx,1			;AN000;
				 shift left w/ carry
 04E2  E8 05D5 R             C		call	$P_Check_OVF		;AN000;
				 Overflow occurred ?
 04E5  72 1F                 C		jc	$P_Value_Err0		;AN000;
				 then error, exit
			     C	
 04E7  D1 E2                 C		shl	dx,1			;AN000;
				 to have 8*x
 04E9  D1 D1                 C		rcl	cx,1			;AN000;
				 shift left w/ carry
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-58


 04EB  E8 05D5 R             C		call	$P_Check_OVF		;AN000;
				 Overflow occurred ?
 04EE  72 16                 C		jc	$P_Value_Err0		;AN000;
				 then error, exit
			     C	
 04F0  03 D3                 C		add	dx,bx			;AN000;
				 now have 10*x
 04F2  13 C8                 C		adc	cx,ax			;AN000;
				 32bit ADD
 04F4  E8 05D5 R             C		call	$P_Check_OVF		;AN000;
				 Overflow occurred ?
 04F7  72 0D                 C		jc	$P_Value_Err0		;AN000;
				 then error, exit
			     C	
 04F9  03 D5                 C		add	dx,bp			;AN000;
				 Add the current one degree decimal
 04FB  83 D1 00              C		adc	cx,0			;AN000;
				 if carry, add 1 to high 16bit
 04FE  E8 05D5 R             C		call	$P_Check_OVF		;AN000;
				 Overflow occurred ?
 0501  72 03                 C		jc	$P_Value_Err0		;AN000;
				 then error, exit
			     C	
 0503  46                    C		inc	si			;AN000;
				 update pointer
 0504  EB BB                 C		jmp	short $P_Value_Loop	;AN000;
				 loop until NULL encountered
			     C	;
 0506                        C	$P_Value_Err0:				;AN000;
 0506  5B                    C		pop	bx			;AN000;
 0507  E9 05C2 R             C		jmp	$P_Value_Err		;AN000;
				 Bridge
			     C	;
 050A                        C	$P_Value00:				;AN000;
 050A  5B                    C		pop	bx			;AN000;
				 restore control pointer
 050B  2E: F6 06 000E R 02   C		test	psdata_seg:$P_Flags2,$P_Neg ;AC
				034; here cx,dx = 32bit value
 0511  74 0A                 C		je	$P_Value01		;AN000;
				 was it negative ?
			     C	
 0513  F7 D1                 C		not	cx			;AN000;
				 +
 0515  F7 D2                 C		not	dx			;AN000;
				 |- Make 2's complement
 0517  83 C2 01              C		add	dx,1			;AN000;
				 |
 051A  83 D1 00              C		adc	cx,0			;AN000;
				 +
 051D                        C	$P_Value01:				;AN000;
				 / nval =0
 051D  26: 8B 77 06          C		mov	si,es:[bx].$P_Value_List ;AN000
				; si points to value list
 0521  26: 8A 04             C		mov	al,es:[si]		;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-59


				 get nval
 0524  3C 00                 C		cmp	al,$P_nval_None 	;AN000;
				 no value list ?
 0526  75 07                 C		jne	$P_Value02		;AN000;
			     C	
 0528  B0 01                 C		mov	al,$P_Number		;AN000;
				 Set type
 052A  B4 FF                 C		mov	ah,$P_No_Tag		;AN000;
				 No ITEM_TAG set
 052C  E9 05CD R             C		jmp	$P_Value_Exit		;AN000;
			     C	
 052F                        C	$P_Value02:				;AN000;
				 / nval = 1
			     C	IF	Val1SW				;AN000;
				(Check if value list id #1 is supported)
			     C	;(tm07) cmp	al,$P_nval_Range	;AN000;
				 have range list ?
			     C	;(tm07) jne	$P_Value03		;AN000;
			     C	
 052F  46                    C		inc	si			;AN000;
 0530  26: 8A 04             C		mov	al,es:[si]		;AN000;
				 al = number of range
 0533  3C 00                 C		cmp	al,$P_No_nrng		;AN000;
				 (tm07)
 0535  74 60                 C		je	$P_Value03		;AN000;
				 (tm07)
			     C	
 0537  46                    C		inc	si			;AN000;
				 si points to 1st item_tag
 0538                        C	$P_Val02_Loop:				;AN000;
 0538  2E: F6 06 000E R 80   C		test	psdata_seg:$P_Flags2,$P_Signed 
				;AC034;
 053E  75 1E                 C		jne	$P_Val02_Sign		;AN000;
			     C	
 0540  26: 3B 4C 03          C		cmp	cx,es:[si+$P_Val_XH]	;AN000;
				 comp cx with XH
 0544  72 36                 C		jb	$P_Val02_Next		;AN000;
			     C	
 0546  77 06                 C		ja	$P_Val_In		;AN000;
			     C	
 0548  26: 3B 54 01          C		cmp	dx,es:[si+$P_Val_XL]	;AN000;
				 comp dx with XL
 054C  72 2E                 C		jb	$P_Val02_Next		;AN000;
			     C	
 054E                        C	$P_Val_In:				;AN000;
			     C	;;;;;;	cmp	cx,es:$P_Val_YH]	; comp 
				cx with YH (tm01)
 054E  26: 3B 4C 07          C		cmp	cx,es:[si+$P_Val_YH]	;AN000;
				 comp cx with YH (tm01)
 0552  77 28                 C		ja	$P_Val02_Next		;AN000;
			     C	
 0554  72 3A                 C		jb	$P_Val_Found		;AN000;
			     C	
 0556  26: 3B 54 05          C		cmp	dx,es:[si+$P_Val_YL]	;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-60


				 comp dx with YL
 055A  77 20                 C		ja	$P_Val02_Next		;AN000;
			     C	
 055C  EB 32                 C		jmp	short $P_Val_Found	;AN000;
			     C	
 055E                        C	$P_Val02_Sign:				;AN000;
 055E  26: 3B 4C 03          C		cmp	cx,es:[si+$P_Val_XH]	;AN000;
				 comp cx with XH
 0562  7C 18                 C		jl	$P_Val02_Next		;AN000;
			     C	
 0564  7F 06                 C		jg	$P_SVal_In		;AN000;
			     C	
 0566  26: 3B 54 01          C		cmp	dx,es:[si+$P_Val_XL]	;AN000;
				 comp dx with XL
 056A  7C 10                 C		jl	$P_Val02_Next		;AN000;
			     C	
 056C                        C	$P_SVal_In:				;AN000;
 056C  26: 3B 4C 07          C		cmp	cx,es:[si+$P_Val_YH]	;AN000;
				 comp cx with YH
 0570  7F 0A                 C		jg	$P_Val02_Next		;AN000;
			     C	
 0572  7C 1C                 C		jl	$P_Val_Found		;AN000;
			     C	
 0574  26: 3B 54 05          C		cmp	dx,es:[si+$P_Val_YL]	;AN000;
				 comp dx with YL
 0578  7F 02                 C		jg	$P_Val02_Next		;AN000;
			     C	
 057A  EB 14                 C		jmp	short $P_Val_Found	;AN000;
			     C	
 057C                        C	$P_Val02_Next:				;AN000;
 057C  83 C6 09              C		add	si,$P_Len_Range 	;AN000;
 057F  FE C8                 C		dec	al			;AN000;
				 loop nrng times in AL
 0581  75 B5                 C		jne	$P_Val02_Loop		;AN000;
			     C						; / Not
				 found
 0583  2E: C7 06 0002 R 0006 C		mov	psdata_seg:$P_RC,$P_Out_of_Rang
				e ;AC034;
 058A  B0 01                 C		mov	al,$P_Number		;AN000;
 058C  B4 FF                 C		mov	ah,$P_No_Tag		;AN000;
				 No ITEM_TAG set
 058E  EB 3D                 C		jmp	short $P_Value_Exit	;AN000;
			     C	
			     C	ENDIF					;AN000;
				(of Val1SW)
			     C	IF	Val1SW+Val2SW			;AN000;
				(Check if value list id #1 or #2 is supported)
 0590                        C	$P_Val_Found:				;AN000;
 0590  B0 01                 C		mov	al,$P_Number		;AN000;
 0592  26: 8A 24             C		mov	ah,es:[si]		;AN000;
				 found ITEM_TAG set
 0595  EB 36                 C		jmp	short $P_Value_Exit	;AN000;
			     C	
			     C	ENDIF					;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-61


				(of Val1SW+Val2SW)
 0597                        C	$P_Value03:				;AN000;
				 / nval = 2
			     C	IF	Val2SW				;AN000;
				(Check if value list id #2 is supported)
			     C	;;;;	cmp	al,$P_nval_Value	; have 
				match list ? ASSUME nval=2,
			     C	;;;;	jne	$P_Value04		; even 
				if it is 3 or more.
			     C	;(tm07) inc	si			;AN000;
			     C	;(tm07) mov	al,es:[si]		;AN000;
				 al = nrng
 0597  B4 09                 C		mov	ah,$P_Len_Range 	;AN000;
 0599  F6 E4                 C		mul	ah			;AN000;
				  Skip nrng field
 059B  40                    C		inc	ax			;AN000;
 059C  03 F0                 C		add	si,ax			;AN000;
				 si points to nnval
 059E  26: 8A 04             C		mov	al,es:[si]		;AN000;
				 get nnval
 05A1  46                    C		inc	si			;AN000;
				 si points to 1st item_tag
 05A2                        C	$P_Val03_Loop:				;AN000;
 05A2  26: 3B 4C 03          C		cmp	cx,es:[si+$P_Val_XH]	;AN000;
				 comp cx with XH
 05A6  75 06                 C		jne	$P_Val03_Next		;AN000;
			     C	
 05A8  26: 3B 54 01          C		cmp	dx,es:[si+$P_Val_XL]	;AN000;
				 comp dx with XL
 05AC  74 E2                 C		je	$P_Val_Found		;AN000;
			     C	
 05AE                        C	$P_Val03_Next:				;AN000;
 05AE  83 C6 05              C		add	si,$P_Len_Value 	;AN000;
				 points to next value choice
 05B1  FE C8                 C		dec	al			;AN000;
				 loop nval times in AL
 05B3  75 ED                 C		jne	$P_Val03_Loop		;AN000;
			     C						;AN000;
				 / Not found
 05B5  2E: C7 06 0002 R 0007 C		mov	psdata_seg:$P_RC,$P_Not_in_Val 
				;AC034;
 05BC  B0 01                 C		mov	al,$P_Number		;AN000;
 05BE  B4 FF                 C		mov	ah,$P_No_Tag		;AN000;
				 No ITEM_TAG set
 05C0  EB 0B                 C		jmp	short $P_Value_Exit	;AN000;
			     C	
			     C	ENDIF					;AN000;
				(of Val2SW)
 05C2                        C	$P_Value04:				;AN000;
				 / nval = 3 or else
 05C2                        C	$P_Value_Err:				;AN000;
 05C2  2E: C7 06 0002 R 0009 C		mov	psdata_seg:$P_RC,$P_Syntax ;AC0
				34;
 05C9  B0 03                 C		mov	al,$P_String		;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-62


				 Set type
 05CB  B4 FF                 C		mov	ah,$P_No_Tag		;AN000;
				 No ITEM_TAG set
 05CD                        C	$P_Value_Exit:				;AN000;
 05CD  E8 0304 R             C		call	$P_Fill_Result		;AN000;
 05D0  5E                    C		pop	si			;AN000;
 05D1  5A                    C		pop	dx			;AN000;
 05D2  59                    C		pop	cx			;AN000;
 05D3  58                    C		pop	ax			;AN000;
 05D4  C3                    C		ret				;AN000;
 05D5                        C	$P_Value endp				;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-63


			     C	PAGE					;AN000;
			     C	;**********************************************
				*************************
			     C	; $P_Check_OVF
			     C	;
			     C	; Function:  Check if overflow is occurred with
				 consideration of
			     C	;	     signed or un-signed numeric value
			     C	;
			     C	; Input:     Flag register
			     C	;
			     C	; Output:    CY = 1  :	Overflow
			     C	;
			     C	; Vars:     $P_Flags(R)
			     C	;**********************************************
				*************************
 05D5                        C	$P_Check_OVF proc			;AN000;
 05D5  9C                    C		pushf				;AN000;
 05D6  2E: F6 06 000E R 02   C		test	psdata_seg:$P_Flags2,$P_Neg ;AC
				034; is it negative value ?
 05DC  75 02                 C		jne	$P_COVF 		;AN000;
				 if no, check overflow
			     C	
 05DE  9D                    C		popf				;AN000;
				 by the CY bit
 05DF  C3                    C		ret				;AN000;
			     C	
 05E0                        C	$P_COVF:				;AN000;
 05E0  9D                    C		popf				;AN000;
				 else,
 05E1  70 02                 C		jo	$P_COVF00		;AN000;
				 check overflow by the OF
			     C	
 05E3  F8                    C		clc				;AN000;
				 indicate it with CY bit
 05E4  C3                    C		ret				;AN000;
				 CY=0 means no overflow
			     C	
 05E5                        C	$P_COVF00:				;AN000;
 05E5  F9                    C		stc				;AN000;
				 and CY=1 means overflow
 05E6  C3                    C		ret				;AN000;
 05E7                        C	$P_Check_OVF endp			;AN000;
			     C	ENDIF					;AN000;
				(of FarSW)
			     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
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-64


			     C	;	     CY = 0 : AL contains binary value
			     C	;**********************************************
				*************************
 05E7                        C	$P_0099 proc				;AN000;
 05E7  3C 30                 C		cmp	al,"0"                  ;AN000;
 05E9  72 08                 C		jb	$P_0099Err		;AN000;
				  must be 0 =< al =< 9
			     C	
 05EB  3C 39                 C		cmp	al,"9"                  ;AN000;
 05ED  77 04                 C		ja	$P_0099Err		;AN000;
				  must be 0 =< al =< 9
			     C	
 05EF  2C 30                 C		sub	al,"0"                  ;AN000;
				 make char -> bin
 05F1  F8                    C		clc				;AN000;
				 indicate no error
 05F2  C3                    C		ret				;AN000;
			     C	
 05F3                        C	$P_0099Err:				;AN000;
 05F3  F9                    C		stc				;AN000;
				 indicate error
 05F4  C3                    C		ret				;AN000;
 05F5                        C	$P_0099 endp				;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-65


			     C	PAGE					;AN000;
			     C	;**********************************************
				*************************
			     C	; $P_Simple_String
			     C	;
			     C	; Function:  See value list for the simple stri
				ng
			     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	;**********************************************
				*************************
 05F5                        C	$P_Simple_String proc			;AN000;
 05F5  50                    C		push	ax			;AN000;
 05F6  53                    C		push	bx			;AN000;
 05F7  52                    C		push	dx			;AN000;
 05F8  57                    C		push	di			;AN000;
 05F9  26: 8B 7F 06          C		mov	di,es:[bx].$P_Value_List ;AN000
				; di points to value list
 05FD  26: 8A 05             C		mov	al,es:[di]		;AN000;
				 get nval
 0600  0A C0                 C		or	al,al			;AN000;
				 no value list ?
 0602  75 04                 C		jne	$P_Sim00		;AN000;
				 then
			     C	
 0604  B4 FF                 C		mov	ah,$P_No_Tag		;AN000;
				 No ITEM_TAG set
 0606  EB 4C                 C		jmp	short $P_Sim_Exit	;AN000;
				 and set result buffer
			     C	
 0608                        C	$P_Sim00:				;AN000;
			     C	IF	Val3SW+KeySW			;AN000;
				(Check if keyword or value list id #3 is suppor
				ted)
 0608  3C 03                 C		cmp	al,$P_nval_String	;AN000;
				 String choice list provided ?
 060A  75 3F                 C		jne	$P_Sim01		;AN000;
				 if no, syntax error
			     C	
 060C  47                    C		inc	di			;AN000;
 060D  26: 8A 05             C		mov	al,es:[di]		;AN000;
				 al = nrng
 0610  B4 09                 C		mov	ah,$P_Len_Range 	;AN000;
 0612  F6 E4                 C		mul	ah			;AN000;
				  Skip nrng field
 0614  40                    C		inc	ax			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-66


				 ax = (nrng*9)+1
 0615  03 F8                 C		add	di,ax			;AN000;
				 di points to nnval
 0617  26: 8A 05             C		mov	al,es:[di]		;AN000;
				 get nnval
 061A  B4 05                 C		mov	ah,$P_Len_Value 	;AN000;
 061C  F6 E4                 C		mul	ah			;AN000;
				 Skip nnval field
 061E  40                    C		inc	ax			;AN000;
				 ax = (nnval*5)+1
 061F  03 F8                 C		add	di,ax			;AN000;
				 di points to nstrval
 0621  26: 8A 05             C		mov	al,es:[di]		;AN000;
				 get nstrval
 0624  47                    C		inc	di			;AC035;
				 add '2' to
 0625  47                    C		inc	di			;AC035;
				  DI reg
			     C						;AN000;
				 di points to 1st string in list
			     C	;(replaced ;AC035;) add     di,2	;AN000;
				 di points to 1st string in list
 0626                        C	$P_Sim_Loop:				;AN000;
 0626  26: 8B 2D             C		mov	bp,es:[di]		;AN000;
				 get string pointer
 0629  E8 065E R             C		call	$P_String_Comp		;AN000;
				 compare it with operand
 062C  73 12                 C		jnc	$P_Sim_Found		;AN000;
				 found on list ?
			     C	
 062E  83 C7 03              C		add	di,$P_Len_String	;AN000;
				 if no, point to next choice
 0631  FE C8                 C		dec	al			;AN000;
				 loop nstval times in AL
 0633  75 F1                 C		jne	$P_Sim_Loop		;AN000;
			     C						;AN000;
				 / Not found
 0635  2E: C7 06 0002 R 0008 C		mov	psdata_seg:$P_RC,$P_Not_In_Str 
				;AC034;
 063C  B4 FF                 C		mov	ah,$P_No_Tag		;AN000;
				 No ITEM_TAG set
 063E  EB 14                 C		jmp	short $P_Sim_Exit	;AN000;
			     C	
 0640                        C	$P_Sim_Found:				;AN000;
 0640  26: 8A 65 FF          C		mov	ah,es:[di-1]		;AN000;
				 set item_tag
 0644  B0 02                 C		mov	al,$P_List_Idx		;AN000;
 0646  26: 8B 15             C		mov	dx,es:[di]		;AN000;
				 get address of STRING
 0649  EB 0B                 C		jmp	short $P_Sim_Exit0	;AN000;
			     C	ENDIF					;AN000;
				(of Val3SW+KeySW)
 064B                        C	$P_Sim01:				;AN000;
 064B  2E: C7 06 0002 R 0009 C		mov	psdata_seg:$P_RC,$P_Syntax ;AC0
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-67


				34;
 0652  B4 FF                 C		mov	ah,$P_No_Tag		;AN000;
				 No ITEM_TAG set
 0654                        C	$P_Sim_Exit:				;AN000;
 0654  B0 03                 C		mov	al,$P_String		;AN000;
				 Set type
 0656                        C	$P_Sim_Exit0:				;AN000;
 0656  E8 0304 R             C		call	$P_Fill_Result		;AN000;
 0659  5F                    C		pop	di			;AN000;
 065A  5A                    C		pop	dx			;AN000;
 065B  5B                    C		pop	bx			;AN000;
 065C  58                    C		pop	ax			;AN000;
 065D  C3                    C		ret				;AN000;
 065E                        C	$P_Simple_String endp			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-68


			     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 uppe
				r 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_KEY
				orSW_Ptr
			     C	;**********************************************
				*************************
 065E                        C	$P_String_Comp proc			;AN000;
 065E  50                    C		push	ax			;AN000;
 065F  55                    C		push	bp			;AN000;
 0660  52                    C		push	dx			;AN000;
 0661  56                    C		push	si			;AN000;
 0662  B2 02                 C		mov	dl,$P_DOSTBL_Char	;AN000;
				 use character case map table
 0664                        C	$P_SCOM_Loop:				;AN000;
 0664  2E: 8A 04             C		mov	al,psdata_seg:[si]	;AN000;
				 get command character
 0667  E8 07C5 R             C		call	$P_Chk_DBCS		;AN000;
				 DBCS ?
 066A  72 3C                 C		jc	$P_SCOM00		;AN000;
				 yes,DBCS
			     C	
 066C  E8 044F 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)
 066F  2E: F6 06 000E R 08   C		test	psdata_seg:$P_Flags2,$P_Key_Cmp
				 ;AC034; keyword search ?
 0675  74 0D                 C		je	$P_SCOM04		;AN000;
			     C	
 0677  3C 3D                 C		cmp	al,$P_Keyword		;AN000;
				 "=" is delimiter
 0679  75 1F                 C		jne	$P_SCOM03		;AN000;
				IF "=" on command line AND  (bp+1=> char after 
				the "=" in synonym list)
			     C	
 067B  26: 80 7E 01 00       C		cmp	byte ptr es:[bp+1],$P_NULL ;AN0
				21;   at end of keyword string in the control b
				lock THEN
 0680  75 5A                 C		jne	$P_SCOM_DIFFER		;AN021;
			     C	
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-69


 0682  EB 13                 C		jmp	short $P_SCOM05 	;AN000;
				   keyword found in synonym list
			     C	
 0684                        C	$P_SCOM04:				;AN000;
 0684  2E: F6 06 000E R 10   C		test	psdata_seg:$P_Flags2,$P_SW_Cmp 
				;AC034; switch search ?
 068A  74 0E                 C		je	$P_SCOM03		;AN000;
			     C	
 068C  3C 3A                 C		cmp	al,$P_Colon		;AN000;
				 ":" is delimiter, at end of switch on command 
				line
 068E  75 0A                 C		jne	$P_SCOM03		;AN000;
				 continue compares
			     C	
 0690  26: 80 7E 00 00       C		cmp	byte ptr es:[bp],$P_NULL ;AN021
				; IF at end of switch on command AND
 0695  75 45                 C		jne	$P_SCOM_DIFFER		;AN021;
				   at end of switch string in the control block
				 THEN
			     C	
 0697                        C	$P_SCOM05:				;AN000;
				   found a match
 0697  46                    C		inc	si			;AN000;
				 si points to just after "=" or ":"
 0698  EB 45                 C		jmp	short $P_SCOM_Same	;AN000;
				 exit
			     C	
 069A                        C	$P_SCOM03:				;AN000;
			     C	ENDIF					;AN000;
				(of KeySW+SwSW)
 069A  26: 3A 46 00          C		cmp	al,es:[bp]		;AN000;
				 compare operand w/ a synonym
 069E  75 1D                 C		jne	$P_SCOM_Differ0 	;AN000;
				 if different, check ignore colon option
			     C	
 06A0  0A C0                 C		or	al,al			;AN000;
				 end of line
 06A2  74 3B                 C		je	$P_SCOM_Same		;AN000;
				 if so, exit
			     C	
 06A4  46                    C		inc	si			;AN000;
				 update operand pointer
 06A5  45                    C		inc	bp			;AN000;
				 	   and synonym pointer
 06A6  EB 13                 C		jmp	short $P_SCOM01 	;AN000;
				 loop until NULL or "=" or ":" found in case
			     C	
 06A8                        C	$P_SCOM00:				;AN000;
				 Here al is DBCS leading byte
 06A8  26: 3A 46 00          C		cmp	al,es:[bp]		;AN000;
				 compare leading byte
 06AC  75 2E                 C		jne	$P_SCOM_Differ		;AN000;
				 if not match, say different
			     C	
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-70


 06AE  46                    C		inc	si			;AN000;
				 else, load next byte
 06AF  2E: 8A 04             C		mov	al,psdata_seg:[si]	;AN000;
				 and
 06B2  45                    C		inc	bp			;AN000;
 06B3  26: 3A 46 00          C		cmp	al,es:[bp]		;AN000;
				 compare 2nd byte
 06B7  75 23                 C		jne	$P_SCOM_Differ		;AN000;
				 if not match, say different, too
			     C	
 06B9  46                    C		inc	si			;AN000;
				 else update operand pointer
 06BA  45                    C		inc	bp			;AN000;
				 		and synonym pointer
 06BB                        C	$P_SCOM01:				;AN000;
 06BB  EB A7                 C		jmp	short $P_SCOM_Loop	;AN000;
				 loop until NULL or "=" or "/" found in case
			     C	
 06BD                        C	$P_SCOM_Differ0:			;AN000;
			     C	
			     C	
 06BD  26: F7 07 0010        C		test	es:[bx].$P_Match_Flag,$P_Ig_Col
				on ;AN000; ignore colon option specified ?
 06C2  74 18                 C		je	$P_SCOM_Differ		;AN000;
				 if no, say different.
			     C	
 06C4  3C 3A                 C		cmp	al,$P_Colon		;AN000;
				 End up with ":" and
 06C6  75 09                 C		jne	$P_SCOM02		;AN000;
				    subseqently
			     C	
 06C8  26: 80 7E 00 00       C		cmp	byte ptr es:[bp],$P_NULL ;AN000
				;       NULL ?
 06CD  75 0D                 C		jne	$P_SCOM_Differ		;AN000;
				 if no, say different
			     C	
 06CF  EB 0E                 C		jmp	short $p_SCOM_Same	;AN000;
				 else, say same
			     C	
 06D1                        C	$P_SCOM02:				;AN000;
 06D1  3C 00                 C		cmp	al,$P_NULL		;AN000;
				 end up NULL and :
 06D3  75 07                 C		jne	$P_SCOM_Differ		;AN000;
			     C	
 06D5  26: 80 7E 00 3A       C		cmp	byte ptr es:[bp],$P_Colon ;AN00
				0; if no, say different
 06DA  74 03                 C		je	$p_SCOM_Same		;AN000;
				 else, say same
			     C	
 06DC                        C	$P_SCOM_Differ: 			;AN000;
 06DC  F9                    C		stc				;AN000;
				 indicate not found
 06DD  EB 06                 C		jmp	short $P_SCOM_Exit	;AN000;
			     C	
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-71


 06DF                        C	$P_SCOM_Same:				;AN000;
 06DF  2E: 89 36 0011 R      C		mov	psdata_seg:$P_KEYorSW_Ptr,si ;A
				C034; for later use by keyword or switch
 06E4  F8                    C		clc				;AN000;
				 indicate found
 06E5                        C	$P_SCOM_Exit:				;AN000;
 06E5  5E                    C		pop	si			;AN000;
 06E6  5A                    C		pop	dx			;AN000;
 06E7  5D                    C		pop	bp			;AN000;
 06E8  58                    C		pop	ax			;AN000;
 06E9  C3                    C		ret				;AN000;
 06EA                        C	$P_String_Comp endp			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-72


			     C	PAGE					;AN000;
			     C	;**********************************************
				*************************
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-73


			     C	PAGE					;AN000;
			     C	;**********************************************
				*************************
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-74


			     C	PAGE					;AN000;
			     C	;**********************************************
				*************************
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-75


			     C	PAGE					;AN000;
			     C	;**********************************************
				*************************
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-76


			     C	PAGE					;AN000;
			     C	;**********************************************
				*************************
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-77


			     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 quo
				tetaion
			     C	;
			     C	; Vars:  $P_SorD_Quote(W)
			     C	;**********************************************
				*************************
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-78


			     C	PAGE					;AN000;
			     C	;**********************************************
				*************************
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-79


			     C	PAGE					;AN000;
			     C	;**********************************************
				*************************
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-80


			     C	PAGE					;AN000;
			     C	;**********************************************
				*************************
			     C	; $P_Skip_Delim;
			     C	;
			     C	; Function: Skip delimiters specified in the PA
				RMS 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 encounter
				d
			     C	;	    CY = 0 then SI move to 1st non-deli
				miter character
			     C	;	    AL = Last examineed character
			     C	;
			     C	; Use:	    $P_Chk_EOL, $P_Chk_Delim,
			     C	;
			     C	; Vars:     $P_Flags(R)
			     C	;**********************************************
				*************************
 06EA                        C	$P_Skip_Delim proc			;AN000;
 06EA                        C	$P_Skip_Delim_Loop:			;AN000;
 06EA  AC                    C		LODSB				;AN000;
 06EB  E8 0710 R             C		call	$P_Chk_EOL		;AN000;
				 is it EOL character ?
 06EE  74 18                 C		je	$P_Skip_Delim_CY	;AN000;
				 if yes, exit w/ CY on
			     C	
 06F0  E8 0746 R             C		call	$P_Chk_Delim		;AN000;
				 is it one of delimiters ?
 06F3  75 16                 C		jne	$P_Skip_Delim_NCY	;AN000;
				 if no, exit w/ CY off
			     C	
 06F5  2E: F6 06 000E R 20   C		test	psdata_seg:$P_Flags2,$P_Extra ;
				AC034; extra delim or comma found ?
 06FB  74 ED                 C		je	$P_Skip_Delim_Loop	;AN000;
				 if no, loop
			     C	
 06FD  2E: F6 06 000E R 41   C		test	psdata_seg:$P_Flags2,$P_SW+$P_e
				qu ;AC034; /x , or xxx=zzz , (tm08)
 0703  74 09                 C		je	short $P_Exit_At_Extra	;AN000;
				 no switch, no keyword (tm08)
			     C	
 0705  4E                    C		dec	si			;AN000;
				 backup si for next call (tm08)
 0706  EB 06                 C		jmp	short $P_Exit_At_Extra	;AN000;
				 else exit w/ CY off
			     C	
 0708                        C	$P_Skip_Delim_CY:			;AN000;
 0708  F9                    C		stc				;AN000;
				 indicate EOL
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-81


 0709  EB 01                 C		jmp	short $P_Skip_Delim_Exit ;AN000
				;
			     C	
 070B                        C	$P_Skip_Delim_NCY:			;AN000;
 070B  F8                    C		clc				;AN000;
				 indicate non delim
 070C                        C	$P_Skip_Delim_Exit:			;AN000;
				 in this case, need
 070C  4E                    C		dec	si			;AN000;
				  backup index pointer
 070D  C3                    C		ret				;AN000;
			     C	
 070E                        C	$P_Exit_At_Extra:			;AN000;
 070E  F8                    C		clc				;AN000;
				 indicate extra delim
 070F  C3                    C		ret				;AN000;
 0710                        C	$P_Skip_Delim endp			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-82


			     C	PAGE					;AN000;
			     C	;**********************************************
				*************************
			     C	; $P_Chk_EOL;
			     C	;
			     C	; Function: Check if AL is one of End of Line c
				haracters.
			     C	;
			     C	; Input:    AL = character code
			     C	;	    ES:DI -> Parameter List
			     C	;
			     C	; Output:   ZF = 1 if one of End of Line charac
				ters
			     C	;**********************************************
				************************
 0710                        C	$P_Chk_EOL proc 			;AN000;
 0710  53                    C		push	bx			;AN000;
 0711  51                    C		push	cx			;AN000;
 0712  3C 0D                 C		cmp	al,$P_CR		;AN000;
				 Carriage return ?
 0714  74 2D                 C		je	$P_Chk_EOL_Exit 	;AN000;
			     C	
 0716  3C 00                 C		cmp	al,$P_NULL		;AN000;
				 zero ?
 0718  74 29                 C		je	$P_Chk_EOL_Exit 	;AN000;
			     C	
			     C	IF LFEOLSW				;AN028;
				 IF LF TO BE ACCEPTED AS EOL
 071A  3C 0A                 C		cmp	al,$P_LF		;AN000;
				 Line feed ?
 071C  74 25                 C		je	$P_Chk_EOL_Exit 	;AN000;
			     C	ENDIF					;AN028;
			     C	
 071E  26: 80 7D 02 02       C		cmp	byte ptr es:[di].$P_Num_Extra,$
				P_I_Have_EOL ;AN000; EOL character specified ?
 0723  72 1E                 C		jb	$P_Chk_EOL_Exit 	;AN000;
			     C	
 0725  33 DB                 C		xor	bx,bx			;AN000;
 0727  26: 8A 5D 03          C		mov	bl,es:[di].$P_Len_Extra_Delim ;
				AN000; get length of delimiter list
 072B  83 C3 04              C		add	bx,$P_Len_PARMS 	;AN000;
				 skip it
 072E  26: 80 39 00          C		cmp	byte ptr es:[bx+di],$P_I_Use_De
				fault ;AN000; No extra EOL character ?
 0732  74 0D                 C		je	$P_Chk_EOL_NZ		;AN000;
			     C	
 0734  33 C9                 C		xor	cx,cx			;AN000;
				 Get number of extra chcracter
 0736  26: 8A 09             C		mov	cl,es:[bx+di]		;AN000;
 0739                        C	$P_Chk_EOL_Loop:			;AN000;
 0739  43                    C		inc	bx			;AN000;
 073A  26: 3A 01             C		cmp	al,es:[bx+di]		;AN000;
				 Check extra EOL character
 073D  74 04                 C		je	$P_Chk_EOL_Exit 	;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-83


			     C	
 073F  E2 F8                 C		loop	$P_Chk_EOL_Loop 	;AN000;
			     C	
 0741                        C	$P_Chk_EOL_NZ:				;AN000;
 0741  3C 0D                 C		cmp	al,$P_CR		;AN000;
				 reset ZF
 0743                        C	$P_Chk_EOL_Exit:			;AN000;
 0743  59                    C		pop	cx			;AN000;
 0744  5B                    C		pop	bx			;AN000;
 0745  C3                    C		ret				;AN000;
 0746                        C	$P_Chk_EOL endp 			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-84


			     C	PAGE					;AN000;
			     C	;**********************************************
				*************************
			     C	; $P_Chk_Delim;
			     C	;
			     C	; Function: Check if AL is one of delimiter cha
				racters.
			     C	;	    if AL+[si] is DBCS blank, it is rep
				laced 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 characte
				rs
			     C	;	    SI points to the next character
			     C	; Vars:  $P_Terminator(W), $P_Flags(W)
			     C	;**********************************************
				*************************
 0746                        C	$P_Chk_Delim proc			;AN000;
 0746  53                    C		push	bx			;AN000;
 0747  51                    C		push	cx			;AN000;
 0748  2E: C6 06 0008 R 20   C		mov	psdata_seg:$P_Terminator,$P_Spa
				ce   ;AC034; Assume terminated by space
 074E  2E: 80 26 000E R DF   C		and	psdata_seg:$P_Flags2,0ffh-$P_Ex
				tra ;AC034;
 0754  3C 20                 C		cmp	al,$P_Space		;AN000;
				 Space ?
 0756  74 36                 C		je	$P_Chk_Delim_Exit	;AN000;
			     C	
 0758  3C 09                 C		cmp	al,$P_TAB		;AN000;
				 TAB ?
 075A  74 32                 C		je	$P_Chk_Delim_Exit	;AN000;
			     C	
 075C  3C 2C                 C		cmp	al,$P_Comma		;AN000;
				 Comma ?
 075E  74 31                 C		je	$P_Chk_Delim_Exit0	;AN000;
			     C	
 0760                        C	$P_Chk_Delim00: 			;AN000;
 0760  3C 81                 C		cmp	al,$P_DBSP1		;AN000;
				 1st byte of DBCS Space ?
 0762  75 0C                 C		jne	$P_Chk_Delim01		;AN000;
			     C	
 0764  80 3C 40              C		cmp	byte ptr [si],$P_DBSP2	;AN000;
				 2nd byte of DBCS Space ?
 0767  75 07                 C		jne	$P_Chk_Delim01		;AN000;
			     C	
 0769  B0 20                 C		mov	al,$P_Space		;AN000;
 076B  46                    C		inc	si			;AN000;
				 make si point to next character
 076C  3A C0                 C		cmp	al,al			;AN000;
				 Set ZF
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-85


 076E  EB 1E                 C		jmp	short $P_Chk_Delim_Exit ;AN000;
			     C	
 0770                        C	$P_Chk_Delim01: 			;AN000;
 0770  26: 80 7D 02 01       C		cmp	byte ptr es:[di].$P_Num_Extra,$
				P_I_Have_Delim ;AN000; delimiter character spec
				ified ?
 0775  72 17                 C		jb	$P_Chk_Delim_Exit	;AN000;
			     C	
 0777  33 C9                 C		xor	cx,cx			;AN000;
 0779  26: 8A 4D 03          C		mov	cl,es:[di].$P_Len_Extra_Delim ;
				AN000; get length of delimiter list
 077D  0B C9                 C		or	cx,cx			;AN000;
				 No extra Delim character ?
 077F  74 0B                 C		je	$P_Chk_Delim_NZ 	;AN000;
			     C	
 0781  BB 0003               C		mov	bx,$P_Len_PARMS-1	;AN000;
				 set bx to 1st extra delimiter
 0784                        C	$P_Chk_Delim_Loop:			;AN000;
 0784  43                    C		inc	bx			;AN000;
 0785  26: 3A 01             C		cmp	al,es:[bx+di]		;AN000;
				 Check extra Delim character
 0788  74 07                 C		je	$P_Chk_Delim_Exit0	;AN000;
			     C	
 078A  E2 F8                 C		loop	$P_Chk_Delim_Loop	;AN000;
				 examine all extra delimiter
			     C	
 078C                        C	$P_Chk_Delim_NZ:			;AN000;
 078C  3C 20                 C		cmp	al,$P_Space		;AN000;
				 reset ZF
 078E                        C	$P_Chk_Delim_Exit:			;AN000;
			     C	;;;;	jne	$P_ChkDfin
			     C	;;;;	mov	psdata_seg:$P_Terminator,al ;AN
				034;
 078E                        C	$P_ChkDfin:				;AN000;
 078E  59                    C		pop	cx			;AN000;
 078F  5B                    C		pop	bx			;AN000;
 0790  C3                    C		ret				;AN000;
			     C	
 0791                        C	$P_Chk_Delim_Exit0:			;AN000;
 0791  2E: A2 0008 R         C		mov	psdata_seg:$P_Terminator,al ;AC
				034; keep terminated delimiter
 0795  2E: F6 06 000E R 01   C		test	psdata_seg:$P_Flags2,$P_Equ  ;A
				N027;AC034;; if terminating a key=
 079B  75 06                 C		jnz	$P_No_Set_Extra 	;AN027;
				 then do not set the EXTRA bit
			     C	
 079D  2E: 80 0E 000E R 20   C		or	psdata_seg:$P_Flags2,$P_Extra ;
				AC034; flag terminated extra delimiter or comma
 07A3                        C	$P_No_Set_Extra:			;AN027;
 07A3  3A C0                 C		cmp	al,al			;AN000;
				 set ZF
 07A5  EB E7                 C		jmp	short $P_Chk_Delim_Exit ;AN000;
			     C	
 07A7                        C	$P_Chk_Delim endp			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-86


			     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_Stri
				ng_Buf
			     C	;	    SI =>next char on command line (fol
				lowing the one in AL)
			     C	;
			     C	; Output:   CF = 1 (set)if AL is switch charact
				er, 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 de
				limiter.
			     C	
			     C	;	    CF = 0 (reset, cleared) if AL is no
				t a switch char, is in the first
			     C	;		 position, or is a slash but ma
				y be part of a date string, i.e.
			     C	;		 should not be treated as a del
				imiter.
			     C	;
			     C	; Vars:  $P_Terminator(W)
			     C	
			     C	; Use:	 $P_0099
			     C	;**********************************************
				*************************
 07A7                        C	$P_Chk_Switch proc			;AN000;
			     C	
			     C	;AN020;; Function: Check if AL is the switch ch
				aracter 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;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-87


				 (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	
 07A7  8D 2E 0017 R          C		LEA	BP,psdata_seg:$P_String_Buf ;AN
				020;AC034; BP=OFFSET of $P_String_Buf even in g
				roup addressing
			     C	;	.IF <BX NE BP> THEN		;AN020;
				IF not first char THEN
 07AB  3B DD                 C		cmp	BX,BP			;AN000;
 07AD  74 0A                 C		je	$P_STRUC_L2		;AN000;
			     C	
			     C	;	    .IF <AL EQ $P_Switch> THEN	;AN020;
				otherwise see if a slash
 07AF  3C 2F                 C		    cmp     AL,$P_Switch	;AN000;
 07B1  75 03                 C		    jne     $P_STRUC_L5 	;AN000;
			     C	
 07B3  F9                    C			STC			;AN020;
				not in first position and is slash, now see if 
				might be in date string
			     C	;	    .ELSE			;AN020;
 07B4  EB 0E                 C		    jmp     short $P_STRUC_L1	;AN000;
			     C	
 07B6                        C	$P_STRUC_L5:				;AN000;
 07B6  F8                    C			CLC			;AN020;
				not a slash
			     C	;	    .ENDIF			;AN020;
			     C	;	.ELSE				;AN020;
				is first char in the buffer, ZF=0
 07B7  EB 0B                 C		jmp	short $P_STRUC_L1	;AN000;
			     C	
 07B9                        C	$P_STRUC_L2:				;AN000;
			     C	;	    .IF <AL EQ $P_Switch> THEN	;AN020;
 07B9  3C 2F                 C		    cmp     AL,$P_Switch	;AN000;
 07BB  75 06                 C		    jne     $P_STRUC_L12	;AN000;
			     C	
 07BD  2E: 80 0E 000E R 40   C			OR	psdata_seg:$P_Flags2,$P
				_SW ;AN020;AC034;;could be valid switch, first 
				char and is slash
			     C	;	    .ENDIF			;AN020;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-88


 07C3                        C	$P_STRUC_L12:				;AN000;
 07C3  F8                    C		    CLC 			;AN020;
				CF=0 indicating first char
			     C	;	.ENDIF				;AN020;
 07C4                        C	$P_STRUC_L1:				;AN000;
			     C	
 07C4  C3                    C		ret				;AN000;
 07C5                        C	$P_Chk_Switch endp			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-89


			     C		PAGE				;AN000;
			     C	;**********************************************
				****************************
			     C	; $P_Chk_DBCS:
			     C	;
			     C	;  Function: Check if a specified byte is in ra
				nges 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	;**********************************************
				*****************************
 07C5                        C	$P_Chk_DBCS PROC			;AN000;
			     C	;
 07C5  1E                    C		PUSH	DS			;AN000;
 07C6  56                    C		PUSH	SI			;AN000;
 07C7  53                    C		PUSH	bx			;AN000;
				 (tm11)
 07C8  2E: 83 3E 000B R 00   C		CMP	psdata_seg:$P_DBCSEV_SEG,0 ;AC0
				34; ALREADY SET ?
 07CE  75 27                 C		JNE	$P_DBCS00		;AN000;
			     C	
 07D0  50                    C		PUSH	AX			;AN000;
			     C	;	PUSH	BX			;AN000;
				 (tm11)
 07D1  1E                    C		PUSH	ds			;AN000;
				 (tm11)
 07D2  51                    C		PUSH	CX			;AN000;
 07D3  52                    C		PUSH	DX			;AN000;
 07D4  57                    C		PUSH	DI			;AN000;
 07D5  55                    C		PUSH	BP			;AN000;
 07D6  06                    C		PUSH	ES			;AN000;
 07D7  33 F6                 C		XOR	SI,SI			;AN000;
 07D9  8E DE                 C		MOV	DS,SI			;AN000;
 07DB  B8 6300               C		MOV	AX,$P_DOS_GetEV 	;AN000;
				 GET DBCS EV CALL
 07DE  CD 21                 C		INT	21H			;AN000;
			     C	
			     C	;	MOV	AX,DS			;AN000;
				 (tm11)
			     C	;	OR	AX,AX			;AN000;
				 (tm11)
 07E0  8C DB                 C		MOV	bx,DS			;AN000;
				 (tm11)
 07E2  0B DB                 C		OR	bx,bx			;AN000;
				 (tm11)
 07E4  07                    C		POP	ES			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-90


 07E5  5D                    C		POP	BP			;AN000;
 07E6  5F                    C		POP	DI			;AN000;
 07E7  5A                    C		POP	DX			;AN000;
 07E8  59                    C		POP	CX			;AN000;
			     C	;	POP	BX			;AN000;
				 (tm11)
 07E9  1F                    C		POP	ds			;AN000;
				 (tm11)
 07EA  58                    C		POP	AX			;AN000;
 07EB  74 29                 C		JE	$P_NON_DBCS		;AN000;
			     C	
 07ED                        C	$P_DBCS02:				;AN000;
 07ED  2E: 89 36 0009 R      C		MOV	psdata_seg:$P_DBCSEV_OFF,SI ;AC
				034; save EV offset
			     C	;	MOV	psdata_seg:$P_DBCSEV_SEG,DS ;AC
				034; save EV segment
 07F2  2E: 89 1E 000B R      C		MOV	psdata_seg:$P_DBCSEV_SEG,bx ;AC
				034; save EV segment (tm11)
 07F7                        C	$P_DBCS00:				;AN000;
 07F7  2E: 8B 36 0009 R      C		MOV	SI,psdata_seg:$P_DBCSEV_OFF ;AC
				034; load EV offset
 07FC  2E: 8E 1E 000B R      C		MOV	DS,psdata_seg:$P_DBCSEV_SEG ;AC
				034; and segment
			     C	
 0801                        C	$P_DBCS_LOOP:				;AN000;
 0801  83 3C 00              C		CMP	WORD PTR [SI],0 	;AN000;
				 zero vector ?
 0804  74 10                 C		JE	$P_NON_DBCS		;AN000;
				 then exit
			     C	
 0806  3A 04                 C		CMP	AL,[SI] 		;AN000;
 0808  72 08                 C		JB	$P_DBCS01		;AN000;
				 Check if AL is in
			     C	
 080A  3A 44 01              C		CMP	AL,[SI+BYTE]		;AN000;
				   range of
 080D  77 03                 C		JA	$P_DBCS01		;AN000;
				      the vector
			     C	
 080F  F9                    C		STC				;AN000;
				 if yes, indicate DBCS and exit
 0810  EB 05                 C		JMP	short $P_DBCS_EXIT	;AN000;
			     C	
 0812                        C	$P_DBCS01:				;AN000;
 0812  46                    C		INC	SI			;AC035;
				 add '2' to
 0813  46                    C		INC	SI			;AC035;
				  SI reg
			     C						;AN000;
				 get next vector
			     C	;(changed ;AC035;) ADD	   SI,2 	;AN000;
				 get next vector
 0814  EB EB                 C		JMP	short $P_DBCS_LOOP	;AN000;
				 loop until zero vector found
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Page     1-91


			     C	
 0816                        C	$P_NON_DBCS:				;AN000;
 0816  F8                    C		CLC				;AN000;
				 indicate SBCS
 0817                        C	$P_DBCS_EXIT:				;AN000;
 0817  5B                    C		POP	bx			;AN000;
				 (tm11)
 0818  5E                    C		POP	SI			;AN000;
 0819  1F                    C		POP	DS			;AN000;
 081A  C3                    C		RET				;AN000;
 081B                        C	$P_Chk_DBCS ENDP			;AN000;
				
 081B				PARSER	ENDS				;AN000;
					END				;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             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

DATA . . . . . . . . . . . . . .  	0000	BYTE	PUBLIC	'DATA'
PARSER . . . . . . . . . . . . .  	081B	PARA	PUBLIC	'PARSER'
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Symbols-2


Symbols:            

                N a m e         	Type	 Value	 Attr

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

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

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

INCSW  . . . . . . . . . . . . .  	NUMBER	0001	

KEYSW  . . . . . . . . . . . . .  	NUMBER	0001	

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

NUMSW  . . . . . . . . . . . . .  	NUMBER	0001	

PSDATA_SEG . . . . . . . . . . .  	ALIAS	 CS		

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

SWSW . . . . . . . . . . . . . .  	NUMBER	0000	
SYSPARSE . . . . . . . . . . . .  	F PROC	009F	PARSER	Global	Length = 01BC

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

VAL1SW . . . . . . . . . . . . .  	NUMBER	0001	
VAL2SW . . . . . . . . . . . . .  	NUMBER	0001	
VAL3SW . . . . . . . . . . . . .  	NUMBER	0001	

$P_0099  . . . . . . . . . . . .  	N PROC	05E7	PARSER	Length = 000E
$P_0099ERR . . . . . . . . . . .  	L NEAR	05F3	PARSER
$P_ASCII80 . . . . . . . . . . .  	NUMBER	0080	
$P_BL_EQ . . . . . . . . . . . .  	NUMBER	203D	
$P_BRIDGE  . . . . . . . . . . .  	L NEAR	03B1	PARSER
$P_CAPS_RET  . . . . . . . . . .  	L NEAR	0493	PARSER
$P_CAP_CHAR  . . . . . . . . . .  	NUMBER	0002	
$P_CAP_FILE  . . . . . . . . . .  	NUMBER	0001	
$P_CHAR_CAP_PTR  . . . . . . . .  	L BYTE	0097	PARSER
$P_CHECK_MATCH_FLAGS . . . . . .  	N PROC	0389	PARSER	Length = 0081
$P_CHECK_OVF . . . . . . . . . .  	N PROC	05D5	PARSER	Length = 0012
$P_CHKDFIN . . . . . . . . . . .  	L NEAR	078E	PARSER
$P_CHK_DBCS  . . . . . . . . . .  	N PROC	07C5	PARSER	Length = 0056
$P_CHK_DELIM . . . . . . . . . .  	N PROC	0746	PARSER	Length = 0061
$P_CHK_DELIM00 . . . . . . . . .  	L NEAR	0760	PARSER
$P_CHK_DELIM01 . . . . . . . . .  	L NEAR	0770	PARSER
$P_CHK_DELIM_EXIT  . . . . . . .  	L NEAR	078E	PARSER
$P_CHK_DELIM_EXIT0 . . . . . . .  	L NEAR	0791	PARSER
$P_CHK_DELIM_LOOP  . . . . . . .  	L NEAR	0784	PARSER
$P_CHK_DELIM_NZ  . . . . . . . .  	L NEAR	078C	PARSER
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Symbols-3


$P_CHK_EOL . . . . . . . . . . .  	N PROC	0710	PARSER	Length = 0036
$P_CHK_EOL_EXIT  . . . . . . . .  	L NEAR	0743	PARSER
$P_CHK_EOL_LOOP  . . . . . . . .  	L NEAR	0739	PARSER
$P_CHK_EOL_NZ  . . . . . . . . .  	L NEAR	0741	PARSER
$P_CHK_KEY_CONTROL . . . . . . .  	N PROC	028D	PARSER	Length = 0044
$P_CHK_KEY_ERR0  . . . . . . . .  	L NEAR	02BC	PARSER
$P_CHK_KEY_ERR1  . . . . . . . .  	L NEAR	02BF	PARSER
$P_CHK_KEY_ERREXIT . . . . . . .  	L NEAR	02C6	PARSER
$P_CHK_KEY_EXIT  . . . . . . . .  	L NEAR	02D0	PARSER
$P_CHK_POS_CONTROL . . . . . . .  	N PROC	025B	PARSER	Length = 0032
$P_CHK_SWITCH  . . . . . . . . .  	N PROC	07A7	PARSER	Length = 001E
$P_CHK_SW_CONTROL  . . . . . . .  	N PROC	0302	PARSER	Length = 0002
$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_COUNT_TO_EOL  . . . . . . . .  	L WORD	009C	PARSER
$P_COVF  . . . . . . . . . . . .  	L NEAR	05E0	PARSER
$P_COVF00  . . . . . . . . . . .  	L NEAR	05E5	PARSER
$P_CPC00 . . . . . . . . . . . .  	L NEAR	0269	PARSER
$P_CPC01 . . . . . . . . . . . .  	L NEAR	0288	PARSER
$P_CPC02 . . . . . . . . . . . .  	L NEAR	027D	PARSER
$P_CPC_EXIT  . . . . . . . . . .  	L NEAR	028B	PARSER
$P_CR  . . . . . . . . . . . . .  	NUMBER	000D	
$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	07F7	PARSER
$P_DBCS01  . . . . . . . . . . .  	L NEAR	0812	PARSER
$P_DBCS02  . . . . . . . . . . .  	L NEAR	07ED	PARSER
$P_DBCSEV_OFF  . . . . . . . . .  	L WORD	0009	PARSER
$P_DBCSEV_SEG  . . . . . . . . .  	L WORD	000B	PARSER
$P_DBCS_EXIT . . . . . . . . . .  	L NEAR	0817	PARSER
$P_DBCS_LOOP . . . . . . . . . .  	L NEAR	0801	PARSER
$P_DBSP1 . . . . . . . . . . . .  	NUMBER	0081	
$P_DBSP2 . . . . . . . . . . . .  	NUMBER	0040	
$P_DCC00 . . . . . . . . . . . .  	L NEAR	0466	PARSER
$P_DCC01 . . . . . . . . . . . .  	L NEAR	0482	PARSER
$P_DCC_GO  . . . . . . . . . . .  	L NEAR	045F	PARSER
$P_DCS00 . . . . . . . . . . . .  	L NEAR	0448	PARSER
$P_DCS01 . . . . . . . . . . . .  	L NEAR	0449	PARSER
$P_DCS_EXIT  . . . . . . . . . .  	L NEAR	044C	PARSER
$P_DCS_LOOP  . . . . . . . . . .  	L NEAR	0434	PARSER
$P_DO1 . . . . . . . . . . . . .  	L NEAR	00D5	PARSER
$P_DO2 . . . . . . . . . . . . .  	L NEAR	00DD	PARSER
$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	
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Symbols-4


$P_DOS_GET_CDI . . . . . . . . .  	NUMBER	3800	
$P_DOS_GET_TBL . . . . . . . . .  	NUMBER	0065	
$P_DOUBLE_QUOTE  . . . . . . . .  	NUMBER	0022	
$P_DO_CAPS_CHAR  . . . . . . . .  	N PROC	044F	PARSER	Length = 0045
$P_DO_CAPS_STRING  . . . . . . .  	N PROC	0430	PARSER	Length = 001F
$P_DQUOTE  . . . . . . . . . . .  	NUMBER	0022	
$P_DRIVE . . . . . . . . . . . .  	NUMBER	0006	
$P_DRV_ONLY  . . . . . . . . . .  	NUMBER	0100	
$P_DX  . . . . . . . . . . . . .  	L WORD	0006	PARSER
$P_EOL . . . . . . . . . . . . .  	NUMBER	0000	
$P_EQU . . . . . . . . . . . . .  	NUMBER	0001	
$P_EQ_BL . . . . . . . . . . . .  	NUMBER	3D20	
$P_EQ_TB . . . . . . . . . . . .  	NUMBER	3D09	
$P_ERROR_FILESPEC  . . . . . . .  	NUMBER	0001	
$P_ERR_FLAG  . . . . . . . . . .  	L BYTE	009E	PARSER
$P_EXIT_AT_EXTRA . . . . . . . .  	L NEAR	070E	PARSER
$P_EXTRA . . . . . . . . . . . .  	NUMBER	0020	
$P_FILE_SPC  . . . . . . . . . .  	NUMBER	0200	
$P_FILE_SPEC . . . . . . . . . .  	NUMBER	0005	
$P_FILL_RESULT . . . . . . . . .  	N PROC	0304	PARSER	Length = 0085
$P_FIN . . . . . . . . . . . . .  	L NEAR	0138	PARSER
$P_FLAGS . . . . . . . . . . . .  	L WORD	000D	PARSER
$P_FLAGS1  . . . . . . . . . . .  	BYTE	000D	PARSER
$P_FLAGS2  . . . . . . . . . . .  	BYTE	000E	PARSER
$P_FOUND_SYNONYM . . . . . . . .  	L WORD	0015	PARSER
$P_IF3 . . . . . . . . . . . . .  	L NEAR	00E4	PARSER
$P_IF5 . . . . . . . . . . . . .  	L NEAR	0118	PARSER
$P_IF6 . . . . . . . . . . . . .  	L NEAR	0118	PARSER
$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	02F3	PARSER
$P_KEYORSW_FOUND . . . . . . . .  	L NEAR	02ED	PARSER
$P_KEYORSW_LOOP  . . . . . . . .  	L NEAR	02E0	PARSER
$P_KEYORSW_NOT_FOUND . . . . . .  	L NEAR	02EA	PARSER
$P_KEYORSW_PTR . . . . . . . . .  	L WORD	0011	PARSER
$P_KEYWORD . . . . . . . . . . .  	NUMBER	003D	
$P_KEY_CMP . . . . . . . . . . .  	NUMBER	0008	
$P_KEY_MANAGER . . . . . . . . .  	L NEAR	020A	PARSER
$P_KEY_MGR_LOOP  . . . . . . . .  	L NEAR	0229	PARSER
$P_KEY_NOT_FOUND . . . . . . . .  	L NEAR	0237	PARSER
$P_LEN_PARMS . . . . . . . . . .  	NUMBER	0004	
$P_LEN_RANGE . . . . . . . . . .  	NUMBER	0009	
$P_LEN_STRING  . . . . . . . . .  	NUMBER	0003	
$P_LEN_VALUE . . . . . . . . . .  	NUMBER	0005	
$P_LF  . . . . . . . . . . . . .  	NUMBER	000A	
$P_LIST_IDX  . . . . . . . . . .  	NUMBER	0002	
$P_LL6 . . . . . . . . . . . . .  	L NEAR	00FE	PARSER
$P_LOC_EOL . . . . . . . . . . .  	L NEAR	00C8	PARSER
$P_LPAREN  . . . . . . . . . . .  	NUMBER	0028	
$P_MAKE_LOWER  . . . . . . . . .  	NUMBER	0020	
$P_MAKE_UPPER  . . . . . . . . .  	NUMBER	00DF	
$P_MAT . . . . . . . . . . . . .  	L NEAR	03AF	PARSER
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Symbols-5


$P_MATCH03 . . . . . . . . . . .  	L NEAR	03B4	PARSER
$P_MATCH04 . . . . . . . . . . .  	L NEAR	03CB	PARSER
$P_MATCH05 . . . . . . . . . . .  	L NEAR	03E2	PARSER
$P_MATCH09 . . . . . . . . . . .  	L NEAR	03F1	PARSER
$P_MATCH2_EXIT . . . . . . . . .  	L NEAR	0408	PARSER
$P_MATCH_EXIT  . . . . . . . . .  	L NEAR	03F1	PARSER
$P_MBP_EXIT  . . . . . . . . . .  	L NEAR	0300	PARSER
$P_MBP_LOOP  . . . . . . . . . .  	L NEAR	02F6	PARSER
$P_MINUS . . . . . . . . . . . .  	NUMBER	002D	
$P_MOVEBP_NUL  . . . . . . . . .  	N PROC	02F6	PARSER	Length = 000C
$P_NEG . . . . . . . . . . . . .  	NUMBER	0002	
$P_NON_DBCS  . . . . . . . . . .  	L NEAR	0816	PARSER
$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	07A3	PARSER
$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	PARSER
$P_OUT_OF_RANGE  . . . . . . . .  	NUMBER	0006	
$P_PACK_END  . . . . . . . . . .  	L NEAR	0193	PARSER
$P_PACK_END_BACKUP_SI  . . . . .  	L NEAR	016D	PARSER
$P_PACK_END_BY_EOL . . . . . . .  	L NEAR	0192	PARSER
$P_PACK_LOOP . . . . . . . . . .  	L NEAR	0150	PARSER
$P_PERIOD  . . . . . . . . . . .  	NUMBER	002E	
$P_PERIOD_ONLY . . . . . . . . .  	NUMBER	0002	
$P_PL00  . . . . . . . . . . . .  	L NEAR	0185	PARSER
$P_PL01  . . . . . . . . . . . .  	L NEAR	0178	PARSER
$P_PLUS  . . . . . . . . . . . .  	NUMBER	002B	
$P_POSITIONAL_MANAGER  . . . . .  	L NEAR	01B6	PARSER
$P_QUOTED_STRING . . . . . . . .  	NUMBER	0009	
$P_QU_STRING . . . . . . . . . .  	NUMBER	0080	
$P_RC  . . . . . . . . . . . . .  	L WORD	0002	PARSER
$P_RCOL00  . . . . . . . . . . .  	L NEAR	0424	PARSER
$P_RCOL01  . . . . . . . . . . .  	L NEAR	042A	PARSER
$P_RCOL_EXIT . . . . . . . . . .  	L NEAR	042D	PARSER
$P_RCOL_LOOP . . . . . . . . . .  	L NEAR	040C	PARSER
$P_RC_EOL  . . . . . . . . . . .  	NUMBER	-0001	
$P_REG_BH_CG_SW  . . . . . . . .  	ALIAS	 BH		
$P_REG_BL_DQ_SW  . . . . . . . .  	ALIAS	 BL		
$P_REMOVE_COLON  . . . . . . . .  	N PROC	040A	PARSER	Length = 0026
$P_REPEAT  . . . . . . . . . . .  	NUMBER	0002	
$P_RETURN_TO_CALLER  . . . . . .  	L NEAR	023E	PARSER
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Symbols-6


$P_RETURN_TO_CALLER0 . . . . . .  	L NEAR	023E	PARSER
$P_RLT00 . . . . . . . . . . . .  	L NEAR	032D	PARSER
$P_RLT01 . . . . . . . . . . . .  	L NEAR	0337	PARSER
$P_RLT02 . . . . . . . . . . . .  	L NEAR	0323	PARSER
$P_RLT03 . . . . . . . . . . . .  	L NEAR	0349	PARSER
$P_RLT04 . . . . . . . . . . . .  	L NEAR	031F	PARSER
$P_RLT05 . . . . . . . . . . . .  	L NEAR	035C	PARSER
$P_RLT_CAP00 . . . . . . . . . .  	L NEAR	0370	PARSER
$P_RLT_CAP01 . . . . . . . . . .  	L NEAR	037C	PARSER
$P_RLT_CAP02 . . . . . . . . . .  	L NEAR	0379	PARSER
$P_RLT_EXIT  . . . . . . . . . .  	L NEAR	0387	PARSER
$P_RM_COLON  . . . . . . . . . .  	NUMBER	0010	
$P_RPAREN  . . . . . . . . . . .  	NUMBER	0029	
$P_SAVESI_CMPX . . . . . . . . .  	L WORD	000F	PARSER
$P_SAVE_EOB  . . . . . . . . . .  	L WORD	0013	PARSER
$P_SCOM00  . . . . . . . . . . .  	L NEAR	06A8	PARSER
$P_SCOM01  . . . . . . . . . . .  	L NEAR	06BB	PARSER
$P_SCOM02  . . . . . . . . . . .  	L NEAR	06D1	PARSER
$P_SCOM03  . . . . . . . . . . .  	L NEAR	069A	PARSER
$P_SCOM04  . . . . . . . . . . .  	L NEAR	0684	PARSER
$P_SCOM05  . . . . . . . . . . .  	L NEAR	0697	PARSER
$P_SCOM_DIFFER . . . . . . . . .  	L NEAR	06DC	PARSER
$P_SCOM_DIFFER0  . . . . . . . .  	L NEAR	06BD	PARSER
$P_SCOM_EXIT . . . . . . . . . .  	L NEAR	06E5	PARSER
$P_SCOM_LOOP . . . . . . . . . .  	L NEAR	0664	PARSER
$P_SCOM_SAME . . . . . . . . . .  	L NEAR	06DF	PARSER
$P_SEARCH_KEYORSW  . . . . . . .  	N PROC	02D1	PARSER	Length = 0025
$P_SIGNED  . . . . . . . . . . .  	NUMBER	0080	
$P_SIM00 . . . . . . . . . . . .  	L NEAR	0608	PARSER
$P_SIM01 . . . . . . . . . . . .  	L NEAR	064B	PARSER
$P_SIMPLE_S  . . . . . . . . . .  	NUMBER	2000	
$P_SIMPLE_STRING . . . . . . . .  	N PROC	05F5	PARSER	Length = 0069
$P_SIM_EXIT  . . . . . . . . . .  	L NEAR	0654	PARSER
$P_SIM_EXIT0 . . . . . . . . . .  	L NEAR	0656	PARSER
$P_SIM_FOUND . . . . . . . . . .  	L NEAR	0640	PARSER
$P_SIM_LOOP  . . . . . . . . . .  	L NEAR	0626	PARSER
$P_SINGLE_EXIT . . . . . . . . .  	L NEAR	0259	PARSER
$P_SI_SAVE . . . . . . . . . . .  	L WORD	0004	PARSER
$P_SKIP_DELIM  . . . . . . . . .  	N PROC	06EA	PARSER	Length = 0026
$P_SKIP_DELIM_CY . . . . . . . .  	L NEAR	0708	PARSER
$P_SKIP_DELIM_EXIT . . . . . . .  	L NEAR	070C	PARSER
$P_SKIP_DELIM_LOOP . . . . . . .  	L NEAR	06EA	PARSER
$P_SKIP_DELIM_NCY  . . . . . . .  	L NEAR	070B	PARSER
$P_SLASH . . . . . . . . . . . .  	NUMBER	002F	
$P_SNUM_VAL  . . . . . . . . . .  	NUMBER	4000	
$P_SPACE . . . . . . . . . . . .  	NUMBER	0020	
$P_START . . . . . . . . . . . .  	L NEAR	013C	PARSER
$P_STRING  . . . . . . . . . . .  	NUMBER	0003	
$P_STRING_BUF  . . . . . . . . .  	L BYTE	0017	PARSER	Length = 0080
$P_STRING_BUF_END  . . . . . . .  	NEAR	0097	PARSER
$P_STRING_COMP . . . . . . . . .  	N PROC	065E	PARSER	Length = 008C
$P_STRUC_L1  . . . . . . . . . .  	L NEAR	07C4	PARSER
$P_STRUC_L12 . . . . . . . . . .  	L NEAR	07C3	PARSER
$P_STRUC_L2  . . . . . . . . . .  	L NEAR	07B9	PARSER
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
                                                             Symbols-7


$P_STRUC_L5  . . . . . . . . . .  	L NEAR	07B6	PARSER
$P_SVAL00  . . . . . . . . . . .  	L NEAR	04B2	PARSER
$P_SVAL01  . . . . . . . . . . .  	L NEAR	04B3	PARSER
$P_SVALUE  . . . . . . . . . . .  	N PROC	0494	PARSER	Length = 0024
$P_SVAL_IN . . . . . . . . . . .  	L NEAR	056C	PARSER
$P_SW  . . . . . . . . . . . . .  	NUMBER	0040	
$P_SWITCH  . . . . . . . . . . .  	NUMBER	002F	
$P_SW_CMP  . . . . . . . . . . .  	NUMBER	0010	
$P_SW_MANAGER  . . . . . . . . .  	L NEAR	01DE	PARSER
$P_SW_MGR_LOOP . . . . . . . . .  	L NEAR	01F3	PARSER
$P_SW_NOT_FOUND  . . . . . . . .  	L NEAR	0201	PARSER
$P_SYNTAX  . . . . . . . . . . .  	NUMBER	0009	
$P_TAB . . . . . . . . . . . . .  	NUMBER	0009	
$P_TB_EQ . . . . . . . . . . . .  	NUMBER	093D	
$P_TERMINATOR  . . . . . . . . .  	L BYTE	0008	PARSER
$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	01D5	PARSER
$P_VAL02_LOOP  . . . . . . . . .  	L NEAR	0538	PARSER
$P_VAL02_NEXT  . . . . . . . . .  	L NEAR	057C	PARSER
$P_VAL02_SIGN  . . . . . . . . .  	L NEAR	055E	PARSER
$P_VAL03_LOOP  . . . . . . . . .  	L NEAR	05A2	PARSER
$P_VAL03_NEXT  . . . . . . . . .  	L NEAR	05AE	PARSER
$P_VALUE . . . . . . . . . . . .  	N PROC	04B8	PARSER	Length = 011D
$P_VALUE00 . . . . . . . . . . .  	L NEAR	050A	PARSER
$P_VALUE01 . . . . . . . . . . .  	L NEAR	051D	PARSER
$P_VALUE02 . . . . . . . . . . .  	L NEAR	052F	PARSER
$P_VALUE03 . . . . . . . . . . .  	L NEAR	0597	PARSER
$P_VALUE04 . . . . . . . . . . .  	L NEAR	05C2	PARSER
$P_VALUE_ERR . . . . . . . . . .  	L NEAR	05C2	PARSER
$P_VALUE_ERR0  . . . . . . . . .  	L NEAR	0506	PARSER
$P_VALUE_EXIT  . . . . . . . . .  	L NEAR	05CD	PARSER
$P_VALUE_LOOP  . . . . . . . . .  	L NEAR	04C1	PARSER
$P_VAL_FOUND . . . . . . . . . .  	L NEAR	0590	PARSER
$P_VAL_IN  . . . . . . . . . . .  	L NEAR	054E	PARSER
@CPU . . . . . . . . . . . . . .  	TEXT  0101h		
@FILENAME  . . . . . . . . . . .  	TEXT  mparse		
@VERSION . . . . . . . . . . . .  	TEXT  510		

Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33

                                                             Symbols-8






   3516 Source  Lines
   3516 Total   Lines
    338 Symbols

  46320 + 193579 Bytes symbol space free

      0 Warning Errors
      0 Severe  Errors
