home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Misc / GXY-INF.LHA / infos / a_copy1_2.s next >
Encoding:
Text File  |  1996-03-09  |  122.7 KB  |  4,206 lines

  1. taste          = $BFEC01
  2. Cont           = $BFEE01
  3. IntCon         = $BFED01
  4. MaxWart        = $4000
  5. MinWart        = $1000
  6. ;
  7. ;------- graphics.library ------
  8. ;
  9. Textaus              = -30 - 30InitRastPort         = -30 -168
  10. Movee                = -30 -210Draw                 = -30 -216
  11. RectFill             = -30 -276
  12. SetAPen              = -30 -312
  13. InitBitMap           = -30 -360
  14. ;
  15. ;--------- exec.library --------
  16. ;
  17. ExecBase             =        4
  18. ;
  19. AllocMem             = -30 -168
  20. AvailMem             = -216
  21. FreeMem              = -30 -180
  22. OldOpenLibrary       = -30 -378
  23. CloseLibrary         = -30 -384
  24. FindName             = -276
  25. ;
  26. MEMF_Chip            = $02
  27. MEMF_Fast            = $04
  28. MEMF_Largest         = $20000
  29.  
  30. DevList              = 350
  31. Port                 = 36                      ;Drive 0
  32. IDNestCnt      = 294
  33.  
  34. ;
  35. ;-------------------------------
  36. ;
  37. floppy_size = floppyend - floppy
  38.  
  39. floppy_s       = floppy_size/6-1
  40.  
  41. ON             = 1
  42. OFF            = 0
  43.  
  44. ;Error-Flag Werte
  45.  
  46. NoError        = $0000
  47. KeineSync      = $0001
  48. Längeungleich  = $0002
  49. Längeungleich2 = $0003
  50. KeineDisk      = $0004
  51. ReadError      = $0005
  52. VerifyError    = $0006
  53. DiskProtect    = $0007
  54. NotProtect     = $0008
  55. Escape         = $0009
  56.  
  57. CopyVersuche1  = 3                       ;Versuche, bei illegalen Daten
  58. CopyVersuche2  = 3                       ;Versuche, bei NoSync
  59.  
  60. ;Ladeoptionen
  61.  
  62. OhneSync       = $0000
  63. MitSync        = $ffff
  64.  
  65. ;Schreiboptionen
  66.  
  67. NoIndex        = $0000
  68. IndexOk        = $ffff
  69.  
  70. ;Größe des belegten Speichers
  71.  
  72. SortBlockAnz  = $40      ;Anzahl der Blöcke deren Längen Sortiert werden
  73. Bytelesen      = $3600
  74. BSize          = 2*Bytelesen
  75. req            = 2        ;Chip Memory
  76. CIAA           = $BFE000
  77.  
  78. Lückenlänge    = $500    ;Länge der Lücke bei FastCopy
  79. AnzLesenF      = 5       ;Anzahl der Leseversuche bei Readerror (Fast)
  80.  
  81. ;Werte für Cruncher
  82.  
  83. KurzNull       = $80
  84. MittelNull     = $20
  85. LangNull       = $08
  86. KurzNorm       = $40
  87. MittelNorm     = $10
  88. LangNorm       = $04
  89. KurzKein       = $c0
  90. MittelKein     = $30
  91. LangKein       = $02
  92. LeerBlock      = $01
  93.  
  94.  
  95.                lea DevName,a1
  96.                move.l $4,a6
  97.                lea DevList(a6),a0
  98.                jsr FindName(a6)
  99.                move.l d0,a0
  100.                beq Ende
  101.                lea Port(a0),a0
  102.                clr.w d0
  103. \An2:          tst.l (a0)+
  104.                beq \An1
  105.                bset d0,Drives
  106. \An1:          addq.w #1,d0
  107.                cmp.w #4,d0
  108.                bne.s \An2
  109.         move.l ExecBase,a6
  110.         lea    gfxname,a1
  111.         jsr    OldOpenLibrary(a6)
  112.         move.l d0,gfxbase
  113.         beq  no_gfxbase
  114.  
  115.         move.l #$2800,d0
  116.         move.l #$10002,d1
  117.         jsr    AllocMem(a6)
  118.         move.l d0,bit_adress
  119.         beq  no_bitmap
  120.  
  121.         move.l #copsize+2,d0
  122.         move.l #$10002,d1
  123.         jsr    AllocMem(a6)
  124.         move.l d0,cop_adress
  125.         beq  no_copper
  126.                MOVE.L #BSize,D0
  127.                MOVE.L #req,D1
  128.                JSR AllocMem(A6)
  129.                TST.L D0
  130.                BEQ no_DPuffer
  131.                MOVE.L D0,TrackPuffer1
  132.                addq.l #6,TrackPuffer1
  133.                add.l #Bytelesen-6,d0
  134.                move.l D0,TrackPuffer2
  135.                bsr HolSpeicher           ;Speicher für Cruncher
  136.  
  137.                bra beg
  138. copy_start:    MOVE.L $4,A6
  139.                MOVE.B #$FF,$BFD300
  140.       move.w #$0020,$dff09a
  141.                JSR Disable
  142.  
  143.                MOVE.W #$8210,$DF096      ;DMA-Reg setzen
  144.  
  145.                clr.w FreiFlagCh
  146.                clr.w FreiFlagFa
  147.  
  148.                bsr KopfAnf               ;Köpfe auf Null/Motorbits stellen
  149.                bsr Start_End             ;Kopierbereich festlegen
  150.                cmp.b #ON,dc1             ;Deepcopy 1
  151.                beq \ME7
  152.                cmp.b #ON,dc2
  153.                bne \ME5
  154. \ME7:          move.b SD,d0              ;ein Laufwerk-Copy?
  155.                cmp.b DD,d0
  156.                beq \ME6                  ;ja
  157.                bsr SchaltS
  158. \ME5:          bsr TestProtect
  159.                tst.l d0
  160.                bmi \ME4
  161.                bsr protect_source
  162.                tst.l d0
  163.                bmi \ME3                  ;Escape
  164.                bra \ME5
  165. \ME4:
  166.                cmp.b #ON,fa              ;Fastcopy on?
  167.                bne \ME1
  168.                bsr FastCopy
  169.                bra \ME3
  170. \ME1:          cmp.b #ON,dc1             ;Deepcopy1 on?
  171.                bne \ME2
  172.                bsr DeepCopy
  173.                bra \ME3
  174. \ME2:          cmp.b #ON,dc2             ;Deepcopy2 on?
  175.                bne \ME3
  176. \ME6:          bsr DeepCopy
  177. \ME3:
  178.                bsr SchaltS
  179.                bsr MotorAus
  180.                bsr SchaltD
  181.                bsr MotorAus
  182.  
  183.                move.w #$0600,$dff09e
  184.                move.w #$8100,$dff09e     ;Bits wieder zurückstellen
  185. \Fehler:       bsr Enable
  186.         move.w #$8020,$dff09a
  187. Ende:          rts
  188.  
  189. TextausL:      move.w StartTrack,d0
  190.                lsr.w #1,d0
  191.                move.b d0,Cylinder
  192.                bsr reading_cyl
  193.                rts
  194. TextausS:      move.w StartTrack,d0
  195.                lsr.w #1,d0
  196.                move.b d0,Cylinder
  197.                bsr writing_cyl
  198.                rts
  199. ;Read-Error ausgeben
  200. RError:        move.w StartTrack,d0
  201.                move.b #1,side
  202.                btst #0,d0
  203.                bne \RE1
  204.                clr.b side
  205. \RE1:          lsr.w #1,d0
  206.                move.b d0,Cylinder
  207.                bsr read_error
  208.                rts
  209. ;Write-Error ausgeben
  210. WError:        move.w StartTrack,d0
  211.                move.b #1,side
  212.                btst #0,d0
  213.                bne \RE1
  214.                clr.b side
  215. \RE1:          lsr.w #1,d0
  216.                move.b d0,Cylinder
  217.                bsr write_error               rts
  218.  
  219. FastCopy:
  220.                bsr Lückeschaffen
  221.                move.b DD,d0
  222.                cmp.b SD,d0
  223.                beq \FC1
  224.                bra FastCopyML            ;für mehrere Laufwerke
  225. \FC1:          bra FastCopyEL            ;für ein Laufwerk
  226.  
  227. ;FastCopy für mehrere Laufwerke
  228. FastCopyML:
  229.                bsr SchaltD
  230. \FC5:          bsr TestProtect
  231.                tst.l d0
  232.                bpl \FC1
  233.                bsr protect_Destination
  234.                tst.l d0
  235.                bmi \Fehler               ;Escape gedrückt
  236.                bra \FC5
  237. \FC1:          bsr TextausL
  238.                bsr TrackLSF              ;Track von Source laden
  239.                cmp.w #KeineDisk,ErrorFlag
  240.                beq \Fehler
  241.                bsr SchaltD
  242.                move.w StartTrack,d0
  243.                bsr KopfPos
  244.                bsr TextausS
  245.                bsr TrackFSchreiben
  246.                cmp.w #KeineDisk,ErrorFlag
  247.                beq \Fehler
  248.                cmp.w #DiskProtect,ErrorFlag
  249.                bne \FC3
  250.                bsr protect_destination
  251.                bra \Fehler
  252. \FC3:          cmp.b #ON,vd              ;Verify ON ?
  253.                bne \FC2                  ;verzweige, wenn nicht an
  254.                bsr TrackFVerify
  255.                cmp.w #KeineDisk,ErrorFlag
  256.                beq \Fehler
  257.                cmp.w #VerifyError,ErrorFlag
  258.                bne \FC2
  259.                bsr WError
  260.                bsr compare_drives
  261. \FC2:          add.w #1,StartTrack
  262.                move.w StartTrack,d0
  263.                cmp.w EndTrack,d0
  264.                bls \FC1
  265. \Fehler        rts
  266.  
  267. ;FastCopy für ein Laufwerk
  268.  
  269. FastCopyEL:
  270.                clr.b KurzByte            ;KurzByte für Chruncher = 0
  271.                move.w #$1600,Länge
  272.                bsr NextSpeicher          ;Speicher zuordnen
  273. \FCEL1:        bsr TestProtect
  274.                tst.l d0
  275.                bmi \FCEL3
  276.                bsr protect_Source
  277.                tst.l d0
  278.                bmi \FCEL2                ;Escape gedrückt
  279.                bra \FCEL1
  280. \FCEL3:        bsr FCopy1DL              ;in Speicher lesen
  281.                tst.l d0
  282.                bmi \FCEL2
  283.                move.l SchreibAnf,a5               add.l #LückenLänge,a5
  284. \FCEL7:        move.w TNumPufferA,StartTrack
  285.                bsr insert_destination
  286.                tst.l d0
  287.                bmi \FCEL2                ;Escape
  288. \FCEL5:        bsr TestProtect
  289.                tst.l d0
  290.                bpl \FCEL6
  291.                bsr protect_Destination
  292.                tst.l d0
  293.                bmi \FCEL2                ;Escape gedrückt
  294.                bra \FCEL5
  295. \FCEL6:        bsr FCopy1DS              ;Tracks schreiben
  296.                tst.l d0
  297.                bmi \FCEL2
  298.                cmp.b #ON,ws              ;mehrfach schreiben?
  299.                bne \FCEL8                ;nein
  300.                bsr write_b_again
  301.                cmp.w #Escape,ErrorFlag
  302.                beq \FCEL2
  303.                tst.l d0
  304.                bpl \FCEL7                ; erneut schreiben
  305. \FCEL8:        move.w StartTrack,TNumPufferA
  306.                move.w TNumPufferE,d0
  307.                cmp.w EndTrack,d0
  308.                bcc \FCEL2
  309.                bsr insert_source
  310.                tst.l d0
  311.                bmi \FCEL2                ;Escape
  312.                bra \FCEL1
  313. \FCEL2:        rts
  314.  
  315. FCopy1DL:
  316. \FCD1:         bsr TrackLSF              ;Track von Source laden
  317.                cmp.w #KeineDisk,ErrorFlag
  318.                beq \Fehler
  319.                move.l TrackPuffer2,a0    ;Zeiger Übergeben
  320.                bsr Packe                 ;Track crunchen
  321.                tst.l d0
  322.                bmi \FCD2                 ;Speicher voll
  323.                bsr TextausL              ;Text ausgeben
  324.                add.w #1,StartTrack
  325.                move.w StartTrack,d0
  326.                cmp.w EndTrack,d0
  327.                bls \FCD1
  328. \FCD2:         subq.w #1,StartTrack
  329.                clr.l d0
  330.                move.w StartTrack,TNumPufferE       ;Letzter Track
  331.                rts
  332. \Fehler:       move.l #-1,d0
  333.                rts
  334.  
  335. ;Copyteil zum schreiben mit einem Laufwerk
  336. FCopy1DS:
  337.                move.w StartTrack,d0      ;erster gelesenser Track
  338. \FDS1:         bsr KopfPos
  339.                bsr TextausS
  340.                move.l TrackPuffer2,a0    ;Puffer für Track (Ziehl)
  341.                bsr EntPacke              ;Track wieder in Normgröße
  342.                move.l a5,a1              ;Ziehl (TrackPuffer1 + Lücke)
  343.                move.l TrackPuffer2,a0    ;Quelle
  344.                move.w StartTrack,d0      ;zu lesener Track
  345.                bsr CodeTrack             ;Track kodieren
  346.                move.w #00,FirstBlockSp   ;erster Block = Null
  347.                bsr TrackFSchreiben
  348.                cmp.w #KeineDisk,ErrorFlag
  349.                beq \Fehler
  350.                cmp.w #DiskProtect,ErrorFlag
  351.                bne \FDS3
  352.                bsr protect_destination
  353.                bra \Fehler
  354. \FDS3:         cmp.b #ON,vd              ;Verify ON ?
  355.                bne \FDS2                 ;verzweige, wenn nicht an
  356.                bsr TrackFVerify
  357.                cmp.w #KeineDisk,ErrorFlag
  358.                beq \Fehler
  359.                cmp.w #VerifyError,ErrorFlag
  360.                bne \FDS2
  361.                bsr WError
  362. \FDS2:         bsr Get_Key               ;Escape gedrückt ?
  363.                cmp.b #$45,d0
  364.                bne \FCS4                 ; nein, weiter
  365.                move.w #Escape,ErrorFlag
  366.                bra \Fehler
  367. \FCS4:         addq.w #1,StartTrack
  368.                move.w StartTrack,d0
  369.                cmp.w TNumPufferE,d0
  370.                bls \FDS1
  371.                clr.l d0
  372.                clr.w FreiFlagCh          ;Chip-Mem ist wieder frei
  373.                clr.w FreiFlagFa          ;Fast-Mem ist wieder frei
  374.                rts
  375. \Fehler:       move.l #-1,d0
  376.                rts
  377.  
  378. ;Track Crunchen und ablegen
  379. ;>= A0 Zeiger auf TrackPuffer
  380. Packe:                                   ;Zeiger auf Track
  381.                move.l a2,-(a7)
  382.                move.l a0,a2
  383. \PA2:          lea TrackZeiger,a0        ;Zeiger auf Tracktabelle
  384.                clr.l d0
  385.                move.w StartTrack,d0      ;Tracknummer
  386.                lsl.w #2,d0
  387.                adda.l d0,a0              ;Zeiger auf Speicherzeiger
  388.                move.l SpeicherAnf,(a0)   ;Zeiger auf Track eintragen
  389.                move.l SpeicherAnf,a1
  390.                move.l a2,a0
  391.                bsr Crunch
  392.                tst.l d0
  393.                bpl \PA1                  ;Ok, weiter
  394.                bsr NextSpeicher          ;neuen Speicher holen
  395.                tst.l d0
  396.                bpl \PA2                  ;Ok, Speicher geholt
  397. \PA1:          move.l (a7)+,a2
  398.                rts
  399.  
  400. ;Track aus Speicher holen
  401. ;>= A0 = Zeiger auf Ziehl für Track
  402. EntPacke:
  403.                move.l a0,a1
  404.                lea TrackZeiger,a0        ;Zeiger auf Tracktabelle
  405.                clr.l d0
  406.                move.w StartTrack,d0     ;Tracknummer
  407.                lsl.w #2,d0
  408.                adda.l d0,a0              ;Zeiger auf Speicherzeiger
  409.                move.l (a0),a0            ;Zeiger auf Track holen
  410.                bsr DeCrunch
  411.                rts
  412.  
  413. HolSpeicher:
  414.                move.l a6,-(a7)
  415.                move.l #MEMF_Chip,d1
  416.                or.l #MEMF_Largest,d1
  417.                move.l ExecBase,a6
  418.                jsr AvailMem(a6)
  419.                move.l d0,LängeChip
  420.                bne \HS1
  421.                clr.l SpeicherChip        ;kein Chip verfügbar
  422.                bra \HS2                  ;Fast-Mem holen
  423. \HS1:          jsr AllocMem(a6)
  424.                move.l d0,SpeicherChip
  425. \HS2:          move.l #MEMF_Fast,d1
  426.                or.l #MEMF_Largest,d1
  427.                jsr AvailMem(a6)
  428.                move.l d0,LängeFast
  429.                bne \HS3                  ;ok
  430.                clr.l SpeicherFast
  431.                bra \HS4                  ;kein Fast verfügbar
  432. \HS3:          jsr AllocMem(a6)
  433.                move.l d0,SpeicherFast
  434. \HS4:          move.l (a7)+,a6
  435.                clr.w FreiFlagCh          ;Speicher ist frei
  436.                clr.w FreiFlagFa
  437.                rts
  438.  
  439. ;Nächsten Speicherblock holen
  440. NextSpeicher:
  441.                tst.w FreiFlagCh          ;Chip noch Frei
  442.                bpl \NS1                  ;Ja, ist frei
  443. \NS3:          tst.w FreiFlagFa          ;Fast noch frei
  444.                bpl \NS4                  ;Ja, ist frei
  445. \NS5:          move.l #-1,d0             ;kein Speicher frei
  446.                bra \NS2
  447. \NS4:          move.l SpeicherFast,d0
  448.                beq \NS5                  ;kein Fast frei
  449.                move.l LängeFast,d1
  450.                move.w #$ffff,FreiFlagFa  ;Fast belegen
  451.                bra \NS6
  452. \NS1:          move.l SpeicherChip,d0
  453.                beq \NS3                  ;kein Chip frei
  454.                move.l LängeChip,d1
  455.                move.w #$ffff,FreiFlagCh  ;Chip belegen
  456. \NS6:          move.l d0,SpeicherAnf
  457.                move.l d1,SpeicherLänge
  458.                clr.l d0
  459. \NS2:          rts
  460.  
  461. ;Track laden (Fastcopy)
  462. ;>= StartTrack = Track der geladen wird
  463. ;=> SBytes = Anzahl der Bytes zu schreiben
  464. ;=> SchreibAdr = Adresse, ab der geschrieben wird
  465.  
  466. TrackLSF:
  467.                movem.l d2/a2,-(a7)
  468.                bsr SchaltS
  469.                move.l TrackPuffer1,a5
  470.                move.l a5,SchreibAnf
  471.                add.l #Lückenlänge,a5
  472.                move.l TrackPuffer2,a4
  473.                move.w #(LückenLänge+$2ec0+2),SLänge
  474.                move.w StartTrack,d0
  475.                bsr KopfPos
  476.                move.w #AnzLesenF-1,d2
  477. \TSF6:         bsr FastLesen
  478.                move.w FirstBlock,FirstBlockSp  ;erster geladener Block
  479.                cmp.w #KeineDisk,ErrorFlag
  480.                beq \TSF7
  481.                cmp.w #ReadError,ErrorFlag
  482.                bne \TSF5
  483.                dbf d2,\TSF6              ;verzweige, wenn erleutes Lesen
  484.                tst.l d0                  ;Keine Sync gefunden
  485.                bpl \TSF1
  486.                move.l a4,a0              ;Puffer Übergeben
  487.                bsr DOSLösch              ;Track als leer speichern
  488. \TSF1:
  489.                bsr RError                ;Fehler ausgeben
  490.                move.l a4,a0
  491.                move.l a5,a1
  492.                move.w StartTrack,d0      ;Tracknummer übergeben
  493.                bsr CodeTrack             ;Track aus den Daten generieren
  494.                clr.w FirstBlockSp        ;erster Block = 0
  495. \TSF5:         clr.l d0
  496. \TSF7:         movem.l (a7)+,d2/a2
  497.                rts
  498.  
  499. ;Lückenbytes in Trackpuffer eintragen
  500. Lückeschaffen:
  501.                move.l TrackPuffer1,a0
  502.                move.w #(Lückenlänge/4)+4,d0
  503. \LS1:          move.l #$aaaaaaaa,(a0)+
  504.                dbf d0,\LS1
  505.                rts
  506.  
  507. TrackFVerify:
  508.                movem.l d2-d4/a4-a5,-(a7)
  509.                clr.w d3                  ;Destzähler
  510.                clr.w VerErrFlag          ;Verify-Error-Flag löschen
  511.                move.b MotorBits,d4       ;MotorBits speichern
  512. \TF2:          move.l TrackPuffer2,a5
  513.                move.l TrackPuffer1,a4
  514.                add.l #Lückenlänge,a4
  515. \TF1:
  516.                move.b tr,d2              ;Azahl der Schreibversuche
  517.                move.w d3,d1              ;Destnummer nach D1
  518.                bsr SchaltND              ;Desteinschalten
  519.                tst.l d0                  ;Laufwerk vorhanden
  520.                bmi \TF6                  ;Nein
  521. \TF4:          bsr FastVerify
  522.                cmp.w #KeineDisk,ErrorFlag
  523.                beq \TF3                  ;Error, No Disk
  524.                cmp.w #VerifyError,ErrorFlag               bne \TF6                  ;kein Error, weiter
  525.                subq.b #1,d2              ;Errorzähler verringern
  526.                bne \TF5                  ;Weiter, wenn noch ein Versuch
  527.                bset d3,VerErrFlag        ;Bit für Error setzen
  528. \TF6:          addq.w #1,d3              ;Dest Zahl erhöhen
  529.                cmpi.w #4,d3
  530.                bcs \TF1               bra \TF3                  ;keine weitern Laufwerke
  531. \TF5:          bsr TrackFSchreiben
  532.                bra \TF4
  533. \TF3:          move.b d4,MotorBits
  534.                movem.l (a7)+,d2-d4/a4-a5
  535.                rts
  536.  
  537. TrackFschreiben:
  538.                move.l a5,-(a7)
  539.                move.l SchreibAnf,a5
  540.                move.w SLänge,d0
  541.                move.w #NoIndex,d1
  542.                bsr schreiben
  543.                move.l (a7)+,a5
  544.                rts
  545. DeepCopy:
  546.                move.b DD,d0
  547.                cmp.b SD,d0
  548.                beq \DC1
  549.                bra DeepCopyML            ;für mehrere Laufwerke
  550. \DC1:          bra DeepCopyEL            ;für ein Laufwerk
  551.  
  552. DeepCopyEL:
  553.                move.b #$aa,KurzByte      ;KurzByte für Chruncher = aa
  554.                bsr NextSpeicher          ;Speicher zuordnen
  555.                bsr insert_destination
  556.                tst.l d0
  557.                bmi \FCEL2
  558. \FCEL9:        bsr TestProtect
  559.                tst.l d0
  560.                bpl \FCEL10
  561.                bsr protect_Destination
  562.                tst.l d0
  563.                bmi \FCEL2                ;Escape gedrückt
  564.                bra \FCEL9
  565. \FCEL10:       bsr LängenTest
  566.                move.w StartTrack,TrackNumS
  567.                move.w LängeDest,d0       ;Länge für Cruncher
  568.                addi.w #$10,d0
  569.                move.w d0,Länge
  570. \FCEL11:       bsr insert_source
  571.                tst.l d0
  572.                bmi \FCEL2
  573. \FCEL1:        bsr TestProtect
  574.                tst.l d0
  575.                bmi \FCEL3
  576.                bsr protect_Source
  577.                tst.l d0
  578.                bmi \FCEL2                ;Escape gedrückt
  579.                bra \FCEL1
  580. \FCEL3:        bsr DeepCopy1DL           ;in Speicher lesen
  581.                tst.l d0
  582.                bmi \FCEL2
  583. \FCEL7:        move.w TNumPufferA,StartTrack
  584.                bsr insert_destination
  585.                tst.l d0
  586.                bmi \FCEL2
  587. \FCEL5:        bsr TestProtect
  588.                tst.l d0
  589.                bpl \FCEL6
  590.                bsr protect_Destination
  591.                tst.l d0
  592.                bmi \FCEL2                ;Escape gedrückt
  593.                bra \FCEL5
  594. \FCEL6:        bsr DeepCopy1DS           ;Tracks schreiben
  595.                tst.l d0
  596.                bmi \FCEL2
  597.                cmp.b #ON,ws              ;mehrfach schreiben?
  598.                bne \FCEL8                ;nein
  599.                bsr write_b_again
  600.                cmp.w #Escape,ErrorFlag
  601.                beq \FCEL2
  602.                tst.l d0
  603.                bpl \FCEL7                ; erneut schreiben
  604. \FCEL8:        move.w StartTrack,TNumPufferA
  605.                move.w TNumPufferE,d0
  606.                cmp.w EndTrack,d0
  607.                bcs \FCEL11
  608. \FCEL2:        rts
  609.  
  610. DeepCopy1DL:
  611. \FCD1:         clr.w ErrorFlag
  612.                bsr TrackLS               ;Track von Source laden               cmp.w #KeineDisk,ErrorFlag
  613.                beq \Fehler
  614.                move.l TrackPuffer2,a0    ;Zeiger Übergeben
  615.                move.l SchreibAnf,a1
  616.                lea -6(a0),a0
  617.                move.l a1,(a0)
  618.                move.w SLänge,4(a0)
  619.                bsr Packe                 ;Track crunchen
  620.                tst.l d0
  621.                bmi \FCD2                 ;Speicher voll
  622.                bsr TextausL
  623. \FCD3:         add.w #1,StartTrack
  624.                move.w StartTrack,d0
  625.                cmp.w EndTrack,d0
  626.                bls \FCD1
  627. \FCD2:         subq.w #1,StartTrack
  628.                clr.l d0
  629.                move.w StartTrack,TNumPufferE       ;Letzter Track
  630.                rts
  631. \Fehler:       move.l #-1,d0
  632.                rts
  633.  
  634. ;Copyteil zum schreiben mit einem Laufwerk
  635. DeepCopy1DS:
  636.                move.w StartTrack,d0      ;erster gelesenser Track
  637. \FDS1:         bsr KopfPos
  638.                bsr TextausS
  639.                move.l TrackPuffer2,a0    ;Puffer für Track (Ziehl)
  640.                lea -6(a0),a0
  641.                bsr EntPacke              ;Track wieder in Normgröße
  642.                move.l TrackPuffer2,a0
  643.                move.l -6(a0),Schreibanf
  644.                move.w -2(a0),SLänge
  645.                move.l #$aaaaaaaa,-4(a0)
  646.                bsr TrackSchreiben
  647.                cmp.w #KeineDisk,ErrorFlag
  648.                beq \Fehler
  649.                cmp.w #DiskProtect,ErrorFlag
  650.                bne \FDS3
  651.                bsr protect_destination
  652.                bra \Fehler
  653. \FDS3:         cmp.b #ON,vd              ;Verify ON ?
  654.                bne \FDS2                 ;verzweige, wenn nicht an
  655. ;               bsr TrackFVerify
  656. ;               cmp.w #KeineDisk,ErrorFlag
  657. ;               beq \Fehler
  658. ;               cmp.w #VerifyError,ErrorFlag
  659. ;               bne \FDS2
  660. ;               bsr WError
  661. \FDS2:         addq.w #1,StartTrack
  662.                move.w StartTrack,d0
  663.                cmp.w TNumPufferE,d0
  664.                bls \FDS1
  665.                clr.l d0
  666.                clr.w FreiFlagCh          ;Chip-Mem ist wieder frei
  667.                clr.w FreiFlagFa          ;Fast-Mem ist wieder frei
  668.                rts
  669. \Fehler:       move.l #-1,d0
  670.                rts
  671.  
  672.  
  673. DeepCopyML:
  674.                bsr SchaltD
  675. \DC5:          bsr TestProtect
  676.                tst.l d0
  677.                bpl \DC3
  678.                bsr protect_Destination
  679.                tst.l d0
  680.                bmi \Fehler               ;Escape gedrückt
  681.                bra \DC5
  682. \DC3:          bsr LängenTest
  683.                tst.l d0
  684.                bmi \Fehler
  685. \DC1:
  686.                bsr TextausL
  687.                bsr TrackLS               ;Track von Source laden
  688.                cmp.w #KeineDisk,ErrorFlag
  689.                beq \Fehler
  690.                bsr SchaltD
  691.                move.w StartTrack,d0
  692.                bsr KopfPos
  693.                bsr TextausS
  694.                bsr TrackSchreiben
  695.                cmp.w #KeineDisk,ErrorFlag
  696.                beq \Fehler
  697.                cmp.w #DiskProtect,ErrorFlag
  698.                bne \DC2
  699.                bsr protect_destination
  700.                bra \Fehler
  701. \DC2:          add.w #1,StartTrack
  702.                move.w StartTrack,d0
  703.                cmp.w EndTrack,d0
  704.                bls \DC1
  705. \Fehler:       rts
  706.  
  707.  
  708. ;Track von Source oder Dest. laden
  709. ;>= StartTrack = Track der geladen wird
  710.  
  711. TrackLS:       bsr SchaltS
  712.                move.l TrackPuffer1,a5
  713.                move.w StartTrack,d0
  714.                bsr KopfPos
  715.                bsr TrackLaden   
  716.                rts
  717.  
  718. ;Überprüft die Längen der Source- und Destdiskette;=>LängeSource = Länge der Sourcedisk
  719. ;=>LängeDest   = Länge der Destdisk
  720. LängenTest:
  721.                bsr SchaltD
  722.                move.w StartTrack,d0
  723.                bsr KopfPos
  724.                move.l TrackPuffer2,a5
  725.                bsr löschen
  726.                move.w #Bytelesen-$15,d0
  727.                bsr schreiben
  728.                tst.l d0
  729.                bmi \TD1                  ;Disk schreibgeschützt
  730.                bsr Zählen
  731.                tst.l d0
  732.                bmi \TD1                  ;Keine Disk im Laufwerk
  733.                move.w CheckLänge,LängeDest
  734. \TD1:          rts
  735.  
  736. ;Track laden, nachdem die Motorbits eingestellt wurden
  737. ;>= A5 = Zeiger auf den Lesepuffer
  738. ;=> SchreibAnf = Zeiger auf die zu schreibenden Daten
  739. ;=> SLänge = Anzahl der zu schreibenden Bytes
  740.  
  741. TrackLaden:
  742.                move.w #CopyVersuche1,CopyVersuch1
  743. Versuch1:
  744.                move.w #CopyVersuche2,CopyVersuch2   ;Versuche, bei NoSync
  745. Versuch2:
  746.  
  747. ;Länge von Track messen (Index <=> Index)
  748. ;Lesen der Daten ohne DMA in Puffer ab A5
  749.  
  750.                move.w #NoError,ErrorFlag
  751.                bsr Zählen                ;=> Checklänge = länge von Track
  752.                tst.l d0                  ;Disk im Laufwerk?
  753.                bmi \TrackLadenEnd
  754.  
  755. ;entfernung von Index zu Sync messen
  756. ;wenn keine Sync, dann D0 = -1
  757. ;=> Syncweit = Entfernung bis Sync
  758.  
  759.                bsr Syncentfernung
  760.                tst.l d0
  761.                bpl \OK2
  762.                sub.w #1,CopyVersuch2
  763.                bne Versuch2
  764.  
  765. ;Programmteil, wenn keine Sync gefungen wird
  766.  
  767. \TL7:          move.l TrackPuffer2,a5
  768.                bsr CopyOSync               bra \TL11
  769.  
  770. \OK2:
  771.                move.w CheckLänge,d0
  772.                add.w #$100,d0
  773.                move.w #MitSync,d1
  774.                bsr laden
  775.                move.w SyncWort,(a5)      ;erste Sync eintragen
  776.  
  777. ;Anzahl der Bytes auf Track ermitteln (Sync zu Sync)
  778. ;=> D0 = -1, wenn Anzahl zu stark von Checklänge abweicht
  779. ;=> TrackBytes = Länge des Tracks
  780.  
  781.                bsr SuchTEnd
  782.                tst.l d0
  783.                bpl \TL3
  784.                bsr SuchTEnd2
  785.                tst.l d0
  786.                bpl \TL3
  787.                sub.w #1,Copyversuch1
  788.                bne Versuch1
  789.  
  790.                move.w CheckLänge,TrackBytes
  791.                sub.w #$10,TrackBytes     ;Wenn kein Ende gefunden
  792.                                          ;Track kürzen
  793.  
  794. ;Lücke suchen, wenn Sync gefunden
  795. ;>= A5 Zeiger auf Trackanfang
  796. ;=> Größe1 = größe des größten Blocks
  797. ;=> Größe2 = größe der zweitgrößten Blocks
  798.  
  799. ;=> GrößePos = Position des größten Blocks
  800. ;=> SyncAnz = Anzahl der gefundenen Syncs
  801.  
  802. \TL3:
  803.                clr.l d0
  804.                move.w TrackBytes,d0
  805.                add.l a5,d0
  806.                move.l d0,EndPos
  807.  
  808.                bsr Blockerkennung
  809.                cmp.w #SortBlockAnz,SyncAnz
  810.                bls \TL2                  ;Anzahl der Sync Ok
  811.  
  812. ;Zu viele Blöcke zum zwischenspeichern
  813.  
  814.                move.l GrößePos,AnfPos   ;Lücke beim größten Block               bra \TL1                 ;Zu viele Blöcke zum sortieren
  815. \TL2:
  816.                bsr TrackAmiga            ;Testen, ob Amiga-Track
  817.                tst.l d0
  818.                bpl \TL4                  ;verzweige, wenn Amiga-Track
  819.                cmp.b #ON,sy              ;Sync-Korrektur
  820.                bne \TL5                  ;nein
  821. \TL4:          bsr Synckorrektur
  822. \TL5:          bsr OrdneBlöcke
  823.                bsr SuchLücke
  824. \TL1:          move.l TrackPuffer2,a4    ;Ziehl beim Kopieren
  825.                bsr Umkopieren
  826. \TL11:         clr.l d0                  ;Errorflag löschen
  827. \TrackladenEnd:
  828.                rts
  829.  
  830. ;Track Laden, der keine Sync hat
  831. ;>= A5 = Trackpuffer
  832. ;=> Lückelang = Lenge der Lücke
  833. ;=> Syncweit = 0  (keine Sync)
  834. ;=> TrackBytes = Anzahl der Bytes auf dem Track
  835.  
  836. CopyOSync:
  837.                movem.l d2-d3,-(a7)
  838.                move.w CheckLänge,d0
  839.                cmp.w #Bytelesen-50,d0       ;Source-Track zu lang
  840.                bcc \COS7
  841.                add.w #36,d0
  842.                bra \COS6
  843. \COS7:         move.w #Bytelesen-50,CheckLänge
  844.                move.w #Bytelesen-16,d0
  845. \COS6:         move.w #OhneSync,d1
  846.                bsr laden
  847.                tst.l d0
  848.                bmi \COS1
  849.                move.w CheckLänge,d1
  850.                sub.w #50,d1
  851.  
  852.                move.l a5,a0              ;Trackpuffer
  853.                move.b (a0)+,d2           ;erste Byte holen
  854. \COS2:         move.b (a0)+,d3
  855.                cmp.b d2,d3               ;Bytes vergleichen
  856.                bne \COS4                 ;ungleich
  857.                sub.w #1,d1               ;Anzahl erhöhen
  858.                bne \COS2
  859.                bra \COSOK                ;Track überall gleich
  860.  
  861. \COS4:         add.l #2,a0               ;Lücke überspringen
  862.                move.b (a0)+,d2
  863. \COS3:
  864.                move.b (a0)+,d3
  865.                cmp.b d2,d3               ;Bytes vergleichen
  866.                bne \COSNO                ;nicht immer gleich
  867.                sub.w #1,d1               ;Zähler erhöhen
  868.                bne \COS3               move.l a5,a0
  869.  
  870. \COSOK:        move.w LängeDest,d0
  871.                add.w #$10,d0
  872. \COS5:         move.b d2,(a0)+
  873.                dbf d0,\COS5
  874. \COSNO:        move.w LängeDest,d0
  875.                add.w #$4,d0
  876.                move.w d0,TrackBytes
  877.                move.w d0,SLänge          ;Anzahl der zu Schreibbytes
  878.                move.l a5,SchreibAnf      ;Anfang der Daten
  879.                move.w #KeineSync,ErrorFlag
  880.                clr.l d0
  881.                movem.l (a7)+,d2-d3
  882.                rts
  883. \COS1:         move.l #-1,d0
  884.                rts
  885.  
  886. Trackschreiben:
  887.                move.l SchreibAnf,a5
  888.                move.w SLänge,d0
  889.                bsr schreiben
  890.                rts
  891. löschen:
  892.                move.l TrackPuffer2,A0
  893.                move.w #(Bytelesen-$10)/4,d0
  894. \Lö2:          move.l #$aaaaaaaa,(a0)+
  895.                dbf d0,\Lö2
  896.                rts
  897.  
  898. ;Kopierbereich festlegen (Start- und End-Cylinder)
  899. ;>= StartTrack = Track bei dem angefange wird (Track!!)
  900. ;>= EndTrack   = Track der als letztes kopiert wird (Track!!)
  901.  
  902. Start_End:     clr.l d0
  903.                move.b fc,d0              ;erster Cylinder
  904.                lsl.b #1,d0               ;Cylinder => Track
  905.                move.w d0,StartTrack
  906.                move.w d0,TNumPufferA
  907.                move.b lc,d0              ;letzer Cylinder
  908.                lsl.b #1,d0               ;Cylinder => Track
  909.                add.w #1,d0               ;letzeer Track = Untere Seite
  910.                move.w d0,EndTrack
  911.                rts
  912.  
  913. ;Prüft, ob Disk im Laufwerk
  914. ;=> D0 = -1, wenn keine Disk im Laufwerk
  915.  
  916. DiskInFloppy:
  917.                clr.l d0
  918.                move.b $bfe001,d0
  919.                btst #2,d0
  920.                bne \DIF
  921.                move.l #-1,d0
  922.                move.w #KeineDisk,ErrorFlag
  923. \DIF:          rts
  924.  
  925. ;Track Laden
  926. ;A5 = Zeiger auf Datenpuffer
  927.  
  928. Laden:         MOVEM.L d2-d3,-(A7)
  929.                move.w d0,d3              ;ByteAnz zu lesen
  930.                lsr.w #1,d3
  931.                bsr DiskInFloppy
  932.                tst.l d0
  933.                bmi \L1
  934.                MOVE.W #$8010,$DFF096     ;Disk-DAM ermöglichen
  935.                move.w #$7f00,$DFF09E     ;Disk-Bits löschen
  936.                MOVE.L A5,A1              ;Zeiger auf Datenpuffer
  937.                MOVE.L A1,$DFF020         ;Datenpuffer übergeben
  938.                cmp.w #MitSync,d1
  939.                bne \L3
  940.                MOVE.W SyncWort,$DFF07E   ;SYNC-Wort übergeben
  941.                move.w #$8500,$DFF09E
  942.                lea 2(a5),a1
  943.                move.l a1,$DFF020         ;neue Adresse übergeben
  944.                bra \L4
  945.  
  946. \L3:           MOVE.W #$8100,$DFF09E     ;Auf MFM Format
  947. \L4:           MOVE.W #$4000,$DFF024     ;Übertragung vorbereiten
  948.                bsr Index                 ;Auf Index warten
  949.                tst.l d0
  950.                bmi \L1
  951.                or.w #$8000,d3
  952.                MOVE.W d3,$DFF024
  953.                MOVE.W d3,$DFF024         ;Daten lesen
  954.                clr.l d0                  ;Ok Meldung
  955.                MOVE.L #$18000,D1         ;Zeitzähler setzen
  956.                move.w #$0002,$dff09c     ;Blockdone Int löschen
  957. \L2:           MOVE.W $DFF01E,D2
  958.                BTST #1,D2
  959.                BNE.S \L1                 ;auf Disk-Block Ready warten
  960.                SUBQ.L #1,D1              ;Zähler verringern
  961.                BNE.S \L2                 ;verzweige, wenn nicht fertig
  962.                move.l #-1,d0
  963. \L1:           MOVE.W #$4000,$DFF024
  964. \L5:           MOVEM.L (A7)+,D2-d3
  965.                RTS
  966.  
  967. ;Auf Intexloch warten
  968.  
  969. Index:
  970.                move.l d1,-(a7)
  971.                clr.l d0
  972.                move.l #$30000,d1
  973.                MOVE.B $BFDD00,D0
  974. Index1:        MOVE.B $BFDD00,D0         ;Auf Indexloch warten
  975.                BTST #4,D0
  976.                Bne.s Index2
  977.                sub.l #1,d1
  978.                bne Index1
  979.                move.l #-1,d0
  980. Index2:
  981.                move.l (a7)+,d1
  982.                rts
  983.  
  984.  
  985. ;Motorbits bestimmen Köpfe auf Null
  986. KopfAnf:
  987.                movem.l d2-d4,-(a7)
  988.                clr.w d3
  989.                move.b DD,d2              ;Dest-Drives
  990.                or.b SD,d2                ;Source-Drives
  991. \KA1:          clr.l d0
  992.                btst d3,d2                ;Laufwerk jetzt gebraucht?
  993.                beq \KA2                  ;nicht gebraucht
  994.                bset d3,d0                ;Bit für Laufwerk
  995.                lsl.b #3,d0
  996.                eor.b #$fb,d0
  997.                move.b d0,MotorBits
  998.                bsr MotorAn
  999.                clr.l d0
  1000.                bsr KopfPos
  1001. \KA2:
  1002.                addq.w #1,d3
  1003.                cmp.w #4,d3
  1004.                bne \KA1
  1005.  
  1006.                bsr MotBits
  1007.                move.b MotorBitsD,MotorBits
  1008.                move.b #-1,Flag
  1009.                clr.w TrackNumS
  1010.                clr.w TrackNumD
  1011.                bsr SchaltS
  1012.                movem.l (a7)+,d2-d4
  1013.                rts
  1014. TestDrive:
  1015.                move.l a0,-(a7)
  1016.                lea $bfd000,a0
  1017.                bclr #1,MotorBits
  1018.                bsr Schritt
  1019.                bset #1,MotorBits
  1020.                bsr Schritt
  1021.                move.l (a7)+,a0
  1022.                rts
  1023.  
  1024. ;=> D0 = -1 => Disk protect
  1025. TestProtect:   bsr TestDrive
  1026.                clr.w ErrorFlag
  1027.                move.b $bfe001,d0
  1028.                btst #3,d0
  1029.                bne \TP2
  1030.                move.w #DiskProtect,ErrorFlag
  1031.                move.l #-1,d0
  1032.                bra \TP1
  1033. \TP2:          clr.l d0
  1034. \TP1:          rts
  1035.  
  1036. ;Kopf auf in D0 angegebene Position Fahren 
  1037.   
  1038. KopfPos:       MOVEM.L D0-D3,-(A7)
  1039.                lea $bfd000,a0
  1040.                tst.w d0
  1041.                beq KopfNull
  1042.                move.w TrackNum,d2          ;Jetzige Tracknummer
  1043.                CMP.W d2,D0
  1044.                BEQ.S Kopfend             ;Ende wenn richtiger Track
  1045.                move.w d0,d3              ;Tracknummer nach D3
  1046.                move.b MotorBits,d1
  1047.                bset #2,d1                ;unterer Kopf
  1048.                btst #0,d3
  1049.                beq Unten                 ;unterer Kopf gewählt
  1050.                bclr #2,d1
  1051. Unten:         move.b d1,MotorBits          ;oberer Kopf
  1052.                move.b d1,$100(a0)
  1053.                move.w d3,TrackNum
  1054.                lsr.w #1,d2
  1055.                lsr.w #1,d3               ;Schrittweite berechnen
  1056.                sub.w d3,d2
  1057.                bcs.s Inn
  1058.                bhi.s Aus
  1059.                bra Kopfend
  1060. Inn:           bclr #1,d1
  1061.                move.b d1,MotorBits
  1062.                neg.w d2
  1063.                bra.s rechok
  1064. Aus:           bset #1,d1               move.b d1,MotorBits
  1065.                bra.s rechok
  1066. Kopfs:         bsr Schritt
  1067. rechok:        dbf d2,Kopfs
  1068. Kopfend:       movem.l (a7)+,d0-d3
  1069.                rts
  1070.  
  1071. KopfNull:
  1072.                move.b Motorbits,d1
  1073.                bset #2,d1
  1074.                bset #1,d1
  1075.                move.b d1,Motorbits
  1076.                clr.w TrackNum
  1077. KopfNull1:     move.b $bfe001,d0
  1078.                btst #4,d0
  1079.                beq.s \Ko1
  1080.                bsr Schritt
  1081.                bra KopfNull1
  1082. \Ko1:          bclr #1,MotorBits
  1083.                bsr Schritt
  1084.                bset #1,MotorBits
  1085.                bsr Schritt
  1086.                bra Kopfend
  1087.  
  1088. Schritt:
  1089.                move.b MotorBits,d0
  1090.                lea $100(a0),a1
  1091.                move.b d0,d1
  1092.                bclr #0,d0
  1093.                move.b d0,(a1)
  1094.                nop
  1095.                nop
  1096.                move.b d1,(a1)
  1097.                jsr Zeit
  1098.                move.b MotorBits,(a1)
  1099.                rts
  1100.  
  1101. ;Warteschleife
  1102.  
  1103. Zeit:          MOVE.L D7,-(A7)
  1104.                MOVE.W #2500,D7
  1105. \L1:           DBRA D7,\L1
  1106.                MOVE.L (A7)+,D7
  1107.                RTS
  1108. Zeit2:         MOVE.L D7,-(A7)
  1109.                MOVE.L #$6000,D7
  1110. \L1:           sub.l #1,D7
  1111.                bne \L1
  1112.                MOVE.L (A7)+,D7
  1113.                RTS
  1114.  
  1115. ;Motorroutine:   D0=0 => Motor aus
  1116.  
  1117. MotorAus:      clr.l d0
  1118.                bra Motor
  1119. MotorAn:       move.b #$01,d0
  1120.  
  1121. Motor:         movem.l d1/d2,-(a7)
  1122.                lea $bfd000,a0
  1123.                tst d0
  1124.                seq d1
  1125.                andi.b #$80,d1
  1126.                move.b MotorBits,d2
  1127.                andi.b #$80,d2
  1128.                cmp.b d1,d2
  1129.                beq.s Mook
  1130.                bclr #7,MotorBits
  1131.                or.b d1,MotorBits
  1132.                move.b #$ff,d1
  1133.                eor.b d2,d1
  1134.                move.b d1,$100(a0)
  1135.                move.b MotorBits,$100(a0)
  1136.                btst #7,MotorBits
  1137.                bne Mook
  1138.                jsr Zeit2
  1139. Mook:          movem.l (a7)+,d1/d2
  1140.                rts
  1141.  
  1142. Disable:       move.w #$4000,$dff09a
  1143.                move.l a6,-(a7)
  1144.                move.l $4,a6
  1145.                add.b #1,IDNestCnt(a6)
  1146.                move.l (a7)+,a6
  1147.                rts
  1148. Enable:        move.l a6,-(a7)
  1149.                move.l $4,a6
  1150.                sub.b #1,IDNestCnt(a6)
  1151.                bge L005
  1152.                move.w #$c000,$dff09a
  1153. L005:          move.l (a7)+,a6
  1154.                rts
  1155.  
  1156. ;Wartet auf Byte beim Lesen und speichert Byte ab (a0)+
  1157.  
  1158.                rts
  1159.  
  1160. ;>= a0 Adresse der zu suchnenden Daten
  1161. ;>= A1 Adresse von der ab gesucht wird
  1162. ;>= Suchlang = Anzagl der Worte für Fehler
  1163. ;>= Anzworte = Anzahl der Worte, auf die verglichen wird
  1164. ;=> D1 Anzahl der Bytes bis Fund
  1165. ;=> Position = Wo gefunden
  1166. ;=> D0 = -1 = nicht gefunden
  1167. ;=> A0 Position wo gefunden
  1168.  
  1169. BitSuch:
  1170.                movem.l d2-d6/a2-a4,-(a7)
  1171.                move.l a0,a2
  1172.                move.l a1,a3
  1173.                clr.w d5
  1174.                move.w Suchlang,d4            ;Suchanzsuch2:         move.w #00,d3             ;Anzahl verschiebebits
  1175. such1:         move.l (a2),d1
  1176.                move.l (a3),d2
  1177.                bsr comp
  1178.                tst.w d0
  1179.                beq suchok
  1180.                move.l a0,a2
  1181.                tst.w d5
  1182.                beq such4
  1183.                clr.w d5
  1184.                move.w d6,d3
  1185.                move.l a4,a3
  1186.   
  1187. such4:         add.w #1,d3
  1188.                cmp.w #$10,d3
  1189.                bne such1
  1190. such3:         add.l #2,a3
  1191.                clr.w d5                  ;richtige vergleiche
  1192.                dbf d4,such2              ;Zähler für Versuche
  1193.                move.l #-1,d0             ;nicht gefunden
  1194.                bra suchend
  1195. suchok:
  1196.                tst.w d5
  1197.                bne suchok2
  1198.                move.l a3,a4
  1199.                move.w d3,d6
  1200.  
  1201. suchok2:       add.w #1,d5
  1202.                cmp.w Anzworte,d5               beq suchend1
  1203.                add.l #2,a2
  1204.                add.l #2,a3
  1205.                bra such1
  1206. suchend1:      move.l #0,d0
  1207.                sub.w #1,d5
  1208.                lsl.w #1,d5
  1209.                suba.l d5,a3
  1210.                move.l a3,a0
  1211.                move.l a3,Position
  1212.                move.l a3,a0              ;Position
  1213.                move.w d3,Verschieb       ;Bitverschiebung
  1214.                sub.l a1,a3
  1215.                move.l a3,d1              ;Anzahl der Bytes bis finden
  1216. suchend:       movem.l (a7)+,d2-d6/a2-a4
  1217.                rts
  1218.  
  1219. comp:          movem.l d1-d2,-(a7)
  1220.                lsl.l d3,d2
  1221.                swap d1
  1222.                swap d2
  1223.                eor.w d1,d2
  1224.                move.w d2,d0
  1225.                movem.l (a7)+,d1-d2
  1226.                rts
  1227.  
  1228.  
  1229.  
  1230. MotBits:
  1231.                move.b SD,d0              ;Source Disk
  1232.                lsl.b #3,d0
  1233.                eor.b #$fb,d0
  1234.                move.b d0,MotorBitsS
  1235.                move.b DD,d0              ;Dest Disk
  1236.                lsl.b #3,d0
  1237.                eor.b #$fb,d0
  1238.                move.b d0,MotorBitsD
  1239.                rts
  1240.  
  1241. ;Nächstes Dest. Laufwerk einschalten
  1242. ;!!! Vorsicht !!! alte Motorbits werden gelöscht
  1243. ;>= D1 = wievieltes Laufwerk ( < 4)
  1244. ;=> D0 = -1, wenn kein weiteres Laufwerk vorhanden
  1245. ;=> D0 = Null, wenn ok
  1246.  
  1247. SchaltND:
  1248.                move.l d2,-(a7)
  1249.                clr.l d0
  1250.                move.b DD,d2
  1251.                btst d1,d2                ;Laufwerk angeschlosen?
  1252.                bne \SND1                 ;ja, angeschlosen
  1253.                move.l #-1,d0
  1254.                bra \SND2
  1255. \SND1:         bset d1,d0                ;Bit für Laufwerk
  1256.                lsl.b #3,d0
  1257.                eor.b #$7b,d0
  1258.                move.w StartTrack,d1
  1259.                bset #2,d0
  1260.                btst #0,d1
  1261.                beq \SND3                  ;unterer Kopf gewählt
  1262.                bclr #2,d0
  1263. \SND3:         move.b d0,MotorBits          ;oberer Kopf
  1264.                move.b d0,$bfd100
  1265.                clr.l d0
  1266. \SND2:         move.l (a7)+,d2
  1267.                rts
  1268.  
  1269. SchaltS:
  1270.                tst.b Flag
  1271.                bpl \S1
  1272.                move.b MotorBits,MotorbitsD
  1273.                move.w TrackNum,TrackNumD
  1274.                move.b MotorBitsS,MotorBits
  1275.                move.w TrackNumS,TrackNum
  1276.                move.b #$7f,$bfd100
  1277.                move.b MotorBits,d0
  1278.                bclr #7,d0
  1279.                move.b d0,$bfd100
  1280.                move.b d0,MotorBits
  1281.                clr.b Flag
  1282. \S1:           rts
  1283. SchaltD:
  1284.                tst.b Flag
  1285.                bmi \S1
  1286.                move.b MotorBits,MotorbitsS
  1287.                move.w TrackNum,TrackNumS
  1288.                move.b MotorBitsD,MotorBits
  1289.                move.w TrackNumD,TrackNum
  1290.                move.b #$7f,$bfd100
  1291.                move.b MotorBits,d0
  1292.                bclr #7,d0
  1293.                move.b d0,$bfd100
  1294.                move.b d0,MotorBits
  1295.                move.b #-1,Flag
  1296. \S1:           rts
  1297.  
  1298.  
  1299. ;Track speichern
  1300. ;>= D0 = Byteanzahl zu schreiben
  1301. ;>= A5 = Trackpuffer
  1302. ;>= D1 = Angabe, ob auf Index gewartet wird (IndexOk/NoIndex)
  1303.  
  1304. schreiben:     MOVEM.L D2-D3,-(A7)
  1305.                move.w d1,d2
  1306.                move.w d0,d3              ;Anzahl nach D3
  1307.                clr.w ErrorFlag
  1308.                bsr DiskInFloppy
  1309.                tst.l d0
  1310.                bmi \Protect
  1311.                move.b $bfe001,d0
  1312.                btst #3,d0
  1313.                bne \SR5
  1314.                move.w #DiskProtect,ErrorFlag
  1315.                bra \Protect
  1316. \SR5:          lsr.w #1,d3               ;Aus Byte mach Wort
  1317.                jsr MotorAn
  1318.                MOVE.W #2,$DFF09C         ;Disk-Block Int löschen
  1319.                MOVE.L A5,$DFF020         ;Datenpuffer übergeben
  1320.                MOVE.W #$8210,$DFF096     ;Disk-DMA ermöglichen
  1321.                move.w #$7f00,$dff09e
  1322.                MOVE.W #$8100,$DFF09E     ;Auf MFM Format
  1323.                cmp.w #80,StartTrack
  1324.                bcs \SR1
  1325.                move.w #$a000,$dff09e     ;Precompension
  1326. \SR1:          MOVE.W #$4000,$DFF024     ;Übertragung vorbereiten
  1327.                cmp.w #NoIndex,d2
  1328.                beq \SR2
  1329.                bsr Index
  1330.                tst.l d0
  1331.                bmi \Protect
  1332. \SR2:          or.w #$c000,d3            ;Auf schreiben schalten
  1333.                MOVE.W d3,$DFF024
  1334.                MOVE.W d3,$DFF024         ;Daten schreiben
  1335.                clr.l d0                  ;Ok-Meldung übergeben
  1336.                MOVE.L #$20000,D1         ;Zeitzähler setzen
  1337. \SR3:          MOVE.W $DFF01E,D2
  1338.                BTST #1,D2
  1339.                BNE.S \SR4                ;auf Disk-Block Ready warten
  1340.                SUBQ.L #1,D1              ;Zähler verringern
  1341.                BNE.S \SR3                ;verzweige, wenn nicht fertig
  1342. \Protect:      move.l #-1,d0
  1343. \SR4:          move.w #$4000,$dff024
  1344.                MOVEM.L (A7)+,D2-D3
  1345.                RTS
  1346.  
  1347. ;Sucht Trackende wenn Sync gefunden
  1348. ;>= A5 = Zeiger auf Trackpuffer (Syncs gefunden)
  1349. ;=> TrackBytes = Anzahl der Bytes auf Track (suche nach Sync)
  1350. ;=> D0 = -1, dann zu große Abweichnung zu CheckLänge
  1351.  
  1352. SuchTEnd:
  1353.                move.l a5,a0
  1354.                clr.l d0
  1355.                move.w CheckLänge,d0
  1356.                sub.w #$4,d0
  1357.                adda.l d0,a0
  1358.                move.w #$10,d0
  1359.                bsr SuchSync
  1360.                tst.l d0
  1361.                bmi \STE2
  1362.                suba.l a5,a0
  1363.                sub.w #2,a0
  1364.                move.w a0,TrackBytes
  1365.                rts
  1366. \STE2:         move.l #-1,d0
  1367.                move.w #Längeungleich,ErrorFlag               rts
  1368.  
  1369. SuchTEnd2:
  1370.                move.l a5,a0
  1371.                adda.l #$04,a0
  1372.                move.l a0,a1
  1373.                clr.l d0
  1374.                move.w CheckLänge,d0
  1375.                sub.w #$40,d0
  1376.                adda.l d0,a1
  1377.                move.w #$40,Suchlang
  1378.                move.w #$60,Anzworte
  1379.                bsr BitSuch               tst.l d0
  1380.                bmi \STE2
  1381.                suba.l a5,a0
  1382.                suba.l #6,a0              ;Position vor Sync
  1383.                move.w a0,TrackBytes
  1384.                rts
  1385. \STE2:         move.l #-1,d0
  1386.                move.w #Längeungleich2,ErrorFlag
  1387.                rts
  1388.  
  1389. ;Blöcke suchen und speichern
  1390. ;>= A5 Zeiger auf Trackanfang
  1391. ;=> Größe1 = größe des größten Blocks
  1392. ;=> Größe2 = größe der zweitgrößten Blocks
  1393. ;=> GrößePos = Position des größten Blocks
  1394. ;=> SyncAnz = Anzahl der gefundenen Syncs
  1395. ;=> Blöcke = Puffer in den die Blockgrößen stehen
  1396.  
  1397. Blockerkennung: movem.l d2-d4/a3,-(a7)
  1398.                move.w TrackBytes,d2      ;Byte auf Track
  1399.                move.l a5,a3              ;Anfang des Tracks
  1400.                clr.w Größe1
  1401.                clr.w Größe2
  1402.                clr.w SyncAnz
  1403.                clr.w d3
  1404.  
  1405. \S2:           move.w d2,d0
  1406.                move.l a3,a0              ;Ab wo suchen
  1407.                bsr SuchSyncF
  1408.                tst.l d0
  1409.                bmi \S5                   ;Ende
  1410.                tst.w d1
  1411.                beq \S6
  1412.                move.w d3,d4
  1413.                add.w d1,d3               ;Anzahl + Sync
  1414.                bsr Blockeintrag
  1415.                bsr Größe
  1416.                clr.w d3                  ;Synclänge = 0
  1417. \S6:
  1418.                add.w #2,d3               ;Synclänge +2
  1419.                add.w #2,d1
  1420.                andi.l #$ffff,d1
  1421.                adda.l d1,a3
  1422.                sub.w d1,d2
  1423.                bcc \S2
  1424.                bra \S7
  1425. \S5:           move.w d2,d1
  1426.                add.w #2,d1               ;Amzahl +2
  1427.                move.w d3,d4              ;Syncanz
  1428.                add.w d1,d3               ;Anzahl + Syn
  1429.                bsr Blockeintrag
  1430.                bsr Größe
  1431. \S7:           movem.l (a7)+,D2-d4/A3
  1432.                rts
  1433.  
  1434. ;Eintragen der Größe der Blöcke
  1435. ;>= D1 Blockgröße
  1436.  
  1437. Größe:
  1438.                cmp.w Größe1,d3
  1439.                bcs \S3
  1440.                move.w Größe1,Größe2
  1441.                move.w d3,Größe1
  1442.                move.l a0,a1
  1443.                move.l a1,GrößePos
  1444.                bra \S4
  1445. \S3:           cmp.w Größe2,d3
  1446.                bcs \S4
  1447.                move.w d1,Größe2
  1448. \S4:           rts
  1449.  
  1450. Blockeintrag:
  1451.                move.w SyncAnz,d0
  1452.                cmp.w #$40,d0             ;Zu viele Blöcke ?
  1453.                bcc \S1                   ;ja, dann nicht eintragen
  1454.                lsl.w #2,d0
  1455.                lea Blöcke,a1
  1456.                lsr.w #1,d4
  1457.                move.w d4,(a1,d0)
  1458.                add.w #2,d0
  1459.                move.w d3,(a1,d0)         ;Block eintragen
  1460. \S1:           add.w #1,SyncAnz
  1461.                rts
  1462.  
  1463. ;Sync-Markierungen suchen (fast)
  1464. ;>= A0 Suchadresse
  1465. ;>= D0 Byteanzahl für erlaubte Fehler
  1466. ;=> A0 Syncadresse
  1467. ;=> D0 = -1, dann keine Sync gefunden
  1468. ;=> D1 = nach wieviel Bytes gefunden
  1469. SuchSyncF:
  1470.                lsr.w #1,d0               ;aus Byte mach Wort
  1471.                move.l a0,a1
  1472. \SSF2:         cmp.w #$4489,(a0)+
  1473.                beq \SSF1
  1474.                dbf d0,\SSF2
  1475.                move.l #-1,d0
  1476.                bra \SSF3
  1477. \SSF1:         suba.l #2,a0
  1478.                move.l a0,d0
  1479.                sub.l a1,a0
  1480.                move.w a0,d1
  1481.                move.l d0,a0
  1482.                clr.l d0
  1483. \SSF3:         rts
  1484.  
  1485.  
  1486. ;Sync-Markierung suchen
  1487. ;>= A0 Suchadresse
  1488. ;>= D0 Byteanzahl für erlaubte Fehler
  1489. ;=> A0 Syncadresse
  1490. ;=> D0 = -1, dann keine Sync gefunden
  1491. ;=> D1 = nach wieviel Bytes gefunden
  1492. ;=> Verschieb = um wieviel Bits verschoben
  1493.  
  1494.  
  1495.  
  1496. SuchSync:
  1497.                movem.l d2-d4/a2,-(a7)
  1498.                move.l a0,a2
  1499.                lsr.w #2,d0               ;aus Byte- mach Langwortanzahl
  1500.                lea SyncBase,a1
  1501. \SS3:          clr.l d1
  1502.                move.l #$ffff0000,d3
  1503.                move.l (a0)+,d2
  1504. \SS2:          move.l d2,d4
  1505.                and.l d3,d4
  1506.                cmp.l (a1,d1),d4
  1507.                beq \SS1
  1508.                add.w #4,d1
  1509.                lsr.l #1,d3
  1510.                cmp.w #$40,d1
  1511.                bls \SS2
  1512.                dbf d0,\SS3
  1513.                move.l #-1,d0
  1514.                bra \SS4
  1515. \SS1:          clr.l d0
  1516.                lsr.w #2,d1
  1517.                move.w d1,Verschieb
  1518.                cmp.w #$8,d1
  1519.                bcc \SS5
  1520.                suba.l #2,a0
  1521. \SS5:          suba.l #2,a0
  1522.                move.l a0,d1
  1523.                suba.l a2,a0
  1524.                exg.l a0,d1
  1525. \SS4:          movem.l (a7)+,d2-d4/a2
  1526.                rts
  1527.  
  1528. ;Entfernung Index <=> Sync
  1529. ;=> Syncweit = entfernung Index<=>Sync
  1530. ;=> D0 = -1, dann keine Sync gefunden
  1531.  
  1532. Syncentfernung:
  1533.                move.l a5,a0
  1534.                move.w CheckLänge,d0
  1535.                bsr SuchSync
  1536.                tst.l d0
  1537.                bpl \SE1
  1538.                move.w #KeineSync,ErrorFlag
  1539.                bra \SE2
  1540. \SE1:
  1541.                move.w d1,Syncweit
  1542. \SE2:          rts
  1543.  
  1544. ;A5 = TrackPuffer
  1545.  
  1546. ;Zähler der Daten auf Disk ohne Sync und ohne DMA
  1547. ;>= A5 = Zeiger auf Verify-Puffer zum Lesen der Daten ohne Sync
  1548. ;=> CheckLänge = Länge eines Tracks (Von Index bis Index)
  1549.  
  1550. Zählen:
  1551.                bsr DiskInFloppy
  1552.                tst.l d0
  1553.                bmi \Z5
  1554.                movem.l d2-d4/a2-a3,-(a7)
  1555.                move.w #$0600,$dff09e     ;Sync ausschalten
  1556.                move.w #$8000,$dff024
  1557.                lea $dff01b,a0
  1558.                lea $dff01a,a1
  1559.                lea $bfdd00,a2
  1560.                move.l #15,d2
  1561.                move.l #4,d3
  1562.                move.w #1,d4
  1563.                clr.w d0
  1564.                move.b (a2),d1            ;Byteready Flag löschen
  1565. \Z4:           move.b (a2),d1
  1566.                btst #4,d1
  1567.                beq.s \Z4
  1568.                move.w (a1),d1            ;Byteready Flag löschen
  1569.                move.b (a2),d1            ;Indexbit löschen
  1570.                move.l a5,a3
  1571. \Z1:
  1572.                btst d2,(a1)
  1573.                beq.s \Z1
  1574.                btst d3,(a2)
  1575.                bne.s \Z2
  1576.                add.w d4,d0
  1577.                move.b (a0),(a3)+
  1578.                bra \Z1
  1579. \Z2:
  1580.                andi.w #$fffe,d0
  1581.                move.w d0,CheckLänge
  1582.                cmp.w #Bytelesen,d0       ;Track zu lang
  1583.                bcs \Z6
  1584.                move.w #Bytelesen-16,CheckLänge
  1585. \Z6:           bclr #31,d0               ;Errorbit löschen
  1586.                movem.l (a7)+,d2-d4/a2-a3
  1587. \Z5:           move.w #$4000,$dff024
  1588.                rts
  1589.  
  1590. ;Sortiert Blockgrößen
  1591.  
  1592. OrdneBlöcke:
  1593.                move.l d2,-(a7)
  1594.                cmp.w #SortBlockAnz,SyncAnz               bhi \OBEND                ;zu viele Blöcke
  1595.                tst.w SyncAnz
  1596.                beq \OBEND                ;keine Blöcke
  1597.                clr.w AnzSortBlock
  1598.                lea Blöcke,a0
  1599.                move.w SyncAnz,d0
  1600. \OB5:          move.l (a0)+,d1
  1601.                sub.w #1,d0
  1602.                lea SortBlöcke,a1         ;Anzahl der Blöcke -1
  1603.                move.w AnzSortBlock,d2
  1604.                tst.w d2
  1605.                beq \OB2                  ;erster Block
  1606. \OB4:          cmp.w (a1)+,d1
  1607.                bne \OB3                  ;gefunden
  1608.                add.w #1,(a1)
  1609.                bra \OB6
  1610. \OB3:          adda.w #2,a1
  1611.                sub.w #1,d2
  1612.                bne \OB4                  ;weiter suchen
  1613. \OB2:          move.w d1,(a1)+
  1614.                move.w #1,(a1)+
  1615.                add.w #1,AnzSortBlock
  1616. \OB6:          tst.w d0
  1617.                bne \OB5                  ;neu suchen
  1618. \OBEND:        move.l (a7)+,d2
  1619.                rts
  1620.  
  1621. SuchLücke:
  1622.                move.l d2,-(a7)
  1623.                clr.l AnfPos
  1624.                move.w AnzSortBlock,d0
  1625.  
  1626.                cmp.b #1,dc1
  1627.                beq \SL10                 ;DeepCopy 1 (lücke nach gr. Block)
  1628. ;einzelne Blöcke suchen
  1629.  
  1630.                sub.w #1,d0               ;Blocknummer -1
  1631. \SL3:
  1632.                bsr EinBlock              ;Einzelnen Block suchen
  1633.                tst.l d0                  ;Lücke gefunden?
  1634.                bpl \SL7                  ;verzweige, wenn gefunden
  1635. \SL10:         move.l GrößePos,a0        ;Lücke beim größten Block
  1636. \SL7:
  1637.                move.l A0,AnfPos
  1638.                cmp.l EndPos,a0
  1639.                bcs \SL8
  1640.                move.l a5,a0
  1641.                move.l a0,AnfPos
  1642. \SL8:
  1643.                move.l GrößePos,d0
  1644.                cmp.l EndPos,d0
  1645.                bcs \SL9
  1646.                move.l a5,GrößePos
  1647. \SL9:          move.l (a7)+,d2
  1648.                rts
  1649.  
  1650.  
  1651.  
  1652. ;Einzelnen Block suchen
  1653. ;=> D0 = Blocknummer
  1654. ;=> D0 = Blocknummer des nächsten Blocks
  1655. ;=> D0 = -1, wenn keinen gefunden
  1656. ;=> D1 = Größe des Blocks
  1657. ;=> a0 = Adresse des Blocks
  1658.  
  1659. EinBlock:
  1660.                movem.l d2-d4,-(a7)
  1661.                and.l #$ffff,d0          ;Fehlermeldung löschen
  1662.                tst.w d0
  1663.                bmi \EB3
  1664.                lea SortBlöcke,a0
  1665. \EB2:          move.w d0,d1
  1666.                lsl.w #2,d1
  1667.                move.l (a0,d1),d2
  1668.                cmp.w #1,d2
  1669.                beq \EB1                  ;Block gefunden
  1670.                sub.w #1,d0
  1671.                tst.w d0
  1672.                bpl \EB2
  1673. \EB3:          move.l #-1,d0
  1674.                bra \EBEND                ;Fehler
  1675. \EB1:          move.w (a0,d1),d2         ;Blocklänge
  1676.                clr.w d3                  ;Blockadr löschen
  1677.                lea Blöcke,a0
  1678. \EB4:          move.l (a0)+,d1
  1679.                add.w d1,d3               ;Adresse ermitteln
  1680.                cmp.w d1,d2
  1681.                bne \EB4                  ;weiter, wenn nicht fertig
  1682.                sub.l a0,a0               ;A0 löschen
  1683. \EB5:          move.w d3,a0              ;Offset
  1684.                add.l a5,a0               ;Adresse
  1685.                move.w d2,d1              ;Blockgröße
  1686.                sub.w #1,d0               ;Nummer des nächsten Blocks
  1687. \EBEND:        movem.l (a7)+,d2-d4
  1688.                rts
  1689.  
  1690. ;Prüfen, ob Track auf Amigaformat
  1691. ;=> D0 = Null, wenn Track Amigaformat
  1692. ;=> D0 = -1, wenn kein Amigaformat
  1693. TrackAmiga:
  1694.                move.l d2,-(a7)
  1695.                lea Blöcke,a0             ;Zeiger auf Blockspeicher
  1696.                cmp.w #$0b,SyncAnz        ;SyncAnzahl bei Amigaformat
  1697.                bne \PL1                  ;Nein, kein Amigaf.
  1698.                clr.w d1
  1699.                clr.l d2
  1700.                move.w #$0a,d0
  1701. \PL3:          move.w d0,d2
  1702.                lsl.w #2,d2
  1703.                cmp.w #$0440,2(a0,d2)      ;Blocklänge für Amiga
  1704.                bne \PL2
  1705.                add.w #1,d1
  1706. \PL2:          dbf d0,\PL3
  1707.                cmp.w #$9,d1              ;mindestens 9 Amiga-Blöcke
  1708.                bcs \PL1
  1709.                clr.l d0                  ;OK. Amigaformat
  1710.                move.b #ON,AmigaTrack
  1711. \PL4:          move.l (a7)+,d2
  1712.                rts
  1713. \PL1:          move.l #-1,d0             ;kein Amigaformat
  1714.                move.b #OFF,AmigaTrack
  1715.                bra \PL4
  1716.  
  1717.  
  1718. ;Das Programm geht davon aus, das alle Syncs gleich lang sind, somit
  1719. ;werden alle Syncs der ersten angepasst
  1720. ;>= A5 = Zeiger auf Trackpuffer
  1721.  
  1722. Synckorrektur:
  1723.                movem.l d2-d4,-(a7)
  1724.                cmp.w #1,SyncAnz
  1725.                beq \SK1                  ;nur eine Sync
  1726.                lea Blöcke,a0
  1727.                clr.w d0
  1728.                clr.l d3
  1729.                move.l a5,a1
  1730.                move.l (a0)+,d2
  1731.                move.w d2,d3              ;Blocklänge
  1732.                swap d2                   ;Syncrichtwert
  1733. \SK3:          adda.l d3,a1              ;Zeiger auf Block
  1734.                add.w #1,d0
  1735.                cmp.w SyncAnz,d0
  1736.                bcc \SK1
  1737.                move.l (a0)+,d1
  1738.                move.w d1,d3              ;Blocklänge
  1739.                swap d1                   ;SyncAnz von Block
  1740.                cmp.w d2,d1
  1741.                bcc \SK3                  ; nicht korrigieren
  1742.                sub.w d2,d1
  1743.                not.w d1
  1744.                move.w d1,d4              ;Anzahl der neuen Syncs
  1745.                move.l a1,-(a7)
  1746. \SK2:
  1747.                cmp.l GrößePos,a1         ;muß Pos verändert werden               bne \SK8
  1748.                sub.l #2,GrößePos         ;GrößePos verändern
  1749. \SK8:          move.w #$4489,-(a1)
  1750.  
  1751.                dbf d4,\SK2
  1752.                move.l (a7)+,a1
  1753.                add.w #1,d1
  1754.                add.w d1,-4(a0)
  1755.                lsl.w #1,d1
  1756.                sub.w d1,-6(a0)
  1757.                add.w d1,-2(a0)
  1758.                bra \SK3
  1759. \SK1:          cmp.w #Längeungleich,ErrorFlag
  1760.                beq \SK7                  ;keine endkorrektur nötig
  1761.                move.w d2,d0              ;Syncrichtwert
  1762.                move.l EndPos,a1
  1763.                add.l #2,a1               ;Zeiger auf Sync stellen
  1764.                bra \SK4
  1765. \SK6:          cmp.w #$4489,(a1)+        ;Übergang zu Anfang testen
  1766.                bne \SK5
  1767. \SK4:          dbf d0,\SK6
  1768. \SK7:          movem.l (a7)+,d2-d4
  1769.                rts
  1770. \SK5:          sub.w d0,d2
  1771.                lsl.w #1,d2
  1772.                sub.l #2,EndPos
  1773.                sub.w #2,TrackBytes
  1774.                sub.w #2,-2(a0)             ;Letzter Block ist kürzer
  1775.                bra \SK7
  1776.  
  1777. ;Nachdem die Lücke feststeht, werden die Daten zurechtkopiert um
  1778. ;geschrieben zu werden
  1779. ;>= A5 TrackPuffer (Quelle)
  1780. ;>= A4 TrackPuffer (Ziehl)
  1781.  
  1782. Umkopieren:
  1783.                move.l a2,-(a7)
  1784.                move.l a4,a1
  1785.                move.l AnfPos,a0
  1786.                sub.l a5,a0               ;Offset des Anfangs
  1787.                clr.l d0
  1788.                move.w Syncweit,d0
  1789.                sub.w #$0044,d0           ;Enfernungskorrektur
  1790.                bcc \UK6                  ;Entfernung zu klein?
  1791.                clr.w d0                  ;ja, Enfernung = 0
  1792. \UK6:
  1793.                add.l d0,a0               ;Entfernung von Index
  1794.                move.w a0,Offset          ;Anzahl der Bytes vor Sync
  1795.                suba.l a0,a1              ;Schreibanfang
  1796.                move.l a1,SchreibAnf
  1797.                move.w TrackBytes,d0
  1798.                lsr.w #1,d0               ;Byte zu Wort
  1799.                move.w LängeDest,d1
  1800.                move.l AnfPos,a0          ;Quell-Adrese
  1801.                move.l a4,a1              ;Ziehl-Adresse
  1802.                cmp.b #ON,AmigaTrack
  1803.                bne \UK9
  1804.                add.l #4,a1
  1805. \UK9:          move.l #$aaaaaaaa,-4(a1)
  1806. \UK4:          move.w (a0),(a1)+
  1807.                sub.w #1,d1
  1808.                cmp.l EndPos,a0
  1809.                bcs \UK3
  1810.                move.l a5,a0
  1811.                bra \UK5
  1812. \UK3:          adda.l #2,a0
  1813. \UK5:          dbf d0,\UK4
  1814.                move.l (a7)+,a2
  1815.                and.w #$f000,d1
  1816.                bne \UK8                  ;Source länger Dest
  1817. \UK7:          move.w #$aaaa,(a1)+       ;wenn Dest länger Source
  1818.                dbf d1,\UK7
  1819. \UK8:          move.w LängeDest,d0
  1820.                sub.w #$0006,d0
  1821.                add.w Offset,d0
  1822.                move.w d0,SLänge
  1823.                rts
  1824.  
  1825.  
  1826. ;Track lesen und decodieren
  1827. ;>= A4 = Zeiger auf Puffer für dekodierte Daten
  1828. ;>= A5 = Zeiger auf Puffer für kodierte Daten
  1829.  
  1830. Fastlesen:
  1831.                MOVEM.L D2-D4/a3/a6,-(A7)
  1832.                lea decode,a3             ;Einsprung bei decode
  1833.                move.w #$080,DecodeAnz    ;Anzahl Langworte zu decodieren
  1834.                lea $40(a5),a0
  1835.                move.l a0,DecodeAdr       ;Datenbereich des 1. Blocks
  1836.                adda.l #$400,a0
  1837.                move.l a0,FTestAdr        ;Adresse des nächsten Blocks
  1838.                move.w #OFF,VerifyFlag
  1839.                bra FLes
  1840.  
  1841. FastVerify:    movem.l d2-d4/a3/a6,-(a7)
  1842.                lea FVerify,a3            ;Einsprung bei Verify
  1843.                move.l a5,DecodeAdr
  1844.                lea $440(a5),a0
  1845.                move.l a0,FTestAdr
  1846.                move.w #ON,VerifyFlag
  1847.  
  1848. FLes:
  1849.                clr.w ErrorFlag
  1850.                bsr DiskInFloppy
  1851.                tst.l d0
  1852.                bmi \FastFehler
  1853.                MOVEA.L A5,A6             ;TrackPuffer
  1854.                move.l #$aaaaaaaa,(a6)+
  1855.                move.w #$4489,(a6)+       ;erste Sync eintragen
  1856.                bsr suchen
  1857.                tst.l d0
  1858.                bmi \FlesenEnd
  1859.  
  1860.                bsr FLösch                ;Trackpuffer vorbereiten
  1861.                clr.l d2
  1862.                move.w BytesVLücke,d2     ;Anz. der Bytes vor Lücke
  1863.                tst.l d2
  1864.                beq \FL1                  ;Keine Bytes vor der Lücke
  1865.                clr.w BlockAdr            ;Offset im Block
  1866.                bsr Anzlesen              ;Bytes lesen
  1867.                clr.l d0
  1868.                move.w BytesVLücke,d0
  1869.                move.l a5,a6
  1870.                adda.l d0,a6              ;Zeiger auf nächsten Puffer
  1871.                move.l #$aaaaaaaa,(a6)+
  1872.                move.w #$4489,(a6)+       ;erste Sync eintragen
  1873. \FL1:          move.w BytesNLücke,d2
  1874.                tst.l d2
  1875.                beq \FL2
  1876.                clr.w BlockAdr
  1877.                bsr Anzlesen
  1878. \FL2:          cmp.w #ON,VerifyFlag               beq \FL3
  1879.                bsr letzterblock          ;kein letzter Block bei Verify
  1880. \FL3:          BTST #2,$BFE001
  1881.                BEQ.S \FastFehler         ;Fehler, wenn keine Disk
  1882.                MOVEQ #0,d0               ;OK-Meldung
  1883.                move.l #$aaaaaaaa,$2ec0(a5) ;Lücke nach Daten schaffen
  1884.                bra \FlesenEnd\FastFehler:   move.l #-1,d0
  1885. \FlesenEnd:    MOVEM.L (A7)+,D2-D4/a3/A6
  1886.                RTS
  1887.  
  1888. ;Trackpuffer vorbereiten (Blockanfänge löschen)
  1889. ;>= A5 = Zeiger auf TrackPuffer
  1890.  
  1891. FLösch:        move.l a5,a0
  1892.                move.w #10,d1
  1893.                clr.l d0
  1894. \L1:           move.l d0,$440(a0)
  1895.                adda.l #$440,a0
  1896.                dbf d1,\L1
  1897.                lea BlockMeldung,a0
  1898.                move.w #10,d1
  1899. \L2:           clr.w (a0)+
  1900.                dbf d1,\L2
  1901.                rts
  1902.  
  1903. ;Eingestellte Anzahl von Bytes lesen
  1904. ;>= A6 = Zeiger auf Ziehl
  1905. ;>= D2 = Anzahl der Bytes zum lesen
  1906.  
  1907. Anzlesen:
  1908.                jsr install
  1909.                MOVE.W D2,D0
  1910.                LSR.W #1,D0
  1911.                ORI.W #$8000,D0
  1912.                add.w #1,d0
  1913.                MOVE.W D0,36(A1)
  1914.                MOVE.W D0,36(A1)
  1915.                jsr (a3)
  1916.                LEA $DFF000,A1
  1917.                MOVE.W #$4000,$24(A1)
  1918.                rts
  1919.  
  1920. ;Vorbereitung zum Lesen
  1921. ;>= A6 Zeiger auf Trackpuffer
  1922.  
  1923. install:       LEA $DFF000,A1
  1924.                move.w #$4000,$24(a1)     ;Disk-Len zurücksetzen
  1925.                move.w #$8400,$9e(a1)     ;Disk Sync einschalten
  1926.                move.w #$4489,$7e(a1)     ;SYNC-Markierung
  1927.                MOVE.L A6,$20(A1)         ;Puffer übergeben
  1928.                move.w #$0002,$dff09c
  1929.                rts
  1930.  
  1931. ;Langwort kodieren und in Puffer eintragen
  1932. ;>= D0 = Langwort
  1933. ;>= A0 = Zeiger auf Puffer
  1934.  
  1935. CodeLWort:     MOVEM.L D2-D3,-(A7)
  1936.                MOVE.L D0,D3
  1937.                LSR.L #1,D0
  1938.                BSR \CH1
  1939.                MOVE.L D3,D0
  1940.                BSR \CH1
  1941.                BSR Randsetzen
  1942.                MOVEM.L (A7)+,D2-D3
  1943.                RTS
  1944. \CH1:          ANDI.L #$55555555,D0
  1945.                MOVE.L D0,D2
  1946.                EORI.L #$55555555,D2
  1947.                MOVE.L D2,D1
  1948.                LSL.L #1,D2
  1949.                LSR.L #1,D1
  1950.                BSET #$1F,D1
  1951.                AND.L D2,D1
  1952.                OR.L D1,D0
  1953.                BTST #0,-1(A0)
  1954.                BEQ.S \CH2
  1955.                BCLR #$1F,D0
  1956. \CH2:          MOVE.L D0,(A0)+
  1957.                RTS
  1958. ;Ränder richtig setzten
  1959.  
  1960. Randsetzen:    MOVE.B (A0),D0
  1961.                BTST #0,-1(A0)
  1962.                BNE.S \CH4
  1963.                BTST #6,D0
  1964.                BNE.S \CH6
  1965.                BSET #7,D0
  1966.                BRA.S \CH5
  1967. \CH4:          BCLR #7,D0
  1968. \CH5:          MOVE.B D0,(A0)
  1969. \CH6:          RTS
  1970.  
  1971. ;Prüfsumme über Datenbereich ermitteln
  1972. ;>= D1 = Anzahl der Bytes (muß immer durch 4 teilbar sein)
  1973. ;>= A0 = Zeiger auf Puffer
  1974. ;=> D0 = Prüfsumme
  1975.  
  1976. PrüfSumme:     MOVE.L D2,-(A7)
  1977.                LSR.W #2,D1
  1978.                SUBQ.W #1,D1
  1979.                MOVEQ #0,D0
  1980. \PS1:          MOVE.L (A0)+,D2
  1981.                EOR.L D2,D0
  1982.                DBRA D1,\PS1
  1983.                ANDI.L #$55555555,D0
  1984.                MOVE.L (A7)+,D2
  1985.                RTS
  1986.  
  1987. ;Blockheader decodieren
  1988. ;>= A0 ist Zeiger auf Header
  1989. ;=> D0 = Header
  1990.  
  1991. Header:        move.l (a0)+,D0
  1992.                move.l (a0)+,D1
  1993.                andi.l #$55555555,d0
  1994.                andi.l #$55555555,d1
  1995.                lsl.l #1,D0
  1996.                or.l D1,D0
  1997.                rts
  1998.  
  1999. ;ersten nicht zuerstörten Block suchen
  2000. ;=> A6 = Zeiger auf TrackPuffer
  2001. ;=> D0 = Null: Block gefunden
  2002. ;=> BytesVLücke = Anzahl der Bytes vor der Lücke
  2003. ;=> BytesNLücke = Anzahl der Bytes nach der Lücke
  2004.  
  2005. suchen:                       movem.l d2-d4,-(a7)
  2006.                move.w #11,d2             ;Anzahl der erlaubten Fehler
  2007. \SU1:          bsr install
  2008.                move.w #$8024,d0          ;$24 Worte lesen
  2009.                MOVE.W D0,$dff024
  2010.                MOVE.W D0,$dff024
  2011.                bsr Blockready            ;auf Block ready warten
  2012.                tst.l d0                  ;Fehler, dann D0 = -1
  2013.                bmi \SUError
  2014.  
  2015.                lea 8(a5),a0              ;Zeiger auf Blockheader
  2016.                moveq #$28,d1             ;Langwortanzahl
  2017.                bsr Prüfsumme             ;Summe über Header
  2018.                move.l d0,d3              ;Summe retten
  2019.                lea 48(a5),a0             ;*Summe
  2020.                bsr Header                ;Summe aus Header holen
  2021.                cmp.l d0,d3               ;Summen vergleichen
  2022.                bne \SUNeu
  2023.                lea 8(a5),a0
  2024.                jsr Header                ;Header decodieren
  2025.                move.w d0,d3              ;Header nach D3
  2026.                lsr.w #8,d3
  2027.                andi.w #$00ff,d3          ;Sektornummer inolieren
  2028.                addi.w #1,d3              ;Sektornummer erhöhen
  2029.                cmp.w #$000a,d3           ;Nummer über 10?
  2030.                bls \SU2                  ;Nein, OK
  2031.                clr.w d3                  ;Nummer = 0
  2032. \SU2:          move.w d3,SektNum         ;Nummer speichern
  2033.                move.w d3,FirstBlock      ;Nummer erster Block
  2034.  
  2035.                move.w d0,d3              ;Header
  2036.                andi.w #$ff,d3            ;Sektoren bis Lücke
  2037.                cmp.b #$0c,d3             ;Header OK?
  2038.                bcs.s \SUok
  2039. \SUNeu:        dbf d2,\SU1
  2040.                bra \SUError
  2041. \SUok:
  2042.  
  2043.                sub.w #1,d3               ;Anzahl der Blöcke bis Lücke
  2044.                move.w d3,d2
  2045.                move.w #$000b,d4
  2046.                sub.b d2,d4               ;Anzahl der Blöcke nach Lücke
  2047.                mulu #$440,d3             ;Anzahl der Bytes bis Lücke
  2048.                mulu #$440,d4             ;Anzahl der Bytes nach Lücke
  2049.                clr.l d0
  2050.                move.w d3,BytesVLücke
  2051.                move.w d4,BytesNLücke
  2052.                move.w #$0b,SektBL        ;Sektoren vor Lücke nach dem Laden
  2053.                bra \SUEnd
  2054. \SUError:      move.l #-1,d0
  2055.                move.w #ReadError,ErrorFlag
  2056. \SUEnd:        movem.l (a7)+,d2-d4
  2057.                rts
  2058.  
  2059. Blockready:    clr.l d0                  ;Error-Flag löschen
  2060.                move.l #$20000,d1
  2061.                move.w #$0002,$dff09c     ;DiskInt löschen
  2062. \B1:           MOVE.W $DFF01E,D0
  2063.                BTST #1,D0
  2064.                bne.s \B2
  2065.                sub.l #1,d1
  2066.                bne \B1
  2067.                move.l #-1,d0             ;Fehler aufgetreten
  2068. \B2:           RTS
  2069.  
  2070.  
  2071. ;Bytes dekodieren, bis Block gelesen
  2072.  
  2073. decode:
  2074.                movem.l d2-d3/a2,-(a7)
  2075.                clr.l d3
  2076.                move.w BlockAdr,d3        ;Offset im Block
  2077.                move.l FTestAdr,a0        ;Adresse zu testen ob
  2078.                                          ;Block schon geladen
  2079.                move.l DecodeAdr,a2       ;Adresse, bei der dekodiert wird
  2080.                move.w DecodeAnz,d2       ;Abzahl für dekodierung
  2081.  
  2082. \DC1:          MOVE.W $DFF01E,D0
  2083.                BTST #1,D0                ;Bereich schon gelesen
  2084.                bne  \DCEnd              ;Ja, ende               tst.l (a0)                ;TestAdr
  2085.                beq \DC1                  ;Warten, bis Block gelesen
  2086.  
  2087.                movem.l a0-a1,-(a7)       ;Register retten
  2088.                lea -$40(a2),a1           ;* Blockanfang
  2089.                bsr BlockCheck            ;Block checken
  2090.                movem.l (a7)+,a0-a1       ;Register zurückholen
  2091.                move.w SektNum,d0
  2092.                mulu #$200,d0
  2093.                move.l a4,a1              ;Basiadresse für Ziehldaten
  2094.                add.l d0,a1               ;Adresse des Blocks
  2095. \DC2:
  2096.                MOVE.W $DFF01E,D0
  2097.                BTST #1,D0
  2098.                bne.s \DCEnd              ;Breich schon gelesen
  2099.  
  2100.                move.l (a2),D0
  2101.                move.l $200(a2),D1
  2102.                adda.l #4,a2
  2103.                andi.l #$55555555,d0
  2104.                andi.l #$55555555,d1
  2105.                lsl.l #1,D0
  2106.                or.l D1,D0
  2107.                move.l d0,(a1,d3)         ;Langword eintragen
  2108.                addq.w #4,d3
  2109.                subq.w #1,D2              ;Decode Anzahl
  2110.                bne \DC2
  2111.                adda.l #$240,a2           ;erhöhe Adresse
  2112.                adda.l #$440,a0           ;TestAdr
  2113.                move.l #$080,D2           ;Decode Anzahl
  2114.                clr.w d3                  ;Offset auf Null
  2115.                add.w #1,SektNum          ;Sektornummer erhöhen
  2116.                cmp.w #$0b,SektNum        ;Nummer über 10?
  2117.                bcs \DC3                  ;Nein, OK
  2118.                clr.w SektNum             ;Nummer = 0
  2119. \DC3:          bra \DC1
  2120.  
  2121. \DCEnd:
  2122.                move.w d3,BlockAdr
  2123.                move.l a2,DecodeAdr
  2124.                move.l a0,FTestAdr
  2125.                move.w D2,DecodeAnz
  2126.  
  2127.                movem.l (a7)+,d2-d3/a2
  2128.                RTS
  2129.  
  2130. ;Letzten Block entkodieren
  2131.  
  2132. LetzterBlock:                 movem.l d2-d3/a2,-(a7)
  2133.  
  2134.                move.w SektNum,d0
  2135.                mulu #$200,d0
  2136.                move.l a4,a1              ;Basiadresse für Ziehldaten
  2137.                add.l d0,a1               ;Adresse des Blocks
  2138.                clr.l d3
  2139.                move.l DecodeAdr,a2
  2140.                move.w DecodeAnz,d2
  2141. \LB1:          move.l (a2),D0
  2142.                move.l $200(a2),D1
  2143.                adda.l #4,a2
  2144.                andi.l #$55555555,d0
  2145.                andi.l #$55555555,d1
  2146.                lsl.l #1,D0
  2147.                or.l D1,D0
  2148.                move.l d0,(a1,d3)
  2149.                addq.w #$4,d3
  2150.                subq.w #1,D2               ;Decode Anzahl
  2151.                bne \LB1
  2152.                movem.l (a7)+,d2-d3/a2
  2153.                               RTS
  2154.  
  2155. ;Block auf Fehler prüfen
  2156. ;A1 = Zeiger auf Blockanfang
  2157.  
  2158. BlockCheck:
  2159.                movem.l d2-d3,-(a7)
  2160.                clr.l d3
  2161.                move.w SektNum,d3
  2162.                lsl.w #1,d3               ;Sektornummer => Offset
  2163.                lea BlockMeldung,a0
  2164.                move.w (a0,d3),d0         ;Eintrag holen
  2165.                tst.w d0                  ;schon geprüft?
  2166.                bne \CBEnd2               ;Ja, ende
  2167.  
  2168.                lea 64(a1),a0
  2169.                move.w #$400,d1
  2170.                jsr Prüfsumme             ;Summe über Datenblock
  2171.                move.l d0,d2              ;Summe retten
  2172.                lea 56(a1),a0             ;Zeiger auf Datensumme
  2173.                jsr Header                ;Summe decodieren
  2174.                cmp.l d0,d2
  2175.                bne \DatenFalsch
  2176.  
  2177.                lea 8(a1),a0
  2178.                bsr Header                ;Header decodieren
  2179.                move.w d0,d2              ;Unterres Wort speichern
  2180.                lsr.w #8,d2               ;Sektornummer nach d2
  2181.                cmp.b SektNum+1,d2        ;richtiger Sektor
  2182.                bne \FalscherSektor
  2183.                swap d0                   ;Tracknummer nach D0
  2184.                cmp.b StartTrack+1,d0     ;richtiger Track?
  2185.                bne \FalscherTrack
  2186.                andi.l #$ff00,d0
  2187.                cmp.w #$ff00,d0
  2188.                bne \KeinDosTrack
  2189.                lea 8(a1),a0
  2190.                moveq #$28,d1             ;Langwortanzahl
  2191.                bsr Prüfsumme             ;Summe über Header
  2192.                move.l d0,d2              ;Summe retten
  2193.                lea 48(a1),a0             ;*Summe
  2194.                bsr Header                ;Summe aus Header holen
  2195.                cmp.l d0,d2               ;Summen vergleichen
  2196.                bne \HeaderFalsch
  2197.                move.w #$ffff,d0
  2198. \CBEnd1:       lea BlockMeldung,a0
  2199.                move.w d0,(a0,d3)
  2200.                btst #0,-1(a1)
  2201.                beq \CB1
  2202.                move.l #$2aaaaaaa,(a1)
  2203.                bra \CB2
  2204. \CB1:          move.l #$aaaaaaaa,(a1)
  2205. \CB2:          move.l #$44894489,4(a1)
  2206.                move.w #$ff00,d0          ;Header neu erstellen
  2207.                move.b StartTrack+1,d0               swap d0
  2208.                move.b SektNum+1,d0
  2209.                lsl.w #8,d0
  2210.                move.b SektBL+1,d0
  2211.                lea 8(a1),a0
  2212.                bsr CodeLWort             ;Header eintragen
  2213.                lea 8(a1),a0
  2214.                moveq #$28,d1             ;Langwortanzahl
  2215.                bsr Prüfsumme             ;Summe über Header
  2216.                lea 48(a1),a0             ;*Summe
  2217.                bsr CodeLWort             ;Prüfsumme eintagen
  2218.                subq.w #1,SektBL
  2219. \CBEnd2:       movem.l (a7)+,d2-d3
  2220.                rts
  2221.  
  2222. \FalscherSektor: move.w #$0001,d0
  2223.                  bra \Flagsetzen
  2224. \FalscherTrack: move.w #$0002,d0
  2225.                  bra \Flagsetzen
  2226. \KeinDosTrack:  move.w #$0017,d0
  2227.                  bra \Flagsetzen
  2228. \HeaderFalsch:  move.w #$001b,d0
  2229.                  bra \Flagsetzen
  2230. \DatenFalsch:   move.w #$0019,d0
  2231. \Flagsetzen:    move.w #ReadError,ErrorFlag
  2232.                 bra \CBEnd1
  2233.  
  2234. ;gelesene Bytes mit alten vergleichen
  2235. ;>= A4 = Zeiger auf Basisadresse des alten Blocks
  2236.  
  2237. FVerify:
  2238.                cmp #VerifyError,ErrorFlag
  2239.                beq \FVEnd2
  2240.                movem.l d2-d3/a2,-(a7)
  2241.                clr.l d3
  2242.                move.w BlockAdr,d3        ;Offset im Block
  2243.                move.l FTestAdr,a0        ;Adresse zum testen ob
  2244.                                          ;Block schon geladen
  2245.                move.l DecodeAdr,a2       ;Adresse, bei der verglichen wird
  2246. \FV1:          MOVE.W $DFF01E,D0
  2247.                BTST #1,D0                ;Bereich schon gelesen
  2248.                bne  \FVEnd               ;Ja, ende
  2249.                tst.l (a0)                ;TestAdr
  2250.                beq \FV1                  ;Warten, bis Block gelesen
  2251.                move.w #$110,d2           ;Vergleichanzahl
  2252.                move.w SektNum,d0
  2253.                sub.w FirstBlockSp,d0               bcc \FV2
  2254.                addi.w #11,d0
  2255. \FV2:
  2256.                mulu #$440,d0
  2257.                move.l a4,a1              ;Basiadresse für Ziehldaten
  2258.                add.l d0,a1               ;Adresse des Blocks
  2259. \FV3:
  2260.                move.l (a2)+,d0
  2261.                cmp.l (a1,d3),d0               beq \FV6                  ;Verify ok
  2262. ;Auf Sonderfall testen  ($aaaaaaaa und $2aaaaaaa)
  2263.                move.l (a1,d3),d1
  2264.                eor.l d1,d0
  2265.                cmp.l #$80000000,d0
  2266.                bne \FV5
  2267. \FV6:          addq.w #4,d3
  2268.                subq.w #1,d2
  2269.                bne \FV3
  2270.                adda.l #$440,a0           ;TestAdr
  2271.                clr.l d3                  ;Offset auf Null
  2272.                add.w #1,SektNum          ;Sektornummer erhöhen
  2273.                cmp.w #$0b,SektNum        ;Nummer über 10?
  2274.                bcs \FV1                  ;Nein, OK
  2275.                clr.w SektNum             ;Nummer = 0
  2276.                bra \FV1
  2277. \FV5:          move.w #VerifyError,ErrorFlag
  2278.                bra \FVEnd3
  2279. \FVEnd:
  2280.                clr.w ErrorFlag
  2281.                move.w d3,BlockAdr
  2282.                move.l a2,DecodeAdr
  2283.                move.l a0,FTestAdr
  2284. \FVEnd3:       movem.l (a7)+,d2-d3/a2
  2285. \FVEnd2:       RTS
  2286.  
  2287. ;Track codieren
  2288. ;>= A0 = Zeiger auf Quelle
  2289. ;>= A1 = Zeiger auf Ziehl
  2290. ;>= D0 = Tracknummer
  2291. CodeTrack:
  2292.                movem.l d2-d4/a2-a3,-(a7)
  2293.                move.l d0,d4
  2294.                move.l a0,a2
  2295.                move.l a1,a3
  2296.                moveq #$0b,d2
  2297.                clr.w d3
  2298. \CT1:          move.w #$ff00,d0
  2299.                move.b d4,d0
  2300.                swap d0
  2301.                move.w d3,d0
  2302.                lsl.w #8,d0
  2303.                move.b d2,d0
  2304.                move.l a2,a0              ;Quelle
  2305.                move.l a3,a1              ;Ziehl
  2306.                bsr ErstellBlock
  2307.                add.l #$440,a3
  2308.                add.l #$200,a2
  2309.                addq.w #1,d3
  2310.                subq.w #1,d2
  2311.                bne \CT1
  2312.                movem.l (a7)+,d2-d4/a2-a3
  2313.                rts
  2314.  
  2315. ;Block kodieren und Header erstellen
  2316. ;>= A0 = Unkodierte Daten (Quelle)
  2317. ;>= A1 = Datenpuffer für kodierte Daten (Ziehl)
  2318. ;>= D0 = unkodierter Header
  2319.  
  2320. ErstellBlock:  MOVEM.L D2/A2/A4,-(A7)
  2321.                MOVEA.L A1,A4
  2322.                MOVEA.L A0,A2
  2323.                MOVE.L D0,D2
  2324.                MOVEQ #0,D0
  2325.                LEA 0(A4),A0
  2326.                BSR CodeLWort
  2327.                MOVE.L #$44894489,4(A4)
  2328.                MOVE.L D2,D0
  2329.                LEA 8(A4),A0
  2330.                BSR CodeLWort
  2331.                MOVEQ #3,D2
  2332. \EB1:          MOVEQ #0,D0
  2333.                BSR CodeLWort
  2334.                DBRA D2,\EB1
  2335.                LEA 8(A4),A0
  2336.                MOVEQ #$28,D1
  2337.                BSR Prüfsumme
  2338.                LEA $30(A4),A0
  2339.                BSR CodeLWort
  2340.                MOVE.L #$200,D0
  2341.                MOVEA.L A2,A0
  2342.                LEA $40(A4),A1
  2343.                BSR CodeBlock
  2344.                LEA $40(A4),A0
  2345.                MOVE.W #$400,D1
  2346.                BSR Prüfsumme
  2347.                LEA $38(A4),A0
  2348.                BSR CodeLWort
  2349.                MOVEM.L (A7)+,D2/A2/A4
  2350.                RTS
  2351.  
  2352. ;Datenblock kodieren
  2353. ;>= D0 = Länge der Quelle
  2354. ;>= A0 = Zeiger auf Quelle
  2355. ;>= A1 = Zeiger auf Ziehl
  2356.  
  2357. CodeBlock:
  2358.  
  2359.                movem.l  d2/a5,-(a7)
  2360.                MOVE.W D0,D1
  2361.                LSL.W #2,D1
  2362.                ORI.W #8,D1
  2363.                MOVE.W D1,D2
  2364.                movem.l d0-d1/a0-a1/a5,-(a7)
  2365.                move.l a0,d1
  2366.                move.l a1,a5
  2367.                lea $dff000,a0
  2368.                bsr BlitWart
  2369.                bsr BlitterCode
  2370.                movem.l (a7)+,d0-d1/a0-a1/a5
  2371.                MOVE.L D0,D1
  2372.                MOVEA.L A1,A0
  2373.                BSR Randsetzen
  2374.                ADDA.L D1,A0
  2375.                BSR Randsetzen
  2376.                ADDA.L D1,A0
  2377.                BSR Randsetzen
  2378.                movem.l (a7)+,d2/a5
  2379.                RTS
  2380.  
  2381. ;A0 = $dff000
  2382. ;D0 = Länge der Quelle
  2383. ;D1 = Quelle
  2384. ;A5 = Ziehl
  2385.  
  2386. BlitterCode:
  2387.                bsr Modulu                ;Modulu setzen
  2388.                MOVE.L D1,$4C(A0)
  2389.                MOVE.L D1,$50(A0)
  2390.                MOVE.L A5,$54(A0)
  2391.                MOVE.W #$1DB1,$40(A0)
  2392.                MOVE.W #0,$42(A0)
  2393.                bsr StartBlit
  2394.                MOVE.L A5,$4C(A0)         ;Source B
  2395.                MOVE.L D1,$50(A0)         ;Source A
  2396.                MOVE.L A5,$54(A0)         ;Dest
  2397.                MOVE.W #$2d8c,$40(A0)
  2398.                bsr StartBlit
  2399.                movem.l d0-d1/a5,-(a7)
  2400.                ADD.L D0,D1
  2401.                SUBQ.L #2,D1
  2402.                ADDA.L D0,A5
  2403.                ADDA.L D0,A5
  2404.                SUBQ.L #2,A5
  2405.                MOVE.L D1,$4C(A0)
  2406.                MOVE.L D1,$50(A0)
  2407.                MOVE.L A5,$54(A0)
  2408.                MOVE.W #$DB1,$40(A0)
  2409.                MOVE.W #$1002,$42(A0)
  2410.                bsr StartBlit
  2411.                movem.l (a7)+,d0-d1/a5
  2412.                movem.l d0-d1/a5,-(a7)
  2413.                ADDA.L D0,A5
  2414.                MOVE.L A5,$4C(A0)
  2415.                MOVE.L D1,$50(A0)
  2416.                MOVE.L A5,$54(A0)
  2417.                MOVE.W #$1D8C,$40(A0)
  2418.                MOVE.W #0,$42(A0)
  2419.                bsr StartBlit
  2420.                movem.l (a7)+,d0-d1/a5
  2421.                rts
  2422.  
  2423. ;Blit start und auf Ende von Blitter warten
  2424.  
  2425. StartBlit:
  2426.                MOVE.W d2,$dff058
  2427. BlitWart:      btst #14,$dff002
  2428.                bne.s BlitWart
  2429.                rts
  2430.  
  2431. ;Modulu für codierug setzen
  2432. ;>= A0 = $dff000
  2433. Modulu:
  2434.                movem.l d0/a1,-(a7)
  2435.                MOVEQ #0,D0
  2436.                LEA $44(A0),A1
  2437.                MOVE.L #-1,(A1)
  2438.                LEA $62(A0),A1
  2439.                MOVE.L D0,(A1)+
  2440.                MOVE.W D0,(A1)+
  2441.                ADDQ.L #8,A1
  2442.                MOVE.W #$5555,(A1)
  2443.                movem.l (a7)+,d0/a1
  2444.                rts
  2445.  
  2446. ;Track mit DOS löschen
  2447. ;>= A0 = Zeiger auf Trackpuffer
  2448. DOSLösch:
  2449.                move.l #$444F5300,d0      ;DOS + 0
  2450.                move.w #$57f,d1
  2451. \DO1:          move.l d0,(a0)+           ;Track löschen
  2452.                addq.b #1,d0
  2453.                dbf d1,\DO1
  2454.                rts
  2455.  
  2456. ;Track verkützen und im Speicher ablegen
  2457. ;>= A0 = Zeiger auf den Anfang des Tracks
  2458. ;>= A1 = Zeiger auf Ziehladresse
  2459. ;>= Länge = Anzahl der zu kürzenden Bytes
  2460. ;>= KutzByte = Byte, das kürzer abgelegt werden soll
  2461. ;=> A1 = Zeiger auf Speicher nach gekürztem Block
  2462.  
  2463. Crunch:
  2464.                movem.l d2-d7/a2/a4,-(a7)
  2465.                clr.w d7
  2466.                clr.w d2
  2467.                move.w Länge,d3      ;Anzahl der Bytes
  2468.                move.l SpeicherLänge,d6
  2469. \CHAnf:
  2470.                tst.w d7
  2471.                bne \CHEnd
  2472.                movea.l a0,a2             ;Adrsse zwischenspeichern
  2473. \CH4:          bsr \LeererBlock
  2474.                tst.w d0
  2475.                beq \CHAnf
  2476.                move.b (a0),d4
  2477.                cmp.b KurzByte,d4
  2478.                beq \KF1                  ;Nullbyte
  2479.                cmp.b 1(a0),d4
  2480.                bne \CH10                 ;Keine folge
  2481.                cmp.b 2(a0),d4
  2482.                beq \AF1                  ;Andere Folge
  2483. \CH10:         addq.l #1,a0
  2484.                subq.w #1,d3
  2485.                bne \CH4                  ;weiter suchen
  2486.                bsr \KeineFolge
  2487. \CHEnd:
  2488.                move.b #$00,d0
  2489.                move.b d0,(a1)+
  2490.                subq.l #1,d6
  2491.                bcs CrunEnd
  2492.                move.l d6,SpeicherLänge
  2493.                move.l a1,SpeicherAnf
  2494.                clr.l d0
  2495.                movem.l (a7)+,d2-d7/a2/a4               rts
  2496. ;Kurzfolge
  2497.  
  2498. \KF1:          cmp.b 1(a0),d4
  2499.                bne \CH10                 ;Keine Nullfolge
  2500.                bsr \KeineFolge
  2501.                bsr ZähleBytes
  2502.                cmp.w #$40,d1
  2503.                bcc \KF2                  ;zu groß für ein Byte
  2504.                ori.b #KurzNull,d1               move.b d1,(a1)+
  2505.                subq.l #1,d6
  2506.                beq CrunEnd
  2507.                bra \KF4
  2508. \KF2:          cmp.w #$1000,d1
  2509.                bcc \KF3                  ;zu groß, muß Wort sein
  2510.                move.w d1,d0
  2511.                lsr.w #8,d0
  2512.                ori.b #MittelNull,d0      ;Nullfolge mit Folge-Byte
  2513.                move.b d0,(a1)+
  2514.                subq.l #1,d6
  2515.                beq CrunEnd
  2516.                move.b d1,(a1)+
  2517.                subq.l #1,d6
  2518.                beq CrunEnd
  2519.                bra \KF4
  2520. \KF3:          move.b #LangNull,d0
  2521.                move.b d0,(a1)+
  2522.                subq.l #1,d6
  2523.                beq CrunEnd
  2524.                move.w d1,d0
  2525.                lsr.w #8,d0
  2526.                move.b d0,(a1)+
  2527.                subq.l #1,d6
  2528.                beq CrunEnd
  2529.                move.b d1,(a1)+
  2530.                subq.l #1,d6
  2531.                beq CrunEnd
  2532. \KF4:          bra \CHAnf
  2533.  
  2534. ;Andere Folge
  2535.  
  2536. \AF1:          bsr \KeineFolge
  2537.                bsr ZähleBytes
  2538.                cmp.w #$40,d1
  2539.                bcc \AF2                  ;zu groß für ein Byte
  2540.                ori.b #KurzNorm,d1
  2541.                move.b d1,(a1)+
  2542.                subq.l #1,d6
  2543.                beq CrunEnd
  2544.                bra \AF4
  2545. \AF2:          cmp.w #$1000,d1
  2546.                bcc \AF3                  ;zu groß, muß Wort sein
  2547.                move.w d1,d0
  2548.                lsr.w #8,d0
  2549.                ori.b #MittelNorm,d0      ;beliebige Folge mit Folge-Byte               move.b d0,(a1)+
  2550.                subq.l #1,d6
  2551.                beq CrunEnd
  2552.                move.b d1,(a1)+
  2553.                subq.l #1,d6
  2554.                beq CrunEnd
  2555.                bra \AF4
  2556. \AF3:          move.b #LangNorm,d0
  2557.                move.b d0,(a1)+
  2558.                subq.l #1,d6
  2559.                beq CrunEnd
  2560.                move.w d1,d0
  2561.                lsr.w #8,d0
  2562.                move.b d0,(a1)+
  2563.                subq.l #1,d6
  2564.                beq CrunEnd
  2565.                move.b d1,(a1)+
  2566.                subq.l #1,d6
  2567.                beq CrunEnd
  2568. \AF4:          move.b d4,d0              ;anderes Byte eintragen
  2569.                move.b d0,(a1)+
  2570.                subq.l #1,d6
  2571.                beq CrunEnd
  2572.                bra \CHAnf
  2573.  
  2574. ;Keine Folge gefunden
  2575. \KeineFolge2:  move.w #1,Abzug           ;Siehe CrunEnd2
  2576.                bra \KF20
  2577. \KeineFolge:   clr.w Abzug
  2578. \KF20:         move.l a0,a4
  2579.                sub.l a2,a4
  2580.                move.w a4,d1
  2581.                beq \KFEnd
  2582.                swap d1
  2583.                move.w a4,d1
  2584.                cmp.w #$40,d1
  2585.                bcc \CH5                  ;zu groß für ein Byte
  2586.                ori.b #KurzKein,d1
  2587.                move.b d1,(a1)+
  2588.                subq.l #1,d6
  2589.                beq CrunEnd2
  2590.                bra \CH6
  2591. \CH5:          cmp.w #$1000,d1
  2592.                bcc \CH7                  ;zu groß, muß Wort sein
  2593.                move.w d1,d0
  2594.                lsr.w #8,d0
  2595.                ori.b #MittelKein,d0               move.b d0,(a1)+
  2596.                subq.l #1,d6
  2597.                beq CrunEnd2
  2598.                move.b d1,(a1)+
  2599.                subq.l #1,d6
  2600.                beq CrunEnd2
  2601.                bra \CH6
  2602. \CH7:          move.b #LangKein,D0
  2603.                move.b d0,(a1)+
  2604.                subq.l #1,d6
  2605.                beq CrunEnd2
  2606.                move.w d1,d0
  2607.                lsr.w #8,d0
  2608.                move.b d0,(a1)+
  2609.                subq.l #1,d6
  2610.                beq CrunEnd2
  2611.                move.b d1,(a1)+
  2612.                subq.l #1,d6
  2613.                beq CrunEnd2
  2614. \CH6:          swap d1
  2615.                andi.l #$ffff,d1
  2616.                sub.l d1,d6               beq CrunEnd2
  2617.                bcs CrunEnd2
  2618.                bra \CH8\CH9:          move.b (a2)+,(a1)+
  2619. \CH8:          dbf d1,\CH9
  2620. \KFEnd:        clr.w Abzug               ;Siehe CrunEnd2
  2621.                rts
  2622.  
  2623. \LeererBlock:
  2624.                move.w d3,d0
  2625.                andi.w #$fe00,d0
  2626.                cmp.w d0,d3
  2627.                bne \LBEnd2
  2628.                move.l a0,a3
  2629.                move.w #$7e,d5
  2630.                move.l (a0)+,d4
  2631.                move.l d4,d0
  2632.                andi.l #$ff000000,d0
  2633.                cmp.l #$44000000,d0
  2634.                bne \LBNein
  2635. \LB1:          addq.b #1,d4
  2636.                cmp.l (a0)+,d4               bne \LBNein
  2637.                dbf d5,\LB1
  2638.                bsr \KeineFolge2
  2639.                move.b #LeerBlock,d0
  2640.                move.b d0,(a1)+
  2641.                subq.l #1,d6
  2642.                beq CrunEnd2
  2643.                clr.w d0                  ;Ok Meldung
  2644.                subi.w #$200,d3
  2645.                bne \LBEnd
  2646.                move.w #-1,d7             ;Endmarkierung
  2647.                bra \LBEnd
  2648. \LBNein:       move.l a3,a0
  2649. \LBEnd2:       move.w #-1,d0
  2650. \LBEnd:        rts
  2651.  
  2652. ZähleBytes:    clr.w d1
  2653. \ZB2:          cmp.b (a0)+,d4
  2654.                bne \ZB1
  2655.                addq.w #1,d1
  2656.                subq.w #1,d3
  2657.                bne \ZB2
  2658.                move.w #-1,d7             ;Endmarkierung
  2659. \ZB1:
  2660.                subq.l #1,a0
  2661.                rts
  2662.  
  2663.  
  2664.  
  2665. CrunEnd2:      move.w Abzug,d2
  2666. \CE1:          adda.l #$4,a7
  2667.                dbf d2,\CE1
  2668. CrunEnd:
  2669.                movem.l (a7)+,d2-d7/a2/a4               move.l #-1,d0
  2670.                rts
  2671.  
  2672. ;Track wieder in Normgröße bringen
  2673. ;>= A0 = Zeiger auf der gecrunchten Track
  2674. ;>= A1 = Zeiger auf Ziehladresse
  2675.  
  2676. DeCrunch:
  2677.                move.b (a0)+,d0
  2678.                tst.b d0
  2679.                beq \DCEnd                ;Endmarkierung
  2680.                move.b d0,d1
  2681.                andi.b #$c0,d1
  2682.                bne Kurz
  2683.                move.b d0,d1
  2684.                andi.b #$30,d1
  2685.                bne Mittel
  2686.                move.b d0,d1
  2687.                cmpi.b #LeerBlock,d1
  2688.                beq \BlockLeer
  2689.                move.b (a0)+,d0
  2690.                lsl.w #8,d0
  2691.                move.b (a0)+,d0
  2692.                cmpi.b #LangNull,d1
  2693.                beq \NullLang
  2694.                cmpi.b #LangNorm,d1
  2695.                beq \NormLang
  2696.                cmpi.b #LangKein,d1
  2697.                beq \UndefLang
  2698. ;Fehler
  2699.                move.l $4,a6
  2700.                sub.l a5,a5
  2701.                move.l #$12345678,d7
  2702.                jsr -108(a6)
  2703. \DCEnd:        rts
  2704.  
  2705.  
  2706. ;Leerer Block
  2707. \BlockLeer:    move.w #$7f,d1
  2708.                move.l #$444F5300,d0
  2709. \LB1:          move.l d0,(a1)+
  2710.                addq.b #1,d0
  2711.                dbf d1,\LB1
  2712.                bra DeCrunch
  2713. ;Lang
  2714.  
  2715. \LA1:          move.b (a0)+,(a1)+
  2716. \UndefLang:    dbf d0,\LA1
  2717.                bra DeCrunch\NullLang:     move.b Kurzbyte,d1
  2718.                bra \LA2
  2719. \NormLang:     move.b (a0)+,d1
  2720.                bra \LA2
  2721. \LA3:          move.b d1,(a1)+
  2722. \LA2:          dbf d0,\LA3
  2723.                bra DeCrunch
  2724. Kurz:
  2725.                cmpi.b #KurzNull,d1
  2726.                beq \KU1
  2727.                cmpi.b #KurzNorm,d1
  2728.                beq \KU2
  2729. ;KurzUndeff
  2730.                andi.w #$3f,d0
  2731.                bra \KU3
  2732. \KU4:          move.b (a0)+,(a1)+
  2733. \KU3:          dbf d0,\KU4               bra DeCrunch\KU1:          move.b Kurzbyte,d1
  2734.                bra \KU5
  2735. \KU2:          move.b (a0)+,d1
  2736. \KU5:          andi.w #$003f,d0
  2737.                bra \KU6
  2738. \KU7:          move.b d1,(a1)+
  2739. \KU6:          dbf d0,\Ku7
  2740.                bra DeCrunchMittel:
  2741.                andi.w #$0f,d0
  2742.                lsl.w #8,d0
  2743.                move.b (a0)+,d0
  2744.                cmpi.b #MittelNull,d1
  2745.                beq \KU1
  2746.                cmpi.b #MittelNorm,d1
  2747.                beq \KU2
  2748. ;MittelUndeff
  2749.                bra \KU3
  2750. \KU4:          move.b (a0)+,(a1)+
  2751. \KU3:          dbf d0,\KU4               bra DeCrunch\KU1:          move.b Kurzbyte,d1
  2752.                bra \KU6
  2753. \KU2:          move.b (a0)+,d1
  2754.                bra \KU6
  2755. \KU7:          move.b d1,(a1)+
  2756. \KU6:          dbf d0,\Ku7
  2757.                bra DeCrunch
  2758.  
  2759. beg:
  2760.         move.w #$0008,$dff09a
  2761.  
  2762.         move.l gfxbase,a6
  2763.         lea    bitmap,a0
  2764.         move.b #1,d0
  2765.         move.w #320,d1
  2766.         move.w #256,d2
  2767.         jsr    InitBitMap(a6)
  2768.         move.l bit_adress,plane1
  2769.         move.l bit_adress,d1
  2770.         move.w d1,plane_lo
  2771.         swap   d1
  2772.         move.w d1,plane_hi
  2773.  
  2774.         lea    rastport,a1
  2775.         jsr    InitRastPort(a6)
  2776.         move.l #bitmap,r_bitmap
  2777.  
  2778.         move.l #ncopper,a0
  2779.         move.l cop_adress,a1
  2780.         move.l #copsize,d0
  2781. copy_loop:
  2782.         move.b (a0)+,(a1)+
  2783.         dbf    d0,copy_loop
  2784.  
  2785.         bsr  adresses
  2786.         move.l c1_adress,flash_adress
  2787.  
  2788.         move.l bit_adress,a0
  2789.         move.w #$27ff,d0
  2790. clear_loop:
  2791.         clr.b  (a0)+
  2792.         dbf    d0,clear_loop
  2793.  
  2794.         move.l gfxbase,a0
  2795.         move.w #$0080,$dff096
  2796.         move.l $6c,oldirq
  2797.         move.l #newirq,$6c
  2798.         move.l 50(a0),oldcopper
  2799.         move.l cop_adress,50(a0)
  2800.         move.w #$82b0,$dff096
  2801.  
  2802. new_start:
  2803.         move.w #7,x1
  2804.         move.w #54,y1
  2805.         move.b #$4f,lc
  2806.         move.b #$00,fc
  2807.         move.b #$03,tr
  2808.         move.b #$00,ws
  2809.         move.b #$01,vd
  2810.         move.b #$01,fa
  2811.         move.b #$00,dc1
  2812.         move.b #$00,dc2
  2813.         move.b #$01,sd
  2814.         move.b #$00,dd
  2815.         move.b #$01,sy
  2816.         move.b #$00,new
  2817.         move.b #$00,zeiger1
  2818.         move.b #$00,color_ptr
  2819.         move.b drives,dd
  2820.         bsr  end_drive
  2821.         bsr  show_lc
  2822.         move.l #text1,text_ptr
  2823.         bsr  set_title
  2824.         bra  menu_control
  2825. exit:
  2826.         move.w #$8008,$dff09a
  2827.         move.l gfxbase,a0
  2828.         move.w #$0080,$dff096
  2829.         move.l oldirq,$6c
  2830.         move.l oldcopper,50(a0)
  2831.         move.w #$82b0,$dff096
  2832.  
  2833. no_DPuffer:
  2834.         move.l ExecBase,a6
  2835.         move.l cop_adress,a1
  2836.         move.l #copsize+2,d0
  2837.         jsr    FreeMem(a6)
  2838. no_copper:
  2839.         move.l ExecBase,a6
  2840.         move.l bit_adress,a1
  2841.         move.l #$2800,d0
  2842.         jsr    FreeMem(a6)
  2843. no_bitmap:
  2844.         move.l ExecBase,a6
  2845.         move.l gfxbase,a1
  2846.         jsr    CloseLibrary(a6)
  2847. no_gfxbase:
  2848.         clr.l  d0
  2849.         rts
  2850.  
  2851. newirq:
  2852.         move   SR,-(a7)
  2853.         movem.l a0-a6/d0-d7,-(a7)
  2854.         addq.b #1,waiting
  2855.         cmp.b  #2,waiting
  2856.         ble    endirq
  2857.         clr.b  waiting
  2858.         move.l flash_adress,a2
  2859.         cmpi.b #$00,color_ptr
  2860.         bne.s  irq_flash
  2861.         move.w #$00ee,(a2)
  2862.         bra.s  endirq
  2863. irq_flash:
  2864.         cmpi.b #$00,back
  2865.         beq.s  upward
  2866. downward:
  2867.         subi.w #$0011,(a2)
  2868.         cmpi.w #$0044,(a2)
  2869.         bcc.s  endirq
  2870.         move.b #$00,back
  2871.         bra.s  endirq
  2872. upward: addi.w #$0011,(a2)
  2873.         cmpi.w #$00ff,(a2)
  2874.         bcs.s  endirq
  2875.         move.b #$01,back
  2876. endirq: movem.l (a7)+,a0-a6/d0-d7
  2877.         move   (a7)+,SR
  2878.         dc.w $4ef9
  2879. oldirq: dc.l 0
  2880.  
  2881. menu_control:
  2882.         bsr  wait_key
  2883.         cmpi.b #$46,d0
  2884.         beq  destination_drive
  2885.         cmpi.b #$50,d0
  2886.         beq  start_copy
  2887.         cmpi.b #$51,d0
  2888.         beq  first_cylinder
  2889.         cmpi.b #$52,d0
  2890.         beq  last_cylinder
  2891.         cmpi.b #$53,d0
  2892.         beq  how_many_tries
  2893.         cmpi.b #$54,d0
  2894.         beq  write_serveral_times
  2895.         cmpi.b #$55,d0
  2896.         beq  verify_destination
  2897.         cmpi.b #$56,d0
  2898.         beq  fast_copy
  2899.         cmpi.b #$57,d0
  2900.         beq  deepcopy_1
  2901.         cmpi.b #$58,d0
  2902.         beq  deepcopy_2
  2903.         cmpi.b #$59,d0
  2904.         beq  source_drive
  2905.         cmpi.b #$21,d0
  2906.         beq  synccorrection
  2907.         bra.s  menu_control
  2908.  
  2909. start_copy:
  2910.         move.l c2_adress,flash_adress
  2911.         move.b #$01,color_ptr
  2912.         bsr  show_start
  2913. start_copy2:
  2914.         bsr  wait_key
  2915.         cmpi.b #$45,d0
  2916.         beq  new_start
  2917.         cmpi.b #$44,d0                   ;Resturn
  2918.         beq.s  end_start
  2919.         cmpi.b #$43,d0
  2920.         bne.s  start_copy2
  2921. end_start:
  2922.         move.b #$00,color_ptr
  2923.         move.w #28,y1
  2924.         bsr    cl2
  2925.         move.w #10,d0
  2926. estlop: bsr    zeit
  2927.         dbf    d0,estlop
  2928.         bsr clear_eol
  2929.         bsr copy_start                   ;copy-Routine
  2930.         cmp.w #Escape,ErrorFlag
  2931.         beq new_start
  2932.         cmp.w #diskprotect,errorflag
  2933.         beq start_copy
  2934.         cmp.w #keinedisk,errorflag
  2935.         beq start_copy
  2936.         cmp.w #NotProtect,ErrorFlag        beq.s start_copy
  2937.         bsr  cl1
  2938. esd1:   bsr  wait_key
  2939.         cmpi.b #$40,d0
  2940.         bne.s  esd1
  2941. esd2:   bra new_start
  2942.  
  2943. destination_drive:
  2944.         move.l c13_adress,flash_adress
  2945.         move.b #$01,color_ptr
  2946. destination1:
  2947.         bsr  wait_key
  2948.         cmpi.b #$0a,d0
  2949.         beq.s  d_drive0
  2950.         cmpi.b #$01,d0
  2951.         beq.s  d_drive1
  2952.         cmpi.b #$02,d0
  2953.         beq  d_drive2
  2954.         cmpi.b #$03,d0
  2955.         beq  d_drive3
  2956.         cmpi.b #$43,d0
  2957.         beq.s  end_destination
  2958.         cmpi.b #$44,d0
  2959.         bne.s  destination1
  2960. end_destination:
  2961.         cmpi.b #$00,dd
  2962.         beq.s  destination1
  2963.         move.b #$00,color_ptr
  2964.         bra  menu_control
  2965. d_drive0:
  2966.         btst   #0,drives
  2967.         beq  end_drive
  2968.         btst   #0,dd
  2969.         beq.s  dd0_0
  2970.         bclr   #0,dd
  2971.         bra.s  dd0_1
  2972. dd0_0:  bset   #0,dd
  2973.         move.b #1,drv
  2974. dd0_1:  bra  end_drive
  2975.  
  2976. d_drive1:
  2977.         btst   #1,drives
  2978.         beq  end_drive
  2979.         btst   #1,dd
  2980.         beq.s  dd1_0
  2981.         bclr   #1,dd
  2982.         bra.s  dd1_1
  2983. dd1_0:  bset   #1,dd
  2984.         move.b #2,drv
  2985. dd1_1:  bra.s  end_drive
  2986.  
  2987. d_drive2:
  2988.         btst   #2,drives
  2989.         beq.s  end_drive
  2990.         btst   #2,dd
  2991.         beq.s  dd2_0
  2992.         bclr   #2,dd
  2993.         bra.s  dd2_1
  2994. dd2_0:  bset   #2,dd
  2995.         move.b #4,drv
  2996. dd2_1:  bra.s  end_drive
  2997.  
  2998. d_drive3:
  2999.         btst   #3,drives
  3000.         beq.s  end_drive
  3001.         btst   #3,dd
  3002.         beq.s  dd3_0
  3003.         bclr   #3,dd
  3004.         bra.s  end_drive
  3005. dd3_0:  bset   #3,dd
  3006.         move.b #8,drv
  3007. end_drive:
  3008.         cmpi.b #$01,dc1
  3009.         bne.s  st1
  3010.         bra.s  st2
  3011. st1:    cmpi.b #$01,dc2
  3012.         bne  steve1
  3013. st2:    move.b drv,dd
  3014.         bra  steve
  3015. steve1: btst   #0,sd
  3016.         beq.s  ste1
  3017.         andi.b #$0e,dd
  3018.         cmpi.b #$00,dd
  3019.         bne.s  steve
  3020.         bset   #0,dd
  3021.         bra.s  steve
  3022. ste1:   btst   #1,sd
  3023.         beq.s  ste2
  3024.         andi.b #$0d,dd
  3025.         cmpi.b #$00,dd
  3026.         bne.s  steve
  3027.         bset   #1,dd
  3028.         bra.s  steve
  3029. ste2:   btst   #2,sd
  3030.         beq.s  ste3
  3031.         andi.b #$0b,dd
  3032.         cmpi.b #$00,dd
  3033.         bne.s  steve
  3034.         bset   #2,dd
  3035.         bra.s  steve
  3036. ste3:   btst   #3,sd
  3037.         beq.s  steve
  3038.         andi.b #$07,dd
  3039.         cmpi.b #$00,dd
  3040.         bne.s  steve
  3041.         bset   #3,dd
  3042. steve:  btst   #0,dd
  3043.         bne.s  end_dd1
  3044.         lea    off_text,a0
  3045.         bra.s  end_dd2
  3046. end_dd1:lea    on_text2,a0
  3047. end_dd2:bsr  set_drive0
  3048.         btst   #1,dd
  3049.         bne.s  end_dd3
  3050.         lea    off_text,a0
  3051.         bra.s  end_dd4
  3052. end_dd3:lea    on_text2,a0
  3053. end_dd4:bsr  set_drive1
  3054.         btst   #2,dd
  3055.         bne.s  end_dd5
  3056.         lea    off_text,a0
  3057.         bra.s  end_dd6
  3058. end_dd5:lea    on_text2,a0
  3059. end_dd6:bsr  set_drive2
  3060.         btst   #3,dd
  3061.         bne.s  end_dd7
  3062.         lea    off_text,a0
  3063.         bra.s  end_dd8
  3064. end_dd7:lea    on_text2,a0
  3065. end_dd8:bsr  set_drive3
  3066.         cmpi.b #$00,zeiger1
  3067.         bne.s  end_dd9
  3068.         move.b #$01,zeiger1
  3069.         rts
  3070. end_dd9:bra  destination1
  3071.  
  3072. set_drive0:
  3073.         move.l gfxbase,a6
  3074.         lea    rastport,a1
  3075.         move.w #61,d0
  3076.         move.w #213,d1
  3077.         jsr    Movee(a6)        bra.s  set_text
  3078. set_drive1:
  3079.         move.l gfxbase,a6
  3080.         lea    rastport,a1
  3081.         move.w #126,d0
  3082.         move.w #213,d1
  3083.         jsr    Movee(a6)        bra.s  set_text
  3084. set_drive2:
  3085.         move.l gfxbase,a6
  3086.         lea    rastport,a1
  3087.         move.w #190,d0
  3088.         move.w #213,d1
  3089.         jsr    Movee(a6)        bra.s  set_text
  3090. set_drive3:
  3091.         move.l gfxbase,a6
  3092.         lea    rastport,a1
  3093.         move.w #254,d0
  3094.         move.w #213,d1
  3095.         jsr    Movee(a6)set_text:
  3096.         lea    rastport,a1
  3097.         move.w #$0003,d0
  3098.         jsr    Textaus(a6)        rts
  3099.  
  3100. first_cylinder:
  3101.         move.l c3_adress,flash_adress
  3102.         move.b #$01,color_ptr
  3103.         bsr  wait_key
  3104.         cmpi.b #$4f,d0
  3105.         beq.s  fc_down
  3106.         cmpi.b #$4e,d0
  3107.         beq.s  fc_up
  3108.         cmpi.b #$43,d0
  3109.         beq  compare_fc
  3110.         cmpi.b #$44,d0
  3111.         bne.s  first_cylinder
  3112. compare_fc:
  3113.         move.b lc,d0
  3114.         cmp.b fc,d0        beq  compare_fc2
  3115.         blt.s  first_cylinder
  3116. compare_fc2:
  3117.         move.b #$00,color_ptr
  3118.         bra  menu_control
  3119. fc_down:subi.b #$01,fc
  3120.         cmpi.b #$ff,fc
  3121.         bne.s  fc_down2
  3122.         move.b #$00,fc
  3123. fc_down2:
  3124.         bra  show_fc
  3125. fc_up:  addi.b #$01,fc
  3126.         cmpi.b #$52,fc
  3127.         bne.s  fc_down2
  3128.         move.b #$51,fc
  3129. show_fc:lea    fc_text,a0
  3130.         move.b fc,d0
  3131.         bsr  byte_umrechnung
  3132.         move.l gfxbase,a6
  3133.         lea    rastport,a1
  3134.         move.w #295,d0
  3135.         move.w #64,d1
  3136.         jsr    Movee(a6)        lea    rastport,a1
  3137.         lea    fc_text,a0
  3138.         move.w #$0002,d0
  3139.         jsr    Textaus(a6)        bra  first_cylinder
  3140.  
  3141. last_cylinder:
  3142.         move.l c4_adress,flash_adress
  3143.         move.b #$01,color_ptr
  3144.         bsr  wait_key
  3145.         cmpi.b #$4f,d0
  3146.         beq.s  lc_down
  3147.         cmpi.b #$4e,d0
  3148.         beq.s  lc_up
  3149.         cmpi.b #$43,d0
  3150.         beq  compare_lc
  3151.         cmpi.b #$44,d0
  3152.         bne.s  last_cylinder
  3153. compare_lc:
  3154.         move.b fc,d0
  3155.         cmp.b lc,d0        beq  compare_lc2
  3156.         bge.s  last_cylinder
  3157. compare_lc2:
  3158.         move.b #$00,color_ptr
  3159.         bra  menu_control
  3160. lc_down:subi.b #$01,lc
  3161.         cmpi.b #$ff,lc
  3162.         bne.s  lc_down2
  3163.         move.b #$00,lc
  3164. lc_down2:
  3165.         bra  lcc
  3166. lc_up:  addi.b #$01,lc
  3167.         cmpi.b #$52,lc
  3168.         bne.s  lc_down2
  3169.         move.b #$51,lc
  3170. lcc:    bsr.s  show_lc
  3171.         bra  last_cylinder    
  3172. show_lc:lea    lc_text,a0
  3173.         move.b lc,d0
  3174.         bsr  byte_umrechnung
  3175.         move.l gfxbase,a6
  3176.         lea    rastport,a1
  3177.         move.w #295,d0
  3178.         move.w #74,d1
  3179.         jsr    Movee(a6)        lea    rastport,a1
  3180.         lea    lc_text,a0
  3181.         move.w #$0002,d0
  3182.         jsr    Textaus(a6)        rts
  3183.  
  3184. how_many_tries:
  3185.         move.l c5_adress,flash_adress
  3186.         move.b #$01,color_ptr
  3187. tries1: lea    tr_text,a0
  3188.         bsr  wait_key
  3189.         cmpi.b #$4e,d0
  3190.         beq.s  tries_up
  3191.         cmpi.b #$4f,d0
  3192.         beq.s  tries_down
  3193.         cmpi.b #$43,d0
  3194.         beq.s  end_tries
  3195.         cmpi.b #$44,d0
  3196.         bne.s  tries1
  3197. end_tries:
  3198.         move.b #$00,color_ptr
  3199.         bra  menu_control
  3200. tries_up:
  3201.         addi.b #$01,tr
  3202.         cmpi.b #$0a,tr
  3203.         bne.s  tries_up2
  3204.         move.b #$09,tr
  3205. tries_up2:
  3206.         move.b tr,d0
  3207.         addi.w #$30,d0
  3208.         move.b d0,(a0)
  3209.         bra.s  tries2
  3210. tries_down:
  3211.         subi.b #$01,tr
  3212.         cmpi.b #$00,tr
  3213.         bne.s  tries_down2
  3214.         move.b #$01,tr
  3215. tries_down2:
  3216.         move.b tr,d0
  3217.         addi.w #$30,d0
  3218.         move.b d0,(a0)
  3219. tries2: move.l gfxbase,a6
  3220.         lea    rastport,a1
  3221.         move.w #303,d0
  3222.         move.w #84,d1
  3223.         jsr    Movee(a6)        lea    rastport,a1
  3224.         lea    tr_text,a0
  3225.         move.w #$0001,d0
  3226.         jsr    Textaus(a6)        bra  tries1
  3227.  
  3228. synccorrection:
  3229.         move.l c12_adress,flash_adress
  3230.         move.b #$01,color_ptr
  3231.         cmpi.b #$01,sy
  3232.         bne.s  sync2
  3233.         clr.b  sy
  3234.         lea    off_text,a0
  3235.         bra.s  sync3
  3236. sync2:  move.b #$01,sy
  3237.         lea    on_text,a0
  3238. sync3:  lea    rastport,a1
  3239.         move.w #287,d0
  3240.         move.w #157,d1
  3241.         jsr    Movee(a6)        lea    rastport,a1
  3242.         move.w #3,d0
  3243.         jsr    Textaus(a6)
  3244.         move.b #$00,color_ptr
  3245.         bra  menu_control
  3246.  
  3247. write_serveral_times:
  3248.         move.l c6_adress,flash_adress
  3249.         move.b #$01,color_ptr
  3250.         move.b sd,d0
  3251.         cmp.b dd,d0        bne  wait_return
  3252.         cmpi.b #$00,ws
  3253.         bne.s  write_s2
  3254. write_s1:
  3255.         move.b #$01,ws
  3256.         lea    on_text,a0
  3257.         bra.s  end_write_serveral
  3258. write_s2:
  3259.         move.b #$00,ws
  3260.         lea    off_text,a0
  3261. end_write_serveral:
  3262.         move.l gfxbase,a6
  3263.         lea    rastport,a1
  3264.         move.w #287,d0
  3265.         move.w #94,d1
  3266.         jsr    Movee(a6)
  3267.         lea    rastport,a1
  3268.         move.w #$0003,d0
  3269.         jsr    Textaus(a6)
  3270. esw:    move.b #$00,color_ptr
  3271.         bra  menu_control
  3272.  
  3273. verify_destination:
  3274.         move.b dc1,d0
  3275.         or.b dc2,d0
  3276.         tst.b d0
  3277.         bne menu_control
  3278.         move.l c7_adress,flash_adress
  3279.         move.b #$01,color_ptr
  3280.         cmpi.b #$00,vd
  3281.         bne.s  verify_d2
  3282. verify_d1:
  3283.         move.b #$01,vd
  3284.         lea    on_text,a0
  3285.         bra.s  end_verify
  3286. verify_d2:
  3287.         move.b #$00,vd
  3288.         lea    off_text,a0
  3289. end_verify:
  3290.         bsr verify_d3
  3291.         bra  menu_control
  3292. verify_off:
  3293.         move.b #$00,vd
  3294.         lea    off_text,a0
  3295. verify_d3:
  3296.         move.l gfxbase,a6
  3297.         lea    rastport,a1
  3298.         move.w #287,d0
  3299.         move.w #104,d1
  3300.         jsr    Movee(a6)
  3301.         lea    rastport,a1
  3302.         move.w #$0003,d0
  3303.         jsr    Textaus(a6)
  3304.         move.b #$00,color_ptr
  3305.         rts
  3306.  
  3307. fast_copy:
  3308.         move.l c8_adress,flash_adress
  3309.         move.b #$01,color_ptr
  3310.         cmpi.b #$01,dd
  3311.         beq.s  fcop1
  3312.         cmpi.b #$02,dd
  3313.         beq.s  fcop1
  3314.         cmpi.b #$04,dd
  3315.         beq.s  fcop1
  3316.         cmpi.b #$08,dd
  3317.         beq.s  fcop1
  3318.         bra  wait_return
  3319. fcop1:  cmpi.b #$01,fa
  3320.         bne.s  fastcopy1
  3321.         move.b #$00,fa
  3322.         move.b #$01,dc1
  3323.         move.b #$00,dc2
  3324.         bra.s  end_fast
  3325. fastcopy1:
  3326.         move.b #$01,fa
  3327.         move.b #$00,dc1
  3328.         move.b #$00,dc2
  3329. end_fast:
  3330.         cmp.b #ON,DC1
  3331.         bne fcop2
  3332.         bsr verify_off
  3333. fcop2:  bsr  show_copies
  3334.         move.b #$00,color_ptr
  3335.         bra  menu_control
  3336.  
  3337. deepcopy_1:
  3338.         bsr verify_off
  3339.         move.l c9_adress,flash_adress
  3340.         move.b #$01,color_ptr
  3341.         cmpi.b #$01,dd
  3342.         beq.s  deep4
  3343.         cmpi.b #$02,dd
  3344.         beq.s  deep4
  3345.         cmpi.b #$04,dd
  3346.         beq.s  deep4
  3347.         cmpi.b #$08,dd
  3348.         beq.s  deep4
  3349.         bra.s  wait_return
  3350. deep4:  cmpi.b #$00,dc1
  3351.         beq.s  deep1
  3352.         move.b #$00,fa
  3353.         move.b #$00,dc1
  3354.         move.b #$01,dc2
  3355.         bra.s  end_deep1
  3356. deep1:  move.b #$00,fa
  3357.         move.b #$01,dc1
  3358.         move.b #$00,dc2
  3359. end_deep1:
  3360.         bra  end_fast
  3361.  
  3362. wait_return:
  3363.         move.l #text12,text_ptr
  3364.         move.w #16,x1
  3365.         move.w #28,y1
  3366.         bsr  set_text3
  3367. wait_r3:bsr  wait_key
  3368.         cmpi.b #$44,d0
  3369.         beq.s  wait_r2
  3370.         cmpi.b #$43,d0
  3371.         bne.s  wait_return
  3372. wait_r2:
  3373.         bsr AnfText
  3374.         bra  end_fast
  3375. wait_r4:bsr    wait_key
  3376.         cmpi.b #$45,d0
  3377.         beq.s  wait_r5
  3378.         cmpi.b #$44,d0
  3379.         beq \W1
  3380.         cmpi.b #$43,d0
  3381.         beq \W1
  3382.         cmpi.b #$40,d0
  3383.         bne.s  wait_r4
  3384. \W1:    move.l d0,-(a7)
  3385.         bsr    clear_eol
  3386.         move.l (a7)+,d0
  3387.         clr.l  d0
  3388.         rts
  3389. wait_r5:move.l #-1,d0
  3390.         move.w #Escape,ErrorFlag
  3391.         rts
  3392.  
  3393. deepcopy_2:
  3394.         bsr verify_off
  3395.         move.l c10_adress,flash_adress
  3396.         move.b #$01,color_ptr
  3397.         cmpi.b #$01,dd
  3398.         beq.s  deep3
  3399.         cmpi.b #$02,dd
  3400.         beq.s  deep3
  3401.         cmpi.b #$04,dd
  3402.         beq.s  deep3
  3403.         cmpi.b #$08,dd
  3404.         beq.s  deep3
  3405.         bra  wait_returndeep3:  cmpi.b #$01,dc2
  3406.         beq.s  deep2
  3407.         move.b #$00,fa
  3408.         move.b #$00,dc1
  3409.         move.b #$01,dc2
  3410.         bra.s  end_deep2
  3411. deep2:  move.b #$01,fa
  3412.         move.b #$00,dc1
  3413.         move.b #$00,dc2
  3414. end_deep2:
  3415.         bra  end_fast
  3416. show_copies:
  3417.         move.l gfxbase,a6
  3418.         lea    rastport,a1
  3419.         move.w #287,d0
  3420.         move.w #114,d1
  3421.         jsr    Movee(a6)
  3422.         lea    rastport,a1
  3423.         cmpi.b #$00,fa
  3424.         beq.s  show1
  3425.         lea    on_text,a0
  3426.         bra.s  show2
  3427. show1:  lea    off_text,a0
  3428. show2:  move.w #$0003,d0
  3429.         jsr    Textaus(a6)
  3430.         lea    rastport,a1
  3431.         move.w #287,d0
  3432.         move.w #124,d1
  3433.         jsr    Movee(a6)
  3434.         lea    rastport,a1
  3435.         cmpi.b #$00,dc1
  3436.         beq.s  show3
  3437.         lea    on_text,a0
  3438.         bra.s  show4
  3439. show3:  lea    off_text,a0
  3440. show4:  move.w #$0003,d0
  3441.         jsr    Textaus(a6)
  3442.         lea    rastport,a1
  3443.         move.w #287,d0
  3444.         move.w #134,d1
  3445.         jsr    Movee(a6)
  3446.         lea    rastport,a1
  3447.         cmpi.b #$00,dc2
  3448.         beq.s  show5
  3449.         lea    on_text,a0
  3450.         bra.s  show6
  3451. show5:  lea    off_text,a0
  3452. show6:  move.w #$0003,d0
  3453.         jsr    Textaus(a6)
  3454.         rts
  3455.  
  3456. source_drive:
  3457.         move.l c11_adress,flash_adress
  3458.         move.b #$01,color_ptr
  3459. source1:
  3460.         bsr  wait_key
  3461.         cmpi.b #$0a,d0
  3462.         beq.s  s_drive0
  3463.         cmpi.b #$01,d0
  3464.         beq.s  s_drive1
  3465.         cmpi.b #$02,d0
  3466.         beq  s_drive2
  3467.         cmpi.b #$03,d0
  3468.         beq  s_drive3
  3469.         cmpi.b #$43,d0
  3470.         beq.s  source2
  3471.         cmpi.b #$44,d0
  3472.         bne.s  source1
  3473. source2:move.b zeiger1,d7
  3474.         clr.b  zeiger1
  3475.         bsr  end_drive
  3476.         move.b d7,zeiger1
  3477.         move.b #$00,color_ptr
  3478.         bra  menu_control
  3479. s_drive0:
  3480.         btst   #$00,drives
  3481.         beq   source1
  3482. s_dd0:  move.b #$01,sd
  3483.         move.b #$00,d0
  3484.         bra  set_s_drive
  3485. s_drive1:
  3486.         btst   #$01,drives
  3487.         beq  source1
  3488. s_dd1:  move.b #$02,sd
  3489.         move.b #$01,d0
  3490.         bra  set_s_drive
  3491. s_drive2:
  3492.         btst   #$02,drives
  3493.         beq  source1
  3494. s_dd2:  move.b #$04,sd
  3495.         move.b #$02,d0
  3496.         bra.s  set_s_drive
  3497. s_drive3:
  3498.         btst   #$03,drives
  3499.         beq source1
  3500.         move.b #$08,sd
  3501. s_dd3:  move.b #$03,d0
  3502. set_s_drive:
  3503.         lea    sd_text,a0
  3504.         addi.b #$30,d0
  3505.         move.b d0,(a0)
  3506.         move.l gfxbase,a6
  3507.         lea    rastport,a1
  3508.         move.w #303,d0
  3509.         move.w #144,d1
  3510.         jsr    movee(a6)
  3511.         lea    rastport,a1
  3512.         move.w #$0001,d0
  3513.         jsr    Textaus(a6)
  3514.         bra  source1
  3515.  
  3516. byte_umrechnung:
  3517.         cmpi.w #$0a,d0
  3518.         bmi.s  byte2
  3519.         divu   #$0a,d0
  3520.         move.w d0,d1
  3521.         addi.w #$30,d1
  3522.         swap   d0
  3523.         bra.s  byte3
  3524. byte2:  move.w #$0030,d1
  3525. byte3:  move.b d1,(a0)+
  3526.         addi.w #$0030,d0
  3527.         move.b d0,(a0)+
  3528.         rts
  3529.  
  3530. adresses:
  3531.         move.l cop_adress,d0
  3532.         move.l #color1,d1
  3533.         move.l #ncopper,d2
  3534.         sub.l d2,d1        add.l d1,d0        move.l d0,c1_adress
  3535.         addi.l #$000010,d0
  3536.         move.l d0,c2_adress
  3537.         addi.l #$000008,d0
  3538.         move.l d0,c3_adress
  3539.         addi.l #$000008,d0
  3540.         move.l d0,c4_adress
  3541.         addi.l #$000008,d0
  3542.         move.l d0,c5_adress
  3543.         addi.l #$000008,d0
  3544.         move.l d0,c6_adress
  3545.         addi.l #$000008,d0
  3546.         move.l d0,c7_adress
  3547.         addi.l #$000008,d0
  3548.         move.l d0,c8_adress
  3549.         addi.l #$000008,d0
  3550.         move.l d0,c9_adress
  3551.         addi.l #$000008,d0
  3552.         move.l d0,c10_adress
  3553.         addi.l #$000008,d0
  3554.         move.l d0,c11_adress
  3555.         addi.l #$000008,d0
  3556.         move.l d0,c12_adress
  3557.         addi.l #$000010,d0
  3558.         move.l d0,c13_adress
  3559.         rts
  3560.  
  3561. set_title:
  3562.         clr.l  d6
  3563.         move.w #$0009,d6
  3564. set_text1:
  3565.         move.l gfxbase,a6
  3566.         bsr  set_text2
  3567.         addi.l #$000026,text_ptr
  3568.         addi.w #$000a,y1
  3569.         dbf    d6,set_text1
  3570.         lea    floppy,a0
  3571.         move.l bit_adress,a1
  3572.         add.l #$001c26,a1        move.l a1,a2
  3573.         bsr.s  box
  3574.         lea    floppy,a0
  3575.         move.l a1,a2
  3576.         add.l  #$000008,a2
  3577.         bsr.s  box
  3578.         lea    floppy,a0
  3579.         move.l a1,a2
  3580.         add.l  #$000010,a2
  3581.         bsr.s  box
  3582.         lea    floppy,a0
  3583.         move.l a1,a2
  3584.         add.l  #$000018,a2
  3585.         bsr.s  box
  3586.         bra.s  set_weiter
  3587. box:
  3588.         move.w #floppy_s,d0
  3589. bit_copy_loop:
  3590.         move.b (a0)+,(a2)+
  3591.         move.b (a0)+,(a2)+
  3592.         move.b (a0)+,(a2)+
  3593.         move.b (a0)+,(a2)+
  3594.         move.b (a0)+,(a2)+
  3595.         move.b (a0)+,(a2)+
  3596.         add.l #$22,a2        dbf    d0,bit_copy_loop
  3597.         rts
  3598. set_weiter:
  3599.         move.w #44,y2
  3600.         bsr  draw_line
  3601.         move.w #148,y2
  3602.         bsr  draw_line
  3603.         move.w #218,y2
  3604.         bsr  draw_line
  3605.         move.w #250,y2
  3606.         bsr  draw_line
  3607.         move.w #160,y2
  3608.         bsr  draw_line
  3609.         move.w #157,y1
  3610.         move.l #text11,text_ptr
  3611.         bsr  set_text2
  3612.         move.w #170,y1
  3613.         move.w #$0001,d2
  3614.         move.l #text2,text_ptr
  3615. set_loop2:
  3616.         bsr  set_text2
  3617.         addi.l #$000026,text_ptr
  3618.         addi.w #$000a,y1
  3619.         dbf    d2,set_loop2
  3620.         move.w #$0001,d2
  3621.         move.l #text3,text_ptr
  3622.         move.w #230,y1
  3623. set_loop3:
  3624.         bsr  set_text2
  3625.         addi.w #$000f,y1
  3626.         addi.l #$000026,text_ptr
  3627.         dbf    d2,set_loop3
  3628.         lea    rastport,a1
  3629.         move.b #1,d0
  3630.         jsr    SetAPen(a6)
  3631.         lea    rastport,a1
  3632.         move.w #10,d0
  3633.         move.w #10,d1
  3634.         move.w #309,d2
  3635.         move.w #40,d3
  3636.         jsr    RectFill(a6)
  3637.         lea    rastport,a1
  3638.         move.b #0,d0
  3639.         jsr    SetAPen(a6)
  3640.         lea    rastport,a1
  3641.         move.w #11,d0
  3642.         move.w #11,d1
  3643.         move.w #308,d2
  3644.         move.w #39,d3
  3645.         jsr    RectFill(a6)
  3646.         lea    rastport,a1
  3647.         move.b #1,d0
  3648.         jsr    SetAPen(a6)
  3649. AnfText: move.l #text4,text_ptr
  3650.         move.w #16,x1
  3651.         move.w #18,y1
  3652.         bsr  set_text3
  3653.         move.l #text20,text_ptr        move.w #28,y1
  3654.         bsr  set_text3
  3655.         move.l #text21,text_ptr        move.w #38,y1
  3656.         bsr set_text3
  3657.         rts
  3658.  
  3659. draw_line:
  3660.         lea    rastport,a1
  3661.         move.w #$0000,d0
  3662.         move.w y2,d1
  3663.         jsr    Movee(a6)
  3664.         lea    rastport,a1
  3665.         move.w #$013f,d0
  3666.         move.w y2,d1
  3667.         jsr    Draw(a6)
  3668.         rts
  3669.  
  3670. set_text2:
  3671.         move.l a6,-(a7)
  3672.         move.l gfxbase,a6
  3673.         lea    rastport,a1
  3674.         move.w x1,d0
  3675.         move.w y1,d1
  3676.         jsr    Movee(a6)
  3677.         lea    rastport,a1
  3678.         move.l text_ptr,a0
  3679.         move.w #$0026,d0
  3680.         jsr    Textaus(a6)
  3681.         move.l (a7)+,a6
  3682.         rts
  3683.  
  3684. set_text3:
  3685.         move.l a6,-(a7)
  3686.         move.l gfxbase,a6
  3687.         lea    rastport,a1
  3688.         move.w x1,d0
  3689.         move.w y1,d1
  3690.         jsr    Movee(a6)
  3691.         lea    rastport,a1
  3692.         move.l text_ptr,a0
  3693.         move.w #$0024,d0
  3694.         jsr    Textaus(a6)
  3695.         move.l (a7)+,a6
  3696.         rts
  3697.  
  3698. show_start:
  3699.         lea    text6,a0
  3700.         btst   #0,dd
  3701.         bne  show_s1
  3702.         btst   #0,sd
  3703.         beq.s  show_start1
  3704. show_s1:lea    df0,a1
  3705.         bsr  copy_drives
  3706. show_start1:
  3707.         btst   #1,dd
  3708.         bne.s  show_s2
  3709.         btst   #1,sd
  3710.         beq.s  show_start2
  3711. show_s2:lea    df1,a1
  3712.         bsr  copy_drives
  3713. show_start2:
  3714.         btst   #2,dd
  3715.         bne.s  show_s3
  3716.         btst   #2,sd
  3717.         beq.s  show_start3
  3718. show_s3:lea    df2,a1
  3719.         bsr.s  copy_drives
  3720. show_start3:
  3721.         btst   #3,dd
  3722.         bne.s  show_s4
  3723.         btst   #3,sd
  3724.         beq.s  show_start4
  3725. show_s4:lea    df3,a1
  3726.         bsr.s  copy_drives
  3727. show_start4:
  3728.         move.w #16,x1
  3729.         move.w #18,y1
  3730.         move.w #$002,d2
  3731.         move.l #text5,text_ptr
  3732. show_loop:
  3733.         bsr  set_text3
  3734.         addi.w #$000a,y1
  3735.         addi.l #$000024,text_ptr
  3736.         dbf    d2,show_loop
  3737.         move.w #16,d0
  3738.         lea    text6,a0
  3739. lop:    move.b #$20,(a0)+
  3740.         dbf    d0,lop
  3741.         rts
  3742.  
  3743. copy_drives:
  3744.         move.w #$0003,d0
  3745. copy_d_loop:
  3746.         move.b (a1)+,(a0)+
  3747.         dbf    d0,copy_d_loop
  3748.         rts
  3749.  
  3750. read_error:
  3751.         clr.l  d0
  3752.         move.b cylinder,d0
  3753.         lea    text7,a0
  3754.         add.l #$00001a,a0        bsr  byte_umrechnung
  3755.         move.b side,d0
  3756.         add.l #$000006,a0        bsr  byte_umrechnung
  3757.         move.w #7,x1
  3758.         move.w #230,y1
  3759.         move.l #text7,text_ptr
  3760.         bra  set_text2
  3761.  
  3762. write_error:
  3763.         clr.l  d0
  3764.         move.b cylinder,d0
  3765.         lea    text8,a0
  3766.         add.l #$00001b,a0        bsr  byte_umrechnung
  3767.         move.b side,d0
  3768.         add.l #$000006,a0        bsr  byte_umrechnung
  3769.         move.w #7,x1
  3770.         move.w #230,y1
  3771.         move.l #text8,text_ptr
  3772.         bra  set_text2
  3773.  
  3774. clear_error:
  3775.         move.l #text3,text_ptr
  3776.         move.w #7,x1
  3777.         move.w #230,y1
  3778.         bra  set_text2
  3779.  
  3780. reading_cyl:
  3781.         clr.l d0
  3782.         move.b cylinder,d0
  3783.         lea    rcyl_text,a0
  3784.         bsr  byte_umrechnung
  3785.         lea    rcyl_text,a0
  3786.         move.l gfxbase,a6
  3787.         lea    rastport,a1
  3788.         move.w #127,d0
  3789.         move.w #245,d1
  3790.         jsr    Movee(a6)
  3791.         lea    rastport,a1
  3792.         move.w #$0002,d0
  3793.         jsr    Textaus(a6)
  3794.         rts
  3795.  
  3796. writing_cyl:
  3797.         clr.l  d0
  3798.         move.b cylinder,d0
  3799.         lea    wcyl_text,a0
  3800.         bsr  byte_umrechnung
  3801.         lea    wcyl_text,a0
  3802.         move.l gfxbase,a6
  3803.         lea    rastport,a1
  3804.         move.w #271,d0
  3805.         move.w #245,d1
  3806.         jsr    Movee(a6)
  3807.         lea    rastport,a1
  3808.         move.w #$0002,d0
  3809.         jsr    Textaus(a6)
  3810.         rts
  3811.  
  3812. insert_source:
  3813.         move.l #text9,text_ptr
  3814.         bra.s  melvin
  3815. insert_destination:
  3816.         move.l #text10,text_ptr
  3817.         bra.s  melvin
  3818. protect_source:
  3819.         bsr  cl
  3820.         move.l #text13,text_ptr
  3821.         bra.s  melvin
  3822. protect_destination:
  3823.         bsr  cl
  3824.         move.l #text14,text_ptr
  3825. melvin:
  3826.         move.w #16,x1
  3827.         move.w #28,y1
  3828.         bsr  set_text3
  3829.         move.l #text5,text_ptr
  3830.         move.w #18,y1
  3831.         bsr    set_text3
  3832.         bra  wait_r4
  3833. clear_eol:
  3834.         move.l #text15,text_ptr
  3835.         move.w #16,x1
  3836.         move.w #28,y1
  3837.         bsr set_text3        move.w #18,y1
  3838.         bra    set_text3
  3839.  
  3840. write_b_again:
  3841.         bsr  cl
  3842.         move.l #text17,text_ptr
  3843.         move.w #16,x1
  3844.         move.w #28,y1
  3845.         bsr    set_text3
  3846. wba1:   bsr    wait_key
  3847.         cmpi.b #$45,d0
  3848.         beq.s  wba4
  3849.         cmpi.b #$31,d0
  3850.         beq.s  wba2
  3851.         cmpi.b #$36,d0
  3852.         bne.s  wba1
  3853.         move.l #-1,d0
  3854.         bra.s  wba3
  3855. wba2:   clr.l  d0
  3856. wba3:   move.l d0,-(a7)
  3857.         bsr    clear_eol
  3858.         move.l (a7)+,d0
  3859.         rts
  3860. wba4:   move.w #escape,errorflag
  3861.         rts
  3862.  
  3863. compare_drives:
  3864.         move.w #18,y1
  3865.         bsr    cl2
  3866.         lea    text19,a0
  3867.         clr.w  d2
  3868. cdl1:   lea    df0,a1
  3869.         btst   d2,vererrflag
  3870.         beq.s  cdl4
  3871.         move.w d2,d0
  3872.         lsl    #2,d0
  3873.         add.l  d0,a1
  3874.         bsr.s  cdl2
  3875. cdl4:   addq.w #1,d2
  3876.         cmpi.w #4,d2
  3877.         bne.s  cdl1
  3878.         move.l #text18,text_ptr
  3879.         move.w #28,y1
  3880.         bra    set_text3
  3881. cdl2:   move.w #3,d1
  3882. cdl3:   move.b (a1)+,(a0)+
  3883.         dbf    d1,cdl3
  3884.         rts
  3885.  
  3886. wait_key:
  3887.         movem.l d1-d7,-(a7)
  3888.         move.w Tastenabl,d1
  3889. l8:     move.b IntCon,d0
  3890.         btst #7,d1
  3891.         bne l1
  3892.         sub.l #1,TastenCnt
  3893.         beq Tastrepeat
  3894. l1:     btst #3,d0
  3895.         beq l8
  3896.         move.b Taste,d0
  3897.         ori.b #$40,Cont
  3898.         not.b d0
  3899.         ror.b #1,d0
  3900.         move.w #$600,d1
  3901. l5:     dbf d1,l5
  3902.         andi.b #$bf,Cont
  3903.         move.l #MaxWart,CntWart
  3904.         move.l #MaxWart,TastenCnt
  3905.         move.w d0,Tastenabl
  3906. tastenend:
  3907.         movem.l (a7)+,d1-d7
  3908.         rts
  3909. tastrepeat:
  3910.         move.l CntWart,d1
  3911.         cmp.l  #MinWart,d1
  3912.         bcs.s  repeat1
  3913.         sub.l  #$800,d1
  3914.         move.l d1,CntWart
  3915. repeat1:move.l d1,TastenCnt
  3916.         move.w Tastenabl,d0
  3917.         bra.s  tastenend
  3918.  
  3919. get_key:
  3920.         move.w $dff01e,d1
  3921.         btst #3,d1
  3922.         beq \l1
  3923.         move.b Taste,d0
  3924.         ori.b #$40,Cont
  3925.         not.b d0
  3926.         ror.b #1,d0
  3927.         move.w #$600,d1
  3928. \l2:    dbf d1,\l2
  3929.         andi.b #$bf,Cont
  3930. \l1:    rts
  3931.  
  3932. cl:     move.w #28,y1
  3933. cl2:    move.w #16,x1
  3934.         move.l #text15,text_ptr
  3935.         bsr  set_text3
  3936.         addi.w #10,y1
  3937.         bsr  set_text3
  3938.         rts
  3939.  
  3940. cl1:    bsr.s  cl
  3941.         move.w #18,y1
  3942.         bsr  set_text3
  3943.         move.w #28,y1
  3944.         move.l #text16,text_ptr
  3945.         bsr  set_text3
  3946.         rts
  3947.  
  3948.  
  3949. gfxname:        dc.b "graphics.library",0
  3950.          align.w
  3951. gfxbase:        dc.l 0
  3952. oldcopper:      dc.l 0
  3953. bit_adress:     dc.l 0
  3954. cop_adress:     dc.l 0
  3955. c1_adress:      dc.l 0
  3956. c2_adress:      dc.l 0
  3957. c3_adress:      dc.l 0
  3958. c4_adress:      dc.l 0
  3959. c5_adress:      dc.l 0
  3960. c6_adress:      dc.l 0
  3961. c7_adress:      dc.l 0
  3962. c8_adress:      dc.l 0
  3963. c9_adress:      dc.l 0
  3964. c10_adress:     dc.l 0
  3965. c11_adress:     dc.l 0
  3966. c12_adress:     dc.l 0
  3967. c13_adress:     dc.l 0
  3968.  
  3969. rastport:       blk.l  1,0
  3970. r_bitmap:       blk.l 24,0
  3971.  
  3972. bitmap:         blk.l  2,0
  3973. plane1:         blk.l  8,0
  3974.  
  3975. ncopper:
  3976.                 dc.w $008e,$2681,$0090,$24c1
  3977.                 dc.w $0092,$0038,$0094,$00d0
  3978.                 dc.w $00e0
  3979. plane_hi:       dc.w $0000,$00e2
  3980. plane_lo:       dc.w $0000
  3981.                 dc.w $0100,$1200,$0102,$0000,$0104,$0000
  3982.                 dc.w $0108,$0000,$010a,$0000
  3983.                 dc.w $0120,$0000,$0122,$0000
  3984.                 dc.w $0180,$0000,$0182
  3985. color1:         dc.w $00ee,$0d01,$fffe,$0182
  3986.                 dc.w $00ee,$5401,$fffe,$0182
  3987. color2:         dc.w $00ee,$6001,$fffe,$0182
  3988. color3:         dc.w $00ee,$6a01,$fffe,$0182
  3989. color4:         dc.w $00ee,$7201,$fffe,$0182
  3990. color5:         dc.w $00ee,$7d01,$fffe,$0182
  3991. color6:         dc.w $00ee,$8601,$fffe,$0182
  3992. color7:         dc.w $00ee,$9001,$fffe,$0182
  3993. color8:         dc.w $00ee,$9a01,$fffe,$0182
  3994. color9:         dc.w $00ee,$a401,$fffe,$0182
  3995. color10:        dc.w $00ee,$af01,$fffe,$0182
  3996. color11:        dc.w $00ee,$b701,$fffe,$0182
  3997. color12:        dc.w $00ee,$c501,$fffe,$0182
  3998.                 dc.w $00ee,$c701,$fffe,$0182
  3999. color13:        dc.w $00ee,$ff01,$fffe,$0182
  4000.                 dc.w $00ee,$ffff,$fffe
  4001.                 dc.w $0000,$0000
  4002. copend:
  4003. copsize = copend - ncopper
  4004.  
  4005. drives:         dc.b 0
  4006. d_drives:       dc.b 0
  4007. s_drives:       dc.b 0
  4008. color_ptr:      dc.b 0
  4009. back:           dc.b 0
  4010. zeiger1:        dc.b 0
  4011. cylinder:       dc.b 0
  4012. side:           dc.b 0
  4013. new:            dc.b 0
  4014. drv:            dc.b 0
  4015.        align.w
  4016. flash_adress:   dc.l 0
  4017. text_ptr:       dc.l 0
  4018.  
  4019. x1:             dc.w 7
  4020. y1:             dc.w 54
  4021. y2:             dc.w 0
  4022.  
  4023. tastenabl:      dc.w $ffff
  4024. cntwart:        dc.l MaxWart
  4025. tastencnt:      dc.l MaxWart
  4026.  
  4027. fc_text:        dc.b "00"
  4028. ralf:           dc.b 0
  4029. lc_text:        dc.b "79"
  4030. tr_text:        dc.b "0"
  4031. sd_text:        dc.b "0"
  4032. rcyl_text:      dc.b "00"
  4033. wcyl_text:      dc.b "00"
  4034. on_text:        dc.b ".ON"
  4035. on_text2:       dc.b " ON"
  4036. off_text:       dc.b "OFF"
  4037. df0:            dc.b "DF0 "
  4038. df1:            dc.b "DF1 "
  4039. df2:            dc.b "DF2 "
  4040. df3:            dc.b "DF3 "
  4041.  
  4042. text1:  dc.b "F1  = START COPY......................"
  4043.         dc.b "F2  = FIRST CYLINDER (CRSR).........00"
  4044.         dc.b "F3  = LAST  CYLINDER (CRSR).........79"
  4045.         dc.b "F4  = HOW MANY TRIES (CRSR)..........3"
  4046.         dc.b "F5  = WRITE SEVERAL TIMES..........OFF"
  4047.         dc.b "F6  = VERIFY DESTINATION............ON"
  4048.         dc.b "F7  = FASTCOPY......................ON"
  4049.         dc.b "F8  = DEEPCOPY 1...................OFF"
  4050.         dc.b "F9  = DEEPCOPY 2...................OFF"
  4051.         dc.b "F10 = SOURCE DRIVE (0/1/2/3).......DF0"
  4052. text2:  dc.b "DEL = DESTINATION DRIVE (0/1/2/3)....."
  4053.         dc.b "      DF0:    DF1:    DF2:    DF3:    "
  4054. text3:  dc.b "         STATUS: 00, OK,00,00         "
  4055.         dc.b "  READING CYL. 00 / WRITING CYL. 00   "
  4056. text4:  dc.b "       A M I G A - COPY  V1.2       "
  4057. text5:  dc.b "        (ESC) TERMINATES COPY       "
  4058.         dc.b "INSERT DISK(S) IN  "
  4059. text6:  dc.b "                 "
  4060.         dc.b "PRESS RETURN OR ENTER WHEN READY !¡!"
  4061. text7:  dc.b "STATUS: READ-ERROR ON CYL.00 SIDE 00  "
  4062. text8:  dc.b "STATUS: WRITE-ERROR ON CYL.00 SIDE 00 "
  4063. text9:  dc.b "    PLEASE INSERT SOURCE DISK !!    "
  4064. text10: dc.b "  PLEASE INSERT DESTINATION DISK !  "
  4065. text11: dc.b " S  = SYNCCORRECTION................ON"
  4066. text12: dc.b "       ONLY ONE DESTINATION !!      "
  4067. text13: dc.b " SOURCE DISK INSN'T WRITEPROTECTED. "
  4068. text14: dc.b "DESTINATION DISK IS WRITEPROTECTED. "
  4069. text15: dc.b "                                    "
  4070. text16: dc.b "          COPY COMPLETE !!          "
  4071. text17: dc.b "    WRITE BUFFER AGAIN ??? (Y/N)    "
  4072. text18: dc.b " ERROR ON DRIVE(S) "
  4073. text19: dc.b "                 "
  4074. text20: dc.b "            WRITTEN BY :            "
  4075. text21: dc.b "   R. GELFAND AND S. THUBEAUVILLE   "
  4076.        align.w
  4077. floppy:
  4078.  dc.l $00000000,$00000000,$00000000,$00000000,$000007ff,$ffffffe0  dc.l $04000000,$002005ff,$ffffffa0,$05ffffff,$ffa00400,$00000020
  4079.  dc.l $04ffffff,$ff200880,$00000110,$08800000,$01100880,$1ff80110
  4080.  dc.l $08801008,$011008bf,$f00ffd10,$07a00000,$05e008bf,$f00ffd10
  4081.  dc.l $08800ff0,$01100a90,$00000110,$08800000,$01100480,$00000120
  4082.  dc.l $04ffffff,$ff200400,$00000020,$07ffffff,$ffe00000,$00000000
  4083. floppyend:
  4084.  
  4085.  
  4086. ;Fast Copy
  4087.  
  4088. DecodeAnz:     dc.w 0      ;Zähler für zu dekodierende Langworte
  4089. DecodeAdr:     dc.l 0      ;Adresse bei der dekodiert wird
  4090. BlockAdr:      dc.w 0      ;Offset im Block für dekodieren
  4091. FTestAdr:      dc.l 0      ;Testadresse, ob Block schon geladen
  4092. SektNum:       dc.w 0      ;Zähler für Sektornummer
  4093. BytesVLücke:   dc.w 0      ;Bytes vor der Lücke
  4094. BytesNLücke:   dc.w 0      ;Bytes nach der Lücke
  4095. FirstBlock:    dc.w 0      ;Blocknummer des ersten Blocks
  4096. FirstBlockSp:  dc.w 0      ;Dauerspeicher für ersten Block
  4097. SektBL:        dc.w 0      ;Sektorzähler für Sektoren vor der Lücke
  4098. VerifyFlag:    dc.w 0      ;gibt an, ob Lesen oder Verify
  4099. VerErrFlag:    dc.w 0      ;Flag für Errors bei Verify Bit = 1 => Error
  4100. TNumPufferA:   dc.w 0      ;Tracknummerspeicher bei 1D-Copy (Start-Track)
  4101. TNumPufferE    dc.w 0      ;Puffer für Endnummer der geladenen Track
  4102. BlockMeldung:  ds.w 11
  4103.  
  4104. ;Cruncher
  4105.  
  4106. Länge:         dc.w $1600
  4107. KurzByte:      dc.b 0
  4108.                align.w
  4109. TrackZeiger:   ds.l 164    ;Speicher, für Zeiger auf gepackte Tracks
  4110. SpeicherAnf:   dc.l 0      ;Speicheranfang für Chrunchen
  4111. SpeicherLänge: dc.l 0      ;Speichelänge für Crunchen
  4112. SpeicherChip:  dc.l 0
  4113. LängeChip:     dc.l 0
  4114. FreiFlagCh:    dc.w 0
  4115. SpeicherFast:  dc.l 0
  4116. LängeFast:     dc.l 0
  4117. FreiFlagFa:    dc.w 0
  4118. Abzug:         dc.w 0      ;Siehe CrunEnd2
  4119.  
  4120. ;Verwaltung
  4121.  
  4122. TrackPuffer1:  dc.l 0
  4123. TrackPuffer2:  dc.l 0
  4124. TrackNumS:     dc.w 0
  4125. TrackNumD:     dc.w 0
  4126. TrackNum:      dc.w 0
  4127. StartTrack:    dc.w 0           ;erster zu lesender Track
  4128. EndTrack       dc.w 0           ;letzter zu lesender Track
  4129. MotorBits:     dc.b $F3
  4130. MotorBitsS:    dc.b $F3
  4131. MotorBitsD:    dc.b $F3
  4132. Flag:          dc.b $00                  ;gigt an ob Source or Dest
  4133.                align.w
  4134.  
  4135. ;Deep Copy
  4136.  
  4137. Position:      dc.l 0           ;Für Suchroutine
  4138. Verschieb:     dc.w 0           ;Anzahl der Bits bei verschiebung
  4139. Größe1:        dc.w 0           ;größe der größten Blocks
  4140. Größe2:        dc.w 0           ;größe der zweitgrößten Blocks
  4141. GrößePos:      dc.l 0           ;Position des größten Blocks
  4142. Suchlang:      dc.w 0           ;Wieviele Fehlerhaft Worte dürfen sein
  4143. AnzWorte:      dc.w 0           ;auf wieviele Worte wird verglichen
  4144. ErrorFlag:     dc.w 0
  4145. EndPos:        dc.l 0           ;Endposition des Tracks
  4146. AnfPos:        dc.l 0           ;Anfang der Tracks (nach Lücke)
  4147. SLänge:        dc.w 0           ;Anzahl der zu schreibenden Bytes
  4148. SchreibAnf:    dc.l 0           ;Adresse, ab der geschrieben wird
  4149. Offset:        dc.w 0           ;Anzahl der Bytes vor Sync beim schreiben
  4150. TrackBytes:    dc.w 0           ;Bytes auf dem Track
  4151. CheckLänge:    dc.w 0           ;Bytes auf Track (Kontrolle)
  4152. LängeDest:     dc.w 0           ;Tracklänge der Dest.-Disk
  4153. Syncweit:      dc.w 0           ;Endfernung von Indx zu Sync
  4154. SyncAnz:       dc.w 0           ;Anzahl der gefundenen Syncs
  4155. CopyVersuch1:  dc.w 0           ;Illegale Daten wie oft lesen
  4156. CopyVersuch2:  dc.w 0           ;wie oft lesen bei NoSync
  4157.  
  4158. Blöcke:        ds.l SortBlockAnz    ;Speicher für Blocklängen+SyncAnz
  4159. SortBlöcke:    ds.l SortBlockAnz    ;Speicher für Blocksortierung
  4160. AnzSortBlock:  dc.w 0      ;Anzahl der verschieden sortierten Blöcke
  4161.  
  4162. SyncWort:      dc.w $4489       ;Wert für Lesen
  4163.  
  4164. ;Tabelle für Syncsuche
  4165. ;Sync = $4489
  4166.  
  4167. SyncBase:      dc.l %01000100100010010000000000000000
  4168.                dc.l %00100010010001001000000000000000
  4169.                dc.l %00010001001000100100000000000000
  4170.                dc.l %00001000100100010010000000000000
  4171.                dc.l %00000100010010001001000000000000
  4172.                dc.l %00000010001001000100100000000000
  4173.                dc.l %00000001000100100010010000000000
  4174.                dc.l %00000000100010010001001000000000
  4175.                dc.l %00000000010001001000100100000000
  4176.                dc.l %00000000001000100100010010000000
  4177.                dc.l %00000000000100010010001001000000
  4178.                dc.l %00000000000010001001000100100000
  4179.                dc.l %00000000000001000100100010010000
  4180.                dc.l %00000000000000100010010001001000
  4181.                dc.l %00000000000000010001001000100100
  4182.                dc.l %00000000000000001000100100010010
  4183.                dc.l %00000000000000000100010010001001
  4184.  
  4185. AmigaTrack:    dc.b 0  ;gibt an, ob Amiga-Format bei DeepCopy
  4186.  
  4187. fc:  dc.b 00    ;First Cylinden
  4188. lc:  dc.b 79    ;Last    "
  4189. tr:  dc.b 3     ;Ties
  4190. ws:  dc.b 0     ;write mehrfach
  4191. vd:  dc.b 1     ;Verify
  4192. fa:  dc.b 1     ;Fast Copy
  4193. dc1: dc.b 0     ;D1 Copy
  4194. dc2: dc.b 0     ;D2 Copy
  4195. sd:  dc.b 1     ;SourceBits
  4196. dd:  dc.b 2     ;DestDits
  4197. sy:  dc.b 0     ;Sync-Korrektur
  4198.  
  4199. waiting: dc.b 0 ;irq wait_conter
  4200.  
  4201. DevName:       dc.b "trackdisk.device",0
  4202.  
  4203.                END
  4204.  
  4205.  
  4206.