; PROGRAM: RENAME ; VERSION: 2.0 ; DATE: 16 JAN 83 ; AUTHOR: RICHARD CONN ; 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 20 ; ; This program is Copyright (c) 1982, 1983 by Richard Conn ; All Rights Reserved ; ; ZCPR2 and its utilities, including this one, are released ; to the public domain. Anyone who wishes to USE them may do so with ; no strings attached. The author assumes no responsibility or ; liability for the use of ZCPR2 and its utilities. ; ; The author, Richard Conn, has sole rights to this program. ; ZCPR2 and its utilities may not be sold without the express, ; written permission of the author. ; ; ; 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 DIRF ; DIRECTORY PROCESSOR EXT ZGPINS ; INIT BUFFERS EXT ZFNAME ; FILE NAME PROCESSOR EXT ZINIEXT ; EXTERNAL PATH INIT EXT FNAME ; FILE NAME PROCESSOR WITHOUT NAMED DIRS EXT F$DELETE ; DELETE FILE EXT F$RENAME ; RENAME FILE EXT BBLINE ; INPUT LINE EDITOR EXT INITFCB ; INIT FCB EXT BDOS ; BDOS ENTRY EXT RETUD ; RETURN CURRENT USER/DISK 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 ; LF EQU 10 ; ; ; Branch to Start of Program ; JMP START ; ;****************************************************************** ; ; SINSFORM -- ZCPR2 Utility Standard General Purpose Initialization Format ; ; This data block precisely defines the data format for ; initial features of a ZCPR2 system which are required for proper ; initialization of the ZCPR2-Specific Routines in SYSLIB. ; ; ; EXTERNAL PATH DATA ; EPAVAIL: DB 0FFH ; IS EXTERNAL PATH AVAILABLE? (0=NO, 0FFH=YES) EPADR: DW 40H ; ADDRESS OF EXTERNAL PATH IF AVAILABLE ; ; INTERNAL PATH DATA ; INTPATH: DB 0,0 ; DISK, USER FOR FIRST PATH ELEMENT ; DISK = 1 FOR A, '$' FOR CURRENT ; USER = NUMBER, '$' FOR CURRENT DB 0,0 DB 0,0 DB 0,0 DB 0,0 DB 0,0 DB 0,0 DB 0,0 ; DISK, USER FOR 8TH PATH ELEMENT DB 0 ; END OF PATH ; ; MULTIPLE COMMAND LINE BUFFER DATA ; MCAVAIL: DB 0FFH ; IS MULTIPLE COMMAND LINE BUFFER AVAILABLE? MCADR: DW 0FF00H ; ADDRESS OF MULTIPLE COMMAND LINE BUFFER IF AVAILABLE ; ; DISK/USER LIMITS ; MDISK: DB 4 ; MAXIMUM NUMBER OF DISKS MUSER: DB 31 ; MAXIMUM USER NUMBER ; ; FLAGS TO PERMIT LOG IN FOR DIFFERENT USER AREA OR DISK ; DOK: DB 0FFH ; ALLOW DISK CHANGE? (0=NO, 0FFH=YES) UOK: DB 0FFH ; ALLOW USER CHANGE? (0=NO, 0FFH=YES) ; ; PRIVILEGED USER DATA ; PUSER: DB 10 ; BEGINNING OF PRIVILEGED USER AREAS PPASS: DB 'chdir',0 ; PASSWORD FOR MOVING INTO PRIV USER AREAS DS 41-($-PPASS) ; 40 CHARS MAX IN BUFFER + 1 for ending NULL ; ; CURRENT USER/DISK INDICATOR ; CINDIC: DB '$' ; USUAL VALUE (FOR PATH EXPRESSIONS) ; ; DMA ADDRESS FOR DISK TRANSFERS ; DMADR: DW 80H ; TBUFF AREA ; ; NAMED DIRECTORY INFORMATION ; NDRADR: DW 00000H ; ADDRESS OF MEMORY-RESIDENT NAMED DIRECTORY NDNAMES: DB 64 ; MAX NUMBER OF DIRECTORY NAMES DNFILE: DB 'NAMES ' ; NAME OF DISK NAME FILE DB 'DIR' ; TYPE OF DISK NAME FILE ; ; REQUIREMENTS FLAGS ; EPREQD: DB 0FFH ; EXTERNAL PATH? MCREQD: DB 0FFH ; MULTIPLE COMMAND LINE? MXREQD: DB 0FFH ; MAX USER/DISK? UDREQD: DB 0FFH ; ALLOW USER/DISK CHANGE? PUREQD: DB 0FFH ; PRIVILEGED USER? CDREQD: DB 0FFH ; CURRENT INDIC AND DMA? NDREQD: DB 0FFH ; NAMED DIRECTORIES? Z2CLASS: DB 0 ; CLASS 0 DB 'ZCPR2' DS 10 ; RESERVED ; ; END OF SINSFORM -- STANDARD DEFAULT PARAMETER DATA ; ;****************************************************************** ; ; ; Start of Program ; START: LXI H,0 ; GET STACK PTR DAD SP SHLD STACK ; SAVE IT LXI SP,STACK ; SET SP CALL PUTUD ; SAVE CURRENT USER/DISK AWAY MVI A,0FFH ; SET DEFAULT USER STA USER CALL ZGPINS ; INIT BUFFERS 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,'RENAME Command --' DB CR,LF,' RENAME dir:afn1=afn2,dir:afn3,dir:afn4=afn5,... o...' DB CR,LF,LF,'d is disk, u is user, and o is one or more option ' DB 'letters.' DB CR,LF,'If one or more options are specified, the o MUST be ' DB 'preceded by a space.' DB CR,LF,'Nothing is required, and wild cards (?,*) are ' DB CR,LF,'permitted. o is optional, and valid options are -' 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,'dir: is a named directory or the form du:.' DB CR,LF,'Named Directories are ',0 LDA NDREQD ; NAMES REQUIRED? ORA A ; 0=NO JNZ HELP1 CALL PRINT DB 'NOT ',0 HELP1: CALL PRINT DB 'Permitted in this Version of RENAME' DB CR,LF,'If u is omitted, current user is assumed, as with d.' DB CR,LF,LF,'Special forms are:' DB CR,LF,' RENAME dir: C <-- Rename all files in named dir' DB CR,LF,' RENAME du: C <-- Rename all files in disk d, user u' DB CR,LF,' RENAME u: C <-- Rename all files in user u on ' DB 'current disk' DB CR,LF,' RENAME d: C <-- Rename all files on disk d in ' DB 'current user' DB CR,LF,'Note that Control Mode was used above since a RENAME ' DB 'of a file to itself' DB CR,LF,'can be done, but is totally unnecessary. Hence, ' DB 'Control Mode allows a new name.' DB 0 ; RETURN TO OS RETURN: LHLD STACK ; GET OLD STACK SPHL ; SET IT RET ; USER CHANGE NOT ALLOWED ERROR UNOK: CALL PRINT DB CR,LF,'User Number Change Not Allowed -- Aborting',0 JMP RETURN ; DISK CHANGE NOT ALLOWED ERROR DNOK: CALL PRINT DB CR,LF,'Disk Change Not Allowed -- Aborting',0 JMP RETURN ; PLACE ZERO AT END OF BUFFER ECONT: LXI H,BUFF ; PT TO BUFFER MOV A,M ; GET COUNT INX H ; PT TO FIRST CHAR ADD L ; PT TO END OF BUFFER MOV L,A MOV A,H ACI 0 MOV H,A MVI M,0 ; COPY BUFFER INTO TEMP BUFFER LXI H,BUFF ; PT TO BUFFER MOV B,M ; GET CHAR COUNT INX H ; PT TO FIRST CHAR INR B ; ADD ENDING 0 LXI D,CMDLNE ; PT TO CMDLNE BUFFER 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 LXI H,CMDLNE ; PT TO BUFFER ; SKIP TO FILE NAME STRING SBLANK: MOV A,M ; SKIP TO NON-BLANK CPI ' ' ; ? JNZ SBL1 INX H ; PT TO NEXT CHAR JMP SBLANK ; SKIP TO END OF FILE NAME STRING SBL1: MOV A,M ; SKIP TO OR EOL ORA A ; DONE? JZ OPT CPI ' ' ; 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: LXI H,CMDLNE-1 ; PT TO BEFORE FIRST BYTE DSPEC0: INX H ; PT TO BYTE MOV A,M ; GET BYTE ORA A ; DONE? JZ HELP CPI ' ' ; ? 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 LXI D,NTFCB ; PT TO FCB IN DE, PT TO FIRST CHAR OF FILE NAME IN HL PUSH H ; SAVE HL PTR CALL CODEND ; GET ADDRESS OF SCRATCH AREA MOV B,H ; ADDRESS IN BC MOV C,L POP H CALL ZFNAME ; EXTRACT FILE NAME INTO FCB, AND GET DISK AND USER JZ DERR ; ERROR HANDLER SHLD NEXTCH ; SAVE PTR TO DELIMITER WHICH ENDED SCAN MOV A,C ; GET NEW USER STA USER ; SAVE IT MOV A,B ; SAVE POSSIBLE DRIVE SPEC CPI 0FFH ; CURRENT DISK? JZ USPEC LDA MDISK ; GET MAX DISK NUMBER DCR B ; ADJUST TO WITHIN BOUNDS 0-15 CMP B ; WITHIN BOUNDS? MOV A,B ; GET DISK NUMBER IN A JNC DSPEC2 DERR: CALL PRINT DB CR,LF,'Invalid Drive or User Specification',0 JMP RETURN ; LOG IN SPECIFIED DISK DSPEC2: PUSH B ; SAVE BC MOV E,A ; DISK NUMBER IN E LDA DOK ; OK TO DO SO? ORA A ; 0=NO JZ DNOK ; NOT ALLOWED ABORT MVI C,14 ; LOG IN DISK CALL BDOS POP B ; GET BC ; CHECK FOR USER NUMBER USPEC: MOV A,C ; GET NEW USER NUMBER CPI 0FFH ; DEFAULT USER? JZ NAME2 CPI '?' ; ALL USERS NOT ALLOWED? JZ UERR LDA MUSER ; GET MAX USER NUMBER CMP C MOV A,C ; USER NUMBER IN A JNC ULOG UERR: CALL PRINT DB CR,LF,'Invalid User Number',0 JMP RETURN ULOG: MOV E,A ; USER NUMBER IN E LDA UOK ; ALLOWED? ORA A ; 0=NO JZ UNOK ; DISALLOWED AND ABORT MVI C,32 ; SELECT USER CALL BDOS ; FIRST NAME IS NOW EXTRACTED -- EXTRACT POSSIBLE SECOND NAME NAME2: LXI H,NTFCB ; PT TO FIRST NAME LXI D,OFCB ; PT TO FCB FOR 2ND 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 ; SAVE HL PTR CALL CODEND ; GET ADDRESS OF SCRATCH AREA MOV B,H ; ADDRESS IN BC MOV C,L POP H CALL ZFNAME ; EXTRACT FILE NAME INTO FCB, AND GET DISK AND USER JZ DERR ; ERROR HANDLER SHLD NEXTCH ; SAVE PTR TO DELIMITER WHICH ENDED SCAN MOV A,B ; DISK OR USER NOT ALLOWED HERE ANA C CPI 0FFH ; MUST BE BOTH 0FFH JZ RENAME CALL PRINT DB CR,LF,'Error -- 2nd Argument Contains Disk/User Spec',0 JMP RETURN ; LOAD DIRECTORY AND RENAME FILES RENAME: CALL CODEND ; PT TO END OF CODE CALL RETUD ; GET CURRENT USER LDA SYSTEM ; GET SYSTEM FLAG ORA C ; MASK IN SYSTEM FLAG TO USER LXI D,OFCB ; PT TO FCB CALL INITFCB ; INIT THE FCB CALL DIRF ; 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 LXI H,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/other=N)? ',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 (=No Change)? ',0 MVI A,0FFH ; CAPITALIZE CALL BBLINE ; INPUT LINE FROM USER ORA A ; CHECK FOR JUST JNZ RCTRL0 POP H ; GET PTR TO FILE JMP RENTEST ; PROCEED WITH NEXT ENTRY RCTRL0: LXI D,RENFCB ; PLACE INTO NEW NAME FCB CALL FNAME ; 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,' Error -- Wild Card (?,*) in Name -- Try Again',0 JMP RCTRL ; QUIT RENAME PROGRAM QUIT: CALL PRCOUNT ; PRINT COUNT OF FILES RENAMED CALL PRINT DB ' ++ QUIT -- Returning to CP/M ++',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/=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 LXI D,OFCB ; COPY OLD NAME 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 CALL PRINT DB CR,LF,'++ ',0 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 (0=NO, 80H=YES) USER: DS 1 ; NEW USER, OR 0FFH IF NO CHANGE 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 40 ; FCB FOR OLD FILE NAME AND OLD FILE TEMPLATE NTFCB: DS 40 ; FCB FOR NEW FILE TEMPLATE CMDLNE: DS 256 ; ALLOW MAX SIZE OF COMMAND LINE DS 100 ; STACK AREA STACK: DS 2 ; OLD STACK PTR END