Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:55
COMPINIT -- DISKCOMP INITIALIZATION PROGRAM                 Page     1-1


					PAGE	90,132			;A2
					TITLE	COMPINIT -- DISKCOMP INITIALIZATION PROGRAM
				;****************** START OF SPECIFICATIONS *****************************
				; MODULE NAME: COMPINIT
				
				; DESCRIPTIVE NAME: Initialization for Diskette to diskette copy Utility
				
				;FUNCTION: DISKCOMP is to compare the contents of the diskette in the
				;	   specified source drive to the diskette in the target
				;	   drive.  If necessary for the diskettes to use volume serial
				;	   numbers, the actual value of those number is ignored.
				
				;	   Multiple compares may be performed with one load of DISKCOMP.
				;	   A prompt, "Compare another (Y/N)?" permits additional
				;	   executions, all with the same drive specifications.
				
				; ENTRY POINT: "DISKCOMP" at ORG 100h, jumps to "BEGIN".
				
				; INPUT: (DOS command line parameters)
				
				;	      [d:][path] DISKCOMP  [d: [d:]] [/1] [/8]
				
				;	 WHERE
				;	      [d:][path] - Path where the DISKCOMP command resides.
				
				;	      [d:] - To specify the Source drive
				;
				;	      [d:] - To specify the Target drive
				;
				;	      [/1] - To compare only the first side of the diskette,
				;		     regardless of the diskette or drive type.
				
				;	      [/8] - To compare only the first 8 sectors per track,
				;		     even if the first diskette contains 9/15 sectors
				;		     per track.
				;
				; 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 compared, including the unused
				;	   sectors.  There is no awareness of the separate files
				;	   involved.  A unique volume serial number, if present,
				;	   is ignored in the comparison process.
				
				; INCLUDED FILES:
				;	   PATHMAC.INC - PATHGEN MACRO
				;	   INCLUDE DCMPMACR.INC 	   ;(FORMERLY CALLED MACRO.DEF)
				
				; INTERNAL REFERENCES:
				;    ROUTINES:
				;	  INIT - initialization main routine
				;	  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 logical drive who owns the 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:
				;	 DCOMPSM.SAL - Defines the control blocks that describe the messages
				;	 DCOMPPAR.SAL - Defines the control blocks that describe the
				;		DOS Command line parameters.
				
				; NOTES:
				;	 This module should be processed with the SALUT preprocessor
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:55
COMPINIT -- DISKCOMP INITIALIZATION PROGRAM                 Page     1-2


				;	 with the re-alignment not requested, as:
				
				;		SALUT COMPINIT,NUL
				
				;	 To assemble these modules, the alphabetical or sequential
				;	 ordering of segments may be used.
				
				;	 For instructions as to how to LINK, see prolog for DISKCOMP.
				
				;PROGRAM AUTHOR: Original written by: Jin K.
				;		 4.00 modifications by: Edwin M. K.
				;****************** END OF SPECIFICATIONS *****************************
				
				;REVISION HISTORY:
				;DATE:	 10-30-84 - chk_para routine added. Many parts are modified to
				;	 permit DISKCOMP /1, DISKCOMP D: /1 cases. Restore diskbase
				;	 before return to DOS when invalid DOS version occurs.
				;DATE:	 3-27-85  MAIN PARTS OF DISKCOMP PROGRAM HAS BEEN REWRITTEN
				;	 TO USE NEW IOCTL FUNCTIONS 'READ', 'GET_DEVICE_PARAMETERS'.
				;	A000 - Change spelling of "LOCAL" to "LOCALX" to make MASM 3 happy.
				
					INCLUDE PATHMAC.INC		;AN013;
			     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
					INCLUDE DCMPMACR.INC		;(FORMERLY CALLED MACRO.DEF)
			     C		ELSE				;AN000;
			     C	;	    %OUT INCLUDING DCMPMACR.INC...
			     C		ENDIF				;AN000;
			     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	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;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:55
COMPINIT -- DISKCOMP INITIALIZATION PROGRAM                 Page     1-3


			     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	.list						   ;AN000;
			     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;
			     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;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:55
