Floppy-Kurs:
"Es rappelt in der Kiste..."
(Teil 1)
----------------------------------------
In Anlehnung an diverse Geräusche die
das Laufwerk unseres Computerlieblings
an und wann von sich gibt, wünsche ich
Sie herzlich willkommen zum ersten Teil
unseres neuen Floppykurses.
In den nächsten Monaten will ich Ihnen
hier die Funktionsweise und effektive
Benutzung des Floppylaufwerks 1541 des
64ers erklären. Beginnend mit den Grund-
lagen zur Datenspeichrung auf Diskette
werden wir uns über sequentielle und
relative Dateiverwaltung immer mehr an
die 'Innereien' der Floppy herantasten,
und uns auch mit dem Diskettenaufbau und
Direktzugriff beschäftigen. Danach will
ich Ihnen zeigen, wie einfach es ist die
Floppy in Assembler zu programmieren und
Ihnen desweiteren meine gesammelten Tips
und Tricks zur Floppy offenbaren. Ich
wünsche Ihnen also viel Spaß bei diesem
Kurs und will gleich zu Sache kommen...
GRUNDLAGEN DER DATENEIN-/AUSGABE
Dieser erste Teil des Floppy-Kurses soll
ganz den Grundlagen und der sequentiel-
len Fileprogrammierung gewidmet sein.
Kommen wir zunächst einmal zu den Grund-
begriffen der Datenein- und ausgabe des
64ers. Wenn Sie sich mit BASIC ausken-
nen, so wissen Sie, daß es prinzipiell 5
BASIC-Befehle gibt, mit denen wir Daten
an externe, oder von externen Geräten
senden und empfangen können. Diese sind:
* OPEN, zum Üffnen eines Datenkanals,
* PRINT#, zum Senden von Daten in einen
Datenkanal,
* GET#, zum Lesen von Daten von einem
Datenkanal,
* INPUT#, zum einfacheren (BASIC-
orientierten) Lesen von einem Datenka-
nal, und
* CLOSE, zum abschließenden Schließen
eines Datenkanals.
Datenein- und ausgaben werden nun prin-
zipiell mit drei verschiedenen Parame-
tern zu den obigen Befehlen gesteuert.
Sie geben an, welchem logischen Kanal
der aktuelle Datenaustausch zugeordnet
wird und geben Informationen über die
Art des Zugriffs (lesen/schreiben) und
über das entsprechende Gerät, das ange-
sprochen werden soll. Diese drei Parame-
ter sind die "logische Filenummer", die
"Sekundäradresse" und die "Gerätenum-
mer".
Die logische Filenummer ist eine Zahl
zwischen 1 und 127, die als Kennung für
eine Ein-/Ausgabeoperation dient. Durch
den OPEN-Befehl wird ihr eine bestimmte
Fileoperation zugewiesen, die sie ein-
deutig definiert. Wird also ein Datenka-
nal zur Floppy mit der logischen File-
nummer 1 und ein Datenkanal zum Drucker
mit der logischen Filenummer 2 geöffnet,
so weiß das Betriebssystem des 64ers
immer, wohin es Daten mit einer der bei-
den Filenummern senden soll. Ein
"PRINT#1,A$" sendet so die Stringvaria-
ble A$ an den momentan offenen Floppyka-
nal (nachdem die Filenummer 1 so durch
'OPEN' definiert wurde), wohingegen der
Befehl "PRINT#2,A$" dieselbe Stringva-
riable an den Drucker sendet (nachdem
ihm die Filenummer 2 zugeordnet wurde).
Die Gerätenummer spezifiziert nun das
Gerät, mit dem Daten ausgetauscht werden
sollen. Sie kann Werte zwischen 0 und 15
annehmen. Hierzu gibt es eine Liste, die
die verschiedenen Geräte spezifiziert.
Das Betriebssystem des C64 benötigt die-
se Nummer deshalb, weil die verschiede-
nen Peripheriegeräte mit unterschiedli-
chen Betriebssystemroutinen angesprochen
werden müssen. Die Verteilung der Gerä-
tenummern an die entsprechenden Geräte
ist wiefolgt festgelegt:
Ger.num. Gerät
----------------------
0 Bildschirm
1 Datasette
2 RS232-Schnittstelle
4 Drucker 1
5 Drucker 2
8 Floppylaufwerk 1
9 Floppylaufwerk 2
10 Floppylaufwerk 3
11 Floppylaufwerk 4
Die restlichen Nummern sind unbelegt.
Wie Sie sehen ist es also möglich bis zu
4 Floppylaufwerke und 2 Drucker an den
C64 anzuschließen, die alle getrennt
voneinander angesprochen werden können.
Ebenso ist die Kommunikation mit dem
Bildschirm über die Gerätenummer 0 mö-
glich. Hierbei empfangen Sie direkt die
Eingaben, die gerade vom Benutzer auf
den Bildschirm geschrieben werden.
Die Sekundäradresse einer Ein-
/Ausgabeoperation gibt nun die Art einer
Datenoperation an. Sie kann Werte zwi-
schen 0 und 15 annehmen, wobei es fol-
gende Bedeutungen gibt:
SAdr. Bedeutung
------------------------
0 Programm laden
1 Programm speichern
2-14 Daten Lesen oder Schreiben
15 Floppybefehlskanal
In der Regel werden die Sekundäradressen
zwischen 2 und 14 verwendet. Die Adres-
sen 0, 1 und 15 sind spezielle Adressen,
die eingens für die Verwaltung von Mas-
senspeichern gedacht sind. Normalerweise
muß man nämlich beim Zugriff auf einen
Massenspeicher (so wie auch das Floppy-
laufwerk einer ist) grundsätzlich die
Art des Zugriffs explizit im Filenamen
angeben. Möchte man aber ein Programmfi-
le (dazu später mehr) lesen oder schrei-
ben, so kann man sich die Angabe im Fi-
lenamen sparen und die Adressen 0 oder 1
benutzen. Die Floppy weiß in dem Fall
direkt, daß sie ein Programmfile lesen,
bzw. schreiben soll. Dazu will ich Ihnen
später noch ein paar Beispiele liefern.
Die Sekundäradresse 15 ist ausschließ-
lich für das Floppylaufwerk reserviert.
Mit ihr wird der sogenannte Floppybe-
fehlskanal geöffnet. Dieser ist nicht an
ein spezielles File gebunden und dient
der Öbertragung von Befehlen an die
Floppy selbst. Die 1541 verfügt nämlich,
wie der C64 auch, über einen eigenen
Mikroprozessor (den 6502, ein Artver-
wandter des 6510, der im 64er seinen
Dienst verrichtet) und eigene Ein-
/Ausgabechips. Sie stellt im Prinzip
einen autonomen Computer dar, der rich-
tig Programmiert werden kann. Die wich-
tigsten Funktionen sind in spezeillen
Floppybefehlen zusammengefasst und wer-
den über den erwähnten Befehlskanal auf-
gerufen (wie z.B. der Befehl, die ein-
liegende Diskette zu formatieren, oder
ein spezielles File von der einliegenden
Diskette zu löschen). Der Floppybefehls-
kanal hat später, wenn wir die Direktzu-
griffbefehle behandeln, und in Zusammen-
hang mit der relativen Dateiverwaltung
eine große Bedeutung.
Die obig beschriebenen Parameter, die
der OPEN-Befehl benötigt müssen wiefolgt
angewandt werden (Praxisbeispiele werden
wir im Laufe dieses Kurses noch genügend
kennenlernen, deshalb hier nur eine Syn-
taxdefinition):
OPEN (log.Filenr.),(Ger.nr.),(Sek.adr.)
DER FLOPPYBEFEHLSKANAL
Wir wollen uns nun mit der Benutzung des
Floppybefehlskanals beschäftigen und
einmal die alltäglichen Floppybefehle
durchgehen.
Bevor Sie also einen Befehl an die
Floppy schicken, müssen Sie den Befehls-
kanal öffnen. Dies geschieht mit dem
Befehl "OPEN 1,8,15". Wir öffnen hier
einen Kanal mit der logischen Filenummer
1, verbunden mit dem Gerät Nummer 8 (der
Floppy nämlich) und mit der Sekundära-
dresse 15 (eben dem Befehlskanal dersel-
bigen). Nun können Sie der Floppy Befeh-
le senden, die diese dann unabhängig vom
64er bearbeiten wird. Sie können also
Ihren 64er währenddessen in seinem ak-
tuellen Programm fortfahren lassen. Er
arbeitet, solange die Floppy selbst ar-
beitet, unabhängig von ihr. Nur, wenn
während dieser Zeit ein weiterer Disket-
tenzugriff notwendig wird, wird der 64er
angehalten (s.u.)
Ich will Ihnen nun die Standard-
Floppybefehle auflisten, die wir einfach
benutzen können. Später beim Direktzu-
griff und bei der relativen Dateiverwal-
tung werden wir ebenfalls über den Be-
fehlskanal der Floppy Anweisungen geben,
uns die Daten, die wir von ihr verlangen
entprechend vorzubereiten.
Kommen wir jedoch erst einmal zu den
einfachen Befehlen:
* Der NEW-Befehl:
Mit diesem Befehl formatieren wir eine
neue Diskette. Grundsätzlich bestehen
die Floppybefehle aus einem oder mehre-
ren Buchstaben, sowie den zu jedem Be-
fehl variierenden Parametern. Beim NEW-
Befehl ist die Befehlskennung ein "N:",
nach diesen beiden Zeichen folgt nun der
Name, den die Diskette erhalten soll,
sowie eine zwei Zeichen lange Identifi-
kationskennung ("ID"). Floppybefehle
werden nach dem Üffnen des Befehlskanals
immer mit einem "PRINT#lfn" (lfn=logi-
sche Filenummer) an die Floppy ge-
schickt. Mit dem folgenden BASIC-
Kommando fordern wir die Floppy also
dazu auf, die einliegende Diskette mit
dem Namen "MEINE DISK" und der ID "MD"
zu formatieren. Der Befehlskanal wurde
unter der logischen Filenummer 1 geöff-
net (wie in obigem Beispiel), also sen-
den wir den Befehl auch an Kanal 1:
PRINT#1,"N:MEINE DISK,MD"
Die Floppy beginnt nun mit der Formatie-
rung der Diskette. Der 64er meldet sich
mit einem "READY." zurück, und Sie kön-
nen während der Formatierung mit ihm
arbeiten. Sie können den Befehlskanal
nun offen halten und weitere Floppybe-
fehle senden, oder aber auch irgend eine
andere Tätigkeit mit dem Rechner tun.
Achten Sie allerdings darauf, daß beim
weiteren Senden eines Befehls, sowie dem
Schließen des Befehlskanals, der Rechner
blockiert wird. Das liegt daran, daß die
Floppy während einer internen Operation
dem 64er signalisiert, daß sie gerade
"BUSY", also am Arbeiten ist. Soll der
C64 nun mit der Floppy kommunizieren, so
wartet er solange, bis die Floppy wieder
frei wird. Demnach führt jeder weitere
Befehl, der die Floppy anspricht unwei-
gerlich zu einem zwischenzeitlichen Stop
des Rechners.
Der NEW-Befehl kennt übrigens zwei Syn-
taxen. Öbergeben Sie einen Namen UND
eine ID, dann wird die Diskette physisch
formatiert. Das heißt, sie wird Spur um
Spur neu angelegt, wobei die neuen Spu-
ren mit Nullen aufgefüllt werden. Daten,
die sich evtl. auf ihr befanden werden
somit komplett gelöscht. Öbergeben Sie
aber nur einen Diskettennamen, und keine
ID, so wird die Diskette "softforma-
tiert". Es wird lediglich der neue Name
über den alten geschrieben, und alle
Blocks als unbelegt gekennzeichnet. Die
ID bleibt die alte. Die alten Daten sind
jedoch immer noch auf den Spuren enthal-
ten und können evtl. gerettet werden.
Ausserdem ist das softformatieren wei-
taus schneller als ein "hardformatie-
ren". Es funktioniert allerdings nur bei
schon einmal hardformatierten Disketten,
da diese die grundlegende Diskettens-
truktur schon enthalten.
Sie schließen den oben geöffneten Be-
fehlskanal übrigens wieder mit "CLOSE
1". Tun Sie das bitte immer, wenn Sie
ein Datenfile, oder den Befehlskanal
nicht mehr brauchen, da der 64er intern
immer nur 10 offene Kanäle verwalten
kann.
* Der RENAME-Befehl:
Mit dem Rename-Befehl können Sie den
Namen eines schon bestehenden Files um-
benennen. Die Syntax ist eigentlich
recht einfach. Das Kürzel für RENAME ist
"R:" es folgen nun der neue und der alte
Filename getrennt durch ein "="-Zeichen.
Hier ein Beispiel:PRINT#1,"R:MAGIC
DISK=GAME ON"
Dieser Befehl benennt das File "GAME ON"
in "MAGIC DISK" um. Wieder benutzten wir
die log. Filenummer 1, die oben im
OPEN-Befehl definiert wurde.
* Der VALIDATE-Befehl:
VALIDATE bedeutet "überprüfen", und sel-
biges tut der Validate-Befehl der
Floppy. Haben Sie nämlich Grund zu glau-
ben, daß die Diskettenstruktur durchei-
nandergekommen ist, so zum Beispiel wenn
Sie ein, oder mehrere Files speichern
wollten, für die aber nicht ausreichend
Platz vorhanden war, dann sollten Sie
diesen Befehl verwenden. Er untersucht
die Diskette auf ihre korrekte Struktur
und korrigiert alles, was nicht einer
normalen Diskettenstruktur entspricht.
In dem Beispiel mit einem nur teilweise
gespeicherten Programm sind die schon
geschiebenen Blocks dieses Files als
belegt gekennzeichnet, obwohl das File
im Directoryeintrag mit "0 Blocks" und
einem "*" als unbrauchbar gekennzeichnet
ist. Der Validate-Befehl erkennt nun die
fälschlicherweise belegten Blocks und
gibt sie wieder frei. Desweiteren löscht
er den markierten Eintrag aus dem Direc-
tory. Er benötigt keinerlei Parameter
und kann folgendermaßen aufgerufen wer-
den:
PRINT#1,"V"
Die Floppy beginnt nun mit der Validie-
rung. Diese kann je nach dem wie voll
und wieviele einzelne Files auf der Dis-
kette enthalten sind, bis zu mehrere
Minuten in Anspruch nehmen.
* Der SCRATCH-Befehl:
Dieser Befehl löscht ein File auf Dis-
kette. Englisch "to scratch" bedeutet
"kratzen" und im Öbertragenen Sinne
"kratzt" die Floppy tatsächlich ein File
von der Diskettenoberfläche.
Der Scratch-Befehl wird mit "S:" einge-
leitet, gefolgt von dem oder den Filena-
men, die gelöscht werden sollen. Hierbei
dürfen Sie sogar sogenannte Filepatterns
benutzen, die eine Fileangabe abkürzen.
Ein "Pattern" ist eine Maske, die man
der Floppy für einen Filenamen übergibt.
Alle Files, deren Namen dieser Maske
entsprechen sind damit angesprochen,
werden in unserem Fall also durch den
Scratch-Befehl gelöscht. Hier einige
Beispiele:
PRINT#1,"S:FILE1"
PRINT#1,"S:TEST1,TEST2,TEST10,TEST11"
PRINT#1,"S:TEST?"
PRINT#1,"S:TEST*"
Im ersten Beispiel wird das File namens
"FILE1" gelöscht. Das zweite Beispiel
löscht die Files "TEST1", "TEST2",
"TEST10", und "TEST11". Selbiges können
wir aber auch mit Filepatterns verkür-
zen. So können wir zum Beispiel mit dem
Fragezeichen eine Fileangabe abkürzen.
es steht für ein beliebiges Zeichen. Das
dritte Beispiel löscht also gleichzeitig
die Files "TEST1" und "TEST2". Im vier-
ten Beispiel benutzen wir den Asterisk
("*") als Abkürzung. Er steht für alles,
was hinter den Zeichen "TEST" folgt. Wir
löschen mit diesem Befehl also auf Ein-
mal alle vier Files aus dem zweiten Bei-
spiel.
DIE VERSCHIEDENEN DATEITYPEN
Nachdem wir nun Grundsätzliches über die
Kommunikation mit der Floppy gelernt
haben, möchte ich Sie nun in die einzel-
nen File-Arten selbiger einführen. Das
benötigen wir, um die unterschiedliche
Programmierung der einzelnen File-Typen
zu verstehen. Insgesamt kennt die 1541
fünf verschiedene File-Typen. Diese
sind:* Programm-Dateien (PRG):
In diesen Files sind Daten sequentiell,
also Byte hinter Byte abgespeichert. Sie
enthalten ausschließlich Programmdaten,
also direkt ausführbare BASIC-, oder
Maschinenprogramme.
* Sequentielle Dateien (SEQ):
Diese Fileart unterscheidet sich in
nichts mit der vorherigen. Die Daten
liegen hier ebenfalls sequentiell auf
der Diskette vor. Der einzige Grund,
warum man zwei Filearten zur sequentiel-
len Speicherung gewählt hat, ist der,
daß in SEQ-Files immer nur Daten von und
zu Programmen gespeichert werden sollen
und keine Programme selbst. Wenn Sie
also eine Adressverwaltung programmie-
ren, so sollten Sie Ihre Adressen in
einer SEQ-Datei speichern. Dies kenn-
zeichnet Ihre Daten eben als Daten und
nicht als ausführbares Programm (obwohl
Sie genausogut eine PRG-Datei verwenden
könnten!). Die Unterscheidung ist beson-
ders wichtig für den LOAD-Befehl, der
SEQ-Dateien gar nicht erst liest, son-
dern ausschließlich PRG-Dateien in den
Speicher des 64ers transferiert.
* Relative Dateien (REL):
In relativen Dateien liegen die Daten
für uns Anwender nicht hintereinander,
sondern relativ zueinander vor. Hierbei
wird beim Anlegen einer REL-Datei eine
Datensatzlänge vorgegeben, die für ein
REL-File immer gleich bleibt. Wenn Sie
nun Daten in die Datei scheiben, werden
selbige zu einem Datensatz zusammenge-
fasst und mit einer fortlaufenden Satz-
nummer versehen. Wenn Sie zum Beispiel
die Adressen Ihrer Adressverwaltung in
relativen Datensätzen speichern, und
sich merken, unter welchen Datensatznum-
mern Sie die einzelnen Adressen wieder-
finden, so können Sie direkt auf einen
Datensatz zugreifen. Die Vorteile ge-
genüber sequentieller Speicherung liegen
auf der Hand: durch den Direktzugriff
sind die Daten erstens schneller er-
reichbar, weil nicht eine komplette Da-
tei eingelesen werden muß, sondern eben
immer nur ein einziger Datensatz, und
sie können zweitens extern gelagert wer-
den, so daß Sie kostbaren Arbeitsspei-
cher im 64er sparen. Die Programmierung
von relativen Dateien wird uns im 2.
Teil dieses Kurses noch näher beschäfti-
gen.
Bitte Teil 2 laden...