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


				;**********************************************
				**********************************
				; File: PRN_DEF.ASM
				;
				; Subroutines to read the printer profile file,
				 extract the printer names,
				; build a scroll list for the cas services and 
				retrieve addition information
				; from the file on a specific printer.
				; Also contains a subroutine to change the para
				meters for the SELECT command
				; in the autoexec.bat file.
				;
				;**********************************************
				**********************************
				PAGE	, 132				   ;AN000;
				.ALPHA					;AN000;
				.LIST					;AN000;
				
				;***************************************************************************
				; Define the public subroutines in this module
				;***************************************************************************
				PUBLIC	 GET_PRINTER_TITLES_ROUTINE	 ;AN000;
				PUBLIC	 GET_PRINTER_INFO_ROUTINE	 ;AN000;
				PUBLIC	 RELEASE_PRINTER_INFO_ROUTINE	 ;AN000;
				PUBLIC	 CHANGE_AUTOEXEC_ROUTINE	 ;AN000;
				;***************************************************************************
				; Define the public values in this module
				;***************************************************************************
				PUBLIC	 SEG_LOC			;AN000; The segment where the printer data is stored
				PUBLIC	 NAMES_OFF			;AN000; The offset in the segment of the names table
				PUBLIC	 N_PRN_NAMES			;AN000; The number of printer definitions read from the prof
				ile
				PUBLIC	 MAX_NAME			;AN000; The longest name in the list
				PUBLIC	 SIZE_NAMES			;AN000; The number of bytes between each printer name (abs)
				PUBLIC	 SEL_FLG			;AN000; AN000; SELECT runtime flag
				
				EXTRN	 SYSPARSE: FAR;AN000;
				EXTRN	 POS_ZERO: FAR;AN000;
				EXTRN	 COPY_ROUTINE: FAR;AN000;
				EXTRN	 I_PRINTER: WORD;AN000;
				EXTRN	 N_PRINTER_TYPE: BYTE;AN000;
				EXTRN	 S_MODE_PARM: WORD;AN000;
				EXTRN	 S_CP_DRIVER: WORD;AN000;
				EXTRN	 S_CP_PREPARE: WORD;AN000;
				EXTRN	 S_GRAPH_PARM: WORD;AN000;
				EXTRN	 HOOK_INT_24:FAR;AN000;
				EXTRN	 RESTORE_INT_24:FAR;AN000;
				EXTRN	 INT_24_ERROR:WORD;AN000;
				
				
				EXTRN	 BIN_TO_CHAR_ROUTINE:FAR;AN000;
				
 0000				DATA	SEGMENT BYTE PUBLIC 'DATA';AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Page     1-2


				
				
 0000  00			SEL_FLG 	   DB	     0	  ;AN000; Select flag byte
				;INSTALLRW	   EQU	     80H  ;AN000; INSTALL diskette is R/W
				
 0001  0000			SEG_LOC 	   DW	     0	  ;AN000; Location of the segment where the data is
 0003  0000			NAMES_OFF	   DW	     0	  ;AN000; The offset of the names table in the segment
 0005  0000			SEGMENT_SIZE	   DW	     0	  ;AN000; Amount of memory available
 0007  0000			BUFFER_START	   DW	     0	  ;AN000; Starting offset of the file data buffer
 0009  0000			BUFFER_SIZE	   DW	     0	  ;AN000; Number of bytes in the file data buffer
 000B  00000000			FILE_PTR_AT_START  DD	     0	  ;AN000; The file pointer for the data which is at
								  ;  the beginning of the file data buffer
 000F  0000			AMOUNT_OF_DATA	   DW	     0	  ;AN000; The number of bytes in the file data buffer
 0011  0000			CURRENT_PARSE_LOC  DW	     0	  ;AN000; The location to start the next parse.
 0013  0000			END_CUR_LINE	   DW	     0	  ;AN000; The address of the end of the line currently being parsed
 0015  0000			CX_ORDINAL_VALUE   DW	     0	  ;AN000; The value returned by the parse for next call
 0017  00			NUM_PRINTER_DEFS   DB	     0	  ;AN000; The number of printer definitions in the file
 0018  0000			N_PRN_NAMES	   DW	     0	  ;AN000; The next free index into the names table
 001A  0000			FILE_HANDLE	   DW	     0	  ;AN000; Handle for the printer definition file.
 001C  0000			MAX_NAME	   DW	     0	  ;AN000; The length of the longest printer name found in the file
 001E  0000			START_NEXT_LINE    DW	     0	  ;AN000; The starting offset of the next line to parse
 0020  0000			APPEND_POINTER	   DW	     0	  ;AN000; Offset of the ASCII-N string to append to the SELECT line
 0022  0000			FILENAME	   DW	     0	  ;AN000; Offset of the ASCII-N string containing the filename
 0024  00			CDP_FOUND	   DB	     0	  ;AN000;
 0025  00			CPP_FOUND	   DB	     0	  ;AN000;
				
				
 0026  0000			W_VALUE       DW	0	;AN000;
 0028  000A[			STRING_N      DB   10 DUP(0);AN000;
	   00			
			 ]	
				
				
				
				;AD000;JW BLANK_MODE	     DW   END_BLANK_MODE - $ - 3   ; The blank line for inserting mode param
				eters
				;AD000;JW	   DB	'     , , , , ',?
				;AD000;JW	   END_BLANK_MODE EQU  $
				
 0032  0000			BLANK_STRING	   DW	0			 ;AN000; Blank values for the other printer profile 
				parameters
				
 = 0002				E_SIZE_CR_LF	   EQU	2			 ;AN000; The number of bytes in W_CR_LF
 0034  0D 0A			W_CR_LF 	   DB	13,10			 ;AN000; Carrage return and line feed to append to t
				he select line
				
 0036  00			READ_FLAG	   DB	     0			 ;AN000; Flag for use when reading data
 = 0001				    AT_EOF	   EQU	     1B 		 ;AN000; Indicates when the end of file has been rea
				ched
 = 0002				    LAST_LINE	   EQU	     10B		 ;AN000; Indicates if this is the last line in the b
				uffer
				
 = 00FE				    RESET_EOF	   EQU	     11111110B		 ;AN000; Masks for resetting the flags
 = 00FD				    RESET_LST_LINE EQU	     11111101B ;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Page     1-3


				
 0037  00			PARSE_FLAG	   DB	     0			 ;AN000; Flag for use when parsing the data
 = 0001				    FIRST_PARSE    EQU	     1B 		 ;AN000; Indicates if this is the first line being p
				arsed
 = 0002				    LINE_DONE	   EQU	     10B		 ;AN000; Indicates if the current line has already b
				een parsed
 = 0004				    FIRST_NAME	   EQU	     100B		 ;AN000; Indicates if a printer names has already be
				en found
				
 = 00FE				    RESET_FIRST_PARSE	EQU  11111110B		 ;AN000; Masks for resetting the flags
 = 00FD				    RESET_LINE_DONE	EQU  11111101B	   ;AN000;
 = 00FB				    RESET_FIRST_NAME	EQU  11111011B	  ;AN000;
				
				;***************************************************************************
				; Error codes returned.
				;***************************************************************************
 = 0001				ERR_NOT_ENOUGH_MEM	EQU	  1		 ;AN000; There was not enough memory to build the na
				mes table
 = 0002				ERR_OPENING_FILE	EQU	  2		 ;AN000; Error opening a file
 = 0003				ERR_READING_FILE	EQU	  3		 ;AN000; Error reading from a file
 = 0004				ERR_FINDING_VALUE	EQU	  4		 ;AN000; Error finding the number of prn defs at the
				 beginning of the file
 = 0005				ERR_LINE_TOO_LONG	EQU	  5		 ;AN000; There was a line too long for the buffer
 = 0006				ERR_FINDING_NAME	EQU	  6		 ;AN000; There was an error locating a printer name 
				after a P or S
 = 0007				ERR_ACCESSING_FILE	EQU	  7		 ;AN000; There was an error updating the file pointe
				r
 = 0008				ERR_TOO_MANY_DEFS	EQU	  8		 ;AN000; There are too many defintion in the file
 = 0009				ERR_NUMBER_MATCH	EQU	  9		 ;AN000; The number of actual definition do not matc
				h the number expected
 = 000A				ERR_ALLOCATING_MEM	EQU	  10		 ;AN000; There was an error allocating memory
 = 000B				ERR_CDP_CPP		EQU	  11		 ;AN000; A prn defn had either a CDP or CPP but not 
				both
 = 000C				ERR_PRN_DEFN		EQU	  12  ;AN000;
				
 = 0001				TRUE			EQU	  1	     ;AN000;
 = 0000				FALSE			EQU	  0	    ;AN000;
				
				
 = 000D				E_CR			EQU	  13	     ;AN000;
 = 000A				E_LF			EQU	  10	     ;AN000;
 = 001A				E_FILE_TERM		EQU	  1AH  ;AN000;
				
 = 0028				E_MAX_PRN_NAME_LEN	EQU	  40		 ;AN000; The maximum printer name length
 = 0004				LENGTH_FILE_PTR 	EQU	  4		 ;AN000; The number of bytes in the file pointer
 = 001F				MAX_NUM_PRINTER_DEFS	EQU	  31		 ;AC089;SEH ;AC073; The maximum number of printer de
				finitions
 = 0400				MIN_SIZE_FILE_BUFFER	EQU	  0400H 	 ;AN000; The minimum amount of memory needed for the
				 file data buffer
 = 0001				LENGTH_PRT_TYPE_IND	EQU	  1		 ;AN000; The length of the printer type indicator
 = 002D				SIZE_NAMES		EQU	  E_MAX_PRN_NAME_LEN+LENGTH_FILE_PTR+LENGTH_PRT_TYPE_IND ;AN000; The
				 size of one entry in the names table
 = 0573				NAMES_TABLE_SIZE	EQU	  SIZE_NAMES * MAX_NUM_PRINTER_DEFS	     ;AN000; The size of the
				 names table
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Page     1-4


 = 0973				MINIMUM_MEMORY		EQU	  NAMES_TABLE_SIZE + MIN_SIZE_FILE_BUFFER		 ;AN000; The
				 minimum amount of memory required
				
 = 0001				RANGE_ONLY		EQU	  1		 ;AN000; The parser is only to look for ranges of va
				lues
 = 0003				RANGE_AND_STRING	EQU	  3		 ;AN000; The parser is to look for ranges and string
				s
				
 = 8000				NUMERIC_VALUE		EQU	  08000H	 ;AN000; Parser constant for searching for numeric v
				alues
 = 2000				SIMPLE_STRING		EQU	  02000H	 ;AN000; Parser constant for searching for strings
				
				
				; Control blocks for the parser.
				;  The PARMS INPUT BLOCK
 0038				PARMS	      LABEL	BYTE	   ;AN000;
 0038  003E R			    PAR_EXTEN	   DW	OFFSET PARMSX	 ;AN000; Offset of the PARMS EXTENSION BLOCK
 003A  02			    PAR_NUM	   DB	2		 ;AN000; The number of further definitions
 003B  00					   DB	0	      ;AN000;
 003C  01					   DB	1	      ;AN000;
 003D  1A					   DB	1AH	      ;AN000;
				
				; The PARMS EXTENSION BLOCK
 003E				PARMSX	      LABEL	BYTE;AN000;
 003E  00			    PAX_MINP	   DB	0  ;AN000;
 003F  01			    PAX_MAXP	   DB	1  ;AN000;
 0040  0044 R					   DW	CONTROL_P1    ;AN000;
 0042  00			    PAX_MAX_SW	   DB	0;AN000;
 0043  00			    PAX_MAX_K1	   DB	0;AN000;
				
				; The control blocks for the definition of positional parameters, switch and
				; keywords.
 = 0044				CONTROL_P1    EQU  $  ;AN000;
 0044  2000			CTL_FUNC_FL	   DW	2000H;AN000;
 0046  0002					   DW	0002H	      ;AN000;
 0048  007E R					   DW	RESULT_P1     ;AN000;
 004A  004D R					   DW	VALUE_LIST_P1 ;AN000;
 004C  00					   DB	0	      ;AN000;
				
 = 004D				VALUE_LIST_P1	   EQU	$;AN000;
 004D  01			VAL_NUM 	   DB	1	  ;AN000; Number of value definitions
 004E  01					   DB	1	  ;AN000; Number of range definitions
 004F  08					   DB	8	  ;AN000; Return value if parameter is in this range
 0050  00000000					   DD	0   ;AN000;
 0054  000000FF					   DD	255 ;AN000;
 0058  00					   DB	0	  ;AN000; Number of actual value definitions
 0059  02			NUM_STRINGS	   DB	2	  ;AN000; Number of string definitions
 005A  01					   DB	1	  ;AN000; Value to be returned if this string is matched
 005B  006C R					   DW	OFFSET KEYWORD_PARALLEL;AN000;
 005D  02					   DB	2	  ;AN000; Value to be returned if this string is matched
 005E  006E R					   DW	OFFSET KEYWORD_SERIAL;AN000;
				
 0060  03					   DB	3	  ;AN000; Value to be returned if this string is matched
 0061  0070 R					   DW	OFFSET KEYWORD_MODE;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Page     1-5


 0063  04					   DB	4	  ;AN000; Value to be returned if this string is matched
 0064  0073 R					   DW	OFFSET KEYWORD_CODE_DRIVER;AN000;
 0066  05					   DB	5	  ;AN000; Value to be returned if this string is matched
 0067  0077 R					   DW	OFFSET KEYWORD_CODE_PREPARE;AN000;
 0069  06					   DB	6	  ;AN000; Value to be returned if this string is matched
 006A  007B R					   DW	OFFSET KEYWORD_GRAPHICS;AN000;
				
 006C  50 00			KEYWORD_PARALLEL	DB   'P',0;AN000;
 006E  53 00			KEYWORD_SERIAL		DB   'S',0;AN000;
 0070  53 50 00			KEYWORD_MODE		DB   'SP',0;AN000;
 0073  43 44 50 00		KEYWORD_CODE_DRIVER	DB   'CDP',0;AN000;
 0077  43 50 50 00		KEYWORD_CODE_PREPARE	DB   'CPP',0;AN000;
 007B  47 50 00			KEYWORD_GRAPHICS	DB   'GP',0;AN000;
				
 007E				RESULT_P1	   LABEL     BYTE;AN000;
 007E  00					   DB	0	  ;AN000; Type of operand returned
 007F  00			MATCHED_TAG	   DB	0	  ;AN000; Matched item tag
 0080  0000			SYNONYM_PTR	   DW	0	  ;AN000; Offset of synonym returned
 0082  00 00 00 00		RESULT_FIELD	   DB	0,0,0,0   ;AN000; Unsure what this is...
				
				
				;AD000;JW ;***************************************************************************
				;AD000;JW ; Parser control blocks for parsing the mode parameters
				;AD000;JW ;***************************************************************************
				;AD000;JW MODE_PARMS	LABEL	  BYTE
				;AD000;JW		DW   MODE_PARMSX
				;AD000;JW		DB   0
				;AD000;JW
				;AD000;JW MODE_PARMSX	LABEL	  BYTE
				;AD000;JW		DB   0,0
				;AD000;JW		DB   0
				;AD000;JW		DB   1
				;AD000;JW		DW   OFFSET CNTL_BAUD
				;AD000;JW
				;AD000;JW CNTL_BAUD	LABEL	  BYTE
				;AD000;JW		DW   SIMPLE_STRING
				;AD000;JW		DW   2
				;AD000;JW		DW   RESULT_P1
				;AD000;JW		DW   MODE_VALUES
				;AD000;JW		DB   5
				;AD000;JW SYN_BAUD	DB   'BAUD',0
				;AD000;JW SYN_PARITY	DB   'PARITY',0
				;AD000;JW SYN_DATA	DB   'DATA',0
				;AD000;JW SYN_STOP	DB   'STOP',0
				;AD000;JW SYN_RETRY	DB   'RETRY',0
				;AD000;JW
				;AD000;JW MODE_VALUES	LABEL	  BYTE
				;AD000;JW		DB	  0
				
				
				;***************************************************************************
				; Parser control blocks for parsing the AUTOEXEC.BAT file for 'SELECT'
				;***************************************************************************
 0086				SELECT_PARMX  LABEL	BYTE	 ;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Page     1-6


 0086  01 01				      DB   1,1		    ;AN000;
 0088  008C R				      DW   SELECT_CONTROL   ;AN000;
 008A  00				      DB   0		    ;AN000;
 008B  00				      DB   0		    ;AN000;
				
 008C				SELECT_CONTROL	   LABEL     BYTE;AN000;
 008C  2000				      DW   2000H	    ;AN000;
 008E  0002				      DW   2		    ;AN000;
 0090  007E R				      DW   RESULT_P1	    ;AN000;
 0092  0095 R				      DW   SELECT_VALUE     ;AN000;
 0094  00				      DB   0		    ;AN000;
				
 0095				SELECT_VALUE  LABEL	BYTE	 ;AN000;
 0095  03				      DB   3		    ;AN000;
 0096  00				      DB   0		    ;AN000;
 0097  00				      DB   0		    ;AN000;
 0098  01				      DB   1		    ;AN000;
 0099  01				      DB   1		    ;AN000;
 009A  009C R				      DW   OFFSET SELECT_STR;AN000;
				
 009C  53 45 4C 45 43 54	SELECT_STR    DB   'SELECT',0;AN000;
       00			
 00A3  00			ALLOC_FLAG    DB   0
 = 0080				ALLOCATED     EQU  80H
				
				
 00A4				DATA	ENDS			;AN000;
				
 0000				CODE_FAR SEGMENT BYTE PUBLIC 'CODE';AN000;
				
					ASSUME	CS:CODE_FAR, DS:DATA, ES:DATA;AN000;
				
				;***************************************************************************
				; Routines for extracting the printer names from the file data and storing
				; them in a table located in high memory.  In addition to the name, the
				; type of printer, whether Parallel or Serial and the location in the file
				; of this printer name is also saved in the table.
				;***************************************************************************
				
				;******************************************************************************
				;
				; Routine:  GET_PRINTER_TITLES_ROUTINE - Reads the names of all the printers
				;			      and their location in the file into a data
				;			      buffer in high memory.
				;
				; Input:
				;    DI - The offset of name of the file which contains the printer definitions
				;	  in ASCII-N format.
				;
				; Output:
				;    If CY = 1: Indicates that an error has occured.
				;	  BX - The error code for the error which this subroutine detected.
				;	  AX - The error code which was returned if the error was as a result
				;	       of a DOS call.
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Page     1-7


				;    If CY = 0: No error has occured.
				;	  AX, BX - Undefined.
				;
				;******************************************************************************
 0000				GET_PRINTER_TITLES_ROUTINE   PROC FAR		 ;AN000;
										 ;
 0000  9A 0000 ---- E		    CALL HOOK_INT_24				 ;AN000;
				;;  int 3
				;;  nop
				
 0005  06			    PUSH ES					 ;AN000;
				    ;**********************************************************************
				    ; Allocate the necessary memory for the buffer.  A maximum of 64K is
				    ; allocated.
				    ;**********************************************************************
 0006  E8 0196 R		    CALL ALLOCATE_MEMORY			 ;AN000; Allocate the memory for the printer data
				    .IF < C >					 ;AN000; Was there an error?
 0009  73 03                 5						jnC $l1 
 000B  E9 010B R			 JMP  EXIT_WITH_ERROR			 ;AN000; If so, exit the subroutine
				    .ENDIF					 ;AN000;
 000E                        2	$l1: 
				    ;**********************************************************************
				    ; See if there is enough memory to continue.
				    ;**********************************************************************
				    .IF < SEGMENT_SIZE B MINIMUM_MEMORY>	 ;AN000; Is there enough memory?
 000E  81 3E 0005 R 0973     3						cmp SEGMENT_SIZE,MINIMUM_MEMORY 
 0014  73 06                 5						jnB $l4 
 0016  BB 0001				 MOV  BX, ERR_NOT_ENOUGH_MEM		 ;AN000; No! Return error code.
 0019  E9 010B R			 JMP  EXIT_WITH_ERROR			 ;AN000; Exit the subroutine
				    .ENDIF					 ;AN000;
 001C                        2	$l4: 
				    ;**********************************************************************
				    ; Set the pointer for the file data buffer and save the size of this buffer.
				    ;**********************************************************************
 001C  C7 06 0007 R 0573	    MOV  BUFFER_START, NAMES_TABLE_SIZE 	 ;AN000; Starting address of the file data buffer
 0022  8B 1E 0005 R		    MOV  BX, SEGMENT_SIZE			 ;AN000; Total amount of memory available
 0026  81 EB 0573		    SUB  BX, NAMES_TABLE_SIZE			 ;AN000; Calculate the size of the file data buffer
 002A  89 1E 0009 R		    MOV  BUFFER_SIZE, BX			 ;AN000; Save this size.
 002E  C7 06 0003 R 0000	    MOV  NAMES_OFF, 0				 ;AN000; Offset of the printer names table
				    ;**********************************************************************
				    ; Open the printer definition file.
				    ;**********************************************************************
 0034  C7 06 0000 E 0000	    MOV  INT_24_ERROR, 0			 ;AN000;
 003A  9A 0000 ---- E		    CALL POS_ZERO				 ;AN000; Turn the ASCII-N string into an ASCII-Z str
				ing
 003F  8B D7			    MOV  DX, DI 				 ;AN000; Get address of the ASCII-N string
 0041  83 C2 02			    ADD  DX, 2					 ;AN000; Address of the filename
 0044  B8 3D00			    MOV  AX, 3D00H				 ;AN000; Open file for reading.
				    DOSCALL					 ;AN000;
 0047  CD 21                 1		INT	21H			; 
				    .IF < C >					 ;AN000; Was there an error opening the file?
 0049  73 06                 5						jnC $l7 
 004B  BB 0002				 MOV  BX, ERR_OPENING_FILE		 ;AN000; Yes! Return this error code
 004E  E9 010B R			 JMP  EXIT_WITH_ERROR			 ;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Page     1-8


				    .ENDIF					 ;AN000;
 0051                        2	$l7: 
 0051  A3 001A R		    MOV  FILE_HANDLE, AX			 ;AN000; Save the handle for the file
				    ;**********************************************************************
				    ; Initialize the variable which holds the file pointer at the beginning
				    ; of the buffer.
				    ;**********************************************************************
 0054  C7 06 000B R 0000	    MOV  WORD PTR FILE_PTR_AT_START, 0		 ;AN000; Zero the low word
 005A  C7 06 000D R 0000	    MOV  WORD PTR FILE_PTR_AT_START+2, 0	 ;AN000; Zero the high word
 0060  80 26 0036 R FE		    AND  READ_FLAG, RESET_EOF			 ;AN000; Indicate we are not at EOF
				    ;**********************************************************************
				    ; Read data into the file buffer.
				    ;**********************************************************************
 0065  8B 3E 0007 R		    MOV  DI, BUFFER_START			 ;AN000; Start reading at this offset
 0069  81 EF 0573		    SUB  DI, NAMES_TABLE_SIZE			 ;AN000; Make into an offset in the buffer instead o
				f the segment
 006D  E8 02D1 R		    CALL READ_FROM_HERE 			 ;AN000; Read in the data.
				    .IF < C >					 ;AN000; Was there an error reading from the file?
 0070  73 06                 5						jnC $l10 
 0072  BB 0003				 MOV  BX, ERR_READING_FILE		 ;AN000; Return this error code
 0075  E9 010B R			 JMP  EXIT_WITH_ERROR			 ;AN000; Return from this subroutine
				    .ENDIF					 ;AN000;
 0078                        2	$l10: 
				    ;**********************************************************************
				    ; Initialize the variables needed for the parsing.
				    ;**********************************************************************
 0078  C7 06 0011 R 0573	    MOV  CURRENT_PARSE_LOC, NAMES_TABLE_SIZE	 ;AN000; Start parsing from the beginning.
 007E  C7 06 0015 R 0000	    MOV  CX_ORDINAL_VALUE, 0			 ;AN000; The first parse, CX must be zero.
 0084  C7 06 0018 R 0000	    MOV  N_PRN_NAMES, 0 			 ;AN000; There are not names in the table now
 008A  80 26 0037 R FD		    AND  PARSE_FLAG, RESET_LINE_DONE		 ;AN000; The current line has NOT been parsed
 008F  80 0E 0037 R 01		    OR	 PARSE_FLAG, FIRST_PARSE		 ;AN000; Indicate that this is the first parse
				    ;**********************************************************************
				    ; Setup the control blocks for the parser
				    ;**********************************************************************
 0094  C7 06 0038 R 003E R	    MOV   PAR_EXTEN, OFFSET PARMSX		 ;AN000; Load the address of the parse extention blo
				ck
				    ;**********************************************************************
				    ; Parse the data.  If this is the first parse, then look for the number
				    ; of printer definitions.  If it is not, then look for the parameters
				    ; P and S which preface the printer names.
				    ;**********************************************************************
 009A  C6 06 004D R 01		    MOV  VAL_NUM, RANGE_ONLY			 ;AN000; Parse for a range of values only
 009F  C7 06 0044 R 8000	    MOV  CTL_FUNC_FL, NUMERIC_VALUE		 ;AN000; Indicate we are looking for numbers
 00A5  C6 06 0059 R 02		    MOV  NUM_STRINGS, 2 			 ;AN000; The number of parameters to look for
				    ;**********************************************************************
				    ; See if there is a complete line in the remainder of the buffer.  If there
				    ; is not, then read more data into the buffer starting with the start of
				    ; the current line.
				    ;**********************************************************************
 00AA				PARSE_NEXT_LINE:				 ;AN000;
 00AA  E8 0129 R		    CALL SEARCH_LINE				 ;AN000; Search for the first parameter on the line
				    .IF < C >					 ;AN000; Was there an error?
 00AD  73 03                 5						jnC $l13 
 00AF  EB 5A 90				 JMP  EXIT_WITH_ERROR			 ;AN000; Yes! Exit the routine
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Page     1-9


				    .ENDIF					 ;AN000;
 00B2                        2	$l13: 
				    .IF < BIT PARSE_FLAG AND FIRST_PARSE >	 ;AN000; Looking for a value or a string?
 00B2  F6 06 0037 R 01       3						test PARSE_FLAG,FIRST_PARSE 
 00B7  74 21                 6						jz $l16 
					 .IF < AX NE 0 >			 ;AN000; Was there an error?
 00B9  3D 0000               3						cmp AX,0 
 00BC  74 06                 6						je $l19 
 00BE  BB 0004				      MOV  BX, ERR_FINDING_VALUE	 ;AN000; Yes! Return with this error code
 00C1  EB 48 90				      JMP  EXIT_WITH_ERROR		 ;AN000;
					 .ENDIF 				 ;AN000;
 00C4                        2	$l19: 
 00C4  A0 0082 R			 MOV  AL, RESULT_FIELD			 ;AN000; Get the low order byte of the value
 00C7  A2 0017 R			 MOV  NUM_PRINTER_DEFS, AL		 ;AN000; Store the number of definitions
 00CA  80 26 0037 R FE			 AND  PARSE_FLAG, RESET_FIRST_PARSE	 ;AN000; Indicate the first parse is finished
 00CF  C6 06 004D R 03			 MOV  VAL_NUM, RANGE_AND_STRING 	 ;AN000; Specify strings and ranges
 00D4  C7 06 0044 R 2000		 MOV  CTL_FUNC_FL, SIMPLE_STRING	 ;AN000; Look for specific strings only.
				    .ENDIF					 ;AN000;
 00DA                        2	$l16: 
				    ;**********************************************************************
				    ; See if we found a printer name
				    ;**********************************************************************
				    .IF < AX EQ 0 >				 ;AN000; Was an error found parsing the buffer
 00DA  3D 0000               3						cmp AX,0 
 00DD  75 18                 6						jne $l22 
					 .IF < N_PRN_NAMES AE MAX_NUM_PRINTER_DEFS >	 ;AN000; Are there more the 255 printer defs
				?
 00DF  83 3E 0018 R 1F       3						cmp N_PRN_NAMES,MAX_NUM_PRINTER_DEFS 
 00E4  72 06                 5						jnAE $l25 
 00E6  BB 0008				      MOV  BX, ERR_TOO_MANY_DEFS	 ;AN000; If so, return this error.
 00E9  EB 20 90				      JMP  EXIT_WITH_ERROR		 ;AN000; Terminate the subroutine.
					 .ENDIF 		     ;AN000;
 00EC                        2	$l25: 
										 ; DX contains the address of the result block
 00EC  E8 0239 R			 CALL COPY_PRINTER_NAME 		 ;AN000; Copy the name to the table
					 .IF < C >				 ;AN000; Was there an error?
 00EF  73 06                 5						jnC $l22 
 00F1  BB 0006				      MOV  BX, ERR_FINDING_NAME 	 ;AN000; Yes! Return this error code
 00F4  EB 15 90				      JMP  EXIT_WITH_ERROR		 ;AN000;
					 .ENDIF 				 ;AN000;
				    .ENDIF					 ;AN000;
 00F7                        2	$l22: 
				    ;**********************************************************************
				    ; Start scanning the next line.
				    ;**********************************************************************
 00F7  8B 3E 001E R		    MOV  DI, START_NEXT_LINE			 ;AN000; Get the address of the next line to parse
 00FB  89 3E 0011 R		    MOV  CURRENT_PARSE_LOC, DI			 ;AN000; Save it
				    .IF < CURRENT_PARSE_LOC EQ 0 >		 ;AN000; Is there more data?
 00FF  83 3E 0011 R 00       3						cmp CURRENT_PARSE_LOC,0 
 0104  75 03                 6						jne $l31 
 0106  EB 07 90				 JMP  EXIT_WITHOUT_ERROR		 ;AN000; No! Exit the routine
				    .ENDIF		    ;AN000;
 0109                        2	$l31: 
 0109  EB 9F			    JMP  PARSE_NEXT_LINE			 ;AN000; Start processing this line
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Page     1-10


										 ;
 010B				EXIT_WITH_ERROR:				 ;AN000;
 010B  F9			    STC 					 ;AN000; Set the carry flag, indicating error.
 010C  EB 11 90			    JMP  EXIT_ROUTINE				 ;AN000;
 010F				EXIT_WITHOUT_ERROR:				 ;AN000;
 010F  8B 0E 0018 R		    MOV  CX, N_PRN_NAMES			 ;AN000; The number of entries in the table
				    .IF < CL NE NUM_PRINTER_DEFS >		 ;AN000; Did the number of definitions agree with th
				e expected number?
 0113  3A 0E 0017 R          3						cmp CL,NUM_PRINTER_DEFS 
 0117  74 05                 6						je $l34 
 0119  BB 0009				 MOV  BX, ERR_NUMBER_MATCH		 ;AN000; Return this error message
 011C  EB ED				 JMP  EXIT_WITH_ERROR			 ;AN000; Return, setting the carry flag.
				    .ENDIF		  ;AN000;
 011E                        2	$l34: 
 011E  F8			    CLC 					 ;AN000; Clear the carry flag - No error.
 011F				EXIT_ROUTINE:					 ;AN000;
 011F  E8 01CA R		    CALL DEALLOCATE_MEMORY
 0122  07			    POP  ES					 ;AN000;
 0123  9A 0000 ---- E		    CALL RESTORE_INT_24;AN000;
 0128  CB			    RET 					 ;AN000;
										 ;
 0129				GET_PRINTER_TITLES_ROUTINE   ENDP		 ;AN000;
				;********************************************************************************
				;
				;SEARCH_LINE: Search for the first parameter on a line.
				;
				;INPUT:
				;    None.
				;
				;OUTPUT:
				;    AX - Contains the return codes from the parser
				;    If CY = 1: There was an error - BX contains an error code
				;    if CY = 0: There were NO errors.
				;    All the registers are set from the parser return.
				;
				;OPERATION:
				;
				;********************************************************************************
 0129				SEARCH_LINE   PROC NEAR 	    ;AN000;
				
 0129  8B 3E 0011 R		    MOV  DI, CURRENT_PARSE_LOC			 ;AN000; Get the current location in the buffer
 012D  E8 01DD R		    CALL SCAN_FOR_EOLN				 ;AN000; Search for the end of the line
 0130  89 3E 001E R		    MOV  START_NEXT_LINE, DI			 ;AN000; Save the start address of the next line
				    .IF < C >					 ;AN000; Was the END OF LINE found?
 0134  73 3B                 5						jnC $l37 
					 .IF <BIT READ_FLAG AND AT_EOF> 	 ;AN000; Are we at the end of the file?
 0136  F6 06 0036 R 01       3						test READ_FLAG,AT_EOF 
 013B  74 08                 6						jz $l41 
 013D  C7 06 001E R 0000		      MOV  START_NEXT_LINE, 0		 ;AN000; Yes!  Indicate that this is the last line
					 .ELSE					 ;AN000; We are not the the end of the file
 0143  EB 2C                 3						jmp short $l37 
 0145                        2	$l41: 
 0145  8B 3E 0011 R			      MOV  DI, CURRENT_PARSE_LOC	 ;AN000; The location to read from in the file
 0149  81 EF 0573			      SUB  DI, NAMES_TABLE_SIZE 	 ;AN000; Make into an offset in the buffer instead o
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Page     1-11


				f the segment
 014D  E8 02D1 R			      CALL READ_FROM_HERE		 ;AN000; Read in more data
					      .IF < C > 			 ;AN000; Was there an error reading from the file?
 0150  73 06                 5						jnC $l44 
 0152  BB 0003					   MOV	BX, ERR_READING_FILE	 ;AN000; Return this error code
 0155  EB 3D 90					   JMP	EXIT_SEARCH_ERROR	 ;AN000; Return from this subroutine
					      .ENDIF				 ;AN000;
 0158                        2	$l44: 
 0158  C7 06 0011 R 0573		      MOV  CURRENT_PARSE_LOC, NAMES_TABLE_SIZE ;AN000; Start back at the beginning of the bu
				ffer
 015E  8B 3E 0011 R			      MOV  DI, CURRENT_PARSE_LOC	 ;AN000; Get the current parse location again.
 0162  E8 01DD R			      CALL SCAN_FOR_EOLN		 ;AN000; Once again look for the end of the line
 0165  89 3E 001E R			      MOV  START_NEXT_LINE, DI		 ;AN000; Save the start address of the nest line
					      .IF < C > 			 ;AN000; Was it found?
 0169  73 06                 5						jnC $l37 
 016B  BB 0005					   MOV	BX, ERR_LINE_TOO_LONG	 ;AN000; No! Indicate an error.
 016E  EB 24 90					   JMP	EXIT_SEARCH_ERROR	 ;AN000; Return with this error
					      .ENDIF				 ;AN000;
					 .ENDIF 				 ;AN000;
				    .ENDIF					 ;AN000;
 0171                        2	$l37: 
				    ;**********************************************************************
				    ; Set up the input parameters for the parse subroutine
				    ;**********************************************************************
 0171  BF 0038 R		    MOV  DI, OFFSET PARMS			 ;AN000; Offset into ES of the PARMS control block
 0174  8B 36 0011 R		    MOV  SI, CURRENT_PARSE_LOC			 ;AN000; Where to start parsing
 0178  BA 0000			    MOV  DX, 0					 ;AN000;
 017B  8B 0E 0015 R		    MOV  CX, CX_ORDINAL_VALUE			 ;AN000; The value returned by the parse last time.
 017F  1E			    PUSH DS					 ;AN000; Save the current data segment
 0180  06			    PUSH ES					 ;AN000; Save the file data segment
 0181  B8 ---- R		    MOV  AX, DATA				 ;AN000; Get the current data segment
 0184  8E C0			    MOV  ES, AX 				 ;AN000; This is the parser control blocks.
 0186  A1 0001 R		    MOV  AX, SEG_LOC			;AN000; Where the data to parse is located
 0189  8E D8			    MOV  DS, AX 				 ;AN000;
 018B  9A 0000 ---- E		    CALL SYSPARSE				 ;AN000; Do the parsing
 0190  07			    POP  ES					 ;AN000; Restore the file data segment
 0191  1F			    POP  DS					 ;AN000; Restore the data segment
 0192  F8			    CLC 					 ;AN000; Indicate there were no errors
 0193  C3			    RET 					 ;AN000;
 0194				EXIT_SEARCH_ERROR:				 ;AN000; Here if there were errors
 0194  F9			    STC 					 ;AN000; Indicate so to the calling program
 0195  C3			    RET 					 ;AN000;
				
 0196				SEARCH_LINE   ENDP;AN000;
				;********************************************************************************
				; ALLOCATE_MEMORY: Allocate a maximum of 64K of memory.
				;
				; INPUT:
				;    None.
				;
				; OUTPUT:
				;    SEGMENT_SIZE = The size of the segment allocated.
				;    SEG_LOC =	The location of the segment allocated.
				;    If CY = 1: There was an error - BX contains an error code
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Page     1-12


				;    If CY = 0: There was NO errors.
				;
				; Operation:
				;
				;********************************************************************************
 0196				ALLOCATE_MEMORY    PROC NEAR;AN000;
				
 0196  80 26 00A3 R 7F		    AND  ALLOC_FLAG,NOT ALLOCATED
 019B  BB 0FFF			    MOV  BX, 0FFFH				 ;AN000; Try to allocate this amount of memory
 019E  89 1E 0005 R		    MOV  SEGMENT_SIZE, BX			 ;AN000; Save the amount of memory asked for
 01A2  B4 48			    MOV  AH, 48H				 ;AN000; DOS Fn. for allocating memory
				    DOSCALL					 ;AN000; Allocate the memory
 01A4  CD 21                 1		INT	21H			; 
				    .IF < C >					 ;AN000; Was there an error?
 01A6  73 08                 5						jnC $l50 
 01A8  89 1E 0005 R			 MOV  SEGMENT_SIZE, BX			 ;AN000; Save the size asked for in this request
 01AC  B4 48				 MOV  AH, 48H				 ;AN000; DOS Fn. for allocating memory
					 DOSCALL				 ;AN000; Allocate the memory
 01AE  CD 21                 1		INT	21H			; 
				    .ENDIF					 ;AN000;
 01B0                        2	$l50: 
				    .IF < C >					 ;AN000; Was there an error allocating the memory?
 01B0  73 06                 5						jnC $l54 
 01B2  BB 000A				 MOV  BX, ERR_ALLOCATING_MEM		 ;AN000; Yes! Return an error code
 01B5  F9				 STC					 ;AN000; Indicate that there was an error
				    .ELSE					 ;AN000; Otherwise...
 01B6  EB 11                 3						jmp short $l53 
 01B8                        2	$l54: 
 01B8  A3 0001 R			 MOV  SEG_LOC, AX		;AN000; Save the location of the memory block allocated
 01BB  8E C0				 MOV  ES, AX				 ;AN000; Save in the extra segment
 01BD  B1 04				 MOV  CL, 4				 ;AN000; Multiply the number of paragraphs by 16
 01BF  D3 26 0005 R			 SHL  SEGMENT_SIZE, CL			 ;AN000;  to get the number of bytes.
 01C3  80 0E 00A3 R 80			 OR   ALLOC_FLAG,ALLOCATED
 01C8  F8				 CLC					 ;AN000; Indicate there was no error
				    .ENDIF					 ;AN000;
 01C9                        2	$l53: 
 01C9  C3			    RET 					 ;AN000;
				
 01CA				ALLOCATE_MEMORY    ENDP;AN000;
				
				
				;********************************************************************************
				; DEALLOCATE_MEMORY: deallocate memory.
				;
				; INPUT:
				;    SEG_LOC   previously allocated segment
				;
				; OUTPUT:
				;    None.
				;
				;********************************************************************************
 01CA				DEALLOCATE_MEMORY PROC NEAR
				
 01CA  F6 06 00A3 R 80			   TEST ALLOC_FLAG,ALLOCATED
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Page     1-13


 01CF  74 0B				   JZ DEM10
				
 01D1  06				   PUSH ES
 01D2  A1 0001 R			   MOV	AX,SEG_LOC
 01D5  8E C0				   MOV	ES,AX
 01D7  B4 49				   MOV	AH,49H
 01D9  CD 21				   INT	21H
 01DB  07				   POP	ES
 01DC				DEM10:
 01DC  C3				   RET
 01DD				DEALLOCATE_MEMORY ENDP
				
				;*******************************************************************************
				;
				; Routine: SCAN_FOR_EOLN - Scan the given string, for CR and LF.
				;
				; Input:
				;    DI - Address of the string to scan for the eoln.
				;
				; Output:
				;    If CY = 0: The end of the line was found.
				;	DI - Contains the address of the start of the next line in the buffer.
				;	   - If DI = 0, the data ends just after either the CR, LF or the
				;	     CR and LF.  Therefore, more data must be read before the next line
				;	     can be parsed.
				;
				;    If CY = 1: The end of the line was not found.
				;
				;*******************************************************************************
 01DD				SCAN_FOR_EOLN PROC NEAR;AN000;
				
 01DD  8B 0E 0007 R		    MOV  CX, BUFFER_START			 ;AN000; The offset in the segment of the buffer
 01E1  03 0E 000F R		    ADD  CX, AMOUNT_OF_DATA			 ;AN000; Get the offset of the end of the data
 01E5  2B CF			    SUB  CX, DI 				 ;AN000; Subtract the file data pointer
										 ; CX - Contains the amount of data after pointer
 01E7  B0 00			    MOV  AL, 0					 ;AN000; Flag to indicate CR-LF has not been found y
				et
				    .WHILE < CX A 0 >				 ;AN000; Search until the end of the data
 01E9                        2	$l57: 
 01E9  83 F9 00              3						cmp CX,0 
 01EC  76 42                 5						jnA $l58 
					 .IF < <BYTE PTR ES:[DI]> EQ E_FILE_TERM >;AN000;
 01EE  26: 80 3D 1A          3						cmp BYTE PTR ES:[DI],E_FILE_TERM 
 01F2  75 13                 6						jne $l60 
					      .IF < ZERO AL >	 ;AN000;
 01F4  0A C0                 3						or AL,AL 
 01F6  75 08                 6						jnz $l63 
 01F8  89 3E 0013 R				   MOV	END_CUR_LINE, DI	 ;AN000; Save this location in the string
 01FC  FF 0E 0013 R				   DEC	END_CUR_LINE		 ;AN000; Point to the real end of the line
					      .ENDIF	       ;AN000;
 0200                        2	$l63: 
 0200  F9				      STC	       ;AN000;
 0201  BF 0000				      MOV  DI, 0       ;AN000;
 0204  EB 32 90				      JMP  EXIT_SCAN   ;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Page     1-14


					 .ENDIF 	       ;AN000;
 0207                        2	$l60: 
					 .IF < <BYTE PTR ES:[DI]> EQ E_LF > OR	 ;AN000; Is this character a CR or a LF?
 0207  26: 80 3D 0A          3						cmp BYTE PTR ES:[DI],E_LF 
 020B  74 06                 6						je $l68 
					 .IF < <BYTE PTR ES:[DI]> EQ E_CR >	;AN000;
 020D  26: 80 3D 0D          3						cmp BYTE PTR ES:[DI],E_CR 
 0211  75 11                 6						jne $l67 
 0213                        3	$l68: 
					      .IF < ZERO AL >			 ;AN000; Has a CR or a LF already been found?
 0213  0A C0                 3						or AL,AL 
 0215  75 08                 6						jnz $l69 
 0217  89 3E 0013 R				   MOV	END_CUR_LINE, DI	 ;AN000; Save this location in the string
 021B  FF 0E 0013 R				   DEC	END_CUR_LINE		 ;AN000; Point to the real end of the line
					      .ENDIF	       ;AN000;
 021F                        2	$l69: 
 021F  FE C0				      INC  AL				 ;AN000; Indicate that a CR or a LF has been found
					 .ELSEIF < NONZERO AL > 		 ;AN000; If we have passed the CR-LF,
 0221  EB 09                 3						jmp short $l66 
 0223  90                    3						nop 
 0224                        2	$l67: 
 0224  0A C0                 3						or AL,AL 
 0226  74 04                 6						jz $l66 
 0228  F8				      CLC				 ;AN000;  Indicate we have found EOLN
 0229  EB 0D 90				      JMP  EXIT_SCAN			 ;AN000; Leave the subroutine
					 .ENDIF 		;AN000;
 022C                        2	$l66: 
 022C  49				 DEC  CX				 ;AN000; One less character to the end
 022D  47				 INC  DI				 ;AN000; Point to the next character
				    .ENDWHILE ;AN000;
 022E  EB B9                 3						jmp $l57 
 0230                        2	$l58: 
				
				    .IF < AL AE 2 >				 ;AN000; Does the data run out right after the CR-LF
				?
 0230  3C 02                 3						cmp AL,2 
 0232  72 03                 5						jnAE $l74 
 0234  BF 0000				 MOV  DI, 0				 ;AN000; Return 0 indicating so.
				    .ENDIF	 ;AN000;
 0237                        2	$l74: 
 0237  F9			    STC 					 ;AN000; Indicate that the whole line is not there
				
 0238				EXIT_SCAN:    ;AN000;
 0238  C3			    RET       ;AN000;
				
 0239				SCAN_FOR_EOLN ENDP;AN000;
				;*******************************************************************************
				;
				; Routine: COPY_PRINTER_NAME - Copy the name of the printer from the file
				;		    into the buffer holding all the names.
				;
				; Input:
				;    SI - Contains the address of the start of the printer name.
				;    DX - Contains the address of the parse result block
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Page     1-15


				;
				; Output:
				;    CY = 1: An error has occured.  The name of the printer has not been found.
				;    CY = 0: No error.
				;
				; Operation:   The name from the file buffer is copied to the printer name
				;	  table.  Starting from the address passed in DI, the file buffer is
				;	  scanned until a valid character is found.  Starting from this point
				;	  up to forty characters are transferred to the name table.  If no
				;	  name is found, the carry flag is set, and nothing is recorded in the
				;	  name table.
				;	       After the name is copied, the remainder of the field in the table
				;	  is cleared.
				;
				;*******************************************************************************
 0239				COPY_PRINTER_NAME  PROC NEAR;AN000;
				
 0239  1E			    PUSH DS   ;AN000;
 023A  06			    PUSH ES   ;AN000;
 023B  52			    PUSH DX					 ;AN000; Save the address of the result block
				    ;**********************************************************************
				    ; Calculate the offset into the file data table for this entry
				    ;**********************************************************************
 023C  A1 0018 R		    MOV  AX, N_PRN_NAMES		  ;AN000; The next free index into the names table
 023F  BB 002D			    MOV  BX, SIZE_NAMES 	     ;AN000; Get the number of bytes per entry
 0242  F7 E3			    MUL  BX					 ;AN000; Multiply by the index into the table
 0244  8B F8			    MOV  DI, AX 				 ;AN000; Move the offset into an index register
				    ;**********************************************************************
				    ; Copy the type of printer first
				    ;**********************************************************************
 0246  5B			    POP  BX					 ;AN000; Get the result block address
 0247  8A 47 01			    MOV  AL, DS:[BX+1]				 ;AN000; Get the matched item tag
				    .IF < AL EQ 1 >				 ;AN000; Was the parameter a P?
 024A  3C 01                 3						cmp AL,1 
 024C  75 04                 6						jne $l78 
 024E  B0 50				 MOV  AL, 'P'                            ;AN000; Yes!
				    .ELSE					 ;AN000;
 0250  EB 02                 3						jmp short $l77 
 0252                        2	$l78: 
 0252  B0 53				 MOV  AL, 'S'                            ;AN000; No! It was an S
				    .ENDIF					 ;AN000;
 0254                        2	$l77: 
 0254  26: 88 45 28		    MOV  ES:[DI+40], AL 			 ;AN000; Store in the table
				    ;**********************************************************************
				    ; Skip the spaces between the printer type indicator and the printer name
				    ;**********************************************************************
 0258  B0 20			    MOV  AL, 32 				 ;AN000; Character to skip - space
 025A  87 F7			    XCHG SI, DI 				 ;AN000; Point DI to the line being scanned
 025C  8B 0E 0013 R		    MOV  CX, END_CUR_LINE			 ;AN000; Get address of the last char in line
 0260  2B CF			    SUB  CX, DI 				 ;AN000; Subtract start
 0262  41			    INC  CX					 ;AN000; Get the length of the line
 0263  FC			    CLD 					 ;AN000; Scan forward
 0264  F3/ AE			    REPZ  SCASB 				 ;AN000; Repeat search until character found
 0266  74 65			    JZ	 NAME_NOT_FOUND 			 ;AN000; If all spaces, then it is an error
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Page     1-16


 0268  41			    INC  CX					 ;AN000; Increment character count
 0269  4F			    DEC  DI					 ;AN000; Decrement pointer to character
				    ;***********************************************************************
				    ; Move the printer name to the names list
				    ;***********************************************************************
 026A  87 F7			    XCHG SI, DI 				 ;AN000; Exchange the pointers again
 026C  8B 0E 0013 R		    MOV  CX, END_CUR_LINE			 ;AN000; Get the address of the last char
 0270  2B CE			    SUB  CX, SI 				 ;AN000; Subtract start
 0272  41			    INC  CX					 ;AN000; Get the length of the line
				    .IF < CX A E_MAX_PRN_NAME_LEN >		 ;AN000; Is the length of the line too long?
 0273  83 F9 28              3						cmp CX,E_MAX_PRN_NAME_LEN 
 0276  76 03                 5						jnA $l81 
 0278  B9 0028				 MOV  CX, E_MAX_PRN_NAME_LEN		 ;AN000; Yes! Make the line length the maximum size
				    .ENDIF					 ;AN000;
 027B                        2	$l81: 
 027B  8B D1			    MOV  DX, CX 				 ;AN000; Save the line length for later use
				    .WHILE < NONZERO CX >			 ;AN000; Do while there are more characters in the s
				tring
 027D                        2	$l84: 
 027D  0B C9                 3						or CX,CX 
 027F  74 1E                 6						jz $l85 
 0281  26: 8A 04			 MOV  AL, BYTE PTR ES:[SI]		 ;AN000; Get a character from the file data
					 .IF < AL NE 32 >			 ;AN000; Is this character a space?
 0284  3C 20                 3						cmp AL,32 
 0286  74 0F                 6						je $l87 
 0288  8B DA				      MOV  BX, DX			 ;AN000; Get the line length
 028A  2B D9				      SUB  BX, CX			 ;AN000; Get the length of the line copied so far
 028C  43				      INC  BX				 ;AN000;
					      .IF < MAX_NAME B BX >	     ;AN000; Is this name longer than the longest so far?
 028D  39 1E 001C R          3						cmp MAX_NAME,BX 
 0291  73 04                 5						jnB $l87 
 0293  89 1E 001C R				   MOV	MAX_NAME, BX	     ;AN000; Yes! This is the new maximum
					      .ENDIF		  ;AN000;
					 .ENDIF 		  ;AN000;
 0297                        2	$l87: 
 0297  26: 88 05			 MOV  BYTE PTR ES:[DI], AL		 ;AN000; Put the character in the names table
 029A  46				 INC  SI				 ;AN000; Increment string pointers
 029B  47				 INC  DI     ;AN000;
 029C  49				 DEC  CX				 ;AN000; Decrement the number of characters left
				    .ENDWHILE ;AN000;
 029D  EB DE                 3						jmp $l84 
 029F                        2	$l85: 
				    ;***********************************************************************
				    ; Fill in the rest of the name area with spaces
				    ;***********************************************************************
 029F  B9 0028			    MOV  CX, E_MAX_PRN_NAME_LEN 		 ;AN000; The maximum line length
										 ; DX contains the line length from last section
 02A2  2B CA			    SUB  CX, DX 				 ;AN000; Calculate the space left in the line
 02A4  B0 20			    MOV  AL, 32 				 ;AN000; Character to store
 02A6  F3/ AA			    REP  STOSB					 ;AN000; Store the blank characters
				    ;***********************************************************************
				    ; Store the file pointer to this printer name in the name list
				    ;***********************************************************************
 02A8  47			    INC  DI					 ;AN000; Point DI passed the printer type indicator
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Page     1-17


 02A9  8B 36 0011 R		    MOV  SI, CURRENT_PARSE_LOC			 ;AN000; Get the start of the current line
 02AD  81 EE 0573		    SUB  SI, NAMES_TABLE_SIZE			 ;AN000; Subtract offset of the start of the buffer
 02B1  8B 0E 000B R		    MOV  CX, WORD PTR FILE_PTR_AT_START 	 ;AN000; Get the low order word of the pointer
 02B5  8B 16 000D R		    MOV  DX, WORD PTR FILE_PTR_AT_START[2]	 ;AN000; Get the high order word
 02B9  03 CE			    ADD  CX, SI 				 ;AN000; Add the offset of the start of this line
 02BB  83 D2 00			    ADC  DX, 0					 ;AN000; Add the high word
 02BE  26: 89 0D		    MOV  WORD PTR ES:[DI], CX			 ;AN000; Store the low order word in the list
 02C1  26: 89 55 02		    MOV  WORD PTR ES:[DI+2], DX 		 ;AN000; Store the high order word
 02C5  FF 06 0018 R		    INC  N_PRN_NAMES			  ;AN000; Point to the next free area in the list
 02C9  F8			    CLC 		 ;AN000;
 02CA  EB 02 90			    JMP  EXIT_COPY	 ;AN000;
 02CD				NAME_NOT_FOUND: 	 ;AN000;
 02CD  F9			    STC 		 ;AN000;
 02CE				EXIT_COPY:		 ;AN000;
 02CE  07			    POP  ES		 ;AN000;
 02CF  1F			    POP  DS		 ;AN000;
 02D0  C3			    RET 		 ;AN000;
				
 02D1				COPY_PRINTER_NAME  ENDP  ;AN000;
				
				;*******************************************************************************
				; Routine: READ_FROM_HERE - Read from the file into the buffer starting from
				;		    the file position pointed to by CURRENT_PARSE_LOC.
				;
				; Input:
				;    DI - Contains the current parsing location in the buffer.
				;
				; Output:
				;    FILE_PTR_AT_START - Updated for the new data read.
				;
				; Operation:
				;
				;*******************************************************************************
 02D1				READ_FROM_HERE	   PROC NEAR;AN000;
										 ;
				    ;**********************************************************************
				    ; Update the R/W pointer in the file.
				    ;**********************************************************************
 02D1  8B 16 000B R		    MOV  DX, WORD PTR FILE_PTR_AT_START 	 ;AN000; Get the low order word of the pointer
 02D5  8B 0E 000D R		    MOV  CX, WORD PTR FILE_PTR_AT_START[2]	 ;AN000; Get the high order word of the pointer
 02D9  03 D7			    ADD  DX, DI 				 ;AN000; Add the offset of where to start reading
 02DB  83 D1 00			    ADC  CX, 0					 ;AN000; Take care of the carry condition
 02DE  89 16 000B R		    MOV  WORD PTR FILE_PTR_AT_START, DX 	 ;AN000; Store the new starting position
 02E2  89 0E 000D R		    MOV  WORD PTR FILE_PTR_AT_START[2], CX	 ;AN000; Store the high word of pointer
 02E6  C7 06 0000 E 0000	    MOV  INT_24_ERROR, 0			 ;AN000;
 02EC  B8 4200			    MOV  AX, 4200H				 ;AN000; DOS Function for moving the file pointer
 02EF  8B 1E 001A R		    MOV  BX, FILE_HANDLE			 ;AN000; Load the file handle
				    DOSCALL					 ;AN000; Move the file pointer
 02F3  CD 21                 1		INT	21H			; 
				    .IF < C >					 ;AN000; Was an error encountered?
 02F5  73 03                 5						jnC $l93 
 02F7  EB 2B 90				 JMP  RETURN_WITH_ERROR 		 ;AN000; Yes! Exit the subroutine.
				    .ENDIF					 ;AN000;
 02FA                        2	$l93: 
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Page     1-18


				    ;**********************************************************************
				    ; Read from the file into the data buffer
				    ;**********************************************************************
 02FA  8B 0E 0009 R		    MOV  CX, BUFFER_SIZE			 ;AN000; Number of bytes to read.  As many as will f
				it.
 02FE  8B 1E 001A R		    MOV  BX, FILE_HANDLE			 ;AN000; Load the DOS file handle for this file
 0302  B4 3F			    MOV  AH, 03FH				 ;AN000; The DOS function to perform
 0304  8B 16 0007 R		    MOV  DX, BUFFER_START			 ;AN000; The offset of the file data buffer
 0308  C7 06 0000 E 0000	    MOV  INT_24_ERROR, 0			 ;AN000; Indicate that no critical errors have occur
				ed yet
 030E  1E			    PUSH DS					 ;AN000; Save the current data segment
 030F  06			    PUSH ES					 ;AN000; Push the file data buffer
 0310  1F			    POP  DS					 ;AN000; DS now points to the file data buffer
				    DOSCALL					 ;AN000; Read from the file.
 0311  CD 21                 1		INT	21H			; 
 0313  1F			    POP  DS					 ;AN000; Restore the original data segment
				    ;**********************************************************************
				    ; See if the buffer was filled.
				    ;**********************************************************************
 0314  A3 000F R		    MOV  AMOUNT_OF_DATA, AX			 ;AN000; Save the amount of data that was read.
				    .IF < AX B BUFFER_SIZE >			 ;AN000; Were less bytes read then we asked for?
 0317  3B 06 0009 R          3						cmp AX,BUFFER_SIZE 
 031B  73 05                 5						jnB $l96 
 031D  80 0E 0036 R 01			 OR   READ_FLAG, AT_EOF 		 ;AN000; Yes! Indicate that we are at EOF
				;	 MOV  DI, AX				 ; Move number of characters into an index pointer
				;	 MOV  BYTE PTR ES:[DI+NAMES_TABLE_SIZE], 00   ; Place a terminator at the end
				    .ENDIF		    ;AN000;
 0322                        2	$l96: 
 0322  F8			    CLC 		    ;AN000;
 0323  C3			    RET 		    ;AN000;
				
 0324				RETURN_WITH_ERROR:	    ;AN000;
 0324  F9			    STC 		    ;AN000;
 0325  C3			    RET 		    ;AN000;
				
 0326				READ_FROM_HERE	   ENDP      ;AN000;
				
				;********************************************************************************
				; Routines for extracting all the information supplied in the profile for a
				; specific printer.  Given the printer number, the location of its definition
				; is looked up in the names table.  The file is them parsed for the information.
				;********************************************************************************
				
				;******************************************************************************
				; GET_PRINTER_INFO_ROUTINE - Get all the information contained in the printer
				;	       profile file for the specified printer.
				;
				; INPUT:
				;    AX - The number of the printer to return the information on.  The number
				;	  is the index into the names table for this printer.
				;
				; OUTPUT:
				;	If CY = 0, there were no errors.
				;	The following variable are updated with the information found in
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Page     1-19


				;	the file:
				;	      I_PRINTER
				;	      N_PRINTER_TYPE
				;	      S_MODE_PARM
				;	      S_CP_DRIVER
				;	      S_CP_PREPARE
				;	      S_GRAPH_PARM
				;
				;	If CY = 1, There were errors encountered.
				;	     BX = An error code indicating the type of error that occured.
				;
				;		= 3  There was an error reading the file
				;		= 7  There was a error accessing the file
				;		= 11 A printer definition has either a CDP or a CPP
				;		       Prefix, but BOTH were not present.
				;		= 12 There was an error in the printer definition.
				;		       - A line was found with an invalid prefix
				;
				;		If the error was a result of a DOS function, then
				;		on return, AX will contain the DOS error code.
				;
				; Operation:
				;
				; Note:
				;   The first printer name has an index of 1.
				;
				;******************************************************************************
 0326				GET_PRINTER_INFO_ROUTINE     PROC FAR;AN000;
				
				
				
 0326  9A 0000 ---- E		    CALL HOOK_INT_24				 ;AN000;
				
				
				
 032B  06			    PUSH ES					 ;AN000; Save the extra segment register
				    ;**********************************************************************
				    ; Calculate the address of the specifed printer
				    ;**********************************************************************
 032C  A3 0000 E		    MOV  I_PRINTER, AX				 ;AN000; Save the printer index
 032F  48			    DEC  AX					 ;AN000; Make the first index a 0
 0330  BB 002D			    MOV  BX, SIZE_NAMES 	     ;AN000; Number of bytes in each table entry
 0333  F7 E3			    MUL  BX					 ;AN000; Address is returned in AX
 0335  8B F8			    MOV  DI, AX 				 ;AN000; Move the address to an index register
				    ;**********************************************************************
				    ; Get the file location for this printer name
				    ;**********************************************************************
 0337  A1 0001 R		    MOV  AX, SEG_LOC			;AN000; Get the segment where the data is
 033A  8E C0			    MOV  ES, AX 				 ;AN000; Save in a segment register
 033C  26: 8B 4D 29		    MOV  CX, WORD PTR ES:[DI+41]		 ;AN000; Get the low order word of the file location
 0340  26: 8B 55 2B		    MOV  DX, WORD PTR ES:[DI+43]		 ;AN000; Get the high order word of the file locatio
				n
				    ;**********************************************************************
				    ; Determine if the information is already in the buffer or do we  have
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Page     1-20


				    ; to read more information from the printer profile.
				    ;**********************************************************************
				    .IF < DX B <WORD PTR FILE_PTR_AT_START+2>>	 ;AN000; Compare the high order words
 0344  3B 16 000D R          3						cmp DX,WORD PTR FILE_PTR_AT_START+2 
 0348  73 05                 5						jnB $l100 
 034A  EB 6C 90				 JMP  READ_MORE_INFORMATION		 ;AN000; Info in buffer is passed where we want.
				    .ELSE					 ;AN000;
 034D  EB 0F                 3						jmp short $l99 
 034F                        2	$l100: 
					 .IF < DX EQ < WORD PTR FILE_PTR_AT_START+2>> AND ;AN000; High words equal so
 034F  3B 16 000D R          3						cmp DX, WORD PTR FILE_PTR_AT_START+2 
 0353  75 09                 6						jne $l99 
					 .IF < CX B <WORD PTR FILE_PTR_AT_START>>	  ;AN000; compare the low order words
 0355  3B 0E 000B R          3						cmp CX,WORD PTR FILE_PTR_AT_START 
 0359  73 03                 5						jnB $l99 
 035B  EB 5B 90				      JMP  READ_MORE_INFORMATION	 ;AN000; Info in buffer is passed where we want.
					 .ENDIF 			  ;AN000;
				    .ENDIF			   ;AN000;
 035E                        2	$l99: 
 035E  8B 1E 000D R		    MOV  BX, WORD PTR FILE_PTR_AT_START+2	 ;AN000; File location at beginning of buffer
 0362  8B 36 000B R		    MOV  SI, WORD PTR FILE_PTR_AT_START 	 ;AN000; Low order word
 0366  03 36 000F R		    ADD  SI, AMOUNT_OF_DATA			 ;AN000; Get the file pointer of the end of the buff
				er
 036A  83 D3 00			    ADC  BX, 0					 ;AN000; Add in the high word
				    .IF < DX A BX >				 ;AN000; If data we want is further in the file,
 036D  3B D3                 3						cmp DX,BX 
 036F  76 05                 5						jnA $l107 
 0371  EB 45 90				 JMP  READ_MORE_INFORMATION		 ;AN000; Read in more data
				    .ELSE		       ;AN000;
 0374  EB 0B                 3						jmp short $l106 
 0376                        2	$l107: 
					 .IF < DX EQ BX > AND			 ;AN000; If the high words are equal do the
 0376  3B D3                 3						cmp DX,BX 
 0378  75 07                 6						jne $l106 
					 .IF < CX A SI >			 ;AN000; comparison on the low order words
 037A  3B CE                 3						cmp CX,SI 
 037C  76 03                 5						jnA $l106 
 037E  EB 38 90				      JMP  READ_MORE_INFORMATION	 ;AN000; Still not there, so read more info
					 .ENDIF 			  ;AN000;
				    .ENDIF			   ;AN000;
 0381                        2	$l106: 
 0381  A1 0000 E		    MOV  AX, I_PRINTER				 ;AN000; Get the index of this printer name
				    .IF < AL EQ NUM_PRINTER_DEFS >		 ;AN000; Is this the last one in the list?
 0384  3A 06 0017 R          3						cmp AL,NUM_PRINTER_DEFS 
 0388  75 0F                 6						jne $l113 
					 .IF < BIT READ_FLAG AND AT_EOF >	 ;AN000; If it is, and all the data has been read, p
				rocess it
 038A  F6 06 0036 R 01       3						test READ_FLAG,AT_EOF 
 038F  74 05                 6						jz $l117 
 0391  E9 0415 R			      JMP  PARSE_HERE		   ;AN000;
					 .ELSE				   ;AN000;
 0394  EB 03                 3						jmp short $l113 
 0396                        2	$l117: 
 0396  EB 20 90				      JMP  READ_MORE_INFORMATION	 ;AN000; Not EOF, so read in more data just for safe
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Page     1-21


				ty
					 .ENDIF 			  ;AN000;
				    .ENDIF			   ;AN000;
 0399                        2	$l113: 
 0399  26: 8B 4D 56		    MOV  CX, WORD PTR ES:[DI+SIZE_NAMES+41] ;AN000; Get the pointer to the NEXT printer name
 039D  26: 8B 55 58		    MOV  DX, WORD PTR ES:[DI+SIZE_NAMES+43] ;AN000; Get the high order word
				    .IF < DX A BX >				 ;AN000; See if the next printer name is in the buff
				er
 03A1  3B D3                 3						cmp DX,BX 
 03A3  76 05                 5						jnA $l121 
 03A5  EB 11 90				 JMP  READ_MORE_INFORMATION		 ;AN000; If not, get more information
				    .ELSE		       ;AN000;
 03A8  EB 0B                 3						jmp short $l120 
 03AA                        2	$l121: 
					 .IF < DX EQ BX > AND			 ;AN000; If the high order words are equal,
 03AA  3B D3                 3						cmp DX,BX 
 03AC  75 07                 6						jne $l120 
					 .IF < CX A SI >			 ;AN000; Compare the low order.  Is the name there?
 03AE  3B CE                 3						cmp CX,SI 
 03B0  76 03                 5						jnA $l120 
 03B2  EB 04 90				      JMP  READ_MORE_INFORMATION	 ;AN000; If not, read more.
					 .ENDIF 			  ;AN000;
				    .ENDIF			   ;AN000;
 03B5                        2	$l120: 
 03B5  EB 5E 90			    JMP  PARSE_HERE				 ;AN000; The necessary info is there, so parse it.
				    ;**********************************************************************
				    ; The specified printer information is not currently in the buffer.  It
				    ; is necessary to read it from the printer profile file.
				    ;**********************************************************************
 03B8				READ_MORE_INFORMATION:				 ;AN000;
 03B8  26: 8B 4D 2B		    MOV  CX, WORD PTR ES:[DI+43]		 ;AN000; Get the file pointer of this printer name
 03BC  26: 8B 55 29		    MOV  DX, WORD PTR ES:[DI+41]		 ;AN000; Get the low order word of pointer
 03C0  C7 06 0000 E 0000	    MOV  INT_24_ERROR, 0			 ;AN000; Indicate that no critical errors have occur
				ed yet
 03C6  B8 4200			    MOV  AX, 4200H				 ;AN000; DOS Fn. for positioning file pointer
 03C9  8B 1E 001A R		    MOV  BX, FILE_HANDLE			 ;AN000; Get the handle of the file
				    DOSCALL					 ;AN000; Position the pointer
 03CD  CD 21                 1		INT	21H			; 
				    .IF < C >					 ;AN000; If CY = 1, there was an error
 03CF  73 06                 5						jnC $l127 
 03D1  BB 0007				 MOV  BX, ERR_ACCESSING_FILE		 ;AN000; Return this error code
 03D4  E9 053E R			 JMP  ERROR_EXIT			 ;AN000; Jump to exit routine
				    .ENDIF	     ;AN000;
 03D7                        2	$l127: 
 03D7  A3 000B R		    MOV  WORD PTR FILE_PTR_AT_START, AX 	 ;AN000; Set the new pointer at the beginning of the
				 buffer
 03DA  89 16 000D R		    MOV  WORD PTR FILE_PTR_AT_START+2, DX	 ;AN000; Set the high order word
 03DE  B4 3F			    MOV  AH, 3FH				 ;AN000; DOS Fn. for reading from a file
 03E0  8B 16 0007 R		    MOV  DX, BUFFER_START			 ;AN000; Offset of the start of the data buffer
 03E4  8B 1E 001A R		    MOV  BX, FILE_HANDLE			 ;AN000; Get the file handle
 03E8  8B 0E 0009 R		    MOV  CX, BUFFER_SIZE			 ;AN000; Read as many bytes as the buffer will hold
 03EC  C7 06 0000 E 0000	    MOV  INT_24_ERROR, 0			 ;AN000; Indicate that no critical errors have occur
				ed yet
 03F2  1E			    PUSH DS					 ;AN000; Save the current data segment
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Page     1-22


 03F3  06			    PUSH ES					 ;AN000; Push the segment of the data buffer
 03F4  1F			    POP  DS					 ;AN000; Load DS with the segment where to store the
				 data
				    DOSCALL					 ;AN000; Read in the data
 03F5  CD 21                 1		INT	21H			; 
 03F7  1F			    POP  DS					 ;AN000; Restore the data segment
				    .IF < C >	 ;AN000;
 03F8  73 06                 5						jnC $l130 
 03FA  BB 0003				 MOV  BX, ERR_READING_FILE;AN000;
 03FD  E9 053E R			 JMP  ERROR_EXIT;AN000;
				    .ENDIF	 ;AN000;
 0400                        2	$l130: 
				    .IF < AX NE BUFFER_SIZE >			 ;AN000; Were less bytes read then asked for?
 0400  3B 06 0009 R          3						cmp AX,BUFFER_SIZE 
 0404  74 07                 6						je $l134 
 0406  80 0E 0036 R 01			 OR   READ_FLAG, AT_EOF 		 ;AN000; If so, then we are at the end of file
				    .ELSE					 ;AN000; Otherwise...
 040B  EB 05                 3						jmp short $l133 
 040D                        2	$l134: 
 040D  80 26 0036 R FE			 AND  READ_FLAG, RESET_EOF		 ;AN000; We are not at end of file
				    .ENDIF		      ;AN000;
 0412                        2	$l133: 
 0412  A3 000F R		    MOV  AMOUNT_OF_DATA, AX			 ;AN000; Save the amount of data actually read
				    ;**********************************************************************
				    ; The printer data is in the data buffer.  Begin to parse the data.
				    ;**********************************************************************
 0415				PARSE_HERE:		       ;AN000;
 0415  C6 06 0024 R 00		    MOV  CDP_FOUND, FALSE      ;AN000;
 041A  C6 06 0025 R 00		    MOV  CPP_FOUND, FALSE      ;AN000;
 041F  57			    PUSH DI					 ;AN000; Save the pointer into the names table
				    ;**********************************************************************
				    ; Load the printer profile fields with defaults.
				    ;**********************************************************************
				    COPY_STRING    S_MODE_PARM, 40, BLANK_STRING  ;AC000;JW
 0420  8D 3E 0000 E          1		LEA	DI, S_MODE_PARM				; 
 0424  8D 36 0032 R          1		LEA	SI, BLANK_STRING				; 
 0428  B8 0028               1		MOV	AX, 40				; 
 042B  9A 0000 ---- E        1		CALL	COPY_ROUTINE				; 
				    COPY_STRING    S_CP_DRIVER, 22, BLANK_STRING  ;AN000;
 0430  8D 3E 0000 E          1		LEA	DI, S_CP_DRIVER				; 
 0434  8D 36 0032 R          1		LEA	SI, BLANK_STRING				; 
 0438  B8 0016               1		MOV	AX, 22				; 
 043B  9A 0000 ---- E        1		CALL	COPY_ROUTINE				; 
				    COPY_STRING    S_CP_PREPARE, 12, BLANK_STRING ;AN000;
 0440  8D 3E 0000 E          1		LEA	DI, S_CP_PREPARE				; 
 0444  8D 36 0032 R          1		LEA	SI, BLANK_STRING				; 
 0448  B8 000C               1		MOV	AX, 12				; 
 044B  9A 0000 ---- E        1		CALL	COPY_ROUTINE				; 
				    COPY_STRING    S_GRAPH_PARM, 20, BLANK_STRING ;AN000;
 0450  8D 3E 0000 E          1		LEA	DI, S_GRAPH_PARM				; 
 0454  8D 36 0032 R          1		LEA	SI, BLANK_STRING				; 
 0458  B8 0014               1		MOV	AX, 20				; 
 045B  9A 0000 ---- E        1		CALL	COPY_ROUTINE				; 
 0460  5F			    POP  DI					 ;AN000; Restore the pointer into the names table
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Page     1-23


				    ;**********************************************************************
				    ; Get the type of printer.
				    ;**********************************************************************
 0461  26: 8A 45 28		    MOV  AL, ES:[DI+40] 			 ;AN000; Get the printer type - Parallel or Serial f
				rom the table
 0465  A2 0000 E		    MOV  N_PRINTER_TYPE, AL			 ;AN000; Save in the appropriate variable
				    ;**********************************************************************
				    ; Get the offset of the start of this printer definition
				    ;**********************************************************************
 0468  26: 8B 4D 29		    MOV  CX, ES:[DI+41] 			 ;AN000; Get the low order word of the file pointer
 046C  26: 8B 55 2B		    MOV  DX, ES:[DI+43] 			 ;AN000; Get the high order word
 0470  2B 16 000D R		    SUB  DX, WORD PTR FILE_PTR_AT_START[2]	 ;AN000; Subtract the high order words
 0474  1B 0E 000B R		    SBB  CX, WORD PTR FILE_PTR_AT_START 	 ;AN000; Subtract the low order words
 0478  03 0E 0007 R		    ADD  CX, BUFFER_START			 ;AN000; Get the offset of the start of the definiti
				on
 047C  89 0E 0011 R		    MOV  CURRENT_PARSE_LOC, CX			 ;AN000; Save as the scan position
 0480  80 0E 0037 R 04		    OR	 PARSE_FLAG, FIRST_NAME    ;AN000;
 0485				PARSE_NEXT_PARM:		  ;AN000;
 0485  8B 3E 0011 R		    MOV  DI, CURRENT_PARSE_LOC			 ;AN000; Get the current scan position
 0489  E8 01DD R		    CALL SCAN_FOR_EOLN				 ;AN000; Search for the end of this line
 048C  89 3E 001E R		    MOV  START_NEXT_LINE, DI			 ;AN000; Save the position of the start of the next 
				line
 0490  8B 36 0011 R		    MOV  SI, CURRENT_PARSE_LOC			 ;AN000; The position in the buffer to scan
 0494  C6 06 0059 R 06		    MOV  NUM_STRINGS, 6 			 ;AN000; Number of parameters to parse for
 0499  BF 0038 R		    MOV  DI, OFFSET PARMS			 ;AN000; Offset of the parameter blocks
 049C  BA 0000			    MOV  DX, 0					 ;AN000; The parser wants DX = 0.
 049F  B9 0000			    MOV  CX, 0					 ;AN000; Tell the parser this is the first scan of t
				his line
 04A2  1E			    PUSH DS					 ;AN000; Save the current data segment
 04A3  06			    PUSH ES					 ;AN000; Save the file data segment
 04A4  B8 ---- R		    MOV  AX, DATA				 ;AN000; Get the current data segment
 04A7  8E C0			    MOV  ES, AX 				 ;AN000; This is the parser control blocks.
 04A9  A1 0001 R		    MOV  AX, SEG_LOC				 ;AN000; Where the data to parse is located
 04AC  8E D8			    MOV  DS, AX 				 ;AN000;
 04AE  9A 0000 ---- E		    CALL SYSPARSE				 ;AN000; Do the parsing
 04B3  07			    POP  ES					 ;AN000; Restore the file data segment
 04B4  1F			    POP  DS					 ;AN000; Restore the data segment
				    .IF < AX EQ 0FFFFH >			 ;AN000; Was the end of the line found?
 04B5  3D FFFF               3						cmp AX,0FFFFH 
 04B8  75 06                 6						jne $l138 
 04BA  EB 5C 90				 JMP  UPDATE_PARSE_PTR			 ;AN000; If so, start the next one
				    .ELSEIF < NONZERO AX >			 ;AN000; Was an error encountered parsing the line?
 04BD  EB 0B                 3						jmp short $l137 
 04BF  90                    3						nop 
 04C0                        2	$l138: 
 04C0  0B C0                 3						or AX,AX 
 04C2  74 06                 6						jz $l137 
 04C4  BB 000C				 MOV  BX, ERR_PRN_DEFN	     ;AN000;
 04C7  EB 75 90				 JMP  ERROR_EXIT			 ;AN000; If so, exit the subroutine
				    .ENDIF	     ;AN000;
 04CA                        2	$l137: 
 04CA  A0 007F R		    MOV  AL, MATCHED_TAG			 ;AN000; Get which string was matched
				    .IF < AL EQ 1 > OR				 ;AN000; Was this a printer name and type?
 04CD  3C 01                 3						cmp AL,1 
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Page     1-24


 04CF  74 04                 6						je $l144 
				    .IF < AL EQ 2 >	   ;AN000;
 04D1  3C 02                 3						cmp AL,2 
 04D3  75 14                 6						jne $l143 
 04D5                        3	$l144: 
					 .IF < BIT PARSE_FLAG AND FIRST_NAME >	 ;AN000; Is this the first name encountered?
 04D5  F6 06 0037 R 04       3						test PARSE_FLAG,FIRST_NAME 
 04DA  74 07                 6						jz $l146 
 04DC  80 26 0037 R FB			      AND  PARSE_FLAG, RESET_FIRST_NAME  ;AN000; Indicate that the a name has been found
					 .ELSE					 ;AN000; Otherwise...
 04E1  EB 35                 3						jmp short $l142 
 04E3                        2	$l146: 
 04E3  EB 46 90				      JMP  PARSING_DONE 		 ;AN000; This is the second name.  We are finished.
					 .ENDIF 		   ;AN000;
				    .ELSEIF < AL EQ 3 > 			 ;AN000; AL = 3 ==> Mode parameters
 04E6  EB 30                 3						jmp short $l142 
 04E8  90                    3						nop 
 04E9                        2	$l143: 
 04E9  3C 03                 3						cmp AL,3 
 04EB  75 06                 6						jne $l149 
 04ED  E8 0546 R			 CALL HANDLE_MODE			 ;AN000; Process
				    .ELSEIF < AL EQ 4 > 			 ;AN000; AL = 4 ==> Code page driver parameters
 04F0  EB 26                 3						jmp short $l142 
 04F2  90                    3						nop 
 04F3                        2	$l149: 
 04F3  3C 04                 3						cmp AL,4 
 04F5  75 0B                 6						jne $l151 
 04F7  C6 06 0024 R 01			 MOV  CDP_FOUND, TRUE	   ;AN000;
 04FC  E8 0550 R			 CALL HANDLE_CODE_DRIVER		 ;AN000; Process
				    .ELSEIF < AL EQ 5 > 			 ;AN000; AL = 5 ==> Code page preparation parameters
 04FF  EB 17                 3						jmp short $l142 
 0501  90                    3						nop 
 0502                        2	$l151: 
 0502  3C 05                 3						cmp AL,5 
 0504  75 0B                 6						jne $l153 
 0506  C6 06 0025 R 01			 MOV  CPP_FOUND, TRUE	   ;AN000;
 050B  E8 055A R			 CALL HANDLE_CODE_PREPARE		 ;AN000; Process
				    .ELSEIF < AL EQ 6 > 			 ;AN000; AL = 6 ==> Graphics parameters
 050E  EB 08                 3						jmp short $l142 
 0510  90                    3						nop 
 0511                        2	$l153: 
 0511  3C 06                 3						cmp AL,6 
 0513  75 03                 6						jne $l142 
 0515  E8 0564 R			 CALL HANDLE_GRAPHICS			 ;AN000; Process
				    .ENDIF		  ;AN000;
 0518                        2	$l142: 
				    ;**********************************************************************
				    ; The current line has been parsed.  Point to the next line.
				    ;**********************************************************************
 0518				UPDATE_PARSE_PTR:	  ;AN000;
 0518  A1 001E R		    MOV  AX, START_NEXT_LINE			 ;AN000; Get the address of the start of the next li
				ne
 051B  A3 0011 R		    MOV  CURRENT_PARSE_LOC, AX			 ;AN000; Save this as the start of the current line
				    .IF < CURRENT_PARSE_LOC EQ 0 >		 ;AN000; Is there any more data?
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Page     1-25


 051E  83 3E 0011 R 00       3						cmp CURRENT_PARSE_LOC,0 
 0523  75 03                 6						jne $l157 
 0525  EB 04 90				 JMP  PARSING_DONE			 ;AN000; No. Exit the routine
				    .ENDIF					 ;AN000;
 0528                        2	$l157: 
 0528  E9 0485 R		    JMP  PARSE_NEXT_PARM			 ;AN000; Start the parsing again
				    ;**********************************************************************
				    ; The subroutine is finished.
				    ;**********************************************************************
 052B				PARSING_DONE:		    ;AN000;
 052B  A0 0024 R		    MOV  AL, CDP_FOUND	    ;AN000;
 052E  32 06 0025 R		    XOR  AL, CPP_FOUND	    ;AN000;
				    .IF < NZ >		    ;AN000;
 0532  74 06                 6						jz $l160 
 0534  BB 000B				 MOV  BX, ERR_CDP_CPP	   ;AN000;
 0537  EB 05 90				 JMP  ERROR_EXIT	   ;AN000;
				    .ENDIF		    ;AN000;
 053A                        2	$l160: 
 053A  F8			    CLC 					 ;AN000; Clear the carry - No errors
 053B  EB 02 90			    JMP  EXIT_INFO				 ;AN000; Exit the subroutine
 053E				ERROR_EXIT:	       ;AN000;
 053E  F9			    STC 					 ;AN000; Set the carry - There were errors
 053F				EXIT_INFO:    ;AN000;
 053F  07			    POP  ES					 ;AN000; Restore the extra segment
 0540  9A 0000 ---- E		    CALL RESTORE_INT_24;AN000;
 0545  CB			    RET 					 ;AN000; return
				
 0546				GET_PRINTER_INFO_ROUTINE     ENDP;AN000;
				;********************************************************************************
				; HANDLE_MODE - Subroutine to process the mode parameter line in the printer
				;    profile.
				;
				; INPUT:
				;    SI - Points to the beginning of the line to process
				;
				; OUTPUT:
				;    S_MODE_PARM - Filled with the information from the line.  The line will be
				;	  in a format for use as the parameters for the MODE command.
				;
				;********************************************************************************
 0546				HANDLE_MODE   PROC NEAR;AN000;
				
				;AD000;JW     PUSH SI
				;AD000;JW     COPY_STRING    S_MODE_PARM, 13, BLANK_MODE
				;AD000;JW     POP  SI
				;AD000;JW
				;AD000;JW NEXT_MODE_SCAN:				   ; Scan for the next keyword.
				;AD000;JW     MOV  DI, OFFSET MODE_PARMS		   ; Offset of the control blocks for parsin
				g the mode parameters
				;AD000;JW     MOV  CX, 0				   ; Always tell the parser this is the firs
				t parse
				;AD000;JW     MOV  DX, 0				   ; The parse wants DX = 0
				;AD000;JW     PUSH ES					   ; Save the segment registers
				;AD000;JW     PUSH DS
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Page     1-26


				;AD000;JW     MOV  AX, DATA				   ; Get the location of the data segment
				;AD000;JW     MOV  ES, AX				   ; Load in the extra segment register - Th
				e segment of the control blocks
				;AD000;JW     MOV  AX, SEG_LOC				   ; Get the location of the printer data
				;AD000;JW     MOV  DS, AX				   ; Load into the data segment - The segmen
				t of the data to parse
				;AD000;JW     CALL SYSPARSE				   ; Parse the line.
				;AD000;JW     POP  DS					   ; Restore the segment registers
				;AD000;JW     POP  ES
				;AD000;JW
				;AD000;JW ;   PUSHH	<AX,BX,CX,DX,SI,DI>
				;AD000;JW ;   MOV  W_VALUE, AX
				;AD000;JW ;   WORD_TO_CHAR   W_VALUE, STRING_N
				;AD000;JW ;   PRINTN	STRING_N
				;AD000;JW ;   CR_LF
				;AD000;JW ;   POPP	<DI,SI,DX,CX,BX,AX>
				;AD000;JW
				;AD000;JW     .IF < NONZERO AX >			   ; If errors or the end of the line, end t
				he routine
				;AD000;JW	   JMP	EXIT_MODE_SCAN
				;AD000;JW     .ENDIF
				;AD000;JW     MOV  BX, DX				   ; Move result pointer into an index regis
				ter
				;AD000;JW     .IF <<WORD PTR [BX+2]> EQ <OFFSET SYN_BAUD>>	     ; Was this the BAUD keyword?
				;AD000;JW	   MOV	AX, 5				   ; Maximum number of character to copy
				;AD000;JW	   MOV	DI, OFFSET S_MODE_PARM+2	   ; Where to put the baud parameters
				;AD000;JW     .ELSEIF <<WORD PTR [BX+2]> EQ <OFFSET SYN_PARITY>>     ; Was this the PARITY keyword?
				;AD000;JW	   MOV	AX, 1				   ; Maximum number of character to copy
				;AD000;JW	   MOV	DI, OFFSET S_MODE_PARM+8	   ; Where to put the parity parameters
				;AD000;JW     .ELSEIF <<WORD PTR [BX+2]> EQ <OFFSET SYN_DATA>>	     ; Was this the DATA keyword?
				;AD000;JW	   MOV	AX, 1				   ; Maximum number of character to copy
				;AD000;JW	   MOV	DI, OFFSET S_MODE_PARM+10	   ; Where to put the data parameters
				;AD000;JW     .ELSEIF <<WORD PTR [BX+2]> EQ <OFFSET SYN_STOP>>	     ; Was this the STOP keyword?
				;AD000;JW	   MOV	AX, 1				   ; Maximum number of character to copy
				;AD000;JW	   MOV	DI, OFFSET S_MODE_PARM+12	   ; Where to put the stop parameters
				;AD000;JW     .ELSEIF <<WORD PTR [BX+2]> EQ <OFFSET SYN_RETRY>>      ; Was this the RETRY keyword?
				;AD000;JW	   MOV	AX, 1				   ; Maximum number of character to copy
				;AD000;JW	   MOV	DI, OFFSET S_MODE_PARM+14	   ; Where to put the retry parameters
				;AD000;JW     .ENDIF
				;AD000;JW     CALL COPY_RESULT				   ; Copy the string
				;AD000;JW     JMP  NEXT_MODE_SCAN			   ; Scan for the next keyword
				;AD000;JW EXIT_MODE_SCAN:
				;AD000;JW     CALL REMOVE_BLANKS			   ; Remove the blanks from the mode line
				;AD000;JW
				
 0546  BF 0000 E		    MOV  DI, OFFSET S_MODE_PARM 		 ;AN000; Offset of the variable to load     JW
 0549  B9 0028			    MOV  CX, 40 				 ;AN000; Maximum width of the field		    
				JW
 054C  E8 058D R		    CALL COPY_LINE				 ;AN000; Copy the information from the file data  JW
 054F  C3			    RET 					 ;AN000; Return 			    JW
				
 0550				HANDLE_MODE   ENDP;AN000;
				;AD000;JW ;********************************************************************************
				;AD000;JW ; REMOVE_BLANKS: Remove the blanks from the S_MODE_PARM string.  Any trailing
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Page     1-27


				;AD000;JW ;    commas are also removed.
				;AD000;JW ;
				;AD000;JW ; INPUT:
				;AD000;JW ;    None.
				;AD000;JW ;
				;AD000;JW ; OUTPUT:
				;AD000;JW ;    None.
				;AD000;JW ;
				;AD000;JW ; OPERATION:
				;AD000;JW ;
				;AD000;JW ;
				;AD000;JW ;********************************************************************************
				;AD000;JW REMOVE_BLANKS PROC NEAR
				;AD000;JW
				;AD000;JW     MOV  CX, WORD PTR S_MODE_PARM
				;AD000;JW     LEA  SI, S_MODE_PARM
				;AD000;JW     INC  SI
				;AD000;JW     ADD  SI, CX
				;AD000;JW     MOV  BX, CX
				;AD000;JW     .WHILE < CX AE 0 >
				;AD000;JW	   .IF < <BYTE PTR [SI]> EQ <' '> > OR
				;AD000;JW	   .IF < <BYTE PTR [SI]> EQ <','> >
				;AD000;JW		DEC  BX
				;AD000;JW	   .ELSE
				;AD000;JW		.LEAVE
				;AD000;JW	   .ENDIF
				;AD000;JW	   DEC	SI
				;AD000;JW	   DEC	CX
				;AD000;JW     .ENDWHILE
				;AD000;JW     MOV  WORD PTR S_MODE_PARM, BX
				;AD000;JW
				;AD000;JW     MOV  CX, BX
				;AD000;JW     LEA  SI, S_MODE_PARM
				;AD000;JW     ADD  SI, 2
				;AD000;JW     MOV  DI, SI
				;AD000;JW     .WHILE < CX A 0 >
				;AD000;JW	   .IF < <BYTE PTR [SI]> NE <' '>>
				;AD000;JW		.IF < SI NE DI >
				;AD000;JW		     MOV  AL, [SI]
				;AD000;JW		     MOV  [DI], AL
				;AD000;JW		.ENDIF
				;AD000;JW		INC  DI
				;AD000;JW	   .ELSE
				;AD000;JW		DEC  BX
				;AD000;JW	   .ENDIF
				;AD000;JW	   INC	SI
				;AD000;JW	   DEC	CX
				;AD000;JW     .ENDWHILE
				;AD000;JW     MOV  WORD PTR S_MODE_PARM, BX
				;AD000;JW     RET
				;AD000;JW
				;AD000;JW REMOVE_BLANKS ENDP
				;********************************************************************************
				; HANDLE_CODE_DRIVER - Subroutine to process the code page driver parameter
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Page     1-28


				;    line in the printer profile.
				;
				; INPUT:
				;    SI - Points to the beginning of the line to process
				;
				; OUTPUT:
				;    S_CP_DRIVER - Filled with the information from the line.
				;
				; OPERATION: The line from the file is copied to the S_CP_DRIVER variable.
				;    This variable is assumed to be a maximum of 22 characters wide.
				;
				;********************************************************************************
 0550				HANDLE_CODE_DRIVER PROC NEAR;AN000;
				
 0550  BF 0000 E		    MOV  DI, OFFSET S_CP_DRIVER 		 ;AN000; Offset of the variable to load
 0553  B9 0016			    MOV  CX, 22 				 ;AN000; Maximum width of the field
 0556  E8 058D R		    CALL COPY_LINE				 ;AN000; Copy the information from the file data
 0559  C3			    RET 	       ;AN000;
				
 055A				HANDLE_CODE_DRIVER ENDP;AN000;
				
				;********************************************************************************
				; HANDLE_CODE_PREPARE - Subroutine to process the code prepare parameter line
				;    in the printer profile.
				;
				; INPUT:
				;    SI - Points to the beginning of the line to process
				;
				; OUTPUT:
				;    S_CP_PREPARE - Filled with the information from the line.
				;
				; OPERATION: The line from the file is copied to the variable S_CP_PREPARE.
				;    The variable is assumed to be a maximum of 12 characters long.
				;
				;********************************************************************************
 055A				HANDLE_CODE_PREPARE	PROC NEAR;AN000;
				
 055A  BF 0000 E		    MOV  DI, OFFSET S_CP_PREPARE		 ;AN000; Offset of the variable to load
 055D  B9 000C			    MOV  CX, 12 				 ;AN000; Maximum length of the variable
 0560  E8 058D R		    CALL COPY_LINE				 ;AN000; Copy the information from the file data
 0563  C3			    RET 	       ;AN000;
				
 0564				HANDLE_CODE_PREPARE	ENDP;AN000;
				
				;********************************************************************************
				; HANDLE_GRAPHICS - Subroutine to process the graphics parameter line in the
				;    printer profile.
				;
				; INPUT:
				;    SI - Points to the beginning of the line to process
				;
				; OUTPUT:
				;    S_GRAPH_PARM - Filled with the information from the line.
				;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Page     1-29


				; OPERATION: The line from the file is copied to the S_GRAPH_PARM variable.
				;    The variable is assumed to be a maximum of 20 characters long.
				;
				;********************************************************************************
 0564				HANDLE_GRAPHICS    PROC NEAR;AN000;
				
 0564  BF 0000 E		    MOV  DI, OFFSET S_GRAPH_PARM		 ;AN000; Offset of the variable to load
 0567  B9 0014			    MOV  CX, 20 				 ;AN000; Maximum width of the variable
 056A  E8 058D R		    CALL COPY_LINE				 ;AN000; Load the variable with the data from the fi
				le
 056D  C3			    RET 	       ;AN000;
				
 056E				HANDLE_GRAPHICS    ENDP;AN000;
				
				;********************************************************************************
				; COPY_RESULT: Copy the string pointed to in the result block to the specified
				;    destination.
				;
				; INPUT:
				;    AX - The maximum length of the string to copy.
				;    DX - The offset in DS of the result block.
				;    DI - The offset of where the string is to be stored
				;
				;
				; OUTPUT:
				;    CX - The length of the string copied.
				;
				; Operation: The string is copied from the result block to the area pointed to
				;    by DS:DI.	The string is copied until a null character is encountered.
				;
				;********************************************************************************
 056E				COPY_RESULT   PROC NEAR;AN000;
				
 056E  06			    PUSH ES	       ;AN000;
 056F  56			    PUSH SI	       ;AN000;
 0570  8B DA			    MOV  BX, DX 				 ;AN000; Put address into an index register
 0572  C4 77 04			    LES  SI, [BX+4]				 ;AN000; Get the address of the string to copy
 0575  B9 0000			    MOV  CX, 0					 ;AN000; Zero the string length indicator
				    .WHILE < CX B AX >				 ;AN000; Copy up to the number of character in AX
 0578                        2	$l163: 
 0578  3B C8                 3						cmp CX,AX 
 057A  73 0E                 5						jnB $l164 
 057C  26: 8A 14			 MOV  DL, BYTE PTR ES:[SI]		 ;AN000; Get the first byte
					 .LEAVE < ZERO DL >			 ;AN000; Terminate loop if this is a null char
 057F  0A D2                 3						or DL,DL 
 0581  74 07                 6						jz $l164 
 0583  88 15				 MOV  BYTE PTR [DI], DL 		 ;AN000; Save character in the destination string
 0585  46				 INC  SI				 ;AN000; Increment source pointer
 0586  47				 INC  DI				 ;AN000; Increment destination pointer
 0587  41				 INC  CX				 ;AN000; Increment number of characters moved
				    .ENDWHILE ;AN000;
 0588  EB EE                 3						jmp $l163 
 058A                        2	$l164: 
 058A  5E			    POP  SI   ;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Page     1-30


 058B  07			    POP  ES   ;AN000;
 058C  C3			    RET       ;AN000;
				
 058D				COPY_RESULT   ENDP;AN000;
				
				;********************************************************************************
				; COPY_LINE - Copy a line from the printer profile data to a specified area.
				;
				; INPUT:
				;    DI - Points to the location the data is to be copied to.
				;    CX - Contains the maximum number of bytes copied.
				;
				; OUTPUT:
				;    None.
				;
				; OPERATION: The current line being parsed is copied to the specified area.
				;    The length of the line is calculated with the use of the variable
				;    CUR_END_LINE.  If the lenght of the line is longer then the number passed
				;    in CX, then only a portion of the line will be copied.
				;
				;********************************************************************************
 058D				COPY_LINE     PROC NEAR;AN000;
				
				
 058D  56			    PUSH SI					 ;AN000; Save the index regiter used by the parser
 058E  57			    PUSH DI					 ;AN000; Save the pointer to the variable to load
 058F  83 C7 02			    ADD  DI, 2					 ;AN000; Push pointer passed the lenght word
 0592  A1 0013 R		    MOV  AX, END_CUR_LINE			 ;AN000; Get the pointer to the end of this line
 0595  2B C6			    SUB  AX, SI 				 ;AN000; Get the distance to the end
 0597  40			    INC  AX					 ;AN000; Add to get the length of the line
				    .IF < AX B CX >				 ;AN000; If length is greater then the maximum allow
				ed,
 0598  3B C1                 3						cmp AX,CX 
 059A  73 02                 5						jnB $l167 
 059C  8B C8				 MOV  CX, AX				 ;AN000; use the shorter length
				    .ENDIF	  ;AN000;
 059E                        2	$l167: 
 059E  51			    PUSH CX					 ;AN000; Save the length used.
 059F  06			    PUSH ES					 ;AN000; Swap the values in the segment registers
 05A0  1E			    PUSH DS	 ;AN000;
 05A1  07			    POP  ES	 ;AN000;
 05A2  1F			    POP  DS	 ;AN000;
 05A3  FC			    CLD 					 ;AN000; Move in the forward direction
 05A4  F3/ A4			    REP  MOVSB					 ;AN000; Move the data
 05A6  59			    POP  CX					 ;AN000; Restore the line length
 05A7  5F			    POP  DI					 ;AN000; Restore the pointer to the variable
 05A8  26: 89 0D		    MOV  WORD PTR ES:[DI], CX			 ;AN000; Save the length of the string
 05AB  5E			    POP  SI					 ;AN000; Restore the parser pointer
 05AC  1E			    PUSH DS					 ;AN000; Swap the segment registers again
 05AD  06			    PUSH ES	 ;AN000;
 05AE  1F			    POP  DS	 ;AN000;
 05AF  07			    POP  ES	 ;AN000;
 05B0  C3			    RET 	 ;AN000;
				
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Page     1-31


 05B1				COPY_LINE     ENDP;AN000;
				
				;********************************************************************************
				; Routine to deallocate the memory used for the storage of the printer profile
				; data and the table of printer names.	These routines also close the profile
				; file.
				;********************************************************************************
				
				;********************************************************************************
				; RELEASE_PRINTER_INFO_ROUTINE - Close the printer profile file and free the
				;	 allocated memory.
				;
				; INPUT:
				;    None.
				;
				; OUTPUT:
				;    If CY = 0, There were no error encountered.
				;    If CY = 1, There was an error.
				;	 AX = The DOS error code for the deallocate memory function
				;
				; OPERATION: Closes the printer file and deallocated the memory.
				;
				;********************************************************************************
 05B1				RELEASE_PRINTER_INFO_ROUTINE	PROC FAR;AN000;
				
				
				
				
 05B1  9A 0000 ---- E		    CALL HOOK_INT_24				 ;AN000;
				
				
 05B6  06			    PUSH ES					 ;AN000;
				    ;**********************************************************************
				    ; Close the printer definition file
				    ;**********************************************************************
 05B7  C7 06 0000 E 0000	    MOV  INT_24_ERROR, 0			 ;AN000; Indicate that no critical errors have occur
				ed yet
 05BD  8B 1E 001A R		    MOV  BX, FILE_HANDLE			 ;AN000; File handle of the profile file
 05C1  B4 3E			    MOV  AH, 3EH				 ;AN000; DOS Fn. for closing a file
				    DOSCALL					 ;AN000; Close the file
 05C3  CD 21                 1		INT	21H			; 
				    ;**********************************************************************
				    ; Deallocate the memory used for the data buffer
				    ;**********************************************************************
 05C5  A1 0001 R		    MOV  AX, SEG_LOC				 ;AN000; Location of the data buffer
 05C8  8E C0			    MOV  ES, AX 				 ;AN000;
 05CA  B4 49			    MOV  AH, 49H				 ;AN000; DOS Fn. for freeing allocated memory
				    DOSCALL					 ;AN000; Free the memory
 05CC  CD 21                 1		INT	21H			; 
 05CE  07			    POP  ES					 ;AN000;
 05CF  9A 0000 ---- E		    CALL RESTORE_INT_24;AN000;
 05D4  CB			    RET 	 ;AN000;
				
 05D5				RELEASE_PRINTER_INFO_ROUTINE ENDP;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Page     1-32


				
				;*******************************************************************************
				; Routines for changing the SELECT command line in the AUTOEXEC.BAT.
				;*******************************************************************************
				
				;********************************************************************************
				; CHANGE_AUTOEXEC_ROUTINE: Search a file for a line beginning with SELECT, and
				;			   change its parameters.
				;
				; INPUT:
				;    DI - The offset of an ASCII-N string containing the file to search.
				;    SI - The offset of an ASCII-N string containing the data to append as
				;	  parameters.
				;
				; OUTPUT:
				;    None.
				;
				; Operation:
				;
				;********************************************************************************
 05D5				CHANGE_AUTOEXEC_ROUTINE PROC FAR;AN000;
				
				
				
 05D5  F6 06 0000 R 80		    TEST SEL_FLG,INSTALLRW			 ;AN000; Is the install
										 ;AN000;    diskette read/write
										 ;AN000;   (has DISKCOPY occurred?)
 05DA  75 04			    JNZ  AUTO_OK				 ;AN000;
 05DC  F8			    CLC 					 ;AN000; no error
 05DD  E9 06EC R		    JMP  AUTO_EXIT_RO				 ;AN000; If not, exit
				
 05E0				AUTO_OK:		  ;AN000;
 05E0  9A 0000 ---- E		    CALL HOOK_INT_24				 ;AN000;
 05E5  06			    PUSH ES					 ;AN000;
 05E6  89 36 0020 R		    MOV  APPEND_POINTER, SI			 ;AN000; Save the address of the string to be append
				ed
 05EA  89 3E 0022 R		    MOV  FILENAME, DI				 ;AN000; Save the address of the string containing t
				he filename
				    ;**********************************************************************
				    ; Allocate the memory needed for reading the autoexec file.  A maximum
				    ; of 64K is allocated for use.
				    ;**********************************************************************
 05EE  E8 0196 R		    CALL ALLOCATE_MEMORY			 ;AN000; Allocate the memory needed
				    .IF < C >					 ;AN000; Was there an error?
 05F1  73 03                 5						jnC $l170 
 05F3  E9 06D9 R			 JMP  AUTO_EXIT_ERROR			 ;AN000; Yes!  Exit the subroutine
				    .ENDIF					 ;AN000;
 05F6                        2	$l170: 
 05F6  C7 06 0007 R 0000	    MOV  BUFFER_START, 0			 ;AN000; Save the offset of the start of the buffer
				    COPY_WORD BUFFER_SIZE, SEGMENT_SIZE 	 ;AN000; Save the size of the buffer
 05FC  A1 0005 R             1		MOV	AX, SEGMENT_SIZE			; 
 05FF  A3 0009 R             1		MOV	BUFFER_SIZE,AX			; 
				    ;**********************************************************************
				    ; Open the input file
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Page     1-33


				    ;**********************************************************************
 0602  C7 06 0000 E 0000	    MOV  INT_24_ERROR, 0			 ;AN000; Indicate that no critical errors have occur
				ed yet
										 ; DI contains the address of the filename
 0608  9A 0000 ---- E		    CALL POS_ZERO				 ;AN000; Make the string into an ASCII-Z string
 060D  8B D7			    MOV  DX, DI 				 ;AN000; Load string offset
 060F  83 C2 02			    ADD  DX, 2					 ;AN000; Adjust for length word
 0612  B8 3D02			    MOV  AX, 3D02H				 ;AN000; DOS Fn. for opening a file for reading and 
				writing
				    DOSCALL					 ;AN000; Open the file
 0615  CD 21                 1		INT	21H			; 
				    .IF < C >					 ;AN000; Was there an error?
 0617  73 03                 5						jnC $l173 
 0619  E9 06D9 R			 JMP  AUTO_EXIT_ERROR			 ;AN000; Exit the subroutine
				    .ENDIF					 ;AN000;
 061C                        2	$l173: 
 061C  A3 001A R		    MOV  FILE_HANDLE, AX			 ;AN000; Save the file handle
				    ;**********************************************************************
				    ; Set the file pointer
				    ;**********************************************************************
 061F  C7 06 000B R 0000	    MOV  WORD PTR FILE_PTR_AT_START[0], 0	 ;AN000; Set the file pointer of the data in the buf
				fer
 0625  C7 06 000D R 0000	    MOV  WORD PTR FILE_PTR_AT_START[2], 0	 ;AN000; Set the high word
 062B  C7 06 0011 R 0000	    MOV  CURRENT_PARSE_LOC, 0			 ;AN000; Set the current parsing location
 0631  80 26 0036 R FE		    AND  READ_FLAG, RESET_EOF			 ;AN000; Indicate that the end of file has not been 
				reached
				    ;**********************************************************************
				    ; Read data into the buffer
				    ;**********************************************************************
 0636  8B 3E 0011 R		    MOV  DI, CURRENT_PARSE_LOC			 ;AN000; Get the current parsing location
 063A  E8 02D1 R		    CALL READ_FROM_HERE 			 ;AN000; Read data starting from this position
				    .IF < C >					 ;AN000; Was there an error?
 063D  73 03                 5						jnC $l176 
 063F  E9 06D9 R			 JMP  AUTO_EXIT_ERROR			 ;AN000; Yes! Exit the subroutine
				   .ENDIF					 ;AN000;
 0642                        2	$l176: 
				    ;**********************************************************************
				    ; Setup the control blocks for the parser
				    ;**********************************************************************
 0642  C7 06 0038 R 0086 R	    MOV   PAR_EXTEN, OFFSET SELECT_PARMX	  ;AN000; Address of the parameters extension block
				    ;**********************************************************************
				    ; Parse the file for 'SELECT'
				    ;**********************************************************************
 0648				PARSE_FOR_SELECT:				 ;AN000; Here to parse the line
 0648  E8 0129 R		    CALL SEARCH_LINE				 ;AN000; Parse the line.
				    .IF < C >					 ;AN000; Was there an error?
 064B  73 03                 5						jnC $l179 
 064D  E9 06D9 R			 JMP  AUTO_EXIT_ERROR			 ;AN000; Yes! Exit the subroutine
				    .ENDIF					 ;AN000;
 0650                        2	$l179: 
				    .IF < AX EQ 0 >				 ;AN000; Did the parser file 'SELECT'?
 0650  3D 0000               3						cmp AX,0 
 0653  75 6C                 6						jne $l183 
 0655  89 36 0011 R			 MOV  CURRENT_PARSE_LOC, SI		 ;AN000; Yes!  Save the position after select as par
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Page     1-34


				se location
 0659  8B 16 000B R			 MOV  DX, WORD PTR FILE_PTR_AT_START[0];AN000;
 065D  8B 0E 000D R			 MOV  CX, WORD PTR FILE_PTR_AT_START[2];AN000;
 0661  03 16 0011 R			 ADD  DX, CURRENT_PARSE_LOC   ;AN000;
 0665  83 D1 00				 ADC  CX, 0		      ;AN000;
 0668  C7 06 0000 E 0000		 MOV  INT_24_ERROR, 0			 ;AN000; Indicate that no critical errors have occur
				ed yet
 066E  8B 1E 001A R			 MOV  BX, FILE_HANDLE	 ;AN000;
 0672  B8 4200				 MOV  AX, 4200H 	 ;AN000;
					 DOSCALL		 ;AN000;
 0675  CD 21                 1		INT	21H			; 
					 .IF < C >				 ;AN000; Was there an error writing the data?
 0677  73 03                 5						jnC $l185 
 0679  EB 5E 90				      JMP  AUTO_EXIT_ERROR		 ;AN000; Yes! Exit the subroutine
					 .ENDIF 				 ;AN000;
 067C                        2	$l185: 
					 ;*****************************************************************
					 ; Write the select parameters to the file
					 ;*****************************************************************
 067C  8B 36 0020 R			 MOV  SI, APPEND_POINTER		 ;AN000; Address of the string to add to the select 
				line
 0680  8B 0C				 MOV  CX, [SI]				 ;AN000; Size of the string
 0682  8B D6				 MOV  DX, SI				 ;AN000; Get the address again
 0684  83 C2 02				 ADD  DX, 2				 ;AN000; Adjust pointer past length word
 0687  C7 06 0000 E 0000		 MOV  INT_24_ERROR, 0			 ;AN000; Indicate that no critical errors have occur
				ed yet
 068D  8B 1E 001A R			 MOV  BX, FILE_HANDLE			 ;AN000; Get the handle for this file
 0691  B4 40				 MOV  AH, 40H				 ;AN000; DOS Fn. number for writing data
					 DOSCALL				 ;AN000; Write the data
 0693  CD 21                 1		INT	21H			; 
					 ;*****************************************************************
					 ; Write a carrage return and a line feed to the file
					 ;*****************************************************************
 0695  C7 06 0000 E 0000		 MOV  INT_24_ERROR, 0			 ;AN000; Indicate that no critical errors have occur
				ed yet
 069B  BA 0034 R			 MOV  DX, OFFSET W_CR_LF		 ;AN000; Address of string to write
 069E  B9 0002				 MOV  CX, E_SIZE_CR_LF			 ;AN000; Size of the string
 06A1  8B 1E 001A R			 MOV  BX, FILE_HANDLE			 ;AN000; Get the file handle
 06A5  B4 40				 MOV  AH, 40H				 ;AN000; DOS Fn. for writing data
					 DOSCALL				 ;AN000; Write the data
 06A7  CD 21                 1		INT	21H			; 
					 ;*****************************************************************
					 ; Truncate the file at the current file position
					 ;*****************************************************************
 06A9  C7 06 0000 E 0000		 MOV  INT_24_ERROR, 0			 ;AN000; Indicate that no critical errors have occur
				ed yet
 06AF  B9 0000				 MOV  CX, 0		 ;AN000;
 06B2  8B 1E 001A R			 MOV  BX, FILE_HANDLE	 ;AN000;
 06B6  B4 40				 MOV  AH, 40H		 ;AN000;
					 DOSCALL		 ;AN000;
 06B8  CD 21                 1		INT	21H			; 
					 ;*****************************************************************
					 ; Close the file.
					 ;*****************************************************************
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Page     1-35


 06BA  9A 05B1 ---- R			 CALL RELEASE_PRINTER_INFO_ROUTINE	 ;AN000; Close the original autoexec file
				    .ELSE			     ;AN000;
 06BF  EB 15                 3						jmp short $l182 
 06C1                        2	$l183: 
					 ;*****************************************************************
					 ; Parse the next line.
					 ;*****************************************************************
 06C1  8B 3E 001E R			 MOV  DI, START_NEXT_LINE		 ;AN000; Get the address of the next line
 06C5  89 3E 0011 R			 MOV  CURRENT_PARSE_LOC, DI		 ;AN000; Save this as the current parse location
					 .IF < CURRENT_PARSE_LOC EQ 0 > 	 ;AN000; If this is zero, then there is no more data
 06C9  83 3E 0011 R 00       3						cmp CURRENT_PARSE_LOC,0 
 06CE  75 03                 6						jne $l189 
 06D0  EB 10 90				      JMP  AUTO_EXIT_CLEAR		 ;AN000; Exit the subroutine - No errors
					 .ENDIF 				 ;AN000;
 06D3                        2	$l189: 
 06D3  E9 0648 R			 JMP  PARSE_FOR_SELECT			 ;AN000; Parse the next line
				    .ENDIF					 ;AN000;
 06D6                        2	$l182: 
 06D6  EB 0A 90			    JMP  AUTO_EXIT_CLEAR			 ;AN000; Exit the subroutine - No errors
				
 06D9				AUTO_EXIT_ERROR:				 ;AN000; Here if there was an error
 06D9  9A 05B1 ---- R		    CALL RELEASE_PRINTER_INFO_ROUTINE		 ;AN000; Close the original file
 06DE  F9			    STC 					 ;AN000; Indicate that there was an error
 06DF  EB 02 90			    JMP  AUTO_EXIT				 ;AN000; Exit the subroutine
				
 06E2				AUTO_EXIT_CLEAR:				 ;AN000; Exit here if NO errors.
 06E2  F8			    CLC 					 ;AN000; Indicate there were no errors
 06E3				AUTO_EXIT:					 ;AN000; Here to exit
 06E3  E8 01CA R		    CALL DEALLOCATE_MEMORY
 06E6  07			    POP  ES					 ;AN000; Restore the extra segment
 06E7  9A 0000 ---- E		    CALL RESTORE_INT_24;AN000;
 06EC				AUTO_EXIT_RO:	 ;AN000;
 06EC  CB			    RET 					 ;AN000;
				
 06ED				CHANGE_AUTOEXEC_ROUTINE ENDP;AN000;
				
 06ED				CODE_FAR    ENDS;AN000;
				
				END	      ;AN000;

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