COMPINIT -- DISKCOMP INITIALIZATION PROGRAM                 Page     1-4


			     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;
			     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	
				
 0000				CSEG	SEGMENT PARA PUBLIC 'CODE'	;					     ;AC000;
					ASSUME	CS:CSEG, DS:CSEG, ES:CSEG, SS:CSEG
				
					INCLUDE DISKCOMP.EQU
			     C	
			     C		ELSE
			     C	;		%OUT INCLUDING DISKCOMP.EQU...
			     C		ENDIF
			     C	
			     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
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:55
COMPINIT -- DISKCOMP INITIALIZATION PROGRAM                 Page     1-5


 = 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
 = 0002                      C	HARD_ERROR	EQU	02
 = 0001                      C	SOFT_ERROR	EQU	01
 = 0000                      C	NO_ERROR	EQU	0
			     C	;DOS_LEVEL	 EQU	 0314H	 ;DOS VERSION 3.20
 = 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 FUNTION
 = 001C                      C	NRLMAX		EQU	1CH	;(MAXIMUM # OF NAMES ON NRL) - 1
 = 0002                      C	DOS20		EQU	2	;DOS VERSION 2.0
			     C			PUBLIC	FINE	;						;AN000;
 =-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	
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:55
COMPINIT -- DISKCOMP INITIALIZATION PROGRAM                 Page     1-6


			     C	PAGE
			     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	
			     C	;			*** DOS FUNCTONS ***
			     C	
 = 004C                      C	RET_CD_EXIT	EQU	4CH	;EXIT TO DOS, PASSING RETURN CODE		;AN000;
 = 0002                      C	PUT_CHAR	EQU	02H	;DOS DISPLAY OUTPUT FUNCTION
 = 0009                      C	PRINT_FUNC	EQU	09H	;DOS PRINT STRING FUNCTION
 = 0009                      C	REDIRECTED_FUNC EQU	09H	;IOCTL SUB FUNCTION ****** TO BE CHECKED ****
 = 0C01                      C	KB_INPUT_FUNC	EQU	0C01H	;DOS KEYBOARD INPUT (CLEARS INPUT BUFF FIRST)
 = 0019                      C	CURRENTDRV_FUNC EQU	19H	;GET CURRENT DRIVE FUNCTION CALL
			     C	;DOSVER_FUNC	 EQU	 30H	 ;DOS VERSION FUNCTION CALL
 = 0044                      C	IOCTL_FUNC	EQU	44H	;IOCTL FUNCTION CALL
 = 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
 = 0065                      C	GET_EXT_CNTRY_INFO EQU	65H	;GET EXTENDED COUNTRY INFO			;AN000;
 = 0023                      C	YESNO_CHECK	EQU	23H	;REQUEST (Y/N) CHECK OF GET_EXT_CNTRY_INFO	;AN000;
 = 0001                      C	YES		EQU	1	;(Y/N) RESPONSE IS "YES"                        ;AN000;
 = 0002                      C	BAD_YESNO	EQU	2	;(Y/N) RESPONSE IS NEITHER "Y" NOR "N"          ;AN000;
			     C	
			     C	;IOCTL DISKETTE I/O FUNCTIONS
 = 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 RAED FUNCITON
 = 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 FUNCITON
 = 0060                      C	GETDEVPARM	EQU	60H	;IOCTL GET DEVICE PARAMETER
 = 0040                      C	SETDEVPARM	EQU	40H	;IOCTL SET DEVICE PARAMETER
 = 000F                      C	SET_LOG_DRIVE	EQU	0FH	;SET LOGICAL DRIVE				;AN000;
 = 0069                      C	GSET_MEDIA_ID	EQU	69H	;GET/SET MEDIA ID				;AN008;
 = 0000                      C	GET_ID		EQU	0	;AL=0, GET MEDIA ID				;AN008;
 = 0001                      C	SET_ID		EQU	1	;AL=1, SET MEDIA ID				;AN008;
			     C	;
 = 0059                      C	COMPARE_FUNC	EQU	59H	;JUST USED TO IDENTIFY FOR ERROR MESSAGE
			     C	;
			     C	;specialFunctions
 = 0000                      C	GET_SP_FUNC_DEF  EQU	 00000000B		 ;GET DEVICE PARM. DEFAULT BPB
 = 0001                      C	GET_SP_FUNC_MED  EQU	 00000001B		 ;GET DEVICE PARM. media 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
 = 0000                      C	R_W_SP_FUNC	 EQU	 00000000B		 ;READ, WRITE
			     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	;		    *** COPY STATUS BYTE ***
			     C	
 = 0001                      C	FATAL		EQU	01H	;FATAL COPY ERROR, ABORT
 = 0000                      C	OK		EQU	00H	;OK, PROCEED
			     C	
			     C	;		    *** MESSAGES SUBLIST DESCRIPTOR ***
			     C	
			     C	SUBLIST 	  STRUC 							;AN000;
 0000  00                    C	SUB_SIZE	  DB	?      ;SUBLIST SIZE (POINTER TO NEXT SUBLIST)	       ;AN000;
 0001  00                    C	SUB_RES 	  DB	?	;RESERVED					;AN000;
			     C					;NEXT FIELD IS TO BE USED AS A DOUBLE WORD	;AN000;
 0002  0000                  C	SUB_VALUE	  DW	?	;TIME, DATE, OR PTR TO DATA ITEM		;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:55
COMPINIT -- DISKCOMP INITIALIZATION PROGRAM                 Page     1-7


 0004  0000                  C	SUB_VALUE_SEG	  DW	?	;SEG ID OF PTR					;AN000;
			     C					;(ABOVE FIELD MUST BE FILLED AT EXECUTION TIME	;AN000;
			     C					; IF THIS IS A .COM FILE)			;AN000;
 0006  00                    C	SUB_ID		  DB	?	;N OF %N					;AN000;
 0007  00                    C	SUB_FLAGS	  DB	?	;DATA TYPE FLAGS				;AN000;
 0008  00                    C	SUB_MAX_WIDTH	  DB	?	;MAXIMUM FIELD WIDTH (0=UNLIMITED)		;AN000;
 0009  00                    C	SUB_MIN_WIDTH	  DB	?	;MINIMUM FIELD WIDTH				;AN000;
 000A  00                    C	SUB_PAD_CHAR	  DB	?	;CHARACTER FOR PAD FIELD			;AN000;
			     C					; CAN BE " ", "0" OR ",".                       ;AN000;
			     C					; "," CAUSES INSERTION OF THE ACTIVE            ;AN000;
			     C					; THOUSANDS SEPARATOR BETWEEN EVERY 3 DIGITS.	;AN000;
 000B                        C	SUBLIST 	  ENDS								;AN000;
			     C	
			     C	  ;BUFFER AREA FOR COMMUNICATION WITH GET/SET MEDIA ID FUNCTION CALL:
			     C	;(deleted ;AN011;) A_MEDIA_ID_INFO struc
			     C	;(deleted ;AN011;) MI_level	   dw	   0		   ;info level
			     C	;(deleted ;AN011;) MI_Serial	   dd	   0		   ;Serial #
			     C	;(deleted ;AN011;) MI_Label	   db	   11 dup (' ')    ;Volume Label
			     C	;(deleted ;AN011;) MI_System	   db	    8 dup (' ')    ;File System type
			     C	;(deleted ;AN011;) A_MEDIA_ID_INFO ends
			     C			INCLUDE BOOTFORM.INC	;GET DESCRIPTION OF BOOT RECORD
			     C		%OUT BOOTFORM.INC...
			     C	;****************************************************************************
			     C	;AN000; - Structure of the Extended IBMBOOT record for DOS -. J.K.
			     C	;AN001; - D304 Include PHYDRV, CURHD to the header structure	 11/09/87 J.K.
			     C	;****************************************************************************
			     C	
 = 0200                      C	BOOT_SIZE		 EQU	 512
 = 0029                      C	EXT_BOOT_SIGNATURE	 EQU	 41		;Extended boot signature
			     C	;
			     C	EXT_BPB_INFO		STRUC
 0000  0000                  C	EBPB_BYTESPERSECTOR	 DW	 ?
 0002  00                    C	EBPB_SECTORSPERCLUSTER	 DB	 ?
 0003  0000                  C	EBPB_RESERVEDSECTORS	 DW	 ?
 0005  00                    C	EBPB_NUMBEROFFATS	 DB	 ?
 0006  0000                  C	EBPB_ROOTENTRIES	 DW	 ?
 0008  0000                  C	EBPB_TOTALSECTORS	 DW	 ?
 000A  00                    C	EBPB_MEDIADESCRIPTOR	 DB	 ?
 000B  0000                  C	EBPB_SECTORSPERFAT	 DW	 ?
 000D  0000                  C	EBPB_SECTORSPERTRACK	 DW	 ?
 000F  0000                  C	EBPB_HEADS		 DW	 ?
 0011  00000000              C	EBPB_HIDDENSECTOR	 DD	 ?
 0015  00000000              C	EBPB_BIGTOTALSECTORS	 DD	 ?
 0019                        C	EXT_BPB_INFO		ENDS
			     C	;
			     C	;AN001; EXT_PHYDRV, EXT_CURHD included in the header for OS2.
			     C	EXT_IBMBOOT_HEADER	STRUC
 0000  0003[                 C	EXT_BOOT_JUMP		DB	3 DUP (?)
	   ??                C	
			 ]   C	
			     C	
 0003  0008[                 C	EXT_BOOT_OEM		DB	8 DUP (?)
	   ??                C	
			 ]   C	
			     C	
 000B  0019[                 C	EXT_BOOT_BPB		DB	type EXT_BPB_INFO dup (?)
	   ??                C	
			 ]   C	
			     C	
 0024  80                    C	EXT_PHYDRV		DB	80h
 0025  00                    C	EXT_CURHD		DB	0
 0026  29                    C	EXT_BOOT_SIG		DB	EXT_BOOT_SIGNATURE
 0027  00000000              C	EXT_BOOT_SERIAL 	DD	?
 002B  000B[                 C	EXT_BOOT_VOL_LABEL	DB	11 DUP (?)
	   ??                C	
			 ]   C	
			     C	
 0036  0008[                 C	EXT_SYSTEM_ID		DB	8  DUP (?)
	   ??                C	
			 ]   C	
			     C	
 003E                        C	EXT_IBMBOOT_HEADER	ENDS
			     C	;
 = 01FE                      C	BOOT_SIGNATURE	=     word ptr (BOOT_SIZE-2)
			     C	
			     C	;
			     C	;J.K. This is the number of sectors (of size 512 bytes) that will cover
			     C	;the size of IBMLOAD program.  IBMBOOT program has to at least read this
			     C	;many sectors, and these sectors should be the first cluster and consecutive.
			     C	;Make sure IBMBOOT program uses the same value as this.
 = 0003                      C	IBMLOADSIZE	equ	3	;Number of sectors IBMBOOT program should read in.
			     C	
			     C	
 =                           C	VOL_SERIAL	EQU	EXT_BOOT_SERIAL ;LOCATION IN BOOT RECORD OF VOLSER NUM	;AN000;
			     C	
 = 0090				NOOP	EQU	90H			;NO-OPERTION INSTRUCTION, USED TO DELETE     ;AN001;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:55
COMPINIT -- DISKCOMP INITIALIZATION PROGRAM                 Page     1-8


									; 386 SUPPORT				;AN001;
				;$salut (4,2,9,41)
				;****************************************************************************
				;									    *
				;			 EXTERNAL VARIABLES				    *
				;									    *
				;****************************************************************************
				 EXTRN	PARSER:NEAR			;DCOPYPAR.SAL - DRIVES SYS PARSER	;AN000;
				
				 EXTRN	RECOMMENDED_BYTES_SECTOR:WORD
				 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	SUBLIST_78	    :WORD	;					;AN000;
				 EXTRN	SUBLIST_11	    :WORD	;					;AN000;
				 EXTRN	SUBLIST_15A	    :WORD	;					;AN000;
				 EXTRN	SUBLIST_15B	    :WORD	;					;AN000;
				 EXTRN	SUBLIST_15C	    :WORD	;					;AN000;
				 EXTRN	SUBLIST_17B	    :WORD	;					;AN000;
				 EXTRN	SUBLIST_17C	    :WORD	;					;AN000;
				 EXTRN	SUBLIST_17D	    :WORD	;					;AN000;
				 EXTRN	SUBLIST_PARSE:WORD		;PARSE ERROR XX - %0			     ;AN004;
				
				 EXTRN	MSGNUM_INVALID_PARM:BYTE	;"INVALID PARAMETER"			;AC000;
				 EXTRN	MSGNUM_INVALID_DRV:BYTE 	;"INVALID DRIVE SPECIFICATION"		;AC000;
				 EXTRN	MSGNUM_DRV_REDIRECTED:BYTE	;"INVALID, DRIVE REDIRECTED"		;AC000;
				 EXTRN	MSGNUM_NOT_COMPATIBLE:BYTE	;"DEVICE OR DISKETTE TYPES NOT COMPATIBLE";AC000;
				.LIST
				
				 EXTRN	TRACK_TO_READ :BYTE
				 EXTRN	SIDE:BYTE
				
				 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	COPY_TYPE :BYTE 		;1 = 1-DRIVE COPY  2 = 2-DRIVE COPY
				 EXTRN	USER_OPTION :BYTE		;NO OPTION (-1)  /1 (1), INVALID (9)
				 EXTRN	USER_OPTION_8 :BYTE		;NO OPTION (-1)  /8 (1), INVALID (9)
				 EXTRN	BUFFER_BEGIN :WORD		;STARTING BUFFER @ FOR LOADING
				 EXTRN	BUFFER_END :WORD		;ENDING BUFFER @ FOR LOADING
				 EXTRN	START_BUFFER :WORD		;START OF BUFFER SPACE
				 EXTRN	MAIN_EXIT :WORD 		;EXIT ADDRESS FOR CONTROL-BREAK
				
				 EXTRN	ORG_SOURCE_DRIVE:BYTE		;LOGICAL SOURCE DRIVE NUMBER
				 EXTRN	ORG_TARGET_DRIVE:BYTE		;	 TARGET
				 EXTRN	SOURCE_DRIVE:BYTE		;AS SPECIFIED BY USER PARMS, DR NUM	;AN000;
				 EXTRN	TARGET_DRIVE:BYTE		;AS SPECIFIED BY USER PARMS, DR NUM	;AN000;
				
				 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	PATCH_386:BYTE			;PATCH AREA, CHANGED TO NOOP IF NOT 386 ;AN001;
				
				 EXTRN	GENERIC_IOCTL :NEAR
				 EXTRN	SET_LOGICAL_DRIVE :NEAR
				;		       $salut (4,24,28,41)
				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 TOT. # OF SECT.
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:55
COMPINIT -- DISKCOMP INITIALIZATION PROGRAM                 Page     1-9


									; INCL BOOT SECT, DIRS
 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			
			 ]	
				
 001F				MY_BPB		       ENDS
				
				;USED TO CHECK FOR PRESENCE OF 386 MACHINE:
				BIOS_SYSTEM_DESCRIPTOR struc		;SYSTEM TYPE STRUC			;AN001;
 0000  0000			bios_SD_leng	       dw  ?		;VECTOR LENGTH				;AN001;
 0002  00			bios_SD_modelbyte      db  ?		;SYSTEM MODEL TYPE			;AN001;
 0003  00			bios_SD_scnd_modelbyte db  ?		;					;AN001;
 0004  00					       db  ?		;					;AN001;
 0005  00			bios_SD_featurebyte1   db  ?		;					;AN001;
 0006  0004[					       db  4 dup (?)	;					;AN001;
	   ??			
			 ]	
				
 000A				BIOS_SYSTEM_DESCRIPTOR ends		;END OF STRUC				;AN001;
				
				
				;****************************************************************************
				;									    *
				;			 VARIABLE DECLARATIONS				    *
				;									    *
				;****************************************************************************
 0000  0000			DRIVE_VALID	       DW  ?		;DRIVE VALIDITY BYTE
 0002  00			DEFAULT_DRV	       DB  ?		;DEFAULT DRIVE ID
 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 COMPINIT ;AN013;
 0007                        1	    $$A_START_COMPINIT:                    ; 
						       HEADER <INIT - INITIALIZATION ROUTINE, MAIN PROGRAM> ;	    ;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:55
