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.
Falsche Seite
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.
Universelle Anpassung
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