Magic Disk 64

home to index to text: MD9212-KURSE-FLOPPY-KURS_7.2.txt
----------------------------------------
              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 optimal geeignet, da sie die Ladeadresse ja mitladen und mitspeichern.
Sie können sie aber auch so modifizieren, daß diese Adresse mitberücksichtigt wird. Hierzu müssen Sie " ReadFile" lediglich so umprogrammieren, daß sie die ersten beiden Bytes liest und als Anfangsadresse nimmt, bzw. daß " WriteFile" die gegebene Anfangsadresse, die in Xund Y-Register übergeben wird, vorher an das zu speichernde File sendet. Noch einfacher geht das aber mit den Betriebssystemroutinen 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 Betriebssystem ebenso zwei Routinen zur Verfügung, mit denen wir komplette Files nachladen, bzw. speichern können. Der Aufruf ist hierbei sehr einfach. Zunächst einmal müssen wir unsere Files wieder mittels SETNAM und SETPAR spezifizieren. Danach werden die Prozessorregister einfach nur noch mit den entprechenden Parametern gefüttert und die benötigte Routine wird aufgerufen.
Kommen wir zuerst zur LOAD-Routine. Sie liegt bei $ FFD5 und hat folgende Aufrufparameter:
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 Verifizieren eines Files verwendet werden ( BA-SIC- Befehl " VERIFY") . Hierbei wird haargenau so verfahren wie beim Laden, jedoch mit dem Unterschied, daß das File nicht in den Speicher geschrieben, sondern 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 Xund 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 angeben, 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 Xund 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 vorgegebene Adresse lädt. Sie verlangt als Aufrufparameter 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 Angabe 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 funktioniert, 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 bestimmte 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 Betriebssystems. Sie wird ähnlich aufgerufen. Zunächst müssen wieder mittels SET-NAM und SETPAR der Name und die Parameter des Files gesetzt werden. Anschließend kann die SAVE-Rotine aufgerufen werden. Sie benötigt jedoch ein paar mehr Parameter, nämlich Startund End- adresse. Da hierfür die drei Prozessorregister nicht ausreichen, wurde folgender Weg gegangen: Zunächst legen Sie die Staradresse des zu speichernden Bereichs in Lo' Hi Darstellung in zwei aufeinanderfolgenden 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 Speicherstelle in der Sie das Low-Bytes der Startadresse abgelegt haben. In unserem Beispiel also $ FB. Die Endadresse des zu speichernden Bereichs legen Sie in Xund Y-Register ab und rufen anschließend die SAVE-Routine auf. Ihe Einsprungadresse 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 Xund 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 hierbei in $ FD/$ FE zwischengespeichert, um den Aufruf korrekt durchführen zu können. Diese beiden Speicherstellen sind übrigens ebenfalls vom Betriebssystem unbenutzt.
Die beiden Programmbeispiele zum Laden und Speichern mittels LOAD und SAVE finden Sie übrigens ebenfalls in dem File " FK. I/ O. S" auf dieser MD. Ich verabschiede mich nun wieder einmal von Ihnen, und wünsche Frohe Weihnachten und ein schönes neues Jahr, in dem wir dann tiefer in die Assemblerprogrammierung der Floppy einsteigen und einige Programmbeispiele des täglichen Gebrauchs kennenlernen werden.

                                    (ub)

Valid HTML 4.0 Transitional Valid CSS!