Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-1


					PAGE,	132			;AN000;
				TITLE	XCOPY	WITH FULL MEMORY USE ;AN000;
				
				; ##### R E A D   M E #####
				;
				; This file contains a copy of the XCOPY code.  The code has been
				; Revised (additions and many parts commented out) to conform to the
				; needs of SELECT.
				;
				; #########################
				
				;****************** START OF SPECIFICATIONS *****************************
				; MODULE NAME: XCOPY
				;
				; DESCRIPTIVE NAME: selectively copy groups of files, which can include
				;		    lower level subdirectories.
				;
				; FUNCTION:  The modules of XCOPY will be placed in the following order -
				;	     SSEG, DSEG(MAIN DATA, MAIN MSG), CSEG (MAIN + INIT),
				;	     DSEG_INIT(INIT DATA, INIT MSG)
				;
				;	     HEADER - informations needed about the file, subdirectory ...
				;		      Continue_Info -> 0 - a whole single file in this header
				;		      segment, or dir.
				;		      1 - Continuation of a small file.
				;		      2 - Continuation of a Big file
				;		      3 - Eof of continuation
				;	     Next_Ptr	   -> points to the next header segment
				;	     Before_Ptr    -> points to the old header segment
				;
				;	     By optionally using the Archive bit in the directory of each
				;	     file, XCOPY can be used as an alternative method of creating
				;	     backup files which can be accessed directly by DOS and its
				;	     applications without the need to "restore" the backup files.
				;
				;	     XCOPY is especially useful when several files are being copied
				;	     and there is a generous amount of RAM available, because XCOPY
				;	     will fill the memory with all the source files it can read in
				;	     before starting to create output files.  If the memory is not
				;	     enough to hold all the source, this cycle will be repeated until
				;	     the process is completed.	For single drive systems, this maximum
				;	     usage of the memory greatly reduces the amount of diskette
				;	     swapping that would be required by the usual COPY command.
				;
				; ENTRY POINT: MAIN
				;
				; INPUT: (DOS COMMAND LINE PARAMETERS)
				;
				;	      SOURCE OPERAND:			   TARGET OPERAND:
				;
				;	      [d:] [path] filename[.ext]	   [d:] [path] [filename[.ext]]
				;		or
				;	      [d:] path [filename[.ext]]
				;		or
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-2


				;	      d: [path] [filename[.ext]]
				;
				;
				;	      SWITCHES:
				;
				;	      /A /D /E /M /P /S /V /W
				;
				;The /A switch will copy only those files whose archive bit of the attribute is
				;set to one.  The attribute of the source file is not changed.	This option is
				;useful when making multiple backups when doing the non-final backup.
				;The archive bit is one when a file has be created or Revised since the last
				;time the bit was turned off.  XCOPY /M or BACKUP /M will turn this bit off.
				;The ATTRIB command can also be used to change the setting of the archive bit.
				;
				;The /D switch will copy only those files whose date is the same or later than
				;the date specified.  Depending on the country code you selected using the
				;COUNTRY command, the date is specified in the format corresponding to the
				;indicated country.
				;
				;The /E switch will create subdirectories on the target even if they end up
				;being empty after all copying is over.  If /E is not specified, empty
				;subdirectories are not created.
				;
				;The /M switch will copy only those files whose archive bit is set in its
				;attribute.  Unlike the /A switch, /M will cause the archive bit in the source
				;file to be turned off.  This allows XCOPY to be used in making a final backup.
				;The archive bit is one when a file has be created or Revised since the last
				;time the bit was turned off.  XCOPY /M or BACKUP /M will turn this bit off.
				;The ATTRIB command can also be used to change the setting of the archive bit.
				;
				;The /P switch will prompt the operator before copying each file.  In this
				;situation, each file is copied onto the target before reading in the next
				;file. The multi-file copy into a large memory buffer is not done.  The prompt
				;displays the complete filespec it proposes to copy and asks for (Y/N)
				;response, which is then read in from the standard input device.
				;
				;The /S switch will not only copy the files in the current source directory but
				;also those in all the subdirectories below the current one, with XCOPY
				;following the Tree of the subdirectories to access these files.  /S does not
				;create an empty subdirectory on the target (unless /E is also specified).
				;If the /S switch is not specified, XCOPY works only within the specified (or
				;current) subdirectory of the source.
				;
				;The /V switch will cause DOS to verify that the sectors written on the target
				;are recorded properly.  This option has been provided so you can verify that
				;critical data has been correctly recorded.  This option will cause XCOPY to
				;run more slowly, due to the additional overhead of verification.
				;
				;The /W switch will instruct XCOPY to pause before actually starting the
				;movement of data, thus permit the copying of diskettes that do not actually
				;have XCOPY available on them.	The diskette containing XCOPY can be mounted
				;first, the XCOPY command given with the /W option, then when the prompt
				;requesting permission to continue is given, that diskette can then be removed
				;and the source diskette mounted in its place, then the operator can press any
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-3


				;key to continue after the pause.  This feature is especially useful in a
				;non-hardfile system.
				;
				; EXIT-NORMAL:	ERRORLEVEL_0 - This is the normal completion code.
				;		ERRORLEVEL_2 - This is due to termination via Control-Break.
				;		ERRORLEVEL_4 - This is used to indicate an error condition.
				;
				;    There are many types of problems that are detected and result in this
				;    return code, such as:
				;
				;    write failure due to hard disk error
				;    disk full
				;    conflict between name of new subdirectory and existing filename
				;    access denied
				;    too many open files
				;    sharing violation
				;    lock violation
				;    general failure
				;    file not found
				;    path not found
				;    directory full
				;    invalid parms
				;    reserved file name as source
				;    insufficient memory
				;    incorrect DOS version
				;
				;
				; INTERNAL REFERENCES:
				;
				;    ROUTINES:
				;
				;
				;    DATA AREAS:
				;
				;
				; EXTERNAL REFERENCES:
				;
				;    ROUTINES:
				;
				;
				;    DATA AREAS:
				;
				;
				; NOTES: This module should be processed with the SALUT pre-processor
				;	 with the re-alignment not requested, as:
				;
				;		SALUT XCOPY,NUL,;
				;
				;	 To assemble these modules, the sequential
				;	 ordering of segments may be used.
				;
				;	 For LINK instructions:
				;		link  profile ..\lib
				;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-4


				; REVISION HISTORY: A000 Version 4.00: add PARSER, System Message Handler,
				;			 Remove the BELL char.,turn off APPEND during TREE
				;			 search,Extended Attribute processing, Uppercasing
				;			 and "Out Of Space" during write to standard out.
				;		    A001 PTM0011 XCOPY not handling path >63 characters.
				;			 CHK_MAX_LENGTH proc(XCPYINIT) is Revised to err if
				;			 >63 chrs.
				;		    A002 PTM0012 XCOPY unnecessarily accessing current drive.
				;			 ORG_S_T_DEF is Revised to ignore CHDIR if drive
				;			 is not TARGET or SOURCE.
				;		    A003 PTM0088 XCOPY (\) missing in 'FILE SHARING ERROR'.
				;			 This problem is fixed with incorporation of the
				;			 new message services.
				;		    A005 DCR0201 10/9/87 Incorperate new format for EXTENDED
				;			 ATTRIBUTES.
				;
				;
				;     Label: "DOS XCOPY Utility"
				;	     "Version 4.00 (C) Copyright 1988 Microsoft"
				;	     "Licensed Material - Program Property of Microsoft"
				;
				;****************** END OF SPECIFICATIONS *****************************
				
				CLEAR_SCREEN2	MACRO;AN000;
					MOV	CX,0			;;AN000;
					MOV	DX,184Fh		;;AN000;  scroll screen from (0,0) tO (24,79)
					MOV	AX,0600h		;;AN000;  AH = 6, Scroll Function
									;;  AL = 0, Clear scroll area
					MOV	BH,7			;;AN000;  video I/O interrupt
					INT	10H			;;AN000;
					MOV	DX,0			;;AN000; RKJ-set cursor posn to top right hand corner
					MOV	BH,0			;;AN000; RKJ
					MOV	AH,2			;;AN000; RKJ
					INT	10H			;;AN000; RKJ
					ENDM				;;AN000;
				;--------------------------------
				;   Include Files
				;--------------------------------
				INCLUDE STRUC.INC			;AN000; SAR
			     C	;;STRUC--Stucture Macro Library
			     C	;;Optimizing Version 2.30  03/31/87
			     C	
			     C	else	       ;else for if1
			     C	$Pop	$Temp
			     C	;;if	   $Temp ne $NoType
			     C	.xcref $NoConj,$And,$Or,$Short,$Near,$NearToShort,$AndOr,$Temp,$Temp2,$Dist
			     C	.xcref $NoType,$ConjIfType,$IfType,$ElseType,$WhileType,$ConjWhileType
			     C	.xcref $RepeatType,$ConjUntilType,$ForType,$ConjLeaveType,jncxz
			     C	.xcref $SelectType,$WhenType,$OtherwiseType,$ConjWhenType
			     C	.xcref jeq,jgt,jlt,jneq,jngt,jnlt,jnna,jnnae,jnnb,jnnbe,jnnc,jnncxz
			     C	.xcref jnne,jnng,jnnge,jnnl,jnnle,jnno,jnnp,jnns,jnnz,jnpe,jnpo,$BuildJump
			     C	.xcref $GetConj,$GetDist,$Poke,$Peek,$Push,$Pop,$Label,$CondJump,$CondLoop,$Test
			     C	.xcref $TopTest,$leave2,$until2,$StrucError,j,jn,jand,jnand,jnnand
			     C	.xcref jnnonzero,jnonzero,jnzero,jzero
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-5


			     C	.xcref $st,$sn,$OrFound,$LoopEnd,$LeaveFound,$DefDist
			     C	.xcref $LastLabel,$LastLabelOrg,$EquateLabel,$TraceLabel,$CondJump2,$ncxz
			     C	endif
			     C	
			     C	
 = 0000                      C	$st	= 0
 = 0000                      C	$sn	= 0
 = 0000                      C	$OrFound = 0
 = 0000                      C	$LoopEnd = 0
 = 0000                      C	$LeaveFound = 0
 =-0001                      C	$LastLabel = -1
 = 0000                      C	$LastLabelOrg = $
 = 0003                      C	$DefDist= $Short
			     C	$Push	%$NoType
				INCLUDE XMAINMSG.EQU			;AN000;message file
			     C	;*****************************************************************************
			     C	; Message equates
			     C	;*****************************************************************************
 = 000D                      C	CR		  equ	  13	       ;AN000;
 = 000A                      C	LF		  equ	  10	       ;AN000;
 = 0007                      C	BELL		  equ	   7	       ;AN000;
 = 0000                      C	END_OF_MESSAGE	  equ	   0	       ;AN000;
 = 0044                      C	ALPHA_D 	  equ	  'D'          ;AN000;
 = 0046                      C	ALPHA_F 	  equ	  'F'          ;AN000;
 = 0001                      C	PARM_SUBST_ONE	  EQU	  01H	       ;AN000;MSG PARAMETER SUBSTITUTION = 1
 = 0000                      C	MSG_SER_CLASS	  EQU	  00H	       ;AN000;MESSAGE SERVICE CLASS (RESERVED)
 = 0001                      C	EXT_ERR_CLASS	  EQU	  01H	       ;AN000;DOS EXTENDED ERROR CLASS
 = 0002                      C	PARSE_ERR_CLASS   EQU	  02H	       ;AN000;PARSE ERROR CLASS
 = 00FF                      C	UTILITY_MSG_CLASS EQU	  0FFH	       ;AN000;UTILITY MESSAGE CLASS
 = 0000                      C	NO_INPUT	  EQU	  00H	       ;AN000;NO INPUT CHARACTERS
 = 0001                      C	DOS_KEYB_INP	  EQU	  01H	       ;AN000;KEYBOARD INPUT EXPECTED
			     C	;******************************************************************************
			     C	;		XCOPY (MAIN) messages
			     C	;*****************************************************************************
			     C	; ERROR MESSAGES DEFINITION
			     C	;
 = 000D                      C	MSG_ACCESS_DENIED	EQU	13	;AN000;
 = 000E                      C	MSG_TOO_MANY_OPEN	EQU	14	;AN000;
 = 000F                      C	MSG_GENERAL_FAIL	EQU	15	;AN000;
 = 0010                      C	MSG_SHARING_VIOL	EQU	16	;AN000;
 = 0011                      C	MSG_LOCK_VIOL		EQU	17	;AN000;
 = 0012                      C	MSG_PATH_NOT		EQU	18	;AN000;
 = 0013                      C	MSG_DISK_FULL		EQU	19	;AN000;
 = 0014                      C	MSG_COPY_ITSELF 	EQU	20	;AN000;
 = 000A                      C	MSG_UNABLE_CREATE	EQU	10	;AN000;
 = 0016                      C	MSG_RES_T_NAME		EQU	22	;AN000;
 = 0017                      C	MSG_FILE_NOT_ERR	EQU	23	;AN000;
 = 0018                      C	MSG_FILE_CREATE_ERR	EQU	24	;AN000;
 = 0019                      C	MSG_READING_SOURCE	EQU	25	;AN000;
 = 001A                      C	MSG_CR_LF_STR		EQU	26	;AN000;
 = 001B                      C	MSG_FILES_COPIED	EQU	27	;AN000;
 = 001C                      C	MSG_FILE_NOT_FOUND	EQU	28	;AN000;
 = 001E                      C	S_PATH_FILE0		EQU	30	;AN000;
 = 001F                      C	S_PATH_FILE1		EQU	31	;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-6


 = 0020                      C	DISPLAY_S_PATH		EQU	32	;AN000;
 = 0021                      C	P_S_PATH_FILE0		EQU	33	;AN000;
 = 0022                      C	P_S_PATH_FILE1		EQU	34	;AN000;
			     C	;******************** END OF XCPYMAIN.MSG **************************************
			     C	
				INCLUDE DOS.EQU        ;AN000;
			     C	;
			     C	;******************************************************************************
			     C	; DOS Interrupts
			     C	;
			     C	; REVISION HISTORY:
			     C	;
			     C	;	   PTM P00 - WAIT & LOCK to WAITP & LOCKF for MASM errors. DRM 4/23/87
			     C	;
			     C	;		    A005 DCR0201 10/9/87 Incorperate new format for EXTENDED
			     C	;			 ATTRIBUTES.
			     C	;
			     C	;******************************************************************************
			     C	;
			     C	
 = 0020                      C	Terminate		equ	20h	;AN000;
 = 0021                      C	DOS_Function		equ	21h	;AN000;
 = 0022                      C	Terminate_Address	equ	22h	;AN000;
 = 0023                      C	CNTRL_BREAK		equ	23h	;AN000;
 = 0024                      C	Critical_Error		equ	24h	;AN000;
 = 0025                      C	Disk_Read		equ	25h	;AN000;
 = 0026                      C	Disk_Write		equ	26h	;AN000;
 = 0027                      C	Terminate_Stay_Resident equ	27h	;AN000;
 = 002F                      C	Printer 		equ	2Fh	;AN000;
 = B700                      C	CHK_APPEND		EQU	0B700H	;AN000; CHECK IF APPEND ACTIVE INT 2FH
 = B706                      C	GET_APPEND		EQU	0B706H	;AN000; Read /X status with INT 2FH
			     C						;   BX = 0 if /X is not active
			     C						;   BX = 1 if /X is active
 = B707                      C	SET_APPEND		EQU    0B707H	;AN000; Set /X status with INT 2FH
 = 6C00                      C	EXT_OPEN		EQU    6C00H	;AN000; Extended Open function code
 = 0112                      C	  CREATE_FLAG		EQU    0112H	;AN005;FUNCTION CONTROL
 = 0000                      C	  CREATE_ATTR		EQU    0	;AN000;SEARCH/CREATE ATTRIBUTE
 = 0011                      C	  CREATE_MODE		EQU    0011H	;AN000;CREATE MODE
 = 0101                      C	  OPN_FLAG		EQU    0101H	;AN000;OPEN FUNCTION CONTROL
 = 0000                      C	  OPN_ATTR		EQU    0	;AN000;OPEN ATTRIBUTE
 = 0002                      C	  OPN_MODE		EQU    0002H	;AN000;OPEN MODE
 =-0001                      C	  NUL_LIST		EQU    -1	;AN005;JUST TO OPEN
			     C	
 = 5702                      C	GET_ATTRIB		EQU    05702H	;AN000; Get ext. attribute by handle
 = 5703                      C	QUY_ATTRIB		EQU    05703H	;AN000; QUERY EXT. ATTRIBUTES BY HANDLE
 = 0000                      C	  INT_ORDINAL		EQU    0	;AN000;ATTRIBUTE LIST ORDINAL = 0
 =-0001                      C	  ALL_ATTR		EQU    -1	;AN005;TO SELECT ALL THE ATTRIBUTES
			     C	;
			     C	;******************************************************************************
			     C	; DOS Function Calls
			     C	;******************************************************************************
			     C	;
			     C	
 = 0000                      C	Program_Terminate	equ	00h	 ;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-7


 = 0001                      C	Keyboard_Input		equ	01h	 ;AN000;
 = 0002                      C	Display_Output		equ	02h	 ;AN000;
 = 0003                      C	Auxiliary_Input 	equ	03h	 ;AN000;
 = 0004                      C	Auxiliary_Output	equ	04h	 ;AN000;
 = 0005                      C	Printer_Output		equ	05h	 ;AN000;
 = 0006                      C	Direct_Console_IO	equ	06h	 ;AN000;
 = 0007                      C	Direct_Input_No_Echo	equ	07h	 ;AN000;
 = 0008                      C	Console_Input_No_Echo	equ	08h	 ;AN000;
 = 0009                      C	Print_String		equ	09h	 ;AN000;
 = 000A                      C	Buffered_Keyboard_Input equ	0Ah	 ;AN000;
 = 000B                      C	Check_Std_Input_Status	equ	0Bh	 ;AN000;
 = 000C                      C	Clear_Keyboard_Buffer	equ	0Ch	 ;AN000;
 = 000D                      C	Disk_Reset		equ	0Dh	 ;AN000;
 = 000E                      C	Select_Disk		equ	0Eh	 ;AN000;
 = 000F                      C	FCB_Open		equ	0Fh	 ;AN000;
 = 0010                      C	FCB_Close		equ	10h	 ;AN000;
 = 0011                      C	Search_First		equ	11h	 ;AN000;
 = 0012                      C	Search_Next		equ	12h	 ;AN000;
 = 0013                      C	FCB_Delete		equ	13h	 ;AN000;
 = 0014                      C	Sequential_Read 	equ	14h	 ;AN000;
 = 0015                      C	Sequential_Write	equ	15h	 ;AN000;
 = 0016                      C	FCB_Create		equ	16h	 ;AN000;
 = 0017                      C	FCB_Rename		equ	17h	 ;AN000;
 = 0019                      C	Current_Disk		equ	19h	 ;AN000;
 = 001A                      C	Set_DTA 		equ	1Ah	 ;AN000;
 = 001B                      C	Allocation_Info 	equ	1Bh	 ;AN000;
 = 001C                      C	Allocation_Info_Device	equ	1Ch	 ;AN000;
 = 0021                      C	Random_Read		equ	21h	 ;AN000;
 = 0022                      C	Random_Write		equ	22h	 ;AN000;
 = 0023                      C	File_Size		equ	23h	 ;AN000;
 = 0024                      C	Set_Relative_Record	equ	24h	 ;AN000;
 = 0025                      C	Set_Interrupt_Vector	equ	25h	 ;AN000;
 = 0026                      C	Create_New_PSP		equ	26h	 ;AN000;
 = 0027                      C	Random_Block_Read	equ	27h	 ;AN000;
 = 0028                      C	Random_Block_Write	equ	28h	 ;AN000;
 = 0029                      C	Parse_Filename		equ	29h	 ;AN000;
 = 002A                      C	Get_Date		equ	2Ah	 ;AN000;
 = 002B                      C	Set_Date		equ	2Bh	 ;AN000;
 = 002C                      C	Get_Time		equ	2Ch	 ;AN000;
 = 002D                      C	Set_Time		equ	2Dh	 ;AN000;
 = 002E                      C	Verify			equ	2Eh	 ;AN000;
 = 0002                      C	  Verify_Off		equ	02h	 ;AN000;
 = 0001                      C	  Verify_On		equ	01h	 ;AN000;
 = 2E01                      C	Set_Verify_On		equ	2E01h	 ;AN000;
 = 002F                      C	Get_DTA 		equ	2Fh	 ;AN000;
 = 0030                      C	DOS_Version		equ	30h	 ;AN000;
 = 0031                      C	Terminate_Resident	equ	31h	 ;AN000;
 = 0035                      C	Get_Interrupt_Vector	equ	35h	 ;AN000;
 = 0036                      C	Get_Disk_Free_Space	equ	36h	 ;AN000;
 = 0038                      C	Country_Code		equ	38h	 ;AN000;
 = 0039                      C	Mkdir			equ	39h	 ;AN000;
 = 003A                      C	Rmdir			equ	3Ah	 ;AN000;
 = 003B                      C	Chdir			equ	3Bh	 ;AN000;
 = 003C                      C	Create			equ	3Ch	 ;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-8


 = 003D                      C	Open			equ	3Dh	 ;AN000;
 = 0000                      C	  Read_Only		equ	00h	 ;AN000;
 = 0001                      C	  Write_Only		equ	01h	 ;AN000;
 = 0002                      C	  Read_Write		equ	02h	 ;AN000;
 = 0010                      C	  Read_Only_Exclusive	equ	10h	 ;AN000;
 = 0011                      C	  Write_Only_Exclusive	equ	11h	 ;AN000;
 = 0012                      C	  Read_Write_Exclusive	equ	12h	 ;AN000;
 = 0020                      C	  Read_Only_Deny_Write	equ	20h	 ;AN000;
 = 0021                      C	  Write_Only_Deny_Write equ	21h	 ;AN000;
 = 0022                      C	  Read_Write_Deny_Write equ	22h	 ;AN000;
 = 0030                      C	  Read_Only_Deny_Read	equ	30h	 ;AN000;
 = 0031                      C	  Write_Only_Deny_Read	equ	31h	 ;AN000;
 = 0032                      C	  Read_Write_Deny_Read	equ	32h	 ;AN000;
 = 0040                      C	  Read_Only_Deny_None	equ	40h	 ;AN000;
 = 0041                      C	  Write_Only_Deny_None	equ	41h	 ;AN000;
 = 0042                      C	  Read_Write_Deny_None	equ	42h	 ;AN000;
 = 003E                      C	Close			equ	3Eh	 ;AN000;
 = 003F                      C	Read			equ	3Fh	 ;AN000;
 = 0040                      C	Write			equ	40h	 ;AN000;
 = 0041                      C	Delete			equ	41h	 ;AN000;
 = 0042                      C	Lseek			equ	42h	 ;AN000;
 = 0000                      C	 Lseek_Offset		equ	00h	 ;AN000;
 = 0001                      C	 Lseek_Plus_Offset	equ	01h	 ;AN000;
 = 0002                      C	 Lseek_End_Offset	equ	02h	 ;AN000;
 = 0043                      C	Chmod			equ	43h	 ;AN000;
 = 0044                      C	IOCTL			equ	44h	 ;AN000;
 = 0000                      C	  Get_Device_Info	equ	00h	 ;AN000;
 = 0001                      C	  Set_Device_Info	equ	01h	 ;AN000;
 = 0002                      C	  Read_Channel		equ	02h	 ;AN000;
 = 0003                      C	  Write_Channel 	equ	03h	 ;AN000;
 = 0004                      C	  Read_Drive_Channel	equ	04h	 ;AN000;
 = 0005                      C	  Write_Drive_Channel	equ	05h	 ;AN000;
 = 0006                      C	  Get_Input_Status	equ	06h	 ;AN000;
 = 0007                      C	  Get_Output_Status	equ	07h	 ;AN000;
 = 0008                      C	  Is_Removable		equ	08h	 ;AN000;
 = 0009                      C	  Is_Block_Redirected	equ	09h	 ;AN000;
 = 000A                      C	  Is_Handle_Redirected	equ	0Ah	 ;AN000;
 = 000B                      C	  Set_Retry_Count	equ	0Bh	 ;AN000;
 = 0045                      C	Dup_Handle		equ	45h	 ;AN000;
 = 0046                      C	Force_Dup_Handle	equ	46h	 ;AN000;
 = 0047                      C	Get_Current_Directory	equ	47h	 ;AN000;
 = 0049                      C	Free_Memory		equ	49h	 ;AN000;
 = 004A                      C	Setblock		equ	4Ah	 ;AN000;
 = 004B                      C	Exec			equ	4Bh	 ;AN000;
 = 004C                      C	Exit			equ	4Ch	 ;AN000;
 = 004D                      C	Waitp			equ	4Dh	 ;AN000;
 = 004E                      C	Find_First		equ	4Eh	 ;AN000;
 = 0000                      C	  norm_attr		equ	00h	 ;AN000;
 = 0001                      C	  incl_read_attr	equ	01h	 ;AN000;
 = 0002                      C	  incl_h_attr		equ	02h	 ;AN000;
 = 0006                      C	  incl_h_s_attr 	equ	06h	 ;AN000;
 = 0016                      C	  incl_h_s_dir_attr	equ	16h	 ;AN000;
 = 004F                      C	Find_Next		equ	4Fh	 ;AN000;
 = 0054                      C	Get_Verify_Setting	equ	54h	 ;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-9


 = 0056                      C	Rename			equ	56h	 ;AN000;
 = 0057                      C	File_Date_Time		equ	57h	 ;AN000;
 = 0000                      C	  Get_File_Time 	equ	00h	 ;AN000;
 = 0001                      C	  Set_File_Time 	equ	01h	 ;AN000;
 = 0059                      C	Get_Extended_Error	equ	59h	 ;AN000;
 = 005A                      C	Create_Temp		equ	5Ah	 ;AN000;
 = 005B                      C	Create_New		equ	5Bh	 ;AN000;
 = 005C                      C	File_Access		equ	5Ch	 ;AN000;
 = 0000                      C	  Lockf 		equ	00h	 ;AN000;
 = 0001                      C	  Unlock		equ	01h	 ;AN000;
 = 0062                      C	Get_PSP 		equ	62h	 ;AN000;
 = 6521                      C	Upper_Case_String	equ	6521h	 ;AN000;GET EXTENDED COUNTRY INFORMATION
			     C	;
			     C	;******************************************************************************
			     C	; DOS File Handles
			     C	;******************************************************************************
			     C	;
			     C	
 = 0000                      C	STDIN			equ	00h	;AN000;
 = 0001                      C	STDOUT			equ	01h	;AN000;
 = 0002                      C	STDERR			equ	02h	;AN000;
 = 0003                      C	STDAUX			equ	03h	;AN000;
 = 0004                      C	STDPRN			equ	04h	;AN000;
			     C	
			     C	
			     C	;
			     C	;******************************************************************************
			     C	; File's attributes in a Directory entry
			     C	;******************************************************************************
			     C	;
 = 0001                      C	read_only_file		equ	01h	;AN000;
 = 0002                      C	hidden_file		equ	02h	;AN000;
 = 0004                      C	system_file		equ	04h	;AN000;
 = 0008                      C	has_volume_label	equ	08h	;AN000;
 = 0010                      C	is_subdirectory 	equ	10h	;AN000;
 = 0020                      C	archive_on		equ	20h	;AN000;
			     C	
			     C	;
			     C	;******************************************************************************
			     C	; Return Codes
			     C	;******************************************************************************
			     C	;
			     C	
 = 0000                      C	Errorlevel_0		equ	0	;AN000;
 = 0001                      C	Errorlevel_1		equ	1	;AN000;
 = 0002                      C	Errorlevel_2		equ	2	;AN000;
 = 0003                      C	Errorlevel_3		equ	3	;AN000;
 = 0004                      C	Errorlevel_4		equ	4	;AN000;
 = 0005                      C	Errorlevel_5		equ	5	;AN000;
 = 0006                      C	Errorlevel_6		equ	6	;AN000;
 = 0007                      C	Errorlevel_7		equ	7	;AN000;
 = 0008                      C	Errorlevel_8		equ	8	;AN000;
			     C	
			     C	;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-10


			     C	;******************************************************************************
			     C	; Extended Error Codes
			     C	;******************************************************************************
			     C	;
			     C	
 = 0000                      C	Error_No_Error		      equ     00	;AN000;
 = 0001                      C	Error_Invalid_Function	      equ     01	;AN000;
 = 0002                      C	Error_File_Not_Found	      equ     02	;AN000;
 = 0003                      C	Error_Path_Not_Found	      equ     03	;AN000;
 = 0004                      C	Error_No_Handles_Left	      equ     04	;AN000;
 = 0005                      C	Error_Access_Denied	      equ     05	;AN000;
 = 0006                      C	Error_Invalid_Handle	      equ     06	;AN000;
 = 0007                      C	Error_Memory_Blocks_Bad       equ     07	;AN000;
 = 0008                      C	Error_Insufficient_Memory     equ     08	;AN000;
 = 0009                      C	Error_Inv_Address	      equ     09	;AN000;
 = 000A                      C	Error_Inv_Environment	      equ     10	;AN000;
 = 000B                      C	Error_Inv_Format	      equ     11	;AN000;
 = 000C                      C	Error_Inv_Access_Code	      equ     12	;AN000;
 = 000D                      C	Error_Inv_Data		      equ     13	;AN000;
 = 000F                      C	Error_Inv_Drive 	      equ     15	;AN000;
 = 0010                      C	Error_Rmdir_Current_Dir       equ     16	;AN000;
 = 0011                      C	Error_Not_Same_Device	      equ     17	;AN000;
 = 0012                      C	Error_No_More_Files	      equ     18	;AN000;
 = 0013                      C	Error_Write_Protect	      equ     19	;AN000;
 = 0014                      C	Error_Unknown_Unit	      equ     20	;AN000;
 = 0015                      C	Error_Drive_Not_Ready	      equ     21	;AN000;
 = 0016                      C	Error_Unknown_Command	      equ     22	;AN000;
 = 0017                      C	Error_Data_Error	      equ     23	;AN000;
 = 0018                      C	Error_Bad_Request_Len	      equ     24	;AN000;
 = 0019                      C	Error_Seek_Error	      equ     25	;AN000;
 = 001A                      C	Error_Unknown_Media_Type      equ     26	;AN000;
 = 001B                      C	Error_Sector_Not_Found	      equ     27	;AN000;
 = 001C                      C	Error_Out_Of_Paper	      equ     28	;AN000;
 = 001D                      C	Error_Write_Fault	      equ     29	;AN000;
 = 001E                      C	Error_Read_Fault	      equ     30	;AN000;
 = 001F                      C	Error_Gerneral_Failure	      equ     31	;AN000;
 = 0020                      C	Error_Sharing_Violation       equ     32	;AN000;
 = 0021                      C	Error_Lock_Violation	      equ     33	;AN000;
 = 0022                      C	Error_Inv_Disk_Change	      equ     34	;AN000;
 = 0023                      C	Error_FCB_Unavailable	      equ     35	;AN000;
 = 0050                      C	Error_File_Exists	      equ     80	;AN000;
 = 0052                      C	Error_Cannot_Make	      equ     82	;AN000;
 = 0053                      C	Error_Fail_On_Int24	      equ     83	;AN000;
			     C	
			     C	;
			     C	;******************************************************************************
			     C	; Extended Error Classes
			     C	;******************************************************************************
			     C	;
			     C	
 = 0001                      C	Out_Of_Resource 	equ	1	;AN000;
 = 0002                      C	Temporary		equ	2	;AN000;
 = 0003                      C	Authorization		equ	3	;AN000;
 = 0004                      C	Internal		equ	4	;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-11


 = 0005                      C	Hardware_Failure	equ	5	;AN000;
 = 0006                      C	System_Failure		equ	6	;AN000;
 = 0007                      C	Program_Error		equ	7	;AN000;
 = 0008                      C	Not_Found		equ	8	;AN000;
 = 0009                      C	Bad_Format		equ	9	;AN000;
 = 000A                      C	Locked			equ	10	;AN000;
 = 000B                      C	Media			equ	11	;AN000;
 = 000C                      C	Already_Exists		equ	12	;AN000;
 = 000D                      C	Unknown 		equ	13	;AN000;
			     C	
			     C	;
			     C	;*****************************************************************************
			     C	; Extended Error Actions
			     C	;*****************************************************************************
			     C	;
			     C	
 = 0001                      C	Retry			equ	1	;AN000;
 = 0002                      C	Delay_Retry		equ	2	;AN000;
 = 0003                      C	User			equ	3	;AN000;
 = 0004                      C	Abort			equ	4	;AN000;
 = 0005                      C	Immediate_Exit		equ	5	;AN000;
 = 0006                      C	Ignore			equ	6	;AN000;
 = 0007                      C	Retry_After_User	equ	7	;AN000;
			     C	
			     C	;
			     C	;******************************************************************************
			     C	; Extended Error Locus
			     C	;******************************************************************************
			     C	;
			     C	
 = 0001                      C	Non_Specific		equ	1	;AN000;
 = 0002                      C	Block_Device		equ	2	;AN000;
 = 0004                      C	Serial_Device		equ	4	;AN000;
 = 0005                      C	Memory			equ	5	;AN000;
			     C	
			     C	;
			     C	;******************************************************************************
			     C	; Internal Program Initialization Errors
			     C	;******************************************************************************
			     C	;
			     C	
 = 0001                      C	Init_Err_DOS_Ver_1	equ	1	;AN000;Bad DOS version prior to 2.0
 = 0002                      C	Init_Err_DOS_Ver_2	equ	2	;AN000;Bad DOS version 2.0 or above
 = 0003                      C	Init_Err_Inv_Drive	equ	3	;AN000;Invalid drive specification
 = 0004                      C	Init_Err_Inv_Parm	equ	4	;AN000;Invalid parameter
 = 0005                      C	Init_Err_Inv_Num_Parm	equ	5	;AN000;Invalid number of parameters
 = 0006                      C	Init_Err_Inv_Path	equ	6	;AN000;Invalid path
 = 0007                      C	Init_Err_Insuff_Mem	equ	7	;AN000;Insufficient memory
 = 0008                      C	Init_Err_Inv_Date	equ	8	;AN000;Invalid date
 = 0009                      C	Init_Err_Inv_Time	equ	9	;AN000;Invalid time
 = 000A                      C	Init_Err_Inv_Device	equ	10	;AN000;Invalid device name
 = 000B                      C	Init_Err_Ill_Device	equ	11	;AN000;Illegal device name
 = 000C                      C	Init_Err_Inv_Filename	equ	12	;AN000;Invalid filename
			     C	
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-12


			     C	;
			     C	;******************************************************************************
			     C	; FCB Structure
			     C	;******************************************************************************
			     C	;
			     C	
			     C	FCB		STRUC				;AN000;
 0000  00                    C	Drive_Number		db	0		;AN000;
 0001  0008[                 C	Filename_FCB		db	8 dup(0)	;AN000;
	   00                C	
			 ]   C	
			     C	
 0009  0003[                 C	Extension		db	3 dup(0)	;AN000;
	   00                C	
			 ]   C	
			     C	
 000C  0000                  C	Current_Block		dw	0		;AN000;
 000E  0000                  C	Record_Size		dw	0		;AN000;
 0010  0000                  C	File_Size_Low_FCB	dw	0		;AN000;
 0012  0000                  C	File_Size_High_FCB	dw	0		;AN000;
 0014  0000                  C	File_Date_Time_FCB	dw	0		;AN000;
 0016  000A[                 C	Reserved_FCB		db	10 dup(0)	;AN000;
	   00                C	
			 ]   C	
			     C	
 0020  00                    C	Current_Record		db	0		;AN000;
 0021  0000                  C	Relative_Record_Low	dw	0		;AN000;
 0023  0000                  C	Relative_Record_High	dw	0		;AN000;
 0025                        C	FCB		ENDS				;AN000;
			     C	
			     C	
			     C	;
			     C	;******************************************************************************
			     C	; Find First/Next DTA area
			     C	;******************************************************************************
			     C	;
			     C	
			     C	Find_DTA	STRUC				;AN000;
 0000  0015[                 C	DTA_Reserved		    db	    21 dup(0)	;AN000;
	   00                C	
			 ]   C	
			     C	
 0015  00                    C	DTA_Attribute		    db	    0		;AN000;
 0016  0000                  C	DTA_File_Time		    dw	    0		;AN000;
 0018  0000                  C	DTA_File_Date		    dw	    0		;AN000;
 001A  0000                  C	DTA_File_Size_Low	    dw	    0		;AN000;
 001C  0000                  C	DTA_File_Size_High	    dw	    0		;AN000;
 001E  000D[                 C	DTA_Filename		    db	    13 dup(0)	;AN000;
	   00                C	
			 ]   C	
			     C	
 002B                        C	Find_DTA	ENDS				;AN000;
			     C	
			     C	
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-13


			     C	
			     C	
				INCLUDE XCOPY.EQU      ;AN000;
			     C	;
			     C	;
			     C	;REVISION HISTORY
			     C	;
			     C	;		    A005 DCR0201 10/9/87 Incorperate new format for EXTENDED
			     C	;			 ATTRIBUTES.
			     C	;
			     C	;
			     C	;Equates used for flags
			     C	;
			     C	;*** MY_FLAG ****
 = 0001                      C		find_first_flag    equ	   01h	   ;AN000;set MY_FLAG by "OR"
 = 0002                      C		findfile_flag	   equ	   02h	   ;AN000;
 = 0004                      C		no_more_file	   equ	   04h	   ;AN000;
 = 0008                      C		single_copy_flag   equ	   08h	   ;AN000;single copy instead of multi copy
 = 0010                      C		visit_parent_flag  equ	   10h	   ;AN000;visit parent node
 = 0020                      C		found_flag	   equ	   20h	   ;AN000;found flag - for find subdir
 = 0040                      C		missing_link_flag  equ	   40h	   ;AN000;
 = 0080                      C		is_source_flag	   equ	   80h	   ;AN000;if set, dealing with source
 = 00FE                      C		reset_find_first   equ	  0FEh	   ;AN000;reset by AND
 = 00FD                      C		reset_findfile	   equ	  0FDh	   ;AN000;
 = 00FB                      C		reset_no_more	   equ	  0FBh	   ;AN000;
 = 00EF                      C		reset_visit_parent equ	  0EFh	   ;AN000;
 = 00DF                      C		reset_found	   equ	  0DFh	   ;AN000;
 = 00BF                      C		reset_missing_link equ	  0BFh	   ;AN000;
 = 007F                      C		reset_is_source    equ	  07Fh	   ;AN000;
			     C	
			     C	;*** FILE_FLAG ***
 = 0001                      C		cont_flag equ  01h		   ;AN000;
 = 0002                      C		eof_flag equ  02h		   ;AN000;
 = 0004                      C		big_file_flag equ  04h		   ;AN000;
 = 0008                      C		file_bigger_flag equ  08h	   ;AN000;
 = 0010                      C		created_flag equ  10h		   ;AN000;
 = 00FE                      C		reset_cont equ	0FEh		   ;AN000;
 = 00FD                      C		reset_eof equ  0FDh		   ;AN000;
 = 00FB                      C		reset_big_file equ  0FBh	   ;AN000;
 = 00F7                      C		reset_file_bigger equ  0F7h	   ;AN000;
 = 00EF                      C		reset_created equ  0EFh 	   ;AN000;
 = 00F0                      C		reset_readfile equ  0F0h	;AN000;reset FILE_FLAG for read a file
			     C	
			     C	;*** COPY_STATUS ***
 = 0001                      C		open_error_flag    equ	   01h	;AN000;
 = 0002                      C		read_error_flag    equ	   02h	;AN000;
 = 0004                      C		create_error_flag  equ	   04h	;AN000;
 = 0008                      C		write_error_flag   equ	   08h	;AN000;
 = 0010                      C		mkdir_error_flag   equ	   10h	;AN000;
 = 0020                      C		chdir_error_flag   equ	   20h	;AN000;
 = 0040                      C		maybe_itself_flag  equ	   40h	;AN000;source, target starting drv, directory is same.
 = 0080                      C		disk_full_flag	   equ	   80h	;AN000;
 = 00FE                      C		reset_open_error   equ	  0FEh	;AN000;
 = 00FD                      C		reset_read_error   equ	  0FDh	;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-14


 = 00FB                      C		reset_create_error equ	  0FBh	;AN000;
 = 00F7                      C		reset_write_error  equ	  0F7h	;AN000;
 = 00EF                      C		reset_close_error  equ	  0EFh	;AN000;
 = 00DF                      C		reset_chdir_error  equ	  0DFh	;AN000;
			     C	
			     C	
			     C	;*** ACTION_FLAG ***
			     C	
 = 0001                      C		reading_flag	   equ	  01h	;AN000;display "Reading source files..."
 = 00FE                      C		reset_reading	   equ	  0FEh	;AN000;do not display.
			     C	
			     C	;*** SYS_FLAG ***
			     C	
 = 0001                      C		one_disk_copy_flag   equ   01h	;AN000;
 = 0002                      C		default_drv_set_flag equ   02h	;AN000;default drive has been changed by this program
 = 0004                      C		default_s_dir_flag   equ   04h	;AN000;source current directory saved.
 = 0008                      C		default_t_dir_flag   equ   08h	;AN000;target current directory saved.
 = 0010                      C		removalble_drv_flag  equ   10h	;AN000;
 = 0020                      C		sharing_source_flag  equ   20h	;AN000;source shared
 = 0040                      C		sharing_target_flag  equ   40h	;AN000;
 = 0080                      C		turn_verify_off_flag equ   80h	;AN000;turn the verify off when exit to dos.
 = 00FB                      C		reset_default_s_dir  equ  0FBh	;AN000;reset default_s_dir_flag
			     C	
			     C	;*** OPTION_FLAG ***
			     C	
 = 0001                      C		slash_a 	     equ   01h	 ;AN000;soft archieve ?
 = 0002                      C		slash_d 	     equ   02h	 ;AN000;date?
 = 0004                      C		slash_e 	     equ   04h	 ;AN000;create empty dir?
 = 0008                      C		slash_m 	     equ   08h	 ;AN000;hard archieve ? (turn off source archieve bit)
 = 0010                      C		slash_p 	     equ   10h	 ;AN000;prompt?
 = 0020                      C		slash_s 	     equ   20h	 ;AN000;walk the tree?
 = 0040                      C		slash_v 	     equ   40h	 ;AN000;verify on?
 = 0080                      C		slash_w 	     equ   80h	 ;AN000;show "Press any key to begin copying" msg)
 = 00FE                      C		reset_slash_a	     equ  0FEh	 ;AN000;turn off soft archieve
 = 00F7                      C		reset_slash_m	     equ  0F7h	 ;AN000;turn off hard archieve
			     C	
			     C	;*** PARM_FLAG ***
			     C	
 = 0001                      C		first_parm_flag equ	01h	;AN000;first parm entered in input parm
 = 0002                      C		second_parm_flag equ	 02h	;AN000;second parm entered.
 = 0004                      C		end_of_parm_flag equ	 04h	;AN000;end of parm reached
 = 0008                      C		copy_onto_itself_flag equ     08h ;AN000;copy onto itself flag
 = 0010                      C		cyclic_flag equ     10h 	;AN000;cyclic copy flag
 = 0020                      C		inv_time_flag equ     20h	;AN000;invalid time
 = 0040                      C		inv_date_flag equ     40h	;AN000;invalid date
 = 0080                      C		init_error_flag equ    80h	;AN000;critical initialization error. Should abort.
			     C	
			     C	;*** PARM1_FLAG ***
			     C	
 = 0001                      C		inv_s_path_flag equ	01h	;AN000;invalid source path (path not found)
 = 0002                      C		inv_t_path_flag equ	02h	;AN000;invalid target path
 = 0004                      C		s_file_flag equ     04h 	;AN000;source filename entered
 = 0008                      C		t_file_flag equ     08h 	;AN000;target filename entered
			     C	
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-15


			     C	;general equates
			     C	
 = 003A                      C	COLON			EQU ":"         ;AN000;FOLLOWS DRV LTR IN FULL FILESPEC
 = 0000                      C	NUL			EQU 0		;AN000;DELIMITER FOR ASCIIZ STRINGS
 = 0020                      C	SPACE			EQU " "         ;AN000;TEST FOR DBCS IN 'F D ' MESSAGE
 = 0004                      C	PARAGRAPH		EQU 4		;AN005;TO CONVERT TO/FROM BYTES/PARA.
 = 000F                      C	PARA_BOUND		EQU 15		;AN005;BYTES TO ADD FOR PARA. CALCULAT
 = 0002                      C	FIXD_HD_SIZ		EQU 2		;AN005;PARA COUNT MINIMUM FOR FILE HDR
 = 0001                      C	SYSPRM_EX_MANY		EQU 1		;AN000;TOO MANY OPERANDS ERR FROM PARSE
 = 0002                      C	SYSPRM_MISSING_OP	EQU 2		;AN000;MISSING OPERANDS ERR FROM PARSE
 = 0003                      C	SYSPRM_DUP_SW		EQU 3		;AN004;INVALID SWITCH R-CODE FROM PARSE
 = 8000                      C	F_APPEND		EQU 8000H	;AN000; /X status bit in Append
 = 0000                      C	NOT_X_APPEND		EQU 0		;AN000; /X NOT ACTIVE
 = 0000                      C	ACT_APPEND		EQU 0		;AN000;ACTIVE STATUS OF APPEND
 = 00FF                      C	D_V_APPEND		EQU 0FFH	;AN000;DOS VERSION OF APPEND
 = 005C                      C	PSPFCB1_DRV		EQU 5Ch 	;AN000;
 = 006C                      C	PSPFCB2_DRV		EQU 6Ch 	;AN000;
 = 0080                      C	PSPDTA_PARMLEN		EQU 80h 	;AN000;
 = 0081                      C	PSPDTA_PARRSTR		EQU 81h 	;AN000;
 = 0040                      C	BASE_OF_ALPHA_DRV	EQU 64		;AN000;1 => A, 2 => B for drive letter
 = 00DF                      C	BASE_UPPER_CASE 	EQU 11011111B	;AN000;"AND"ed will make it to upper case chr
 = 0041                      C	ALPHA_A 		EQU	'A'     ;AN000;
			     C	;ALPHA_D		 EQU	 'D'    ;moved to XCPYINT.MSG file for translation.
 = 0045                      C	ALPHA_E 		EQU	'E'     ;AN000;
			     C	;ALPHA_F		 EQU	 'F'    ;moved to XCPYINT.MSG file for translation.
 = 004D                      C	ALPHA_M 		EQU	'M'     ;AN000;
 = 0053                      C	ALPHA_S 		EQU	'S'     ;AN000;
 = 0050                      C	ALPHA_P 		EQU	'P'     ;AN000;
 = 0054                      C	ALPHA_T 		EQU	'T'     ;AN000;
 = 0056                      C	ALPHA_V 		EQU	'V'     ;AN000;
 = 0057                      C	ALPHA_W 		EQU	'W'     ;AN000;
 = 005A                      C	ALPHA_Z 		EQU	'Z'     ;AN000;
 = 002E                      C	A_dot			EQU	'.'     ;AN000;
 = 005C                      C	path_delim		equ	'\'     ;AN000;
 = 003A                      C	drv_delim		equ	':'     ;AN000;
			     C	;**********************************************************************
			     C	;DOS_LEVEL		 EQU	 0314h	;VERSION 3.20
			     C	;*************************END OF XCOPY.EQU ****************************
			     C	
				INCLUDE PAN-LIST.INC			;AN111;JW
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	;	PAN-LIST.INC
			     C	;
			     C	;
			     C	;
			     C	;	OASIS PANEL ASSOCATION TABLE
			     C	;
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 = 0001                      C	PAN_WELCOME	EQU	 1	;AN000; Welcome screen
 = 0002                      C	PAN_INTRO	EQU	 2	;AN000; Introduction screen
 = 0003                      C	PAN_CONFIRM	EQU	 3	;AN000; Confirmation screen
 = 0004                      C	PAN_WORKSPACE	EQU	 4	;AN000; User memory needs screen
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-16


 = 0005                      C	PAN_CTY_KYB	EQU	 5	;AN000; Country/Keyboard support screen
 = 0006                      C	PAN_COUNTRY	EQU	 6	;AN000; Country Code Choice screen
 = 0007                      C	PAN_KEYBOARD	EQU	 7	;AN000; Keyboard Code Choice screen
 = 0008                      C	PAN_KYBD_ALT	EQU	 8	;AN000; Alternate keyboard screen
 = 0009                      C	PAN_DEST_DRIVE	EQU	 9	;AN000; Destination Drive screen
 = 000A                      C	PAN_DOS_LOC	EQU	10	;AN000; DOS Location screen
 = 000B                      C	PAN_PRINTER	EQU	11	;AN000; Printer Selection Screen
 = 000C                      C	PAN_PRT_TYPE	EQU	12	;AN000; Printer type screen
 = 000D                      C	PAN_PARALLEL	EQU	13	;AN000; Parallel printer port selection screen
 = 000E                      C	PAN_SERIAL	EQU	14	;AN000; Serial printer port selection screen
 = 000F                      C	PAN_REVIEW	EQU	15	;AN000; Review Selections Screen
 = 0010                      C	PAN_FUNC_DISK	EQU	16	;AN000; Review selections made by SELECT - drive C:
 = 0010                      C	PAN_FUNC_DISKET EQU	16	;AN000; Review selections made by SELECT - drive B:
 = 0011                      C	ERR_PRT_NO_HDWR EQU	17	;AN000;
 = 0012                      C	PAN_DOS_PARAM	EQU	18	;AN000; PC/DOS parameters screen
 = 0013                      C	PAN_SHELL	EQU	19	;AN000; SHELL parameters screen
 = 0014                      C	ERR_EXIT	EQU	20	;AN000; Unrecoverable error - exit
 = 0015                      C	PAN_FASTOPEN	EQU	21	;AN000; FASTOPEN support screen
 = 0016                      C	PAN_SHARE	EQU	22	;AN000; SHARE support screen
 = 0017                      C	PAN_GRAPHICS	EQU	23	;AN000; GRAPHICS support screen
 = 0018                      C	PAN_EXP_MEMORY	EQU	24	;AN000; Expanded Memory support screen
 = 0019                      C	PAN_VDISK	EQU	25	;AN000; Virtual Disk support screen
 = 001A                      C	PAN_CONFIG_PARS EQU	26	;AN000; CONFIG.SYS parameter screen
 = 001B                      C	PAN_FIXED_FIRST EQU	27	;AN000; Partitions support for first disk only
 = 001C                      C	PAN_FIXED_BOTH	EQU	28	;AN000; Partitions support for both disks
 = 001D                      C	PAN_REBOOT	EQU	29	;AN000; Reboot screen
 = 001E                      C	PAN_DATE_TIME	EQU	30	;AN000; Install Date/Time support screen
 = 001F                      C	PAN_FORMAT	EQU	31	;AN000; Format Fixed Disk partition screen
 = 0020                      C	PAN_INST_PROMPT EQU	32	;AN000; Installing PC DOS prompt screen
 = 0020                      C	PAN_INSTALL_DOS EQU	32	;AN000; Installing PC DOS screen
 = 0021                      C	ERR_KEYB	EQU	33	;AN000; Error in running the KEYB command
 = 0022                      C	PAN_COMPLETE1	EQU	34	;AN000; Installing complete screen - disk
 = 0022                      C	PAN_COMPLETE2	EQU	34	;AN000; Installing complete screen - diskette 720KB
 = 0022                      C	PAN_COMPLETE3	EQU	34	;AN000; Installing complete screen - diskette 360KB
 = 0023                      C	SUB_COMP_KYS_1C EQU	35	;AN000; message for reboot; diskette COMBINED (1.44MB)
 = 0024                      C	PAN_HPAN	EQU	36	;AN000; contextual help panel
 = 0025                      C	PAN_HBAR	EQU	37	;AN000; HORIZONTAL BAR
 = 0026                      C	SUB_CONT_OPTION EQU	38	;AN000; Enter to continue or Esc to cancel
 = 0027                      C	SUB_PRINTER_1	EQU	39	;AN000; printer no 1
			     C	
 = 0028                      C	CHILD_F3EXIT	EQU	40	;AN000; f3 exit child panel
 = 0029                      C	SUB_FIXED_1	EQU	41	;AN000; fixed disk 1
 = 002A                      C	SUB_LOG_DRIVE	EQU	42	;AN000; logical drive JW
 = 002B                      C	SUB_REBOOT_KEYS EQU	43	;AN000; ctrl+alt+del to reboot line
 = 002C                      C	SUB_INSTALL_1	EQU	44	;AN000; copying from diskette 1
 = 002D                      C	SUB_INSTALL_2	EQU	45	;AN000; copying from diskette 2
 = 002E                      C	SUB_COMP_VER	EQU	46	;AN000; install of DOS 4.00 complete
 = 002F                      C	SUB_COMP_KYS_1	EQU	47	;AN000; message before reboot - disk
 = 0030                      C	SUB_COMP_KYS_2	EQU	48	;AN000; message before reboot - diskette
			     C					;
 = 0031                      C	CHILD_F1HELP	EQU	49	;AN000; help child panel
 = 0032                      C	CHILD_F9KEYS	EQU	50	;AN000; keys child panel
 = 0033                      C	CHILD_QUIT	EQU	51	;AN000; escape child panel
 = 0034                      C	CHILD_ENTER	EQU	52	;AN000; enter child panel
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-17


 = 0035                      C	SUB_COMP_REP	EQU	53	;AN000; Replacement of DOS 4.00 complete
			     C					;
 = 0036                      C	PAN_WRITE_PROT	EQU	54	;AN000;
 = 0037                      C	PAN_DRIVE_ERROR EQU	55	;AN000;
 = 0038                      C	PAN_BAD_DISKET	EQU	56	;AN000;
 = 0039                      C	ERR_COPY_DISK	EQU	57	;AN000;
			     C					;
 = 003A                      C	SUB_INS_START_B EQU	58	;AN000;
 = 003B                      C	SUB_REM_SEL_A	EQU	59	;AN000;
 = 003C                      C	SUB_REM_START_B EQU	60	;AN000;
 = 003D                      C	SUB_REM_DOS_A	EQU	61	;AN000;
			     C					;
 = 003E                      C	ERR_BAD_PATH	EQU	62	;AN000;
 = 003F                      C	ERR_BAD_PFILE	EQU	63	;AN000;
 = 0040                      C	ERR_BAD_PPRO	EQU	64	;AN000;
 = 0041                      C	FORMAT_DISK	EQU	65	;AN000;
 = 0042                      C	FORMAT_DISKET	EQU	66	;AN000;
 = 0043                      C	ERR_BORDER	EQU	67	;AN000;
 = 0044                      C	ERR_DOS_DISK	EQU	68	;AN000;
 = 0045                      C	ERR_GENERAL	EQU	69	;AN000;
 = 0046                      C	PAN_DISKCOPY	EQU	70	;AN000;
 = 0047                      C	PAN_DSKCPY_SRC	EQU	71	;AN000;
 = 0048                      C	PAN_DSKCPY_TAR	EQU	72	;AN000;
 = 0049                      C	PAN_DSKCPY_CPY	EQU	73	;AN000;
 = 004A                      C	PAN_PARTIAL	EQU	74	;AC010;
			     C	
 = 004B                      C	FORMAT_SHELL	EQU	75	;AN000;DT One drive format of SHELL diskette
 = 004C                      C	FORMAT_STARTUP	EQU	76	;AN000;DT One drive format of STARTUP diskette
 = 004D                      C	SUB_REM_SHELL_360 EQU	77	;AN001;GHG D65 360KB
 = 004E                      C	SUB_REM_SELECT_360 EQU	78	;AN001;GHG D65 360KB
 = 004F                      C	SUB_REM_UTIL1_360 EQU	79	;AN001;GHG D65 360KB
 = 0050                      C	SUB_COPYING	EQU	80	;AN001;GHG D65 360KB
			     C	
 = 0051                      C	SUB_INS_WORK1_360 EQU	81	;AN000;DT 2 drive 360 installation
 = 0052                      C	SUB_INS_WORK2_360 EQU	82	;AN000;DT	  "
 = 0053                      C	SUB_INS_WORK3_360 EQU	83	;AN000;DT	  "
 = 0054                      C	SUB_INS_START_360 EQU	84	;AN000;DT	  "
 = 0055                      C	SUB_INS_INSTALL_360 EQU 85	;AN000;DT	  "
			     C					;
 = 0056                      C	SUB_INS_WORK1_S360   EQU 86	;AN000;DT 1 drive 360 installation
 = 0057                      C	SUB_INS_WORK2_S360   EQU 87	;AN000;DT	  "
 = 0058                      C	SUB_INS_SHELL_S360   EQU 88	;AN000;DT	  "
 = 0059                      C	SUB_INS_STARTT_S360  EQU 89	;AN000;DT	  "
			     C	
 = 005A                      C	PAN_START360	     EQU 90	;AN000;DT	  "
 = 005B                      C	SUB_COMP_KYS_3	     EQU 91	;AN000;DT message before reboot - diskette
			     C	
 = 005C                      C	SUB_INSTALL_COPY     EQU 92	;AN000;DT insert INSTALL copy
 = 005D                      C	SUB_INS_OPER2	     EQU 93	;AN000;DT
 = 005E                      C	PAN_EXP_MEMORY2      EQU 94	;AN000;JW Expanded Memory support screen
 = 005F                      C	PAN_START720	     EQU 95	;AN000;DT Diskette introduction 720KB
 = 0060                      C	PAN_START1440	     EQU 96	;AN000;DT Diskette introduction 1440KB
 = 0061                      C	ERR_INS_INSTALL      EQU 97	;AN060;JW Insert the install diskette
 = 0062                      C	PAN_CHOOSE_SHELL     EQU 98	; MS-DOS Shell option
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-18


 = 0063                      C	SUB_INS_WORKING_A    EQU 99	; Insert the WORKING disk in drive A
 = 0064                      C	SUB_INS_MSSHELL_A    EQU 100	; Insert the MS-SHELL disk in drive A
 = 0065                      C	SUB_INS_SHELL_DISKS  EQU 101	; Ins. MS-SHELL in A; SHELL in B
 = 0066                      C	SUB_INS_OP_WORK      EQU 102	; Ins. OPERATING in A; WORKING in B
 = 0067                      C	SUB_INS_WORK3_A	     EQU 103	; Ins. WORKING3 in drive A
			     C	
 = 0001                      C	SCR_DOS_SUPPORT EQU	 1	;AN000; memory workspace list
 = 0002                      C	SCR_CTY_KYB	EQU	 2	;AN000; type of country/keyboard list
 = 0003                      C	SCR_CTY_1	EQU	 3	;AN000; list of countries - code 001 to 046
 = 0004                      C	SCR_CTY_2	EQU	 4	;AN000; list of countries - code 047 to 972
 = 0005                      C	SCR_KYB_1	EQU	 5	;AN000; list of keyboards - code BE to NO
 = 0006                      C	SCR_KYB_2	EQU	 6	;AN000; list of keyboards - code PO to none
 = 0007                      C	SCR_FR_KYB	EQU	 7	;AN000; list of alternate French keyboards
 = 0008                      C	SCR_IT_KYB	EQU	 8	;AN000; list of alternate Italian keyboards
 = 0009                      C	SCR_UK_KYB	EQU	 9	;AN000; list of alternate UK keyboards
 = 000A                      C	SCR_DEST_B_C	EQU	10	;AN111; install drive list JW
 = 000B                      C	SCR_PRT_TYPE	EQU	11	;AN000; list of printers supported
 = 000C                      C	SCR_PARALLEL	EQU	12	;AN000; list of parallel printer ports
 = 000D                      C	SCR_SERIAL	EQU	13	;AN000; list of serial printer ports
 = 000E                      C	SCR_PRT_REDIR	EQU	14	;AN000; list of redirected parallel printer ports
 = 000F                      C	SCR_REVIEW	EQU	15	;AN000; accept/view SELECT generated options
 = 0010                      C	SCR_FUNC_DISK	EQU	16	;AN000; list of functions supported - disk
 = 0011                      C	SCR_FUNC_DISKET EQU	17	;AN000; list of functions supported - diskette
 = 0012                      C	SCR_FIXED_FIRST EQU	18	;AN000; first fixed disk unused - partition support list
 = 0013                      C	SCR_FIXED_BOTH	EQU	19	;AN000; first fixed disk used - partition support list
 = 0014                      C	SCR_FORMAT	EQU	20	;AN000; fixed disk partition format
 = 0015                      C	SCR_CONTEXT_HLP EQU	21	;AN000;
 = 0015                      C	SCR_INDEX_HLP	EQU	21	;AN000;
 = 0016                      C	SCR_TITLE_HLP	EQU	22	;AN000;
 = 0017                      C	SCR_ACC_CTY	EQU	23	;AN000;
 = 0018                      C	SCR_ACC_KYB	EQU	24	;AN000;
 = 0019                      C	SCR_ACC_PRT	EQU	25	;AN000;
 = 001A                      C	SCR_COPY_DEST	EQU	26	;AN000;JW DOS location choices
 = 001B                      C	SCR_DEST_A_C	EQU	27	;AN111; install drive list JW
 = 001C                      C	SCR_CHOOSE_SHELL EQU	28	; MS-DOS Shell option
			     C					;
 = 0001                      C	STR_DOS_LOC	EQU	 1	;AN000; DOS location field
 = 0002                      C	STR_EXT_PARMS	EQU	 2	;AN000; external diskette parameters
 = 0003                      C	STR_DOS_PATH	EQU	 3	;AN000; DOS path
 = 0004                      C	STR_DOS_APPEND	EQU	 4	;AN000; APPEND path
 = 0005                      C	STR_DOS_PROMPT	EQU	 5	;AN000; PROMPT path
 = 0006                      C	STR_SHELL	EQU	 6	;AN000; SHELL parameters
 = 0007                      C	STR_KSAM	EQU	 7	;AN000; KSAM parameters
 = 0008                      C	STR_FASTOPEN	EQU	 8	;AN000; FASTOPEN parameters
 = 0009                      C	STR_SHARE	EQU	 9	;AN000; SHARE parameters
 = 000A                      C	STR_GRAPHICS	EQU	10	;AN000; GRAPHICS parameters
 = 000B                      C	STR_XMAEM	EQU	11	;AN000; XMAEM expanded memory parameter
 = 000C                      C	STR_XMA2EMS	EQU	12	;AN000; XMA2EMS expanded memory parameter
 = 000D                      C	STR_VDISK	EQU	13	;AN000; VDISK parameter
 = 000E                      C	STR_BREAK	EQU	14	;AN000; BREAK parameter
 = 000F                      C	STR_BUFFERS	EQU	15	;AN000; BUFFERS parameter
 = 0010                      C	STR_DOS_APPEND_P EQU	 16	;AN000; APPEND parameter   JW
 = 0011                      C	STR_FCBS	EQU	17	;AN000; FCBS parameter
 = 0012                      C	STR_FILES	EQU	18	;AN000; FILES parameter
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-19


 = 0013                      C	STR_LASTDRIVE	EQU	19	;AN000; LASTDRIVE parameter
 = 0014                      C	STR_STACKS	EQU	20	;AN000; STACKS parameter
 = 0015                      C	STR_VERIFY	EQU	21	;AN000; VERIFY parameter
			     C	
 = 0016                      C	NUM_PRINTER	EQU	22	;AN000; no of printers
 = 0017                      C	NUM_EXT_DISK	EQU	23	;AN000; no of external diskettes
 = 0018                      C	NUM_YEAR	EQU	24	;AN000; YEAR
 = 0019                      C	NUM_MONTH	EQU	25	;AN000; MONTH
 = 001A                      C	NUM_DAY 	EQU	26	;AN000; DAY
 = 001B                      C	NUM_HOUR	EQU	27	;AN000; HOUR
 = 001C                      C	NUM_MINUTE	EQU	28	;AN000; MINUTE
 = 001D                      C	NUM_SECOND	EQU	29	;AN000; SECOND
 = 001E                      C	STR_DEF_CP	EQU	30	;AN000; Default CodePage for the SELECT.DAT file
 = 001F                      C	STR_SWISS_KEYB	EQU	31	;AN000; Default SWISS Keyboard
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
				INCLUDE PANEL.MAC			;AN111;JW
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; PANEL.MAC
			     C	;
			     C	;	This file contains the MACROS defined for the
			     C	;	screen management and a number of other macros
			     C	;	identified with CAS services.
			     C	;
			     C	;	This file is included with the control flow files
			     C	;	for the creation of SELECT.EXE!
			     C	;
			     C	; DATE:   July 3, 1987
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C						;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; MACRO:  PREPARE_CHILDREN
			     C	;
			     C	;	This routine takes the Child panels associated with the
			     C	;	QM_ACTIVEPAN and adds them to the display queue - pushed
			     C	;	on as Children.
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	PREPARE_CHILDREN MACRO			;;AN000;
			     C		CALL	HANDLE_CHILDREN 	;;AN000;
			     C		ENDM				;;AN000;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; MACRO:  INIT_PQUEUE
			     C	;
			     C	;	This flushes both the Parent/Child queues, clears the
			     C	;	refresh field table, initializes the refresh field to
			     C	;	the new Parent panel (with 0 entries), and sets the break
			     C	;	ON for the parent panel.  Also it pushes the parent onto
			     C	;	the display queue.
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-20


			     C	INIT_PQUEUE	MACRO	panel		;;AN000;
			     C		MOV	AX,panel		;;AN000;
			     C		CALL	INIT_PQUEUE_CALL	;;AN000;
			     C		ENDM				;;AN000;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; MACRO:  PREPARE_PANEL
			     C	;
			     C	;	This will put the specified panel into the Parent queue
			     C	;	for display.  The QM_OPT2 is already set to break OFF.
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	PREPARE_PANEL	MACRO	panel		;;AN000;
			     C		MOV	AX,panel		;;AN000;
			     C		CALL	PREPARE_PANEL_CALL	;;AN000;
			     C		ENDM				;;AN000;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; MACRO:  DISPLAY_PANEL
			     C	;
			     C	;	Display panel causes the Parent/Children on the display
			     C	;	queues to be displayed on the screen.  If there are any
			     C	;	entries in the entry field table, then the break ON is set
			     C	;	to automatically display these panels.
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	DISPLAY_PANEL	MACRO			;;AN000;
			     C		CALL	DISPLAY_PANEL_CALL	;;AN000;
			     C		ENDM				;;AN000;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; MACRO:  DEALLOCATE_MEMORY
			     C	;
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	DEALLOCATE_MEMORY  MACRO		;;AN000;
			     C		CALL	DEALLOCATE_MEMORY_CALL	;;AN000;
			     C		ENDM				;;AN000;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; MACRO:  ALLOCATE_MEMORY
			     C	;
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	ALLOCATE_MEMORY MACRO			;;AN000;
			     C		CALL	ALLOCATE_MEMORY_CALL	;;AN000;allocate segment
			     C		ENDM				;;AN000;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; MACRO:  GET_SCROLL
			     C	;
			     C	;	The scroll field becomes the active field assuming a default
			     C	;	colour index, and the cursor keys become active.  The only
			     C	;	keys valid for return are specified in the 'fkeys' list.
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-21


			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	GET_SCROLL   MACRO input,index,f_keys	;;AN000;
			     C		MOV	AX,input		;;AN000;
			     C		MOV	BX,index		;;AN000;
			     C		MOV	CX,f_keys&_LEN		;;AN000;
			     C		LEA	DX,f_keys		;;AN000;
			     C		CALL	EXEC_SCROLL_CALL	;;AN000;
			     C		ENDM				;;AN000;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; MACRO:  INIT_SCROLL
			     C	;
			     C	;	Sets up the scroll field with the specified index onto the
			     C	;	refresh field table.  The colour index table is set to a
			     C	;	different colour to indicate that it is not the active field.
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	INIT_SCROLL  MACRO input,index		;;AN000;
			     C		MOV	AX,input		;;AN000;
			     C		MOV	BX,index		;;AN000;
			     C		CALL	INIT_SCROLL_CALL	;;AN000;
			     C		ENDM				;;AN000;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; MACRO:  INIT_SCROLL_W_LIST
			     C	;
			     C	;	Sets up the scroll field with the specified index onto the
			     C	;	refresh field table.  The colour index table is set to a
			     C	;	different colour to indicate that it is not the active field.
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	INIT_SCROLL_W_LIST  MACRO input,list_seg,list_off,num_ele,max_width,max_title,index ;;AN000;
			     C		MOV	AX,input		;;AN000;
			     C		MOV	BX,max_title		;;AN000;
			     C		MOV	CX,num_ele		;;AN000;
			     C		MOV	DX,max_width		;;AN000;
			     C		MOV	SI,list_seg		;;AN000;
			     C		MOV	DI,list_off		;;AN000;
			     C		CALL	INIT_SCROLL_W_LIST_CALL ;;AN000;
			     C		MOV	AX,input		;;AN000;
			     C		MOV	BX,index		;;AN000;
			     C		CALL	INIT_SCROLL_CALL	;;AN000;
			     C		ENDM				;;AN000;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; MACRO:  INIT_SCROLL_W_NUM
			     C	;
			     C	;	Sets up the scroll field with the specified index onto the
			     C	;	refresh field table.  The colour index table is set to a
			     C	;	different colour to indicate that it is not the active field.
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	INIT_SCROLL_W_NUM   MACRO input,num_ele,index ;;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-22


			     C		MOV	AX,input		;;AN000;
			     C		MOV	CX,num_ele		;;AN000;
			     C		CALL	INIT_SCROLL_W_NUM_CALL	;;AN000;
			     C		MOV	AX,input		;;AN000;
			     C		MOV	BX,index		;;AN000;
			     C		CALL	INIT_SCROLL_CALL	;;AN000;
			     C		ENDM				;;AN000;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; MACRO:  INIT_SCROLL_COLOUR
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	INIT_SCROLL_COLOUR  MACRO input,colour	;;AN000;
			     C		MOV	BX,input		;;AN000;get PCSLCTP field
			     C		MOV	AX,colour		;;AN000;
			     C		CALL	SET_SCROLL_COLOUR	;;AN000;
			     C		ENDM				;;AN000;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; MACRO:  SET_SCROLL
			     C	;
			     C	;	The SET_SCROLL will set a scroll field specified to the required
			     C	;	index in a different colour index to indicate it is NOT the
			     C	;	active field.
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	SET_SCROLL   MACRO input,index		;;AN000;
			     C		MOV	AX,input		;;AN000;
			     C		MOV	BX,index		;;AN000;
			     C		CALL	SET_SCROLL_CALL 	;;AN000;
			     C		ENDM				;;AN000;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; MACRO:  GET_FUNCTION
			     C	;
			     C	;	This routine is used to process screens with NO scroll fields
			     C	;	or input fields.  The valid keys are specified in the 'fkeys'
			     C	;	list.
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	GET_FUNCTION	MACRO	fkeys		;;AN000;
			     C		MOV	CX,fkeys&_LEN		;;AN000;
			     C		LEA	DX,fkeys		;;AN000;
			     C		CALL	GET_FUNCTION_CALL	;;AN000;
			     C		ENDM				;;AN000;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; MACRO:  INIT_STRING
			     C	;
			     C	;	INIT_STRING is used to add the input entry field onto the
			     C	;	refresh field table.  Unlike the scroll fields, the colour
			     C	;	index is maintained for the input field.
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-23


			     C	INIT_STRING  MACRO   input,string,max_string ;;AN000;
			     C		MOV	AX,input		;;AN000;
			     C		LEA	BX,string		;;AN000;
			     C		MOV	SI,max_string		;;AN000;
			     C		CALL	INIT_STRING_CALL	;;AN000;
			     C		ENDM				;;AN000;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; MACRO:  SET_STRING
			     C	;
			     C	;	This set an input field (already contained in the refresh
			     C	;	field table) on the logical buffer to the defined string.
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	SET_STRING   MACRO   input,string,max_string ;;AN000;
			     C		MOV	AX,input		;;AN000;
			     C		LEA	BX,string		;;AN000;
			     C		MOV	SI,max_string		;;AN000;
			     C		CALL	SET_STRING_CALL 	;;AN000;
			     C		ENDM				;;AN000;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; MACRO:  GET_STRING
			     C	;
			     C	;	Causes the input field specified to become the active input
			     C	;	field.	The keys that will exit this input field are defined
			     C	;	in the 'fkeys' list.  The other characters valid for this
			     C	;	input field are contained in the ICB.
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	GET_STRING  MACRO   input,string,max_string,fkeys ;;AN000;
			     C		MOV	AX,input		;;AN000;
			     C		LEA	BX,string		;;AN000;
			     C		MOV	CX,fkeys&_LEN		;;AN000;
			     C		LEA	DX,fkeys		;;AN000;
			     C		MOV	SI,max_string		;;AN000;
			     C		CALL	GET_STRING_CALL 	;;AN000;
			     C		ENDM				;;AN000;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; MACRO:  GET_NUMERIC
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	GET_NUMERIC MACRO   input,value,minimum,maximum,fkeys,string ;;AN000;
			     C		LOCAL	GN_0			;;AN000;
			     C		LOCAL	GN_1			;;AN000;
			     C		MOV	AX,maximum		;;AN000;
			     C		LEA	BX,P_USER_STRING	;;AN000;
			     C		CALL	CONVERT_ASCII		;;AN000;
			     C		MOV	SI,AX			;;AN000;
			     C						;;
			     C		MOV	AX,value		;;AN000;
			     C	GN_0:	LEA	BX,string+2		;;AN000;
			     C		CALL	CONVERT_ASCII		;;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-24


			     C		MOV	string,AX		;;AN000;
			     C						;;
			     C		LEA	BX,string		;;AN000;
			     C		MOV	AX,input		;;AN000;
			     C		MOV	CX,fkeys&_LEN		;;AN000;
			     C		LEA	DX,fkeys		;;AN000;
			     C		CALL	GET_STRING_CALL 	;;AN000;
			     C						;;
			     C		LEA	BX,P_USER_STRING	;;AN000;
			     C		MOV	CX,S_USER_STRING	;;AN000;
			     C		CALL	CONVERT_NUMERIC 	;;AN000;
			     C						;;
			     C		CMP	N_USER_FUNC,ESCAPE	;;AN000;
			     C		JE	GN_1			;;AN000;
			     C						;;
			     C		MOV	BX,minimum		;;AN000;
			     C		MOV	CX,maximum		;;AN000;
			     C		CALL	CHECK_MIN_MAX		;;AN000;
			     C		JC	GN_0			;;AN000;
			     C						;;
			     C	GN_1:	MOV	N_USER_NUMERIC,AX	;;AN000;
			     C		ENDM				;;AN000;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; MACRO:  INIT_NUMERIC
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	INIT_NUMERIC MACRO   input,value,maximum,string ;;AN000;
			     C		MOV	AX,maximum		;;AN000;
			     C		LEA	BX,P_USER_STRING	;;AN000;
			     C		CALL	CONVERT_ASCII		;;AN000;
			     C		MOV	SI,AX			;;AN000;
			     C						;;
			     C		MOV	AX,value		;;AN000;
			     C		LEA	BX,string+2		;;AN000;
			     C		CALL	CONVERT_ASCII		;;AN000;
			     C		MOV	string,AX		;;AN000;
			     C						;;
			     C		LEA	BX,string		;;AN000;
			     C		MOV	AX,input		;;AN000;
			     C		CALL	INIT_STRING_CALL	;;AN000;
			     C		ENDM				;;AN000;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; MACRO:  SET_NUMERIC
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	SET_NUMERIC  MACRO   input,value,maximum,string ;;AN000;
			     C		MOV	AX,maximum		;;AN000;
			     C		LEA	BX,P_USER_STRING	;;AN000;
			     C		CALL	CONVERT_ASCII		;;AN000;
			     C		MOV	SI,AX			;;AN000;
			     C						;;
			     C		MOV	AX,value		;;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-25


			     C		LEA	BX,string		;;AN000;
			     C		CALL	CONVERT_ASCII		;;AN000;
			     C		MOV	string,AX		;;AN000;
			     C						;;
			     C		LEA	BX,string		;;AN000;
			     C		MOV	AX,input		;;AN000;
			     C		CALL	SET_STRING_CALL 	;;AN000;
			     C		ENDM				;;AN000;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; MACRO:  GET_SUPPORT
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	INIT_SCROLL_STATUS MACRO input,status_id ;;AN000;
			     C		MOV	AX,input		;;AN000;
			     C		LEA	SI,status_id		;;AN000;
			     C		CALL	INIT_SCROLL_STATUS_CALL ;;AN000;
			     C		ENDM				;;AN000;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; MACRO:  INIT_SUPPORT
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	INIT_SUPPORT	MACRO table,index,status ;;AN000;
			     C		PUSH	SI			;;AN000;
			     C		LEA	SI,table		;;AN000;
			     C		MOV	BX,index		;;AN000;
			     C		DEC	BX			;;AN000;
			     C		SHL	BX,1			;;AN000;
			     C		MOV	AX,status		;;AN000;
			     C		MOV	[SI+BX],AX		;;AN000;
			     C		POP	SI			;;AN000;
			     C		ENDM				;;AN000;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; MACRO:  RET_SUPPORT
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	RET_SUPPORT	MACRO table,index,status ;;AN000;
			     C		PUSH	SI			;;AN000;
			     C		LEA	SI,table		;;AN000;
			     C		MOV	BX,index		;;AN000;
			     C		DEC	BX			;;AN000;
			     C		SHL	BX,1			;;AN000;
			     C		MOV	AX,[SI+BX]		;;AN000;
			     C		MOV	status,AX		;;AN000;
			     C		POP	SI			;;AN000;
			     C		ENDM				;;AN000;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; MACRO:  TOGGLE_SUPPORT
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	TOGGLE_SUPPORT	MACRO table,index	;;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-26


			     C		MOV	BX,index		;;AN000;
			     C		LEA	DX,table		;;AN000;
			     C		CALL	TOGGLE_SUPPORT_CALL	;;AN000;
			     C		ENDM				;;AN000;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; MACROS:  INITIALIZE_BCHAR
			     C	;
			     C	;	One needs to initialize the background panel colour index
			     C	;	to match the colour attributes of the Parent panels.  The
			     C	;	index is based on panel #1 (which is assumed to be a good
			     C	;	sample of the remaining panel colours.
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	INITIALIZE_BCHAR MACRO	character	;;AN000;
			     C		MOV	AL,character		;;AN000;Background character
			     C		MOV	PM_BASECHAR,AL		;;AN000;
			     C		PUSH	DI			;;AN000;
			     C		PUSH	DX			;;AN000;
			     C		PUSH	ES			;;AN000;
			     C		MOV	BX,1			;;AN000;get ES:DI pointer to panel #1
			     C		CALL	GET_PCB 		;;AN000;
			     C		PUSH	ES:[DI]+PCB_CCBID	;;AN000;get panel's color index
			     C		POP	AX			;;AN000;
			     C		DEC	AX			;;AN000;normalize index
			     C		POP	ES			;;AN000;
			     C		PUSH	ES			;;AN000;
			     C		MOV	DI,CRD_CCBVECOFF	;;AN000;
			     C		PUSH	CRD_CCBVECSEG		;;AN000;
			     C		POP	ES			;;AN000;
			     C		MOV	DX,12			;;AN000;12 entries per colour index
			     C		MUL	DX			;;AN000;
			     C		ADD	DI,AX			;;AN000;
			     C		MOV	AL,ES:[DI]		;;AN000;
			     C		POP	ES			;;AN000;
			     C		POP	DX			;;AN000;
			     C		POP	DI			;;AN000;
			     C		MOV	PM_BASEATTR,AL		;;AN000;set color attribute of background characters
			     C		ENDM				;;AN000;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; MACRO:  RETURN_STRING
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	RETURN_STRING  MACRO   input,string,maximum ;;AN000;
			     C		MOV	AX,input		;;AN000;
			     C		MOV	DX,maximum		;;AN000;
			     C		LEA	SI,string		;;AN000;
			     C		CALL	RETURN_STRING_CALL	;;AN000;
			     C		ENDM				;;AN000;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; MACRO:  HANDLE_ERROR
			     C	;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-27


			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	HANDLE_ERROR   MACRO   input,action	;;AN000;
			     C		LOCAL	CONTINUE		;;AN000;
			     C		MOV	BX,input		;;AN000;
			     C		MOV	CX,action		;;AN000;
			     C		CALL	HANDLE_ERROR_CALL	;;AN000;
			     C		JNC	CONTINUE		;;AN000;
			     C		CLEAR_SCREEN2			;;AC027;SEH ;AN000;
			     C		JMP	EXIT_SELECT		;;AN000;
			     C	CONTINUE:				;;AN000;
			     C		ENDM				;;AN000;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	; MACRO: INIT_CHAR	      ;;AN000;JW
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	INIT_CHAR    MACRO character,row,column,panid ;;AN000;JW
			     C		MOV  AX,row			;;AN000;JW
			     C		MOV  CX,column			;;AN000;JW
			     C		MOV  DL,character		;;AN000;JW
			     C		MOV  BX,panid			;;AN000;JW
			     C		CALL INIT_CHAR_CALL		;;AN000;JW
			     C		ENDM				;;AN000;JW
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
				INCLUDE CASEXTRN.INC			;AN111;JW
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	;
			     C	;
			     C	;
			     C	;
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C		EXTRN	GET_PCB:NEAR			;AN000;
			     C		EXTRN	CURSORON:NEAR			;AN000;
			     C		EXTRN	CURSOROFF:NEAR			;AN000;
			     C		EXTRN	ADJUST_UP:NEAR			;AN000;
			     C		EXTRN	INITIALIZE:NEAR 		;AN000;
			     C		EXTRN	ADJUST_DOWN:NEAR		;AN000;
			     C		EXTRN	PCGVIDO_CALL:NEAR		;AN000;
			     C		EXTRN	HANDLE_CHILDREN:NEAR		;AN000;
			     C		EXTRN	INIT_STRING_CALL:NEAR		;AN000;
			     C		EXTRN	INIT_PQUEUE_CALL:NEAR		;AN000;
			     C		EXTRN	EXEC_SCROLL_CALL:NEAR		;AN000;
			     C		EXTRN	INIT_SCROLL_CALL:NEAR		;AN000;
			     C		EXTRN	GET_STRING_CALL:NEAR		;AN000;
			     C		EXTRN	INIT_SCROLL_STATUS_CALL:NEAR	;AN000;
			     C		EXTRN	PREPARE_PANEL_CALL:NEAR 	;AN000;
			     C		EXTRN	DISPLAY_PANEL_CALL:NEAR 	;AN000;
			     C		EXTRN	GET_FUNCTION_CALL:NEAR		;AN000;
			     C		EXTRN	TOGGLE_SUPPORT_CALL:NEAR	;AN000;
			     C		EXTRN	CHECK_MIN_MAX:NEAR		;AN000;
			     C		EXTRN	CONVERT_NUMERIC:NEAR		;AN000;
			     C		EXTRN	CONVERT_ASCII:NEAR		;AN000;
			     C		EXTRN	SET_SCROLL_COLOUR:NEAR		;AN000;
			     C		EXTRN	SET_SCROLL_CALL:NEAR		;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-28


			     C		EXTRN	INIT_SCROLL_W_LIST_CALL:NEAR	;AN000;
			     C		EXTRN	INIT_SCROLL_W_NUM_CALL:NEAR	;AN000;
			     C		EXTRN	HANDLE_ERROR_CALL:FAR		;AN000;
			     C		EXTRN	HANDLE_PANEL_CALL:FAR		;AN000;
			     C		EXTRN	HANDLE_KEYSTROKE:FAR		;AN000;
			     C		EXTRN	RETURN_STRING_CALL:NEAR 	;AN000;
			     C		EXTRN	INIT_CHAR_CALL:NEAR		;AN000;JW
			     C		EXTRN	INSERT_DISK_ROUTINE:NEAR	;AN000;JW
			     C	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			     C	
				
				
				EXTRN	 FK_ENT:BYTE			;AN111;JW
				EXTRN	 FK_ENT_LEN:ABS 		;AN111;JW
				EXTRN	 E_RETURN:ABS			;AN111;JW
				EXTRN	 S_DOS_SHEL_DISK:WORD		;AN111;JW
				EXTRN	 S_DOS_SEL_360:WORD		;AN111;JW
				EXTRN	 E_FILE_ATTR:ABS		;AN111;JW
				
				EXTRN	 FIND_FILE_ROUTINE:FAR		;AN111;JW
				EXTRN	 EXIT_SELECT:near		;AN111;JW
				
				;-------------------------------
				;    Structures
				;-------------------------------
				;HEADER - informations needed about the file, subdirectory ...
				;Continue_Info -> 0 - a whole single file in this header segment, or dir.
				;		  1 - Continuation of a small file.
				;		  2 - Continuation of a Big file
				;		  3 - EOF of continuation
				;Next_Ptr      -> points to the next header segment
				;Before_Ptr    -> points to the old header segment
				
				HEADER	STRUC		  ;AN000;
 0000  00				CONTINUE_INFO DB      0 	;AN000;set for filesize bigger then 0FFD0h
 0001  0000				NEXT_PTR DW	 ?		;AN000;next buffer ptr in para
 0003  0000				BEFORE_PTR DW	   ?		;AN000;before ptr in para
 0005  00				DIR_DEPTH DB	  ?		;AN000;same as S_DEPTH
 0006  0000				CX_BYTES DW	 0		;AN000;actual # of bytes in this buffer seg.
 0008  00				ATTR_FOUND DB	   ?		;AN000;attribute found
 0009  0000				FILE_TIME_FOUND DW	?;AN000;
 000B  0000				FILE_DATE_FOUND DW	?;AN000;
 000D  0000				LOW_SIZE_FOUND DW      ?;AN000;
 000F  0000				HIGH_SIZE_FOUND DW	?;AN000;
 0011  20 3A				TARGET_DRV_LET DB      " :"     ;AN000;used for writing
 0013  000D[				FILENAME_FOUND DB      13 DUP (0) ;AN000; FILENAME
	   00			
			 ]	
				
 0020  00				ATTRIB_LIST DB	 ?		;AC005;EXTENDED ATTRIBUTE BUFFER
				;-------------------------------------------------------------------
				;	extended attribute list used by extended open & get extended
				;-------------------------------------------------------------------
				;	ATTRIB_LIST LABEL BYTE		 extended attribute buffer
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-29


				;
				;EA		STRUC		; EXTENDED ATTRIBUTE
				;EA_TYPE	DB	?	; TYPE
				;EAISUNDEF	EQU	0	; UNDEFINED TYPE	      (ATTRIB SKIPS)
				;				;   (OR TYPE NOT APPLICABLE)
				;				;   LENGTH: 0 TO 64K-1 BYTES
				;EAISLOGICAL	EQU	1	; LOGICAL (0 OR 1)	      (ATTRIB DISPLAYS) 		
						  ;   LENGTH: 1 BYTE
				;EAISBINARY	EQU	2	; BINARY INTEGER	      (ATTRIB DISPLAYS)
				;				;   LENGTH: 1, 2, 4 BYTES
				;EAISASCII	EQU	3	; ASCII TYPE		      (ATTRIB DISPLAYS)
				;				;   LENGTH: 0 TO 128 BYTES
				;EAISDATE	EQU	4	; DOS FILE DATE FORMAT	      (ATTRIB DISPLAYS)
				;				;   LENGTH: 2 BYTES
				;EAISTIME	EQU	5	; DOS FILE TIME FORMAT	      (ATTRIB DISPLAYS)
				;				;   LENGTH: 2 BYTES
				;				; OTHER VALUES RESERVED
				;EA_FLAGS	DW	?	; FLAGS
				;EASYSTEM	EQU	8000H	; EA IS SYSTEM DEFINED
				;				; (BUILTIN, NOT APPLICATION DEFINED)
				;EAREADONLY	EQU	4000H	; EA IS READ ONLY (CANT BE CHANGED)
				;EAHIDDEN	EQU	2000H	; EA IS HIDDEN FROM ATTRIB
				;EACREATEONLY	EQU	1000H	; EA IS SETABLE ONLY AT CREATE TIME
				;				; OTHER BITS RESERVED
				;EA_RC		DB	?	; FAILURE REASON CODE (SET BY DOS)
				;EARCNOTFOUND	EQU	1	; NAME NOT FOUND
				;EARCNOSPACE	EQU	2	; NO SPACE TO HOLD NAME OR VALUE
				;EARCNOTNOW	EQU	3	; NAME CAN'T BE SET ON THIS FUNCTION
				;EARCNOTEVER	EQU	4	; NAME CAN'T BE SET
				;EARCUNDEF	EQU	5	; NAME KNOWN TO THIS FS BUT NOT SUPPORTED
				;EARCDEFBAD	EQU	6	; EA DEFINTION BAD (TYPE, LENGTH, ETC)
				;EARCACCESS	EQU	7	; EA ACCESS DENIED
				;EARCUNKNOWN	EQU	-1	; UNDETERMINED CAUSE
				;EA_NAMELEN	DB	?	; LENGTH OF NAME
				;EA_VALLEN	DW	?	; LENGTH OF VALUE
				;EA_NAME	DB	?	; FIRST BYTE OF NAME
				;
				;EA_VALUE	DB	?	; FIRST BYTE OF VALUE
				;
 0021				HEADER	ENDS	     ;AN000;
				
				;;;;SUB_LIST STRUC		  ; SAR
				;;;;	    DB	    11		  ; SAR 	;AN000;
				;;;;	    DB	    0		  ; SAR 	;AN000;
				;;;;DATA_OFF DW     0		  ; SAR 	;AN000; offset of data to be inserted
				;;;;DATA_SEG DW     0		  ; SAR 	;AN000; offset of data to be inserted
				;;;;MSG_ID  DB	    0		  ; SAR 	;AN000; n of %n
				;;;;FLAGS   DB	    0		  ; SAR 	;AN000; Flags
				;;;;MAX_WIDTH DB    0		  ; SAR 	;AN000; Maximum field width
				;;;;MIN_WIDTH DB    0		  ; SAR 	;AN000; Minimum field width
				;;;;PAD_CHAR DB     0		  ; SAR 	;AN000; character for pad field
				;;;;				  ; SAR
				;;;;SUB_LIST ENDS		  ; SAR
				;******************************************************************************
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-30


 0000				DATA	SEGMENT BYTE PUBLIC  'DATA'     ;AN000; DATA Segment
				
				INCLUDE  DOSFILES.INC		       ;AN000; SAR
 0000  0000                  C	ALLOCATE_START	   DW	     0		;AN000;
			     C						;
 0002  00                    C	DEST		   DB	     0		;AN000;
 0003  0000                  C	FILE_NUM	   DW	     0		;AN000;
 0005  0000                  C	NUMBER_OF_FILES    DW	     0		;AN000;
 0007  0000                  C	TABLE_OFFSET	   DW	     0		;AN000;
 0009  0000                  C	PATH_OFFSET	   DW	     0		;AN000;
 000B  00                    C	NOT_FOUND_FLAG	   DB	     0		;AN000;
 000C  0000                  C	SP_SAVE 	   DW	     0		;AN000;
			     C						;
 000E  42 3A 2A 2E 2A 00     C	EVERYTHING	   DB	     'B:*.*',0  ;AN000;
			     C						;
 0014  0000                  C	DOS_FILE_PTR	   DW	     0		;AN000;
 0016  0000                  C	BUFFER_START	   DW	     0		;AN000;
			     C						;
 0018  42 3A 5C 00           C	B_TARGET	   DB	     'B:\',0    ;AN000;
 = 0004                      C	LENGTH_B_TARGET    EQU	     $-B_TARGET ;AN000;
			     C						;
 001C  41 3A 5C 00           C	A_TARGET	   DB	     'A:\',0    ;AN111;JW
 = 0004                      C	LENGTH_A_TARGET    EQU	     $-A_TARGET ;AN111;JW
				
				;; ERRORLEVEL DB   0			; SAR	;errorlevel
				;; INPUT_DATE DW   0			; SAR
				;; INPUT_TIME DW   0			; SAR
 0020  0000			PSP_SEG DW	?		   ;AN000;
 0022  00			SAV_DEFAULT_DRV DB ?			;AN000;1 = A, 2 = B etc. saved default
 0023  5C			SAV_DEF_DIR_ROOT DB '\';AN000;
 0024  0040[			SAV_DEFAULT_DIR DB 64 DUP (0);AN000;
	   00			
			 ]	
				
 0064  41 3A 5C			SAV_S_DRV DB	'A:\'     ;AN000;
 0067  0040[			SAV_S_CURDIR DB 64 DUP (0);AN000;
	   00			
			 ]	
				
 00A7  42 3A 5C			SAV_T_DRV DB	'B:\'     ;AN000;
 00AA  0040[			SAV_T_CURDIR DB 64 DUP (0);AN000;
	   00			
			 ]	
				
				
					PUBLIC SOURCE_PANEL, DEST_PANEL, CHECK_FILE  ;AN111;JW
 00EA  0000			SOURCE_PANEL DW ?				     ;AN111;JW
 00EC  0000			DEST_PANEL   DW ?				     ;AN111;JW
 00EE  0000			CHECK_FILE   DW ?				     ;AN111;JW
				
 00F0  00			SOURCE_IN    DB ?				     ;AN111;JW
 = 0000				YES	     EQU 0				     ;AN111;JW
 = 0001				NO	     EQU 1				     ;AN111;JW
				
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-31


 00F1  0000			OLD_DTA_SEG  DW ?				     ;AN111;JW
 00F3  0000			OLD_DTA_OFF  DW ?				     ;AN111;JW
				
				;
				
				;; DISP_S_PATH DB  67 DUP (0)	   ; SAR   ;mirror image of source path. used for display message wh
				en copying
				;; DISP_S_FILE DB  13 DUP (0)	   ; SAR
				;; DISP_T_PATH DB  67 DUP (0)	   ; SAR   ;mirror image of target path
				;; DISP_T_FILE DB  13 DUP (0)	   ; SAR
				;
				;;B_SLASH DB	  '\',0            ; SAR
				
				
 00F5				FILE_COUNT LABEL WORD	  ;AN000;
 00F5  0000			FILE_CNT_LOW DW 0			;AN000;copied file count
 00F7  0000			FILE_CNT_HIGH DW 0  ;AN000;
				;
				
				;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
				;; APPENDFLAG DW   0			; SAR	 ;append /X status save area
 00F9  00			FOUND_FILE_FLAG DB 0			;AN000;used for showing the message "File not found"
				;
 00FA  00			S_DRV_NUMBER DB 0			;AN000;source, target drv #
 00FB  00			T_DRV_NUMBER DB 0   ;AN000;
				;
 00FC				S_DRV_PATH LABEL BYTE			;AN000;source drv, path used for single_drv_copy
 00FC  41 3A 5C			S_DRV	DB	'A:\'          ;AN000;
 00FF  0050[			S_PATH	DB	80 DUP (0)		;AN000;Initialized by calling GET CUR DIR
	   00			
			 ]	
				
 014F  00			S_DEPTH DB	0	   ;AN000;
 0150  41 3A			S_DRV_1 DB	'A:'       ;AN000;
 0152  3F 3F 3F 3F 3F 3F	S_FILE	DB	'????????.???',0        ;AN000;default filename to find file
       3F 3F 2E 3F 3F 3F	
       00			
				;; S_DIR   DB	   '????????.???',0     ; SAR   ;to find any subdirectory name
				
				;; S_PARENT DB	   '..',0               ; SAR   ;source parent used for non single_drv_copy
 015F  0000			S_HANDLE DW	0			;AN000;file handle opened
				
				;; S_ARC_DRV_PATH LABEL BYTE		   ; SAR ;informations used to change source file's
				;; S_ARC_DRV DB    'A:\'                   ; SAR ;archieve bits.
				;; S_ARC_PATH DB   64 DUP (0)		   ; SAR
				;; S_ARC_DEPTH DB  0			   ; SAR
				
 0161				T_DRV_PATH LABEL BYTE			;AN000;target drv, path used all the time
 0161  42 3A 5C			T_DRV	DB	'B:\'          ;AN000;
 0164  0040[			T_PATH	DB	64 DUP (0)		;AN000;initialized by calling GET CUR DIR in INIT
	   00			
			 ]	
				
 01A4  00			T_DEPTH DB	0	   ;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-32


				
				;; T_FILE  LABEL   BYTE 		; SAR	;target filename for file creation
				;; T_DRV_1 DB	   'B:'                 ; SAR   ;target drv letter
				;; T_FILENAME DB   13 DUP (0)		; SAR	;target filename
				;; T_TEMPLATE DB   11 DUP (0)		; SAR	;if global chr entered, this will be used instead of
				 filename.
				
				;; T_PARENT LABEL  BYTE 		; SAR
				;; T_DRV_2 DB	   'B:'                 ; SAR
				;; T_PARENT_1 DB   '..',0               ; SAR
 01A5  0000			T_HANDLE DW	0			;AN000;target handle created
				;; T_MKDIR_LVL DB  0			; SAR	;# of target starting directories created.
				;
				;------------------------------------------
				; PRINT_STDOUT input parameter save area
				;------------------------------------------
				;; SUBST_COUNT DW  0			; SAR	;AN000; message substitution count
				;; MSG_CLASS DB    0			; SAR	;AN000; message class
				;; INPUT_FLAG DB   0			; SAR	;AN000; Type of INT 21 used for KBD input
				;; MSG_NUM DW	   0			; SAR	;AN000; message number
				
				;----------------------------------------------
				; Parameter list used by extended open DOS call
				;----------------------------------------------
 01A7				PARAM_LIST LABEL WORD;AN000;
 01A7  00000000			E_A_LST DD	0			;AN005; E A LIST POINTER
 01AB  0001				DW	1			;AN005; number of additional parameters
 01AD  06				DB	6			;AN005; ID for IO mode = WORD VALUE
 01AE  0001				DW	1			;AN005; IO mode = PURE SEQUENTIAL
				
				
				;; INPUT_BUFF db   20  dup(0)		; SAR	;AN000; keyboard input buffer used
									;for user response (Y/N)
				
				;--------------------------------------------------------------
				; Following three sublists are used by the  Message Retriever
				;--------------------------------------------------------------
				;;SUBLIST1 LABEL  DWORD 		  ; SAR ;AN000;SUBSTITUTE LIST 1
				;;	  DB	  11			  ; SAR ;AN000;sublist size
				;;	  DB	  0			  ; SAR ;AN000;reserved
				;;	  DD	  0			  ; SAR ;AN000;substition data Offset
				;;	  DB	  1			  ; SAR ;AN000;n of %n
				;;	  DB	  0			  ; SAR ;AN000;data type
				;;	  DB	  0			  ; SAR ;AN000;maximum field width
				;;	  DB	  0			  ; SAR ;AN000;minimum field width
				;;	  DB	  0			  ; SAR ;AN000;characters for Pad field
				;;					  ; SAR
				;;					  ; SAR
				;;SUBLIST2 LABEL  DWORD 		  ; SAR ;AN000;SUBSTITUTE LIST 2
				;;	  DB	  11			  ; SAR ;AN000;sublist size
				;;	  DB	  0			  ; SAR ;AN000;reserved
				;;	  DD	  0			  ; SAR ;AN000;substition data Offset
				;;	  DB	  2			  ; SAR ;AN000;n of %n
				;;	  DB	  0			  ; SAR ;AN000;data type
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-33


				;;	  DB	  0			  ; SAR ;AN000;maximum field width
				;;	  DB	  0			  ; SAR ;AN000;minimum field width
				;;	  DB	  0			  ; SAR ;AN000;characters for Pad field
				;;					  ; SAR
				;;					  ; SAR
				;;SUBLIST3 LABEL  DWORD 		  ; SAR ;AN000;SUBSTITUTE LIST 3
				;;	  DB	  11			  ; SAR ;AN000;sublist size
				;;	  DB	  0			  ; SAR ;AN000;reserved
				;;	  DD	  0			  ; SAR ;AN000;substition data Offset
				;;	  DB	  3			  ; SAR ;AN000;n of %n
				;;	  DB	  0			  ; SAR ;AN000;data type
				;;	  DB	  0			  ; SAR ;AN000;maximum field width
				;;	  DB	  0			  ; SAR ;AN000;minimum field width
				;;	  DB	  0			  ; SAR ;AN000;characters for Pad field
				;;
				
				
 01B0  0000			FILE_SEARCH_ATTR DW NORM_ATTR;AN000;
				;; DIR_SEARCH_ATTR DW INCL_H_S_DIR_ATTR     ; SAR
				;
 01B2  20			OPEN_MODE DB	Read_Only_Deny_Write	;AN000;READ_ONLY_DENY_WRITE	 ;access, sharing mode
				;
				;Equates are defined in XCOPY.EQU
				
 01B3  00			MY_FLAG DB	0			;AN000;informations for a tree walk
				;	find_first_flag    equ	   01h	;set MY_FLAG by "OR"
				;	findfile_flag	   equ	   02h
				;	no_more_file	   equ	   04h
				;	single_copy_flag   equ	   08h	;single copy instead of multi copy
				;	visit_parent_flag  equ	   10h	;visit parent node
				;	found_flag	   equ	   20h	;found flag - for find subdir
				;	missing_link_flag  equ	   40h	;insuffiecient info. for not creating empty dir
				;	is_source_flag	   equ	   80h	;if set, dealing with source
				;	reset_find_first   equ	  0FEh	;reset by AND
				;	reset_findfile	   equ	  0FDh
				;	reset_no_more	   equ	  0FBh
				;	reset_visit_parent equ	  0EFh
				;	reset_found	   equ	  0DFh
				;	reset_missing_link equ	  0BFh
				;	reset_is_source    equ	  07Fh
				
 01B4  00			FILE_FLAG DB	0 ;AN000;
				;	cont_flag	   equ	   01h
				;	eof_flag	   equ	   02h
				;	big_file_flag	   equ	   04h
				;	file_bigger_flag   equ	   08h
				;	created_flag	   equ	   10h
				;	reset_cont	   equ	  0FEh
				;	reset_eof	   equ	  0FDh
				;	reset_big_file	   equ	  0FBh
				;	reset_file_bigger  equ	  0F7h
				;	reset_created	   equ	  0EFh
				;	reset_readfile	   equ	  0F0h	;reset FILE_FLAG for read a file
				;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-34


 01B5  00			COPY_STATUS DB	0;AN000;
				;	open_error_flag    equ	   01h
				;	read_error_flag    equ	   02h
				;	create_error_flag  equ	   04h
				;	write_error_flag   equ	   08h
				;	mkdir_error_flag   equ	   10h
				;	chdir_error_flag   equ	   20h
				;	maybe_itself_flag  equ	   40h
				;	disk_full_flag	   equ	   80h
				;	reset_open_error   equ	  0FEh
				;	reset_read_error   equ	  0FDh
				;	reset_create_error equ	  0FBh
				;	reset_write_error  equ	  0F7h
				;	reset_close_error  equ	  0EFh
				;	reset_chdir_error  equ	  0DFh
				;
 01B6  00			ACTION_FLAG DB	0;AN000;
				;	reading_flag	   equ	  01h	;display "Reading source files..."
				;	reset_reading	   equ	  0FEh	;do not display.
				;
 01B7  00			SYS_FLAG DB	0			;AN000;system information
				;	one_disk_copy_flag   equ   01h	;xcopy with only one logical drive.
				;	default_drv_set_flag equ   02h	;default drive has been changed by this program
				;	default_s_dir_flag   equ   04h	;source current directory saved.
				;	default_t_dir_flag   equ   08h	;target current directory saved.
				;	removalble_drv_flag  equ   10h
				;	sharing_source_flag  equ   20h	;source shared
				;	sharing_target_flag  equ   40h
				;	turn_verify_off_flag equ   80h	;turn the verify off when exit to dos
				;	reset_default_s_dir  equ  0FBh	;reset default_s_dir_flag
				;
 01B8  00			OPTION_FLAG DB	0;AN000;
				;	slash_a 	   equ	  01h	;soft archieve ?
				;	slash_d 	   equ	  02h	;date?
				;	slash_e 	   equ	  04h	;create empty dir?
				;	slash_m 	   equ	  08h	;hard archieve ? (turn off source archieve bit)
				;	slash_p 	   equ	  10h	;prompt?
				;	slash_s 	   equ	  20h	;walk the tree?
				;	slash_v 	   equ	  40h	;verify on?
				;	slash_w 	   equ	  80h	;show "Press any key to begin copying" msg)
				;	reset_slash_a	   equ	 0FEh	;turn off soft archieve
				;	reset_slash_m	   equ	 0F7h	;turn off hard archieve
				
 01B9  0000			MAX_CX	DW	0			;AN000;less than 0FFD0h
 01BB  0000			ACT_BYTES DW	0			;AN000;actual bytes read.
 01BD  0000			HIGH_FILE_SIZE DW 0;AN000;
 01BF  0000			LOW_FILE_SIZE DW 0;AN000;
				;
 01C1  0000			TOP_OF_MEMORY DW 0			;AN000;para
 01C3  0000			BUFFER_BASE DW	0			;AN000;para
 01C5  0000			MAX_BUFFER_SIZE DW 0			;AN000;para.	BUFFER_LEFT at INIT time.
 01C7  0000			BUFFER_LEFT DW	0			;AN000;para
 01C9  0000			BUFFER_PTR DW	0			;AN000;para. If buffer_left=0 then invalid value
 01CB  0000			DATA_PTR DW	0			;AN000;buffer_ptr + 2 (32 bytes)
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-35


 01CD  0000			OLD_BUFFER_PTR DW 0			;AN000;last buffer_ptr
 01CF  0000			SIZ_OF_BUFF DW	?			;AN005;para. EXTENDED ATTRIB BUFF SIZE
 01D1  0000			BYTS_OF_HDR DW	?			;AN005;bytes TOTAL HEADER SIZE
 01D3  0000			PARA_OF_HDR DW	?			;AN005;para. TOTAL HEADER SIZE
 01D5  0000			OPEN_FILE_COUNT DW ?			;AN005;TRACKING OF OPEN FLS FOR BUFFER
				;					      ;SIZE CALCULATION.
				;
				;structured data storage allocation
 01D7  0015[			FILE_DTA Find_DTA <>			;AN000;DTA for find file
	   00			
			 ]	
 01EC  00			
 01ED  0000			
 01EF  0000			
 01F1  0000			
 01F3  0000			
 01F5  000D[			
	   00			
			 ]	
				
 0202  0020[			DTAS	Find_DTA 32 dup (<>)		;AN000;DTA STACK for find dir
	0015[			
	    00			
			]	
	   00			
	   0000			
	   0000			
	   0000			
	   0000			
	000D[			
	    00			
			]	
			 ]	
				
				;** Througout the program BP will be used for referencing fieldsname in DTAS.
				;For example, DS:[BP].dta_filename.
 0762				DATA	ENDS		      ;AN000;
				
				;******************************************************************************
				
 0000				SELECT	    SEGMENT PARA PUBLIC 'SELECT';AN000;
					ASSUME	CS:SELECT, DS:DATA ;AN000;
				
				;--- START OF A PROGRAM ---
				
				PUBLIC	 MOD_XCOPY	    ;AN000;
 0000				MOD_XCOPY    PROC    NEAR		     ;AN000; SAR
				
				
 0000  06			    PUSH ES				    ;AN000; SAR
 0001  55			    PUSH BP				    ;AN000; SAR
									    ; SAR
 0002  1E			    PUSH DS				    ;AN000; SAR
 0003  07			    POP  ES				    ;AN000; SAR
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-36


 0004  89 26 000C R		    MOV  SP_SAVE, SP			    ;AN000; SAR
									    ; SAR
 0008  C6 06 00F0 R 00		    MOV  SOURCE_IN,YES			    ;AN111;JW
				    .IF < AL eq 1 >	     ;AN000;
 000D  3C 01                 3						cmp AL,1 
 000F  75 05                 6						jne $l2 
 0011  B0 02			       MOV  AL,2	     ;AN000;
				    .ELSEIF < AL eq 2 >      ;AN000;
 0013  EB 07                 3						jmp short $l1 
 0015  90                    3						nop 
 0016                        2	$l2: 
 0016  3C 02                 3						cmp AL,2 
 0018  75 02                 6						jne $l1 
 001A  B0 01			       MOV  AL,1	     ;AN000;
				    .ENDIF		     ;AN000;
 001C                        2	$l1: 
 001C  A2 0002 R		    MOV  DEST,AL			    ;AN000; SAR
 001F  89 1E 0007 R		    MOV  TABLE_OFFSET, BX		    ;AN000; SAR
 0023  89 0E 0005 R		    MOV  NUMBER_OF_FILES, CX		    ;AN000; SAR
 0027  89 36 0009 R		    MOV  PATH_OFFSET, SI		    ;AN000; SAR
 002B  E8 0568 R		    CALL SAVE_DTA	      ;AN000;
				
 002E  B4 62			    MOV  AH, 62H			    ;AN000; SAR
 0030  CD 21			    INT  21H				    ;AN000; SAR
 0032  89 1E 0020 R		    MOV  PSP_SEG, BX			    ;AN000; SAR
				
 0036  E8 0088 R		    CALL ALLOCATE			    ;AN000; SAR
				    .IF < C >				    ;AN000; SAR
 0039  73 03                 5						jnC $l6 
 003B  EB 2E 90				 JMP  JUST_EXIT 		    ;AN000; SAR
				    .ENDIF				    ;AN000; SAR
 003E                        2	$l6: 
				
 003E				XCOPY_INIT:	  ;AN000;
 003E  E8 084E R			CALL	INIT			;AN000;initialization
 0041  72 18				JC	MAIN_EXIT		;AN000;error. (Already message has been displayed)
				
 0043  BD 0202 R			MOV	BP, OFFSET DTAS 	;AN000;initialize BP
 0046  80 0E 01B6 R 01			OR	ACTION_FLAG, READING_FLAG ;AN000;set reading flag for copy message
				
 004B  E8 00A5 R			CALL	TREE_COPY		;AN000;
				
 004E  E8 07CB R			CALL	ORG_S_DEF		;AN000;restore the original source default dir
				
 0051  E8 0652 R			CALL	WRITE_FROM_BUFFER	;AN000;write from buffer if we missed it.
				
 0054  E8 0579 R			CALL	SWITCH_DTAS		;AN111;JW
				
 0057  F8			    CLC 				;AN000; SAR
 0058  EB 02 90			    JMP  RESTORE_DIRS			;AN000; SAR
				
 005B				MAIN_EXIT:		;AN000;
				;;;;;	MOV	BX, DATA		; SAR
				;;;;;	MOV	DS, BX			; SAR re initialize ds, es
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-37


				;;;;;	MOV	ES, BX			; SAR exit here if the status of source, target or default d
				rv has been changed.
				;;;;;	CALL	CHK_FILE_NOT_FOUND	; SAR if no files has been found, show the message.
				
 005B				MAIN_EXIT_A:		;AN000;
 005B  F9			    STC 				;AN000; SAR
				
 005C				RESTORE_DIRS:;AN000;
 005C  BB ---- R			MOV	BX, DATA		;AN000; SAR
 005F  8E DB				MOV	DS, BX			;AN000;re initialize ds, es
 0061  8E C3				MOV	ES, BX			;AN000;exit here if the status of source, target or default 
				drv has been changed.
				;;;;;	CALL	CHK_MKDIR_LVL		; SAR starting target directory has been created?
 0063  9C			    PUSHF				;AN000; SAR
 0064  E8 07E5 R			CALL	ORG_S_T_DEF		;AN000;restore original target, source, default drv, and ver
				ify status
 0067  9D			    POPF				;AN000; SAR
 0068  EB 07 90			    JMP  DO_DEALLOCATE			;AN000; SAR
 006B				JUST_EXIT:				;AN000;unconditional immediate exit
 006B  B8 ---- R		    MOV  AX, DATA			;AN000; SAR
 006E  8E D8			    MOV  DS, AX 			;AN000; SAR
 0070  F9			    STC 				;AN000; SAR
				
 0071				DO_DEALLOCATE:				;AN000; SAR
				; Restore the original status of APPEND if active.
 0071  E8 0097 R		    CALL DEALLOCATE			;AN000; SAR
				    .IF < NC >				;AN000; SAR
 0074  72 0B                 6						jc $l9 
					 .IF < NOT_FOUND_FLAG EQ 1 >	;AN000; SAR
 0076  80 3E 000B R 01       3						cmp NOT_FOUND_FLAG,1 
 007B  75 03                 6						jne $l13 
 007D  F9				       STC			;AN000; SAR
					  .ELSE 			;AN000; SAR
 007E  EB 01                 3						jmp short $l9 
 0080                        2	$l13: 
 0080  F8				       CLC			;AN000; SAR
					  .ENDIF			;AN000; SAR
				    .ENDIF				;AN000; SAR
 0081                        2	$l9: 
 0081  8B 26 000C R		    MOV  SP, SP_SAVE			;AN000; SAR
 0085  5D			    POP  BP				;AN000; SAR
 0086  07			    POP  ES				;AN000; SAR
 0087  C3			    RET 				;AN000; SAR
				
				;	MOV	AH, 4Ch 		;return to dos
				;	MOV	AL, ERRORLEVEL		;set return code whatever
				;	INT	21H
				
 0088				MOD_XCOPY    ENDP;AN000;
				;
				
				
				;----------------- SUBROUTINES ---------------------------------------------
				
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-38


 0088				ALLOCATE PROC NEAR			    ;AN000; SAR
									    ; SAR
 0088  BB FFFF			    MOV  BX, 0FFFFH			    ;AN000; SAR     Attempt to allocate as much as possible
 008B  B4 48			    MOV  AH, 48H			    ;AN000; SAR
 008D  CD 21			    INT  21H				    ;AN000; SAR
 008F  B4 48			    MOV  AH, 48H			    ;AN000; SAR     BX contains the amount of memory availab
				le
 0091  CD 21			    INT  21H				    ;AN000; SAR
 0093  A3 0000 R		    MOV  ALLOCATE_START, AX		    ;AN000; SAR
									    ; SAR
 0096  C3			    RET 				    ;AN000; SAR
									    ; SAR
 0097				ALLOCATE ENDP				    ;AN000; SAR
									    ; SAR
 0097				DEALLOCATE    PROC NEAR 		    ;AN000; SAR
									    ; SAR
 0097  9C			    PUSHF				    ;AN000; SAR
 0098  06			    PUSH ES				    ;AN000; SAR
 0099  A1 0000 R		    MOV  AX, ALLOCATE_START		    ;AN000; SAR
 009C  8E C0			    MOV  ES, AX 			    ;AN000; SAR
 009E  B4 49			    MOV  AH, 49H			    ;AN000; SAR
 00A0  CD 21			    INT  21H				    ;AN000; SAR
 00A2  07			    POP  ES				    ;AN000; SAR
 00A3  9D			    POPF				    ;AN000; SAR
									    ; SAR
 00A4  C3			    RET 				    ;AN000; SAR
									    ; SAR
 00A5				DEALLOCATE    ENDP			    ;AN000; SAR
				
				
				
				
 00A5				TREE_COPY PROC	NEAR	  ;AN000;
				
				;Walk the source tree to read files and subdirectories
				
				    .IF < DEST EQ 1 >				 ;AN000; SAR Copying to drive b?
 00A5  80 3E 0002 R 01       3						cmp DEST,1 
 00AA  75 09                 6						jne $l17 
 00AC  BE 0018 R			 MOV  SI, OFFSET B_TARGET		 ;AN000; SAR Yes! Copy the drive information
 00AF  B9 0004				 MOV  CX, LENGTH_B_TARGET		 ;AN000; SAR
				    .ELSEIF < DEST EQ 3 >	    ;AN111;JW	 ; SAR Copying to drive A?
 00B2  EB 19                 3						jmp short $l16 
 00B4  90                    3						nop 
 00B5                        2	$l17: 
 00B5  80 3E 0002 R 03       3						cmp DEST,3 
 00BA  75 08                 6						jne $l19 
 00BC  BE 001C R			 MOV  SI, OFFSET A_TARGET   ;AN111;JW	 ; SAR Yes! Copy the drive information
 00BF  B9 0004				 MOV  CX, LENGTH_A_TARGET   ;AN111;JW	 ; SAR
				    .ELSE					 ;AN000; SAR
 00C2  EB 09                 3						jmp short $l16 
 00C4                        2	$l19: 
 00C4  8B 36 0009 R			 MOV  SI, PATH_OFFSET			 ;AN000; SAR No! Copy to this directory.
 00C8  8B 0C				 MOV  CX, WORD PTR [SI] 		 ;AN000; SAR
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-39


 00CA  83 C6 02				 ADD  SI, 2				 ;AN000; SAR Adjust for the length word
				    .ENDIF					 ;AN000; SAR
 00CD                        2	$l16: 
 00CD  BF 0161 R		    MOV     DI,OFFSET T_DRV_PATH		 ;AN000; SAR
 00D0  FC			    CLD 					 ;AN000; SAR
 00D1  F3/ A4			    REP MOVSB					 ;AN000; SAR
				
				
				
 00D3  80 0E 01B3 R 02			OR	MY_FLAG, FINDFILE_FLAG	;AN000;deals with files
 00D8  80 0E 01B3 R 01			OR	MY_FLAG, FIND_FIRST_FLAG ;AN000;find first
				
 00DD  C6 06 000B R 00		    MOV  NOT_FOUND_FLAG, 0				   ;AN000; SAR
											   ; SAR
 00E2				NEXT_PASS:						   ;AN000; SAR
											   ; SAR
 00E2  8B 36 0007 R			MOV	SI, TABLE_OFFSET			   ;AN000; SAR
 00E6  89 36 0014 R			MOV	DOS_FILE_PTR,SI 			   ;AN000; SAR
 00EA  C7 06 0003 R 0001		MOV	FILE_NUM,1				   ;AN000; SAR
				
 00F0  E8 0553 R			CALL	SET_MY_DTA		;AN000;set DTA to FILE_DTA
				;	$DO
 00F3				$$DO1:		  ;AN000;
 00F3  80 26 01B3 R FB			    AND     MY_FLAG, RESET_NO_MORE		   ;AN000; SAR
 00F8  E8 01E2 R			    CALL    LOAD_DOS_FILENAME			   ;AN000; SAR
 00FB  F6 06 01B3 R 04			    TEST    MY_FLAG, NO_MORE_FILE		   ;AN000; SAR
				;	$LEAVE NZ					   ; SAR
 0100  75 27				JNZ $$EN1			      ;AN000;
				
					    .IF < SOURCE_IN EQ NO > AND       ;AN000;
 0102  80 3E 00F0 R 01       3						cmp SOURCE_IN,NO 
 0107  75 0A                 6						jne $l22 
					    .IF < DEST EQ 3 >		      ;AN000;
 0109  80 3E 0002 R 03       3						cmp DEST,3 
 010E  75 03                 6						jne $l22 
 0110  E8 012B R			       CALL GET_SOURCE		      ;AN000;
					    .ENDIF			      ;AN000;
 0113                        2	$l22: 
				
 0113  E8 051D R			    CALL    FIND_FILE		;AN000;find first (next) ; SAR
					    .IF < BIT MY_FLAG NAND NO_MORE_FILE >	   ;AN000; SAR
 0116  F6 06 01B3 R 04       3						test MY_FLAG,NO_MORE_FILE 
 011B  75 05                 6						jnz $l26 
 011D  E8 0216 R				 CALL	READ_INTO_BUFFER		   ;AN000; SAR
					    .ELSE					   ;AN000; SAR
 0120  EB 05                 3						jmp short $l25 
 0122                        2	$l26: 
 0122  C6 06 000B R 01				 MOV	NOT_FOUND_FLAG, 1		   ;AN000; SAR
					    .ENDIF					   ;AN000; SAR
 0127                        2	$l25: 
				;	$ENDDO						   ; SAR
 0127  EB CA				JMP SHORT $$DO1   ;AN000;
 0129				$$EN1:		   ;AN000;
 0129  F8				CLC						   ;AN000; SAR
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-40


				
				;   SAR 
				;;;;;;	TEST	OPTION_FLAG, SLASH_S	;walk the tree?
				;	$IF	NZ,LONG
				;
				;	    AND     MY_FLAG, RESET_FINDFILE ;now, deals with directory
				;	    OR	    MY_FLAG, FIND_FIRST_FLAG ;find first
				;	    $DO
				;		CALL	SET_MY_DTA	;set DTA to DTAS according to BP
				;		CALL	FIND_DIR	;find first (next)
				;		TEST	MY_FLAG, NO_MORE_FILE ;no more subdirectory?
				;	    $LEAVE  NZ			;then leave this loop to return to caller
				;		LEA	DI, S_DRV_PATH
				;		LEA	SI, [BP].DTA_FILENAME
				;		CMP	S_PATH, 0	;root directory?
				;		$IF	E
				;		    MOV     AL, 0FFh	;then '\' is already provided. Just concat.
				;		$ELSE
				;		    MOV     AL, PATH_DELIM ;put delimiter
				;		$ENDIF
				;		CALL	CONCAT_ASCIIZ	;make new path
				;		test	option_flag, slash_p ;prompt mode?
				;		$IF	NZ
				;		    call    p_concat_display_path
				;		$ENDIF
				;		INC	S_DEPTH 	;increase depth
				;		CALL	MAKE_HEADER	;make header in the buffer
				;		OR	MY_FLAG, IS_SOURCE_FLAG ;dealing with source
				;		AND	MY_FLAG, RESET_VISIT_PARENT ;going to visit child node
				;		CALL	CHANGE_S_DIR	;change source dir
				;		ADD	BP, type FIND_DTA ;increase DTAS stack pointer
				;		CALL	TREE_COPY	;tree copy the sub directory
				;	    $ENDDO
				;
				;	    CMP     S_DEPTH, 0		;starting directory? then exit
				;	    $IF     NE			;else
				;		DEC	S_DEPTH 	;dec depth
				;		TEST	OPTION_FLAG, SLASH_E ;copy subdirectories even if empty?
				;		$IF	Z
				;		    CALL    DEL_EMPTY	;then check the old_buffer_ptr and
				;					;if it is a directory, then restore
				;					;buffer_ptr to old.
				;		$ENDIF
				;		LEA	DI, S_DRV_PATH
				;		CALL	LAST_DIR_OUT	;change environments
				;		test	option_flag, slash_p ;prompt mode?
				;		$IF	NZ
				;		    call    p_cut_display_path
				;		$ENDIF
				;		LEA	DX, S_DRV_PATH	;before returning to the caller
				;		OR	MY_FLAG, IS_SOURCE_FLAG
				;		OR	MY_FLAG, VISIT_PARENT_FLAG
				;		CALL	CHANGE_S_DIR
				;		SUB	BP, type FIND_DTA
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-41


				;	    $ENDIF
				;;;;;;; $ENDIF				;walk the tree
 012A  C3				RET	    ;AN000;
 012B				TREE_COPY ENDP;AN000;
				
				
 012B				GET_SOURCE	PROC	NEAR;AN000;
				
 012B  E8 0579 R			CALL SWITCH_DTAS;AN000;
				
					.REPEAT     ;AN000;
 012E                        2	$l29: 
				
					   INIT_PQUEUE		PAN_INST_PROMPT 		;AN000; initialize queue
 012E  B8 0020               1		MOV	AX,PAN_INST_PROMPT		; 
 0131  E8 0000 E             1		CALL	INIT_PQUEUE_CALL	; 
					   PREPARE_PANEL	SOURCE_PANEL			;AN000; remove select from A: & inse
				rt DOS
 0134  A1 00EA R             1		MOV	AX,SOURCE_PANEL		; 
 0137  E8 0000 E             1		CALL	PREPARE_PANEL_CALL	; 
					   PREPARE_PANEL	PAN_HBAR			;AN000;
 013A  B8 0025               1		MOV	AX,PAN_HBAR		; 
 013D  E8 0000 E             1		CALL	PREPARE_PANEL_CALL	; 
					   PREPARE_CHILDREN					;AN000; prepare child panels
 0140  E8 0000 E             1		CALL	HANDLE_CHILDREN 	; 
					   DISPLAY_PANEL					;AN000;
 0143  E8 0000 E             1		CALL	DISPLAY_PANEL_CALL	; 
												;
					   GET_FUNCTION 	FK_ENT				;AN000;
 0146  B9 0000 E             1		MOV	CX,FK_ENT_LEN		; 
 0149  8D 16 0000 E          1		LEA	DX,FK_ENT		; 
 014D  E8 0000 E             1		CALL	GET_FUNCTION_CALL	; 
				
					   .IF < SOURCE_PANEL eq SUB_REM_DOS_A >		;AN000;
 0150  83 3E 00EA R 3D       3						cmp SOURCE_PANEL,SUB_REM_DOS_A 
 0155  75 06                 6						jne $l32 
 0157  8D 3E 0000 E			      LEA  DI, S_DOS_SEL_360				;AN000;
					   .ELSE						;AN000;
 015B  EB 04                 3						jmp short $l31 
 015D                        2	$l32: 
 015D  8D 3E 0000 E			      LEA  DI, S_DOS_SHEL_DISK				;AN000;
					   .ENDIF						;AN000;
 0161                        2	$l31: 
 0161  B9 0000 E			   MOV	CX, E_FILE_ATTR 				;AN000;
 0164  9A 0000 ---- E			   CALL FIND_FILE_ROUTINE				;AN000;
					   .LEAVE < nc >					;AN000;
 0169  73 28                 5						jnc $l30 
												;
					   HANDLE_ERROR 	ERR_DOS_DISK, E_RETURN		;AN000;
 016B  BB 0044               1		MOV	BX,ERR_DOS_DISK		; 
 016E  B9 0000 E             1		MOV	CX,E_RETURN		; 
 0171  9A 0000 ---- E        1		CALL	HANDLE_ERROR_CALL	; 
 0176  73 19                 1		JNC	??0000		; 
 0178  B9 0000               2		MOV	CX,0			; 
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-42


 017B  BA 184F               2		MOV	DX,184Fh		; 
 017E  B8 0600               2		MOV	AX,0600h		; 
 0181  B7 07                 2		MOV	BH,7			; 
 0183  CD 10                 2		INT	10H			; 
 0185  BA 0000               2		MOV	DX,0			; 
 0188  B7 00                 2		MOV	BH,0			; 
 018A  B4 02                 2		MOV	AH,2			; 
 018C  CD 10                 2		INT	10H			; 
 018E  E9 0000 E             1		JMP	EXIT_SELECT		; 
 0191                        1	??0000:				; 
												;
					.UNTIL							;AN000;
 0191  EB 9B                 4						jmp $l29 
 0193                        3	$l30: 
				
					;;;copying files from diskette 1 screen 		;
					INIT_PQUEUE		PAN_INSTALL_DOS 		;AN000; initialize queue
 0193  B8 0020               1		MOV	AX,PAN_INSTALL_DOS		; 
 0196  E8 0000 E             1		CALL	INIT_PQUEUE_CALL	; 
					PREPARE_PANEL		SUB_COPYING			;AN000; prepare copying from diskett
				e 1 message
 0199  B8 0050               1		MOV	AX,SUB_COPYING		; 
 019C  E8 0000 E             1		CALL	PREPARE_PANEL_CALL	; 
					DISPLAY_PANEL						;AN000;
 019F  E8 0000 E             1		CALL	DISPLAY_PANEL_CALL	; 
				
 01A2  C6 06 00F0 R 00			MOV  SOURCE_IN,YES ;AN000;
				
 01A7  E8 0579 R			CALL SWITCH_DTAS   ;AN000;
				
 01AA  C3				RET		   ;AN000;
 01AB				GET_SOURCE	ENDP	 ;AN000;
				
 01AB				GET_DEST	PROC	NEAR  ;AN000;
				
				
					INIT_PQUEUE	     PAN_INST_PROMPT		     ;AN000; initialize queue
 01AB  B8 0020               1		MOV	AX,PAN_INST_PROMPT		; 
 01AE  E8 0000 E             1		CALL	INIT_PQUEUE_CALL	; 
					PREPARE_PANEL	     DEST_PANEL 		     ;AN000; remove select from A: & insert 
				DOS
 01B1  A1 00EC R             1		MOV	AX,DEST_PANEL		; 
 01B4  E8 0000 E             1		CALL	PREPARE_PANEL_CALL	; 
					PREPARE_PANEL	     PAN_HBAR			     ;AN000;
 01B7  B8 0025               1		MOV	AX,PAN_HBAR		; 
 01BA  E8 0000 E             1		CALL	PREPARE_PANEL_CALL	; 
					PREPARE_CHILDREN				     ;AN000; prepare child panels
 01BD  E8 0000 E             1		CALL	HANDLE_CHILDREN 	; 
					DISPLAY_PANEL					     ;AN000;
 01C0  E8 0000 E             1		CALL	DISPLAY_PANEL_CALL	; 
											     ;
					GET_FUNCTION	     FK_ENT			     ;AN000;
 01C3  B9 0000 E             1		MOV	CX,FK_ENT_LEN		; 
 01C6  8D 16 0000 E          1		LEA	DX,FK_ENT		; 
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-43


 01CA  E8 0000 E             1		CALL	GET_FUNCTION_CALL	; 
												;
				
					;;;copying files from diskette 1 screen 		;
					INIT_PQUEUE		PAN_INSTALL_DOS 		;AN000; initialize queue
 01CD  B8 0020               1		MOV	AX,PAN_INSTALL_DOS		; 
 01D0  E8 0000 E             1		CALL	INIT_PQUEUE_CALL	; 
					PREPARE_PANEL		SUB_COPYING			;AN000; prepare copying from diskett
				e 1 message
 01D3  B8 0050               1		MOV	AX,SUB_COPYING		; 
 01D6  E8 0000 E             1		CALL	PREPARE_PANEL_CALL	; 
					DISPLAY_PANEL						;AN000;
 01D9  E8 0000 E             1		CALL	DISPLAY_PANEL_CALL	; 
				
 01DC  C6 06 00F0 R 01			MOV  SOURCE_IN,NO  ;AN000;
				;	SUB  DOS_FILE_PTR,12
				;	DEC  FILE_NUM
				
 01E1  C3				RET		   ;AN000;
 01E2				GET_DEST	ENDP	   ;AN000;
				;
				;******************************************************************************
				; Subroutine: LOAD_DOS_FILENAME - Load the next filename into S_FILE.
				; INPUT:
				;	 SI - Points to the start of the filename
				;
				; OUTPUT:
				;	 The S_FILE field in the data segment is updated.
				;Registers Affected:
				;	 SI - At the end, SI points to the end of the filename.  It therefore
				;	      also points to the beginning of the next filename.
				;
				;******************************************************************************
 01E2				LOAD_DOS_FILENAME	PROC	NEAR;AN000;
				
 01E2  57				PUSH	DI	      ;AN000;
 01E3  06				PUSH	ES	      ;AN000;
				
 01E4  80 0E 01B3 R 01			OR	MY_FLAG, FIND_FIRST_FLAG	;AN000; Find first in the directory
				
 01E9  8B 36 0014 R			MOV	SI,DOS_FILE_PTR 	;AN000;
				
 01ED				LDF_SEE_IF_DONE:	     ;AN000;
					;
					; See if we are finished this pass of the files
					;
 01ED  80 0E 01B3 R 04		    OR	 MY_FLAG, NO_MORE_FILE			 ;AN000; For now, assume there are not files found
 01F2  8B 16 0005 R		    MOV  DX, NUMBER_OF_FILES			 ;AN000; Get the number of files in the table
				    .IF < FILE_NUM BE DX >			 ;AN000; Search while there are still more files
 01F6  39 16 0003 R          3						cmp FILE_NUM,DX 
 01FA  77 13                 5						jnBE $l36 
 01FC  80 26 01B3 R FB			 AND  MY_FLAG, RESET_NO_MORE   ;AN000; Indicate that there are more files
 0201  8D 3E 0152 R			 LEA  DI,S_FILE 	       ;AN000; Where to put the name
 0205  B9 000C				 MOV  CX,12		       ;AN000; Number of bytes
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-44


 0208  FC				 CLD		    ;AN000;
 0209  F3/ A4				 REP  MOVSB	    ;AN000;
 020B  FF 06 0003 R			 INC  FILE_NUM	    ;AN000;
				    .ENDIF	     ;AN000;
 020F                        2	$l36: 
				
 020F  89 36 0014 R		     MOV     DOS_FILE_PTR,SI		     ;AN000; Save the pointer to the files
 0213  07			     POP     ES 		   ;AN000;
 0214  5F			     POP     DI 		   ;AN000;
 0215  C3			     RET			   ;AN000;
				
 0216				LOAD_DOS_FILENAME	ENDP		 ;AN000;
				;
 0216				READ_INTO_BUFFER PROC NEAR	   ;AN000;
				;Read *** a *** file	into buffer
				
				;   SAR 
				;	TEST	MY_FLAG, SINGLE_COPY_FLAG ;single copy?
				;	$IF	Z,AND			;no, multi copy
				;	TEST	ACTION_FLAG, READING_FLAG ;show message?
				;	$IF	NZ			;yes.
				;	    MOV     AX,MSG_READING_SOURCE ;AN000; message number
				;	    MOV     MSG_NUM,AX		;AN000; set message number
				;	    MOV     SUBST_COUNT,0	;AN000; no message substitution
				;	    MOV     MSG_CLASS,-1	;AN000; message class
				;	    MOV     INPUT_FLAG,0	;AN000; no input
				;	    MOV     AX,MSG_READING_SOURCE
				;	    CALL    PRINT_STDOUT	;show message "Reading source files"
				;
				;	    AND     ACTION_FLAG, RESET_READING ;reset it
				;;;;;;; $ENDIF
				
 0216  80 26 01B4 R F0			AND	FILE_FLAG, RESET_READFILE ;AN000;reset file_flag to read a file
 021B  A1 01F3 R			MOV	AX,FILE_DTA.DTA_FILE_SIZE_HIGH;AN000;
 021E  A3 01BD R			MOV	HIGH_FILE_SIZE, AX	  ;AN000;
 0221  A1 01F1 R			MOV	AX,FILE_DTA.DTA_FILE_SIZE_LOW;AN000;
 0224  A3 01BF R			MOV	LOW_FILE_SIZE, AX	  ;AN000;
				
 0227  A1 01D3 R			MOV	AX, PARA_OF_HDR 	;AN005;GET THE HEADER SIZE (para.)
 022A  39 06 01C5 R			CMP	MAX_BUFFER_SIZE,AX	;AN005;IS EA BUFFER TOO LARGE?
 022E  72 43				JB	RIB_ERROR		;AN005;CLOSE THE FILE AND GET THE NEXT
				
 0230  E8 05AB R			CALL	CMP_FILESIZE_TO_BUFFER_LEFT ;AN000;compare sizes
 0233  F6 06 01B4 R 08			TEST	FILE_FLAG, FILE_BIGGER_FLAG ;AN000;filesize > buffer_left - header?
 0238  74 25				JZ	RIB_SMALL		;AN000;if not, then small file
 023A  8B 1E 015F R			MOV	BX, S_HANDLE		;AN005;
 023E  E8 07AC R			CALL	CLOSE_A_FILE		;AN005;ONLY OPENED TO GET BUFFER SIZE
 0241  E8 0652 R			CALL	WRITE_FROM_BUFFER;AN000;
				
					.IF < SOURCE_IN EQ NO > AND	;AN111;JW
 0244  80 3E 00F0 R 01       3						cmp SOURCE_IN,NO 
 0249  75 0A                 6						jne $l39 
					.IF < DEST EQ 3 >		;AN111;JW
 024B  80 3E 0002 R 03       3						cmp DEST,3 
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-45


 0250  75 03                 6						jne $l39 
 0252  E8 012B R			   CALL GET_SOURCE		;AN111;JW  put source diskette in A:
					.ENDIF				;AN111;JW
 0255                        2	$l39: 
				
				;	JC	RIB_ERROR		;any problem with writing?
 0255  E8 05AB R			CALL	CMP_FILESIZE_TO_BUFFER_LEFT ;AN000;compare again
 0258  F6 06 01B4 R 08			TEST	FILE_FLAG, FILE_BIGGER_FLAG ;AN000;still bigger?
 025D  75 08				JNZ	RIB_BIG 		;AN000;yes.  Big file
 025F				RIB_SMALL:     ;AN000;
 025F  E8 028C R			CALL	SMALL_FILE;AN000;
 0262  72 0F				JC	RIB_ERROR  ;AN000;
 0264  EB 1B 90				JMP	RIB_EXIT  ;AN000;
 0267				RIB_BIG:       ;AN000;
 0267  8B 1E 015F R			MOV	BX, S_HANDLE		;AN005;
 026B  E8 07AC R			CALL	CLOSE_A_FILE		;AN005;ONLY OPENED TO GET BUFFER SIZE
 026E  E8 02D3 R			CALL	BIG_FILE      ;AN000;
 0271  73 0E				JNC	RIB_EXIT       ;AN000;
 0273				RIB_ERROR:	    ;AN000;
 0273  F6 06 01B5 R 01			TEST	COPY_STATUS, OPEN_ERROR_FLAG ;AN000;open error?
 0278  75 07				JNZ	RIB_EXIT		;AN000;just exit. find next file
 027A  8B 1E 015F R			MOV	BX, S_HANDLE		;AN000;else write error
 027E  E8 07AC R			CALL	CLOSE_A_FILE		;AN000;close the troubled file
									;and find next file
 0281				RIB_EXIT:	    ;AN000;
 0281  F6 06 01B3 R 08			TEST	MY_FLAG, SINGLE_COPY_FLAG ;AN000;single copy?
				;	$IF	NZ
 0286  74 03				JZ $$IF4		       ;AN000;
 0288  E8 0652 R			    CALL    WRITE_FROM_BUFFER	;AN000;then write a file
				;	$ENDIF
 028B				$$IF4:			       ;AN000;
 028B  C3				RET			      ;AN000;
 028C				READ_INTO_BUFFER ENDP	       ;AN000;
				;
				
 028C				SMALL_FILE PROC NEAR	       ;AN000;
				;handles a file smaller than max_buffer_size or buffer_left, i.e. fit in memory.
				;This routine will call MAKE_HEADER, SET_BUFFER_PTR< READ_A_FILE, OPEN_A_FIEL
				;CALC_FILE_SIZE, CMP_FILE_FFD0h, CLOSE_A_FILE.
				
 028C  F6 06 01B4 R 04			TEST	FILE_FLAG, BIG_FILE_FLAG ;AN000;called from BIG_FILE?
 0291  75 05				JNZ	SMF_CONT		;AN000;then need not open a file again
 0293  E8 0485 R			CALL	OPEN_A_FILE		;AN000;open a file using FILE_DTA
 0296  72 3A				JC	SMF_ERROR		;AN000;open error?
 0298				SMF_CONT:      ;AN000;
 0298  E8 04AF R			CALL	CMP_FILE_FFD0h		;AN000;filesize > 0FFD0h ?
 029B  F6 06 01B4 R 08			TEST	FILE_FLAG, FILE_BIGGER_FLAG;AN000;
 02A0  74 15				JZ	SMF_EOF 		;AN000;filesize <= 0FFD0h
 02A2  80 0E 01B4 R 01			OR	FILE_FLAG, CONT_FLAG	;AN000;filesize > 0FFD0h. set cont_flag
 02A7  B9 FFD0				MOV	CX, 0FFD0h		;AN000;# of bytes to read
 02AA  E8 04D7 R			CALL	READ_A_FILE;AN000;
 02AD  72 23				JC	SMF_ERROR		;AN000;unsuccessful read?
 02AF  E8 0353 R			CALL	MAKE_HEADER		;AN000;else make header and ready for next
 02B2  E8 04CA R			CALL	CALC_FILE_SIZE		;AN000;filesize = filesize - bytes read
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-46


 02B5  EB E1				JMP	SMF_CONT		;AN000;loop. compare again with the rest
				
 02B7				SMF_EOF:       ;AN000;
 02B7  8B 0E 01BF R			MOV	CX, LOW_FILE_SIZE	;AN000;rest of the bytes to read
 02BB  80 0E 01B4 R 02			OR	FILE_FLAG, EOF_FLAG	;AN000;set EOF
 02C0  E8 04D7 R			CALL	READ_A_FILE	  ;AN000;
 02C3  72 0D				JC	SMF_ERROR	    ;AN000;
 02C5  E8 0353 R			CALL	MAKE_HEADER	  ;AN000;
 02C8  8B 1E 015F R			MOV	BX, S_HANDLE	   ;AN000;
 02CC  E8 07AC R			CALL	CLOSE_A_FILE	  ;AN000;
 02CF  EB 01 90				JMP	SMF_EXIT	   ;AN000;
 02D2				SMF_ERROR:		;AN000;
									;
 02D2				SMF_EXIT:		;AN000;
 02D2  C3				RET		       ;AN000;
 02D3				SMALL_FILE ENDP 	;AN000;
				;
				
 02D3				BIG_FILE PROC	NEAR	  ;AN000;
				;handles a file which is bigger than max_buffer_size
				;Needs 2 file handles open concurrently for read and write
				
 02D3  80 0E 01B4 R 04			OR	FILE_FLAG, BIG_FILE_FLAG;AN000;
 02D8  80 0E 01B4 R 01			OR	FILE_FLAG, CONT_FLAG;AN000;
 02DD  E8 0485 R			CALL	OPEN_A_FILE	  ;AN000;
 02E0  72 70				JC	BIF_ERROR		;AN000;error in open?
 02E2  81 3E 01C5 R 0FFF		CMP	MAX_BUFFER_SIZE, 0FFFh	;AN000;max buffer size > 0FFFh in para ?
 02E8  77 22				JA	BIF_BIG 		;AN000;yes. large buffer system
									;else small buffer
 02EA  8B 0E 01B9 R			MOV	CX, MAX_CX		;AN000;CX = max_buffer_size * 16 - 32
 02EE				BIF_SM: 	 ;AN000;
 02EE  E8 04D7 R			CALL	READ_A_FILE;AN000;
 02F1  72 5F				JC	BIF_ERROR		;AN000;read error?
 02F3  E8 0353 R			CALL	MAKE_HEADER;AN000;
 02F6  E8 0652 R			CALL	WRITE_FROM_BUFFER;AN000;
 02F9  72 57				JC	BIF_ERROR		;AN000;write error?
 02FB  F6 06 01B4 R 02			TEST	FILE_FLAG, EOF_FLAG	;AN000;end of file set by READ_A_FILE?
 0300  74 EC				JZ	BIF_SM			;AN000;if not, read again
 0302  8B 1E 015F R			MOV	BX, S_HANDLE;AN000;
 0306  E8 07AC R			CALL	CLOSE_A_FILE;AN000;
 0309  EB 47 90				JMP	BIF_EXIT		;AN000;finished.
 030C				BIF_BIG:       ;AN000;
 030C  B9 FFD0				MOV	CX, 0FFD0h		;AN000;max # of data bytes this program supports
 030F				BIF_BIG1:	 ;AN000;
 030F  E8 04D7 R			CALL	READ_A_FILE;AN000;
 0312  72 3E				JC	BIF_ERROR    ;AN000;
 0314  E8 0353 R			CALL	MAKE_HEADER;AN000;
 0317  E8 04CA R			CALL	CALC_FILE_SIZE		;AN000;modify file size
 031A				BIF_BIG2:	      ;AN000;
 031A  E8 05AB R			CALL	CMP_FILESIZE_TO_BUFFER_LEFT ;AN000;filesize > buffer_left?
 031D  F6 06 01B4 R 08			TEST	FILE_FLAG, FILE_BIGGER_FLAG ;AN000;yes.
 0322  74 24				JZ	BIF_END 		;AN000;if it is not, call small_file
 0324  81 3E 01C7 R 0FFF		CMP	BUFFER_LEFT, 0FFFh	;AN000;BUFFER_LEFT >= 0FFF0h in bytes?
 032A  73 E0				JAE	BIF_BIG 		;AN000;then loop again.
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-47


 032C  81 3E 01C7 R 0140		CMP	BUFFER_LEFT, 140H	;AN000;else BUFFER_LEFT >= 5 K in bytes? ;minimum buffer siz
				e this program supports.
 0332  7C 0D				JL	BIF_BIG3		;AN000;then flush buffer and try again. **IF system buffer l
				eft < 5 K then infinit loop can happen.
 0334  A1 01C7 R			MOV	AX,BUFFER_LEFT;AN000;
 0337  2B 06 01D3 R			SUB	AX,PARA_OF_HDR		;AC005;FOR HEADER SIZE para.
 033B  8B 0E 01D1 R			MOV	CX,BYTS_OF_HDR		;AN005;FOR HEADER SIZE bytes.
 033F  EB CE				JMP	BIF_BIG1		;AN000;read again
 0341				BIF_BIG3:      ;AN000;
 0341  E8 0652 R			CALL	WRITE_FROM_BUFFER;AN000;
 0344  72 0C				JC	BIF_ERROR  ;AN000;
 0346  EB D2				JMP	BIF_BIG2		;AN000;flush buffer and compare again.
 0348				BIF_END:       ;AN000;
 0348  E8 028C R			CALL	SMALL_FILE		;AN000;when filesize <= buffer_left then SMALL_FILE will fin
				ish it.
 034B  72 05				JC	BIF_ERROR		;AN000;something wrong?
 034D  E8 0652 R			CALL	WRITE_FROM_BUFFER	;AN000;else finish copying this file
 0350  73 00				JNC	BIF_EXIT	   ;AN000;
 0352				BIF_ERROR:		;AN000;
									;what happened?
 0352				BIF_EXIT:		;AN000;
 0352  C3				RET		       ;AN000;
 0353				BIG_FILE ENDP		;AN000;
				;
 0353				MAKE_HEADER PROC NEAR	;AN000;
				;When called by READ_A_FILE after the data had been read into the buffer, this
				;routine will put the header which is just below the data area where the
				;current BUFFER_PTR points.  The header is 32 (2 para) byte long. And this
				;routine will also call SET_BUFFER_PTR to set the BUFFER_PTR, BUFFER_LEFT
				;for the next process.
				;If called by TREE_COPY for a SUBDIRECTORY handle, this routine should
				;check the BUFFER_LEFT (when called by READ_A_FILE, the caller is assumed
				;to check the size of buffer_left before calling.)  In this case, this
				;routine will set the next BUFFER_PTR, BUFFER_LEFT, OLD_BUFFER_PTR
				;instead of SET_BUFFER_PTR routine.
				;Informations are obtained from the DTA area (for file - FILE_DTA.xxx
				;dir - DS:[BP].xxx ) and stored into the header by referencing ES:field;s name.
				;DS - Program Data area
				;ES - will be used for a header segment in the buffer.
				;
 0353  06				PUSH	ES			;AN000;save ES
 0354  50				PUSH	AX   ;AN000;
				
 0355				MH_AGAIN:  ;AN000;
 0355  A1 01C9 R			MOV	AX,BUFFER_PTR		;AN000;buffer_ptr is a segment
 0358  8E C0				MOV	ES, AX			;AN000;now, ES is a header seg.
				;
 035A  A1 01D3 R			MOV	AX, PARA_OF_HDR 	;AN005;GET THE HEADER SIZE (para.)
 035D  39 06 01C7 R			CMP	BUFFER_LEFT,AX		;AC005;buffer_left=less than NEEDED?
 0361  73 07				JAE	MH_START	;AN000;
 0363  E8 0652 R			CALL	WRITE_FROM_BUFFER	;AN000;if so, flush buffer
 0366  72 64				JC	MH_ERROR_BRIDGE 	;AN000;write error?
 0368  EB EB				JMP	SHORT MH_AGAIN		;AN000;reinitialize ES to new buffer ptr
 036A				MH_START:	     ;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-48


 036A  F6 06 01B3 R 02			TEST	MY_FLAG, FINDFILE_FLAG	;AN000;identify caller.
 036F  75 5E				JNZ	MH_FILE 		;AN000;if a file, jmp to MH_FILE
									;else deals with directory.
 0371  26: C6 06 0000 00		MOV	ES:CONTINUE_INFO, 0	;AN000;not a continuation.
 0377  A1 01CD R			MOV	AX,OLD_BUFFER_PTR   ;AN000;
 037A  26: A3 0003			MOV	ES:BEFORE_PTR, AX	;AN000;set before_ptr in header
 037E  A1 01C9 R			MOV	AX,BUFFER_PTR	  ;AN000;
 0381  A3 01CD R			MOV	OLD_BUFFER_PTR, AX	;AN000;set variable OLD_BUFFER_PTR
 0384  03 06 01D3 R			ADD	AX,PARA_OF_HDR		;AC005;AX = BUFFER_PTR+HEADER(para)
 0388  A3 01C9 R			MOV	BUFFER_PTR, AX		;AN000;set new BUFFER_PTR
 038B  26: A3 0001			MOV	ES:NEXT_PTR, AX 	;AN000;set NEXT_PTR in the header
 038F  A1 01D3 R			MOV	AX, PARA_OF_HDR 	;AN005;GET THE HEADER SIZE (para.)
 0392  29 06 01C7 R			SUB	BUFFER_LEFT,AX		;AC005;adjust BUFFER_LEFT
 0396  39 06 01C7 R			CMP	BUFFER_LEFT,AX		;AC005;less than HEADER SIZE (para) ?
				;	$IF	B
 039A  73 06				JNB $$IF6	    ;AN000;
 039C  C7 06 01C7 R 0000		    MOV     BUFFER_LEFT, 0	;AN000;indicate buffer_full
				;	$ENDIF
 03A2				$$IF6:			    ;AN000;
 03A2  A0 014F R			MOV	AL, S_DEPTH	       ;AN000;
 03A5  26: A2 0005			MOV	ES:DIR_DEPTH, AL	;AN000;now save other info's
 03A9  3E: 8A 46 15			MOV	AL, DS:[BP].DTA_ATTRIBUTE;AN000;
 03AD  26: A2 0008			MOV	ES:ATTR_FOUND, AL	;AN000;in this case, DIR
 03B1  A0 0161 R			MOV	AL, BYTE PTR T_DRV;AN000;
 03B4  26: A2 0011			MOV	ES:TARGET_DRV_LET, AL	;AN000;mov target drive letter
 03B8  26: C6 06 0012 3A		MOV	ES:TARGET_DRV_LET+1, DRV_delim ;AN000; ':'
 03BE  B9 000D				MOV	CX, 13			       ;AN000;
 03C1  8D 76 1E				LEA	SI, [BP].DTA_FILENAME	;AN000;DS:SI
 03C4  BF 0013				MOV	DI, OFFSET ES:FILENAME_FOUND ;AN000;ES:DI
 03C7  F3/ A4				REP	MOVSB			;AN000;mov sting until cx = 0
 03C9  E9 0482 R			JMP	MH_EXIT ;AN000;
 03CC  E9 047A R		MH_ERROR_BRIDGE: JMP MH_ERROR;AN000;
 03CF				MH_FILE:				;AN000;handles a file header hereafter.
 03CF  F6 06 01B4 R 01			TEST	FILE_FLAG, CONT_FLAG	;AN000;continuation?
 03D4  74 17				JZ	MH_WHOLE_FILE		;AN000;no, just a whole file
 03D6  F6 06 01B4 R 02			TEST	FILE_FLAG, EOF_FLAG	;AN000;Eof flag set?
 03DB  75 19				JNZ	MH_CONT_END		;AN000;yes, must be end of continuation
 03DD  F6 06 01B4 R 04			TEST	FILE_FLAG, BIG_FILE_FLAG ;AN000;Is this a big file?
 03E2  75 1B				JNZ	MH_BIG			;AN000;yes
 03E4  26: C6 06 0000 01		MOV	ES:CONTINUE_INFO, 1	;AN000;else small file continuation.
 03EA  EB 19 90				JMP	MH_A_FILE	    ;AN000;
 03ED				MH_WHOLE_FILE:		 ;AN000;
 03ED  26: C6 06 0000 00		MOV	ES:CONTINUE_INFO, 0 ;AN000;
 03F3  EB 10 90				JMP	MH_A_FILE	    ;AN000;
 03F6				MH_CONT_END:		 ;AN000;
 03F6  26: C6 06 0000 03		MOV	ES:CONTINUE_INFO, 3 ;AN000;
 03FC  EB 07 90				JMP	MH_A_FILE	    ;AN000;
 03FF				MH_BIG: 		 ;AN000;
 03FF  26: C6 06 0000 02		MOV	ES:CONTINUE_INFO, 2 ;AN000;
 0405				MH_A_FILE:		 ;AN000;
 0405  A1 01ED R			MOV	AX,FILE_DTA.DTA_FILE_TIME;AN000;
 0408  26: A3 0009			MOV	ES:FILE_TIME_FOUND, AX;AN000;
 040C  A1 01EF R			MOV	AX, FILE_DTA.DTA_FILE_DATE;AN000;
 040F  26: A3 000B			MOV	ES:FILE_DATE_FOUND, AX;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-49


 0413  A1 01F1 R			MOV	AX, FILE_DTA.DTA_FILE_SIZE_LOW;AN000;
 0416  26: A3 000D			MOV	ES:LOW_SIZE_FOUND, AX;AN000;
 041A  A1 01F3 R			MOV	AX, FILE_DTA.DTA_FILE_SIZE_HIGH;AN000;
 041D  26: A3 000F			MOV	ES:HIGH_SIZE_FOUND, AX;AN000;
 0421  A0 0161 R			MOV	AL, BYTE PTR T_DRV  ;AN000;
 0424  26: A2 0011			MOV	ES:TARGET_DRV_LET, AL;AN000;
 0428  26: C6 06 0012 3A		MOV	ES:TARGET_DRV_LET+1, DRV_DELIM;AN000;
 042E  B9 000D				MOV	CX, 13		    ;AN000;
 0431  BE 01F5 R			MOV	SI, OFFSET FILE_DTA.DTA_FILENAME;AN000;
 0434  BF 0013				MOV	DI, OFFSET ES:FILENAME_FOUND;AN000;
 0437  F3/ A4				REP	MOVSB		    ;AN000;
				
				; Get Extended Attribute list of the opened file and save in attribute buff.
				
				; old method
				;	MOV	AX,INT_ORDINAL		;AN000; SET THE ORDINAL TO 0
				;	MOV	ES:QUERY_LIST,AX	;AN000; PUT IT IN THE BUFFER
				;	MOV	AX,SIZ_OF_BUFF		;AN000; SET THE SIZE TO 510 BYTES
				;	MOV	ES:BUFR_SIZ,AX		;AN000; PUT IT IN THE BUFFER
				;
				;	MOV	BX,S_HANDLE		;AN000; BX = handle
				;	MOV	AX, QUY_ATTRIB		;AN000; extended attribute code 5703H
				;	MOV	DI, OFFSET QUERY_LIST	;AN000; ES:DI-->QUERY list
				;	INT	21H			;AN000; get extended attribute list
				;
 0439  8B 1E 015F R			MOV	BX,S_HANDLE		;AN005; BX = handle
 043D  BE FFFF				MOV	SI,ALL_ATTR		;AN005; SELECT ALL ATTRIBUTES SIZE
 0440  B1 04				MOV	CL, PARAGRAPH		;AN005; PARAGRAPH = 4 FOR DIV BY 16
 0442  A1 01CF R			MOV	AX,SIZ_OF_BUFF		;AN005; GET THE SIZE EXPRESSED IN para.
 0445  D3 E0				SHL	AX, CL			;AN005; GET # OF BYTES FROM para.
 0447  8B C8				MOV	CX, AX			;AN005; NEEDS TO BE IN CX
 0449  BF 0020				MOV	DI, OFFSET ES:ATTRIB_LIST ;AN005; ES:DI = E A LIST IN BUFFER
 044C  B8 5702				MOV	AX, GET_ATTRIB		;AN005; extended attribute code 5702H
 044F  CD 21				INT	21H			;AN005; get extended attribute list
				
				;	JC	MH_ERROR		;AN000; jump if error
				
 0451  A1 01CD R			MOV	AX, OLD_BUFFER_PTR;AN000;
 0454  26: A3 0003			MOV	ES:BEFORE_PTR, AX;AN000;
 0458  A1 01BB R			MOV	AX, ACT_BYTES;AN000;
 045B  26: A3 0006			MOV	ES:CX_BYTES, AX;AN000;
 045F  E8 0624 R			CALL	SET_BUFFER_PTR		;AN000;set buffer_ptr for next. AX is already set.
 0462  A1 01C9 R			MOV	AX, BUFFER_PTR	 ;AN000;
 0465  26: A3 0001			MOV	ES:NEXT_PTR, AX 	;AN000;next buffer_ptr is next_ptr
 0469  A0 014F R			MOV	AL, S_DEPTH	 ;AN000;
 046C  26: A2 0005			MOV	ES:DIR_DEPTH, AL	;AN000;same as source depth
 0470  A0 01EC R			MOV	AL, FILE_DTA.DTA_ATTRIBUTE;AN000;
 0473  26: A2 0008			MOV	ES:ATTR_FOUND, AL	;AN000;attribute found
 0477  EB 09 90				JMP	MH_EXIT 		;AN000;
 047A				MH_ERROR:      ;AN000;
 047A  80 0E 01B5 R 01			OR	COPY_STATUS, OPEN_ERROR_FLAG ;AN000;
 047F  E8 082E R			CALL	EXTENDED_ERROR_HANDLER	;AN000;
 0482				MH_EXIT:		     ;AN000;
 0482  58				POP	AX			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-50


 0483  07				POP	ES			;AN000;
 0484  C3				RET			    ;AN000;
 0485				MAKE_HEADER ENDP	     ;AN000;
				;
				
 0485				OPEN_A_FILE PROC NEAR	     ;AN000;
				
				;-------------------------------------------------------------------------
				; Use extended open DOS call to open source file,
				; if successfully open, then save filehand to S_HANDLE.
				;-------------------------------------------------------------------------
				; Set  drive letter and file name pointer in parameter list
 0485  8D 36 01F5 R			LEA	SI,FILE_DTA.DTA_FILENAME ;AN005; DS:SI-->NAME TO OPEN
 0489  BA 0101				MOV	DX,OPN_FLAG		;AN000; flag = 0101H
 048C  B9 0000				MOV	CX,OPN_ATTR		;AN000; attribute = 0
 048F  BB 0002				MOV	BX,OPN_MODE		;AN000; open mode = 0002H
 0492  BF FFFF				MOV	DI, NUL_LIST		;AN005; ES:DI = -1
 0495  B8 6C00				MOV	AX, Ext_Open		;AN000; = 6Ch
 0498  CD 21				INT	21H			;AN000; OPEN SOURCE FILE
				
 049A  72 0A				JC	OF_ERROR;AN000;
 049C  A3 015F R			MOV	S_HANDLE, AX		;AN000;save filehandle
 049F  FF 06 01D5 R			INC	OPEN_FILE_COUNT 	;AN005;UPDATE THE OPEN FILE COUNTER
				
				
 04A3  EB 09 90				JMP	OF_EXIT 		;AN000; exit
				
 04A6				OF_ERROR:      ;AN000;
 04A6  80 0E 01B5 R 01			OR	COPY_STATUS, OPEN_ERROR_FLAG;AN000;
 04AB  E8 082E R			CALL	EXTENDED_ERROR_HANDLER;AN000;
 04AE				OF_EXIT:       ;AN000;
 04AE  C3				RET	      ;AN000;
 04AF				OPEN_A_FILE ENDP;AN000;
				;
				
				
 04AF				CMP_FILE_FFD0h PROC NEAR;AN000;
				;check whether the filesize in HIGH_FILE_SIZE, LOW_FILE_SIZE is bigger than
				;0FFD0h.  If it is, then set FILE_BIGGER_FLAG, else reset it.
 04AF  83 3E 01BD R 00			CMP	HIGH_FILE_SIZE, 0;AN000;
				;	$IF	E,AND
 04B4  75 0E				JNE $$IF8     ;AN000;
 04B6  83 3E 01BF R D0			CMP	LOW_FILE_SIZE, 0FFD0h;AN000;
				;	$IF	BE
 04BB  77 07				JNBE $$IF8    ;AN000;
 04BD  80 26 01B4 R F7			    AND     FILE_FLAG, RESET_FILE_BIGGER ;AN000;filesize <= 0FFD0h
				;	$ELSE
 04C2  EB 05				JMP SHORT $$EN8 			 ;AN000;
 04C4				$$IF8:					  ;AN000;
 04C4  80 0E 01B4 R 08			    OR	    FILE_FLAG, FILE_BIGGER_FLAG   ;AN000;
				;	$ENDIF
 04C9				$$EN8:					  ;AN000;
 04C9  C3				RET					 ;AN000;
 04CA				CMP_FILE_FFD0h ENDP			  ;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-51


				;
				
 04CA				CALC_FILE_SIZE PROC NEAR		  ;AN000;
				;subtract the bytes read (ACT_BYTES) from the filesize in HIGH_FILE_SIZE,
				;LOW_FILE_SIZE.
 04CA  A1 01BB R			MOV	AX, ACT_BYTES			     ;AN000;
 04CD  29 06 01BF R			SUB	LOW_FILE_SIZE, AX		     ;AN000;
 04D1  83 1E 01BD R 00			SBB	HIGH_FILE_SIZE, 0		     ;AN000;
 04D6  C3				RET					 ;AN000;
 04D7				CALC_FILE_SIZE ENDP			  ;AN000;
				;
				
 04D7				READ_A_FILE PROC NEAR			  ;AN000;
				;read a file.
				;if after reading, AX < CX or AX = 0 the set EOF_FLAG.
				;INPUT:CX - # of bytes to read
				;      BUFFER_PTR
				;      S_HANDLE
				;OUTPUT: ACT_BYTES
				
				;	.IF < SOURCE_IN EQ NO > AND
				;	.IF < DEST EQ 3 >
				;	   CALL GET_SOURCE
				;	.ENDIF
				
 04D7  1E				PUSH	DS			;AN000;save program data seg
 04D8  B4 3F				MOV	AH, Read;AN000;
 04DA  8B 1E 015F R			MOV	BX, S_HANDLE;AN000;
 04DE  8B 16 01C9 R			MOV	DX, BUFFER_PTR		;AN000;current buffer header seg
 04E2  03 16 01D3 R			ADD	DX, PARA_OF_HDR 	;AC005;skip the header part
 04E6  8E DA				MOV	DS, DX			;AN000;now DS = buffer_ptr + 2, data area
 04E8  33 D2				XOR	DX, DX			;AN000;offset DX = 0
 04EA  CD 21				INT	21H	 ;AN000;
 04EC  1F				POP	DS			;AN000;restore program data area
 04ED  72 10				JC	RF_ERROR		;AN000;read error?
 04EF  3B C1				CMP	AX, CX	 ;AN000;
 04F1  74 05				JE	RF_OK	  ;AN000;
 04F3  80 0E 01B4 R 02			OR	FILE_FLAG, EOF_FLAG	;AN000;EOF reached. AX = 0 or AX < CX
 04F8				RF_OK:			;AN000;
 04F8  F8				CLC				;AN000;clear carry caused from CMP
 04F9  A3 01BB R			MOV	ACT_BYTES, AX		;AN000;save actual bytes read
 04FC  EB 09 90				JMP	RF_EXIT        ;AN000;
 04FF				RF_ERROR:	    ;AN000;
 04FF  80 0E 01B5 R 02			OR	COPY_STATUS, READ_ERROR_FLAG;AN000;
 0504  E8 082E R			CALL	EXTENDED_ERROR_HANDLER;AN000;
 0507				RF_EXIT:	    ;AN000;
 0507  C3				RET		   ;AN000;
 0508				READ_A_FILE ENDP    ;AN000;
				;
				
 0508				FIND_IT PROC	NEAR   ;AN000;
				;set first or next depending on FIND_FIRST_FLAG.
				;once called, reset FIND_FIRST_FLAG.
 0508  F6 06 01B3 R 01			TEST	MY_FLAG, FIND_FIRST_FLAG;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-52


				;	$IF	NZ			;yes
 050D  74 04				JZ $$IF11	   ;AN000;
 050F  B4 4E				    MOV     AH, Find_First;AN000;
				;	$ELSE
 0511  EB 02				JMP SHORT $$EN11   ;AN000;
 0513				$$IF11: 	    ;AN000;
 0513  B4 4F				    MOV     AH, Find_Next;AN000;
				;	$ENDIF
 0515				$$EN11: 	    ;AN000;
 0515  80 26 01B3 R FE			AND	MY_FLAG, RESET_FIND_FIRST ;AN000;reset FIND_FIRST_FLAG
 051A  CD 21				INT	21H			  ;AN000;
 051C  C3				RET			      ;AN000;
 051D				FIND_IT ENDP		       ;AN000;
				;
 051D				FIND_FILE PROC	NEAR		;AN000;
				;find a file
				;set NO_MORE_FILE if carry.
				;	$SEARCH
				
				;	PUSH	DS
				;	MOV	DX,DATA
				;	MOV	DS,DX
				;	.IF < SOURCE_IN EQ NO > AND
				;	.IF < DEST EQ 3 >
				;	   CALL GET_SOURCE
				;	.ENDIF
				;	POP	DS
				
 051D				$$DO14: 		       ;AN000;
 051D  F6 06 01B3 R 01			    TEST    MY_FLAG, FIND_FIRST_FLAG ;AN000;find first ?
				;	    $IF     NZ
 0522  74 09				    JZ $$IF15			     ;AN000;
 0524  BA 0152 R				MOV	DX, OFFSET S_FILE		;AN000;
 0527  8B 0E 01B0 R				MOV	CX, File_Search_Attr ;AN000;normal = 0
				;	    $ELSE
 052B  EB 03				    JMP SHORT $$EN15	  ;AN000;
 052D				$$IF15: 		   ;AN000;
 052D  BA 01D7 R				MOV	DX, OFFSET FILE_DTA  ;AN000;
				;	    $ENDIF
 0530				$$EN15: 		   ;AN000;
 0530  E8 0508 R			    CALL    FIND_IT	  ;AN000;
				;	$EXITIF C
 0533  73 07				JNC $$IF14		  ;AN000;
 0535  80 0E 01B3 R 04			    OR	    MY_FLAG, NO_MORE_FILE ;AN000;no more file in this directory
				;	$ORELSE
 053A  EB 16				JMP SHORT $$SR14		 ;AN000;
 053C				$$IF14: 			  ;AN000;
 053C  C6 06 00F9 R 01			    MOV     FOUND_FILE_FLAG, 1	;AN000;set the flag for "File not found" msg.
 0541  80 0E 01B3 R 20			    OR	    MY_FLAG,  FOUND_FLAG	 ;AN000; SAR
				;;;;;;;     CALL    FILTER_FILES	;found. filter it with options
 0546  F6 06 01B3 R 20			    TEST    MY_FLAG, FOUND_FLAG  ;AN000;
				;	$ENDLOOP NZ			;if found, leave this loop else start again
 054B  74 D0				JZ $$DO14			 ;AN000;
 054D  80 26 01B3 R FB			    AND     MY_FLAG, RESET_NO_MORE;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-53


				;	$ENDSRCH
 0552				$$SR14: 			  ;AN000;
 0552  C3				RET				 ;AN000;
 0553				FIND_FILE ENDP			  ;AN000;
				;
 0553				SET_MY_DTA PROC NEAR		  ;AN000;
				;set DS:DX for find_first(next). If MY_FLAG is set to FINDFILE_FLAG then
				;set it to the offset FILE_DTA, otherwise to BP.
				;DS should be set to the area whre FILE_DTA, DTAS are.
 0553  52				PUSH	DX			;AN000;save current DX
 0554  F6 06 01B3 R 02			TEST	MY_FLAG, FINDFILE_FLAG	;AN000;handling file?
				;	$IF	NZ
 0559  74 05				JZ $$IF22		    ;AN000;
 055B  BA 01D7 R			    MOV     DX, OFFSET FILE_DTA;AN000;
				;	$ELSE
 055E  EB 02				JMP SHORT $$EN22	    ;AN000;
 0560				$$IF22: 		     ;AN000;
 0560  8B D5				    MOV     DX, BP	    ;AN000;
				;	$ENDIF
 0562				$$EN22: 		     ;AN000;
 0562  B4 1A				MOV	AH, Set_DTA		;AN000;
 0564  CD 21				INT	21H			;AN000;
 0566  5A				POP	DX			;AN000;
 0567  C3				RET			    ;AN000;
 0568				SET_MY_DTA ENDP 	     ;AN000;
				;
				;
 0568				SAVE_DTA PROC NEAR	     ;AN000;
				; Save old DTA address
 0568  06				PUSH	ES		       ;AN000;
 0569  53				PUSH	BX		       ;AN000;
 056A  B4 2F				MOV	AH, Get_DTA		;AN000;
 056C  CD 21				INT	21H			;AN000;
 056E  8C 06 00F1 R			MOV	OLD_DTA_SEG,ES		;AN000;
 0572  89 1E 00F3 R			MOV	OLD_DTA_OFF,BX		;AN000;
 0576  5B				POP	BX			;AN000;
 0577  07				POP	ES			;AN000;
 0578  C3				RET			    ;AN000;
 0579				SAVE_DTA ENDP		     ;AN000;
				;
				;
 0579				SWITCH_DTAS PROC NEAR	     ;AN000;
				; SWITCH DTA ADDRESSES
 0579  1E				 PUSH DS		    ;AN000;
 057A  52				 PUSH DX		    ;AN000;
 057B  FF 36 00F1 R			 PUSH OLD_DTA_SEG	    ;AN000;
 057F  FF 36 00F3 R			 PUSH OLD_DTA_OFF	    ;AN000;
 0583  E8 0568 R			 CALL SAVE_DTA		    ;AN000;
 0586  5A				 POP  DX		    ;AN000;
 0587  1F				 POP  DS		    ;AN000;
 0588  B4 1A				 MOV  AH, Set_DTA	    ;AN000;
 058A  CD 21				 INT  21H		    ;AN000;
 058C  5A				 POP  DX		    ;AN000;
 058D  1F				 POP  DS		    ;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-54


 058E				SWITCH_DTAS ENDP	     ;AN000;
				;
				;
 058E				CHANGE_T_DIR PROC NEAR	     ;AN000;
				;change target dir according to t_drv_path.
				;Since this routine is called by WRITE_FROM_BUFFER and DS now points
				;to buffer area while ES points to the program data area, we set DS
				;to data seg again here for the function call Chdir.
 058E  1E				PUSH	DS			;AN000;save current buffer seg
 058F  06				PUSH	ES			;AN000;currentpy es is a data seg
 0590  1F				POP	DS			;AN000;restore DS value as program data seg
				
 0591  80 3E 0163 R 00			CMP	T_DRV[2], 0		;AN000;LAST_DIR_OUT took '\' out?
				;	$IF	E
 0596  75 0A				JNE $$IF25	 ;AN000;
 0598  C6 06 0163 R 5C			    MOV     T_DRV[2], '\'       ;AN000;then put it back for root dir
 059D  C6 06 0164 R 00			    MOV     T_DRV[3], 0 	;AN000;
				;	$ENDIF
 05A2				$$IF25: 			 ;AN000;
				
 05A2  BA 0161 R			MOV	DX, OFFSET T_DRV_PATH	    ;AN000;
 05A5  B4 3B				MOV	AH, CHDIR		    ;AN000;
 05A7  CD 21				INT	21H			    ;AN000;
				
 05A9  1F				POP	DS			;AN000;restore caller's DS value
 05AA  C3				RET	 ;AN000;
 05AB				CHANGE_T_DIR ENDP;AN000;
				;
				
 05AB				CMP_FILESIZE_TO_BUFFER_LEFT PROC NEAR;AN000;
				;Compare buffer_left (paragraph) with filesize (high_file_size, low_file_size.)
				;if filesize is bigger than buffer_left, then set FILE_BIGGER_FLAG
				;indicating filesize > buffer_left.
 05AB  52				PUSH	DX  ;AN000;
 05AC  50				PUSH	AX  ;AN000;
				
 05AD  83 3E 01D5 R 00			CMP	OPEN_FILE_COUNT,NUL	;AN005;ARE THERE ANY OPEN FILES
				;	$IF	Z			;AN005;NO, THEN GO AHEAD AND OPEN
 05B2  75 32				JNZ	$$IF28A 	    ;AN000;
 05B4  E8 0485 R			    CALL    OPEN_A_FILE 	;AN005;OPEN A FILE USING FILE_DTA
				
				; Get extended Attribute list size.
				
 05B7  8B 1E 015F R			    MOV     BX,S_HANDLE 	;AN005; BX = handle
 05BB  B8 5702				    MOV     AX, GET_ATTRIB	;AN005; extended attribute code 5702H
 05BE  BE FFFF				    MOV     SI,ALL_ATTR 	;AN005; SELECT ALL ATTRIBUTES SIZE
 05C1  33 C9				    XOR     CX,CX		;AN005; JUST QUERY SIZE NEEDED
 05C3  BF FFFF				    MOV     DI, OFFSET NUL_LIST ;AN005; DI = LIST FOR NO DATA RETURNED
 05C6  CD 21				    INT     21H 		;AN005; get extended attribute SIZE
 05C8  83 C1 0F				    ADD     CX,PARA_BOUND	;AN005; TO FIGURE THE NEXT PARAGRAPH
 05CB  8B C1				    MOV     AX,CX		;AN005;
 05CD  B1 04				    MOV     CL,PARAGRAPH	;AN005; GET PARAGRAPHS (DIV BY 16)
 05CF  D3 E8				    SHR     AX,CL		;AN005;
 05D1  A3 01CF R			    MOV     SIZ_OF_BUFF,AX	;AN005;SAVE BUFF SIZE FOR THE HEADER
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-55


 05D4  05 0002				    ADD     AX,FIXD_HD_SIZ	;AN005;GET THE TOTAL HEADER SIZE
 05D7  A3 01D3 R			    MOV     PARA_OF_HDR,AX	;AN005;SAVE FOR LATER
 05DA  D3 E0				    SHL     AX, CL		;AN005;CONVERT BACK TO TOTAL BYTES
 05DC  A3 01D1 R			    MOV     BYTS_OF_HDR,AX	;AN005;SAVE FOR LATER
 05DF  8B 1E 015F R			    MOV     BX,S_HANDLE 	;AN005;
 05E3  E8 07AC R			    CALL    CLOSE_A_FILE	;AN005;CLOSE THE FILE OPENED
				;	$ENDIF
 05E6				$$IF28A:		  ;AN000;
				
 05E6  80 26 01B4 R F7			AND	FILE_FLAG, RESET_FILE_BIGGER;AN000;
 05EB  A1 01D3 R			MOV	AX,PARA_OF_HDR		;AN005;GET THE HEADER SIZE (para.)
 05EE  39 06 01C7 R			CMP	BUFFER_LEFT,AX		;AC005;buffer_left >= HEADER SIZE
				;	$IF	AE
 05F2  72 28				JNAE $$IF27	    ;AN000;
 05F4  A1 01C7 R			    MOV     AX, BUFFER_LEFT	;AN000;buffer_left in para
 05F7  2B 06 01D3 R			    SUB     AX,PARA_OF_HDR	;AC005;consider header size in advance
 05FB  B9 0010				    MOV     CX, 16	   ;AN000;
 05FE  F7 E1				    MUL     CX			;AN000;* 16. result in DX;AX
 0600  39 16 01BD R			    CMP     HIGH_FILE_SIZE, DX;AN000;
				;	    $IF     A			;if high_filesize > dx
 0604  76 07				    JNA $$IF28	 ;AN000;
 0606  80 0E 01B4 R 08				OR	FILE_FLAG, FILE_BIGGER_FLAG;AN000;
				;	    $ELSE
 060B  EB 0D				    JMP SHORT $$EN28;AN000;
 060D				$$IF28: 	  ;AN000;
				;		$IF	E
 060D  75 0B					JNE $$IF30	;AN000;
 060F  39 06 01BF R				    CMP     LOW_FILE_SIZE, AX;AN000;
				;		    $IF     A
 0613  76 05					    JNA $$IF31	;AN000;
 0615  80 0E 01B4 R 08					OR	FILE_FLAG, FILE_BIGGER_FLAG;AN000;
				;		    $ENDIF
 061A				$$IF31: 	  ;AN000;
				;		$ENDIF
 061A				$$IF30: 	  ;AN000;
				;	    $ENDIF
 061A				$$EN28: 	  ;AN000;
				;	$ELSE
 061A  EB 05				JMP SHORT $$EN27 ;AN000;
 061C				$$IF27: 	  ;AN000;
 061C  80 0E 01B4 R 08			    OR	    FILE_FLAG, FILE_BIGGER_FLAG ;AN000;buffer_left < 2
				;	$ENDIF
 0621				$$EN27: 				;AN000;
 0621  58				POP	AX				   ;AN000;
 0622  5A				POP	DX				   ;AN000;
 0623  C3				RET				       ;AN000;
 0624				CMP_FILESIZE_TO_BUFFER_LEFT ENDP	;AN000;
				;
				
 0624				SET_BUFFER_PTR PROC NEAR		;AN000;
				;set BUFFER_PTR, BUFFER_LEFT, OLD_BUFFER_PTR in paragraph boundary
				;to be used when reading a file into buffer.
				;this routine uses current BUFFER_PTR to figure out the next BUFFER_PTR.
				;So, at initialization time set BUFFER_PTR to CS, and set AX to the offset
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-56


				;of INIT,  then thr resultant BUFFER_PTR indicates the BUFFER_BASE and
				;OLD_BUFFER_PTR indicates CS.(This means if old_buffer_ptr = cs, then
				;it is the start of buffer)
				;To get the next BUFFER_PTR during multi-copy, just set the AX to the
				;number of bytes read. This routine will add 32 bytes for header size and
				;will set the next BUFFER_PTR.
				;input: AX - offset of buffer
				;	Top_of_memory	in segment
				;	current BUFFER_PTR
				;	current OLD_BUFFER_PTR
				;	current BUFFER_LEFT
				;output: BUFFER_PTR	for next reading
				;	 OLD_BUFFER_PTR
				;	 BUFFER_LEFT (Top_of_memory - Buffer_Ptr. If it is 0, then indicates
				;		      the BUFFER is FULL.  In this case, the BUFFER_PTR is
				;		      invalid, but OLD_BUFFER_PTR keep the former buffer_ptr
				;		      value which says that it is the last header in the buffer)
				;** Currently this program support maxium top of memory in seg 0FFFF - resident
				;   area.  This routine will check the overflow case to gaurd the next buffer_ptr
				;   not to exceed FFFF.
				
 0624  51				PUSH	CX				  ;AN000;
 0625  8B 0E 01C9 R			MOV	CX, BUFFER_PTR			   ;AN000;
 0629  89 0E 01CD R			MOV	OLD_BUFFER_PTR, CX	;AN000;set old_buffer_ptr
 062D  B1 04				MOV	CL, 4		   ;AN000;
 062F  D3 E8				SHR	AX, CL			;AN000;get paragraphs
 0631  40				INC	AX			;AN000;get next paragraph
 0632  03 06 01D3 R			ADD	AX,PARA_OF_HDR		;AC005;consider header size
 0636  01 06 01C9 R			ADD	BUFFER_PTR, AX		;AN000;add this to the current buffer_ptr
				
				;	$IF	NC,AND			;not exceed 16 bit.
 063A  72 0E				JC $$IF37	    ;AN000;
 063C  A1 01C1 R			MOV	AX, Top_of_memory;AN000;
 063F  2B 06 01C9 R			SUB	AX, BUFFER_PTR		;AN000;AX = Top_of_memory - Buffer_ptr
				;	$IF	A			;if buffer_left > 0
 0643  76 05				JNA $$IF37	    ;AN000;
 0645  A3 01C7 R			    MOV     BUFFER_LEFT, AX;AN000;
				;	$ELSE
 0648  EB 06				JMP SHORT $$EN37    ;AN000;
 064A				$$IF37: 	     ;AN000;
 064A  C7 06 01C7 R 0000		    MOV     BUFFER_LEFT, 0	;AN000;indication of buffer full
				;	$ENDIF
 0650				$$EN37: 		    ;AN000;
 0650  59				POP	CX		       ;AN000;
 0651  C3				RET			   ;AN000;
 0652				SET_BUFFER_PTR ENDP	    ;AN000;
				;
				
 0652				WRITE_FROM_BUFFER PROC NEAR ;AN000;
				;Write from the first header starting at buffer_base until finishes
				;the last header which, actually, happens to be the old_buffer_ptr
				;at the time of the call.  After the writing, reset the buffer_ptr
				;to buffer_base again for the next read_into_buffer.
				;If continue_info is 1 or 2 (Continue of small, bigfile) then after
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-57


				;the creation of a target file, it will set the CREATED_FLAG.
				;This flag will be reset when it found the continue_info to be 3
				;(End of contine).
				;For convenience of use of function call, ES will be used for
				;the program data seg while DS will be used for the BUFFER seg.
				;
 0652  1E				PUSH	DS		      ;AN000;
 0653  06				PUSH	ES			;AN000;save ds, es
				
 0654  1E				PUSH	DS   ;AN000;
 0655  07				POP	ES			;AN000;set ES to program data seg
				
 0656  80 0E 01B6 R 01			OR	ACTION_FLAG, READING_FLAG ;AN000;show reading message next time
				;	AND	ES:MY_FLAG, RESET_IS_SOURCE	;now, deals with target
									;set this for change_dir
 065B  26: A1 01C3 R			MOV	AX, ES:BUFFER_BASE	 ;AN000;
 065F  8E D8				MOV	DS, AX			 ;AN000;
 0661  0E				PUSH	CS			;AN000;
 0662  58				POP	AX			 ;AN000;
 0663  26: 39 06 01CD R			CMP	ES:OLD_BUFFER_PTR, AX	;AN000;if old_buffer_ptr = CS then
									;buffer is empty. Just exit
 0668  74 1D				JE	WFB_EXIT_BRIDGE        ;AN000;
				
 066A  1E				PUSH	DS		     ;AN000;
 066B  BA ---- R			MOV	DX,DATA 	      ;AN000;
 066E  8E DA				MOV	DS,DX		      ;AN000;
					.IF < DEST eq 3 >	  ;AN000;
 0670  80 3E 0002 R 03       3						cmp DEST,3 
 0675  75 03                 6						jne $l42 
 0677  E8 01AB R			   CALL GET_DEST	  ;AN000;
					.ENDIF			  ;AN000;
 067A                        2	$l42: 
 067A  1F				POP	DS		      ;AN000;
				
 067B				WFB_CD: 		   ;AN000;
 067B  E8 058E R			CALL	CHANGE_T_DIR	     ;AN000;
 067E  72 0A				JC	WFB_ERROR_BRIDGE	;AN000;error?
 0680				WFB_CHATT:	     ;AN000;
 0680  80 3E 0008 10			CMP	DS:ATTR_FOUND, Is_subdirectory ;AN000;a subdirectory? = 10H
 0685  75 0B				JNE	WFB_FILE		;AN000;no. a file
				
 0687				WFB_CMP_DEPTH: ;AN000;
				;   SAR  
				;;;;;;;
				;	MOV	AH, ES:T_DEPTH		;yes. a subdir.
				;	CMP	DS:DIR_DEPTH, AH	;DIR_DEPTH > T_DEPTH ?
				;	JBE	WFB_DEC_DEPTH		;if not, go to parent node
				;	LEA	DI, ES:T_DRV_PATH	;else goto child node
				;	LEA	SI, DS:FILENAME_FOUND
				;	CMP	ES:T_PATH, 0		;root directory?
				;	$IF	E
				;	    MOV     AL, 0FFh		;then don't need to put delim since it is already there
				;	$ELSE
				;	    MOV     AL, Path_delim	;path_delim '\'
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-58


				;	$ENDIF
				;	CALL	CONCAT_ASCIIZ
				;	call	concat_display_path	;modify the path for display
				;	INC	ES:T_DEPTH
				;	CALL	MAKE_DIR		;try to make a new sub directory
				;	JC	WFB_EXIT_A_BRIDGE	;there exists a file with same name.
				;	MOV	AX, DS			;current buffer seg = old_buffer_ptr?
				;	CMP	ES:OLD_BUFFER_PTR, AX
				;	JNE	WFB_NEXT		;not finished yet. jmp to next
				;	OR	ES:MY_FLAG, MISSING_LINK_FLAG ;Finished. Missing link condition occurred regarding e
				mpty sub dir
				;	JMP	WFB_EXIT_A		;check archieve options.
 0687				WFB_NEXT:      ;AN000;
				;	MOV	DS, DS:NEXT_PTR 	;let's handles next header.
				;	JMP	WFB_CD			;change directory first.
 0687  EB 71 90			WFB_EXIT_BRIDGE: JMP WFB_EXIT;AN000;
 068A  EB 53 90			WFB_ERROR_BRIDGE: JMP WFB_ERROR;AN000;
 068D  EB 53 90			WFB_EXIT_A_BRIDGE: JMP WFB_EXIT_A;AN000;
 0690				WFB_DEC_DEPTH: ;AN000;
				;	LEA	DI, ES:T_DRV_PATH
				;	CALL	RM_EMPTY_DIR		;check flags and remove empty dir
				;	CALL	LAST_DIR_OUT		;take off the last dir from path
				;	call	cut_display_path	;modify path for display purpose
				;;;;;;	DEC	ES:T_DEPTH		;and decrease depth
 0690  EB E9				JMP	WFB_CD			;AN000;CHANGE DIR AND compare the depth again.
				
				
 0692				WFB_FILE:				;AN000;Handling a file
 0692  26: 80 26 01B3 R BF		AND	ES:MY_FLAG, RESET_MISSING_LINK ;AN000;if found a file, then current dir is not empty
				.
 0698  26: F6 06 01B4 R 10		TEST	ES:FILE_FLAG, CREATED_FLAG ;AN000; A file handle is created ?
 069E  75 05				JNZ	WFB_WRITE		;AN000;yes, skip create again.
 06A0  E8 071F R			CALL	CREATE_A_FILE		;AN000;create a file in the cur dir
 06A3  72 3A				JC	WFB_ERROR		;AN000;file creation error?
 06A5				WFB_WRITE:     ;AN000;
 06A5  E8 0761 R			CALL	WRITE_A_FILE;AN000;
 06A8  72 38				JC	WFB_EXIT_A		;AN000;target file has been already deleted.
 06AA  80 3E 0000 00			CMP	DS:CONTINUE_INFO, 0;AN000;
				;	$IF	E,OR			;if continue_info = 0 or 3
 06AF  74 07				JE $$LL40      ;AN000;
 06B1  80 3E 0000 03			CMP	DS:CONTINUE_INFO, 3;AN000;
				;	$IF	E
 06B6  75 18				JNE $$IF40     ;AN000;
 06B8				$$LL40: 	;AN000;
 06B8  26: 8B 1E 01A5 R			    MOV     BX, ES:T_HANDLE;AN000;
 06BD  E8 079D R			    CALL    SET_FILE_DATE_TIME	;AN000;then set file's date, time
 06C0  1E				    PUSH    DS			;AN005;SAVE THE BUFFER PTR
 06C1  06				    PUSH    ES			;AN005;WE NEED THE DATA PTR
 06C2  1F				    POP     DS			;AN005;DS = THE DATA PTR
 06C3  E8 07AC R			    CALL    CLOSE_A_FILE	;AN000;and close the handle
 06C6  1F				    POP     DS			;AN005;DS = THE BUFFER PTR AGAIN
				;;;;;;;     CALL    RESTORE_FILENAME_FOUND ; SAR  if filename_found has been changed, restore it for
				 reset_s_archieve.
 06C7  26: 80 26 01B4 R EF		    AND     ES:FILE_FLAG, RESET_CREATED ;AN000;and reset created_flag
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-59


 06CD  E8 0712 R			    CALL    INC_FILE_COUNT	;AN000;increase file count
				;	$ENDIF
 06D0				$$IF40: 		    ;AN000;
 06D0  8C D8				MOV	AX, DS		       ;AN000;
 06D2  26: 39 06 01CD R			CMP	ES:OLD_BUFFER_PTR, AX	;AN000;current header is the last one?
 06D7  74 09				JE	WFB_EXIT_A		;AN000;then exit
 06D9  8E 1E 0001			MOV	DS, DS:NEXT_PTR 	;AN000;else set ds to the next ptr
 06DD  EB A1				JMP	WFB_CHATT		;AN000;handle the next header
 06DF				WFB_ERROR:	;AN000;
 06DF  E9 005B R			jmp	main_exit		;AN000;meaningful when MKDIR failed because
									;of there already exist same named file,
									;or disk_full case.
 06E2				WFB_EXIT_A:	;AN000;
 06E2  26: F6 06 01B8 R 08		test	ES:option_flag, slash_m ;AN000;hard archieve ? - turn off source archieve bit.
 06E8  74 00				jz	wfb_exit_B		;AN000;no, chk error flag and exit
				;;;;	call	reset_s_archieve	; SAR reset source file(s) archieve bit using header info(s)
				.
 06EA				WFB_EXIT_B:	;AN000;
 06EA  26: F6 06 01B5 R 10		test	ES:copy_status, mkdir_error_flag ;AN000;mkdir error happened?
 06F0  75 ED				JNZ	WFB_ERROR		;AN000;yes, exit
 06F2  26: F6 06 01B5 R 80		test	ES:copy_status, disk_full_flag ;AN000;disk full happened?
 06F8  75 E5				JNZ	WFB_ERROR		;AN000;yes, exit
 06FA				WFB_EXIT:	;AN000;
 06FA  26: 8C 0E 01CD R			MOV	ES:OLD_BUFFER_PTR, CS	;AN000;set old_buffer_ptr to CS
 06FF  26: A1 01C3 R			MOV	AX, ES:BUFFER_BASE    ;AN000;
 0703  26: A3 01C9 R			MOV	ES:BUFFER_PTR, AX	;AN000;set buffer_ptr to base
 0707  26: A1 01C5 R			MOV	AX, ES:MAX_BUFFER_SIZE;AN000;
 070B  26: A3 01C7 R			MOV	ES:BUFFER_LEFT, AX	;AN000;set buffer_left
 070F  07				POP	ES		   ;AN000;
 0710  1F				POP	DS		   ;AN000;
				;;;;	TEST	SYS_FLAG, ONE_DISK_COPY_FLAG ; SAR one drive letter copy?
				;  ;	$IF	NZ			     ; SAR yes
				;  ;	    CALL    CHANGE_S_DIR	     ; SAR then change current dir to s dir
				;;;;	$ENDIF
 0711  C3				RET		       ;AN000;
 0712				WRITE_FROM_BUFFER ENDP	;AN000;
				;
 0712				INC_FILE_COUNT PROC NEAR;AN000;
				;increase the file count by one.
				;increase file_cnt_low, file_cnt_high.
				;input: DS - buffer
				;	ES - data seg
 0712  26: FF 06 00F5 R			INC	ES:FILE_CNT_LOW    ;AN000;
 0717  75 05				JNZ	IFC_EXIT	   ;AN000;
 0719  26: FF 06 00F7 R			INC	ES:FILE_CNT_HIGH	;AN000;if carry over, then inc file_cnt_high
 071E				IFC_EXIT:	      ;AN000;
 071E  C3				RET		     ;AN000;
 071F				INC_FILE_COUNT ENDP   ;AN000;
				;
 071F				CREATE_A_FILE PROC NEAR;AN000;
				;create a file in the header and return the file handle in T_HANDLE.
				;Set CREATED_FLAG.  This will be reset by WRITE_FROM_BUFFER when it
				;close the handle.
				;this routine will check the T_FILENAME and T_TEMPLATE if any target
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-60


				;filename has been entered.  If T_FILENAME is there, then DX will
				;points to this (This is the case when the user has specified non_global
				;chr filename and any source filename be changed to this name.)
				;If T_TEMPLATE is present, then modify the filename found in the
				;header part.
				;Also, this routine show copy messages just before a file creation using
				;FILENAME_FOUND.
				;ES - data seg
				;DS - buffer seg
				
 071F  1E				PUSH	DS		;AN000;
 0720  06				PUSH	ES		;AN000;
				
				;    SAR 			;save the original filename from the header
				;;;;;	MOV	CX, 13			;max 13 chr
				;	LEA	SI, DS:FILENAME_FOUND	;original source file name
				;	LEA	DI, ES:DISP_S_FILE	;filename to be displayed
				;	REP	MOVSB			;filename_found => disp_s_file
				;;;;;	test	es:option_flag, slash_p ; SAR
				;;;;;	$IF	Z			; SAR
				;;;;;	    CALL    SHOW_COPY_MESSAGE	; SAR  he source path, file
				;;;;;	$ENDIF				; SAR
				;
				;	CMP	ES:T_FILENAME, 0
				;	$IF	NE			;non_global target filename entered.
				;	    TEST    ES:COPY_STATUS, MAYBE_ITSELF_FLAG
				;	    $IF     NZ
				;		LEA	SI, DS:FILENAME_FOUND
				;		LEA	DI, ES:T_FILENAME
				;		CALL	COMP_FILENAME	;compare it. if same then show
				;					;file cannot be copied onto itself and
				;					;abort
				;	    $ENDIF
				;
				;	    CALL    SWITCH_DS_ES	;now ds - data, es - buffer
				;	    MOV     CX, 13
				;	    LEA     SI, DS:T_FILENAME
				;	    LEA     DI, ES:FILENAME_FOUND
				;	    REP     MOVSB		; t_filename => filename_found
				;	    CALL    SWITCH_DS_ES	;now ds - buffer, es - data seg
				;
				;	$ELSE
				;	    CMP     ES:T_TEMPLATE, 0	;global chr target filename entered?
				;	    $IF     NE			;yes, entered. modify the filename found
				;;;;;		CALL	MODIFY_FILENAME ; SAR
				;		TEST	ES:COPY_STATUS, MAYBE_ITSELF_FLAG
				;		$IF	NZ
				;		    LEA     SI, DS:FILENAME_FOUND ;compare the Revised filename
				;		    LEA     DI, ES:DISP_S_FILE ;with original name
				;		    CALL    COMP_FILENAME ;if same, then issue error message and exit
				;		$ENDIF
				;	    $ELSE
				;		TEST	ES:COPY_STATUS, MAYBE_ITSELF_FLAG ;*.* CASE
				;		$IF	NZ
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-61


				;		    PUSH    ES
				;		    POP     DS		;ds - data seg
				;
				;					; Set message parameters
				;;;;;		    MOV     AX,MSG_COPY_ITSELF	 ; SAR
				;		    MOV     MSG_NUM,AX		 ; SAR ;AN000; set message number
				;		    MOV     SUBST_COUNT,0	 ; SAR	AN000; no message subst.
				;		    MOV     MSG_CLASS,-1	 ; SAR	AN000; message class
				;		    MOV     INPUT_FLAG,0	 ; SAR	AN000; no user input
				;		    CALL    PRINT_STDERR	 ; SAR	AN000; display error
				;		    JMP     MAIN_EXIT
				;		$ENDIF
				;	    $ENDIF
				;;;;;;	$ENDIF
				
				;-------------------------------------------------------------------------
				; Use extended open DOS call to create the target file, use attribute list
				; obtained from the previous Get Extended attribute DOS call
				;-------------------------------------------------------------------------
				
				; SET ATTRIBUTE LIST POINTER IN PARAMETER LIST
 0721  BA 0020				MOV	DX, OFFSET DS:ATTRIB_LIST ;AN005;E A BUFFER IN HEADER
 0724  26: 89 16 01A7 R			MOV	WORD PTR ES:E_A_LST,DX	;AN005; set offset
 0729  26: 8C 1E 01A9 R			MOV	WORD PTR ES:E_A_LST+WORD,DS ;AN005; set segment
				
 072E  B8 6C00				MOV	AX, Ext_Open		;AN000; = 6Ch
 0731  BA 0112				MOV	DX,CREATE_FLAG		;AN000; flag = 0111H
 0734  BB 0011				MOV	BX,CREATE_MODE		;AN000;CREATE MODE = 0011H
 0737  B9 0000				MOV	CX,CREATE_ATTR		;AN000; attribute = 0
 073A  BE 0011				MOV	SI,OFFSET TARGET_DRV_LET ;AN005; DS:SI-->NAME TO CREATE
 073D  8D 3E 01A7 R			LEA	DI,ES:PARAM_LIST	;AN005;PARAMETER LIST (ES:DI)
 0741  CD 21				INT	21H			;AN000; create file
				
 0743  72 0D				JC	CAF_ERROR		;AN000;
 0745  26: A3 01A5 R			MOV	ES:T_HANDLE, AX 	;AN000;save handle
				
				;;;;;	CALL	CHK_T_RES_DEVICE	; SAR check target handle is a reserved dev
				
 0749  26: 80 0E 01B4 R 10		OR	ES:FILE_FLAG, CREATED_FLAG ;AN000;set created_flag
 074F  EB 0D 90				JMP	CAF_EXIT		  ;AN000;
 0752				CAF_ERROR:		       ;AN000;
 0752  1E				PUSH	DS			 ;AN000;
 0753  06				PUSH	ES			 ;AN000;
 0754  1F				POP	DS			  ;AN000;
 0755  80 0E 01B5 R 04			OR	COPY_STATUS, CREATE_ERROR_FLAG;AN000;
 075A  E8 082E R			CALL	EXTENDED_ERROR_HANDLER	 ;AN000;
 075D  1F				POP	DS			  ;AN000;
 075E				CAF_EXIT:		       ;AN000;
 075E  07				POP	ES			  ;AN000;
 075F  1F				POP	DS			  ;AN000;
 0760  C3				RET			      ;AN000;
 0761				CREATE_A_FILE ENDP	       ;AN000;
				;
				;COMP_FILENAME PROC NEAR
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-62


				;;this routine is called when MAYBE_COPY_ITSELF flag in on.
				;;SI, DI asciiz string will be compared and if they are identical
				;;the show "Cannot copy onto itself" msg and jmp to main_exit.
				;;INPUT: DS - buffer
				;;	 ES - data seg
				;
				;	 CLD
				;	 MOV	 AL, 0
				;	 PUSH	 DI			 ;save DI
				;	 CALL	 STRING_LENGTH		 ;CX get the length of string
				;	 MOV	 BX, CX 		 ;now, BX got the length of the target filename entered.
				;	 PUSH	 BX			 ;save BX
				;	 PUSH	 ES			 ;save ES
				;
				;	 PUSH	 DS
				;	 POP	 ES			 ;now ES set to DS
				;	 PUSH	 SI
				;	 POP	 DI			 ;now DI points to the source filename found.
				;
				;	 MOV	 AL, 0
				;	 CALL	 STRING_LENGTH		 ;CX got the length of the string
				;
				;	 POP	 ES			 ;restore ES
				;	 POP	 BX			 ;restore BX
				;	 POP	 DI			 ;restore DI
				; ;;
				;	 CMP	 BX, CX 		 ;COMPARE LENGTH
				;	 JNE	 CF_EXIT		 ;IF THEY ARE DIFFERENT, EXIT
				;
				;	 REPE	 CMPSB			 ;compare SI, DI until not equal,
				;	 CMP	 CX, 0			 ;finish at cx = 0?
				;	 JE	 CF_SAME
				;	 JMP	 SHORT CF_EXIT
				;CF_SAME:
				;	 PUSH	 ES
				;	 POP	 DS			 ;ds = data seg
				;
				;; Set message parameters
				;;;;;;	 MOV	 AX,MSG_COPY_ITSELF	 ; SAR ;AN000; message number
				;;	 MOV	 MSG_NUM,AX		 ; SAR	AN000; set message number
				;;	 MOV	 SUBST_COUNT,0		 ; SAR	AN000; no message substitution
				;;	 MOV	 MSG_CLASS,-1		 ; SAR	AN000; message class
				;;;	  MOV	  INPUT_FLAG,0		  ; SAR  AN000; no input
				;;	 CALL	 PRINT_STDERR		 ; SAR	AN000; display error message
				;	 JMP	 MAIN_EXIT
				;CF_EXIT:
				;	 RET
				;COMP_FILENAME ENDP
				;;
 0761				WRITE_A_FILE PROC NEAR	       ;AN000;
				;write a file from the data area in the buffer.
				;Remember the caller is WRITE_FROM_BUFFER which use ES for
				;the program data area and DS for the header in the buffer.
 0761  B4 40				MOV	AH, Write		;AN000; = 40h
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-63


 0763  26: 8B 1E 01A5 R			MOV	BX, ES:T_HANDLE 	;AN000;handle saved in the program data area
 0768  26: 8B 16 01D1 R			MOV	DX, ES:BYTS_OF_HDR	;AC005;skip header
 076D  8B 0E 0006			MOV	CX, DS:CX_BYTES 	;AN000;get the # from the header
 0771  CD 21				INT	21h		 ;AN000;
 0773  72 09				JC	WAF_ERROR		;AN000;write error
 0775  3B 06 0006			CMP	AX, DS:CX_BYTES;AN000;
 0779  75 14				JNE	WAF_DISKFULL;AN000;
 077B  EB 1F 90				JMP	WAF_EXIT  ;AN000;
 077E				WAF_ERROR:     ;AN000;
 077E  E8 0835 R			CALL	CLOSE_DELETE_FILE	;AN000;close delete troubled file
 0781  80 0E 01B5 R 08			OR	COPY_STATUS, WRITE_ERROR_FLAG;AN000;
 0786  E8 0849 R			CALL	SWITCH_DS_ES		;AN000;DS = DATA SEG, ES = BUFFER
 0789  E8 082E R			CALL	EXTENDED_ERROR_HANDLER;AN000;
 078C  E8 0849 R			CALL	SWITCH_DS_ES		;AN000;ES = DATA SEG, DS = BUFFER
 078F				WAF_DISKFULL:	    ;AN000;
				;	MOV	ERRORLEVEL, 4		; SAR ;set errorlevel
				
				; Set message parameters
				; Target disk full, critical error
				
 078F  1E				PUSH	DS			;AN000;DS = BUFFER
 0790  06				PUSH	ES			;AN000;ES = DATA SEG
 0791  1F				POP	DS			;AN000;ES => DS = DATA SEG
				;;;;;	MOV	AX,MSG_DISK_FULL	; SAR	  ;AN000; message number
				;	MOV	MSG_NUM,AX		; SAR	  AN000; set message number
				;	MOV	SUBST_COUNT,0		; SAR	  AN000; no message substitution
				;	MOV	MSG_CLASS,UTILITY_MSG_CLASS ; SAR AN000; message class
				;	MOV	INPUT_FLAG,0		; SAR	  AN000; no input
				;	CALL	PRINT_STDERR		; SAR	  AN000; display error message
 0792  80 0E 01B5 R 80			OR	COPY_STATUS, DISK_FULL_FLAG ;AN000;set disk_full_flag
 0797  1F				POP	DS			;AN000;RESTORE DS = BUFFER
 0798  E8 0835 R			CALL	CLOSE_DELETE_FILE;AN000;
 079B  F9				STC				;AN000;set carry and return to caller
 079C				WAF_EXIT:;AN000;
 079C  C3				RET    ;AN000;
 079D				WRITE_A_FILE ENDP;AN000;
				;
 079D				SET_FILE_DATE_TIME PROC NEAR;AN000;
				;input: BX - target file handle
				;
 079D  B4 57				MOV	AH, File_date_time	;AN000; = 57h
 079F  B0 01				MOV	AL, Set_file_time	;AN000; = 1
 07A1  8B 0E 0009			MOV	CX, DS:FILE_TIME_FOUND;AN000;
 07A5  8B 16 000B			MOV	DX, DS:FILE_DATE_FOUND;AN000;
 07A9  CD 21				INT	21h		  ;AN000;
 07AB  C3				RET		      ;AN000;
 07AC				SET_FILE_DATE_TIME ENDP;AN000;
				;
 07AC				CLOSE_A_FILE PROC NEAR ;AN000;
				;INPUT: BX - file handle to be closed
 07AC  83 3E 01D5 R 00			CMP	OPEN_FILE_COUNT,NUL	;AN005;ARE THERE ANY OPEN FILES?
				;	$IF	A			;AN005;
 07B1  76 04				JNA	$$IF42A 	    ;AN000;
 07B3  FF 0E 01D5 R			    DEC     OPEN_FILE_COUNT	;AN005;IF SO, REDUCE THE COUNT BY 1.
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-64


				;	$ENDIF				;AN005;
 07B7				$$IF42A:		     ;AN000;
 07B7  B4 3E				MOV	AH, Close	    ;AN000; = 3Eh
 07B9  CD 21				INT	21H	      ;AN000;
 07BB  C3				RET		  ;AN000;
 07BC				CLOSE_A_FILE ENDP  ;AN000;
				;
 07BC				DELETE_A_FILE PROC NEAR;AN000;
				;input: DS:DX - points to ASCIIZ string
				
 07BC  B4 41				MOV	AH, 41h 		;AN000; = 41h
 07BE  CD 21				INT	21H	  ;AN000;
 07C0  C3				RET	      ;AN000;
 07C1				DELETE_A_FILE ENDP;AN000;
				;
				;
				;CHK_DISK_FULL PROC NEAR
				;check target disk space, and if no more clusters then set carry, disk_full_flag.
				;this routine is called by MAKE_DIR routine.
				;INPUT: DS - buffer
				;	ES - data seg
				;	 PUSH	 AX
				;	 PUSH	 BX
				;	 PUSH	 CX
				;	 PUSH	 DX
				;	 MOV	 AH, 36h		 ;GET DISK FREE SPACE
				;	 MOV	 DL, ES:T_DRV_NUMBER	 ;OF TARGET
				;	 INT	 21h
				;	 CMP	 BX, 0			 ;NO MORE CLUSTER?
				;	 JE	 CDF_FULL
				;	 CLC
				;	 JMP	 SHORT CDF_EXIT
				;CDF_FULL:
				;	 OR	 ES:COPY_STATUS, DISK_FULL_FLAG ;SET DISK FULL FLAG
				;	 STC				 ;SET CARRY
				;CDF_EXIT:
				;	 POP	 DX
				;	 POP	 CX
				;	 POP	 BX
				;	 POP	 AX
				;	 RET
				;
				;CHK_DISK_FULL ENDP
				;;
				;;subttl  string_length
				;page
				;******************************************************************************
				;PURPOSE: Get the length of a string pointed by ES:DI until it encounters
				;	  the same character given by the user in AL.
				;	  The length will be an output in CX.  The number includes the
				;	  charater found.
				;	  For example, if you want to determine the length of an ASCIIZ string,
				;	  set ES:DI to that string and set AL to 0.  The output CX is the
				;	  total length of the ASCIIZ string including 0.
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-65


				;	  So, if the first character pointed by DI is the same as that of AL,
				;	  then the length will be 1.
				;	  !!! It is the user's responsibility to make it sure that the string
				;	      contains the character given in AL.  If not, unpredictable
				;	      results will occur.!!!
				;
				; DATA INPUT
				;   REGISTERS: AL - ASCII CHARACTER
				;	       ES:DI - POINTER TO THE STRING.
				; DATA OUTPUT
				;   REGISTERS: AX,DX,SI etc - PRESERVED.
				;	       BX - DISTROYED
				;	       CX - STRING LENGTH UNTIL FOUND THE GIVEN CHARACTER.
				;	       DI - POINTS TO THE NEXT CHARACTER AFTER THE STRING.
				;	       DIRECTION FLAG -  CLEARED
				;	       ZERO FLAG - RESET
				;******************************************************************************
				;
				;STRING_LENGTH PROC NEAR
				;PUBLIC  STRING_LENGTH
				;	 CLD				 ;CLEAR DIRECTION
				;	 MOV	 BX,DI			 ;SAVE ORIGINAL DI VALUE
				;	 MOV	 CX,80H 		 ;TRY MAX 128 BYTES
				;	 REPNE	 SCASB			 ;SCAN THE STRING UNTIL FOUND
				;	 PUSH	 DI			 ;SAVE CURRENT DI VALUE WHICH POINTS TO NEXT CHR AFTER STRIN
				G
				;	 SUB	 DI,BX			 ;GET THE LENGTH
				;	 MOV	 CX,DI			 ;MOV THE LENGTH TO CX
				;	 POP	 DI
				;	 RET
				;STRING_LENGTH ENDP
				;
				;subttl  concat_asciiz
				;page
				;******************************************************************************
				;PURPOSE: Concatenate two ASCIIZ string into one ASCIIZ string.
				;	  The ASCIIZ string pointed by DS:SI will be concatenated to
				;	  the one pointed by ES:DI.  The result string will be pointed by
				;	  ES:DI.
				;	  AL is used to put the delimeter character in between the strings.
				;	  If you *DON'T* like to put the delimeter ***make AL to 0FFh***.
				;	  For example, assume sting1 "ABCDE",0 pointed by DI and string2
				;	  "FGHI",0 pointed by SI.
				;	  If you want a delimeter "\" between two string, set AL to "\"
				;	  before calling.  The result will "ABCDE\FGHI",0 pointed by DI.
				;	  If you set AL to "0FFh", then it becomes "ABCDEFGHI",0.
				;	  This feature is useful for handling PATH if you set AL to "\"
				;	  and, for any general string processes if you set AL to "0FFh".
				;	  This routine will call subroutine STRING_LENGTH.
				;DATA INPUT
				;  REGISTERS: AL - DELIMETER OR 0FFh
				;	      ES:DI - POINTER TO THE DESTINATION STRING.
				;	      DS:SI - POINTER TO THE SOURCE TO BE CONCATENATED.
				;DATA OUTPUT
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-66


				;  REGISTERS: AL, DX - preserved
				;	      DI - preserved. POINTER TO THE RESULT STRING
				;	      SI - DISTROYED
				;	      CX - RESULT ASCIIZ STRING LENGTH INCLUDE 0
				;	      DIRECTION FLAG - CLEARED
				;******************************************************************************
				;CONCAT_ASCIIZ PROC NEAR
				;
				;PUBLIC  CONCAT_ASCIIZ
				;	 PUSH	 DI			 ;SAVE POINTER VALUE WHICH WILL BE RETRUNED TO CALLER.
				;	 PUSH	 AX			 ;SAVE VALUE IN AL.
				;	 MOV	 AL, 0			 ;DEALING WITH ASCIIZ STRING
				;	 CALL	 STRING_LENGTH		 ;LET DI POINTS TO THE NEXT CHR AFTER THIS STRING
				;					 ;DIRECTION WILL BE CLEARED.
				;	 DEC	 DI			 ;MAKE DI POINT TO THE LAST CHARACTER 0
				;	 POP	 AX			 ;RESTORE AL.
				;	 CMP	 AL, 0FFh
				;;	 $IF	 NE			 ;IF THE USER WANTS TO PUT DIMIMETER,
				;	 JE $$IF42
				;	     STOSB			 ;  REPLACE 0 WITH IT.
				;;	 $ELSE
				;	 JMP SHORT $$EN42
				;$$IF42:
				;	     DEC     CX 		 ;ELSE DECREASE LENGTH BY 1
				;;	 $ENDIF
				;$$EN42:
				;;	 $DO
				;$$DO45:
				;	     LODSB			 ;MOV [SI] TO AL
				;	     STOSB			 ;STORE AL TO [DI]
				;	     INC     CX 		 ;INCREASE LENGTH
				;	     CMP     AL, 0		 ;WAS IT A LAST CHARACTER?
				;;	 $ENDDO  E			 ;THEN EXIT THIS LOOP
				;	 JNE $$DO45
				;	 POP	 DI
				;	 RET
				;CONCAT_ASCIIZ ENDP
				;;
				;
				;subttl  last_dir_out
				;page
				;******************************************************************************
				;PURPOSE: Take off the last directory name from the path pointed by DI.
				;	  This routine assumes the pattern of a path to be an ASCIIZ string
				;	  in the form of "[d:][\]dir1\dir2".  Notice that this path does not
				;	  have entailing "\".   This routine will simply travel the string
				;	  until it found last "\" which will, then, be replaced with 0.
				;	  If no "\" found, then carry will be set.
				;	  *** This should be not be used for the path in the form of
				;	  *** "d:\", 0 for the root directory, since in this case the returned
				;	  *** string will be "d:",0 and AX value returned be meaningless (Just
				;	  *** points to 0.)
				;DATA INPUT
				; REGISTERS: DI - points to an ASCIIZ path string.
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-67


				;	     ES - assumed default segment for DI
				;DATA OUTPUT
				; REGISTERS: DI - points to the resultant path string.
				;	     AX - offset value of the last subdirectory name taken out, in case
				;		  of the user's need.
				;	     Other register will be unchanged.
				; CARRY FLAG WILL SET IF NOT FOUND.
				;******************************************************************************
				;
				;LAST_DIR_OUT PROC NEAR
				;PUBLIC  LAST_DIR_OUT
				;
				;	 PUSH	 DI
				;	 PUSH	 SI			 ;save current DI, SI
				;	 CLD				 ;clear direction
				;	 MOV	 SI, 0FFFFh		 ;used as a not_found flag if unchanged.
				;;	 $DO
				;$$DO47:
				;	     MOV     AL, 0
				;	     SCASB
				;;	 $LEAVE  Z			 ;if [DI] = 0, then end of string. Ends this loop.
				;	 JZ $$EN47
				;	     DEC     DI 		 ;if [DI] <> 0, then go back and scan char again
				;	     MOV     AL, "\"             ;to see it was a back slash.
				;	     SCASB
				;;	     $IF     Z			 ;if it was, then save the addr to SI.
				;	     JNZ $$IF49
				;		 PUSH	 DI
				;		 POP	 SI
				;
				;		 DEC	 SI
				;;	     $ENDIF			 ;else do loop again.
				;$$IF49:
				;;	 $ENDDO
				;	 JMP SHORT $$DO47
				;$$EN47:
				;	 CLC				 ;clear carry flag.
				;	 CMP	 SI, 0FFFFh		 ;Had SI been changed?
				;;	 $IF	 E
				;	 JNE $$IF52
				;	     STC			 ;No, set the carry. Not found.
				;;	 $ELSE
				;	 JMP SHORT $$EN52
				;$$IF52:
				;	     MOV     BYTE PTR ES:[SI], 0 ;Yes, replace "\" with 0. Seg override to get default DI se
				g.
				;	     MOV     AX, SI
				;	     INC     AX 		 ;let AX have the last dir offset value.
				;	     CLC			 ;clear carry
				;;	 $ENDIF
				;$$EN52:
				;	 POP	 SI			 ;restore original value
				;	 POP	 DI			 ;original string offset
				;	 RET
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-68


				;LAST_DIR_OUT ENDP
				;;
				;
 07C1				SET_DEFAULT_DRV PROC NEAR;AN000;
				;change source drv as a default drv for conveniece of find, read operation
				;of source. (handling target should be more specific as for as drive letter
				;goes.)
				;input: DL - drive # (0 = A, 1 = B ...)
				
 07C1  B4 0E				MOV	AH, Select_Disk 	;AN000; = 0Eh
 07C3  CD 21				INT	21H		 ;AN000;
 07C5  80 0E 01B7 R 02			OR	SYS_FLAG, DEFAULT_DRV_SET_FLAG ;AN000;indicates default drv has been changed
									;Used for exit the program to restore default drv
 07CA  C3				RET				  ;AN000;
 07CB				SET_DEFAULT_DRV ENDP		   ;AN000;
				;
 07CB				ORG_S_DEF PROC	NEAR		    ;AN000;
				;restore the original source directory.
 07CB  06				PUSH	ES			     ;AN000;
 07CC  1E				PUSH	DS			     ;AN000;
				
 07CD  1E				PUSH	DS			     ;AN000;
 07CE  07				POP	ES			;AN000;DS=ES=data seg
				
 07CF  F6 06 01B7 R 04			TEST	SYS_FLAG, DEFAULT_S_DIR_FLAG ;AN000;source default direcotry saved?
				;	$IF	NZ
 07D4  74 0C				JZ $$IF55			  ;AN000;
 07D6  BA 0064 R			    MOV     DX, OFFSET SAV_S_DRV ;AN000;saved source drive letter & directory
 07D9  B4 3B				    MOV     AH, 3Bh		 ;AN000;
 07DB  CD 21				    INT     21h 		;AN000;restore source
 07DD  80 26 01B7 R FB			    AND     SYS_FLAG, RESET_DEFAULT_S_DIR ;AN000;reset the flag
				;	$ENDIF
 07E2				$$IF55: 				   ;AN000;
				
 07E2  1F				POP	DS				      ;AN000;
 07E3  07				POP	ES				      ;AN000;
				
 07E4  C3				RET					  ;AN000;
 07E5				ORG_S_DEF ENDP				   ;AN000;
				;
 07E5				ORG_S_T_DEF PROC NEAR			   ;AN000;
				;retore original target, source and default drv and directory
				;check default_s(t)_dir_flag, default_drv_set_flag to restore source,
				;or target directory and default drive.
				
 07E5  F6 06 01B7 R 80			TEST	SYS_FLAG, TURN_VERIFY_OFF_FLAG ;AN000;turn off verify?
				;	$IF	NZ			;yes
 07EA  74 05				JZ $$IF57			    ;AN000;
 07EC  B8 2E00				    MOV     AX, 2E00h		;AN000;turn it off
 07EF  CD 21				    INT     21H        ;AN000;
				;	$ENDIF
 07F1				$$IF57: 		;AN000;
				
 07F1  F6 06 01B7 R 02			TEST	SYS_FLAG, DEFAULT_DRV_SET_FLAG ;AN000;default drive has been changed?
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-69


				;	$IF	NZ			;yes
 07F6  74 19				JZ $$IF59			    ;AN000;
 07F8  8A 16 0022 R			    MOV     DL, SAV_DEFAULT_DRV     ;AN000;
 07FC  FE CA				    DEC     DL			    ;AN000;
 07FE  E8 07C1 R			    CALL    SET_DEFAULT_DRV	;AN000;restore default drv.
				
				; Following is a fix for PTR 0000012 . The fix is to skip changing default
				; drive directory if source drive is not the default drive.
				
 0801  A0 00FA R			    MOV     AL, S_DRV_NUMBER	;AN002; get source drive number
 0804  3A 06 0022 R			    CMP     AL, SAV_DEFAULT_DRV ;AN002; src drive is the default drv ?
 0808  75 07				    JNE     SKIP_CH_DIR 	;AN002; no, dont change directory
				
 080A  BA 0023 R			    MOV     DX, OFFSET SAV_DEF_DIR_ROOT;AN000;
 080D  B4 3B				    MOV     AH, Chdir	 ;AN000;
 080F  CD 21				    INT     21H 		;AN000;restore current dir of default dir
 0811				SKIP_CH_DIR:	   ;AN000;
				;	$ENDIF
 0811				$$IF59: 	   ;AN000;
				
 0811  F6 06 01B7 R 04			TEST	SYS_FLAG, DEFAULT_S_DIR_FLAG ;AN000;source default direcotry saved?
				;	$IF	NZ
 0816  74 07				JZ $$IF61			  ;AN000;
 0818  BA 0064 R			    MOV     DX, OFFSET SAV_S_DRV ;AN000;saved source drive letter & directory
 081B  B4 3B				    MOV     AH, 3Bh		 ;AN000;
 081D  CD 21				    INT     21h 		;AN000;restore source. This is for the case of ERROR exit.
				;	$ENDIF
 081F				$$IF61: 	   ;AN000;
				
 081F  F6 06 01B7 R 08			TEST	SYS_FLAG, DEFAULT_T_DIR_FLAG ;AN000;target default directory saved?
				;	$IF	NZ			;then assume both source, target default saved
 0824  74 07				JZ $$IF63			  ;AN000;
 0826  BA 00A7 R			    MOV     DX, OFFSET SAV_T_DRV ;AN000;saved target drive letter & directory
 0829  B4 3B				    MOV     AH, 3Bh		 ;AN000;
 082B  CD 21				    INT     21h 		;AN000;restore target
				;	$ENDIF
 082D				$$IF63: 	   ;AN000;
				
 082D  C3				RET		  ;AN000;
 082E				ORG_S_T_DEF ENDP   ;AN000;
				;
 082E				EXTENDED_ERROR_HANDLER PROC NEAR;AN000;
				;This routine calls fun 59(Get extended error) and
				;check the actions returned.  If it is Immediate exit, then jmp to JUST_EXIT
				;If it is abort, then jmp to MAIN_EXIT.
				;Or else, it check the COPY_STATUS flag.  If is not open, read, create or
				;write, then it is considered as a critical error and jmp to MAIN_EXIT.
				;If access denied
				;   too many open files
				;   sharing violation
				;   lock violation
				;   general failure
				;then show the message and jmp to the MAIN_EXIT.
				; *** Currently, this routine directly jump to the main_exit instead of
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-70


				; *** returing to the caller.  The reason is we regard the above error conditions
				; *** as being not suitable to continue copying and, hence, to simplify
				; *** the error process.
				;INPUT:
				;      DS - DATA SEG
				;OUTPUT:
				;      ALL THE REG PRESERVED
				
 082E				GOTO_MAIN_EXIT:    ;AN000;
 082E  E9 005B R			JMP	MAIN_EXIT		;AN000;restore conditions
									;and exit
 0831				QUICK_EXIT:	;AN000;
 0831  E9 006B R			JMP	JUST_EXIT		;AN000;immediate exit
				
 0834  C3				RET	       ;AN000;
				
 0835				EXTENDED_ERROR_HANDLER ENDP;AN000;
				;
 0835				CLOSE_DELETE_FILE PROC NEAR;AN000;
				;when writing error occurs, then this routine is called to
				;clean up the troubled target file.
				;INPUT: DS - buffer seg
				;	ES - data seg
				
 0835  26: 8B 1E 01A5 R			MOV	BX, ES:T_HANDLE 	;AN000;close target file
 083A  1E				PUSH	DS			;AN005;SAVE THE BUFFER PTR
 083B  06				PUSH	ES			;AN005;WE NEED THE DATA PTR
 083C  1F				POP	DS			;AN005;DS = THE DATA PTR
 083D  E8 07AC R			CALL	CLOSE_A_FILE;AN000;
 0840  1F				POP	DS			;AN005;DS = THE BUFFER PTR AGAIN
 0841  8D 16 0011			LEA	DX, DS:target_drv_let	;AN000;target drv, filename
 0845  E8 07BC R			CALL	DELETE_A_FILE		;AN000;delete it
 0848  C3				RET		    ;AN000;
 0849				CLOSE_DELETE_FILE ENDP;AN000;
				;
				;
				
 0849				SWITCH_DS_ES PROC NEAR;AN000;
				; switch DS, ES
 0849  1E				PUSH	DS	       ;AN000;
 084A  06				PUSH	ES	       ;AN000;
 084B  1F				POP	DS		;AN000;
 084C  07				POP	ES		;AN000;
 084D  C3				RET		    ;AN000;
 084E				SWITCH_DS_ES ENDP    ;AN000;
				;
				;
 084E				INIT	PROC	NEAR	   ;AN000;
				
 084E  E8 08B8 R			CALL	GET_CUR_DRV	    ;AN000;save current default drv
 0851  8A 16 0022 R			MOV	DL, SAV_DEFAULT_DRV;AN000;
 0855  8D 36 0024 R			LEA	SI, SAV_DEFAULT_DIR;AN000;
				
 0859  E8 08C2 R			CALL	GET_CUR_DIR	    ;AN000;save current default dir
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-71


 085C  E8 088C R			CALL	GET_DRIVES	    ;AN000; SAR
 085F  E8 08C7 R			CALL	TOP_OF_MEM	;AN000;set top_of_memory
 0862  E8 08DA R			CALL	INIT_BUFFER	;AN000;init buffer information
				
 0865  8A 16 00FB R			MOV	DL, T_DRV_NUMBER			   ;AN000; SAR
					.IF < DL AE 3 > 				   ;AN000; SAR
 0869  80 FA 03              3						cmp DL,3 
 086C  72 0E                 5						jnAE $l46 
 086E  8D 36 00AA R			     LEA     SI, SAV_T_CURDIR			   ;AN000; SAR
 0872  E8 08C2 R			     CALL    GET_CUR_DIR			   ;AN000; SAR
 0875  80 0E 01B7 R 08			     OR      SYS_FLAG, DEFAULT_T_DIR_FLAG	   ;AN000; SAR
					.ELSE						   ;AN000; SAR
 087A  EB 05                 3						jmp short $l45 
 087C                        2	$l46: 
 087C  80 26 01B7 R F7			     AND     SYS_FLAG, NOT DEFAULT_T_DIR_FLAG	   ;AN000; SAR
					.ENDIF						   ;AN000; SAR
 0881                        2	$l45: 
				
				
 0881  8A 16 00FA R			MOV	DL, S_DRV_NUMBER;AN000;
 0885  FE CA				DEC	DL	   ;AN000;
 0887  E8 07C1 R			CALL	SET_DEFAULT_DRV ;AN000;set source as a default drv
 088A  F8				CLC		     ;AN000;
 088B  C3				RET		     ;AN000;
 088C				INIT	ENDP		 ;AN000;
				;
 088C				GET_DRIVES PROC NEAR  ;AN000;
				;get source and target phisical drive letter from parser area.
				;set ONE_DISK_COPY_FLAG, if the user XCOPY using the same drive letter.
				
				;;;;;	MOV	AL, SO_DRIVE		;AN000;source drive letter
				;	CMP	AL,SPACE		;AN000;IS DRIVE LETTER BLANK?
				;	$IF	E			;AN000;YES, GET THE DEFAULT
				;	    MOV     AL, SAV_DEFAULT_DRV ;(1=A, 2=B,...)
				;	$ELSE				;AN000;NO, CHANGE FROM CHAR TO #
				;	    SUB     AL,BASE_OF_ALPHA_DRV ;AN000;NEED THE DRV # HERE
				;	$ENDIF
				
 088C  B0 01				MOV	AL, 1			;AN000; SAR	A is the source drive
 088E  A2 00FA R			MOV	S_DRV_NUMBER, AL	;AN000;SAVE DRV #
 0891  04 40				ADD	AL, BASE_OF_ALPHA_DRV;AN000;
				
 0893  A2 00FC R			MOV	S_DRV, AL		;AN000;save source drive letter
 0896  A2 0150 R			MOV	S_DRV_1, AL;AN000;
				;;	MOV	S_ARC_DRV, AL		; SAR
 0899  A2 0064 R			MOV	SAV_S_DRV, AL;AN000;
				
					.IF < DEST eq 3 >		;AN111;JW
 089C  80 3E 0002 R 03       3						cmp DEST,3 
 08A1  75 04                 6						jne $l50 
 08A3  B0 00				   MOV	   AL,0 		;AN111;JW
					.ELSE				;AN111;JW
 08A5  EB 03                 3						jmp short $l49 
 08A7                        2	$l50: 
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-72


 08A7  A0 0002 R			   MOV	   AL, DEST		;AN000; SAR  target drive letter
					.ENDIF				;AN111;JW
 08AA                        2	$l49: 
 08AA  FE C0				INC	AL			;AN000; SAR
				;;;;;	CMP	AL,SPACE		;AN000;IS DRIVE LETTER BLANK?
				;   ;	$IF	E			;AN000;YES, GET THE DEFAULT
				;   ;	    MOV     AL, SAV_DEFAULT_DRV ;(1=A, 2=B,...)
				;   ;	$ELSE				;AN000;NO, CHANGE FROM CHAR TO #
				;   ;	    SUB     AL,BASE_OF_ALPHA_DRV ;AN000;NEED THE DRV # HERE
				;;;;;	$ENDIF
 08AC  A2 00FB R			MOV	T_DRV_NUMBER, AL	;AN000;save target drv #
				
				;;;;;	CMP	S_DRV_NUMBER, AL	;s_drv_number = t_drv_number?
				;   ;	$IF	E
				;   ;	    OR	    SYS_FLAG, ONE_DISK_COPY_FLAG ;same logical drv copy
				;;;;;	$ENDIF
				
 08AF  04 40				ADD	AL, BASE_OF_ALPHA_DRV	;AN000;make target drv # to drive letter
 08B1  A2 0161 R			MOV	T_DRV, AL		;AN000;target drive letter
				;;	MOV	T_DRV_1, AL		; SAR
				;;	MOV	T_DRV_2, AL		; SAR
 08B4  A2 00A7 R			MOV	SAV_T_DRV, AL;AN000;
 08B7  C3				RET	       ;AN000;
 08B8				GET_DRIVES ENDP ;AN000;
				;
 08B8				GET_CUR_DRV PROC NEAR;AN000;
				;get the current default drive number (0 = A, 1 = B ..),
				;change it to BIOS drive number and save it.
 08B8  B4 19				MOV	AH, Current_Disk	;AN000; = 19h
 08BA  CD 21				INT	21h		 ;AN000;
 08BC  FE C0				INC	AL			;AN000;(1 = A, 2 = B ..)
 08BE  A2 0022 R			MOV	SAV_DEFAULT_DRV, AL	;AN000;save it
 08C1  C3				RET			;AN000;
 08C2				GET_CUR_DRV ENDP	 ;AN000;
				;
 08C2				GET_CUR_DIR PROC NEAR	 ;AN000;
				;get current directory and save it
				;input: DL - drive # (0 = default, 1 = A etc)
				;	DS:SI - pointer to 64 byte user memory
				
 08C2  B4 47				MOV	AH, Get_Current_Directory;AN000;
 08C4  CD 21				INT	21H		    ;AN000;
 08C6  C3				RET			;AN000;
 08C7				GET_CUR_DIR ENDP	 ;AN000;
				;
 08C7				TOP_OF_MEM PROC NEAR	 ;AN000;
				;set Top_of_memory
 08C7  06				PUSH	ES		   ;AN000;
 08C8  8B 1E 0020 R			MOV	BX, PSP_SEG	    ;AN000;
 08CC  8E C3				MOV	ES, BX		    ;AN000;
 08CE  26: A1 0002			MOV	AX, ES:2		;AN000;PSP top of memory location
 08D2  2D 0100				SUB	AX, 100H		;AN000;subtract dos transient area (4k)
 08D5  A3 01C1 R			MOV	TOP_OF_MEMORY, AX	;AN000;save it for buffer top
 08D8  07				POP	ES		  ;AN000;
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Page     1-73


 08D9  C3				RET		      ;AN000;
 08DA				TOP_OF_MEM ENDP        ;AN000;
				
 08DA				INIT_BUFFER PROC NEAR  ;AN000;
				;initialize buffer information
				;set buffer_base, max_buffer_size
				;	call	set_block		;SET BLOCK FOR BUFFR (for new 3.2 linker)
 08DA  B8 0000				MOV	AX, 0			;AN000; SAR
				;;;;	PUSH	CS			; SAR cs segment is the highest segment in this program
				;;;;	POP	DX			; SAR
 08DD  8B 16 0000 R			MOV	DX, ALLOCATE_START	;AN000; SAR
 08E1  89 16 01C9 R			MOV	BUFFER_PTR, DX	   ;AN000;
 08E5  E8 0624 R			CALL	SET_BUFFER_PTR	  ;AN000;
 08E8  A1 01C9 R			MOV	AX, BUFFER_PTR	   ;AN000;
 08EB  A3 01C3 R			MOV	BUFFER_BASE, AX 	;AN000;set buffer_base
 08EE  A1 01C7 R			MOV	AX, BUFFER_LEFT  ;AN000;
 08F1  3D 0140				CMP	AX, 140h		;AN000;BUFFER_LEFT < 5K which is the minimum size this progr
				am supports?
 08F4  73 03				JAE	IB_CONT   ;AN000;
				;;;;;;	PUSH	AX			    ; SAR  ;AN000;
				;	MOV	AX, MSG_INSUF_MEMORY	    ; SAR  ;AC000;GET THE MESSAGE ID
				;	MOV	MSG_NUM,AX		    ; SAR  ;AN000;NEED MESSAGE ID FOR PRINT
				;	MOV	SUBST_COUNT,NUL 	    ; SAR  ;AN000;NO SUBSTITUTION TEXT
				;	MOV	INPUT_FLAG,NUL		    ; SAR  ;AN000;NO INPUT = 0
				;	MOV	MSG_CLASS,UTILITY_MSG_CLASS ; SAR  ;AN000;MESSAGE CLASS = -1
				;	CALL	PRINT_STDERR		    ; SAR  ;print error. AX points to message ID
				;	POP	AX			    ; SAR  ;AN000;
				;	MOV	ERRORLEVEL, 4		    ; SAR  ;abnormal termination
 08F6  E9 005B R			JMP	MAIN_EXIT_A		;AN000;terminate this program
 08F9				IB_CONT:	  ;AN000;
 08F9  A3 01C5 R			MOV	MAX_BUFFER_SIZE, AX	;AN000;set max buffer size in para
 08FC  3D 0FFF				CMP	AX, 0FFFh		;AN000;max_buffer_size > 64 K in para ?
				;	$IF	B
 08FF  73 0D				JNB $$IF65     ;AN000;
 0901  B9 0010				    MOV     CX, 16;AN000;
 0904  F7 E1				    MUL     CX			;AN000;AX = AX * 16 (DX part will be 0)
 0906  2D 0220				    SUB     AX, 544		;AN000;AN000;subtrack header size
 0909  A3 01B9 R			    MOV     MAX_CX, AX		;AN000;this will be max_cx
				;	$ELSE
 090C  EB 06				JMP SHORT $$EN65	;AN000;
 090E				$$IF65: 		 ;AN000;
 090E  C7 06 01B9 R FFD0		    MOV     MAX_CX, 0FFD0h	;AN000;else max_cx = fff0 - 32 bytes
									;which is the max # this program can support.
				;	$ENDIF				;(min # this program support for buffer is 5 k
 0914				$$EN65: 		    ;AN000;
									; which has been decided by BIG_FILE )
 0914  C3				RET			   ;AN000;
 0915				INIT_BUFFER ENDP	    ;AN000;
				
				
				
 0915				SELECT	    ENDS	     ;AN000;
				
					END			   ;AN000;

Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          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
ALLOCATE_MEMORY  . . . . . . . .  	   1
CLEAR_SCREEN2  . . . . . . . . .  	  10
DEALLOCATE_MEMORY  . . . . . . .  	   1
DISPLAY_PANEL  . . . . . . . . .  	   1
GET_FUNCTION . . . . . . . . . .  	   3
GET_NUMERIC  . . . . . . . . . .  	  29
GET_SCROLL . . . . . . . . . . .  	   5
GET_STRING . . . . . . . . . . .  	   6
HANDLE_ERROR . . . . . . . . . .  	   7
INITIALIZE_BCHAR . . . . . . . .  	  23
INIT_CHAR  . . . . . . . . . . .  	   5
INIT_NUMERIC . . . . . . . . . .  	  13
INIT_PQUEUE  . . . . . . . . . .  	   2
INIT_SCROLL  . . . . . . . . . .  	   3
INIT_SCROLL_COLOUR . . . . . . .  	   3
INIT_SCROLL_STATUS . . . . . . .  	   3
INIT_SCROLL_W_LIST . . . . . . .  	  10
INIT_SCROLL_W_NUM  . . . . . . .  	   6
INIT_STRING  . . . . . . . . . .  	   4
INIT_SUPPORT . . . . . . . . . .  	   8
PREPARE_CHILDREN . . . . . . . .  	   1
PREPARE_PANEL  . . . . . . . . .  	   2
RETURN_STRING  . . . . . . . . .  	   4
RET_SUPPORT  . . . . . . . . . .  	   8
SET_NUMERIC  . . . . . . . . . .  	  13
SET_SCROLL . . . . . . . . . . .  	   3
SET_STRING . . . . . . . . . . .  	   4
TOGGLE_SUPPORT . . . . . . . . .  	   3
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Symbols-2


