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 / ZSYS / ZNODE-12 / I / RENAME35.LBR / RENAME35.ZZ0 / RENAME35.Z80
Text File  |  1990-06-30  |  26KB  |  975 lines

  1. ; Program:    RENAME
  2. ; Version:    3.0
  3. ; Date:        18 May 84
  4. ; Author:    Richard Conn
  5. ; Previous Versions:    2.0 (16 Jan 83)
  6. ; Previous Versions:    1.4 (6 Jan 83), 1.3 (7 Dec 82), 1.2 (10 Nov 82)
  7. ; Previous Versions:    RENAME.ASM 1.1 (26 Oct 81)
  8. ;
  9. vers    equ    35
  10. subvers    equ    ' '
  11. ;
  12. ; Version 3.5 -- July 1, 1990 -- Gene Pizzetta
  13. ;    Changed filename display to "oldfile to newfile" instead of the
  14. ;    strange "newfile from oldfile".  Added configuration byte after
  15. ;    ASCII string 'SYSFILES>' to chose whether to include system files
  16. ;    by default (non-zero) or exclude them by default (0).  S option
  17. ;    now toggles the default meaning (it's current action is shown by
  18. ;    the usage screen.  Now filters high bit of filenames for terminals
  19. ;    that display special characters that way.  At the suggestion of
  20. ;    Howard Goldstein, RENAME no longer signs on with its load address
  21. ;    and version number; these are displayed only on the usage screen.
  22. ;    Restored Q (quit) as a valid response to an rename or erase query,
  23. ;    but ^C still works.  Display has been made even more compact than
  24. ;    last version.  Many of these changes are to make the RENAME
  25. ;    interface very similar to the RCP version.  Sets program error
  26. ;    flag to 10 if a matching filename is not found.  If an invalid
  27. ;    option is given, the program error flag is set to 19 and the
  28. ;    error handler is invoked.  ZEX input is suspended during execution
  29. ;    of RENAME.  The number of files renamed (up to 255) is placed in
  30. ;    ZCPR3 register 0.  Now obeys ZCPR3 quiet flag, except when in
  31. ;    inspect or control mode, or when a prompt is necessary.  Removed
  32. ;    Wheel byte protection for E and S options.
  33. ;
  34. ; Version 3.4 -- March 31, 1990 -- Gene Pizzetta
  35. ;    Modified for more compact display, usually a single line for each
  36. ;    file renamed.  ^C aborts at any prompt.
  37. ;
  38. ; Version 3.3A -- December 30, 1987 -- Bruce Morgen
  39. ;    Strip high bit from EFCB program name characters.  "E" and "S"
  40. ;    options require Wheel byte set; help message reflects this.
  41. ;
  42. ; Version 3.3 -- December 19, 1987 -- Bruce Morgen
  43. ;    Help message now reflects actual COM file name used, PPIP-style
  44. ;    dual syntax implemented (as requested by Ken Taschner).  This
  45. ;    required some rather tricky parsing to support the single-filespec
  46. ;    syntax "afn.typ [/]c", so while I was at it I made control mode
  47. ;    mandatory and automatic for single-filespec elements and eliminated
  48. ;    the C option letter altogether (as Rick says: "it only makes
  49. ;    sense"...).  In order support this single-filespec mode when such
  50. ;    an element is the last (or only) one in a RENAME command line, the
  51. ;    second file-spec in the last (or only) command is tested if the
  52. ;    MS-DOS syntax is detected.  If that second filespec starts with a
  53. ;    "/" or includes only valid option letters (and no more characters
  54. ;    than the number of valid option letters) it is assumed to be an
  55. ;    option specifier rather than a rename-to filespec.  Following
  56. ;    Howard Goldstein's (LX17 & 18) lead, filespec-to-FCB parsing calls
  57. ;    the Z33 CCP if it's available.  A Z80, HD64180, NSC800 or (someday?)
  58. ;    Z280 CPU now is required.
  59. ;
  60. ; Version 3.2 -- August 25, 1987 -- Jay Sage
  61. ;    Changed to allow a leading slash before an option to make program
  62. ;    consistent with a number of other Z programs (this was supposed to
  63. ;    happen, but there was a bug in the code).  Put data into a DSEG.
  64. ;    Made header indicate load address.
  65. ;
  66. ; Version 3.1 -- April 12, 1987 -- Jay Sage
  67. ;    Took idea of Rick Charnes and implemented it as an option so that
  68. ;    one does not have to have two versions of the program.  The option
  69. ;    is 'E'.  Also updated code to ZCPR33 type-3 environment to allow
  70. ;    linking RENAME for execution in high memory if desired.
  71. ;
  72. ; Version 3.0a -- April 9, 1987 -- Rick Charnes
  73. ;    I have modified this source code slightly so that if you try to
  74. ;    rename FILE1 to FILE2 and FILE2 already exists, the program will
  75. ;    NOT ask you if you are sure you want to delete FILE2.  It just
  76. ;    goes ahead and deletes the darn thing and renames FILE1.  I had
  77. ;    an application for it, studied and little and ... it works.  Be
  78. ;    careful, though.  This is a special use program, and NOT for
  79. ;    everyday use.  I found an alias in which I needed it.
  80. ;
  81. ; RENAME is used to change the name of one or more files.  It permits
  82. ; ambiguous filenames and supports an Inspect mode that allows the user
  83. ; to confirm each rename before it is done.  Additionally, there is a
  84. ; Control mode which allows the user to manually specify the name for
  85. ; each file as it is presented to him.
  86. ;
  87. ; SYNTAX:
  88. ;    RENAME dir:afn1=afn2,dir:afn3=afn4,... [/]o
  89. ;    RENAME dir:afn2 afn1,dir:afn4 afn3,... [/]o
  90. ;    RENAME dir:afn,dir:afn1=afn2,,dir:afn4 afn3... [/]o
  91. ;
  92. ; The first form shows elements of the CP/M style:
  93. ;        dir:newname=oldname
  94. ; The second form shows elements of the MS-DOS style:
  95. ;        dir:oldname newname
  96. ; The third form adds the single-filespec:
  97. ;        dir:oldname
  98. ; which automatically invokes Control mode allowing the user to rename
  99. ; files individually.
  100. ;
  101. ; OPTIONS (o) are none or more of the following:
  102. ;    I -- Inspect and approve each rename
  103. ;    S -- Include or exclude System files
  104. ;    E -- Erase existing file without prompt
  105. ;
  106. ; EXAMPLES:
  107. ;    RENAME *.MAC=*.ASM    <-- rename all ASM files to MAC
  108. ;    RENAME *.MAC          <-- rename all MAC files to names input by user
  109. ;    RENAME *.OBJ=*.COM SI <-- rename all COM files to OBJ, include system
  110. ;                      files, and Inspect and approve each change
  111. ;
  112.     ext    z33chk,z33fname,z3init,zfname,z3log,prtname
  113.     ext    puter2,inverror,getquiet,putreg,stopzex
  114.     ext    dirq,f$delete,f$rename,bbline,initfcb,bdos,moveb
  115.     ext    putud,getud,phlfdc,eprint,phl4hc,bout,cin,caps,crlf
  116.     ext    fillb,codend
  117. ;
  118.     public    cout        ; so SYSLIB will use ours
  119. ;
  120. ; Equates
  121. ;
  122. fcb    equ    5Ch        ; file control block
  123. buff    equ    80h        ; input line buffer
  124. esize    equ    16        ; size of dir entry (from SYSLIB DIRQ routine)
  125. z3env    defl    0FE00h        ; environment address
  126. ctrlc    equ    03h        ; ^C
  127. BEL    equ    07h        ; bell
  128. BS    equ    08h        ; backspace
  129. LF    equ    0Ah        ; linefeed
  130. CR    equ    0Dh        ; carriage return
  131. ;
  132. ; Type 3 header -- Code modified as suggested by Charles Irvine to function
  133. ; correctly with interrupts enabled.  Program will abort with an error message
  134. ; when not loaded to the correct address (attempt to run it under CP/M or Z30).
  135. ;
  136. entry:    jr    start0        ; must use relative jump
  137.     nop            ; filler
  138.     db    'Z3ENV',3    ; type-3 environment
  139. z3eadr:    dw    z3env        ; filled in by Z33
  140.     dw    entry        ; intended load address
  141. ;
  142. ; Configuration . . .
  143. ;
  144.     db    'SYSFILES>'    ; system files configuration byte
  145. sysflg:    db    0        ; 0 = exclude, non-zero = include
  146. ;
  147. start0:    ld    hl,0        ; point to warmboot entry
  148.     ld    a,(hl)        ; save the byte there
  149.     di            ; protect against interrupts
  150.     ld    (hl),0c9h    ; replace warmboot with a return opcode
  151.     rst    0        ; call address 0, pushing RETADDR
  152.                 ; ..onto stack
  153. retaddr:
  154.     ld    (hl),a        ; restore byte at 0
  155.     dec    sp        ; get stack pointer to point
  156.     dec    sp        ; to the value of RETADDR
  157.     pop    hl        ; get it into HL and restore stack
  158.     ei            ; we can allow interrupts again
  159.     ld    de,retaddr    ; this is where we should be
  160.     xor    a        ; clear carry flag
  161.     push    hl        ; save address again
  162.     sbc    hl,de        ; subtract -- we should have 0 now
  163.     pop    hl        ; restore value of RETADDR
  164.     jr    z,start        ; if addresses matched, begin real code
  165. ;
  166.     ld    de,notz33msg-retaddr    ; offset to message
  167.     add    hl,de
  168.     ex    de,hl        ; switch pointer to message into DE
  169.     ld    c,9
  170.     jp    0005h        ; return via BDOS print string function
  171. notz33msg:
  172.     db    'Not Z33+$'    ; abort message if not Z33-compatible
  173. ;
  174. ; Start of program . . .
  175. ;
  176. start:    ld    (stack),sp    ; save stack
  177.     call    codend
  178.     ld    (cmdlne),hl    ; setup command line buffer
  179.     ld    de,100h        ; buffer size
  180.     add    hl,de
  181.     ld    (ntfcb),hl    ; set temp FCB
  182.     add    hl,de
  183.     ld    (dirbuf),hl    ; pointer to dir buffer
  184.     ld    sp,hl        ; new stack pointer
  185.     ld    hl,(ntfcb)    ; set 2nd FCB
  186.     ld    de,40
  187.     add    hl,de
  188.     ld    (ofcb),hl
  189. ;
  190.     ld    hl,(z3eadr)    ; point to ZCPR3 environment
  191.     call    z3init        ; initialize environment
  192.     call    putud        ; save current user/disk away
  193.     call    stopzex        ; suspend ZEX input
  194. ;
  195.     ld    a,(fcb+1)    ; get first character of filename
  196.     cp    ' '        ; no file spec?
  197.     jr    z,usage
  198.     cp    '/'        ; option caught?
  199.     jp    nz,econt
  200. ;
  201. ; Print help information
  202. ;
  203. usage:    call    eprint
  204.     db    'RENAME  Version '
  205.     db    vers/10+'0','.',(vers mod 10)+'0',subvers,' (loaded at ',0
  206.     ld    hl,entry
  207.     call    phl4hc
  208.     call    eprint
  209.     db    'h)',CR,LF
  210.     db    'Usage:',CR,LF
  211.     db    ' Old style:  newname=oldname',CR,LF,'    ',0
  212.     call    prtname
  213.     call    eprint
  214.     db    ' {dir:}afn.aft=afn.aft{,{dir:}afn.aft=afn.aft{,...}} {{/}options}',CR,LF
  215.     db    ' New style:  oldname newname',CR,LF,'    ',0
  216.     call    prtname
  217.     call    eprint
  218.     db    ' {dir:}afn.aft afn.aft{,{dir:}afn.aft afn.aft{,...}} {{/}options}',CR,LF
  219.     db    ' Interactive control mode:  oldname',CR,LF,'    ',0
  220.     call    prtname
  221.     call    eprint
  222.     db    ' {dir:}afn.aft{,{dir:}afn.aft{,...}} {{/}options}',CR,LF
  223.     db    ' All three forms may be mixed within a command line.',CR,LF
  224.     db    'Options:',CR,LF
  225.     db    '   E   Erase existing files without prompting.',CR,LF
  226.     db    '   I   Inspect mode (get user approval).',CR,LF
  227.     db    '   S   ',0
  228.     ld    a,(sysflg)
  229.     or    a
  230.     jr    nz,usage2
  231.     call    eprint
  232.     db    'Include',0
  233.     jr    usage3
  234. usage2:    call    eprint
  235.     db    'Exclude',0
  236. usage3:    call    eprint
  237.     db    ' system files.',0
  238.     db    0
  239. ;
  240. ; Return to operating system
  241. ;
  242. exit:    ld    a,0        ; zero the error code
  243. erexit:    call    puter2        ; set program error flag
  244.     ld    b,a        ; get error code to B
  245.     cp    19        ; invalid option?
  246.     call    z,inverror    ; (yes, call error handler)
  247.     call    getud
  248.     ld    sp,(stack)    ; get old stack
  249.     ret
  250. ;
  251. ; Print count of files renamed
  252. ;
  253. prcount:
  254.     ld    hl,(filcnt)    ; get count
  255.     ld    b,0        ; setting ZCPR3 register 0
  256.     ld    a,l        ; check for none
  257.     call    putreg
  258.     call    getquiet    ; even in inspect and control modes
  259.     ret    nz
  260.     ld    a,(contrl)
  261.     or    a
  262.     call    z,crlf
  263.     or    a
  264.     ld    a,l
  265.     or    h
  266.     jr    z,prno
  267.     call    phlfdc        ; print decimal count
  268.     jr    prms
  269. ;
  270. prno:    call    eprint
  271.     db    'No Files Renamed',0
  272.     ret
  273. ;    
  274. prms:    ld    hl,(filcnt)    ; 1 file renamed?
  275.     ld    a,h        ; high zero?
  276.     or    a
  277.     jr    nz,prmult
  278.     ld    a,l        ; low one?
  279.     cp    1
  280.     jr    z,prsing
  281. ;
  282. prmult:    call    eprint
  283.     db    ' Files Renamed',0
  284.     ret
  285. ;
  286. prsing:    call    eprint
  287.     db    ' File Renamed',0
  288.     ret
  289. ;
  290. ; Copy buffer into temporary buffer
  291. ;
  292. econt:    ld    de,(cmdlne)    ; point to command line save buffer
  293.     ld    hl,buff+1    ; point to buffer
  294.     ld    b,80h        ; buffer size
  295.     call    moveb        ; copy into command line buffer
  296. ;
  297. ; Initialize option flags
  298. ;
  299.     xor    a
  300.     ld    (inspct),a    ; no inspect mode
  301.     ld    (eraflg),a    ; no erase without prompt
  302.     ld    (quiet),a
  303.     ld    a,(sysflg)    ; check system file configuration byte
  304.     or    a
  305.     jr    z,xsys
  306.     ld    a,0C0h        ; select all files
  307.     ld    (system),a
  308.     jr    xsys2
  309. xsys:    ld    a,80h        ; select non-system files only
  310.     ld    (system),a
  311. xsys2:    ld    hl,0        ; set file count
  312.     ld    (filcnt),hl
  313.     ld    hl,(cmdlne)    ; point to buffer
  314. ;
  315. ; Skip to filename string
  316. ;
  317. sblank:    ld    bc,127
  318.     xor    a
  319.     cpir
  320.     ld    c,33
  321.     ld    a,','
  322.     cpdr
  323.     jr    z,gcomma
  324. commaz:    ld    hl,(cmdlne)
  325.     jr    ncomma
  326. gcomma:    push    hl
  327.     ld    de,(cmdlne)
  328.     xor    a
  329.     sbc    hl,de
  330.     pop    hl
  331.     jp    z,usage
  332.     jr    c,commaz
  333.     inc    hl
  334.     inc    hl
  335. ncomma:    ld    de,argtbl
  336.     ld    a,3
  337.     ld    (de),a
  338.     xor    a
  339.     call    argv
  340.     jp    nz,usage
  341.     inc    de
  342.     ld    a,(de)
  343.     cp    3
  344.     jr    z,triarg
  345.     cp    2
  346.     jp    nz,chkqt
  347.     ld    hl,(argum2)
  348.     dec    hl
  349.     ld    a,(hl)
  350.     inc    hl
  351.     sub    '='
  352.     jp    z,chkqt
  353. calloq:    call    optq
  354.     jp    nz,chkqt
  355.     dec    hl
  356.     ld    (hl),a
  357.     inc    hl
  358.     jr    option
  359. triarg:    ld    hl,(argum3)
  360.     ld    a,(hl)
  361. ;
  362. ; Check for leading slash on option and skip it if so
  363. ;
  364. opt:    cp    '/'        ; option character?
  365.     jr    nz,option
  366.     inc    hl        ; skip slash
  367. ;
  368. ; Process list of options
  369. ;
  370. option:    ld    a,(hl)        ; get byte
  371.     or    a        ; done?
  372.     jp    z,chkqt
  373.     inc    hl        ; point to next character
  374.     cp    ' '        ; skip over spaces
  375.     jr    z,option
  376.     cp    '/'        ; obvious error, so display help
  377.     jp    z,usage
  378.     cp    'E'        ; erase old files?
  379.     jr    z,optera
  380.     cp    'I'        ; inspect?
  381.     jr    z,optins
  382.     cp    'S'        ; system files?
  383.     jp    nz,invopt
  384. ;
  385. ; Set system files selection
  386. ;
  387.     ld    a,(system)    ; check default
  388.     cp    80h
  389.     jr    z,setsys
  390.     ld    a,80h        ; non-system only
  391.     ld    (system),a
  392.     jr    option
  393. setsys:    ld    a,0C0h        ; set for system and non-system files
  394.     ld    (system),a
  395.     jr    option
  396. ;
  397. invopt:    call    eprint
  398.     db    '  Invalid option.',0
  399.     ld    a,19
  400.     jp    erexit
  401. ;
  402. optera:    ld    a,0FFh        ; auto erase mode
  403.     ld    (eraflg),a
  404.     jr    option
  405. ;
  406. optins:    ld    a,0FFh        ; inspect mode
  407.     ld    (inspct),a
  408.     jr    option
  409. ;
  410. ; Check quiet mode (not valid in inspect or control modes)
  411. ;
  412. chkqt:    ld    a,(inspct)
  413.     or    a
  414.     jr    nz,dspec
  415.     call    getquiet
  416.     jr    z,dspec
  417.     ld    (quiet),a
  418. ;
  419. ; Extract disk, user, and filename information
  420. ;
  421. dspec:    ld    hl,(cmdlne)    ; point to before first byte
  422.     dec    hl
  423. dspec0:    inc    hl        ; point to byte
  424.     ld    a,(hl)        ; get byte
  425.     or    a        ; done?
  426.     jp    z,usage
  427.     cp    ' '        ; space?
  428.     jr    z,dspec0
  429.     jr    dspec2
  430. ;
  431. ; Major re-entry point when file specs are separated by commas.
  432. ;   HL points to first byte of next file spec
  433. ;
  434. dspec1:    ld    a,(quiet)
  435.     or    a
  436.     jr    nz,dspec2
  437.     ld    a,(contrl)
  438.     or    a
  439.     call    z,crlf
  440. dspec2:    xor    a
  441.     ld    (contrl),a
  442.     call    getud        ; reset user if necessary
  443.     ld    de,(ntfcb)    ; point to FCB in DE
  444.     call    parsit        ; extract filename to FCB, get disk and user
  445.     ld    (nextch),hl    ; save pointer to delimiter which ended scan
  446.     call    z3log        ; log into DU
  447. ;
  448. ; First name is now extracted -- extract possible second name
  449. ;
  450. name2:    ld    de,(ofcb)    ; point to FCB for 2nd name
  451.     ld    hl,(ntfcb)    ; point to first name
  452.     ld    b,16        ; copy 16 bytes
  453.     call    moveb
  454.     ld    hl,(nextch)    ; point to character which ended parse
  455.     ld    a,(hl)        ; get it
  456.     cp    '='        ; assignment?
  457.     jr    z,gotequ
  458.     cp    ' '        ; reverse assignment?
  459.     jr    z,gotequ
  460.     ld    a,0FFh        ; set for control mode
  461.     ld    (contrl),a
  462.     xor    a        ; ..and reset quiet flag
  463.     ld    (quiet),a
  464.     jr    rename
  465. ;
  466. gotequ:    push    af
  467.     inc    hl        ; point to character after '=' or space
  468.     ld    de,(ofcb)    ; point to temporary FCB
  469.     call    parsit        ; extract filename into FCB, get disk and user
  470.     ld    (nextch),hl    ; save pointer to delimiter which ended scan
  471.     pop    af
  472.     cp    '='
  473.     jr    z,rename
  474.     ld    hl,(ofcb)    ; swap pointers for MS-DOS "style"
  475.     ld    de,(ntfcb)
  476.     ld    (ofcb),de
  477.     ld    (ntfcb),hl
  478. ;
  479. ; Load directory and rename files
  480. ;
  481. rename:    ld    de,(ofcb)    ; point to FCB
  482.     ld    hl,(dirbuf)    ; point to end of code
  483.     call    initfcb        ; init the FCB
  484.     ld    a,(system)    ; set flags
  485.     call    dirq        ; load DIR, select files, pack, and alphabetize
  486. ;
  487. ; Rename DIR files; HL points to first file, BC=file count
  488. ;
  489.     call    renfiles
  490. ;
  491. ; Check for next file spec
  492. ;
  493.     ld    hl,(nextch)    ; get pointer
  494.     ld    a,(hl)        ; get delim
  495.     cp    ','        ; another file?
  496.     jr    nz,rendone
  497.     inc    hl        ; point to character after comma
  498.     jp    dspec1        ; continue processing
  499. ;
  500. ; Rename complete
  501. ;
  502. rendone:
  503.     call    prcount        ; print file count and exit
  504.     ld    hl,(filcnt)    ; get count
  505.     ld    a,l        ; check for none
  506.     or    h
  507.     jp    nz,exit
  508.     ld    a,10
  509.     jp    erexit
  510. ;
  511. ; Rename selected files
  512. ;
  513. renfiles:
  514.     ld    a,b        ; check for any files loaded
  515.     or    c
  516.     ret    z
  517.     jr    renlp1
  518. ;
  519. ; Print filename
  520. ;
  521. renlp:    ld    a,(quiet)
  522.     or    a
  523.     jr    nz,renlp1
  524.     ld    a,(contrl)
  525.     or    a
  526.     call    z,crlf
  527. renlp1:    push    bc        ; save entry count
  528.     push    hl        ; save pointer to FCB
  529.     ld    hl,(ntfcb)    ; copy new template into RENFCB
  530.     ld    de,renfcb
  531.     ld    b,16
  532.     call    moveb
  533.     pop    hl        ; get pointer
  534.     push    hl        ; save pointer
  535.     inc    hl        ; point to filename of old name
  536.     inc    de        ; point to filename of RENFCB
  537.     ld    b,11        ; 11 bytes to FN and FT
  538. renlp2:    ld    a,(de)        ; get character of new file
  539.     cp    '?'        ; change '?' to old character
  540.     jr    nz,renlp3
  541.     ld    a,(hl)        ; get old character
  542.     and    7fh        ; mask old character
  543.     ld    (de),a        ; store it away as new
  544. renlp3:    inc    hl        ; print to next character
  545.     inc    de
  546.     djnz    renlp2        ; count down
  547.     ld    a,(quiet)    ; check quiet mode
  548.     or    a
  549.     jr    nz,renlp5    ; don't print anything
  550.     ld    a,' '
  551.     call    bout
  552.     ld    a,(contrl)    ; check for control mode
  553.     or    a
  554.     jr    nz,renlp4    ; (yes, skip next)
  555.     pop    hl        ; point to old filename
  556.     push    hl
  557.     call    prfn        ; print old filename
  558.     call    eprint
  559.     db    ' to ',0
  560. renlp4:    ld    hl,renfcb    ; point to new filename
  561.     call    prfn        ; print new filename
  562. renlp5:    pop    hl        ; GET pointer
  563. ;
  564. ; Check for control mode and perform control function if flag set
  565. ;
  566.     ld    a,(contrl)    ; get control mode flag
  567.     or    a        ; NZ= yes
  568.     jr    nz,renctrl
  569. ;
  570. ; Check for inspection and inspect if set
  571. ;
  572.     ld    a,(inspct)    ; get flag
  573.     or    a        ; 0=no
  574.     jp    z,doit
  575. ;
  576. ; Prompt user for rename
  577. ;
  578.     call    renq        ; rename question
  579.     cp    ctrlc        ; quit?
  580.     jp    z,quit
  581.     cp    'Q'
  582.     jp    z,quit
  583.     cp    'Y'        ; yes?
  584.     jp    z,doit
  585. ;
  586. ; Don't rename file
  587. ;
  588. nodo:    ld    a,(contrl)
  589.     or    a
  590.     jp    z,rentest
  591.     call    eprint
  592.     db    '  Not Renamed',CR,LF,0
  593.     jp    rentest
  594. ;
  595. ; Print filename pointed to by HL
  596. ;
  597. prfn:    inc    hl        ; point to filename
  598.     ld    b,8        ; print name
  599.     call    prnt
  600.     ld    a,'.'        ; decimal
  601.     call    bout
  602.     ld    b,3        ; print type
  603.     jp    prnt
  604. ;
  605. ; Prompt user for rename
  606. ;
  607. renq:    call    eprint        ; print prompt
  608.     db    '  Rename (Y/N/Q)? N',BS,0
  609.     call    cin        ; get response
  610.     call    caps        ; capitalize
  611.     cp    'Y'
  612.     jr    z,cout
  613.     cp    'Q'        ; quit?
  614.     jr    z,cout
  615.     cp    ctrlc        ; quit?
  616.     ret    z
  617.     ld    a,'N'
  618. cout:    jp    bout        ; echo
  619. ;
  620. ; Control function -- allow user to rename as he desires
  621. ;
  622. renctrl:
  623.     push    hl        ; save pointer to file
  624. rctrl:    call    eprint
  625.     db    '  New Name (<CR>=Skip)? ',0
  626.     ld    a,0FFh        ; capitalize
  627.     call    bbline        ; input line from user
  628.     call    crlf
  629.     or    a        ; check for just carriage return
  630.     jr    nz,rctrl0
  631.     pop    hl        ; get pointer to file
  632.     jp    nodo        ; proceed with next entry
  633. rctrl0:    ld    de,renfcb    ; place into new name FCB
  634.     call    parsit        ; just extract name
  635.     ld    b,11        ; check for any wild characters
  636. rctrl1:    inc    de        ; point to next character
  637.     ld    a,(de)        ; get it
  638.     cp    '?'        ; can't be wild
  639.     jr    z,werr
  640.     cp    '*'        ; can't be wild
  641.     jr    z,werr
  642.     dec    b        ; count down
  643.     jr    nz,rctrl1
  644.     jr    rdoit        ; done -- perform rename
  645. werr:    call    eprint
  646.     db    bel,cr,lf,'  No Wild Cards,',0
  647.     jr    rctrl
  648. ;
  649. ; Quit RENAME program -- even if we've renamed no files, we want to exit
  650. ;
  651. quit:    cp    ctrlc
  652.     jr    nz,quit1
  653.     call    eprint
  654.     db    '^C',0
  655. quit1:    call    prcount        ; print count of files renamed and exit
  656.     jp    exit
  657. ;
  658. ; Rename file, but get pointer first
  659. ;
  660. rdoit:    pop    hl        ; get pointer
  661. ;
  662. ; Rename file; old name pointed to by HL, new name in RENFCB
  663. ;
  664. doit:    push    hl
  665. ;
  666. ; Step 1 -- Determine if new name already exists
  667. ;
  668.     ld    de,renfcb    ; point to new name
  669.     call    initfcb
  670.     ld    c,17        ; search for first
  671.     call    bdos
  672.     inc    a        ; not found?
  673.     jr    z,doit1
  674.     ld    a,(eraflg)    ; see if unprompted erasing option in effect
  675.     or    a
  676.     jr    nz,delold    ; if so, skip prompt
  677.     ld    a,(quiet)
  678.     or    a
  679.     jr    z,skipfn
  680.     call    crlf
  681.     ld    hl,renfcb
  682.     call    prfn
  683. skipfn:    call    eprint
  684.     db    bel,'  Exists, Delete (Y/N/Q)? N',BS,0
  685.     call    cin        ; get response
  686.     call    caps
  687.     cp    'Y'
  688.     jr    z,cout1
  689.     cp    'Q'        ; quit?
  690.     call    z,bout
  691.     jr    z,quit
  692.     cp    ctrlc
  693.     jr    z,quit
  694.     ld    a,'N'
  695. cout1:    call    bout
  696.     pop    hl        ; prepare for abort
  697.     cp    'Y'        ; yes -- continue?
  698.     jp    nz,nodo        ; not yes, so skip it
  699.     ld    a,(contrl)
  700.     or    a
  701.     call    nz,crlf
  702.     push    hl        ; save pointer again
  703. delold:    call    initfcb        ; clear FCB
  704.     ld    c,30        ; set file attributes to R/W if not already
  705.     call    bdos
  706.     call    initfcb
  707.     call    f$delete    ; delete file
  708. doit1:    pop    hl        ; HL points to old name
  709. ;
  710. ; Clear the old name's attributes in case it was R/O
  711. ;
  712.     push    hl        ; save pointer to old name
  713.     ld    de,(ofcb)    ; copy old name
  714.     ld    b,16
  715.     call    moveb
  716.     push    de        ; clear attributes
  717.     ld    b,11        ; 11 bytes
  718.     inc    de        ; point to first
  719. doit2:    ld    a,(de)        ; get character
  720.     and    7Fh        ; clear attribute
  721.     ld    (de),a        ; put character
  722.     inc    de        ; point to next
  723.     djnz    doit2        ; count down
  724.     pop    de        ; now set attributes of old name
  725.     call    initfcb
  726.     ld    c,30        ; set attributes
  727.     call    bdos
  728.     call    initfcb
  729. ;
  730. ; Do the rename
  731. ;
  732.     ld    hl,renfcb    ; point to new name
  733.     ex    de,hl
  734.     call    initfcb        ; init new FCB
  735.     ex    de,hl        ; HL points to new name, DE points to old name
  736.     call    f$rename    ; rename file
  737. ;
  738. ; Restore the original attribute bits
  739. ;
  740.     pop    hl        ; get pointer to old name
  741.     ld    de,renfcb+1    ; point to new name
  742.     push    hl        ; save pointer to old name
  743.     inc    hl        ; point to filename of old name
  744.     ex    de,hl        ; HL points to new name, DE points to old name
  745.     ld    b,11        ; 11 bytes
  746. doit3:    ld    a,(de)        ; get attribute bit of old name
  747.     and    80h        ; look only at attribute bit
  748.     or    (hl)        ; mask in new name byte
  749.     ld    (hl),a        ; store it away
  750.     inc    hl        ; point to next
  751.     inc    de
  752.     djnz    doit3        ; count down
  753. ;
  754. ; Set the original attributes into the new file
  755. ;
  756.     ld    de,renfcb    ; point to FCB
  757.     call    initfcb
  758.     ld    c,30        ; set attributes
  759.     call    bdos
  760.     ld    hl,(filcnt)    ; increment file count
  761.     inc    hl
  762.     ld    (filcnt),hl
  763.     pop    hl        ; get pointer to directory entry
  764. ;
  765. ; Point to next entry
  766. ;
  767. rentest:
  768.     ld    de,esize    ; point to next entry
  769.     add    hl,de
  770.     pop    bc        ; get count
  771.     dec    bc        ; count down
  772.     ld    a,b        ; check for zero
  773.     or    c
  774.     jp    nz,renlp
  775.     ret
  776. ;
  777. ; Print characters pointed to by HL for B bytes
  778. ;
  779. prnt:    ld    a,(hl)        ; get character
  780.     and    07Fh        ; reset high bit
  781.     call    bout
  782.     inc    hl        ; point to next
  783.     djnz    prnt        ; count down
  784.     ret
  785. ;
  786. ; Check for ZCPR 3.3, branch to the appropriate parser
  787. ;
  788. parsit:    call    z33chk
  789.     jp    z,z33fname
  790.     xor    a
  791.     jp    zfname
  792. ;
  793. ; AI (allegedly intelligent) routine to check for a string
  794. ; containing legal option letters ONLY.
  795. ;
  796. optq:    ld    a,(hl)
  797.     sub    '/'        ; slash is explicit option delim
  798.     jr    nz,noslsh    ; if not slash, do character check
  799.     ld    (hl),a        ; if slash, null it out (A = 0)
  800.     dec    hl
  801.     ld    (hl),a        ; null out leading space
  802.     inc    hl        ; adjust pointer to options
  803.     inc    hl
  804.     ret            ; return with Z flag
  805. ;
  806. noslsh:    ld    d,h        ; copy into DE
  807.     ld    e,l
  808.     xor    a        ; search for terminating null
  809.     ld    bc,optlen    ; range for search
  810.     cpir            ; do short search
  811.     jr    z,dooptq    ; found null, proceed
  812.     ex    de,hl        ; otherwise too long for options
  813.     ret            ; return with NZ
  814. ;
  815. dooptq:    push    de
  816.     dec    de
  817. bloop:    inc    de
  818.     ld    a,(de)
  819.     or    a
  820.     jr    z,oqdone    ; end of string, return with Z
  821.     ld    b,optlen
  822.     ld    hl,optltr
  823. lloop:    cp    (hl)
  824.     jr    z,bloop
  825.     inc    hl
  826.     djnz    lloop        ; if B ticks down, a failure!
  827.     dec    b        ; cheap NZ return
  828. ;
  829. oqdone:    pop    hl
  830.     ret
  831. ;
  832. optltr:    db    'EIS'    
  833. optlst:    ds    0
  834. optlen    equ    optlst-optltr
  835. ;
  836. ; SYSLIB Module Name: SARGV
  837. ; Author: Richard Conn
  838. ; SYSLIB Version Number: 3.6
  839. ; Module Version Number: 1.1
  840. ;    public    argv
  841. ; ARGV is a UNIX-style ARGC/ARGV string parser.  It is passed
  842. ; a null-terminated string in HL and the address of a token pointer
  843. ; table in DE as follows:
  844. ;        LXI    H,STRING
  845. ;        LXI    D,ARGV$TABLE
  846. ;        MVI    A,0        ; do not mark token end
  847. ;        CALL    ARGV
  848. ;        JNZ    TOKEN$OVFL    ; indicates more tokens than allowed
  849. ;        ...
  850. ;    ARGV$TABLE:
  851. ;        DB    maxent ; max number of entries permitted
  852. ;        DS    1    ; number of entries stored by ARGV
  853. ;        DS    2    ; pointer to token 1
  854. ;        DS    2    ; pointer to token 2
  855. ;        ...
  856. ;        DS    2    ; pointer to token maxent
  857. ; Tokens are delimited by spaces and tabs.
  858. ;   As well as '='.
  859. ;    27 Feb 86, jww
  860. ;   Completed Joe's mod. by adding "=" to "sksp:" as well as "sknsp:"
  861. ;     December 19, 1987, Bruce Morgen
  862. ; On input, if A=0, the end of each token is not marked with a null.
  863. ; If A<>0, a null is placed after the last byte of each token.
  864. ; If all went well, return with A=0 and Zero Flag set.  If there
  865. ; are possibly more tokens than pointers, return with A=0FFH and NZ.
  866. ;
  867. argv:    push    bc        ; save regs
  868.     push    de
  869.     push    hl
  870.     ld    c,a        ; save mark flag
  871.     ex    de,hl
  872.     ld    b,(hl)        ; get max entry count
  873.     push    hl        ; save address of max entry count
  874.     inc    hl        ; point to token count
  875.     inc    hl        ; point to first pointer
  876. ;
  877. ; On each loop, DE = address of next character in string and HL = address of
  878. ; next pointer buffer; B = number of pointer buffers remaining and C =
  879. ; mark flag (0 = no mark)
  880. ;
  881. loop:    call    sksp        ; skip spaces and tabs in string pointed to by DE
  882.     or    a        ; end of string?
  883.     jr    z,done
  884.     ld    (hl),e        ; store low
  885.     inc    hl
  886.     ld    (hl),d        ; store high
  887.     inc    hl
  888.     dec    b        ; count down
  889.     jr    z,loop2
  890.     call    sknsp        ; skip until end of token
  891.     or    a        ; done?
  892.     jr    z,done
  893.     ld    a,c        ; get mark flag
  894.     or    a        ; 0=no mark
  895.     jr    z,loop1
  896.     xor    a        ; mark with null
  897.     ld    (de),a        ; store null
  898.     inc    de        ; point to next character
  899. loop1:    ld    a,b        ; check count
  900.     or    a
  901.     jr    nz,loop        ; continue on
  902. loop2:    call    sknsp        ; skip over token
  903.     call    sksp        ; any tokens left?
  904.     or    a
  905.     jr    z,done        ; none if EOL
  906.     or    0ffh        ; make A = 0FFH to indicate more to come
  907. done:    pop    hl        ; get address of max token count
  908.     push    af        ; save return flags
  909.     ld    a,(hl)        ; get max token count
  910.     sub    b        ; subtract counter
  911.     inc    hl        ; point to return count
  912.     ld    (hl),a        ; set return count
  913.     pop    af        ; get return flag
  914.     pop    hl        ; restore regs
  915.     pop    de
  916.     pop    bc
  917.     ret
  918. ;
  919. ;  Skip over space or tab characters
  920. ;
  921. sksp:    ld    a,(de)        ; get character
  922.     and    7Fh        ; mask
  923.     inc    de        ; point to next
  924.     cp    ' '        ; continue if space
  925.     jr    z,sksp
  926.     cp    9        ; continue if tab
  927.     jr    z,sksp
  928.     cp    '='
  929.     jr    z,sksp
  930.     dec    de        ; point to character
  931.     ret
  932. ;
  933. ; Skip over non-space and non-tab characters
  934. ; Added '=' so that A:=B: construct yields two arguments.  v1.1  jww
  935. ;
  936. sknsp:    ld    a,(de)        ; get character
  937.     and    7Fh        ; mask
  938.     ret    z        ; done if null
  939.     cp    ' '
  940.     ret    z        ; done if space
  941.     cp    9
  942.     ret    z        ; done if tab
  943.     cp    '='
  944.     ret    z        ; new delimiter
  945.     inc    de        ; point to next
  946.     jr    sknsp
  947. ;
  948. ; End of ARGV inclusion
  949. ;
  950. ; Uninitialized buffers and data . . .
  951. ;
  952.     DSEG
  953. ;
  954. argtbl:
  955. maxent:    ds    1
  956.     ds    1
  957.     ds    2
  958. argum2:    ds    2
  959. argum3:    ds    2
  960. inspct:    ds    1        ; inspect flag (0=no, 0FFh=yes)
  961. contrl:    ds    1        ; control flag (0=no, 0FFh=yes)
  962. system:    ds    1        ; system flag (80h=exclude, 0C0h=include)
  963. eraflg:    ds    1        ; unprompted erasure of existing file (0=no)
  964. quiet:    ds    1        ; quiet flag (non-zero=quiet)
  965. nextch:    ds    2        ; pointer to next character in command line
  966. filcnt:    ds    2        ; count of number of files renamed
  967. renfcb:    ds    40        ; FCB for renaming
  968. ofcb:    ds    2        ; FCB for old filename and old file template
  969. ntfcb:    ds    2        ; FCB for new file template
  970. cmdlne:    ds    2        ; pointer to command line buffer
  971. dirbuf:    ds    2        ; pointer to directory buffer
  972. stack:    ds    2        ; old stack pointer
  973. ;
  974.     end
  975.