COMPINIT -- DISKCOMP INITIALIZATION PROGRAM                 Page     1-10
INIT - INITIALIZATION ROUTINE, MAIN PROGRAM		       ;       

				;	$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
 000A  E8 0055 R			CALL  PC_386_CHK		;SEE IF THIS IS A 386 MACHINE		;AN001;
				
				;		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".
				
 000D  8C C8				MOV   AX,CS			;GET SEGID OF COMMON SEGMENT
 000F  A3 0004 E			MOV   SUBLIST_78.SUB_VALUE_SEG,AX ;					;AN000;
 0012  A3 0004 E			MOV   SUBLIST_11.SUB_VALUE_SEG,AX ;					;AN000;
 0015  A3 0004 E			MOV   SUBLIST_15A.SUB_VALUE_SEG,AX ;					;AN000;
 0018  A3 0004 E			MOV   SUBLIST_15B.SUB_VALUE_SEG,AX ;					;AN000;
 001B  A3 0004 E			MOV   SUBLIST_15C.SUB_VALUE_SEG,AX ;					;AN000;
 001E  A3 0004 E			MOV   SUBLIST_17B.SUB_VALUE_SEG,AX ;					;AN000;
 0021  A3 0004 E			MOV   SUBLIST_17C.SUB_VALUE_SEG,AX ;					;AN000;
 0024  A3 0004 E			MOV   SUBLIST_17D.SUB_VALUE_SEG,AX ;					;AN000;
 0027  A3 0004 E			MOV   SUBLIST_PARSE.SUB_VALUE_SEG,AX ;					;AN004;
				
 002A  E8 0286 R			CALL  SETUP_CTRL_BREAK		;STEALS CTRL_BREAK
 002D  FC				CLD				;CLEAR DIRECTION FLAG
 002E  BA FFFF				MOV   DX,FINE			;ASSUME EVERYTHING IS FINE
				.LIST
 0031  E8 0000 E			CALL  PARSER			;LOOK AT DOS COMMAND LINE		;AN000;
				
 0034  83 FA FF				CMP   DX,FINE			;IF ALL OK				;AN000;
				;	$IF   E 			;					;AN000;
 0037  75 03				JNE $$IF1
 0039  E8 0079 R			    CALL  SOURCE_TARGET_DRV	;DETERMINE SOURCE AND TARGET DRV
				
				;	$ENDIF				;					;AN000;
 003C				$$IF1:
 003C  83 FA FF				CMP   DX,FINE			;IF STILL FINE AND DANDY		;AN000;
				;	$IF   E 			;					;AN000;
 003F  75 13				JNE $$IF3
 0041  E8 00C5 R			    CALL  TEST_DRIVE_VALIDITY
				
 0044  83 FA FF				    CMP   DX,FINE
				;	    $IF   E			;					;AN000;
 0047  75 0B				    JNE $$IF4
 0049  E8 01B6 R				CALL  DISKETTE_DRV_TYPE ;SOURCE & TARGET DRIVE TYPES
				
 004C  83 FA FF					CMP   DX,FINE		;IF FINE & DANDY
				;		$IF   E 		;					;AN000;
 004F  75 03					JNE $$IF5
 0051  E8 025A R				    CALL  BUFFER_SIZE	;GET BUFFER SIZE FOR COPYING
				
				;		$ENDIF			;					;AN000;
 0054				$$IF5:
				;	    $ENDIF			;					;AN000;
 0054				$$IF4:
				;	$ENDIF				;					;AN000;
 0054				$$IF3:
 0054  C3				RET				;RETURN TO CALLER
				
 0055				INIT	ENDP				;END INITIALLIZATION PROGRAM
				
				;#############################################################################
				.LIST
					HEADER <PC_386_CHK - SEE IF THIS IS A 386 MACHINE>
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:55
COMPINIT -- DISKCOMP INITIALIZATION PROGRAM                 Page     1-11
PC_386_CHK - SEE IF THIS IS A 386 MACHINE		       ;         

				; QUERIES THE BIOS TO DETERMINE WHAT TYPE OF
				; MACHINE WE ARE ON.  WE ARE LOOKING FOR A 386.
				; THIS WILL BE USED TO DETERMINE IF A DOUBLE WORD MOVE
				; IS TO BE PERFORMED.
				;
				;	INPUTS		: NONE
				;
				;	OUTPUTS 	: IF A 386 NOT PRESENT, CODE IS
				;			     *** P A T C H E D ***
				;			  TO NO-OP THE SUPPORT FOR THE DOUBLE WORD MOVE
				;=========================================================================
				
 0055				PC_386_CHK PROC NEAR			;DETERMINE MACHINE TYPE 		;AN001;
				
 0055  50				PUSH  AX			;SAVE AFFECTED REGS			;AN001;
 0056  53				PUSH  BX			;					;AN001;
 0057  06				PUSH  ES			;					;AN001;
				
 0058  B4 C0				MOV   AH,0C0H			;RETURN SYSTEM CONFIGURATION		;AN001;
 005A  CD 15				INT   15H			;ES:[BX] POINTS TO BIOS 		;AN001;
									; SYSTEM DESCRIPTOR
					ASSUME ES:NOTHING		;AN001;
				
				;	$IF   C,OR			;IF NOT A GOOD RETURN, OR...			   ;AN001;
 005C  72 0C				JC $$LL9
 005E  80 FC 00				CMP   AH,0			;IS IT NEW FORMAT FOR CONFIG.		;AN001;
				;	$IF   NE,OR			;NO, OR...				      ;AN001;
 0061  75 07				JNE $$LL9
 0063  26: 80 7F 02 F8			CMP   ES:[BX].BIOS_SD_MODELBYTE,0F8H ;CHECK MODEL	      ;AN001;
				;	$IF   NE			;IF IT IS NOT A 386 MACHINE?		       ;AN001;
 0068  74 0B				JE $$IF9
 006A				$$LL9:
									;PATCH OUT THE 386 CODE
 006A  B0 90				    MOV   AL,NOOP		;WITH A NO-OP INSTRUCTION		;AN001;
 006C  A2 0000 E			    MOV   PATCH_386,AL		;					;AN001;
 006F  A2 0001 E			    MOV   PATCH_386+1,AL	;					;AN001;
 0072  A2 0002 E			    MOV   PATCH_386+2,AL	;					;AN001;
				;	$ENDIF				;					;AN001;
 0075				$$IF9:
				
 0075  07				POP   ES			;RESTORE REGS.				;AN001;
					ASSUME ES:CSEG			;BACK TO USUAL				;AN001;
				
 0076  5B				POP   BX			;					;AN001;
 0077  58				POP   AX			;					;AN001;
				
 0078  C3				RET				;					;AN001;
				
 0079				PC_386_CHK ENDP 			;					;AN001;
					HEADER <SOURCE_TARGET_DRV - CONVERT SRC/TARGET DR TO BIOS VALS> ;	;AN000;
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:55
COMPINIT -- DISKCOMP INITIALIZATION PROGRAM                 Page     1-12
SOURCE_TARGET_DRV - CONVERT SRC/TARGET DR TO BIOS VALS		    

				;******************************************************************************
				; 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	 ETC.		      *
				;									      *
				; OUTPUT	  :  ORG_SOURCE_DRIVE	     1 = DRIVE A    2 = DRIVE B  ETC. *
				;		  :  ORG_TARGET_DRIVE	     1 = DRIVE A    2 = DRIVE B  ETC. *
				;									      *
				;		  :  COPY_TYPE	    1 = SINGLE DRV COPY, 2 = 2 DRIVE COPY     *
				;		  :  DX : FINE	  - NO ERROR				      *
				;******************************************************************************
 0079				SOURCE_TARGET_DRV PROC NEAR
					PUBLIC SOURCE_TARGET_DRV	;MAKE ENTRY IN LINK MAP 		;AN000;
									;GET CURRENT DEFAULT DRIVE
 0079  B4 19				MOV   AH,CURRENTDRV_FUNC	;FUNCTION CALL (19H)
									;(AL <- CURRENT DEFAULT DRV
 007B  CD 21				INT   21H			;0 = A, 1 = B, ETC)
				
 007D  A2 0002 R			MOV   DEFAULT_DRV,AL		;SAVE IT
				
 0080  80 3E 0000 E 00			CMP   SOURCE_DRIVE,ZERO 	;FIRST DRV ENTERED?			;AC000;
				;	$IF   E 			;NO DRIVE LETTER ENTERED
 0085  75 12				JNE $$IF11
 0087  8A 2E 0002 R			    MOV   CH, DEFAULT_DRV	;SET SOURCE, TARGET DRIVE TO
 008B  FE C5				    INC   CH
 008D  88 2E 0000 E			    MOV   ORG_SOURCE_DRIVE, CH	;DEFAULT DRIVE
 0091  8A CD				    MOV   CL, CH
 0093  88 0E 0000 E			    MOV   ORG_TARGET_DRIVE, CL
				;	$ELSE
 0097  EB 23				JMP SHORT $$EN11
 0099				$$IF11:
 0099  8A 2E 0000 E			    MOV   CH,SOURCE_DRIVE	;GET SOURCE DRIVE FROM SPECIFIED PARM	;AC000;
 009D  88 2E 0000 E			    MOV   ORG_SOURCE_DRIVE, CH
 00A1  80 3E 0000 E 00			    CMP   TARGET_DRIVE,ZERO	;WAS A SECOND DRIVE SPECIFIED		;AC000;
				;	    $IF   E			;TARGET DRIVE IS DEFAULT
 00A6  75 0C				    JNE $$IF13
 00A8  8A 0E 0002 R				MOV   CL, DEFAULT_DRV
 00AC  FE C1					INC   CL		;MAKE IT A LOGICAL DRIVE NUMBER
 00AE  88 0E 0000 E				MOV   ORG_TARGET_DRIVE, CL
				;	    $ELSE
 00B2  EB 08				    JMP SHORT $$EN13
 00B4				$$IF13:
 00B4  8A 0E 0000 E				MOV   CL, TARGET_DRIVE	;USE USER SPECIFIED TARGET DRIVE	;AC000;
 00B8  88 0E 0000 E				MOV   ORG_TARGET_DRIVE, CL
				;	    $ENDIF
 00BC				$$EN13:
				;	$ENDIF
 00BC				$$EN11:
				
 00BC  00 2E 0000 E			ADD   ASCII_DRV1_ID,CH		;SETUP DRIVE ID ALPHABET IN THE
 00C0  00 0E 0000 E			ADD   ASCII_DRV2_ID,CL		;MESSAGES
				
 00C4  C3				RET
 00C5				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:55
