----------------------------------------
Floppy-Kurs:
"Es rappelt in der Kiste..."
(Teil 7.2)
----------------------------------------
Sie können diese Routinen nun universell
verwenden, um Programmdaten (z.B. die
High-Score-Tabelle in einem Spiel) auf
Diskette zu schreiben und wieder von ihr
zu lesen. Aber Achtung: die Routinen
sind nur zum reinen Lesen und Schreiben
gedacht! Files, die normalerweise mit
LOAD in den Rechner geladen werden, oder
mit SAVE abgespeichert wurden, können
nicht ganz so behandelt werden! Hierbei
müssen Sie beachten, daß die SAVE-
Routine des Betriebssystems immer die
Anfangsadresse des Files in den ersten
beiden Bytes (in Lo/Hi-Byte-Darstellung)
mitspeichert. Lesen Sie ein solches File
mit "BASIN" ein, so erhalten Sie in den
ersten beiden Bytes immer zuerst diese
Adresse. Beachten Sie also, daß diese
beiden Bytes nicht zu den eigntlichen
Daten des Files gehören! Ebenso können
Sie kein mit "WriteFile" geschriebenes
File mit dem LOAD-Befehl laden, weil
hierbei nämlich die ersten beiden Bytes
als Startadresse gewertet werden und das
File anschließend irgendwohin in den
Speicher geladen wird! Zum Kopieren von
Files sind diese Routinen wiederum opti-
mal geeignet, da sie die Ladeadresse ja
mitladen und mitspeichern.
Sie können sie aber auch so modifizie-
ren, daß diese Adresse mitberücksichtigt
wird. Hierzu müssen Sie "ReadFile" ledi-
glich so umprogrammieren, daß sie die
ersten beiden Bytes liest und als An-
fangsadresse nimmt, bzw. daß "WriteFile"
die gegebene Anfangsadresse, die in X-
und Y-Register übergeben wird, vorher an
das zu speichernde File sendet. Noch
einfacher geht das aber mit den Be-
triebssystemroutinen für LOAD und SAVE.
Sie nehmen uns diese Arbeit nämlich kom-
plett ab und sind zudem noch relativ
flexibel zu handhaben.
LOAD UND SAVE
Wie schon erwähnt stellt uns das Be-
triebssystem ebenso zwei Routinen zur
Verfügung, mit denen wir komplette Files
nachladen, bzw. speichern können. Der
Aufruf ist hierbei sehr einfach. Zu-
nächst einmal müssen wir unsere Files
wieder mittels SETNAM und SETPAR spezi-
fizieren. Danach werden die Prozessorre-
gister einfach nur noch mit den entpre-
chenden Parametern gefüttert und die
benötigte Routine wird aufgerufen.
Kommen wir zuerst zur LOAD-Routine. Sie
liegt bei $FFD5 und hat folgende Aufruf-
parameter:
Akku : Operationsflag ($00 oder $01)
X-Reg.: Low-Byte der Ladeadresse
Y-Reg.: High-Byte der Ladeadresse
Das Operationsflag, das in den Akku
kommt, hat folgende Bewandnis: die LOAD-
Routine kann nämlich auch zum Verifizie-
ren eines Files verwendet werden (BA-
SIC-Befehl "VERIFY"). Hierbei wird haar-
genau so verfahren wie beim Laden, je-
doch mit dem Unterschied, daß das File
nicht in den Speicher geschrieben, son-
dern nur gelesen wird. Möchte man nun
laden, so muß der Wert 0 im Akku stehen.
Möchte man verifizieren, so gehört der
Wert 1 in ihn hinein. Desweiteren kann
in X- und Y-Register die Startadresse
des File übergeben werden, an die es
geladen werden soll. Die LOAD-Routine
überliest dann ganz einfach die ersten
beiden Bytes, die diese Adresse ja ange-
ben, und liest das File anschließend an
die gegebene Adresse. Möchten Sie das
File jedoch an seine vorgegebene Adresse
laden, so müssen Sie X- und Y-Register
lediglich mit 0 füllen.
Zum besseren Verständins einmal eine
kleine Routine, die ein File mittels
LOAD-Routine an seine im File vorgegebe-
ne Adresse lädt. Sie verlangt als Auf-
rufparameter die Filenamenlänge im Akku
und den Filenamen bei Adresse $0334:
LDX #$34 ;Name bei $0334 (Länge ist
LDY #$03 ; noch vom Aufruf im Akku)
JSR $FFBD ;Namen setzen (SETNAM)
LDA #01 ;Filenummer=1
LDX #08 ;Gerät Nr. 8
LDY #00 ;Sek.=0 für "PRG laden"
JSR $FFBA ;Parameter setzen (SETPAR)
LDA #00 ;Load-Flag in Akku
TAX ;X/Y löschen (Startadresse
TAY ;aus dem File holen)
JMP $FFD5 ;und laden
Wie Sie sehen, werden SETNAM und SETPAR
genauso benutzt wie in der "ReadFile"-
Routine. Im Prinzip können Sie die Anga-
be einer Filenummer weglassen, da Sie
sie selbst ja nicht brauchen. Es wird in
dem Fall gerade die Nummer gewählt, die
im Akku steht. Nur hat das den Nachteil,
daß der Ladevorgang nicht immer funktio-
niert, wenn Sie noch weitere Files offen
halten.
Das File steht am Ende der Routine an
der Stelle im Speicher, die von seinen
ersten beiden Bytes spezifiziert wurde.
Möchten Sie es allerdings an eine be-
stimmte Adresse laden, z.B. $1234, so
müssen Sie die beiden Befehle "TAX" und
"TAY" durch die folgenden beiden Zeilen
ersetzen:
LDX #$34
LDY #$12
Kommen wir nun zur SAVE-Routine des Be-
triebssystems. Sie wird ähnlich aufgeru-
fen. Zunächst müssen wieder mittels SET-
NAM und SETPAR der Name und die Parame-
ter des Files gesetzt werden. Anschlie-
ßend kann die SAVE-Rotine aufgerufen
werden. Sie benötigt jedoch ein paar
mehr Parameter, nämlich Start- und End-
adresse. Da hierfür die drei Prozessor-
register nicht ausreichen, wurde folgen-
der Weg gegangen: Zunächst legen Sie die
Staradresse des zu speichernden Bereichs
in Lo'Hi Darstellung in zwei aufeinan-
derfolgenden Adressen der Zeropage ab.
Hierzu bieten sich $FB und $FC an, da
sie vom Betriebssystem nicht benutzt
werden. Nun laden Sie einen "Zeropage-
Zeiger" in den Akku. Dieser ist nichts
anderes als die Nummer der Speicherstel-
le in der Sie das Low-Bytes der Start-
adresse abgelegt haben. In unserem Bei-
spiel also $FB. Die Endadresse des zu
speichernden Bereichs legen Sie in X-
und Y-Register ab und rufen anschließend
die SAVE-Routine auf. Ihe Einsprung-
adresse liegt bei $FFD(. Hier wieder
eine Beispielroutine. Sie verlangt
wieder den Filenamen bei $0334 und
dessen Länge im Akku. Desweiteren müssen
Sie die Startadresse in $FB/$FC abgelegt
haben und die Endadresse in X- und Y-
Register übergeben:
STX $FD ;Endadresse in $FD/$FE
STY $FE ; sichern
LDX #$34 ;Filenamen bei $0334
LDY #$03 ; setzen
JSR $FFBD ; (SETNAM)
LDA #01 ;Filenr. 1
LDX #08 ;Geräte Nr. 8
LDY #01 ;Sek.=1 für "PRG speichern"
JSR $FFBA ;Parameter setzen (SETPAR)
LDA #$FB ;Zeiger auf Startadr. laden
LDX $FD ;Endadresse wieder in
LDY $FE ; X- und Y-Reg. holen
JMP $FFD8 ;Und speichern!
Wie Sie sehen, wird die Endadresse hier-
bei in $FD/$FE zwischengespeichert, um
den Aufruf korrekt durchführen zu kön-
nen. Diese beiden Speicherstellen sind
übrigens ebenfalls vom Betriebssystem
unbenutzt.
Die beiden Programmbeispiele zum Laden
und Speichern mittels LOAD und SAVE fin-
den Sie übrigens ebenfalls in dem File
"FK.I/O.S" auf dieser MD. Ich verab-
schiede mich nun wieder einmal von Ih-
nen, und wünsche Frohe Weihnachten und
ein schönes neues Jahr, in dem wir dann
tiefer in die Assemblerprogrammierung
der Floppy einsteigen und einige Pro-
grammbeispiele des täglichen Gebrauchs
kennenlernen werden.
(ub)