Structures and Records:

                N a m e                 Width   # fields
                                        Shift   Width   Mask    Initial

FCB  . . . . . . . . . . . . . .  	0025	000C
  DRIVE_NUMBER . . . . . . . . .  	0000
  FILENAME_FCB . . . . . . . . .  	0001
  EXTENSION  . . . . . . . . . .  	0009
  CURRENT_BLOCK  . . . . . . . .  	000C
  RECORD_SIZE  . . . . . . . . .  	000E
  FILE_SIZE_LOW_FCB  . . . . . .  	0010
  FILE_SIZE_HIGH_FCB . . . . . .  	0012
  FILE_DATE_TIME_FCB . . . . . .  	0014
  RESERVED_FCB . . . . . . . . .  	0016
  CURRENT_RECORD . . . . . . . .  	0020
  RELATIVE_RECORD_LOW  . . . . .  	0021
  RELATIVE_RECORD_HIGH . . . . .  	0023
FIND_DTA . . . . . . . . . . . .  	002B	0007
  DTA_RESERVED . . . . . . . . .  	0000
  DTA_ATTRIBUTE  . . . . . . . .  	0015
  DTA_FILE_TIME  . . . . . . . .  	0016
  DTA_FILE_DATE  . . . . . . . .  	0018
  DTA_FILE_SIZE_LOW  . . . . . .  	001A
  DTA_FILE_SIZE_HIGH . . . . . .  	001C
  DTA_FILENAME . . . . . . . . .  	001E
