home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / jsage / znode3 / z3util / rcpmc12.lbr / RCPMC.LZB / ÒCPMC.LIB
Encoding:
Text File  |  1993-06-07  |  10.8 KB  |  575 lines

  1. ;=============================================================================
  2. ;
  3. ;        M C     C O M M A N D
  4. ;
  5. ;============================================================================
  6.  
  7. ; +++++++    NOT AN OFFICIAL RCP SEGMENT
  8.  
  9. ; Command:    MC
  10. ; Function:    Multi Copy:  Wild Card File Copier
  11. ; Author:     Rob Friefeld, 4607 Colorado St., Long Beach, CA 213-434-7338
  12. ; Date:        25 Nov 1987 Version 1.2
  13. ; Comment:    ERAON = YES assures all routines from rcpsubs.lib available.
  14. ;        MC size, not counting support routines -
  15. ;         ~700 bytes with command line options = yes
  16. ;         ~600 bytes bare
  17. ;        Starting address is MLTCPY:
  18.  
  19. ; Version 1.2:
  20. ;        - Command line takes option for selecting files
  21. ;        - User number reported correctly above #15
  22. ;        - Code more efficient
  23.  
  24. ; Usage:    MC SOURCE [DESTINATION] [/o]
  25. ;        Source is the afn to be copied and destination is an optional
  26. ;        afn.  If omitted, source comes to current DU:
  27. ;        Frequent checks made for ^C to abort operation
  28. ;        R/O files are copied to R/W.
  29. ;        /o options ...
  30. ;        /A    - Copy Archived files only
  31. ;        /S    - Copy System files only
  32. ;        /1..4    - Copy F1..F4 attribute files only (set by SFA, NSWEEP)
  33. ;        /~o    - Reverse sense of above option
  34. ;        /I    - Inspect files before copy (like ERA)
  35. ;
  36. ; MC EQUATES
  37. ;
  38.  
  39. ; # RECORDS TO READ ON EACH PASS (Byte value)
  40. ; With these equates, a program smaller than 32k which runs at tpa can be
  41. ; copied and started with a GO
  42.  
  43. FILELOC    EQU    TPA    ; Location file read in
  44. RECBLKS    EQU    255    ; About 32k buffer.  Leaves transient at 8000h alone.
  45.  
  46.  
  47. ; SHOW REMAINING SPACE ON EXIT
  48.  
  49. MCSPA    EQU    YES    ; Show free space
  50. MCSP    EQU    MCSPA AND SPACEON
  51.  
  52. ; INCLUDE COMMAND LINE OPTION PROCESSING
  53.  
  54. MCOPT    EQU    YES
  55.  
  56. ; THIS CODE IS IN PEEP (if enabled)
  57.  
  58.      if    [not peepon]
  59. filcheck:
  60.     ld    hl,fcb1+1
  61.     ld    a,' '
  62.     cp    (hl)
  63. filcx:    ret    nz
  64.     CALL    PRFNF        ; ROUTINE IS ELSEWHERE IN RCP
  65.     JP    EXIT
  66.  
  67. opensource:
  68.     ld    de,fcb1
  69.     ld    c,openf
  70.     call    bdos
  71.     inc    a
  72.     jr    filcx
  73.  
  74.      endif    ; not peepon
  75.  
  76. ;
  77. ; START OF MULTI-COPY
  78. ;
  79.  
  80. MLTCPY:
  81.     CALL    RETSAVE        ; Set up CPR return
  82.  
  83.     call    filcheck    ; Look at command line
  84.  
  85.     call    savspecs    ; Save destination filename and du's
  86.  
  87.     call    logsu        ; Log source user for search function
  88. cpyflg    equ    $+1        ; In code mod of selection flag
  89.     ld    a,81h        ; Flag SYS and DIR
  90.     CALL    GETDIR        ; Get list of afn matches
  91.     jp    z,filcx        ; No matches
  92.  
  93. ; SET UP DESTINATION FCB POINTER
  94.     push    hl        ; Points to start of file list
  95.     ld    de,-36        ; Room for an fcb
  96.     add    hl,de
  97.     ld    (destfcb),hl
  98.     ld    a,(fcb2)    ; Save dest drive now that we know where
  99.     ld    (hl),a
  100.     or    a
  101.     call    z,getdefdrive    ; Make drive explicit
  102.     pop    hl
  103.  
  104. ;
  105. ;  MAIN PROGRAM LOOP
  106. ;
  107. ;  Enter with HL -> first file name in list
  108.  
  109. loop:
  110.     push    hl        ; Save list position
  111.     ld    de,fcb1+1    ; Move name to source fcb
  112.     ld    bc,11
  113.     ldir
  114.     CALL    INITFCB1    ; Zero out rest of fcb
  115.     pop    hl        ; Restore list postion
  116.     ld    de,(destfcb)    ; Copy same name to dest fcb
  117.     inc    de        ; -> name
  118.     ld    bc,11
  119.     ldir            ; When done, HL -> next name on list
  120.     push    hl        ; Save list position
  121.     ld    hl,(destfcb)
  122.     CALL    INITFCB2    ; Clean up the dest fcb
  123.  
  124.      if    mcopt
  125.     call    specs        ; Examine file for attributes
  126.     jp    p,lp21        ; Doesn't have selected att
  127.      endif    ;mcopt
  128.  
  129.     call    rename        ; If dest to be renamed, do it
  130.     call    pfil        ; Display file name
  131.     call    opfiles        ; Open source and dest files
  132.     jr    z,lp2        ; Z = dest file exists AND don't erase it
  133. lp1:
  134.     call    r$wfiles    ; Read and write RECBLKS records
  135.     ld    a,(cflag)    ; Is entire file copied?
  136.     or    a
  137.     jr    nz,lp1        ; No
  138.     call    close        ; Close the destination file
  139.  
  140. lp2:    call    crlf
  141. lp21:    pop    hl        ; Restore list pointer 
  142.     ld    a,(hl)        ; 0 terminator of name list
  143.     or    a
  144.     jr    z,mcexit
  145.     call    BREAK        ; Routine in RCPSUBS to abort on ^C
  146.     jr    loop
  147.  
  148. mcexit:
  149.      IF    MCSP
  150.     ld    hl,(destfcb)
  151.     ld    a,(hl)        ; Report space on destination disk
  152.     ld    (fcb),a
  153.     jp    spaexit        ; DONE    
  154.      ELSE
  155.     jp    exit
  156.      ENDIF
  157.  
  158.  
  159.  
  160. ;
  161. ;  SUBROUTINES
  162. ;
  163.  
  164. ; COMMAND LINE INTERP
  165. savspecs:
  166.  
  167. ; Save destination filename.  Set renaming flag.
  168. savdest:
  169.     ld    hl,fcb2+1
  170. sd00:    ld    a,(hl)        ; Name blank?
  171.     cp    '/'        ; Option trig
  172.     jr    nz,sd01
  173.     ld    (hl),' '
  174.     jr    sd00
  175. sd01:    sub    ' '
  176.     ld    (rflag),a    ; Rename flag: Z = don't 
  177.  
  178.     ld    bc,11        ; Dest name  -> savfcb
  179.     ld    de,savfcb
  180.     ldir
  181.  
  182.      if    mcopt
  183.     call    filspec        ; Get any option
  184.      endif    ;mcopt
  185.  
  186. ; Save the drives and users of source + destination
  187.  
  188. savdu:
  189.     ld    a,(fcb+13)    ; Get and store user #'s
  190.     ld    (susr),a
  191.     ld    a,(fcb2+13)
  192.     ld    (dusr),a
  193.     ld    hl,fcb        ; If drive is default, make it explicit
  194.     ld    a,(hl)
  195.     or    a
  196.     ret    nz
  197.  
  198. getdefdrive:            ; Load default drive into @HL
  199.     push    hl
  200.     ld    c,inqdiskf
  201.     call    bdos
  202.     pop    hl
  203.     inc    a
  204.     ld    (hl),a
  205.     ret
  206.  
  207.      if    mcopt
  208. ; Check command line for an option
  209. filspec:
  210.     xor    a
  211.     ld    (aflag),a    ; Init attribute flag Z = none
  212.     ld    (sflag),a    ; Sense Z= normal
  213.     ld    (iflag),a    ; Init inspect Z  = no
  214.     inc    a
  215.     ld    (cpyflg),a
  216.  
  217.     ld    hl,tbuf        ; Scan tail for '/'
  218. fspec1:    inc    hl
  219.     ld    a,(hl)
  220.     or    a
  221.     ret    z        ; Z = no '/'
  222.     cp    '/'
  223.     jr    nz,fspec1
  224.  
  225. fspec2:
  226.     inc    hl        ; Char after '/'
  227.     ld    a,(hl)
  228.     cp    '~'        ; Negation option
  229.     jr    z,fspecN    ; Set a flag
  230.     cp    'I'
  231.     jr    z,fspecI
  232.     cp    'A'
  233.     jr    z,fspecA
  234.     cp    'S'
  235.     jr    z,fspecS
  236.     sub    '0'
  237.     cp    1
  238.     ret    c
  239.     cp    5
  240.     ret    nc
  241. fspec21:
  242.     ld    (aflag),a
  243.     ret
  244.  
  245. fspecA:
  246.     ld    a,11        ; Offset of archive att byte
  247.     jr    fspec21
  248. fspecI:
  249.     ld    (iflag),a
  250.     ret
  251. fspecN:
  252.     ld    a,80h
  253.     ld    (sflag),a
  254.     jr    fspec2
  255.  
  256. fspecS:
  257.     ld    a,(sflag)    ; 0 = sys, 80h = dir
  258.     ld    (cpyflg),a
  259.     ret
  260.  
  261. fspec4:
  262.     ld    a,' '        ; Don't take '/' as second file name
  263.     ld    (fcb2+1),a
  264.     ret
  265.  
  266.  
  267. ;
  268. ; CHECK MATCHED FILE NAME FOR ATT BIT SET
  269. ;
  270. specs:
  271.     ld    a,(aflag)
  272.     dec    a
  273.     ret    m    ; A = 0..3,10
  274.     ld    hl,(destfcb)
  275.     inc    hl
  276.     ld    e,a
  277.     ld    d,0
  278.     add    hl,de
  279.     ld    a,80h
  280.     and    (hl)        ; If high bit set, A = 80h, else A= 0
  281.     ex    af,af'        ; Save flags
  282.     ld    a,(sflag)    ; What is sense of flag?
  283.     or    a
  284.     jr    nz,spec01    
  285.     ex    af,af'        ; Normal sense, restore flags
  286.     ret            ; Test for P on return.
  287. spec01:
  288.     ex    af,af'
  289.     dec    a        ; Reverse sense A = 7fh or ffh
  290.     ret
  291.  
  292.      endif    ;mcopt
  293.  
  294. ; RENAME DESTINATION FILE
  295.  
  296. rename:
  297.     ld    a,(rflag)    ; Rename wanted?
  298.     or    a
  299.     ret    z        ; No (leaves att alone except for r/o)
  300.  
  301.     ld    b,11        ; Matched source name has been copied
  302.     ld    hl,savfcb    ; Use template to overwrite unambig chars
  303.     ld    de,(destfcb)
  304.     inc    de        ; Point to file name
  305. ren1:    ld    a,(hl)
  306.     cp    '?'        ; Leave wild card parts alone
  307.     jr    z,ren2
  308.     ld    (de),a        ; Rename other parts
  309. ren2:    inc    hl        ; Next pair of chars
  310.     inc    de
  311.     djnz    ren1
  312.     ret
  313.  
  314.  
  315. ; Log source or dest user
  316.  
  317. logsu:    ld    a,(susr)
  318.     jr    log
  319. logdu:    ld    a,(dusr)
  320. log:    JP    SETUSR
  321.  
  322.  
  323.  
  324. ; OPEN SOURCE AND DESTINATION FILES
  325. opfiles:
  326.  
  327. ; Open source file
  328. opsrc:
  329.     call    logsu
  330.     call    opensource    ; Routine in rpeep
  331.     
  332.  
  333. ; Open destination file
  334. opdest:
  335.     ld    de,tbuf        ; Restore DMA to 80h
  336.     ld    c,setdmaf
  337.     call    bdos
  338.  
  339.     call    logdu        ; Dest user
  340.  
  341.     ld    de,(destfcb)    ; Make sure file is not R/O
  342.     ld    hl,9        ; Offset of attr
  343.     add    hl,de
  344.     res    7,(hl)        ; Reset bit 7
  345.  
  346.      if    mcopt
  347.     ld    a,(iflag)    ; Are we in inspect mode?
  348.     or    a
  349.     jr    z,od0        ; No
  350.  
  351.     call    eraq1        ; Do it?
  352.     jr    z,od0        ; Yes
  353.     xor    a        ; Return Z= skip
  354.     ret
  355.      endif    ;mcopt
  356.  
  357. od0:
  358.     ld    c,srchff    ; Check existence of destination
  359.     call    bdosde
  360.     cp    0ffh        ; Preserve offset in A
  361.     jr    z,od1        ; No file
  362.  
  363.     call    file$exists    ; Deal with existence of file
  364.     ret    z        ; Copy aborted
  365.  
  366. od1:
  367.     ld    c,makef        ; Make new file
  368.     call    bdosde
  369.     inc    a
  370.     jp    z,DIRERR    ; Unable to make new file
  371.     ret            ; Normal exit returns NZ
  372.  
  373.  
  374. ; Destination file exists:
  375. ;    Locate file name in tbuf
  376. ;    Make sure file is not being copied to itself
  377. ;    Find out if file is R/O and warn user
  378. ;    Finally, do we want to erase it?
  379.  
  380. file$exists:
  381.     rrca            ; Find entry into TBUF
  382.     rrca
  383.     rrca
  384.     add    a,80h
  385.     ld    l,a
  386.     ld    h,0        ; Now pointing to user number of entry
  387.  
  388.     ld    a,(susr)    ; Compare users
  389.     cp    (hl)
  390.     jr    nz,fil$ex2    ; Different
  391.     ld    a,(fcb)        ; Compare drives
  392.     ld    c,a
  393.     ld    de,(destfcb)
  394.     ld    a,(de)
  395.     cp    c
  396.     jr    nz,fil$ex2    ; OK
  397.  
  398.     call    print        ; Don't do copy
  399.     db    ' ?','?'+80h
  400.     xor    a
  401.     ret
  402.  
  403. fil$ex2:
  404.     inc    hl        ; Point to start of name
  405.     CALL    ROTEST        ; R/O ?
  406.     call    ERAQ        ; Erase?
  407.     jr    z,erase1    ; Answered yes
  408.     xor    a
  409.     ret
  410.  
  411. erase1:
  412.     ld    c,attrf        ; Take care of R/O status
  413.     call    bdosde        ; DE -> dest fcb
  414.     ld    c,erasef    ; Erase the file
  415.     call    bdosde
  416.     or    a,-1        ; NZ return means we said "YES"
  417.     ret
  418.  
  419. ; FORMAT THE RUNNING FILE NAME DISPLAY
  420. pfil:
  421.     call    print
  422.     db    '  Copying -->',' '+80h
  423.     ld    de,fcb1
  424.     call    pdsk
  425.     ld    a,(susr)
  426.     call    pusr
  427.     call    pfn
  428.     call    print
  429.     db    ' to',' '+80h
  430.     ld    de,(destfcb)
  431.     call    pdsk
  432.     ld    a,(dusr)
  433.     call    pusr
  434.     ld    a,(rflag)    ; Don't reprint name if same
  435.     or    a
  436.     ret    z
  437.  
  438. pfn:    ex    de,hl
  439.     inc    hl
  440.     JP    PRFN
  441.  
  442.  
  443. pdsk:    ld    a,(de)        ; Print file drive  DE -> fcb
  444.     add    'A'-1
  445. pdsk0:    jp    CONOUT
  446.  
  447. pusr:    ld    c,'0'        ; Print user number in A
  448.     cp    10
  449.     jr    c,pusr1
  450. pusr00:
  451.     inc    c
  452.     sub    10
  453.     cp    10
  454.     jr    nc,pusr00
  455.     push    af
  456.     ld    a,c
  457.     call    CONOUT
  458.     pop    af
  459. pusr0:    add    '0'
  460.     call    CONOUT
  461.     ld    a,':'
  462.     jr    pdsk0
  463. pusr1:    call    pusr0
  464.     ld    a,' '
  465.     jr    pdsk0
  466.  
  467.  
  468. ;
  469. ; READ AND WRITE THE FILES
  470. ; Loop through this routine until entire file copied.
  471. r$wfiles:
  472.  
  473. ; READ SOURCE FILE INTO MEMORY
  474.  
  475. get$fil:
  476.     call    logsu        ; Log source user #
  477.     xor    a
  478.     ld    (cflag),a    ; Reset copy flag
  479.     ld    b,recblks    ; Zero count of records read
  480.     ld    hl,fileloc    ; Location of file buffer
  481.  
  482. getlp:    push    bc        ; Save count
  483.     call    setloc        ; Save pointer and set DMA
  484.     ld    de,fcb1
  485.     ld    c,readf        ; Note that readf returns A <> 0
  486.     call    bdos        ;  when reading record after EOF.
  487.     or    a        ;  Hence RCOUNT = 1 on one rec file
  488.     pop    bc
  489.     jr    nz,wrtfil    ; EOF encountered, exit loop
  490.     ld    hl,(nxtfile)    ; Available scratch pointer
  491.     ld    de,128
  492.     add    hl,de
  493.  
  494.     CALL    BREAK        ; ALLOW ABORT
  495.  
  496.     djnz    getlp        ; Still room
  497.     or    a,-1        ; Out of room
  498.     ld    (cflag),a    ; Set flag copy
  499.  
  500. ; WRITE FILE TO DESTINATION
  501.  
  502. wrtfil:    ld    a,recblks    ; B = recblks - (records read)
  503.     sub    b        ; A = records read
  504.     or    a
  505.     ret    z        ; 0 records copied
  506.     ld    b,a        ; Count in B    
  507.  
  508.     push    bc        ; Has record count
  509.     call    logdu        ; Log dest user
  510.     pop    bc
  511.  
  512.     ld    hl,fileloc    ; Write buffer to file
  513. wrtlp:
  514.     push    bc
  515.     call    setloc
  516.     ld    c,writef
  517.     call    bdosde
  518.     or    a
  519.     pop    bc
  520.     jp    nz,full        ; Disk full error
  521.     ld    hl,(nxtfile)    ; Move pointer along 128 bytes
  522.     ld    de,128
  523.     add    hl,de
  524.  
  525.     CALL    BREAK
  526.  
  527.     djnz    wrtlp        ; And get next record
  528.     ret
  529.  
  530. ; Save file pointer and set up DMA
  531. setloc:
  532.     ld    (nxtfile),hl
  533.     ex    de,hl
  534.     ld    c,setdmaF
  535.     jp    bdos
  536.  
  537.  
  538. close:
  539.     ld    c,closef
  540.     JP    bdosde
  541.  
  542. ; DEST FILLED.  ERASE INCOMPLETE COPY AND RESET DISK.
  543. full:
  544.     ld    c,ERASEF
  545.     call    bdosde
  546.     call    print
  547.     db    cr,lf,'Disk ful','l'+80h
  548.     ld    c,13        ; Disk reset BDOS function
  549.     call    bdos
  550. fullx:    xor    a
  551.     jp    mcexit        ; Quit
  552.  
  553.  
  554. bdosde:    ld    de,(destfcb)
  555.     jp    bdos
  556.  
  557. ;
  558. ; Data
  559. ;
  560. susr:    ds    1        ; Source user
  561. dusr:    ds    1        ; Dest user
  562. savfcb:    ds    11        ; Destination name template
  563. rflag:    ds    1        ; Rename flag Z = no rename
  564. cflag:    ds    1        ; Copy flag Z = finished
  565.      if    mcopt
  566. aflag:    ds    1        ; Attribute flag
  567. iflag:    ds    1        ; Inspect flag
  568. sflag:    ds    1        ; Sense flag
  569.      endif    ;mcopt
  570. destfcb:
  571.     ds    2        ; Temp storage for destination FCB
  572.  
  573. ; END OF RCPMC.LIB
  574. ct flag
  575. sflag:    d