Seite(n) für Einsteiger
von Günter Böhm
Diesmal auf dieser Seite etwas über BASIC. Dennoch bleiben wir auf der
Maschinenebene; denn auf Leserwunsch sollen wir einmal etwas über PEEK,
POKE, DEEK und DOKE schreiben, Diese Befehle gestatten es, direkt in
den Speicher "einzusteigen", und so könnte dieser Artikel
sowohl für BASIC als auch für Assembler Interessierte nützlich sein.
Mit dem Befehl PEEK(x),der auch auf anderen Rechnern üblich ist, kann
man eine Adresse auf ihren Inhalt untersuchen. Mit PRINTPEEK(x) können
Sie den Inhalt der Adresse ausgeben lassen. Man muß nur darauf achten,
daß die Adressen im Hex-System "geladen" sind, die Ausgabe
aber dezimal erfolgt. Da kann man sich keine Umrechnerei ersparen.
Interessanter als PEEK ist der POKE-Befehl. Damit kann man den Inhalt
von Adressen ändern und somit direkt in Maschinenprogramme eingreifen.
Wir wollen zur Anschauung einmal die Blinkgeschwindigkeit des Cursors
ändern, die ja vom Betriebssystem (in meinem Fall NASSYS3), also auf
Maschinenebene gesteuert wird. Dazu schauen Sie zunächst einmal nach,
welche Werte die verantwortlichen Adressen normalerweise enthalten. Mit
PEEK(3122), das ist die Adresse des niederwertigen Bytes, und
PEEK(3123), der Adresse des höherwertigen Bytes, erhalten Sie die
entsprechenden Werte (PRINT nicht vergessen!). Setzen Sie das MSB (Most
Significant Byte=höherwertiges B.) nun durch POKE3123,0 auf Null, und
geben Sie in die Adresse des LSB (Least Significant Byte) verschiedene
Werte. PEEK und POKE müssen nicht in ein Programm eingebunden werden,
sie arbeiten auch als Kommandos direkt vom Keyboard (Entschuldigung,
Herr Bach: von der Tastatur!).
Die Befehle DEEK und DOKE sind eine
Besonderheit des NASCOM. Sie bewirken das gleiche wie ihre kleineren
Brüder, nur kann man hiermit zwei aneinanderhängende Adressen
versorgen; d.h. mit DEEK werden zwei Bytes gelesen, mit DOKE zwei Bytes
geladen. Man muß darauf achten, daß die "Doppelbytes" in
umgekehrter Reihenfolge im Speicher liegen (LSB und dann MSB). Der
Hex-Wert 0C80 liegt also als 80 0C im Speicher. Letzterer Wert muß zum
Umrechnen in eine Dezimalzahl ver-
| |
wendet werden. Ergibt sich dabei eine Zahl größer als 32767, so muß
diese von 65536 subtrahiert und als negative 7ahl verwendet werden.
Unser Beispiel ergibt also 3200 dez. (sehr häufig verwendet als Start
eines Maschinenprogramms, da es die erste verfügbare Adresse für den
NASCOM-Benutzer ist). Die Adresse C8D7hex ergibt 51415 und muß als
-14121 eingegeben werden.
Die DEEK und DOKE Befehle haben den Vorteil,
in den BASIC Zeilen Platz zu sparen. Der Nachteil ist die schwierigere
Umrechnung von dez in hex und umgekehrt (das DOKE-Programm von Reinhard
Zickwolf,
Journal 10-81
hilft dabei) und der Aufwand, Programme mit
diesen Befehlen für andere Rechner umzuschreiben. Ich werde in Zukunft
auf das Bißchen Platzersparnis verzichten und nur noch mit PEEK und
POKE arbeiten. Viele Besitzer anderer Rechner als NASCOM werden Ihnen
dankbar sein, wenn Sie auch "durchsichtiger" programmieren!!
Unser Beispiel mit der Blinkgeschwindigkeit ließe sich natürlich mit
DOKE3122,X verkürzen, aber....
Falls Sie Maschinenprogramme des Betriebssystems aufrufen wollen,
schaden die DEEKs und DOKEs allerdings nichts, denn zu diesen Routinen
haben "Fremdbenutzer" sowieso keinen Zugang. Schreiben Sie
aber dann in der Dokumentation oder in REM Anweisungen genau dazu, was
die BASIC Zeilen bezwecken, denn eine Rechnereigene Adresse ist für
einen Besitzer eines anderen Systems selbstverständlich niemals zu
identifizieren.
Hier nun einige Adressen, die zum POKEN interessant
sein könnten:
| Bildschirmbeginn links oben | 2058 |
| Bildschirmende rechts unten | 3001 |
| Beginn der Titelzeile | 3018 |
| Ende der Titelzeile | 3065 |
| (eine Position in gleicher Spalte eine Zeile
tiefer wird jeweils durch +64 ermittelt) |
| Cursorposition | 3113 |
| Tastendruck Verzögerung | 3118 |
| Repeatgeschwindigkeit | 3120 |
| Cursor Blinkgeschwindigkeit | 3122 |
| $UOUT(Adresse der Ausgabe) | 3191 |
| SRLX (Out über Serial Port) | 91 |
| |
| MTFLP (Drive LED ein/aus) | 81 |
| Get Input (BIN) | 105 |
| BLINK until Input | 120 |
| Get a Line (INLIN) | 752 |
|