COMPINIT -- DISKCOMP INITIALIZATION PROGRAM                 Page     1-13
TEST_DRIVE_VALIDITY - ARE SOURCE/TARGET DRIVES VALID?		     

				;******************************************************************************
				; SUBROUTINE NAME :  TEST_DRIVE_VALIDITY--MAKE SURE SOURCE AND TARGET DRIVES  *
				;		     SPECIFIED BY USER ARE VALID FOR DISKCOPY		      *
				;									      *
				; INPUT 	  :  ORG_SOURCE_DRIVE:BYTE, ORG_TARGET_DRIVE:BYTE	      *
				;									      *
				; OUTPUT	  :  DX=FILE IF DRIVES ARE VALID ELSE DX CONTAINS MESSAGE PTR *
				;******************************************************************************
				
 00C5				TEST_DRIVE_VALIDITY PROC NEAR
					PUBLIC TEST_DRIVE_VALIDITY	;MAKE ENTRY IN LINK MAP 		;AN000;
				
 00C5  E8 0109 R			CALL  DOS_DRIVE_VALIDITY
				
 00C8  83 FA FF				CMP   DX,FINE
				;	$IF   E,AND			;					;AC000;
 00CB  75 3B				JNE $$IF17
				
 00CD  8A 1E 0000 E			MOV   BL,ORG_SOURCE_DRIVE
 00D1  E8 0239 R			CALL  CHECK_REDIRECTION
				
 00D4  83 FA FF				CMP   DX,FINE
				;	$IF   E,AND			;					;AC000;
 00D7  75 2F				JNE $$IF17
				
 00D9  8A 1E 0000 E			MOV   BL,ORG_TARGET_DRIVE
 00DD  E8 0239 R			CALL  CHECK_REDIRECTION
				
 00E0  83 FA FF				CMP   DX,FINE
				;	$IF   E,AND			;					;AC000;
 00E3  75 23				JNE $$IF17
				
 00E5  8A 1E 0000 E			MOV   BL,ORG_SOURCE_DRIVE
 00E9  E8 0297 R			CALL  CHECK_SERVER
				
 00EC  83 FA FF				CMP   DX,FINE
				;	$IF   E,AND			;					;AC000;
 00EF  75 17				JNE $$IF17
				
 00F1  8A 1E 0000 E			MOV   BL,ORG_TARGET_DRIVE
 00F5  E8 0297 R			CALL  CHECK_SERVER
				
 00F8  83 FA FF				CMP   DX,FINE
				;	$IF   E,AND			;					;AC000;
 00FB  75 0B				JNE $$IF17
				
 00FD  E8 0114 R			CALL  TEST_REMOVABLE
				
 0100  83 FA FF				CMP   DX,FINE
				;	$IF   E 			;					;AC000;
 0103  75 03				JNE $$IF17
				
 0105  E8 0147 R			    CALL  CHK_SINGLE_DRV_OP	;CHECK IF IT IS
									; ONE PHYSICAL DRIVE OPERATION
				;	$ENDIF				;					;AC000;
 0108				$$IF17:
 0108  C3				RET
				
 0109				TEST_DRIVE_VALIDITY ENDP
					HEADER <DOS_DRIVE_VALIDITY - CHECK DOS DRIVE VALIDITY BYTE>
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:55
COMPINIT -- DISKCOMP INITIALIZATION PROGRAM                 Page     1-14
DOS_DRIVE_VALIDITY - CHECK DOS DRIVE VALIDITY BYTE		       ;

				;******************************************************************************
				; SUBROUTINE NAME :  DOS_DRIVE_VALIDITY -- CHEKC DOS DRIVE VALIDITY BYTE      *
				;									      *
				; INPUT 	  :  DRIVE_VALID:BYTE					      *
				;		     THIS IS THE ORIGINAL VALUE PRESENTED IN AX BY DOS LOADER *
				;									      *
				; OUTPUT	  :  DX=FILE IF DRIVES ARE VALID ELSE DX CONTAINS MESSAGE PTR *
				;******************************************************************************
				
 0109				DOS_DRIVE_VALIDITY PROC NEAR
					PUBLIC DOS_DRIVE_VALIDITY	;MAKE ENTRY IN LINK MAP 		;AN000;
				
 0109  83 3E 0000 R 00			CMP   DRIVE_VALID,0		;SEE IF DRIVES ARE VALID DOS DEVICE
				;	$IF   NE
 010E  74 03				JE $$IF19
 0110  BA 0000 E			    MOV   DX,OFFSET MSGNUM_INVALID_DRV ;AC000;
				;	$ENDIF
 0113				$$IF19:
 0113  C3				RET
				
 0114				DOS_DRIVE_VALIDITY ENDP
					HEADER <TEST_REMOVABLE - IS SPECIFIED DRIVE REMOVABLE?>
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:55
COMPINIT -- DISKCOMP INITIALIZATION PROGRAM                 Page     1-15
TEST_REMOVABLE - IS SPECIFIED DRIVE REMOVABLE?		       ;    

				;******************************************************************************
				; 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 *
				;******************************************************************************
				
 0114				TEST_REMOVABLE PROC NEAR
					PUBLIC TEST_REMOVABLE		;MAKE ENTRY IN LINK MAP 		;AN000;
				
 0114  8A 1E 0000 E			MOV   BL,ORG_SOURCE_DRIVE	;GET PARM 1 DRIVE ID
				
 0118  B8 4408				MOV   AX,DRIVE_CHECK		;CHECK FOR REMOVABLE DRIVE
 011B  CD 21				INT   21H			;IOCTL CALL
				
				;	$IF   NC			;IF DRIVE ID IS WITHIN RANGE
 011D  72 24				JC $$IF21
 011F  3D 0000				    CMP   AX,REMOVABLE		;THEN IF SOURCE DRIVE IS FIXED
				;	    $IF   NE			;  THEN
 0122  74 05				    JE $$IF22
 0124  BA 0000 E				MOV   DX,OFFSET MSGNUM_INVALID_DRV ;GENERATE			;AC000;
									; HARD DRIVE ERROR MESSAGE
				;	    $ELSE			;ELSE, SRC IS REMOVABLE;
 0127  EB 18				    JMP SHORT $$EN22
 0129				$$IF22:
 0129  8A 1E 0000 E				MOV   BL,ORG_TARGET_DRIVE ;NOW GO CHECK TARGET
 012D  B8 4408					MOV   AX,DRIVE_CHECK	;CHECK FOR REMOVABLE DRIVE
 0130  CD 21					INT   21H		;IOCTL CALL
				
				;		$IF   NC		;IF DRV WITHIN RANGE
 0132  72 0A					JC $$IF24
 0134  3D 0000					    CMP   AX,REMOVABLE	;THEN TGT DRV IS FIXED
				;		    $IF   NE		;     THEN
 0137  74 03					    JE $$IF25
 0139  BA 0000 E					MOV   DX,OFFSET MSGNUM_INVALID_DRV ;GENERATE		;AC000;
									; HARD DRV ERROR MSG
				;		    $ENDIF		;END TEST IF TGT DRV IS FIXED
 013C				$$IF25:
				;		$ELSE			;TGT DRV OUT OF RANGE.	EX. DRIVE X:
 013C  EB 03					JMP SHORT $$EN24
 013E				$$IF24:
 013E  BA 0000 E				    MOV   DX,OFFSET MSGNUM_INVALID_DRV ;GENERATE		;AC000;
									; HARD DRV ERROR MSG
				;		$ENDIF			;END TEST IF TGT WITHIN RANGE
 0141				$$EN24:
				;	    $ENDIF			;END IF SRC IS REMOVABLE
 0141				$$EN22:
				;	$ELSE				;ELSE,	SRC DRV OUT OF RANGE
 0141  EB 03				JMP SHORT $$EN21
 0143				$$IF21:
 0143  BA 0000 E			    MOV   DX,OFFSET MSGNUM_INVALID_DRV ;PRINT ERROR MSG 		;AC000;
				;	$ENDIF				;END TEST IF SRC DRV WITHIN RANGE
 0146				$$EN21:
 0146  C3				RET
				
 0147				TEST_REMOVABLE ENDP
					HEADER <CHK_SINGLE_DRIV_OP - IS TARGET DRIVE SAME AS SOURCE?>
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:55
COMPINIT -- DISKCOMP INITIALIZATION PROGRAM                 Page     1-16
CHK_SINGLE_DRIV_OP - IS TARGET DRIVE SAME AS SOURCE?		      

				;******************************************************************************
				; SUBROUTINE NAME :  CHK_SINGLE_DRV_OP					      *
				;									      *
				; INPUT 	  :  ORG_SOURCE_DRIVE - LOGICAL DRIVE NUMBER		      *
				;		     ORG_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. *
				;******************************************************************************
				
 0147				CHK_SINGLE_DRV_OP PROC NEAR
					PUBLIC CHK_SINGLE_DRV_OP	;MAKE ENTRY IN LINK MAP 		;AN000;
				
 0147  50				PUSH  AX
				
 0148  8A 1E 0000 E			MOV   BL,ORG_SOURCE_DRIVE
 014C  E8 01A9 R			CALL  GET_LOGICAL_DRIVE
				
 014F  A2 0000 E			MOV   S_OWNER_SAVED, AL 	;SAVE CURRENT OWNER DRIVE LETTER.
 0152  8A 1E 0000 E			MOV   BL, ORG_TARGET_DRIVE
 0156  E8 01A9 R			CALL  GET_LOGICAL_DRIVE
				
 0159  A2 0000 E			MOV   T_OWNER_SAVED, AL 	;SAVE CURRENT OWNER
 015C  8A 1E 0000 E			MOV   BL, ORG_SOURCE_DRIVE
 0160  E8 0000 E			CALL  SET_LOGICAL_DRIVE
				
 0163  8A 1E 0000 E			MOV   BL, ORG_TARGET_DRIVE
 0167  E8 0000 E			CALL  SET_LOGICAL_DRIVE
				
 016A  8A 1E 0000 E			MOV   BL, ORG_SOURCE_DRIVE
 016E  E8 01A9 R			CALL  GET_LOGICAL_DRIVE 	;CHECK IF SOURCE DRIVE OWNERSHIP HAS NOT BEEN CHAGNED?
				
 0171  3A 06 0000 E			CMP   AL, ORG_SOURCE_DRIVE
				;	$IF   NE			;IF IT HAS BEEN CHANGED TO TARGET, THEN A SINGLE DRIVE COMPA
				RE.
 0175  74 1E				JE $$IF32
 0177  C6 06 0000 E 01			    MOV   COPY_TYPE, ONE
 017C  8A 1E 0000 E			    MOV   BL, ORG_SOURCE_DRIVE
 0180  88 1E 0000 E			    MOV   ORG_TARGET_DRIVE, BL	;SET TARGET DRV LETTER TO THE SOURCE.
 0184  8A 1E 0000 E			    MOV   BL, ASCII_DRV1_ID
 0188  88 1E 0000 E			    MOV   ASCII_DRV2_ID, BL
 018C  8A 1E 0000 E			    MOV   BL, ORG_SOURCE_DRIVE
 0190  E8 0000 E			    CALL  SET_LOGICAL_DRIVE	;SET THE OWNER BACK TO SOURCE DRV LETTER
				
				;	$ELSE
 0193  EB 12				JMP SHORT $$EN32
 0195				$$IF32:
 0195  3A 06 0000 E			    CMP   AL, ORG_TARGET_DRIVE	; SOURCE DRV LETTER = TARGET DRV LETTER CASE, FOR EX. DISKCO
				MP A: A:
				;	    $IF   E
 0199  75 07				    JNE $$IF34
 019B  C6 06 0000 E 01				MOV   COPY_TYPE, ONE
				;	    $ELSE
 01A0  EB 05				    JMP SHORT $$EN34
 01A2				$$IF34:
 01A2  C6 06 0000 E 02				MOV   COPY_TYPE, TWO
				;	    $ENDIF
 01A7				$$EN34:
				;	$ENDIF
 01A7				$$EN32:
				
 01A7  58				POP   AX
				
 01A8  C3				RET
 01A9				CHK_SINGLE_DRV_OP ENDP
					HEADER <GET_LOGICAL_DRIVE - GET LOG. DRIV NO. WHO OWNS PHYSICAL DRIVE>
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:55
COMPINIT -- DISKCOMP INITIALIZATION PROGRAM                 Page     1-17
GET_LOGICAL_DRIVE - GET LOG. DRIV NO. WHO OWNS PHYSICAL DRIV

				;******************************************************************************
 01A9				GET_LOGICAL_DRIVE PROC NEAR
					PUBLIC GET_LOGICAL_DRIVE	;MAKE ENTRY IN LINK MAP 		;AN000;
				;	*** 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...)
				;
				;******************************************************************************
				
 01A9  B4 44				MOV   AH, 44H
 01AB  B0 0E				MOV   AL, 0EH			; GET THE OWNER OF LOGICAL DRIVE NUMBER
 01AD  CD 21				INT   21H
				
 01AF  3C 00				CMP   AL, 0			;ONLY ONE DRIVE LETTER ASSIGNED?
				;	$IF   E
 01B1  75 02				JNE $$IF38
 01B3  8A C3				    MOV   AL, BL		;THEN SET IT TO THE INPUT DRIVE LETTER
				;	$ENDIF
 01B5				$$IF38:
				
 01B5  C3				RET
				
 01B6				GET_LOGICAL_DRIVE ENDP
					HEADER <DISKETTE_DRV_TYPE - CHECK COMPATABILITY SOURCE/TARGET DRIVES>
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:55
COMPINIT -- DISKCOMP INITIALIZATION PROGRAM                 Page     1-18
DISKETTE_DRV_TYPE - CHECK COMPATABILITY SOURCE/TARGET DRIVES

				;******************************************************************************
				; SUBROUTINE NAME :  DISKETTE_DRV_TYPE DOES THE FOLLOWING:		      *
				;		     - GETS SOURCE, TARGET DRIVE INFORMATIONS		      *
				;		     - CHECK IF IT IS A REMOVABLE DRIVE.		      *
				; INPUT 	  :  SOURCE_DRIVE  &  TARGET_DRIVE			      *
				;			   1 = DRIVE A		2 = DRIVE B, ETC.	      *
				;									      *
				; OUTPUT	  :  DX : FINE	  - NO ERROR				      *
				;			  (OTHERS)- ERROR MSG OFFSET			      *
				;******************************************************************************
 01B6				DISKETTE_DRV_TYPE PROC NEAR
					PUBLIC DISKETTE_DRV_TYPE	;MAKE ENTRY IN LINK MAP 		;AN000;
				
 01B6  50				PUSH  AX
 01B7  33 DB				XOR   BX,BX
 01B9  8A 1E 0000 E			MOV   BL, ORG_SOURCE_DRIVE
 01BD  B1 60				MOV   CL, GETDEVPARM		;=60h
 01BF  BA 0000 E			MOV   DX, OFFSET DS_IOCTL_DRV_PARM ;POINTER TO THE CONTROL STRING
 01C2  E8 0000 E			CALL  GENERIC_IOCTL		;GET DEVICE PARM.
				
 01C5  F7 06 0000 E 0001		TEST  DS_deviceAttributes, 0001h ;CHECK REMOVABLE. 0001 = NOT REMOVABLE
				;	$IF   E,AND			;NO, CONTINUE				;AC000;
 01CB  75 67				JNE $$IF40
				
 01CD  A1 0000 E			MOV   AX, DS_numberOfCylinders	;CURRENTLY IGNORE AH. ASSUME LESS
									; THAN TWO BYTES
 01D0  A2 0000 E			MOV   S_DRV_TRACKS, AL
 01D3  BB 0000 E			MOV   BX, OFFSET DS_BPB_PTR
 01D6  8B 47 0F				MOV   AX, [BX].CHead
 01D9  A2 0000 E			MOV   S_DRV_HEADS, AL
 01DC  8B 47 0D				MOV   AX, [BX].CSECT_TRACK
 01DF  A2 0000 E			MOV   S_DRV_SECT_TRACK, AL
 01E2  8B 07				MOV   AX, [BX].CBYTE_SECT	;RECOMMENDED BYTES/SECTOR
 01E4  A3 0000 E			MOV   RECOMMENDED_BYTES_SECTOR, AX
				
 01E7  33 DB				XOR   BX,BX
 01E9  8A 1E 0000 E			MOV   BL, ORG_TARGET_DRIVE
 01ED  B1 60				MOV   CL, GETDEVPARM
 01EF  BA 0000 E			MOV   DX, OFFSET DT_IOCTL_DRV_PARM
 01F2  E8 0000 E			CALL  GENERIC_IOCTL
				
 01F5  F7 06 0000 E 0001		TEST  DT_deviceAttributes, 0001h
				;	$IF   Z 			;TARGET IS NOT FIXED DISK, OK		    ;AC000;
 01FB  75 37				JNZ $$IF40
 01FD  A1 0000 E			    MOV   AX, DT_numberOfCylinders
 0200  A2 0000 E			    MOV   T_DRV_TRACKS, AL
 0203  BB 0000 E			    MOV   BX, OFFSET DT_BPB_PTR
 0206  8B 47 0F				    MOV   AX, [BX].CHead
 0209  A2 0000 E			    MOV   T_DRV_HEADS, AL
 020C  8B 47 0D				    MOV   AX, [BX].CSECT_TRACK
 020F  A2 0000 E			    MOV   T_DRV_SECT_TRACK, AL
				
				;*** CHECK DEVICE COMPATIBILITY
 0212  BA FFFF				    MOV   DX, FINE		;GUESS, ALL WILL BE OK
									; DX MAY BE CHANGED TO REFLECT ERROR
 0215  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;
 021A  75 0C				    JNE $$IF41
									; 720KB, 3.5 SOURCE, TARGET
				
 021C  80 3E 0000 E 02				CMP   DT_deviceType, DRV_720 ;target = 720KB also?
				;		$IF   NE		;					;AC000;
 0221  74 03					JE $$IF42
 0223  BA 0000 E				    MOV   DX, OFFSET MSGNUM_NOT_COMPATIBLE ;			;AC000;
				;		$ENDIF			;					;AC000;
 0226				$$IF42:
				;	    $ELSE			;SINCE SOURCE NOT 720			;AC000;
 0226  EB 0A				    JMP SHORT $$EN41
 0228				$$IF41:
 0228  80 3E 0000 E 02				CMP   DT_deviceType, DRV_720 ;SOURCE IS NOT 720kb,
									; IS TARGET 720?
				;		$IF   E 		;IF SO, THEN				;AC000;
 022D  75 03					JNE $$IF45
									;DDT IS NOT COMPATIBLE
 022F  BA 0000 E				    MOV   DX, OFFSET MSGNUM_NOT_COMPATIBLE ;			;AC000;
				;		$ENDIF			;					;AC000;
 0232				$$IF45:
				;	    $ENDIF			;					;AC000;
 0232				$$EN41:
				;	$ELSE				;SINCE SOURCE IS FIXED DISK, ERROR	;AC000;
 0232  EB 03				JMP SHORT $$EN40
 0234				$$IF40:
 0234  BA 0000 E			    MOV   DX, OFFSET MSGNUM_INVALID_DRV ;ISSUE INVALID DRV MSG		;AC000;
				;	$ENDIF				;					;AC000;
 0237				$$EN40:
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:55
COMPINIT -- DISKCOMP INITIALIZATION PROGRAM                 Page     1-19
DISKETTE_DRV_TYPE - CHECK COMPATABILITY SOURCE/TARGET DRIVES

 0237  58				POP   AX
 0238  C3				RET
				
 0239				DISKETTE_DRV_TYPE ENDP
					HEADER <CHECK_REDIRECTION - IS DEVICE REDIRECTED?>
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:55
COMPINIT -- DISKCOMP INITIALIZATION PROGRAM                 Page     1-20
CHECK_REDIRECTION - IS DEVICE REDIRECTED?		       ;         

				;******************************************************************************
				; 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)     *
				;******************************************************************************
 0239				CHECK_REDIRECTION PROC NEAR
					PUBLIC CHECK_REDIRECTION	;MAKE ENTRY IN LINK MAP 		;AN000;
				
 0239  50				PUSH  AX			;SAVE REGISTERS
 023A  53				PUSH  BX
 023B  51				PUSH  CX
				
 023C  8B CA				MOV   CX,DX			;SAVE RET TEMPORARILY
 023E  B4 44				MOV   AH,IOCTL_FUNC		;GET IOCTL FUNTION &
 0240  B0 09				MOV   AL,REDIRECTED_FUNC	;IOCTL SUB-FUNCTION ******CHECK***
				
 0242  CD 21				INT   21H			;AND GO FIND OUT IF IT'S LOCAL
				;	$IF   C
 0244  73 05				JNC $$IF50
 0246  B9 0000 E			    MOV   CX,OFFSET MSGNUM_INVALID_DRV ;REDIR INVALID			;AC000;
				
				;	$ELSE
 0249  EB 09				JMP SHORT $$EN50
 024B				$$IF50:
 024B  F7 C2 1000			    TEST  DX,REMOTE_DRV 	;IF DRIVE IS REDIRECTED
				;	    $IF   NZ
 024F  74 03				    JZ $$IF52
				
 0251  B9 0000 E				MOV   CX,OFFSET MSGNUM_DRV_REDIRECTED ; 			;AC000;
				;	    $ENDIF
 0254				$$IF52:
				;	$ENDIF
 0254				$$EN50:
 0254  8B D1				MOV   DX,CX			;GET ERROR MSG @
				
 0256  59				POP   CX			;RESTORE REGISTERS
 0257  5B				POP   BX
 0258  58				POP   AX
 0259  C3				RET				;RETURN TO CALLER
 025A				CHECK_REDIRECTION ENDP
					HEADER <BUFFER_SIZE - FINDS START AND END OF BUFFER>
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:55
COMPINIT -- DISKCOMP INITIALIZATION PROGRAM                 Page     1-21
BUFFER_SIZE - FINDS START AND END OF BUFFER		       ;       

				;******************************************************************************
				; SUBROUTINE NAME :  BUFFER_SIZE    DETERMINES WHERE BUFFER STARTS & ENDS     *
				; INPUT 	  :  NONE						      *
				;									      *
				; OUTPUT	  :  BUFFER_BEGIN ADDRESS				      *
				;		  :  BUFFER_END   ADDRESS				      *
				;		  :  START_BUFFER ADDRESS
				;******************************************************************************
 025A				BUFFER_SIZE PROC NEAR
					PUBLIC BUFFER_SIZE		;MAKE ENTRY IN LINK MAP 		;AN000;
				
 025A  50				PUSH  AX			;SAVE REGISTERS
 025B  53				PUSH  BX
 025C  51				PUSH  CX
 025D  BB 0007 R			MOV   BX,OFFSET init		;GET ADDR OF INIT+1024 AS A FREE MEMORY
 0260  81 C3 0400			add   bx, 1024			;(OFFSET FROM CS, IN BYTES)
 0264  B1 04				MOV   CL,4			;CONVERT OFFSET INTO SEGMT BY DIVIDING
 0266  D3 EB				SHR   BX,CL			;IT BY 16
				
 0268  8C C8				MOV   AX,CS			;CS + OFFSET => INIT @ IN SEGMENT
 026A  03 D8				ADD   BX,AX			;WHERE BUFFER CAN START
				
									;NEED TO START AT A NEW SECTOR ==>
 026C  80 E3 E0				AND   BL,CLEAR_SEGMENT		;TRUNCATE TO PREVIOUS 512 BYTE BOUNDRY
									;(GET PREVIOUS SECTOR NUMBER)
 026F  83 C3 20				ADD   BX,20H			;THEN, ADVANCE TO THE BEGINNING OF
									;NEXT SECTOR (SINCE PART OF PREVIOUS
									;SECTOR WAS USED)
				
 0272  89 1E 0000 E			MOV   BUFFER_BEGIN,BX		;SAVE OUR BUFFER START SEGMENT ADDR
 0276  89 1E 0000 E			MOV   START_BUFFER,BX		;SAVE IT AGAIN ELSEWHERE
									;(AT THE BEGINNING OF A SECTOR WITH
									;SEGMENT BITS CLEARED)
				
 027A  8B 1E 0002			MOV   BX,DS:TWO 		;GET ADDR WHERE BUFFER ENDS
 027E  89 1E 0000 E			MOV   BUFFER_END,BX		;(TOP OF MEMORY, OFFSET 2 IN PSP)
				
 0282  59				POP   CX			;RESTORE REGISTERS
 0283  5B				POP   BX
 0284  58				POP   AX
 0285  C3				RET				;RETURN TO CALLER
 0286				BUFFER_SIZE ENDP
					HEADER <SETUP_CTRL_BREAK - SETUP THE CTRL-BREAK VECTOR>
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:55
COMPINIT -- DISKCOMP INITIALIZATION PROGRAM                 Page     1-22
SETUP_CTRL_BREAK - SETUP THE CTRL-BREAK VECTOR		       ;    

				;******************************************************************************
 0286				SETUP_CTRL_BREAK PROC NEAR		;SETUP CTRL-BREAK VECTOR
					PUBLIC SETUP_CTRL_BREAK 	;MAKE ENTRY IN LINK MAP 		;AN000;
				;******************************************************************************
 0286  50				PUSH  AX
 0287  53				PUSH  BX
 0288  52				PUSH  DX
 0289  06				PUSH  ES
				
 028A  B8 2523				MOV   AX,2523H			;SET THE CTRL-BREAK VECTOR
 028D  BA 0000 E			MOV   DX,OFFSET MAIN_EXIT
 0290  CD 21				INT   21H
				
 0292  07				POP   ES
 0293  5A				POP   DX
 0294  5B				POP   BX
 0295  58				POP   AX
 0296  C3				RET
				
 0297				SETUP_CTRL_BREAK ENDP
					HEADER <CHECK_SERVER - IS SERVER OR REDIRECTOR LOADED?>
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:55
COMPINIT -- DISKCOMP INITIALIZATION PROGRAM                 Page     1-23
CHECK_SERVER - IS SERVER OR REDIRECTOR LOADED?		       ;    

				;******************************************************************************
 0297				CHECK_SERVER PROC NEAR			;SEE IF SERVER OR REDIRECTOR IS IN++
					PUBLIC CHECK_SERVER		;MAKE ENTRY IN LINK MAP 		;AN000;
				;
				; INPUT: BL = DRIVE NUMBER (1=A,2=B ETC....)
				;******************************************************************************
 0297  B4 00				MOV   AH,0			;SEE IF SERVER LOADED
 0299  CD 2A				INT   SERVER
 029B  80 FC 00				CMP   AH,0
				;	$IF   E
 029E  75 05				JNE $$IF55
 02A0  BA FFFF				    MOV   DX,FINE
				;	$ELSE
 02A3  EB 1B				JMP SHORT $$EN55
 02A5				$$IF55:
 02A5  FE CB				    DEC   BL
 02A7  80 C3 41				    ADD   BL,"A"		;CONVERT TO ASCII DRIVE LETTER
 02AA  88 1E 0004 R			    MOV   ASCII_DRIVE_LETTER,BL ;PUT IN ASCIIZ STRING
 02AE  BE 0004 R			    MOV   SI,OFFSET ASCII_DRIVE_LETTER
 02B1  B4 03				    MOV   AH,SHARED
 02B3  F8				    CLC
 02B4  CD 2A				    INT   SERVER
				;	    $IF   C
 02B6  73 05				    JNC $$IF57
 02B8  BA 0000 E				MOV   DX,OFFSET MSGNUM_DRV_REDIRECTED ;AC000;
				;	    $ELSE
 02BB  EB 03				    JMP SHORT $$EN57
 02BD				$$IF57:
 02BD  BA FFFF					MOV   DX,FINE
				;	    $ENDIF
 02C0				$$EN57:
				;	$ENDIF
 02C0				$$EN55:
 02C0  C3				RET
 02C1				CHECK_SERVER ENDP
				
					Public INIT_END
 02C1				INIT_END LABEL BYTE
					PATHLABL COMPINIT		;AN013;
 02C1                        1	    $$A_STOP_COMPINIT:                     ; 
 02C1				CSEG	ENDS
					END

Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:55
COMPINIT -- DISKCOMP 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

