PEEKs, POKEs & SYS (TSBneo)
PEEKs, POKEs & SYS (TSBneo)

Mit der Version 2.31113 (TSBneo) hat sich der interne Aufbau des TSB-Codes grundlegend geändert. Daher müssen alle bisherigen POKEs auf andere Stellen gerichtet werden, sonst würden sie zu heillosem Chaos und zu unweigerlichen Abstürzen führen. Unter TSBneo also die hier folgenden POKEs verwenden!


Grundsätzlich wichtig ist die Information, auf welchem System ich mich gerade befinde. Dafür dient in TSB der Befehl RETRACE. Er gibt die TSB-Versionsnummer aus. Die aktuell geltende Nummer findet sich auch hier unter Update History.

Direkten Speicherzugriff erhält man seit TSB-Version 2.30126 mit dem TSB.MON (eine an TSBneo angepasste Version des berühmten SMON).


PEEKs

Manchmal möchte man bestimmte Einstellungen seines Systems überprüfen können, man kommt aber so ohne Weiteres nicht mehr an die gesuchte Information heran, vielleicht, weil sie nur dann, wenn sie von einem Basic-Befehl ausdrücklich gesetzt wird, nach außen bekannt ist. Dafür gibt es den PEEK-Befehl zum Auslesen von Speicherinhalten.


Zufallszahlen erzeugen mit dem SID
(Ergebnis von 0 bis 255 in Variable Z)
vol$80:sound3,$8080:wave3,$80:z=peek($d41b)

<nach oben>


POKEs

Mit POKEs kann man bestimmte Einstellungen des Systems verändern, ohne vielleicht umständliche Initialisierungen durchführen zu müssen. Meistens braucht man aber den POKE-Befehl dafür, dass man das System patchen möchte, um eine eingebaute Funktion, die nicht ganz genau das tut, was sie gerade tun sollte, dazu zu bringen es dennoch zu tun. Patches müssen nach Gebrauch sofort wieder rückgängig gemacht werden, daher immer zwei POKEs an die gleiche Stelle.