HEADER . . . . . . . . . . . . .  	0021	000D
  CONTINUE_INFO  . . . . . . . .  	0000
  NEXT_PTR . . . . . . . . . . .  	0001
  BEFORE_PTR . . . . . . . . . .  	0003
  DIR_DEPTH  . . . . . . . . . .  	0005
  CX_BYTES . . . . . . . . . . .  	0006
  ATTR_FOUND . . . . . . . . . .  	0008
  FILE_TIME_FOUND  . . . . . . .  	0009
  FILE_DATE_FOUND  . . . . . . .  	000B
  LOW_SIZE_FOUND . . . . . . . .  	000D
  HIGH_SIZE_FOUND  . . . . . . .  	000F
  TARGET_DRV_LET . . . . . . . .  	0011
  FILENAME_FOUND . . . . . . . .  	0013
  ATTRIB_LIST  . . . . . . . . .  	0020

Segments and Groups:

                N a m e         	Length	 Align	Combine Class

DATA . . . . . . . . . . . . . .  	0762	BYTE	PUBLIC	'DATA'
SELECT . . . . . . . . . . . . .  	0915	PARA	PUBLIC	'SELECT'
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Symbols-3


Symbols:            

                N a m e         	Type	 Value	 Attr

ABORT  . . . . . . . . . . . . .  	NUMBER	0004	
ACTION_FLAG  . . . . . . . . . .  	L BYTE	01B6	DATA
ACT_APPEND . . . . . . . . . . .  	NUMBER	0000	
ACT_BYTES  . . . . . . . . . . .  	L WORD	01BB	DATA
ADJUST_DOWN  . . . . . . . . . .  	L NEAR	0000		External
ADJUST_UP  . . . . . . . . . . .  	L NEAR	0000		External
ALLOCATE . . . . . . . . . . . .  	N PROC	0088	SELECT	Length = 000F
ALLOCATE_START . . . . . . . . .  	L WORD	0000	DATA
ALLOCATION_INFO  . . . . . . . .  	NUMBER	001B	
ALLOCATION_INFO_DEVICE . . . . .  	NUMBER	001C	
ALL_ATTR . . . . . . . . . . . .  	NUMBER	-0001	
ALPHA_A  . . . . . . . . . . . .  	NUMBER	0041	
ALPHA_D  . . . . . . . . . . . .  	NUMBER	0044	
ALPHA_E  . . . . . . . . . . . .  	NUMBER	0045	
ALPHA_F  . . . . . . . . . . . .  	NUMBER	0046	
ALPHA_M  . . . . . . . . . . . .  	NUMBER	004D	
ALPHA_P  . . . . . . . . . . . .  	NUMBER	0050	
ALPHA_S  . . . . . . . . . . . .  	NUMBER	0053	
ALPHA_T  . . . . . . . . . . . .  	NUMBER	0054	
ALPHA_V  . . . . . . . . . . . .  	NUMBER	0056	
ALPHA_W  . . . . . . . . . . . .  	NUMBER	0057	
ALPHA_Z  . . . . . . . . . . . .  	NUMBER	005A	
ALREADY_EXISTS . . . . . . . . .  	NUMBER	000C	
ARCHIVE_ON . . . . . . . . . . .  	NUMBER	0020	
AUTHORIZATION  . . . . . . . . .  	NUMBER	0003	
AUXILIARY_INPUT  . . . . . . . .  	NUMBER	0003	
AUXILIARY_OUTPUT . . . . . . . .  	NUMBER	0004	
A_DOT  . . . . . . . . . . . . .  	NUMBER	002E	
A_TARGET . . . . . . . . . . . .  	L BYTE	001C	DATA