Macros:

		N a m e			Lines

.ELSE  . . . . . . . . . . . . .  	  21
.ELSEIF  . . . . . . . . . . . .  	  16
.ENDIF . . . . . . . . . . . . .  	  11
.ENDSELECT . . . . . . . . . . .  	  15
.ENDWHILE  . . . . . . . . . . .  	  10
.FOR . . . . . . . . . . . . . .  	  23
.IF  . . . . . . . . . . . . . .  	  13
.LEAVE . . . . . . . . . . . . .  	   1
.LOOP  . . . . . . . . . . . . .  	  12
.NEXT  . . . . . . . . . . . . .  	  20
.OTHERWISE . . . . . . . . . . .  	  21
.REPEAT  . . . . . . . . . . . .  	   9
.SELECT  . . . . . . . . . . . .  	   4
.THEN  . . . . . . . . . . . . .  	   6
.UNTIL . . . . . . . . . . . . .  	   1
.WHEN  . . . . . . . . . . . . .  	  24
.WHILE . . . . . . . . . . . . .  	  14
ADD_WORD . . . . . . . . . . . .  	   2
APPEND_STRING  . . . . . . . . .  	   4
BEEP . . . . . . . . . . . . . .  	   3
BYTE_TO_CHAR . . . . . . . . . .  	   4
CHANGE_ATTRIBUTE . . . . . . . .  	   5
CHANGE_AUTOEXEC  . . . . . . . .  	   4
CHANGE_DIR . . . . . . . . . . .  	   7
CHECK_CLOCK  . . . . . . . . . .  	  10
CHECK_DATE_CHANGE  . . . . . . .  	  13
CHECK_DEFAULT_DRIVE  . . . . . .  	   7
CHECK_DISK . . . . . . . . . . .  	   6
CHECK_DISKETTE . . . . . . . . .  	  58
CHECK_DISPLAY  . . . . . . . . .  	   1
CHECK_DOS_PATH . . . . . . . . .  	   3
CHECK_DOS_VERSION  . . . . . . .  	   8
CHECK_EXPANDED_MEMORY  . . . . .  	   3
CHECK_MACHINE  . . . . . . . . .  	  18
CHECK_PATH . . . . . . . . . . .  	   9
CHECK_TIME_CHANGE  . . . . . . .  	  13
CHECK_VALID_MEDIA  . . . . . . .  	   7
CHECK_WRITE_PROTECT  . . . . . .  	   3
CHMOD_FILE . . . . . . . . . . .  	   2
CLEAR_SCREEN . . . . . . . . . .  	  10
CLEAR_SCREEN2  . . . . . . . . .  	  10
CLOSE_FILE . . . . . . . . . . .  	   3
COMPARE_STRINGS  . . . . . . . .  	   4
COMP_BYTES . . . . . . . . . . .  	   3
COMP_WORDS . . . . . . . . . . .  	   3
COPY_BYTE  . . . . . . . . . . .  	   2
COPY_FILES . . . . . . . . . . .  	   7
COPY_FILES2  . . . . . . . . . .  	   8
COPY_STRING  . . . . . . . . . .  	   5
COPY_WORD  . . . . . . . . . . .  	   2
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Symbols-2


