Magic Disk 64

home to index to html: MD9212-KURSE-FLOPPY-KURS_7.2.html
----------------------------------------
              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)



Valid HTML 4.0 Transitional Valid CSS!