C 64
Tips & Tricks

POKEs, die Sie kennen sollten

Welcher C 64-Benutzer hat sich noch nicht mit dem Basic seines Computers herumgeärgert? Viele Programmierlösungen sind nur über PEEK und POKE möglich. Die folgende Liste der wichtigsten PEEKs und POKEs soll Ihnen behilflich sein.

Teilweiser Nachdruck aus 64'er 10/84, S. 91 (nur die 28 Adressen der ursprünglichen Tabelle; Hex-Spalte und 41 weitere Adressen sind für dieses Sonderheft ergänzt).

Hex Dezimal Beschreibung
1 1 Inhalt 55 = normal
Inhalt 54 = Basic ausgeschaltet (auf RAM umgestellt)
Inhalt 53 = Basic und Kernal auf RAM umgestellt.
(Es empfiehlt sich dabei, das Basic und das Kernel vorher ins RAM zu POKEn, damit der Computer bei der Umschaltung nicht aussteigt.)
A 10 Ist PEEK (10) = 0, so war der letzte Befehl LOAD. Ergibt PEEK (10) eine 1, ist VERIFY eingegeben worden.
11 17 Mit diesem PEEK läßt sich abfragen, wie die letzte Variable zugewiesen wurde. Ist PEEK (17) = 00, dann war die letzte Variablenzuweisung ein INPUT, oder es hat noch keine Zuweisung stattgefunden.
Ist PEEK (17) = 64, dann wurde die letzte Variable durch GET geholt.
Bei PEEK (17) = 152 erfolgte die letzte Variablenübergabe durch einen READ-Befehl.
13 19 Durch POKE 19,64 wird beim nächsten INPUT-Befehl kein Fragezeichen mehr ausgegeben. Allerdings kann man nachher durch Drücken der RETURN-Taste nicht mehr in die nächste Zeile gelangen. Es empfiehlt sich daher, nach dem INPUT-Befehl diesen Befehl wieder mit POKE 19,0 rückgängig zu machen.
18 24 Mit POKE 24,0 wird FORMULAR TOO COMPLEX ERROR aufgehoben.
2B/2C 43/44 Der Anfang des zur Zeit im Speicher befindlichen Basic-Programms errechnet sich durch PEEK (43)+PEEK (44)*256.
2D/2E 45/46 Das Ende des Basic-Programms erhält man durch PEEK (45)+PEEK (46)*256.
37/38 55/56 Mit PEEK (55)+256*PEEK (56) kann das Ende des Basic-RAMs abgerufen werden.
39/3A 57/58 Die Zeilennummer, bei der nach einer Programmunterbrechung gestoppt wurde, errechnet sich durch PEEK (57)+256*PEEK (58).
3D/3E 61/62 Zeiger auf Basic-Statement für CONT:
Durch PEEK (61)+PEEK (62)*256 erhält man die Speicherstelle, die nach dem zuletzt ausgeführten Basic-Befehl liegt, das heißt die Speicherstelle, von der sich der Basic-Interpreter bei CONT den nächsten Befehl holt.
Tip: Bei CONT kommt öfter CAN'T CONTINUE ERROR vor, wenn man nach dem Stoppen ein CLR eingegeben oder in irgendeiner Programmzeile etwas geändert hat. Liest man die Werte mit PEEK (61) und PEEK (62) nach der Unterbrechung aus, dann macht ein CLR oder ähnliches nichts aus, wenn man vor CONT die zuvor ausgelesenen Werte wieder in die Speicherstellen POKEt.
3F/40 63/64 Nummer der aktuellen DATA-Zeile:
Mit PEEK (63)+PEEK (64)*256 erhält man die Nummer der DATA-Zeile, aus der gerade das letzte Datum geholt wurde. (Gut zum Finden von Fehlern in DATA-Zeilen geeignet.)
45/46 69/70 Zuletzt zugewiesene Variable:
Bei normalen Fließkommavariablen liest man den Wert mit PRINT CHR$(PEEK (69))+CHR$(PEEK (70)) aus.
Bei Integervariablen (zum Beispiel XY%) erhält man den Namen durch PRINT CHR$(PEEK (69)-128)+CHR$ (PEEK (70)-128).
Strings (zum Beispiel VX$) erhält man durch PRINT CHR$(PEEK(69))+CHR$(PEEK (70)-128).
78 120 Nach Ausführung dieses POKEs nimmt der C 64 keinerlei Befehle mehr an: POKE 120,2
90 144 Statusbyte: Mit PRINT ST läßt sich das Statusbyte abfragen.
91 145 Nach WAIT 145,16,16 wartet der Computer auf den Feuerknopf von Joystick 1.
93 147 Wenn man die LOAD-Routine im Betriebssystem anspringt, holt es sich aus der Speicherstelle 147 die Information, ob LOAD oder VERIFY durchgeführt wird.
Inhalt 0 = LOAD
Inhalt 4 = VERIFY
9D 157 Ausgabe-Kontrolle:
Inhalt 000 = Progamm-Modus
Inhalt 128 = Direktmodus
Damit bei LOAD-Befehlen vom Programm aus die Mitteilungen SEARCHING, LOADING oder VERIFYING auf dem Bildschirm erscheinen, setzt man vor dem LOAD- VERIFY- oder SAVE-Befehl ein POKE157,128.
B6 182 PEEK (182) ruft die Anzahl der Zeichenlesefehler ab.
B7 183 PEEK (183) gibt die Länge des Filenamens an.
B8 184 Die laufende Filenummer kann mit PEEK (184) abgerufen werden.
B9 185 Die aktuelle Sekundäradresse kann mit PEEK (185) angegeben werden.
BA 186 Die derzeitige Gerätenummer wird durch PEEK (186) abgerufen.
C5 197 Derzeitiger Tastendruck: PEEK (197)
C6 198 Nach WAIT 198,1 wartet der Computer auf eine gedrückte Taste.
C7 199 RVS Flag: eine reverse Zeichenausgabe bei PRINT erfolgt nach POKE 199,1. POKE 199,0 hebt den RVS-Modus auf.
C8 200 Zeiger auf Zeilenende. PEEK (200) gibt an, wieviel Zeichen die zuletzt eingegebene Zeile hatte.
C9/CA 201/202 PEEK (201) gibt die Zeile der aktuellen Cursorposition an, während PEEK (202) die Spalte abruft.
CB 203 Die derzeitig gedrückte Taste im CHR$-Modus kann mit PEEK (203) abgefragt werden. Ist keine Taste gedrückt, so steht der Wert 64 in diesem Byte.
CC 204 Nach POKE 204,0 bleibt der Cursor an, auch bei GET-Befehlen. Mit POKE 207,0 : POKE 204,1 kommt man dann wieder auf den Normalzustand zurück.
D3 211 POKE 211,Wert setzt die Spalte der Cursorposition. Werte von 0 bis 39 können eingegeben werden. Siehe auch 214.
D5 213 Länge der momentanen Bildschirmzeile: über PEEK (212) läßt sie sich abfragen.
D6 214 POKE 214,Wert setzt die Zeile der Cursorposition. Die Werte 0-24 können eingegeben werden. Nach SYS 58640 erscheint der Cursor auf der entsprechenden Position.
D7 215 Das zuletzt eingegebene Zeichen im ASCII-Code liest man mit PEEK (215) aus.
277-280 631-640 Tastaturpuffer (ASCII-Code): Über den POKE-Befehl lassen sich beispielsweise Zeichen in den Tastaturpuffer eingeben.
281-284 641-644 Start- und Endadresse des Basic-RAMs: Durch Ändern dieser Werte kann man die Größe des Basic-RAMs verändern, zum Beispiel:
POKE 643,0 : POKE 644,128 : SYS 64764 setzt das Ende des Basic-RAMs um 8 KByte nach unten. Anderes Beispiel: POKE 641,0 : POKE 642,16 : SYS 64764 setzt das Basic-RAM um 2 KByte nach oben.
286 646 POKE 646,Farbwert setzt die Cursorfarbe.
287 647 Farbe unter dem Cursor: Mit den Werten 0 bis 15 werden die jeweiligen Farben gePOKEt.
289 649 Länge des Tastaturpuffers: Nach POKE 649,0 wird die gedrückte Taste nicht mehr auf den Bildschirm ausgegeben. Die maximale Größe des Tastaturpuffers beträgt 10.
28C 652 Zähler für REPEAT-Verzögerung: Alle eingePOKEten Werte verzögern die Repeat-Funktion. Höherer Wert = größere Verzögerung.
28D 653 PEEK für Shift-, Commodore- und für CTRL-Taste:
Bit 0 = Shift-Taste, Bit 1 = Commodore-Taste und Bit 2 = Control-Taste.
291 657 Nach POKE 657,128 ist eine Umschaltung Groß-/Kleinschrift von der Tastatur her unmöglich. POKE 657,0 erzeugt wieder den Normalzustand.
302 770 Durch EinPOKEn eines beliebigen Wertes erfolgt die READY-Ausgabe unendlich oft, nur noch Ausschalten hilft.
307 775 POKE 775,Wert aktiviert einen Listschutz. Nur über den Wert 167 kann der Listschutz aufgehoben werden.
308 776 Der Befehl POKE 776,1 zerstört das Programm.
309 777 Nach POKE 777,1 wird kein Befehl mehr ausgeführt. Der Cursor befindet sich in der linken Ecke.
30D/30E 781/782 Startadresse, ab der ein Programm geladen wird: Durch entsprechende POKE-Werte kann ein Basic-Programm in einen anderen Speicherbereich geladen werden.
310/311 784/785 USR-Vektor: Erfolgt der Einsprung in ein Maschinenprogramm über den USR-Befehl, so muß die Einsprungadresse vorher in diese beiden Byte gePOKEt werden.
314/315 788/789 IRQ, Hardware-Interrupt: Das Betriebssystem springt ständig in diese Routine, durch Ändern des Inhalts kann man eigene, »interruptgesteuerte« Maschinenroutinen ständig laufen lassen.
POKE 788,49 hebt die Wirkung der Stop-Taste auf. POKE 788,52 schaltet sie wieder ein.
318/319 792/793 Restore-Vektor: PEEK (792)+PEEK (793)*256 ergibt die Speicherstelle, an die bei Restore-Tastendruck gesprungen wird.
Beispiel: Bei POKE 792,226 : POKE 793,252 wird beim Drücken der Restore-Taste ein Reset ausgelöst.
321/322 801/802 Durch die Kombination POKE 801,0 : POKE 802,0 : POKE 818,165 wird ein SAVE-Schutz aktiviert.
328 808 POKE 808,225 hebt die Stop-Taste auf, POKE 808,237 reaktiviert sie.
32D 813 Nach POKE 813,2 läßt sich ein Programm nicht mehr ändern.
332/333 818/819 Folgende Kombinationen bewirken ebenfalls einen SAVE-Schutz:
1. POKE 818,116 : POKE 819,196
2. POKE 818,34 : POKE 819,253
33C-3FB 828-1019 Kassettenpuffer: Nach LOAD oder VERIFY stehen im Kassettenpuffer folgende Informationen:
828: 1 = normales File, 3 = wurde mit SAVE"Name",1,1 abgespeichert. Solche Programme werden bei LOAD automatisch ab der Adresse geladen, von der sie abgespeichert wurden.
829/830: Hier ist die Startadresse des Programms abgelegt (829 ist das Low-Byte, 830 das High-Byte).
831/832: Endadresse des Programms.
833-1019: 186 Zeichen langer Programmname (auf dem Bildschirm werden nur 16 angezeigt, aber es lassen sich bis 186 Stellen lange Programmnamen abspeichern). Der Kassettenpuffer ist auch gut zum Ablegen eigener Maschinenprogramme geeignet, sofern mit der Floppy gearbeitet wird.
9006 36870 PEEK (36870) liest die Horizontal-Position des Lichtgriffels.
9007 36871 PEEK (36871) liest die Vertikal-Position des Lichtgriffels.
42291 Koppeladressen angleichen: Falls Programme mit NEW gelöscht wurden, kann man mit diesem SYS-Befehl die Byte 2049 und 2050 wieder in Ordnung bringen, wenn vorher etwas anderes als 0 in diese Speicherzellen gePOKEt wird.
DO16 53270 VIC-Control-Register: Ein horizontales Softscrolling kann gePOKEt werden.
POKE 53270,0 = scrollen nach links
POKE 53270,1 = scrollen nach rechts
DO20 53280 POKE 53280,Wert setzt die Rahmenfarbe des Bildschirms.
DO21 53281 POKE 53281,Wert setzt die Hintergrundfarbe auf dem Bildschirm.
DC00 56320 Joystick Port 2:
WAIT 56320,16,16 wartet auf Feuerknopf
WAIT 56320,4,4 wartet auf Linksbewegung des Joysticks
WAIT 56320,1,1 wartet auf Joystick nach oben
WAIT 56320,2,2 wartet auf Joystick nach unten
WAIT 56320,8,8 wartet auf Joystick nach rechts
DC01 56321 Wie 56320, aber Joystick in Port 1.
DC05 56325 Die Blinksequenz des Cursors kann in diesem Byte bestimmt werden. Höherer Wert=langsamere Blinksequenz. Mit POKE 56325,58 wird die normale Blinksequenz festgelegt.
DC90 56464 Nach WAIT 56464,16,16 wartet der Computer auf den Feuerknopf des Joysticks 2.
DD00 56576 Mit PEEK(56576) kann man die Pins PB0-PB7 vom User-Port (auf der Unterseite des Ports, siehe Handbuch) auslesen. Mit POKE in diese Speicherstelle kann man auch Ausgaben über den User-Port laufen lassen.
DD02 56578 Datenrichtungsregister für User-Port: Jedes der Bits gibt die Datenrichtung für die Pins PB0-PB7 des User-Ports an (Bit gesetzt = Ausgang, Bit nicht gesetzt = Eingang).
FF81 65409 SYS 65409 setzt den Video-Chip des C 64 auf den Ursprungszustand zurück.
FFD5 65493 LOAD-Routine des Betriebssystems. Mit folgender kleiner Routine kann man Unterprogramme nachladen, ohne irgendwelche Basic-Pointer (wie zum Beispiel die Zeiger auf die Endadresse, 45 und 46) zu verändern:
POKE 186,1 : POKE 780,0 :
POKE 781,0 : POKE 782,96 :
POKE 183,0 : SYS 65493
Erklärung: 186,1 = Geräteadresse für Recorder
781 und 782 gibt die Startadresse an, ab der das Programm geladen werden soll.
183,0 = kein Programmname.
SYS 65493 = LOAD-Routine.
FFE7 65511 Durch SYS 65511 lassen sich alle Files schließen. So erspart man sich das lästige Eintippen von CLOSE1:CLOSE2:CLOSE3 . . .
Dabei sollte aber beachtet werden, daß auf diese Weise nur der Kanal geschlossen wird, aber keine Dateien auf einer Disk.

Grafik und Sprites wurden im Grafikkurs von H. Ponnath und im 64'er Sonderheft 4 sehr ausführlich beschrieben. Auf PEEKs und POKEs für diesen Bereich wurde daher verzichtet.

(M. Kohlen/kn)
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →