Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:57
COPYINIT -- DISKCOPY INITIALIZATION PROGRAM                 Page     1-1


					PAGE	90,132			;A2
					TITLE	COPYINIT -- DISKCOPY INITIALIZATION PROGRAM
				;****************** START OF SPECIFICATIONS *****************************
				; MODULE NAME: COPYINIT
				
				; DESCRIPTIVE NAME: Initialization for Diskette to diskette copy Utility
				
				;FUNCTION: DISKCOPY is to copy the contents of the diskette in the
				;	   specified source drive to the diskette in the target
				;	   drive.  If necessary, the target diskette is also
				;	   formatted.
				
				;	   Multiple copies may be performed with one load of DISKCOPY.
				;	   A prompt, "Copy another (Y/N)?" permits additional
				;	   executions, all with the same drive specifications.
				
				; ENTRY POINT: "DISKCOPY" at ORG 100h, jumps to "BEGIN".
				
				; INPUT: (DOS command line parameters)
				;	 [d:][path]DISKCOPY [d: [D:]][/1]
				
				;	 Where
				
				;	 [d:][path] before DISKCOPY to specify the drive and path that
				;		    contains the DISKCOPY command file.
				
				;	 [d:]	    to specify the source drive id
				
				;	 [D:]	    to specify the destination drive id
				
				;	 [/1]	    to request single sided operations only
				
				; EXIT-NORMAL: Errorlevel = 0
				;	      Function completed successfully.
				
				; EXIT-ERROR: Errorlevel = 1
				;	      Abnormal termination due to error, wrong DOS,
				;	      invalid parameters, unrecoverable I/O errors on
				;	      the diskette.
				
				; EFFECTS: The entire source diskette is copied, including the unused
				;	   sectors.  There is no awareness of the separate files
				;	   involved.  A unique volume serial number is generated
				;	   for the target diskette.
				
				; INCLUDED FILES:
				;	INCLUDE DCPYMACR.INC
				;	INCLUDE DISKCOPY.EQU
				;	INCLUDE PATHMAC.INC		;PATHGEN MACRO
				
				; INTERNAL REFERENCES:
				;    ROUTINES:
				;	INIT - INITIALIZATION ROUTINE, MAIN PROGRAM
				;	SOURCE_TARGET_DRV - CONVERT SOURCE/TARGET DRIVE TO BIOS VALUES
				;	TEST_DRIVE_VALIDITY - ARE SOURCE/TARGET DRIVES VALID?
				;	DOS_DRIVE_VALIDITY - CHECK DOS DRIVE VALIDITY BYTE
				;	TEST_REMOVABLE - IS SPECIFIED DRIVE REMOVABLE?
				;	CHK_SINGLE_DRIV_OP - IS TARGET DRIVE SAME AS SOURCE?
				;	GET_LOGICAL_DRIVE - GET LOG. DRIV NO. WHO OWNS PHYSICAL DRIVE
				;	DISKETTE_DRV_TYPE - CHECK COMPATABILITY SOURCE/TARGET DRIVES
				;	CHECK_REDIRECTION - IS DEVICE REDIRECTED?
				;	BUFFER_SIZE - FINDS START AND END OF BUFFER
				;	SETUP_CTRL_BREAK - SETUP THE CTRL-BREAK VECTOR
				;	CHECK_SERVER - IS SERVER OR REDIRECTOR LOADED?
				
				;    DATA AREAS:
				;	PSP - Contains the DOS command line parameters.
				;	WORKAREA - Temporary storage
				
				; EXTERNAL REFERENCES:
				;    ROUTINES:
				;	SYSDISPMSG - Uses the MSG parm lists to construct the messages
				;		 on STDOUT.
				;	SYSLOADMSG - Loads messages, makes them accessable.
				;	PARSER - Processes the DOS Command line, finds parms.
				
				;    DATA AREAS:
				;	 DCOPYSM.SAL - Defines the control blocks that describe the messages
				;	 DCOPYPAR.SAL - Defines the control blocks that describe the
				;		DOS Command line parameters.
				
				; NOTES:
				;	 This module should be processed with the SALUT preprocessor
				;	 with the re-alignment not requested, as:
				
				;		SALUT COPYINIT,NUL
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:57
COPYINIT -- DISKCOPY INITIALIZATION PROGRAM                 Page     1-2


				
				;	 To assemble these modules, the alphabetical or sequential
				;	 ordering of segments may be used.
				
				;	 For instructions as to how to LINK, see prolog for DISKCOPY.
				
				;PROGRAM AUTHOR: Original written by: JK
				;		 4.00 modifications by: EMK
				;****************** END OF SPECIFICATIONS *****************************
				
				;DATE:	 9-22-83
				;TIME:	 8:00 PM
				;DATE:	 10-30-84 - chk_para routine added. many parts are modified to
				;	 permit DISKCOPY /1, DISKCOPY D: /1 cases. Restore diskbase
				;	 before return to DOS when invalid DOS version occurs.
				;DATE:	 3-27-85  MAIN PARTS OF DISKCOPY PROGRAM HAS BEEN REWRITTEN
				;	 TO USE NEW IOCTL FUNCTION CALLS - READ, WRITE AND FORMAT.
				
					INCLUDE DCPYMACR.INC
			     C	;***************************************************************************;
			     C	;			     MACRO DEFINITION				    ;
			     C	;***************************************************************************;
			     C	
			     C	HEADER	MACRO	TEXT			;AN000;
			     C	.XLIST					;AN000;
			     C		SUBTTL	&TEXT			;AN000;
			     C	.LIST					;AN000;
			     C		PAGE				;AN000;
			     C		ENDM				;AN000;
			     C	;  =  =  =  =  =  =  =	=  =
			     C	;				   $SALUT (0,36,40,44)
			     C	DOSCALL 			   MACRO FUNC,SUBFUNC ;;AN000;
			     C					   IFNB <FUNC> ;;AN000;IS THERE ANY PARMS AT ALL?
			     C					   IFNB <SUBFUNC> ;;AN000;
			     C					   MOV AX,(FUNC SHL 8)+SUBFUNC ;;AN000;FUNC TO AH,SUBFUNC TO AL
			     C					   ELSE    ;;AN000;SINCE THERE IS NO SUBFUNC
			     C					   MOV AH,FUNC ;;AN000;
			     C					   ENDIF   ;;AN000;
			     C					   ENDIF   ;;AN000;
			     C					   INT 21H ;;AN000;
			     C					   ENDM    ;;AN000;
			     C	;  =  =  =  =  =  =  =	=  =
			     C	PRINT				   MACRO MESSAGE;;AN000;
			     C					   MOV DI,OFFSET MESSAGE  ;;AC000;
			     C					   CALL SENDMSG 	  ;;AC000;
			     C					   ENDM 		  ;;AN000;
			     C	;  =  =  =  =  =  =  =	=  =
			     C	;	       $SALUT (0,16,22,36)
			     C	MY_TRACKLAYOUT MACRO		   ;AN000;
			     C		       LOCAL CSECT_F							;AN000;
			     C	CSECT_F        DW    0		   ;;AN000;# OF SECTORS IN A TRACK. Currently 18 is max.
			     C					   ;;  THE REST IS FOR FUTURE MEDIA
			     C		       DW    1		   ;;AN000;1 ST SECTOR
			     C		       DW    512	   ;;AN000;# OF BYTES
			     C		       DW    2		   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    3		   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    4		   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    5		   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    6		   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    7		   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    8		   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    9		   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    10 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    11 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    12 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    13 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    14 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    15 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    16 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    17 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:57
COPYINIT -- DISKCOPY INITIALIZATION PROGRAM                 Page     1-3


			     C		       DW    18 	   ;;AN000;
			     C		       DW    512	   ;;AN000;CURRENTLY 18 SECTORS/TRACK IS MAXIMUM
			     C		       DW    19 	   ;;AN000;BELOW IS FOR THE FUTURE MEDIA.
			     C		       DW    512	   ;;AN000;
			     C		       DW    20 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    21 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    22 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    23 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    24 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    25 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    26 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    27 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    28 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    29 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    30 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    31 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    32 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    33 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    34 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    35 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    36 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    37 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    38 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    39 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    40 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    41 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    42 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    43 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    44 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    45 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    46 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    47 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    48 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    49 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    50 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    51 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    52 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    53 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    54 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    55 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    56 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    57 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    58 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    59 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    60 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:57