CREATE_AUTOEXEC  . . . . . . . .  	   4
CREATE_CONFIG  . . . . . . . . .  	   3
CREATE_FILE  . . . . . . . . . .  	   4
CREATE_SHELL . . . . . . . . . .  	   3
DEC_VAR  . . . . . . . . . . . .  	   1
DIR  . . . . . . . . . . . . . .  	   6
DISKCOPY_PANELS  . . . . . . . .  	   3
DISKCOPY_TO  . . . . . . . . . .  	   4
DISPLAY_MESSAGE  . . . . . . . .  	   3
DOSCALL  . . . . . . . . . . . .  	   1
ERASE_FILE . . . . . . . . . . .  	   2
EXEC_PROGRAM . . . . . . . . . .  	   9
FIND_FILE  . . . . . . . . . . .  	   4
FIND_NEXT  . . . . . . . . . . .  	   5
FREE_MEM . . . . . . . . . . . .  	   8
GET_ALT_KEYBOARD . . . . . . . .  	  24
GET_ALT_KYBD_TABLE . . . . . . .  	  20
GET_COUNTRY_DEFAULTS . . . . . .  	   3
GET_COUNTRY_INDEX  . . . . . . .  	   4
GET_DATE . . . . . . . . . . . .  	  14
GET_DOS_COUNTRY  . . . . . . . .  	  12
GET_FREE_SPACE . . . . . . . . .  	  10
GET_INSTALLED_MEM  . . . . . . .  	   2
GET_KEYBOARD . . . . . . . . . .  	   5
GET_KEYBOARD_INDEX . . . . . . .  	   5
GET_NUMBER_PORTS . . . . . . . .  	  12
GET_PARTITION_SIZE . . . . . . .  	   7
GET_PRINTER_INFO . . . . . . . .  	   3
GET_PRINTER_PARAMS . . . . . . .  	   5
GET_PRINTER_TITLES . . . . . . .  	   3
GET_TIME . . . . . . . . . . . .  	   9
GOTO . . . . . . . . . . . . . .  	   1
HANDLE_FORMAT_ERROR  . . . . . .  	  10
HOOK15 . . . . . . . . . . . . .  	   1
HOOK_2F_FORMAT . . . . . . . . .  	   1
INC_VAR  . . . . . . . . . . . .  	   1
INIT . . . . . . . . . . . . . .  	   5
INIT_VAR . . . . . . . . . . . .  	   1
INIT_VAR_BALANCE . . . . . . . .  	   9
INIT_VAR_MAXIMIZE  . . . . . . .  	   9
INIT_VAR_MINIMIZE  . . . . . . .  	   9
INSERT_DISK  . . . . . . . . . .  	   4
INSTALL_FILES  . . . . . . . . .  	   2
LOAD_MESSAGES  . . . . . . . . .  	   2
MAKE_DIR . . . . . . . . . . . .  	   7
MAKE_DIR_PATHS . . . . . . . . .  	   2
MATCH_DISK_FILES . . . . . . . .  	   7
MERGE_STRING . . . . . . . . . .  	   8
OPEN_FILE  . . . . . . . . . . .  	   4
POPP . . . . . . . . . . . . . .  	   3
POP_HEADING  . . . . . . . . . .  	   2
POS_CURSOR . . . . . . . . . . .  	  18
PREPARE_FILE . . . . . . . . . .  	   2
PREP_FOR_ONE . . . . . . . . . .  	   2
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Symbols-3


