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 / ENTERPRS / CPM / UTILS / A / COPY171.ARC / COPY171.Z80 < prev    next >
Text File  |  1989-09-27  |  45KB  |  1,623 lines

  1.     TITLE    "ZSDOS File Copy Program"
  2. ;=======================================================================;
  3. ;                C O P Y                    ;
  4. ;-----------------------------------------------------------------------;
  5. ; Derived from MCOPY 4.0 by Richard Conn with Mods by Bruce Morgen(4.8),;
  6. ; Howard Goldstein (4.6), Michael Bate (4.4,5), Steven M. Cohen (4.3),    ;
  7. ; Jay Sage, and Joe Wright (4.2)                    ;
  8. ;-----------------------------------------------------------------------;
  9. ; Changes for ZSDOS and DSLIB Copyright (C) 1988  by Harold F. Bower    ;
  10. ;            All rights reserved                ;
  11. ; This program is made available for non-commercial use.  Any commercial;
  12. ; use must be authorized by the express written consent of the author.    ;
  13. ;-----------------------------------------------------------------------;
  14. ; COPY is a program which copies files between drives or between User    ;
  15. ; areas.  If Date/Time Stamping is used, Create and Modify Stamps will    ;
  16. ; be preserved.  Stamps are accessed through DSLIB routines.        ;
  17. ;                                    ;
  18. ; COPY MUST be linked with The Libraries, Version 4 as:            ;
  19. ;                                    ;
  20. ;    ZML COPY,DSLIB/,Z3LIB/,SYSLIB/                    ;
  21. ;                                    ;
  22. ; Revisions:                                ;
  23. ;    1.71- Deleted unique code in favor of GETMTOP/GZMTOP, deleted    ;
  24. ;        ZFPARS subroutine for calls to ZPRSFN.    24 Mar 91, HFB    ;
  25. ;    1.70- Added separate existence test for R/O files controlled by    ;
  26. ;        new O switch.  R/O source files not erased by X option. ;
  27. ;        M option no longer restricts copy to one group of       ;
  28. ;        files.  Set attributes call only done when absolutely   ;
  29. ;        necessary for speed improvement.  Disk reset done for    ;
  30. ;        all DOS's to ensure proper operation under DOSDISK or    ;
  31. ;        SPEEDUP RSX.  Initialization improved; CRASHES UNDER    ;
  32. ;        vanilla CCP fixed.  Top of memory calculation uses    ;
  33. ;        extended environment if available.  Date comparisons    ;
  34. ;        now done on all systems that support stamping, not just    ;
  35. ;        ZSDOS.  Bug affecting ZRDOS Public restoration fixed.    ;
  36. ;        Unnecessary external declarations removed.        ;
  37. ;                            1-9 Mar 91, HG    ;
  38. ;    1.64- Changed local stack calculations        23 Jul 89, HFB    ;
  39. ;    1.63- Corrected operation w/"vanilla" CP/M    16 Jul 89, HFB    ;
  40. ;    1.62- Fixed not restoring entry DU w/o ZCPR3     7 Jun 89, HFB    ;
  41. ;    1.61- Fixed error in Help Name printout         3 Jun 89, HFB    ;
  42. ;    1.6 - Modified to operate without ZCPR3, maximum use of Vers 4    ;
  43. ;        libraries, auto-search for COPY.CFG.    26 May 89, HFB    ;
  44. ;    1.5 - Fixed obscure bug in buffer calcs, added Jay Sage's patch ;
  45. ;        to allow COPY DIR:FN.FT to copy to default DIR: rather    ;
  46. ;        than BACKUP:, Added logic to inhibit /X if /M active.    ;
  47. ;                          12 Mar-2 Apr 89, CWC  ;
  48. ;    1.4 - Corrected glitch in date comparisons    11 Dec 88, HFB    ;
  49. ;    1.3 - Unlinked 'E' disable from 'R' and 'A', corrected lack of    ;
  50. ;        sensing 'R' and 'X', Fall back to Create if no Modify    ;
  51. ;        date, and print "undated" if neither present, ignore    ;
  52. ;        erase with X-option if Verify Error.   3-5 Dec 88, HFB    ;
  53. ;    1.2 - Added 'R' (Replace) option, changed 'X' option to Erase    ;
  54. ;        source after copy. Release version     2 Dec 88, HFB    ;
  55. ;    1.1a- Fix glitch on DS only operation, allow rename in same    ;
  56. ;        user area with different name        25 Nov 88, HFB    ;
  57. ;    1.1 - Formal release version            17 Nov 88, HFB    ;
  58. ;    1.0a-e -  Bug fix in E & N Options, Added Archive, Fixed /M bug    ;
  59. ;        w/test in mcpy28, Restored CRC bypass if not verifying,    ;
  60. ;        corrected glitch if no space on dest, Added File Exclude;
  61. ;        list, File rename, Archive only if file exists, test    ;
  62. ;        dates on each file, Add Source open time to Access field;
  63. ;                         25 Sep-15 Nov 88, HFB    ;
  64. ;    1.0 - Initial Release                18 Sep 88    ;
  65. ;=======================================================================;
  66.  
  67. VERS    EQU    17        ; Initial Release
  68. rev    equ    '1'        ; Bug fix revision
  69.  
  70. ; SPECIAL Constants
  71.  
  72. PLIM    EQU    4*48        ; Size of buffer in pages (4 * nk)
  73.                 ;    [may be changed]
  74. FNSIZE    EQU    16        ; Number of bytes in basic Nam.Typ fields
  75. ESIZE    EQU    FNSIZE+15    ; Number of bytes/entry + Date Stamps
  76.  
  77. ; CP/M Constants
  78.  
  79. WB    EQU    0        ; CP/M warm boot
  80. BDOSE    EQU    WB+5        ; Bdos entry point
  81. FCB    EQU    WB+5CH        ; Specified FCB
  82. BUFF    EQU    WB+80H        ; Default buffer and input line
  83.  
  84. ; ASCII Constants, et al
  85.  
  86. ON    EQU    0FFH        ; On code
  87. OFF    EQU    0        ; Off code
  88. CR    EQU    0DH        ; <cr>
  89. LF    EQU    0AH        ; <lf>
  90. TAB    EQU    09H        ; Horizontal tab
  91. CTRLC    EQU    'C'-'@'        ; ^c
  92. OPTC    EQU    '/'        ; Option delimiter
  93. OPTS    EQU    0000H        ; Skippable option table value
  94.  
  95. ; From SYSLIB Import..
  96.  
  97.     EXT    RETUD, LOGUD, PUTUD, GETUD, GETMTOP
  98.     EXT    INITFCB, F$EXIST, SETDMA, BDOS, CIN, COUT, CONDIN
  99.     EXT    MOVEB, EPRINT, EPSTR, PFN1, F$DELETE, F$OPEN, F$MAKE
  100.     EXT    F$CLOSE, F$READ, F$WRITE, PAFDC, CODEND, CAPS, CRLF
  101.     EXT    CRC3INIT, CRC3CLR, CRC3UPD, CRC3DONE
  102.  
  103. ; From Z3LIB Import..
  104.  
  105.     EXT    Z3INIT, ZPRSFN, GETQUIET, GETEFCB
  106.     EXT    GETMSG, PUTER2, STOPZEX, WHRENV
  107.     EXT    DIRTDU, DUNDR, GZMTOP
  108.  
  109. ; From DSLIB Import..
  110.  
  111.     EXT    DDIRQ, DDIRPACK
  112.     EXT    GSTAMP, PSTAMP, TIMINI, DOSTYP, TIMTYP, RCLOCK
  113.  
  114. ;------------------------------------------------------------------
  115. ; External ZCPR3 Environment Descriptor
  116.  
  117.     JP    START
  118.  
  119.     DEFB    'Z3ENV'        ; This is a ZCPR3 utility
  120.     DEFB    1        ; External environment descriptor
  121. Z3EADR:    DEFW    0001        ; Dummy value to force WHRENV search
  122.  
  123. ; This section aligns to locations needed for ZCNFG auto-search for
  124. ; configuration file name.  It is aligned to Type-4 header values.
  125.  
  126.     DEFW    0000        ; Filler for ZCNFG file name offset
  127.     DEFB    'COPY    ',0    ; Search for COPY.CFG
  128.  
  129. ; User-Definable Initial Flag Conditions
  130. ;  The default conditions for MCOPY may be readily patched by the user
  131. ;  via DDT for his desired default values
  132.  
  133. DEFTBL:
  134. DVERFLG: DEFB    ON        ; Set verify
  135. DINSP:     DEFB    OFF        ; Set no inspect
  136. DSYSEXC: DEFB    OFF        ; Set no $SYS file exclusion by default
  137. DNCOPY:     DEFB    OFF        ; Set no multiple copies by default
  138. DEXIST:     DEFB    ON        ; Existence testing on
  139. DEXTRO    DEFB    ON        ; Existence testing, R/O files, on
  140. DARCHV:     DEFB    OFF        ; Do not operate in Archive mode
  141. DREPL:     DEFB    OFF        ; Do Not restrict copy to Existing files
  142. ;---- All above entries copied to CPYTBL
  143. TYPDAT:     DEFB    0FFH        ; Type of stamps to select in Source
  144.                 ; 0 = P2D/DosDisk, FF = DateStamper
  145. USEDDU:     DEFB    ON        ; If on, default DU: given in next 3 fields
  146. DDUSER:     DEFB    0        ; Default destination user is 0
  147. DDDISK:     DEFB    'B'-'A'        ; Default destination disk is B
  148. BACKDIR: DEFB    'BACKUP  '    ; Name of backup directory
  149. EXCLUD:     DEFB    '!!?????????'    ; 8-name File Exclusion list
  150.      DEFB    '[??????]???'
  151.      DEFB    '????????$?$'
  152.      DEFB    '           '
  153.      DEFB    '           '
  154.      DEFB    '           '
  155.      DEFB    '           '
  156.      DEFB    '           '
  157.      DEFB    0        ; List terminator
  158.  
  159. ; Beginning of COPY Program
  160.  
  161. START:                ; Set up Dynamic (whew!) Buffers
  162.     LD    (STACK),SP    ; Save incoming stack pointer
  163.     LD    SP,STACK    ; ..and set a local stack
  164.     LD    HL,DATABG    ; Set program data area to 0
  165.     LD    DE,DATABG+1
  166.     LD    BC,STACK-DATABG-1
  167.     LD    (HL),0
  168.     LDIR
  169.     CALL    CODEND        ; Determine free space
  170.     CALL    CRC3INIT    ; Create CRC table
  171.     INC    H        ; Allow 2 pages for CRC table
  172.     INC    H
  173.     LD    (INLINE),HL    ; Ptr to input line
  174.     LD    L,128
  175.     LD    (FCBS),HL    ; Ptr to source FCB
  176.     LD    L,128+36
  177.     LD    (FCBD),HL    ; Ptr to dest FCB
  178.     INC    H
  179.     LD    L,0
  180.     LD    (FREEBUF),HL    ; Free space buffer
  181.  
  182.     CALL    EPRINT        ; Print Banner
  183.     DEFB    'COPY  Version '
  184.     DEFB    VERS/10+'0','.',VERS MOD 10 + '0',rev,' (for ZSDOS)',0
  185.  
  186.     LD    HL,(Z3EADR)    ; Get candidate ZCPR3 environment
  187.     CALL    WHRENV
  188.     LD    (Z3EADR),HL    ; ..and store validated ENV addr
  189.     CALL    Z3INIT        ; Initialize the ZCPR3 ENV and Z3LIB vectors
  190.  
  191.     CALL    TIMINI        ; Initialize the Dos & Time System
  192.     LD    A,(Z3EADR+1)    ; Do we have a valid ENV?
  193.     OR    A        ;  (Page must be Non-Zero if valid)
  194.     JR    NZ,MSGS        ; Have ENV, go do msg stuff
  195.     DEC    A
  196.     LD    (NOMSGS),A    ; No env means no msg buffer
  197.     JR    SDFLGS
  198.  
  199. MSGS:    CALL    STOPZEX        ; Prevent ZEX input
  200.  
  201.     CALL    GETQUIET    ; Get ZCPR3 quiet flag
  202.     LD    (QUIET),A    ; ..and set local flag
  203.  
  204.     CALL    GETMSG        ; See if there is a message buffer
  205.     JR    NZ,HAVMSGS
  206.     LD    A,0FFH        ; No message buffer - set indicator
  207.     LD    (NOMSGS),A
  208.     JR    SDFLGS
  209.  
  210. HAVMSGS: XOR    A        ; There is a message buffer - clear
  211.     CALL    PUTER2        ; the error flag
  212.  
  213. ; Set Default Flags
  214.  
  215. SDFLGS:    LD    HL,DEFTBL    ; Copy default options to mem.
  216.     LD    DE,CPYTBL
  217.     LD    B,TBLLEN
  218.     CALL    MOVEB
  219.  
  220. ; Check for Backup Directory and establish it as default
  221. ;  If No Backup Directory or No ZCPR3, select default stored
  222.  
  223.     CALL    RETUD        ; Set Current DU in BC just in case
  224.     LD    A,B        ; Save disk
  225.     LD    (CDISK),A
  226.     LD    A,(USEDDU)    ; Fixed default for DU:?
  227.     AND    A
  228.     JR    Z,DEFBAK    ; ..jump if not and set current dest
  229.  
  230. DEFBK0:    LD    A,(Z3EADR+1)    ; Any valid ENV?
  231.     OR    A
  232.     JR    Z,DEFBK1    ; ..get stored default if not
  233.     LD    HL,BACKDIR    ; Pt to directory name
  234.     CALL    DIRTDU        ; Does it exist?
  235.     JR    NZ,DEFBAK    ; ..jump if found and select
  236. DEFBK1:    LD    BC,(DDUSER)    ; Otherwise use default DU
  237. DEFBAK:    LD    (DUSER),BC
  238.  
  239.     CALL    PUTUD        ; Save current Drive/User position
  240.     LD    DE,(INLINE)    ; Input line save buffer
  241.     LD    HL,BUFF+1    ; Pt to command line characters
  242.     LD    B,127        ; Save 127 bytes (arbitrary)
  243.     CALL    MOVEB
  244.     EX    DE,HL        ; Hl pts to input line
  245.  
  246. ; Set other flags (always defaults to "off")
  247.  
  248.     XOR    A        ; A=0
  249.     LD    (NOREPL),A    ; Turn off "no copy if exists" option
  250.     LD    (XMOVE),A    ; ..and "remove source after copy"
  251.  
  252. ; Check for empty Command Line and process Command Mode if so
  253. ; On Entry, HL pts to first char of string from CLINE
  254.  
  255. START1:    LD    A,(HL)        ; Get char
  256.     OR    A        ; Eol?
  257.     JP    Z,MHELP        ; Print help message if no input
  258.     INC    HL        ; Pt to next
  259.     CP    ' '        ; Just spaces?
  260.     JR    Z,START1
  261.  
  262. ; Command Line was Not Empty -- Check for HELP request
  263.  
  264.     DEC    HL        ; Pt to first char
  265.     CP    OPTC        ; If opening option, must be help
  266.     JP    Z,MHELP
  267.  
  268. ; See if Options are available in the Command Line
  269.  
  270.     LD    (MFPTR),HL    ; Set ptr to first char of file name specs
  271.                 ; ..Skip to end of File Name Specs
  272.     LD    A,(BUFF)    ; Tail char. count
  273.     LD    C,A        ; To C
  274.     XOR    A        ; Search for terminating null
  275.     LD    B,A        ; BC now has count
  276.     CPIR            ; Search..
  277.     JP    NZ,MHELP    ; Not found, something screwy
  278.     DEC    HL        ; Get last real char.
  279.     DEC    HL
  280.     LD    A,(HL)
  281.     CP    ':'        ; Was it a dest. DU:/DIR: ?
  282.     JR    Z,OVRIDE    ; If so, non-option
  283.     LD    A,' '        ; Search back for next blank
  284.     LD    C,OPTLEN+1    ; Range in (B)C
  285.     CPDR            ; Search..
  286.     JR    NZ,OVRIDE    ; Not found, too long for option
  287.     INC    HL        ; Bump point to potential option
  288.     INC    HL
  289.     CALL    OPTQ        ; Test it thoroughly
  290.     JR    NZ,OVRIDE    ; Treat as option if Z returned
  291.  
  292. ; Scan for Option
  293.  
  294. OPTION:    LD    A,(HL)        ; Get option char
  295.     OR    A        ; Eol?
  296.     JR    Z,OVRIDE    ; Do mcopy
  297.     INC    HL        ; Pt to next
  298.     PUSH    HL        ; Save ptr
  299.     LD    HL,OPTTAB    ; Pt to option table
  300.     CALL    CMDER        ; Process command
  301.     POP    HL        ; Get ptr
  302.     JR    OPTION
  303.  
  304. ; Since the no replace mode is incompatible with the exist test
  305. ; mode, if norepl flag is on turn exist off
  306.  
  307. OVRIDE:    LD    A,(ARCHIV)    ; Is this an Archive opn?
  308.     OR    A
  309.     JR    NZ,OVRID1    ; ..Supercede other ops if so
  310.     LD    A,(REPLAC)    ; Is this copy if Exist?
  311.     OR    A
  312.     JR    Z,MCOP0V    ; ..jump if not
  313. OVRID1:    XOR    A
  314.     LD    (NOREPL),A    ; ..and No Replace is off
  315. MCOP0V:    LD    A,(NCOPY)
  316.     OR    A
  317.     JR    Z,OVRID2    ; Test for multiple copy
  318.     XOR    A
  319.     LD    (XMOVE),A    ; clear source delete if multiple
  320. OVRID2:    JP    MCOPY0
  321.  
  322. ; Command Processor -- Command letter in A, HL pts to Table
  323.  
  324. CMDER:    LD    B,A        ; Command in b
  325. CMDER1:    LD    A,(HL)        ; Get command letter
  326.     OR    A        ; Done?
  327.     JR    Z,OHELP
  328.     CP    B        ; Match?
  329.     INC    HL        ; Pt to address
  330.     JR    NZ,CMDER3
  331.     LD    E,(HL)        ; Get it in DE
  332.     INC    HL
  333.     LD    D,(HL)
  334.     EX    DE,HL        ; HL pts to command address
  335.     LD    A,L
  336.     OR    H        ; Test for OPTS
  337.     RET    Z        ; Return w/no action if so
  338.     LD    A,(HL)        ; Otherwise get option byte
  339.     CPL            ; Flip it
  340.     LD    (HL),A        ; Put it back
  341.     RET
  342.  
  343. CMDER3:    INC    HL        ; Skip to next entry in table
  344.     INC    HL
  345.     JR    CMDER1
  346.  
  347. ; Option Command Table
  348.  
  349. OPTTAB:    DEFB    ' '        ; Skip blanks
  350.     DEFW    OPTS
  351.     DEFB    'A'        ; Archive mode
  352.     DEFW    ARCHIV
  353.     DEFB    'E'        ; Exist test
  354.     DEFW    EXIST
  355.     DEFB    'I'        ; Inspect
  356.     DEFW    INSP
  357.     DEFB    'M'        ; Multiple copy
  358.     DEFW    NCOPY
  359.     DEFB    'N'        ; No copy if file already on dest.
  360.     DEFW    NOREPL
  361.     DEFB    'Q'        ; Quiet
  362.     DEFW    QUIET
  363.     DEFB    'S'        ; System Exclude
  364.     DEFW    SYSEXC
  365.     DEFB    'V'        ; Verify
  366.     DEFW    VERFLG
  367.     DEFB    'X'        ; Remove Source after copy
  368.     DEFW    XMOVE
  369.     DEFB    'R'        ; Copy ONLY if Dest. Exists
  370.     DEFW    REPLAC
  371.     DEFB    'O'        ; Existence test for R/O files
  372.     DEFW    EXRO
  373.     DEFB    0        ; End of table
  374.  
  375. ; Invalid Option Char --  Adjust Stack and Print Help
  376.  
  377. OHELP:    LD    A,(QUIET)
  378.     OR    A
  379.     LD    A,7
  380.     CALL    Z,COUT        ; Beep if not muzzled
  381.     CALL    EPRINT
  382.     DEFB    CR,LF,'Option error!',CR,LF,0
  383.  
  384. ; Print Help Message  (NOTE: DUSER set correctly by the time we get here)
  385.  
  386. MHELP:    CALL    EPRINT
  387.     DEFB    CR,LF,'Syntax:'
  388.     DEFB    CR,LF,'  ',0
  389.     CALL    COMNAM        ; "COPY" or EFCB name
  390.     CALL    EPRINT
  391.     DEFB    ' dir:[filename.typ]=[dir:]filename.typ,... [/]o...'
  392.     DEFB    CR,LF,TAB,TAB,'(or)'
  393.     DEFB    CR,LF,'  ',0
  394.     CALL    COMNAM        ; "COPY" or EFCB name
  395.     CALL    EPRINT
  396.     DEFB    ' [dir:]filename.typ dir:[filename.typ],... [/]o...'
  397.     DEFB    CR,LF,TAB,TAB,'(or)'
  398.     DEFB    CR,LF,'  ',0
  399.     CALL    COMNAM        ; "COPY" or EFCB name
  400.     CALL    EPRINT
  401.     DEFB    ' [dir:]filename.typ,... /o...'
  402.     DEFB    CR,LF,TAB,'(Copies to ',0
  403.  
  404.     LD    BC,(DUSER)    ; get default destination DU:
  405.     CALL    PRNDU        ; ..print it
  406.     INC    B        ; make drive one based for this
  407.     LD    A,(Z3EADR+1)    ; Do we have a valid ENV?
  408.     OR    A
  409.     CALL    NZ,DUNDR    ; Check for NDR for this one if ENV Ok
  410.     JR    Z,GOTBAK    ; ..jump if no ENV or Name
  411.     INC    HL        ; point to name
  412.     CALL    PRNNAM        ; ..and print up to 8 chars
  413.  
  414. GOTBAK:    CALL    EPRINT
  415.     DEFB    ')'
  416.     DEFB    CR,LF,'Options:'
  417.     DEFB    CR,LF,'  A -- ',0  ; Copy only Non-Archive?
  418.     LD    A,(ARCHIV)
  419.     OR    A
  420.     CALL    NZ,SAYNO    ; ..FF is No copy if archived
  421.     CALL    EPRINT
  422.     DEFB    'Archive Bit Control'
  423.     DEFB    CR,LF,'  E -- ',0
  424.     LD    A,(EXIST)
  425.     OR    A
  426.     CALL    NZ,SAYNO
  427.     CALL    EPRINT
  428.     DEFB    'Existence Test'
  429.     DEFB    CR,LF,'  I -- ',0
  430.     LD    A,(INSP)
  431.     OR    A
  432.     CALL    NZ,SAYNO
  433.     CALL    EPRINT
  434.     DEFB    'Inspect Files'
  435.     DEFB    CR,LF,'  M -- ',0
  436.     LD    A,(NCOPY)
  437.     OR    A
  438.     CALL    NZ,SAYNO
  439.     CALL    EPRINT
  440.     DEFB    'Multiple Copy'
  441.     DEFB    CR,LF,'  N -- NO Copy if Destination Exists'
  442.     DEFB    CR,LF,'  O -- ',0
  443.     LD    A,(EXRO)
  444.     OR    A
  445.     CALL    NZ,SAYNO
  446.     CALL    EPRINT
  447.     DEFB    'Existence test - R/O files'
  448.     DEFB    CR,LF,'  Q -- ',0
  449.     LD    A,(QUIET)
  450.     OR    A
  451.     CALL    NZ,SAYNO
  452.     CALL    EPRINT
  453.     DEFB    'Quiet'
  454.     DEFB    CR,LF,'  R -- ',0
  455.     LD    A,(DREPL)
  456.     OR    A
  457.     CALL    NZ,SAYNO
  458.     CALL    EPRINT
  459.     DEFB    'Replace Only Files existing'
  460.     DEFB    CR,LF,'  S -- ',0
  461.     LD    A,(SYSEXC)
  462.     OR    A
  463.     CALL    NZ,SAYNO
  464.     CALL    EPRINT
  465.     DEFB    'System Files excluded'
  466.     DEFB    CR,LF,'  V -- ',0
  467.     LD    A,(VERFLG)
  468.     OR    A
  469.     CALL    NZ,SAYNO
  470.     CALL    EPRINT
  471.     DEFB    'Verify'
  472.     DEFB    CR,LF,'  X -- Delete Source After Copy',CR,LF
  473.     DEFB    LF,'NOTES: "R" and/or "A" turns off "N", "M" turns off "X"',0
  474.     JR    RETSYS        ; Return to Command Processor
  475.  
  476. SAYNO:    CALL    EPRINT
  477.     DEFB    'NO ',0
  478.     RET
  479.  
  480. ; **** MCOPY of COMMAND LINE ****
  481.  
  482. MCOPY0:    LD    SP,STACK    ; Reset the Stack
  483.     LD    A,(DOSTYP)    ; Check Dos type
  484.     SUB    'R'        ; Is it ZRDOS?
  485.     JR    NZ,NOTZRD    ; ..jump if not
  486.     LD    HL,(Z3EADR)
  487.     LD    DE,07EH
  488.     ADD    HL,DE        ; Point HL at PUBLIC bytes
  489.     LD    E,(HL)        ; Get first PUBLIC byte in E
  490.     LD    (HL),A        ; Replace with a zero
  491.     INC    HL        ; Point to second byte
  492.     LD    D,(HL)        ; Get into D
  493.     LD    (HL),A        ; Replace with a zero
  494.     LD    (PUBS),DE    ; Save for exit
  495.  
  496. NOTZRD:    CALL    COPY        ; Do the copy
  497. CPM:    LD    DE,(PUBS)
  498.     LD    A,E
  499.     OR    D
  500.     JR    Z,NOPUB
  501.     LD    HL,(Z3EADR)
  502.     LD    BC,07EH
  503.     ADD    HL,BC
  504.     LD    (HL),E
  505.     INC    HL
  506.     LD    (HL),D
  507. NOPUB:    CALL    GETUD        ; Restore the entry DU condition
  508. RETSYS:    LD    SP,(STACK)    ; Reset stack
  509.     RET            ; Return to opsys
  510.  
  511. ; **** Begin Multiple Copy Procedure ****
  512.  
  513. COPY:    LD    A,(NCOPY)    ; Are we doing multiple copies?
  514.     OR    A
  515.     JR    Z,NOPAUS    ; ..jump if not
  516.     CALL    EPRINT
  517.     DEFB    CR,LF,' ...Any key starts copy, ^C Quits - ',0
  518.     CALL    GETCH        ; Get response in Uppercase
  519.     CALL    CRLF        ; Go to New Line
  520.     CP    CTRLC        ; Is it an abort request (^c)?
  521.     RET    Z        ; ..exit here if so
  522. NOPAUS:    LD    HL,(MFPTR)    ; Pt to first file name
  523.     LD    (NXTPTR),HL    ; Set ptr to next file name
  524.     XOR    A        ; A=0
  525.     LD    (VERCNT),A    ; Zero error count
  526.     LD    (NORST),A    ; Clear "no reset" flag
  527.  
  528. ; **** Main Copy Loop ****
  529.  
  530. MCOPY:    LD    HL,(NXTPTR)    ; Get ptr to next file name
  531.     LD    A,(HL)        ; Get first char
  532.     CP    ' '+1        ; Done if <sp> or less
  533.     JR    NC,MCOPY1    ; Continue with procedure
  534.  
  535. ; MCOPY of File Specs is now done
  536. ; Done with Copy Procedure -- Continue?
  537.  
  538. COPYT:    LD    A,(VERFLG)    ; Verify?
  539.     OR    A        ; 0=no
  540.     JR    Z,COPYT1
  541.     CALL    EPRINT        ; New line & a blank
  542.     DEFB    CR,LF,' ',0
  543.     LD    A,(HAVFIL)    ; Did we do anything?
  544.     OR    A
  545.     JR    Z,COPYT1    ; ..jump if not
  546.     LD    A,(VERCNT)    ; Get error count
  547.     CALL    PAFDC        ; Print as decimal
  548.     CALL    EPRINT
  549.     DEFB    ' Errors',0
  550. COPYT1:    LD    A,(NCOPY)    ; Multiple copies?
  551.     OR    A        ; 0=no
  552.     RET    Z
  553.     JR    COPY        ; Copy again from the beginning
  554.  
  555. ; Begin Copy of File Group
  556.  
  557. MCOPY1:    CP    ','        ; Skip comma separator if there
  558.     JR    NZ,MCPY0
  559.     INC    HL        ; Pt to char after comma
  560. MCPY0:    PUSH    HL        ; Preserve regs
  561.     LD    B,11
  562.     LD    HL,(FCBD)    ; Clear dest FileName
  563.     INC    HL
  564. INITLZ:    LD    (HL),' '
  565.     INC    HL
  566.     DJNZ    INITLZ        ; ..loop til done
  567.     POP    HL        ; Restore input pointer
  568.     LD    A,(HL)        ; Get next char
  569.     CP    ' '+1        ; Check for error
  570.     JP    C,FORMERR
  571.     CALL    GETUD        ; Return home
  572.     LD    DE,(FCBS)    ; Pt to source FCB
  573.     XOR    A
  574.     CALL    ZPRSFN        ; Extract file name data
  575.     CALL    DUCVRT        ; Convert DU into BC
  576.     LD    A,(HL)        ; Get delimiter
  577.     CP    ','        ; End of element?
  578.     JR    Z,MCOPY2    ; Form is dirs:fn.ft
  579.     CP    '='        ; If '=', we have a new disk/user
  580.     JR    Z,NEWDU
  581.     CP    ' '        ; Test for reversed syntax
  582.     JR    NZ,MCOPY2    ; Nope, default b/u dest.
  583.     INC    HL        ; Point to dest. DU:/DIR:
  584.     LD    A,(HL)        ; One more end-of-element test
  585.     CP    ','
  586.     JR    Z,MCOPY2
  587.     CP    ' '+1        ; Invalid char. test
  588.     JP    C,FORMERR
  589.     PUSH    BC        ; Save parsed DU in BC
  590.     LD    DE,(FCBD)    ; Set Destination FCB
  591.     XOR    A
  592.     CALL    ZPRSFN        ; Extract file name data
  593.     CALL    DUCVRT        ; Convert DU into BC
  594.     LD    (DUSER),BC    ; Poke as dest.
  595.     POP    BC        ; Get back src. DU
  596.     JR    MCOPY2        ; and proceed..
  597.  
  598. ; Form is DIRD:=DIRS:FN.FT, So set Dest Disk/User
  599.  
  600. NEWDU:    LD    (DUSER),BC
  601.     PUSH    HL        ; Preserve regs
  602.     PUSH    BC
  603.     LD    DE,(FCBD)    ; ..and copy Source to dest
  604.     LD    HL,(FCBS)
  605.     LD    BC,12
  606.     LDIR
  607.     POP    BC        ; Restore entry regs
  608.     POP    HL
  609.  
  610. ; Now derive DIRS:FN.FT Form after the '='
  611.  
  612.     INC    HL        ; Pt to char beyond '='
  613.     LD    A,(HL)        ; Get char
  614.     CP    ' '+1        ; Format error?
  615.     JP    C,FORMERR
  616.     LD    DE,(FCBS)    ; Load FCB
  617.     XOR    A
  618.     CALL    ZPRSFN        ; Get source name
  619.     CALL    DUCVRT        ; Convert to DU in BC
  620.  
  621. ; Save ptr to next char after DIRS:FN.FT, and set source Disk/User
  622.  
  623. MCOPY2:    LD    (NXTPTR),HL    ; Save ptr to next char
  624.     LD    (SUSER),BC
  625.  
  626.     LD    HL,(FCBD)    ; Check for dest renaming
  627.     LD    A,' '        ; ..by looking for spaces
  628.     CALL    SCAN11
  629.     SUB    11        ; Sub no entry cnt fm space
  630.     LD    (RENFLG),A    ; ..and save as flag
  631.     JR    Z,CKSAMU    ; Jump if not renaming
  632.     LD    HL,(FCBD)    ; Check for ambiguous dest fn
  633.     CALL    SCANQQ        ; ..by counting "?"s
  634.     JP    NZ,AMBERR    ; ..jump error if ambiguous
  635.     LD    HL,(FCBS)    ; Check for ambiguous source
  636.     CALL    SCANQQ        ; ..by counting "?"s
  637.     JP    NZ,AMBERR    ; ..jump Error if ambiguous
  638.     JR    MCPYOK        ; Else jump to Ok procedure
  639.  
  640. CKSAMU:    LD    BC,(SUSER)    ; Get Source DU
  641.     LD    HL,(DUSER)    ; ..and Dest DU
  642.     OR    A
  643.     SBC    HL,BC        ; Dest dir must not equal source dir
  644.     JR    NZ,MCPYOK    ; Not same, say its ok to go
  645.     CALL    EPRINT
  646.     DEFB    CR,LF,'Src=Dest Err',0
  647.     JP    SETEFLAG    ; Set Error flag & exit
  648.  
  649. MCPYOK:    LD    A,(ARCHIV)    ; Are we in Archival mode?
  650.     OR    A
  651.     JR    Z,COPYAA    ; ..jump if not
  652.     CALL    EPRINT        ; Print archiving msg
  653.     DEFB    CR,LF,'Archiving ',0
  654.     JR    COPYBB
  655.  
  656. COPYAA:    CALL    EPRINT
  657.     DEFB    CR,LF,'Copying ',0
  658. COPYBB:    CALL    PRTS2D        ; Print "Source to Dest" msg
  659.     LD    C,13        ; Prepare to Reset disk system
  660.     LD    A,(NORST)    ; Is this first copy operation?
  661.     OR    A
  662.     CALL    Z,BDOSE        ; Do reset if so
  663.     CALL    DFLTAD        ; Set to default DMA addr
  664.     CALL    SETSR0        ; Log Source, Set FCB & Init it
  665.     LD    HL,(FREEBUF)    ; Pt to buffer area
  666.     LD    A,(TYPDAT)    ; Get the Type of Dates to get in source
  667.     AND    00001B        ; ..saving just LSB
  668.     LD    C,A        ; Put in secondary select register
  669.     LD    A,(SYSEXC)
  670.     OR    A
  671.     LD    A,0C0H        ; Select non-sys and sys files
  672.     JR    Z,SYSOK
  673.     LD    A,080H        ; Select non-sys only (if NZ)
  674. SYSOK:    LD    (NORST),A    ; Store a non-zero so we won't reset again
  675.     CALL    DDIRQ        ; Load dir, select files, sort, etc
  676.     JP    Z,TPAOVFL    ; Tpa overflow error?
  677.     LD    A,B        ; Do we have any files?
  678.     OR    C
  679.     JR    Z,SYSOK0    ; Jump if No files
  680.     CALL    CHKXCL        ; Check for excluded files
  681.     LD    A,(ARCHIV)    ; Copy only Non-Archived Files?
  682.     OR    A
  683.     CALL    NZ,SELARC    ; ..reselect directory if so
  684.     LD    A,B        ; And see if any remain selected
  685.     OR    C
  686.     JR    NZ,MCPY24    ; ..jump if so
  687. SYSOK0:    LD    (NORST),A    ; Clear flag - disk reset before next copy
  688.     CALL    SETEFLAG    ; Set Error flag
  689.     CALL    EPRINT
  690.     DEFB    CR,LF,' NO Files -- ^C to Abort ',0
  691.     CALL    GETCH        ; Get response
  692.     CP    CTRLC        ; Abort?
  693.     JP    Z,COPYT        ; End test
  694.     JP    MCOPY        ; Continue with next
  695.  
  696. MCPY24:    LD    A,(INSP)    ; Inspect files?
  697.     OR    A        ; 0=No
  698.     CALL    NZ,INSPF    ; Inspect files if option selected
  699.     LD    A,B        ; Did we select any files?
  700.     OR    C
  701.     LD    (HAVFIL),A
  702.     JR    Z,SYSOK0    ; ..jump if not
  703.     PUSH    HL        ; Save ptr and count
  704.     PUSH    BC
  705.     LD    DE,ESIZE    ; Skip to end of loaded files and mark..
  706.                 ; ..start of Work area
  707. MCPY25:    ADD    HL,DE        ; Pt to next
  708.     DEC    BC        ; Count down
  709.     LD    A,B        ; Done?
  710.     OR    C
  711.     JR    NZ,MCPY25
  712.  
  713. ; ..a better way to size the copy buffer would be to examine the alloc
  714. ;  size of the source and target disks and use n*maxalc for buffer 
  715. ;  size, where n is adjusted to the amount of free memory available.
  716.  
  717.     LD    (WORKBF),HL    ; Save ptr to beginning of work buffer
  718.     INC    H        ; Round buffer to page boundry
  719.     CALL    GETTOP        ; Get Page of lowest OS component in A
  720.     SUB    H        ; Compute size of buffer area
  721.     JP    C,TPAOVFL    ; Abort if not enough tpa
  722.     LD    L,PLIM        ; Set page limit
  723.     CP    L        ; PLIM pages left?
  724.     JR    C,PAGOK        ; If smaller than PLIM, use it
  725.     LD    A,L        ; Otherwise use PLIM (why PLIM?)
  726. PAGOK:    ADD    A,A        ; Convert to # records
  727.     JR    NC,PAGOK0    ; ..jump if less than 256 records
  728.     LD    A,0FFH        ; Else set to 255 record limit
  729. PAGOK0:    LD    (PAGLIM),A    ; Set page limit
  730.     POP    BC        ; Restore ptrs
  731.     POP    HL
  732.  
  733. ; Main Copying Loop
  734. ;   File names are pted to by HL and BC=Number of Files
  735.  
  736. MCPY26:    XOR    A        ; Clear the Verify error flag
  737.     LD    (CPYERR),A
  738.     PUSH    HL        ; Save regs
  739.     PUSH    BC
  740.     CALL    ABORTCK        ; Check for abort
  741.     XOR    A        ; Set flag for replacement abort check
  742.     LD    (REPLCK),A
  743.     LD    A,(TIMTYP)    ; Can we do date stamping?
  744.     LD    (DSFLAG),A    ; Set indicator accordingly
  745.     CALL    MCOPYX        ; Copy Source (HL) to Dest using work buffer
  746.     CALL    PRDONE        ; Print done message
  747.     LD    A,(REPLCK)    ; Did we abort a replace request?
  748.     OR    A
  749.     JR    Z,MCPY28    ; ..bypass messages if so
  750.     LD    A,(DSFLAG)    ; Is DS function alive?
  751.     OR    A
  752.     JR    Z,NODATE    ; If not, no DS msg
  753.     LD    A,(QUIET)
  754.     OR    A        ; Are we operating Quietly?
  755.     JR    NZ,NODATE    ; ..jump and don't print if Quiet
  756.     CALL    EPRINT
  757.     DEFB    ' (Dated)',0
  758. NODATE:    CALL    ABORTCK        ; Check for abort
  759.     LD    A,(LSTCPY)    ; Last file copied?
  760.     OR    A        ; 0=no
  761.     LD    A,(VERFLG)    ; Verify?
  762.     JR    Z,MCPY28
  763.     OR    A        ; 0=no
  764.     CALL    NZ,MCOPYV    ; Do verify if active
  765.  
  766.     LD    A,(XMOVE)    ; Should we erase source file?
  767.     OR    A
  768.     JR    Z,MCPY28    ; ..jump error msg if not
  769.     LD    A,(CPYERR)    ; Was there an error in Verify?
  770.     OR    A
  771.     JR    NZ,MCPY28    ; ..don't erase if so
  772.     CALL    SETSR0        ; Log Source, Get FCB & Init it
  773.     LD    HL,9
  774.     ADD    HL,DE
  775.     BIT    7,(HL)        ; See if file is R/O
  776.     JR    NZ,MCPY28    ; Don't delete if R/O
  777.     CALL    F$DELETE    ; Delete the file
  778.     CALL    EPRINT        ; Clue that file erased
  779.     DEFB    ' (X)',0
  780.  
  781. MCPY28:    POP    BC        ; Get regs
  782.     POP    HL
  783.     LD    DE,ESIZE    ; Pt to next file
  784.     ADD    HL,DE        ; Hl pts to next file
  785.     DEC    BC        ; Count down
  786.     LD    A,B
  787.     OR    C
  788.     JR    NZ,MCPY26
  789.     JP    MCOPY        ; Copy next file spec
  790.  
  791. ;.....
  792. ; Copy Source file pted to by HL to Destination
  793.  
  794. MCOPYX:    XOR    A        ; Set no copy of last file
  795.     LD    (LSTCPY),A    ; Set flag
  796.  
  797.     LD    A,(RENFLG)    ; Are we renaming?
  798.     OR    A        ; ..set flags
  799.     LD    DE,(FCBD)    ; Set Destination FCB
  800.     LD    B,12
  801.     CALL    Z,MOVEB        ; Move Drive Name&Typ if not
  802.     LD    DE,(FCBS)    ; Set Source FCB
  803.     CALL    MOVEB
  804.     LD    BC,FNSIZE    ; Offset to Stamp starting addr
  805.     ADD    HL,BC
  806.     LD    (SRCTD),HL    ; ..and save
  807.     CALL    SETDS0        ; Set Dest FCB & Init it
  808.     LD    H,D        ; Copy FCB ptr to HL
  809.     LD    L,E
  810.     LD    B,11
  811. CLRATT:    INC    HL        ; Bump to next filename character
  812.     RES    7,(HL)        ; Clear attribute bit
  813.     DJNZ    CLRATT
  814.     CALL    DFLTAD        ; Limit "E5" schmutz to 80H-FFH
  815.     LD    C,17
  816.     CALL    BDOS        ; Search for the file
  817.     INC    A        ; Was it found?
  818.     LD    H,A        ; Save the flag in H
  819.     LD    A,(REPLAC)    ; Are we replacing existing?
  820.     OR    A
  821.     LD    A,H        ; ..preparing found test
  822.     JR    Z,NOTX00    ; ..jump if no replace
  823.     OR    A        ; Found?
  824.     RET    Z        ; ..return if no file
  825.  
  826. NOTX00:    CALL    EPRINT
  827.     DEFB    CR,LF,' -> ',0
  828.     INC    DE        ; Point to first char of FileName
  829.     CALL    PFN1        ; ..and print
  830.     DEC    DE        ; Back up to Drive byte
  831.     LD    A,H        ; Retrieve flag
  832.     DEC    A        ; Was file found?
  833.     JP    M,FNF        ; ..jump if File not found (0ffh)
  834.     RRCA            ; Convert directory code to offset in buffer
  835.     RRCA
  836.     RRCA
  837.     ADD    A,BUFF+9    ; Point to T1 (R/O)
  838.     LD    L,A
  839.     LD    H,0
  840.     LD    A,(HL)
  841.     AND    80H        ; Isolate R/O bit
  842.     LD    (ROFLG),A    ; Save as a flag
  843.     LD    B,A        ; Stash in B for a moment
  844.     LD    A,(EXRO)    ; Get R/O exist test flag
  845.     AND    B        ; And with R/O status
  846.     LD    B,A        ; Save result
  847.     LD    A,(EXIST)    ; Now get exist test flag
  848.     OR    B        ; Or with previous result
  849.     LD    (RPQFLG),A    ; RPQFLG = ((EXRO AND ROFLG) OR EXIST)
  850.     LD    A,(NOREPL)    ; Don't copy if already there?
  851.     OR    A        ; 0=copy anyway
  852.     JR    NZ,FFND        ; ..jump & check file found by PUBlic if so
  853. ISX00:    LD    A,(QUIET)    ; Are we operating Quietly?
  854.     OR    A
  855.     JR    NZ,FFND        ; ..jump to bypass messages if so
  856.     PUSH    DE
  857.     LD    HL,DESTTD    ; Get Timestamp here
  858.     CALL    GETSTMP        ; .using DSLIB function
  859.     POP    DE
  860.     CALL    EPRINT
  861.     DEFB    '  Replac',0
  862.     LD    HL,SUFFX1    ; Assume ?e are prompting for overwrite
  863.     LD    A,(RPQFLG)    ; ..now test our assumption
  864.     OR    A
  865.     JR    NZ,EXIST0    ; Jump if we want to pause
  866.     LD    HL,SUFFX2    ; ..else print "ing"
  867. EXIST0:    CALL    EPSTR
  868.     LD    A,(DSFLAG)    ; Are we still using Stamps?
  869.     OR    A
  870.     JR    Z,FFND        ; ..jump if not
  871.     PUSH    DE        ; Save FCB
  872.     LD    HL,(SRCTD)    ; Get the vector to source Stamps
  873.     CALL    CHKDAT        ; Set Mod/Create Date & check valid
  874.     JR    Z,UNDAT        ; ..print Undated if No date
  875.     EX    DE,HL        ; Put Source Date addr in DE
  876.     LD    HL,DESTTD    ; Set Dest date & check validity
  877.     CALL    CHKDAT
  878.     JR    Z,UNDAT        ; ..print Undated if No date
  879.     LD    B,5        ; ..for 5 bytes
  880. CTDLP:    LD    A,(DE)
  881.     CP    (HL)        ; Are they the same?
  882.     JR    C,NEWER        ; .jump here if Newer version
  883.     JR    NZ,OLDER    ; ..jump here if Older version
  884.     INC    HL        ; Else
  885.     INC    DE        ; .bump ptrs cause same
  886.     DJNZ    CTDLP        ; ..and loop til done (Same)
  887.     CALL    EPRINT
  888.     DEFB    'Same',0
  889.     JR    DATEX        ; Rejoin code
  890.  
  891. NEWER:    CALL    EPRINT
  892.     DEFB    'Newer',0
  893.     JR    DATEX
  894.  
  895. OLDER:    CALL    EPRINT
  896.     DEFB    'Older',0
  897.     JR    DATEX
  898.  
  899. UNDAT:    CALL    EPRINT
  900.     DEFB    'Undated',0
  901. DATEX:    POP    DE        ; Restore FCB
  902.  
  903. FFND:    LD    A,(ROFLG)
  904.     OR    A        ; Was file R/O
  905.     JR    Z,NORO        ; Jump if not
  906.     CALL    EPRINT
  907.     DEFB    ' R/O',0
  908. NORO:    LD    HL,7        ; Offset to PUBlic/Path bit
  909.     ADD    HL,DE
  910.     BIT    7,(HL)        ; Was it found via Public or Path?
  911.     JR    Z,NOTPUB    ; ..jump if not
  912.     CALL    EPRINT        ; Else print additional prompt
  913.     DEFB    ' (Public)',0
  914. NOTPUB:    LD    A,(NOREPL)    ; Are we in a No Replacement mode?
  915.     OR    A
  916.     JR    Z,FFND0        ; Jump if not
  917.     CALL    EPRINT
  918.     DEFB    ' Can''t!',0
  919.     RET            ; Return with no action (no replace)
  920.  
  921. FFND0:    LD    A,(RPQFLG)    ; Do we need to propt user?
  922.     OR    A
  923.     JR    Z,EAT1        ; Jump if not to copy
  924.     CALL    EPRINT
  925.     DEFB    ' (Y/[N])? ',0
  926.     CALL    GETCH        ; Get response
  927.     CP    CR        ; Yes?
  928.     CALL    NZ,COUT        ; ..echo if Not CR
  929.     CP    'Y'        ; Is it an explicit Yes?
  930.     RET    NZ        ; ..return if no replace
  931.  
  932. EAT1:    LD    A,(ROFLG)    ; Is this an R/O file?
  933.     OR    A
  934.     JR    Z,EAT1A        ; No need to set attributes if not
  935.     LD    HL,9        ; Offset to R/O attribute
  936.     ADD    HL,DE
  937.     RES    7,(HL)
  938.     CALL    DOATTR        ; Make file R/W
  939. EAT1A:    CALL    F$DELETE    ; ..and delete it
  940. FNF:    CALL    EPRINT
  941.     DEFB    '..',0
  942.     LD    A,0FFH        ; Set copy of last file
  943.     LD    (LSTCPY),A    ; Set flag
  944.     LD    (REPLCK),A    ; ..and another to show No Replacement Abort
  945.     CALL    INITFCB        ; Insure clean FCB
  946.     CALL    F$MAKE        ; Create new file
  947.     INC    A        ; Check for full directory
  948.     JP    Z,DIRFUL    ; Report it
  949.  
  950. ; Open Source File in prep for Copy
  951.  
  952.     CALL    CRC3CLR        ; Clear CRC value in case we're verifying
  953.     CALL    SETSR0        ; Log Source, Initialize & Set FCB
  954.     CALL    F$OPEN        ; Open file
  955.  
  956. ; This loop, which starts at MCPYX, Copies the file from Source to Dest
  957.  
  958. MCPYX:    CALL    SETSRC        ; Log Source & Set Src FCB
  959.     LD    HL,(WORKBF)    ; Pt to buffer to copy into
  960.     CALL    LOAD        ; Load file into workbf
  961.     LD    A,(BCNT)    ; If count=0, then done
  962.     OR    A
  963.     JR    Z,MC2DONE
  964.  
  965. ; Copy to Disk
  966.  
  967.     CALL    LOGD        ; Log in destination
  968.     LD    HL,(WORKBF)    ; Pt to buffer
  969. MCPYD1:    CALL    SETDMA        ; Set dma address pted to by HL
  970.     LD    DE,128        ; Incr HL by 128
  971.     ADD    HL,DE        ; HL pts to next block
  972.     LD    DE,(FCBD)    ; Write to destination file
  973.     CALL    F$WRITE
  974.     OR    A        ; Ok?
  975.     JP    NZ,MCPYDERR
  976.  
  977. ; Count down to next block
  978.  
  979.     LD    A,(BCNT)    ; Get block count
  980.     DEC    A        ; Count down
  981.     LD    (BCNT),A
  982.     JR    NZ,MCPYD1
  983.     LD    A,(CONT)    ; Continue?
  984.     OR    A        ; Cont if not zero
  985.     JR    NZ,MCPYX
  986.  
  987. ; End of Copy Loop
  988.  
  989. MC2DONE: CALL    SETSRC        ; Log source & Set FCB
  990.     CALL    F$CLOSE
  991.  
  992.     CALL    SETDST        ; Log Dest & Set FCB
  993.     CALL    F$CLOSE
  994.  
  995.     PUSH    DE
  996.     LD    HL,TMPTIM    ; Set Addr for Date & Time
  997.     CALL    RCLOCK        ; Attempt a clock read
  998.     JR    NZ,NOCLOK    ; ..jump if not good read
  999.  
  1000.     LD    HL,(SRCTD)    ; Set source TD
  1001.     LD    DE,5        ; ..offset to Last Access
  1002.     ADD    HL,DE
  1003.     EX    DE,HL        ; Put in DE reg for dest
  1004.     LD    HL,TMPTIM    ; Point to source tim & dat
  1005.     LD    BC,5        ; Move 5 bytes
  1006.     LDIR
  1007. NOCLOK:    POP    DE
  1008.     PUSH    DE        ; ..save pointer for attr set
  1009.     CALL    INITFCB        ; Initialize FCB to start
  1010.     LD    HL,(SRCTD)    ; Get addr of New file's Stamp
  1011.     CALL    PUTSTMP        ; Attempt Put Stamp to Disk
  1012.     CALL    CRC3DONE    ; Get CRC value in case Verifying
  1013.     LD    (CRCVAL),HL    ; Save CRC value or junk if Not Verifying
  1014.             ;..fall thru, set Attr of Dest to those of Source
  1015.     LD    DE,(FCBS)    ; Source FCB contains orig attributes
  1016.     INC    DE        ; Point to 1st attr
  1017.     LD    HL,(FCBD)    ; Get destination FCB
  1018.     INC    HL        ; ..and pt to 1st attr
  1019.     LD    C,0        ; Clear C. Will have count of attributes set
  1020.     CALL    CKATTR        ; Check/Set 1st attr
  1021.     INC    DE        ; Go to Attr F3
  1022.     INC    HL
  1023.     LD    B,8        ; Do 8 and end at Archive
  1024. CKATTL:    CALL    CKATTR        ; Do a bit/byte
  1025.     DJNZ    CKATTL        ; ..and loop til done
  1026.     POP    DE        ; ...restore FCB pointer
  1027.     LD    A,C        ; Any Attributes Set?
  1028.     OR    A
  1029.     CALL    NZ,DOATTR    ; Set the attributes if any need setting
  1030.     LD    A,(ARCHIV)    ; Are we in Archiving Mode?
  1031.     OR    A
  1032.     RET    Z        ; ..return if not
  1033.     CALL    SETSRC        ; Log source & Set FCB
  1034.     LD    HL,11        ; Else offset to Archive Bit
  1035.     ADD    HL,DE
  1036.     SET    7,(HL)        ; ..and Show that it has been Archived
  1037. DOATTR:    CALL    INITFCB        ; Init FCB pted to by DE
  1038.     LD    C,30        ; Set file attributes
  1039.     JP    BDOS        ; MCOPYX returns to caller via BDOS
  1040.  
  1041. ; Little routine to help with attribute setting
  1042.  
  1043. CKATTR:    LD    A,(DE)        ; Get source byte
  1044.     RLA            ; ..and test attr
  1045.     JR    NC,CKATT0    ; Jump if not set
  1046.     SET    7,(HL)        ; ..else set dest attr
  1047.     INC    C        ; ..and count it
  1048. CKATT0:    INC    DE        ; Advance to next byte
  1049.     INC    HL
  1050.     RET
  1051.  
  1052. ;.....
  1053. ; Check validity of Mod/Create dates
  1054. ; Enter: HL --> Create Date in std datespec
  1055. ; Exit : HL --> Valid Mod/Create date field, or Create field if invalid
  1056. ;     AF = A=0, Zero flag set (Z) if invalid
  1057. ;        A <> 0, Zero Flag Clear (NZ) if date valid
  1058.  
  1059. CHKDAT:    PUSH    DE        ; Preserve other regs
  1060.     EX    DE,HL        ; Put Create date addr in DE
  1061.     LD    HL,10        ; Set offset to Modify field
  1062.     ADD    HL,DE        ; ..and offset to Modify Date
  1063.     LD    A,(HL)        ; Is it valid?
  1064.     INC    HL
  1065.     OR    (HL)        ; Or Year and Month
  1066.     DEC    HL        ; ..back up to Year
  1067.     JR    NZ,CHKDA0    ; Jump if Date valid
  1068.     EX    DE,HL        ; ..else put Create date addr in HL
  1069.     LD    A,(HL)        ; Check validity
  1070.     INC    HL
  1071.     OR    (HL)
  1072.     DEC    HL
  1073. CHKDA0:    POP    DE        ; Restore regs
  1074.     RET            ; ..with flags set
  1075.  
  1076. ;.....
  1077. ; Convert Z3 FCB DU into DU in BC
  1078.  
  1079. DUCVRT:    PUSH    HL        ; Save regs
  1080.     PUSH    DE
  1081.     LD    A,(DE)        ; Get disk
  1082.     OR    A        ; Current?
  1083.     JR    NZ,DUCV1
  1084.     LD    A,(CDISK)    ; Get current
  1085.     INC    A        ; Add 1 for a=1
  1086. DUCV1:    DEC    A        ; A=0
  1087.     LD    B,A
  1088.     LD    HL,13        ; Offset to user
  1089.     ADD    HL,DE
  1090.     LD    C,(HL)        ; Get user
  1091.     POP    DE        ; Restore regs
  1092.     POP    HL
  1093.     RET
  1094.  
  1095. ; Format Error
  1096.  
  1097. FORMERR: CALL    EPRINT
  1098.     DEFB    CR,LF,' Error: ',0
  1099.     JP    EPSTR        ; Print error & return
  1100.  
  1101. ; TPA Overflow
  1102.  
  1103. TPAOVFL: CALL    EPRINT
  1104.     DEFB    CR,LF,'TPA Ovfl',0
  1105.     JR    BADCOPY
  1106.  
  1107. ; Write Error
  1108.  
  1109. MCPYDERR: CALL    EPRINT
  1110.     DEFB    CR,LF,'Disk Full or Write Error !',0
  1111.     CALL    SETDST        ; Log in Dest & Set FCB
  1112.     CALL    F$CLOSE        ; ..and close the file
  1113.     CALL    INITFCB        ; Initialize the FCB
  1114.     CALL    F$DELETE    ; ...then Kill it
  1115. BADCOPY: CALL    SETEFLAG    ; Set ZCPR3 Error flag
  1116.     JP    CPM        ; ..and return to OS
  1117.  
  1118. ; Directory Full Error
  1119.  
  1120. DIRFUL:    CALL    EPRINT
  1121.     DEFB    CR,LF,'Directory Full',0
  1122.     JR    BADCOPY
  1123.  
  1124. ;.....
  1125. ; Load Buffer pted to by HL from file whose FCB is pted to by DE
  1126. ;   On Output, BCNT=Number of blocks loaded (up to 128) and
  1127. ;   CONT=0 if Done or 128 if Not Done
  1128.  
  1129. LOAD:    XOR    A        ; A=0
  1130.     LD    (BCNT),A    ; Set block count
  1131.     LD    (CONT),A    ; Turn off continuation flag
  1132.  
  1133. ; Main Copy Loop
  1134.  
  1135. MCPY:    CALL    SETDMA        ; Set DMA to block pted to by HL
  1136.     CALL    F$READ        ; ..and Read block
  1137.     OR    A        ; End of file?
  1138.     RET    NZ        ; ..return if so
  1139.     LD    A,(VERFLG)    ; Doing verify?
  1140.     OR    A        ; ..set flags
  1141.     JR    Z,LOAD1        ; ...jump w/no CRC if No ver
  1142.     PUSH    HL        ; Save ptr to DMA
  1143.     LD    B,128        ; Update CRC for 128 bytes
  1144. MCPYCRC: LD    A,(HL)        ; Get byte
  1145.     CALL    CRC3UPD        ; Update CRC
  1146.     INC    HL        ; Pt to next
  1147.     DJNZ    MCPYCRC        ; ..Count down and loop til done
  1148.     POP    HL        ; Retrieve ptr to DMA
  1149. LOAD1:    LD    BC,128        ; Set # bytes in Sector
  1150.     ADD    HL,BC        ; ..and pt to nxt log sctr
  1151.     LD    A,(BCNT)    ; Get block count
  1152.     INC    A        ; Increment it
  1153.     LD    (BCNT),A    ; ..and store
  1154.     LD    B,A        ; Block count in B
  1155.     LD    A,(PAGLIM)    ; Get page limit (in records)
  1156.     CP    B        ; Buffer full?
  1157.     JR    NZ,MCPY        ; ..loop if not
  1158.     LD    (CONT),A    ; Else set continuation flag
  1159.     RET
  1160.  
  1161. ; Verify Phase
  1162.  
  1163. MCOPYV:    LD    A,(QUIET)    ; Check for quiet
  1164.     OR    A        ; Nz=quiet
  1165.     JR    NZ,MCPYV
  1166.     CALL    EPRINT
  1167.     DEFB    '  Verify..',0
  1168. MCPYV:    CALL    CRC3CLR        ; Clear crck value
  1169.     CALL    SETDS0        ; Log in Dest, Set FCB & Init
  1170.     CALL    F$OPEN        ; Open file
  1171.  
  1172. ; **** Main Verify Loop ****
  1173.  
  1174. VERLOOP: LD    HL,(WORKBF)    ; Load input buffer from destination
  1175.     LD    DE,(FCBD)
  1176.     CALL    LOAD        ; Load and compute CRC value
  1177.     LD    A,(BCNT)    ; Done if no bytes loaded
  1178.     OR    A
  1179.     JR    Z,VERCRC
  1180.     LD    A,(CONT)    ; Continue?
  1181.     OR    A        ; 0=no
  1182.     JR    NZ,VERLOOP
  1183.  
  1184. ; Verify Done
  1185.  
  1186. VERCRC:    CALL    CRC3DONE    ; Update complete, value in HL
  1187.     LD    DE,(CRCVAL)    ; Get old CRC value into DE
  1188.     XOR    A        ; Clears carry flag
  1189.     SBC    HL,DE        ; Compare HL to DE
  1190.     JP    Z,PRDONE    ; Print done msg or fall thru to error msg
  1191.             ;..else fall thru to Verify Error
  1192.     LD    HL,VERCNT    ; Increment error count
  1193.     INC    (HL)
  1194.     CALL    EPRINT
  1195.     DEFB    ' ..Bad',0
  1196.     LD    A,0FFH        ; Set flag to show error in Verify
  1197.     LD    (CPYERR),A
  1198. SETEFLAG:
  1199.     LD    A,(NOMSGS)    ; Set error flag if there
  1200.     OR    A        ; Is a message buffer
  1201.     RET    NZ
  1202.     CPL
  1203.     JP    PUTER2
  1204.  
  1205. ; **** MCOPY Utilities ****
  1206. ;.....
  1207. ; Allow user to inspect files for Copy
  1208. ;   First file name pted to by HL, BC = Number of files
  1209. ;   On Exit, BC = Number of selected files
  1210.  
  1211. INSPF:    CALL    EPRINT
  1212.     DEFB    CR,LF,' Inspect -- '
  1213.     DEFB    'Yes, No (def), Skip Rest',0
  1214.     PUSH    HL        ; Save ptr to first file
  1215.     PUSH    BC        ; Save file count
  1216.     LD    DE,ESIZE    ; Entries are esize bytes apart
  1217. INSPF0:    RES    7,(HL)        ; Clear MSB to mark file for no copy
  1218.     ADD    HL,DE        ; Pt to next
  1219.     DEC    BC        ; Count down
  1220.     LD    A,B        ; Done?
  1221.     OR    C
  1222.     JR    NZ,INSPF0
  1223.     POP    BC        ; Restore and save again
  1224.     POP    HL
  1225.     PUSH    HL
  1226.     PUSH    BC
  1227. INSPF1:    CALL    CRLF        ; New line
  1228.     EX    DE,HL        ; Put FN in DE
  1229.     INC    DE        ; ..and point to Name
  1230.     CALL    PFN1        ; Print it
  1231.     DEC    DE        ; Re-align ptr to file entry
  1232.     EX    DE,HL        ; Restore regs
  1233.     CALL    EPRINT
  1234.     DEFB    ' - (Y/N/S)? ',0
  1235.     CALL    GETCH        ; Get response
  1236.     CALL    COUT        ; Echo
  1237.     CP    'S'        ; Skip?
  1238.     JR    Z,INSPFA
  1239.     CP    'Y'        ; Yes?
  1240.     JR    NZ,INSPF2
  1241.     SET    7,(HL)        ; Mark File
  1242. INSPF2:    LD    DE,ESIZE    ; Pt to next file
  1243.     ADD    HL,DE
  1244.     DEC    BC        ; Count down
  1245.     LD    A,B        ; Done?
  1246.     OR    C
  1247.     JR    NZ,INSPF1
  1248. INSPFA:    POP    BC        ; Get count
  1249.     POP    HL        ; Get ptr to first file
  1250.     JP    DDIRPACK    ; Repack directory
  1251.  
  1252. ;.....
  1253. ; Select only files which do Not have Archive Bit set
  1254. ; Enter:HL --> First name in Directory
  1255. ;    BC = Number of Files
  1256. ; Exit :BC = New Number of Files
  1257. ;    HL --> First name in Directory
  1258.  
  1259. SELARC:    PUSH    HL        ; Save values
  1260.     PUSH    BC
  1261. SELAR0:    RES    7,(HL)        ; Set initially for No Select
  1262.     EX    DE,HL        ; Put file pointer in DE
  1263.     LD    HL,11        ; ..and offset by Archive Bit
  1264.     ADD    HL,DE
  1265.     BIT    7,(HL)        ; Is it already Archived?
  1266.     JR    NZ,SELAR1    ; ..jump if so to bypass
  1267.     LD    L,E        ; Else copy record start to HL
  1268.     LD    H,D
  1269.     SET    7,(HL)        ; ..and select it
  1270. SELAR1:    LD    HL,ESIZE    ; Offset to Next record
  1271.     ADD    HL,DE
  1272.     DEC    BC        ; Decrement count
  1273.     LD    A,B        ; Are we out of records?
  1274.     OR    C
  1275.     JR    NZ,SELAR0    ; ..loop if Not
  1276.     JR    INSPFA        ; Else exit by repacking directory
  1277.  
  1278. ;.....
  1279. ; Delete files from the directory list in the EXCLUDE list
  1280. ; Enter:HL --> First name in Directory
  1281. ;    BC = Number of files
  1282. ; Exit :BC = New number of files
  1283. ;    HL --> First name in Directory
  1284.  
  1285. CHKXCL:    PUSH    HL        ; Save values
  1286.     PUSH    BC
  1287. CHKEX0:    LD    DE,EXCLUD    ; Point to Exclude List
  1288.     CALL    CHKXXX        ; Does it Match?
  1289.     JR    Z,CHKEX1    ; ..jump if so (no select)
  1290.     SET    7,(HL)        ; Else select it
  1291. CHKEX1:    EX    DE,HL        ; Advance to next entry
  1292.     LD    HL,ESIZE
  1293.     ADD    HL,DE
  1294.     DEC    BC        ; Decrement file count
  1295.     LD    A,B        ; Are we out of records?
  1296.     OR    C
  1297.     JR    NZ,CHKEX0    ; ..loop if not
  1298.     JR    INSPFA        ; Else exit by repacking dir
  1299.  
  1300. ; Check current entry against exclude list
  1301.  
  1302. CHKXXX:    PUSH    BC        ; Preserve regs
  1303.     PUSH    HL
  1304. CHKXX0:    INC    HL        ; Step by User #
  1305.     LD    B,11        ; Compare FN and FT
  1306.     LD    A,(DE)        ; Any entry here?
  1307.     CP    ' '        ; ..not if 1st char is space
  1308.     JR    Z,CHKXX2    ; ...jump if no entry
  1309. CHKXX1:    LD    A,(DE)        ; ..char by char
  1310.     CP    '?'        ; Accomodate wildcard char
  1311.     JR    Z,CHKX??    ; ..jump if wild
  1312.     SUB    (HL)        ; Else compare to entry char
  1313.     AND    7FH        ; ...masking MSB
  1314.     JR    NZ,CHKXX2    ; Jump if not equal
  1315. CHKX??:    INC    HL        ; Bump ptrs
  1316.     INC    DE
  1317.     DJNZ    CHKXX1        ; ..loop til all checked
  1318.     XOR    A        ; Clear A in case "?" at end
  1319. CHKXX3:    POP    HL        ; Restore regs..
  1320.     POP    BC        ; ..leaving flags set
  1321.     RET
  1322.  
  1323. CHKXX2:    INC    DE        ; Advance past Exc chars
  1324.     DJNZ    CHKXX2        ; ..and loop til done
  1325.     POP    HL        ; Restore Dir entry ptr
  1326.     PUSH    HL        ; ..keeping it on stack
  1327.     LD    A,(DE)        ; Are we at table end?
  1328.     OR    A
  1329.     JR    NZ,CHKXX0    ; ..check another name if not
  1330.     OR    0FFH        ; Signify no match
  1331.     JR    CHKXX3        ; Else exit here
  1332.  
  1333. ;.....
  1334. ; Log in Source User/Disk
  1335.  
  1336. SETSR0:    LD    DE,(FCBS)    ; Get Source FCB addr
  1337.     CALL    INITFCB        ; ..and Initialize it
  1338.     LD    A,(SDRIVE)    ; Load Source drive byte
  1339.     INC    A        ; ..prepared for FCB drive #
  1340.     LD    (DE),A        ; ...and save
  1341. SETSRC:    LD    DE,(FCBS)    ; Get Source FCB addr again
  1342. LOGS:    LD    BC,(SUSER)
  1343.     JR    LOGDS
  1344.  
  1345. ;.....
  1346. ; Log in Destination User/Disk
  1347.  
  1348. SETDS0:    LD    DE,(FCBD)    ; Get Destination FCB addr
  1349.     CALL    INITFCB        ; ..and Initialize it
  1350. SETDST:    LD    DE,(FCBD)    ; Get Dest FCB addr again
  1351. LOGD:    LD    BC,(DUSER)
  1352. LOGDS:    JP    LOGUD
  1353.  
  1354. ;.....
  1355. ; Check for Abort from Keyboard
  1356.  
  1357. ABORTCK: CALL    CONDIN        ; Conditional input
  1358.     RET    Z
  1359.     CP    CTRLC        ; Abort?
  1360.     RET    NZ        ; ..return if not
  1361.     CALL    EPRINT        ; Else say we are aborting
  1362.     DEFB    CR,LF,'Abort',0
  1363.     JP    CPM        ; ..and qui
  1364.  
  1365. ;.....
  1366. ; Get a character from the keyboard converting to uppercase
  1367.  
  1368. GETCH:    CALL    CIN        ; Get a char
  1369.     JP    CAPS        ; Convert to Uppercase and return
  1370.  
  1371. ;.....
  1372. ; Print Done Message
  1373.  
  1374. PRDONE:    LD    A,(QUIET)    ; Check for quiet
  1375.     OR    A        ; Nz=quiet
  1376.     RET    NZ
  1377.     LD    A,(LSTCPY)    ; Last file copied?
  1378.     OR    A        ; 0 = no
  1379.     JR    NZ,DID
  1380.     LD    A,(NOREPL)    ; Not copied because already there?
  1381.     OR    A        ; Nz = yes
  1382.     RET    Z
  1383.     CALL    EPRINT
  1384.     DEFB    ' Already Present',0
  1385.     RET
  1386.  
  1387. DID:    CALL    EPRINT
  1388.     DEFB    'Ok',0
  1389.     RET
  1390.  
  1391. ;.....
  1392. ; Set DMA Address to Default buffer (80H)
  1393.  
  1394. DFLTAD:    LD    HL,BUFF
  1395.     JP    SETDMA        ; Set it and return
  1396.  
  1397. ;.....
  1398. ; Print error on Ambiguous Rename attempt w/secondary utility ID print
  1399.  
  1400. AMBERR:    CALL    EPRINT
  1401.     DEFB    CR,LF,'Can''t Rename Ambiguously -- ',0
  1402. PRTS2D:    LD    BC,(SUSER)    ; Print Source File ID
  1403.     CALL    PRNDU        ; Print source DU w/":"
  1404.     LD    DE,(FCBS)    ; Print file spec
  1405.     INC    DE        ; Pt to file Name
  1406.     CALL    PFN1        ; ..and print
  1407.     CALL    EPRINT
  1408.     DEFB    ' to ',0
  1409.     LD    BC,(DUSER)
  1410.     CALL    PRNDU        ; Print Dest DU w/":"
  1411.     LD    A,(RENFLG)    ; Are we renaming?
  1412.     OR    A
  1413.     RET    Z        ; ..return if not
  1414.     LD    DE,(FCBD)    ; Else print Dest file spec
  1415.     INC    DE        ; Pt to File Name
  1416.     JP    PFN1        ; ..print and return via Stack
  1417.  
  1418. ;.....
  1419. ; PRINT "DU:" from values in BC register
  1420.  
  1421. PRNDU:    LD    A,B
  1422.     ADD    A,'A'
  1423.     CALL    COUT
  1424.     LD    A,C
  1425.     CALL    PAFDC
  1426.     LD    A,':'
  1427.     JP    COUT
  1428.  
  1429. ;.....
  1430. ; Print actual COMfile name if we can,
  1431. ; otherwise print "COPY"
  1432.  
  1433. COMNAM:    LD    A,(Z3EADR+1)    ; Do we have an environment?
  1434.     OR    A
  1435.     CALL    NZ,GETEFCB    ; .Get EFCB name if so
  1436.     JR    Z,NOEFCB    ; ..Print "COPY" if Not
  1437. PRNNAM:    LD    B,8
  1438. COMNML:    INC    HL
  1439.     LD    A,(HL)
  1440.     AND    7FH
  1441.     CP    ' '
  1442.     CALL    NZ,COUT
  1443.     DJNZ    COMNML
  1444.     RET
  1445.  
  1446. NOEFCB:    CALL    EPRINT
  1447.     DEFB    'COPY',0
  1448.     RET
  1449.  
  1450. ;.....
  1451. ; Scan 11-char string for specified character ("?")
  1452. ; Enter: HL --> Start of string -1
  1453. ; Exit :  B = 0
  1454. ;      A = Count of specified character
  1455. ; Destroys HL & C.  DE unaffected
  1456.  
  1457. SCANQQ:    LD    A,'?'        ; Set search for Quest Mrks
  1458. SCAN11:    INC    HL        ; Advance to name field
  1459.     LD    BC,11*256+0    ; Counter (B) = 11, (C) = 0
  1460. SCAN1A:    CP    (HL)        ; Compare a char
  1461.     JR    NZ,SCAN1B    ; ..jump if not same
  1462.     INC    C        ; Else bump found counter
  1463. SCAN1B:    INC    HL        ; ..point to next
  1464.     DJNZ    SCAN1A        ; Loop til done
  1465.     LD    A,C        ; Set results in reg
  1466.     OR    A        ; ..and set flags
  1467.     RET
  1468.  
  1469. ;.....
  1470. ; AI (allegedly intelligent) routine to check for a string
  1471. ; containing legal option letters ONLY.
  1472.  
  1473. OPTQ:    LD    A,(HL)
  1474.     SUB    OPTC        ; Slash is explicit option delim
  1475.     JR    NZ,NOSLSH    ; If not slash, do char. check
  1476.     LD    (HL),A        ; If slash, null it out (A = 0)
  1477.     DEC    HL
  1478.     LD    (HL),A        ; Null out leading space
  1479.     INC    HL        ; Adjust pointer to options
  1480.     INC    HL
  1481.     RET            ; Return with Z flag
  1482.  
  1483. NOSLSH:    LD    D,H        ; Copy into de
  1484.     LD    E,L
  1485.     XOR    A        ; Search for terminating null
  1486.     LD    BC,OPTLEN    ; Range for search
  1487.     CPIR            ; Do short search
  1488.     JR    Z,DOOPTQ    ; Found null, proceed
  1489.     EX    DE,HL        ; Otherwise too long for options
  1490.     RET            ; Return with NZ
  1491.  
  1492. DOOPTQ:    PUSH    DE
  1493.     DEC    DE
  1494. BLOOP:    INC    DE
  1495.     LD    A,(DE)
  1496.     OR    A
  1497.     JR    Z,OQDONE    ; End of string, return with Z
  1498.     LD    B,OPTLEN
  1499.     LD    HL,OPTLTR
  1500. LLOOP:    CP    (HL)
  1501.     JR    Z,BLOOP
  1502.     INC    HL
  1503.     DJNZ    LLOOP        ; If B ticks down, a failure!
  1504.     DEC    B        ; Cheap NZ return
  1505.  
  1506. OQDONE:    POP    HL
  1507.     RET
  1508.  
  1509. ;.....
  1510. ; Consolidated vectors to Get and Put stamps with Error Detection
  1511.  
  1512. PUTSTMP: CALL    PSTAMP        ; Attempt Put Stamp to Disk
  1513.     JR    GETST0        ; ..and vector down to Error stuff
  1514.  
  1515. GETSTMP: CALL    GSTAMP        ; Try to Get File Stamp
  1516. GETST0:    RET    NZ        ; ..return if Good
  1517.     LD    (DSFLAG),A    ; Else disable stamping w/0 in A
  1518.     RET            ; ..and return
  1519.  
  1520. ;.....
  1521. ; Get base of Lowest Operating System component (CCP or RSX) which
  1522. ; is the Top of memory usable for a copy buffer.
  1523.  
  1524. GETTOP:    PUSH    HL        ; Save HL around this call
  1525.     LD    HL,(Z3EADR)    ; Get Z3 environment (if any)
  1526.     LD    A,L
  1527.     OR    H
  1528.     PUSH    AF        ; Save flag state
  1529.     CALL    NZ,GZMTOP    ; .check extended ENV if in Z-System
  1530.     POP    AF
  1531.     CALL    Z,GETMTOP    ; ..else calculate base/rsx
  1532.     LD    A,H        ; Get returned Page for exit
  1533.     POP    HL        ; .restore regs
  1534.     RET            ; ..and back
  1535.  
  1536. ;.....
  1537. ; Text and character variables
  1538.  
  1539. OPTLTR:    DEFB    'AEIMNOQRSVX'    ; Added 'R' and 'X'
  1540. OPTLST:    DEFS    0
  1541. OPTLEN    EQU    OPTLST-OPTLTR
  1542.  
  1543. ; Various message suffixes
  1544.  
  1545. SUFFX1:    DEFB    'e ',0
  1546. SUFFX2:    DEFB    'ing ',0
  1547.  
  1548. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1549. ;           D a t a    A r e a
  1550. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++
  1551.  
  1552.     DSEG
  1553.  
  1554. ; Pointers
  1555.  
  1556. DATABG    EQU    $
  1557. MFPTR:    DEFS    2        ; Ptr to first char of next fn spec
  1558. NXTPTR:    DEFS    2        ; Ptr to next fn spec in line
  1559. WORKBF:    DEFS    2        ; Ptr to beginning of work buffer
  1560.  
  1561. ;   ----- Do Not Change following values -----
  1562. CPYTBL:                ; ..flags copied from default table
  1563. VERFLG:    DEFS    1        ; Verify
  1564. INSP:    DEFS    1        ; Inspect
  1565. SYSEXC:    DEFS    1        ; Exclude system files
  1566. NCOPY:    DEFS    1        ; Multiple copy
  1567. EXIST:    DEFS    1        ; Test for existence flag
  1568. EXRO:    DEFS    1        ; Test for R/O existence flag
  1569. ARCHIV:    DEFS    1        ; Archive flag
  1570. REPLAC:    DEFS    1        ; Replace flag (Copy if exists)
  1571. TBLLEN    EQU    $-CPYTBL
  1572. ;    ----- End of no change area -----
  1573.  
  1574. ; Disks and Users
  1575.  
  1576. CDISK:    DEFS    1        ; Current disk
  1577. SUSER:    DEFS    1        ; Source user
  1578. SDRIVE:    DEFS    1        ; ..Source disk
  1579. DUSER:    DEFS    1        ; Destination user
  1580.     DEFS    1        ; ..Destination disk
  1581.  
  1582. ; CRC Value
  1583.  
  1584. CRCVAL:    DEFS    2        ; CRC check value
  1585.  
  1586. ; FCBS & FCBD
  1587.  
  1588. FCBS:    DEFS    2        ; Source FCB
  1589. FCBD:    DEFS    2        ; Destination FCB
  1590.  
  1591. ; Counts and Flags
  1592.  
  1593. PAGLIM:    DEFS    1        ; Max number of pages in work buffer
  1594. LSTCPY:    DEFS    1        ; Last file was copied flag
  1595. VERCNT:    DEFS    1        ; Error count
  1596. BCNT:    DEFS    1        ; Block count
  1597. CONT:    DEFS    1        ; Continue flag (0=no, 0FFH=yes)
  1598. NOMSGS:    DEFS    1        ; 0FFH if there is no ZCPR3 message buffer
  1599. NORST:    DEFS    1        ; Disk reset flag (0=do reset)
  1600. ROFLG:    DEFS    1        ; Dest file R/O flag
  1601. RPQFLG:    DEFS    1        ; Replace queery flag (0=replace w/o asking)
  1602. XMOVE:    DEFS    1        ; Delete source after copy flag (Move)
  1603. QUIET:    DEFS    1        ; Quiet
  1604. NOREPL:    DEFS    1        ; No copy if file already on dest. flag
  1605. DSFLAG:    DEFS    1        ; DateStamper active flag
  1606. TMPTIM:    DEFS    6        ; Temporary Clock Date/Time buffer
  1607. SRCTD:    DEFS    15        ; Source Time & Date buffer
  1608. DESTTD:    DEFS    15        ; Destination Time &Date Buffer
  1609. HAVFIL:    DEFS    1        ; Flag to indicate filecount. 0=No Files
  1610. RENFLG:    DEFS    1        ; 0 = No rename, <>0 for rename opn
  1611. REPLCK:    DEFS    1        ; Flag for Replacement abort (MCOPYX sets)
  1612. CPYERR:    DEFS    1        ; 0=No error in Verify, FF=Verify err
  1613.  
  1614. ; Dynamic Buffers
  1615.  
  1616. INLINE:     DEFS    2        ; Input line buffer
  1617. FREEBUF: DEFS    2        ; Free space buffer
  1618. PUBS:     DEFS    2        ; ZRDOS PUBLIC bytes from ENV+0FEH
  1619.      DEFS    64        ; Space for local Stack
  1620. STACK:     DEFS    2        ; Opsys stack ptr
  1621.  
  1622.     END
  1623.