Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-1


					PAGE 64,132 ;
				;	SCCSID = @(#)driver.asm 4.13 85/10/15
				;	SCCSID = @(#)driver.asm 4.13 85/10/15
				;
				; External block device driver
				; Hooks into existing routines in IBMBIO block driver via Int 2F mpx # 8.
				; This technique minimizes the size of the driver.
				;
				
				; Revised Try_h: to test for flagheads  as msg was being displayed on FormFactor
				;  this caused the FormFactor to be set in the Head
				; Revised the # of sectors/cluster for F0h to 1
				;==============================================================================
				;REVISION HISTORY:
				;AN000 - New for DOS Version 4.00 - J.K.
				;AC000 - Changed for DOS Version 4.00 - J.K.
				;AN00x - PTM number for DOS Version 4.00 - J.K.
				;==============================================================================
				;AN001 - d55 Unable the fixed disk accessibility of DRIVER.SYS.     7/7/87 J.K.
				;AN002 - p196 Driver.sys does not signal init. failure		    8/17/87 J.K.
				;AN003 - p267 "No driver letter..." message                         8/19/87 J.K.
				;AN004 - p268 "Too many parameter..." message                       8/20/87 J.K.
				;AN005 - p300 "Bad 1.44MB BPB information..."                       8/20/87 J.K.
				;AN006 - p490 Driver should reject identical parms		    8/28/87 J.K.
				;AN007 - p921 Parser.ASM problem				    9/18/87 J.K.
				;AN008 - d493 New init request structure			    2/25/88 J.K.
				;==============================================================================
				
 0000				code segment word public
				assume cs:code,ds:code,es:code
				
				;AN000;
				.list
				MSG_UTILNAME <DRIVER>
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-2
DOS - Message Retriever - MSGSTR.INC Module                 

			     C1	$M_SUBLIST_STRUC STRUC					     ;;AN000;;
			     C1								     ;;
 0000  0B                    C1	    $M_S_SIZE	     DB        11			     ;;AN000;; SUBLIST size  (PTR to next SU
				BLIST)
 0001  00                    C1	    $M_S_RESV	     DB        0			     ;;AN000;; RESERVED
 0002  00000000              C1	    $M_S_VALUE	     DD        ?			     ;;AN000;; Time, Date or PTR to data ite
				m
 0006  00                    C1	    $M_S_ID	     DB        ?			     ;;AN000;; n of %n
 0007  00                    C1	    $M_S_FLAG	     DB        ?			     ;;AN000;; Data-type flags
 0008  00                    C1	    $M_S_MAXW	     DB        ?			     ;;AN000;; Maximum field width
 0009  00                    C1	    $M_S_MINW	     DB        ?			     ;;AN000;; Minimum field width
 000A  00                    C1	    $M_S_PAD	     DB        ?			     ;;AN000;; Character for Pad field
			     C1								     ;;
 000B                        C1	$M_SUBLIST_STRUC ENDS					     ;;AN000;;
			     C1	$M_CLASS_ID STRUC					     ;;AN000;;
			     C1								     ;;
 0000  FF                    C1	    $M_CLS_ID	     DB        -1			     ;;AN000;; Class identifer
 0001  0004                  C1	    $M_COMMAND_VER   DW        EXPECTED_VERSION 	     ;;AN003;; COMMAND.COM version check
 0003  00                    C1	    $M_NUM_CLS_MSG   DB        0			     ;;AN000;; Total number of message in cl
				ass
			     C1								     ;;
 0004                        C1	$M_CLASS_ID ENDS					     ;;
			     C1	$M_ID STRUC						     ;;AN000;;
			     C1								     ;;
 0000  FFFF                  C1	    $M_NUM	     DW        -1			     ;;AN000;; Message Number
 0002  0000                  C1	    $M_TXT_PTR	     DW        ?			     ;;AN000;; Pointer to message text
			     C1								     ;;
 0004                        C1	$M_ID ENDS						     ;;AN000;;
			     C1	$M_RES_ADDRS STRUC					     ;;AN000;;
			     C1								     ;;
 0000  00000000              C1	    $M_EXT_ERR_ADDRS DD        0			     ;;AN000;; Allow pointers to THREE Exten
				ded error locations
 0004  00000000              C1	    $M_EXT_FILE      DD        0			     ;;AN001;;
 0008  00000000              C1	    $M_EXT_COMMAND   DD        0			     ;;AN000;;
 000C  FFFFFFFF              C1	    $M_EXT_TERM      DD        -1			     ;;AN000;;
 0010  00000000              C1	    $M_PARSE_COMMAND DD        0			     ;;AN000;;
 0014  00000000              C1	    $M_PARSE_ADDRS   DD        0			     ;;AN000;; Allow pointers to TWO Parse e
				rror locations
 0018  FFFFFFFF              C1	    $M_PARSE_TERM    DD        -1			     ;;AN000;;
 001C  00000000              C1	    $M_CRIT_ADDRS    DD        0			     ;;AN000;; Allow pointers to TWO Critica
				l error locations
 0020  00000000              C1	    $M_CRIT_COMMAND  DD        0			     ;;AN000;;
 0024  FFFFFFFF              C1	    $M_CRIT_TERM     DD        -1			     ;;AN000;;
 0028  FFFFFFFF              C1	    $M_DISK_PROC_ADDR DD       -1			     ;;AN004;; Address of READ_DISK_PROC
 002C  0001[                 C1	    $M_CLASS_ADDRS   DD        $M_NUM_CLS DUP(0)	     ;;AN000;; Allow pointers to specified c
				lasses
	   00000000          C1	
			 ]   C1	
			     C1	
 0030  FFFFFFFF              C1	    $M_CLS_TERM      DD        -1			     ;;AN000;;
 0034  00000000              C1	    $M_DBCS_VEC      DD        0			     ;;AN000;; Save DBCS vector
 0038  0000                  C1	    $M_HANDLE	     DW        ?			     ;;AN000;;
 003A  00                    C1	    $M_SIZE	     DB        0			     ;;AN000;;
 003B  0D 0A                 C1	    $M_CRLF	     DB        0DH,0AH			     ;;AN004;; CR LF message
 003D  00                    C1	    $M_CLASS	     DB        ?			     ;;AN004;; Saved class
 003E  0000                  C1	    $M_RETURN_ADDR   DW        ?			     ;;AN000;;
 0040  0000                  C1	    $M_MSG_NUM	     DW        $M_NULL			     ;;AN000;;
 0042  000A                  C1	    $M_DIVISOR	     DW        10			     ;;AN000;; Default = 10 (must be a WORD 
				for division)
 0044  0040[                 C1	    $M_TEMP_BUF      DB        $M_TEMP_BUF_SZ DUP("$")	     ;;AN000;; Temporary buffer
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-3
DOS - Message Retriever - MSGSTR.INC Module                 

	   24                C1	
			 ]   C1	
			     C1	
 0084  24                    C1	    $M_BUF_TERM      DB        "$"			     ;;AN000;;
			     C1	
 0085                        C1	$M_RES_ADDRS ENDS					     ;;AN000;;
			     C1	$M_COUNTRY_INFO STRUC					     ;;AN000;; Expected Country infomation
			     C1								     ;;
 0000  0044[                 C1	    $M_HEADER	     DB       $M_RES_ADDRS_SZ-$M_TEMP_BUF_SZ-1 DUP(?) ;;AN000;; Go past first part o
				f struc
	   ??                C1	
			 ]   C1	
			     C1	
 0044  0000                  C1	    $M_DATE_FORMAT   DW       ? 			     ;;AN000;; <------- Date Format
 0046  0005[                 C1	    $M_CURR_SEPARA   DB       5 DUP(?)			     ;;AN000;;
	   ??                C1	
			 ]   C1	
			     C1	
 004B  00 00                 C1	    $M_THOU_SEPARA   DB       ?,0			     ;;AN000;; <------- Thou Separator
 004D  00 00                 C1	    $M_DECI_SEPARA   DB       ?,0			     ;;AN000;; <------- Decimal Separator
 004F  00 00                 C1	    $M_DATE_SEPARA   DB       ?,0			     ;;AN000;; <------- Date Separator
 0051  00 00                 C1	    $M_TIME_SEPARA   DB       ?,0			     ;;AN000;; <------- Time Separator
 0053  00                    C1	    $M_CURR_FORMAT   DB       ? 			     ;;AN000;;
 0054  00                    C1	    $M_SIG_DIGS_CU   DB       ? 			     ;;AN000;;
 0055  00                    C1	    $M_TIME_FORMAT   DB       ? 			     ;;AN000;; <------- Time Format
			     C1								     ;;
 0056                        C1	$M_COUNTRY_INFO ENDS					     ;;AN000;;
				
 = 0000				iTEST = 0
				;---------------------------------------------------
				;
				;	Device entry point
				;
 0000				DSKDEV	LABEL	WORD
 0000  FFFF FFFF			DW	-1,-1			; link to next device
 0004  0840				DW	0000100001000000B	; bit 6 indicates DOS 3.20 driver
 0006  000F R				DW	STRATEGY
 0008  001A R				DW	DSK$IN
 000A  01			DRVMAX	DB	1
				
				;
				; Various equates
				;
 = 0000				CMDLEN	equ	0			;LENGTH OF THIS COMMAND
 = 0001				UNIT	equ	1			;SUB UNIT SPECIFIER
 = 0002				CMD	equ	2			;COMMAND CODE
 = 0003				STATUS	equ	3			;STATUS
 = 000D				MEDIA	equ	13			;MEDIA DESCRIPTOR
 = 000E				TRANS	equ	14			;TRANSFER ADDRESS
 = 0012				COUNT	equ	18			;COUNT OF BLOCKS OR CHARACTERS
 = 0014				START	equ	20			;FIRST BLOCK TO TRANSFER
 = 0016				EXTRA	equ	22			;Usually a pointer to Vol Id for error 15
 = 0017				CONFIG_ERRMSG  equ     23		;AN009; To set this field to Non-zero
									;	to display "Error in CONFIG.SYS..."
				
 000B  00000000			PTRSAV	DD	0
				
				
 000F				STRATP PROC FAR
				
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-4
DOS - Message Retriever - MSGSTR.INC Module                 

 000F				STRATEGY:
 000F  2E: 89 1E 000B R			MOV	WORD PTR CS:[PTRSAV],BX
 0014  2E: 8C 06 000D R			MOV	WORD PTR CS:[PTRSAV+2],ES
 0019  CB				RET
				
 001A				STRATP ENDP
				
 001A				DSK$IN:
 001A  06				push	es
 001B  53				push	bx
 001C  50				push	ax
 001D  2E: C4 1E 000B R			les	bx,cs:[ptrsav]
 0022  26: 80 7F 02 00			cmp	byte ptr es:[bx].cmd,0
 0027  75 03				jnz	Not_Init
 0029  E9 11B8 R			jmp	DSK$INIT
				
 002C				not_init:
				; Because we are passing the call onto the block driver in IBMBIO, we need to
				; ensure that the unit number corresponds to the logical (DOS) unit number, as
				; opposed to the one that is relevant to this device driver.
 002C  2E: A0 00A8 R			mov	al,byte ptr cs:[DOS_Drive_Letter]
 0030  26: 88 47 01			mov	byte ptr es:[bx].UNIT,al
 0034  B8 0802				mov	ax,0802H
 0037  CD 2F				int	2fH
				;
				; We need to preserve the flags that are returned by IBMBIO. YUK!!!!!
				;
 0039  9C				pushf
 003A  5B				pop	bx
 003B  83 C4 02				add	sp,2
 003E  53				push	bx
 003F  9D				popf
				
 0040				exitp	proc	far
 0040				DOS_Exit:
 0040  58				pop	ax
 0041  5B				POP	BX
 0042  07				POP	ES
 0043  CB				RET				;RESTORE REGS AND RETURN
 0044				EXITP	ENDP
				
				include msbds.inc			; include BDS structures
			     C	
			     C	%OUT MSBDS.INC...
			     C	;	SCCSID = @(#)IBMBDS.ASM 1.9 85/09/16
			     C	;==============================================================================
			     C	;REVISION HISTORY:
			     C	;AN000 - New for DOS Version 4.00 - J.K.
			     C	;AC000 - Changed for DOS Version 4.00 - J.K.
			     C	;AN00x - PTM number for DOS Version 4.00 - J.K.
			     C	;==============================================================================
			     C	;AN001; D113 Disable I/O access to unformatted media		    9/03/87 J.K.
			     C	;==============================================================================
			     C	
			     C	; VALUES FOR VARIOUS FLAGS IN BDS.FLAGS.
			     C	
 = 0001                      C	FNON_REMOVABLE	    EQU     01H 	;FOR NON-REMOVABLE MEDIA
 = 0002                      C	FCHANGELINE	    EQU     02H 	;IF CHANGELINE SUPPORTED ON DRIVE
 = 0004                      C	RETURN_FAKE_BPB     EQU     04H 	; WHEN SET, DON'T DO A BUILD BPB
			     C						; JUST RETURN THE FAKE ONE
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-5
DOS - Message Retriever - MSGSTR.INC Module                 

 = 0008                      C	GOOD_TRACKLAYOUT    EQU     08H 	; THE TRACK LAYOUT HAS NO FUNNY SECTORS
			     C	; FCHANGED_BY_FORMAT  EQU	    08H
 = 0010                      C	FI_AM_MULT	    EQU     10H 	;IF MORE THAN ONE LOGICAL FOR THIS PHYSICAL
 = 0020                      C	FI_OWN_PHYSICAL     EQU     20H 	;SIGNIFY LOGICAL OWNER OF THIS PHYSICAL
 = 0040                      C	FCHANGED	    EQU     40H 	;INDICATES MEDIA CHANGED
 = 0080                      C	SET_DASD_TRUE	    EQU     80H 	; SET DASD BEFORE NEXT FORMAT
 = 0100                      C	FCHANGED_BY_FORMAT  EQU    100H 	;MEDIA CHANGED BY FORMAT
 = 0200                      C	UNFORMATTED_MEDIA   EQU    200H 	;AN001; Fixed disk only
 = 0400                      C	F_LBA		equ	400h		; LBA supported
			     C	
			     C	LBAPACKETSTRUC struc
 0000  0000                  C	lpSize		dw ?
 0002  0000                  C	lpCount		dw ?
 0004  00000000              C	lpBuffer	dd ?
 0008  00000000 00000000     C	lpSector	dd ?,?
 0010                        C	LBAPACKETSTRUC ends
			     C	
			     C	;
			     C	; VARIOUS FORM FACTORS TO DESCRIBE MEDIA
			     C	;
 = 0000                      C	FF48TPI 	    EQU     0
 = 0001                      C	FF96TPI 	    EQU     1
 = 0002                      C	FFSMALL 	    EQU     2
 = 0005                      C	FFHARDFILE	    EQU     5
 = 0007                      C	FFOTHER 	    EQU     7
			     C	
			     C	BDS_TYPE	STRUC
 0000  00000000              C	LINK		DD		?	; LINK TO NEXT BDS
 0004  00                    C	DRIVENUM	DB		?	; INT 13 DRIVE NUMBER
 0005  00                    C	DRIVELET	DB		?	; DOS DRIVE NUMBER
 0006  0000                  C	BYTEPERSEC	DW		?	; NUMBER OF BYTES/SEC
 0008  00                    C	SECPERCLUS	DB		?	; SEC PER ALLOCATION UNIT
 0009  0000                  C	RESSEC		DW		?	; NUMBER OF RESERVED SECTORS
 000B  00                    C	CFAT		DB		?	; NUMBER OF FATS
 000C  0000                  C	CDIR		DW		?	; NUMBER OF DIRECTORY ENTRIES
 000E  0000                  C	DRVLIM		DW		?	; NUMBER OF SECTORS ON MEDIUM
 0010  00                    C	MEDIAD		DB		?	; MEDIA DESCRIPTOR BYTE
 0011  0000                  C	CSECFAT 	DW		?	; NUMBER OF SECTORS/FAT
 0013  0000                  C	SECLIM		DW		?	; SECTORS PER TRACK
 0015  0000                  C	HDLIM		DW		?	; MAX NUMBER OF HEADS
 0017  0000                  C	HIDSEC_L	DW		?	; NUMBER OF HIDDEN SECTORS
 0019  0000                  C	HIDSEC_H	dw		0	;J.K.87
 001B  0000                  C	DRVLIM_L	dw		0	;J.K.87
 001D  0000                  C	DRVLIM_H	dw		0	;J.K.87
 001F  00                    C	FATSIZ		DB		?	; FLAGS...
 0020  0000                  C	OPCNT		DW		?	; OPEN REF. COUNT
 0022  00                    C	FORMFACTOR	DB		?	; FORM FACTOR INDEX
 0023  0000                  C	FLAGS		DW		?	; VARIOUS FLAGS
 0025  0000                  C	CCYLN		DW		?	; MAX NUMBER OF CYLINDERS
 0027  0000                  C	RBYTEPERSEC	DW		?	; RECOMMENDED BPB
 0029  00                    C	RSECPERCLUS	DB		?
 002A  0000                  C	RRESSEC 	DW		?
 002C  00                    C	RCFAT		DB		?
 002D  0000                  C	RCDIR		DW		?
 002F  0000                  C	RDRVLIM 	DW		?
 0031  00                    C	RMEDIAD 	DB		?
 0032  0000                  C	RCSECFAT	DW		?
 0034  0000                  C	RSECLIM 	DW		?
 0036  0000                  C	RHDLIM		DW		?
 0038  0000                  C	RHIDSEC_L	DW		?
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-6
DOS - Message Retriever - MSGSTR.INC Module                 

 003A  0000                  C	RHIDSEC_H	DW		0	;J.K.87
 003C  0000                  C	RDRVLIM_L	dw		0	;J.K.87
 003E  0000                  C	RDRVLIM_H	dw		0	;J.K.87
 0040  0006[                 C	RESERVE 	DB		6 DUP (?)	; RESERVED FOR FUTURE
	   ??                C	
			 ]   C	
			     C	
 0046  00                    C	TRACK		DB		?	; LAST TRACK ACCESSED ON DRIVE
 0047  0000                  C	TIM_LO		DW		?	; TIME OF LAST ACCESS. KEEP
 0049  0000                  C	TIM_HI		DW		?	; THESE CONTIGUOUS.
 004B  000C[                 C	VOLID		DB		12 DUP (?)	; VOLUME ID OF MEDIUM
	   ??                C	
			 ]   C	
			     C	
 0057  00000000              C	VOL_SERIAL	dd	0	  ;J.K.87 Current volume serial number from Boot record
 005B  0009[                 C	FILESYS_Id	db	9 dup (0) ;J.K.87 Current file system id from Boot record
	   00                C	
			 ]   C	
			     C	
 0064                        C	BDS_TYPE	ENDS
			     C	
 = 001F                      C	BPBSIZE     =	TRACK - RBYTEPERSEC ; SIZE IN BYTES OF RECBPB AREA IN THE BDS
			     C	
			     C	
			     C	;*********************************************************************
			     C	;	BDS structure for mini disk - J.K. 4/7/86
			     C	;*********************************************************************
			     C	
			     C	BDSM_type	struc
 0000  FFFF                  C	mlink		DW	-1			;Link to next structure
 0002  0000                  C			DW	?
 0004  50                    C	mdriveNum	DB	80			;Int 13 Drive Number
 0005  03                    C	mdriveLet	DB	3			;Logical Drive Number
 0006  0200                  C	mBytePerSec	DW	512
 0008  01                    C	mSecPerClus	DB	1			;Sectors/allocation unit
 0009  0001                  C	mRESSEC 	DW	1			;Reserved sectors for DOS
 000B  02                    C	mcFAT		DB	2			;No. of allocation tables
 000C  0010                  C	mcDIR		DW	16			;Number of directory entries
 000E  0000                  C	mDRVLIM 	DW	0			;Number of sectors (at 512 bytes each)
 0010  F8                    C	mMediad 	DB	11111000B		;Media descriptor
 0011  0001                  C	mcSecFat	DW	1			;Number of FAT sectors
 0013  0000                  C	mSECLIM 	DW	0			;Sector limit
 0015  0000                  C	mHDLIM		DW	0			;Head limit
 0017  0000                  C	mHIDSEC_L	DW	0			;Hidden sector count
 0019  0000                  C	mHidsec_H	dw	0			;J.K.87
 001B  0000                  C	mDrvlim_L	dw	0			;J.K.87
 001D  0000                  C	mDrvlim_H	dw	0			;J.K.87
 001F  00                    C	mFatSiz 	DB	0			;TRUE => bigfat
 0020  0000                  C	mOPCNT		DW	0			;Open Ref. Count
 0022  03                    C	mFormFactor	DB	3			;Form Factor
 0023  0020                  C	mFLAGS		DW	0020H			;Various Flags
 0025  0028                  C	mcCyln		dw	40			;max number of cylinders
 0027  001F[                 C	mRecBPB 	db	31 dup (0)		;Recommended BPB for drive
	   00                C	
			 ]   C	
			     C	
 0046  FF                    C	mTrack		db	-1
 0047  0001                  C	IsMini		dw	1			;Overlapping TIM_LOH
 0049  0000                  C	Hidden_Trks	dw	0			;Overlapping TIM_HIH
 004B  4E 4F 20 4E 41 4D     C	mVOLID		DB	"NO NAME    "           ;Volume ID for this disk
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-7
DOS - Message Retriever - MSGSTR.INC Module                 

       45 20 20 20 20        C	
 0056  00                    C			DB	0			;ASCIZII for "NO NAME    "
 0057  00000000              C	mVol_Serial	dd	0	   ;Current volume serial number from Boot record
 005B  46 41 54 31 32 20     C	mFileSys_Id	db	"FAT12   " ;Current file system id from Boot record
       20 20                 C	
 0063  00                    C			db	0
			     C	
 0064                        C	BDSM_type	ENDS
			     C	;******************************************************************************
 = 0017                      C	Max_mini_dsk_num = 23	      ;J.K. 4/7/86 - max # of mini disk ibmbio can support
			     C	;
			     C	
				;include versiona.inc
				
 0044  FFFF			BDS	DW	-1			;Link to next structure
 0046  FFFF				DW	-1
 0048  01				DB	1			;Int 13 Drive Number
 0049  03				DB	3			;Logical Drive Letter
 004A				FDRIVE:
 004A  0200				DW	512			;Physical sector size in bytes
 004C  FF				DB	-1			;Sectors/allocation unit
 004D  0001				DW	1			;Reserved sectors for DOS
 004F  02				DB	2			;No. allocation tables
 0050  0040				DW	64			;Number directory entries
 0052  0168				DW	9*40			;Number sectors (at 512 bytes ea.)
 0054  00				DB	00000000B		;Media descriptor, initially 00H.
 0055  0002				DW	2			;Number of FAT sectors
 0057  0009				DW	9			;Sector limit
 0059  0001				DW	1			;Head limit
 005B  0000				DW	0			;Hidden sector count
 005D  0000				dw	0			;AN000; Hidden sector count (High)
 005F  0000				dw	0			;AN000; Number sectors (low)
 0061  0000				dw	0			;AN000; Number sectors (high)
 0063  00				DB	0			; TRUE => Large fats
 0064  0000			OPCNT1	DW	0			;Open Ref. Count
 0066  02				DB	2			;Form factor
 0067  0020			FLAGS1	DW	0020H			;Various flags
 0069  0050				DW	80			;Number of cylinders in device
 006B  0200			RecBPB1 DW	512			; default is that of 3.5" disk
 006D  02				DB	2
 006E  0001				DW	1
 0070  02				DB	2
 0071  0070				DW	70h
 0073  05A0				DW	2*9*80
 0075  F9				DB	0F9H
 0076  0003				DW	3
 0078  0009				DW	9
 007A  0002				DW	2
 007C  0000				DW	0
 007E  0000				dw	0			;AN000;
 0080  0000				dw	0			;AN000;
 0082  0000				dw	0			;AN000;
 0084  0006[				db	6 dup (0)		;AC000;
	   00			
			 ]	
				
 008A  FF			TRACK1	DB	-1			;Last track accessed on this drive
 008B  FFFF			TIM_LO1 DW	-1			;Keep these two contiguous (?)
 008D  FFFF			TIM_HI1 DW	-1
 008F  4E 4F 20 4E 41 4D	VOLID1	DB	"NO NAME    ",0         ;Volume ID for this disk
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-8
DOS - Message Retriever - MSGSTR.INC Module                 

       45 20 20 20 20 00	
 009B  00000000			VOLSER	dd	0			;AN000;
 009F  46 41 54 31 32 20	FILE_ID db	"FAT12   ",0            ;AN000;
       20 20 00			
				
 00A8  00			DOS_Drive_Letter	db	?	; Logical drive associated with this unit
				
 00A9				ENDCODE LABEL WORD			; Everything below this is thrown away
									; after initialisation.
				
 00A9  004A R			DskDrv	    dw	    offset FDRIVE	; "array" of BPBs
				
				;AN000; For system parser;
				
 = 0000				FarSW	equ	0	; Near call expected
				
 = 0000				DateSW	equ	0	; Check date format
				
 = 0000				TimeSW	equ	0	; Check time format
				
 = 0000				FileSW	equ	0	; Check file specification
				
 = 0000				CAPSW	equ	0	; Perform CAPS if specified
				
 = 0000				CmpxSW	equ	0	; Check complex list
				
 = 0001				NumSW	equ	1	; Check numeric value
				
 = 0000				KeySW	equ	0	; Support keywords
				
 = 0001				SwSW	equ	1	; Support switches
				
 = 0001				Val1SW	equ	1	; Support value definition 1
				
 = 0001				Val2SW	equ	1	; Support value definition 2
				
 = 0000				Val3SW	equ	0	; Support value definition 3
				
 = 0000				DrvSW	equ	0	; Support drive only format
				
 = 0000				QusSW	equ	0	; Support quoted string format
				;---------------------------------------------------
				;.xlist
				assume ds:nothing				;AN007;!!!Parse.ASM sometimes assumes DS
										;      to access its own variable!!!
					include PARSE.ASM			;together with PSDATA.INC
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-9
DOS - Message Retriever - MSGSTR.INC Module                 

			     C		PAGE				;AN000;
			     C	;  $SALUT (4,4,8,41)
			     C	;(deleted).XLIST
			     C	;(deleted)INCLUDE   STRUC.INC ;AN020;structured macro definitions for .IF,.ELSE etc.
			     C	;(deleted).LIST
			     C	;
			     C	; NOTE:   basesw must be set properly to allow the PARSER to access psdata.
			     C	;	   - basesw undefined	 means	 CS seg. override for psdata access.
			     C	;	   - basesw = 1 	 means	 DS seg. override for psdata access &
			     C	;					 DS must point to psdata.
			     C	;	   - basesw = 0 	 means	 ES seg. override for psdata access &
			     C	;					 ES must point to psdata.
			     C	;
			     C	;
			     C	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
			     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;
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-10
DOS - Message Retriever - MSGSTR.INC Module                 

 = 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 ;AN000; make upper case character
			     C	
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-11
DOS - Message Retriever - MSGSTR.INC Module                 

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

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

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

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

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

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

 = 0002                      C	$P_List_Idx	   equ	2		;AN000; List Index
 = 0003                      C	$P_String	   equ	3		;AN000; String
 = 0004                      C	$P_Complex	   equ	4		;AN000; Complex
 = 0005                      C	$P_File_Spec	   equ	5		;AN000; File Spec
 = 0006                      C	$P_Drive	   equ	6		;AN000; Drive
 = 0007                      C	$P_Date_F	   equ	7		;AN000; Date
 = 0008                      C	$P_Time_F	   equ	8		;AN000; Time
 = 0009                      C	$P_Quoted_String   equ	9		;AN000; Quoted String
			     C	
 = 00FF                      C	$P_No_Tag	   equ	0FFH		;AN000; No ITEM_TAG found
			     C	;**** Return code
			     C	;
			     C	; following return code will be returned in the AX register.
			     C	
 = 0000                      C	$P_No_Error	   equ	0		;AN000; No error
 = 0001                      C	$P_Too_Many	   equ	1		;AN000; Too many operands
 = 0002                      C	$P_Op_Missing	   equ	2		;AN000; Required operand missing
 = 0003                      C	$P_Not_In_SW	   equ	3		;AN000; Not in switch list provided
 = 0004                      C	$P_Not_In_Key	   equ	4		;AN000; Not in keyword list provided
 = 0006                      C	$P_Out_Of_Range    equ	6		;AN000; Out of range specified
 = 0007                      C	$P_Not_In_Val	   equ	7		;AN000; Not in value list provided
 = 0008                      C	$P_Not_In_Str	   equ	8		;AN000; Not in string list provided
 = 0009                      C	$P_Syntax	   equ	9		;AN000; Syntax error
 =-0001                      C	$P_RC_EOL	   equ	-1		;AN000; End of command line
			     C	
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-18
DOS - Message Retriever - MSGSTR.INC Module                 

			     C			   PAGE 		;AN000;
			     C	;********************** Local Data *************************************
 00AB  0000                  C	$P_ORDINAL	   dw	0		;AN000; Operand ordinal save area
 00AD  0000                  C	$P_RC		   dw	0		;AN000; Return code from parser
 00AF  0000                  C	$P_SI_Save	   dw	0		;AN000; Pointer of command buffer
 00B1  0000                  C	$P_DX		   dw	0		;AN000; Return result buffer address
 00B3  00                    C	$P_Terminator	   db	0		;AN000; Terminator code (ASCII)
 00B4  0000                  C	$P_DBCSEV_OFF	   dw	0		;AN000; Offset of DBCS EV
 00B6  0000                  C	$P_DBCSEV_SEG	   dw	0		;AN000; Segment of DBCS EV
 00B8  0000                  C	$P_Flags	   dw	0		;AN000; Parser internal flags
 = 00B8                      C	$P_Flags1	   equ	byte ptr $P_Flags ;AN038; to reference first byte flags
 = 00B9                      C	$P_Flags2	   equ	byte ptr $P_Flags+1 ;AN038; to reference second byte flags only
			     C	
			     C	;in second byte of $P_Flags, referenced as $P_Flags2:
 = 0001                      C	$P_equ		   equ	01h	      ;AN000; "=" packed in string buffet
 = 0002                      C	$P_Neg		   equ	02h	      ;AN000; Negative value
 = 0004                      C	$P_Time12	   equ	04h	      ;AN000; set when PM is specified
 = 0008                      C	$P_Key_Cmp	   equ	08h	      ;AN000; set when keyword compare
 = 0010                      C	$P_SW_Cmp	   equ	10h	      ;AN000; set when switch compare
 = 0020                      C	$P_Extra	   equ	20h	      ;AN000; set when extra delimiter found
 = 0040                      C	$P_SW		   equ	40h	      ;AN000; set when switch found (tm08)
 = 0080                      C	$P_Signed	   equ	80h	      ;AN000; signed numeric specified
			     C	
			     C	;in first byte of $P_Flags, referenced as $P_Flags1:
 = 0001                      C	$P_time12am	   equ	01h	      ;AN038; set when AM is specified on time
 = 0002                      C	$P_TIME_AGAIN	   EQU	02H	      ;AN039; SET WHEN READY TO RE-PARSE TIME
			     C	
 00BA  0000                  C	$P_SaveSI_Cmpx	   dw	0		;AN000; save si for later use by complex
 00BC  0000                  C	$P_KEYorSW_Ptr	   dw	0		;AN000; points next to "=" or ":" code
 00BE  0000                  C	$P_Save_EOB	   dw	0		;AN000; save pointer to EOB
 00C0  0000                  C	$P_Found_SYNONYM   dw	0		;AN000; es:@ points to found synonym
			     C	
 00C2  0080[                 C	$P_STRING_BUF	   db	128 dup(0)	;AN000; Pick a operand from command line
	   00                C	
			 ]   C	
			     C	
 = 0142                      C	$P_STRING_BUF_END  equ	$		;AN000;
 0142  FF                    C	$P_Char_CAP_Ptr    db	0ffh		;AN000; info id
 0143  0000                  C			   dw	0		;AN000; offset	of char case map table
 0145  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+CmpxSW	   ; (tm05) ;AN000;(Check if quoted string i
				s supported)
			     C	;(deleted ;AN025;) $P_SorD_Quote      db   0		   ;AN000; keep double or single quote
			     C	;(deleted ;AN025;) ENDIF				   ;AN000;(of QueSW)
			     C	
			     C	; delimiter parsing
 = 0001                      C	$P_colon_period    equ	01		;AN032; check for colon & period
 = 0002                      C	$P_period_only	   equ	02		;AN032; check only for period
			     C	
			     C	;filespec error flag
 0147  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                  8/26/25 23:16:30
                                                             Page     1-19
DOS - Message Retriever - MSGSTR.INC Module                 

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

			     C	;					  (tm14)
			     C	;  7/12/87 : Too_Many_Operands sets DX=0 as the PARSE result
			     C	;					  (tm15)
			     C	;  7/24/87 : Negative lower bound on numeric ranges cause trouble
			     C	
			     C	;  7/24/87 : Quoted strings being returned with quotes.
			     C	
			     C	;  7/28/87 : Kerry S (;AN018;)
			     C	;	     Non optional value on switch (match flags<>0 and <>1) not flagged
			     C	;	     as an error when missing.	Solution: return error 2.  Modules
			     C	;	     affected: $P_Chk_SW_Control.
			     C	
			     C	;  7/29/87 : Kerry S (;AN019;)
			     C	;	     Now allow the optional bit in match flags for switches.  This
			     C	;	     allows the switch to be encountered with a value or without a
			     C	;	     value and no error is returned.
			     C	;
			     C	
			     C	;  8/28/87 : Ed K, Kerry S (;AN020;)
			     C	;  9/14/87   In PROC $P_Get_DecNum, when checking for field separators
			     C	;	     within a date response, instead of checking just for the one
			     C	;	     character defined by the COUNTRY DEPENDENT INFO, check for
			     C	;	     all three chars, "-", "/", and ".". Change $P_Chk_Switch to allow
			     C	;	     slashes in date strings when DateSw (assembler switch) is set.
			     C	
			     C	;  9/1/87  : Kerry S (;AN021)
			     C	;	     In PROC $P_String_Comp, when comparing the switch or keyword on
			     C	;	     the command line with the string in the control block the
			     C	;	     comparing was stopping at a colon (switch) or equal (keyword)
			     C	;	     on the command line and assuming a match.	This allowed a shorter
			     C	;	     string on the command line than in the synonym list in the control
			     C	;	     block.  I put in a test for a null in the control block so the
			     C	;	     string in the control block must be the same length as the string
			     C	;	     preceeding the colon or equal on the command line.
			     C	
			     C	;  8/28/87 : Kerry S (;AN022;)
			     C	;	     All references to data in PSDATA.INC had CS overrides.  This caused
			     C	;	     problems for people who included it themselves in a segment other
			     C	;	     than CS.  Added switch to allow including PSDATA.INC in any
			     C	;	     segment.
			     C	
			     C	;  9/16/87 : Ed K (;AN023;) PTM1040
			     C	;	     in $p_set_cdi PROC, it assumes CS points to psdata. Change Push CS
			     C	;	     into PUSH PSDATA_SEG.  In $P_Get_DecNum PROC, fix AN020
			     C	;	     forced both TIME and DATE to use the delims, "-","/",".".
			     C	;	     Created FLag, in $P_time_Format PROC, to request the delim in
			     C	;	     BL be used if TIME is being parsed.
			     C	
			     C	;  9/24/87 : Ed K
			     C	;	     Removed the include to STRUC.INC.	Replaced the STRUC macro
			     C	;	     invocations with their normally expanded code; made comments
			     C	;	     out of the STRUC macro invocation statements to maintain readability.
			     C	
			     C	;  9/24/87 : Ed K (;AN024;) PTM1222
			     C	;	     When no CONTROL for a keyword found, tried to fill in RESULT
			     C	;	     pointed to by non-existant CONTROL.
			     C	
			     C	; 10/15/87 : Ed K (;AN025;) PTM1672
			     C	;	     A quoted text string can be framed only by double quote.  Remove
			     C	;	     support to frame quoted text string with single quote.
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-21
DOS - Message Retriever - MSGSTR.INC Module                 

			     C	;	     (apostrophe) $P_SorD_Quote is removed from PSDATA.INC.
			     C	;	     $P_SQuote EQU also removed from PSDATA.INC.  Any references to
			     C	;	     single quote in PROC prologues are left as is for history reasons.
			     C	
			     C	;	     This fixes another bug, not mentioned in p1672, in that two
			     C	;	     quote chars within a quoted string is supposed to be reported as
			     C	;	     one quote character, but is reported as two quotes.  This changed
			     C	;	     two instructions in PROC $P_Quoted_Str.
			     C	
			     C	;	     Also fixed are several JMP that caused a NOP, these changed to
			     C	;	     have the SHORT operator to avoid the unneeded NOP.
			     C	
			     C	;	     The code and PSDATA.INC have been aligned for ease of reading.
			     C	
			     C	; 10/26/87 : Ed K (;AN026;) PTM2041, DATE within SWITCH, BX reference to
			     C	;	     psdata buffer should have psdata_seg.
			     C	
			     C	; 10/27/87 : Ed K (;AN027;) PTM2042 comma between keywords implies
			     C	;	     positional missing.
			     C	
			     C	; 11/06/87 : Ed K (;AN028;) PTM 2315 Parser should not use line feed
			     C	;	     as a line delimiter, should use carriage return.
			     C	;	     Define switch: LFEOLSW, if on, accept LF as end of line char.
			     C	
			     C	; 11/11/87 : Ed K (;AN029;) PTM 1651 GET RID OF WHITESPACE AROUND "=".
			     C	
			     C	; 11/18/87 : Ed K (;AN030;) PTM 2551 If filename is just "", then
			     C	;	     endless loop since SI is returned still pointing to start
			     C	;	     of that parm.
			     C	
			     C	; 11/19/87 : Ed K (;AN031;) PTM 2585 date & time getting bad values.
			     C	;	     Vector to returned string has CS instead of Psdata_Seg, but
			     C	;	     when tried to fix it on previous version, changed similar
			     C	;	     but wrong place.
			     C	
			     C	; 12/09/87 : Bill L (;AN032;) PTM 2772 colon and period are now valid
			     C	;	     delimiters between hours, minutes, seconds for time. And period
			     C	;	     and comma are valid delimiters between seconds and 100th second.
			     C	
			     C	; 12/14/87 : Bill L (;AN033;) PTM 2722 if illegal delimiter characters
			     C	;	     in a filespec, then flag an error.
			     C	
			     C	; 12/22/87 : Bill L (;AN034;)	    All local data to parser is now
			     C	;	     indexed off of the psdata_seg equate instead of the DS register.
			     C	;	     Using this method, DS can point to the segment of PSP or to psdata
			     C	;  -->	     local parser data. Why were some references to local data changed
			     C	;	     to do this before, but not all ?????
			     C	
			     C	; 02/02/88 : Ed K (;AC035;) INSPECT utility, suggests optimizations.
			     C	
			     C	; 02/05/88 : Ed K (;AN036;) P3372-UPPERCASE TRANSLATION, PSDATA_SEG HOSED.
			     C	;
			     C	; 02/08/88 : Ed K (;AN037;) P3410-AVOID POP OF CS, CHECK BASESW FIRST.
			     C	
			     C	; 02/19/88 : Ed K (;AN038;) p3524 above noon and "am" should be error
			     C	
			     C	; 02/23/88 : Ed K (;AN039;) p3518 accept "comma" and "period" as decimal
			     C	;	     separator in TIME before hundredths field.
			     C	;
			     C	;***********************************************************************
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-22
DOS - Message Retriever - MSGSTR.INC Module                 

			     C	ELSE					;AN000;
 0148                        C	SysParse proc near			;AN000;
			     C	ENDIF					;AN000;(of FarSW)
			     C	;	$SALUT	(4,9,17,41)
 0148  2E: C7 06 00B8 R 0000 C		mov	psdata_seg:$P_Flags,0	;AC034; Clear all internal flags
 014F  FC                    C		cld				      ;AN000; confirm forward direction
 0150  2E: 89 0E 00AB R      C		mov	psdata_seg:$P_ordinal,cx      ;AC034; save operand ordinal
 0155  2E: C7 06 00AD R 0000 C		mov	psdata_seg:$P_RC,$P_No_Error  ;AC034; Assume no error
 015C  2E: C7 06 00C0 R 0000 C		mov	psdata_seg:$P_Found_SYNONYM,0 ;AC034; initalize synonym pointer
			     C	
 0163  2E: C7 06 00B1 R 0000 C		mov	word ptr psdata_seg:$P_DX,0   ;AC034; (tm15)
 016A  E8 0723 R             C		call	$P_Skip_Delim		;AN000; Move si to 1st non white space
 016D  73 13                 C		jnc	$P_Start		;AN000; If EOL is not encountered, do parse
			     C	
			     C	;--------------------------- End of Line
 016F  B8 FFFF               C		mov	ax,$P_RC_EOL		;AN000; set exit code to -1
 0172  53                    C		push	bx			;AN000;
 0173  26: 8B 1D             C		mov	bx,es:[di].$P_PARMSX_Address ;AN000; Get the PARMSX address to
 0176  26: 3A 0F             C		cmp	cl,es:[bx].$P_MinP	;AN000; check ORDINAL to see if the minimum
 0179  73 03                 C		jae	$P_Fin			;AN000; positional found.
			     C	
 017B  B8 0002               C		mov	ax,$P_Op_Missing	;AN000; If no, set exit code to missing operand
 017E                        C	$P_Fin: 				;AN000;
 017E  5B                    C		pop	bx			;AN000;
 017F  E9 029F R             C		jmp	$P_Single_Exit		;AN000; return to the caller
			     C	
			     C	;---------------------------
 0182                        C	$P_Start:				;AN000;
 0182  2E: 89 36 00BA R      C		mov	psdata_seg:$P_SaveSI_Cmpx,si ;AN000;AC034;  save ptr to command line for later use b
				y complex,
 0187  53                    C		push	bx			;AN000; quoted string or file spec.
 0188  57                    C		push	di			;AN000;
 0189  55                    C		push	bp			;AN000;
 018A  8D 1E 00C2 R          C		lea	bx,psdata_seg:$P_STRING_BUF ;AC034; set buffer to copy from command string
 018E  2E: F6 06 00B9 R 20   C		test	psdata_seg:$P_Flags2,$P_Extra ;AC034; 3/9 extra delimiter encountered ?
 0194  75 43                 C		jne	$P_Pack_End		;AN000; 3/9 if yes, no need to copy
			     C	
 0196                        C	$P_Pack_Loop:				;AN000;
 0196  AC                    C		lodsb				;AN000; Pick a operand from buffer
 0197  E8 07E0 R             C		call	$P_Chk_Switch		;AN000; Check switch character
 019A  72 3C                 C		jc	$P_Pack_End_BY_EOL	;AN020; if carry set found delimiter type slash, need backup
				 si, else continue
			     C	
 019C  E8 0749 R             C		call	$P_Chk_EOL		;AN000; Check EOL character
 019F  74 37                 C		je	$P_Pack_End_BY_EOL	;AN000; need backup si
			     C	
 01A1  E8 077F R             C		call	$P_Chk_Delim		;AN000; Check delimiter
 01A4  75 18                 C		jne	$P_PL01 		;AN000; If no, process next byte
			     C	
 01A6  2E: F6 06 00B9 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
 01AC  75 05                 C		jne	$P_Pack_End_backup_si	;AN000; (tm08)
			     C	
 01AE  E8 0723 R             C		call	$P_Skip_Delim		;AN000; skip subsequent white space,too
 01B1  EB 26                 C		jmp	short $P_Pack_End	;AN000; finish copy by placing NUL at end
			     C	
 01B3                        C	$P_PAck_End_backup_si:			;AN000; (tm08)
 01B3  2E: F6 06 00B9 R 41   C		test	psdata_seg:$P_Flags2,$P_SW+$P_equ ;AN000;AC034;  (tm08)
 01B9  74 1E                 C		je	$P_Pack_End		;AN000; (tm08)
			     C	
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-23
DOS - Message Retriever - MSGSTR.INC Module                 

 01BB  4E                    C		dec	si			;AN000; (tm08)
 01BC  EB 1B                 C		jmp	short $P_Pack_End	;AN025; (tm08)
			     C	
 01BE                        C	$P_PL01:				;AN000;
 01BE  2E: 88 07             C		mov	psdata_seg:[bx],al	;AN000; move byte to STRING_BUF
 01C1  3C 3D                 C		cmp	al,$P_Keyword		;AN000; if it is equal character,
 01C3  75 06                 C		jne	$P_PL00 		;AN000; then
			     C	
 01C5  2E: 80 0E 00B9 R 01   C		or	psdata_seg:$P_Flags2,$P_equ ;AC034; remember it in flag
 01CB                        C	$P_PL00:				;AN000;
 01CB  43                    C		inc	bx			;AN000; ready to see next byte
 01CC  E8 07FE R             C		call	$P_Chk_DBCS		;AN000; was it 1st byte of DBCS ?
 01CF  73 C5                 C		jnc	$P_Pack_Loop		;AN000; if no, process to next byte
			     C	
 01D1  AC                    C		lodsb				;AN000; if yes, store
 01D2  2E: 88 07             C		mov	psdata_seg:[bx],al	;AN000;    2nd byte of DBCS
 01D5  43                    C		inc	bx			;AN000; update pointer
 01D6  EB BE                 C		jmp	short $P_Pack_Loop	;AN000; process to next byte
			     C	
 01D8                        C	$P_Pack_End_BY_EOL:			;AN000;
 01D8  4E                    C		dec	si			;AN000; backup si pointer
 01D9                        C	$P_Pack_End:				;AN000;
 01D9  2E: 89 36 00AF R      C		mov	psdata_seg:$P_SI_Save,si     ;AC034; save next pointer, SI
 01DE  2E: C6 07 00          C		mov	byte ptr psdata_seg:[bx],$P_NULL ;AN000; put NULL at the end
 01E2  2E: 89 1E 00BE R      C		mov	psdata_seg:$P_Save_EOB,bx    ;AC034; 3/17/87 keep the address for later use of compl
				ex
 01E7  26: 8B 1D             C		mov	bx,es:[di].$P_PARMSX_Address ;AN000; get PARMSX address
 01EA  8D 36 00C2 R          C		lea	si,psdata_seg:$P_STRING_BUF  ;AC034;
 01EE  2E: 80 3C 2F          C		cmp	byte ptr psdata_seg:[si],$P_Switch ;AN000; the operand begins w/ switch char ?
 01F2  74 30                 C		je	$P_SW_Manager		     ;AN000; if yes, process as switch
			     C	
 01F4  2E: F6 06 00B9 R 01   C		test	psdata_seg:$P_Flags2,$P_equ   ;AC034; the operand includes equal char ?
 01FA  75 54                 C		jne	$P_Key_manager		     ;AN000; if yes, process as keyword
			     C	
 01FC                        C	$P_Positional_Manager:			;AN000; else process as positional
 01FC  26: 8A 47 01          C		mov	al,es:[bx].$P_MaxP	;AN000; get maxp
 0200  32 E4                 C		xor	ah,ah			;AN000; ax = maxp
 0202  2E: 39 06 00AB R      C		cmp	psdata_seg:$P_ORDINAL,ax ;AC034; too many positional ?
 0207  73 12                 C		jae	$P_Too_Many_Error	;AN000; if yes, set exit code to too many
			     C	
 0209  2E: A1 00AB R         C		mov	ax,psdata_seg:$P_ORDINAL ;AC034; see what the current ordinal
 020D  D1 E0                 C		shl	ax,1			;AN000; ax = ax*2
 020F  43                    C		inc	bx			;AC035; add '2' to
 0210  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
 0211  03 D8                 C		add	bx,ax			;AN000; now bx points to specified CONTROL address
 0213  26: 8B 1F             C		mov	bx,es:[bx]		;AN000; now bx points to specified CONTROL itself
 0216  E8 02A1 R             C		call	$P_Chk_Pos_Control	;AN000; Do process for positional
 0219  EB 69                 C		jmp	short $P_Return_to_Caller ;AN000; and return to the caller
			     C	
 021B                        C	$P_Too_Many_Error:			;AN000;
 021B  2E: C7 06 00AD R 0001 C		mov	psdata_seg:$P_RC,$P_Too_Many ;AC034; set exit code
 0222  EB 60                 C		jmp	short $P_Return_to_Caller ;AN000; and return to the caller
			     C	;
 0224                        C	$P_SW_Manager:				;AN000;
 0224  26: 8A 47 01          C		mov	al,es:[bx].$P_MaxP	;AN000; get maxp
 0228  32 E4                 C		xor	ah,ah			;AN000; ax = maxp
 022A  40                    C		inc	ax			;AN000;
 022B  D1 E0                 C		shl	ax,1			;AN000; ax = (ax+1)*2
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-24
DOS - Message Retriever - MSGSTR.INC Module                 

 022D  03 D8                 C		add	bx,ax			;AN000; now bx points to maxs
 022F  26: 8A 0F             C		mov	cl,es:[bx]		;AN000;
 0232  32 ED                 C		xor	ch,ch			;AN000; cx = maxs
 0234  0B C9                 C		or	cx,cx			;AN000; at least one switch ?
 0236  74 0F                 C		je	$P_SW_Not_Found 	;AN000;
			     C	
 0238  43                    C		inc	bx			;AN000; now bx points to 1st CONTROL address
			     C	
 0239                        C	$P_SW_Mgr_Loop: 			;AN000;
 0239  53                    C		push	bx			;AN000;
 023A  26: 8B 1F             C		mov	bx,es:[bx]		;AN000; bx points to Switch CONTROL itself
 023D  E8 0306 R             C		call	$P_Chk_SW_Control	;AN000; do process for switch
 0240  5B                    C		pop	bx			;AN000;
 0241  73 41                 C		jnc	$P_Return_to_Caller	;AN000; if the CONTROL is for the switch, exit
			     C	
 0243  43                    C		inc	bx			;AC035; add '2' to
 0244  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
 0245  E2 F2                 C		loop	$P_SW_Mgr_Loop		;AN000; and loop
			     C	
 0247                        C	$P_SW_Not_Found:			;AN000;
 0247  2E: C7 06 00AD R 0003 C		mov	psdata_seg:$P_RC,$P_Not_In_SW ;AC034; here no CONTROL for the switch has
 024E  EB 34                 C		jmp	short $P_Return_to_Caller0    ;AN000; not been found, means error.
			     C	;
 0250                        C	$P_Key_Manager: 			;AN000;
 0250  26: 8A 47 01          C		mov	al,es:[bx].$P_MaxP	;AN000; get maxp
 0254  32 E4                 C		xor	ah,ah			;AN000; ax = maxp
 0256  40                    C		inc	ax			;AN000;
 0257  D1 E0                 C		shl	ax,1			;AN000; ax = (ax+1)*2
 0259  03 D8                 C		add	bx,ax			;AN000; now bx points to maxs
 025B  26: 8A 07             C		mov	al,es:[bx]		;AN000;
 025E  32 E4                 C		xor	ah,ah			;AN000; ax = maxs
 0260  D1 E0                 C		shl	ax,1			;AN000;
 0262  40                    C		inc	ax			;AN000; ax = ax*2+1
 0263  03 D8                 C		add	bx,ax			;AN000; now bx points to maxk
 0265  26: 8A 0F             C		mov	cl,es:[bx]		;AN000;
 0268  32 ED                 C		xor	ch,ch			;AN000; cx = maxk
 026A  0B C9                 C		or	cx,cx			;AN000; at least one keyword ?
 026C  74 0F                 C		je	$P_Key_Not_Found	;AN000;
			     C	
 026E  43                    C		inc	bx			;AN000; now bx points to 1st CONTROL
			     C	
 026F                        C	$P_Key_Mgr_Loop:			;AN000;
 026F  53                    C		push	bx			;AN000;
 0270  26: 8B 1F             C		mov	bx,es:[bx]		;AN000; bx points to keyword CONTROL itself
 0273  E8 02D3 R             C		call	$P_Chk_Key_Control	;AN000; do process for keyword
 0276  5B                    C		pop	bx			;AN000;
 0277  73 0B                 C		jnc	$P_Return_to_Caller	;AN000; if the CONTROL is for the keyword, exit
			     C	
 0279  43                    C		inc	bx			;AC035; add '2' to
 027A  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
 027B  E2 F2                 C		loop	$P_Key_Mgr_Loop 	;AN000; and loop
			     C	
 027D                        C	$P_Key_Not_Found:			;AN000;
 027D  2E: C7 06 00AD R 0004 C		mov	psdata_seg:$P_RC,$P_Not_In_Key ;AC034; here no CONTROL for the keyword has
 0284                        C	$P_Return_to_Caller0:			;AN000; not been found, means error.
			     C	
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-25
DOS - Message Retriever - MSGSTR.INC Module                 

			     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	
 0284                        C	$P_Return_to_Caller:			;AN000;
 0284  5D                    C		pop	bp			;AN000;
 0285  5F                    C		pop	di			;AN000;
 0286  5B                    C		pop	bx			;AN000;
 0287  2E: 8B 0E 00AB R      C		mov	cx,psdata_seg:$P_Ordinal    ;AC034; return next ordinal
 028C  2E: A1 00AD R         C		mov	ax,psdata_seg:$P_RC	    ;AC034; return exit code
 0290  2E: 8B 36 00AF R      C		mov	si,psdata_seg:$P_SI_Save    ;AC034; return next operand pointer
 0295  2E: 8B 16 00B1 R      C		mov	dx,psdata_seg:$P_DX	    ;AC034; return result buffer address
 029A  2E: 8A 1E 00B3 R      C		mov	bl,psdata_seg:$P_Terminator ;AC034; return delimiter code found
 029F                        C	$P_Single_Exit: 			;AN000;
 029F  F8                    C		clc				;AN000;
 02A0  C3                    C		ret				;AN000;
 02A1                        C	SysParse endp				;AN000;
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-26
DOS - Message Retriever - MSGSTR.INC Module                 

			     C	PAGE					;AN000;
			     C	;***********************************************************************
			     C	; $P_Chk_Pos_Control
			     C	;
			     C	; Function: Parse CONTROL block for a positional
			     C	;
			     C	; Input:     ES:BX -> CONTROL block
			     C	;	     psdata_seg:SI -> $P_STRING_BUF
			     C	;
			     C	; Output:    None
			     C	;
			     C	; Use:	 $P_Fill_Result, $P_Check_Match_Flags
			     C	;
			     C	; Vars: $P_Ordinal(W), $P_RC(W)
			     C	;***********************************************************************
 02A1                        C	$P_Chk_Pos_Control proc 		;AN000;
 02A1  50                    C		push	ax			;AN000;
 02A2  26: 8B 07             C		mov	ax,es:[bx].$P_Match_Flag ;AN000;
 02A5  A9 0002               C		test	ax,$P_Repeat		;AN000; repeat allowed ?
 02A8  75 05                 C		jne	$P_CPC00		;AN000; then do not increment ORDINAL
			     C	
 02AA  2E: FF 06 00AB R      C		inc	psdata_seg:$P_ORDINAL	;AC034; update the ordinal
 02AF                        C	$P_CPC00:				;AN000;
 02AF  2E: 80 3C 00          C		cmp	byte ptr psdata_seg:[si],$P_NULL ;AN000; no data ?
 02B3  75 19                 C		jne	$P_CPC01		;AN000;
			     C	
 02B5  A9 0001               C		test	ax,$P_Optional		;AN000; yes, then is it optional ?
 02B8  75 09                 C		jne	$P_CPC02		;AN000;
			     C	
 02BA  2E: C7 06 00AD R 0002 C		mov	psdata_seg:$P_RC,$P_Op_Missing ;AC034; no, then error	     3/17/87
 02C1  EB 0E                 C		jmp	short $P_CPC_Exit	;AN000;
			     C	
 02C3                        C	$P_CPC02:				;AN000;
 02C3  50                    C		push	ax			;AN000;
 02C4  B0 03                 C		mov	al,$P_String		;AN000; if it is optional return NULL
 02C6  B4 FF                 C		mov	ah,$P_No_Tag		;AN000; no item tag indication
 02C8  E8 0369 R             C		call	$P_Fill_Result		;AN000;
 02CB  58                    C		pop	ax			;AN000;
 02CC  EB 03                 C		jmp	short $P_CPC_Exit	;AN000;
			     C	
 02CE                        C	$P_CPC01:				;AN000;
 02CE  E8 03EE R             C		call	$P_Check_Match_Flags	;AN000;
 02D1                        C	$P_CPC_Exit:				;AN000;
 02D1  58                    C		pop	ax			;AN000;
 02D2  C3                    C		ret				;AN000;
 02D3                        C	$P_Chk_Pos_Control endp 		;AN000;
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-27
DOS - Message Retriever - MSGSTR.INC Module                 

			     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	;***********************************************************************
 02D3                        C	$P_Chk_Key_Control proc 		;AN000;
			     C	ELSE					;AN000;(of IF KeySW)
 02D3  F9                    C		stc				;AN000;this logic works when the KeySW
 02D4  C3                    C		ret				;AN000;is reset.
			     C	ENDIF					;AN000;(of KeySW)
 02D5                        C	$P_Chk_Key_Control endp 		;AN000;
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-28
DOS - Message Retriever - MSGSTR.INC Module                 

			     C	PAGE					;AN000;
			     C	;***********************************************************************
			     C	IF	KeySW+SwSW			;AN000;(Check if keyword or switch is supported)
			     C	; $P_Search_KEYorSW:
			     C	;
			     C	; Function: Seach specified keyword or switch from CONTROL
			     C	;
			     C	; Input:     ES:BX -> CONTROL block
			     C	;	     psdata_seg:SI -> $P_STRING_BUF
			     C	;
			     C	; Output:    CY = 1 : not match
			     C	;
			     C	; Use:	 $P_String_Comp, $P_MoveBP_NUL, $P_Found_SYNONYM
			     C	;***********************************************************************
 02D5                        C	$P_Search_KEYorSW proc			;AN000;
 02D5  55                    C		push	bp			;AN000;
 02D6  51                    C		push	cx			;AN000;
 02D7  26: 8A 4F 08          C		mov	cl,es:[bx].$P_nid	;AN000; Get synonym count
 02DB  32 ED                 C		xor	ch,ch			;AN000; and set it to cx
 02DD  0B C9                 C		or	cx,cx			;AN000; No synonyms specified ?
 02DF  74 0D                 C		je	$P_KEYorSW_Not_Found	;AN000; then indicate not found by CY
			     C	
 02E1  8D 6F 09              C		lea	bp,es:[bx].$P_KEYorSW	;AN000; BP points to the 1st synonym
 02E4                        C	$P_KEYorSW_Loop:			;AN000;
 02E4  E8 0680 R             C		call	$P_String_Comp		;AN000; compare string in buffer w/ the synonym
 02E7  73 08                 C		jnc	$P_KEYorSW_Found	;AN000; If match, set it to synonym pointer
			     C	
 02E9  E8 02FA R             C		call	$P_MoveBP_NUL		;AN000; else, bp points to the next string
 02EC  E2 F6                 C		loop	$P_KEYorSW_Loop 	;AN000; loop nid times
 02EE                        C	$P_KEYorSW_Not_Found:			;AN000;
 02EE  F9                    C		stc				;AN000; indicate not found in synonym list
 02EF  EB 06                 C		jmp	short $P_KEYorSW_Exit	;AN000; and exit
			     C	
 02F1                        C	$P_KEYorSW_Found:			;AN000;
 02F1  2E: 89 2E 00C0 R      C		mov	psdata_seg:$P_Found_SYNONYM,bp ;AC034; set synonym pointer
 02F6  F8                    C		clc				;AN000; indicate found
 02F7                        C	$P_KEYorSW_Exit:			;AN000;
 02F7  59                    C		pop	cx			;AN000;
 02F8  5D                    C		pop	bp			;AN000;
 02F9  C3                    C		ret				;AN000;
 02FA                        C	$P_Search_KEYorSW endp			;AN000;
			     C	;***********************************************************************
			     C	; $P_MoveBP_NUL
			     C	;***********************************************************************
 02FA                        C	$P_MoveBP_NUL proc			;AN000;
 02FA                        C	$P_MBP_Loop:				;AN000;
 02FA  26: 80 7E 00 00       C		cmp	byte ptr es:[bp],$P_NULL ;AN000; Increment BP that points
 02FF  74 03                 C		je	$P_MBP_Exit		;AN000; to the synomym list
			     C	
 0301  45                    C		inc	bp			;AN000; until
 0302  EB F6                 C		jmp	short $P_MBP_Loop	;AN000; NULL encountered.
			     C	
 0304                        C	$P_MBP_Exit:				;AN000;
 0304  45                    C		inc	bp			;AN000; bp points to next to NULL
 0305  C3                    C		ret				;AN000;
 0306                        C	$P_MoveBP_NUL endp			;AN000;
			     C	ENDIF					;AN000;(of KeySW+SwSW)
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-29
DOS - Message Retriever - MSGSTR.INC Module                 

			     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	;***********************************************************************
 0306                        C	$P_Chk_SW_Control proc			;AN000;
			     C	
			     C	
			     C	IF	SwSW				;AN000;(Check if switch is supported)
 0306  2E: 80 0E 00B9 R 10   C		or	psdata_seg:$P_Flags2,$P_Sw_Cmp ;AC034; Indicate switch for later string comparison
 030C  E8 02D5 R             C		call	$P_Search_KEYorSW	;AN000; Search the switch in the CONTROL block
 030F  72 4A                 C		jc	$P_Chk_SW_Err0		;AN000; not found, then try next CONTROL
			     C	
 0311  2E: 80 26 00B9 R EF   C		and	psdata_seg:$P_Flags2,0ffh-$P_Sw_Cmp ;AC034; reset the indicator previously set
			     C	;
 0317  50                    C		push	ax			;AN000; 	      /switch:
 0318  2E: A1 00BC R         C		mov	ax,psdata_seg:$P_KEYorSW_Ptr ;AC034;	      ^       ^
 031C  2B C6                 C		sub	ax,si			;AN000;  SI	KEYorSW
 031E  2E: 01 06 00BA R      C		add	psdata_seg:$P_SaveSI_Cmpx,ax ;AC034; update for complex list
 0323  58                    C		pop	ax			;AN000;
			     C	;
 0324  2E: 8B 36 00BC R      C		mov	si,psdata_seg:$P_KEYorSW_Ptr ;AC034; set si at the end or colon
 0329  2E: 80 3C 00          C		cmp	byte ptr psdata_seg:[si],$P_NULL ;AN000; any data after colon
 032D  75 26                 C		jne	$P_CSW00		;AN000; if yes, process match flags
			     C	
 032F  2E: 80 7C FF 3A       C		cmp	byte ptr psdata_seg:[si-1],$P_Colon ;AN000; if no, the switch terminated by colon ?
 0334  75 09                 C		jne	$P_Chk_if_data_required ;AN000; if yes,
			     C	
 0336  2E: C7 06 00AD R 0009 C		mov	psdata_seg:$P_RC,$P_Syntax ;AC034; return syntax error
 033D  EB 1F                 C		jmp	short $P_Chk_SW_Exit	;AN000;
			     C	
 033F                        C	$P_Chk_if_data_required:		;AN018; no data, no colon
 033F  26: 83 3F 00          C		cmp	es:[bx].$P_Match_Flag,0 ;AN018; should have data? zero match flag means switch follo
				wed by nothing is OK
 0343  74 19                 C		je	$P_Chk_SW_Exit		;AN018; match flags not zero so should have something if opt
				ional bit is not on
			     C	
 0345  26: F7 07 0001        C		test	es:[bx].$P_Match_Flag,$P_Optional ;AN019; see if no value is valid
 034A  75 12                 C		jnz	$P_Chk_SW_Exit		;AN019; if so, then leave, else yell
			     C	
 034C  2E: C7 06 00AD R 0002 C		mov	psdata_seg:$P_RC,$P_Op_Missing ;AC034; return required operand missing
 0353  EB 09                 C		jmp	short $P_Chk_SW_Exit	;AN018;
			     C	
 0355                        C	$P_CSW00:				;AN000;
 0355  E8 03EE R             C		call	$P_Check_Match_Flags	;AN000; process match flag
 0358  F8                    C		clc				;AN000; indicate match
 0359  EB 0D                 C		jmp	short $P_Chk_SW_Single_Exit ;AN000;
			     C	
 035B                        C	$P_Chk_SW_Err0: 			;AN000;
 035B  F9                    C		stc				;AN000; not found in switch synonym list
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-30
DOS - Message Retriever - MSGSTR.INC Module                 

 035C  EB 0A                 C		jmp	short $P_Chk_SW_Single_Exit ;AN000;
			     C	
 035E                        C	$P_Chk_SW_Exit: 			;AN000;
 035E  50                    C		push	ax			;AN000;
 035F  B0 03                 C		mov	al,$P_String		;AN000; set
 0361  B4 FF                 C		mov	ah,$P_No_Tag		;AN000;    result
 0363  E8 0369 R             C		call	$P_Fill_Result		;AN000; 	 buffer
 0366  58                    C		pop	ax			;AN000;
 0367  F8                    C		clc				;AN000;
 0368                        C	$P_Chk_SW_Single_Exit:			;AN000;
 0368  C3                    C		ret				;AN000;
			     C	ENDIF					;AN000;(of SwSW)
 0369                        C	$P_Chk_SW_Control endp			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-31
DOS - Message Retriever - MSGSTR.INC Module                 

			     C	PAGE					;AN000;
			     C	;***********************************************************************
			     C	; $P_Fill_Result
			     C	;
			     C	; Function: Fill the result buffer
			     C	;
			     C	; Input:    AH = Item tag
			     C	;	    AL = type
			     C	;		  AL = 1: CX,DX has 32bit number (CX = high)
			     C	;		  AL = 2: DX has index(offset) into value list
			     C	;		  AL = 6: DL has driver # (1-A, 2-B, ... , 26 - Z)
			     C	;		  AL = 7: DX has year, CL has month and CH has date
			     C	;		  AL = 8: DL has hours, DH has minutes, CL has secondsn,
			     C	;			  amd CH has hundredths
			     C	;		  AL = else: psdata_seg:SI points to returned string buffer
			     C	;	    ES:BX -> CONTROL block
			     C	;
			     C	; Output:   None
			     C	;
			     C	; Use:	$P_Do_CAPS_String, $P_Remove_Colon, $P_Found_SYNONYM
			     C	;
			     C	; Vars: $P_DX(W)
			     C	;***********************************************************************
 0369                        C	$P_Fill_Result proc			;AN000;
 0369  57                    C		push	di			;AN000;
 036A  26: 8B 7F 04          C		mov	di,es:[bx].$P_Result_Buf ;AN000; di points to result buffer
 036E  2E: 89 3E 00B1 R      C		mov	psdata_seg:$P_DX,di	;AC034; set returned result address
 0373  26: 88 05             C		mov	es:[di].$P_Type,al	;AN000; store type
 0376  26: 88 65 01          C		mov	es:[di].$P_Item_Tag,ah	;AN000; store item tag
 037A  50                    C		push	ax			;AN000;
 037B  2E: A1 00C0 R         C		mov	ax,psdata_seg:$P_Found_SYNONYM ;AC034; if yes,
 037F  26: 89 45 02          C		mov	es:[di].$P_SYNONYM_Ptr,ax ;AN000;   then set it to the result
 0383  58                    C		pop	ax			;AN000;
 0384                        C	$P_RLT04:				;AN000;
 0384  3C 01                 C		cmp	al,$P_Number		;AN000; if number
 0386  75 0A                 C		jne	$P_RLT00		;AN000;
			     C	
 0388                        C	$P_RLT02:				;AN000;
 0388  26: 89 55 04          C		mov	word ptr es:[di].$P_Picked_Val,dx ;AN000; then store 32bit
 038C  26: 89 4D 06          C		mov	word ptr es:[di+2].$P_Picked_Val,cx ;AN000;	number
 0390  EB 5A                 C		jmp	short $P_RLT_Exit	;AN000;
			     C	
 0392                        C	$P_RLT00:				;AN000;
 0392  3C 02                 C		cmp	al,$P_List_Idx		;AN000; if list index
 0394  75 06                 C		jne	$P_RLT01		;AN000;
			     C	
 0396  26: 89 55 04          C		mov	word ptr es:[di].$P_Picked_Val,dx ;AN000; then store list index
 039A  EB 50                 C		jmp	short $P_RLT_Exit	;AN000;
			     C	
 039C                        C	$P_RLT01:				;AN000;
 039C  3C 07                 C		cmp	al,$P_Date_F		;AN000; Date format ?
 039E  74 E8                 C		je	$P_RLT02		;AN000;
			     C	
 03A0  3C 08                 C		cmp	al,$P_Time_F		;AN000; Time format ?
 03A2  74 E4                 C		je	$P_RLT02		;AN000;
			     C	;
 03A4  3C 06                 C		cmp	al,$P_Drive		;AN000; drive format ?
 03A6  75 06                 C		jne	$P_RLT03		;AN000;
			     C	
 03A8  26: 88 55 04          C		mov	byte ptr es:[di].$P_Picked_Val,dl ;AN000; store drive number
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-32
DOS - Message Retriever - MSGSTR.INC Module                 

 03AC  EB 3E                 C		jmp	short $P_RLT_Exit	;AN000;
			     C	
 03AE                        C	$P_RLT03:				;AN000;
 03AE  3C 04                 C		cmp	al,$P_Complex		;AN000; complex format ?
 03B0  75 0F                 C		jne	$P_RLT05		;AN000;
			     C	
 03B2  2E: A1 00BA R         C		mov	ax,psdata_seg:$P_SaveSI_Cmpx ;AC034; then get pointer in command buffer
 03B6  40                    C		inc	ax			;AN000; skip left Parentheses
 03B7  26: 89 45 04          C		mov	word ptr es:[di].$P_Picked_Val,ax ;AN000; store offset
 03BB  26: 8C 5D 06          C		mov	word ptr es:[di+2].$P_Picked_Val,ds ;AN000; store segment
 03BF  EB 2B                 C		jmp	short $P_RLT_Exit	;AN000;
			     C	
 03C1                        C	$P_RLT05:				;AN000;
			     C	;------------------------  AL = 3, 5, or 9
 03C1  26: 89 75 04          C		mov	word ptr es:[di].$P_Picked_Val,si ;AN000; store offset of STRING_BUF
			     C	;(replaced ;AN031;)  mov word ptr es:[di+word].$P_Picked_Val,cs ;AN000; store segment of STRING_BUF
 03C5  26: 8C 4D 06          C		mov	word ptr es:[di+2].$P_Picked_Val,Psdata_Seg ;AN031; store segment of STRING_BUF
			     C	;
 03C9  50                    C		push	ax			;AN000;
 03CA  26: F6 47 02 01       C		test	byte ptr es:[bx].$P_Function_Flag,$P_CAP_File ;AN000; need CAPS by file table?
 03CF  74 04                 C		je	$P_RLT_CAP00		;AN000;
			     C	
 03D1  B0 04                 C		mov	al,$P_DOSTBL_File	;AN000; use file upper case table
 03D3  EB 09                 C		jmp	short $P_RLT_CAP02	;AN000;
			     C	
 03D5                        C	$P_RLT_CAP00:				;AN000;
 03D5  26: F6 47 02 02       C		test	byte ptr es:[bx].$P_Function_Flag,$P_CAP_Char ;AN000; need CAPS by char table ?
 03DA  74 05                 C		je	$P_RLT_CAP01		;AN000;
			     C	
 03DC  B0 02                 C		mov	al,$P_DOSTBL_Char	;AN000; use character upper case table
 03DE                        C	$P_RLT_CAP02:				;AN000;
 03DE  E8 0495 R             C		call	$P_Do_CAPS_String	;AN000;  process CAPS along the table
 03E1                        C	$P_RLT_CAP01:				;AN000;
 03E1  58                    C		pop	ax			;AN000;
 03E2  26: F6 47 02 10       C		test	byte ptr es:[bx].$P_Function_Flag,$P_Rm_Colon ;AN000; removing colon at end ?
 03E7  74 03                 C		je	$P_RLT_Exit		;AN000;
			     C	
 03E9  E8 046F R             C		call	$P_Remove_Colon 	;AN000; then process it.
 03EC                        C	$P_RLT_Exit:				;AN000;
 03EC  5F                    C		pop	di			;AN000;
 03ED  C3                    C		ret				;AN000;
 03EE                        C	$P_Fill_Result endp			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-33
DOS - Message Retriever - MSGSTR.INC Module                 

			     C	PAGE					;AN000;
			     C	;***********************************************************************
			     C	; $P_Check_Match_Flags
			     C	;
			     C	; Function:  Check the mutch_flags and make the exit code and set the
			     C	;	     result buffer
			     C	;
			     C	;	    Check for types in this order:
			     C	;		Complex
			     C	;		Date
			     C	;		Time
			     C	;		Drive
			     C	;		Filespec
			     C	;		Quoted String
			     C	;		Simple String
			     C	;
			     C	; Input:     psdata_seg:SI -> $P_STRING_BUF
			     C	;	     ES:BX -> CONTROL block
			     C	;
			     C	; Output:    None
			     C	;
			     C	; Use:	     $P_Value, P$_SValue, $P_Simple_String, $P_Date_Format
			     C	;	     $P_Time_Format, $P_Complex_Format, $P_File_Foemat
			     C	;	     $P_Drive_Format
			     C	;***********************************************************************
 03EE                        C	$P_Check_Match_Flags proc		;AN000;
 03EE  2E: C6 06 0147 R 00   C		mov	psdata_seg:$P_err_flag,$P_NULL ;AN033;AC034;; clear filespec error flag.
 03F4  50                    C		push	ax			;AN000;
 03F5  26: 8B 07             C		mov	ax,es:[bx].$P_Match_Flag ;AN000; load match flag(16bit) to ax
			     C	
 03F8  0B C0                 C		or	ax,ax			;AC035; test ax for zero
			     C	;(changed ;AC035;)  cmp     ax,0	;AN000; (tm12)
 03FA  75 18                 C		jne	$P_Mat			;AN000; (tm12)
			     C	
 03FC  50                    C		push	ax			;AN000; (tm12)
 03FD  53                    C		push	bx			;AN000; (tm12)
 03FE  52                    C		push	dx			;AN000; (tm12)
 03FF  57                    C		push	di			;AN000; (tm12)
 0400  2E: C7 06 00AD R 0009 C		mov	psdata_seg:$P_RC,$P_Syntax ;AC034; (tm12)
 0407  B4 FF                 C		mov	ah,$P_No_Tag		;AN000; (tm12)
 0409  B0 03                 C		mov	al,$P_String		;AN000; (tm12)
 040B  E8 0369 R             C		call	$P_Fill_Result		;AN000; (tm12)
 040E  5F                    C		pop	di			;AN000; (tm12)
 040F  5A                    C		pop	dx			;AN000; (tm12)
 0410  5B                    C		pop	bx			;AN000; (tm12)
 0411  58                    C		pop	ax			;AN000; (tm12)
 0412  EB 02                 C		jmp	short $P_Bridge 	;AC035; (tm12)
			     C	
 0414                        C	$P_Mat: 				;AN000; (tm12)
			     C	
 0414  EB 03                 C		jmp	short $P_Match03	;AN025; (tm09)
			     C	
 0416                        C	$P_Bridge:				;AN000;
			     C	;	jmp	short $P_Match_Exit (tm02)
			     C	
 0416  EB 3E 90              C		jmp	$P_Match_Exit		;AN000; (tm02)
			     C	
 0419                        C	$P_Match03:				;AN000;
			     C	; ENDIF ;AN000;(of TimeSW) (tm04)
			     C	IF	NumSW				;AN000;(Check if numeric value is supported)
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-34
DOS - Message Retriever - MSGSTR.INC Module                 

 0419  A9 8000               C		test	ax,$P_Num_Val		;AN000; Numeric value
 041C  74 12                 C		je	$P_Match04		;AN000;
			     C	
 041E  2E: C7 06 00AD R 0000 C		mov	psdata_seg:$P_RC,$P_No_Error ;AC034; assume no error
 0425  E8 051D R             C		call	$P_Value		;AN000; do process
 0428  2E: 83 3E 00AD R 09   C		cmp	psdata_seg:$P_RC,$P_Syntax ;AC034; if error, examine the next type
 042E  75 26                 C		jne	$P_Match_Exit		;AN000;
			     C	
 0430                        C	$P_Match04:				;AN000;
 0430  A9 4000               C		test	ax,$P_SNUM_Val		;AN000; Signed numeric value
 0433  74 12                 C		je	$P_Match05		;AN000;
			     C	
 0435  2E: C7 06 00AD R 0000 C		mov	psdata_seg:$P_RC,$P_No_Error ;AC034; assume no error
 043C  E8 04F9 R             C		call	$P_SValue		;AN000; do process
 043F  2E: 83 3E 00AD R 09   C		cmp	psdata_seg:$P_RC,$P_Syntax ;AC034; if error, examine the next type
 0445  75 0F                 C		jne	$P_Match_Exit		;AN000;
			     C	
 0447                        C	$P_Match05:				;AN000;
			     C	ENDIF					;AN000;(of NumSW)
 0447  A9 2000               C		test	ax,$P_Simple_S		;AN000; Simple string
 044A  74 0A                 C		je	$P_Match09		;AN000;
			     C	
 044C  2E: C7 06 00AD R 0000 C		mov	psdata_seg:$P_RC,$P_No_Error ;AC034; assume no error
 0453  E8 065A R             C		call	$P_Simple_String	;AN000; do process
			     C	;;;;	cmp	psdata_seg:$P_RC,$P_Syntax ;AC034; These two lines will be alive
			     C	;;;;	jne	$P_Match_Exit			   ;when extending the match_flags.
 0456                        C	$P_Match09:				;AN000;
 0456                        C	$P_Match_Exit:				;AN000;
 0456  2E: 80 3E 0147 R 01   C		cmp	psdata_seg:$P_err_flag,$P_error_filespec ;AC034; bad filespec ?
 045C  75 0F                 C		jne	$P_Match2_Exit		;AN033; no, continue
 045E  2E: 83 3E 00AD R 00   C		cmp	psdata_seg:$P_RC,$P_No_Error ;AN033;AC034;; check for other errors ?
 0464  75 07                 C		jne	$P_Match2_Exit		;AN033; no, continue
 0466  2E: C7 06 00AD R 0009 C		mov	psdata_seg:$P_RC,$P_Syntax ;AN033;AC034;; set error flag
 046D                        C	$P_Match2_Exit: 			;AN033;
 046D  58                    C		pop	ax			;AN000;
 046E  C3                    C		ret				;AN000;
 046F                        C	$P_Check_Match_Flags endp		;AN000;
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-35
DOS - Message Retriever - MSGSTR.INC Module                 

			     C	PAGE					;AN000;
			     C	;***********************************************************************
			     C	; $P_Remove_Colon;
			     C	;
			     C	; Function: Remove colon at end
			     C	;
			     C	; Input:    psdata_seg:SI points to string buffer to be examineed
			     C	;
			     C	; Output:   None
			     C	;
			     C	; Use:	$P_Chk_DBCS
			     C	;***********************************************************************
 046F                        C	$P_Remove_Colon proc			;AN000;
 046F  50                    C		push	ax			;AN000;
 0470  56                    C		push	si			;AN000;
 0471                        C	$P_RCOL_Loop:				;AN000;
 0471  2E: 8A 04             C		mov	al,psdata_seg:[si]	;AN000; get character
 0474  0A C0                 C		or	al,al			;AN000; end of string ?
 0476  74 1A                 C		je	$P_RCOL_Exit		;AN000; if yes, just exit
			     C	
 0478  3C 3A                 C		cmp	al,$P_Colon		;AN000; is it colon ?
 047A  75 0D                 C		jne	$P_RCOL00		;AN000;
			     C	
 047C  2E: 80 7C 01 00       C		cmp	byte ptr psdata_seg:[si+byte],$P_NULL ;AN000; if so, next is NULL ?
 0481  75 06                 C		jne	$P_RCOL00		;AN000; no, then next char
			     C	
 0483  2E: C6 04 00          C		mov	byte ptr psdata_seg:[si],$P_NULL ;AN000; yes, remove colon
 0487  EB 09                 C		jmp	short $P_RCOL_Exit	;AN000; and exit.
			     C	
 0489                        C	$P_RCOL00:				;AN000;
 0489  E8 07FE R             C		call	$P_Chk_DBCS		;AN000; if not colon, then check if
 048C  73 01                 C		jnc	$P_RCOL01		;AN000; DBCS leading byte.
			     C	
 048E  46                    C		inc	si			;AN000; if yes, skip trailing byte
 048F                        C	$P_RCOL01:				;AN000;
 048F  46                    C		inc	si			;AN000; si points to next byte
 0490  EB DF                 C		jmp	short $P_RCOL_Loop	;AN000; loop until NULL encountered
			     C	
 0492                        C	$P_RCOL_Exit:				;AN000;
 0492  5E                    C		pop	si			;AN000;
 0493  58                    C		pop	ax			;AN000;
 0494  C3                    C		ret				;AN000;
 0495                        C	$P_Remove_Colon endp			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-36
DOS - Message Retriever - MSGSTR.INC Module                 

			     C	PAGE					;AN000;
			     C	;***********************************************************************
			     C	; $P_Do_CAPS_String;
			     C	;
			     C	; Function: Perform capitalization along with the file case map table
			     C	;	    or character case map table.
			     C	;
			     C	; Input:    AL = 2 : Use character table
			     C	;	    AL = 4 : Use file table
			     C	;	    psdata_seg:SI points to string buffer to be capitalized
			     C	;
			     C	; Output:   None
			     C	;
			     C	; Use:	$P_Do_CAPS_Char, $P_Chk_DBCS
			     C	;***********************************************************************
 0495                        C	$P_Do_CAPS_String proc			;AN000;
 0495  56                    C		push	si			;AN000;
 0496  52                    C		push	dx			;AN000;
 0497  8A D0                 C		mov	dl,al			;AN000; save info id
			     C	
 0499                        C	$P_DCS_Loop:				;AN000;
 0499  2E: 8A 04             C		mov	al,psdata_seg:[si]	;AN000; load charater and
 049C  E8 07FE R             C		call	$P_Chk_DBCS		;AN000; check if DBCS leading byte
 049F  72 0C                 C		jc	$P_DCS00		;AN000; if yes, do not need CAPS
			     C	
 04A1  0A C0                 C		or	al,al			;AN000; end of string ?
 04A3  74 0C                 C		je	$P_DCS_Exit		;AN000; then exit.
			     C	
 04A5  E8 04B4 R             C		call	$P_Do_CAPS_Char 	;AN000; Here a SBCS char need to be CAPS
 04A8  2E: 88 04             C		mov	psdata_seg:[si],al	;AN000; stored upper case char to buffer
 04AB  EB 01                 C		jmp	short $P_DCS01		;AN000; process nexit
 04AD                        C	$P_DCS00:				;AN000;
 04AD  46                    C		inc	si			;AN000; skip DBCS leading and trailing byte
 04AE                        C	$P_DCS01:				;AN000;
 04AE  46                    C		inc	si			;AN000; si point to next byte
 04AF  EB E8                 C		jmp	short $P_DCS_Loop	;AN000; loop until NULL encountered
 04B1                        C	$P_DCS_Exit:				;AN000;
 04B1  5A                    C		pop	dx			;AN000;
 04B2  5E                    C		pop	si			;AN000;
 04B3  C3                    C		ret				;AN000;
 04B4                        C	$P_Do_CAPS_String endp			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-37
DOS - Message Retriever - MSGSTR.INC Module                 

			     C	PAGE					;AN000;
			     C	;***********************************************************************
			     C	; $P_Do_CAPS_Char;
			     C	;
			     C	; Function: Perform capitalization along with the file case map table
			     C	;	    or character case map table.
			     C	;
			     C	; Input:    DL = 2 : Use character table
			     C	;	    DL = 4 : Use file table
			     C	;	    AL = character to be capitalized
			     C	;
			     C	; Output:   None
			     C	;
			     C	; Use:	INT 21h /w AH=65h
			     C	;***********************************************************************
 04B4                        C	$P_Do_CAPS_Char proc			;AN000;
 04B4  3C 80                 C		cmp	al,$P_ASCII80		;AN000; need upper case table ?
 04B6  73 0C                 C		jae	$P_DCC_Go		;AN000;
			     C	
 04B8  3C 61                 C		cmp	al,"a"                  ;AN000; if no,
 04BA  72 3C                 C		jb	$P_CAPS_Ret		;AN000;   check if  "a" <= AL <= "z"
			     C	
 04BC  3C 7A                 C		cmp	al,"z"                  ;AN000;
 04BE  77 38                 C		ja	$P_CAPS_Ret		;AN000;   if yes, make CAPS
			     C	
 04C0  24 DF                 C		and	al,$P_Make_Upper	;AN000;   else do nothing.
 04C2  EB 34                 C		jmp	short $P_CAPS_Ret	;AN000;
			     C	
 04C4                        C	$P_DCC_Go:				;AN000;
 04C4  53                    C		push	bx			;AN000;
 04C5  06                    C		push	es			;AN000;
 04C6  57                    C		push	di			;AN000;
 04C7  8D 3E 0142 R          C		lea	di,psdata_seg:$P_Char_CAP_Ptr ;AC034; or use char CAPS table ?
 04CB                        C	$P_DCC00:				;AN000;
 04CB  2E: 38 15             C		cmp	psdata_seg:[di],dl	;AN000; already got table address ?
 04CE  74 17                 C		je	$P_DCC01		;AN000; if no,
			     C	
			     C	;In this next section, ES will be used to pass a 5 byte workarea to INT 21h,
			     C	; the GET COUNTYRY INFO call.  This usage of ES is required by the function
			     C	; call, regardless of what base register is currently be defined as PSDATA_SEG.
			     C	;BASESW EQU 0 means that ES is the psdata_seg reg.
			     C	
			     C	
 04D0  50                    C		push	ax			;AN000; get CAPS table thru DOS call
 04D1  51                    C		push	cx			;AN000;
 04D2  52                    C		push	dx			;AN000;
			     C	
			     C	
 04D3  0E                    C		push	PSDATA_SEG		;AC036; pass current base seg into
			     C						;(Note: this used to push CS.  BUG...
 04D4  07                    C		pop	es			;AN000;   ES reg, required for
			     C						;get extended country information
 04D5  B4 65                 C		mov	ah,$P_DOS_Get_TBL	;AN000; get extended CDI
 04D7  8A C2                 C		mov	al,dl			;AN000; upper case table
 04D9  BB FFFF               C		mov	bx,$P_DOSTBL_Def	;AN000; get active CON
 04DC  B9 0005               C		mov	cx,$P_DOSTBL_BL 	;AN000; buffer length
 04DF  BA FFFF               C		mov	dx,$P_DOSTBL_Def	;AN000; get for default code page
			     C						;DI already set to point to buffer
 04E2  CD 21                 C		int	21h			;AN000; es:di point to buffer that
			     C						;now has been filled in with info
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-38
DOS - Message Retriever - MSGSTR.INC Module                 

 04E4  5A                    C		pop	dx			;AN000;
 04E5  59                    C		pop	cx			;AN000;
 04E6  58                    C		pop	ax			;AN000;
 04E7                        C	$P_DCC01:				;AN000;
			     C	
			     C	;In this next section, ES will be used as the base of the XLAT table, provided
			     C	; by the previous GET COUNTRY INFO DOS call.  This usage of ES is made
			     C	; regardless of which base reg is currently the PSDATA_SEG reg.
			     C	
 04E7  2E: 8B 5D 01          C		mov	bx,psdata_seg:[di+$P_DOS_TBL_Off] ;AN000; get offset of table
 04EB  2E: 8E 45 03          C		mov	es,psdata_seg:[di+$P_DOS_TBL_Seg] ;AN000; get segment of table
 04EF  43                    C		inc	bx			;AC035; add '2' to
 04F0  43                    C		inc	bx			;AC035;  BX reg
			     C						;AN000; skip length field
			     C	;(changed ;AN035;) add	   bx,word	;AN000; skip length field
 04F1  2C 80                 C		sub	al,$P_ASCII80		;AN000; make char to index
 04F3  26: D7                C		xlat	es:[bx] 		;AN000; perform case map
			     C	
 04F5  5F                    C		pop	di			;AN000;
 04F6  07                    C		pop	es			;AN000;
 04F7  5B                    C		pop	bx			;AN000;
 04F8                        C	$P_CAPS_Ret:				;AN000;
 04F8  C3                    C		ret				;AN000;
 04F9                        C	$P_Do_CAPS_Char endp			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-39
DOS - Message Retriever - MSGSTR.INC Module                 

			     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:SI and see value list
			     C	;	     and make result buffer.
			     C	;	     $P_SValue is an entry point for the 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	;***********************************************************************
 04F9                        C	$P_SValue proc				;AN000; when signed value here
 04F9  50                    C		push	ax			;AN000;
 04FA  2E: 80 0E 00B9 R 80   C		or	psdata_seg:$P_Flags2,$P_Signed	    ;AC034; indicate a signed numeric
 0500  2E: 80 26 00B9 R FD   C		and	psdata_seg:$P_Flags2,0ffh-$P_Neg  ;AC034; assume positive value
 0506  2E: 8A 04             C		mov	al,psdata_seg:[si]	;AN000; get sign
 0509  3C 2B                 C		cmp	al,$P_Plus		;AN000; "+" ?
 050B  74 0A                 C		je	$P_SVal00		;AN000;
			     C	
 050D  3C 2D                 C		cmp	al,$P_Minus		;AN000; "-" ?
 050F  75 07                 C		jne	$P_Sval01		;AN000; else
			     C	
 0511  2E: 80 0E 00B9 R 02   C		or	psdata_seg:$P_Flags2,$P_Neg ;AC034; set this is negative value
 0517                        C	$P_SVal00:				;AN000;
 0517  46                    C		inc	si			;AN000; skip sign char
 0518                        C	$P_Sval01:				;AN000;
 0518  E8 051D R             C		call	$P_Value		;AN000; and process value
 051B  58                    C		pop	ax			;AN000;
 051C  C3                    C		ret				;AN000;
 051D                        C	$P_SValue endp				;AN000;
			     C	;***********************************************************************
 051D                        C	$P_Value proc				;AN000;
 051D  50                    C		push	ax			;AN000;
 051E  51                    C		push	cx			;AN000;
 051F  52                    C		push	dx			;AN000;
 0520  56                    C		push	si			;AN000;
 0521  33 C9                 C		xor	cx,cx			;AN000; cx = higher 16 bits
 0523  33 D2                 C		xor	dx,dx			;AN000; dx = lower 16 bits
 0525  53                    C		push	bx			;AN000; save control pointer
 0526                        C	$P_Value_Loop:				;AN000;
 0526  2E: 8A 04             C		mov	al,psdata_seg:[si]	;AN000; get character
 0529  0A C0                 C		or	al,al			;AN000; end of line ?
 052B  74 42                 C		je	$P_Value00		;AN000;
			     C	
 052D  E8 064C R             C		call	$P_0099 		;AN000; make asc(0..9) to bin(0..9)
 0530  72 39                 C		jc	$P_Value_Err0		;AN000;
			     C	
 0532  32 E4                 C		xor	ah,ah			;AN000;
 0534  8B E8                 C		mov	bp,ax			;AN000; save binary number
 0536  D1 E2                 C		shl	dx,1			;AN000; to have 2*x
 0538  D1 D1                 C		rcl	cx,1			;AN000; shift left w/ carry
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-40
DOS - Message Retriever - MSGSTR.INC Module                 

 053A  E8 063A R             C		call	$P_Check_OVF		;AN000; Overflow occurred ?
 053D  72 2C                 C		jc	$P_Value_Err0		;AN000; then error, exit
			     C	
 053F  8B DA                 C		mov	bx,dx			;AN000; save low(2*x)
 0541  8B C1                 C		mov	ax,cx			;AN000; save high(2*x)
 0543  D1 E2                 C		shl	dx,1			;AN000; to have 4*x
 0545  D1 D1                 C		rcl	cx,1			;AN000; shift left w/ carry
 0547  E8 063A R             C		call	$P_Check_OVF		;AN000; Overflow occurred ?
 054A  72 1F                 C		jc	$P_Value_Err0		;AN000; then error, exit
			     C	
 054C  D1 E2                 C		shl	dx,1			;AN000; to have 8*x
 054E  D1 D1                 C		rcl	cx,1			;AN000; shift left w/ carry
 0550  E8 063A R             C		call	$P_Check_OVF		;AN000; Overflow occurred ?
 0553  72 16                 C		jc	$P_Value_Err0		;AN000; then error, exit
			     C	
 0555  03 D3                 C		add	dx,bx			;AN000; now have 10*x
 0557  13 C8                 C		adc	cx,ax			;AN000; 32bit ADD
 0559  E8 063A R             C		call	$P_Check_OVF		;AN000; Overflow occurred ?
 055C  72 0D                 C		jc	$P_Value_Err0		;AN000; then error, exit
			     C	
 055E  03 D5                 C		add	dx,bp			;AN000; Add the current one degree decimal
 0560  83 D1 00              C		adc	cx,0			;AN000; if carry, add 1 to high 16bit
 0563  E8 063A R             C		call	$P_Check_OVF		;AN000; Overflow occurred ?
 0566  72 03                 C		jc	$P_Value_Err0		;AN000; then error, exit
			     C	
 0568  46                    C		inc	si			;AN000; update pointer
 0569  EB BB                 C		jmp	short $P_Value_Loop	;AN000; loop until NULL encountered
			     C	;
 056B                        C	$P_Value_Err0:				;AN000;
 056B  5B                    C		pop	bx			;AN000;
 056C  E9 0627 R             C		jmp	$P_Value_Err		;AN000; Bridge
			     C	;
 056F                        C	$P_Value00:				;AN000;
 056F  5B                    C		pop	bx			;AN000; restore control pointer
 0570  2E: F6 06 00B9 R 02   C		test	psdata_seg:$P_Flags2,$P_Neg ;AC034; here cx,dx = 32bit value
 0576  74 0A                 C		je	$P_Value01		;AN000; was it negative ?
			     C	
 0578  F7 D1                 C		not	cx			;AN000; +
 057A  F7 D2                 C		not	dx			;AN000; |- Make 2's complement
 057C  83 C2 01              C		add	dx,1			;AN000; |
 057F  83 D1 00              C		adc	cx,0			;AN000; +
 0582                        C	$P_Value01:				;AN000; / nval =0
 0582  26: 8B 77 06          C		mov	si,es:[bx].$P_Value_List ;AN000; si points to value list
 0586  26: 8A 04             C		mov	al,es:[si]		;AN000; get nval
 0589  3C 00                 C		cmp	al,$P_nval_None 	;AN000; no value list ?
 058B  75 07                 C		jne	$P_Value02		;AN000;
			     C	
 058D  B0 01                 C		mov	al,$P_Number		;AN000; Set type
 058F  B4 FF                 C		mov	ah,$P_No_Tag		;AN000; No ITEM_TAG set
 0591  E9 0632 R             C		jmp	$P_Value_Exit		;AN000;
			     C	
 0594                        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	
 0594  46                    C		inc	si			;AN000;
 0595  26: 8A 04             C		mov	al,es:[si]		;AN000; al = number of range
 0598  3C 00                 C		cmp	al,$P_No_nrng		;AN000; (tm07)
 059A  74 60                 C		je	$P_Value03		;AN000; (tm07)
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-41
DOS - Message Retriever - MSGSTR.INC Module                 

			     C	
 059C  46                    C		inc	si			;AN000; si points to 1st item_tag
 059D                        C	$P_Val02_Loop:				;AN000;
 059D  2E: F6 06 00B9 R 80   C		test	psdata_seg:$P_Flags2,$P_Signed ;AC034;
 05A3  75 1E                 C		jne	$P_Val02_Sign		;AN000;
			     C	
 05A5  26: 3B 4C 03          C		cmp	cx,es:[si+$P_Val_XH]	;AN000; comp cx with XH
 05A9  72 36                 C		jb	$P_Val02_Next		;AN000;
			     C	
 05AB  77 06                 C		ja	$P_Val_In		;AN000;
			     C	
 05AD  26: 3B 54 01          C		cmp	dx,es:[si+$P_Val_XL]	;AN000; comp dx with XL
 05B1  72 2E                 C		jb	$P_Val02_Next		;AN000;
			     C	
 05B3                        C	$P_Val_In:				;AN000;
			     C	;;;;;;	cmp	cx,es:$P_Val_YH]	; comp cx with YH (tm01)
 05B3  26: 3B 4C 07          C		cmp	cx,es:[si+$P_Val_YH]	;AN000; comp cx with YH (tm01)
 05B7  77 28                 C		ja	$P_Val02_Next		;AN000;
			     C	
 05B9  72 3A                 C		jb	$P_Val_Found		;AN000;
			     C	
 05BB  26: 3B 54 05          C		cmp	dx,es:[si+$P_Val_YL]	;AN000; comp dx with YL
 05BF  77 20                 C		ja	$P_Val02_Next		;AN000;
			     C	
 05C1  EB 32                 C		jmp	short $P_Val_Found	;AN000;
			     C	
 05C3                        C	$P_Val02_Sign:				;AN000;
 05C3  26: 3B 4C 03          C		cmp	cx,es:[si+$P_Val_XH]	;AN000; comp cx with XH
 05C7  7C 18                 C		jl	$P_Val02_Next		;AN000;
			     C	
 05C9  7F 06                 C		jg	$P_SVal_In		;AN000;
			     C	
 05CB  26: 3B 54 01          C		cmp	dx,es:[si+$P_Val_XL]	;AN000; comp dx with XL
 05CF  7C 10                 C		jl	$P_Val02_Next		;AN000;
			     C	
 05D1                        C	$P_SVal_In:				;AN000;
 05D1  26: 3B 4C 07          C		cmp	cx,es:[si+$P_Val_YH]	;AN000; comp cx with YH
 05D5  7F 0A                 C		jg	$P_Val02_Next		;AN000;
			     C	
 05D7  7C 1C                 C		jl	$P_Val_Found		;AN000;
			     C	
 05D9  26: 3B 54 05          C		cmp	dx,es:[si+$P_Val_YL]	;AN000; comp dx with YL
 05DD  7F 02                 C		jg	$P_Val02_Next		;AN000;
			     C	
 05DF  EB 14                 C		jmp	short $P_Val_Found	;AN000;
			     C	
 05E1                        C	$P_Val02_Next:				;AN000;
 05E1  83 C6 09              C		add	si,$P_Len_Range 	;AN000;
 05E4  FE C8                 C		dec	al			;AN000; loop nrng times in AL
 05E6  75 B5                 C		jne	$P_Val02_Loop		;AN000;
			     C						; / Not found
 05E8  2E: C7 06 00AD R 0006 C		mov	psdata_seg:$P_RC,$P_Out_of_Range ;AC034;
 05EF  B0 01                 C		mov	al,$P_Number		;AN000;
 05F1  B4 FF                 C		mov	ah,$P_No_Tag		;AN000; No ITEM_TAG set
 05F3  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)
 05F5                        C	$P_Val_Found:				;AN000;
 05F5  B0 01                 C		mov	al,$P_Number		;AN000;
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-42
DOS - Message Retriever - MSGSTR.INC Module                 

 05F7  26: 8A 24             C		mov	ah,es:[si]		;AN000; found ITEM_TAG set
 05FA  EB 36                 C		jmp	short $P_Value_Exit	;AN000;
			     C	
			     C	ENDIF					;AN000;(of Val1SW+Val2SW)
 05FC                        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
 05FC  B4 09                 C		mov	ah,$P_Len_Range 	;AN000;
 05FE  F6 E4                 C		mul	ah			;AN000;  Skip nrng field
 0600  40                    C		inc	ax			;AN000;
 0601  03 F0                 C		add	si,ax			;AN000; si points to nnval
 0603  26: 8A 04             C		mov	al,es:[si]		;AN000; get nnval
 0606  46                    C		inc	si			;AN000; si points to 1st item_tag
 0607                        C	$P_Val03_Loop:				;AN000;
 0607  26: 3B 4C 03          C		cmp	cx,es:[si+$P_Val_XH]	;AN000; comp cx with XH
 060B  75 06                 C		jne	$P_Val03_Next		;AN000;
			     C	
 060D  26: 3B 54 01          C		cmp	dx,es:[si+$P_Val_XL]	;AN000; comp dx with XL
 0611  74 E2                 C		je	$P_Val_Found		;AN000;
			     C	
 0613                        C	$P_Val03_Next:				;AN000;
 0613  83 C6 05              C		add	si,$P_Len_Value 	;AN000; points to next value choice
 0616  FE C8                 C		dec	al			;AN000; loop nval times in AL
 0618  75 ED                 C		jne	$P_Val03_Loop		;AN000;
			     C						;AN000; / Not found
 061A  2E: C7 06 00AD R 0007 C		mov	psdata_seg:$P_RC,$P_Not_in_Val ;AC034;
 0621  B0 01                 C		mov	al,$P_Number		;AN000;
 0623  B4 FF                 C		mov	ah,$P_No_Tag		;AN000; No ITEM_TAG set
 0625  EB 0B                 C		jmp	short $P_Value_Exit	;AN000;
			     C	
			     C	ENDIF					;AN000;(of Val2SW)
 0627                        C	$P_Value04:				;AN000; / nval = 3 or else
 0627                        C	$P_Value_Err:				;AN000;
 0627  2E: C7 06 00AD R 0009 C		mov	psdata_seg:$P_RC,$P_Syntax ;AC034;
 062E  B0 03                 C		mov	al,$P_String		;AN000; Set type
 0630  B4 FF                 C		mov	ah,$P_No_Tag		;AN000; No ITEM_TAG set
 0632                        C	$P_Value_Exit:				;AN000;
 0632  E8 0369 R             C		call	$P_Fill_Result		;AN000;
 0635  5E                    C		pop	si			;AN000;
 0636  5A                    C		pop	dx			;AN000;
 0637  59                    C		pop	cx			;AN000;
 0638  58                    C		pop	ax			;AN000;
 0639  C3                    C		ret				;AN000;
 063A                        C	$P_Value endp				;AN000;
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-43
DOS - Message Retriever - MSGSTR.INC Module                 

			     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	;***********************************************************************
 063A                        C	$P_Check_OVF proc			;AN000;
 063A  9C                    C		pushf				;AN000;
 063B  2E: F6 06 00B9 R 02   C		test	psdata_seg:$P_Flags2,$P_Neg ;AC034; is it negative value ?
 0641  75 02                 C		jne	$P_COVF 		;AN000; if no, check overflow
			     C	
 0643  9D                    C		popf				;AN000; by the CY bit
 0644  C3                    C		ret				;AN000;
			     C	
 0645                        C	$P_COVF:				;AN000;
 0645  9D                    C		popf				;AN000; else,
 0646  70 02                 C		jo	$P_COVF00		;AN000; check overflow by the OF
			     C	
 0648  F8                    C		clc				;AN000; indicate it with CY bit
 0649  C3                    C		ret				;AN000; CY=0 means no overflow
			     C	
 064A                        C	$P_COVF00:				;AN000;
 064A  F9                    C		stc				;AN000; and CY=1 means overflow
 064B  C3                    C		ret				;AN000;
 064C                        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
			     C	;	     CY = 0 : AL contains binary value
			     C	;***********************************************************************
 064C                        C	$P_0099 proc				;AN000;
 064C  3C 30                 C		cmp	al,"0"                  ;AN000;
 064E  72 08                 C		jb	$P_0099Err		;AN000;  must be 0 =< al =< 9
			     C	
 0650  3C 39                 C		cmp	al,"9"                  ;AN000;
 0652  77 04                 C		ja	$P_0099Err		;AN000;  must be 0 =< al =< 9
			     C	
 0654  2C 30                 C		sub	al,"0"                  ;AN000; make char -> bin
 0656  F8                    C		clc				;AN000; indicate no error
 0657  C3                    C		ret				;AN000;
			     C	
 0658                        C	$P_0099Err:				;AN000;
 0658  F9                    C		stc				;AN000; indicate error
 0659  C3                    C		ret				;AN000;
 065A                        C	$P_0099 endp				;AN000;
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-44
DOS - Message Retriever - MSGSTR.INC Module                 

			     C	PAGE					;AN000;
			     C	;***********************************************************************
			     C	; $P_Simple_String
			     C	;
			     C	; Function:  See value list for the simple string
			     C	;	     and make result buffer.
			     C	;
			     C	; Input:     psdata_seg:SI -> $P_STRING_BUF
			     C	;	     ES:BX -> CONTROL block
			     C	;
			     C	; Output:    None
			     C	;
			     C	; Use:	$P_Fill_Result, $P_String_Comp
			     C	;
			     C	; Vars: $P_RC(W)
			     C	;***********************************************************************
 065A                        C	$P_Simple_String proc			;AN000;
 065A  50                    C		push	ax			;AN000;
 065B  53                    C		push	bx			;AN000;
 065C  52                    C		push	dx			;AN000;
 065D  57                    C		push	di			;AN000;
 065E  26: 8B 7F 06          C		mov	di,es:[bx].$P_Value_List ;AN000; di points to value list
 0662  26: 8A 05             C		mov	al,es:[di]		;AN000; get nval
 0665  0A C0                 C		or	al,al			;AN000; no value list ?
 0667  75 04                 C		jne	$P_Sim00		;AN000; then
			     C	
 0669  B4 FF                 C		mov	ah,$P_No_Tag		;AN000; No ITEM_TAG set
 066B  EB 09                 C		jmp	short $P_Sim_Exit	;AN000; and set result buffer
			     C	
 066D                        C	$P_Sim00:				;AN000;
 066D                        C	$P_Sim01:				;AN000;
 066D  2E: C7 06 00AD R 0009 C		mov	psdata_seg:$P_RC,$P_Syntax ;AC034;
 0674  B4 FF                 C		mov	ah,$P_No_Tag		;AN000; No ITEM_TAG set
 0676                        C	$P_Sim_Exit:				;AN000;
 0676  B0 03                 C		mov	al,$P_String		;AN000; Set type
 0678                        C	$P_Sim_Exit0:				;AN000;
 0678  E8 0369 R             C		call	$P_Fill_Result		;AN000;
 067B  5F                    C		pop	di			;AN000;
 067C  5A                    C		pop	dx			;AN000;
 067D  5B                    C		pop	bx			;AN000;
 067E  58                    C		pop	ax			;AN000;
 067F  C3                    C		ret				;AN000;
 0680                        C	$P_Simple_String endp			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-45
DOS - Message Retriever - MSGSTR.INC Module                 

			     C	PAGE					;AN000;
			     C	;***********************************************************************
			     C	; $P_String_Comp:
			     C	;
			     C	; Function:  Compare two string
			     C	;
			     C	; Input:     psdata_seg:SI -> 1st string
			     C	;	     ES:BP -> 2nd string  (Must be upper case)
			     C	;	     ES:BX -> CONTROL block
			     C	;
			     C	; Output:    CY = 1 if not match
			     C	;
			     C	; Use:	$P_Chk_DBCS, $P_Do_CAPS_Char
			     C	;
			     C	; Vars: $P_KEYor_SW_Ptr(W), $P_Flags(R). $P_KEYorSW_Ptr
			     C	;***********************************************************************
 0680                        C	$P_String_Comp proc			;AN000;
 0680  50                    C		push	ax			;AN000;
 0681  55                    C		push	bp			;AN000;
 0682  52                    C		push	dx			;AN000;
 0683  56                    C		push	si			;AN000;
 0684  B2 02                 C		mov	dl,$P_DOSTBL_Char	;AN000; use character case map table
 0686                        C	$P_SCOM_Loop:				;AN000;
 0686  2E: 8A 04             C		mov	al,psdata_seg:[si]	;AN000; get command character
 0689  E8 07FE R             C		call	$P_Chk_DBCS		;AN000; DBCS ?
 068C  72 3C                 C		jc	$P_SCOM00		;AN000; yes,DBCS
			     C	
 068E  E8 04B4 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)
 0691  2E: F6 06 00B9 R 08   C		test	psdata_seg:$P_Flags2,$P_Key_Cmp ;AC034; keyword search ?
 0697  74 0D                 C		je	$P_SCOM04		;AN000;
			     C	
 0699  3C 3D                 C		cmp	al,$P_Keyword		;AN000; "=" is delimiter
 069B  75 1F                 C		jne	$P_SCOM03		;AN000;IF "=" on command line AND  (bp+1=> char after the "=
				" in synonym list)
			     C	
 069D  26: 80 7E 01 00       C		cmp	byte ptr es:[bp+1],$P_NULL ;AN021;   at end of keyword string in the control block T
				HEN
 06A2  75 71                 C		jne	$P_SCOM_DIFFER		;AN021;
			     C	
 06A4  EB 13                 C		jmp	short $P_SCOM05 	;AN000;   keyword found in synonym list
			     C	
 06A6                        C	$P_SCOM04:				;AN000;
 06A6  2E: F6 06 00B9 R 10   C		test	psdata_seg:$P_Flags2,$P_SW_Cmp ;AC034; switch search ?
 06AC  74 0E                 C		je	$P_SCOM03		;AN000;
			     C	
 06AE  3C 3A                 C		cmp	al,$P_Colon		;AN000; ":" is delimiter, at end of switch on command line
 06B0  75 0A                 C		jne	$P_SCOM03		;AN000; continue compares
			     C	
 06B2  26: 80 7E 00 00       C		cmp	byte ptr es:[bp],$P_NULL ;AN021; IF at end of switch on command AND
 06B7  75 5C                 C		jne	$P_SCOM_DIFFER		;AN021;   at end of switch string in the control block THEN
			     C	
 06B9                        C	$P_SCOM05:				;AN000;   found a match
 06B9  46                    C		inc	si			;AN000; si points to just after "=" or ":"
 06BA  EB 5C                 C		jmp	short $P_SCOM_Same	;AN000; exit
			     C	
 06BC                        C	$P_SCOM03:				;AN000;
			     C	ENDIF					;AN000;(of KeySW+SwSW)
 06BC  26: 3A 46 00          C		cmp	al,es:[bp]		;AN000; compare operand w/ a synonym
 06C0  75 1D                 C		jne	$P_SCOM_Differ0 	;AN000; if different, check ignore colon option
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-46
DOS - Message Retriever - MSGSTR.INC Module                 

			     C	
 06C2  0A C0                 C		or	al,al			;AN000; end of line
 06C4  74 52                 C		je	$P_SCOM_Same		;AN000; if so, exit
			     C	
 06C6  46                    C		inc	si			;AN000; update operand pointer
 06C7  45                    C		inc	bp			;AN000; 	   and synonym pointer
 06C8  EB 13                 C		jmp	short $P_SCOM01 	;AN000; loop until NULL or "=" or ":" found in case
			     C	
 06CA                        C	$P_SCOM00:				;AN000; Here al is DBCS leading byte
 06CA  26: 3A 46 00          C		cmp	al,es:[bp]		;AN000; compare leading byte
 06CE  75 45                 C		jne	$P_SCOM_Differ		;AN000; if not match, say different
			     C	
 06D0  46                    C		inc	si			;AN000; else, load next byte
 06D1  2E: 8A 04             C		mov	al,psdata_seg:[si]	;AN000; and
 06D4  45                    C		inc	bp			;AN000;
 06D5  26: 3A 46 00          C		cmp	al,es:[bp]		;AN000; compare 2nd byte
 06D9  75 3A                 C		jne	$P_SCOM_Differ		;AN000; if not match, say different, too
			     C	
 06DB  46                    C		inc	si			;AN000; else update operand pointer
 06DC  45                    C		inc	bp			;AN000; 		and synonym pointer
 06DD                        C	$P_SCOM01:				;AN000;
 06DD  EB A7                 C		jmp	short $P_SCOM_Loop	;AN000; loop until NULL or "=" or "/" found in case
			     C	
 06DF                        C	$P_SCOM_Differ0:			;AN000;
			     C	
			     C	IF	SwSW				;AN000;(tm10)
 06DF  2E: F6 06 00B9 R 40   C		test	psdata_seg:$P_Flags2,$P_SW ;AC034;(tm10)
 06E5  74 0F                 C		je	$P_not_applicable	;AN000;(tm10)
			     C	
 06E7  26: F7 47 02 0020     C		test	es:[bx].$P_Function_Flag,$P_colon_is_not_necessary ;AN000;(tm10)
 06ED  74 07                 C		je	$P_not_applicable	;AN000;(tm10)
			     C	
 06EF  26: 80 7E 00 00       C		cmp	byte ptr es:[bp],$P_NULL ;AN000;(tm10)
			     C	;(deleted ;AN025;) jne $P_not_applicable ;AN000;(tm10)
 06F4  74 22                 C		je	$P_SCOM_Same		;AN025;(tm10)
			     C	
 06F6                        C	$P_not_applicable:			;AN000;(tm10)
			     C	ENDIF					;AN000;(tm10)
			     C	
 06F6  26: F7 07 0010        C		test	es:[bx].$P_Match_Flag,$P_Ig_Colon ;AN000; ignore colon option specified ?
 06FB  74 18                 C		je	$P_SCOM_Differ		;AN000; if no, say different.
			     C	
 06FD  3C 3A                 C		cmp	al,$P_Colon		;AN000; End up with ":" and
 06FF  75 09                 C		jne	$P_SCOM02		;AN000;    subseqently
			     C	
 0701  26: 80 7E 00 00       C		cmp	byte ptr es:[bp],$P_NULL ;AN000;       NULL ?
 0706  75 0D                 C		jne	$P_SCOM_Differ		;AN000; if no, say different
			     C	
 0708  EB 0E                 C		jmp	short $p_SCOM_Same	;AN000; else, say same
			     C	
 070A                        C	$P_SCOM02:				;AN000;
 070A  3C 00                 C		cmp	al,$P_NULL		;AN000; end up NULL and :
 070C  75 07                 C		jne	$P_SCOM_Differ		;AN000;
			     C	
 070E  26: 80 7E 00 3A       C		cmp	byte ptr es:[bp],$P_Colon ;AN000; if no, say different
 0713  74 03                 C		je	$p_SCOM_Same		;AN000; else, say same
			     C	
 0715                        C	$P_SCOM_Differ: 			;AN000;
 0715  F9                    C		stc				;AN000; indicate not found
 0716  EB 06                 C		jmp	short $P_SCOM_Exit	;AN000;
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-47
DOS - Message Retriever - MSGSTR.INC Module                 

			     C	
 0718                        C	$P_SCOM_Same:				;AN000;
 0718  2E: 89 36 00BC R      C		mov	psdata_seg:$P_KEYorSW_Ptr,si ;AC034; for later use by keyword or switch
 071D  F8                    C		clc				;AN000; indicate found
 071E                        C	$P_SCOM_Exit:				;AN000;
 071E  5E                    C		pop	si			;AN000;
 071F  5A                    C		pop	dx			;AN000;
 0720  5D                    C		pop	bp			;AN000;
 0721  58                    C		pop	ax			;AN000;
 0722  C3                    C		ret				;AN000;
 0723                        C	$P_String_Comp endp			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-48
DOS - Message Retriever - MSGSTR.INC Module                 

			     C	PAGE					;AN000;
			     C	;***********************************************************************
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-49
DOS - Message Retriever - MSGSTR.INC Module                 

			     C	PAGE					;AN000;
			     C	;***********************************************************************
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-50
DOS - Message Retriever - MSGSTR.INC Module                 

			     C	PAGE					;AN000;
			     C	;***********************************************************************
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-51
DOS - Message Retriever - MSGSTR.INC Module                 

			     C	PAGE					;AN000;
			     C	;***********************************************************************
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-52
DOS - Message Retriever - MSGSTR.INC Module                 

			     C	PAGE					;AN000;
			     C	;***********************************************************************
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-53
DOS - Message Retriever - MSGSTR.INC Module                 

			     C	PAGE					;AN000;
			     C	;***********************************************************************
			     C	; $P_Chk_DSQuote;
			     C	;
			     C	; Function: Check if AL is double quotation or single quotation
			     C	;
			     C	; Input:    AL = byte to be examineed
			     C	;
			     C	; Output:   ZF on if AL is single or double quotetaion
			     C	;
			     C	; Vars:  $P_SorD_Quote(W)
			     C	;***********************************************************************
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-54
DOS - Message Retriever - MSGSTR.INC Module                 

			     C	PAGE					;AN000;
			     C	;***********************************************************************
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-55
DOS - Message Retriever - MSGSTR.INC Module                 

			     C	PAGE					;AN000;
			     C	;***********************************************************************
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-56
DOS - Message Retriever - MSGSTR.INC Module                 

			     C	PAGE					;AN000;
			     C	;***********************************************************************
			     C	; $P_Skip_Delim;
			     C	;
			     C	; Function: Skip delimiters specified in the PARMS list, white space
			     C	;	    and comma.
			     C	;
			     C	; Input:    DS:SI -> Command String
			     C	;	    ES:DI -> Parameter List
			     C	;
			     C	; Output:   CY = 1 if the end of line encounterd
			     C	;	    CY = 0 then SI move to 1st non-delimiter character
			     C	;	    AL = Last examineed character
			     C	;
			     C	; Use:	    $P_Chk_EOL, $P_Chk_Delim,
			     C	;
			     C	; Vars:     $P_Flags(R)
			     C	;***********************************************************************
 0723                        C	$P_Skip_Delim proc			;AN000;
 0723                        C	$P_Skip_Delim_Loop:			;AN000;
 0723  AC                    C		LODSB				;AN000;
 0724  E8 0749 R             C		call	$P_Chk_EOL		;AN000; is it EOL character ?
 0727  74 18                 C		je	$P_Skip_Delim_CY	;AN000; if yes, exit w/ CY on
			     C	
 0729  E8 077F R             C		call	$P_Chk_Delim		;AN000; is it one of delimiters ?
 072C  75 16                 C		jne	$P_Skip_Delim_NCY	;AN000; if no, exit w/ CY off
			     C	
 072E  2E: F6 06 00B9 R 20   C		test	psdata_seg:$P_Flags2,$P_Extra ;AC034; extra delim or comma found ?
 0734  74 ED                 C		je	$P_Skip_Delim_Loop	;AN000; if no, loop
			     C	
 0736  2E: F6 06 00B9 R 41   C		test	psdata_seg:$P_Flags2,$P_SW+$P_equ ;AC034; /x , or xxx=zzz , (tm08)
 073C  74 09                 C		je	short $P_Exit_At_Extra	;AN000; no switch, no keyword (tm08)
			     C	
 073E  4E                    C		dec	si			;AN000; backup si for next call (tm08)
 073F  EB 06                 C		jmp	short $P_Exit_At_Extra	;AN000; else exit w/ CY off
			     C	
 0741                        C	$P_Skip_Delim_CY:			;AN000;
 0741  F9                    C		stc				;AN000; indicate EOL
 0742  EB 01                 C		jmp	short $P_Skip_Delim_Exit ;AN000;
			     C	
 0744                        C	$P_Skip_Delim_NCY:			;AN000;
 0744  F8                    C		clc				;AN000; indicate non delim
 0745                        C	$P_Skip_Delim_Exit:			;AN000; in this case, need
 0745  4E                    C		dec	si			;AN000;  backup index pointer
 0746  C3                    C		ret				;AN000;
			     C	
 0747                        C	$P_Exit_At_Extra:			;AN000;
 0747  F8                    C		clc				;AN000; indicate extra delim
 0748  C3                    C		ret				;AN000;
 0749                        C	$P_Skip_Delim endp			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-57
DOS - Message Retriever - MSGSTR.INC Module                 

			     C	PAGE					;AN000;
			     C	;***********************************************************************
			     C	; $P_Chk_EOL;
			     C	;
			     C	; Function: Check if AL is one of End of Line characters.
			     C	;
			     C	; Input:    AL = character code
			     C	;	    ES:DI -> Parameter List
			     C	;
			     C	; Output:   ZF = 1 if one of End of Line characters
			     C	;**********************************************************************
 0749                        C	$P_Chk_EOL proc 			;AN000;
 0749  53                    C		push	bx			;AN000;
 074A  51                    C		push	cx			;AN000;
 074B  3C 0D                 C		cmp	al,$P_CR		;AN000; Carriage return ?
 074D  74 2D                 C		je	$P_Chk_EOL_Exit 	;AN000;
			     C	
 074F  3C 00                 C		cmp	al,$P_NULL		;AN000; zero ?
 0751  74 29                 C		je	$P_Chk_EOL_Exit 	;AN000;
			     C	
			     C	IF LFEOLSW				;AN028; IF LF TO BE ACCEPTED AS EOL
 0753  3C 0A                 C		cmp	al,$P_LF		;AN000; Line feed ?
 0755  74 25                 C		je	$P_Chk_EOL_Exit 	;AN000;
			     C	ENDIF					;AN028;
			     C	
 0757  26: 80 7D 02 02       C		cmp	byte ptr es:[di].$P_Num_Extra,$P_I_Have_EOL ;AN000; EOL character specified ?
 075C  72 1E                 C		jb	$P_Chk_EOL_Exit 	;AN000;
			     C	
 075E  33 DB                 C		xor	bx,bx			;AN000;
 0760  26: 8A 5D 03          C		mov	bl,es:[di].$P_Len_Extra_Delim ;AN000; get length of delimiter list
 0764  83 C3 04              C		add	bx,$P_Len_PARMS 	;AN000; skip it
 0767  26: 80 39 00          C		cmp	byte ptr es:[bx+di],$P_I_Use_Default ;AN000; No extra EOL character ?
 076B  74 0D                 C		je	$P_Chk_EOL_NZ		;AN000;
			     C	
 076D  33 C9                 C		xor	cx,cx			;AN000; Get number of extra chcracter
 076F  26: 8A 09             C		mov	cl,es:[bx+di]		;AN000;
 0772                        C	$P_Chk_EOL_Loop:			;AN000;
 0772  43                    C		inc	bx			;AN000;
 0773  26: 3A 01             C		cmp	al,es:[bx+di]		;AN000; Check extra EOL character
 0776  74 04                 C		je	$P_Chk_EOL_Exit 	;AN000;
			     C	
 0778  E2 F8                 C		loop	$P_Chk_EOL_Loop 	;AN000;
			     C	
 077A                        C	$P_Chk_EOL_NZ:				;AN000;
 077A  3C 0D                 C		cmp	al,$P_CR		;AN000; reset ZF
 077C                        C	$P_Chk_EOL_Exit:			;AN000;
 077C  59                    C		pop	cx			;AN000;
 077D  5B                    C		pop	bx			;AN000;
 077E  C3                    C		ret				;AN000;
 077F                        C	$P_Chk_EOL endp 			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-58
DOS - Message Retriever - MSGSTR.INC Module                 

			     C	PAGE					;AN000;
			     C	;***********************************************************************
			     C	; $P_Chk_Delim;
			     C	;
			     C	; Function: Check if AL is one of delimiter characters.
			     C	;	    if AL+[si] is DBCS blank, it is replaced with two SBCS
			     C	;	    blanks.
			     C	;
			     C	; Input:    AL = character code
			     C	;	    DS:SI -> Next Character
			     C	;	    ES:DI -> Parameter List
			     C	;
			     C	; Output:   ZF = 1 if one of delimiter characters
			     C	;	    SI points to the next character
			     C	; Vars:  $P_Terminator(W), $P_Flags(W)
			     C	;***********************************************************************
 077F                        C	$P_Chk_Delim proc			;AN000;
 077F  53                    C		push	bx			;AN000;
 0780  51                    C		push	cx			;AN000;
 0781  2E: C6 06 00B3 R 20   C		mov	psdata_seg:$P_Terminator,$P_Space   ;AC034; Assume terminated by space
 0787  2E: 80 26 00B9 R DF   C		and	psdata_seg:$P_Flags2,0ffh-$P_Extra ;AC034;
 078D  3C 20                 C		cmp	al,$P_Space		;AN000; Space ?
 078F  74 36                 C		je	$P_Chk_Delim_Exit	;AN000;
			     C	
 0791  3C 09                 C		cmp	al,$P_TAB		;AN000; TAB ?
 0793  74 32                 C		je	$P_Chk_Delim_Exit	;AN000;
			     C	
 0795  3C 2C                 C		cmp	al,$P_Comma		;AN000; Comma ?
 0797  74 31                 C		je	$P_Chk_Delim_Exit0	;AN000;
			     C	
 0799                        C	$P_Chk_Delim00: 			;AN000;
 0799  3C 81                 C		cmp	al,$P_DBSP1		;AN000; 1st byte of DBCS Space ?
 079B  75 0C                 C		jne	$P_Chk_Delim01		;AN000;
			     C	
 079D  80 3C 40              C		cmp	byte ptr [si],$P_DBSP2	;AN000; 2nd byte of DBCS Space ?
 07A0  75 07                 C		jne	$P_Chk_Delim01		;AN000;
			     C	
 07A2  B0 20                 C		mov	al,$P_Space		;AN000;
 07A4  46                    C		inc	si			;AN000; make si point to next character
 07A5  3A C0                 C		cmp	al,al			;AN000; Set ZF
 07A7  EB 1E                 C		jmp	short $P_Chk_Delim_Exit ;AN000;
			     C	
 07A9                        C	$P_Chk_Delim01: 			;AN000;
 07A9  26: 80 7D 02 01       C		cmp	byte ptr es:[di].$P_Num_Extra,$P_I_Have_Delim ;AN000; delimiter character specified 
				?
 07AE  72 17                 C		jb	$P_Chk_Delim_Exit	;AN000;
			     C	
 07B0  33 C9                 C		xor	cx,cx			;AN000;
 07B2  26: 8A 4D 03          C		mov	cl,es:[di].$P_Len_Extra_Delim ;AN000; get length of delimiter list
 07B6  0B C9                 C		or	cx,cx			;AN000; No extra Delim character ?
 07B8  74 0B                 C		je	$P_Chk_Delim_NZ 	;AN000;
			     C	
 07BA  BB 0003               C		mov	bx,$P_Len_PARMS-1	;AN000; set bx to 1st extra delimiter
 07BD                        C	$P_Chk_Delim_Loop:			;AN000;
 07BD  43                    C		inc	bx			;AN000;
 07BE  26: 3A 01             C		cmp	al,es:[bx+di]		;AN000; Check extra Delim character
 07C1  74 07                 C		je	$P_Chk_Delim_Exit0	;AN000;
			     C	
 07C3  E2 F8                 C		loop	$P_Chk_Delim_Loop	;AN000; examine all extra delimiter
			     C	
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-59
DOS - Message Retriever - MSGSTR.INC Module                 

 07C5                        C	$P_Chk_Delim_NZ:			;AN000;
 07C5  3C 20                 C		cmp	al,$P_Space		;AN000; reset ZF
 07C7                        C	$P_Chk_Delim_Exit:			;AN000;
			     C	;;;;	jne	$P_ChkDfin
			     C	;;;;	mov	psdata_seg:$P_Terminator,al ;AN034;
 07C7                        C	$P_ChkDfin:				;AN000;
 07C7  59                    C		pop	cx			;AN000;
 07C8  5B                    C		pop	bx			;AN000;
 07C9  C3                    C		ret				;AN000;
			     C	
 07CA                        C	$P_Chk_Delim_Exit0:			;AN000;
 07CA  2E: A2 00B3 R         C		mov	psdata_seg:$P_Terminator,al ;AC034; keep terminated delimiter
 07CE  2E: F6 06 00B9 R 01   C		test	psdata_seg:$P_Flags2,$P_Equ  ;AN027;AC034;; if terminating a key=
 07D4  75 06                 C		jnz	$P_No_Set_Extra 	;AN027; then do not set the EXTRA bit
			     C	
 07D6  2E: 80 0E 00B9 R 20   C		or	psdata_seg:$P_Flags2,$P_Extra ;AC034; flag terminated extra delimiter or comma
 07DC                        C	$P_No_Set_Extra:			;AN027;
 07DC  3A C0                 C		cmp	al,al			;AN000; set ZF
 07DE  EB E7                 C		jmp	short $P_Chk_Delim_Exit ;AN000;
			     C	
 07E0                        C	$P_Chk_Delim endp			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-60
DOS - Message Retriever - MSGSTR.INC Module                 

			     C	PAGE					;AN000;
			     C	;***********************************************************************
			     C	; $P_Chk_Switch;
			     C	;
			     C	; Function: Check if AL is the switch character not in first position of
			     C	;	    $P_STRING_BUF
			     C	;
			     C	; Input:    AL = character code
			     C	;	    BX = current pointer within $P_String_Buf
			     C	;	    SI =>next char on command line (following the one in AL)
			     C	;
			     C	; Output:   CF = 1 (set)if AL is switch character, and not in first
			     C	;		 position, and has no chance of being part of a date string,
			     C	;		 i.e. should be treated as a delimiter.
			     C	
			     C	;	    CF = 0 (reset, cleared) if AL is not a switch char, is in the first
			     C	;		 position, or is a slash but may be part of a date string, i.e.
			     C	;		 should not be treated as a delimiter.
			     C	;
			     C	; Vars:  $P_Terminator(W)
			     C	
			     C	; Use:	 $P_0099
			     C	;***********************************************************************
 07E0                        C	$P_Chk_Switch proc			;AN000;
			     C	
			     C	;AN020;; Function: Check if AL is the switch character from 2nd position of $P_STRING_BUF
			     C	;AN020;; Output:   ZF = 1 if switch character
			     C	;AN020;;	lea	bp,$P_STRING_BUF ;AN000;
			     C	;AN020;;	cmp	bx,bp		 ;AN000; 1st position ?
			     C	;AN020;;	je	$P_Chk_S_Exit_1  ;AN000;
			     C	;AN020;;	cmp	al,$P_Switch	 ;AN000;
			     C	;AN020;;	jmp	short $P_Chk_S_Exit_0  ;AN000;
			     C	;AN020;;$P_Chk_S_Exit_1:		       ;AN000;
			     C	;AN020;;	cmp	al,$P_Switch	 ;AN000; (tm08)
			     C	;AN020;;	jne	$P_Nop		;AN000; (tm08)
			     C	;AN020;;	or	$P_Flags2,$P_SW  ;AN000; (tm08) It could be valid switch
			     C	;AN020;;$P_Nop: 			;AN000; (tm08)
			     C	;AN020;;	inc	bp		       ;AN000;
			     C	;AN020;;	cmp	bx,bp		       ;AN000; reset ZF
			     C	;AN020;;$P_Chk_S_Exit_0:		       ;AN000;
			     C	;AN020;;	jne	$P_Chk_S_Exit	       ;AN000;
			     C	;AN020;;	mov	   $P_Terminator,al    ;AN000; store switch character
			     C	;AN020;;$P_Chk_S_Exit:			       ;AN000;
			     C	
 07E0  8D 2E 00C2 R          C		LEA	BP,psdata_seg:$P_String_Buf ;AN020;AC034; BP=OFFSET of $P_String_Buf even in group a
				ddressing
			     C	;	.IF <BX NE BP> THEN		;AN020;IF not first char THEN
 07E4  3B DD                 C		cmp	BX,BP			;AN000;
 07E6  74 0A                 C		je	$P_STRUC_L2		;AN000;
			     C	
			     C	;	    .IF <AL EQ $P_Switch> THEN	;AN020;otherwise see if a slash
 07E8  3C 2F                 C		    cmp     AL,$P_Switch	;AN000;
 07EA  75 03                 C		    jne     $P_STRUC_L5 	;AN000;
			     C	
 07EC  F9                    C			STC			;AN020;not in first position and is slash, now see if might 
				be in date string
			     C	;	    .ELSE			;AN020;
 07ED  EB 0E                 C		    jmp     short $P_STRUC_L1	;AN000;
			     C	
 07EF                        C	$P_STRUC_L5:				;AN000;
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-61
DOS - Message Retriever - MSGSTR.INC Module                 

 07EF  F8                    C			CLC			;AN020;not a slash
			     C	;	    .ENDIF			;AN020;
			     C	;	.ELSE				;AN020;is first char in the buffer, ZF=0
 07F0  EB 0B                 C		jmp	short $P_STRUC_L1	;AN000;
			     C	
 07F2                        C	$P_STRUC_L2:				;AN000;
			     C	;	    .IF <AL EQ $P_Switch> THEN	;AN020;
 07F2  3C 2F                 C		    cmp     AL,$P_Switch	;AN000;
 07F4  75 06                 C		    jne     $P_STRUC_L12	;AN000;
			     C	
 07F6  2E: 80 0E 00B9 R 40   C			OR	psdata_seg:$P_Flags2,$P_SW ;AN020;AC034;;could be valid switch, first char a
				nd is slash
			     C	;	    .ENDIF			;AN020;
 07FC                        C	$P_STRUC_L12:				;AN000;
 07FC  F8                    C		    CLC 			;AN020;CF=0 indicating first char
			     C	;	.ENDIF				;AN020;
 07FD                        C	$P_STRUC_L1:				;AN000;
			     C	
 07FD  C3                    C		ret				;AN000;
 07FE                        C	$P_Chk_Switch endp			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-62
DOS - Message Retriever - MSGSTR.INC Module                 

			     C		PAGE				;AN000;
			     C	;**************************************************************************
			     C	; $P_Chk_DBCS:
			     C	;
			     C	;  Function: Check if a specified byte is in ranges of the DBCS lead bytes
			     C	;
			     C	;  Input:
			     C	;	  AL	= Code to be examineed
			     C	;
			     C	;  Output:
			     C	;	  If CF is on then a lead byte of DBCS
			     C	;
			     C	; Use: INT 21h w/AH=63
			     C	;
			     C	; Vars:  $P_DBCSEV_Seg(RW), $P_DBCSEV_Off(RW)
			     C	;***************************************************************************
 07FE                        C	$P_Chk_DBCS PROC			;AN000;
			     C	;
 07FE  1E                    C		PUSH	DS			;AN000;
 07FF  56                    C		PUSH	SI			;AN000;
 0800  53                    C		PUSH	bx			;AN000; (tm11)
 0801  2E: 83 3E 00B6 R 00   C		CMP	psdata_seg:$P_DBCSEV_SEG,0 ;AC034; ALREADY SET ?
 0807  75 27                 C		JNE	$P_DBCS00		;AN000;
			     C	
 0809  50                    C		PUSH	AX			;AN000;
			     C	;	PUSH	BX			;AN000; (tm11)
 080A  1E                    C		PUSH	ds			;AN000; (tm11)
 080B  51                    C		PUSH	CX			;AN000;
 080C  52                    C		PUSH	DX			;AN000;
 080D  57                    C		PUSH	DI			;AN000;
 080E  55                    C		PUSH	BP			;AN000;
 080F  06                    C		PUSH	ES			;AN000;
 0810  33 F6                 C		XOR	SI,SI			;AN000;
 0812  8E DE                 C		MOV	DS,SI			;AN000;
 0814  B8 6300               C		MOV	AX,$P_DOS_GetEV 	;AN000; GET DBCS EV CALL
 0817  CD 21                 C		INT	21H			;AN000;
			     C	
			     C	;	MOV	AX,DS			;AN000; (tm11)
			     C	;	OR	AX,AX			;AN000; (tm11)
 0819  8C DB                 C		MOV	bx,DS			;AN000; (tm11)
 081B  0B DB                 C		OR	bx,bx			;AN000; (tm11)
 081D  07                    C		POP	ES			;AN000;
 081E  5D                    C		POP	BP			;AN000;
 081F  5F                    C		POP	DI			;AN000;
 0820  5A                    C		POP	DX			;AN000;
 0821  59                    C		POP	CX			;AN000;
			     C	;	POP	BX			;AN000; (tm11)
 0822  1F                    C		POP	ds			;AN000; (tm11)
 0823  58                    C		POP	AX			;AN000;
 0824  74 29                 C		JE	$P_NON_DBCS		;AN000;
			     C	
 0826                        C	$P_DBCS02:				;AN000;
 0826  2E: 89 36 00B4 R      C		MOV	psdata_seg:$P_DBCSEV_OFF,SI ;AC034; save EV offset
			     C	;	MOV	psdata_seg:$P_DBCSEV_SEG,DS ;AC034; save EV segment
 082B  2E: 89 1E 00B6 R      C		MOV	psdata_seg:$P_DBCSEV_SEG,bx ;AC034; save EV segment (tm11)
 0830                        C	$P_DBCS00:				;AN000;
 0830  2E: 8B 36 00B4 R      C		MOV	SI,psdata_seg:$P_DBCSEV_OFF ;AC034; load EV offset
 0835  2E: 8E 1E 00B6 R      C		MOV	DS,psdata_seg:$P_DBCSEV_SEG ;AC034; and segment
			     C	
 083A                        C	$P_DBCS_LOOP:				;AN000;
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-63
DOS - Message Retriever - MSGSTR.INC Module                 

 083A  83 3C 00              C		CMP	WORD PTR [SI],0 	;AN000; zero vector ?
 083D  74 10                 C		JE	$P_NON_DBCS		;AN000; then exit
			     C	
 083F  3A 04                 C		CMP	AL,[SI] 		;AN000;
 0841  72 08                 C		JB	$P_DBCS01		;AN000; Check if AL is in
			     C	
 0843  3A 44 01              C		CMP	AL,[SI+BYTE]		;AN000;   range of
 0846  77 03                 C		JA	$P_DBCS01		;AN000;      the vector
			     C	
 0848  F9                    C		STC				;AN000; if yes, indicate DBCS and exit
 0849  EB 05                 C		JMP	short $P_DBCS_EXIT	;AN000;
			     C	
 084B                        C	$P_DBCS01:				;AN000;
 084B  46                    C		INC	SI			;AC035; add '2' to
 084C  46                    C		INC	SI			;AC035;  SI reg
			     C						;AN000; get next vector
			     C	;(changed ;AC035;) ADD	   SI,2 	;AN000; get next vector
 084D  EB EB                 C		JMP	short $P_DBCS_LOOP	;AN000; loop until zero vector found
			     C	
 084F                        C	$P_NON_DBCS:				;AN000;
 084F  F8                    C		CLC				;AN000; indicate SBCS
 0850                        C	$P_DBCS_EXIT:				;AN000;
 0850  5B                    C		POP	bx			;AN000; (tm11)
 0851  5E                    C		POP	SI			;AN000;
 0852  1F                    C		POP	DS			;AN000;
 0853  C3                    C		RET				;AN000;
 0854                        C	$P_Chk_DBCS ENDP			;AN000;
				assume ds:code					;AN007;
				;.list
				;Control block definitions for PARSER.
				;---------------------------------------------------
 0854				Parms	label	byte
 0854  0857 R				dw	Parmsx		;AN000;
 0856  00				db	0		;AN000;No extras
				
 0857				Parmsx	label	byte		;AN000;
 0857  00 00				db	0,0		;AN000;No positionals
 0859  05				db	5		;AN000;5 switch control definitions
 085A  0865 R				dw	D_Control	;AN000;/D
 085C  0884 R				dw	T_Control	;AN000;/T
 085E  089B R				dw	HS_Control	;AN000;/H, /S
 0860  08B5 R				dw	CN_Control	;AN000;/C, /N
 0862  08C2 R				dw	F_Control	;AN000;/F
 0864  00				db	0		;AN000;no keywords
				
 0865				D_Control	label	word	;AN000;
 0865  8000				dw	8000h		;AN000;numeric value
 0867  0000				dw	0		;AN000;no functions
 0869  087C R				dw	Result_Val	;AN000;result buffer
 086B  0871 R				dw	D_Val		;AN000;value defintions
 086D  01				db	1		;AN000;# of switch in the following list
 086E				Switch_D	label	byte	;AN000;
 086E  2F 44 00				db	'/D',0          ;AN000;
				
 0871				D_Val	label	byte		;AN000;
 0871  01				db	1		;AN000;# of value defintions
 0872  01				db	1		;AN000;# of ranges
 0873  01				db	1		;AN000;Tag value when match
				;	 dd	 0,255		 ;AN000;
 0874  00000000 0000007F		dd	0,127		;AN001;Do not allow a Fixed disk.
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-64
DOS - Message Retriever - MSGSTR.INC Module                 

				
 087C				Result_Val	label	byte	;AN000;
 087C  00				db	?		;AN000;
 087D				Item_Tag	label	byte	;AN000;
 087D  00				db	?		;AN000;
 087E				Synonym_ptr	label	word	;AN000;
 087E  0000				dw	?		;AN000;es:offset -> found Synonym
 0880				RV_Byte 	label	byte	;AN000;
 0880				RV_Word 	label	word	;AN000;
 0880				RV_Dword	label	dword	;AN000;
 0880  00000000				dd	?		;AN000;value if number, or seg:off to string
				
 0884				T_Control	label	word	;AN000;
 0884  8000				dw	8000h		;AN000;numeric value
 0886  0000				dw	0		;AN000;no functions
 0888  087C R				dw	Result_Val	;AN000;result buffer
 088A  0890 R				dw	T_Val		;AN000;value defintions
 088C  01				db	1		;AN000;# of switch in the following list
 088D				Switch_T	label	byte	;AN000;
 088D  2F 54 00				db	'/T',0          ;AN000;
				
 0890				T_Val	label	byte		;AN000;
 0890  01				db	1		;AN000;# of value defintions
 0891  01				db	1		;AN000;# of ranges
 0892  01				db	1		;AN000;Tag value when match
 0893  00000001 000003E7		dd	1,999		;AN000;
				
 089B				HS_Control	label	word	;AN000;
 089B  8000				dw	8000h		;AN000;numeric value
 089D  0000				dw	0		;AN000;no function flag
 089F  087C R				dw	Result_Val	;AN000;Result_buffer
 08A1  08AA R				dw	HS_VAL		;AN000;value definition
 08A3  02				db	2		;AN000;# of switch in following list
 08A4				Switch_H	label	byte	;AN000;
 08A4  2F 48 00				db	'/H',0          ;AN000;
 08A7				Switch_S	label	byte	;AN000;
 08A7  2F 53 00				db	'/S',0          ;AN000;
				
 08AA				HS_Val	 label	 byte		;AN000;
 08AA  01				db	1		;AN000;# of value defintions
 08AB  01				db	1		;AN000;# of ranges
 08AC  01				db	1		;AN000;Tag value when match
 08AD  00000001 00000063		dd	1,99		;AN000;
				
 08B5				CN_Control	 label	 word	;AN000;
 08B5  0000				dw	0		;AN000;no match flags
 08B7  0000				dw	0		;AN000;no function flag
 08B9  087C R				dw	Result_Val	;AN000;no values returned
 08BB  08C1 R				dw	NoVal		;AN000;no value definition
				;	 db	 2		 ;AN000;# of switch in following list
 08BD  01				db	1		;AN001;
 08BE				Switch_C	label	byte	;AN000;
 08BE  2F 43 00				db	'/C',0          ;AN000;
				;Switch_N	 label	 byte	 ;AN000;
				;	 db	 '/N',0          ;AN000;
				
 08C1  00			Noval	db	0		;AN000;
				
 08C2				F_Control	label	word	;AN000;
 08C2  8000				dw	8000h		;AN000;numeric value
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-65
DOS - Message Retriever - MSGSTR.INC Module                 

 08C4  0000				dw	0		;AN000;no function flag
 08C6  087C R				dw	Result_Val	;AN000;Result_buffer
 08C8  08CE R				dw	F_VAL		;AN000;value definition
 08CA  01				db	1		;AN000;# of switch in following list
 08CB				Switch_F	label	byte	;AN000;
 08CB  2F 46 00				db	'/F',0          ;AN000;
				
 08CE				F_Val		label	byte	;AN000;
 08CE  02				db	2		;AN000;# of value definitions (Order dependent)
 08CF  00				db	0		;AN000;no ranges
 08D0  04				db	4		;AN000;# of numeric choices
 08D1				F_Choices	label	byte	;AN000;
 08D1  01				db	1		;AN000;1st choice (item tag)
 08D2  00000000				dd	0		;AN000;0
 08D6  02				db	2		;AN000;2nd choice
 08D7  00000001				dd	1		;AN000;1
 08DB  03				db	3		;AN000;3rd choice
 08DC  00000002				dd	2		;AN000;2
 08E0  04				db	4		;AN000;4th choice
 08E1  00000007				dd	7		;AN000;7
				
				
				;AN000;System messages handler data
				;AN000;Put the data here
				.sall
				MSG_SERVICES <MSGDATA>
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-66
DOS - Message Retriever - MSGRES.TAB Module                 

				
				;AN000;Place the messages here
				MSG_SERVICES <DRIVER.CL1, DRIVER.CL2, DRIVER.CLA>
				
				
				 public amis_sign
					even
 0B48				amis_sign:
 0B48  65 63 6D				db "ecm"
 0B4B  0005[				db 5 dup (' ')
	   20			
			 ]	
				
 0B50  6C 44 4F 53			db "lDOS"
 0B54  0004[				db 4 dup (' ')
	   20			
			 ]	
				
 0B58				amis_id:			; must be directly after amis_sign
 0B58  0000				dw 0
 0B5A  0000				dw 0			; sequential number
 0B5C  0A				db amis_id_msg_end - amis_id_msg
 0B5D				amis_id_msg:
 0B5D  64 72 69 76 65 72		db "driver.sys"		; our id name
       2E 73 79 73		
 0B67				amis_id_msg_end:
				
 =				AMIS_SIGN_SEGMENT equ code
				
				;AN000;Put messages handler code here.
				MSG_SERVICES <LOADmsg,DISPLAYmsg,CHARmsg>
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-67
DOS - Message Retriever - DISPMSG.ASM Module                

				.xall
				
				;
				; Sets ds:di -> BDS for this drive
				;
 1176				SetDrive:
 1176  0E				push	cs
 1177  1F				pop	ds
 1178  BF 0044 R			mov	di,offset BDS
 117B  C3				ret
				
				;
				; Place for DSK$INIT to exit
				;
 117C				ERR$EXIT:
 117C  B4 81				MOV	AH,10000001B			   ;MARK ERROR RETURN
 117E  2E: C5 1E 000B R			lds	bx, cs:[ptrsav]
 1183  C6 47 0D 00			mov	byte ptr ds:[bx.MEDIA], 0	   ;AN002; # of units
 1187  C7 47 17 FFFF			mov	word ptr ds:[bx.CONFIG_ERRMSG], -1 ;AN009;Show IBMBIO error message too.
 118C  EB 02				JMP	SHORT ERR1
				
				Public EXIT
 118E  B4 01			EXIT:	MOV	AH,00000001B
 1190  2E: C5 1E 000B R		ERR1:	LDS	BX,CS:[PTRSAV]
 1195  89 47 03				MOV	WORD PTR [BX].STATUS,AX ;MARK OPERATION COMPLETE
				
 1198				RestoreRegsAndReturn:
 1198  1F				POP	DS
 1199  5D				POP	BP
 119A  5F				POP	DI
 119B  5A				POP	DX
 119C  59				POP	CX
 119D  58				POP	AX
 119E  5E				POP	SI
 119F  E9 0040 R			jmp	dos_exit
				
				
 11A2  05			drivenumb   db	    5
 11A3  0050			cyln	    dw	    80
 11A5  0002			heads	    dw	    2
 11A7  02			ffactor     db	    2
 11A8  0009			slim	    dw	    9
				
 11AA  0000			Switches    dw	0
				
 11AC				Drive_Let_Sublist	label	dword
 11AC  0B				db     11	;AN000;length of this table
 11AD  00				db	0	;AN000;reserved
 11AE  11B7 R				dw	D_Letter;AN000;
 11B0  0000			D_Seg	dw	?	;AN000;Segment value. Should be CS
 11B2  01				db	1	;AN000;DRIVER.SYS has only %1
 11B3  00				db	00000000b ;AN000;left align(in fact, Don't care), a character.
 11B4  01				db	1	;AN000;max field width 1
 11B5  01				db	1	;AN000;min field width 1
 11B6  20				db	' '     ;AN000;character for pad field (Don't care).
				
 11B7  41			D_Letter	db	"A"
				
				
				
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-68
DOS - Message Retriever - DISPMSG.ASM Module                

				
 11B8				DSK$INIT:
 11B8  56				PUSH	SI
 11B9  50				PUSH	AX
 11BA  51				PUSH	CX
 11BB  52				PUSH	DX
 11BC  57				PUSH	DI
 11BD  55				PUSH	BP
 11BE  1E				PUSH	DS
				
 11BF  2E: C5 1E 000B R			LDS	BX,CS:[PTRSAV]		;GET POINTER TO I/O PACKET
				
 11C4  8A 47 01				MOV	AL,BYTE PTR DS:[BX].UNIT    ;AL = UNIT CODE
 11C7  8A 67 0D				MOV	AH,BYTE PTR DS:[BX].MEDIA   ;AH = MEDIA DESCRIP
 11CA  8B 4F 12				MOV	CX,WORD PTR DS:[BX].COUNT   ;CX = COUNT
 11CD  8B 57 14				MOV	DX,WORD PTR DS:[BX].START   ;DX = START SECTOR
				
 11D0  C4 7F 0E				LES	DI,DWORD PTR DS:[BX].TRANS
				
 11D3  0E				PUSH	CS
 11D4  1F				POP	DS
				
					ASSUME	DS:CODE
				
 11D5  FC				cld
 11D6  0E				push	cs			;AN000; Initialize Segment of Sub list.
 11D7  8F 06 11B0 R			pop	[D_Seg] 		;AN000;
 11DB  E8 0B67 R			call	SYSLOADMSG		;AN000; linitialize message handler
 11DE  73 0B				jnc	GoodVer 		;AN000; Error. Do not install driver.
 11E0  B9 0000				mov	cx, 0			;AN000; No substitution
 11E3  B6 FF				mov	dh, -1			;AN000; Utility message
 11E5  E8 148F R			call	Show_Message		;AN000; Show message
 11E8  EB 7E 90				jmp	err$exitj2		;AN000;  and exit
				
				;; check for correct DOS version
				;	 mov	 ah,30h
				;	 int	 21H
				
				;	 cmp	 ax,expected_version
				;	 je	 GoodVer
				
				;	cmp	al,DOSVER_HI
				;	jnz	BadDOSVer
				;	cmp	ah,DOSVER_LO
				;	jz	GoodVer
				
				;BadDOSVer:
				;	 Mov	 dx,offset BadVerMsg
				;	 call	 message
				;	 jmp	 err$exitj2		 ; do not install driver
				
 11EB				GoodVer:
 11EB  B8 0800				mov	ax,0800H
 11EE  CD 2F				int	2fH			    ; see if installed
 11F0  3C FF				cmp	al,0FFH
 11F2  75 74				jnz	err$exitj2		    ; do not install driver if not present
 11F4  C5 1E 000B R			lds	bx,[ptrsav]
 11F8  8B 77 12				mov	si,word ptr [bx].count	    ; get pointer to line to be parsed
 11FB  8B 47 14				mov	ax,word ptr [bx].count+2
 11FE  8E D8				mov	ds,ax
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-69
DOS - Message Retriever - DISPMSG.ASM Module                

 1200  E8 126C R			call	Skip_Over_Name		    ; skip over file name of driver
 1203  BF 0044 R			mov	di,offset BDS		    ; point to BDS for drive
 1206  0E				push	cs
 1207  07				pop	es			    ; es:di -> BDS
 1208  E8 127E R			Call	ParseLine
 120B  72 5B				jc	err$exitj2
 120D  2E: C5 1E 000B R			LDS	BX,cs:[PTRSAV]
 1212  8A 47 16				mov	al,byte ptr [bx].extra	; get DOS drive letter
 1215  26: 88 45 05			mov	byte ptr es:[di].DriveLet,al
 1219  2E: A2 00A8 R			mov	cs:[DOS_Drive_Letter],al
 121D  04 41				add	al,"A"
				;	 mov	 cs:[letter],al 	 ; set up for printing final message
 121F  2E: A2 11B7 R			mov	cs:[D_Letter], al	;AN000;
 1223  E8 136C R			call	SetDrvParms		; Set up BDS according to switches
 1226  72 40				jc	err$exitj2
 1228  B4 08				mov	ah,8			; Int 2f multiplex number
 122A  B0 01				mov	al,1			; install the BDS into the list
 122C  0E				push	cs
 122D  1F				pop	ds			; ds:di -> BDS for drive
 122E  BF 0044 R			mov	di,offset BDS
 1231  CD 2F				int	2FH
 1233  2E: C5 1E 000B R			lds	bx,dword ptr cs:[ptrsav]
 1238  B4 01				mov	ah,1
 123A  2E: 88 26 000A R			mov	cs:[DRVMAX],ah
 123F  88 67 0D				mov	byte ptr [bx].media,ah
 1242  B8 00A9 R			mov	ax,offset ENDCODE
 1245  89 47 0E				mov	word ptr [bx].TRANS,AX	    ; set address of end of code
 1248  8C 4F 10				mov	word ptr [bx].TRANS+2,CS
 124B  C7 47 12 00A9 R			mov	word ptr [bx].count,offset DskDrv
 1250  8C 4F 14				mov	word ptr [bx].count+2,cs
				
 1253  52				push	dx
 1254  0E				push	cs
 1255  1F				pop	ds
 1256  BE 11AC R			mov	si, offset Drive_Let_SubList  ;AC000;
 1259  B8 0003				mov	ax, LOADOK_MSG_NUM	;load ok message
 125C  B9 0001				mov	cx, 1			;AN000; 1 substitution
 125F  B6 FF				mov	dh, -1			;AN000; utility message
 1261  E8 148F R			call	Show_Message
				;	 mov	 dx,offset loadokmsg
				;	 call	 message
 1264  5A				pop	dx
 1265  E9 118E R			jmp	EXIT
				
 1268				err$exitj2:
 1268  F9				stc
 1269  E9 117C R			jmp	err$exit
				
				;
				; Skips over characters at ds:si until it hits a `/` which indicates a switch
				; J.K. If it hits 0Ah or 0Dh, then will return with SI points to that character.
 126C				Skip_Over_Name:
 126C  E8 1361 R			call	scanblanks
 126F				loop_name:
 126F  AC				lodsb
 1270  3C 0D				cmp	al,CR				;AN003;
 1272  74 08				je	End_SkipName			;AN003;
 1274  3C 0A				cmp	al,LF				;AN003;
 1276  74 04				je	End_SkipName			;AN003;
 1278  3C 2F				cmp	al,'/'
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-70
DOS - Message Retriever - DISPMSG.ASM Module                

 127A  75 F3				jnz	loop_name
 127C				End_SkipName:					;AN003;
 127C  4E				dec	si			    ; go back one character
 127D  C3				RET
				
				;ParseLine:
				;	 push	 di
				;	 push	 ds
				;	 push	 si
				;	 push	 es
				;Next_Swt:
				;IF iTEST
				;	 mov	 dx,offset nxtmsg
				;	 call	 message
				;ENDIF
				;	 call	 ScanBlanks
				;	 lodsb
				;	 cmp	 al,'/'
				;	 jz	 getparm
				;	 cmp	 al,13		     ; carriage return
				;	 jz	 done_line
				;	 CMP	 AL,10		     ; line feed
				;	 jz	 done_line
				;	 cmp	 al,0		     ; null string
				;	 jz	 done_line
				;	 mov	 ax,-2		     ; mark error invalid-character-in-input
				;	 stc
				;	 jmp	 short exitparse
				;
				;getparm:
				;	 call	 Check_Switch
				;	 mov	 cs:Switches,BX      ; save switches read so far
				;	 jnc	 Next_Swt
				;	 cmp	 ax,-1		     ; mark error number-too-large
				;	 stc
				;	 jz	 exitparse
				;	 mov	 ax,-2		     ; mark invalid parameter
				;	 stc
				;	 jmp	 short exitparse
				;
				;done_line:
				;	 test	 cs:Switches,flagdrive	   ; see if drive specified
				;	 jnz	 okay
				;	 push	 dx
				;	 mov	 ax, 2
				;	 call	 Show_Message
				;	 mov	 dx,offset nodrive
				;	 call	 message
				;	 pop	 dx
				;	 mov	 ax,-3		     ; mark error no-drive-specified
				;	 stc
				;	 jmp	 short exitparse
				;
				;okay:
				;	 call	 SetDrive			; ds:di points to BDS now.
				;	 mov	 ax,cs:Switches
				;	 and	 ax,fChangeline+fNon_Removable	; get switches for Non_Removable and Changeline
				;	 or	 ds:[di].flags,ax
				;	 xor	 ax,ax		     ; everything is fine
				;
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-71
DOS - Message Retriever - DISPMSG.ASM Module                

				;;
				;; Can detect status of parsing by examining value in AX.
				;;	 0  ==>  Successful
				;;	 -1 ==>  Number too large
				;;	 -2 ==>  Invalid character in input
				;;	 -3 ==>  No drive specified
				;
				;	 clc
				;exitparse:
				;	 pop	 es
				;	 pop	 si
				;	 pop	 ds
				;	 pop	 di
				;	 ret
				
				
				
 127E				ParseLine	proc	near
				;In) DS:SI -> Input string
				;    ES = CS
				;    ES:DI -> BDS table inside this program
				;
				;Out)
				;	if successfule, then {	AX will be set according to the switch
				;				flag value.  BDS.Flag, Drivenumb, cylin,
				;				slim, heads ffactor are set }
				;	else
				;	   {
				;	    If (no drive specified) then { display messages };
				;	    Set carry;
				;	   }
				;
				;Subroutine to be called:
				;	SYSPARSE:NEAR, SHOW_MESSAGE:NEAR, GET_RESULT:NEAR
				;
				;Logic:
				;{	While (Not end_of_Line)
				;	 {
				;	  SYSPARSE ();
				;	  if (no error) then
				;	      GET_RESULT ()
				;	else
				;	      Set carry;
				;	  };
				;
				;	if (carry set) then Exit;	/* Initialization failed */
				;	if (No drive number entered)	/* Drive number is a requirement */
				;	 then { Show_Message ();
				;		exit;
				;	      };
				;
					assume	ds:nothing		;AN000;make sure
 127E  57				push	di			;AN000;save BDS pointer
 127F  BF 0854 R			mov	di, offset PARMS	;AN000;now, es:di -> parse control definition
 1282				SysP_While:				;AN000;
 1282  33 C9				xor	cx, cx			;AN004; I don't have positionals.
 1284  33 D2				xor	dx, dx			;AN000;
 1286  E8 0148 R			call	SYSPARSE		;AN000;
 1289  3D FFFF				cmp	ax, $P_RC_EOL		;AN000;end of line?
 128C  74 0A				je	SysP_End		;AN000;
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-72
DOS - Message Retriever - DISPMSG.ASM Module                

 128E  3D 0000				cmp	ax, $P_NO_ERROR 	;AN000;no error?
 1291  75 1D				jne	SysP_Fail		;AN000;
 1293  E8 12BE R			call	Get_Result		;AN000;
 1296  EB EA				jmp	SysP_While		;AN000;
 1298				SysP_End:				;AN000;
 1298  26: F7 06 11AA R 0004		test	Switches, FLAGDRIVE	;AN000;drive number specified?
 129F  75 1A				jnz	SysP_Ok 		;AN000;Drive number is a requirement
 12A1  1E				push	ds			;AN000;
 12A2  B8 0002				mov	ax, NODRIVE_MSG_NUM	;AN000;no drive specification
 12A5  B9 0000				mov	cx, 0			;AN000;no substitutions
 12A8  B6 FF				mov	dh, -1			;AN000;utility message
 12AA  E8 148F R			call	Show_Message		;AN000;
 12AD  1F				pop	ds			;AN000;
 12AE  EB 08				jmp short SysP_Err		;AN003;
 12B0				SysP_Fail:				;AN000;
 12B0  B6 02				mov	dh, 2			;AN000; parse error
 12B2  B9 0000				mov	cx, 0			;AN000;
 12B5  E8 148F R			call	Show_Message		;AN000; Show parse error
 12B8				SysP_Err:				;AN003;
 12B8  F9				stc				;AN000;
 12B9  EB 01				jmp short PL_Ret		;AN000;
 12BB				SysP_Ok:				;AN000;
 12BB  F8				clc				;AN000;
 12BC				PL_Ret: 				;AN000;
 12BC  5F				pop	di			;AN000;restore BDS pointer
 12BD  C3				ret				;AN000;
 12BE				ParseLine	endp
				
				;
 12BE				Get_Result	proc	near
				;In) A successful result of SYSPARSE in Result_Val
				;    es = cs, ds = command line segment
				;Out)
				;   Switches set according to the user option.
				;   Drivenumb, Cyln, Heads, Slim, ffactor set if specified.
				;Logic)
				;   Switch (Synonym_Ptr)
				;	{ case Switch_D: Switches = Switches | FLAGDRIVE; /* Set switches */
				;			 Drivenumb = Reg_DX.Value_L;
				;			 break;
				;
				;	  case Switch_T: Switches = Switches | Flagcyln;
				;			 Cyln	= Reg_DX.Value_L;
				;			 break;
				;
				;	  case Switch_H: Switches = Switches | Flagheads;
				;			 Heads	= Reg_DX.Value_L;
				;			 break;
				;
				;	  case Switch_S: Switches = Switches | FlagSecLim;
				;			 Slim	= Reg_DX.Value_L;
				;			 break;
				;
				;	  case Switch_C: Switches = Switches | fChangeline;
				;			 break;
				;
				;;	   case Switch_N: Switches = Switches | fNon_Removable;
				;;			  break;
				;
				;	  case Switch_F: Switches = Switches | Flagff;
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-73
DOS - Message Retriever - DISPMSG.ASM Module                

				;			 Reg_DX = (Reg_DX.ITEM_Tag - 1)*5;/*Get the offset of
				;							  /*the choice.
				;			 ffactor = byte ptr (F_Choices + DX + 1);
				;					/*Get the value of it */
				;			 break;
				;
				;	}
				;
				
				
 12BE  26: A1 087E R			mov	ax, Synonym_Ptr 	;AN000;
 12C2  50				push	ax			;AN006; save Synonym_ptr
 12C3  3D 086E R			cmp	ax, offset Switch_D	;AN000;
 12C6  75 12				jne	Stch_T			;AN000;
 12C8  26: 81 0E 11AA R 0004		or	Switches, FLAGDRIVE	;AN000;
 12CF  26: A0 0880 R			mov	al, RV_Byte		;AN000;
 12D3  26: A2 11A2 R			mov	Drivenumb, al		;AN000;
 12D7  EB 7B 90				jmp	GR_Ret			;AN000;
 12DA				Stch_T: 				;AN000;
 12DA  3D 088D R			cmp	ax, offset Switch_T	;AN000;
 12DD  75 12				jne	Stch_H			;AN000;
 12DF  26: 81 0E 11AA R 0008		or	Switches, FLAGCYLN	;AN000;
 12E6  26: A1 0880 R			mov	ax, RV_Word		;AN000;
 12EA  26: A3 11A3 R			mov	Cyln, ax		;AN000;
 12EE  EB 64 90				jmp	GR_Ret			;AN000;
 12F1				Stch_H: 				;AN000;
 12F1  3D 08A4 R			cmp	ax, offset Switch_H	;AN000;
 12F4  75 12				jne	Stch_S			;AN000;
 12F6  26: 81 0E 11AA R 0020		or	Switches, FLAGHEADS	;AN000;
 12FD  26: A1 0880 R			mov	ax, RV_Word		;AN000;
 1301  26: A3 11A5 R			mov	Heads, ax		;AN000;
 1305  EB 4D 90				jmp	GR_Ret			;AN000;
 1308				Stch_S: 				;AN000;
 1308  3D 08A7 R			cmp	ax, offset Switch_S	;AN000;
 130B  75 12				jne	Stch_C			;AN000;
 130D  26: 81 0E 11AA R 0010		or	Switches, FLAGSECLIM	;AN000;
 1314  26: A1 0880 R			mov	ax, RV_Word		;AN000;
 1318  26: A3 11A8 R			mov	Slim, ax		;AN000;
 131C  EB 36 90				jmp	GR_Ret			;AN000;
 131F				Stch_C: 				;AN000;
 131F  3D 08BE R			cmp	ax, offset Switch_C	;AN000;
				;	 jne	 Stch_N 		 ;AN000;
 1322  75 09				jne	Stch_F			;AN001;
 1324  26: 83 0E 11AA R 02		or	Switches, fCHANGELINE	;AN000;
 132A  EB 28 90				jmp	GR_Ret			;AN000;
				;Stch_N:				 ;AN000;
				;	 cmp	 ax, offset Switch_N	 ;AN000;
				;	 jne	 Stch_F 		 ;AN000;
				;	 or	 Switches, fNON_REMOVABLE  ;AN000;
				;	 jmp	 GR_Ret 		 ;AN000;
 132D				Stch_F: 				;AN000;
 132D  3D 08CB R			cmp	ax, offset Switch_F	;AN000;
 1330  75 2D				jne	GR_Not_Found_Ret	;AN000;error in SYSPARSE
 1332  26: 81 0E 11AA R 0040		or	Switches, FLAGFF	;AN000;
 1339  56				push	si			;AN004;
 133A  BE 08D1 R			mov	si, offset F_Choices	;AN000;
 133D  33 C0				xor	ax, ax			;AN000;
 133F  26: A0 087D R			mov	al, Item_Tag		;AN000;
 1343  FE C8				dec	al			;AN000;
 1345  B1 05				mov	cl, 5			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-74
