Memory Map mit Wandervorschlägen (11)
Bei unserer Wanderung durch die Speicherlandschaft treffen wir heute auf die Speicherstellen 183 bis 199. Sie sind unter anderem auch für die Filenummer, Geräteadressen und Sekundär-Adresse verantwortlich.
Gelegentlich erwähne ich bei meinen Erklärungen, daß wichtige Dinge der Commodore-Computer nicht in den Handbüchern stehen.
Kürzlich erhielt ich zu diesem Thema den Brief eines Lesers, der mich darauf hinwies, daß entgegen meiner Behauptung die meisten der von mir vermißten Erklärungen in einem Handbuch, nämlich im »64 Intern« von Data Becker zu finden sind. Natürlich hat dieser Leser recht: In diesem Buch steht in der Tat sehr viel Informatives. Ich benutze es selbst oft und kann es den fortgeschrittenen Computer-Amateuren sehr empfehlen.
Nur, lieber Leser, ich halte es nicht für ein Handbuch, sondern für Fachliteratur. Wenn ich Handbuch sage, dann meine ich die von Commodore offiziell herausgegebenen Schriften — für Anfänger und Amateure. Und diese Gattung könnte wirklich etwas ergiebiger sein.
Adresse 183 ($B7)
Länge des derzeitigen Filenames
Die LOAD-, SAVE- und VERIFY-Befehle für Disketten verlangen die Angabe eines Programm- oder Dateinamens, auf Computerdeutsch »File-Name«. Nähere Angaben dazu finden Sie im Texteinschub # 1 »Files-Geräte-Namen-Nummern«.
Auch der OPEN-Befehl kann einen File-Name haben. Bei Kassettenoperationen kann der File-Name weggelassen werden.
In der Speicherzelle 183 steht während und nach der Verwendung eines der oben genannten Befehle eine Zahl, die angibt, aus wievielen Zeichen der File-Name besteht.
Bei Disketten sind File-Namen möglich, die aus maximal 16 Zeichen bestehen.
Bei Kassetten dagegen sind Namenslängen von maximal 187 Zeichen erlaubt. Allerdings werden vom Computer auf dem Bildschirm nur 16 Zeichen ausgedruckt (siehe dazu den Texteinschub »Tape-Header«).
Für die Längenangabe in Zelle 183 gilt dabei nur die Anzahl derjenigen Zeichen, die zwischen den Gänsefüßchen stehen.
Diese Zahl kann nach einer Ein-/Ausgabeoperation, auch nach einer ungültigen oder abgebrochenen, durch PEEK (183) ausgelesen werden.
Ein File-Name wird übrigens auch bei einem OPEN-Befehl der RS232-Schnittstelle angegeben. Dieser Name, der bis zu vier Zeichen lang sein kann, wird in die Speicherzellen 659 bis 662 übertragen und gibt dort die Übertragungsrate, Wortlänge und Parity-Prüfung an.
Adresse 184 ($B8)
Nummer der derzeitigen Datei (File)
Hinter jedem OPEN-Befehl steht eine Zahl, die der durch diesen Befehl angefangenen Datei zugeordnet wird. Diese Datei- oder File-Nummer gilt als Referenz für alle anderen Ein- und Ausgabebefehle derselben Datei. Nähere Angaben dazu können Sie dem nebenstehenden Texteinschub Nr. 1 »Files-Geräte-Namen-Nummern« entnehmen.
Ein OPEN-Befehl ruft die entsprechende Routine des Betriebssystems auf, welche die File-Nummer in die Speicherzelle 184 schreibt. Vor dort kann sie mit PEEK(184) ausgelesen werden. Geben Sie die folgende Zeile direkt ein:
A = 30:OPEN A,3:PRINT PEEK (184):CLOSE A
Um verschiedene File-Nummern auszuprobieren, definieren wir sie als Variable A. Nach dem »A« des OPEN-Befehls steht die Zahl 3. Damit wird der Bildschirm angewählt (siehe »Sekundär-Adresse« im schon erwähnten Texteinschub). Das Anwählen des Bildschirms vermeidet eine störende Meldung des Betriebssystems.
Mit RETURN nach der obenstehenden Zeile wird der jeweilige Wert von A als Inhalt der Zelle 184 ausgedruckt.
Adresse 185 ($B9)
Derzeitige Sekundär-Adresse
Die Sekundär-Adresse steht als dritte Angabe hinter den Ein- und Ausgabe-Befehlen LOAD, SAVE, VERIFY und OPEN. Sie hat bei den verschiedenen Peripheriegeräten spezielle Funktionen. Diese Funktionen sind im nebenstehenden Texteinschub näher erläutert.
Der jeweilige Wert der Sekundär-Adresse steht in der Speicherzelle 185, allerdings um 96 erhöht. Für Sekundär-Adressen stehen, über die Standardwerte der einzelnen Peripheriegeräte hinaus, die Zahlen von 0 bis 31 zur Verfügung. Ab 32 fängt in Zelle 185 wieder der Zyklus ab 0 an. Das können wir uns anschauen. Ich wähle zur Eröffnung einer Datei wieder den Bildschirm als »nichtstörendes« Empfangsgerät.
A = 15:OPEN 1,3,A:PRINT PEEK(185)-96:CLOSE 1
Durch Verändern des Wertes von A können Sie alle Möglichkeiten durchspielen.
Adresse 186 ($BA)
Derzeitige Geräte-Nummer
Jedes an den Computer anschließbare Gerät hat eine eigene Nummer, die zusammen mit den Ein-/Ausgabe-Befehlen LOAD, SAVE, VERIFY und OPEN angegeben werden muß. Wird keine Nummer angegeben, nimmt der Computer automatisch an, daß die Datasette gemeint ist.
Alle von Commodore vorgegebenen Geräte-Nummern sind in der folgenden Tabelle aufgelistet.
Geräte-Nummer | angesprochenes Gerät |
0 | Tastatur |
1 | Datasette |
2 | RS232- (User-Port) Schnittstelle |
3 | Bildschirm |
4 | Drucker (normal) |
5 | Drucker (zusätzlich) |
8 | Disketten-Laufwerk Nr. 0 |
9 | Disketten-Laufwerk Nr. 1 |
10, 11 | weitere Disketten-Laufwerke |
Die normale Geräte-Nummer eines Druckers ist 4, die eines Disketten-Laufwerks 8. Die zusätzlichen Nummern müssen gesondert am betreffenden Gerät eingestellt werden.
Nach der Ausführung eines der oben genannten Befehle steht die entsprechende Geräte-Nummer in der Speicherzelle 186, aus der sie mit PEEK(186) ausgelesen werden kann.
Adresse 187 bis 188 ($BB bis $BC)
Zeiger auf Adresse des derzeitigen File-Namens
Die Bedeutung eines Programm- oder Dateinamens — normalerweise kurz »Files-Name« genannt, sind im nebenstehenden Texteinschub »File-Geräte-Namen-Nummern« näher beschrieben. In den Speicherzellen 187/188 steht in der Low/High-Byte-Darstellung ein Zeiger auf diejenige Adresse im Programm-Speicher, wo dieser Name gespeichert ist.
Eine Ausnahme ist hier der OPEN-Befehl der RS232-Schnittstelle. Ihr File-Name wird in die Speicherzellen 659 bis 662 gebracht, wo er verschiedene Parameter dieser Schnittstelle steuert.
Adresse 189 ($BD)
Zwischenspeicher für RS232-Parity-Prüfung und für Kassettenoperationen
Die RS232-Routinen benutzen diese Speicherzellen als Zwischenspeicher für ein Prüf-Byte (Parity-Prüfung) bei der Ausgabe. Die Parity-Prüfung habe ich kurz im letzten Heft im neunten Teil des Kurses erklärt.
Auch die Kassetten-Routinen bedienen sich dieser Speicherzelle. Sie verwenden sie als Zwischenspeicher für das gerade gesendete oder empfangene Zeichen.
Adresse 190 ($BE)
Blockzähler für Kassetten-Ein-/Ausgabe
Das Betriebssystem des Computers schreibt bei SAVE ein Programm zweimal auf das Band der Datasette. Beim LOAD-Befehl wird der erste Block in den Arbeitsspeicher des Computers geladen; der zweite — identische — Block wird dann mit dem ersten Block Byte für Byte verglichen, um Datenfehler auf dem nicht immer ganz zuverlässigen Bandmaterial zu erkennen.
In der Speicherzelle 190 wird dem Betriebssystem angezeigt, wieviele Blockteile bei diesem Prozeß noch gelesen oder gespeichert werden müssen. Vom Basic-Programm aus ist diese Speicherzelle nicht zugänglich.
Adresse 191 ($BF)
Zwischenspeicher für LOAD-Operationen vom Band
Diese Speicherzelle wird beim Laden eines Programms vom Band dazu benutzt, um Zeichen aus einzelnen Bits zusammenzusetzen.
Adresse 192 ($C0)
Motorsperre der Datasette
Die Tasten der Datasette werden sechzigmal in der Sekunde von der »Interrupt-Routine« des Betriebssystem überprüft, ob eine von ihnen gedrückt worden ist. Die Speicherzelle 192 spielt dabei eine entscheidende Rolle, beim C 64 allerdings in einer anderen Weise als beim VC 20. Wie sie diese Rolle beim C 64 spielt, ist im Zusammenhang mit der Speicherstelle 1 ganz am Anfang dieses Kurses beschrieben worden (siehe 64’er-Ausgabe, 11/84, Seite 173). Ich habe dabei in zwei Beispielen gezeigt, wie durch Abfrage des vierten Bits von Adresse 1 geprüft werden kann, ob eine Taste der Datasette gedrückt ist und wie der Motor durch Setzen und Löschen des Bit 5 der Zelle 1 ein- und ausgeschaltet werden kann. Vorausgesetzt, der Inhalt der Speicherzelle 192 ist ungleich Null und eine Taste der Datasette ist gedrückt.
Heute will ich, wie damals versprochen, denselben Vorgang für den VC 20 beschreiben.
Wie Sie sich vielleicht noch erinnern, wird die Speicherzelle 1 beim VC 20 nicht für die Steuerung der Ein- und Ausgänge des Mikroprozessors verwendet. Diese Rolle wird beim VC 20 durch zwei Register des »Versatile Interface Adapter« (VIA 6522-A) ausgefüllt.
Für die Abfrage der Datasetten-Tasten ist das sechste Bit des VIA-Registers 37151 zuständig. Bei gedrückter Taste steht es auf 1, sonst auf 0. Ein kleines Programm zeigt es Ihnen:
10 X = PEEK(37151)
20 PRINT X
30 IF X = 62 THEN 50
40 GOTO 10
50 PRINT”TASTE GEDRÜCKT”
Wenn keine Taste gedrückt ist, läuft ein Zahlenband mit 126 ab. Die entsprechende Darstellung als Dualzahl lautet 1111 1110. Bei einer gedrückten Taste steht in 37151 die Zahl 62, als Dualzahl 0011 110. Wichtig, wie gesagt ist nur das zweithöchste Bit.
Mit der Abfrage der Zeile 30 springt beim Drücken einer Taste das Programm auf die Zeile 50 und druckt den Text aus.
Den Motor der Datasette können wir mit Hilfe des Registers 37184 schalten. Wie beim C 64 gilt auch jetzt, daß dazu die hier angesprochene Speicherzelle 192, auch Interlock-Register genannt, eine Zahl größer als 0 enthält und daß außerdem eine Taste der Datasette gedrückt ist. Drücken Sie auf PLAY und geben Sie direkt ein:
POKE 192,255
POKE 37148,251: der Motor bleibt stehen.
POKE 37148,252: der Motor läuft los.
Bestimmend sind hier Bit 2, 3 und 4.
Zum Ausschalten muß lediglich Bit 2 auf 1 stehen, zum Einschalten die drei Bits auf 110. Jede Zahl, die als Dualzahl diese Bedingungen erfüllt, kann dafür hergenommen werden. Um unabhängig von den anderen Bits des Registers 37148 zu bleiben, die ja auch ganz bestimmte andere Funktionen haben, empfiehlt es sich, über Boole’sche Verknüpfungen nur die wichtigen drei Bits zu verändern. Die beiden POKE-Befehle sehen dann so aus:
Ausschalten: POKE 37148,PEEK (37148) OR 2
Einschalten: POKE 37148,PEEK (37148) AND 12
Adresse 193 bis 194 ($C1 bis $C2)
Anfangsadresse für Ein-/Ausgabe-Operationen
In diesen Speicherzellen steht in Low/High-Byte-Darstellung die Adresse, ab der ein Programm gerade geladen oder gespeichert wird. Dieses Adresse wird übrigens von hier auch in die Speicherzellen 172/173 gebracht, die wir schon früher besprochen haben.
Bei LOAD und SAVE auf Band steht hier die Anfangsadresse des Bandpuffers (828). Im Bandpuffer steht allerdings nur der sogenannte Bandvorspann (auf englisch »Tape Header«), während der Hauptteil des Programms im Programmspeicher ab einer Adresse steht, auf die der Zeiger in den Speicherzellen 195/196 hinweist.
Adresse 195 bis 196 ($C3 bis $C4)
Zeiger auf den Anfang des Programms hinter dem Tape Header
Bei jedem LOAD- und SAVE-Befehl für Kassetten wird der Vorspann (Tape Header), in dem Programmtyp, Anfangs- und Endadresse aufgezeichnet sind, im Kassettenpuffer ab Adresse 828 gespeichert. Der eigentliche Teil des Programms steht dann im Programmspeicher.
In den Speicherzellen 195/196 steht in der Low-High-Byte-Darstellung diese Adresse, ab der das Programm beginnt. Ich habe für alle diejenigen, die mit der Datasette arbeiten, im nebenstehenden Texteinschub # 2 »Tape-Header« die Zusammenhänge mit einem Beispiel dargestellt.
Adresse 197 ($C5)
Tasten-Code der zuletzt gedrückten Taste
In Ausgabe 6/85 des 64’er auf Seite 123 habe ich Ihnen mit Wort und Bild beschrieben, wie die Tasten des Computers abgefragt werden. Die dabei für jede Taste entstehende Dualzahl wird in eine Dezimalzahl (0 bis 63) umgewandelt und zuerst in die Speicherzellen 203 beziehungsweise 653 gebracht. Zur Umwandlung und Abfrage der Zellen 203 und 653 bringe ich das nächste Mal mehr Details. Nach der Prüfung, welche Taste gedrückt worden ist, wird die Codezahl von 203 in die Speicherzelle 197 gebracht und dort »aufgehoben«. Diese vermeintliche Verdoppelung wird vom Betriebssystem dafür gebraucht, um zu erkennen, ob die nächste gedrückte Taste mit der vorhergehenden identisch ist. Ist sie identisch, dann entscheidet der Inhalt der Speicherzelle 650, ob das Zeichen dieser Taste mehrfach ausgedruckt wird. In 650 steht die sogenannte Wiederholfunktion. Aber ich will nicht vorgreifen. Die Codezahlen der einzelnen Tasten werde ich bei der Besprechung der Zelle 203 auflisten.
Adresse 198 ($C6)
Anzahl der Zeichen im Tastaturpuffer
Die Funktion des Tastaturpuffers, zu dem wir bei den Speicherzellen 631 und 640 noch kommen werden, habe ich bereits in diesem Kurs und zwar in Ausgabe 7/85 auf Seite 141/142 im Texteinschub »Dynamische Tastenabfrage« erklärt. Dabei habe ich damals schon sozusagen im Vorgriff die Zelle 198 verwendet.
In dieser Speicherzelle steht die jeweilige Anzahl der Zeichen, die im Tastaturpuffer gespeichert sind und darauf warten, weiterverarbeitet zu werden.
Das folgende kleine Programm zeigt es.
10 GET A$
20 PRINT PEEK (198);A$ 30 FORJ=1 3000:NEXTJ
40 GOTO 10
Der GET-Befehl holt ein Zeichen aus dem Tastaturpuffer — sofern eines dort zu finden ist. Die Zeile 20 druckt die Anzahl der Zeichen im Puffer aus, daneben das erste dieser Zeichen. Dann folgt eine Warteschleife, die uns erlaubt, ganz schnell ein paar Tasten zu drücken. Danach springt das Programm an den Anfang zurück und arbeitet diese eingegebenen Zeichen ab. Es ist dabei deutlich zu sehen, wie durch den GET-Befehl bereits ein Zeichen aus dem Puffer genommen und dadurch der Inhalt der Zelle 198 sofort um 1 reduziert wird.
Der Inhalt der Speicherzelle 198 kann mit POKE auch verändert werden.
Eine sinnvolle Anwendung dieser Beeinflussung erlaubt der nicht gerade sehr populäre WAIT-Befehl.
Ersetzen Sie bitte im obigen Programm die Warteschleife der Zeile 30 durch:
30 POKE 198,0: WAIT 198,1
Zuerst wird dem Computer vorgegaukelt, daß der Tastaturpuffer leer sei. Durch den WAIT-Befehl wartet das Programm danach so lange, bis ein Zeichen im Tastaturpuffer erscheint und springt erst dann auf die nächste Zeile 40.
Wenn Sie nach dem WAIT-Befehl statt der 1 eine 2 eingeben, wartet diese Zeile entsprechend auf zwei Tasteneingaben. Allerdings wird in der Zeile 20 dann nur jedes zweite Zeichen ausgedruckt.
Adresse 199 ($C7)
Flagge für inverse Darstellung der Zeichen
Mit dieser nützlichen Adresse fahren wir das nächste Mal fort.
(Dr. H. Hauck/ah)