BAD_FORMAT . . . . . . . . . . .  	NUMBER	0009	
BASE_OF_ALPHA_DRV  . . . . . . .  	NUMBER	0040	
BASE_UPPER_CASE  . . . . . . . .  	NUMBER	00DF	
BELL . . . . . . . . . . . . . .  	NUMBER	0007	
BIF_BIG  . . . . . . . . . . . .  	L NEAR	030C	SELECT
BIF_BIG1 . . . . . . . . . . . .  	L NEAR	030F	SELECT
BIF_BIG2 . . . . . . . . . . . .  	L NEAR	031A	SELECT
BIF_BIG3 . . . . . . . . . . . .  	L NEAR	0341	SELECT
BIF_END  . . . . . . . . . . . .  	L NEAR	0348	SELECT
BIF_ERROR  . . . . . . . . . . .  	L NEAR	0352	SELECT
BIF_EXIT . . . . . . . . . . . .  	L NEAR	0352	SELECT
BIF_SM . . . . . . . . . . . . .  	L NEAR	02EE	SELECT
BIG_FILE . . . . . . . . . . . .  	N PROC	02D3	SELECT	Length = 0080
BIG_FILE_FLAG  . . . . . . . . .  	NUMBER	0004	
BLOCK_DEVICE . . . . . . . . . .  	NUMBER	0002	
BUFFERED_KEYBOARD_INPUT  . . . .  	NUMBER	000A	
BUFFER_BASE  . . . . . . . . . .  	L WORD	01C3	DATA
BUFFER_LEFT  . . . . . . . . . .  	L WORD	01C7	DATA
BUFFER_PTR . . . . . . . . . . .  	L WORD	01C9	DATA
BUFFER_START . . . . . . . . . .  	L WORD	0016	DATA
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Symbols-4


