Magic Disk 64

home to index to html: MD8908-KURSE-BASIC_KURS_TEIL_7-2.html
 Jetzt wollen wir aber einmal versuchen,
unsere gespeicherten Daten wieder einzu-
lesen. Dies geschieht in etwa  nach  dem
selben Schema. Zuerst müssen  wir  einen
Kanal öffnen:                           
OPEN 1,8,2,"HIGHSCORE,S,R"              
Wie Sie sehen, sieht dieser  OPEN-Befehl
fast genauso aus wie der obige. Ich habe
hier also dieselben  Parameter  benutzt,
bis  auf  den   Kennungsbuchstaben   der
Betriebsart. Hier haben  wir  jetzt  ein
"R" was einen weiteren Modus umschreibt,
nämlich "Read" für "Lese".              
Wir haben also wieder ein  sequentielles
File geöffnet mit der Filenummer 1,  der
Geräteadresse 8, der  Sekundäradresse  2
und  dem  Namen   "HIGHSCORE",   diesmal
allerdings zum Lesen, denn wir wollen ja
unsere   gespeicherten   Daten    wieder
zurückholen. Dies  geschieht  mit  einem
neuen Befehl, einer  kleinen  Abwandlung
von INPUT, dem  INPUT#-Befehl.  Wie  Sie
sehen ist  auch  hier  einfach  nur  ein
Doppelkreuz   angehängt   worden.    Die
Eingabe ist nun ja denkbar einfach.  Wir
müssen  nach   INPUT#   nur   noch   die
Filenummer  unseres  Kanal  angeben  und
anschließend, durch Komma getrennt,  die
Variable,  der  das  einzulesende  Datum
zugewiesen werden soll, also:           
INPUT#1,x$                              
INPUT#1,na$                             
INPUT#1,sc                              
In  "X$"  hätten  wir  nun  den   String
"Highscoreliste"  gespeichert   und   in
"NA$"  den  vorhin  gepeicherten   Namen
"Fritz  Meier".  In  "SC"  steht   jetzt
100000, die Punktzahl von Fritz Meier.  
Sie können diese Daten nun  also  wieder
weiterverarbeiten. Übrigens  sollte  ich
hier  vielleicht   erwähnen,   daß   der
INPUT#-Befehl, ebenso wie  INPUT,  NICHT
im Direktmodus anwendbar ist. Sie können
ihn   also   ausschließlich    NUR    in
Programmen anwenden.  Auch  sollten  Sie
den dazugehörigen OPEN-Befehl in  diesem
Programm aufführen, und  nicht  etwa  im
Direktmodus   das   File   öffnen    und
anschließend ein Programm mit den obigen
INPUT#-Anweisungen   starten,   da   RUN
leider die Merktabellen,  die  sich  der
64er   intern   über   alle   geöffneten
Filenummern anlegt, wieder  löscht.  Die
Floppy bekommt jedoch davon nichts  mit,
so daß für sie der Kanal noch offen ist,
für  den  Computer  ist  er   allerdings
geschlossen. Sie können sich  vielleicht
vorstellen, was für  ein  Chaos  hierbei
entstehen könnte...  In  solchen  Fällen
hift es  dann  immer,  einmal  kurz  die
Diskette aus dem Laufwerk zu  holen,  da
die  Floppy  dann  den  Kanal  ebenfalls
(zumindest intern) schließt.  Die  Daten
können   dabei    allerdings    verloren
gehen.                                  
Nachdem  wir  nun  unsere  Daten  wieder
eingelesen   haben,   müssen   wir   den
Lesekanal  natürlich  wieder  mit  CLOSE
schließen, also:                        
CLOSE 1                                 
Nun sollten sie mit SEQ-Files ja bestens
umgehen können, was laden und  speichern
zumindest  angehen.  Die  Floppy   kennt
jetzt  allerdings  noch   eine   weitere
Betriebsart. Außer  "Read"  und  "Write"
gibt es nämlich auch noch "Append".  Das
ist  englisch  und  heißt   soviel   wie
"hinzu- oder anfügen". Mit diesem  Modus
können Sie also  an  eine  schon  früher
erstellte Datei weitere Daten anhängen. 
Angenommen, Sie wollten vielleicht einen
weiteren  Highscore  abspeichern,   dann
bräuchten Sie nur einen  Floppykanal  in
der Betriebsart "Append" zu öffnen.  Für
"Append"  kennt  die  Floppy  das   "A"-
Kürzel, also:                           
OPEN 1,8,2,"HIGHSCORE,S,A"              
Jetzt können Sie mit  Hilfe  von  PRINT#
weitere Daten an das alte File anhängen,
nach "Fritz Meier"  und  100000  könnten
wir nun also auch  z.B.  "Heinz  Müller"
und 99999 an die  Floppy  schicken.  Bei
einem erneuten Einlesen der Datei müßten
wir  dann  noch  einmal  gesondert  alle
Daten von vorne bis hinten auslesen.    
Kommen wir nun zur Fileart PRG. Wie  ich
oben  ja  schon  erwähnte,   ist   diese
Fileart nur für Programme reserviert.   
Trotzdem kann  man  sie  von  BASIC  aus
ansprechen und auch Daten  in  PRG-Files
speichern. Dies wird  ebenso  gehandhabt
wie  mit  SEQ,  da  PRG-Files,  physisch
gesehen,  also   im   Aufbau   auf   der
Diskette, ebenso  angelegt  werden,  wie
SEQ-Files. Der Zugriff auf ein  PRG-File
ist somit haargenau  derselbe,  mit  dem
einzigen Unterschied, daß jetzt  an  den
Filenamen angehängt nicht mehr  ein  "S"
als Parameter für die  Fileart,  sondern
ein "P" für PRG steht.  Der  OPEN-Befehl
für ein PRG-File  sähe  also  folgender-
maßen aus:                              
OPEN 1,8,2,"DATEI,P,R" zum Lesen, oder  
OPEN 1,8,2,"DATEI,P,W" zum Schreiben.   
Ansonsten können Sie ebenso verfahen als
hätten Sie ein SEQ-File geöffnet.  Eines
gibt es allerdings schon noch hierzu  zu
sagen. Der OPEN-Befehl hat für PRG-Files
nämlich noch  zwei  kleine  Sonderheiten
eingebaut.  Bei   den   Sekundäradressen
hatte ich ja schon einmal angegeben, daß
die Adressen 0 und 1 jeweils  eine  Son-
derstellung einnehmen.                  
Diese lassen  sich  jetzt  sehr  einfach
erklären,  nachdem  wir  uns   mit   der
Materie  der  Betriebsart  eines   Files
schon ein wenig beschäftigt  haben.  Mit
der Sekundäradresse  0  können  Sie  der
Floppy nämlich schon gleich angeben, daß
Sie ein READ-File (also ein File aus dem
Sie lesen) öffnen möchten.              
Gleichzeitig geht diese dann auch  davon
aus, daß es sich hierbei um ein PRG-File
handelt,  Sie  können  damit  also   die
Angabe  der  File-  und  Betriebsart  im
Filenamen wegfallen lassen. Etwa ähnlich
verhält es sich mit der  Sekundäradresse
1. Sie gibt an, daß Sie Daten  schreiben
möchten, ebenfalls in ein PRG-File.     
Somit ergeben sich  dann  also  folgende
Vereinfachungen  des  OPEN-Befehls   für
PRG-Files:                              
OPEN 1,8,0,"DATEI" zum Lesen, und       
OPEN 1,8,1,"DATEI" zum Schreiben.       
Wenn Sie allerdings ein PRG-File öffnen,
um    beispielsweise    ein    richtiges
BASIC-Programm  daraus  auszulesen,  aus
welchen Gründen auch  immer,  so  werden
Sie mit INPUT# nicht viel Glück haben.  
INPUT# verläßt sich nämlich darauf,  daß
Sie vorher alle Ihre  Daten  mit  PRINT#
eingegeben haben, wobei  Sie  für  jedes
Datenelement einen eigenen PRINT#-Befehl
benutzten. PRINT# arbeitet nämlich eben-
so wie PRINT, wenn man  keinen  weiteren
Parameter hinter dem Befehl  angibt.  Es
macht einen  sogenannten  "Wagenrücklauf
mit Zeilenvorschub". Oder auch "Carriage
Return" genannt. In der Praxis wird  bei
diesem  Wagenrücklauf   nichts   anderes
getan, als daß der Cursor lediglich eine
Zeile tiefer, in die erste  Spalte  die-
ser Zeile befördert wird, und  daß  eine
weitere Ausgabe auf  dem  Bildschirm  an
dieser Stelle dann ausgeführt wird.     
Der Wagenrücklauf hat auch  einen  eige-
nen  ASCII-Code  (er   ist   eines   der
Steuerzeichen,   die   eine    besondere
Funktion  erfüllen,  wie  ich  bei   den
ASCII-Zeichen erwähnte), die 13 nämlich.
Mit einem PRINT CHR$(13)  erzwingen  Sie
also einen solchen Wagenrücklauf.       
Probieren Sie das  doch  einfach  einmal
mit folgendem Programm aus:             
10 PRINT"DAS IST ZEILE 1";CHR$(13)      
20 PRINT"DAS IST ZEILE 2"               
Sie sehen, zwischen  den  beiden  Zeilen
ist nun  eine  Leerzeile,  was  ja  ohne
CHR$(13) nicht wäre.  Der  PRINT#-Befehl
sendet nun ebenfalls ein CHR$(13) an die
Floppy,   nachdem   er    seine    Daten
übertragen   hat.   Beispielsweise   die
einzelnen      ASCII-Code-Bytes      der
Buchstaben einer String-Variable. INPUT#
erkennt nun an diesem Wagenrücklauf, daß
hier das Ende des Strings  erreicht  ist
und beendet seine Eingabe. Alle Zeichen,
die vor dem Carriage Return kamen werden
nun der  Variablen  zugeordnet,  die  am
Ende  von  INPUT#  steht,  jedoch   ohne
dabei das CHR$(13)  mit  anzuhängen.  Es
dient  also  lediglich  als  Trennmarke,
nicht aber  als  Datenelement.  Das  hat
aber  auch  einen  entscheidenden  Nach-
teil  -  sollten  Sie  einmal   in   die
Verlegenheit kommen, einen Wagenrücklauf
mitabzuspeichern, oder sollten Sie nicht
wissen, ob der  Wagenrücklauf  überhaupt
in einem File  (z.B.  ein  PRG-File  mit
einem  BASIC-Programm)   existiert,   so
sollten Sie die  Alternative  zu  INPUT#
benutzen, den Befehl GET#. Wie Sie sehen
haben wir auch hier ein Doppelkreuz, das
für Filenummer  steht,  das  Befehlswort
selbst  kann   man   etwa   mit   "Hole"
übersetzen. Der 64er soll sich also  ein
Byte von dem Kanal mit  der  Filenummer,
die  hinter  dem  "#"  angegeben   wird,
holen. Dies geschieht  wie  bei  INPUT#,
namlich folgendermaßen:                 
GET#1,A$                                
Hiermit hätten wir  der  Variablen  "A$"
jetzt ein Byte  vom  Filekanal  1  zuge-
wiesen. Dieses können wir jetzt  weiter-
verarbeiten.  Entweder  Sie   geben   es
gleich mit PRINT aus, etwa so:          
PRINT A$;                               
Oder Sie schauen sich an,  ob  wir  hier
überhaupt ein  druckbares  ASCII-Zeichen
vorliegen haben, oder ob es sich hierbei
nicht doch um ein Sonderzeichen handelt,
indem Sie sich  einfach  den  ASCII-Code
des Bytes ausgeben lassen. Etwa so:     
A=ASC(A$)                               
IF A=13 THEN PRINT "DAS IST EIN CARRIAGE
RETURN."                                
IF A=19 THEN PRINT "DAS IST DAS         
'HOME'-ZEICHEN."                        
oder einfach :                          
PRINT ASC(A$)                           
Allerdings gibt es hier noch ein kleines
Problem. Da  wir  ja  ein  sequentielles
File auslesen und bei  diesem  ein  Byte
nach dem anderen folgt, wird mit ziemli-
cher Sicherheit auch  irgendwann  einmal
das letzte Byte über den Kanal gewandert
kommen und  anschließend  ist  dann  nix
mehr los mit  Bytes  auslesen.  Trotzdem
aber   holt   sich   GET#   immer   noch
irgendwelche nicht existenten Bytes  vom
Kanal  und  übergibt  diese   an   unser
Programm, was  ja  nun  nicht  unbedingt
sein  soll.   Hier   hilft   dann   eine
Sondervariable des  64ers.  Ich  spreche
von  der  Statusvariablen  "ST".  Diesen
Variablennamen  dürfen  Sie   in   Ihren
Programmen  übrigens  NIE  benutzen,  da
diese  Variable  halt   für   den   eben
genannten Zweck  reserviert  ist.  BASIC
stellt in dieser Variablen nämlich immer
den sogenannten  Status  des  Disketten-
kanals bereit. Wie Sie  sehen  ist  "ST"
ja  eine   numerische   Variable,   also
liefert sie einen Zahlenwert zurück.    
Sollten Sie nun bei  einer  Abfrage  von
ST einmal feststellen, daß Sie den  Wert
64 beinhaltet, so sind Sie am Ende eines
Diskettenfiles angelangt.               
Bei allen anderen Zahlen ist dies nicht 
der Fall. Das Durchlesen eines Files    
sähe also so aus:                       
10 OPEN 1,8,0,"PROGRAMM"                
20 GET#1,A$                             
30 PRINT A$                             
40 IF ST<>64 THEN 100                   
50 CLOSE 1                              
"ST" dürfen Sie natürlich auch benutzen,
wenn Sie mit INPUT# auslesen. Dies  wäre
sogar nur  sinnvoll  und  wünschenswert,
wenn Sie flexibel arbeiten möchten.     
Aus Platzmagel muß ich  nun  leider  die
heutige Folge dieses Kurses abschließen.
Nächsten Monat werden wir dann mit einem
neuen  Hauptprogramm  hier  in  der   MD
aufwarten können, durch das  ich  wieder
mehr Platz haben werde ihnen die Sprache
BASIC näherzubringen. Ich werde nächsten
Monat dann das Thema Floppy  noch  been-
den und  Sie  über  die  noch  fehlenden
Befehle von BASIC V2.0  aufklären.  Dann
müßten wir eigentlich  mit  allem  durch
sein, und Sie sollten das  Grundzeug  zu
einem guten  BASIC-Programmierer  besit-
zen. Doch noch sind wir  nicht  ganz  so
weit,  deshalb  verabschiede  ich   mich
jetzt bis nächsten Monat, Ihr           
                            Uli Basters.



Valid HTML 4.0 Transitional Valid CSS!