home *** CD-ROM | disk | FTP | other *** search
- ; PROGRAM: RENAME
- ; VERSION: 3.0
- ; DATE: 18 MAY 84
- ; AUTHOR: RICHARD CONN
- ; PREVIOUS VERSIONS: 2.0 (16 JAN 83)
- ; PREVIOUS VERSIONS: 1.4 (6 JAN 83), 1.3 (7 DEC 82), 1.2 (10 NOV 82)
- ; PREVIOUS VERSION: RENAME.ASM Version 1.1 (26 OCT 81)
- VERS equ 30
- z3env SET 0f400h
-
- ;
- ; RENAME Command --
- ; RENAME is used to change the name of one or more files. Unlike
- ; the ZCPR2-resident REN function, RENAME permits ambiguous file names
- ; and supports an Inspect mode that allows the user to confirm each
- ; rename before it is done. Additionally, there is a Control Mode which
- ; allows the user to manually specify the name for each file as it is
- ; presented to him.
- ;
- ; The RENAME command may be of the following forms:
- ; RENAME dir:afn1=afn2,dir:afn3=afn4,... o
- ; RENAME dir:afn,dir:afn1=afn2,... o
- ; The first form shows elements of the form
- ; dir:afn1=afn2
- ; while the second form shows elements of the form
- ; dir:afn
- ; which is the same as
- ; dir:afn=afn
- ; and only makes sense if Control Mode is used.
- ;
- ; The option characters (o) are none or more of the following:
- ; C -- Control Mode; manually specify each new name
- ; I -- Inspect and approve each rename
- ; S -- Include SYStem files
- ;
- ; Examples:
- ; RENAME *.MAC=*.ASM <-- Rename all ASM files to MAC
- ; RENAME *.MAC C <-- Rename all MAC files to names
- ; input by the user
- ; RENAME *.OBJ=*.COM SI <-- Rename all COM files to OBJ
- ; and include SYStem files
- ; and Inspect and approve each
- ; change
- ;
-
- FALSE EQU 0
- TRUE EQU NOT FALSE
-
- ESIZE EQU 16 ; SIZE OF DIR ENTRY (FROM SYSLIB DIRF ROUTINE)
-
- EXT DIRQ ; DIRECTORY PROCESSOR
-
- EXT Z3INIT ; INIT BUFFERS
- EXT ZFNAME ; FILE NAME PROCESSOR
- EXT Z3LOG ; Z3 DU LOG
-
- EXT F$DELETE ; DELETE FILE
- EXT F$RENAME ; RENAME FILE
- EXT BBLINE ; INPUT LINE EDITOR
- EXT INITFCB ; INIT FCB
- EXT BDOS ; BDOS ENTRY
- EXT PUTUD ; SAVE CURRENT USER/DISK
- EXT GETUD ; RESTORE CURRENT USER/DISK
- EXT MOVEB ; COPY ROUTINE
- EXT PHLDC ; PRINT HL AS DECIMAL CHARS
- EXT PRINT ; PRINT ROUTINE
- EXT COUT ; CONSOLE OUTPUT ROUTINE
- EXT CIN ; CONSOLE INPUT ROUTINE
- EXT CAPS ; CAPITALIZE ROUTINE
- EXT CRLF ; NEW LINE ROUTINE
- EXT FILLB ; FILL ROUTINE
- EXT CODEND ; CODE END COMPUTATION ROUTINE
-
- ;
- ; CP/M EQUATES
- ;
- CPM EQU 0 ; WARM BOOT
- FCB EQU 5CH ; FCB
- BUFF EQU 80H ; INPUT LINE BUFFER
- CR EQU 13 ; <CR>
- LF EQU 10 ; <LF>
-
- ;
- ; Environment Definition
- ;
- if z3env ne 0
- ;
- ; External ZCPR3 Environment Descriptor
- ;
- jmp start
- db 'Z3ENV' ;This is a ZCPR3 Utility
- db 1 ;External Environment Descriptor
- z3eadr:
- dw z3env
- start:
- lhld z3eadr ;pt to ZCPR3 environment
- ;
- else
- ;
- ; Internal ZCPR3 Environment Descriptor
- ;
- MACLIB Z3BASE.LIB
- MACLIB SYSENV.LIB
- z3eadr:
- jmp start
- SYSENV
- start:
- lxi h,z3eadr ;pt to ZCPR3 environment
- endif
-
- ;
- ; Start of Program -- Initialize ZCPR3 Environment
- ;
- call z3init ;initialize the ZCPR3 Env and the VLIB Env
- LXI H,0 ; GET STACK PTR
- DAD SP
- SHLD STACK ; SAVE IT
- CALL CODEND
- SHLD CMDLNE ; SETUP COMMAND LINE BUFFER
- LXI D,100H ; BUFFER SIZE
- DAD D
- SHLD NTFCB ; SET TEMP FCB
- DAD D
- SHLD DIRBUF ; PTR TO DIR BUFFER
- SPHL ; NEW SP
- LHLD NTFCB ; SET 2ND FCB
- LXI D,40
- DAD D
- SHLD OFCB
-
- CALL PUTUD ; SAVE CURRENT USER/DISK AWAY
-
- CALL PRINT
- DB 'RENAME Version '
- DB VERS/10+'0','.',(VERS MOD 10)+'0',0
- LDA FCB+1 ; GET FIRST CHAR OF FILE NAME
- CPI ' ' ; NO FILE SPEC?
- JZ HELP
- CPI '/' ; OPTION CAUGHT?
- JNZ ECONT
-
- ; PRINT HELP INFORMATION
- HELP:
- CALL PRINT
- DB CR,LF,'Syntax:'
- DB CR,LF,' RENAME dir:afn1=afn2,afn3=afn4,... o...'
- DB CR,LF,'Options:'
- DB CR,LF,' C -- Control Mode (Allow user to manually name each '
- DB 'file)'
- DB CR,LF,' I -- Inspect Mode (Give user approval option)'
- DB CR,LF,' S -- Include SYS files'
- DB CR,LF
- DB 0
-
- ; RETURN TO OS
- RETURN:
- LHLD STACK ; GET OLD STACK
- SPHL ; SET IT
- RET
-
- ; COPY BUFFER INTO TEMP BUFFER
- ECONT:
- LHLD CMDLNE ; PT TO COMMAND LINE SAVE BUFFER
- XCHG ; ... IN DE
- LXI H,BUFF+1 ; PT TO BUFFER
- MVI B,80H ; BUFFER SIZE
- CALL MOVEB ; COPY INTO COMMAND LINE BUFFER
-
- ; EXTRACT FLAGS IF PRESENT
- XRA A ; SET NO INSPECT, NO R/O, AND NO SYSTEM FILES
- STA INSPECT
- STA CONTROL ; SET NO CONTROL MODE
- MVI A,80H ; SELECT NON-SYS FILES ONLY
- STA SYSTEM
- LXI H,0 ; SET FILE COUNT
- SHLD FILECNT
- LHLD CMDLNE ; PT TO BUFFER
- ; SKIP TO FILE NAME STRING
- SBLANK:
- MOV A,M ; SKIP TO NON-BLANK
- CPI ' ' ; <SP>?
- JNZ SBL1
- INX H ; PT TO NEXT CHAR
- JMP SBLANK
- ; SKIP TO END OF FILE NAME STRING
- SBL1:
- MOV A,M ; SKIP TO <SP> OR EOL
- ORA A ; DONE?
- JZ OPT
- CPI ' ' ; <SP>
- JZ OPT
- INX H ; PT TO NEXT
- JMP SBL1
- ; CHECK FOR LEADING SLASH ON OPTION AND SKIP IT IF SO
- OPT:
- CPI '/' ; OPTION CHAR?
- JNZ OPTION
- INX H ; SKIP SLASH
- ; PROCESS LIST OF OPTIONS
- OPTION:
- MOV A,M ; GET BYTE
- ORA A ; DONE?
- JZ DSPEC
- INX H ; PT TO NEXT CHAR
- CPI ' ' ; SKIP OVER SPACES
- JZ OPTION
- CPI '/' ; IF OPTION LETTER, OBVIOUS ERROR, SO HELP
- JZ HELP
- CPI 'C' ; CONTROL?
- JZ OPTCTRL
- CPI 'I' ; INSPECT?
- JZ OPTINS
- CPI 'S' ; SYSTEM FILES?
- JNZ HELP
- MVI A,0C0H ; SET FOR SYS FILES
- STA SYSTEM
- JMP OPTION
- OPTCTRL:
- MVI A,0FFH ; CONTROL MODE
- STA CONTROL
- JMP OPTION
- OPTINS:
- MVI A,0FFH ; INSPECT
- STA INSPECT
- JMP OPTION
-
- ; EXTRACT DISK, USER, AND FILE NAME INFORMATION
- DSPEC:
- LHLD CMDLNE ; PT TO BEFORE FIRST BYTE
- DCX H
- DSPEC0:
- INX H ; PT TO BYTE
- MOV A,M ; GET BYTE
- ORA A ; DONE?
- JZ HELP
- CPI ' ' ; <SP>?
- JZ DSPEC0
- ;
- ; MAJOR REENTRY POINT WHEN FILE SPECS ARE SEPARATED BY COMMAS
- ; HL PTS TO FIRST BYTE OF NEXT FILE SPEC
- ;
- DSPEC1:
- CALL GETUD ; RESET USER IF NECESSARY
- PUSH H
- LHLD NTFCB
- XCHG ; PT TO FCB IN DE
- POP H
- MVI A,0 ; DIR BEFORE DU
- CALL ZFNAME ; EXTRACT FILE NAME INTO FCB, AND GET DISK AND USER
- SHLD NEXTCH ; SAVE PTR TO DELIMITER WHICH ENDED SCAN
- PUSH H
- LHLD NTFCB
- XCHG ; PT TO FCB IN DE
- POP H
- CALL Z3LOG ; LOG INTO DU
-
- ; FIRST NAME IS NOW EXTRACTED -- EXTRACT POSSIBLE SECOND NAME
- NAME2:
- LHLD OFCB ; PT TO FCB FOR 2ND NAME
- XCHG
- LHLD NTFCB ; PT TO FIRST NAME
- MVI B,16 ; COPY 16 BYTES
- CALL MOVEB
- LHLD NEXTCH ; PT TO CHAR WHICH ENDED PARSE
- MOV A,M ; GET IT
- CPI '=' ; ASSIGNMENT?
- JNZ RENAME ; GO AHEAD IF NOT
- INX H ; PT TO CHAR AFTER '='
- PUSH H
- LHLD OFCB ; PT TO TEMP FCB
- XCHG ; ... IN DE
- POP H
- MVI A,0 ; DIR BEFORE DU
- CALL ZFNAME ; EXTRACT FILE NAME INTO FCB, AND GET DISK AND USER
- SHLD NEXTCH ; SAVE PTR TO DELIMITER WHICH ENDED SCAN
-
- ; LOAD DIRECTORY AND RENAME FILES
- RENAME:
- LHLD OFCB
- XCHG ; PT TO FCB
- LHLD DIRBUF ; PT TO END OF CODE
- CALL INITFCB ; INIT THE FCB
- LDA SYSTEM ; SET FLAGS
- CALL DIRQ ; LOAD DIR, SELECT FILES, PACK, AND ALPHABETIZE
-
- ; REN DIR FILES; HL PTS TO FIRST FILE, BC=FILE COUNT
- CALL RENFILES
-
- ; CHECK FOR NEXT FILE SPEC
- LHLD NEXTCH ; GET PTR
- MOV A,M ; GET DELIM
- CPI ',' ; ANOTHER FILE?
- JNZ RENDONE
- INX H ; PT TO CHAR AFTER COMMA
- JMP DSPEC1 ; CONTINUE PROCESSING
-
- ; RENAME COMPLETE -- PRINT COUNT AND EXIT
- RENDONE:
- CALL PRCOUNT ; PRINT FILE COUNT
- JMP RETURN
-
- ; RENAME SELECTED FILES
- RENFILES:
- MOV A,B ; CHECK FOR ANY FILES LOADED
- ORA C
- RZ
-
- ; PRINT FILE NAME
- RENLP:
- PUSH B ; SAVE ENTRY COUNT
- CALL PRINT
- DB CR,LF,'Rename ',0
- PUSH H ; SAVE PTR TO FCB
- LHLD NTFCB ; COPY NEW TEMPLATE INTO RENFCB
- LXI D,RENFCB
- MVI B,16
- CALL MOVEB
- POP H ; GET PTR
- PUSH H ; SAVE PTR
- INX H ; PT TO FN OF OLD NAME
- INX D ; PT TO FN OF RENFCB
- MVI B,11 ; 11 BYTES TO FN AND FT
- RENLP1:
- LDAX D ; GET CHAR OF NEW
- CPI '?' ; CHANGE '?' TO OLD CHAR
- JNZ RENLP2
- MOV A,M ; GET OLD CHAR
- ANI 7FH ; MASK OLD CHAR
- STAX D ; STORE IT AWAY AS NEW
- RENLP2:
- INX H ; PT TO NEXT CHAR
- INX D
- DCR B ; COUNT DOWN
- JNZ RENLP1
- LXI H,RENFCB ; PT TO NEW NAME
- CALL PRFN ; PRINT FILE NAME
- CALL PRINT
- DB ' from ',0
- POP H ; GET PTR TO OLD FILE NAME
- PUSH H ; SAVE IT AGAIN
- CALL PRFN ; PRINT FILE NAME
- POP H ; GET PTR
-
- ; CHECK FOR CONTROL MODE AND PERFORM CONTROL FUNCTION IF SET
- LDA CONTROL ; GET FLAG
- ORA A ; NZ=YES
- JNZ RENCTRL
-
- ; CHECK FOR INSPECTION AND INSPECT IF SET
- LDA INSPECT ; GET FLAG
- ORA A ; 0=NO
- JZ DOIT
-
- ; PROMPT USER FOR RENAME
- CALL RENQ ; REN QUESTION
- CPI 'Q' ; QUIT?
- JZ QUIT
- CPI 'Y' ; YES?
- JZ DOIT
-
- ; DON'T RENAME FILE
- NODO:
- CALL PRINT
- DB CR,LF,'NO Name Change',0
- JMP RENTEST
-
- ; PRINT FILE NAME PTED TO BY HL
- PRFN:
- INX H ; PT TO FILE NAME
- MVI B,8 ; PRINT NAME
- CALL PRNT
- MVI A,'.' ; DECIMAL
- CALL COUT
- MVI B,3 ; PRINT TYPE
- CALL PRNT
- RET
-
- ; PROMPT USER FOR RENAME
- RENQ:
- CALL PRINT ; PRINT PROMPT
- DB ' -- Rename (Y/N/Q=Quit)? ',0
- CALL CIN ; GET RESPONSE
- CALL CAPS ; CAPITALIZE
- CALL COUT ; ECHO
- RET
-
- ; CONTROL FUNCTION -- ALLOW USER TO RENAME AS HE DESIRES
- RENCTRL:
- PUSH H ; SAVE PTR TO FILE
- RCTRL:
- CALL PRINT
- DB CR,LF,' -- New Name (<CR>=No Change)? ',0
- MVI A,0FFH ; CAPITALIZE
- CALL BBLINE ; INPUT LINE FROM USER
- ORA A ; CHECK FOR JUST <CR>
- JNZ RCTRL0
- POP H ; GET PTR TO FILE
- JMP RENTEST ; PROCEED WITH NEXT ENTRY
- RCTRL0:
- LXI D,RENFCB ; PLACE INTO NEW NAME FCB
- CALL ZFNAME ; JUST EXTRACT NAME
- MVI B,11 ; CHECK FOR ANY WILD CHARS
- RCTRL1:
- INX D ; PT TO NEXT CHAR
- LDAX D ; GET IT
- CPI '?' ; CAN'T BE WILD
- JZ WERR
- CPI '*' ; CAN'T BE WILD
- JZ WERR
- DCR B ; COUNT DOWN
- JNZ RCTRL1
- JMP RDOIT ; DONE -- PERFORM RENAME
- WERR:
- CALL PRINT
- DB CR,LF,'Wild Card (?,*) in Name -- Try Again',0
- JMP RCTRL
-
- ; QUIT RENAME PROGRAM
- QUIT:
- CALL PRCOUNT ; PRINT COUNT OF FILES RENAMED
- CALL PRINT
- DB ' QUIT',0
- JMP RETURN
-
- ; REN FILE, BUT GET PTR FIRST
- RDOIT:
- POP H ; GET PTR
-
- ; RENAME FILE; OLD NAME PTED TO BY HL, NEW NAME IN RENFCB
- DOIT:
- PUSH H
- ; STEP 1 -- DETERMINE IF NEW NAME ALREADY EXISTS
- LXI D,RENFCB ; PT TO NEW NAME
- CALL INITFCB
- MVI C,17 ; SEARCH FOR FIRST
- CALL BDOS
- INR A ; NOT FOUND?
- JZ DOIT1
- CALL PRINT
- DB CR,LF,' -- File Exists -- Delete It (Y/N)? ',0
- CALL CIN ; GET RESPONSE
- CALL CAPS
- CALL COUT
- POP H ; PREP FOR ABORT
- CPI 'Y' ; YES -- CONTINUE?
- JNZ RENTEST ; NOT YES, SO SKIP IT
- ; DELETE OLD FILE, SO SET ATTRIBUTES AND DO IT
- PUSH H ; SAVE PTR AGAIN
- CALL INITFCB ; CLEAR FCB
- MVI C,30 ; SET FILE ATTRIBUTES TO R/W IF NOT ALREADY
- CALL BDOS
- CALL INITFCB
- CALL F$DELETE ; DELETE FILE
- DOIT1:
- POP H ; HL PTS TO OLD NAME
- ; CLEAR THE OLD NAME'S ATTRIBUTES IN CASE IT WAS R/O
- PUSH H ; SAVE PTR TO OLD NAME
- PUSH H
- LHLD OFCB ; COPY OLD NAME
- XCHG
- POP H
- MVI B,16
- CALL MOVEB
- PUSH D ; CLEAR ATTRIBUTES
- MVI B,11 ; 11 BYTES
- INX D ; PT TO FIRST
- DOIT2:
- LDAX D ; GET CHAR
- ANI 7FH ; CLEAR ATT
- STAX D ; PUT CHAR
- INX D ; PT TO NEXT
- DCR B ; COUNT DOWN
- JNZ DOIT2
- POP D ; NOW SET ATTRIBUTES OF OLD NAME
- CALL INITFCB
- MVI C,30 ; SET ATTRIBUTES
- CALL BDOS
- CALL INITFCB
- ; DO THE RENAME
- LXI H,RENFCB ; PT TO NEW NAME
- XCHG
- CALL INITFCB ; INIT NEW FCB
- XCHG ; HL PTS TO NEW NAME, DE PTS TO OLD NAME
- CALL F$RENAME ; RENAME THE FILE
- ; RESTORE THE ORIGINAL ATTRIBUTE BITS
- POP H ; GET PTR TO OLD NAME
- LXI D,RENFCB+1 ; PT TO NEW NAME
- PUSH H ; SAVE PTR TO OLD NAME
- INX H ; PT TO FN OF OLD NAME
- XCHG ; HL PTS TO NEW NAME, DE PTS TO OLD NAME
- MVI B,11 ; 11 BYTES
- DOIT3:
- LDAX D ; GET ATTRIBUTE BIT OF OLD NAME
- ANI 80H ; LOOK ONLY AT ATTRIBUTE BIT
- ORA M ; MASK IN NEW NAME BYTE
- MOV M,A ; STORE IT AWAY
- INX H ; PT TO NEXT
- INX D
- DCR B ; COUNT DOWN
- JNZ DOIT3
- ; SET THE ORIGINAL ATTRIBUTES INTO THE NEW FILE
- LXI D,RENFCB ; PT TO FCB
- CALL INITFCB
- MVI C,30 ; SET ATTRIBUTES
- CALL BDOS
- LHLD FILECNT ; INCREMENT FILE COUNT
- INX H
- SHLD FILECNT
- POP H ; GET PTR TO DIRECTORY ENTRY
-
- ; PT TO NEXT ENTRY
- RENTEST:
- LXI D,ESIZE ; PT TO NEXT ENTRY
- DAD D
- POP B ; GET COUNT
- DCX B ; COUNT DOWN
- MOV A,B ; CHECK FOR ZERO
- ORA C
- JNZ RENLP
-
- ; RETURN TO CALLER
- RET
-
- ;
- ; PRINT CHARS PTED TO BY HL FOR B BYTES
- ;
- PRNT:
- MOV A,M ; GET CHAR
- CALL COUT
- INX H ; PT TO NEXT
- DCR B ; COUNT DOWN
- JNZ PRNT
- RET
-
- ;
- ; PRINT COUNT OF NUMBER OF FILES RENAMED
- ;
- PRCOUNT:
- CALL CRLF ; NEW LINE
- LHLD FILECNT ; GET COUNT
- MOV A,L ; CHECK FOR NONE
- ORA H
- JZ PRNO
- CALL PHLDC ; PRINT DECIMAL COUNT
- JMP PRMS
- PRNO:
- CALL PRINT
- DB 'No ',0
- PRMS:
- LHLD FILECNT ; 1 FILE PROTECTED?
- MOV A,H ; HIGH ZERO?
- ORA A
- JNZ PRMULT
- MOV A,L ; LOW ONE?
- CPI 1
- JZ PRSING
- PRMULT:
- CALL PRINT
- DB ' Files Renamed',0
- RET
- PRSING:
- CALL PRINT
- DB ' File Renamed',0
- RET
-
- ;
- ; BUFFERS
- ;
- INSPECT:
- DS 1 ; INSPECT FLAG (0=NO, 0FFH=YES)
- CONTROL:
- DS 1 ; CONTROL FLAG (0=NO, 0FFH=YES)
- SYSTEM:
- DS 1 ; SYSTEM FLAG (80H=NON-SYS, 0C0H=SYS/NON-SYS)
- NEXTCH:
- DS 2 ; PTR TO NEXT CHAR IN MULTIFILE COMMAND LINE
- FILECNT:
- DS 2 ; COUNT OF NUMBER OF FILES RENAMED
- RENFCB:
- DS 40 ; FCB FOR RENAME
- OFCB:
- DS 2 ; FCB FOR OLD FILE NAME AND OLD FILE TEMPLATE
- NTFCB:
- DS 2 ; FCB FOR NEW FILE TEMPLATE
- CMDLNE:
- DS 2 ; PTR TO COMMAND LINE BUFFER
- DIRBUF:
- DS 2 ; PTR TO DIRECTORY BUFFER
- STACK:
- DS 2 ; OLD STACK PTR
-
- END