BYTS_OF_HDR  . . . . . . . . . .  	L WORD	01D1	DATA
B_TARGET . . . . . . . . . . . .  	L BYTE	0018	DATA

CAF_ERROR  . . . . . . . . . . .  	L NEAR	0752	SELECT
CAF_EXIT . . . . . . . . . . . .  	L NEAR	075E	SELECT
CALC_FILE_SIZE . . . . . . . . .  	N PROC	04CA	SELECT	Length = 000D
CHANGE_T_DIR . . . . . . . . . .  	N PROC	058E	SELECT	Length = 001D
CHDIR  . . . . . . . . . . . . .  	NUMBER	003B	
CHDIR_ERROR_FLAG . . . . . . . .  	NUMBER	0020	
CHECK_FILE . . . . . . . . . . .  	L WORD	00EE	DATA	Global
CHECK_MIN_MAX  . . . . . . . . .  	L NEAR	0000		External
CHECK_STD_INPUT_STATUS . . . . .  	NUMBER	000B	
CHILD_ENTER  . . . . . . . . . .  	NUMBER	0034	
CHILD_F1HELP . . . . . . . . . .  	NUMBER	0031	
CHILD_F3EXIT . . . . . . . . . .  	NUMBER	0028	
CHILD_F9KEYS . . . . . . . . . .  	NUMBER	0032	
CHILD_QUIT . . . . . . . . . . .  	NUMBER	0033	
CHK_APPEND . . . . . . . . . . .  	NUMBER	B700	
CHMOD  . . . . . . . . . . . . .  	NUMBER	0043	
CLEAR_KEYBOARD_BUFFER  . . . . .  	NUMBER	000C	
CLOSE  . . . . . . . . . . . . .  	NUMBER	003E	
CLOSE_A_FILE . . . . . . . . . .  	N PROC	07AC	SELECT	Length = 0010
CLOSE_DELETE_FILE  . . . . . . .  	N PROC	0835	SELECT	Length = 0014
CMP_FILESIZE_TO_BUFFER_LEFT  . .  	N PROC	05AB	SELECT	Length = 0079
CMP_FILE_FFD0H . . . . . . . . .  	N PROC	04AF	SELECT	Length = 001B
CNTRL_BREAK  . . . . . . . . . .  	NUMBER	0023	
COLON  . . . . . . . . . . . . .  	NUMBER	003A	
CONSOLE_INPUT_NO_ECHO  . . . . .  	NUMBER	0008	
CONT_FLAG  . . . . . . . . . . .  	NUMBER	0001	
CONVERT_ASCII  . . . . . . . . .  	L NEAR	0000		External
CONVERT_NUMERIC  . . . . . . . .  	L NEAR	0000		External
COPY_ONTO_ITSELF_FLAG  . . . . .  	NUMBER	0008	
COPY_STATUS  . . . . . . . . . .  	L BYTE	01B5	DATA
COUNTRY_CODE . . . . . . . . . .  	NUMBER	0038	
CR . . . . . . . . . . . . . . .  	NUMBER	000D	
CREATE . . . . . . . . . . . . .  	NUMBER	003C	
CREATED_FLAG . . . . . . . . . .  	NUMBER	0010	
CREATE_ATTR  . . . . . . . . . .  	NUMBER	0000	
CREATE_A_FILE  . . . . . . . . .  	N PROC	071F	SELECT	Length = 0042
CREATE_ERROR_FLAG  . . . . . . .  	NUMBER	0004	
CREATE_FLAG  . . . . . . . . . .  	NUMBER	0112	
CREATE_MODE  . . . . . . . . . .  	NUMBER	0011	
CREATE_NEW . . . . . . . . . . .  	NUMBER	005B	
CREATE_NEW_PSP . . . . . . . . .  	NUMBER	0026	
CREATE_TEMP  . . . . . . . . . .  	NUMBER	005A	
CRITICAL_ERROR . . . . . . . . .  	NUMBER	0024	
CURRENT_DISK . . . . . . . . . .  	NUMBER	0019	
CURSOROFF  . . . . . . . . . . .  	L NEAR	0000		External
CURSORON . . . . . . . . . . . .  	L NEAR	0000		External
CYCLIC_FLAG  . . . . . . . . . .  	NUMBER	0010	