PROCESS_ESC  . . . . . . . . . .  	   4
PROCESS_F3 . . . . . . . . . . .  	   4
PUSHH  . . . . . . . . . . . . .  	   3
PUSH_HEADING . . . . . . . . . .  	   2
READ_FILE  . . . . . . . . . . .  	   4
RELEASE_PRINTER_INFO . . . . . .  	   2
REMOVE_DIR . . . . . . . . . . .  	   7
RENAME_FILE  . . . . . . . . . .  	   4
RESTORE_ATTRIBUTE  . . . . . . .  	   5
SAVE_FILE  . . . . . . . . . . .  	   3
SAVE_PANEL_LIST  . . . . . . . .  	   3
SAVE_PARAMETERS  . . . . . . . .  	  11
SAVE_PRINTER_PARAMS  . . . . . .  	   3
SCAN_DISK_TABLE  . . . . . . . .  	   4
SCAN_INFO_FILE . . . . . . . . .  	  14
SCAN_PARAMETERS  . . . . . . . .  	   3
SET_DATE . . . . . . . . . . . .  	  12
SET_DISPLAY_MODE . . . . . . . .  	   1
SET_FILE_DATE_TIME . . . . . . .  	  33
SET_TIME . . . . . . . . . . . .  	  14
UNHOOK15 . . . . . . . . . . . .  	   1
UNHOOK_2F  . . . . . . . . . . .  	   1
UPDATE_DISK_TABLE  . . . . . . .  	   4
WORD_TO_CHAR . . . . . . . . . .  	   3
WRITE_FILE . . . . . . . . . . .  	   5
WRITE_LINE . . . . . . . . . . .  	   2