DOS - Message Retriever - DISPMSG.ASM Module                

 1347  F6 E1				mul	cl			;AN000;
 1349  03 F0				add	si, ax			;AN000;
 134B  26: 8A 44 01			mov	al, byte ptr es:[si+1]	;AN000;get the result of choices
 134F  26: A2 11A7 R			mov	ffactor, al		;AN000;set form factor
 1353  5E				pop	si			;AN004;
 1354				GR_Ret: 				;AN000;
 1354  58				pop	ax			;AN006; Restore Synonym ptr
 1355  57				push	di			;AN006; Save di
 1356  50				push	ax			;AN006;
 1357  5F				pop	di			;AN006;
 1358  26: C6 05 20			mov	byte ptr es:[di], ' '   ;AN006;We don't have this switch any more.
 135C  5F				pop	di			;AN006;
 135D  EB 01				jmp	short Gr_Done_Ret	;AN006;
 135F				GR_Not_Found_Ret:
 135F  58				pop	ax			;AN006;adjust stack
 1360				GR_Done_Ret:
 1360  C3				ret				;AN000;
 1361				Get_Result	endp
				
				
				;
				; Scans an input line for blank or tab characters. On return, the line pointer
				; will be pointing to the next non-blank character.
				;
 1361				ScanBlanks:
 1361  AC				lodsb
 1362  3C 20				cmp	al,' '
 1364  74 FB				jz	ScanBlanks
 1366  3C 09				cmp	al,9		    ; Tab character
 1368  74 F7				jz	ScanBlanks
 136A  4E				dec	si
 136B  C3				ret
				
				;
				; Gets a number from the input stream, reading it as a string of characters.
				; It returns the number in AX. It assumes the end of the number in the input
				; stream when the first non-numeric character is read. It is considered an error
				; if the number is too large to be held in a 16 bit register. In this case, AX
				; contains -1 on return.
				;
				;GetNum:
				;	 push	 bx
				;	 push	 dx
				;	 xor	 ax,ax
				;	 xor	 bx,bx
				;	 xor	 dx,dx
				;
				;next_char:
				;	 lodsb
				;	 cmp	 al,'0'              ; check for valid numeric input
				;	 jb	 num_ret
				;	 cmp	 al,'9'
				;	 ja	 num_ret
				;	 sub	 al,'0'
				;	 xchg	 ax,bx		     ; save intermediate value
				;	 push	 bx
				;	 mov	 bx,10
				;	 mul	 bx
				;	 pop	 bx
				;	 add	 al,bl
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-75
DOS - Message Retriever - DISPMSG.ASM Module                

				;	 adc	 ah,0
				;	 xchg	 ax,bx		     ; stash total
				;	 jc	 got_large
				;	 cmp	 dx,0
				;	 jz	 next_char
				;got_large:
				;	 mov	 ax,-1
				;	 jmp	 short get_ret
				;
				;num_ret:
				;	 mov	 ax,bx
				;	 dec	 si		     ; put last character back into buffer
				;
				;get_ret:
				;	 pop	 dx
				;	 pop	 bx
				;	 ret
				
				
				;
				; Processes a switch in the input. It ensures that the switch is valid, and
				; gets the number, if any required, following the switch. The switch and the
				; number *must* be separated by a colon. Carry is set if there is any kind of
				; error.
				;
				;Check_Switch:
				;	 lodsb
				;	 and	 al,0DFH	     ; convert it to upper case
				;	 cmp	 al,'A'
				;	 jb	 err_swtch
				;	 cmp	 al,'Z'
				;	 ja	 err_swtch
				;	 mov	 cl,cs:switchlist    ; get number of valid switches
				;	 mov	 ch,0
				;	 push	 es
				;	 push	 cs
				;	 pop	 es			 ; set es:di -> switches
				;	 push	 di
				;	 mov	 di,1+offset switchlist  ; point to string of valid switches
				;	 repne	 scasb
				;	 pop	 di
				;	 pop	 es
				;	 jnz	 err_swtch
				;	 mov	 ax,1
				;	 shl	 ax,cl		 ; set bit to indicate switch
				;	 mov	 bx,cs:switches
				;	 or	 bx,ax		 ; save this with other switches
				;	 mov	 cx,ax
				;	 test	 ax,7cH 	 ; test against switches that require number to follow
				;	 jz	 done_swtch
				;	 lodsb
				;	 cmp	 al,':'
				;	 jnz	 reset_swtch
				;	 call	 ScanBlanks
				;	 call	 GetNum
				;	 cmp	 ax,-1		 ; was number too large?
				;	 jz	 reset_swtch
				;IF iTEST
				;	 push	 ax
				;	 add	 al,'0'
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-76
DOS - Message Retriever - DISPMSG.ASM Module                

				;	 add	 ah,'0'
				;	 mov	 cs:number,ah
				;	 mov	 cs:number+1,al
				;	 mov	 dx,offset nummsg
				;	 call	 message
				;	 pop	 ax
				;ENDIF
				;	 call	 Process_Num
				;
				;done_swtch:
				;	 ret
				;
				;reset_swtch:
				;	 xor	 bx,cx			 ; remove this switch from the records
				;err_swtch:
				;	 stc
				;	 jmp	 short done_swtch
				
				;
				; This routine takes the switch just input, and the number following (if any),
				; and sets the value in the appropriate variable. If the number input is zero
				; then it does nothing - it assumes the default value that is present in the
				; variable at the beginning.
				;
				;Process_Num:
				;	 push	 ds
				;	 push	 cs
				;	 pop	 ds
				;	 test	 Switches,cx	     ; if this switch has been done before,
				;	 jnz	 done_ret	     ; ignore this one.
				;	 test	 cx,flagdrive
				;	 jz	 try_f
				;	 mov	 drivenumb,al
				;IF iTEST
				;	 add	 al,"0"
				;	 mov	 driven,al
				;	 mov	 dx,offset drvmsg
				;	 call	 message
				;ENDIF
				;	 jmp	 short done_ret
				;
				;try_f:
				;	 test	 cx,flagff
				;	 jz	 try_t
				;	 mov	 ffactor,al
				;IF iTEST
				;	 add	 al,"0"
				;	 mov	 ffnum,al
				;	 mov	 dx,offset ffmsg
				;	 call	 message
				;ENDIF
				;
				;try_t:
				;	 cmp	 ax,0
				;	 jz	 done_ret	     ; if number entered was 0, assume default value
				;	 test	 cx,flagcyln
				;	 jz	 try_s
				;	 mov	 cyln,ax
				;IF iTEST
				;	 mov	 dx,offset cylnmsg
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-77
DOS - Message Retriever - DISPMSG.ASM Module                

				;	 call	 message
				;ENDIF
				;	 jmp	 short done_ret
				;
				;try_s:
				;	 test	 cx,flagseclim
				;	 jz	 try_h
				;	 mov	 slim,ax
				;IF iTEST
				;	 mov	 dx,offset slimmsg
				;	 call	 message
				;ENDIF
				;	 jmp	 short done_ret
				;
				;; Switch must be one for number of Heads.
				;try_h:
				;	 test	 cx,flagheads
				;	 jz	 done_ret
				;	 mov	 heads,ax
				;IF iTEST
				;	 add	 al,"0"
				;	 mov	 hdnum,al
				;	 mov	 dx,offset hdmsg
				;	 call	 message
				;ENDIF
				;
				;done_ret:
				;	 pop	 ds
				;	 ret
				
				;
				; SetDrvParms sets up the recommended BPB in each BDS in the system based on
				; the form factor. It is assumed that the BPBs for the various form factors
				; are present in the BPBTable. For hard files, the Recommended BPB is the same
				; as the BPB on the drive.
				; No attempt is made to preserve registers since we are going to jump to
				; SYSINIT straight after this routine.
				;
 136C				SetDrvParms:
 136C  0E				push	cs
 136D  07				pop	es
 136E  33 DB				xor	bx,bx
 1370  E8 1176 R			call	SetDrive		; ds:di -> BDS
					;test	 cs:switches,flagff	 ; has formfactor been specified?
					;jz	 formfcont
 1373  2E: 8A 1E 11A7 R			mov	bl,cs:[ffactor]
 1378  88 5D 22				mov	byte ptr [di].formfactor,bl   ; replace with new value
 137B				formfcont:
 137B  8A 5D 22				mov	bl,[di].FormFactor
				;AC000; The followings are redundanat since there is no input specified for Hard file.
				;	 cmp	 bl,ffHardFile
				;	 jnz	 NotHardFF
				;	 mov	 ax,[di].DrvLim
				;	 cmp	 ax, 0			 ;AN000;32 bit sector number?
				;	 push	 ax
				;	 mov	 ax,word ptr [di].hdlim
				;	 mul	 word ptr [di].seclim
				;	 mov	 cx,ax			 ; cx has # sectors per cylinder
				;	 pop	 ax
				;	 xor	 dx,dx			 ; set up for div
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-78
DOS - Message Retriever - DISPMSG.ASM Module                

				;	 div	 cx			 ; div #sec by sec/cyl to get # cyl
				;	 or	 dx,dx
				;	 jz	 No_Cyl_Rnd		 ; came out even
				;	 inc	 ax			 ; round up
				;No_Cyl_Rnd:
				;	 mov	 cs:[cyln],ax
				;	 mov	 si,di
				;	 add	 si,BytePerSec		 ; ds:si -> BPB for hard file
				;	 jmp	 short Set_RecBPB
				;NotHardFF:
				;AC000; End of deletion.
 137E  80 FB 00				cmp	bl,ff48tpi
 1381  75 08				jnz	Got_80_cyln
 1383  B9 0028				mov	cx,40
 1386  2E: 89 0E 11A3 R			mov	cs:[cyln],cx
 138B				Got_80_cyln:
 138B  D1 E3				shl	bx,1			; bx is word index into table of BPBs
 138D  BE 14D3 R			mov	si,offset BPBTable
 1390  8B 30				mov	si,word ptr [si+bx]	; get address of BPB
 1392				Set_RecBPB:
 1392  83 C7 27				add	di,RBytePerSec		; es:di -> Recommended BPB
 1395  B9 0013 90			mov	cx,BPBSIZ
 1399  FC				cld
 139A  F3/ A4				repe	movsb			; move BPBSIZ bytes
				
 139C  E8 1454 R			call	Handle_Switches 	; replace with 'new' values as
									; specified in switches.
				;
				; We need to set the media byte and the total number of sectors to reflect the
				; number of heads. We do this by multiplying the number of heads by the number
				; of 'sectors per head'. This is not a fool-proof scheme!!
				;
 139F  8B 45 2F				mov	ax,[di].Rdrvlim 	; this is OK for two heads
 13A2  D1 F8				sar	ax,1			; ax contains # of sectors/head
 13A4  8B 4D 36				mov	cx,[di].Rhdlim
 13A7  FE C9				dec	cl			; get it 0-based
 13A9  D3 E0				sal	ax,cl
 13AB  72 20				jc	Set_All_Done_BRG	; We have too many sectors - overflow!!
 13AD  89 45 2F				mov	[di].Rdrvlim,ax
 13B0  80 F9 01				cmp	cl,1
				; We use media descriptor byte F0H for any type of medium that is not currently
				; defined i.e. one that does not fall into the categories defined by media
				; bytes F8H, F9H, FCH-FFH.
				
 13B3  74 2B				JE	HEAD_2_DRV
 13B5  B0 01				MOV	AL, 1				;1 sector/cluster
 13B7  8A 5D 31				MOV	BL, BYTE PTR [DI].Rmediad
 13BA  80 7D 22 07			CMP	BYTE PTR [DI].FormFactor, ffOther
 13BE  74 59				JE	GOT_CORRECT_MEDIAD
 13C0  8A 6D 22				MOV	CH, BYTE PTR [DI].FormFactor
 13C3  80 FD 00				CMP	CH, ff48tpi
 13C6  74 08				JE	SINGLE_MEDIAD
 13C8  B3 F0				MOV	BL, 0F0h
 13CA  EB 4D 90				JMP	GOT_CORRECT_MEDIAD
 13CD  E9 1453 R		Set_All_Done_BRG:jmp Set_All_Done
 13D0				SINGLE_MEDIAD:
 13D0  83 7D 34 08			CMP	WORD PTR [DI].RSecLim, 8	;8 SEC/TRACK?
 13D4  75 05				JNE	SINGLE_9_SEC
 13D6  B3 FE				MOV	BL, 0FEh
 13D8  EB 3F 90				JMP	GOT_CORRECT_MEDIAD
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-79
DOS - Message Retriever - DISPMSG.ASM Module                

 13DB				SINGLE_9_SEC:
 13DB  B3 FC				MOV	BL, 0FCh
 13DD  EB 3A 90				JMP	GOT_CORRECT_MEDIAD
 13E0				HEAD_2_DRV:
 13E0  B3 F0				MOV	BL, 0F0h		;default 0F0h
 13E2  B0 01				MOV	AL, 1			;1 sec/cluster
 13E4  80 7D 22 07			CMP	BYTE PTR [DI].FormFactor, ffOther
 13E8  74 2F				JE	GOT_CORRECT_MEDIAD
 13EA  80 7D 22 00			CMP	BYTE PTR [DI].FormFactor, ff48tpi
 13EE  75 12				JNE	NOT_48TPI
 13F0  B0 02				MOV	AL, 2
 13F2  83 7D 34 08			CMP	WORD PTR [DI].RSecLim, 8	;8 SEC/TRACK?
 13F6  75 05				JNE	DOUBLE_9_SEC
 13F8  B3 FF				MOV	BL, 0FFh
 13FA  EB 1D 90				JMP	GOT_CORRECT_MEDIAD
 13FD				DOUBLE_9_SEC:
 13FD  B3 FD				MOV	BL, 0FDh
 13FF  EB 18 90				JMP	GOT_CORRECT_MEDIAD
 1402				NOT_48TPI:
 1402  80 7D 22 01			CMP	BYTE PTR [DI].FormFactor, ff96tpi
 1406  75 07				JNE	NOT_96TPI
 1408  B0 01				MOV	AL, 1			;1 sec/cluster
 140A  B3 F9				MOV	BL, 0F9h
 140C  EB 0B 90				JMP	GOT_CORRECT_MEDIAD
 140F				NOT_96TPI:
 140F  80 7D 22 02			CMP	BYTE PTR [DI].FormFactor, ffSmall	;3-1/2, 720kb
 1413  75 04				JNE	GOT_CORRECT_MEDIAD	;Not ffSmall. Strange Media device.
 1415  B0 02				MOV	AL, 2			;2 sec/cluster
 1417  B3 F9				MOV	BL, 0F9h
				
				;J.K. 12/9/86 THE ABOVE IS A QUICK FIX FOR 3.3 DRIVER.SYS PROB. OLD LOGIC IS COMMENTED OUT.
				;	 mov	 bl,0F0H		 ; assume strange media
				;	 mov	 al,1			 ; AL is sectors/cluster - match 3.3 bio dcl. 6/27/86
				;	 ja	 Got_Correct_Mediad
				;; We check to see if the form factor specified was "other"
				;	 cmp	 byte ptr [di].FormFactor,ffOther
				;	 jz	 Got_Correct_Mediad
				;; We must have 1 or 2 heads (0 is ignored)
				;	 mov	 bl,byte ptr [di].Rmediad
				;	 cmp	 cl,1
				;	 jz	 Got_Correct_Mediad
				;; We must have one head - OK for 48tpi media
				;	 mov	 al,1			 ; AL is sectors/cluster
				;	 mov	 ch,byte ptr [di].FormFactor
				;	 cmp	 ch,ff48tpi
				;	 jz	 Dec_Mediad
				;	 mov	 bl,0F0H
				;	 jmp	 short Got_Correct_Mediad
				;Dec_Mediad:
				;	 dec	 bl			 ; adjust for one head
				;J.K. END OF OLD LOGIC
				
 1419				Got_Correct_Mediad:
 1419  88 45 29				mov	byte ptr [di].RSecPerClus,al
 141C  88 5D 31				mov	byte ptr [di].Rmediad,bl
				; Calculate the correct number of Total Sectors on medium
 141F  8B 45 25				mov	ax,word ptr [di].Ccyln
 1422  8B 5D 36				mov	bx,word ptr [di].RHdLim
 1425  F7 E3				mul	bx
 1427  8B 5D 34				mov	bx,word ptr [di].RSecLim
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-80
DOS - Message Retriever - DISPMSG.ASM Module                

 142A  F7 E3				mul	bx
				; AX contains the total number of sectors on the disk
 142C  89 45 2F				mov	word ptr [di].RDrvLim,ax
				;J.K. For ffOther type of media, we should set Sec/FAT, and # of Root directory
				;J.K. accordingly.
 142F  80 7D 22 07			cmp	byte ptr [di].FormFactor, ffOther  ;AN005;
 1433  75 1D				jne	Set_All_Ok			;AN005;
 1435  33 D2				xor	dx, dx				;AN005;
 1437  48				dec	ax				;AN005; DrvLim - 1.
 1438  BB 0003				mov	bx, 3				;AN005; Assume 12 bit fat.
 143B  F7 E3				mul	bx				;AN005;  = 1.5 byte
 143D  BB 0002				mov	bx, 2				;AN005;
 1440  F7 F3				div	bx				;AN005;
 1442  33 D2				xor	dx, dx				;AN005;
 1444  BB 0200				mov	bx, 512 			;AN005;
 1447  F7 F3				div	bx				;AN005;
 1449  40				inc	ax				;AN005;
 144A  89 45 32				mov	[di].RCSecFat, ax		;AN005;
 144D  C7 45 2D 00E0			mov	[di].RCDir, 0E0h		;AN005; directory entry # = 224
 1452				Set_All_Ok:					;AN005;
 1452  F8				clc
 1453				Set_All_Done:
 1453  C3				RET
				
				;
				; Handle_Switches replaces the values that were entered on the command line in
				; config.sys into the recommended BPB area in the BDS.
				; NOTE:
				;	No checking is done for a valid BPB here.
				;
 1454				Handle_Switches:
 1454  E8 1176 R			call	setdrive		; ds:di -> BDS
 1457  2E: F7 06 11AA R 0004		test	cs:switches,flagdrive
 145E  74 2E				jz	done_handle		    ; if drive not specified, exit
 1460  2E: A0 11A2 R			mov	al,cs:[drivenumb]
 1464  88 45 04				mov	byte ptr [di].DriveNum,al
				;	 test	 cs:switches,flagcyln
				;	 jz	 no_cyln
 1467  2E: A1 11A3 R			mov	ax,cs:[cyln]
 146B  89 45 25				mov	word ptr [di].cCyln,ax
 146E				no_cyln:
 146E  2E: F7 06 11AA R 0010		test	cs:switches,flagseclim
 1475  74 07				jz	no_seclim
 1477  2E: A1 11A8 R			mov	ax,cs:[slim]
 147B  89 45 34				mov	word ptr [di].RSeclim,ax
 147E				no_seclim:
 147E  2E: F7 06 11AA R 0020		test	cs:switches,flagheads
 1485  74 07				jz	done_handle
 1487  2E: A1 11A5 R			mov	ax,cs:[heads]
 148B  89 45 36				mov	word ptr [di].RHdlim,ax
 148E				done_handle:
 148E  C3				RET
				
				
 148F				Show_Message	proc	near
				;In) AX = message number
				;    DS:SI -> Substitution list if necessary.
				;    CX = 0 or n depending on the substitution number
				;    DH = -1 FOR UTILITY MSG CLASS, 2 FOR PARSE ERROR
				;Out) Message displayed using DOS function 9 with no keyboard input.
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-81
DOS - Message Retriever - DISPMSG.ASM Module                

 148F  0E				push	cs		;AN000;
 1490  1F				pop	ds		;AN000;
 1491  BB FFFF				mov	bx, -1		;AN000;
 1494  B2 00				mov	dl, 0		;AN000;no input
 1496  E8 0CB4 R			call	SYSDISPMSG	;AN000;
 1499  C3				ret			;AN000;
 149A				Show_Message	endp
				
				;
				; The following are the recommended BPBs for the media that we know of so
				; far.
				
				; 48 tpi diskettes
				
 149A  0200			BPB48T	DW	512
 149C  02				DB	2
 149D  0001				DW	1
 149F  02				DB	2
 14A0  0070				DW	112
 14A2  02D0				DW	2*9*40
 14A4  FD				DB	0FDH
 14A5  0002				DW	2
 14A7  0009				DW	9
 14A9  0002				DW	2
 14AB  0000				DW	0
				
				; 96tpi diskettes
				
 14AD  0200			BPB96T	DW	512
 14AF  01				DB	1
 14B0  0001				DW	1
 14B2  02				DB	2
 14B3  00E0				DW	224
 14B5  0960				DW	2*15*80
 14B7  F9				DB	0F9H
 14B8  0007				DW	7
 14BA  000F				DW	15
 14BC  0002				DW	2
 14BE  0000				DW	0
				
 = 0013				BPBSIZ	=	$-BPB96T
				
				; 3 1/2 inch diskette BPB
				
 14C0  0200			BPB35	DW	512
 14C2  02				DB	2
 14C3  0001				DW	1			; Double sided with 9 sec/trk
 14C5  02				DB	2
 14C6  0070				DW	70h
 14C8  05A0				DW	2*9*80
 14CA  F9				DB	0F9H
 14CB  0003				DW	3
 14CD  0009				DW	9
 14CF  0002				DW	2
 14D1  0000				DW	0
				
				
 14D3  149A R			BPBTable    dw	    BPB48T		; 48tpi drives
 14D5  14AD R				    dw	    BPB96T		; 96tpi drives
 14D7  14C0 R				    dw	    BPB35		; 3.5" drives
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Page     1-82
DOS - Message Retriever - DISPMSG.ASM Module                

				; The following are not supported, so we default to 3.5" layout
 14D9  14C0 R				    dw	    BPB35		; Not used - 8" drives
 14DB  14C0 R				    dw	    BPB35		; Not Used - 8" drives
 14DD  14C0 R				    dw	    BPB35		; Not Used - hard files
 14DF  14C0 R				    dw	    BPB35		; Not Used - tape drives
 14E1  14C0 R				    dw	    BPB35		; Not Used - Other
				
 14E3  07 46 48 53 54 44	switchlist  db	7,"FHSTDCN"         ; Preserve the positions of N and C.
       43 4E			
				
				; The following depend on the positions of the various letters in SwitchList
				
 = 0004				flagdrive   equ     0004H
 = 0008				flagcyln    equ     0008H
 = 0010				flagseclim  equ     0010H
 = 0020				flagheads   equ     0020H
 = 0040				flagff	    equ     0040H
				
				;AN000;
				;Equates for message number
 = 0002				NODRIVE_MSG_NUM   equ	2
 = 0003				LOADOK_MSG_NUM	  equ	3
				
 14EB				code ends
				
				end

Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Symbols-1