DATA_PTR . . . . . . . . . . . .  	L WORD	01CB	DATA
DEALLOCATE . . . . . . . . . . .  	N PROC	0097	SELECT	Length = 000E
DEFAULT_DRV_SET_FLAG . . . . . .  	NUMBER	0002	
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Symbols-5


DEFAULT_S_DIR_FLAG . . . . . . .  	NUMBER	0004	
DEFAULT_T_DIR_FLAG . . . . . . .  	NUMBER	0008	
DELAY_RETRY  . . . . . . . . . .  	NUMBER	0002	
DELETE . . . . . . . . . . . . .  	NUMBER	0041	
DELETE_A_FILE  . . . . . . . . .  	N PROC	07BC	SELECT	Length = 0005
DEST . . . . . . . . . . . . . .  	L BYTE	0002	DATA
DEST_PANEL . . . . . . . . . . .  	L WORD	00EC	DATA	Global
DIRECT_CONSOLE_IO  . . . . . . .  	NUMBER	0006	
DIRECT_INPUT_NO_ECHO . . . . . .  	NUMBER	0007	
DISK_FULL_FLAG . . . . . . . . .  	NUMBER	0080	
DISK_READ  . . . . . . . . . . .  	NUMBER	0025	
DISK_RESET . . . . . . . . . . .  	NUMBER	000D	
DISK_WRITE . . . . . . . . . . .  	NUMBER	0026	
DISPLAY_OUTPUT . . . . . . . . .  	NUMBER	0002	
DISPLAY_PANEL_CALL . . . . . . .  	L NEAR	0000		External
DISPLAY_S_PATH . . . . . . . . .  	NUMBER	0020	
DOS_FILE_PTR . . . . . . . . . .  	L WORD	0014	DATA
DOS_FUNCTION . . . . . . . . . .  	NUMBER	0021	
DOS_KEYB_INP . . . . . . . . . .  	NUMBER	0001	
DOS_VERSION  . . . . . . . . . .  	NUMBER	0030	
DO_DEALLOCATE  . . . . . . . . .  	L NEAR	0071	SELECT
DRV_DELIM  . . . . . . . . . . .  	NUMBER	003A	
DTAS . . . . . . . . . . . . . .  	L 	0202	DATA	Length = 0020
DUP_HANDLE . . . . . . . . . . .  	NUMBER	0045	
D_V_APPEND . . . . . . . . . . .  	NUMBER	00FF	