1 Grafikzeichen bei HRDCPY ohne den unschönen Abstand zwischen den Druckzeilen ausgeben
Normalwert von $b734: 5
poke $b734,6: hrdcpy
2 Zeichensatz (8 Pages) nach $e000 laden
statt Wert 8: Anzahl Pages für beliebige Daten
poke $a579,8: scrld 1,dr,3,"font": scrld restore
3 ROM-Zeichensatz-Bytes von Basic aus auslesen (hier in den Wert a)
Normalwert von $9519: $30
poke $9519,$31: a=mempeek($d000+x)
4 Einen beliebigen Zeichensatz mit TEXT und CHAR im Grafikmodus nutzen
Normalwert von $b34b: $d0
poke $b34b,Highbyte der Charset-Adresse
  Eine gute Adresse für einen solchen Zeichensatz ist der im Grafikmodus ungenutzte Videospeicher $0400. Da hier nur 1024 Bytes zur Verfügung stehen, darf der Zeichensatz dann aber nur teilweise geladen werden (nur 4 Pages, siehe POKEs-Tipp #2), was aber verschmerzbar ist, denn in den restlichen 4 Pages befinden sich meist die reversen Zeichen, die im Grafikmodus auch mithilfe von BLOCK erzeugt werden können. Beispiel: SCRLD DEF $04,4,0,3:SCRLD 1,u,3,"charset":SCRLD RESTORE:POKE $b34b,4.
5 Führende Nullen bei USE
Normalwert von $a4c5: $20
poke $a4c5,$30: use "###.##",23.45

(Ergebnis: "023.45" statt " 23.45")
6 PAUSE in den Simons'-Basic-Modus zurückversetzen
Normalwert von $b90e: $d0


Abbruchmöglichkeit ganz verhindern
Normalwert von $b911: $0d
poke $b90e,$24

(Nur <Return> - wie in SB - bricht PAUSE ab)

zusätzlich zum letzten POKE:
poke $b911,$80

7 MEM einschalten, ohne den Zeichensatz neu zu schreiben

(Das CLS in Zeile 1320 ersetzt das automatische CLS beim normalen MEM, das durch den Patch auf der Strecke geblieben ist. Zeile 1330 macht den Patch rückgängig)
1300 proc minimem
1310 poke$99ce,$88:poke$99cf,$f0:poke$99d0,$28 1320 mem:cls
1330 poke$99ce,$20:poke$99cf,$44:poke$99d0,$e5 1340 end proc
8 Screen $0400 nach MEM nutzen (für Textausgaben), ohne den Befehl NRM zu verwenden... 1400 proc screen04
1410 poke$0288,$04:poke$dd00,$c7:poke$d018,$17
1420 print
1430 end proc
 ...und danach ohne MEM zum MEM-Screen zurückkehren. 1450 proc screencc
1460 poke$0288,$cc:poke$dd00,$94:poke$d018,$3b
1470 print
1480 end proc
  Auf den gerade mit den Prozeduren screen04 oder screencc angewählten Bildschirmen muss zuerst ein PRINT oder CLS durchgeführt werden (Zeilen 1420 und 1470), damit das System die interne Liste der Bildschirmzeilenanfänge auf die neue Situation einstellt. Eventuelle Veränderungen an den Farben (das Farbram gilt für beide Textspeicher) kann man - wenn nötig - mit FCOL korrigieren.

9 Schnell Spritedefinitionen löschen, wenn sie im Bereich der Grafik liegen (mit BLOCK nach MEM; kleinstmögliche Blocknummer: BL=128, sinnvoll ab BL=160 bzw. BL=192, da sonst der Zeichensatz gelöscht wird) 10 bl=192:clearmob
[...]
5500 proc clearmob
5510 poke $c52d,63:poke $c52e,1:poke $c5b0,0
5520 bb=(bl*64-$2000)/320
5525 y=(bb*8)and248:x=int(frac(bb)*320+.5)
5530 block x,y,x+63,y+7,0
5540 end proc
  Damit BLOCK überhaupt funktioniert, müssen in Zeile 5510 die drei ersten POKEs gesetzt werden. Sie initialisieren die X-Koordinatenüberprüfung bei BLOCK, da der Grafikmodus ja nicht (durch HIRES, wo das normalerweise geschieht) aktiviert wurde.
In der nächsten Zeile wird die Blocknummer BL auf die Bitmap umgerechnet und dann werden daraus die X- und Y-Koordinaten gewonnen. Schließlich löscht BLOCK den mit BL angewählten Sprite-Block.

Allgemein (gültig für alle Blockpositionen in allen VIC-Banks): memclr vic+bl*64,64 (vic = Basisadresse einer VIC-Bank, z.B. $C000)

10 Grafikausdruck positionieren beim Befehl COPY. poke $8adc,$30
  Der Wert $30 entspricht einer "0" (Null) im Textformat. Er ersetzt in $8adc eine "1", die zusammen mit dem Wert links davon (in $8adb) beim Drucken mit COPY den Einrückungswert "15" (in Zeichen, Zeichenbreite im Druck: 6 Pixel, Einrückung also 15×6 = 90 Pixel) darstellt. Durch das POKEn der Null verringert sich die Einrückung von "15" auf "05". Braucht man andere Werte als 5, POKEt man zusätzlich auch nach $8adb einen anderen Wert. Die Standardwerte an $8adb/c sind $35, $31 ("15" rückwärts).

Bei HRDCPY (Textbildschirm ausdrucken) beträgt die Einrückung übrigens "21" und steht (ebenfalls rückwärts "12") an Position $8ad4/5.

<nach oben>


SYSe

Mit SYS ruft man Systemroutinen (oder auch eigene Maschinenprogramme) auf, für die es keine ausdrücklichen Basic-Befehle gibt, die aber dennoch nützlich sein können oder aber interessante Infomationen zurückliefern.

sys $80c5 " tuned" ausgeben
sys $8bb8 die Standard-Textscreen-Farben von TSB herstellen
sys $8b65 var die Adresse des Inhalts von VAR suchen, Ergebnis in 780 (lo) und 782 (hi)

<nach oben>