BIOS_SYSTEM_DESCRIPTOR . . . . .  	000A	0006
  BIOS_SD_LENG . . . . . . . . .  	0000
  BIOS_SD_MODELBYTE  . . . . . .  	0002
  BIOS_SD_SCND_MODELBYTE . . . .  	0003
  BIOS_SD_FEATUREBYTE1 . . . . .  	0005
EXT_BPB_INFO . . . . . . . . . .  	0019	000C
  EBPB_BYTESPERSECTOR  . . . . .  	0000
  EBPB_SECTORSPERCLUSTER . . . .  	0002
  EBPB_RESERVEDSECTORS . . . . .  	0003
  EBPB_NUMBEROFFATS  . . . . . .  	0005
  EBPB_ROOTENTRIES . . . . . . .  	0006
  EBPB_TOTALSECTORS  . . . . . .  	0008
  EBPB_MEDIADESCRIPTOR . . . . .  	000A
  EBPB_SECTORSPERFAT . . . . . .  	000B
  EBPB_SECTORSPERTRACK . . . . .  	000D
  EBPB_HEADS . . . . . . . . . .  	000F
  EBPB_HIDDENSECTOR  . . . . . .  	0011
  EBPB_BIGTOTALSECTORS . . . . .  	0015
EXT_IBMBOOT_HEADER . . . . . . .  	003E	0009
  EXT_BOOT_JUMP  . . . . . . . .  	0000
  EXT_BOOT_OEM . . . . . . . . .  	0003
  EXT_BOOT_BPB . . . . . . . . .  	000B
  EXT_PHYDRV . . . . . . . . . .  	0024
  EXT_CURHD  . . . . . . . . . .  	0025
  EXT_BOOT_SIG . . . . . . . . .  	0026
  EXT_BOOT_SERIAL  . . . . . . .  	0027
  EXT_BOOT_VOL_LABEL . . . . . .  	002B
  EXT_SYSTEM_ID  . . . . . . . .  	0036
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 . . . . . . . . . . . . . .  	02C1	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	
BOOT_SIGNATURE . . . . . . . . .  	WORD	01FE	
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:55
COMPINIT -- DISKCOMP INITIALIZATION PROGRAM                 Symbols-2