END_OF_MESSAGE . . . . . . . . .  	NUMBER	0000	
END_OF_PARM_FLAG . . . . . . . .  	NUMBER	0004	
EOF_FLAG . . . . . . . . . . . .  	NUMBER	0002	
ERRORLEVEL_0 . . . . . . . . . .  	NUMBER	0000	
ERRORLEVEL_1 . . . . . . . . . .  	NUMBER	0001	
ERRORLEVEL_2 . . . . . . . . . .  	NUMBER	0002	
ERRORLEVEL_3 . . . . . . . . . .  	NUMBER	0003	
ERRORLEVEL_4 . . . . . . . . . .  	NUMBER	0004	
ERRORLEVEL_5 . . . . . . . . . .  	NUMBER	0005	
ERRORLEVEL_6 . . . . . . . . . .  	NUMBER	0006	
ERRORLEVEL_7 . . . . . . . . . .  	NUMBER	0007	
ERRORLEVEL_8 . . . . . . . . . .  	NUMBER	0008	
ERROR_ACCESS_DENIED  . . . . . .  	NUMBER	0005	
ERROR_BAD_REQUEST_LEN  . . . . .  	NUMBER	0018	
ERROR_CANNOT_MAKE  . . . . . . .  	NUMBER	0052	
ERROR_DATA_ERROR . . . . . . . .  	NUMBER	0017	
ERROR_DRIVE_NOT_READY  . . . . .  	NUMBER	0015	
ERROR_FAIL_ON_INT24  . . . . . .  	NUMBER	0053	
ERROR_FCB_UNAVAILABLE  . . . . .  	NUMBER	0023	
ERROR_FILE_EXISTS  . . . . . . .  	NUMBER	0050	
ERROR_FILE_NOT_FOUND . . . . . .  	NUMBER	0002	
ERROR_GERNERAL_FAILURE . . . . .  	NUMBER	001F	
ERROR_INSUFFICIENT_MEMORY  . . .  	NUMBER	0008	
ERROR_INVALID_FUNCTION . . . . .  	NUMBER	0001	
ERROR_INVALID_HANDLE . . . . . .  	NUMBER	0006	
ERROR_INV_ACCESS_CODE  . . . . .  	NUMBER	000C	
ERROR_INV_ADDRESS  . . . . . . .  	NUMBER	0009	
ERROR_INV_DATA . . . . . . . . .  	NUMBER	000D	
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Symbols-6


ERROR_INV_DISK_CHANGE  . . . . .  	NUMBER	0022	
ERROR_INV_DRIVE  . . . . . . . .  	NUMBER	000F	
ERROR_INV_ENVIRONMENT  . . . . .  	NUMBER	000A	
ERROR_INV_FORMAT . . . . . . . .  	NUMBER	000B	
ERROR_LOCK_VIOLATION . . . . . .  	NUMBER	0021	
ERROR_MEMORY_BLOCKS_BAD  . . . .  	NUMBER	0007	
ERROR_NOT_SAME_DEVICE  . . . . .  	NUMBER	0011	
ERROR_NO_ERROR . . . . . . . . .  	NUMBER	0000	
ERROR_NO_HANDLES_LEFT  . . . . .  	NUMBER	0004	
ERROR_NO_MORE_FILES  . . . . . .  	NUMBER	0012	
ERROR_OUT_OF_PAPER . . . . . . .  	NUMBER	001C	
ERROR_PATH_NOT_FOUND . . . . . .  	NUMBER	0003	
ERROR_READ_FAULT . . . . . . . .  	NUMBER	001E	
ERROR_RMDIR_CURRENT_DIR  . . . .  	NUMBER	0010	
ERROR_SECTOR_NOT_FOUND . . . . .  	NUMBER	001B	
ERROR_SEEK_ERROR . . . . . . . .  	NUMBER	0019	
ERROR_SHARING_VIOLATION  . . . .  	NUMBER	0020	
ERROR_UNKNOWN_COMMAND  . . . . .  	NUMBER	0016	
ERROR_UNKNOWN_MEDIA_TYPE . . . .  	NUMBER	001A	
ERROR_UNKNOWN_UNIT . . . . . . .  	NUMBER	0014	
ERROR_WRITE_FAULT  . . . . . . .  	NUMBER	001D	
ERROR_WRITE_PROTECT  . . . . . .  	NUMBER	0013	
ERR_BAD_PATH . . . . . . . . . .  	NUMBER	003E	
ERR_BAD_PFILE  . . . . . . . . .  	NUMBER	003F	
ERR_BAD_PPRO . . . . . . . . . .  	NUMBER	0040	
ERR_BORDER . . . . . . . . . . .  	NUMBER	0043	
ERR_COPY_DISK  . . . . . . . . .  	NUMBER	0039	
ERR_DOS_DISK . . . . . . . . . .  	NUMBER	0044	
ERR_EXIT . . . . . . . . . . . .  	NUMBER	0014	
ERR_GENERAL  . . . . . . . . . .  	NUMBER	0045	
ERR_INS_INSTALL  . . . . . . . .  	NUMBER	0061	
ERR_KEYB . . . . . . . . . . . .  	NUMBER	0021	
ERR_PRT_NO_HDWR  . . . . . . . .  	NUMBER	0011	
EVERYTHING . . . . . . . . . . .  	L BYTE	000E	DATA
EXEC . . . . . . . . . . . . . .  	NUMBER	004B	
EXEC_SCROLL_CALL . . . . . . . .  	L NEAR	0000		External
EXIT . . . . . . . . . . . . . .  	NUMBER	004C	
EXIT_SELECT  . . . . . . . . . .  	L NEAR	0000		External
EXTENDED_ERROR_HANDLER . . . . .  	N PROC	082E	SELECT	Length = 0007
EXT_ERR_CLASS  . . . . . . . . .  	NUMBER	0001	
EXT_OPEN . . . . . . . . . . . .  	NUMBER	6C00	
E_A_LST  . . . . . . . . . . . .  	L DWORD	01A7	DATA
E_FILE_ATTR  . . . . . . . . . .  	NUMBER	0000		Communal
E_RETURN . . . . . . . . . . . .  	NUMBER	0000		Communal

FCB_CLOSE  . . . . . . . . . . .  	NUMBER	0010	
FCB_CREATE . . . . . . . . . . .  	NUMBER	0016	
FCB_DELETE . . . . . . . . . . .  	NUMBER	0013	
FCB_OPEN . . . . . . . . . . . .  	NUMBER	000F	
FCB_RENAME . . . . . . . . . . .  	NUMBER	0017	
FILE_ACCESS  . . . . . . . . . .  	NUMBER	005C	
FILE_BIGGER_FLAG . . . . . . . .  	NUMBER	0008	
FILE_CNT_HIGH  . . . . . . . . .  	L WORD	00F7	DATA
FILE_CNT_LOW . . . . . . . . . .  	L WORD	00F5	DATA
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Symbols-7


FILE_COUNT . . . . . . . . . . .  	L WORD	00F5	DATA
FILE_DATE_TIME . . . . . . . . .  	NUMBER	0057	
FILE_DTA . . . . . . . . . . . .  	L 	01D7	DATA
FILE_FLAG  . . . . . . . . . . .  	L BYTE	01B4	DATA
FILE_NUM . . . . . . . . . . . .  	L WORD	0003	DATA
FILE_SEARCH_ATTR . . . . . . . .  	L WORD	01B0	DATA
FILE_SIZE  . . . . . . . . . . .  	NUMBER	0023	
FINDFILE_FLAG  . . . . . . . . .  	NUMBER	0002	
FIND_FILE  . . . . . . . . . . .  	N PROC	051D	SELECT	Length = 0036
FIND_FILE_ROUTINE  . . . . . . .  	L FAR 	0000		External
FIND_FIRST . . . . . . . . . . .  	NUMBER	004E	
FIND_FIRST_FLAG  . . . . . . . .  	NUMBER	0001	
FIND_IT  . . . . . . . . . . . .  	N PROC	0508	SELECT	Length = 0015
FIND_NEXT  . . . . . . . . . . .  	NUMBER	004F	
FIRST_PARM_FLAG  . . . . . . . .  	NUMBER	0001	
FIXD_HD_SIZ  . . . . . . . . . .  	NUMBER	0002	
FK_ENT . . . . . . . . . . . . .  	V BYTE	0000		External
FK_ENT_LEN . . . . . . . . . . .  	NUMBER	0000		Communal
FORCE_DUP_HANDLE . . . . . . . .  	NUMBER	0046	
FORMAT_DISK  . . . . . . . . . .  	NUMBER	0041	
FORMAT_DISKET  . . . . . . . . .  	NUMBER	0042	
FORMAT_SHELL . . . . . . . . . .  	NUMBER	004B	
FORMAT_STARTUP . . . . . . . . .  	NUMBER	004C	
FOUND_FILE_FLAG  . . . . . . . .  	L BYTE	00F9	DATA
FOUND_FLAG . . . . . . . . . . .  	NUMBER	0020	
FREE_MEMORY  . . . . . . . . . .  	NUMBER	0049	
F_APPEND . . . . . . . . . . . .  	NUMBER	8000	

GET_APPEND . . . . . . . . . . .  	NUMBER	B706	
GET_ATTRIB . . . . . . . . . . .  	NUMBER	5702	
GET_CURRENT_DIRECTORY  . . . . .  	NUMBER	0047	
GET_CUR_DIR  . . . . . . . . . .  	N PROC	08C2	SELECT	Length = 0005
GET_CUR_DRV  . . . . . . . . . .  	N PROC	08B8	SELECT	Length = 000A
GET_DATE . . . . . . . . . . . .  	NUMBER	002A	
GET_DEST . . . . . . . . . . . .  	N PROC	01AB	SELECT	Length = 0037
GET_DEVICE_INFO  . . . . . . . .  	NUMBER	0000	
GET_DISK_FREE_SPACE  . . . . . .  	NUMBER	0036	
GET_DRIVES . . . . . . . . . . .  	N PROC	088C	SELECT	Length = 002C
GET_DTA  . . . . . . . . . . . .  	NUMBER	002F	
GET_EXTENDED_ERROR . . . . . . .  	NUMBER	0059	
GET_FILE_TIME  . . . . . . . . .  	NUMBER	0000	
GET_FUNCTION_CALL  . . . . . . .  	L NEAR	0000		External
GET_INPUT_STATUS . . . . . . . .  	NUMBER	0006	
GET_INTERRUPT_VECTOR . . . . . .  	NUMBER	0035	
GET_OUTPUT_STATUS  . . . . . . .  	NUMBER	0007	
GET_PCB  . . . . . . . . . . . .  	L NEAR	0000		External
GET_PSP  . . . . . . . . . . . .  	NUMBER	0062	
GET_SOURCE . . . . . . . . . . .  	N PROC	012B	SELECT	Length = 0080
GET_STRING_CALL  . . . . . . . .  	L NEAR	0000		External
GET_TIME . . . . . . . . . . . .  	NUMBER	002C	
GET_VERIFY_SETTING . . . . . . .  	NUMBER	0054	
GOTO_MAIN_EXIT . . . . . . . . .  	L NEAR	082E	SELECT

HANDLE_CHILDREN  . . . . . . . .  	L NEAR	0000		External
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Symbols-8


HANDLE_ERROR_CALL  . . . . . . .  	L FAR 	0000		External
HANDLE_KEYSTROKE . . . . . . . .  	L FAR 	0000		External
HANDLE_PANEL_CALL  . . . . . . .  	L FAR 	0000		External
HARDWARE_FAILURE . . . . . . . .  	NUMBER	0005	
HAS_VOLUME_LABEL . . . . . . . .  	NUMBER	0008	
HIDDEN_FILE  . . . . . . . . . .  	NUMBER	0002	
HIGH_FILE_SIZE . . . . . . . . .  	L WORD	01BD	DATA

IB_CONT  . . . . . . . . . . . .  	L NEAR	08F9	SELECT
IFC_EXIT . . . . . . . . . . . .  	L NEAR	071E	SELECT
IGNORE . . . . . . . . . . . . .  	NUMBER	0006	
IMMEDIATE_EXIT . . . . . . . . .  	NUMBER	0005	
INCL_H_ATTR  . . . . . . . . . .  	NUMBER	0002	
INCL_H_S_ATTR  . . . . . . . . .  	NUMBER	0006	
INCL_H_S_DIR_ATTR  . . . . . . .  	NUMBER	0016	
INCL_READ_ATTR . . . . . . . . .  	NUMBER	0001	
INC_FILE_COUNT . . . . . . . . .  	N PROC	0712	SELECT	Length = 000D
INIT . . . . . . . . . . . . . .  	N PROC	084E	SELECT	Length = 003E
INITIALIZE . . . . . . . . . . .  	L NEAR	0000		External
INIT_BUFFER  . . . . . . . . . .  	N PROC	08DA	SELECT	Length = 003B
INIT_CHAR_CALL . . . . . . . . .  	L NEAR	0000		External
INIT_ERROR_FLAG  . . . . . . . .  	NUMBER	0080	
INIT_ERR_DOS_VER_1 . . . . . . .  	NUMBER	0001	
INIT_ERR_DOS_VER_2 . . . . . . .  	NUMBER	0002	
INIT_ERR_ILL_DEVICE  . . . . . .  	NUMBER	000B	
INIT_ERR_INSUFF_MEM  . . . . . .  	NUMBER	0007	
INIT_ERR_INV_DATE  . . . . . . .  	NUMBER	0008	
INIT_ERR_INV_DEVICE  . . . . . .  	NUMBER	000A	
INIT_ERR_INV_DRIVE . . . . . . .  	NUMBER	0003	
INIT_ERR_INV_FILENAME  . . . . .  	NUMBER	000C	
INIT_ERR_INV_NUM_PARM  . . . . .  	NUMBER	0005	
INIT_ERR_INV_PARM  . . . . . . .  	NUMBER	0004	
INIT_ERR_INV_PATH  . . . . . . .  	NUMBER	0006	
INIT_ERR_INV_TIME  . . . . . . .  	NUMBER	0009	
INIT_PQUEUE_CALL . . . . . . . .  	L NEAR	0000		External
INIT_SCROLL_CALL . . . . . . . .  	L NEAR	0000		External
INIT_SCROLL_STATUS_CALL  . . . .  	L NEAR	0000		External
INIT_SCROLL_W_LIST_CALL  . . . .  	L NEAR	0000		External
INIT_SCROLL_W_NUM_CALL . . . . .  	L NEAR	0000		External
INIT_STRING_CALL . . . . . . . .  	L NEAR	0000		External
INSERT_DISK_ROUTINE  . . . . . .  	L NEAR	0000		External
INTERNAL . . . . . . . . . . . .  	NUMBER	0004	
INT_ORDINAL  . . . . . . . . . .  	NUMBER	0000	
INV_DATE_FLAG  . . . . . . . . .  	NUMBER	0040	
INV_S_PATH_FLAG  . . . . . . . .  	NUMBER	0001	
INV_TIME_FLAG  . . . . . . . . .  	NUMBER	0020	
INV_T_PATH_FLAG  . . . . . . . .  	NUMBER	0002	
IOCTL  . . . . . . . . . . . . .  	NUMBER	0044	
IS_BLOCK_REDIRECTED  . . . . . .  	NUMBER	0009	
IS_HANDLE_REDIRECTED . . . . . .  	NUMBER	000A	
IS_REMOVABLE . . . . . . . . . .  	NUMBER	0008	
IS_SOURCE_FLAG . . . . . . . . .  	NUMBER	0080	
IS_SUBDIRECTORY  . . . . . . . .  	NUMBER	0010	

Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Symbols-9


JUST_EXIT  . . . . . . . . . . .  	L NEAR	006B	SELECT

KEYBOARD_INPUT . . . . . . . . .  	NUMBER	0001	

LDF_SEE_IF_DONE  . . . . . . . .  	L NEAR	01ED	SELECT
LENGTH_A_TARGET  . . . . . . . .  	NUMBER	0004	
LENGTH_B_TARGET  . . . . . . . .  	NUMBER	0004	
LF . . . . . . . . . . . . . . .  	NUMBER	000A	
LOAD_DOS_FILENAME  . . . . . . .  	N PROC	01E2	SELECT	Length = 0034
LOCKED . . . . . . . . . . . . .  	NUMBER	000A	
LOCKF  . . . . . . . . . . . . .  	NUMBER	0000	
LOW_FILE_SIZE  . . . . . . . . .  	L WORD	01BF	DATA
LSEEK  . . . . . . . . . . . . .  	NUMBER	0042	
LSEEK_END_OFFSET . . . . . . . .  	NUMBER	0002	
LSEEK_OFFSET . . . . . . . . . .  	NUMBER	0000	
LSEEK_PLUS_OFFSET  . . . . . . .  	NUMBER	0001	

MAIN_EXIT  . . . . . . . . . . .  	L NEAR	005B	SELECT
MAIN_EXIT_A  . . . . . . . . . .  	L NEAR	005B	SELECT
MAKE_HEADER  . . . . . . . . . .  	N PROC	0353	SELECT	Length = 0132
MAX_BUFFER_SIZE  . . . . . . . .  	L WORD	01C5	DATA
MAX_CX . . . . . . . . . . . . .  	L WORD	01B9	DATA
MAYBE_ITSELF_FLAG  . . . . . . .  	NUMBER	0040	
MEDIA  . . . . . . . . . . . . .  	NUMBER	000B	
MEMORY . . . . . . . . . . . . .  	NUMBER	0005	
MH_AGAIN . . . . . . . . . . . .  	L NEAR	0355	SELECT
MH_A_FILE  . . . . . . . . . . .  	L NEAR	0405	SELECT
MH_BIG . . . . . . . . . . . . .  	L NEAR	03FF	SELECT
MH_CONT_END  . . . . . . . . . .  	L NEAR	03F6	SELECT
MH_ERROR . . . . . . . . . . . .  	L NEAR	047A	SELECT
MH_ERROR_BRIDGE  . . . . . . . .  	L NEAR	03CC	SELECT
MH_EXIT  . . . . . . . . . . . .  	L NEAR	0482	SELECT
MH_FILE  . . . . . . . . . . . .  	L NEAR	03CF	SELECT
MH_START . . . . . . . . . . . .  	L NEAR	036A	SELECT
MH_WHOLE_FILE  . . . . . . . . .  	L NEAR	03ED	SELECT
MISSING_LINK_FLAG  . . . . . . .  	NUMBER	0040	
MKDIR  . . . . . . . . . . . . .  	NUMBER	0039	
MKDIR_ERROR_FLAG . . . . . . . .  	NUMBER	0010	
MOD_XCOPY  . . . . . . . . . . .  	N PROC	0000	SELECT	Global	Length = 0088
MSG_ACCESS_DENIED  . . . . . . .  	NUMBER	000D	
MSG_COPY_ITSELF  . . . . . . . .  	NUMBER	0014	
MSG_CR_LF_STR  . . . . . . . . .  	NUMBER	001A	
MSG_DISK_FULL  . . . . . . . . .  	NUMBER	0013	
MSG_FILES_COPIED . . . . . . . .  	NUMBER	001B	
MSG_FILE_CREATE_ERR  . . . . . .  	NUMBER	0018	
MSG_FILE_NOT_ERR . . . . . . . .  	NUMBER	0017	
MSG_FILE_NOT_FOUND . . . . . . .  	NUMBER	001C	
MSG_GENERAL_FAIL . . . . . . . .  	NUMBER	000F	
MSG_LOCK_VIOL  . . . . . . . . .  	NUMBER	0011	
MSG_PATH_NOT . . . . . . . . . .  	NUMBER	0012	
MSG_READING_SOURCE . . . . . . .  	NUMBER	0019	
MSG_RES_T_NAME . . . . . . . . .  	NUMBER	0016	
MSG_SER_CLASS  . . . . . . . . .  	NUMBER	0000	
MSG_SHARING_VIOL . . . . . . . .  	NUMBER	0010	
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Symbols-10


MSG_TOO_MANY_OPEN  . . . . . . .  	NUMBER	000E	
MSG_UNABLE_CREATE  . . . . . . .  	NUMBER	000A	
MY_FLAG  . . . . . . . . . . . .  	L BYTE	01B3	DATA