Macros:

		N a m e			Lines

$M_BUILD_PTRS  . . . . . . . . .  	  18
$M_INC . . . . . . . . . . . . .  	   3
$M_MAKE  . . . . . . . . . . . .  	  10
$M_MAKE_COMR . . . . . . . . . .  	  21
$M_MAKE_COMT . . . . . . . . . .  	   5
$M_POPF  . . . . . . . . . . . .  	   5
MSG_SERVICES . . . . . . . . . .  	  34
MSG_SERVICES2  . . . . . . . . .  	  14
MSG_UTILNAME . . . . . . . . . .  	   5

Structures and Records:

                N a m e                 Width   # fields
                                        Shift   Width   Mask    Initial

$M_CLASS_ID  . . . . . . . . . .  	0004	0003
  $M_CLS_ID  . . . . . . . . . .  	0000
  $M_COMMAND_VER . . . . . . . .  	0001
  $M_NUM_CLS_MSG . . . . . . . .  	0003
$M_COUNTRY_INFO  . . . . . . . .  	0056	000A
  $M_HEADER  . . . . . . . . . .  	0000
  $M_DATE_FORMAT . . . . . . . .  	0044
  $M_CURR_SEPARA . . . . . . . .  	0046
  $M_THOU_SEPARA . . . . . . . .  	004B
  $M_DECI_SEPARA . . . . . . . .  	004D
  $M_DATE_SEPARA . . . . . . . .  	004F
  $M_TIME_SEPARA . . . . . . . .  	0051
  $M_CURR_FORMAT . . . . . . . .  	0053
  $M_SIG_DIGS_CU . . . . . . . .  	0054
  $M_TIME_FORMAT . . . . . . . .  	0055
