home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol136 / ffc.asm < prev    next >
Encoding:
Assembly Source File  |  1984-04-29  |  10.7 KB  |  644 lines

  1.     .PAGE 96
  2.     .TITLE    'FFC - FAST DISK DUPLICATION PROGRAM'
  3.     .SBTTL    'EQUATES'
  4.     .PREL
  5.     .PHEX
  6. ;    W EARNEST MOD 4/03/82
  7. ;    5/14/82 ADD FORMAT CODE
  8. ;    9/1/82 CHANGE STEP AND SKEW FOR NEW DRIVES
  9. ;    1/16/83 FIX REFORM FLAG BUG
  10. ;    2/11/83 FIX STOP TEST BUG
  11. ;    7/29/83 MOD DRIVE RDY TEST
  12. ;    FOR BIGBOARD SYSTEM DATA ONLY COPY
  13. VER    =    1
  14. REV    =    5
  15.     .PROGID    FFC,VER,REV
  16. ;
  17. ;    BIOS ENTRY POINT OFFSETS
  18. ;
  19. CONSTA    =    06H    ;CONSOLE STATUS (A=0, NO DATA)
  20. CONIN    =    09H    ;CONSOLE INPUT (INTO A)
  21. CONOUT    =    0CH    ;CONSOLE OUTPUT (FROM C)
  22. SELDSK    =    1BH    ;SELECT DISK (FROM C, 0..1)
  23. SETTRK    =    1EH    ;SET TRACK (FROM C, 0..76)
  24. SETSEC    =    21H    ;SET SECTOR (FROM C, 1..26)
  25. SETDMA    =    24H    ;SET DMA ADDRESS (FROM BC)
  26. READ    =    27H    ;READ SECTOR INTO DMA BUFFER
  27. WRITE    =    2AH    ;WRITE SECTOR FROM DMA BUFFER
  28. ;
  29. DISK    =    10H        ;DISK BASE ADDR
  30. DCOM    =    DISK            ;DISK COMMAND PORT
  31. STATP    =    DISK        ;DISK STATUS PORT
  32. TRACK    =    DISK+1            ;DISK TRACK COMMAND
  33. SECTP    =    DISK+2            ;DISK SECTOR PORT
  34. DDATA    =    DISK+3            ;DISK DATA PORT
  35. ROMSEL    =    0F01BH        ;FERGUSON SELECT SUBR.
  36. NMIVEC    =    066H        ;NMI ADDRESS
  37. STEP    =    1        ;STEPPING RATE 2=10 MSEC,1=6 MSEC
  38. LF    =    0AH    ;LINE FEED
  39. CR    =    0DH    ;CARRIAGE RETURN
  40. BELL    =    07H    ;BELL
  41. ;
  42. FCB    =    5CH
  43. BOOT    =    0000H
  44. BDOS    =    5
  45. NBPT    =    128*26
  46. SKEW    =    7
  47. DRVI    =    0    ;DRIVE A INPUT
  48. DRVO    =    1    ;DRIVE B OUTPUT
  49. ;
  50.     .SBTTL    'MAIN COPY ROUTINE'
  51. START:    LXI    SP,STACK+64
  52.     XRA    A
  53.     STA    RFORM
  54. ;
  55. ;    PRINT HEADING
  56. ;
  57. NEXTC:    LXI    H,STR1
  58.     CALL    WASC
  59.     CALL    CRCK
  60. REDO:    MVI    A,2    ;START TRACK
  61.     STA    TRKI
  62.     STA    TRKO
  63.     STA    TRKV
  64.     MVI    A,77
  65.     STA    STPTRK    ;DEFAULT FULL DISK
  66.     MVI    A,5    ;NR OF PASSES
  67.     STA    PASCNT
  68. ;
  69. ;    BEGIN MAIN LOOP
  70. ;
  71.     CALL    CRLF
  72.     MVI    A,10    ;RETRYS ALLOWED
  73.     STA    ERCNT
  74. COPY1:    MVI    C,DRVI
  75.     MVI    E,SELDSK
  76.     CALL    BIOSC
  77.     CALL    DRDYTS
  78.     JRNZ    COPY1
  79.     MVI    A,'R'
  80.     STA    RWCHR
  81.     CALL    INIPAS
  82. COPY2:    LHLD    PTR    ;READ NEXT N TRACKS
  83.     LDA    TRKI
  84.     CALL    WSTS
  85.     CALL    RDTRK
  86.     CALL    CKEMT
  87.     JRNZ    ..A    ;THIS TRACK HAS DATA
  88.     LDA    TRKI
  89.     STA    STPTRK    ;MARK IT AS TOO FAR
  90.     JMPR    COPY2A
  91. ..A:    CALL    INCSEC
  92.     LDA    TRKI
  93.     INR    A
  94.     STA    TRKI
  95.     LDA    TRKCNT
  96.     DCR    A
  97.     STA    TRKCNT
  98.     JRNZ    COPY2
  99. ;
  100. COPY2A:    MVI    C,DRVO
  101.     MVI    E,SELDSK
  102.     CALL    BIOSC
  103.     CALL    DRDYTS
  104.     JRNZ    COPY2A
  105.     MVI    A,'W'
  106.     STA    RWCHR
  107.     CALL    INIPAS
  108. COPY3:    LHLD    PTR    ;WRITE NEXT N TRACKS
  109.     LDA    TRKO
  110.     CALL    WSTS
  111.     CALL    WRTRK
  112.     CALL    INCSEC
  113.     LDA    TRKO
  114.     INR    A
  115.     STA    TRKO
  116.     MOV    L,A    ;HOLD NEXT TRACK
  117.     LDA    STPTRK
  118.     SUB    L    ;THERE YET?
  119.     JRZ    COPY4    ;TIME TO STOP, FOUND EMPTY
  120.     JM    COPY4    ;IN CASE OVERSHOOT
  121.     LDA    TRKCNT
  122.     DCR    A
  123.     STA    TRKCNT
  124.     JRNZ    COPY3
  125. ;
  126.     LDA    PASCNT
  127.     DCR    A
  128.     STA    PASCNT
  129.     JNZ    COPY1    ;LOOP UNTIL ALL PASSES DONE
  130. ;
  131. COPY4:    LXI    H,STR5    ;PRINT 'COPY COMPLETE'
  132.     CALL    WASC
  133.     JMP    START    ;RESTART IT, CLEAN FLAGS
  134. ;
  135. INIPAS:    LXI    H,TRKBUF
  136.     SHLD    PTR
  137.     MVI    A,15    ;TRKCNT = NUMBER OF TRACKS PER PASS
  138.     STA    TRKCNT
  139.     MVI    A,1
  140.     STA    STSECT
  141.     RET
  142. ;
  143. INCSEC:    LHLD    PTR
  144.     LXI    D,NBPT
  145.     DAD    D
  146.     SHLD    PTR
  147.     LDA    STSECT
  148.     ADI    SKEW
  149.     CPI    27
  150.     JRC    ..A
  151.     SUI    26
  152. ..A:    STA    STSECT
  153.     RET
  154.     .SBTTL    'READ/WRITE ROUTINES'
  155. ;
  156. ;    RDTRK - READ ABSOLUTE TRACK INTO MEMORY
  157. ;
  158. ;    ENTRY CONDITIONS
  159. ;    HL........FWA OF AREA TO READ TRACK INTO
  160. ;    A.........TRACK NUMBER (0 TO 76)
  161. ;
  162. RDTRK:    PUSH    D
  163.     PUSH    H
  164.     CALL    INIRW
  165. RTRK0:    MVI    B,26    ;SECTOR COUNTER
  166.     LDA    STSECT    ;INITIAL SECTOR #
  167.     MOV    C,A    ;SECTOR NR IN C
  168. RDTRK1:    PUSH    B
  169.     CALL    INISEC
  170.     MVI    E,READ
  171.     CALL    BIOSC    ;READ A SECTOR
  172.     ORA    A    ;OK?
  173.     JNZ    RERR    ;NO GOOD
  174.     CALL    INCPTR
  175.     POP    B
  176.     CALL    SECINC
  177. NOWRP3:    DJNZ    RDTRK1
  178.     POP    H
  179.     POP    D
  180.     RET
  181. ;
  182. RERR:    POP    B    ;CLEAN STACK
  183.     LXI    H,RERCT
  184.     DCR    M
  185.     JZ    HERR    ;HARD ERROR
  186.     LHLD    HLDDMA
  187.     SHLD    DMAPTR    ;RESET IT
  188.     JMP    RTRK0
  189. ;
  190. INIRW:    SHLD    DMAPTR
  191.     SHLD    HLDDMA
  192.     MOV    C,A
  193.     MVI    E,SETTRK
  194.     CALL    BIOSC
  195.     MVI    A,5
  196.     STA    RERCT
  197.     RET
  198. ;
  199. INISEC:    MVI    E,SETSEC
  200.     CALL    BIOSC
  201.     LBCD    DMAPTR
  202.     MVI    E,SETDMA
  203.     JMP    BIOSC
  204. ;
  205. INCPTR:    LHLD    DMAPTR
  206.     LXI    D,80H
  207.     DAD    D
  208.     SHLD    DMAPTR    ;UPDATE POINTER
  209.     RET
  210. ;
  211. SECINC:    INR    C
  212.     MOV    A,C
  213.     CPI    27
  214.     RC
  215.     SUI    26
  216.     MOV    C,A
  217.     RET
  218. ;
  219. ;    WRTRK - WRITE ABSOLUTE TRACK FROM MEMORY
  220. ;
  221. ;    ENTRY CONDITIONS
  222. ;    HL........FWA OF AREA TO WRITE TRACK FROM
  223. ;    A.........TRACK NUMBER (0 TO 76)
  224. ;
  225. WRTRK:    PUSH    D
  226.     PUSH    H
  227.     CALL    INIRW
  228. RWRTRK:    LDA    STSECT    ;INITIAL SECTOR #
  229.     MOV    C,A
  230.     MVI    B,26    ;SECTOR COUNT
  231. WRTRK1:    PUSH    B
  232.     CALL    INISEC
  233.     MVI    E,WRITE
  234.     CALL    BIOSC
  235.     ORA    A
  236.     JNZ    WERR
  237.     CALL    INCPTR
  238.     POP    B
  239.     CALL    SECINC
  240. NOWRP4:    DJNZ    WRTRK1
  241. ;
  242.     LXI    H,VBUF
  243.     SHLD    DMAPTR
  244.     LDA    STSECT
  245.     MOV    C,A
  246.     MVI    B,26
  247. VTRK1:    PUSH    B
  248.     CALL    INISEC
  249.     MVI    E,READ
  250.     CALL    BIOSC
  251.     ORA    A
  252.     JNZ    VERR
  253.     CALL    INCPTR
  254.     POP    B
  255.     CALL    SECINC
  256. NOWRP5:    DJNZ    VTRK1
  257.     POP    H
  258.     POP    D
  259.     RET
  260. ;
  261. VERR:    POP    B    ;CLEAN UP STACK
  262.     LXI    H,ERCNT
  263.     DCR    M
  264.     LXI    H,STR7    ;DEST ERR, SOFT?
  265.     JZ    XERR
  266.     POP    H    ;RECOV BUFFER ADDR AT START
  267.     PUSH    H
  268.     SHLD    DMAPTR
  269.     JMP    RWRTRK
  270. ;
  271. WERR:    POP    B
  272.     LXI    H,RERCT
  273.     DCR    M
  274.     LXI    H,STR4
  275.     JRZ    XERR    ;WRITE ERROR, MAYBE SOFT
  276.     LHLD    HLDDMA
  277.     SHLD    DMAPTR
  278.     JMP    RWRTRK    ;TRY WRITE AGAIN
  279. ;
  280. HERR:    LXI    H,STR3    ;HARD SOURCE ERROR MESSAGE
  281.     JMP    ERRC
  282. ;
  283. XERR:    CALL    WASC    ;REPORT DEST ERR
  284.     LDA    RFORM    ;HISTORY
  285.     ORA    A
  286.     JNZ    ERR    ;HARD ERROR
  287.     POP    B
  288.     DCR    A
  289.     STA    RFORM    ;NARK FORMAT NOW
  290.     LXI    H,STR6
  291.     CALL    WASC
  292.     CALL    FORMT    ;REFORMAT THE DEST
  293.     JMP    REDO
  294. ;
  295. ERR:    LXI    H,STR2    ;HARD DEST ERROR
  296. ERRC:    CALL    WASC
  297.     JMP    START
  298. ;
  299. ;    WASC - WRITE ASCII STRING TO CONSOLE
  300. ;
  301. WASC:    MOV    A,M
  302.     ORA    A
  303.     RZ
  304.     CALL    WACC
  305.     INX    H
  306.     JMPR    WASC
  307. ;
  308. ;    CRLF - WRITE END OF LINE TO CONSOLE
  309. ;
  310. CRLF:    MVI    A,CR
  311.     CALL    WACC
  312.     MVI    A,LF
  313. ;
  314. ;    WACC - WRITE ASCII CHARACTER TO CONSOLE
  315. ;
  316. WACC:    PUSH    H
  317.     PUSH    D
  318.     PUSH    B
  319.     MOV    C,A
  320.     MVI    E,CONOUT
  321.     CALL    BIOSC
  322.     POP    B
  323.     POP    D
  324.     POP    H
  325.     RET
  326. ;
  327. ;    RACC - READ ASCII CHARACTER FROM CONSOLE
  328. ;
  329. RACC:    PUSH    H
  330.     PUSH    D
  331.     PUSH    B
  332. KBLP:    CALL    CONSTT
  333.     ORA    A
  334.     JRZ    KBLP    ;WAIT FOR SOMETHING
  335.     MVI    E,CONIN
  336.     CALL    BIOSC
  337.     ANI    7FH
  338.     POP    B
  339.     POP    D
  340.     POP    H
  341.     RET
  342. ;
  343. CONSTT:    MVI    A,30    ;HALF MIN
  344.     STA    0FF6CH    ;KEEP DISK MOTORS ON
  345.     MVI    E,CONSTA
  346.     CALL    BIOSC
  347.     RET
  348. ;
  349. ;    CRCK - TEST FOR CR INPUT
  350. ;
  351. CRCK:    CALL    RACC
  352.     CPI    0DH
  353.     RZ
  354.     CPI    3
  355.     JZ    BOOT
  356.     CPI    60H
  357.     JRC    ..A
  358.     ANI    5FH
  359. ..A:    CPI    'F'
  360.     JRNZ    CRCK
  361.     CALL    FORMT
  362.     JMP    START
  363. ;
  364. WSTS:    PUSH    PSW
  365.     MVI    A,0DH    ;CR
  366.     CALL    WACC
  367.     LDA    RWCHR
  368.     CALL    WACC
  369.     MVI    A,' '
  370.     CALL    WACC
  371.     POP    PSW
  372.     PUSH    PSW
  373.     CALL    HXBYT
  374.     POP    PSW
  375.     RET
  376. ;
  377. HXBYT:    PUSH    PSW
  378.     RAR
  379.     RAR
  380.     RAR
  381.     RAR
  382.     CALL    HOUT
  383.     POP    PSW
  384. HOUT:    ANI    0FH
  385.     ADI    90H
  386.     DAA
  387.     ACI    40H
  388.     DAA
  389.     JMP    WACC
  390. ;
  391. BIOSC:    MVI    D,0    ;FORCE LOW
  392.     LXI    H,0EA00H    ;BIOS START ADDR
  393.     DAD    D    ;CALC ADDR
  394.     PCHL        ;DO CALL
  395. ;
  396. DRDYTS:    IN    DISK
  397.     BIT    7,A
  398.     RZ        ;DRIVE IS READY
  399. DRDYLP:    IN    DISK
  400.     CMA
  401.     BIT    7,A
  402.     RNZ        ;DRIVE IS READY
  403.     CALL    CONSTT
  404.     ORA    A
  405.     JRZ    DRDYLP    ;WAIT FOR SOMETHING
  406.     MVI    E,CONIN
  407.     CALL    BIOSC
  408.     ANI    7FH
  409.     CPI    'C'-40H
  410.     JZ    START    ;ABORT IT
  411.     JMP    DRDYLP    ;TEST AGAIN
  412. ;
  413. CKEMT:    PUSH    H
  414.     PUSH    B
  415.     LHLD    HLDDMA    ;DATA START
  416.     LXI    B,26*128    ;AMOUNT OF DATA
  417. EMTLP:    MOV    A,M
  418.     CPI    0E5H        ;NULL PATTERN
  419.     JRNZ    ..A        ;NOT EMPTY
  420.     INX    H
  421.     DCX    B
  422.     MOV    A,B
  423.     ORA    C
  424.     JRNZ    EMTLP
  425. ..A:    POP    B
  426.     POP    H
  427.     RET
  428. ;
  429. FORMT:    DI            ;NO INTERRUPTS BUT NMI (NO CLOCK)
  430.     LXI    H,26
  431.     SHLD    FSECT        ;DEFINE # SECTORS & FIRST TRK
  432.     MVI    C,1
  433.     CALL    ROMSEL
  434.     CALL    HOME
  435.     CALL    DOFORM
  436. ENDFIL:    CALL    HOME
  437.     MVI    C,0
  438.     CALL    ROMSEL
  439.     EI            ;INTERRUPTS OK NOW
  440.     JMP    CRLF        ;BACK TO MENU
  441. ;
  442. ;    DISK FORMATTING ROUTINES.
  443. ;
  444. DOFORM:    LXI    H,TRKBUF    ;POINT TO TRACK BUFFER
  445.     MVI    A,'F'
  446.     STA    RWCHR
  447.     XRA    A
  448.     CALL    WSTS
  449.     CALL    INDX
  450. DOF1:    CALL    ADDR
  451.     CALL    DATA
  452.     LDA    FSECT
  453.     DCR    A        ;DECR SECTOR COUNT
  454.     STA    FSECT
  455.     JNZ    DOF1
  456.     CALL    FILBUF        ;FILL END OF BUFFER WITH FF'S
  457.     LXI    D,TRKBUF
  458.     ORA    A
  459.     DSBC    D        ;CALC SIZE OF BUFFER BUILT
  460.     INR    H        ;ADJUST FOR FIRST DCR
  461.     SHLD    CNTSAV        ;NEED MORE THAN ONCE
  462.     LXI    H,NMWCOD
  463.     LXI    B,NMWEND-NMWCOD
  464.     LXI    D,NMIVEC
  465.     LDIR
  466. ;
  467. DOF4:    LXI    H,TRKBUF    ;POINT TO FORMAT BUFFER
  468.     CALL    FILADR        ;PLACE TRACK AND SECTOR NRS IN BUFF
  469.     LXI    H,TRKBUF    ;POINT TO TRACK BUFFER
  470.     LXI    B,DDATA        ;DATA PORT FOR OUTI,CLEAR B
  471.     LDED    CNTSAV        ;REALLY JUST D REG
  472.     IN    STATP        ;CLEAR ANY LEFTOVER FLAGS
  473.     MVI    A,0F4H        ;TRACK WRITE COMMAND
  474.     CALL    CMDOUT        ;START & KILL SOME TIME
  475. ;
  476. DOF7:    HLT            ;WAIT FOR INTERRUPT
  477.     JMP    DOF7        ;LOOP TILL ALL DONE
  478. ;
  479. TRKDUN:    CALL    BUSY        ;MAKE SURE SHUT DOWN
  480.     ANI    0FFH        ;TEST IT
  481.     JNZ    ERRMSG        ;ERROR HERE, DIDNT WORK
  482.     LDA    TRK        ;TRACK NO
  483.     INR    A        ;INCREMENT IT
  484.     STA    TRK
  485.     CPI    77        ;PAST LAST TRK?
  486.     RZ            ;IF DONE ALL TRACKS
  487.     CALL    WSTS
  488.     MVI    A,58H+STEP    ;STEP COMMAND,NO VERIF
  489.     CALL    WTCMD        ;ISSUE IT
  490.     JMP    DOF4
  491. ;
  492. WTCMD:    CALL    CMDOUT        ;EXECUTE & FALL THRU
  493. ;
  494. BUSY:    IN    STATP        ;TEST 1771 BUSY
  495.     BIT    0,A
  496.     JNZ    BUSY        ;LOOP TILL FINISHED
  497.     RET
  498. ;
  499. CMDOUT:    OUT    DCOM        ;ISSUE COMMAND
  500. PAUSE:    XTHL
  501.     XTHL
  502.     RET
  503. ;
  504. ;    INDX  -  INDEX BLOCK FOR IBM FORMATS (NOT REQUIRED FOR 1771)
  505. ;            73 IN MEM, 73 ON DSK
  506. ;
  507. INDX:    LXI    B,40<8+0FFH    ;40 COUNT,ONES BYTE
  508.     CALL    MOVEIT        ;STORE THE BLOCK
  509.     LXI    B,6<8+0        ;COUNT 6, ZERO DATA
  510.     CALL    MOVEIT        ;STORE THE BLOCK
  511.     MVI    M,0FCH        ;INDEX MARK
  512.     INX    H        ;INCR POINTER
  513.     LXI    B,26<8+0FFH    ;NOW 26 MORE FF'S
  514.     JMP    MOVEIT        ;STORE THE BLOCK
  515. ;
  516. ;    ADDR  -  ADDRESS BLOCK  12 IN MEM, 13 ON DSK
  517. ;
  518. ADDR:    LXI    B,6<8+0        ;WRITE 6 ZEROS
  519.     CALL    MOVEIT
  520.     MVI    M,0FEH        ;ID ADDRESS MARK
  521.     INX    H
  522.     MVI    B,4        ;TRACK AND SECTOR ZERO INITIALLY
  523.     CALL    MOVEIT
  524.     MVI    M,0F7H        ;WRITE 2 CRC'S
  525.     INX    H
  526.     RET
  527. ;
  528. ;    DATA  -  WRITE DATA BLOCK FILLED WITH E5'S
  529. ;            180 IN MEM, 181 ON DSK
  530. DATA:    LXI    B,11<8+0FFH    ;WRITE 11 FF'S
  531.     CALL    MOVEIT
  532.     LXI    B,6<8+0        ;NOW 6 ZEROS
  533.     CALL    MOVEIT
  534.     MVI    M,0FBH        ;DATA ADDRESS MARK
  535.     INX    H
  536.     LXI    B,128<8+0E5H    ;DATA FILL CHARACTER
  537.     CALL    MOVEIT
  538.     MVI    M,0F7H        ;WRITE 2 CRC'S
  539.     INX    H
  540.     LXI    B,33<8+0FFH    ;INTERRECORD GAP, FALL THRU
  541. ;
  542. ;    MOVEIT ROUTINE HL --> MEMORY, DE = COUNT, B CONTAINS BYTE
  543. ;
  544. MOVEIT:    MOV    M,C        ;STORE BYTE
  545.     INX    H
  546.     DJNZ    MOVEIT
  547.     RET
  548. ;
  549. ;    FILADR  -  FILL IN TRACK AND SECTOR NUMBERS
  550. ;
  551. FILADR:    LXI    B,26*256+1
  552.     LXI    D,190        ;FILL ADDR OFFSET (180+12)-2
  553.     LXI    H,TRKBUF+80    ;LOCATION OF FIRST TRACK NUMBER
  554. FIL01:    LDA    TRK        ;TRACK NO
  555.     MOV    M,A        ;TO BUFFER
  556.     INX    H
  557.     INX    H        ;POINT TO SECTOR
  558.     MOV    M,C        ;SECTOR NUMBER TO BUFFER
  559.     DAD    D        ;INCR BUFFER POINTER
  560.     INR    C        ;INCR SECTOR MAP NUMBER
  561.     DJNZ    FIL01
  562.     RET
  563. ;
  564. ;    FILBUF  -  FILL END OF TRACK WITH FF'S
  565. ;
  566. FILBUF:    LXI    D,1024        ;END OF TRACK FILL
  567.     MVI    C,0FFH        ;FILL CHAR
  568. ET1:    MOV    M,C
  569.     INX    H
  570.     DCX    D        ;DECR COUNT
  571.     MOV    A,D
  572.     ORA    E
  573.     JNZ    ET1
  574.     RET
  575. ;
  576. ;  ERROR ROUTINE
  577. ;
  578. ERRMSG:    JMP    ENDFIL
  579. ;
  580. ;    HOME SELECTED DRIVE
  581. ;
  582. HOME:    IN    STATP        ;CHECK IF BUSY
  583.     RRC
  584.     JC    HOME
  585.     MVI    A,0+STEP        ;HOME COMMAND
  586.     CALL    WTCMD        ;ISSUE COMMAND, WAIT TILL NOT BUSY
  587.     IN    STATP        ;READ DISK STATUS
  588.     ANI    4        ;CHECK TRACK ZERO FLAG
  589.     RNZ
  590. ;
  591. HOMERR:    JMP    ENDFIL        ;EXIT
  592. ;
  593. NMWCOD:    OUTI
  594.     RNZ
  595.     DCR    D
  596.     RNZ
  597.     POP    D
  598.     JMP    TRKDUN
  599. NMWEND    =    .
  600. ;
  601. ;    STRING DATA
  602. ;
  603. STR1:    .ASCII    'Fast Disk Duplicator Utility'
  604.     .ASCII    ' V '[VER+'0']'.'[REV+'0']' '
  605.     .DATE    
  606.     .BYTE    CR,LF
  607.     .ASCII    'Source in Drive 0(A), Blank  in Drive 1(B)'[CR][LF]
  608.     .ASCII    'Press RETURN to copy, "F" to format,'[CR][LF]
  609.     .ASCIZ    'Ctrl-C to Exit.'[CR][LF]
  610. STR2:    .ASCIZ    ' error, Disk Unsalvagable, Aborting'[BELL][CR][LF]
  611. STR3:    .ASCIZ    [CR][LF][BELL]'HARD Error on Source disk, Aborting'[CR][LF]
  612. STR4:    .ASCIZ    [CR][LF]'Write'
  613. STR5:    .ASCIZ    [CR][LF]'COPY COMPLETE'[BELL][CR][LF][LF]
  614. STR6:    .ASCIZ    [BELL]' error, Attempting reformat'[CR][LF]
  615. STR7:    .ASCII    [CR][LF]'Verification'
  616. ;
  617.     .LOC    .DATA.
  618. ;
  619. TRKNO:    .BLKB    1    ;TRACK NUMBER
  620. DMAPTR:    .BLKW    1    ;DMA POINTER
  621. HLDDMA:    .BLKW    1    ;DMA HOLD FOR RETRY
  622. CNTSAV:    .BLKW    1        ;D REG SAVE OF BUFFER SIZE CNT
  623. FSECT:    .BLKB    1        ;SECTOR COUNT USED IN FORMATTING
  624. TRK:    .BLKB    1        ;TRACK NUMBER USED IN FORMATTING DISK
  625. ;
  626. PTR:    .BLKW    1
  627. VPTR:    .BLKW    1
  628. TRKI:    .BLKB    1    ;INPUT TRACK NUMBER
  629. TRKO:    .BLKB    1    ;OUTPUT TRACK NUMBER
  630. TRKV:    .BLKB    1    ;VERIFY TRACK NUMBER
  631. STPTRK:    .BLKB    1
  632. RFORM:    .BLKB    1
  633. RWCHR:    .BLKB    1    ;R OR W FOR STATUS
  634. ERCNT:    .BLKB    1    ;ERROR COUNTER
  635. RERCT:    .BLKB    1    ;RETRY COUNTER
  636. PASCNT:    .BLKB    1    ;PASS COUNT
  637. TRKCNT:    .BLKB    1    ;TRACK COUNT
  638. STSECT:    .BLKB    1    ;STARTING SECTOR
  639. STACK:    .BLKW    32
  640. VBUF:    .BLKB    26*128
  641. TRKBUF    =    .
  642. ;
  643.     .END    START
  644.