Segments and Groups:

                N a m e         	Length	 Align	Combine Class

CODE_FAR . . . . . . . . . . . .  	06ED	BYTE	PUBLIC	'CODE'
DATA . . . . . . . . . . . . . .  	00A4	BYTE	PUBLIC	'DATA'

Symbols:            

                N a m e         	Type	 Value	 Attr

ALLOCATED  . . . . . . . . . . .  	NUMBER	0080	
ALLOCATE_MEMORY  . . . . . . . .  	N PROC	0196	CODE_FAR	Length = 0034
ALLOC_FLAG . . . . . . . . . . .  	L BYTE	00A3	DATA
AMOUNT_OF_DATA . . . . . . . . .  	L WORD	000F	DATA
APPEND_POINTER . . . . . . . . .  	L WORD	0020	DATA
AT_EOF . . . . . . . . . . . . .  	NUMBER	0001	
AUTO_EXIT  . . . . . . . . . . .  	L NEAR	06E3	CODE_FAR
AUTO_EXIT_CLEAR  . . . . . . . .  	L NEAR	06E2	CODE_FAR
AUTO_EXIT_ERROR  . . . . . . . .  	L NEAR	06D9	CODE_FAR
AUTO_EXIT_RO . . . . . . . . . .  	L NEAR	06EC	CODE_FAR
AUTO_OK  . . . . . . . . . . . .  	L NEAR	05E0	CODE_FAR
A_DRIVE  . . . . . . . . . . . .  	NUMBER	0003	

