home *** CD-ROM | disk | FTP | other *** search
/ norge.freeshell.org (192.94.73.8) / 192.94.73.8.tar / 192.94.73.8 / pub / computers / cpm / alphatronic / DRIPAK.ZIP / CPM_3-0 / SOURCES / COPYSYS.ASM < prev    next >
Assembly Source File  |  1982-12-31  |  15KB  |  836 lines

  1.     title    'Copysys - updated sysgen program 6/82'
  2. ; System generation program
  3. VERS    equ    30        ;version x.x for CP/M x.x
  4. ;
  5. ;**********************************************************
  6. ;*                              *
  7. ;*                              *
  8. ;*        Copysys source code              *
  9. ;*                              *
  10. ;*                              *
  11. ;**********************************************************
  12. ;
  13. FALSE    equ    0
  14. TRUE    equ    not FALSE
  15. ;
  16. ;
  17. NSECTS    equ    26        ;no. of sectors
  18. NTRKS    equ    2        ;no. of systems tracks
  19. NDISKS    equ    4        ;no. of disks drives
  20. SECSIZ    equ    128        ;size of sector
  21. LOG2SEC    equ    7        ;LOG2 128
  22. SKEW    equ    2        ;skew sector factor
  23. ;
  24. FCB    equ    005Ch        ;location of FCB
  25. FCBCR    equ    FCB+32        ;current record location
  26. TPA    equ    0100h        ;Transient Program Area
  27. LOADP    equ    1000h        ;LOAD Point for system
  28. BDOS    equ    05h        ;DOS entry point
  29. BOOT    equ    00h        ;reboot for system
  30. CONI    equ    1h        ;console input function
  31. CONO    equ    2h        ;console output function
  32. SELD    equ    14        ;select a disk
  33. OPENF    equ    15         ;disk open function
  34. CLOSEF    equ    16        ;open a file
  35. DWRITF    equ    21        ;Write func
  36. MAKEF    equ    22        ;mae a file
  37. DELTEF     equ    19        ;delete a file
  38. DREADF    equ    20        ;disk read function
  39. DRBIOS    equ    50        ;Direct BIOS call function
  40. EIGHTY    equ    080h        ;value of 80
  41. CTLC    equ    'C'-'@'        ;ConTroL C
  42. Y    equ    89        ;ASCII value of Y
  43. ;
  44. MAXTRY    equ    01        ;maximum number of tries
  45. CR    equ    0Dh        ;Carriage Return
  46. LF    equ    0Ah        ;Line Feed
  47. STACKSIZE equ    016h        ;size of local stack
  48. ;
  49. WBOOT    equ    01        ;address of warm boot
  50. ;
  51. SELDSK    equ    9        ;Bios func #9 SELect DiSK
  52. SETTRK    equ    10        ;BIOS func #10 SET TRacK
  53. SETSEC    equ    11        ;BIOS func #11 SET SECtor
  54. SETDMA    equ    12        ;BIOS func #12 SET DMA address
  55. READF    equ    13        ;BIOS func #13 READ selected sector
  56. WRITF    equ    14        ;BIOS func #14 WRITe selected sector
  57.  
  58. ;
  59.     org    TPA        ;Transient Program Area
  60.     jmp    START
  61.     dw    0,0,0,0,0,0,0,0
  62.     dw    0,0,0,0,0,0,0,0
  63.     dw    0,0,0,0,0,0,0,0
  64.     dw    0,0,0,0,0,0,0,0
  65.     dw    0,0,0,0,0
  66.     db    0,0,0
  67.     db    'COPYRIGHT 1982, '
  68.     db    'DIGITAL RESEARCH'
  69.     db    '151282'
  70.     db    0,0,0,0
  71.     db    '654321'
  72. ;
  73. ; Translate table-sector numbers are translated here to decrease
  74. ; the systen tie for missed sectors when slow controllers are
  75. ; involved.  Translate takes place according to the "SKEW" factor
  76. ; set above.
  77. ;
  78. OST:    db    NTRKS        ;operating system tracks
  79. SPT:    db    NSECTS        ;sectors per track
  80. TRAN:
  81. TRELT    set    1
  82. TRBASE    set    1
  83.     rept    NSECTS
  84.     db    TRELT        ;generate first/next sector
  85. TRELT    set    TRELT+SKEW
  86.     if    TRELT gt NSECTS
  87. TRBASE    set    TRBASE+1
  88. TRELT    set    TRBASE
  89.     endif
  90.     endm
  91. ;
  92. ; Now leave space for extensions to translate table
  93. ;
  94.     if    NSECTS lt 64
  95.     rept    64-NSECTS
  96.     db    0
  97.     endm
  98.     endif
  99. ;
  100. ; Utility subroutines
  101. ;
  102. MLTBY3:
  103. ;multiply the contents of regE to get jmp address
  104.     mov    a,e        ;Acc = E
  105.     sui    1
  106.     mov    e,a        ;get ready for multiply
  107.     add    e
  108.     add    e
  109.     mov    e,a
  110.     ret            ;back at it
  111. ;
  112. SEL:
  113.     sta    TEMP
  114.     lda    V3FLG
  115.     cpi    TRUE
  116.     lda    TEMP
  117.     jnz    SEL2
  118. ;
  119.     sta    CREG        ;CREG = selected register
  120.     lxi    h,0000h
  121.     shld    EREG        ;for first time
  122.  
  123.     mvi    a,SELDSK
  124.     sta    BIOSFC        ;store it in func space
  125.     mvi    c,DRBIOS
  126.     lxi    d,BIOSPB
  127.     jmp    BDOS
  128. SEL2:
  129.     mov    c,a
  130.     lhld    WBOOT
  131.     lxi    d,SELDSK
  132.     call    MLTBY3
  133.     dad    d
  134.     pchl
  135. ;
  136. TRK:
  137. ; Set up track
  138.     sta    TEMP
  139.     lda    V3FLG
  140.     cpi    TRUE
  141.     lda    TEMP
  142.     jnz    TRK2
  143.  
  144. ;
  145.     mvi    a,00h
  146.     sta    BREG        ;zero out B register
  147.     mov    a,c        ;Acc = track #
  148.     sta    CREG        ;set up PB
  149.     mvi    a,SETTRK    ;settrk func #
  150.     sta    BIOSFC
  151.     mvi    c,DRBIOS
  152.     lxi    d,BIOSPB
  153.     jmp    BDOS
  154. TRK2:
  155.     lhld    WBOOT
  156.     lxi    d,SETTRK
  157.     call    MLTBY3
  158.     dad    d
  159.     pchl            ;gone to set track
  160. ;
  161. SEC:
  162. ; Set up sector number
  163.     sta    TEMP
  164.     lda    V3FLG
  165.     cpi    TRUE
  166.     lda    TEMP
  167.     jnz    SEC2
  168. ;
  169.     mvi    a,00h
  170.     sta    BREG        ;zero out BREG
  171.     mov    a,c        ; Acc = C
  172.     sta    CREG        ;CREG = sector #
  173.     mvi    a,SETSEC
  174.     sta    BIOSFC        ;set up bios call
  175.     mvi    c,DRBIOS
  176.     lxi    d,BIOSPB
  177.     jmp    BDOS
  178. SEC2:
  179.     lhld    WBOOT
  180.     lxi    d,SETSEC
  181.     call    MLTBY3
  182.     dad    d
  183.     pchl
  184. ;
  185. DMA:
  186. ; Set DMA address to value of BC
  187.     sta    TEMP
  188.     lda    V3FLG
  189.     cpi    TRUE
  190.     lda    TEMP
  191.     jnz    DMA2
  192. ;
  193.     mov    a,b        ;
  194.     sta    BREG        ;
  195.     mov    a,c        ;Set up the BC
  196.     sta    CREG        ;register pair
  197.     mvi    a,SETDMA    ;
  198.     sta    BIOSFC        ;set up bios #
  199.     mvi    c,DRBIOS
  200.     lxi    d,BIOSPB
  201.     jmp    BDOS
  202. DMA2:
  203.     lhld    WBOOT
  204.     lxi    d,SETDMA
  205.     call    MLTBY3
  206.     dad    d
  207.     pchl
  208. ;
  209. READ:
  210. ; Perform read operation
  211.     sta    TEMP
  212.     lda    V3FLG
  213.     cpi    TRUE
  214.     lda    TEMP
  215.     jnz    READ2
  216. ;
  217.     mvi    a,READF
  218.     sta    BIOSFC
  219.     mvi    c,DRBIOS
  220.     lxi    d,BIOSPB
  221.     jmp    BDOS
  222. READ2:
  223.     lhld    WBOOT
  224.     lxi    d,READF
  225.     call    MLTBY3
  226.     dad    d
  227.     pchl
  228. ;
  229. WRITE:
  230. ; Perform write operation
  231.     sta    TEMP
  232.     lda    V3FLG
  233.     cpi    TRUE
  234.     lda    TEMP
  235.     jnz    WRITE2
  236. ;
  237.     mvi    a,WRITF
  238.     sta    BIOSFC        ;set up bios #
  239.     mvi    c,DRBIOS
  240.     lxi    d,BIOSPB
  241.     jmp    BDOS
  242. WRITE2:
  243.     lhld    WBOOT
  244.     lxi    d,WRITF
  245.     call    MLTBY3
  246.     dad    d
  247.     pchl
  248. ;
  249. MULTSEC:
  250. ; Multiply the sector # in rA by the sector size
  251.     mov    l,a
  252.     mvi    h,0        ;sector in hl
  253.     rept    LOG2SEC
  254.     dad    h
  255.     endm
  256.     ret            ;with HL - sector*sectorsize
  257. ;
  258. GETCHAR:
  259. ; Read console character to rA
  260.     mvi    c,CONI
  261.     call    BDOS
  262. ; Convert to upper case
  263.     cpi    'A' or 20h
  264.     rc
  265.     cpi    ('Z' or 20h)+1
  266.     rnc
  267.     ani    05Fh
  268.     ret
  269. ;
  270. PUTCHAR:
  271. ; Write character from rA to console
  272.     mov    e,a
  273.     mvi    c,CONO
  274.     call    BDOS
  275.     ret
  276. ;
  277. CRLF:
  278. ; Send Carriage Return, Line Feed
  279.     mvi    a,CR
  280.     call    PUTCHAR
  281.     mvi    a,LF
  282.     call    PUTCHAR
  283.     ret
  284. ;
  285.  
  286. CRMSG:
  287. ; Print message addressed by the HL until zero with leading CRLF
  288.     push    d
  289.     call    CRLF
  290.     pop    d        ;drop through to OUTMSG
  291. OUTMSG:
  292.     mvi    c,9
  293.     jmp    BDOS
  294. ;
  295. SELCT:
  296. ; Select disk given by rA
  297.     mvi    c,0Eh
  298.     jmp    BDOS
  299. ;
  300. DWRITE:
  301. ; Write for file copy
  302.     mvi    c,DWRITF
  303.     jmp    BDOS
  304. ;
  305. DREAD:
  306. ; Disk read function
  307.     mvi    c,DREADF
  308.     jmp    BDOS
  309. ;
  310. OPEN:
  311. ; File open function
  312.     mvi    c,OPENF
  313.     jmp    BDOS
  314. ;
  315. CLOSE:
  316.     mvi    c,CLOSEF
  317.     jmp    BDOS
  318. ;
  319. MAKE:
  320.     mvi    c,MAKEF
  321.     jmp    BDOS
  322. ;
  323. DELETE:    
  324.     mvi    c,DELTEF
  325.     jmp    BDOS
  326. ;
  327. ;
  328. ;
  329. DSTDMA:
  330.     mvi    c,26
  331.     jmp    BDOS
  332. ;
  333. SOURCE:
  334.     lxi    d,GETPRM    ;ask user for source drive
  335.     call    CRMSG
  336.     call    GETCHAR        ;obtain response
  337.     cpi    CR        ;is it CR?
  338.     jz    DFLTDR        ;skip if CR only
  339.     cpi    CTLC        ;isit ^C?
  340.     jz    REBOOT
  341. ;
  342.     sui    'A'        ;normalize drive #
  343.     cpi    NDISKS        ;valid drive?
  344.     jc    GETC        ;skip to GETC if so
  345. ;
  346. ; Invalid drive
  347.     call    BADDISK        ;tell user bad drive
  348.     jmp    SOURCE        ;try again
  349. ;
  350. GETC:
  351. ; Select disk given by Acc.
  352.     adi    'A'
  353.     sta    GDISK        ;store source disk
  354.     sui    'A'
  355.     mov    e,a        ;move disk into E for select func
  356.     call    SEL        ;select the disk
  357.     jmp    GETVER
  358. ;
  359. DFLTDR:
  360.     mvi    c,25        ;func 25 for current disk
  361.     call    BDOS        ;get curdsk
  362.     adi    'A'
  363.     sta    GDISK
  364.     call    CRLF
  365.     lxi    d,VERGET
  366.     call    OUTMSG
  367.     jmp    VERCR
  368. ;
  369. GETVER:    
  370. ; Getsys set r/w to read and get the system
  371.     call    CRLF
  372.     lxi    d,VERGET    ;verify source disk
  373.     call    OUTMSG
  374. VERCR:    call    GETCHAR
  375.     cpi    CR
  376.     jnz    REBOOT        ;jmp only if not verified
  377.     call    CRLF
  378.     ret
  379. ;
  380. DESTIN:
  381.     lxi    d,PUTPRM    ;address of message
  382.     call    CRMSG        ;print it
  383.     call    GETCHAR        ;get answer
  384.     cpi    CR
  385.     jz    REBOOT        ;all done
  386.     sui    'A'
  387.     cpi    NDISKS            ;valid disk
  388.     jc    PUTC
  389. ;
  390. ; Invalid drive
  391.     call    BADDISK        ;tell user bad drive
  392.     jmp    PUTSYS        ;to try again
  393. ;
  394. PUTC:
  395. ; Set disk fron rA
  396.     adi    'A'
  397.     sta    PDISK        ;message sent
  398.     sui    'A'
  399.     mov    e,a        ;disk # in E
  400.     call    SEL        ;select destination drive
  401. ; Put system, set r/w to write
  402.     lxi    d,VERPUT    ;verify dest prmpt
  403.     call    CRMSG        ;print it out
  404.     call    GETCHAR        ;retrieve answer
  405.     cpi    CR    
  406.     jnz    REBOOT        ;exit to system if error
  407.     call    CRLF
  408.     ret
  409. ;
  410. ;
  411. GETPUT:
  412. ; Get or put CP/M (rw = 0 for read, 1 for write)
  413. ; disk is already selected
  414.     lxi    h,LOADP        ;load point in RAM for DMA address
  415.     shld    DMADDR
  416. ;
  417. ;
  418. ;
  419.  
  420. ;
  421. ; Clear track 00
  422.     mvi    a,-1        ;
  423.     sta    TRACK
  424. ;
  425. RWTRK: 
  426. ; Read or write next track
  427.     lxi    h,TRACK
  428.     inr    m        ;track = track+1
  429.     lda    OST        ;# of OS tracks
  430.     cmp    m        ;=track # ?
  431.     jz    ENDRW        ;end of read/write
  432. ;
  433. ; Otherwise not done
  434.     mov    c,m        ;track number
  435.     call    TRK        ;set to track
  436.     mvi    a,-1        ;counts 0,1,2,...,25
  437.     sta    SECTOR
  438. ;
  439. RWSEC:
  440. ; Read or write a sector
  441.     lda    SPT        ;sectors per track
  442.     lxi    h,SECTOR    
  443.     inr    m        ;set to next sector
  444.     cmp    m        ;A=26 and M=0,1,..,25
  445.     jz    ENDTRK
  446. ;
  447. ; Read or write sector to or from current DMA address
  448.     lxi    h,SECTOR
  449.     mov    e,m        ;sector number
  450.     mvi    d,0        ;to DE
  451.     lxi    h,TRAN    
  452.     mov    b,m        ;tran(0) in B
  453.     dad    d        ;sector translated
  454.     mov    c,m        ;value to C ready for select
  455.     push    b        ;save tran(0)
  456.     call     SEC
  457.     pop    b        ;recall tran(0),tran(sector)
  458.     mov    a,c        ;tran(sector)
  459.     sub    b        ;--tran(sector)
  460.     call    MULTSEC        ;*sector size
  461.     xchg            ;to DE
  462.     lhld    DMADDR        ;base DMA
  463.     dad    d
  464.     mov    b,h
  465.     mov    c,l        ;to set BC for SEC call
  466.     call    DMA        ;dma address set from BC
  467.     xra    a
  468.     sta    RETRY        ;to set zero retries
  469. ;
  470. TRYSEC:
  471. ; Try to read or write current sector
  472.     lda    RETRY
  473.     cpi    MAXTRY
  474.     jc    TRYOK
  475. ;
  476. ; Past MAXTRY, message and ignore
  477.     lxi    d,ERRMSG
  478.     call    OUTMSG
  479.     call    GETCHAR
  480.     cpi    CR
  481.     jnz    REBOOT
  482. ;
  483. ; Typed a CR, ok to ignore
  484.     call    CRLF
  485.     jmp    RWSEC
  486. ;
  487. TRYOK:
  488. ; Ok to tyr read write
  489.     inr    a
  490.     sta    RETRY    
  491.     lda    RW
  492.     ora    a
  493.     jz    TRYREAD
  494. ;
  495. ; Must be write
  496.     call    WRITE
  497.     jmp    CHKRW
  498. TRYREAD:
  499.     call    READ
  500. CHKRW:
  501.     ora    a
  502.     jz    RWSEC        ;zero flag if read/write ok
  503. ;
  504. ;Error, retry operation
  505.     jmp    TRYSEC
  506. ;
  507. ; End of track
  508. ENDTRK:
  509.     lda    SPT        ;sectors per track
  510.     call    MULTSEC        ;*secsize
  511.     xchg            ; to DE
  512.     lhld    DMADDR        ;base dma for this track
  513.     dad    d        ;+spt*secsize
  514.     shld    DMADDR        ;ready for next track
  515.     jmp    RWTRK        ;for another track
  516. ;
  517. ENDRW:
  518. ; End of read or write
  519.     ret
  520. ;
  521. ;*******************
  522. ;*
  523. ;*    MAIN ROUTINE
  524. ;*
  525. ;*
  526. ;*******************
  527. ;
  528. START:
  529.  
  530.     lxi    sp,STACK
  531.     lxi    d,SIGNON
  532.     call    OUTMSG
  533. ;
  534. ;get version number to check compatability
  535.     mvi    c,12        ;version check
  536.     call    BDOS
  537.     mov    a,l        ;version in Acc
  538.     cpi    30h        ;version 3 or newer?
  539.     jc    OLDRVR        ;
  540.     mvi    a,TRUE
  541.     sta    V3FLG        ;
  542.     jmp    FCBCHK
  543. OLDRVR:    
  544.     mvi    a,FALSE
  545.     sta    V3FLG
  546. ;
  547.  
  548. ; Check for default file liad instead of get
  549. FCBCHK:    lda    FCB+1        ;blank if no file
  550.     cpi    ' '
  551.     jz    GETSYS        ;skip to system message
  552.     lxi    d,FCB        ;try to open it
  553.     call    OPEN
  554.     inr    a        ;255 becomes 00
  555.     jnz    RDOK
  556. ;
  557. ; File not present
  558.     lxi    d,NOFILE
  559.     call    CRMSG
  560.     jmp    REBOOT
  561. ;
  562. ;file present
  563. RDOK:
  564.     xra    a
  565.     sta    FCBCR        ;current record = 0
  566.     lxi    h,LOADP
  567. RDINP:
  568.     push    h
  569.     mov    b,h
  570.     mov    c,l
  571.     call    DMA        ;DMA address set
  572.     lxi    d,FCB        ;ready fr read
  573.     call    DREAD
  574.     pop    h        ;recall
  575.     ora    a        ;00 if read ok
  576.     jnz    PUTSYS        ;assume eof if not
  577. ; More to read continue
  578.     lxi    d,SECSIZ 
  579.     dad    d        ;HL is new load address
  580.     jmp    RDINP
  581. ;
  582. GETSYS:
  583.     call    SOURCE        ;find out source drive
  584. ;
  585.     xra    a        ;zero out a
  586.     sta    RW        ;RW = 0 to signify read
  587.     call    GETPUT        ;get or read system
  588.     lxi    d,DONE        ;end message of get or read func
  589.     call    OUTMSG        ;print it out
  590. ;
  591. ; Put the system
  592. PUTSYS:
  593.     call    DESTIN        ;get dest drive
  594. ;
  595.     lxi    h,RW        ;load address
  596.     mvi    m,1
  597.     call    GETPUT        ;to put system back on disk
  598.     lxi    d,DONE
  599.     call    OUTMSG        ;print out end prompt
  600. ;
  601. ;    FILE COPY FOR CPM.SYS
  602. ;
  603. CPYCPM:
  604. ; Prompt the user for the source of CP/M3.SYS
  605. ;
  606.     lxi    d,CPYMSG    ;print copys prompt
  607.     call    CRMSG        ;print it
  608.     call    GETCHAR        ;obtain reply
  609.     cpi    Y        ;is it yes?
  610.     jnz    REBOOT        ;if not exit
  611.                 ;else
  612. ;
  613. ;
  614.     mvi    c,13        ;func # for reset
  615.     call    BDOS        ;
  616.     inr    a
  617.  
  618.     lxi    d,ERRMSG
  619.     cz    FINIS
  620. ;
  621.     call    SOURCE        ;get source disk for CPM3.SYS
  622. CNTNUE:
  623.     lda    GDISK        ;Acc = source disk
  624.     sui    'A'
  625.     mvi    d,00h
  626.     mov    e,a        ;DE = selected disk
  627.     call    SELCT
  628. ; now copy the FCBs
  629.     mvi    c,36        ;for copy
  630.     lxi    d,SFCB        ;source file
  631.     lxi    h,DFCB        ;destination file
  632. MFCB:
  633.  
  634.     ldax    d
  635.     inx    d        ;ready next
  636.     mov    m,a
  637.     inx    h        ;ready next dest
  638.     dcr    c        ;decrement coun
  639.     jnz    MFCB
  640. ;
  641.     lda    GDISK        ;Acc = source disk
  642.     sui    40h        ;correct disk
  643.     lxi    h,SFCB
  644.     mov    m,a        ;SFCB has source disk #
  645.     lda     PDISK        ;get the dest. disk
  646.     lxi    h,DFCB        ;
  647.     sui    040h        ;normalize disk
  648.     mov    m,a
  649. ;
  650.     xra    a        ;zero out a
  651.     sta    DFCBCR        ;current rec = 0
  652. ;
  653. ; Source and destination fcb's ready
  654. ;
  655.     lxi    d,SFCB        ;
  656.     call    OPEN        ;open the file
  657.     lxi    d,NOFILE    ;error messg
  658.     inr    a        ;255 becomes 0
  659.     cz    FINIS        ;done if no file
  660. ;
  661. ; Source file is present and open
  662.     lxi    d,LOADP        ;get DMA address
  663.     xchg            ;move address to HL regs
  664.     shld    BEGIN        ;save for begin of write
  665. ;
  666.     lda    BEGIN        ;get low byte of
  667.     mov    l,a        ;DMA address into L
  668.     lda    BEGIN+1        ;
  669.     mov    h,a        ;into H also
  670. COPY1:
  671.     xchg            ;DE = address of DMA
  672.     call    DSTDMA        ;
  673. ;
  674.     lxi    d,SFCB        ;
  675.     call    DREAD        ;read next record
  676.     ora    a        ;end of file?
  677.     jnz    EOF        ;skip write if so
  678. ;
  679.     lda    CRNREC
  680.     inr    a        ;bump it
  681.     sta    CRNREC
  682. ;
  683.     lda    BEGIN
  684.     mov    l,a
  685.     lda    BEGIN+1
  686.     mov    h,a
  687.     lxi    d,EIGHTY
  688.     dad    d        ;add eighty to begin address
  689.     shld    BEGIN
  690.     jmp    COPY1        ;loop until EOF
  691. ;
  692. EOF:
  693.     lxi    d,DONE
  694.     call    OUTMSG
  695. ;
  696. COPY2:
  697.     call    DESTIN        ;get destination drive for CPM3.SYS
  698.     lxi    d,DFCB        ;set up dest FCB
  699.     xchg    
  700.     lda    PDISK
  701.     sui    040h        ;normalize disk
  702.     mov    m,a        ;correct disk for dest
  703.     xchg            ;DE = DFCB
  704.     call    DELETE        ;delete file if there
  705. ;
  706.     lxi    d,DFCB        ;
  707.     call    MAKE        ;make a new one
  708.     lxi    d,NODIR
  709.     inr    a        ;check directory space
  710.     cz    FINIS        ;end if none
  711. ;
  712.     lxi    d,LOADP
  713.     xchg
  714.     shld    BEGIN
  715. ;
  716.     lda    BEGIN
  717.     mov    l,a
  718.     lda    BEGIN+1
  719.     mov    h,a
  720. LOOP2:
  721.     xchg
  722.     call    DSTDMA
  723.     lxi    d,DFCB
  724.     call    DWRITE
  725.     lxi    d,FSPACE
  726.     ora    a
  727.     cnz    FINIS
  728.     lda    CRNREC
  729.     dcr    a
  730.     sta    CRNREC
  731.     cpi    0
  732.     jz    FNLMSG
  733.     lda    BEGIN
  734.     mov    l,a
  735.     lda    BEGIN+1
  736.     mov    h,a
  737.     lxi    d,EIGHTY
  738.     dad    d
  739.     shld    BEGIN
  740.     jmp    LOOP2
  741. ; Copy operation complete
  742. FNLMSG:
  743.     lxi    d,DFCB
  744.     mvi    c,CLOSEF
  745.     call    BDOS
  746. ;
  747.     lxi    d,DONE
  748. ;
  749. FINIS:
  750. ; Write message given by DE, reboot
  751.     call    OUTMSG
  752. ;
  753. REBOOT:
  754.     mvi    c,13
  755.     call    BDOS
  756.     call    CRLF
  757.     jmp    BOOT
  758. ;
  759. BADDISK:
  760.     lxi    d,QDISK
  761.     call    CRMSG
  762.     ret
  763. ;****************************
  764. ;*
  765. ;*
  766. ;*    DATA STRUCTURES     
  767. ;*
  768. ;*
  769. ;****************************
  770. ;
  771. BIOSPB:
  772. ; BIOS Parameter Block
  773. BIOSFC:    db    0        ;BIOS function number
  774. AREG:    db    0        ;A register contents
  775. CREG:    db    0        ;C register contents
  776. BREG:    db    0        ;B register contents
  777. EREG:    db    0        ;E register contents
  778. DREG:    db    0        ;D register contents
  779. HLREG:    dw    0        ;HL register contents
  780. ;
  781. SFCB:
  782. DR:    ds    1
  783. F1F8:    db    'CPM3    '
  784. T1T3:    db    'SYS'
  785. EXT:    db    0
  786. CS:    db    0
  787. RS:    db    0
  788. RCC:    db    0
  789. D0D15:    ds    16
  790. CCR:    db    0
  791. R0R2:    ds    3
  792. ;
  793. DFCB:    ds    36
  794. DFCBCR    equ    DFCB+32
  795. ;
  796. ;
  797. V3FLG:    db    0        ;flag for version #
  798. TEMP:    db    0
  799. SDISK:    ds    1        ;selected disk
  800. BEGIN:    dw    0
  801. DFLAG:    db    0
  802. TRACK:    ds    1        ;current track
  803. CRNREC:    db    0        ;current rec count
  804. SECTOR:    ds    1        ;current sector
  805. RW:    ds    1        ;read if 0 write if 1
  806. DMADDR:    ds    2        ;current DMA address
  807. RETRY:    ds    1        ;number of tries on this sector
  808. SIGNON:    db    'CP/M 3 COPYSYS - Version '
  809.     db    VERS/10+'0','.',VERS mod 10 +'0'
  810.     db    '$'
  811. GETPRM:    db    'Source drive name (or return for default) $'
  812. VERGET:    db    'Source on '
  813. GDISK:    ds    1
  814.     db    ' then type return $'
  815. PUTPRM:    db    'Destination drive name (or return to reboot) $'
  816. VERPUT:    db    'Destination on '
  817. PDISK:    ds    1
  818.     db    ' then type return $'
  819. CPYMSG:    db    'Do you wish to copy CPM3.SYS? $'
  820. DONE:    db    'Function complete$'
  821. ;
  822. ; Error messages......
  823. ;
  824. QDISK:    db    'ERROR: Invalid drive name (Use A, B, C, or D)$'
  825. NOFILE:    db    'ERROR: No source file on disk.$'
  826. NODIR:    db    'ERROR: No directory space.$'
  827. FSPACE:    db    'ERROR: Out of data space.$'
  828. WRPROT:    db    'ERROR: Write protected?$'
  829. ERRMSG: db    'ERROR: Possible incompatible disk format.'
  830.     db    CR,LF,' Type return to ignore.$' 
  831. CLSERR:    db    'ERROR: Close operation failed.$'
  832. ;
  833.     ds    STACKSIZE * 3
  834. STACK:
  835.     end
  836.