BOOT_SIZE  . . . . . . . . . . .  	NUMBER	0200	
BUFFER_BEGIN . . . . . . . . . .  	V WORD	0000	CSEG	External
BUFFER_END . . . . . . . . . . .  	V WORD	0000	CSEG	External
BUFFER_SIZE  . . . . . . . . . .  	N PROC	025A	CSEG	Global	Length = 002C

CHECK_REDIRECTION  . . . . . . .  	N PROC	0239	CSEG	Global	Length = 0021
CHECK_SERVER . . . . . . . . . .  	N PROC	0297	CSEG	Global	Length = 002A
CHK_SINGLE_DRV_OP  . . . . . . .  	N PROC	0147	CSEG	Global	Length = 0062
CLEAR_SEGMENT  . . . . . . . . .  	NUMBER	00E0	
COMPARE_FUNC . . . . . . . . . .  	NUMBER	0059	
COPY_TYPE  . . . . . . . . . . .  	V BYTE	0000	CSEG	External
CURRENTDRV_FUNC  . . . . . . . .  	NUMBER	0019	

DEFAULT_DRV  . . . . . . . . . .  	L BYTE	0002	CSEG
DISKETTE_DRV_TYPE  . . . . . . .  	N PROC	01B6	CSEG	Global	Length = 0083
DOS20  . . . . . . . . . . . . .  	NUMBER	0002	
DOS_DRIVE_VALIDITY . . . . . . .  	N PROC	0109	CSEG	Global	Length = 000B
DRIVE_CHECK  . . . . . . . . . .  	NUMBER	4408	
DRIVE_VALID  . . . . . . . . . .  	L WORD	0000	CSEG
DRV_48TPI  . . . . . . . . . . .  	NUMBER	0000	
DRV_720  . . . . . . . . . . . .  	NUMBER	0002	
DRV_96TPI  . . . . . . . . . . .  	NUMBER	0001	
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	
EXT_BOOT_SIGNATURE . . . . . . .  	NUMBER	0029	

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	
FOUR . . . . . . . . . . . . . .  	NUMBER	0004	

