Floppy/BASIC Diskcopy

Aus C64-Wiki
Zur Navigation springenZur Suche springen

Das folgende in BASIC geschriebene Kopierprogramm kopiert eine ganze Diskette von Floppy 8 auf Floppy 9. Dabei wird sektorweise kopiert, d.h. die Zieldiskette ist mit der Quelldiskette auf Ebene des CBM-Dateisystems identisch. Da kein Schnelllader benutzt wird, ist das Programm allerdings sehr langsam. Durch z.B. JiffyDOS lässt sich der reine Datentransfer beschleunigen.

Disketten mit Kopierschutz, mit 40 Spuren oder ähnlichem lassen sich nicht mit diesem Programm kopieren.

Die in den Headern der Sektoren eingebettete Disketten-ID (die z.B. beim Formatieren angegeben wird) wird nicht überschrieben, ihre Kopie in der BAM aber schon. Unterstützt das Ziellaufwerk also IDs in Sektoren-Headern (z.B. echte Laufwerke oder Emulation per G64-Format; D64 ist nicht betroffen), empfiehlt es sich, die Zieldiskette vorher mit der ID der Quelldiskette zu formatieren.

Pure BASIC-Version[Bearbeiten | Quelltext bearbeiten]

Diese Version benutzt nur BASIC-Befehle und braucht zum Kopieren von 1541 zu 1541 etwa eine Stunde.

100 data 17,21,24,19,30,18,35,17,0,0
110 tr=1:se=0:sd=8:dd=9
120 print"copying from drive ";sd;" to drive ";dd
130 read mt,ms
140 if mt=0 then print"finished":end
150 for tr=tr to mt
160 for se=0 to ms-1
170 print"track ";tr;", sector ";se
180 open1,sd,5,"#":open2,dd,5,"#":rem Puffer öffnen
190 open3,sd,15:open4,dd,15:rem Kommandokanäle öffnen
200 print#3,"u1:5 0 "+str$(tr)+str$(se):rem Sektor lesen
210 print#4,"b-p:5 0":rem Lesepointer zurücksetzen
220 print#3,"b-p:5 0"
230 for i=0 to 255:get#1,a$
240 if a$=""then a$=chr$(0):rem GET liefert keine Nullbytes
250 print#2,a$;:next i
260 print#4,"u2:5 0 "+str$(tr)+str$(se):rem Sektor schreiben
270 close4:close2:close1:close3
280 next se:next tr
290 goto 130

Mit Assembler beschleunigte Version[Bearbeiten | Quelltext bearbeiten]

In dieser Version wurde die innere Schleife zum Kopieren der Daten (Zeilen 230-250) durch eine Assembler-Hilfsroutine ersetzt. Außerdem werden die Datenkanäle zwischen dem Lesen der Sektoren offengelassen. Dadurch braucht das Programm zum Kopieren einer Diskette "nur" noch etwa 18 Minuten (mit zwei JiffyDOS-1541 ist es schneller, und mit z.B. dem SD2IEC und einer Jiffy-1541 dauert der Kopiervorgang nur noch sieben Minuten).

100 data 17,21,24,19,30,18,35,17,0,0
110 tr=1:se=0:sd=8:dd=9
120 print"copying from drive ";sd;" to drive ";dd
130 open1,sd,5,"#":open2,dd,5,"#"
140 open3,sd,15:open4,dd,15
150 read mt,ms
160 if mt=0 then 300
170 for tr=tr to mt
180 for se=0 to ms-1
190 print"track ";tr;", sector ";se;"  "
200 print#3,"u1:5 0 "+str$(tr)+str$(se)
210 print#4,"b-p:5 0"
220 print#3,"b-p:5 0"
230 sys 4096:rem 256 Bytes von #1 nach #2 kopieren
240 print#4,"u2:5 0 "+str$(tr)+str$(se)
250 next se:next tr
260 goto 150
300 close4:close2:close1:close3
310 print"finished"
.C:1000   LDX #$01     - 256 Bytes aus Dateinummer 1 lesen
.C:1002   JSR $FFC6
.C:1005   LDY #$00
.C:1007   LDX #$01
.C:1009   JSR $FFCF
.C:100c   STA $C000,Y
.C:100f   INY
.C:1010   BNE $1007
.C:1012   JSR $FFCC
.C:1015   LDX #$02     - 256 Bytes nach Dateinummer 2 schreiben
.C:1017   JSR $FFC9
.C:101a   LDY #$00
.C:101c   LDA $C000,Y
.C:101f   LDX #$02
.C:1021   JSR $FFD2
.C:1024   INY
.C:1025   BNE $101C
.C:1027   JSR $FFCC
.C:102a   RTS