BIN_TO_CHAR_ROUTINE  . . . . . .  	L FAR 	0000		External
BLANK_STRING . . . . . . . . . .  	L WORD	0032	DATA
BUFFER_SIZE  . . . . . . . . . .  	L WORD	0009	DATA
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Symbols-4


BUFFER_START . . . . . . . . . .  	L WORD	0007	DATA
B_DRIVE  . . . . . . . . . . . .  	NUMBER	0001	

CDP_FOUND  . . . . . . . . . . .  	L BYTE	0024	DATA
CHANGE_AUTOEXEC_ROUTINE  . . . .  	F PROC	05D5	CODE_FAR	Global	Length = 0118
CONTROL_P1 . . . . . . . . . . .  	NEAR	0044	DATA
COPY_LINE  . . . . . . . . . . .  	N PROC	058D	CODE_FAR	Length = 0024
COPY_PRINTER_NAME  . . . . . . .  	N PROC	0239	CODE_FAR	Length = 0098
COPY_RESULT  . . . . . . . . . .  	N PROC	056E	CODE_FAR	Length = 001F
COPY_ROUTINE . . . . . . . . . .  	L FAR 	0000		External
CPP_FOUND  . . . . . . . . . . .  	L BYTE	0025	DATA
CTL_FUNC_FL  . . . . . . . . . .  	L WORD	0044	DATA
CURRENT_PARSE_LOC  . . . . . . .  	L WORD	0011	DATA
CX_ORDINAL_VALUE . . . . . . . .  	L WORD	0015	DATA
C_DRIVE  . . . . . . . . . . . .  	NUMBER	0002	