GENERIC_IOCTL  . . . . . . . . .  	L NEAR	0000	CSEG	External
GENERIC_IOCTL_CODE . . . . . . .  	NUMBER	000D	
GETDEVPARM . . . . . . . . . . .  	NUMBER	0060	
GET_ASSIGN_MODE  . . . . . . . .  	NUMBER	5F00	
GET_EXT_CNTRY_INFO . . . . . . .  	NUMBER	0065	
GET_ID . . . . . . . . . . . . .  	NUMBER	0000	
GET_LOGICAL_DRIVE  . . . . . . .  	N PROC	01A9	CSEG	Global	Length = 000D
GET_SP_FUNC_DEF  . . . . . . . .  	NUMBER	0000	
GET_SP_FUNC_MED  . . . . . . . .  	NUMBER	0001	
GOOD . . . . . . . . . . . . . .  	NUMBER	0000	
GSET_MEDIA_ID  . . . . . . . . .  	NUMBER	0069	

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

IBMLOADSIZE  . . . . . . . . . .  	NUMBER	0003	
INIT . . . . . . . . . . . . . .  	N PROC	0007	CSEG	Global	Length = 004E
INIT_END . . . . . . . . . . . .  	L BYTE	02C1	CSEG	Global
INVAL_PARM . . . . . . . . . . .  	NUMBER	-0009	
IOCTL_FUNC . . . . . . . . . . .  	NUMBER	0044	
IO_ERROR . . . . . . . . . . . .  	V BYTE	0000	CSEG	External

