← ST-Computer 03 / 1990

Commodore 1581-Wandler

Programmierpraxis

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