Das 3,5”-Laufwerk 1581 von Commodore für die Rechner C64 und C128 verwendet das gleiche physikalische Aufzeichnungsformat wie das Laufwerk des ATARI ST, nämlich das MFM-Format. Damit ergibt sich für Umsteiger vom Commodore 64/128 zum ATARI ST eine einfache Möglichkeit für den Dateitransfer.
Zwar ist das File-Management auf Commodore-Disketten gegenüber dem auf ATARI-Disketten völlig verschieden, aber beide Rechner können die Disketten des anderen Rechners im Direktzugriff auf Spur und Sektor lesen. Dieser Sachverhalt liegt dem vorliegenden Programm zugrunde.
Mittels des XBIOS-Befehls XBIOS(r,8...) läßt sich eine Spur einer Commodore-Disk einlesen. Sie umfaßt 20 Commodore-Sektoren zu je 256 Bytes, was 10 ATARI-Sektoren entspricht. Da das Commodore-Laufwerk generell beidseitig aufzeichnet, verdoppelt sich die Sektorenanzahl pro Spur. Interessant ist, daß bei Commodore die Seitenbezeichnung gegenüber dem ATARI vertauscht ist. So liegt der erste Sektor einer Spur generell auf Seite 1 und der letzte Sektor auf Seite 0.
Mit dem Programm lassen sich Commodore-Files vom Typ PRG, SEQ und USR in das ATARI-Format konvertieren. Andere File-Typen wie relative Files (REL) und Ordner (CBM) werden von diesem Programm nicht unterstützt. Wer eine Konvertierung solcher Dateien will, kann das Programm leicht selbst erweitern, da es in Omikron.BASIC geschrieben und somit einfach zu modifizieren ist. Allerdings ist dazu eine gute Kenntnis des File-Managements der Commodore-Disk notwendig.
Für die Konvertierung werden zwei Laufwerke am ATARI benötigt. In Laufwerk A wird die Commodore-Disk, in Laufwerk B eine formatierte ATARI-Disk eingelegt. Nach dem Start des Programms erfolgt eine Kurzinformation und die Abfrage, ob zunächst ein Testlauf, bei dem kein Schreibvorgang erfolgt, durchgeführt werden soll. Anschließend wird das Directory der Commodore-Disk eingelesen. In einer weiteren Abfrage kann man sich dafür entscheiden, ob generell alle Dateien vom Typ SEQ, oder ob nach einer Auswahl konvertiert werden soll. Dazu ist zu sagen, daß es im allgemeinen wegen der vollkommen unterschiedlichen Prozessoren und den anders aufgebauten BASIC-Interpretern nicht sinnvoll ist, Programm-Files zu konvertieren (PRG), es sei denn, daß in solchen Files Texte abgelegt sind, wie es z.B. das Textprogramm Vizawrite macht. In der Regel wird man Text-Files vom Typ SEQ konvertieren. Bei der pauschalen Umwandlung von SEQ-Dateien erfolgt generell eine Code-Umwandlung, da der Commodore-Rechner sich nicht sehr eng an den ASCII-Standard hält. Bei Konvertierung nach Auswahl kann man bei jeder Datei durch Eingabe von “J” entscheiden, ob eine Code-Umwandlung erfolgen soll oder nicht. Bei einer anderen Eingabe als “J” wird die Datei nicht ausgewählt und ein “Nein” hinter den Dateinamen gehängt. Ist das Ende der File-Liste erreicht, erfolgt die Abfrage. ob die Auswahl wiederholt werden soll, um die getätigten Angaben eventuell noch einmal ändern zu können.
Im Programm selbst ist die Routine zur Code-Wandlung mit dem Label “-Codewdlg” bezeichnet. Hier lassen sich zusätzliche, individuelle Code-Wandlungen einfügen, welche mit dem Flag “Zus” aktiviert werden. Während der Konvertierung werden der Dateiname und der Inhalt der Datei auf dem Bildschirm angezeigt. Weil die zulässige Dateinamenlänge beim ATARI ST gegenüber 16 Zeichen beim Commodore nur 8 Zeichen beträgt, wird jedem konvertierbaren File eine laufende Nummer zugewiesen. Die umgewandelten Dateien erhalten als Dateinamen diese Nummer. Nach dem Konvertieren der Dateien schreibt das Programm eine zusätzliche Informationsdatei auf die Diskette. In diesem File mit dem Namen “Namelist.Dat“ sind sämtliche Namen der konvertierten Dateien unter der laufenden Nummer enthalten.
' V 1.1, 12.11.1989
' (c) MAXON Computer GmbH 1990
' ****************************************
' * Programm zur Konvertierung von *
' * Files im COMMODORE-Format *
' * des Diskettenlaufwerkes 1581 *
' * in Files des ATARI ST-Formates *
' ****************************************
ON ERROR GOTO Fehler
DEFINT "D-U"
Z%L=512*20:Adr0%L= MEMORY(Z%L):Adr1%L=Adr0%L+Z%L/2
DIM Feld%B(Z%L): DIM Name$(304)
DATA "DEL","SEQ","PRG","USR","REL","CBM"
FOR I%=0 TO 5: READ E$:Ftyp$(I%)=E$: NEXT
Zus%L=1' Flag für zus., individuelle Code-Wandlungen
PRINT CHR$(27);"H"; CHR$(27);"H";CHR$(27);"E"
'
E$= CHR$(34)+" COMMODORE-FILE -> ATARI-FILE " + CHR$(34)
TEXT STYLE =8: TEXT 168,15,E$,300,0,1
PRINT " "; CHR$(4)
PRINT " Das Programm konvertiert PRG-, SEQ- und USR-Files im Format des"
PRINT " COMMODORE Laufwerkes 1581 in entsprechende Files des ATARI ST"
PRINT " mit den Extensionen PGM, TXT und USR. "
PRINT " Files vom Typ REL und CBM können nicht konvertiert werden."
PRINT
PRINT " Es müssen zwei Laufwerke vorhanden sein und die Zieldiskette";
PRINT " muß bereits": PRINT " formatiert sein !"
PRINT
PRINT " Testlauf (ohne schreiben) ? ";:E$=INPUT$(1): PRINT CHR$(27);"M"
IF E$="n" OR E$="N" THEN Wrt%L=1: ELSE PRINT TAB (27);">> TESTLAUF <<"
PRINT CHR$(27);"B"
PRINT TAB (20);" COMMODORE-Diskette in Laufwerk A"; CHR$(27);"B"
IF Wrt%L THEN PRINT TAB (20);" ATARI ST - Diskette in Laufwerk B"; CHR$(27);"B"
PRINT TAB (27);" einlegen !"
PRINT @(20,27);" <Taste, wenn OK> ";:E$= INPUT$(1)
PRINT CHR$(27);"1"; CHR$(27);"f"; CHR$(13),,, " bitte einen Moment ..."
'
' Directory der 1581 einiesen:
T%=40: GOSUB Track
IF Ds% OR Feld%B(0)<>40 OR Feld%B(1)<>3 THEN
PRINT @(20,16); CHR$(27);"J Im Laufwerk A ist keine COMMODORE-Disk !": END
ENDIF
PRINT CHR$(27);"E"; CHRS(27);"B DIRECTORY:"; CHR$(27);"p";:E$= CHR$(27)+ "p" + CHR$(34)
FOR I%=4 TO 26
IF I%=20 THEN E$=E$+ CHR$(34):I%=I%+1
U%=Feld%B(I%): GOSUB Codewdlg: IF U% THEN E$=E$+ CHR$(U%)
NEXT :E$=E$+ CHR$(27)+"q":Name$(0)=E$
PRINT TAB (25);E$: PRINT
PRINT @(21,79); CHR$(8);@(3,0);CHR$(4);
Of%=256*3+2' File-Namen ab Sektor 3 (COMMODORE-Format)
REPEAT
J%=Of%:T%=Feld%B(J%): IF T%=0 THEN GOTO Nxt
E$="":F%= VAL("$"+ RIGHT$( HEX$(T%),1)):P%=16
FOR I%=J% TO J%+2:E$=E$+CHR$(Feld%B(I%)): NEXT
FOR I%=J%+3 TO J%+19:U%=Feld%B(I%):IF U%=160 THEN P%=I%-J%-3:EXIT
GOSUB Codewdlg: IF U% THEN E$=E$+CHR$(U%)
NEXT
U%=Feld%B(J%+28)+Feld%B(J%+29)*256' Blockzahl
H$= LEFT$(E$,3)+ LEFT$( STR$(U%)+" ",5)+ CHR$(34)
H$=H$+ LEFT$( MID$(E$,4,P%)+ CHR${34)+ SPC(20),18)+Ftyp$(F%)
E$= "*": IF T%>127 THEN E$=" ": IF T%>191 THEN E$="<"
N%=N%+1:Name$(N%)=H$+E$: PRINT TAB(23); MID$(Name$(N%),4)
-Nxt:Of%=J%+32
UNTIL Feld%B(J%+3)=0
PRINT :H$="Code-Wandlung"
PRINT "konvert : 1 = alle SEQ-Files <mit ";H$;">, 2 = nach Auswahl ";CHR$(27);"e";
REPEAT :E$= INPUT$(1): UNTIL E$="1" OR E$="2"
IF E$="1" THEN Alle%L=1: GOTO Konvert
'
-Ausw: PRINT CHR$(27);"H"; CHR$(27);"H";CHR$(27);"E"; CHR$(27);"B"; TAB(27);Name$(0): PRINT CHR$(27);"B";CHR$(4);@(21,0);
I%=1: PRINT CHR$(27);"c";CHR$(I%);CHR$(27);"J"; CHR$(27);"b";CHR$(I%+1); SPC(8);"ja = mit ";H$;
PRINT " JA = ohne ";H$;" * = Abbruch";
PRINT CHR$(27);"b"; CHR$(I%);CHR$(27);"c"; CHR$(I%+1);
PRINT CHR$(27);"q";@(19,79); CHR$(8); CHR$(27);"E";:-Ausw1
A$ = " "
FOR I%=1 TO N%
N$=Name$(I%):H$= MID$(N$,32):U%=ASC(N$):H%= VAL( RIGHT$(HEX$(U%),1))
PRINT TAB (18);"#";RIGHT$(A$+ STR$(I%),3);A$; MID$(N$,4,28);A$;
IF U%<127 OR H%=0 OR H%>3 THEN PRINT : GOTO Ni
IF H$<>"" THEN
IF H$="j" THEN PRINT "ja ";
IF H$="J" THEN PRINT "JA ";
IF H$<>"j" AND H$<>"J" THEN PRINT " nein ";
ELSE PRINT "ja/nein ";
ENDIF
E$= INPUTS(1): PRINT CHR$(13); TAB (56);
IF E$="+" OR E$="*" THEN PRINT CHR$(27);"1"; CHR$(13);: EXIT
IF H$="" THEN
IF E$<>"j" AND E$<>"J" THEN PRINT " nein "
ELSE
IF E$<>"j" AND E$<>"J" AND E$<>"n" THEN PRINT : GOTO Ni
IF E$="n" THEN PRINT " nein "
ENDIF
IF E$="j" THEN PRINT "ja "
IF E$="J" THEN PRINT "JA "
Name$(I%)= LEFT$(N$,31)+E$
-Ni: NEXT
PRINT CHR$(27);"f"; CHR$(27);"B";CHR$(27);"A";: REPEAT : WAIT .1:E$= INKEY$ : UNTIL E$=""
INPUT CHR$(27)+"B Auswahl wiederholen ? ";CHR$(27);"e";E$ USING "+j+n s$s1", Cr%L,1,32
IF RIGHT$( HEX$(Cr%L),1)="A" THEN PRINT CHR$(27);"E";: GOTO Ausw1
-Konvert:T%=0:U%=0: CLS
FOR I%=1 TO N%:H$= RIGHT$(Name$(1%),1): IF H$="j" OR H$="J" THEN U%=I%
NEXT : IF Alle%L THEN U%=N%
E$="B:\NAMELIST.DAT"
IF Wrt%L*U% THEN OPEN "O",1,E$: PRINT #1," ";MID$(Name$(0),3,24)
FOR H%=1 TO U%
E$=Name$(H%):Tn%= ASC( MID$(E$,2,1)):S%= ASC( MID$(E$,3,1))
IF Alle%L=0 AND RIGHT$(E$,1)<>"j" AND RIGHT$(E$,1)<>"J" THEN GOTO Nha
F%= VAL("$"+ RIGHT$( HEX$( ASC((E$))),1))
IF Alle%L=1 AND F%<>1 THEN GOTO Nha
N$= MID$(E$,4,28):H$=Ftyp$(F%)
IF F%=1 THEN H$="TXT"
IF F%=2 THEN H$="PGM"
H$="#_"+ RIGHT$("000"+ MID$( STR$(H%),2),3)+"."+H$
Name$(H%)=N$+" -> "+ CHR$(34)+H$+CHR$(34)
IF Wrt%L THEN OPEN "O",2,"B:\"+H$: PRINT #1,Name$(H%)
PRINT CHR$(27);"H";CHR$(27);"H";CHR$(27);"E"
PRINT TAB(16);CHR$(27);"p";N$;CHR$(27);"q -> ";CHR$(27);"p"; CHR$(34);H$; CHR$(34);" ";CHR$(27);"q"
PRINT CHR$(27);"B"; CHR$(4);
REPEAT
IF Tn%<>T% THEN T%=Tn%: GOSUB Track
Of%=256*S%:P%=255:Tn%=Feld%B(Of%): S%=Feld%B(Of%+l): IF Tn%=0 THEN P%=S%
FOR I%=2 TO P%
U%=Feld%B(I%+Of%)
IF Alle%L OR RIGHT$(E$,1)="j" THEN GOSUB Codewdlg: IF U%=0 THEN GOTO Qq
PRINT CHR$(1); CHR$(U%);
IF Wrt%L THEN PRINT #2, CHR$(U%);: IF U%=13 THEN IF F%=1 THEN PRINT #2, CHR$(10);
-Qq: NEXT
UNTIL Tn%=0: CLOSE 2
-Nha: NEXT : CLOSE 1
END
-Track' einlesen; bei XBIOS ist T von 0-79!
XBIOS (Ds%,8, HIGH(Adr0%L), LOW(Adr0%L),0, 0,0,1,T%-1,1,10)
XBIOS (Ds%,8, HIGH(Adr1%L), LOW(Adr1%L),0, 0,0,1,T%-1,0,10)
FOR I%=0 TO 256*40:Feld%B(I%)= PEEK(Adr0%L+I%): NEXT
RETURN
-Codewdlg' COMMODORE-Code umwandeln
IF U%<32 THEN IF U%<>13 THEN U%=0
IF U%>64 AND U%<91 THEN U%=U%+32
IF U%>192 AND U%<255 THEN U%=U%-128
IF U%=160 THEN U%=32
IF U%=255 THEN U%=227
IF Zus%L=0 THEN RETURN
'zusätzliche Code-Wandlungen:
IF U%=64 THEN U%=158
IF U%=91 THEN U%=132
IF U%=92 THEN U%=148
IF U%=93 THEN U%=129
IF U%=123 THEN U%=142
IF U%=124 THEN U%=153
IF U%=125 THEN U%=154
RETURN
-Fehler
E$= ERR$ : PRINT
IF E$="TOS error #36" THEN PRINT CHR$(27);"B ST-DIRECTORY voll !": ELSE PRINT CHR$(27);"B";E$
RESUME Ende
-Ende: END