COPYINIT -- DISKCOPY INITIALIZATION PROGRAM                 Page     1-4


			     C		       DW    61 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    62 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       DW    63 	   ;;AN000;
			     C		       DW    512	   ;;AN000;
			     C		       ENDM								;AN000;
			     C	
					INCLUDE PATHMAC.INC		;AN015;PATHGEN MACRO
			     C	;;***********************************************************************
			     C	;; NAME: pathlabl
			     C	;; DESC: creates a public label at the spot it is placed, using the name
			     C	;;       given.
			     C	;; INPUT: either module name or procedure name
			     C	;; OUTPUT: public label
			     C	;; LOGIC: LBL-parameter-name will have four values -
			     C	;;            - one for each pass (2)
			     C	;;            - one for start and one for stop
			     C	;;        if LBL is not defined, it is first pass, at beginning label
			     C	;;              - set it to 1 and create the start label
			     C	;;        if LBL = 1, it is first pass, at end label
			     C	;;              - set it to 2 and create stop label
			     C	;;        if LBL = 2, it is second pass, at beginning label
			     C	;;              - set it to 3 and create the start label
			     C	;;        if LBL = 3, it is second pass, at end label
			     C	;;              - set it to 4 and create stop label
			     C	;;        if LBL = 4, it is second pass,
			     C	;;              - this macro has been invoked more than twice with same parm
			     C	;;              - issue error message
			     C	;;***********************************************************************
			     C	
			     C	pathlabl MACRO pnam
			     C	IFNDEF LBL_&pnam                        ;;IF THIS IS THE FIRST TIME,
			     C	    LBL_&pnam = 0                       ;;DEFINE IT, INITIALLY ZERO
			     C	ELSE                                    ;;SINCE IT IS DEFINED
			     C	    IF (LBL_&pnam GT 3)                 ;;IF USED TOO MANY TIMES,
			     C	        .ERR NON-UNIQUE OPERAND ON PATHLABL
			     C	        EXITM                           ;;ABORT THIS GENERATION
			     C	    ENDIF
			     C	ENDIF
			     C	
			     C	IF (LBL_&pnam EQ 0) OR (LBL_&pnam EQ 2) ;;ready for START?
			     C	    $$A_START_&pnam:                    ;;create START label
			     C	    PUBLIC $$A_START_&pnam              ;;make it public
			     C	ELSE                                    ;;SINCE SWITCH MAY BE 1 OR 3,
			     C	    $$A_STOP_&pnam:                     ;;create STOP label
			     C	    PUBLIC $$A_STOP_&pnam               ;;make it public
			     C	ENDIF
			     C	LBL_&pnam = LBL_&pnam + 1               ;;INCREMENT SWITCH
			     C	ENDM
				
 0000				CSEG	SEGMENT PARA PUBLIC 'CODE'	;AN000;
					ASSUME	CS:CSEG, DS:CSEG, ES:CSEG, SS:CSEG
				
					INCLUDE DISKCOPY.EQU
			     C	;		    $SALUT (4,21,26,36)
			     C	;---------------------------------------------------------------------------;
			     C	;				 EQUATES				    ;
			     C	;---------------------------------------------------------------------------;
			     C	
			     C	;			   *** CONSTANTS ***
			     C	
 = 0000                      C	ZERO		    EQU  0	   ;
 = 0001                      C	ONE		    EQU  1	   ;
 = 0002                      C	TWO		    EQU  2	   ;
 = 0003                      C	THREE		    EQU  3	   ;
 = 0004                      C	FOUR		    EQU  4	   ;
 = 0004                      C	TYPE_4		    EQU  4	   ;
 = 0005                      C	FIVE		    EQU  5	   ;
 = 0006                      C	SIX		    EQU  6	   ;
 = 0007                      C	SEVEN		    EQU  7	   ;
 = 0008                      C	EIGHT		    EQU  8	   ;
 = 0009                      C	NINE		    EQU  9	   ;
 = 000A                      C	TEN		    EQU  0AH	   ;
 = 0001                      C	ON		    EQU  1	   ;
 = 0000                      C	OFF		    EQU  0	   ;
 = 0001                      C	TRUE		    EQU  01	   ;
 = 0000                      C	FALSE		    EQU  00	   ;
 = 0000                      C	GOOD		    EQU  0	   ;
 = 0001                      C	BAD		    EQU  1	   ;
 = 0001                      C	FIRST		    EQU  1	   ;
 = 0002                      C	SECOND		    EQU  2	   ;
 = 0000                      C	NO_ERROR	    EQU  0	   ;
 = 0001                      C	SOFT_ERROR	    EQU  1	   ;
 = 0002                      C	HARD_ERROR	    EQU  2	   ;
			     C	
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:57
COPYINIT -- DISKCOPY INITIALIZATION PROGRAM                 Page     1-5


 = 0020                      C	BLANK		    EQU  20H	   ;BLANK IN ASCII (32 DEC)
 = 00E0                      C	CLEAR_SEGMENT	    EQU  0E0H	   ;USED TO CLEAR SEGMENT BITS (ROUND UP
			     C					   ;TO NEXT SECTOR)
 = 0008                      C	SECTOR8 	    EQU  8	   ;
 = 0009                      C	SECTOR9 	    EQU  9	   ;
 = 000E                      C	SECTOR14	    EQU  14	   ;
 = 000F                      C	SECTOR15	    EQU  15	   ;
 = 0000                      C	DRV_48TPI	    EQU  0	   ;48 TPI DRIVE
 = 0001                      C	DRV_96TPI	    EQU  1	   ;96 TPI DRIVE
 = 0002                      C	DRV_720 	    EQU  2	   ;3.5", 720 KB DRIVE (FOR CASHEW OR P14)
 = 5F02                      C	NRLFUNC 	    EQU  5F02H	   ;GET NETWORK-REDIRECTION-LIST FUNCTION
 = 001C                      C	NRLMAX		    EQU  1CH	   ;(MAXIMUM # OF NAMES ON NRL) - 1
 = 0002                      C	DOS20		    EQU  2	   ;DOS VERSION 2.0
			     C			    PUBLIC FINE    ;AN000;PARSER NEEDS IT
 =-0001                      C	FINE		    EQU  -1	   ;"FINE AND DANDY", USED FOR RETURN CODE
			     C					   ;(-1 WAS USED TO AVOID CONFUSION WITH ERROR
			     C					   ;OFFSET WHICH CAN BE ZERO)
 =-0001                      C	LOCAL_DRV	    EQU  -1	   ;DEVICE NOT DIRECTED
 = 1000                      C	REMOTE_DRV	    EQU  1000H	   ;REMOTE DRIVE TEST BITS
 =-0001                      C	NO_OPTION	    EQU  -1	   ;NO OPTION "/1" SPECIFIED
 = 0001                      C	OPTION_1	    EQU  1	   ;OPTION "/1" SPECIFIED
 = 0000                      C	REMOVABLE	    EQU  0000H	   ;REMOVABLE FILE
 =-0009                      C	INVAL_PARM	    EQU  -9	   ;INVALID PARAMETER ENTERED
			     C	; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
			     C	;		    *** COPY STATUS BYTE ***
			     C	
 = 0001                      C	FATAL		    EQU  01H	   ;FATAL COPY ERROR, ABORT
 = 0000                      C	OK		    EQU  00H	   ;OK, PROCEED
			     C	; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
			     C	;		    *** PROGRAM SEGMENT PREFIX ***
			     C	
 = 005C                      C	FCB1_DRV_ID	    EQU  5CH	   ;DRIVE NUMBER ADDR IN FILE CONTROL BLOCK 1
 = 005D                      C	FCB1_FILENM	    EQU  5DH	   ;FILE NAME ADDR IN FILE CONTROL BLOCK 1
 = 006C                      C	FCB2_DRV_ID	    EQU  6CH	   ;DRIVE NUMBER ADDR IN FILE CONTROL BLOCK 2
 = 006D                      C	FCB2_FILENM	    EQU  6DH	   ;FILE NAME ADDR IN FILE CONTROL BLOCK 2
 = 0080                      C	BEGIN_UNFORM_AREA   EQU  80H	   ;BEGINNING @ OF THE UNFORMATTED AREA
 = 0100                      C	END_UNFORM_AREA     EQU  100H	   ;ENDING @ OF THE UNFORMATTED AREA
			     C	; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
			     C	;			*** DOS FUNCTONS ***
			     C	
 = 0001                      C	KB_INPUT_FUNC	    EQU  01H	   ;DOS KEYBOARD INPUT FUNCTION
 = 0009                      C	PRINT_FUNC	    EQU  09H	   ;DOS PRINT STRING FUNCTION
 = 0009                      C	REDIRECTED_FUNC     EQU  09H	   ;IOCTL SUB FUNCTION ****** TO BE CHECKED ****
 = 0019                      C	CURRENTDRV_FUNC     EQU  19H	   ;GET CURRENT DRIVE FUNCTION CALL
 = 0030                      C	DOSVER_FUNC	    EQU  30H	   ;DOS VERSION FUNCTION CALL
 = 0044                      C	IOCTL_FUNC	    EQU  44H	   ;IOCTL FUNCTION CALL
 = 351E                      C	GET_DISKBASE_VECTOR EQU  351EH	   ;
 = 251E                      C	SET_DISKBASE_VECTOR EQU  251EH	   ;
 = 3523                      C	GET_CTL_BREAK_VECT  EQU  3523H	   ;AN000;GET VECTOR FOR INT 23H (CTRL-BREAK)
 = 2523                      C	SET_CTL_BREAK_VECT  EQU  2523H	   ;AN000;SET VECTOR FOR INT 23H (CTRL-BREAK)
 = 4408                      C	DRIVE_CHECK	    EQU  4408H	   ;DOS CHECK FOR REMOVABLE DRIVE IOCTL CALL
 = 0002                      C	STD_ERROR	    EQU  0002H	   ;STANDARD ERROR FILE HANDLE
 = 0040                      C	WRITE_FILE	    EQU  40H	   ;WRITE TO FILE OR DEVICE FUNCTION CALL
 = 5F00                      C	GET_ASSIGN_MODE     EQU  5F00H	   ;SET ASSIGN MODE COMMAND
 = 5F01                      C	SET_ASSIGN_MODE     EQU  5F01H	   ;SET ASSIGN MODE COMMAND
 = 002A                      C	SERVER		    EQU  2AH	   ;NETWORK SERVER INTERUPT
 = 0003                      C	SHARED		    EQU  03H	   ;DEVICE SHARED CHECK
 = 0059                      C	EXTENDED_ERROR	    EQU  59H	   ;EXTENDED ERROR
 = 002A                      C	GET_DATE	    EQU  2AH	   ;AN000;READ SYSTEM DATE
 = 002C                      C	GET_TIME	    EQU  2CH	   ;AN000;READ SYSTEM TIME CLOCK
 = 004C                      C	RET_CD_EXIT	    EQU  4CH	   ;AN000;EXIT TO DOS, PASSING RETURN CODE
 = 0065                      C	GET_EXT_CNTRY_INFO  EQU  65H	   ;AN000;GET EXTENDED COUNTRY INFORMATION
 = 0023                      C	YESNO_CHECK	    EQU  23H	   ;AN000;REQUEST (Y/N) CHECK OF GET_EXT_CNTRY_INFO
 = 0000                      C	NO		    EQU  0	   ;AN006;(Y/N) RESPONSE IS "NO"
 = 0001                      C	YES		    EQU  1	   ;AN000;(Y/N) RESPONSE IS "YES"
 = 0002                      C	BAD_YESNO	    EQU  2	   ;AN000;(Y/N) RESPONSE IS NEITHER "Y" NOR "N"
			     C	; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
			     C	;	*** IOCTL DISKETTE I/O FUNCTONS ***
 = 000D                      C	GENERIC_IOCTL_CODE  EQU  0DH	   ;GENERIC IOCTL REQUEST
 = 0008                      C	MAJOR_CODE	    EQU  08H	   ;GENERIC IOCTL MAJOR CODE
 = 0061                      C	READ_FUNC	    EQU  61H	   ;IOCTL DISKETTE READ FUNCTION
 = 0041                      C	WRITE_FUNC	    EQU  41H	   ;IOCTL DISKETTE WRITE FUNCTION
 = 0062                      C	VERIFY_FUNC	    EQU  62H	   ;IOCTL DISKETTE VERIFY FUNCTION
 = 0042                      C	FORMAT_FUNC	    EQU  42H	   ;IOCTL DISKETTE FORMAT FUNCTION
 = 0060                      C	GETDEVPARM	    EQU  60H	   ;IOCTL GET DEVICE PARAMETER
 = 0040                      C	SETDEVPARM	    EQU  40H	   ;IOCTL SET DEVICE PARAMETER
 = 000F                      C	SET_LOGIC_DRIVE     EQU  0FH	   ;AN000;IOCTL SET LOGICAL DRIVE
			     C	;(deleted ;AN013) GSET_MEDIA_ID  EQU 69H  ;GET OR SET MEDIA ID			;AN009;
			     C	;(deleted ;AN013) GET_ID	 EQU 0	  ;AL=0;GET MEDIA ID			;AN009;
			     C	;(deleted ;AN013) SET_ID	 EQU 1	  ;AL=1;SET MEDIA ID			;AN009;
			     C	
			     C	;special Functions
 = 0000                      C	GET_SP_FUNC_DEF     EQU  00000000B ;GET DEVICE PARM. DEFAULT BPB
 = 0001                      C	GET_SP_FUNC_MED     EQU  00000001B ;GET DEVICE PARM. BOOT BPB
 = 0004                      C	SET_SP_FUNC_DEF     EQU  00000100B ;SET DEFAULT DEVICE PARM
 = 0004                      C	SET_SP_FUNC_DOS     EQU  00000100B ;SET DEVICE PARM BEFORE RETURN TO DOS.
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:57
COPYINIT -- DISKCOPY INITIALIZATION PROGRAM                 Page     1-6


 = 0005                      C	SET_SP_BF_FORM	    EQU  00000101B ;SET DEV PARM BEFORE FORMAT
 = 0000                      C	R_W_SP_FUNC	    EQU  00000000B ;READ, WRITE
 = 0001                      C	STATUS_CHK	    EQU  00000001B ;USED IN FORMAT PACKET AND VALIDATE
			     C					   ;THE "SET DEVICE PARM" REQUEST.
 = 0000                      C	FORMAT_SP_FUNC	    EQU  00000000B ;FORMAT
			     C	.LIST				   ;
			     C	; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
			     C	;	       *** BIOS DISKETTE I/O ERROR CODES ***
			     C	
			     C	;NOT_READY	   EQU	   80H	   ;DISKETTE I/O NOT READY ERROR
			     C	;CHANG_LINE	   EQU	   06H	   ;CHANGE LINE ERROR
			     C	;BAD_CONTROLLER    EQU	   20H	   ;BAD DISKETTE/DISK CONTOROLLER
			     C	;WRITE_PROTECT	   EQU	   03H	   ;DISKETTE I/O WRITE PROTECT ERROR
			     C	;BAD_ADDR_MARK	   EQU	   02H	   ;DISKETTE I/O BAD ADDRESS MARK ERROR
			     C	;REC_NOT_FOUND	   EQU	   04H	   ;DISETTTE I/O RECORD NOT FOUND ERROR
			     C	;BAD_CRC	   EQU	   10H	   ;DISKETTE I/O BAD CRC ERROR
			     C	;HARD_WR_ERROR	   EQU	   03H	   ;DISKETTE WRITE HARD ERROR COUNT
			     C	;HARD_FMT_ERROR    EQU	   02H	   ;DISKETTE FORMAT HARD ERROR COUNT
			     C	;SINGLE_SIDE_COPY  EQU	   00H	   ;WHEN READING TRACK 0 SIDE 1 IF HARD ERROR
			     C					   ;OCCURS, WE WILL ASSUME IT WILL BE SINGLE
			     C					   ;SIDED COPY AND AL WILL BE SET TO 0, SO THAT
			     C					   ;BUFFER_PTR WILL NOT BE ADVANCED AND
			     C					   ;IF THE TRACK HAPPENS TO FALL INTO DMA BOUNDRY
			     C					   ;IT WILL SKIP THE SECOND PART OF READ_TRACK
			     C	; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
			     C	;		SYSTEM MESSAGE HANDLER EQUATES
 = 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
 =                           C	CLASS_A 	    EQU  UTILITY_MSG_CLASS ;AN000;IN MSG DESCRIPTOR
 = 0000                      C	MAX_0		    EQU  0	   ;AN000;MAXIMUM WIDTH OF STRING FIELD (0=NO LIMIT)
 = 0020                      C	PAD_BLK 	    EQU  " "       ;AN000;CHAR FOR PAD FIELD
 = 0001                      C	STDOUT		    EQU  0001H	   ;AN000;Standard Output device handle
 = 0002                      C	STDERR		    EQU  0002H	   ;AN000;Standard Error Output device handle
			     C	
			     C	; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
			     C	;		SELECT MULTIPLEXOR INTERFACE
 = ADC1                      C	SELECT_MPX	    EQU  0ADC1H    ;AN006;THE SELECT MULTIPLEXOR ID
 = 00FF                      C	SELECT_PRESENT	    EQU  0FFH	   ;AN006;RESPONSE IN AL, IF SELECT IS PRESENT
 = 002F                      C	MULTIPLEXOR	    EQU  2FH	   ;AN006;THE MULTIPLEXOR INTERRUPT NUMBER
			     C	;---------------------------------------------------------------------------;
			     C	;			   CONTROL BLOCKS (STRUCS)			    ;
			     C	;---------------------------------------------------------------------------;
			     C	
			     C	MSG_DESC	    STRUC	   ;
 0000  0000                  C	MSG_NUM 	    DW	 0	   ;AN000;MESSAGE NUMBER (TO AX)
 0002  0001                  C	MSG_HANDLE	    DW	 STDOUT    ;AN000;HANDLE OF OUTPUT DEVICE (TO BX)
 0004  0000                  C	MSG_SUBLIST	    DW	 0	   ;AN000;POINTER TO SUBLIST (TO SI)
 0006  0000                  C	MSG_COUNT	    DW	 0	   ;AN000;SUBSTITUTION COUNT (TO CX)
 0008  FF00                  C	MSG_CLASS	    DW	 CLASS_A SHL 8 ;AN000;MESSAGE CLASS (IN HIGH BYTE, TO DH)
			     C					   ; LOW BYTE HAS 0 (FUNCTION "NO INPUT", TO DL);AN000;
 000A                        C	MSG_DESC	    ENDS	   ;AN000;
			     C	; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
			     C	SUBLIST 	    STRUC	   ;AN000;
 0000  0B                    C	SUB_SIZE	    DB	 11	   ;AN000;SUBLIST SIZE (POINTER TO NEXT SUBLIST)
 0001  00                    C	SUB_RES 	    DB	 0	   ;AN000;RESERVED
			     C					   ;NEXT FIELD IS TO BE USED AS A DOUBLE WORD
 0002  0000                  C	SUB_VALUE	    DW	 0	   ;AN000;TIME, DATE, OR PTR TO DATA ITEM
 0004  0000                  C	SUB_VALUE_SEG	    DW	 0	   ;AN000;SEG ID OF PTR
			     C					   ;(ABOVE FIELD MUST BE FILLED AT EXECUTION
			     C					   ; TIME, IF THIS IS A .COM FILE)
 0006  00                    C	SUB_ID		    DB	 0	   ;AN000;N OF %N
 0007  00                    C	SUB_FLAGS	    DB	 0	   ;AN000;DATA TYPE FLAGS
 0008  00                    C	SUB_MAX_WIDTH	    DB	 MAX_0	   ;AN000;MAXIMUM FIELD WIDTH (0=UNLIMITED)
 0009  00                    C	SUB_MIN_WIDTH	    DB	 0	   ;AN000;MINIMUM FIELD WIDTH
 000A  20                    C	SUB_PAD_CHAR	    DB	 PAD_BLK   ;AN000;CHARACTER FOR PAD FIELD
			     C					   ; CAN BE " ", "0" OR ",".
			     C					   ; "," CAUSES INSERTION OF THE ACTIVE
			     C					   ; THOUSANDS SEPARATOR BETWEEN EVERY
			     C					   ; 3 DIGITS.
 000B                        C	SUBLIST 	    ENDS	   ;AN000;
			     C	; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
			     C	;BUFFER AREA FOR COMMUNICATION WITH GET/SET MEDIA ID FUNCTION CALL
			     C	; (USED BY VOLSER PROC)
			     C	
			     C	;(deleted ;AN013;) A_MEDIA_ID_INFO     STRUC	      ; 			;AN000;
			     C	;(deleted ;AN013;) MI_LEVEL	       DW   0	      ;INFO LEVEL		;AN000;
			     C	;(deleted ;AN013;) MI_SERIAL	       DD   0	      ;SERIAL # 		;AN000;
			     C	;(deleted ;AN013;) MI_LABEL	       DB   11 DUP (' ') ;VOLUME LABEL          ;AN000;
			     C	;(deleted ;AN013;) MI_SYSTEM	       DB   8 DUP (' ') ;FILE SYSTEM TYPE       ;AN000;
			     C	;(deleted ;AN013;) A_MEDIA_ID_INFO     ENDS	      ; 			;AN000;
			     C	
			     C	;END OF DISKCOPY.EQU
				;$salut (4,2,9,41)
				;****************************************************************************
				;									    *
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:57
COPYINIT -- DISKCOPY INITIALIZATION PROGRAM                 Page     1-7


				;			 EXTERNAL VARIABLES				    *
				;									    *
				;****************************************************************************
				
				 EXTRN	PARSER:NEAR			;DCOPYPAR.SAL - DRIVES SYS PARSER	;AN000;
				
				 EXTRN	RECOMMENDED_BYTES_SECTOR:WORD	;SOURCE DRIVE DEFAULT BYTES/SECTOR
				 EXTRN	S_OWNER_SAVED:BYTE
				 EXTRN	T_OWNER_SAVED:BYTE
				 EXTRN	ASCII_DRV1_ID:BYTE		;40H	SOURCE DRIVE ID IN ASCII
				 EXTRN	ASCII_DRV2_ID:BYTE		;40H	TARGET DRIVE ID IN ASCII
				 EXTRN	MSGNUM_INVALID_DRV:BYTE 	;"INVALID DRIVE SPECIFICATION"		;AC000;
				 EXTRN	MSGNUM_NOT_COMPATIBLE :BYTE	;"DEVICE TYPE OF DISKETTE TYPES NOT COMPATIBLE";AC000;
				 EXTRN	MSGNUM_DRV_REDIRECTED:BYTE	;"INVALID, DRIVE REDIRECTED"		;AC000;
				
				
				 EXTRN	SUBLIST_8	     :WORD	;					;AN000;
				 EXTRN	SUBLIST_9	     :WORD	;					;AN000;
				 EXTRN	SUBLIST_13	     :WORD	;					;AN000;
				 EXTRN	SUBLIST_17A	     :WORD	;					;AN000;
				 EXTRN	SUBLIST_17B	     :WORD	;					;AN000;
				 EXTRN	SUBLIST_17C	     :WORD	;					;AN000;
				 EXTRN	SUBLIST_19C	     :WORD	;					;AN000;
				 EXTRN	SUBLIST_19D	     :WORD	;					;AN000;
				 EXTRN	SUBLIST_19E	     :WORD	;					;AN000;
				 EXTRN	SUBLIST_26A	     :WORD	;					;AN001;
				 EXTRN	SUBLIST_26B	     :WORD	;					;AN001;
				 EXTRN	SUBLIST_PARSE:WORD		;PARSE ERROR XX - %0			     ;AN003;
				
				.LIST
				 EXTRN	S_DRV_SECT_TRACK :BYTE		;SECT/TRACK
				 EXTRN	S_DRV_HEADS :BYTE		;# OF HEADS
				 EXTRN	S_DRV_TRACKS :BYTE		;# OF TRACKS
				 EXTRN	T_DRV_SECT_TRACK :BYTE
				 EXTRN	T_DRV_HEADS :BYTE
				 EXTRN	T_DRV_TRACKS :BYTE
				 EXTRN	SOURCE_DRIVE :BYTE		;SRC DRV LOGICAL NUMBER
				 EXTRN	TARGET_DRIVE :BYTE		;TARGET DRV LOGICAL NUMBER
				 EXTRN	COPY_TYPE :BYTE 		;1 = 1-DRIVE COPY  2 = 2-DRIVE COPY
				 EXTRN	USER_OPTION :BYTE		;NO OPTION (-1)  /1 (1), INVALID (9)
				 EXTRN	BUFFER_BEGIN :WORD		;STARTING BUFFER @ FOR LOADING
				 EXTRN	BUFFER_END :WORD		;ENDING BUFFER @ FOR LOADING
				 EXTRN	MAIN_EXIT :WORD 		;EXIT ADDRESS FOR CONTROL-BREAK
				
				 EXTRN	IO_ERROR :BYTE
				
				 EXTRN	DS_IOCTL_DRV_PARM :BYTE 	;PLACE HOLDER FOR DEFAULT SOURCE DRV PARM
				 EXTRN	DT_IOCTL_DRV_PARM :BYTE 	;PLACE HOLDER FOR DEFAULT TARGET DRV PARM
				 EXTRN	DS_specialFunctions :BYTE	;AND THEIR CONTENTS
				 EXTRN	DT_specialFunctions :BYTE
				 EXTRN	DS_deviceType:BYTE
				 EXTRN	DT_deviceType:BYTE
				 EXTRN	DS_deviceAttributes :WORD
				 EXTRN	DT_deviceAttributes :WORD
				 EXTRN	DS_numberOfCylinders :WORD
				 EXTRN	DT_numberOfCylinders :WORD
				 EXTRN	DS_mediaType :BYTE
				 EXTRN	DT_mediaType :BYTE
				 EXTRN	DS_BPB_PTR :BYTE
				 EXTRN	DT_BPB_PTR :BYTE
				
				 EXTRN	MS_IOCTL_DRV_PARM :BYTE 	;DRIVE PARM FROM SOURCE MEDIUM
				 EXTRN	MT_IOCTL_DRV_PARM :BYTE
				
				 EXTRN	GENERIC_IOCTL :NEAR
				 EXTRN	SET_LOGICAL_DRIVE :NEAR
				
				;		   $salut (4,20,24,41)	;					;AN000;
				MY_BPB		   STRUC
 0000  0000			CBYTE_SECT	   DW  0		; 200H	BYTES / SECTOR
 0002  00			CSECT_CLUSTER	   DB  0		; 2h	SECTORS / CLUSTER
 0003  0000			CRESEV_SECT	   DW  0		; 1h	RESERVED SECTORS
 0005  00			CFAT		   DB  0		; 2h	# OF FATS
 0006  0000			CROOTENTRY	   DW  0		; 70h	# OF ROOT ENTRIES
 0008  0000			CTOTSECT	   DW  0		; 02D0h TOTAL # OF SECTORS
									;   INC. BOOT SECT, DIRECTORIES
 000A  00			MEDIA_DESCRIP	   DB  0		;0FDh	MEDIA DISCRIPTOR
 000B  0000			CSECT_FAT	   DW  0		; 2h	SECTORS / FAT
 000D  0000			CSECT_TRACK	   DW  0		;
 000F  0000			CHEAD		   DW  0		;
 0011  00000000			CHIDDEN_SECT	   DD  0		;
 0015  00000000			BIG_TOT_SECT	   DD  0		;
 0019  0006[					   DB  6 DUP (0)	;
	   00			
			 ]	
				
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:57
COPYINIT -- DISKCOPY INITIALIZATION PROGRAM                 Page     1-8


 001F				MY_BPB		   ENDS
				
				
				;****************************************************************************
				;									    *
				;			 VARIABLE DECLARATIONS				    *
				;									    *
				;****************************************************************************
 0000  0000			DRIVE_VALID	   DW  ?		;DRIVE VALIDITY INDICATOR
 0002  00			DEFAULT_DRV	   DB  ?		;DEFAULT DRIVE ID (0=A,1=B,ETC)
 0003  00			NUMBER_OF_DRV	   DB  ?		;TOTAL # OF DISKT DRIVES ON THE SYS
									;(NUMBER_OF_DRV = 0 ---> 1 DRIVE)
 0004  20 3A 00			ASCII_DRIVE_LETTER DB  " :",0
						   PATHLABL COPYINIT	;AN015;
 0007                        1	    $$A_START_COPYINIT:                    ; 
						   HEADER <INIT - INITIALIZATION ROUTINE, MAIN PROGRAM> ;	;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:57
COPYINIT -- DISKCOPY INITIALIZATION PROGRAM                 Page     1-9
INIT - INITIALIZATION ROUTINE, MAIN PROGRAM			;AN000;       

				;	$salut (4,9,15,41)		;					;AN000;
				;#############################################################################
				;		      INITIALIZATION ROUTINE - MAIN PROGRAM
 0007				INIT	PROC  NEAR
					PUBLIC INIT			;MAKE ENTRY IN LINK MAP 		;AN000;
				
				;OUTPUT: DX = EXIT CODE, "FINE"
				;#############################################################################
				
 0007  A3 0000 R			MOV   DRIVE_VALID,AX		;SAVE DRIVE VALIDITY BYTE
				
				;		REPLACE THE "FILL_SEG" IN THE SUBLIST MESSAGE CONTROL BLOCKS.
				
				;		BECAUSE THIS IS A .COM STYLE FILE, THESE SEGID VALUES CANNOT
				;		BE PROVIDED BY THE DOS SYSTEM LOADER, BUT MUST BE DYNAMICALLY
				;		PERFORMED AT EXECUTION TIME AS PART OF A .COM FILE'S OBLIGATION
				;		TO BE "SELF-RELOCATING".
				
 000A  8C C8				MOV   AX,CS			;GET SEGID OF COMMON SEGMENT		;AN000;
 000C  A3 0004 E			MOV   SUBLIST_8.SUB_VALUE_SEG,AX ;					;AN000;
 000F  A3 0004 E			MOV   SUBLIST_9.SUB_VALUE_SEG,AX ;					;AN000;
 0012  A3 0004 E			MOV   SUBLIST_13.SUB_VALUE_SEG,AX ;					;AN000;
 0015  A3 0004 E			MOV   SUBLIST_17A.SUB_VALUE_SEG,AX ;					;AN000;
 0018  A3 0004 E			MOV   SUBLIST_17B.SUB_VALUE_SEG,AX ;					;AN000;
 001B  A3 0004 E			MOV   SUBLIST_17C.SUB_VALUE_SEG,AX ;					;AN000;
 001E  A3 0004 E			MOV   SUBLIST_19C.SUB_VALUE_SEG,AX ;					;AN000;
 0021  A3 0004 E			MOV   SUBLIST_19D.SUB_VALUE_SEG,AX ;					;AN000;
 0024  A3 0004 E			MOV   SUBLIST_19E.SUB_VALUE_SEG,AX ;					;AN000;
 0027  A3 0004 E			MOV   SUBLIST_26A.SUB_VALUE_SEG,AX ;					;AN001;
 002A  A3 0004 E			MOV   SUBLIST_26B.SUB_VALUE_SEG,AX ;					;AN001;
 002D  A3 0004 E			MOV   SUBLIST_PARSE.SUB_VALUE_SEG,AX ;					;AN003;
				
 0030  E8 0241 R			CALL  SETUP_CTRL_BREAK		;STEALS CTRL_BREAK
 0033  FC				CLD				;CLEAR DIRECTION FLAG
 0034  BA FFFF				MOV   DX,FINE			;ASSUME EVERYTHING IS FINE
				.LIST
 0037  E8 0000 E			CALL  PARSER			;LOOK AT DOS COMMAND LINE		;AN000;
				
 003A  83 FA FF				CMP   DX,FINE			;IF ALL OK				;AN000;
				;	$IF   E 			;					;AN000;
 003D  75 16				JNE $$IF1
 003F  E8 0056 R			    CALL  SOURCE_TARGET_DRV	;SET UP TO USE THE DRIVE LETTERS	;AN000;
				
 0042  E8 0084 R			    CALL  TEST_DRIVE_VALIDITY
				
 0045  83 FA FF				    CMP   DX,FINE
				;	    $IF   E			;					;AN000;
 0048  75 0B				    JNE $$IF2
 004A  E8 0175 R				CALL  DISKETTE_DRV_TYPE ;SOURCE & TARGET DRIVE TYPES
				
 004D  83 FA FF					CMP   DX,FINE		;IF FINE & DANDY
				;		$IF   E 		;					;AN000;
 0050  75 03					JNE $$IF3
 0052  E8 0219 R				    CALL  BUFFER_SIZE	;GET BUFFER SIZE FOR COPYING
				
				;		$ENDIF			;					;AN000;
 0055				$$IF3:
				;	    $ENDIF			;					;AN000;
 0055				$$IF2:
				;	$ENDIF				;					;AN000;
 0055				$$IF1:
 0055				EXIT_INIT:				;DX <-- 1  IF INIT OK
 0055  C3				RET				;DX <-- ERROR OFFSET IF NOT OK
									;RETURN TO CALLER
 0056				INIT	ENDP				;END INITIALLIZATION PROGRAM
				
				.LIST
					HEADER <SOURCE_TARGET_DRV - CONV. SRC/TARGET DRV TO BIOS VALUES> ;	;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:57
COPYINIT -- DISKCOPY INITIALIZATION PROGRAM                 Page     1-10
SOURCE_TARGET_DRV - CONV. SRC/TARGET DRV TO BIOS VALUES			;A

				;******************************************************************************
				; SUBROUTINE NAME :  SOURCE_TARGET_DRV	  DETERMINES SOURCE & TARGET DRIVES & *
				;					  CONVERT THEM FROM DOS TO BIOS VALUE *
				; INPUT 	  :  SOURCE_DRIVE & TARGET_DRIVE HAVE DOS DRIVE ID'S:         *
				;			  0 = DEFAULT	     1 = DRV A			      *
				;			  2 = DRV B	     3 = DRV C ETC		      *
				;									      *
				;									      *
				; OUTPUT	  :  DEFAULT_DRV: CURRENT DEFAULT DRIVE 		      *
				;			   0 - DRIVE A		 1 - DRIVE B		      *
				;			   2 - DRIVE C		 3 - DRIVE D		      *
				;									      *
				;		  :  SOURCE_DRIVE	   1 = DRIVE A	  2 = DRIVE B  ETC.   *
				;		  :  TARGET_DRIVE	   1 = DRIVE A	  2 = DRIVE B  ETC.   *
				;		       (UNCHANGED)					      *
				;******************************************************************************
 0056				SOURCE_TARGET_DRV PROC NEAR
					PUBLIC SOURCE_TARGET_DRV	;MAKE ENTRY IN LINK MAP 		;AN000;
									;GET CURRENT DEFAULT DRIVE
 0056  B4 19				MOV   AH,CURRENTDRV_FUNC	;FUNCTION CALL (19H)
									;(AL <- CURRENT DEFAULT DRV
 0058  CD 21				INT   21H			;0 = A, 1 = B, ETC)
				
 005A  A2 0002 R			MOV   DEFAULT_DRV,AL		;SAVE IT
 005D  FE C0				INC   AL			;NOW A=1, B=2, ETC			;AN000;
 005F  80 3E 0000 E 00			CMP   SOURCE_DRIVE,ZERO 	;FIRST DRV ENTERED?			;AC000;
				;	$IF   E 			;NO DRIVE LETTER ENTERED
 0064  75 08				JNE $$IF7
 0066  A2 0000 E			    MOV   SOURCE_DRIVE,AL	;USE DEFAULT DRIVE AS SOURCE		;AC000;
 0069  A2 0000 E			    MOV   TARGET_DRIVE,AL	; AND AS TARGET 			;AC000;
				;	$ELSE
 006C  EB 0A				JMP SHORT $$EN7
 006E				$$IF7:
 006E  80 3E 0000 E 00			    CMP   TARGET_DRIVE,ZERO	;WAS THE SECOND DRIVE ID SPECIFIED?	;AC000;
				;	    $IF   E			;NO, SO TARGET DRV IS DEFAULT		;AC000;
 0073  75 03				    JNE $$IF9
 0075  A2 0000 E				MOV   TARGET_DRIVE,AL	;USE DEFAULT DRIVE AS TARGET		;AC000;
				;	    $ENDIF
 0078				$$IF9:
				;	$ENDIF
 0078				$$EN7:
 0078  A1 0000 E			MOV   AX,WORD PTR SOURCE_DRIVE	;SOURCE TO AL, TARGET TO AH		;AC000;
 007B  00 06 0000 E			ADD   ASCII_DRV1_ID,AL		;MAKE THE DRIVE ALPHABET READABLE
 007F  00 26 0000 E			ADD   ASCII_DRV2_ID,AH		;IN THE MESSAGE
				
 0083  C3				RET
				
 0084				SOURCE_TARGET_DRV ENDP
					HEADER <TEST_DRIVE_VALIDITY - ARE SOURCE/TARGET DRIVES VALID?> ;	;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:57
COPYINIT -- DISKCOPY INITIALIZATION PROGRAM                 Page     1-11
TEST_DRIVE_VALIDITY - ARE SOURCE/TARGET DRIVES VALID?			;AN0

				;******************************************************************************
				; SUBROUTINE NAME :  TEST_DRIVE_VALIDITY--MAKE SURE SOURCE AND TARGET DRIVES  *
				;		     SPECIFIED BY USER ARE VALID FOR DISKCOPY		      *
				;									      *
				; INPUT 	  :  SOURCE_DRIVE:BYTE, TARGET_DRIVE:BYTE		      *
				;									      *
				; OUTPUT	  :  DX='FINE' IF DRIVES ARE VALID, ELSE DX CONTAINS MSG PTR  *
				;******************************************************************************
				
 0084				TEST_DRIVE_VALIDITY PROC NEAR
					PUBLIC TEST_DRIVE_VALIDITY	;MAKE ENTRY IN LINK MAP 		;AN000;
				
 0084  E8 00C8 R			CALL  DOS_DRIVE_VALIDITY
				
 0087  83 FA FF				CMP   DX,FINE
				;	$IF   E,AND			;					;AC000;
 008A  75 3B				JNE $$IF12
				
 008C  8A 1E 0000 E			MOV   BL,SOURCE_DRIVE
 0090  E8 01F8 R			CALL  CHECK_REDIRECTION
				
 0093  83 FA FF				CMP   DX,FINE
				;	$IF   E,AND			;					;AC000;
 0096  75 2F				JNE $$IF12
				
 0098  8A 1E 0000 E			MOV   BL,TARGET_DRIVE
 009C  E8 01F8 R			CALL  CHECK_REDIRECTION
				
 009F  83 FA FF				CMP   DX,FINE
				;	$IF   E,AND			;					;AC000;
 00A2  75 23				JNE $$IF12
				
 00A4  8A 1E 0000 E			MOV   BL,SOURCE_DRIVE
 00A8  E8 0252 R			CALL  CHECK_SERVER
				
 00AB  83 FA FF				CMP   DX,FINE
				;	$IF   E,AND			;					;AC000;
 00AE  75 17				JNE $$IF12
				
 00B0  8A 1E 0000 E			MOV   BL,TARGET_DRIVE
 00B4  E8 0252 R			CALL  CHECK_SERVER
				
 00B7  83 FA FF				CMP   DX,FINE
				;	$IF   E,AND			;					;AC000;
 00BA  75 0B				JNE $$IF12
				
 00BC  E8 00D3 R			CALL  TEST_REMOVABLE
				
 00BF  83 FA FF				CMP   DX,FINE
				;	$IF   E 			;					;AC000;
 00C2  75 03				JNE $$IF12
				
 00C4  E8 0106 R			    CALL  CHK_SINGLE_DRV_OP	;CHECK IF IT IS
									; ONE PHYSICAL DRIVE OPERATION
				;	$ENDIF				;					;AC000;
 00C7				$$IF12:
 00C7  C3				RET
				
 00C8				TEST_DRIVE_VALIDITY ENDP
					HEADER <DOS_DRIVE_VALIDITY - CHECK DOS DRIVE VALIDITY BYTE> ;		;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:57
COPYINIT -- DISKCOPY INITIALIZATION PROGRAM                 Page     1-12
DOS_DRIVE_VALIDITY - CHECK DOS DRIVE VALIDITY BYTE			;AN000;

				;******************************************************************************
				; SUBROUTINE NAME :  DOS_DRIVE_VALIDITY -- CHECK DOS DRIVE VALIDITY BYTE      *
				;									      *
				; INPUT 	  :  DRIVE_VALID:BYTE					      *
				;									      *
				; OUTPUT	  :  DX="FINE" IF DRIVES ARE VALID ELSE DX CONTAINS MESSAGE PTR *
				;******************************************************************************
				
 00C8				DOS_DRIVE_VALIDITY PROC NEAR
				
 00C8  83 3E 0000 R 00			CMP   DRIVE_VALID,0		;SEE IF DRIVES ARE VALID DOS DEVICE
				;	$IF   NE
 00CD  74 03				JE $$IF14
 00CF  BA 0000 E			    MOV   DX,OFFSET MSGNUM_INVALID_DRV ;				;AC000;
				;	$ENDIF
 00D2				$$IF14:
 00D2  C3				RET
				
 00D3				DOS_DRIVE_VALIDITY ENDP
					HEADER <TEST_REMOVABLE - IS SPECIFIED DRIVE REMOVABLE?> ;		;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:57
COPYINIT -- DISKCOPY INITIALIZATION PROGRAM                 Page     1-13
TEST_REMOVABLE - IS SPECIFIED DRIVE REMOVABLE?			;AN000;    

				;******************************************************************************
				; SUBROUTINE NAME :  TEST_REMOVABLE -- CHECK IF DRIVES SPECIFED ARE REMOVABLE *
				;									      *
				; INPUT 	  :  SOURCE_DRIVE:BYTE, TARGET_DRIVE:BYTE		      *
				;									      *
				; OUTPUT	  :  DX=FILE IF DRIVES ARE VALID ELSE DX CONTAINS MESSAGE PTR *
				;******************************************************************************
				
 00D3				TEST_REMOVABLE PROC NEAR
				
 00D3  8A 1E 0000 E			MOV   BL,SOURCE_DRIVE		;GET PARM 1 DRIVE ID
				
 00D7  B8 4408				MOV   AX,DRIVE_CHECK		;CHECK FOR REMOVABLE DRIVE = 4408h
 00DA  CD 21				INT   21H			;IOCTL CALL
				;	$IF   NC			;IF DRIVE ID IS WITHIN RANGE
 00DC  72 24				JC $$IF16
 00DE  3D 0000				    CMP   AX,REMOVABLE		;THEN IF SOURCE DRIVE IS FIXED
				;	    $IF   NE			;  THEN
 00E1  74 05				    JE $$IF17
 00E3  BA 0000 E				MOV   DX,OFFSET MSGNUM_INVALID_DRV ;GENERATE HARD		;AC000;
									; DRIVE ERROR MESSAGE
				;	    $ELSE			;ELSE, SRC IS REMOVABLE;
 00E6  EB 18				    JMP SHORT $$EN17
 00E8				$$IF17:
 00E8  8A 1E 0000 E				MOV   BL,TARGET_DRIVE	;NOW GO CHECK TARGET
				
 00EC  B8 4408					MOV   AX,DRIVE_CHECK	;CHECK FOR REMOVABLE DRIVE
 00EF  CD 21					INT   21H		;IOCTL CALL
				;		$IF   NC		;IF DRV WITHIN RANGE
 00F1  72 0A					JC $$IF19
 00F3  3D 0000					    CMP   AX,REMOVABLE	;THEN TGT DRV IS FIXED
				;		    $IF   NE		;     THEN
 00F6  74 03					    JE $$IF20
 00F8  BA 0000 E					MOV   DX,OFFSET MSGNUM_INVALID_DRV ;GENERATE HARD	;AC000;
									; DRV ERROR MSG
				;		    $ENDIF		;END TEST IF TGT DRV IS FIXED
 00FB				$$IF20:
				;		$ELSE			;TGT DRV OUT OF RANGE.	EX. DRIVE X:
 00FB  EB 03					JMP SHORT $$EN19
 00FD				$$IF19:
 00FD  BA 0000 E				    MOV   DX,OFFSET MSGNUM_INVALID_DRV ;			;AC000;
				;		$ENDIF			;END TEST IF TGT WITHIN RANGE
 0100				$$EN19:
				;	    $ENDIF			;END IF SRC IS REMOVABLE
 0100				$$EN17:
				;	$ELSE				;ELSE,	SRC DRV OUT OF RANGE
 0100  EB 03				JMP SHORT $$EN16
 0102				$$IF16:
 0102  BA 0000 E			    MOV   DX,OFFSET MSGNUM_INVALID_DRV ;PRINT ERROR MSG 		;AC000;
				;	$ENDIF				;END TEST IF SRC DRV WITHIN RANGE
 0105				$$EN16:
 0105  C3				RET
				
 0106				TEST_REMOVABLE ENDP
					HEADER <CHK_SINGLE_DRIV_OP - IS TARGET DRIVE SAME AS SOURCE?> ; 	;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:57
COPYINIT -- DISKCOPY INITIALIZATION PROGRAM                 Page     1-14
CHK_SINGLE_DRIV_OP - IS TARGET DRIVE SAME AS SOURCE?			;AN00

				;******************************************************************************
				; SUBROUTINE NAME :  CHK_SINGLE_DRV_OP					      *
				;									      *
				; INPUT 	  :  SOURCE_DRIVE - LOGICAL DRIVE NUMBER		      *
				;		     TARGET_DRIVE					      *
				;									      *
				; OUTPUT	  :  COPY_TYPE WILL BE SET TO ONE OR TWO DEPENDING ON THE     *
				;		     TEST RESULT.  IF IT IS A SINGLE DRIVE COPY, THEN	      *
				;		     TARGET DRIVE LETTER WILL BE CHANGED TO THAT OF SOURCE.   *
				;		     THE OWNERSHIP OF THE SOURCE AND TARGET DRIVE LETTER      *
				;		     MIGHT HAVE BEEN CHANGED.				      *
				;		     SO, BEFORE EXIT TO DOS, THEY SHOULD BE RESET TO THE SAVED*
				;		     ONE USING S_OWNER_SAVED AND T_OWNER_SAVED UNLESS THEY    *
				;		     ARE EQUAL TO 0. (0 MEANS ONLY ONE DRIVE LETTER ASSIGNED.)*
				;		     ASCII_DRV1_ID, ASCII_DRV2_ID MAY BE CHANGED ACCORDINGLY. *
				;******************************************************************************
				
 0106				CHK_SINGLE_DRV_OP PROC NEAR
				
 0106  50				PUSH  AX
				
 0107  8A 1E 0000 E			MOV   BL,SOURCE_DRIVE
 010B  E8 0168 R			CALL  GET_LOGICAL_DRIVE
				
 010E  A2 0000 E			MOV   S_OWNER_SAVED, AL 	;SAVE CURRENT OWNER DRIVE LETTER.
 0111  8A 1E 0000 E			MOV   BL, TARGET_DRIVE
 0115  E8 0168 R			CALL  GET_LOGICAL_DRIVE
				
 0118  A2 0000 E			MOV   T_OWNER_SAVED, AL 	;SAVE CURRENT OWNER
 011B  8A 1E 0000 E			MOV   BL, SOURCE_DRIVE
 011F  E8 0000 E			CALL  SET_LOGICAL_DRIVE
				
 0122  8A 1E 0000 E			MOV   BL, TARGET_DRIVE
 0126  E8 0000 E			CALL  SET_LOGICAL_DRIVE
				
 0129  8A 1E 0000 E			MOV   BL, SOURCE_DRIVE
 012D  E8 0168 R			CALL  GET_LOGICAL_DRIVE 	;CHECK SOURCE DRV LETTER
									; STILL HAS A OWNERSHIP.
				
 0130  3A 06 0000 E			CMP   AL, SOURCE_DRIVE		;
				;	$IF   NE			;IF IT DOES NOT, THEN A
 0134  74 1E				JE $$IF27
									; SINGLE DRIVE COPY.
 0136  C6 06 0000 E 01			    MOV   COPY_TYPE, ONE
 013B  8A 1E 0000 E			    MOV   BL, SOURCE_DRIVE
 013F  88 1E 0000 E			    MOV   TARGET_DRIVE, BL	;SET TARGET DRV LETTER
									; TO THAT OF SOURCE
 0143  8A 1E 0000 E			    MOV   BL, ASCII_DRV1_ID
 0147  88 1E 0000 E			    MOV   ASCII_DRV2_ID, BL
 014B  8A 1E 0000 E			    MOV   BL, SOURCE_DRIVE
 014F  E8 0000 E			    CALL  SET_LOGICAL_DRIVE	;SET THE OWNER BACK TO
									; SOURCE DRV LETTER
				
				;	$ELSE
 0152  EB 12				JMP SHORT $$EN27
 0154				$$IF27:
 0154  3A 06 0000 E			    CMP   AL, TARGET_DRIVE	;SOURCE DRV LETTER = TARGET DRV
									; LETTER CASE, FOR EX. DISKCOPY A: A:
				;	    $IF   E
 0158  75 07				    JNE $$IF29
 015A  C6 06 0000 E 01				MOV   COPY_TYPE, ONE
				;	    $ELSE
 015F  EB 05				    JMP SHORT $$EN29
 0161				$$IF29:
 0161  C6 06 0000 E 02				MOV   COPY_TYPE, TWO
				;	    $ENDIF
 0166				$$EN29:
				;	$ENDIF
 0166				$$EN27:
				
 0166  58				POP   AX
				
 0167  C3				RET
 0168				CHK_SINGLE_DRV_OP ENDP
					HEADER <GET_LOGICAL_DRIVE - GET LOG. DRIV NO. WHO OWNS PHYS. DRIVE> ;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:57
COPYINIT -- DISKCOPY INITIALIZATION PROGRAM                 Page     1-15
GET_LOGICAL_DRIVE - GET LOG. DRIV NO. WHO OWNS PHYS. DRIVE		

				;******************************************************************************
 0168				GET_LOGICAL_DRIVE PROC NEAR
				;	*** GET THE LOGICAL DRIVE NUMBER WHO HAS THE OWNERSHIP OF THE PHYSICAL
				;	    DRIVE.
				;	INPUT: BL = DRIVE NUMBER (0=DEFAULT, 1=A, 2=B...)
				;	OUTPUT: AL = DRIVE NUMBER (0= ONLY ONE DRIVE LETTER ASSIGNED TO THE
				;				      BLOCK DEVICE. OTHERWISE, 1=A, 2=B...)
				;
				;******************************************************************************
				
 0168  B4 44				MOV   AH, 44H
 016A  B0 0E				MOV   AL, 0EH			; GET THE OWNER OF LOGICAL DRIVE NUMBER
 016C  CD 21				INT   21H
 016E  3C 00				CMP   AL, 0			;ONLY ONE DRIVE LETTER ASSIGNED?
				;	$IF   E
 0170  75 02				JNE $$IF33
 0172  8A C3				    MOV   AL, BL		;THEN SET THE INPUT DRIVE NUMBER TO AL.
				;	$ENDIF
 0174				$$IF33:
				
 0174  C3				RET
				
 0175				GET_LOGICAL_DRIVE ENDP
					HEADER <DISKETTE_DRV_TYPE - CHECK COMPATABILITY SOURCE/TARGET DRIVES> ; ;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:57
COPYINIT -- DISKCOPY INITIALIZATION PROGRAM                 Page     1-16
DISKETTE_DRV_TYPE - CHECK COMPATABILITY SOURCE/TARGET DRIVES

				;******************************************************************************
				; SUBROUTINE NAME :  DISKETTE_DRV_TYPE DOES THE FOLLOWING:		      *
				;		     - GETS SOURCE, TARGET DRIVE INFORMATION		      *
				;		     - CHECK REMOVABLE DRIVE				      *
				; *** REMARK: WILL NOT ALLOW DISKCOPY BETWEEN 5.25" AND 3.5" DRIVES.	      *
				; *** ALSO, IN THE MAIN PROGRAM, SOURCE MEDIA BPB INFORMATIONS (# OF SEC/TRK, *
				; *** # OF TRACKS) SHOULD BE CHECKED AGAINST TARGET DEVICE INFORMATIONS.      *
				; *** IF # OF SECT/TRACK, # OF TRACKS OF TARGET DEVICE ARE EQUAL TO, OR       *
				; *** GREATER THAN THOSE OF THE SOURCE MEDIA BPB, THEN IT IS OK. OTHERWISE    *
				; *** DEVICE NOT COMPATIBLE.						      *
				; *** IF THIS DOES NOT GAURANTEES COMPATIBILITY BETWEEN SOURCE AND TARGET     *
				; *** DEVICE OR MEDIA, EVENTUALLY, FAILURE TO FORMAT THE TARGET WILL	      *
				; *** TELL THAT SOURCE, TARGET DEVICE OR MEDIA ARE NOT COMPATIBLE.	      *
				;									      *
				;******************************************************************************
 0175				DISKETTE_DRV_TYPE PROC NEAR
 0175  50				PUSH  AX
				
 0176  33 DB				xor   bx, bx
 0178  8A 1E 0000 E			MOV   BL, SOURCE_DRIVE
 017C  B1 60				MOV   CL, GETDEVPARM		;=60h
 017E  BA 0000 E			MOV   DX, OFFSET DS_IOCTL_DRV_PARM ;POINTER TO THE CONTROL STRING
 0181  E8 0000 E			CALL  GENERIC_IOCTL		;GET DEFAULT DEVICE PARM.
				
 0184  F7 06 0000 E 0001		TEST  DS_deviceAttributes, 0001h ;CHECK REMOVABLE. 0001 = NOT REMOVABLE
				;	$IF   E,AND			;NO, CONTINUE				;AC000;
 018A  75 67				JNE $$IF35
				
 018C  A1 0000 E			MOV   AX, DS_numberOfCylinders	;CURRENTLY IGNORE AH. ASSUME LESS
									; THAN TWO BYTES
 018F  A2 0000 E			MOV   S_DRV_TRACKS, AL
 0192  BB 0000 E			MOV   BX, OFFSET DS_BPB_PTR
 0195  8B 47 0F				MOV   AX, [BX].CHead
 0198  A2 0000 E			MOV   S_DRV_HEADS, AL
 019B  8B 47 0D				MOV   AX, [BX].CSECT_TRACK
 019E  A2 0000 E			MOV   S_DRV_SECT_TRACK, AL
 01A1  8B 07				MOV   AX, [BX].CBYTE_SECT	;RECOMMENDED BYTES/SECTOR
 01A3  A3 0000 E			MOV   RECOMMENDED_BYTES_SECTOR, AX
				
 01A6  33 DB				XOR   BX,BX
 01A8  8A 1E 0000 E			MOV   BL, TARGET_DRIVE
 01AC  B1 60				MOV   CL, GETDEVPARM
 01AE  BA 0000 E			MOV   DX, OFFSET DT_IOCTL_DRV_PARM
 01B1  E8 0000 E			CALL  GENERIC_IOCTL		;GET DEFAULT DEVICE PARM.
				
 01B4  F7 06 0000 E 0001		TEST  DT_deviceAttributes, 0001h ;FIXED DISK?
				;	$IF   Z 			;TARGET IS NOT FIXED DISK, OK		;AC000;
 01BA  75 37				JNZ $$IF35
				
 01BC  A1 0000 E			    MOV   AX, DT_numberOfCylinders
 01BF  A2 0000 E			    MOV   T_DRV_TRACKS, AL
 01C2  BB 0000 E			    MOV   BX, OFFSET DT_BPB_PTR
 01C5  8B 47 0F				    MOV   AX, [BX].CHead
 01C8  A2 0000 E			    MOV   T_DRV_HEADS, AL
 01CB  8B 47 0D				    MOV   AX, [BX].CSECT_TRACK
 01CE  A2 0000 E			    MOV   T_DRV_SECT_TRACK, AL
				
				;**NOW, CHECK SOURCE, TARGET DEVICE COMPATIBILITY
 01D1  BA FFFF				    MOV   DX, FINE		;GUESS, ALL WILL BE OK
									; DX MAY BE CHANGED TO REFLECT ERROR
 01D4  80 3E 0000 E 02			    CMP   DS_deviceType, DRV_720 ;0 - 48 TPI, 5.25", 96 TPI,
									; 5.25", 2 - 720kb, 3.5"
				;	    $IF   E			;WILL ONLY ALLOW DISKCOPY BETWEEN	;AC000;
 01D9  75 0C				    JNE $$IF36
									; 720KB, 3.5 SOURCE, TARGET
				
 01DB  80 3E 0000 E 02				CMP   DT_deviceType, DRV_720 ;target = 720KB also?
				;		$IF   NE		;					;AC000;
 01E0  74 03					JE $$IF37
 01E2  BA 0000 E				    MOV   DX, OFFSET MSGNUM_NOT_COMPATIBLE ;AC000;
				;		$ENDIF			;					;AC000;
 01E5				$$IF37:
				;	    $ELSE			;SINCE SOURCE NOT 720			;AC000;
 01E5  EB 0A				    JMP SHORT $$EN36
 01E7				$$IF36:
 01E7  80 3E 0000 E 02				CMP   DT_deviceType, DRV_720 ;SOURCE IS NOT 720kb,
									; IS TARGET 720?
				;		$IF   E 		;IF SO, THEN				;AC000;
 01EC  75 03					JNE $$IF40
									;DDT IS NOT COMPATIBLE
 01EE  BA 0000 E				    MOV   DX, OFFSET MSGNUM_NOT_COMPATIBLE ;			;AC000;
				;		$ENDIF			;					;AC000;
 01F1				$$IF40:
				;	    $ENDIF			;					;AC000;
 01F1				$$EN36:
				;	$ELSE				;SINCE SOURCE IS FIXED DISK, ERROR	;AC000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:57
COPYINIT -- DISKCOPY INITIALIZATION PROGRAM                 Page     1-17
DISKETTE_DRV_TYPE - CHECK COMPATABILITY SOURCE/TARGET DRIVES

 01F1  EB 03				JMP SHORT $$EN35
 01F3				$$IF35:
 01F3  BA 0000 E			    MOV   DX, OFFSET MSGNUM_INVALID_DRV ;ISSUE BAD DRV MSG		;AC000;
				;	$ENDIF				;					;AC000;
 01F6				$$EN35:
 01F6  58				POP   AX
 01F7  C3				RET
				
 01F8				DISKETTE_DRV_TYPE ENDP
					HEADER <CHECK_REDIRECTION - IS DEVICE REDIRECTED?> ;			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:57
COPYINIT -- DISKCOPY INITIALIZATION PROGRAM                 Page     1-18
CHECK_REDIRECTION - IS DEVICE REDIRECTED?			;AN000;         

				;******************************************************************************
				; SUBROUTINE NAME  : CHECK_REDIRECTION	 FIND OUT IF DEVICE IS REDIRECTED     *
				;					 IF IT IS, GENERATE ERROR MSG & EXIT  *
				; INPUT 	   : BL - DRIVE TO BE TESTED				      *
				;		   : AL : CURRENT DEFAULT DRIV				      *
				;									      *
				; OUTPUT	   : DX 	       = LOCAL_DRV  (-1)		      *
				;				       = DIRECTED   ( ERROR MSG OFFSET)       *
				;				       = INVALID_DRIVE (ERROR MSG OFFSET)     *
				;******************************************************************************
 01F8				CHECK_REDIRECTION PROC NEAR
				
 01F8  50				PUSH  AX			;SAVE REGISTERS
 01F9  53				PUSH  BX
 01FA  51				PUSH  CX
				
 01FB  8B CA				MOV   CX,DX			;SAVE RET TEMPORARILY
 01FD  B4 44				MOV   AH,IOCTL_FUNC		;GET IOCTL FUNTION &
 01FF  B0 09				MOV   AL,REDIRECTED_FUNC	;IOCTL SUB-FUNCTION ******CHECK***
				
 0201  CD 21				INT   21H			;AND GO FIND OUT IF IT'S LOCAL
				;	$IF   C
 0203  73 05				JNC $$IF45
 0205  B9 0000 E			    MOV   CX,OFFSET MSGNUM_INVALID_DRV ;REDIR INVALID			;AC000;
				
				;	$ELSE
 0208  EB 09				JMP SHORT $$EN45
 020A				$$IF45:
 020A  F7 C2 1000			    TEST  DX,REMOTE_DRV 	;IF DRIVE IS REDIRECTED
				;	    $IF   NZ
 020E  74 03				    JZ $$IF47
				
 0210  B9 0000 E				MOV   CX,OFFSET MSGNUM_DRV_REDIRECTED ; 			;AC000;
				;	    $ENDIF
 0213				$$IF47:
				;	$ENDIF
 0213				$$EN45:
 0213  8B D1				MOV   DX,CX			;GET ERROR MSG @
				
 0215  59				POP   CX			;RESTORE REGISTERS
 0216  5B				POP   BX
 0217  58				POP   AX
 0218  C3				RET				;RETURN TO CALLER
 0219				CHECK_REDIRECTION ENDP
					HEADER <BUFFER_SIZE - FINDS START AND END OF BUFFER> ;			;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:57
COPYINIT -- DISKCOPY INITIALIZATION PROGRAM                 Page     1-19
BUFFER_SIZE - FINDS START AND END OF BUFFER			;AN000;       

				;******************************************************************************
				; SUBROUTINE NAME :  BUFFER_SIZE    DETERMINES WHERE BUFFER STARTS & ENDS     *
				; INPUT 	  :  NONE						      *
				;									      *
				; OUTPUT	  :  BUFFER_BEGIN ADDRESS				      *
				;		  :  BUFFER_END   ADDRESS				      *
				;******************************************************************************
 0219				BUFFER_SIZE PROC NEAR
				
				
 0219  50				PUSH  AX			;SAVE REGISTERS
 021A  53				PUSH  BX
 021B  51				PUSH  CX
 021C  BB 0007 R			MOV   BX, offset init		;GET ADDR OF INIT + 1024 AS
									; A START OF BUFFER
 021F  81 C3 0400			add   bx, 1024			;(OFFSET FROM CS, IN BYTES)
 0223  B1 04				MOV   CL,4			;CONVERT OFFSET INTO SEGMT BY DIVIDING
 0225  D3 EB				SHR   BX,CL			;IT BY 16
				
 0227  8C C8				MOV   AX,CS			;CS + OFFSET => INIT+1024@ IN SEGMENT
 0229  03 D8				ADD   BX,AX			;WHERE BUFFER CAN START
				
									;NEED TO START AT A NEW SECTOR ==>
 022B  80 E3 E0				AND   BL,CLEAR_SEGMENT		;TRUNCATE TO PREVIOUS 512 BYTE BOUNDRY
									;(GET PREVIOUS SECTOR NUMBER)
 022E  83 C3 20				ADD   BX,20H			;THEN, ADVANCE TO THE BEGINNING OF
									;NEXT SECTOR (SINCE PART OF PREVIOUS
									;SECTOR WAS USED)
				
 0231  89 1E 0000 E			MOV   BUFFER_BEGIN,BX		;SAVE OUR BUFFER START SEGMENT ADDR
									;(AT THE BEGINNING OF A SECTOR WITH
									;SEGMENT BITS CLEARED)
				
 0235  8B 1E 0002			MOV   BX,DS:TWO 		;GET ADDR WHERE BUFFER ENDS
 0239  89 1E 0000 E			MOV   BUFFER_END,BX		;(TOP OF MEMORY, OFFSET 2 IN PSP)
				
 023D  59				POP   CX			;RESTORE REGISTERS
 023E  5B				POP   BX
 023F  58				POP   AX
 0240  C3				RET				;RETURN TO CALLER
 0241				BUFFER_SIZE ENDP
					HEADER <SETUP_CTRL_BREAK - SETUP THE CTRL-BREAK VECTOR> ;		;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:57
COPYINIT -- DISKCOPY INITIALIZATION PROGRAM                 Page     1-20
SETUP_CTRL_BREAK - SETUP THE CTRL-BREAK VECTOR			;AN000;    

				;******************************************************************************
 0241				SETUP_CTRL_BREAK PROC NEAR		;SETUP CTRL-BREAK VECTOR
				;******************************************************************************
 0241  50				PUSH  AX
 0242  53				PUSH  BX
 0243  52				PUSH  DX
 0244  06				PUSH  ES
				
 0245  B8 2523				MOV   AX,SET_CTL_BREAK_VECT	;SET THE CTRL-BREAK VECTOR
 0248  BA 0000 E			MOV   DX,OFFSET MAIN_EXIT
 024B  CD 21				INT   21H
				
 024D  07				POP   ES
 024E  5A				POP   DX
 024F  5B				POP   BX
 0250  58				POP   AX
 0251  C3				RET
				
 0252				SETUP_CTRL_BREAK ENDP
					HEADER <CHECK_SERVER - IS SERVER OR REDIRECTOR LOADED?> ;		;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:57
COPYINIT -- DISKCOPY INITIALIZATION PROGRAM                 Page     1-21
CHECK_SERVER - IS SERVER OR REDIRECTOR LOADED?			;AN000;    

				;******************************************************************************
 0252				CHECK_SERVER PROC NEAR			;SEE IF SERVER OR REDIRECTOR IS IN++
				;
				; INPUT: BL = DRIVE NUMBER (1=A,2=B ETC....)
				;******************************************************************************
 0252  B4 00				MOV   AH,0			;SEE IF SERVER LOADED
 0254  CD 2A				INT   SERVER
 0256  80 FC 00				CMP   AH,0
				;	$IF   E
 0259  75 05				JNE $$IF50
 025B  BA FFFF				    MOV   DX,FINE
				;	$ELSE
 025E  EB 1B				JMP SHORT $$EN50
 0260				$$IF50:
 0260  FE CB				    DEC   BL
 0262  80 C3 41				    ADD   BL,"A"		;CONVERT TO ASCII DRIVE LETTER
 0265  88 1E 0004 R			    MOV   ASCII_DRIVE_LETTER,BL ;PUT IN ASCIIZ STRING
 0269  BE 0004 R			    MOV   SI,OFFSET ASCII_DRIVE_LETTER
 026C  B4 03				    MOV   AH,SHARED
 026E  F8				    CLC
 026F  CD 2A				    INT   SERVER
				;	    $IF   C
 0271  73 05				    JNC $$IF52
 0273  BA 0000 E				MOV   DX,OFFSET MSGNUM_DRV_REDIRECTED ; 			;AC000;
				;	    $ELSE
 0276  EB 03				    JMP SHORT $$EN52
 0278				$$IF52:
 0278  BA FFFF					MOV   DX,FINE
				;	    $ENDIF
 027B				$$EN52:
				;	$ENDIF
 027B				$$EN50:
 027B  C3				RET
 027C				CHECK_SERVER ENDP
				
 027C				COPYINIT_END LABEL NEAR
					PUBLIC COPYINIT_END
				
					PATHLABL COPYINIT		;AN015;
 027C                        1	    $$A_STOP_COPYINIT:                     ; 
				
 027C				CSEG	ENDS
					END

Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:57
COPYINIT -- DISKCOPY INITIALIZATION PROGRAM                 Symbols-1


Macros:

		N a m e			Lines

DOSCALL  . . . . . . . . . . . .  	   8
HEADER . . . . . . . . . . . . .  	   4
MY_TRACKLAYOUT . . . . . . . . .  	 128
PATHLABL . . . . . . . . . . . .  	  16
PRINT  . . . . . . . . . . . . .  	   2

Structures and Records:

                N a m e                 Width   # fields
                                        Shift   Width   Mask    Initial

MSG_DESC . . . . . . . . . . . .  	000A	0005
  MSG_NUM  . . . . . . . . . . .  	0000
  MSG_HANDLE . . . . . . . . . .  	0002
  MSG_SUBLIST  . . . . . . . . .  	0004
  MSG_COUNT  . . . . . . . . . .  	0006
  MSG_CLASS  . . . . . . . . . .  	0008
MY_BPB . . . . . . . . . . . . .  	001F	000D
  CBYTE_SECT . . . . . . . . . .  	0000
  CSECT_CLUSTER  . . . . . . . .  	0002
  CRESEV_SECT  . . . . . . . . .  	0003
  CFAT . . . . . . . . . . . . .  	0005
  CROOTENTRY . . . . . . . . . .  	0006
  CTOTSECT . . . . . . . . . . .  	0008
  MEDIA_DESCRIP  . . . . . . . .  	000A
  CSECT_FAT  . . . . . . . . . .  	000B
  CSECT_TRACK  . . . . . . . . .  	000D
  CHEAD  . . . . . . . . . . . .  	000F
  CHIDDEN_SECT . . . . . . . . .  	0011
  BIG_TOT_SECT . . . . . . . . .  	0015
SUBLIST  . . . . . . . . . . . .  	000B	0009
  SUB_SIZE . . . . . . . . . . .  	0000
  SUB_RES  . . . . . . . . . . .  	0001
  SUB_VALUE  . . . . . . . . . .  	0002
  SUB_VALUE_SEG  . . . . . . . .  	0004
  SUB_ID . . . . . . . . . . . .  	0006
  SUB_FLAGS  . . . . . . . . . .  	0007
  SUB_MAX_WIDTH  . . . . . . . .  	0008
  SUB_MIN_WIDTH  . . . . . . . .  	0009
  SUB_PAD_CHAR . . . . . . . . .  	000A

Segments and Groups:

                N a m e         	Length	 Align	Combine Class

CSEG . . . . . . . . . . . . . .  	027C	PARA	PUBLIC	'CODE'

Symbols:            

                N a m e         	Type	 Value	 Attr

ASCII_DRIVE_LETTER . . . . . . .  	L BYTE	0004	CSEG
ASCII_DRV1_ID  . . . . . . . . .  	V BYTE	0000	CSEG	External
ASCII_DRV2_ID  . . . . . . . . .  	V BYTE	0000	CSEG	External

BAD  . . . . . . . . . . . . . .  	NUMBER	0001	
BAD_YESNO  . . . . . . . . . . .  	NUMBER	0002	
BEGIN_UNFORM_AREA  . . . . . . .  	NUMBER	0080	
BLANK  . . . . . . . . . . . . .  	NUMBER	0020	
BUFFER_BEGIN . . . . . . . . . .  	V WORD	0000	CSEG	External
BUFFER_END . . . . . . . . . . .  	V WORD	0000	CSEG	External
BUFFER_SIZE  . . . . . . . . . .  	N PROC	0219	CSEG	Length = 0028

CHECK_REDIRECTION  . . . . . . .  	N PROC	01F8	CSEG	Length = 0021
CHECK_SERVER . . . . . . . . . .  	N PROC	0252	CSEG	Length = 002A
CHK_SINGLE_DRV_OP  . . . . . . .  	N PROC	0106	CSEG	Length = 0062
CLASS_A  . . . . . . . . . . . .  	ALIAS	 UTILITY_MSG_CLASS		
CLEAR_SEGMENT  . . . . . . . . .  	NUMBER	00E0	
COPYINIT_END . . . . . . . . . .  	L NEAR	027C	CSEG	Global
COPY_TYPE  . . . . . . . . . . .  	V BYTE	0000	CSEG	External
CURRENTDRV_FUNC  . . . . . . . .  	NUMBER	0019	

DEFAULT_DRV  . . . . . . . . . .  	L BYTE	0002	CSEG
DISKETTE_DRV_TYPE  . . . . . . .  	N PROC	0175	CSEG	Length = 0083
DOS20  . . . . . . . . . . . . .  	NUMBER	0002	
DOSVER_FUNC  . . . . . . . . . .  	NUMBER	0030	
DOS_DRIVE_VALIDITY . . . . . . .  	N PROC	00C8	CSEG	Length = 000B
DRIVE_CHECK  . . . . . . . . . .  	NUMBER	4408	
DRIVE_VALID  . . . . . . . . . .  	L WORD	0000	CSEG
DRV_48TPI  . . . . . . . . . . .  	NUMBER	0000	
DRV_720  . . . . . . . . . . . .  	NUMBER	0002	
DRV_96TPI  . . . . . . . . . . .  	NUMBER	0001	
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:57
COPYINIT -- DISKCOPY INITIALIZATION PROGRAM                 Symbols-2


DS_BPB_PTR . . . . . . . . . . .  	V BYTE	0000	CSEG	External
DS_deviceAttributes  . . . . . .  	V WORD	0000	CSEG	External
DS_deviceType  . . . . . . . . .  	V BYTE	0000	CSEG	External
DS_IOCTL_DRV_PARM  . . . . . . .  	V BYTE	0000	CSEG	External
DS_mediaType . . . . . . . . . .  	V BYTE	0000	CSEG	External
DS_numberOfCylinders . . . . . .  	V WORD	0000	CSEG	External
DS_specialFunctions  . . . . . .  	V BYTE	0000	CSEG	External
DT_BPB_PTR . . . . . . . . . . .  	V BYTE	0000	CSEG	External
DT_deviceAttributes  . . . . . .  	V WORD	0000	CSEG	External
DT_deviceType  . . . . . . . . .  	V BYTE	0000	CSEG	External
DT_IOCTL_DRV_PARM  . . . . . . .  	V BYTE	0000	CSEG	External
DT_mediaType . . . . . . . . . .  	V BYTE	0000	CSEG	External
DT_numberOfCylinders . . . . . .  	V WORD	0000	CSEG	External
DT_specialFunctions  . . . . . .  	V BYTE	0000	CSEG	External

EIGHT  . . . . . . . . . . . . .  	NUMBER	0008	
END_UNFORM_AREA  . . . . . . . .  	NUMBER	0100	
EXIT_INIT  . . . . . . . . . . .  	L NEAR	0055	CSEG
EXTENDED_ERROR . . . . . . . . .  	NUMBER	0059	
EXT_ERR_CLASS  . . . . . . . . .  	NUMBER	0001	

FALSE  . . . . . . . . . . . . .  	NUMBER	0000	
FATAL  . . . . . . . . . . . . .  	NUMBER	0001	
FCB1_DRV_ID  . . . . . . . . . .  	NUMBER	005C	
FCB1_FILENM  . . . . . . . . . .  	NUMBER	005D	
FCB2_DRV_ID  . . . . . . . . . .  	NUMBER	006C	
FCB2_FILENM  . . . . . . . . . .  	NUMBER	006D	
FINE . . . . . . . . . . . . . .  	NUMBER	-0001		Global
FIRST  . . . . . . . . . . . . .  	NUMBER	0001	
FIVE . . . . . . . . . . . . . .  	NUMBER	0005	
FORMAT_FUNC  . . . . . . . . . .  	NUMBER	0042	
FORMAT_SP_FUNC . . . . . . . . .  	NUMBER	0000	
FOUR . . . . . . . . . . . . . .  	NUMBER	0004	

GENERIC_IOCTL  . . . . . . . . .  	L NEAR	0000	CSEG	External
GENERIC_IOCTL_CODE . . . . . . .  	NUMBER	000D	
GETDEVPARM . . . . . . . . . . .  	NUMBER	0060	
GET_ASSIGN_MODE  . . . . . . . .  	NUMBER	5F00	
GET_CTL_BREAK_VECT . . . . . . .  	NUMBER	3523	
GET_DATE . . . . . . . . . . . .  	NUMBER	002A	
GET_DISKBASE_VECTOR  . . . . . .  	NUMBER	351E	
GET_EXT_CNTRY_INFO . . . . . . .  	NUMBER	0065	
GET_LOGICAL_DRIVE  . . . . . . .  	N PROC	0168	CSEG	Length = 000D
GET_SP_FUNC_DEF  . . . . . . . .  	NUMBER	0000	
GET_SP_FUNC_MED  . . . . . . . .  	NUMBER	0001	
GET_TIME . . . . . . . . . . . .  	NUMBER	002C	
GOOD . . . . . . . . . . . . . .  	NUMBER	0000	

HARD_ERROR . . . . . . . . . . .  	NUMBER	0002	

INIT . . . . . . . . . . . . . .  	N PROC	0007	CSEG	Global	Length = 004F
INVAL_PARM . . . . . . . . . . .  	NUMBER	-0009	
IOCTL_FUNC . . . . . . . . . . .  	NUMBER	0044	
IO_ERROR . . . . . . . . . . . .  	V BYTE	0000	CSEG	External

KB_INPUT_FUNC  . . . . . . . . .  	NUMBER	0001	

LBL_COPYINIT . . . . . . . . . .  	NUMBER	0004	
LOCAL_DRV  . . . . . . . . . . .  	NUMBER	-0001	

MAIN_EXIT  . . . . . . . . . . .  	V WORD	0000	CSEG	External
MAJOR_CODE . . . . . . . . . . .  	NUMBER	0008	
MAX_0  . . . . . . . . . . . . .  	NUMBER	0000	
MSGNUM_DRV_REDIRECTED  . . . . .  	V BYTE	0000	CSEG	External
MSGNUM_INVALID_DRV . . . . . . .  	V BYTE	0000	CSEG	External
MSGNUM_NOT_COMPATIBLE  . . . . .  	V BYTE	0000	CSEG	External
MS_IOCTL_DRV_PARM  . . . . . . .  	V BYTE	0000	CSEG	External
MT_IOCTL_DRV_PARM  . . . . . . .  	V BYTE	0000	CSEG	External
MULTIPLEXOR  . . . . . . . . . .  	NUMBER	002F	

NINE . . . . . . . . . . . . . .  	NUMBER	0009	
NO . . . . . . . . . . . . . . .  	NUMBER	0000	
NO_ERROR . . . . . . . . . . . .  	NUMBER	0000	
NO_OPTION  . . . . . . . . . . .  	NUMBER	-0001	
NRLFUNC  . . . . . . . . . . . .  	NUMBER	5F02	
NRLMAX . . . . . . . . . . . . .  	NUMBER	001C	
NUMBER_OF_DRV  . . . . . . . . .  	L BYTE	0003	CSEG

OFF  . . . . . . . . . . . . . .  	NUMBER	0000	
OK . . . . . . . . . . . . . . .  	NUMBER	0000	
ON . . . . . . . . . . . . . . .  	NUMBER	0001	
ONE  . . . . . . . . . . . . . .  	NUMBER	0001	
OPTION_1 . . . . . . . . . . . .  	NUMBER	0001	

PAD_BLK  . . . . . . . . . . . .  	NUMBER	0020	
PARSER . . . . . . . . . . . . .  	L NEAR	0000	CSEG	External
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:57
COPYINIT -- DISKCOPY INITIALIZATION PROGRAM                 Symbols-3


PARSE_ERR_CLASS  . . . . . . . .  	NUMBER	0002	
PRINT_FUNC . . . . . . . . . . .  	NUMBER	0009	

READ_FUNC  . . . . . . . . . . .  	NUMBER	0061	
RECOMMENDED_BYTES_SECTOR . . . .  	V WORD	0000	CSEG	External
REDIRECTED_FUNC  . . . . . . . .  	NUMBER	0009	
REMOTE_DRV . . . . . . . . . . .  	NUMBER	1000	
REMOVABLE  . . . . . . . . . . .  	NUMBER	0000	
RET_CD_EXIT  . . . . . . . . . .  	NUMBER	004C	
R_W_SP_FUNC  . . . . . . . . . .  	NUMBER	0000	

SECOND . . . . . . . . . . . . .  	NUMBER	0002	
SECTOR14 . . . . . . . . . . . .  	NUMBER	000E	
SECTOR15 . . . . . . . . . . . .  	NUMBER	000F	
SECTOR8  . . . . . . . . . . . .  	NUMBER	0008	
SECTOR9  . . . . . . . . . . . .  	NUMBER	0009	
SELECT_MPX . . . . . . . . . . .  	NUMBER	ADC1	
SELECT_PRESENT . . . . . . . . .  	NUMBER	00FF	
SERVER . . . . . . . . . . . . .  	NUMBER	002A	
SETDEVPARM . . . . . . . . . . .  	NUMBER	0040	
SETUP_CTRL_BREAK . . . . . . . .  	N PROC	0241	CSEG	Length = 0011
SET_ASSIGN_MODE  . . . . . . . .  	NUMBER	5F01	
SET_CTL_BREAK_VECT . . . . . . .  	NUMBER	2523	
SET_DISKBASE_VECTOR  . . . . . .  	NUMBER	251E	
SET_LOGICAL_DRIVE  . . . . . . .  	L NEAR	0000	CSEG	External
SET_LOGIC_DRIVE  . . . . . . . .  	NUMBER	000F	
SET_SP_BF_FORM . . . . . . . . .  	NUMBER	0005	
SET_SP_FUNC_DEF  . . . . . . . .  	NUMBER	0004	
SET_SP_FUNC_DOS  . . . . . . . .  	NUMBER	0004	
SEVEN  . . . . . . . . . . . . .  	NUMBER	0007	
SHARED . . . . . . . . . . . . .  	NUMBER	0003	
SIX  . . . . . . . . . . . . . .  	NUMBER	0006	
SOFT_ERROR . . . . . . . . . . .  	NUMBER	0001	
SOURCE_DRIVE . . . . . . . . . .  	V BYTE	0000	CSEG	External
SOURCE_TARGET_DRV  . . . . . . .  	N PROC	0056	CSEG	Global	Length = 002E
STATUS_CHK . . . . . . . . . . .  	NUMBER	0001	
STDERR . . . . . . . . . . . . .  	NUMBER	0002	
STDOUT . . . . . . . . . . . . .  	NUMBER	0001	
STD_ERROR  . . . . . . . . . . .  	NUMBER	0002	
SUBLIST_13 . . . . . . . . . . .  	V WORD	0000	CSEG	External
SUBLIST_17A  . . . . . . . . . .  	V WORD	0000	CSEG	External
SUBLIST_17B  . . . . . . . . . .  	V WORD	0000	CSEG	External
SUBLIST_17C  . . . . . . . . . .  	V WORD	0000	CSEG	External
SUBLIST_19C  . . . . . . . . . .  	V WORD	0000	CSEG	External
SUBLIST_19D  . . . . . . . . . .  	V WORD	0000	CSEG	External
SUBLIST_19E  . . . . . . . . . .  	V WORD	0000	CSEG	External
SUBLIST_26A  . . . . . . . . . .  	V WORD	0000	CSEG	External
SUBLIST_26B  . . . . . . . . . .  	V WORD	0000	CSEG	External
SUBLIST_8  . . . . . . . . . . .  	V WORD	0000	CSEG	External
SUBLIST_9  . . . . . . . . . . .  	V WORD	0000	CSEG	External
SUBLIST_PARSE  . . . . . . . . .  	V WORD	0000	CSEG	External
S_DRV_HEADS  . . . . . . . . . .  	V BYTE	0000	CSEG	External
S_DRV_SECT_TRACK . . . . . . . .  	V BYTE	0000	CSEG	External
S_DRV_TRACKS . . . . . . . . . .  	V BYTE	0000	CSEG	External
S_OWNER_SAVED  . . . . . . . . .  	V BYTE	0000	CSEG	External

TARGET_DRIVE . . . . . . . . . .  	V BYTE	0000	CSEG	External
TEN  . . . . . . . . . . . . . .  	NUMBER	000A	
TEST_DRIVE_VALIDITY  . . . . . .  	N PROC	0084	CSEG	Global	Length = 0044
TEST_REMOVABLE . . . . . . . . .  	N PROC	00D3	CSEG	Length = 0033
THREE  . . . . . . . . . . . . .  	NUMBER	0003	
TRUE . . . . . . . . . . . . . .  	NUMBER	0001	
TWO  . . . . . . . . . . . . . .  	NUMBER	0002	
TYPE_4 . . . . . . . . . . . . .  	NUMBER	0004	
T_DRV_HEADS  . . . . . . . . . .  	V BYTE	0000	CSEG	External
T_DRV_SECT_TRACK . . . . . . . .  	V BYTE	0000	CSEG	External
T_DRV_TRACKS . . . . . . . . . .  	V BYTE	0000	CSEG	External
T_OWNER_SAVED  . . . . . . . . .  	V BYTE	0000	CSEG	External

USER_OPTION  . . . . . . . . . .  	V BYTE	0000	CSEG	External
UTILITY_MSG_CLASS  . . . . . . .  	NUMBER	00FF	

VERIFY_FUNC  . . . . . . . . . .  	NUMBER	0062	

WRITE_FILE . . . . . . . . . . .  	NUMBER	0040	
WRITE_FUNC . . . . . . . . . . .  	NUMBER	0041	

YES  . . . . . . . . . . . . . .  	NUMBER	0001	
YESNO_CHECK  . . . . . . . . . .  	NUMBER	0023	

ZERO . . . . . . . . . . . . . .  	NUMBER	0000	

$$A_START_COPYINIT . . . . . . .  	L NEAR	0007	CSEG	Global
$$A_STOP_COPYINIT  . . . . . . .  	L NEAR	027C	CSEG	Global
$$EN16 . . . . . . . . . . . . .  	L NEAR	0105	CSEG
$$EN17 . . . . . . . . . . . . .  	L NEAR	0100	CSEG
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:57
COPYINIT -- DISKCOPY INITIALIZATION PROGRAM                 Symbols-4


$$EN19 . . . . . . . . . . . . .  	L NEAR	0100	CSEG
$$EN27 . . . . . . . . . . . . .  	L NEAR	0166	CSEG
$$EN29 . . . . . . . . . . . . .  	L NEAR	0166	CSEG
$$EN35 . . . . . . . . . . . . .  	L NEAR	01F6	CSEG
$$EN36 . . . . . . . . . . . . .  	L NEAR	01F1	CSEG
$$EN45 . . . . . . . . . . . . .  	L NEAR	0213	CSEG
$$EN50 . . . . . . . . . . . . .  	L NEAR	027B	CSEG
$$EN52 . . . . . . . . . . . . .  	L NEAR	027B	CSEG
$$EN7  . . . . . . . . . . . . .  	L NEAR	0078	CSEG
$$IF1  . . . . . . . . . . . . .  	L NEAR	0055	CSEG
$$IF12 . . . . . . . . . . . . .  	L NEAR	00C7	CSEG
$$IF14 . . . . . . . . . . . . .  	L NEAR	00D2	CSEG
$$IF16 . . . . . . . . . . . . .  	L NEAR	0102	CSEG
$$IF17 . . . . . . . . . . . . .  	L NEAR	00E8	CSEG
$$IF19 . . . . . . . . . . . . .  	L NEAR	00FD	CSEG
$$IF2  . . . . . . . . . . . . .  	L NEAR	0055	CSEG
$$IF20 . . . . . . . . . . . . .  	L NEAR	00FB	CSEG
$$IF27 . . . . . . . . . . . . .  	L NEAR	0154	CSEG
$$IF29 . . . . . . . . . . . . .  	L NEAR	0161	CSEG
$$IF3  . . . . . . . . . . . . .  	L NEAR	0055	CSEG
$$IF33 . . . . . . . . . . . . .  	L NEAR	0174	CSEG
$$IF35 . . . . . . . . . . . . .  	L NEAR	01F3	CSEG
$$IF36 . . . . . . . . . . . . .  	L NEAR	01E7	CSEG
$$IF37 . . . . . . . . . . . . .  	L NEAR	01E5	CSEG
$$IF40 . . . . . . . . . . . . .  	L NEAR	01F1	CSEG
$$IF45 . . . . . . . . . . . . .  	L NEAR	020A	CSEG
$$IF47 . . . . . . . . . . . . .  	L NEAR	0213	CSEG
$$IF50 . . . . . . . . . . . . .  	L NEAR	0260	CSEG
$$IF52 . . . . . . . . . . . . .  	L NEAR	0278	CSEG
$$IF7  . . . . . . . . . . . . .  	L NEAR	006E	CSEG
$$IF9  . . . . . . . . . . . . .  	L NEAR	0078	CSEG
@CPU . . . . . . . . . . . . . .  	TEXT  0101h		
@FILENAME  . . . . . . . . . . .  	TEXT  copyinit		
@VERSION . . . . . . . . . . . .  	TEXT  510		


   1460 Source  Lines
   1540 Total   Lines
    252 Symbols

  45932 + 222566 Bytes symbol space free

      0 Warning Errors
      0 Severe  Errors