$M_ID  . . . . . . . . . . . . .  	0004	0002
  $M_NUM . . . . . . . . . . . .  	0000
  $M_TXT_PTR . . . . . . . . . .  	0002
$M_RES_ADDRS . . . . . . . . . .  	0085	0017
  $M_EXT_ERR_ADDRS . . . . . . .  	0000
  $M_EXT_FILE  . . . . . . . . .  	0004
  $M_EXT_COMMAND . . . . . . . .  	0008
  $M_EXT_TERM  . . . . . . . . .  	000C
  $M_PARSE_COMMAND . . . . . . .  	0010
  $M_PARSE_ADDRS . . . . . . . .  	0014
  $M_PARSE_TERM  . . . . . . . .  	0018
  $M_CRIT_ADDRS  . . . . . . . .  	001C
  $M_CRIT_COMMAND  . . . . . . .  	0020
  $M_CRIT_TERM . . . . . . . . .  	0024
  $M_DISK_PROC_ADDR  . . . . . .  	0028
  $M_CLASS_ADDRS . . . . . . . .  	002C
  $M_CLS_TERM  . . . . . . . . .  	0030
  $M_DBCS_VEC  . . . . . . . . .  	0034
  $M_HANDLE  . . . . . . . . . .  	0038
  $M_SIZE  . . . . . . . . . . .  	003A
  $M_CRLF  . . . . . . . . . . .  	003B
  $M_CLASS . . . . . . . . . . .  	003D
  $M_RETURN_ADDR . . . . . . . .  	003E
  $M_MSG_NUM . . . . . . . . . .  	0040
  $M_DIVISOR . . . . . . . . . .  	0042
  $M_TEMP_BUF  . . . . . . . . .  	0044
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Symbols-2


  $M_BUF_TERM  . . . . . . . . .  	0084