NEXT_PASS  . . . . . . . . . . .  	L NEAR	00E2	SELECT
NO . . . . . . . . . . . . . . .  	NUMBER	0001	
NON_SPECIFIC . . . . . . . . . .  	NUMBER	0001	
NORM_ATTR  . . . . . . . . . . .  	NUMBER	0000	
NOT_FOUND  . . . . . . . . . . .  	NUMBER	0008	
NOT_FOUND_FLAG . . . . . . . . .  	L BYTE	000B	DATA
NOT_X_APPEND . . . . . . . . . .  	NUMBER	0000	
NO_INPUT . . . . . . . . . . . .  	NUMBER	0000	
NO_MORE_FILE . . . . . . . . . .  	NUMBER	0004	
NUL  . . . . . . . . . . . . . .  	NUMBER	0000	
NUL_LIST . . . . . . . . . . . .  	NUMBER	-0001	
NUMBER_OF_FILES  . . . . . . . .  	L WORD	0005	DATA
NUM_DAY  . . . . . . . . . . . .  	NUMBER	001A	
NUM_EXT_DISK . . . . . . . . . .  	NUMBER	0017	
NUM_HOUR . . . . . . . . . . . .  	NUMBER	001B	
NUM_MINUTE . . . . . . . . . . .  	NUMBER	001C	
NUM_MONTH  . . . . . . . . . . .  	NUMBER	0019	
NUM_PRINTER  . . . . . . . . . .  	NUMBER	0016	
NUM_SECOND . . . . . . . . . . .  	NUMBER	001D	
NUM_YEAR . . . . . . . . . . . .  	NUMBER	0018	

OF_ERROR . . . . . . . . . . . .  	L NEAR	04A6	SELECT
OF_EXIT  . . . . . . . . . . . .  	L NEAR	04AE	SELECT
OLD_BUFFER_PTR . . . . . . . . .  	L WORD	01CD	DATA
OLD_DTA_OFF  . . . . . . . . . .  	L WORD	00F3	DATA
OLD_DTA_SEG  . . . . . . . . . .  	L WORD	00F1	DATA
ONE_DISK_COPY_FLAG . . . . . . .  	NUMBER	0001	
OPEN . . . . . . . . . . . . . .  	NUMBER	003D	
OPEN_A_FILE  . . . . . . . . . .  	N PROC	0485	SELECT	Length = 002A
OPEN_ERROR_FLAG  . . . . . . . .  	NUMBER	0001	
OPEN_FILE_COUNT  . . . . . . . .  	L WORD	01D5	DATA
OPEN_MODE  . . . . . . . . . . .  	L BYTE	01B2	DATA
OPN_ATTR . . . . . . . . . . . .  	NUMBER	0000	
OPN_FLAG . . . . . . . . . . . .  	NUMBER	0101	
OPN_MODE . . . . . . . . . . . .  	NUMBER	0002	
OPTION_FLAG  . . . . . . . . . .  	L BYTE	01B8	DATA
ORG_S_DEF  . . . . . . . . . . .  	N PROC	07CB	SELECT	Length = 001A
ORG_S_T_DEF  . . . . . . . . . .  	N PROC	07E5	SELECT	Length = 0049
OUT_OF_RESOURCE  . . . . . . . .  	NUMBER	0001	

PAN_BAD_DISKET . . . . . . . . .  	NUMBER	0038	
PAN_CHOOSE_SHELL . . . . . . . .  	NUMBER	0062	
PAN_COMPLETE1  . . . . . . . . .  	NUMBER	0022	
PAN_COMPLETE2  . . . . . . . . .  	NUMBER	0022	
PAN_COMPLETE3  . . . . . . . . .  	NUMBER	0022	
PAN_CONFIG_PARS  . . . . . . . .  	NUMBER	001A	
PAN_CONFIRM  . . . . . . . . . .  	NUMBER	0003	
PAN_COUNTRY  . . . . . . . . . .  	NUMBER	0006	
PAN_CTY_KYB  . . . . . . . . . .  	NUMBER	0005	
PAN_DATE_TIME  . . . . . . . . .  	NUMBER	001E	
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Symbols-11


PAN_DEST_DRIVE . . . . . . . . .  	NUMBER	0009	
PAN_DISKCOPY . . . . . . . . . .  	NUMBER	0046	
PAN_DOS_LOC  . . . . . . . . . .  	NUMBER	000A	
PAN_DOS_PARAM  . . . . . . . . .  	NUMBER	0012	
PAN_DRIVE_ERROR  . . . . . . . .  	NUMBER	0037	
PAN_DSKCPY_CPY . . . . . . . . .  	NUMBER	0049	
PAN_DSKCPY_SRC . . . . . . . . .  	NUMBER	0047	
PAN_DSKCPY_TAR . . . . . . . . .  	NUMBER	0048	
PAN_EXP_MEMORY . . . . . . . . .  	NUMBER	0018	
PAN_EXP_MEMORY2  . . . . . . . .  	NUMBER	005E	
PAN_FASTOPEN . . . . . . . . . .  	NUMBER	0015	
PAN_FIXED_BOTH . . . . . . . . .  	NUMBER	001C	
PAN_FIXED_FIRST  . . . . . . . .  	NUMBER	001B	
PAN_FORMAT . . . . . . . . . . .  	NUMBER	001F	
PAN_FUNC_DISK  . . . . . . . . .  	NUMBER	0010	
PAN_FUNC_DISKET  . . . . . . . .  	NUMBER	0010	
PAN_GRAPHICS . . . . . . . . . .  	NUMBER	0017	
PAN_HBAR . . . . . . . . . . . .  	NUMBER	0025	
PAN_HPAN . . . . . . . . . . . .  	NUMBER	0024	
PAN_INSTALL_DOS  . . . . . . . .  	NUMBER	0020	
PAN_INST_PROMPT  . . . . . . . .  	NUMBER	0020	
PAN_INTRO  . . . . . . . . . . .  	NUMBER	0002	
PAN_KEYBOARD . . . . . . . . . .  	NUMBER	0007	
PAN_KYBD_ALT . . . . . . . . . .  	NUMBER	0008	
PAN_PARALLEL . . . . . . . . . .  	NUMBER	000D	
PAN_PARTIAL  . . . . . . . . . .  	NUMBER	004A	
PAN_PRINTER  . . . . . . . . . .  	NUMBER	000B	
PAN_PRT_TYPE . . . . . . . . . .  	NUMBER	000C	
PAN_REBOOT . . . . . . . . . . .  	NUMBER	001D	
PAN_REVIEW . . . . . . . . . . .  	NUMBER	000F	
PAN_SERIAL . . . . . . . . . . .  	NUMBER	000E	
PAN_SHARE  . . . . . . . . . . .  	NUMBER	0016	
PAN_SHELL  . . . . . . . . . . .  	NUMBER	0013	
PAN_START1440  . . . . . . . . .  	NUMBER	0060	
PAN_START360 . . . . . . . . . .  	NUMBER	005A	
PAN_START720 . . . . . . . . . .  	NUMBER	005F	
PAN_VDISK  . . . . . . . . . . .  	NUMBER	0019	
PAN_WELCOME  . . . . . . . . . .  	NUMBER	0001	
PAN_WORKSPACE  . . . . . . . . .  	NUMBER	0004	
PAN_WRITE_PROT . . . . . . . . .  	NUMBER	0036	
PARAGRAPH  . . . . . . . . . . .  	NUMBER	0004	
PARAM_LIST . . . . . . . . . . .  	L WORD	01A7	DATA
PARA_BOUND . . . . . . . . . . .  	NUMBER	000F	
PARA_OF_HDR  . . . . . . . . . .  	L WORD	01D3	DATA
PARM_SUBST_ONE . . . . . . . . .  	NUMBER	0001	
PARSE_ERR_CLASS  . . . . . . . .  	NUMBER	0002	
PARSE_FILENAME . . . . . . . . .  	NUMBER	0029	
PATH_DELIM . . . . . . . . . . .  	NUMBER	005C	
PATH_OFFSET  . . . . . . . . . .  	L WORD	0009	DATA
PCGVIDO_CALL . . . . . . . . . .  	L NEAR	0000		External
PREPARE_PANEL_CALL . . . . . . .  	L NEAR	0000		External
PRINTER  . . . . . . . . . . . .  	NUMBER	002F	
PRINTER_OUTPUT . . . . . . . . .  	NUMBER	0005	
PRINT_STRING . . . . . . . . . .  	NUMBER	0009	
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Symbols-12


PROGRAM_ERROR  . . . . . . . . .  	NUMBER	0007	
PROGRAM_TERMINATE  . . . . . . .  	NUMBER	0000	
PSPDTA_PARMLEN . . . . . . . . .  	NUMBER	0080	
PSPDTA_PARRSTR . . . . . . . . .  	NUMBER	0081	
PSPFCB1_DRV  . . . . . . . . . .  	NUMBER	005C	
PSPFCB2_DRV  . . . . . . . . . .  	NUMBER	006C	
PSP_SEG  . . . . . . . . . . . .  	L WORD	0020	DATA
P_S_PATH_FILE0 . . . . . . . . .  	NUMBER	0021	
P_S_PATH_FILE1 . . . . . . . . .  	NUMBER	0022	

QUICK_EXIT . . . . . . . . . . .  	L NEAR	0831	SELECT
QUY_ATTRIB . . . . . . . . . . .  	NUMBER	5703	

RANDOM_BLOCK_READ  . . . . . . .  	NUMBER	0027	
RANDOM_BLOCK_WRITE . . . . . . .  	NUMBER	0028	
RANDOM_READ  . . . . . . . . . .  	NUMBER	0021	
RANDOM_WRITE . . . . . . . . . .  	NUMBER	0022	
READ . . . . . . . . . . . . . .  	NUMBER	003F	
READING_FLAG . . . . . . . . . .  	NUMBER	0001	
READ_A_FILE  . . . . . . . . . .  	N PROC	04D7	SELECT	Length = 0031
READ_CHANNEL . . . . . . . . . .  	NUMBER	0002	
READ_DRIVE_CHANNEL . . . . . . .  	NUMBER	0004	
READ_ERROR_FLAG  . . . . . . . .  	NUMBER	0002	
READ_INTO_BUFFER . . . . . . . .  	N PROC	0216	SELECT	Length = 0076
READ_ONLY  . . . . . . . . . . .  	NUMBER	0000	
READ_ONLY_DENY_NONE  . . . . . .  	NUMBER	0040	
READ_ONLY_DENY_READ  . . . . . .  	NUMBER	0030	
READ_ONLY_DENY_WRITE . . . . . .  	NUMBER	0020	
READ_ONLY_EXCLUSIVE  . . . . . .  	NUMBER	0010	
READ_ONLY_FILE . . . . . . . . .  	NUMBER	0001	
READ_WRITE . . . . . . . . . . .  	NUMBER	0002	
READ_WRITE_DENY_NONE . . . . . .  	NUMBER	0042	
READ_WRITE_DENY_READ . . . . . .  	NUMBER	0032	
READ_WRITE_DENY_WRITE  . . . . .  	NUMBER	0022	
READ_WRITE_EXCLUSIVE . . . . . .  	NUMBER	0012	
REMOVALBLE_DRV_FLAG  . . . . . .  	NUMBER	0010	
RENAME . . . . . . . . . . . . .  	NUMBER	0056	
RESET_BIG_FILE . . . . . . . . .  	NUMBER	00FB	
RESET_CHDIR_ERROR  . . . . . . .  	NUMBER	00DF	
RESET_CLOSE_ERROR  . . . . . . .  	NUMBER	00EF	
RESET_CONT . . . . . . . . . . .  	NUMBER	00FE	
RESET_CREATED  . . . . . . . . .  	NUMBER	00EF	
RESET_CREATE_ERROR . . . . . . .  	NUMBER	00FB	
RESET_DEFAULT_S_DIR  . . . . . .  	NUMBER	00FB	
RESET_EOF  . . . . . . . . . . .  	NUMBER	00FD	
RESET_FILE_BIGGER  . . . . . . .  	NUMBER	00F7	
RESET_FINDFILE . . . . . . . . .  	NUMBER	00FD	
RESET_FIND_FIRST . . . . . . . .  	NUMBER	00FE	
RESET_FOUND  . . . . . . . . . .  	NUMBER	00DF	
RESET_IS_SOURCE  . . . . . . . .  	NUMBER	007F	
RESET_MISSING_LINK . . . . . . .  	NUMBER	00BF	
RESET_NO_MORE  . . . . . . . . .  	NUMBER	00FB	
RESET_OPEN_ERROR . . . . . . . .  	NUMBER	00FE	
RESET_READFILE . . . . . . . . .  	NUMBER	00F0	
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Symbols-13


RESET_READING  . . . . . . . . .  	NUMBER	00FE	
RESET_READ_ERROR . . . . . . . .  	NUMBER	00FD	
RESET_SLASH_A  . . . . . . . . .  	NUMBER	00FE	
RESET_SLASH_M  . . . . . . . . .  	NUMBER	00F7	
RESET_VISIT_PARENT . . . . . . .  	NUMBER	00EF	
RESET_WRITE_ERROR  . . . . . . .  	NUMBER	00F7	
RESTORE_DIRS . . . . . . . . . .  	L NEAR	005C	SELECT
RETRY  . . . . . . . . . . . . .  	NUMBER	0001	
RETRY_AFTER_USER . . . . . . . .  	NUMBER	0007	
RETURN_STRING_CALL . . . . . . .  	L NEAR	0000		External
RF_ERROR . . . . . . . . . . . .  	L NEAR	04FF	SELECT
RF_EXIT  . . . . . . . . . . . .  	L NEAR	0507	SELECT
RF_OK  . . . . . . . . . . . . .  	L NEAR	04F8	SELECT
RIB_BIG  . . . . . . . . . . . .  	L NEAR	0267	SELECT
RIB_ERROR  . . . . . . . . . . .  	L NEAR	0273	SELECT
RIB_EXIT . . . . . . . . . . . .  	L NEAR	0281	SELECT
RIB_SMALL  . . . . . . . . . . .  	L NEAR	025F	SELECT
RMDIR  . . . . . . . . . . . . .  	NUMBER	003A	

SAVE_DTA . . . . . . . . . . . .  	N PROC	0568	SELECT	Length = 0011
SAV_DEFAULT_DIR  . . . . . . . .  	L BYTE	0024	DATA	Length = 0040
SAV_DEFAULT_DRV  . . . . . . . .  	L BYTE	0022	DATA
SAV_DEF_DIR_ROOT . . . . . . . .  	L BYTE	0023	DATA
SAV_S_CURDIR . . . . . . . . . .  	L BYTE	0067	DATA	Length = 0040
SAV_S_DRV  . . . . . . . . . . .  	L BYTE	0064	DATA
SAV_T_CURDIR . . . . . . . . . .  	L BYTE	00AA	DATA	Length = 0040
SAV_T_DRV  . . . . . . . . . . .  	L BYTE	00A7	DATA
SCR_ACC_CTY  . . . . . . . . . .  	NUMBER	0017	
SCR_ACC_KYB  . . . . . . . . . .  	NUMBER	0018	
SCR_ACC_PRT  . . . . . . . . . .  	NUMBER	0019	
SCR_CHOOSE_SHELL . . . . . . . .  	NUMBER	001C	
SCR_CONTEXT_HLP  . . . . . . . .  	NUMBER	0015	
SCR_COPY_DEST  . . . . . . . . .  	NUMBER	001A	
SCR_CTY_1  . . . . . . . . . . .  	NUMBER	0003	
SCR_CTY_2  . . . . . . . . . . .  	NUMBER	0004	
SCR_CTY_KYB  . . . . . . . . . .  	NUMBER	0002	
SCR_DEST_A_C . . . . . . . . . .  	NUMBER	001B	
SCR_DEST_B_C . . . . . . . . . .  	NUMBER	000A	
SCR_DOS_SUPPORT  . . . . . . . .  	NUMBER	0001	
SCR_FIXED_BOTH . . . . . . . . .  	NUMBER	0013	
SCR_FIXED_FIRST  . . . . . . . .  	NUMBER	0012	
SCR_FORMAT . . . . . . . . . . .  	NUMBER	0014	
SCR_FR_KYB . . . . . . . . . . .  	NUMBER	0007	
SCR_FUNC_DISK  . . . . . . . . .  	NUMBER	0010	
SCR_FUNC_DISKET  . . . . . . . .  	NUMBER	0011	
SCR_INDEX_HLP  . . . . . . . . .  	NUMBER	0015	
SCR_IT_KYB . . . . . . . . . . .  	NUMBER	0008	
SCR_KYB_1  . . . . . . . . . . .  	NUMBER	0005	
SCR_KYB_2  . . . . . . . . . . .  	NUMBER	0006	
SCR_PARALLEL . . . . . . . . . .  	NUMBER	000C	
SCR_PRT_REDIR  . . . . . . . . .  	NUMBER	000E	
SCR_PRT_TYPE . . . . . . . . . .  	NUMBER	000B	
SCR_REVIEW . . . . . . . . . . .  	NUMBER	000F	
SCR_SERIAL . . . . . . . . . . .  	NUMBER	000D	
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Symbols-14


SCR_TITLE_HLP  . . . . . . . . .  	NUMBER	0016	
SCR_UK_KYB . . . . . . . . . . .  	NUMBER	0009	
SEARCH_FIRST . . . . . . . . . .  	NUMBER	0011	
SEARCH_NEXT  . . . . . . . . . .  	NUMBER	0012	
SECOND_PARM_FLAG . . . . . . . .  	NUMBER	0002	
SELECT_DISK  . . . . . . . . . .  	NUMBER	000E	
SEQUENTIAL_READ  . . . . . . . .  	NUMBER	0014	
SEQUENTIAL_WRITE . . . . . . . .  	NUMBER	0015	
SERIAL_DEVICE  . . . . . . . . .  	NUMBER	0004	
SETBLOCK . . . . . . . . . . . .  	NUMBER	004A	
SET_APPEND . . . . . . . . . . .  	NUMBER	B707	
SET_BUFFER_PTR . . . . . . . . .  	N PROC	0624	SELECT	Length = 002E
SET_DATE . . . . . . . . . . . .  	NUMBER	002B	
SET_DEFAULT_DRV  . . . . . . . .  	N PROC	07C1	SELECT	Length = 000A
SET_DEVICE_INFO  . . . . . . . .  	NUMBER	0001	
SET_DTA  . . . . . . . . . . . .  	NUMBER	001A	
SET_FILE_DATE_TIME . . . . . . .  	N PROC	079D	SELECT	Length = 000F
SET_FILE_TIME  . . . . . . . . .  	NUMBER	0001	
SET_INTERRUPT_VECTOR . . . . . .  	NUMBER	0025	
SET_MY_DTA . . . . . . . . . . .  	N PROC	0553	SELECT	Length = 0015
SET_RELATIVE_RECORD  . . . . . .  	NUMBER	0024	
SET_RETRY_COUNT  . . . . . . . .  	NUMBER	000B	
SET_SCROLL_CALL  . . . . . . . .  	L NEAR	0000		External
SET_SCROLL_COLOUR  . . . . . . .  	L NEAR	0000		External
SET_TIME . . . . . . . . . . . .  	NUMBER	002D	
SET_VERIFY_ON  . . . . . . . . .  	NUMBER	2E01	
SHARING_SOURCE_FLAG  . . . . . .  	NUMBER	0020	
SHARING_TARGET_FLAG  . . . . . .  	NUMBER	0040	
SINGLE_COPY_FLAG . . . . . . . .  	NUMBER	0008	
SIZ_OF_BUFF  . . . . . . . . . .  	L WORD	01CF	DATA
SKIP_CH_DIR  . . . . . . . . . .  	L NEAR	0811	SELECT
SLASH_A  . . . . . . . . . . . .  	NUMBER	0001	
SLASH_D  . . . . . . . . . . . .  	NUMBER	0002	
SLASH_E  . . . . . . . . . . . .  	NUMBER	0004	
SLASH_M  . . . . . . . . . . . .  	NUMBER	0008	
SLASH_P  . . . . . . . . . . . .  	NUMBER	0010	
SLASH_S  . . . . . . . . . . . .  	NUMBER	0020	
SLASH_V  . . . . . . . . . . . .  	NUMBER	0040	
SLASH_W  . . . . . . . . . . . .  	NUMBER	0080	
SMALL_FILE . . . . . . . . . . .  	N PROC	028C	SELECT	Length = 0047
SMF_CONT . . . . . . . . . . . .  	L NEAR	0298	SELECT
SMF_EOF  . . . . . . . . . . . .  	L NEAR	02B7	SELECT
SMF_ERROR  . . . . . . . . . . .  	L NEAR	02D2	SELECT
SMF_EXIT . . . . . . . . . . . .  	L NEAR	02D2	SELECT
SOURCE_IN  . . . . . . . . . . .  	L BYTE	00F0	DATA
SOURCE_PANEL . . . . . . . . . .  	L WORD	00EA	DATA	Global
SPACE  . . . . . . . . . . . . .  	NUMBER	0020	
SP_SAVE  . . . . . . . . . . . .  	L WORD	000C	DATA
STDAUX . . . . . . . . . . . . .  	NUMBER	0003	
STDERR . . . . . . . . . . . . .  	NUMBER	0002	
STDIN  . . . . . . . . . . . . .  	NUMBER	0000	
STDOUT . . . . . . . . . . . . .  	NUMBER	0001	
STDPRN . . . . . . . . . . . . .  	NUMBER	0004	
STR_BREAK  . . . . . . . . . . .  	NUMBER	000E	
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Symbols-15


STR_BUFFERS  . . . . . . . . . .  	NUMBER	000F	
STR_DEF_CP . . . . . . . . . . .  	NUMBER	001E	
STR_DOS_APPEND . . . . . . . . .  	NUMBER	0004	
STR_DOS_APPEND_P . . . . . . . .  	NUMBER	0010	
STR_DOS_LOC  . . . . . . . . . .  	NUMBER	0001	
STR_DOS_PATH . . . . . . . . . .  	NUMBER	0003	
STR_DOS_PROMPT . . . . . . . . .  	NUMBER	0005	
STR_EXT_PARMS  . . . . . . . . .  	NUMBER	0002	
STR_FASTOPEN . . . . . . . . . .  	NUMBER	0008	
STR_FCBS . . . . . . . . . . . .  	NUMBER	0011	
STR_FILES  . . . . . . . . . . .  	NUMBER	0012	
STR_GRAPHICS . . . . . . . . . .  	NUMBER	000A	
STR_KSAM . . . . . . . . . . . .  	NUMBER	0007	
STR_LASTDRIVE  . . . . . . . . .  	NUMBER	0013	
STR_SHARE  . . . . . . . . . . .  	NUMBER	0009	
STR_SHELL  . . . . . . . . . . .  	NUMBER	0006	
STR_STACKS . . . . . . . . . . .  	NUMBER	0014	
STR_SWISS_KEYB . . . . . . . . .  	NUMBER	001F	
STR_VDISK  . . . . . . . . . . .  	NUMBER	000D	
STR_VERIFY . . . . . . . . . . .  	NUMBER	0015	
STR_XMA2EMS  . . . . . . . . . .  	NUMBER	000C	
STR_XMAEM  . . . . . . . . . . .  	NUMBER	000B	
SUB_COMP_KYS_1 . . . . . . . . .  	NUMBER	002F	
SUB_COMP_KYS_1C  . . . . . . . .  	NUMBER	0023	
SUB_COMP_KYS_2 . . . . . . . . .  	NUMBER	0030	
SUB_COMP_KYS_3 . . . . . . . . .  	NUMBER	005B	
SUB_COMP_REP . . . . . . . . . .  	NUMBER	0035	
SUB_COMP_VER . . . . . . . . . .  	NUMBER	002E	
SUB_CONT_OPTION  . . . . . . . .  	NUMBER	0026	
SUB_COPYING  . . . . . . . . . .  	NUMBER	0050	
SUB_FIXED_1  . . . . . . . . . .  	NUMBER	0029	
SUB_INSTALL_1  . . . . . . . . .  	NUMBER	002C	
SUB_INSTALL_2  . . . . . . . . .  	NUMBER	002D	
SUB_INSTALL_COPY . . . . . . . .  	NUMBER	005C	
SUB_INS_INSTALL_360  . . . . . .  	NUMBER	0055	
SUB_INS_MSSHELL_A  . . . . . . .  	NUMBER	0064	
SUB_INS_OPER2  . . . . . . . . .  	NUMBER	005D	
SUB_INS_OP_WORK  . . . . . . . .  	NUMBER	0066	
SUB_INS_SHELL_DISKS  . . . . . .  	NUMBER	0065	
SUB_INS_SHELL_S360 . . . . . . .  	NUMBER	0058	
SUB_INS_STARTT_S360  . . . . . .  	NUMBER	0059	
SUB_INS_START_360  . . . . . . .  	NUMBER	0054	
SUB_INS_START_B  . . . . . . . .  	NUMBER	003A	
SUB_INS_WORK1_360  . . . . . . .  	NUMBER	0051	
SUB_INS_WORK1_S360 . . . . . . .  	NUMBER	0056	
SUB_INS_WORK2_360  . . . . . . .  	NUMBER	0052	
SUB_INS_WORK2_S360 . . . . . . .  	NUMBER	0057	
SUB_INS_WORK3_360  . . . . . . .  	NUMBER	0053	
SUB_INS_WORK3_A  . . . . . . . .  	NUMBER	0067	
SUB_INS_WORKING_A  . . . . . . .  	NUMBER	0063	
SUB_LOG_DRIVE  . . . . . . . . .  	NUMBER	002A	
SUB_PRINTER_1  . . . . . . . . .  	NUMBER	0027	
SUB_REBOOT_KEYS  . . . . . . . .  	NUMBER	002B	
SUB_REM_DOS_A  . . . . . . . . .  	NUMBER	003D	
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Symbols-16


SUB_REM_SELECT_360 . . . . . . .  	NUMBER	004E	
SUB_REM_SEL_A  . . . . . . . . .  	NUMBER	003B	
SUB_REM_SHELL_360  . . . . . . .  	NUMBER	004D	
SUB_REM_START_B  . . . . . . . .  	NUMBER	003C	
SUB_REM_UTIL1_360  . . . . . . .  	NUMBER	004F	
SWITCH_DS_ES . . . . . . . . . .  	N PROC	0849	SELECT	Length = 0005
SWITCH_DTAS  . . . . . . . . . .  	N PROC	0579	SELECT	Length = 0015
SYSPRM_DUP_SW  . . . . . . . . .  	NUMBER	0003	
SYSPRM_EX_MANY . . . . . . . . .  	NUMBER	0001	
SYSPRM_MISSING_OP  . . . . . . .  	NUMBER	0002	
SYSTEM_FAILURE . . . . . . . . .  	NUMBER	0006	
SYSTEM_FILE  . . . . . . . . . .  	NUMBER	0004	
SYS_FLAG . . . . . . . . . . . .  	L BYTE	01B7	DATA
S_DEPTH  . . . . . . . . . . . .  	L BYTE	014F	DATA
S_DOS_SEL_360  . . . . . . . . .  	V WORD	0000		External
S_DOS_SHEL_DISK  . . . . . . . .  	V WORD	0000		External
S_DRV  . . . . . . . . . . . . .  	L BYTE	00FC	DATA
S_DRV_1  . . . . . . . . . . . .  	L BYTE	0150	DATA
S_DRV_NUMBER . . . . . . . . . .  	L BYTE	00FA	DATA
S_DRV_PATH . . . . . . . . . . .  	L BYTE	00FC	DATA
S_FILE . . . . . . . . . . . . .  	L BYTE	0152	DATA
S_FILE_FLAG  . . . . . . . . . .  	NUMBER	0004	
S_HANDLE . . . . . . . . . . . .  	L WORD	015F	DATA
S_PATH . . . . . . . . . . . . .  	L BYTE	00FF	DATA	Length = 0050
S_PATH_FILE0 . . . . . . . . . .  	NUMBER	001E	
S_PATH_FILE1 . . . . . . . . . .  	NUMBER	001F	

TABLE_OFFSET . . . . . . . . . .  	L WORD	0007	DATA
TEMPORARY  . . . . . . . . . . .  	NUMBER	0002	
TERMINATE  . . . . . . . . . . .  	NUMBER	0020	
TERMINATE_ADDRESS  . . . . . . .  	NUMBER	0022	
TERMINATE_RESIDENT . . . . . . .  	NUMBER	0031	
TERMINATE_STAY_RESIDENT  . . . .  	NUMBER	0027	
TOGGLE_SUPPORT_CALL  . . . . . .  	L NEAR	0000		External
TOP_OF_MEM . . . . . . . . . . .  	N PROC	08C7	SELECT	Length = 0013
TOP_OF_MEMORY  . . . . . . . . .  	L WORD	01C1	DATA
TREE_COPY  . . . . . . . . . . .  	N PROC	00A5	SELECT	Length = 0086
TURN_VERIFY_OFF_FLAG . . . . . .  	NUMBER	0080	
T_DEPTH  . . . . . . . . . . . .  	L BYTE	01A4	DATA
T_DRV  . . . . . . . . . . . . .  	L BYTE	0161	DATA
T_DRV_NUMBER . . . . . . . . . .  	L BYTE	00FB	DATA
T_DRV_PATH . . . . . . . . . . .  	L BYTE	0161	DATA
T_FILE_FLAG  . . . . . . . . . .  	NUMBER	0008	
T_HANDLE . . . . . . . . . . . .  	L WORD	01A5	DATA
T_PATH . . . . . . . . . . . . .  	L BYTE	0164	DATA	Length = 0040

UNKNOWN  . . . . . . . . . . . .  	NUMBER	000D	
UNLOCK . . . . . . . . . . . . .  	NUMBER	0001	
UPPER_CASE_STRING  . . . . . . .  	NUMBER	6521	
USER . . . . . . . . . . . . . .  	NUMBER	0003	
UTILITY_MSG_CLASS  . . . . . . .  	NUMBER	00FF	

VERIFY . . . . . . . . . . . . .  	NUMBER	002E	
VERIFY_OFF . . . . . . . . . . .  	NUMBER	0002	
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Symbols-17


VERIFY_ON  . . . . . . . . . . .  	NUMBER	0001	
VISIT_PARENT_FLAG  . . . . . . .  	NUMBER	0010	

WAF_DISKFULL . . . . . . . . . .  	L NEAR	078F	SELECT
WAF_ERROR  . . . . . . . . . . .  	L NEAR	077E	SELECT
WAF_EXIT . . . . . . . . . . . .  	L NEAR	079C	SELECT
WAITP  . . . . . . . . . . . . .  	NUMBER	004D	
WFB_CD . . . . . . . . . . . . .  	L NEAR	067B	SELECT
WFB_CHATT  . . . . . . . . . . .  	L NEAR	0680	SELECT
WFB_CMP_DEPTH  . . . . . . . . .  	L NEAR	0687	SELECT
WFB_DEC_DEPTH  . . . . . . . . .  	L NEAR	0690	SELECT
WFB_ERROR  . . . . . . . . . . .  	L NEAR	06DF	SELECT
WFB_ERROR_BRIDGE . . . . . . . .  	L NEAR	068A	SELECT
WFB_EXIT . . . . . . . . . . . .  	L NEAR	06FA	SELECT
WFB_EXIT_A . . . . . . . . . . .  	L NEAR	06E2	SELECT
WFB_EXIT_A_BRIDGE  . . . . . . .  	L NEAR	068D	SELECT
WFB_EXIT_B . . . . . . . . . . .  	L NEAR	06EA	SELECT
WFB_EXIT_BRIDGE  . . . . . . . .  	L NEAR	0687	SELECT
WFB_FILE . . . . . . . . . . . .  	L NEAR	0692	SELECT
WFB_NEXT . . . . . . . . . . . .  	L NEAR	0687	SELECT
WFB_WRITE  . . . . . . . . . . .  	L NEAR	06A5	SELECT
WRITE  . . . . . . . . . . . . .  	NUMBER	0040	
WRITE_A_FILE . . . . . . . . . .  	N PROC	0761	SELECT	Length = 003C
WRITE_CHANNEL  . . . . . . . . .  	NUMBER	0003	
WRITE_DRIVE_CHANNEL  . . . . . .  	NUMBER	0005	
WRITE_ERROR_FLAG . . . . . . . .  	NUMBER	0008	
WRITE_FROM_BUFFER  . . . . . . .  	N PROC	0652	SELECT	Length = 00C0
WRITE_ONLY . . . . . . . . . . .  	NUMBER	0001	
WRITE_ONLY_DENY_NONE . . . . . .  	NUMBER	0041	
WRITE_ONLY_DENY_READ . . . . . .  	NUMBER	0031	
WRITE_ONLY_DENY_WRITE  . . . . .  	NUMBER	0021	
WRITE_ONLY_EXCLUSIVE . . . . . .  	NUMBER	0011	

XCOPY_INIT . . . . . . . . . . .  	L NEAR	003E	SELECT

YES  . . . . . . . . . . . . . .  	NUMBER	0000	

$$DO1  . . . . . . . . . . . . .  	L NEAR	00F3	SELECT
$$DO14 . . . . . . . . . . . . .  	L NEAR	051D	SELECT
$$EN1  . . . . . . . . . . . . .  	L NEAR	0129	SELECT
$$EN11 . . . . . . . . . . . . .  	L NEAR	0515	SELECT
$$EN15 . . . . . . . . . . . . .  	L NEAR	0530	SELECT
$$EN22 . . . . . . . . . . . . .  	L NEAR	0562	SELECT
$$EN27 . . . . . . . . . . . . .  	L NEAR	0621	SELECT
$$EN28 . . . . . . . . . . . . .  	L NEAR	061A	SELECT
$$EN37 . . . . . . . . . . . . .  	L NEAR	0650	SELECT
$$EN65 . . . . . . . . . . . . .  	L NEAR	0914	SELECT
$$EN8  . . . . . . . . . . . . .  	L NEAR	04C9	SELECT
$$IF11 . . . . . . . . . . . . .  	L NEAR	0513	SELECT
$$IF14 . . . . . . . . . . . . .  	L NEAR	053C	SELECT
$$IF15 . . . . . . . . . . . . .  	L NEAR	052D	SELECT
$$IF22 . . . . . . . . . . . . .  	L NEAR	0560	SELECT
$$IF25 . . . . . . . . . . . . .  	L NEAR	05A2	SELECT
$$IF27 . . . . . . . . . . . . .  	L NEAR	061C	SELECT
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Symbols-18


$$IF28 . . . . . . . . . . . . .  	L NEAR	060D	SELECT
$$IF28A  . . . . . . . . . . . .  	L NEAR	05E6	SELECT
$$IF30 . . . . . . . . . . . . .  	L NEAR	061A	SELECT
$$IF31 . . . . . . . . . . . . .  	L NEAR	061A	SELECT
$$IF37 . . . . . . . . . . . . .  	L NEAR	064A	SELECT
$$IF4  . . . . . . . . . . . . .  	L NEAR	028B	SELECT
$$IF40 . . . . . . . . . . . . .  	L NEAR	06D0	SELECT
$$IF42A  . . . . . . . . . . . .  	L NEAR	07B7	SELECT
$$IF55 . . . . . . . . . . . . .  	L NEAR	07E2	SELECT
$$IF57 . . . . . . . . . . . . .  	L NEAR	07F1	SELECT
$$IF59 . . . . . . . . . . . . .  	L NEAR	0811	SELECT
$$IF6  . . . . . . . . . . . . .  	L NEAR	03A2	SELECT
$$IF61 . . . . . . . . . . . . .  	L NEAR	081F	SELECT
$$IF63 . . . . . . . . . . . . .  	L NEAR	082D	SELECT
$$IF65 . . . . . . . . . . . . .  	L NEAR	090E	SELECT
$$IF8  . . . . . . . . . . . . .  	L NEAR	04C4	SELECT
$$LL40 . . . . . . . . . . . . .  	L NEAR	06B8	SELECT
$$SR14 . . . . . . . . . . . . .  	L NEAR	0552	SELECT
$L1  . . . . . . . . . . . . . .  	L NEAR	001C	SELECT
$L13 . . . . . . . . . . . . . .  	L NEAR	0080	SELECT
$L16 . . . . . . . . . . . . . .  	L NEAR	00CD	SELECT
$L17 . . . . . . . . . . . . . .  	L NEAR	00B5	SELECT
$L19 . . . . . . . . . . . . . .  	L NEAR	00C4	SELECT
$L2  . . . . . . . . . . . . . .  	L NEAR	0016	SELECT
$L22 . . . . . . . . . . . . . .  	L NEAR	0113	SELECT
$L25 . . . . . . . . . . . . . .  	L NEAR	0127	SELECT
$L26 . . . . . . . . . . . . . .  	L NEAR	0122	SELECT
$L29 . . . . . . . . . . . . . .  	L NEAR	012E	SELECT
$L30 . . . . . . . . . . . . . .  	L NEAR	0193	SELECT
$L31 . . . . . . . . . . . . . .  	L NEAR	0161	SELECT
$L32 . . . . . . . . . . . . . .  	L NEAR	015D	SELECT
$L36 . . . . . . . . . . . . . .  	L NEAR	020F	SELECT
$L39 . . . . . . . . . . . . . .  	L NEAR	0255	SELECT
$L42 . . . . . . . . . . . . . .  	L NEAR	067A	SELECT
$L45 . . . . . . . . . . . . . .  	L NEAR	0881	SELECT
$L46 . . . . . . . . . . . . . .  	L NEAR	087C	SELECT
$L49 . . . . . . . . . . . . . .  	L NEAR	08AA	SELECT
$L50 . . . . . . . . . . . . . .  	L NEAR	08A7	SELECT
$L6  . . . . . . . . . . . . . .  	L NEAR	003E	SELECT
$L9  . . . . . . . . . . . . . .  	L NEAR	0081	SELECT
$LL22  . . . . . . . . . . . . .  	NUMBER	0016	
$LL25  . . . . . . . . . . . . .  	NUMBER	0019	
$LL31  . . . . . . . . . . . . .  	NUMBER	001F	
$LL36  . . . . . . . . . . . . .  	NUMBER	0024	
$LL39  . . . . . . . . . . . . .  	NUMBER	0027	
$LL42  . . . . . . . . . . . . .  	NUMBER	002A	
$LL45  . . . . . . . . . . . . .  	NUMBER	002D	
$LL49  . . . . . . . . . . . . .  	NUMBER	0031	
$LL6 . . . . . . . . . . . . . .  	NUMBER	0006	
$LL9 . . . . . . . . . . . . . .  	NUMBER	0009	
??0000 . . . . . . . . . . . . .  	L NEAR	0191	SELECT
@CPU . . . . . . . . . . . . . .  	TEXT  0101h		
@FILENAME  . . . . . . . . . . .  	TEXT  mod_copy		
@VERSION . . . . . . . . . . . .  	TEXT  510		
Microsoft (R) Macro Assembler Version 5.10                  5/17/24 09:44:33
XCOPY	WITH FULL MEMORY USE ;AN000;                          Symbols-19




   4422 Source  Lines
  11359 Total   Lines
   1051 Symbols

  45538 + 105053 Bytes symbol space free

      0 Warning Errors
      0 Severe  Errors