DATA_INVALID . . . . . . . . . .  	NUMBER	0001	
DATA_VALID . . . . . . . . . . .  	NUMBER	0000	
DEALLOCATE_MEMORY  . . . . . . .  	N PROC	01CA	CODE_FAR	Length = 0013
DEF_DEST_A . . . . . . . . . . .  	NUMBER	0003	
DEF_DEST_B . . . . . . . . . . .  	NUMBER	0002	
DEF_DEST_C . . . . . . . . . . .  	NUMBER	0001	
DEM10  . . . . . . . . . . . . .  	L NEAR	01DC	CODE_FAR
DISKETTES_EXIST  . . . . . . . .  	NUMBER	0001	
DO_NOT_USE_DEFAULT . . . . . . .  	NUMBER	0001	
DSKCPY_EXIT  . . . . . . . . . .  	NUMBER	0001	
DSKCPY_TO_A_360  . . . . . . . .  	NUMBER	0001	
DSKCPY_TO_A_720  . . . . . . . .  	NUMBER	0000	
DSKCPY_TO_B  . . . . . . . . . .  	NUMBER	0002	

END_CUR_LINE . . . . . . . . . .  	L WORD	0013	DATA
ERROR_EXIT . . . . . . . . . . .  	L NEAR	053E	CODE_FAR
ERR_ACCESSING_FILE . . . . . . .  	NUMBER	0007	
ERR_ALLOCATING_MEM . . . . . . .  	NUMBER	000A	
ERR_CDP_CPP  . . . . . . . . . .  	NUMBER	000B	
ERR_FINDING_NAME . . . . . . . .  	NUMBER	0006	
ERR_FINDING_VALUE  . . . . . . .  	NUMBER	0004	
ERR_LINE_TOO_LONG  . . . . . . .  	NUMBER	0005	
ERR_NOT_ENOUGH_MEM . . . . . . .  	NUMBER	0001	
ERR_NUMBER_MATCH . . . . . . . .  	NUMBER	0009	
ERR_OPENING_FILE . . . . . . . .  	NUMBER	0002	
ERR_PRN_DEFN . . . . . . . . . .  	NUMBER	000C	
ERR_READING_FILE . . . . . . . .  	NUMBER	0003	
ERR_TOO_MANY_DEFS  . . . . . . .  	NUMBER	0008	
EXEC_DIR . . . . . . . . . . . .  	NUMBER	0001	
EXEC_NO_DIR  . . . . . . . . . .  	NUMBER	0000	
EXIT_COPY  . . . . . . . . . . .  	L NEAR	02CE	CODE_FAR
EXIT_INFO  . . . . . . . . . . .  	L NEAR	053F	CODE_FAR
EXIT_ROUTINE . . . . . . . . . .  	L NEAR	011F	CODE_FAR
EXIT_SCAN  . . . . . . . . . . .  	L NEAR	0238	CODE_FAR
EXIT_SEARCH_ERROR  . . . . . . .  	L NEAR	0194	CODE_FAR
EXIT_WITHOUT_ERROR . . . . . . .  	L NEAR	010F	CODE_FAR
EXIT_WITH_ERROR  . . . . . . . .  	L NEAR	010B	CODE_FAR
EXPECTED_VERSION . . . . . . . .  	NUMBER	0004	
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Symbols-5


E_1440_SECTORS . . . . . . . . .  	NUMBER	0012	
E_1440_TRACKS  . . . . . . . . .  	NUMBER	0050	
E_CR . . . . . . . . . . . . . .  	NUMBER	000D	
E_FILE_TERM  . . . . . . . . . .  	NUMBER	001A	
E_LF . . . . . . . . . . . . . .  	NUMBER	000A	
E_MAX_PRN_NAME_LEN . . . . . . .  	NUMBER	0028	
E_SIZE_CR_LF . . . . . . . . . .  	NUMBER	0002	

FALSE  . . . . . . . . . . . . .  	NUMBER	0000	
FILENAME . . . . . . . . . . . .  	L WORD	0022	DATA
FILE_HANDLE  . . . . . . . . . .  	L WORD	001A	DATA
FILE_PTR_AT_START  . . . . . . .  	L DWORD	000B	DATA
FIRST_NAME . . . . . . . . . . .  	NUMBER	0004	
FIRST_PARSE  . . . . . . . . . .  	NUMBER	0001	
FREE_EDOS_SPACE  . . . . . . . .  	NUMBER	0001	

GET_PRINTER_INFO_ROUTINE . . . .  	F PROC	0326	CODE_FAR	Global	Length = 0220
GET_PRINTER_TITLES_ROUTINE . . .  	F PROC	0000	CODE_FAR	Global	Length = 0129

HANDLE_CODE_DRIVER . . . . . . .  	N PROC	0550	CODE_FAR	Length = 000A
HANDLE_CODE_PREPARE  . . . . . .  	N PROC	055A	CODE_FAR	Length = 000A
HANDLE_GRAPHICS  . . . . . . . .  	N PROC	0564	CODE_FAR	Length = 000A
HANDLE_MODE  . . . . . . . . . .  	N PROC	0546	CODE_FAR	Length = 000A
HOOK_INT_24  . . . . . . . . . .  	L FAR 	0000		External

INSTALLRW  . . . . . . . . . . .  	NUMBER	0080	
INT_24_ERROR . . . . . . . . . .  	V WORD	0000		External
I_PRINTER  . . . . . . . . . . .  	V WORD	0000		External

KEYWORD_CODE_DRIVER  . . . . . .  	L BYTE	0073	DATA
KEYWORD_CODE_PREPARE . . . . . .  	L BYTE	0077	DATA
KEYWORD_GRAPHICS . . . . . . . .  	L BYTE	007B	DATA
KEYWORD_MODE . . . . . . . . . .  	L BYTE	0070	DATA
KEYWORD_PARALLEL . . . . . . . .  	L BYTE	006C	DATA
KEYWORD_SERIAL . . . . . . . . .  	L BYTE	006E	DATA

