Commodore 1581-Wandler

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

Helmut Büche
Aus: ST-Computer 03 / 1990, Seite 90

Links

Copyright-Bestimmungen: siehe Über diese Seite