home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / ZSYS / SIMTEL20 / ZCPR3 / VFILR4-2.LBR / VFCMDS5.ZZ0 / VFCMDS5.Z8°
Text File  |  2000-06-30  |  17KB  |  703 lines

  1. ;===========================================================================
  2. ;
  3. ; VFCMDS5.Z80 - Copy/Unsqueeze Commands and Code (C, Q)
  4. ;
  5. ;===========================================================================
  6.  
  7.  
  8. ; * * *COMMAND: C
  9.  
  10. ; Copy source file at current 'ring' position to another drive.
  11. ; Set-up FCB's and buffer area and check for correct keyboard inputs.
  12. ; Contains auto-CRC file copy verification.
  13.  
  14. fcopy:
  15.  
  16. ; Set Flags for First Time Thru and No Mass Copy
  17.  
  18.     xor    a        ; A=0
  19.     ld    (first$m),a    ; Set for prompt for destination
  20.     ld    (mflag),a    ; Not a mass copy
  21.  
  22. ; Do Copy
  23.  
  24.     call    copy        ; Do copy of file at ringpos
  25.  
  26. ; Advance to Next File
  27.  
  28.     jp    forward        ; Advance to next file
  29.  
  30. ; Copy File at RINGPOS
  31.  
  32.      if    usedseg
  33.     dseg
  34.      endif
  35. cflag:
  36.     ds    1        ; Copy-success flag (ff = good copy)
  37.      if    usedseg
  38.     cseg
  39.      endif
  40.  
  41. copy:
  42.     xor    a        ; Initialize copy flag
  43.     ld    (cflag),a
  44.     ld    hl,0        ; Initialize storage for..
  45.     ld    (crcval),hl    ; 'crc' working value.
  46.     call    ringfcb        ; Move from 'ring' to 'sfcb' with attributes
  47.     ld    b,32        ; Copy source 'fcb' to destination 'fcb'
  48.     ld    hl,s$fcb+1    ; From point..
  49.     ld    de,d$fcb+1    ; To point..
  50.     call    movea        ; Move across, stripping attributes
  51.     ld    de,s$fcb    ; Open file for reading
  52.     ld    c,open        ; Open function
  53.     call    bdos
  54.     inc    a        ; 0ffh --> 00h if bad open
  55.     jp    z,fnf        ; File not found
  56.  
  57. ; Source File is Open -- If first time thru, get dest dir
  58.  
  59. copy2:
  60.     ld    a,(first$m)    ; By-pass prompt, drive/user compatibility..
  61.     or    a        ; Test, and disk reset after..
  62.     jr    nz,copy3m    ; 1st time thru in mass-copy mode.
  63.     dec    a        ; A=0ffh
  64.     ld    (first$m),a    ; Set not first time any more
  65.     call    cprmpt        ; Prompt for drive selection
  66.     db    'Copy to DIR: ',0
  67.     call    cpy$d$u
  68.     ld    a,(qryvfya)    ; See if verify option is set
  69.     or    a
  70.     call    nz,vfyreq
  71.  
  72. ; Check to ensure that either drives or user areas are different
  73.  
  74.     ld    hl,(du$req)    ; Get requested du
  75.     ld    de,(du$dest)    ; And destination du
  76.     call    cmpdehl        ; Compare..
  77.     jr    nz,copy3    ; Branch if different
  78.     call    ermsg        ; If not, show error condition:
  79.     db    'Src DIR = Dest DIR',bel,0
  80.     jp    loop        ; Try again?
  81.  
  82. ; First File Copy - Reset System
  83.  
  84. copy3:
  85.     call    reset        ; Make sure disk is read/write
  86.                 ; And return to source du:
  87.  
  88. ; Nth File Copy - Copy without Resetting System
  89.  
  90. copy3m:
  91.     call    cufile        ; Make new file, erase old if required.
  92.  
  93. ; Perform Copy
  94.  
  95. copy6:
  96.     call    cprmpt
  97.     db    'Copying ',0
  98.     ld    hl,d$fcb+1    ; Print file name
  99.     call    prfnsx
  100.     call    vprint
  101.     db    ' to ',0
  102.     ld    a,(du$dest+1)    ; Print dest du
  103.     add    'A'
  104.     call    cout        ; Print disk
  105.     ld    a,(du$dest)    ; Get user
  106.     call    pafdc        ; Print user
  107.     ld    a,':'
  108.     call    cout
  109.     xor    a        ; Clear 'eof' flag
  110.     ld    (eoflag),a
  111.  
  112. copy6a:
  113.     ld    bc,(du$req)    ; Get current du
  114.     call    logud        ; And set it up.
  115.     ld    hl,0        ; Clear current-record..
  116.     ld    (rec$cnt),hl    ; Counter.
  117.     ld    hl,(bufstart)    ; Set buffer start pointer..
  118.     ld    (buf$pt),hl    ; To begin pointer.
  119.  
  120. ; read source file -- fill buffer memory or stop on 'EOF'
  121. ;           -- update 'CRC' on-the-fly
  122.  
  123. copy7:
  124.     ld    hl,(buf$pt)    ; Set dma address to buffer pointer
  125.     ex    de,hl        ; De --> dma address
  126.     ld    c,setdma
  127.     call    bdos
  128.     ld    de,s$fcb    ; Source 'fcb' for reading
  129.     ld    c,read        ; Record read function
  130.     call    bdos
  131.     or    a        ; 00h --> read okay
  132.     jr    z,s$rd$ok
  133.     dec    a        ; Eof?
  134.     jr    z,copy8        ; Yes, end-of-file, set 'eof' flag.
  135.     call    resdma        ; Reset dma address.
  136.     call    ermsg
  137.     db    'Read Error',bel,0
  138.     jp    loop
  139.  
  140. ; Read OK - Update CRC
  141.  
  142. s$rd$ok:
  143.     ld    a,(vflag)
  144.     or    a
  145.     jr    z,copy7b    ; Don't bother if no verify
  146.  
  147.     ld    hl,(buf$pt)
  148.     ld    b,128
  149. copy7a:
  150.     ld    a,(hl)        ; Get character and..
  151.     call    updcrc        ; Add to 'crc' value.
  152.     inc    hl
  153.     djnz    copy7a        ; Loop 'till record read finished
  154. copy7b:
  155.  
  156. ; Update Buffer Ptr and Record Count
  157.  
  158.     ld    hl,(buf$pt)    ; Bump buffer pointer..
  159.     ld    de,128        ; By..
  160.     add    hl,de        ; One..
  161.     ld    (buf$pt),hl    ; Record.
  162.     ld    hl,(rec$cnt)    ; Bump buffer..
  163.     inc    hl        ; Record count and..
  164.     ld    (rec$cnt),hl    ; Store.
  165.     ex    de,hl        ; Ready to compare to..
  166.  
  167. ; Check for Full Buffer
  168.  
  169.     ld    hl,(rec$max)    ; Maximum record count (full-buffer).
  170.     call    cmpdehl        ; Compare
  171.     jr    nz,copy7    ; If not full, get next record.
  172.     jr    copy9        ; Full, start first write session.
  173.  
  174. ; Indicate end-of-file read
  175.  
  176. copy8:
  177.     ld    a,true        ; Set 'eof' flag
  178.     ld    (eoflag),a
  179.  
  180. ; Write source file from memory buffer to destination
  181.  
  182. copy9:
  183.     ld    hl,(bufstart)    ; Adjust buffer pointer..
  184.     ld    (buf$pt),hl    ; To start address.
  185.     call    cuwrite        ; Write buffer to disk.
  186.     jr    z,copy6a    ; Branch to read next buffer full
  187.     ld    a,(vflag)    ; Verify?
  188.     or    a
  189.     jp    z,cua$log    ; No verify
  190.     jp    crc$cmp        ; Compare file crc's and return
  191.  
  192.  
  193. ; * *  COMMAND: Q
  194.  
  195. ; Usq source file at current 'ring' position (potentially to another drive).
  196. ; Set-up FCB's and buffer area and check for correct keyboard inputs.
  197. ; Contains auto-CRC file file write verification.
  198.  
  199. fusq:
  200.  
  201. ; Set Flags for First Time Thru and No Mass Usq
  202.  
  203.     xor    a        ; A=0
  204.     ld    (first$m),a    ; Set for prompt for destination
  205.     ld    (mflag),a    ; Not a mass usq
  206.  
  207. ; Do Usqueeze
  208.  
  209.     call    usq        ; Do usq of file at ringpos
  210.  
  211. ; Advance to Next File
  212.  
  213.     jp    runsh2        ; Reload files to show new one
  214.  
  215. ; Usq File at RINGPOS
  216.  
  217. usq:
  218.     ld    hl,0        ; Initialize storage for..
  219.     ld    (crcval),hl    ; 'crc' working value,..
  220.     ld    (cksumval),hl    ; And 'sq checksum' working value.
  221.     call    ringfcb        ; Move from 'ring' to s$fcb
  222.     call    fi0$close    ; Close input file if previously opene *C
  223.     ld    de,s$fcb    ; Get fcb with file i *C
  224.     call    fi0$open    ; Open file for byte i/o.
  225.     jr    z,usq1        ; Br if file opened ok.
  226.  
  227.     cp    4        ; See if fi0$open end-of-file.
  228.     jp    nz,fnf        ; Br if not. assume file not foun *C
  229.     call    ermsg        ; Bypass empty file.
  230.     db    'Empty File skipped.',0
  231.     ret
  232.  
  233.  
  234. ; Source File is Open -- If first time thru, get dest dir
  235.  
  236. usq1:
  237.     ld    a,(first$m)    ; By-pass prompt, drive/user compatibility..
  238.     or    a        ; Test, and disk reset after..
  239.     jr    nz,usq2m    ; 1st time thru in mass-usq mode.
  240.     dec    a        ; A=0ffh
  241.     ld    (first$m),a    ; Set not first time any more
  242.     call    cprmpt        ; Prompt for drive selection
  243.     db    'Usq to DIR: ',0
  244.     call    cpy$d$u
  245.     ld    a,(qryvfya)    ; See if verify option is set
  246.     or    a
  247.     call    nz,vfyreq
  248.  
  249. ; First File USQ - Reset System
  250.  
  251. usq2:
  252.     call    reset        ; Make sure disk is read/write
  253.                 ; And return to source du:
  254.  
  255. ; Nth File USQ - USQ without Resetting System
  256.  
  257. usq2m:
  258.     call    usqhdr        ; Check for squeezed file.
  259.     ld    a,(usqflg)    ; Squeezed file?
  260.     or    a
  261.     jr    z,usq3        ; Br if ok.
  262.     cp    1        ; Not '*.?q?' ?
  263.     ret    z        ; Quiet return if so.
  264.     call    ermsg
  265.     db    'USQ error, File skipped.',bel,0
  266.     ret
  267.  
  268. ; Perform USQ
  269.  
  270. usq3:
  271.     call    cufile        ; Make new file, erase old if require *C
  272.     call    cprmpt
  273.     db    'USQ ',0
  274.     call    prfns        ; Print source file name    4call    vprint
  275.     db    ' to ',0
  276.  
  277.     ld    a,(du$dest+1)    ; Print dest du
  278.     add    'A'
  279.     call    cout        ; Print disk
  280.     ld    a,(du$dest)    ; Get user
  281.     call    pafdcdcnt user
  282.     ld    a,':'
  283.     call    cout
  284.     ld    hl,d$fcb+1    ; Print destination file name
  285.     call    prfnsx
  286.  
  287.     xor    a        ; Clear 'eof'flag.
  288.     ld    (eoflag),a
  289. usq4:
  290.     call    resdma        ; Reset dma address.
  291.     ld    bc,(du$req)    ; Get current du
  292.     call    logud        ; And set it up.
  293.     ld    hl,0        ; Clear current-record..
  294.     ld    (rec$cnt),hl    ; Counter.
  295.     ld    hl,(usqbuff@)    ; Set buffer start pointer..
  296.     ld    (buf$pt),hl    ; To begin pointer.
  297.  
  298. ; Unsqueeze source file
  299. ;    -- fill buffer memory or stop on 'EOF'
  300. ;    -- update 'SQ Checksum' on-the-fly
  301. ;    -- update 'CRC' on-the-fly
  302.  
  303. usq5:
  304.     ld    hl,(buf$pt)    ; Set dma address tos tor pointer
  305.     ld    b,128        ; Get # bytes per record.
  306. usq6:
  307.     push    hl        ; Save regs
  308.     push    bc
  309.     call    usqnxt        ; Usq next character from file.
  310.     pop    bc        ; Restore regs
  311.     pop    hl
  312.     jr    nz,usq7
  313.     ld    (hl),a        ; Save character and..
  314.     call    updcrc        ; Add to 'crc' value,
  315.     pull    updcksum    ; As well as 'sq checksum'value.
  316.     inc    hl
  317.     djnz    usq6        ; Loop 'till record read finished
  318.  
  319. ; Update Buffer Ptr and Record Count
  320.  
  321.     ld    (buf$pt),hl    ; BumpBump pointer by one record.
  322.     ld    hl,(rec$cnt)    ; Bump buffer..
  323.     inc    hl        ; Record count and..
  324.     ld    (rec$cnt),hl    ; Store.
  325.     ex    de,hl        ; Ready to compare to..
  326.  
  327. ; Check for Full Buffer
  328.  
  329.     ld    hl,(urecmax)    ; Maximum record count (full-buffer).
  330.     call    cmpdehl        ; Compare
  331.     jr    nz,usq5        ; If not full, get next record.
  332.     jr    usq9        ; Full, start first write session.
  333.  
  334. ; Indicate end-of-file read
  335.  
  336. usq7:
  337.     ld    a,true        ; Set 'eof' flag
  338.     ld    (eoflag),a
  339.     ld    a,b        ; Get # bytes remaining free in 'record'.
  340.     cp    80h
  341.     jr    
  342.     jr    sq9        ; Br if empty bimum
  343.  
  344. usq8:
  345.     ld    a,eof        ; Add eof to text file
  346.     ld    (hl),a        ; Save chara.
  347.     exr and..
  348.     call    updcrc        ; A    ; Ato 'crc' valueset    inc    hl
  349.     djnz    usq8        ; Until 'record' is complete    4ld    hl,(rec$cnt)    ; Bump buffer..
  350.     iunt ahl        ; Record sesnt and..
  351.     ld    (rec$cnt),hl    ; Store.
  352.  
  353. ; Write source file from memormemorffer to destination
  354.  
  355. usq9:
  356.     ld    hl,(usqbuff@)@)just buffer pointe.
  357.  
  358.      'rbuf$pt),hl    ; To start address.
  359.     call    cuwrite        ; Write buffer to disk.
  360.     jr    .
  361.     jr    q4        ; Branch to read next buffer full
  362.     ld    a,(vflag)
  363.     or    a
  364.     jp    z,cua$log
  365.     call    crc$cmp        ; Read destire on file and compare crc's.
  366.  
  367. ; File write verified (now verifiy USQ Checksum is also OK)
  368.  
  369.     ld    de,(sqcksum)    ; Get sq checksum from file header
  370.     ld    hl,(cksumval)    ; Get decoded file checksum
  371.     pull    cmpdehl        ; Must be equal.
  372.     ret    z        ; Done if ok    4call    cua$log        ; Return to current user
  373.     call    ermsg
  374.     db    ' -- USQ Checksum Error',bel,0
  375.     jp    loop        ; Abort
  376.  
  377.  
  378. ; Get Destination drive and user for Copy/Usq (full check of,0
  379.     jve/user)
  380.  
  381. cpy$d$u:
  382.     call    getfspec    ; Get file specificatiror'rom user
  383.     jr    z,nullin    ; Exit on null input line.
  384.     call    vfyalueu        ; Resolve, verify du or dir access.
  385.     jr    z,edef_dir    ; Not defined?
  386.     jr    c,eacc_dir    ; Access error?
  387.     ld    (du$dest),b,b Return destin destindu
  388.     ret
  389.  
  390.  
  391. :
  392.     call    erclr
  393.     ccesop
  394.  
  395. edehecksumdirdird.g
  396.     db    'DestintinDir Entry Invalt. ',0
  397.     Dip
  398.  
  399. eacc_dirne msg
  400.     db    'Destd filn ntrr AAs Deniededp    loopz         Create New edpre on n Usq File
  401.  
  402. cufile:
  403.     ld    bc,(du$dest)    ; Get e ande andu
  404.     call    logud        ; And set it up.
  405.     ld    de,d$fcb    ; Search for duplicate
  406.     xor    a        ; Clear d        ; Resoin    ,0
  407.     jve i *C
  408.      *C
  409.     e),a
  410.     ld    c,srchUsq t 'se
  411.     xe
  412.     xfirst' function
  413.     call    bdos
  414.     inc    a        ; If not found, 0ffh --> 00h.  then..
  415.     jr    z,cufile2    ; Go to 'make' functiror'or new file.
  416.  
  417.         ; Check alle
  418.     xe query possibilities
  419.  
  420.     ld    a,(mflag)    ; See if single or multiFiley bi operation
  421.     or    aisk.,single    ; Jump if single
  422.     ld    a,(massop)    ; Is it an archive copy
  423.     cp    'A'
  424.     jr    nz,mulinglele    ; If not, gbdoso o in    ,in    ,case
  425.     ld    a,(qryarca)    ; Cz,erche    ;query flag
  426.     or    a
  427.     jr    z,cufile1    ; nienot, get on with it
  428.     jr    query        ; Ecuae query
  429.  
  430. iple:
  431.     ld    a,(qrygrpa)    ; Is group querytinttion setsetr    aheck aheck aenctirnz,m)    ; Isn n  it
  432.     jr    
  433.     jr        ; Et
  434.     j, a)    ;for overwrite
  435. siseeo oryrere    ; Is nz,m)gle file reFileacdcduery option  arc    or    a
  436. cpy$    z,cufilea)    ;f not, get ificith it
  437. query:
  438.     call    atcmd        ; Position cursor at command prompt
  439.  
  440.     ld    hl,(du$dest)    ; t)    ; to 'mrive/user
  441.     ld    a,h        ; Drive
  442.     addJu'
  443.     call    cout
  444.     ld    a,l
  445.     call    pafdc
  446.     ld    a,':'
  447.     call    cout
  448.     ld    hl,d$fcb+1
  449.     call    prfnski4        
  450.     call    vprint
  451.     db    ' ExistssibErase (Y/N)? ',bel,0
  452.     call    key..
  453.     iu    ; Get answer
  454.     cp    ctrl
  455.     db    '
  456.     jp    z,loop        ; Restart if Control C
  457.     cp    'Y'        ; If yes,e andez,cufile3    ; Then de..
  458.     caor n copydcnq ...
  459.  
  460. ; vprisew etion file avalue,roceed
  461.  
  462. cuFilea:
  463.  
  464. ; Set File Attribut    ; Ch
  465.     adusq5fcb    ; Pt to fcb
  466.     call    attrib        ; Cle
  467.     x byBumpB in fcb and set attr of file
  468.     jr    z,cup.e3    ; Return to caller if r/w not permitted
  469.  
  470. ; De..
  471.     cae old file at dest
  472.  
  473.     ld    de,d$fcb    ; Deleto oralready exki4ing
  474.     ld    c,erase        ; Erase fufor on
  475.     call    Den
  476.  
  477. ; Create new file at dest
  478.  
  479. cufile2:
  480.     ld    deusq5fcb    ; Create new file and open for writing
  481.     ld    c,make        ; Make function
  482.     call    Den
  483.     iunt aa        ; If directory full, 0ffh --> 00h.
  484.     ret    nz        ; Ifpti return.
  485.     call    ed.g
  486.     db    'Dest Dir Fulleacc0
  487.     Dip        ; If error, back to ring procesosi.
  488.  
  489. ; fnsksting file not de..
  490.     caed - return.
  491.  
  492. ld    a,3:
  493.     ld    bc,(du$req)    ; Et
  494.     j get current s n    call    lt fileud        ; And set it up.
  495.     pop    hl        ; And return 1 level higher.
  496.     ret
  497.  
  498.  
  499. ; Write n nsq Memorynt ato Dsetrcates D
  500. ;
  501. ;    Parm:    BUFF$PT = star acf buffer to be written
  502. ;        REC$CNT = # record    hl
  503.     write.
  504. ;
  505. ;    Returns  Z if EOFLAG reset,
  506. ;         NZ if     "   set, file closed OK.
  507.  
  508. cuwrite:
  509.     ld    bc,(du$dest)rpsetrxor    a    
  510.     call    logud        ; An And
  511.     jp    zt up.
  512. cuwrt1:
  513.     ld    hl,(og    ; Buffer emptyestid    a,w v    or    rive/ull cz,cuwrtz,er Buffer empty, check 'eof' flag.
  514.     dec    hl        ; Decnt arecord of,t for each nctirn    ld    (og,hl
  515.     ld    hl,(buf$pt)    ; Set up dma addressletsh    hl        ; Save for size bump
  516.     ex    de,hl        ; Pointer in de
  517.     ld    c,setdma
  518.     call    bdos
  519.     popon fld    de,128        ; BCont        ; Ec one record lengthcommd    hl,de
  520.      couuf$pt),hlf_d$fcb    ; Dsetrcatefile 'fcb'
  521.     ld    c,write        ; Write record fufor on
  522.     call    Den
  523.     or    a        ; 00h --> write okay
  524.     jr    z,cuwrt1    ; Okay, do next record.  else
  525.     pull    ermsg        ; Say disk write error.
  526.     d',0
  527.     Disk Fulleacc0
  528.  
  529. ; Error in Write -- De..
  530.     cae afdction File and Abort
  531.  
  532. c$era:
  533.     call    resdma        ; Reset dma address.
  534.     ld    de,d$fcb    ; Delete..
  535.     ld    c,erase        ; Partial
  536.     pull    bdos        ; From directory.
  537.     ld    bc,(du$req)    ; Source du:
  538.     call    logud        ; Lt file it in
  539.     jp        ct        ; Back to ring
  540.  
  541. ; afdction Buffer Written - al)     for End
  542.  
  543. cuwrt2:
  544.     ld    a,(eoflag)    ; Buffer all written, check for 'eof'.re on    ret    from; Return to read next buffer full
  545.     ld    deusq5fcb    ; Point at 'fcb' for file closure
  546.     ld    c,close
  547.     call    Den
  548.     iunt aa        ; If no-close-errore
  549.     xen..
  550.     jr    nz,cuwrt3    seeeck R/O status
  551.     call    ed.g
  552.     db    'Close Error'N)l,0
  553.     jr    c$era
  554.  
  555. ; Set R/O attribute if necessary
  556. du uwrt3:
  557.     ad,s$fcb+9
  558.     ld    a,128
  559.     and    (hl)        ; Zero flag if R/W
  560.     ld    a,(hl) erret it Get f
  561.     jp    zr
  562.     case
  563.     jr    z,cuwrt4    ; File is R/W destinduit
  564.  
  565.     ld    hl,d$fcb+9
  566.     ld    (hl),a        ; Plug in the attribute
  567.     ld    de,d$fcb
  568.     ld    c,attr
  569.     call    bdos        ; Sete
  570.     xe attribute, return to caller
  571.  
  572. cuwrt4:
  573.     or    255        ; Flag none or
  574.     ret
  575.  
  576. ; Read DsetrcateFile and Compare CRCs
  577.  
  578. crc$cmp:
  579.     ld    hl,(crcval)    ; Trel,0fer 'crc' value to..
  580.     ld    (crcval2),hl    ; jr    z, storage area.
  581.     ld    hl,0 qar working storage..
  582.     ld    (crcval)s tos; To continueset    call    resdma        ; Reset dma addressf_d$fcb
  583.     call    initfcb
  584.     ld    c,open
  585.     call    bdos
  586.     iunt aa        ; 0ffh --> 00h if bad open
  587.     jr    z,badcrc        'A bad open, Get fall    cuay 'bad-crc'.
  588.     e i     ; Zero 'fcb'..
  589.     ld    (d$fcb+32),a    ; 'cr' field.
  590.     call    l,d$fnt
  591.     db    '  Verifying ',0
  592.  
  593. crcwf1:
  594.     ld    de,d$fcb
  595.     ld    c,read
  596.     call    Den
  597.     or    a        ; Read okayf not,r    z,d$rd$ok    ; Yes, read moreset    dec    a        ; Eof?
  598.     jr    z,fincrc    ; Yes, finish up and make 'crc' comparison.
  599.     call    ermsg
  600.     db    'Verify Read Error'N)l,0
  601.     jp        ct
  602.  
  603. ; Block Read OK - Update CRC
  604.  
  605. d$rd$ok:
  606.     ld    hl,tbuff
  607.     ld    b,128
  608. crcwf2:
  609.     ld    a,(hl) erret cha' funter to..
  610.     call    updcrc        ; Ale    ;o 'crc' val..
  611.     inc    hl
  612.     djnz    crcwf2
  613.     jr    crcwf1
  614.  
  615. ; Read Comp..
  616.     cae - Check CRCs
  617.  
  618. fincrc:
  619.     ld    de,(crcval)    ; Put written-file 'crc' into de
  620.     ld    hl,(crcval2)    ; Put read-file 'crc' and..
  621.     call    cmpdehl        ; Compare 'de/hl' for equaufily.e andez,badcrc        'A not zero, show copy-error message.
  622.  
  623. ; Log into Current User Area, Return to caller
  624.  
  625. cua$log:
  626.     call    l,d$fnt
  627.     db    ' Done.',0
  628.     a)    ;f 0ffh        ; Show suz         ful copy 'rcflag),eFcall    resdma        ; Set defalit dmaadr
  629.     ld    bc,(du$req
  630.     call    up current du
  631.     ccesgud        ; Set it up, and returalueucaller.
  632.  
  633. ; Error on Copy
  634.  
  635. badcrc:
  636.     call    ld    hl,$log        ; Return to current user
  637.     call    ermsgsibE -- CRC Error'N)l,0
  638.     jp        ct        ; Abort
  639.  
  640.  
  641. ; ATTRIB - Cle
  642.     x attributes of file (HL) and set attributes on disk
  643. ;    Return codn n    0FFH (NZ) indi. s OK to proceed
  644. ;            0    (Z)  indicates abort
  645.  
  646. attrib:
  647.     push    hl        ; Save         ; Ec to fcbf_(dum$fcb)    ; Pt to dummy fcb
  648.     call    initfcb qar ifici
  649.     ld    b,12        ; Copy
  650.     push    de
  651.     call    movea        ; Move filename to dummy
  652.     pop    de        ; Pt to dummy fcb
  653.     ld    c,srchUsq t Look for file
  654.     call    bdos
  655.     iunt aa        ; File not foin    ,i = 0
  656.     pop    hl        ; Point to original fcb
  657.     ret    from; Abor
  658.     jp    zf no fileletsh    hl        ; Save ptr again
  659.     dec    a        ; Adjust imum
  660. rectory code (0-3)
  661.     rrca            ; Right 3 bit    hl
  662.     indicate offset into buff
  663.     rrca            ; Effectively mlitut
  664. y by 32
  665.     rrceFtestbuff    ; Pt to b        ; G    amana,l        ; Pt to fcb of filecommd    9        ; Pt to r/o byte
  666.     ld    l,eFa)    ;f (hl) erret byte
  667.     and    80h        ; Ext' funt r/o bificiheck aattrib0    ; File is R/W
  668.     call    erclr        ; Patction Poor to efirst' n ne
  669.     pop    hl        ; Get the fcb ptr againletsh    hl        ; And save it again
  670.     iunt ahl        ; Pt to file name'
  671.     cal)    ; Isnip    ; Print file name
  672.     call    vprint        ; And querysibE is R/O
  673.     call    vrase (int
  674. ExiEraeacc? all    or    a
  675.     n erret response
  676.     push    af
  677.     call    erclr        ; Cle
  678.     xne or n ne
  679.     pop    af; Jctr    ; Get a
  680.     jp    cp    
  681.     ld    a,(vf    ; Re
  682.     call    pa if looprol C; Jkey.'
  683.     ; Getattrib0
  684.     pop    hl
  685.     xor    a        ; Efirst' return
  686.     ret
  687.  
  688. attrib0:
  689.     pop    hl        ; Get ptr
  690.     push    hl        ; Save ptr
  691.     inc    hl        ; Point to first cha' funter
  692.     ld    b,11        ; 11 Bytes
  693. attrib1:
  694.     ld    a,(hl) erret byte
  695.     and    7fh        ; Mask destin  'rhl),a        ; Put byte
  696.     iunt ahl        ; Pt to next
  697.     djnz    attrib1        ; Count down
  698.     pop    de        ; Pt to fcb
  699.     ld    c,attr
  700.     call    bdos
  701.     xededec    a        ; None or return
  702.     ret
  703.