$M_SUBLIST_STRUC . . . . . . . .  	000B	0008
  $M_S_SIZE  . . . . . . . . . .  	0000
  $M_S_RESV  . . . . . . . . . .  	0001
  $M_S_VALUE . . . . . . . . . .  	0002
  $M_S_ID  . . . . . . . . . . .  	0006
  $M_S_FLAG  . . . . . . . . . .  	0007
  $M_S_MAXW  . . . . . . . . . .  	0008
  $M_S_MINW  . . . . . . . . . .  	0009
  $M_S_PAD . . . . . . . . . . .  	000A
$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
BDSM_TYPE  . . . . . . . . . . .  	0064	0020
  MLINK  . . . . . . . . . . . .  	0000
  MDRIVENUM  . . . . . . . . . .  	0004
  MDRIVELET  . . . . . . . . . .  	0005
  MBYTEPERSEC  . . . . . . . . .  	0006
  MSECPERCLUS  . . . . . . . . .  	0008
  MRESSEC  . . . . . . . . . . .  	0009
  MCFAT  . . . . . . . . . . . .  	000B
  MCDIR  . . . . . . . . . . . .  	000C
  MDRVLIM  . . . . . . . . . . .  	000E
  MMEDIAD  . . . . . . . . . . .  	0010
  MCSECFAT . . . . . . . . . . .  	0011
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Symbols-3


  MSECLIM  . . . . . . . . . . .  	0013
  MHDLIM . . . . . . . . . . . .  	0015
  MHIDSEC_L  . . . . . . . . . .  	0017
  MHIDSEC_H  . . . . . . . . . .  	0019
  MDRVLIM_L  . . . . . . . . . .  	001B
  MDRVLIM_H  . . . . . . . . . .  	001D
  MFATSIZ  . . . . . . . . . . .  	001F
  MOPCNT . . . . . . . . . . . .  	0020
  MFORMFACTOR  . . . . . . . . .  	0022
  MFLAGS . . . . . . . . . . . .  	0023
  MCCYLN . . . . . . . . . . . .  	0025
  MRECBPB  . . . . . . . . . . .  	0027
  MTRACK . . . . . . . . . . . .  	0046
  ISMINI . . . . . . . . . . . .  	0047
  HIDDEN_TRKS  . . . . . . . . .  	0049
  MVOLID . . . . . . . . . . . .  	004B
  MVOL_SERIAL  . . . . . . . . .  	0057
  MFILESYS_ID  . . . . . . . . .  	005B
