PEEKs, POKEs & SYSe
PEEKs, POKEs & SYSe

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 TSB 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 (wie es etwa bei der generellen Laufwerksnummer von TSB der Fall ist). Dafür gibt es den PEEK-Befehl zum Auslesen von Speicherinhalten.


Laufwerksnummer auslesen
(von USE gesetzt)
u=peek(190)
(alternativ zu u=USE)

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 $b54b: 5
poke $b54b,6: hrdcpy
2 Hi-Eddi-Bilder laden
(POKE rückgängig mit SCRLD RESTORE)
poke $b1d5,36: scrld 1,dr,5,"hi-eddi": scrld restore
3 Zeichensatz (8 Pages) nach $e000 laden
statt 8: Anzahl Pages für beliebige Daten
poke $b1c1,8: scrld 1,dr,3,"font": scrld restore
4 Ziel des Ladens verlegen nach Highbyte von Ziel, z.B. nach $c000 (Normalwert: $E0) zusätzlich zum letzten POKE (das entspricht dann dem Befehl scrld def $c0,8,0,3):
poke $b220,$c0: [Befehle von eben] :scrld restore
5 ROM-Zeichensatz-Bytes von Basic aus auslesen (hier in den Wert a)
Normalwert von $924a: $30
poke $924a,$31: a=mempeek($d000+x)
6 Einen beliebigen Zeichensatz mit TEXT und CHAR im Grafikmodus nutzen
Normalwert von $a1d2: $d0
poke $a1d2,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), 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 $a1d2,4.
7 Führende Nullen bei USE
Normalwert von $a607: $20
poke $a607,$30: use "###.##",23.45

(Ergebnis: "023.45" statt " 23.45")
8 PAUSE in den SB-Modus zurückversetzen
Normalwert von $a806: $d0


Abbruchmöglichkeit ganz verhindern
Normalwert von $a809: $0d
poke $a806,$24

(Nur <Return> bricht PAUSE ab)

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

9 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$bdb4,$88:poke$bdb5,$f0:poke$bdb6,$28 1320 mem:cls
1330 poke$bdb4,$20:poke$bdb5,$44:poke$bdb6,$e5 1340 end proc
10 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 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.

11 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) poke $c52d,63:poke $c52e,1:poke $c5b0,0
bb=(bl*64-$2000)/320
y=(bb*8)and248
x=int(frac(bb)*320+.5)
block x,y,x+63,y+7,0
  Damit BLOCK überhaupt funktioniert, müssen die drei ersten POKEs gesetzt werden, sie initialisieren die X-Koordinatenüberprüfung bei BLOCK, da der Grafikmodus ja nicht (durch HIRES) 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.

<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 $9a50 " tuned" ausgeben
sys $83c9 die Standard-Textscreen-Farben von TSB herstellen
sys $80bd var die Adresse des Inhalts von VAR suchen, Ergebnis in 780 (lo) und 782 (hi)

<nach oben>