home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / dskutl / xformat.lbr / FFC.AQM / FFC.ASM
Encoding:
Assembly Source File  |  1986-10-21  |  11.9 KB  |  647 lines

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