---------------------------------------- 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)