Peek & Poke für ST-Pascal

Bei höheren Programmiersprachen sollten diese Befehle eigentlich keine Rolle spielen. Bei einigen Anwendungen aber, beispielsweise bei der direkten Bildschirmadressierung sind sie sehr nützlich.

Leider kennt das ST-Pascal keinen Peek oder Poke Befehl; noch gibt es einen Pseudo-Array Mein oder Variable an absoluten Adressen, mit denen man sonst häufig direkt auf den Speicher zugreifen kann. Aber während CCD noch überlegt, ob in der Version mit Gem-Einbindung Peek's und Poke's aufgenommen werden soll, machen wir uns diese Befehle doch selbst.

Da man Zeigern keine Zahlen zuweisen kann (in ST-Pascal jedenfalls nicht; in manchen andern Pascal-Compilern geht es manchmal), scheitert dies an der Kontrolle des Compilers. Wer aber das dünne Heftchen namens Handbuch bis zum Ende durchgearbeitet hat, wird vielleicht gelesen haben, daß man bei modularer Kompilierung die Korrektheit der Parameter selbst sicherstellen muß.

Genau hierin steckt die Lösung: man weist einer modular kompilierten Prozedur bzw. Funktion eine 'Long-Integer Variable' zu, und in dem externen Modul wird diese Zahl einfach als Zeiger interpretiert. Klingt komplizierter als es ist. Listing 1 zeigt das PeekPoke-Modul, welches separat kompiliert werden muß.

Wichtig ist hierbei, daß man die Zeiger-Kontrolle mit der (P-)-Option sowohl im Hauptprogramm als auch im Modul ausschaltet. Die Prozeduren bzw. die Funktionen werden wie im Basic aufgerufen, wobei darauf geachtet werden sollte, daß PEEK und POKE 16-Bit Werte, LPEEK und LPOKE hingegen 32-Bit Werte erwarten. Nicht verschwiegen werden soll, daß man nicht auf alle Speicheradressen zugreifen kann. Das liegt daran, daß sich der Rechner normalerweise ins User-Modus befindet; der Zugriff auf Systemvariablen kann aber nur im Supervisor-Modus erfolgen. Greift man auf solche Speicherstellen zu, entsteht ein Busfehler; das Programm bricht ab. Gültige Adressen sind beispielsweise im Bildschirm-Ram zu finden, wo das eigentliche Arbeitsgebiet dieser Befehle liegt.

Im ersten Teil des Demoprogrammes, das etwas ausführlicher ausgefallen ist, wird die grundlegende Anwendung dieser Befehle demonstriert. Im zweiten Teil wird ein Bild in den Bildschirmspeicher geladen und mit Hilfe der neuen Befehle auf den Kopf gestellt. Dazu werden - ganz nebenbei - einige GEMDOS-Routinen aufgerufen, die für manchen Anwender von Interesse sein dürften. Darunter Funktionen zur Ermittlung der Bildschirmadresse und eine schnelle Laderoutine des Betriebssystems. Beim Einlesen der Bilder ist es entscheidend, daß einige Bytes eliminiert werden. Darin befinden sich Farbinformationen der einzelnen Bilder. Bei DEGAS sind dies 34 Bytes, bei Doodle oder bei 'Basic-Bilder' entfällt diese Zeile (siehe Listing).

Falls ein Abspeichern des gedrehten Bildes gewünscht wird, sollte man einen Blick auf das in C geschriebene Konverterprogramm 'NE02MONO' (Heft 7/86) werfen.

Vor Start des Demoprogrammes sollte das PEEKPOKE-Modul compiliert werden. Das entstehende Objektfile wird nun zum Hauptprogramm gelinkt. fastlink % 1, Aaslib, peekpoke rm %1.0 und mit EXEC.bat gestartet. Frank Berger u. (HS)



Aus: ST-Computer 09 / 1986, Seite 65

Links

Copyright-Bestimmungen: siehe Über diese Seite