home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / ZCPR2 / RENAME.MAC < prev    next >
Text File  |  2000-06-30  |  18KB  |  802 lines

  1. ;  PROGRAM:  RENAME
  2. ;  VERSION:  2.0
  3. ;  DATE:  16 JAN 83
  4. ;  AUTHOR:  RICHARD CONN
  5. ;  PREVIOUS VERSIONS:  1.4 (6 JAN 83), 1.3 (7 DEC 82), 1.2 (10 NOV 82)
  6. ;  PREVIOUS VERSION:  RENAME.ASM Version 1.1 (26 OCT 81)
  7. VERS    equ    20
  8.  
  9. ;
  10. ;    This program is Copyright (c) 1982, 1983 by Richard Conn
  11. ;    All Rights Reserved
  12. ;
  13. ;    ZCPR2 and its utilities, including this one, are released
  14. ; to the public domain.  Anyone who wishes to USE them may do so with
  15. ; no strings attached.  The author assumes no responsibility or
  16. ; liability for the use of ZCPR2 and its utilities.
  17. ;
  18. ;    The author, Richard Conn, has sole rights to this program.
  19. ; ZCPR2 and its utilities may not be sold without the express,
  20. ; written permission of the author.
  21. ;
  22.  
  23.  
  24. ;
  25. ;  RENAME Command --
  26. ;    RENAME is used to change the name of one or more files.  Unlike
  27. ; the ZCPR2-resident REN function, RENAME permits ambiguous file names
  28. ; and supports an Inspect mode that allows the user to confirm each
  29. ; rename before it is done.  Additionally, there is a Control Mode which
  30. ; allows the user to manually specify the name for each file as it is
  31. ; presented to him.
  32. ;
  33. ;    The RENAME command may be of the following forms:
  34. ;        RENAME dir:afn1=afn2,dir:afn3=afn4,... o
  35. ;        RENAME dir:afn,dir:afn1=afn2,... o
  36. ;    The first form shows elements of the form
  37. ;            dir:afn1=afn2
  38. ; while the second form shows elements of the form
  39. ;            dir:afn
  40. ; which is the same as
  41. ;            dir:afn=afn
  42. ; and only makes sense if Control Mode is used.
  43. ;
  44. ;    The option characters (o) are none or more of the following:
  45. ;        C -- Control Mode; manually specify each new name
  46. ;        I -- Inspect and approve each rename
  47. ;        S -- Include SYStem files
  48. ;
  49. ;    Examples:
  50. ;        RENAME *.MAC=*.ASM    <-- Rename all ASM files to MAC
  51. ;        RENAME *.MAC C        <-- Rename all MAC files to names
  52. ;                        input by the user
  53. ;        RENAME *.OBJ=*.COM SI    <-- Rename all COM files to OBJ
  54. ;                        and include SYStem files
  55. ;                        and Inspect and approve each
  56. ;                        change
  57. ;
  58.  
  59. FALSE    EQU    0
  60. TRUE    EQU    NOT FALSE
  61.  
  62. ESIZE    EQU    16    ; SIZE OF DIR ENTRY (FROM SYSLIB DIRF ROUTINE)
  63.  
  64.     EXT    DIRF    ; DIRECTORY PROCESSOR
  65.  
  66.     EXT    ZGPINS    ; INIT BUFFERS
  67.     EXT    ZFNAME    ; FILE NAME PROCESSOR
  68.     EXT    ZINIEXT    ; EXTERNAL PATH INIT
  69.     EXT    FNAME    ; FILE NAME PROCESSOR WITHOUT NAMED DIRS
  70.  
  71.     EXT    F$DELETE    ; DELETE FILE
  72.     EXT    F$RENAME    ; RENAME FILE
  73.     EXT    BBLINE    ; INPUT LINE EDITOR
  74.     EXT    INITFCB    ; INIT FCB
  75.     EXT    BDOS    ; BDOS ENTRY
  76.     EXT    RETUD    ; RETURN CURRENT USER/DISK
  77.     EXT    PUTUD    ; SAVE CURRENT USER/DISK
  78.     EXT    GETUD    ; RESTORE CURRENT USER/DISK
  79.     EXT    MOVEB    ; COPY ROUTINE
  80.     EXT    PHLDC    ; PRINT HL AS DECIMAL CHARS
  81.     EXT    PRINT    ; PRINT ROUTINE
  82.     EXT    COUT    ; CONSOLE OUTPUT ROUTINE
  83.     EXT    CIN    ; CONSOLE INPUT ROUTINE
  84.     EXT    CAPS    ; CAPITALIZE ROUTINE
  85.     EXT    CRLF    ; NEW LINE ROUTINE
  86.     EXT    FILLB    ; FILL ROUTINE
  87.     EXT    CODEND    ; CODE END COMPUTATION ROUTINE
  88.  
  89. ;
  90. ;  CP/M EQUATES
  91. ;
  92. CPM    EQU    0    ; WARM BOOT
  93. FCB    EQU    5CH    ; FCB
  94. BUFF    EQU    80H    ; INPUT LINE BUFFER
  95. CR    EQU    13    ; <CR>
  96. LF    EQU    10    ; <LF>
  97.  
  98. ;
  99. ;  Branch to Start of Program
  100. ;
  101.     JMP    START
  102.  
  103. ;
  104. ;******************************************************************
  105. ;
  106. ;  SINSFORM -- ZCPR2 Utility Standard General Purpose Initialization Format
  107. ;
  108. ;    This data block precisely defines the data format for
  109. ; initial features of a ZCPR2 system which are required for proper
  110. ; initialization of the ZCPR2-Specific Routines in SYSLIB.
  111. ;
  112.  
  113. ;
  114. ;  EXTERNAL PATH DATA
  115. ;
  116. EPAVAIL:
  117.     DB    0FFH    ; IS EXTERNAL PATH AVAILABLE? (0=NO, 0FFH=YES)
  118. EPADR:
  119.     DW    40H    ; ADDRESS OF EXTERNAL PATH IF AVAILABLE
  120.  
  121. ;
  122. ;  INTERNAL PATH DATA
  123. ;
  124. INTPATH:
  125.     DB    0,0    ; DISK, USER FOR FIRST PATH ELEMENT
  126.             ; DISK = 1 FOR A, '$' FOR CURRENT
  127.             ; USER = NUMBER, '$' FOR CURRENT
  128.     DB    0,0
  129.     DB    0,0
  130.     DB    0,0
  131.     DB    0,0
  132.     DB    0,0
  133.     DB    0,0
  134.     DB    0,0    ; DISK, USER FOR 8TH PATH ELEMENT
  135.     DB    0    ; END OF PATH
  136.  
  137. ;
  138. ;  MULTIPLE COMMAND LINE BUFFER DATA
  139. ;
  140. MCAVAIL:
  141.     DB    0FFH    ; IS MULTIPLE COMMAND LINE BUFFER AVAILABLE?
  142. MCADR:
  143.     DW    0FF00H    ; ADDRESS OF MULTIPLE COMMAND LINE BUFFER IF AVAILABLE
  144.  
  145. ;
  146. ;  DISK/USER LIMITS
  147. ;
  148. MDISK:
  149.     DB    4    ; MAXIMUM NUMBER OF DISKS
  150. MUSER:
  151.     DB    31    ; MAXIMUM USER NUMBER
  152.  
  153. ;
  154. ;  FLAGS TO PERMIT LOG IN FOR DIFFERENT USER AREA OR DISK
  155. ;
  156. DOK:
  157.     DB    0FFH    ; ALLOW DISK CHANGE? (0=NO, 0FFH=YES)
  158. UOK:
  159.     DB    0FFH    ; ALLOW USER CHANGE? (0=NO, 0FFH=YES)
  160.  
  161. ;
  162. ;  PRIVILEGED USER DATA
  163. ;
  164. PUSER:
  165.     DB    10    ; BEGINNING OF PRIVILEGED USER AREAS
  166. PPASS:
  167.     DB    'chdir',0    ; PASSWORD FOR MOVING INTO PRIV USER AREAS
  168.     DS    41-($-PPASS)    ; 40 CHARS MAX IN BUFFER + 1 for ending NULL
  169.  
  170. ;
  171. ;  CURRENT USER/DISK INDICATOR
  172. ;
  173. CINDIC:
  174.     DB    '$'    ; USUAL VALUE (FOR PATH EXPRESSIONS)
  175.  
  176. ;
  177. ;  DMA ADDRESS FOR DISK TRANSFERS
  178. ;
  179. DMADR:
  180.     DW    80H    ; TBUFF AREA
  181.  
  182. ;
  183. ;  NAMED DIRECTORY INFORMATION
  184. ;
  185. NDRADR:
  186.     DW    00000H    ; ADDRESS OF MEMORY-RESIDENT NAMED DIRECTORY
  187. NDNAMES:
  188.     DB    64    ; MAX NUMBER OF DIRECTORY NAMES
  189. DNFILE:
  190.     DB    'NAMES   '    ; NAME OF DISK NAME FILE
  191.     DB    'DIR'        ; TYPE OF DISK NAME FILE
  192.  
  193. ;
  194. ;  REQUIREMENTS FLAGS
  195. ;
  196. EPREQD:
  197.     DB    0FFH    ; EXTERNAL PATH?
  198. MCREQD:
  199.     DB    0FFH    ; MULTIPLE COMMAND LINE?
  200. MXREQD:
  201.     DB    0FFH    ; MAX USER/DISK?
  202. UDREQD:
  203.     DB    0FFH    ; ALLOW USER/DISK CHANGE?
  204. PUREQD:
  205.     DB    0FFH    ; PRIVILEGED USER?
  206. CDREQD:
  207.     DB    0FFH    ; CURRENT INDIC AND DMA?
  208. NDREQD:
  209.     DB    0FFH    ; NAMED DIRECTORIES?
  210. Z2CLASS:
  211.     DB    0    ; CLASS 0
  212.     DB    'ZCPR2'
  213.     DS    10    ; RESERVED
  214.  
  215. ;
  216. ;  END OF SINSFORM -- STANDARD DEFAULT PARAMETER DATA
  217. ;
  218. ;******************************************************************
  219. ;
  220.  
  221. ;
  222. ;  Start of Program
  223. ;
  224. START:
  225.     LXI    H,0    ; GET STACK PTR
  226.     DAD    SP
  227.     SHLD    STACK    ; SAVE IT
  228.     LXI    SP,STACK    ; SET SP
  229.     CALL    PUTUD    ; SAVE CURRENT USER/DISK AWAY
  230.     MVI    A,0FFH    ; SET DEFAULT USER
  231.     STA    USER
  232.  
  233.     CALL    ZGPINS    ; INIT BUFFERS
  234.     CALL    PRINT
  235.     DB    'RENAME  Version '
  236.     DB    VERS/10+'0','.',(VERS MOD 10)+'0',0
  237.     LDA    FCB+1    ; GET FIRST CHAR OF FILE NAME
  238.     CPI    ' '    ; NO FILE SPEC?
  239.     JZ    HELP
  240.     CPI    '/'    ; OPTION CAUGHT?
  241.     JNZ    ECONT
  242.  
  243. ;  PRINT HELP INFORMATION
  244. HELP:
  245.     CALL    PRINT
  246.     DB    CR,LF,'RENAME Command --'
  247.     DB    CR,LF,'    RENAME dir:afn1=afn2,dir:afn3,dir:afn4=afn5,... o...'
  248.     DB    CR,LF,LF,'d is disk, u is user, and o is one or more option '
  249.     DB    'letters.'
  250.     DB    CR,LF,'If one or more options are specified, the o MUST be '
  251.     DB    'preceded by a space.'
  252.     DB    CR,LF,'Nothing is required, and wild cards (?,*) are '
  253.     DB    CR,LF,'permitted.  o is optional, and valid options are -'
  254.     DB    CR,LF,'    C -- Control Mode (Allow user to manually name each '
  255.     DB    'file)'
  256.     DB    CR,LF,'    I -- Inspect Mode (Give user approval option)'
  257.     DB    CR,LF,'    S -- Include SYS files'
  258.     DB    CR,LF,'dir: is a named directory or the form du:.'
  259.     DB    CR,LF,'Named Directories are ',0
  260.     LDA    NDREQD    ; NAMES REQUIRED?
  261.     ORA    A    ; 0=NO
  262.     JNZ    HELP1
  263.     CALL    PRINT
  264.     DB    'NOT ',0
  265. HELP1:
  266.     CALL    PRINT
  267.     DB    'Permitted in this Version of RENAME'
  268.     DB    CR,LF,'If u is omitted, current user is assumed, as with d.'
  269.     DB    CR,LF,LF,'Special forms are:'
  270.     DB    CR,LF,'    RENAME dir: C    <-- Rename all files in named dir'
  271.     DB    CR,LF,'    RENAME du: C    <-- Rename all files in disk d, user u'
  272.     DB    CR,LF,'    RENAME u: C    <-- Rename all files in user u on '
  273.     DB    'current disk'
  274.     DB    CR,LF,'    RENAME d: C    <-- Rename all files on disk d in '
  275.     DB    'current user'
  276.     DB    CR,LF,'Note that Control Mode was used above since a RENAME '
  277.     DB    'of a file to itself'
  278.     DB    CR,LF,'can be done, but is totally unnecessary.  Hence, '
  279.     DB    'Control Mode allows a new name.'
  280.     DB    0
  281.  
  282. ;  RETURN TO OS
  283. RETURN:
  284.     LHLD    STACK    ; GET OLD STACK
  285.     SPHL        ; SET IT
  286.     RET
  287.  
  288. ;  USER CHANGE NOT ALLOWED ERROR
  289. UNOK:
  290.     CALL    PRINT
  291.     DB    CR,LF,'User Number Change Not Allowed -- Aborting',0
  292.     JMP    RETURN
  293.  
  294. ;  DISK CHANGE NOT ALLOWED ERROR
  295. DNOK:
  296.     CALL    PRINT
  297.     DB    CR,LF,'Disk Change Not Allowed -- Aborting',0
  298.     JMP    RETURN
  299.  
  300. ;  PLACE ZERO AT END OF BUFFER
  301. ECONT:
  302.     LXI    H,BUFF    ; PT TO BUFFER
  303.     MOV    A,M    ; GET COUNT
  304.     INX    H    ; PT TO FIRST CHAR
  305.     ADD    L    ; PT TO END OF BUFFER
  306.     MOV    L,A
  307.     MOV    A,H
  308.     ACI    0
  309.     MOV    H,A
  310.     MVI    M,0
  311.  
  312. ;  COPY BUFFER INTO TEMP BUFFER
  313.     LXI    H,BUFF    ; PT TO BUFFER
  314.     MOV    B,M    ; GET CHAR COUNT
  315.     INX    H    ; PT TO FIRST CHAR
  316.     INR    B    ; ADD ENDING 0
  317.     LXI    D,CMDLNE    ; PT TO CMDLNE BUFFER
  318.     CALL    MOVEB    ; COPY INTO COMMAND LINE BUFFER
  319.  
  320. ;  EXTRACT FLAGS IF PRESENT
  321.     XRA    A    ; SET NO INSPECT, NO R/O, AND NO SYSTEM FILES
  322.     STA    INSPECT
  323.     STA    CONTROL    ; SET NO CONTROL MODE
  324.     MVI    A,80H    ; SELECT NON-SYS FILES ONLY
  325.     STA    SYSTEM
  326.     LXI    H,0    ; SET FILE COUNT
  327.     SHLD    FILECNT
  328.     LXI    H,CMDLNE    ; PT TO BUFFER
  329. ;  SKIP TO FILE NAME STRING
  330. SBLANK:
  331.     MOV    A,M    ; SKIP TO NON-BLANK
  332.     CPI    ' '    ; <SP>?
  333.     JNZ    SBL1
  334.     INX    H    ; PT TO NEXT CHAR
  335.     JMP    SBLANK
  336. ;  SKIP TO END OF FILE NAME STRING
  337. SBL1:
  338.     MOV    A,M    ; SKIP TO <SP> OR EOL
  339.     ORA    A    ; DONE?
  340.     JZ    OPT
  341.     CPI    ' '    ; <SP>
  342.     JZ    OPT
  343.     INX    H    ; PT TO NEXT
  344.     JMP    SBL1
  345. ;  CHECK FOR LEADING SLASH ON OPTION AND SKIP IT IF SO
  346. OPT:
  347.     CPI    '/'    ; OPTION CHAR?
  348.     JNZ    OPTION
  349.     INX    H    ; SKIP SLASH
  350. ;  PROCESS LIST OF OPTIONS
  351. OPTION:
  352.     MOV    A,M    ; GET BYTE
  353.     ORA    A    ; DONE?
  354.     JZ    DSPEC
  355.     INX    H    ; PT TO NEXT CHAR
  356.     CPI    ' '    ; SKIP OVER SPACES
  357.     JZ    OPTION
  358.     CPI    '/'    ; IF OPTION LETTER, OBVIOUS ERROR, SO HELP
  359.     JZ    HELP
  360.     CPI    'C'    ; CONTROL?
  361.     JZ    OPTCTRL
  362.     CPI    'I'    ; INSPECT?
  363.     JZ    OPTINS
  364.     CPI    'S'    ; SYSTEM FILES?
  365.     JNZ    HELP
  366.     MVI    A,0C0H    ; SET FOR SYS FILES
  367.     STA    SYSTEM
  368.     JMP    OPTION
  369. OPTCTRL:
  370.     MVI    A,0FFH    ; CONTROL MODE
  371.     STA    CONTROL
  372.     JMP    OPTION
  373. OPTINS:
  374.     MVI    A,0FFH    ; INSPECT
  375.     STA    INSPECT
  376.     JMP    OPTION
  377.  
  378. ;  EXTRACT DISK, USER, AND FILE NAME INFORMATION
  379. DSPEC:
  380.     LXI    H,CMDLNE-1    ; PT TO BEFORE FIRST BYTE
  381. DSPEC0:
  382.     INX    H    ; PT TO BYTE
  383.     MOV    A,M    ; GET BYTE
  384.     ORA    A    ; DONE?
  385.     JZ    HELP
  386.     CPI    ' '    ; <SP>?
  387.     JZ    DSPEC0
  388. ;
  389. ;  MAJOR REENTRY POINT WHEN FILE SPECS ARE SEPARATED BY COMMAS
  390. ;    HL PTS TO FIRST BYTE OF NEXT FILE SPEC
  391. ;
  392. DSPEC1:
  393.     CALL    GETUD    ; RESET USER IF NECESSARY
  394.     LXI    D,NTFCB    ; PT TO FCB IN DE, PT TO FIRST CHAR OF FILE NAME IN HL
  395.  
  396.     PUSH    H    ; SAVE HL PTR
  397.     CALL    CODEND    ; GET ADDRESS OF SCRATCH AREA
  398.     MOV    B,H    ; ADDRESS IN BC
  399.     MOV    C,L
  400.     POP    H
  401.  
  402.     CALL    ZFNAME    ; EXTRACT FILE NAME INTO FCB, AND GET DISK AND USER
  403.     JZ    DERR    ; ERROR HANDLER
  404.  
  405.     SHLD    NEXTCH    ; SAVE PTR TO DELIMITER WHICH ENDED SCAN
  406.     MOV    A,C    ; GET NEW USER
  407.     STA    USER    ; SAVE IT
  408.     MOV    A,B    ; SAVE POSSIBLE DRIVE SPEC
  409.     CPI    0FFH    ; CURRENT DISK?
  410.     JZ    USPEC
  411.     LDA    MDISK    ; GET MAX DISK NUMBER
  412.     DCR    B    ; ADJUST TO WITHIN BOUNDS 0-15
  413.     CMP    B    ; WITHIN BOUNDS?
  414.     MOV    A,B    ; GET DISK NUMBER IN A
  415.     JNC    DSPEC2
  416. DERR:
  417.     CALL    PRINT
  418.     DB    CR,LF,'Invalid Drive or User Specification',0
  419.     JMP    RETURN
  420.  
  421. ;  LOG IN SPECIFIED DISK
  422. DSPEC2:
  423.     PUSH    B    ; SAVE BC
  424.     MOV    E,A    ; DISK NUMBER IN E
  425.     LDA    DOK    ; OK TO DO SO?
  426.     ORA    A    ; 0=NO
  427.     JZ    DNOK    ; NOT ALLOWED ABORT
  428.     MVI    C,14    ; LOG IN DISK
  429.     CALL    BDOS
  430.     POP    B    ; GET BC
  431.  
  432. ;  CHECK FOR USER NUMBER
  433. USPEC:
  434.     MOV    A,C    ; GET NEW USER NUMBER
  435.     CPI    0FFH    ; DEFAULT USER?
  436.     JZ    NAME2
  437.     CPI    '?'    ; ALL USERS NOT ALLOWED?
  438.     JZ    UERR
  439.     LDA    MUSER    ; GET MAX USER NUMBER
  440.     CMP    C
  441.     MOV    A,C    ; USER NUMBER IN A
  442.     JNC    ULOG
  443. UERR:
  444.     CALL    PRINT
  445.     DB    CR,LF,'Invalid User Number',0
  446.     JMP    RETURN
  447. ULOG:
  448.     MOV    E,A    ; USER NUMBER IN E
  449.     LDA    UOK    ; ALLOWED?
  450.     ORA    A    ; 0=NO
  451.     JZ    UNOK    ; DISALLOWED AND ABORT
  452.     MVI    C,32    ; SELECT USER
  453.     CALL    BDOS
  454.  
  455. ;  FIRST NAME IS NOW EXTRACTED -- EXTRACT POSSIBLE SECOND NAME
  456. NAME2:
  457.     LXI    H,NTFCB    ; PT TO FIRST NAME
  458.     LXI    D,OFCB    ; PT TO FCB FOR 2ND NAME
  459.     MVI    B,16    ; COPY 16 BYTES
  460.     CALL    MOVEB
  461.     LHLD    NEXTCH    ; PT TO CHAR WHICH ENDED PARSE
  462.     MOV    A,M    ; GET IT
  463.     CPI    '='    ; ASSIGNMENT?
  464.     JNZ    RENAME    ; GO AHEAD IF NOT
  465.     INX    H    ; PT TO CHAR AFTER '='
  466.  
  467.     PUSH    H    ; SAVE HL PTR
  468.     CALL    CODEND    ; GET ADDRESS OF SCRATCH AREA
  469.     MOV    B,H    ; ADDRESS IN BC
  470.     MOV    C,L
  471.     POP    H
  472.  
  473.     CALL    ZFNAME    ; EXTRACT FILE NAME INTO FCB, AND GET DISK AND USER
  474.     JZ    DERR    ; ERROR HANDLER
  475.  
  476.     SHLD    NEXTCH    ; SAVE PTR TO DELIMITER WHICH ENDED SCAN
  477.     MOV    A,B    ; DISK OR USER NOT ALLOWED HERE
  478.     ANA    C
  479.     CPI    0FFH    ; MUST BE BOTH 0FFH
  480.     JZ    RENAME
  481.     CALL    PRINT
  482.     DB    CR,LF,'Error -- 2nd Argument Contains Disk/User Spec',0
  483.     JMP    RETURN
  484.  
  485. ;  LOAD DIRECTORY AND RENAME FILES
  486. RENAME:
  487.     CALL    CODEND    ; PT TO END OF CODE
  488.     CALL    RETUD    ; GET CURRENT USER
  489.     LDA    SYSTEM    ; GET SYSTEM FLAG
  490.     ORA    C    ; MASK IN SYSTEM FLAG TO USER
  491.     LXI    D,OFCB    ; PT TO FCB
  492.     CALL    INITFCB    ; INIT THE FCB
  493.     CALL    DIRF    ; LOAD DIR, SELECT FILES, PACK, AND ALPHABETIZE
  494.  
  495. ;  REN DIR FILES; HL PTS TO FIRST FILE, BC=FILE COUNT
  496.     CALL    RENFILES
  497.  
  498. ;  CHECK FOR NEXT FILE SPEC
  499.     LHLD    NEXTCH    ; GET PTR
  500.     MOV    A,M    ; GET DELIM
  501.     CPI    ','    ; ANOTHER FILE?
  502.     JNZ    RENDONE
  503.     INX    H    ; PT TO CHAR AFTER COMMA
  504.     JMP    DSPEC1    ; CONTINUE PROCESSING
  505.  
  506. ;  RENAME COMPLETE -- PRINT COUNT AND EXIT
  507. RENDONE:
  508.     CALL    PRCOUNT    ; PRINT FILE COUNT
  509.     JMP    RETURN
  510.  
  511. ;  RENAME SELECTED FILES
  512. RENFILES:
  513.     MOV    A,B    ; CHECK FOR ANY FILES LOADED
  514.     ORA    C
  515.     RZ
  516.  
  517. ;  PRINT FILE NAME
  518. RENLP:
  519.     PUSH    B    ; SAVE ENTRY COUNT
  520.     CALL    PRINT
  521.     DB    CR,LF,'Rename ',0
  522.     PUSH    H    ; SAVE PTR TO FCB
  523.     LXI    H,NTFCB    ; COPY NEW TEMPLATE INTO RENFCB
  524.     LXI    D,RENFCB
  525.     MVI    B,16
  526.     CALL    MOVEB
  527.     POP    H    ; GET PTR
  528.     PUSH    H    ; SAVE PTR
  529.     INX    H    ; PT TO FN OF OLD NAME
  530.     INX    D    ; PT TO FN OF RENFCB
  531.     MVI    B,11    ; 11 BYTES TO FN AND FT
  532. RENLP1:
  533.     LDAX    D    ; GET CHAR OF NEW
  534.     CPI    '?'    ; CHANGE '?' TO OLD CHAR
  535.     JNZ    RENLP2
  536.     MOV    A,M    ; GET OLD CHAR
  537.     ANI    7FH    ; MASK OLD CHAR
  538.     STAX    D    ; STORE IT AWAY AS NEW
  539. RENLP2:
  540.     INX    H    ; PT TO NEXT CHAR
  541.     INX    D
  542.     DCR    B    ; COUNT DOWN
  543.     JNZ    RENLP1
  544.     LXI    H,RENFCB    ; PT TO NEW NAME
  545.     CALL    PRFN    ; PRINT FILE NAME
  546.     CALL    PRINT
  547.     DB    ' from ',0
  548.     POP    H    ; GET PTR TO OLD FILE NAME
  549.     PUSH    H    ; SAVE IT AGAIN
  550.     CALL    PRFN    ; PRINT FILE NAME
  551.     POP    H    ; GET PTR
  552.  
  553. ;  CHECK FOR CONTROL MODE AND PERFORM CONTROL FUNCTION IF SET
  554.     LDA    CONTROL    ; GET FLAG
  555.     ORA    A    ; NZ=YES
  556.     JNZ    RENCTRL
  557.  
  558. ;  CHECK FOR INSPECTION AND INSPECT IF SET
  559.     LDA    INSPECT    ; GET FLAG
  560.     ORA    A    ; 0=NO
  561.     JZ    DOIT
  562.  
  563. ;  PROMPT USER FOR RENAME
  564.     CALL    RENQ    ; REN QUESTION
  565.     CPI    'Q'    ; QUIT?
  566.     JZ    QUIT
  567.     CPI    'Y'    ; YES?
  568.     JZ    DOIT
  569.  
  570. ;  DON'T RENAME FILE
  571. NODO:
  572.     CALL    PRINT
  573.     DB    CR,LF,'    ++ NO Name Change ++',0
  574.     JMP    RENTEST
  575.  
  576. ;  PRINT FILE NAME PTED TO BY HL
  577. PRFN:
  578.     INX    H    ; PT TO FILE NAME
  579.     MVI    B,8    ; PRINT NAME
  580.     CALL    PRNT
  581.     MVI    A,'.'    ; DECIMAL
  582.     CALL    COUT
  583.     MVI    B,3    ; PRINT TYPE
  584.     CALL    PRNT
  585.     RET
  586.  
  587. ;  PROMPT USER FOR RENAME
  588. RENQ:
  589.     CALL    PRINT    ; PRINT PROMPT
  590.     DB    ' -- Rename (Y/N/Q=Quit/other=N)? ',0
  591.     CALL    CIN    ; GET RESPONSE
  592.     CALL    CAPS    ; CAPITALIZE
  593.     CALL    COUT    ; ECHO
  594.     RET
  595.  
  596. ;  CONTROL FUNCTION -- ALLOW USER TO RENAME AS HE DESIRES
  597. RENCTRL:
  598.     PUSH    H    ; SAVE PTR TO FILE
  599. RCTRL:
  600.     CALL    PRINT
  601.     DB    CR,LF,'    -- New Name (<CR>=No Change)? ',0
  602.     MVI    A,0FFH    ; CAPITALIZE
  603.     CALL    BBLINE    ; INPUT LINE FROM USER
  604.     ORA    A    ; CHECK FOR JUST <CR>
  605.     JNZ    RCTRL0
  606.     POP    H    ; GET PTR TO FILE
  607.     JMP    RENTEST    ; PROCEED WITH NEXT ENTRY
  608. RCTRL0:
  609.     LXI    D,RENFCB    ; PLACE INTO NEW NAME FCB
  610.     CALL    FNAME    ; JUST EXTRACT NAME
  611.     MVI    B,11    ; CHECK FOR ANY WILD CHARS
  612. RCTRL1:
  613.     INX    D    ; PT TO NEXT CHAR
  614.     LDAX    D    ; GET IT
  615.     CPI    '?'    ; CAN'T BE WILD
  616.     JZ    WERR
  617.     CPI    '*'    ; CAN'T BE WILD
  618.     JZ    WERR
  619.     DCR    B    ; COUNT DOWN
  620.     JNZ    RCTRL1
  621.     JMP    RDOIT    ; DONE -- PERFORM RENAME
  622. WERR:
  623.     CALL    PRINT
  624.     DB    CR,LF,'    Error -- Wild Card (?,*) in Name -- Try Again',0
  625.     JMP    RCTRL
  626.  
  627. ;  QUIT RENAME PROGRAM
  628. QUIT:
  629.     CALL    PRCOUNT    ; PRINT COUNT OF FILES RENAMED
  630.     CALL    PRINT
  631.     DB    '  ++ QUIT -- Returning to CP/M ++',0
  632.     JMP    RETURN
  633.  
  634. ;  REN FILE, BUT GET PTR FIRST
  635. RDOIT:
  636.     POP    H    ; GET PTR
  637.  
  638. ;  RENAME FILE; OLD NAME PTED TO BY HL, NEW NAME IN RENFCB
  639. DOIT:
  640.     PUSH    H
  641. ;  STEP 1 -- DETERMINE IF NEW NAME ALREADY EXISTS
  642.     LXI    D,RENFCB    ; PT TO NEW NAME
  643.     CALL    INITFCB
  644.     MVI    C,17    ; SEARCH FOR FIRST
  645.     CALL    BDOS
  646.     INR    A    ; NOT FOUND?
  647.     JZ    DOIT1
  648.     CALL    PRINT
  649.     DB    CR,LF,'        -- File Exists -- Delete It (Y/N/<CR>=N)? ',0
  650.     CALL    CIN    ; GET RESPONSE
  651.     CALL    CAPS
  652.     CALL    COUT
  653.     POP    H    ; PREP FOR ABORT
  654.     CPI    'Y'    ; YES -- CONTINUE?
  655.     JNZ    RENTEST    ; NOT YES, SO SKIP IT
  656. ;  DELETE OLD FILE, SO SET ATTRIBUTES AND DO IT
  657.     PUSH    H    ; SAVE PTR AGAIN
  658.     CALL    INITFCB    ; CLEAR FCB
  659.     MVI    C,30    ; SET FILE ATTRIBUTES TO R/W IF NOT ALREADY
  660.     CALL    BDOS
  661.     CALL    INITFCB
  662.     CALL    F$DELETE    ; DELETE FILE
  663. DOIT1:
  664.     POP    H    ; HL PTS TO OLD NAME
  665. ;  CLEAR THE OLD NAME'S ATTRIBUTES IN CASE IT WAS R/O
  666.     PUSH    H    ; SAVE PTR TO OLD NAME
  667.     LXI    D,OFCB    ; COPY OLD NAME
  668.     MVI    B,16
  669.     CALL    MOVEB
  670.     PUSH    D    ; CLEAR ATTRIBUTES
  671.     MVI    B,11    ; 11 BYTES
  672.     INX    D    ; PT TO FIRST
  673. DOIT2:
  674.     LDAX    D    ; GET CHAR
  675.     ANI    7FH    ; CLEAR ATT
  676.     STAX    D    ; PUT CHAR
  677.     INX    D    ; PT TO NEXT
  678.     DCR    B    ; COUNT DOWN
  679.     JNZ    DOIT2
  680.     POP    D    ; NOW SET ATTRIBUTES OF OLD NAME
  681.     CALL    INITFCB
  682.     MVI    C,30    ; SET ATTRIBUTES
  683.     CALL    BDOS
  684.     CALL    INITFCB
  685. ;  DO THE RENAME
  686.     LXI    H,RENFCB    ; PT TO NEW NAME
  687.     XCHG
  688.     CALL    INITFCB    ; INIT NEW FCB
  689.     XCHG        ; HL PTS TO NEW NAME, DE PTS TO OLD NAME
  690.     CALL    F$RENAME    ; RENAME THE FILE
  691. ;  RESTORE THE ORIGINAL ATTRIBUTE BITS
  692.     POP    H    ; GET PTR TO OLD NAME
  693.     LXI    D,RENFCB+1    ; PT TO NEW NAME
  694.     PUSH    H    ; SAVE PTR TO OLD NAME
  695.     INX    H    ; PT TO FN OF OLD NAME
  696.     XCHG        ; HL PTS TO NEW NAME, DE PTS TO OLD NAME
  697.     MVI    B,11    ; 11 BYTES
  698. DOIT3:
  699.     LDAX    D    ; GET ATTRIBUTE BIT OF OLD NAME
  700.     ANI    80H    ; LOOK ONLY AT ATTRIBUTE BIT
  701.     ORA    M    ; MASK IN NEW NAME BYTE
  702.     MOV    M,A    ; STORE IT AWAY
  703.     INX    H    ; PT TO NEXT
  704.     INX    D
  705.     DCR    B    ; COUNT DOWN
  706.     JNZ    DOIT3
  707. ;  SET THE ORIGINAL ATTRIBUTES INTO THE NEW FILE
  708.     LXI    D,RENFCB    ; PT TO FCB
  709.     CALL    INITFCB
  710.     MVI    C,30    ; SET ATTRIBUTES
  711.     CALL    BDOS
  712.     LHLD    FILECNT    ; INCREMENT FILE COUNT
  713.     INX    H
  714.     SHLD    FILECNT
  715.     POP    H    ; GET PTR TO DIRECTORY ENTRY
  716.  
  717. ;  PT TO NEXT ENTRY
  718. RENTEST:
  719.     LXI    D,ESIZE    ; PT TO NEXT ENTRY
  720.     DAD    D
  721.     POP    B    ; GET COUNT
  722.     DCX    B    ; COUNT DOWN
  723.     MOV    A,B    ; CHECK FOR ZERO
  724.     ORA    C
  725.     JNZ    RENLP
  726.  
  727. ;  RETURN TO CALLER
  728.     RET
  729.  
  730. ;
  731. ;  PRINT CHARS PTED TO BY HL FOR B BYTES
  732. ;
  733. PRNT:
  734.     MOV    A,M    ; GET CHAR
  735.     CALL    COUT
  736.     INX    H    ; PT TO NEXT
  737.     DCR    B    ; COUNT DOWN
  738.     JNZ    PRNT
  739.     RET
  740.  
  741. ;
  742. ;  PRINT COUNT OF NUMBER OF FILES RENAMED
  743. ;
  744. PRCOUNT:
  745.     CALL    CRLF    ; NEW LINE
  746.     CALL    PRINT
  747.     DB    CR,LF,'++ ',0
  748.     LHLD    FILECNT    ; GET COUNT
  749.     MOV    A,L    ; CHECK FOR NONE
  750.     ORA    H
  751.     JZ    PRNO
  752.     CALL    PHLDC    ; PRINT DECIMAL COUNT
  753.     JMP    PRMS
  754. PRNO:
  755.     CALL    PRINT
  756.     DB    'No ',0
  757. PRMS:
  758.     LHLD    FILECNT    ; 1 FILE PROTECTED?
  759.     MOV    A,H    ; HIGH ZERO?
  760.     ORA    A
  761.     JNZ    PRMULT
  762.     MOV    A,L    ; LOW ONE?
  763.     CPI    1
  764.     JZ    PRSING
  765. PRMULT:
  766.     CALL    PRINT
  767.     DB    ' Files Renamed ++',0
  768.     RET
  769. PRSING:
  770.     CALL    PRINT
  771.     DB    ' File  Renamed ++',0
  772.     RET
  773.  
  774. ;
  775. ;  BUFFERS
  776. ;
  777. INSPECT:
  778.     DS    1    ; INSPECT FLAG (0=NO, 0FFH=YES)
  779. CONTROL:
  780.     DS    1    ; CONTROL FLAG (0=NO, 0FFH=YES)
  781. SYSTEM:
  782.     DS    1    ; SYSTEM FLAG (0=NO, 80H=YES)
  783. USER:
  784.     DS    1    ; NEW USER, OR 0FFH IF NO CHANGE
  785. NEXTCH:
  786.     DS    2    ; PTR TO NEXT CHAR IN MULTIFILE COMMAND LINE
  787. FILECNT:
  788.     DS    2    ; COUNT OF NUMBER OF FILES RENAMED
  789. RENFCB:
  790.     DS    40    ; FCB FOR RENAME
  791. OFCB:
  792.     DS    40    ; FCB FOR OLD FILE NAME AND OLD FILE TEMPLATE
  793. NTFCB:
  794.     DS    40    ; FCB FOR NEW FILE TEMPLATE
  795. CMDLNE:
  796.     DS    256    ; ALLOW MAX SIZE OF COMMAND LINE
  797.     DS    100    ; STACK AREA
  798. STACK:
  799.     DS    2    ; OLD STACK PTR
  800.  
  801.     END
  802.