KB_INPUT_FUNC  . . . . . . . . .  	NUMBER	0C01	

LBL_COMPINIT . . . . . . . . . .  	NUMBER	0004	
LOCAL_DRV  . . . . . . . . . . .  	NUMBER	-0001	

MAIN_EXIT  . . . . . . . . . . .  	V WORD	0000	CSEG	External
MAJOR_CODE . . . . . . . . . . .  	NUMBER	0008	
MSGNUM_DRV_REDIRECTED  . . . . .  	V BYTE	0000	CSEG	External
MSGNUM_INVALID_DRV . . . . . . .  	V BYTE	0000	CSEG	External
MSGNUM_INVALID_PARM  . . . . . .  	V BYTE	0000	CSEG	External
MSGNUM_NOT_COMPATIBLE  . . . . .  	V BYTE	0000	CSEG	External
MS_IOCTL_DRV_PARM  . . . . . . .  	V BYTE	0000	CSEG	External
Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:55
COMPINIT -- DISKCOMP INITIALIZATION PROGRAM                 Symbols-3


MT_IOCTL_DRV_PARM  . . . . . . .  	V BYTE	0000	CSEG	External

NINE . . . . . . . . . . . . . .  	NUMBER	0009	
NOOP . . . . . . . . . . . . . .  	NUMBER	0090	
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	
ORG_SOURCE_DRIVE . . . . . . . .  	V BYTE	0000	CSEG	External
ORG_TARGET_DRIVE . . . . . . . .  	V BYTE	0000	CSEG	External

PARSER . . . . . . . . . . . . .  	L NEAR	0000	CSEG	External
PATCH_386  . . . . . . . . . . .  	V BYTE	0000	CSEG	External
PC_386_CHK . . . . . . . . . . .  	N PROC	0055	CSEG	Length = 0024
PRINT_FUNC . . . . . . . . . . .  	NUMBER	0009	
PUT_CHAR . . . . . . . . . . . .  	NUMBER	0002	

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	
SERVER . . . . . . . . . . . . .  	NUMBER	002A	
SETDEVPARM . . . . . . . . . . .  	NUMBER	0040	
SETUP_CTRL_BREAK . . . . . . . .  	N PROC	0286	CSEG	Global	Length = 0011
SET_ASSIGN_MODE  . . . . . . . .  	NUMBER	5F01	
SET_ID . . . . . . . . . . . . .  	NUMBER	0001	
SET_LOGICAL_DRIVE  . . . . . . .  	L NEAR	0000	CSEG	External
SET_LOG_DRIVE  . . . . . . . . .  	NUMBER	000F	
SET_SP_FUNC_DEF  . . . . . . . .  	NUMBER	0004	
SET_SP_FUNC_DOS  . . . . . . . .  	NUMBER	0004	
SEVEN  . . . . . . . . . . . . .  	NUMBER	0007	
SHARED . . . . . . . . . . . . .  	NUMBER	0003	
SIDE . . . . . . . . . . . . . .  	V BYTE	0000	CSEG	External
SIX  . . . . . . . . . . . . . .  	NUMBER	0006	
SOFT_ERROR . . . . . . . . . . .  	NUMBER	0001	
SOURCE_DRIVE . . . . . . . . . .  	V BYTE	0000	CSEG	External
SOURCE_TARGET_DRV  . . . . . . .  	N PROC	0079	CSEG	Global	Length = 004C
START_BUFFER . . . . . . . . . .  	V WORD	0000	CSEG	External
STD_ERROR  . . . . . . . . . . .  	NUMBER	0002	
SUBLIST_11 . . . . . . . . . . .  	V WORD	0000	CSEG	External
SUBLIST_15A  . . . . . . . . . .  	V WORD	0000	CSEG	External
SUBLIST_15B  . . . . . . . . . .  	V WORD	0000	CSEG	External
SUBLIST_15C  . . . . . . . . . .  	V WORD	0000	CSEG	External
SUBLIST_17B  . . . . . . . . . .  	V WORD	0000	CSEG	External
SUBLIST_17C  . . . . . . . . . .  	V WORD	0000	CSEG	External
SUBLIST_17D  . . . . . . . . . .  	V WORD	0000	CSEG	External
SUBLIST_78 . . . . . . . . . . .  	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	00C5	CSEG	Global	Length = 0044
TEST_REMOVABLE . . . . . . . . .  	N PROC	0114	CSEG	Global	Length = 0033
THREE  . . . . . . . . . . . . .  	NUMBER	0003	
TRACK_TO_READ  . . . . . . . . .  	V BYTE	0000	CSEG	External
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
USER_OPTION_8  . . . . . . . . .  	V BYTE	0000	CSEG	External

Microsoft (R) Macro Assembler Version 5.10                  2/14/25 23:44:55
COMPINIT -- DISKCOMP INITIALIZATION PROGRAM                 Symbols-4


VERIFY_FUNC  . . . . . . . . . .  	NUMBER	0062	
VOL_SERIAL . . . . . . . . . . .  	ALIAS	 EXT_BOOT_SERIAL		

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

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

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

$$A_START_COMPINIT . . . . . . .  	L NEAR	0007	CSEG	Global
$$A_STOP_COMPINIT  . . . . . . .  	L NEAR	02C1	CSEG	Global
$$EN11 . . . . . . . . . . . . .  	L NEAR	00BC	CSEG
$$EN13 . . . . . . . . . . . . .  	L NEAR	00BC	CSEG
$$EN21 . . . . . . . . . . . . .  	L NEAR	0146	CSEG
$$EN22 . . . . . . . . . . . . .  	L NEAR	0141	CSEG
$$EN24 . . . . . . . . . . . . .  	L NEAR	0141	CSEG
$$EN32 . . . . . . . . . . . . .  	L NEAR	01A7	CSEG
$$EN34 . . . . . . . . . . . . .  	L NEAR	01A7	CSEG
$$EN40 . . . . . . . . . . . . .  	L NEAR	0237	CSEG
$$EN41 . . . . . . . . . . . . .  	L NEAR	0232	CSEG
$$EN50 . . . . . . . . . . . . .  	L NEAR	0254	CSEG
$$EN55 . . . . . . . . . . . . .  	L NEAR	02C0	CSEG
$$EN57 . . . . . . . . . . . . .  	L NEAR	02C0	CSEG
$$IF1  . . . . . . . . . . . . .  	L NEAR	003C	CSEG
$$IF11 . . . . . . . . . . . . .  	L NEAR	0099	CSEG
$$IF13 . . . . . . . . . . . . .  	L NEAR	00B4	CSEG
$$IF17 . . . . . . . . . . . . .  	L NEAR	0108	CSEG
$$IF19 . . . . . . . . . . . . .  	L NEAR	0113	CSEG
$$IF21 . . . . . . . . . . . . .  	L NEAR	0143	CSEG
$$IF22 . . . . . . . . . . . . .  	L NEAR	0129	CSEG
$$IF24 . . . . . . . . . . . . .  	L NEAR	013E	CSEG
$$IF25 . . . . . . . . . . . . .  	L NEAR	013C	CSEG
$$IF3  . . . . . . . . . . . . .  	L NEAR	0054	CSEG
$$IF32 . . . . . . . . . . . . .  	L NEAR	0195	CSEG
$$IF34 . . . . . . . . . . . . .  	L NEAR	01A2	CSEG
$$IF38 . . . . . . . . . . . . .  	L NEAR	01B5	CSEG
$$IF4  . . . . . . . . . . . . .  	L NEAR	0054	CSEG
$$IF40 . . . . . . . . . . . . .  	L NEAR	0234	CSEG
$$IF41 . . . . . . . . . . . . .  	L NEAR	0228	CSEG
$$IF42 . . . . . . . . . . . . .  	L NEAR	0226	CSEG
$$IF45 . . . . . . . . . . . . .  	L NEAR	0232	CSEG
$$IF5  . . . . . . . . . . . . .  	L NEAR	0054	CSEG
$$IF50 . . . . . . . . . . . . .  	L NEAR	024B	CSEG
$$IF52 . . . . . . . . . . . . .  	L NEAR	0254	CSEG
$$IF55 . . . . . . . . . . . . .  	L NEAR	02A5	CSEG
$$IF57 . . . . . . . . . . . . .  	L NEAR	02BD	CSEG
$$IF9  . . . . . . . . . . . . .  	L NEAR	0075	CSEG
$$LL9  . . . . . . . . . . . . .  	L NEAR	006A	CSEG
@CPU . . . . . . . . . . . . . .  	TEXT  0101h		
@FILENAME  . . . . . . . . . . .  	TEXT  compinit		
@VERSION . . . . . . . . . . . .  	TEXT  510		


   1554 Source  Lines
   1638 Total   Lines
    271 Symbols

  45356 + 217032 Bytes symbol space free

      0 Warning Errors
      0 Severe  Errors
