home *** CD-ROM | disk | FTP | other *** search
- PAGE 60,132
- TITLE MIRDIR - Directory Mirror program
- ; SUBTTL General program description and use of common storage
- ; ----------------------------------------------------------------------------;
- ; MIRDIR - Enter identical directory on another drive as current direct;
- ; ----------------------------------------------------------------------------;
- ; MIRDIR 1.0 ■ PCDATA TOOLKIT Copyright (c) 1990 Ziff Communications Co. ;
- ; PC Magazine ■ Wolfgang Stiller ;
- ; ;
- ;-----------------------------------------------------------------------------;
-
- ; Purpose: ;
- ; To "mirror" the directory structure from one disk to another disk. ;
- ; MIRDIR will determine the current directory name, and attempt to ;
- ; change to, or create the same directory on the specified disk. ;
- ; ----------------------------------------------------------------------------;
- ;Format: ;
- ; ;
- ;MIRDIR d: ;
- ; ;
- ; d: Specifies the drive on which the current directory is to be mirrored. ;
- ; ;
- ; ----------------------------------------------------------------------------;
- ;Remarks: ;
- ; ;
- ; "Mirroring" means to change to the same directory on another drive ;
- ; as the current directory on the default drive. If this directory ;
- ; does not exist, then MIRDIR will attempt to create the directory. ;
- ; MIRDIR will only create a new directory if the parent for the ;
- ; missing directory exists. In other words if the current directory ;
- ; name is: "A\B\C", MIRDIR will fail if the target disk does not have ;
- ; a directory named "A\B" or one named "A\B\C". If MIRDIR is used ;
- ; with program Xall, this condition will automatically be satisfied, ;
- ; if executed from the root directory. ;
- ; ;
- ; MIRDIR will return the following DOS error levels: ;
- ; 128 (40h) if fatal error on starting such as bad syntax. ;
- ; 32 (20h) indicates MIRDIR unable to mirror the directory. This means it ;
- ; attempted to create the directory and failed. ;
- ; 04 Directory was not found on target volume, but MIRDIR created it.;
- ; 00 Normal completion. ;
- ; ;
- ; ----------------------------------------------------------------------------;
-
- ;---------------------------------------------------------------;
- ; Constants: ;
- ;---------------------------------------------------------------;
- BOX EQU 254 ;Small box character code
- CR EQU 0Dh
- LF EQU 0Ah
- CRLF EQU 0A0Dh ;Carriage return line feed.
-
- CSEG SEGMENT
- ASSUME CS:CSEG, DS:CSEG, ES:CSEG, SS:CSEG
-
- SUBTTL Main program
- ;******************************************************************************;
- ;** Main program begins here -MIRDIR- **;
- ;******************************************************************************;
- ORG 100H ; This is a .COM type program
- MIRDIR:
- CALL Parse_parms_Print_Header ;Parse cmdline paramters + prnt header
- ;Set mirror drive letter in path strng
- XOR BP,BP ;Set zero as highest return code
- CALL Get_Current_Directory ;Get name of current directory
- CALL Mirror_Current_Directory ;Now change other drive to same dir
- MOV AX,BP ;BP contains highest return code
- MOV AH,4Ch ; terminate with return code
- INT 21h
-
- ;---------------------------------------------------------------------------;
- ; GET CURRENT DIRECTORY ;
- ; Ask DOS for current directory string. Store it in a substring of ;
- ; Mir_Directory. ;
- ;---------------------------------------------------------------------------;
- Get_Current_Directory: ;Determine current directory
- MOV SI,offset Current_Path ;Place to store original directory
- XOR DL,DL ;Zero DL in order to use default drive
- MOV AH,47h ;Get current directory (path) func
- INT 21h
- RET
-
-
- ;---------------------------------------------------------------------------;
- ; MIRROR CURRENT DIRECTORY ;
- ; Try to change to the directory on users specified "Mirror_drive" to ;
- ; match the current directory which we stored in substring of ;
- ; Mir_Directory. If this fails, we will attempt to create this ;
- ; directory and then change to that directory. ;
- ;---------------------------------------------------------------------------;
- Mirror_Current_Directory:
- ; 1) Attempt change to same directory as on current drive
- MOV DX, offset Mir_Directory ;Directory name including drive.
- MOV AH,3Bh ;Set current directory function
- INT 21h
- JC Invalid_path ;IF function failed
- RET ;It worked! we are all done.
- Invalid_Path: ;Change dir failed so try MKdir
- ; 2) If change failed then try to create the missing directory
- MOV AH,39h ;DOS create directory function
- ;DX already points to directory string
- INT 21h ;Create new directory
- JC Create_Dir_Failed ;If creation of new directory failed..
- ; 3) Now change over to the newly created directory
- MOV AH,3Bh ;Set current directory function
- INT 21h ;Set to the newly created directory
- JC Create_Dir_Failed ;IF failure (should never happen)
- ;It worked! Tell user we created dirct
- MOV BP,04h ;Set error level for "create worked"
- MOV DX, offset Dir_create_Msg ;beginning of "Create" message
- MOV CX,13 ;Number of chars in message
- CALL Display_Directory_Name ;Display message + directory name
- RET
- Create_Dir_Failed:
- MOV DX, offset Bad_create_Msg ;beginning of "Create failed" message
- MOV CX,19 ;Number of chars in message
- CALL Display_Directory_Name ;Display message + directory name
-
- MOV DX,OFFSET Create_detail_Msg ;Give user details of failure
- MOV AH,09h ;DOS display string function
- INT 21H
-
- ; Produce a beep to alert the user: (use BIOS TTY func to write an ASCII BELL)
- MOV AX,0E07H ;BIOS func (0Eh) to write (07H) beep
- XOR BH,BH ;Select page zero for output
- INT 10H ;BIOS video function (0Eh=write char)
-
- ; Wait for user to hit any key
- XOR AX,AX
- INT 16h ;Wait for user to hit a key
-
- MOV BP,20h ;Error level code for batch file use
- RET
-
- ;---------------------------------------------------------------------------;
- ; DISPLAY DIRECTORY NAME ;
- ; Display message pointed to by DX of length CX and the directory and ;
- ; drive string in Mir_Directory. ;
- ;---------------------------------------------------------------------------;
- Display_Directory_Name:
- MOV AH,40h ;DOS Write func
- MOV BX,1 ;Handle for std output device
- INT 21h ;Write Start of message
- ; Scan the string in Mir_Directory to determine its length:
- CLD ;Forward Scan
- MOV DI,OFFSET Mir_Directory ;Location of Mir_Directory
- MOV DX,DI ;Saved copy of directory start
- XOR AX,AX ;Scan for zero termination of string
- MOV CX,67 ;Scan up to 67 characters
- REPNE SCASB ;Find 1st zero byte
- SUB DI,DX ;Length of directory string
- MOV CX,DI ;Characters to display in dir string
- ;DX = start of dir strng, CX = # of chars in string
- MOV AH,40h ;DOS Write func
- INT 21h ;Display the actual directory string
- MOV DX,OFFSET CRLF_str ;Prepare to put out carriage ret + LF
- MOV CX,2 ;Print 2 characters
- MOV AH,40h ;DOS Write func
- INT 21h
- RET
-
- SUBTTL Initialization code
- PAGE
- ; ----------------------------------------------------------------------------;
- ; Initialization code - parse parms + place drive letter in path string ;
- ; ----------------------------------------------------------------------------;
- Parse_parms_Print_Header: ;Parse input parameters + print header
- MOV SI,80H ;Parameter area in PSP
- MOV CL,[SI] ;Get # of chars in input parm
- XOR CH,CH ;Clear upper byte of char count
- OR CL,CL ;Check for 0 chars (NO INPUT)
- MOV DX, OFFSET Missing_D_Msg ;Prepare syntax description message
- JZ ERR_EXIT ;IF NO PARMS, give user correct syntax
- INC SI ;Point to 1st char
- CLD ;Forward direction
-
- DEL_SPACES:
- LODSB ;Get byte at DS:SI and inc SI
- CMP AL,' ' ;Is it a space?
- JNE Check_for_drive ;If not we have something..
- LOOP DEL_SPACES ;CONT CHECKING UNTIL LAST CHAR
- ERR_EXIT:
- MOV AH,09h ;DOS display string function
- INT 21H
-
- ; Produce a beep to alert the user: (use BIOS TTY func to write an ASCII BELL)
- MOV AX,0E07H ;BIOS func (0Eh) to write (07H) beep
- XOR BH,BH ;Select page zero for output
- INT 10H ;BIOS video function (0Eh=write char)
-
- ; Wait for user to hit any key
- XOR AX,AX
- INT 16h ;Wait for user to hit a key
-
- MOV DX, OFFSET Syntax_msg ;Prepare syntax description message
- MOV AH,09h ;DOS display string function
- INT 21H
- MOV AX,4C80h ; terminate with 40h return code
- INT 21h
- ;---------------------------------------------------------------------------;
- ; Conventions for command line parsing: ;
- ; SI points to next char to be checked in the parm field at DS:80 ;
- ; CX is count of characters left to be scanned ;
- ;---------------------------------------------------------------------------;
- Check_for_drive:
- CMP BYTE PTR [SI],':' ;Check for presence of drive spec
- JNZ ERR_Exit ;Give user some help...
- AND AL,5Fh ;Capitalize drive letter
- MOV Mir_Drive,AL ;Save a copy of drive letter
- MOV DX,OFFSET Start_Msg ;Initial message
- MOV AH,09H ;DOS display string function
- INT 21H
- RET
-
- SUBTTL Definition of Data structures
- PAGE
- ;******************************************************************************;
- ;** Definition of Data areas follow **;
- ;******************************************************************************;
- Root_dir DB '\',0 ;Zero terminated root dir string
- Mir_directory Label BYTE ;Same as location "Mir_Drive"
- Mir_Drive DB 'A:' ;Name of drive to be mirrored
- DB '\' ;Force 1st char directry strng to '\'
- Current_Path DB 64 DUP (0) ;Save area to restore original path
-
- Start_MSG DB CR,LF,"MIRDIR 1.0 ",BOX," PCDATA TOOLKIT (c) 1990"
- DB " Ziff Communications Co.",CR,LF
- DB "PC Magazine ",BOX," Wolfgang Stiller",CR,LF,"$"
- Missing_D_Msg DB 'The drive letter of the target drive is missing.',CR,LF
- DB 'It should be entered with a colon.',CR,LF
- DB 'Example:',CR,LF
- DB ' MIRDIR A:',CR,LF
- DB 'will mirror the current directory on drive A.',CR,LF,Lf
- DB 'Please hit a key - ',CR,LF,LF,'$'
- Syntax_Msg DB "MIRDIR 1.0 ",BOX," PCDATA TOOLKIT Copyright (c) 1990"
- DB " Ziff Communications Co.",CR,LF
- DB "PC Magazine ",BOX," Wolfgang Stiller",CR,LF,CR,LF
- DB 'Syntax is: MIRDIR d:',CR,LF,LF
- DB 'd: is the drive upon which MIRDIR will "mirror" '
- DB 'the current directory.',CR,LF
- DB ' MIRDIR will change to a directory on drive d: '
- DB 'which matches the',CR,LF
- DB ' current directory. If not found, it will try to '
- DB 'create the directory.'
- CRLF_str DB CR,LF,'$'
- Bad_Create_Msg DB 'Create failed for: '
- Dir_Create_Msg DB 'Created dir: '
- Create_Detail_Msg DB CR,LF,'The create probably failed due to 1 of 2 reasons:'
- DB CR,LF
- DB ' 1) There is a insufficient space on the target disk'
- DB CR,LF,' or',CR,LF
- DB ' 2) The parent directory did not exist. For example,'
- DB CR,LF
- DB ' to create directory "\A\B", directory "\A" must '
- DB ' first exist.'
- DB CR,LF,LF,'Please hit a key',CR,LF,'$'
- User_file_spec EQU $ ;User specified file spec to check
- CSEG EndS
- END MIRDIR