BDS_TYPE . . . . . . . . . . . .  	0064	002B
  LINK . . . . . . . . . . . . .  	0000
  DRIVENUM . . . . . . . . . . .  	0004
  DRIVELET . . . . . . . . . . .  	0005
  BYTEPERSEC . . . . . . . . . .  	0006
  SECPERCLUS . . . . . . . . . .  	0008
  RESSEC . . . . . . . . . . . .  	0009
  CFAT . . . . . . . . . . . . .  	000B
  CDIR . . . . . . . . . . . . .  	000C
  DRVLIM . . . . . . . . . . . .  	000E
  MEDIAD . . . . . . . . . . . .  	0010
  CSECFAT  . . . . . . . . . . .  	0011
  SECLIM . . . . . . . . . . . .  	0013
  HDLIM  . . . . . . . . . . . .  	0015
  HIDSEC_L . . . . . . . . . . .  	0017
  HIDSEC_H . . . . . . . . . . .  	0019
  DRVLIM_L . . . . . . . . . . .  	001B
  DRVLIM_H . . . . . . . . . . .  	001D
  FATSIZ . . . . . . . . . . . .  	001F
  OPCNT  . . . . . . . . . . . .  	0020
  FORMFACTOR . . . . . . . . . .  	0022
  FLAGS  . . . . . . . . . . . .  	0023
  CCYLN  . . . . . . . . . . . .  	0025
  RBYTEPERSEC  . . . . . . . . .  	0027
  RSECPERCLUS  . . . . . . . . .  	0029
  RRESSEC  . . . . . . . . . . .  	002A
  RCFAT  . . . . . . . . . . . .  	002C
  RCDIR  . . . . . . . . . . . .  	002D
  RDRVLIM  . . . . . . . . . . .  	002F
  RMEDIAD  . . . . . . . . . . .  	0031
  RCSECFAT . . . . . . . . . . .  	0032
  RSECLIM  . . . . . . . . . . .  	0034
  RHDLIM . . . . . . . . . . . .  	0036
  RHIDSEC_L  . . . . . . . . . .  	0038
  RHIDSEC_H  . . . . . . . . . .  	003A
  RDRVLIM_L  . . . . . . . . . .  	003C
  RDRVLIM_H  . . . . . . . . . .  	003E
  RESERVE  . . . . . . . . . . .  	0040
  TRACK  . . . . . . . . . . . .  	0046
  TIM_LO . . . . . . . . . . . .  	0047
  TIM_HI . . . . . . . . . . . .  	0049
  VOLID  . . . . . . . . . . . .  	004B
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Symbols-4


  VOL_SERIAL . . . . . . . . . .  	0057
  FILESYS_ID . . . . . . . . . .  	005B
LBAPACKETSTRUC . . . . . . . . .  	0010	0004
  LPSIZE . . . . . . . . . . . .  	0000
  LPCOUNT  . . . . . . . . . . .  	0002
  LPBUFFER . . . . . . . . . . .  	0004
  LPSECTOR . . . . . . . . . . .  	0008

Segments and Groups:

                N a m e         	Length	 Align	Combine Class

CODE . . . . . . . . . . . . . .  	14EB	WORD	PUBLIC	

Symbols:            

                N a m e         	Type	 Value	 Attr

ACTION_39  . . . . . . . . . . .  	NUMBER	0004	
ALT_EXPECTED_VERSION . . . . . .  	NUMBER	1A05	
ALT_GOOD_DOS . . . . . . . . . .  	L NEAR	0C98	CODE
ALT_MAJOR_VERSION  . . . . . . .  	NUMBER	0005	
ALT_MINOR_VERSION  . . . . . . .  	NUMBER	001A	
AMIS_ID  . . . . . . . . . . . .  	L NEAR	0B58	CODE
AMIS_ID_MSG  . . . . . . . . . .  	L NEAR	0B5D	CODE
AMIS_ID_MSG_END  . . . . . . . .  	L NEAR	0B67	CODE
amis_sign  . . . . . . . . . . .  	L NEAR	0B48	CODE	Global
AMIS_SIGN_SEGMENT  . . . . . . .  	ALIAS	 CODE		

BDS  . . . . . . . . . . . . . .  	L WORD	0044	CODE
BELL . . . . . . . . . . . . . .  	NUMBER	0007	
BIN_HEX_BYTE . . . . . . . . . .  	NUMBER	0013	
BIN_HEX_DWORD  . . . . . . . . .  	NUMBER	0033	
BIN_HEX_TYPE . . . . . . . . . .  	NUMBER	0003	
BIN_HEX_WORD . . . . . . . . . .  	NUMBER	0023	
BPB35  . . . . . . . . . . . . .  	L WORD	14C0	CODE
BPB48T . . . . . . . . . . . . .  	L WORD	149A	CODE
BPB96T . . . . . . . . . . . . .  	L WORD	14AD	CODE
BPBSIZ . . . . . . . . . . . . .  	NUMBER	0013	
BPBSIZE  . . . . . . . . . . . .  	NUMBER	001F	
BPBTABLE . . . . . . . . . . . .  	L WORD	14D3	CODE