LAST_LINE  . . . . . . . . . . .  	NUMBER	0002	
LENGTH_FILE_PTR  . . . . . . . .  	NUMBER	0004	
LENGTH_PRT_TYPE_IND  . . . . . .  	NUMBER	0001	
LEN_ALT_KYBD_ID  . . . . . . . .  	NUMBER	0003	
LINE_DONE  . . . . . . . . . . .  	NUMBER	0002	

MAJOR_VERSION  . . . . . . . . .  	NUMBER	0004	
MATCHED_TAG  . . . . . . . . . .  	L BYTE	007F	DATA
MAX_NAME . . . . . . . . . . . .  	L WORD	001C	DATA	Global
MAX_NUM_DISKETTE . . . . . . . .  	NUMBER	0002	
MAX_NUM_PRINTER_DEFS . . . . . .  	NUMBER	001F	
MINIMUM_MEMORY . . . . . . . . .  	NUMBER	0973	
MINOR_VERSION  . . . . . . . . .  	NUMBER	0000	
MIN_SIZE_FILE_BUFFER . . . . . .  	NUMBER	0400	
MSG_INV_BOOT_MEDIA . . . . . . .  	NUMBER	0004	
MSG_INV_DISK_MEDIA . . . . . . .  	NUMBER	0005	
MSG_INV_DOS  . . . . . . . . . .  	NUMBER	0001	
MSG_INV_INSTALL  . . . . . . . .  	NUMBER	0007	
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Symbols-6


MSG_INV_PARMS  . . . . . . . . .  	NUMBER	0006	
MSG_LOADING  . . . . . . . . . .  	NUMBER	0008	
MSG_RELOADING  . . . . . . . . .  	NUMBER	0009	
M_DOS_EDOS_PART  . . . . . . . .  	NUMBER	0003	
M_DOS_EXISTS . . . . . . . . . .  	NUMBER	0001	
M_EDOS_EXISTS  . . . . . . . . .  	NUMBER	0002	
M_EDOS_SPACE . . . . . . . . . .  	NUMBER	0008	
M_FREE_SPACE . . . . . . . . . .  	NUMBER	0010	
M_LOGICAL_EXISTS . . . . . . . .  	NUMBER	0004	

NAMES_OFF  . . . . . . . . . . .  	L WORD	0003	DATA	Global
NAMES_TABLE_SIZE . . . . . . . .  	NUMBER	0573	
NAME_NOT_FOUND . . . . . . . . .  	L NEAR	02CD	CODE_FAR
NOCHECK  . . . . . . . . . . . .  	NUMBER	0000	
NOPANEL  . . . . . . . . . . . .  	NUMBER	0000	
NOT_PRESENT  . . . . . . . . . .  	NUMBER	0000	
NO_EDOS_BUT_SPACE  . . . . . . .  	NUMBER	0002	
NO_EDOS_SPACE  . . . . . . . . .  	NUMBER	0000	
NO_SOURCE1 . . . . . . . . . . .  	NUMBER	0001	
NUMERIC_VALUE  . . . . . . . . .  	NUMBER	8000	
NUM_PRINTER_DEFS . . . . . . . .  	L BYTE	0017	DATA
NUM_STRINGS  . . . . . . . . . .  	L BYTE	0059	DATA
N_PRINTER_TYPE . . . . . . . . .  	V BYTE	0000		External
N_PRN_NAMES  . . . . . . . . . .  	L WORD	0018	DATA	Global

PARMS  . . . . . . . . . . . . .  	L BYTE	0038	DATA
PARMSX . . . . . . . . . . . . .  	L BYTE	003E	DATA
PARSE_FLAG . . . . . . . . . . .  	L BYTE	0037	DATA
PARSE_FOR_SELECT . . . . . . . .  	L NEAR	0648	CODE_FAR
PARSE_HERE . . . . . . . . . . .  	L NEAR	0415	CODE_FAR
PARSE_NEXT_LINE  . . . . . . . .  	L NEAR	00AA	CODE_FAR
PARSE_NEXT_PARM  . . . . . . . .  	L NEAR	0485	CODE_FAR
PARSING_DONE . . . . . . . . . .  	L NEAR	052B	CODE_FAR
PAR_EXTEN  . . . . . . . . . . .  	L WORD	0038	DATA
PAR_NUM  . . . . . . . . . . . .  	L BYTE	003A	DATA
PAX_MAXP . . . . . . . . . . . .  	L BYTE	003F	DATA
PAX_MAX_K1 . . . . . . . . . . .  	L BYTE	0043	DATA
PAX_MAX_SW . . . . . . . . . . .  	L BYTE	0042	DATA
PAX_MINP . . . . . . . . . . . .  	L BYTE	003E	DATA
POS_ZERO . . . . . . . . . . . .  	L FAR 	0000		External
PRESENT_WITHOUT_PART . . . . . .  	NUMBER	0001	
PRESENT_WITH_PART  . . . . . . .  	NUMBER	0002	

RANGE_AND_STRING . . . . . . . .  	NUMBER	0003	
RANGE_ONLY . . . . . . . . . . .  	NUMBER	0001	
READ_FLAG  . . . . . . . . . . .  	L BYTE	0036	DATA
READ_FROM_HERE . . . . . . . . .  	N PROC	02D1	CODE_FAR	Length = 0055
READ_MORE_INFORMATION  . . . . .  	L NEAR	03B8	CODE_FAR
RELEASE_PRINTER_INFO_ROUTINE . .  	F PROC	05B1	CODE_FAR	Global	Length = 0024
RESET_EOF  . . . . . . . . . . .  	NUMBER	00FE	
RESET_FIRST_NAME . . . . . . . .  	NUMBER	00FB	
RESET_FIRST_PARSE  . . . . . . .  	NUMBER	00FE	
RESET_LINE_DONE  . . . . . . . .  	NUMBER	00FD	
RESET_LST_LINE . . . . . . . . .  	NUMBER	00FD	
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Symbols-7


RESTORE_INT_24 . . . . . . . . .  	L FAR 	0000		External
RESULT_FIELD . . . . . . . . . .  	L BYTE	0082	DATA
RESULT_P1  . . . . . . . . . . .  	L BYTE	007E	DATA
RETURN_WITH_ERROR  . . . . . . .  	L NEAR	0324	CODE_FAR

SCAN_FOR_EOLN  . . . . . . . . .  	N PROC	01DD	CODE_FAR	Length = 005C
SEARCH_LINE  . . . . . . . . . .  	N PROC	0129	CODE_FAR	Length = 006D
SEGMENT_SIZE . . . . . . . . . .  	L WORD	0005	DATA
SEG_LOC  . . . . . . . . . . . .  	L WORD	0001	DATA	Global
SELECT_CONTROL . . . . . . . . .  	L BYTE	008C	DATA
SELECT_PARMX . . . . . . . . . .  	L BYTE	0086	DATA
SELECT_STR . . . . . . . . . . .  	L BYTE	009C	DATA
SELECT_VALUE . . . . . . . . . .  	L BYTE	0095	DATA
SEL_FLG  . . . . . . . . . . . .  	L BYTE	0000	DATA	Global
SIMPLE_STRING  . . . . . . . . .  	NUMBER	2000	
SIZE_NAMES . . . . . . . . . . .  	NUMBER	002D		Global
SOURCE1  . . . . . . . . . . . .  	NUMBER	0000	
START_NEXT_LINE  . . . . . . . .  	L WORD	001E	DATA
STDERR . . . . . . . . . . . . .  	NUMBER	0002	
STDOUT . . . . . . . . . . . . .  	NUMBER	0001	
STRING_N . . . . . . . . . . . .  	L BYTE	0028	DATA	Length = 000A
SYNONYM_PTR  . . . . . . . . . .  	L WORD	0080	DATA
SYSPARSE . . . . . . . . . . . .  	L FAR 	0000		External
S_CP_DRIVER  . . . . . . . . . .  	V WORD	0000		External
S_CP_PREPARE . . . . . . . . . .  	V WORD	0000		External
S_GRAPH_PARM . . . . . . . . . .  	V WORD	0000		External
S_MODE_PARM  . . . . . . . . . .  	V WORD	0000		External

TABLE_ONE  . . . . . . . . . . .  	NUMBER	0001	
TABLE_TWO  . . . . . . . . . . .  	NUMBER	0002	
TRUE . . . . . . . . . . . . . .  	NUMBER	0001	

UPDATE_PARSE_PTR . . . . . . . .  	L NEAR	0518	CODE_FAR
USE_DEFAULT  . . . . . . . . . .  	NUMBER	0000	

VALUE_LIST_P1  . . . . . . . . .  	NEAR	004D	DATA
VAL_NUM  . . . . . . . . . . . .  	L BYTE	004D	DATA

W_CR_LF  . . . . . . . . . . . .  	L BYTE	0034	DATA
W_VALUE  . . . . . . . . . . . .  	L WORD	0026	DATA

$L1  . . . . . . . . . . . . . .  	L NEAR	000E	CODE_FAR
$L10 . . . . . . . . . . . . . .  	L NEAR	0078	CODE_FAR
$L100  . . . . . . . . . . . . .  	L NEAR	034F	CODE_FAR
$L106  . . . . . . . . . . . . .  	L NEAR	0381	CODE_FAR
$L107  . . . . . . . . . . . . .  	L NEAR	0376	CODE_FAR
$L113  . . . . . . . . . . . . .  	L NEAR	0399	CODE_FAR
$L117  . . . . . . . . . . . . .  	L NEAR	0396	CODE_FAR
$L120  . . . . . . . . . . . . .  	L NEAR	03B5	CODE_FAR
$L121  . . . . . . . . . . . . .  	L NEAR	03AA	CODE_FAR
$L127  . . . . . . . . . . . . .  	L NEAR	03D7	CODE_FAR
$L13 . . . . . . . . . . . . . .  	L NEAR	00B2	CODE_FAR
$L130  . . . . . . . . . . . . .  	L NEAR	0400	CODE_FAR
$L133  . . . . . . . . . . . . .  	L NEAR	0412	CODE_FAR
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Symbols-8


$L134  . . . . . . . . . . . . .  	L NEAR	040D	CODE_FAR
$L137  . . . . . . . . . . . . .  	L NEAR	04CA	CODE_FAR
$L138  . . . . . . . . . . . . .  	L NEAR	04C0	CODE_FAR
$L142  . . . . . . . . . . . . .  	L NEAR	0518	CODE_FAR
$L143  . . . . . . . . . . . . .  	L NEAR	04E9	CODE_FAR
$L144  . . . . . . . . . . . . .  	L NEAR	04D5	CODE_FAR
$L146  . . . . . . . . . . . . .  	L NEAR	04E3	CODE_FAR
$L149  . . . . . . . . . . . . .  	L NEAR	04F3	CODE_FAR
$L151  . . . . . . . . . . . . .  	L NEAR	0502	CODE_FAR
$L153  . . . . . . . . . . . . .  	L NEAR	0511	CODE_FAR
$L157  . . . . . . . . . . . . .  	L NEAR	0528	CODE_FAR
$L16 . . . . . . . . . . . . . .  	L NEAR	00DA	CODE_FAR
$L160  . . . . . . . . . . . . .  	L NEAR	053A	CODE_FAR
$L163  . . . . . . . . . . . . .  	L NEAR	0578	CODE_FAR
$L164  . . . . . . . . . . . . .  	L NEAR	058A	CODE_FAR
$L167  . . . . . . . . . . . . .  	L NEAR	059E	CODE_FAR
$L170  . . . . . . . . . . . . .  	L NEAR	05F6	CODE_FAR
$L173  . . . . . . . . . . . . .  	L NEAR	061C	CODE_FAR
$L176  . . . . . . . . . . . . .  	L NEAR	0642	CODE_FAR
$L179  . . . . . . . . . . . . .  	L NEAR	0650	CODE_FAR
$L182  . . . . . . . . . . . . .  	L NEAR	06D6	CODE_FAR
$L183  . . . . . . . . . . . . .  	L NEAR	06C1	CODE_FAR
$L185  . . . . . . . . . . . . .  	L NEAR	067C	CODE_FAR
$L189  . . . . . . . . . . . . .  	L NEAR	06D3	CODE_FAR
$L19 . . . . . . . . . . . . . .  	L NEAR	00C4	CODE_FAR
$L22 . . . . . . . . . . . . . .  	L NEAR	00F7	CODE_FAR
$L25 . . . . . . . . . . . . . .  	L NEAR	00EC	CODE_FAR
$L31 . . . . . . . . . . . . . .  	L NEAR	0109	CODE_FAR
$L34 . . . . . . . . . . . . . .  	L NEAR	011E	CODE_FAR
$L37 . . . . . . . . . . . . . .  	L NEAR	0171	CODE_FAR
$L4  . . . . . . . . . . . . . .  	L NEAR	001C	CODE_FAR
$L41 . . . . . . . . . . . . . .  	L NEAR	0145	CODE_FAR
$L44 . . . . . . . . . . . . . .  	L NEAR	0158	CODE_FAR
$L50 . . . . . . . . . . . . . .  	L NEAR	01B0	CODE_FAR
$L53 . . . . . . . . . . . . . .  	L NEAR	01C9	CODE_FAR
$L54 . . . . . . . . . . . . . .  	L NEAR	01B8	CODE_FAR
$L57 . . . . . . . . . . . . . .  	L NEAR	01E9	CODE_FAR
$L58 . . . . . . . . . . . . . .  	L NEAR	0230	CODE_FAR
$L60 . . . . . . . . . . . . . .  	L NEAR	0207	CODE_FAR
$L63 . . . . . . . . . . . . . .  	L NEAR	0200	CODE_FAR
$L66 . . . . . . . . . . . . . .  	L NEAR	022C	CODE_FAR
$L67 . . . . . . . . . . . . . .  	L NEAR	0224	CODE_FAR
$L68 . . . . . . . . . . . . . .  	L NEAR	0213	CODE_FAR
$L69 . . . . . . . . . . . . . .  	L NEAR	021F	CODE_FAR
$L7  . . . . . . . . . . . . . .  	L NEAR	0051	CODE_FAR
$L74 . . . . . . . . . . . . . .  	L NEAR	0237	CODE_FAR
$L77 . . . . . . . . . . . . . .  	L NEAR	0254	CODE_FAR
$L78 . . . . . . . . . . . . . .  	L NEAR	0252	CODE_FAR
$L81 . . . . . . . . . . . . . .  	L NEAR	027B	CODE_FAR
$L84 . . . . . . . . . . . . . .  	L NEAR	027D	CODE_FAR
$L85 . . . . . . . . . . . . . .  	L NEAR	029F	CODE_FAR
$L87 . . . . . . . . . . . . . .  	L NEAR	0297	CODE_FAR
$L93 . . . . . . . . . . . . . .  	L NEAR	02FA	CODE_FAR
$L96 . . . . . . . . . . . . . .  	L NEAR	0322	CODE_FAR
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:30
                                                             Symbols-9


$L99 . . . . . . . . . . . . . .  	L NEAR	035E	CODE_FAR
$LL1 . . . . . . . . . . . . . .  	NUMBER	0001	
$LL10  . . . . . . . . . . . . .  	NUMBER	000A	
$LL106 . . . . . . . . . . . . .  	NUMBER	006A	
$LL113 . . . . . . . . . . . . .  	NUMBER	0071	
$LL120 . . . . . . . . . . . . .  	NUMBER	0078	
$LL127 . . . . . . . . . . . . .  	NUMBER	007F	
$LL13  . . . . . . . . . . . . .  	NUMBER	000D	
$LL130 . . . . . . . . . . . . .  	NUMBER	0082	
$LL133 . . . . . . . . . . . . .  	NUMBER	0085	
$LL157 . . . . . . . . . . . . .  	NUMBER	009D	
$LL16  . . . . . . . . . . . . .  	NUMBER	0010	
$LL160 . . . . . . . . . . . . .  	NUMBER	00A0	
$LL167 . . . . . . . . . . . . .  	NUMBER	00A7	
$LL170 . . . . . . . . . . . . .  	NUMBER	00AA	
$LL173 . . . . . . . . . . . . .  	NUMBER	00AD	
$LL176 . . . . . . . . . . . . .  	NUMBER	00B0	
$LL179 . . . . . . . . . . . . .  	NUMBER	00B3	
$LL182 . . . . . . . . . . . . .  	NUMBER	00B6	
$LL185 . . . . . . . . . . . . .  	NUMBER	00B9	
$LL189 . . . . . . . . . . . . .  	NUMBER	00BD	
$LL19  . . . . . . . . . . . . .  	NUMBER	0013	
$LL22  . . . . . . . . . . . . .  	NUMBER	0016	
$LL25  . . . . . . . . . . . . .  	NUMBER	0019	
$LL31  . . . . . . . . . . . . .  	NUMBER	001F	
$LL34  . . . . . . . . . . . . .  	NUMBER	0022	
$LL37  . . . . . . . . . . . . .  	NUMBER	0025	
$LL4 . . . . . . . . . . . . . .  	NUMBER	0004	
$LL44  . . . . . . . . . . . . .  	NUMBER	002C	
$LL50  . . . . . . . . . . . . .  	NUMBER	0032	
$LL53  . . . . . . . . . . . . .  	NUMBER	0035	
$LL60  . . . . . . . . . . . . .  	NUMBER	003C	
$LL63  . . . . . . . . . . . . .  	NUMBER	003F	
$LL69  . . . . . . . . . . . . .  	NUMBER	0045	
$LL7 . . . . . . . . . . . . . .  	NUMBER	0007	
$LL74  . . . . . . . . . . . . .  	NUMBER	004A	
$LL77  . . . . . . . . . . . . .  	NUMBER	004D	
$LL81  . . . . . . . . . . . . .  	NUMBER	0051	
$LL87  . . . . . . . . . . . . .  	NUMBER	0057	
$LL93  . . . . . . . . . . . . .  	NUMBER	005D	
$LL96  . . . . . . . . . . . . .  	NUMBER	0060	
$LL99  . . . . . . . . . . . . .  	NUMBER	0063	
@CPU . . . . . . . . . . . . . .  	TEXT  0101h		
@FILENAME  . . . . . . . . . . .  	TEXT  prn_def		
@VERSION . . . . . . . . . . . .  	TEXT  510		

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

                                                             Symbols-10






   5498 Source  Lines
  28725 Total   Lines
    691 Symbols

  45118 + 90002 Bytes symbol space free

      0 Warning Errors
      0 Severe  Errors
