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 / ZCPR33 / Z3-33 / Z33RCP02.LBR / RCPCP.LZB / RCPCP.LIB
Text File  |  2000-06-30  |  6KB  |  209 lines

  1.  
  2. ; RCP-CP.Z80
  3.  
  4. ;=============================================================================
  5. ;
  6. ;    F I L E    C O P Y    C O M M A N D
  7. ;
  8. ;=============================================================================
  9.  
  10. ; Command:    CP
  11. ; Function:    Copy a file from one place to another
  12. ; Syntax:    CP destfile=srcfile
  13. ;        CP srcfile
  14. ; Comments:    Both file specifications can include a directory specification.
  15. ;        If only one file name is given, then the current directory and
  16. ;        the source file name are assumed for the destination.
  17.  
  18. copy:
  19.     call    retsave
  20.  
  21. ; If new is blank, make it the same name and type as old
  22.  
  23.     ld    de,fcb1+1    ; Point to destination file name
  24.     ld    a,(de)        ; Get first character
  25.     cp    ' '        ; If not blank (no name)
  26.     jr    nz,copy0    ; ..then branch to copy
  27.  
  28.     ld    hl,fcb2+1    ; Copy source name into destination FCB
  29.     ld    b,11        ; Name and type are 11 bytes
  30.     call    blkmov
  31.  
  32. ; See if destination is same as source, and abort if so
  33.  
  34. copy0:
  35.     ld    hl,fcb1        ; Set up pointers to two files
  36.     ld    de,fcb2
  37.     push    hl
  38.     push    de
  39.     inc    hl        ; Point to names of files
  40.     inc    de
  41.     ld    b,13        ; Compare 13 bytes (name, type, and user #)
  42. copy1:
  43.     call    comp
  44.     jr    nz,copy2    ; If they differ, go on with copy
  45.  
  46.     ld    c,25        ; Get-current-disk BDOS function
  47.     call    bdos        ; Get it in case no drive given explicitly
  48.     inc    a        ; Shift to range 1..16
  49.     ld    b,a        ; ..and keep value in B
  50.     pop    de        ; Restore pointers to FCBs
  51.     pop    hl
  52.     ld    a,(de)        ; Get drive of source file
  53.     ld    c,a        ; ..and save it in C
  54.     or    a        ; Is it default drive?
  55.     jr    nz,copy1a    ; Branch if drive made explicit
  56.     ld    c,b        ; Otherwise, copy default drive into C
  57. copy1a:
  58.     ld    a,(hl)        ; Get drive of destination file
  59.     or    a        ; Is it default drive?
  60.     jr    nz,copy1b    ; Branch if drive made explicit
  61.     ld    a,b        ; Otherwise, get current drive
  62. copy1b:
  63.     cp    c        ; Compare the two drives specified
  64.     jr    nz,copy3    ; Branch if they are different
  65.     jr    cperr        ; Branch to error code if they are the same
  66.  
  67. copy2:
  68.     pop    de        ; Clean up the stack
  69.     pop    hl
  70.  
  71. ; Make note of the user numbers of the two files
  72.  
  73. copy3:
  74.     ld    a,(fcb1+13)    ; Get destination user number
  75.     ld    (usrdest),a
  76.     ld    a,(fcb2+13)    ; Get source user number
  77.     ld    (usrsrc),a
  78.  
  79. ; Set up new FCB for source file and open the source
  80.  
  81.     call    define        ; Define buffer addresses dynamically
  82.     ld    hl,(srcfcb)    ; Get address to use for new source FCB
  83.     push    hl
  84.     ex    de,hl        ; Copy file data to new FCB
  85.     ld    b,12
  86.     call    blkmov
  87.     call    logsrc        ; Log in user number of source file
  88.     pop    hl        ; Initialize the source file FCB
  89.     call    initfcb2
  90.     ld    c,15        ; Open file
  91.     call    bdos
  92.     inc    a        ; Check for error
  93.     jp    z,prfnf        ; Branch if file not found
  94.  
  95. ; Make sure destination file does not already exist
  96.  
  97.     call    logdest        ; Log into destination s user area
  98.     call    extest        ; Test for existence of file
  99.     jp    z,exit        ; Branch if it exists
  100.  
  101. ; Create destination file
  102.  
  103.     ld    de,fcb1        ; Point to destination FCB
  104.     ld    c,22        ; BDOS make-file function
  105.     call    bdos
  106.     inc    a        ; Test for error (no directory space)
  107.     jr    nz,copy5    ; Branch if OK
  108.  
  109. ; Report file error
  110.  
  111. cperr:
  112.     call    print
  113.     db    ' Copy','?'+80h
  114.     jp    exit
  115.  
  116. ; Copy source to destination with buffering
  117.  
  118. ;++++++++++ this should be done by changing DMA address to save all the
  119. ;        buffer swapping
  120.  
  121. copy5:
  122.     call    logsrc        ; Log in source user area
  123.     ld    b,0        ; Initialize counter
  124.     ld    hl,(cbuff)    ; Initialize buffer pointer
  125.  
  126. copy5a:
  127.     push    hl        ; Save address and counter
  128.     push    bc
  129.     ld    hl,(srcfcb)    ; Point to source file FCB
  130.     ex    de,hl        ; Put it in DE for BDOS call
  131.     ld    c,20        ; BDOS read-sequential function
  132.     call    bdos
  133.     pop    bc        ; Get counter and address
  134.     pop    de
  135.     or    a        ; Read Ok?
  136.     jr    nz,copy5b    ; Branch if end of file
  137.  
  138.     push    bc        ; Save counter
  139.     ld    hl,tbuff    ; Copy from 80h to buffer
  140.     ld    b,128        ; 128 bytes
  141.     call    blkmov
  142.     ex    de,hl        ; HL points to next buffer address
  143.     pop    bc        ; Get counter back
  144.     inc    b        ; Increment it
  145.     ld    a,b        ; See if buffer full
  146.     cp    cpblocks
  147.     jr    nz,copy5a    ; If not, go back for more
  148.  
  149. copy5b:
  150.     ld    a,b        ; Get count of blocks loaded into buffer
  151.     or    a        ; Are there any?
  152.     jr    z,copy6        ; Branch if not (we are done)
  153.  
  154.     push    bc        ; Save count
  155.     call    logdest        ; Log into destination user number
  156. cbuff    equ    $+1        ; Pointer for in-the-code modification
  157.     ld    hl,0        ; Point to beginning of copy buffer
  158. copy5c:
  159.     ld    de,tbuff    ; Copy into tbuff
  160.     ld    b,128        ; 128 bytes
  161.     call    blkmov
  162.     push    hl        ; Save pointer to next block
  163.     ld    de,fcb1        ; Point to destination file FCB
  164.     ld    c,21        ; Write the block
  165.     call    bdos
  166.     or    a
  167.     jr    nz,cperr    ; Branch on error (disk full of write error)
  168.     pop    hl        ; Get back pointer to next block
  169.     pop    bc        ; Get count
  170. ;<rjj>    djnz    copy5        ; Work through the blocks
  171.     dec    b        ; <rjj>
  172.     jr    z,copy5        ; <rjj>
  173.     push    bc        ; Save count
  174.     jr    copy5c        ; Back for another bufferful
  175.  
  176. ; Close the destination file
  177.  
  178. copy6:
  179.     call    logdest        ; Log into destination user number
  180.     ld    de,fcb1        ; Point to destination FCB
  181.     ld    c,16        ; Close file
  182.     call    bdos
  183.     call    print
  184.     db    ' Don','e'+80h
  185.  
  186.      if    cpsp and spaceon
  187.     jp    spaexit        ; Report space remaining on destination drive
  188.      else
  189.     jp    exit
  190.      endif    ;cpsp and spaceon
  191.  
  192. ; Log into user number of source file
  193.  
  194. logsrc:
  195. usrsrc    equ    $+1        ; Pointer for in-the-code modification
  196.     ld    a,0        ; Get user number
  197.     jr    setusrrel    ; Local jump to save code
  198.  
  199. ; Log into user number of destination file
  200.  
  201. logdest:
  202. usrdest    equ    $+1        ; Pointer for in-the-code modification
  203.     ld    a,0        ; Get user number
  204. setusrrel:
  205.     jp    setusr
  206.  
  207. ; End RCP-CP.Z80
  208.  
  209.