CAPSW  . . . . . . . . . . . . .  	NUMBER	0000	
CHARMSG  . . . . . . . . . . . .  	NUMBER	FFFF	
CHAR_FIELD_ASCIIZ  . . . . . . .  	NUMBER	0010	
CHAR_FIELD_CHAR  . . . . . . . .  	NUMBER	0000	
CHAR_TYPE  . . . . . . . . . . .  	NUMBER	0000	
CHECK_AMIS . . . . . . . . . . .  	L NEAR	0C3C	CODE
CHECK_AMIS_DONE  . . . . . . . .  	L NEAR	0C73	CODE
CHECK_AMIS_LOOP  . . . . . . . .  	L NEAR	0C45	CODE
CHECK_AMIS_NEXT  . . . . . . . .  	L NEAR	0C6E	CODE
CHECK_AMIS_UNSUP . . . . . . . .  	L NEAR	0C72	CODE
CLASS_1_MESSAGECOUNT . . . . . .  	NUMBER	0001	
CLASS_2_MESSAGECOUNT . . . . . .  	NUMBER	0008	
CLASS_A_MESSAGECOUNT . . . . . .  	NUMBER	0003	
CMD  . . . . . . . . . . . . . .  	NUMBER	0002	
CMDLEN . . . . . . . . . . . . .  	NUMBER	0000	
CMPXSW . . . . . . . . . . . . .  	NUMBER	0000	
CN_CONTROL . . . . . . . . . . .  	L WORD	08B5	CODE
COLON  . . . . . . . . . . . . .  	NUMBER	003A	
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Symbols-5


COMR . . . . . . . . . . . . . .  	NUMBER	0000	
COMT . . . . . . . . . . . . . .  	NUMBER	0000	
CONFIG_ERRMSG  . . . . . . . . .  	NUMBER	0017	
COUNT  . . . . . . . . . . . . .  	NUMBER	0012	
CR . . . . . . . . . . . . . . .  	NUMBER	000D	
CYLN . . . . . . . . . . . . . .  	L WORD	11A3	CODE

DATEMSG  . . . . . . . . . . . .  	NUMBER	0000	
DATESW . . . . . . . . . . . . .  	NUMBER	0000	
DATE_MD  . . . . . . . . . . . .  	NUMBER	0014	
DATE_MDY_2 . . . . . . . . . . .  	NUMBER	0024	
DATE_MDY_4 . . . . . . . . . . .  	NUMBER	0034	
DATE_TYPE  . . . . . . . . . . .  	NUMBER	0004	
DISK_PROC  . . . . . . . . . . .  	NUMBER	0000	
DISPLAYMSG . . . . . . . . . . .  	NUMBER	0000	
DONE_HANDLE  . . . . . . . . . .  	L NEAR	148E	CODE
DOS_BUF_KEYB_INP . . . . . . . .  	NUMBER	000A	
DOS_CLOSE_FILE . . . . . . . . .  	NUMBER	003E	
DOS_CLR_KEYB_BUF . . . . . . . .  	NUMBER	000C	
DOS_CLR_KEYB_BUF_MASK  . . . . .  	NUMBER	00C0	
DOS_CON_INP  . . . . . . . . . .  	NUMBER	0008	
DOS_DIR_CON_INP  . . . . . . . .  	NUMBER	0007	
DOS_DISP_CHAR  . . . . . . . . .  	NUMBER	0002	
DOS_DISP_STRING  . . . . . . . .  	NUMBER	0009	
DOS_DRIVE_LETTER . . . . . . . .  	L BYTE	00A8	CODE
DOS_EXIT . . . . . . . . . . . .  	L NEAR	0040	CODE
DOS_EXTENDED_OPEN  . . . . . . .  	NUMBER	6C00	
DOS_GET_ADDR . . . . . . . . . .  	NUMBER	0008	
DOS_GET_COUNTRY  . . . . . . . .  	NUMBER	0038	
DOS_GET_CRITICAL . . . . . . . .  	NUMBER	0004	
DOS_GET_DBCS_INFO  . . . . . . .  	NUMBER	6300	
DOS_GET_EXTENDED . . . . . . . .  	NUMBER	0000	
DOS_GET_EXT_ERROR  . . . . . . .  	NUMBER	0059	
DOS_GET_EXT_ERROR_BX . . . . . .  	NUMBER	0000	
DOS_GET_EXT_PARSE_ADD  . . . . .  	NUMBER	122E	
DOS_GET_FILE . . . . . . . . . .  	NUMBER	0006	
DOS_GET_PARSE  . . . . . . . . .  	NUMBER	0002	
DOS_GET_VERSION  . . . . . . . .  	NUMBER	0030	
DOS_IOCTL_GET_INFO . . . . . . .  	NUMBER	4400	
DOS_IOCTL_SET_INFO . . . . . . .  	NUMBER	4401	
DOS_KEYB_INP . . . . . . . . . .  	NUMBER	0001	
DOS_LSEEK_FILE . . . . . . . . .  	NUMBER	4200	
DOS_READ_BYTE  . . . . . . . . .  	NUMBER	003F	
DOS_SET_ADDR . . . . . . . . . .  	NUMBER	0009	
DOS_WRITE_HANDLE . . . . . . . .  	NUMBER	0040	
DOUBLE_9_SEC . . . . . . . . . .  	L NEAR	13FD	CODE
DRIVENUMB  . . . . . . . . . . .  	L BYTE	11A2	CODE
DRIVE_LET_SUBLIST  . . . . . . .  	L DWORD	11AC	CODE
DRVMAX . . . . . . . . . . . . .  	L BYTE	000A	CODE
DRVSW  . . . . . . . . . . . . .  	NUMBER	0000	
DSK$IN . . . . . . . . . . . . .  	L NEAR	001A	CODE
DSK$INIT . . . . . . . . . . . .  	L NEAR	11B8	CODE
DSKDEV . . . . . . . . . . . . .  	L WORD	0000	CODE
DSKDRV . . . . . . . . . . . . .  	L WORD	00A9	CODE
D_CONTROL  . . . . . . . . . . .  	L WORD	0865	CODE
D_LETTER . . . . . . . . . . . .  	L BYTE	11B7	CODE
D_SEG  . . . . . . . . . . . . .  	L WORD	11B0	CODE
D_VAL  . . . . . . . . . . . . .  	L BYTE	0871	CODE

ENDCODE  . . . . . . . . . . . .  	L WORD	00A9	CODE
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Symbols-6


END_SKIPNAME . . . . . . . . . .  	L NEAR	127C	CODE
ERR$EXIT . . . . . . . . . . . .  	L NEAR	117C	CODE
ERR$EXITJ2 . . . . . . . . . . .  	L NEAR	1268	CODE
ERR1 . . . . . . . . . . . . . .  	L NEAR	1190	CODE
ERROR_CLASS_39 . . . . . . . . .  	NUMBER	0001	
EXIT . . . . . . . . . . . . . .  	L NEAR	118E	CODE	Global
EXITP  . . . . . . . . . . . . .  	F PROC	0040	CODE	Length = 0004
EXPECTED_VERSION . . . . . . . .  	NUMBER	0004	
EXTRA  . . . . . . . . . . . . .  	NUMBER	0016	
EXT_ERR_39 . . . . . . . . . . .  	NUMBER	0027	
EXT_ERR_CLASS  . . . . . . . . .  	NUMBER	0001	

FALSE  . . . . . . . . . . . . .  	NUMBER	0000	
FARMSG . . . . . . . . . . . . .  	NUMBER	0000	
FARSW  . . . . . . . . . . . . .  	NUMBER	0000	
FCHANGED . . . . . . . . . . . .  	NUMBER	0040	
FCHANGED_BY_FORMAT . . . . . . .  	NUMBER	0100	
FCHANGELINE  . . . . . . . . . .  	NUMBER	0002	
FDRIVE . . . . . . . . . . . . .  	L NEAR	004A	CODE
FF48TPI  . . . . . . . . . . . .  	NUMBER	0000	
FF96TPI  . . . . . . . . . . . .  	NUMBER	0001	
FFACTOR  . . . . . . . . . . . .  	L BYTE	11A7	CODE
FFHARDFILE . . . . . . . . . . .  	NUMBER	0005	
FFOTHER  . . . . . . . . . . . .  	NUMBER	0007	
FFSMALL  . . . . . . . . . . . .  	NUMBER	0002	
FILESW . . . . . . . . . . . . .  	NUMBER	0000	
FILE_ID  . . . . . . . . . . . .  	L BYTE	009F	CODE
FI_AM_MULT . . . . . . . . . . .  	NUMBER	0010	
FI_OWN_PHYSICAL  . . . . . . . .  	NUMBER	0020	
FLAGCYLN . . . . . . . . . . . .  	NUMBER	0008	
FLAGDRIVE  . . . . . . . . . . .  	NUMBER	0004	
FLAGFF . . . . . . . . . . . . .  	NUMBER	0040	
FLAGHEADS  . . . . . . . . . . .  	NUMBER	0020	
FLAGS1 . . . . . . . . . . . . .  	L WORD	0067	CODE
FLAGSECLIM . . . . . . . . . . .  	NUMBER	0010	
FNON_REMOVABLE . . . . . . . . .  	NUMBER	0001	
FORMFCONT  . . . . . . . . . . .  	L NEAR	137B	CODE
FORMFD . . . . . . . . . . . . .  	NUMBER	000C	
F_CHOICES  . . . . . . . . . . .  	L BYTE	08D1	CODE
F_CONTROL  . . . . . . . . . . .  	L WORD	08C2	CODE
F_LBA  . . . . . . . . . . . . .  	NUMBER	0400	
F_VAL  . . . . . . . . . . . . .  	L BYTE	08CE	CODE

GETMSG . . . . . . . . . . . . .  	NUMBER	0000	
GET_RESULT . . . . . . . . . . .  	N PROC	12BE	CODE	Length = 00A3
GOODVER  . . . . . . . . . . . .  	L NEAR	11EB	CODE
GOOD_TRACKLAYOUT . . . . . . . .  	NUMBER	0008	
GOT_80_CYLN  . . . . . . . . . .  	L NEAR	138B	CODE
GOT_CORRECT_MEDIAD . . . . . . .  	L NEAR	1419	CODE
GR_DONE_RET  . . . . . . . . . .  	L NEAR	1360	CODE
GR_NOT_FOUND_RET . . . . . . . .  	L NEAR	135F	CODE
GR_RET . . . . . . . . . . . . .  	L NEAR	1354	CODE

HANDLE_SWITCHES  . . . . . . . .  	L NEAR	1454	CODE
HEADS  . . . . . . . . . . . . .  	L WORD	11A5	CODE
HEAD_2_DRV . . . . . . . . . . .  	L NEAR	13E0	CODE
HOME . . . . . . . . . . . . . .  	NUMBER	000B	
HS_CONTROL . . . . . . . . . . .  	L WORD	089B	CODE
HS_VAL . . . . . . . . . . . . .  	L BYTE	08AA	CODE

Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Symbols-7


IFSFUNC_INSTALLED  . . . . . . .  	NUMBER	00FF	
IFSFUNC_INSTALL_CHECK  . . . . .  	NUMBER	0500	
IFS_GET_ERR_TEXT . . . . . . . .  	NUMBER	0502	
INCSW  . . . . . . . . . . . . .  	NUMBER	0001	
INPUTMSG . . . . . . . . . . . .  	NUMBER	0000	
ITEM_TAG . . . . . . . . . . . .  	L BYTE	087D	CODE
ITEST  . . . . . . . . . . . . .  	NUMBER	0000	

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

LEFT_ALIGN . . . . . . . . . . .  	NUMBER	0000	
LF . . . . . . . . . . . . . . .  	NUMBER	000A	
LFEOLSW  . . . . . . . . . . . .  	NUMBER	0001	
LOADMSG  . . . . . . . . . . . .  	NUMBER	0000	
LOADOK_MSG_NUM . . . . . . . . .  	NUMBER	0003	
LOCUS_39 . . . . . . . . . . . .  	NUMBER	0001	
LOOP_NAME  . . . . . . . . . . .  	L NEAR	126F	CODE
LOWEST_4CH_VERSION . . . . . . .  	NUMBER	0002	
LOW_NIB_MASK . . . . . . . . . .  	NUMBER	000F	

MAJOR_VERSION  . . . . . . . . .  	NUMBER	0004	
MAX_MINI_DSK_NUM . . . . . . . .  	NUMBER	0017	
MEDIA  . . . . . . . . . . . . .  	NUMBER	000D	
MINOR_VERSION  . . . . . . . . .  	NUMBER	0000	
MSGDATA  . . . . . . . . . . . .  	NUMBER	0000	
MSG_SER_CLASS  . . . . . . . . .  	NUMBER	0000	

NEARMSG  . . . . . . . . . . . .  	NUMBER	FFFF	
NEW_EXPECTED_VERSION . . . . . .  	NUMBER	2605	
NEW_MAJOR_VERSION  . . . . . . .  	NUMBER	0005	
NEW_MINOR_VERSION  . . . . . . .  	NUMBER	0026	
NOCHECKSTDIN . . . . . . . . . .  	NUMBER	0000	
NOCHECKSTDOUT  . . . . . . . . .  	NUMBER	0000	
NODRIVE_MSG_NUM  . . . . . . . .  	NUMBER	0002	
NOT_48TPI  . . . . . . . . . . .  	L NEAR	1402	CODE
NOT_96TPI  . . . . . . . . . . .  	L NEAR	140F	CODE
NOT_EX_FAIL_EX_OPEN  . . . . . .  	NUMBER	0101	
NOT_INIT . . . . . . . . . . . .  	L NEAR	002C	CODE
NOVAL  . . . . . . . . . . . . .  	L BYTE	08C1	CODE
NOVERCHECKMSG  . . . . . . . . .  	NUMBER	0000	
NO_CRIT_OPEN . . . . . . . . . .  	NUMBER	2000	
NO_CYLN  . . . . . . . . . . . .  	L NEAR	146E	CODE
NO_HANDLE  . . . . . . . . . . .  	NUMBER	FFFF	
NO_INPUT . . . . . . . . . . . .  	NUMBER	0000	
NO_REPLACE . . . . . . . . . . .  	NUMBER	0000	
NO_SECLIM  . . . . . . . . . . .  	L NEAR	147E	CODE
NULL . . . . . . . . . . . . . .  	NUMBER	0000	
NUMMSG . . . . . . . . . . . . .  	NUMBER	0000	
NUMSW  . . . . . . . . . . . . .  	NUMBER	0001	

OPCNT1 . . . . . . . . . . . . .  	L WORD	0064	CODE

PARMS  . . . . . . . . . . . . .  	L BYTE	0854	CODE
PARMSX . . . . . . . . . . . . .  	L BYTE	0857	CODE
PARSELINE  . . . . . . . . . . .  	N PROC	127E	CODE	Length = 0040
PARSE_ERR_CLASS  . . . . . . . .  	NUMBER	0002	
PL_RET . . . . . . . . . . . . .  	L NEAR	12BC	CODE
PSDATA_SEG . . . . . . . . . . .  	ALIAS	 CS		
PTRSAV . . . . . . . . . . . . .  	L DWORD	000B	CODE

Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Symbols-8


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

RECBPB1  . . . . . . . . . . . .  	L WORD	006B	CODE
RESERVED . . . . . . . . . . . .  	NUMBER	0000	
RESTOREREGSANDRETURN . . . . . .  	L NEAR	1198	CODE
RESULT_VAL . . . . . . . . . . .  	L BYTE	087C	CODE
RETURN_FAKE_BPB  . . . . . . . .  	NUMBER	0004	
RIGHT_ALIGN  . . . . . . . . . .  	NUMBER	0080	
RV_BYTE  . . . . . . . . . . . .  	L BYTE	0880	CODE
RV_DWORD . . . . . . . . . . . .  	L DWORD	0880	CODE
RV_WORD  . . . . . . . . . . . .  	L WORD	0880	CODE

SCANBLANKS . . . . . . . . . . .  	L NEAR	1361	CODE
SETDRIVE . . . . . . . . . . . .  	L NEAR	1176	CODE
SETDRVPARMS  . . . . . . . . . .  	L NEAR	136C	CODE
SETSTDIO . . . . . . . . . . . .  	NUMBER	0000	
SET_ALL_DONE . . . . . . . . . .  	L NEAR	1453	CODE
SET_ALL_DONE_BRG . . . . . . . .  	L NEAR	13CD	CODE
SET_ALL_OK . . . . . . . . . . .  	L NEAR	1452	CODE
SET_DASD_TRUE  . . . . . . . . .  	NUMBER	0080	
SET_RECBPB . . . . . . . . . . .  	L NEAR	1392	CODE
SGN_BIN_BYTE . . . . . . . . . .  	NUMBER	0012	
SGN_BIN_DWORD  . . . . . . . . .  	NUMBER	0032	
SGN_BIN_TYPE . . . . . . . . . .  	NUMBER	0002	
SGN_BIN_WORD . . . . . . . . . .  	NUMBER	0022	
SHOW_MESSAGE . . . . . . . . . .  	N PROC	148F	CODE	Length = 000B
SINGLE_9_SEC . . . . . . . . . .  	L NEAR	13DB	CODE
SINGLE_MEDIAD  . . . . . . . . .  	L NEAR	13D0	CODE
SKIP_OVER_NAME . . . . . . . . .  	L NEAR	126C	CODE
SLIM . . . . . . . . . . . . . .  	L WORD	11A8	CODE
START  . . . . . . . . . . . . .  	NUMBER	0014	
STATUS . . . . . . . . . . . . .  	NUMBER	0003	
STCH_C . . . . . . . . . . . . .  	L NEAR	131F	CODE
STCH_F . . . . . . . . . . . . .  	L NEAR	132D	CODE
STCH_H . . . . . . . . . . . . .  	L NEAR	12F1	CODE
STCH_S . . . . . . . . . . . . .  	L NEAR	1308	CODE
STCH_T . . . . . . . . . . . . .  	L NEAR	12DA	CODE
STDAUX . . . . . . . . . . . . .  	NUMBER	0003	
STDERR . . . . . . . . . . . . .  	NUMBER	0002	
STDIN  . . . . . . . . . . . . .  	NUMBER	0000	
STDOUT . . . . . . . . . . . . .  	NUMBER	0001	
STDPRN . . . . . . . . . . . . .  	NUMBER	0004	
STRATEGY . . . . . . . . . . . .  	L NEAR	000F	CODE
STRATP . . . . . . . . . . . . .  	F PROC	000F	CODE	Length = 000B
SUBLIST_LENGTH . . . . . . . . .  	NUMBER	000B	
SWITCHES . . . . . . . . . . . .  	L WORD	11AA	CODE
SWITCHLIST . . . . . . . . . . .  	L BYTE	14E3	CODE
SWITCH_C . . . . . . . . . . . .  	L BYTE	08BE	CODE
SWITCH_D . . . . . . . . . . . .  	L BYTE	086E	CODE
SWITCH_F . . . . . . . . . . . .  	L BYTE	08CB	CODE
SWITCH_H . . . . . . . . . . . .  	L BYTE	08A4	CODE
SWITCH_S . . . . . . . . . . . .  	L BYTE	08A7	CODE
SWITCH_T . . . . . . . . . . . .  	L BYTE	088D	CODE
SWSW . . . . . . . . . . . . . .  	NUMBER	0001	
SYNONYM_PTR  . . . . . . . . . .  	L WORD	087E	CODE
SYSDISPMSG . . . . . . . . . . .  	N PROC	0CB4	CODE	Length = 0045
SYSLOADMSG . . . . . . . . . . .  	N PROC	0B67	CODE	Length = 0097
SYSPARSE . . . . . . . . . . . .  	N PROC	0148	CODE	Length = 0159
SYSP_END . . . . . . . . . . . .  	L NEAR	1298	CODE
SYSP_ERR . . . . . . . . . . . .  	L NEAR	12B8	CODE
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Symbols-9


SYSP_FAIL  . . . . . . . . . . .  	L NEAR	12B0	CODE
SYSP_OK  . . . . . . . . . . . .  	L NEAR	12BB	CODE
SYSP_WHILE . . . . . . . . . . .  	L NEAR	1282	CODE

TAB  . . . . . . . . . . . . . .  	NUMBER	0009	
TIMEMSG  . . . . . . . . . . . .  	NUMBER	0000	
TIMESW . . . . . . . . . . . . .  	NUMBER	0000	
TIME_24_TYPE . . . . . . . . . .  	NUMBER	0006	
TIME_CTY_TYPE  . . . . . . . . .  	NUMBER	0005	
TIME_HHMMSSHH_24 . . . . . . . .  	NUMBER	0026	
TIME_HHMMSSHH_CTY  . . . . . . .  	NUMBER	0025	
TIME_HHMMSS_24 . . . . . . . . .  	NUMBER	0016	
TIME_HHMMSS_CTY  . . . . . . . .  	NUMBER	0015	
TIME_HHMM_24 . . . . . . . . . .  	NUMBER	0006	
TIME_HHMM_CTY  . . . . . . . . .  	NUMBER	0005	
TIM_HI1  . . . . . . . . . . . .  	L WORD	008D	CODE
TIM_LO1  . . . . . . . . . . . .  	L WORD	008B	CODE
TRACK1 . . . . . . . . . . . . .  	L BYTE	008A	CODE
TRANS  . . . . . . . . . . . . .  	NUMBER	000E	
TRUE . . . . . . . . . . . . . .  	NUMBER	FFFF	
T_CONTROL  . . . . . . . . . . .  	L WORD	0884	CODE
T_VAL  . . . . . . . . . . . . .  	L BYTE	0890	CODE

UNFORMATTED_MEDIA  . . . . . . .  	NUMBER	0200	
UNIT . . . . . . . . . . . . . .  	NUMBER	0001	
UNSGN_BIN_BYTE . . . . . . . . .  	NUMBER	0011	
UNSGN_BIN_DWORD  . . . . . . . .  	NUMBER	0031	
UNSGN_BIN_TYPE . . . . . . . . .  	NUMBER	0001	
UNSGN_BIN_WORD . . . . . . . . .  	NUMBER	0021	
UTILITY_MSG_CLASS  . . . . . . .  	NUMBER	00FF	

VAL1SW . . . . . . . . . . . . .  	NUMBER	0001	
VAL2SW . . . . . . . . . . . . .  	NUMBER	0001	
VAL3SW . . . . . . . . . . . . .  	NUMBER	0000	
VOLID1 . . . . . . . . . . . . .  	L BYTE	008F	CODE
VOLSER . . . . . . . . . . . . .  	L DWORD	009B	CODE

$MDO123  . . . . . . . . . . . .  	L NEAR	0D59	CODE
$MDO139  . . . . . . . . . . . .  	L NEAR	0DC1	CODE
$MDO145  . . . . . . . . . . . .  	L NEAR	0DE3	CODE
$MDO165  . . . . . . . . . . . .  	L NEAR	0E45	CODE
$MDO167  . . . . . . . . . . . .  	L NEAR	0E4F	CODE
$MDO175  . . . . . . . . . . . .  	L NEAR	0E7B	CODE
$MDO215  . . . . . . . . . . . .  	L NEAR	0F2C	CODE
$MDO219  . . . . . . . . . . . .  	L NEAR	0F51	CODE
$MDO259  . . . . . . . . . . . .  	L NEAR	1039	CODE
$MDO280  . . . . . . . . . . . .  	L NEAR	10A6	CODE
$MDO291  . . . . . . . . . . . .  	L NEAR	10D1	CODE
$MDO301  . . . . . . . . . . . .  	L NEAR	10FF	CODE
$MDO310  . . . . . . . . . . . .  	L NEAR	1125	CODE
$MDO321  . . . . . . . . . . . .  	L NEAR	1167	CODE
$MEN104  . . . . . . . . . . . .  	L NEAR	0CF8	CODE
$MEN107  . . . . . . . . . . . .  	L NEAR	0D0D	CODE
$MEN110  . . . . . . . . . . . .  	L NEAR	0D2E	CODE
$MEN119  . . . . . . . . . . . .  	L NEAR	0D66	CODE
$MEN123  . . . . . . . . . . . .  	L NEAR	0D66	CODE
$MEN128  . . . . . . . . . . . .  	L NEAR	0D95	CODE
$MEN139  . . . . . . . . . . . .  	L NEAR	0DD8	CODE
$MEN145  . . . . . . . . . . . .  	L NEAR	0E3C	CODE
$MEN146  . . . . . . . . . . . .  	L NEAR	0DF9	CODE
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Symbols-10


$MEN150  . . . . . . . . . . . .  	L NEAR	0E37	CODE
$MEN154  . . . . . . . . . . . .  	L NEAR	0E37	CODE
$MEN165  . . . . . . . . . . . .  	L NEAR	0F17	CODE
$MEN167  . . . . . . . . . . . .  	L NEAR	0E6C	CODE
$MEN175  . . . . . . . . . . . .  	L NEAR	0E94	CODE
$MEN180  . . . . . . . . . . . .  	L NEAR	0EA6	CODE
$MEN187  . . . . . . . . . . . .  	L NEAR	0ED9	CODE
$MEN188  . . . . . . . . . . . .  	L NEAR	0EC7	CODE
$MEN192  . . . . . . . . . . . .  	L NEAR	0ED9	CODE
$MEN199  . . . . . . . . . . . .  	L NEAR	0EFE	CODE
$MEN20 . . . . . . . . . . . . .  	L NEAR	0BFD	CODE
$MEN200  . . . . . . . . . . . .  	L NEAR	0EF6	CODE
$MEN211  . . . . . . . . . . . .  	L NEAR	0F0B	CODE
$MEN219  . . . . . . . . . . . .  	L NEAR	0FB2	CODE
$MEN220  . . . . . . . . . . . .  	L NEAR	0F83	CODE
$MEN222  . . . . . . . . . . . .  	L NEAR	0F83	CODE
$MEN224  . . . . . . . . . . . .  	L NEAR	0F83	CODE
$MEN229  . . . . . . . . . . . .  	L NEAR	0FAA	CODE
$MEN230  . . . . . . . . . . . .  	L NEAR	0F9C	CODE
$MEN240  . . . . . . . . . . . .  	L NEAR	0FD2	CODE
$MEN243  . . . . . . . . . . . .  	L NEAR	0FDF	CODE
$MEN247  . . . . . . . . . . . .  	L NEAR	1036	CODE
$MEN248  . . . . . . . . . . . .  	L NEAR	101A	CODE
$MEN25 . . . . . . . . . . . . .  	L NEAR	0CB3	CODE
$MEN252  . . . . . . . . . . . .  	L NEAR	1032	CODE
$MEN259  . . . . . . . . . . . .  	L NEAR	1056	CODE
$MEN261  . . . . . . . . . . . .  	L NEAR	104A	CODE
$MEN27 . . . . . . . . . . . . .  	L NEAR	0CA8	CODE
$MEN292  . . . . . . . . . . . .  	L NEAR	10E4	CODE
$MEN307  . . . . . . . . . . . .  	L NEAR	112D	CODE
$MEN314  . . . . . . . . . . . .  	L NEAR	114D	CODE
$MEN317  . . . . . . . . . . . .  	L NEAR	1174	CODE
$MEN321  . . . . . . . . . . . .  	L NEAR	1172	CODE
$MEN93 . . . . . . . . . . . . .  	L NEAR	0CEC	CODE
$MEN94 . . . . . . . . . . . . .  	L NEAR	0CD8	CODE
$MEN97 . . . . . . . . . . . . .  	L NEAR	0CE6	CODE
$MIF104  . . . . . . . . . . . .  	L NEAR	0CF4	CODE
$MIF107  . . . . . . . . . . . .  	L NEAR	0D0A	CODE
$MIF110  . . . . . . . . . . . .  	L NEAR	0D1E	CODE
$MIF112  . . . . . . . . . . . .  	L NEAR	0D2E	CODE
$MIF113  . . . . . . . . . . . .  	L NEAR	0D2E	CODE
$MIF117  . . . . . . . . . . . .  	L NEAR	0D33	CODE
$MIF119  . . . . . . . . . . . .  	L NEAR	0D57	CODE
$MIF120  . . . . . . . . . . . .  	L NEAR	0D55	CODE
$MIF127  . . . . . . . . . . . .  	L NEAR	0D96	CODE
$MIF128  . . . . . . . . . . . .  	L NEAR	0D93	CODE
$MIF129  . . . . . . . . . . . .  	L NEAR	0D91	CODE
$MIF134  . . . . . . . . . . . .  	L NEAR	0DB6	CODE
$MIF135  . . . . . . . . . . . .  	L NEAR	0DB6	CODE
$MIF138  . . . . . . . . . . . .  	L NEAR	0DD8	CODE
$MIF141  . . . . . . . . . . . .  	L NEAR	0DD4	CODE
$MIF146  . . . . . . . . . . . .  	L NEAR	0DF6	CODE
$MIF150  . . . . . . . . . . . .  	L NEAR	0E15	CODE
$MIF151  . . . . . . . . . . . .  	L NEAR	0E13	CODE
$MIF154  . . . . . . . . . . . .  	L NEAR	0E27	CODE
$MIF155  . . . . . . . . . . . .  	L NEAR	0E25	CODE
$MIF158  . . . . . . . . . . . .  	L NEAR	0E37	CODE
$MIF159  . . . . . . . . . . . .  	L NEAR	0E37	CODE
$MIF166  . . . . . . . . . . . .  	L NEAR	0E6C	CODE
$MIF169  . . . . . . . . . . . .  	L NEAR	0E67	CODE
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Symbols-11


$MIF173  . . . . . . . . . . . .  	L NEAR	0EA6	CODE
$MIF174  . . . . . . . . . . . .  	L NEAR	0EA6	CODE
$MIF175  . . . . . . . . . . . .  	L NEAR	0E88	CODE
$MIF180  . . . . . . . . . . . .  	L NEAR	0EA3	CODE
$MIF187  . . . . . . . . . . . .  	L NEAR	0EC9	CODE
$MIF188  . . . . . . . . . . . .  	L NEAR	0EC6	CODE
$MIF192  . . . . . . . . . . . .  	L NEAR	0ED0	CODE
$MIF194  . . . . . . . . . . . .  	L NEAR	0ED7	CODE
$MIF199  . . . . . . . . . . . .  	L NEAR	0EFB	CODE
$MIF20 . . . . . . . . . . . . .  	L NEAR	0BF9	CODE
$MIF200  . . . . . . . . . . . .  	L NEAR	0EF6	CODE
$MIF211  . . . . . . . . . . . .  	L NEAR	0F07	CODE
$MIF216  . . . . . . . . . . . .  	L NEAR	0F3A	CODE
$MIF220  . . . . . . . . . . . .  	L NEAR	0F5E	CODE
$MIF222  . . . . . . . . . . . .  	L NEAR	0F6B	CODE
$MIF224  . . . . . . . . . . . .  	L NEAR	0F7D	CODE
$MIF229  . . . . . . . . . . . .  	L NEAR	0F9E	CODE
$MIF23 . . . . . . . . . . . . .  	L NEAR	0C13	CODE
$MIF230  . . . . . . . . . . . .  	L NEAR	0F90	CODE
$MIF234  . . . . . . . . . . . .  	L NEAR	0FA6	CODE
$MIF239  . . . . . . . . . . . .  	L NEAR	0FE1	CODE
$MIF240  . . . . . . . . . . . .  	L NEAR	0FD1	CODE
$MIF243  . . . . . . . . . . . .  	L NEAR	0FD9	CODE
$MIF247  . . . . . . . . . . . .  	L NEAR	101C	CODE
$MIF248  . . . . . . . . . . . .  	L NEAR	1016	CODE
$MIF25 . . . . . . . . . . . . .  	L NEAR	0C9B	CODE
$MIF252  . . . . . . . . . . . .  	L NEAR	1029	CODE
$MIF254  . . . . . . . . . . . .  	L NEAR	1032	CODE
$MIF258  . . . . . . . . . . . .  	L NEAR	1065	CODE
$MIF259  . . . . . . . . . . . .  	L NEAR	104E	CODE
$MIF261  . . . . . . . . . . . .  	L NEAR	1047	CODE
$MIF269  . . . . . . . . . . . .  	L NEAR	1065	CODE
$MIF27 . . . . . . . . . . . . .  	L NEAR	0CA5	CODE
$MIF270  . . . . . . . . . . . .  	L NEAR	1061	CODE
$MIF274  . . . . . . . . . . . .  	L NEAR	106D	CODE
$MIF276  . . . . . . . . . . . .  	L NEAR	108C	CODE
$MIF278  . . . . . . . . . . . .  	L NEAR	10BA	CODE
$MIF279  . . . . . . . . . . . .  	L NEAR	10BA	CODE
$MIF281  . . . . . . . . . . . .  	L NEAR	10B6	CODE
$MIF286  . . . . . . . . . . . .  	L NEAR	10CD	CODE
$MIF287  . . . . . . . . . . . .  	L NEAR	10CD	CODE
$MIF290  . . . . . . . . . . . .  	L NEAR	10F5	CODE
$MIF292  . . . . . . . . . . . .  	L NEAR	10E3	CODE
$MIF295  . . . . . . . . . . . .  	L NEAR	10F1	CODE
$MIF299  . . . . . . . . . . . .  	L NEAR	1113	CODE
$MIF300  . . . . . . . . . . . .  	L NEAR	1113	CODE
$MIF302  . . . . . . . . . . . .  	L NEAR	110F	CODE
$MIF307  . . . . . . . . . . . .  	L NEAR	1121	CODE
$MIF309  . . . . . . . . . . . .  	L NEAR	112D	CODE
$MIF314  . . . . . . . . . . . .  	L NEAR	1149	CODE
$MIF317  . . . . . . . . . . . .  	L NEAR	1167	CODE
$MIF318  . . . . . . . . . . . .  	L NEAR	1165	CODE
$MIF93 . . . . . . . . . . . . .  	L NEAR	0CE8	CODE
$MIF94 . . . . . . . . . . . . .  	L NEAR	0CD5	CODE
$MIF97 . . . . . . . . . . . . .  	L NEAR	0CE2	CODE
$MLL149  . . . . . . . . . . . .  	L NEAR	0E03	CODE
$MLL168  . . . . . . . . . . . .  	L NEAR	0E5E	CODE
$MLL178  . . . . . . . . . . . .  	L NEAR	0E90	CODE
$MLL214  . . . . . . . . . . . .  	L NEAR	0F17	CODE
$MSR175  . . . . . . . . . . . .  	L NEAR	0EA6	CODE
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Symbols-12


$MSR259  . . . . . . . . . . . .  	L NEAR	1057	CODE
$MXL3  . . . . . . . . . . . . .  	L NEAR	0EB3	CODE
$MXL4  . . . . . . . . . . . . .  	L NEAR	0F17	CODE
$MXL5  . . . . . . . . . . . . .  	L NEAR	0FB2	CODE
$M_1_FF_END  . . . . . . . . . .  	L BYTE	09E3	CODE
$M_1_FF_MSG  . . . . . . . . . .  	L BYTE	09D1	CODE
$M_1_FF_STRUC  . . . . . . . . .  	L BYTE	09CD	CODE
$M_2_00001H_END  . . . . . . . .  	L BYTE	0A25	CODE
$M_2_00001H_MSG  . . . . . . . .  	L BYTE	0A11	CODE
$M_2_00001H_STRUC  . . . . . . .  	L BYTE	09F1	CODE
$M_2_00002H_END  . . . . . . . .  	L BYTE	0A40	CODE
$M_2_00002H_MSG  . . . . . . . .  	L BYTE	0A25	CODE
$M_2_00002H_STRUC  . . . . . . .  	L BYTE	09F5	CODE
$M_2_00003H_END  . . . . . . . .  	L BYTE	0A4F	CODE
$M_2_00003H_MSG  . . . . . . . .  	L BYTE	0A40	CODE
$M_2_00003H_STRUC  . . . . . . .  	L BYTE	09F9	CODE
$M_2_00004H_END  . . . . . . . .  	L BYTE	0A5F	CODE
$M_2_00004H_MSG  . . . . . . . .  	L BYTE	0A4F	CODE
$M_2_00004H_STRUC  . . . . . . .  	L BYTE	09FD	CODE
$M_2_00006H_END  . . . . . . . .  	L BYTE	0A84	CODE
$M_2_00006H_MSG  . . . . . . . .  	L BYTE	0A5F	CODE
$M_2_00006H_STRUC  . . . . . . .  	L BYTE	0A01	CODE
$M_2_00007H_END  . . . . . . . .  	L BYTE	0AA0	CODE
$M_2_00007H_MSG  . . . . . . . .  	L BYTE	0A84	CODE
$M_2_00007H_STRUC  . . . . . . .  	L BYTE	0A05	CODE
$M_2_00008H_END  . . . . . . . .  	L BYTE	0ABC	CODE
$M_2_00008H_MSG  . . . . . . . .  	L BYTE	0AA0	CODE
$M_2_00008H_STRUC  . . . . . . .  	L BYTE	0A09	CODE
$M_2_FF_END  . . . . . . . . . .  	L BYTE	0ACB	CODE
$M_2_FF_MSG  . . . . . . . . . .  	L BYTE	0ABC	CODE
$M_2_FF_STRUC  . . . . . . . . .  	L BYTE	0A0D	CODE
$M_ADDR_SZ_FAR . . . . . . . . .  	NUMBER	0004	
$M_ADDR_SZ_NEAR  . . . . . . . .  	NUMBER	0002	
$M_ADD_CRLF  . . . . . . . . . .  	N PROC	0DA0	CODE	Length = 0017
$M_ALIGN_MASK  . . . . . . . . .  	NUMBER	0080	
$M_AM  . . . . . . . . . . . . .  	NUMBER	0061	
$M_A_00001H_END  . . . . . . . .  	L BYTE	0AFE	CODE
$M_A_00001H_MSG  . . . . . . . .  	L BYTE	0AE6	CODE
$M_A_00001H_STRUC  . . . . . . .  	L BYTE	0ADA	CODE
$M_A_00002H_END  . . . . . . . .  	L BYTE	0B13	CODE
$M_A_00002H_MSG  . . . . . . . .  	L BYTE	0AFE	CODE
$M_A_00002H_STRUC  . . . . . . .  	L BYTE	0ADE	CODE
$M_A_00003H_END  . . . . . . . .  	L BYTE	0B3E	CODE
$M_A_00003H_MSG  . . . . . . . .  	L BYTE	0B13	CODE
$M_A_00003H_STRUC  . . . . . . .  	L BYTE	0AE2	CODE
$M_BASE10  . . . . . . . . . . .  	NUMBER	000A	
$M_BASE16  . . . . . . . . . . .  	NUMBER	0010	
$M_BYTE  . . . . . . . . . . . .  	NUMBER	0010	
$M_CHAR_ONLY . . . . . . . . . .  	NUMBER	FFFF	
$M_CHAR_REPLACE  . . . . . . . .  	N PROC	114E	CODE	Length = 0028
$M_CHECKSTDIN  . . . . . . . . .  	N PROC	0C16	CODE	Length = 0013
$M_CHECKSTDOUT . . . . . . . . .  	N PROC	0C29	CODE	Length = 0013
$M_CLASS_1_STRUC . . . . . . . .  	L BYTE	09C9	CODE
$M_CLASS_2_STRUC . . . . . . . .  	L BYTE	09ED	CODE
$M_CLASS_A_STRUC . . . . . . . .  	L BYTE	0AD6	CODE
$M_CLASS_ID_SZ . . . . . . . . .  	NUMBER	0004	
$M_CLASS_NOT_EXIST . . . . . . .  	NUMBER	0000	
$M_CLS_1 . . . . . . . . . . . .  	N PROC	0B3E	CODE	Global	Length = 000A
$M_COMMA . . . . . . . . . . . .  	NUMBER	002C	
$M_CONVERT2ASC . . . . . . . . .  	N PROC	0DDB	CODE	Length = 006A
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Symbols-13


$M_CON_INP . . . . . . . . . . .  	NUMBER	-0001	
$M_COUNT . . . . . . . . . . . .  	NUMBER	0001	
$M_CRIT_ERR_MASK . . . . . . . .  	NUMBER	0001	
$M_CRIT_HI . . . . . . . . . . .  	NUMBER	0027	
$M_CRIT_LO . . . . . . . . . . .  	NUMBER	0013	
$M_CRLF_SIZE . . . . . . . . . .  	NUMBER	0002	
$M_CR_LF . . . . . . . . . . . .  	NUMBER	0A0D	
$M_DATE_MASK . . . . . . . . . .  	NUMBER	0010	
$M_DBCS_TERM . . . . . . . . . .  	NUMBER	0000	
$M_DEF_DATE_FORM . . . . . . . .  	NUMBER	0000	
$M_DEF_DATE_SEP  . . . . . . . .  	NUMBER	002D	
$M_DEF_DECI_SEP  . . . . . . . .  	NUMBER	002E	
$M_DEF_TIME_FORM . . . . . . . .  	NUMBER	0001	
$M_DEF_TIME_SEP  . . . . . . . .  	NUMBER	003A	
$M_DISPLAY_$_STRING  . . . . . .  	N PROC	0D34	CODE	Length = 0035
$M_DISPLAY_H_STRING  . . . . . .  	N PROC	0D69	CODE	Length = 002E
$M_DISPLAY_MESSAGE . . . . . . .  	N PROC	0E45	CODE	Length = 00D9
$M_DISPLAY_REPLACE . . . . . . .  	N PROC	1073	CODE	Length = 00BF
$M_DISPLAY_STRING  . . . . . . .  	N PROC	0CF9	CODE	Length = 003B
$M_DWORD . . . . . . . . . . . .  	NUMBER	0030	
$M_END . . . . . . . . . . . . .  	NUMBER	0000	
$M_EXTPAR_TYPE . . . . . . . . .  	NUMBER	0008	
$M_EXT_CLS . . . . . . . . . . .  	NUMBER	FFFF	
$M_EXT_ERR_FLAG  . . . . . . . .  	NUMBER	FFFF	
$M_EXT_PAR_REPLACE . . . . . . .  	N PROC	0F1E	CODE	Length = 002D
$M_FIND_SPECIFIED_MSG  . . . . .  	N PROC	0FFA	CODE	Length = 0079
$M_FIRST_THOU  . . . . . . . . .  	NUMBER	0003	
$M_FLUSH_BUF . . . . . . . . . .  	N PROC	1132	CODE	Length = 001C
$M_GET_DBCS_VEC  . . . . . . . .  	N PROC	0BFE	CODE	Length = 0018
$M_GET_EXT_ERR_39  . . . . . . .  	N PROC	0D97	CODE	Length = 0009
$M_GET_MSG_ADDRESS . . . . . . .  	N PROC	0F4B	CODE	Length = 00A0
$M_ID_SZ . . . . . . . . . . . .  	NUMBER	0004	
$M_INCLUDE . . . . . . . . . . .  	NUMBER	0000	
$M_INDEX . . . . . . . . . . . .  	NUMBER	0004	
$M_IS_IT_DBCS  . . . . . . . . .  	N PROC	0DB7	CODE	Length = 0024
$M_LOAD  . . . . . . . . . . . .  	NUMBER	FFFF	
$M_MAX_2_YEAR  . . . . . . . . .  	NUMBER	0063	
$M_MSGDATA_ONLY  . . . . . . . .  	NUMBER	0000	
$M_MSGSERV_1 . . . . . . . . . .  	N PROC	09E3	CODE	Global	Length = 000A
$M_MSGSERV_2 . . . . . . . . . .  	N PROC	0ACB	CODE	Global	Length = 000B
$M_NEG_SIGN  . . . . . . . . . .  	NUMBER	002D	
$M_NEXT_DBCS_VECTOR  . . . . . .  	NUMBER	0002	
$M_NO_CRLF_MASK  . . . . . . . .  	NUMBER	0080	
$M_NO_HANDLE . . . . . . . . . .  	NUMBER	-0001	
$M_NULL  . . . . . . . . . . . .  	NUMBER	0000	
$M_NUM_CLS . . . . . . . . . . .  	NUMBER	0001	
$M_ONE_REPLACE . . . . . . . . .  	NUMBER	0001	
$M_PARSE_FLAG  . . . . . . . . .  	NUMBER	FFFF	
$M_PAR_CLS . . . . . . . . . . .  	NUMBER	FFFF	
$M_PM  . . . . . . . . . . . . .  	NUMBER	0070	
$M_REPLACE . . . . . . . . . . .  	NUMBER	FFFF	
$M_REPL_DONE . . . . . . . . . .  	NUMBER	0000	
$M_RES_ADDRS_SZ  . . . . . . . .  	NUMBER	0085	
$M_RT  . . . . . . . . . . . . .  	L BYTE	08E5	CODE
$M_SECOND_THOU . . . . . . . . .  	NUMBER	0006	
$M_SERVICE . . . . . . . . . . .  	NUMBER	FFFF	
$M_SET_LEN_IN_CX . . . . . . . .  	N PROC	0FEB	CODE	Length = 000F
$M_SINGLE_CHAR . . . . . . . . .  	NUMBER	0001	
$M_SIZE_MASK . . . . . . . . . .  	NUMBER	0030	
$M_SL  . . . . . . . . . . . . .  	TEXT  DS:[SI]		
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Symbols-14


$M_SPACE . . . . . . . . . . . .  	NUMBER	0020	
$M_SPACE_HYP . . . . . . . . . .  	NUMBER	2D20	
$M_SPECIAL_CASE  . . . . . . . .  	NUMBER	0030	
$M_SPECIAL_MSG_NUM . . . . . . .  	NUMBER	FFFF	
$M_STRUC . . . . . . . . . . . .  	NUMBER	0000	
$M_SUBS  . . . . . . . . . . . .  	NUMBER	0000	
$M_TEMP_BUF_SZ . . . . . . . . .  	NUMBER	0040	
$M_TERMINATING_FLAG  . . . . . .  	NUMBER	-0001	
$M_THIRD_THOU  . . . . . . . . .  	NUMBER	0009	
$M_TIMEDATE_PAD  . . . . . . . .  	NUMBER	0030	
$M_TIME_MASK . . . . . . . . . .  	NUMBER	0001	
$M_TYPE_MASK . . . . . . . . . .  	NUMBER	000F	
$M_UNLIM_W . . . . . . . . . . .  	NUMBER	0000	
$M_VERSION_CHECK . . . . . . . .  	N PROC	0C85	CODE	Length = 002F
$M_WORD  . . . . . . . . . . . .  	NUMBER	0020	
$P_0099  . . . . . . . . . . . .  	N PROC	064C	CODE	Length = 000E
$P_0099ERR . . . . . . . . . . .  	L NEAR	0658	CODE
$P_ASCII80 . . . . . . . . . . .  	NUMBER	0080	
$P_BRIDGE  . . . . . . . . . . .  	L NEAR	0416	CODE
$P_CAPS_RET  . . . . . . . . . .  	L NEAR	04F8	CODE
$P_CAP_CHAR  . . . . . . . . . .  	NUMBER	0002	
$P_CAP_FILE  . . . . . . . . . .  	NUMBER	0001	
$P_CHAR_CAP_PTR  . . . . . . . .  	L BYTE	0142	CODE
$P_CHECK_MATCH_FLAGS . . . . . .  	N PROC	03EE	CODE	Length = 0081
$P_CHECK_OVF . . . . . . . . . .  	N PROC	063A	CODE	Length = 0012
$P_CHKDFIN . . . . . . . . . . .  	L NEAR	07C7	CODE
$P_CHK_DBCS  . . . . . . . . . .  	N PROC	07FE	CODE	Length = 0056
$P_CHK_DELIM . . . . . . . . . .  	N PROC	077F	CODE	Length = 0061
$P_CHK_DELIM00 . . . . . . . . .  	L NEAR	0799	CODE
$P_CHK_DELIM01 . . . . . . . . .  	L NEAR	07A9	CODE
$P_CHK_DELIM_EXIT  . . . . . . .  	L NEAR	07C7	CODE
$P_CHK_DELIM_EXIT0 . . . . . . .  	L NEAR	07CA	CODE
$P_CHK_DELIM_LOOP  . . . . . . .  	L NEAR	07BD	CODE
$P_CHK_DELIM_NZ  . . . . . . . .  	L NEAR	07C5	CODE
$P_CHK_EOL . . . . . . . . . . .  	N PROC	0749	CODE	Length = 0036
$P_CHK_EOL_EXIT  . . . . . . . .  	L NEAR	077C	CODE
$P_CHK_EOL_LOOP  . . . . . . . .  	L NEAR	0772	CODE
$P_CHK_EOL_NZ  . . . . . . . . .  	L NEAR	077A	CODE
$P_CHK_IF_DATA_REQUIRED  . . . .  	L NEAR	033F	CODE
$P_CHK_KEY_CONTROL . . . . . . .  	N PROC	02D3	CODE	Length = 0002
$P_CHK_POS_CONTROL . . . . . . .  	N PROC	02A1	CODE	Length = 0032
$P_CHK_SWITCH  . . . . . . . . .  	N PROC	07E0	CODE	Length = 001E
$P_CHK_SW_CONTROL  . . . . . . .  	N PROC	0306	CODE	Length = 0063
$P_CHK_SW_ERR0 . . . . . . . . .  	L NEAR	035B	CODE
$P_CHK_SW_EXIT . . . . . . . . .  	L NEAR	035E	CODE
$P_CHK_SW_SINGLE_EXIT  . . . . .  	L NEAR	0368	CODE
$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_COVF  . . . . . . . . . . . .  	L NEAR	0645	CODE
$P_COVF00  . . . . . . . . . . .  	L NEAR	064A	CODE
$P_CPC00 . . . . . . . . . . . .  	L NEAR	02AF	CODE
$P_CPC01 . . . . . . . . . . . .  	L NEAR	02CE	CODE
$P_CPC02 . . . . . . . . . . . .  	L NEAR	02C3	CODE
$P_CPC_EXIT  . . . . . . . . . .  	L NEAR	02D1	CODE
$P_CR  . . . . . . . . . . . . .  	NUMBER	000D	
$P_CSW00 . . . . . . . . . . . .  	L NEAR	0355	CODE
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Symbols-15


$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	0830	CODE
$P_DBCS01  . . . . . . . . . . .  	L NEAR	084B	CODE
$P_DBCS02  . . . . . . . . . . .  	L NEAR	0826	CODE
$P_DBCSEV_OFF  . . . . . . . . .  	L WORD	00B4	CODE
$P_DBCSEV_SEG  . . . . . . . . .  	L WORD	00B6	CODE
$P_DBCS_EXIT . . . . . . . . . .  	L NEAR	0850	CODE
$P_DBCS_LOOP . . . . . . . . . .  	L NEAR	083A	CODE
$P_DBSP1 . . . . . . . . . . . .  	NUMBER	0081	
$P_DBSP2 . . . . . . . . . . . .  	NUMBER	0040	
$P_DCC00 . . . . . . . . . . . .  	L NEAR	04CB	CODE
$P_DCC01 . . . . . . . . . . . .  	L NEAR	04E7	CODE
$P_DCC_GO  . . . . . . . . . . .  	L NEAR	04C4	CODE
$P_DCS00 . . . . . . . . . . . .  	L NEAR	04AD	CODE
$P_DCS01 . . . . . . . . . . . .  	L NEAR	04AE	CODE
$P_DCS_EXIT  . . . . . . . . . .  	L NEAR	04B1	CODE
$P_DCS_LOOP  . . . . . . . . . .  	L NEAR	0499	CODE
$P_DOSTBL_BL . . . . . . . . . .  	NUMBER	0005	
$P_DOSTBL_CHAR . . . . . . . . .  	NUMBER	0002	
$P_DOSTBL_DEF  . . . . . . . . .  	NUMBER	-0001	
$P_DOSTBL_FILE . . . . . . . . .  	NUMBER	0004	
$P_DOS_GETEV . . . . . . . . . .  	NUMBER	6300	
$P_DOS_GET_CDI . . . . . . . . .  	NUMBER	3800	
$P_DOS_GET_TBL . . . . . . . . .  	NUMBER	0065	
$P_DO_CAPS_CHAR  . . . . . . . .  	N PROC	04B4	CODE	Length = 0045
$P_DO_CAPS_STRING  . . . . . . .  	N PROC	0495	CODE	Length = 001F
$P_DQUOTE  . . . . . . . . . . .  	NUMBER	0022	
$P_DRIVE . . . . . . . . . . . .  	NUMBER	0006	
$P_DRV_ONLY  . . . . . . . . . .  	NUMBER	0100	
$P_DX  . . . . . . . . . . . . .  	L WORD	00B1	CODE
$P_EOL . . . . . . . . . . . . .  	NUMBER	0000	
$P_EQU . . . . . . . . . . . . .  	NUMBER	0001	
$P_ERROR_FILESPEC  . . . . . . .  	NUMBER	0001	
$P_ERR_FLAG  . . . . . . . . . .  	L BYTE	0147	CODE
$P_EXIT_AT_EXTRA . . . . . . . .  	L NEAR	0747	CODE
$P_EXTRA . . . . . . . . . . . .  	NUMBER	0020	
$P_FILE_SPC  . . . . . . . . . .  	NUMBER	0200	
$P_FILE_SPEC . . . . . . . . . .  	NUMBER	0005	
$P_FILL_RESULT . . . . . . . . .  	N PROC	0369	CODE	Length = 0085
$P_FIN . . . . . . . . . . . . .  	L NEAR	017E	CODE
$P_FLAGS . . . . . . . . . . . .  	L WORD	00B8	CODE
$P_FLAGS1  . . . . . . . . . . .  	BYTE	00B8	CODE
$P_FLAGS2  . . . . . . . . . . .  	BYTE	00B9	CODE
$P_FOUND_SYNONYM . . . . . . . .  	L WORD	00C0	CODE
$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	02F7	CODE
$P_KEYORSW_FOUND . . . . . . . .  	L NEAR	02F1	CODE
$P_KEYORSW_LOOP  . . . . . . . .  	L NEAR	02E4	CODE
$P_KEYORSW_NOT_FOUND . . . . . .  	L NEAR	02EE	CODE
$P_KEYORSW_PTR . . . . . . . . .  	L WORD	00BC	CODE
$P_KEYWORD . . . . . . . . . . .  	NUMBER	003D	
$P_KEY_CMP . . . . . . . . . . .  	NUMBER	0008	
$P_KEY_MANAGER . . . . . . . . .  	L NEAR	0250	CODE
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Symbols-16


$P_KEY_MGR_LOOP  . . . . . . . .  	L NEAR	026F	CODE
$P_KEY_NOT_FOUND . . . . . . . .  	L NEAR	027D	CODE
$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_LPAREN  . . . . . . . . . . .  	NUMBER	0028	
$P_MAKE_LOWER  . . . . . . . . .  	NUMBER	0020	
$P_MAKE_UPPER  . . . . . . . . .  	NUMBER	00DF	
$P_MAT . . . . . . . . . . . . .  	L NEAR	0414	CODE
$P_MATCH03 . . . . . . . . . . .  	L NEAR	0419	CODE
$P_MATCH04 . . . . . . . . . . .  	L NEAR	0430	CODE
$P_MATCH05 . . . . . . . . . . .  	L NEAR	0447	CODE
$P_MATCH09 . . . . . . . . . . .  	L NEAR	0456	CODE
$P_MATCH2_EXIT . . . . . . . . .  	L NEAR	046D	CODE
$P_MATCH_EXIT  . . . . . . . . .  	L NEAR	0456	CODE
$P_MBP_EXIT  . . . . . . . . . .  	L NEAR	0304	CODE
$P_MBP_LOOP  . . . . . . . . . .  	L NEAR	02FA	CODE
$P_MINUS . . . . . . . . . . . .  	NUMBER	002D	
$P_MOVEBP_NUL  . . . . . . . . .  	N PROC	02FA	CODE	Length = 000C
$P_NEG . . . . . . . . . . . . .  	NUMBER	0002	
$P_NON_DBCS  . . . . . . . . . .  	L NEAR	084F	CODE
$P_NOT_APPLICABLE  . . . . . . .  	L NEAR	06F6	CODE
$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	07DC	CODE
$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	00AB	CODE
$P_OUT_OF_RANGE  . . . . . . . .  	NUMBER	0006	
$P_PACK_END  . . . . . . . . . .  	L NEAR	01D9	CODE
$P_PACK_END_BACKUP_SI  . . . . .  	L NEAR	01B3	CODE
$P_PACK_END_BY_EOL . . . . . . .  	L NEAR	01D8	CODE
$P_PACK_LOOP . . . . . . . . . .  	L NEAR	0196	CODE
$P_PERIOD  . . . . . . . . . . .  	NUMBER	002E	
$P_PERIOD_ONLY . . . . . . . . .  	NUMBER	0002	
$P_PL00  . . . . . . . . . . . .  	L NEAR	01CB	CODE
$P_PL01  . . . . . . . . . . . .  	L NEAR	01BE	CODE
$P_PLUS  . . . . . . . . . . . .  	NUMBER	002B	
$P_POSITIONAL_MANAGER  . . . . .  	L NEAR	01FC	CODE
$P_QUOTED_STRING . . . . . . . .  	NUMBER	0009	
$P_QU_STRING . . . . . . . . . .  	NUMBER	0080	
$P_RC  . . . . . . . . . . . . .  	L WORD	00AD	CODE
$P_RCOL00  . . . . . . . . . . .  	L NEAR	0489	CODE
$P_RCOL01  . . . . . . . . . . .  	L NEAR	048F	CODE
$P_RCOL_EXIT . . . . . . . . . .  	L NEAR	0492	CODE
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Symbols-17


$P_RCOL_LOOP . . . . . . . . . .  	L NEAR	0471	CODE
$P_RC_EOL  . . . . . . . . . . .  	NUMBER	-0001	
$P_REMOVE_COLON  . . . . . . . .  	N PROC	046F	CODE	Length = 0026
$P_REPEAT  . . . . . . . . . . .  	NUMBER	0002	
$P_RETURN_TO_CALLER  . . . . . .  	L NEAR	0284	CODE
$P_RETURN_TO_CALLER0 . . . . . .  	L NEAR	0284	CODE
$P_RLT00 . . . . . . . . . . . .  	L NEAR	0392	CODE
$P_RLT01 . . . . . . . . . . . .  	L NEAR	039C	CODE
$P_RLT02 . . . . . . . . . . . .  	L NEAR	0388	CODE
$P_RLT03 . . . . . . . . . . . .  	L NEAR	03AE	CODE
$P_RLT04 . . . . . . . . . . . .  	L NEAR	0384	CODE
$P_RLT05 . . . . . . . . . . . .  	L NEAR	03C1	CODE
$P_RLT_CAP00 . . . . . . . . . .  	L NEAR	03D5	CODE
$P_RLT_CAP01 . . . . . . . . . .  	L NEAR	03E1	CODE
$P_RLT_CAP02 . . . . . . . . . .  	L NEAR	03DE	CODE
$P_RLT_EXIT  . . . . . . . . . .  	L NEAR	03EC	CODE
$P_RM_COLON  . . . . . . . . . .  	NUMBER	0010	
$P_RPAREN  . . . . . . . . . . .  	NUMBER	0029	
$P_SAVESI_CMPX . . . . . . . . .  	L WORD	00BA	CODE
$P_SAVE_EOB  . . . . . . . . . .  	L WORD	00BE	CODE
$P_SCOM00  . . . . . . . . . . .  	L NEAR	06CA	CODE
$P_SCOM01  . . . . . . . . . . .  	L NEAR	06DD	CODE
$P_SCOM02  . . . . . . . . . . .  	L NEAR	070A	CODE
$P_SCOM03  . . . . . . . . . . .  	L NEAR	06BC	CODE
$P_SCOM04  . . . . . . . . . . .  	L NEAR	06A6	CODE
$P_SCOM05  . . . . . . . . . . .  	L NEAR	06B9	CODE
$P_SCOM_DIFFER . . . . . . . . .  	L NEAR	0715	CODE
$P_SCOM_DIFFER0  . . . . . . . .  	L NEAR	06DF	CODE
$P_SCOM_EXIT . . . . . . . . . .  	L NEAR	071E	CODE
$P_SCOM_LOOP . . . . . . . . . .  	L NEAR	0686	CODE
$P_SCOM_SAME . . . . . . . . . .  	L NEAR	0718	CODE
$P_SEARCH_KEYORSW  . . . . . . .  	N PROC	02D5	CODE	Length = 0025
$P_SIGNED  . . . . . . . . . . .  	NUMBER	0080	
$P_SIM00 . . . . . . . . . . . .  	L NEAR	066D	CODE
$P_SIM01 . . . . . . . . . . . .  	L NEAR	066D	CODE
$P_SIMPLE_S  . . . . . . . . . .  	NUMBER	2000	
$P_SIMPLE_STRING . . . . . . . .  	N PROC	065A	CODE	Length = 0026
$P_SIM_EXIT  . . . . . . . . . .  	L NEAR	0676	CODE
$P_SIM_EXIT0 . . . . . . . . . .  	L NEAR	0678	CODE
$P_SINGLE_EXIT . . . . . . . . .  	L NEAR	029F	CODE
$P_SI_SAVE . . . . . . . . . . .  	L WORD	00AF	CODE
$P_SKIP_DELIM  . . . . . . . . .  	N PROC	0723	CODE	Length = 0026
$P_SKIP_DELIM_CY . . . . . . . .  	L NEAR	0741	CODE
$P_SKIP_DELIM_EXIT . . . . . . .  	L NEAR	0745	CODE
$P_SKIP_DELIM_LOOP . . . . . . .  	L NEAR	0723	CODE
$P_SKIP_DELIM_NCY  . . . . . . .  	L NEAR	0744	CODE
$P_SLASH . . . . . . . . . . . .  	NUMBER	002F	
$P_SNUM_VAL  . . . . . . . . . .  	NUMBER	4000	
$P_SPACE . . . . . . . . . . . .  	NUMBER	0020	
$P_START . . . . . . . . . . . .  	L NEAR	0182	CODE
$P_STRING  . . . . . . . . . . .  	NUMBER	0003	
$P_STRING_BUF  . . . . . . . . .  	L BYTE	00C2	CODE	Length = 0080
$P_STRING_BUF_END  . . . . . . .  	NEAR	0142	CODE
$P_STRING_COMP . . . . . . . . .  	N PROC	0680	CODE	Length = 00A3
$P_STRUC_L1  . . . . . . . . . .  	L NEAR	07FD	CODE
$P_STRUC_L12 . . . . . . . . . .  	L NEAR	07FC	CODE
$P_STRUC_L2  . . . . . . . . . .  	L NEAR	07F2	CODE
$P_STRUC_L5  . . . . . . . . . .  	L NEAR	07EF	CODE
$P_SVAL00  . . . . . . . . . . .  	L NEAR	0517	CODE
$P_SVAL01  . . . . . . . . . . .  	L NEAR	0518	CODE
Microsoft (R) Macro Assembler Version 5.10                  8/26/25 23:16:30
                                                             Symbols-18


$P_SVALUE  . . . . . . . . . . .  	N PROC	04F9	CODE	Length = 0024
$P_SVAL_IN . . . . . . . . . . .  	L NEAR	05D1	CODE
$P_SW  . . . . . . . . . . . . .  	NUMBER	0040	
$P_SWITCH  . . . . . . . . . . .  	NUMBER	002F	
$P_SW_CMP  . . . . . . . . . . .  	NUMBER	0010	
$P_SW_MANAGER  . . . . . . . . .  	L NEAR	0224	CODE
$P_SW_MGR_LOOP . . . . . . . . .  	L NEAR	0239	CODE
$P_SW_NOT_FOUND  . . . . . . . .  	L NEAR	0247	CODE
$P_SYNTAX  . . . . . . . . . . .  	NUMBER	0009	
$P_TAB . . . . . . . . . . . . .  	NUMBER	0009	
$P_TERMINATOR  . . . . . . . . .  	L BYTE	00B3	CODE
$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	021B	CODE
$P_VAL02_LOOP  . . . . . . . . .  	L NEAR	059D	CODE
$P_VAL02_NEXT  . . . . . . . . .  	L NEAR	05E1	CODE
$P_VAL02_SIGN  . . . . . . . . .  	L NEAR	05C3	CODE
$P_VAL03_LOOP  . . . . . . . . .  	L NEAR	0607	CODE
$P_VAL03_NEXT  . . . . . . . . .  	L NEAR	0613	CODE
$P_VALUE . . . . . . . . . . . .  	N PROC	051D	CODE	Length = 011D
$P_VALUE00 . . . . . . . . . . .  	L NEAR	056F	CODE
$P_VALUE01 . . . . . . . . . . .  	L NEAR	0582	CODE
$P_VALUE02 . . . . . . . . . . .  	L NEAR	0594	CODE
$P_VALUE03 . . . . . . . . . . .  	L NEAR	05FC	CODE
$P_VALUE04 . . . . . . . . . . .  	L NEAR	0627	CODE
$P_VALUE_ERR . . . . . . . . . .  	L NEAR	0627	CODE
$P_VALUE_ERR0  . . . . . . . . .  	L NEAR	056B	CODE
$P_VALUE_EXIT  . . . . . . . . .  	L NEAR	0632	CODE
$P_VALUE_LOOP  . . . . . . . . .  	L NEAR	0526	CODE
$P_VAL_FOUND . . . . . . . . . .  	L NEAR	05F5	CODE
$P_VAL_IN  . . . . . . . . . . .  	L NEAR	05B3	CODE
??0000 . . . . . . . . . . . . .  	L NEAR	0FE3	CODE
@CPU . . . . . . . . . . . . . .  	TEXT  0101h		
@FILENAME  . . . . . . . . . . .  	TEXT  driver		
@VERSION . . . . . . . . . . . .  	TEXT  510		


  15225 Source  Lines
  17798 Total   Lines
   1020 Symbols

  44748 + 133456 Bytes symbol space free

      0 Warning Errors
      0 Severe  Errors
