Auf der TOS-Diskette: Magic, ein witziges Gimmick-Programm

Jetzt gibt es eine neue Serie mit witzigen Gimmick-Programmen. Wenn Ihr Bildschirm plötzlich spiegelverkehrte Bilder liefert oder sich Ihre Maus merkwürdig verhält, dann können Sie sicher sein: Ihr Kollege hat sich die nächste TOS schneller besorgt als Sie.

Zum Auftakt dieser Serie verzaubern wir heute den Desktop mit unserem magischen Mauscursor. Für alle, die es kaum erwarten können: Das übersetzte und fertig gelinkte Programm finden Sie auf der Diskette im Archiv GIMMICK. Entpacken Sie dieses und starten Sie das Programm MAGIC.PRG von Ihrem Desktop aus. Programm gestartet? Ok, dann bitte jetzt ganz langsam die Maus bewegen - na, zuviel versprochen? Bei jeder Mausbewegung hinterläßt der Mauscursor ein aufblitzendes Sternchen. Durch schnelle Bewegungen auf einer Stelle verschwindet der Mauscursor gar in einer großen Wolke von Sternchen.

Der 1. April ist zwar schon längst vorbei, aber um Ihre Kollegen ebenfalls mit diesem kleinen Scherzprogramm zu überraschen, kopieren Sie es in den Auto-Ordner. Beachten Sie aber, daß das Programm nur im monochromen 640*400 Grafikmodus läuft.

Magic entstand mit dem Megamax-Modularsystem (Version 3.5). Falls Sie im Besitz dieses Entwicklungsystems sind, können Sie das Programm nach Belieben problemlos ändern. Auf der Diskette befinden sich alle dazu notwendigen Module. Hier wird es erst wirklich interessant. Experimentieren Sie doch einmal selbst mit Magic! Im folgenden erläutere ich die Funktionsweise des Programms und versetze Sie in die Lage, eigene Variationen zu entwickeln.

Folgende Module benötigen Sie für Magic: Das Modul MS-SYSTEMS enthält einige Basisfunktionen, wie z. B. eine eigene schnelle Zufallsfunktion oder eine Funktion zur Speicherreservierung. Das Modul MSGRAPHICS stellt diverse Bildschirmfunktionen zur Verfügung, z. B. eine Zeichenroutine für Sprites.

Das Modul MSINIT ersetzt beim Linken das Modul M2INIT des Megamax-Systems. Dieses Modul startet die anderen Module und sorgt beim Verlassen des Programms dafür, daß das Programm und der vom Programm reservierte Speicher resident bleiben. Also: Bevor Sie den Linker starten, ändern Sie in der Megamax-Shell unter dem Menü LINKER das Init-Modul in MSINIT.MOD.

Wie das residente Programm aktiv bleibt

Starten Sie Magic, so installiert es einen eigenen Vertikal-Blank-lnterrupt (VBL-IRQ). Der ST löst diesen Interrupt jedesmal aus, wenn der Monitor ein neues Bild auf den Bildschirm zu zeichnen beginnt. Normalerweise zeigt dieser Interrupt auf eine Betriebssystemroutine, die u. a. überprüft, ob der Monitor bzw. die Auflösung gewechselt wurde, und die bei einem Positionswechsel den Mauszeiger neu zeichnet.

Das Gimmick-Programm bleibt aktiv, indem es beim Starten den VBL-Vektor (Adresse $70) auf eine eigene Routine (Prozedur VBLIRQ) umbiegt.

Die Prozedur VBLIRQ wird von nun an 72 Mal in der Sekunde im Supervisor-Modus des MC68000 aufgerufen. Sobald der Benutzer die Maus bewegt, ruft sie die Prozedur MakePicture auf. Diese zeichnet die Sternchen auf den Bildschirm. Da es sich bei MakePicture um eine Modula-Prozedur handelt, müssen wir vor dem Aufruf in der Routine VBLIRQ noch den A3-Parameterstack einrichten. Dieser ist als globales Feld im Programmodul definiert (VBL-Stack). Am Ende der eigenen VBL-Routine rufen wir wieder die ursprüngliche VBL-Routine auf. Deren Adresse haben wir uns zuvor in der globalen Variable OldVBLIRQ gemerkt. Um das laufende Programm an dieser Adresse fortzuführen, ohne dabei ein Adressregister zu benutzen, schreiben wir den Inhalt von OldVBLIRQ einfach auf den Stack und führen dann ein RTS aus.

Der Bildaufbau mit den Sternchen kostet Rechenzeit. Damit der Computer noch genug Rechenzeit für seine anderen Arbeiten erhält, darf das Programm nicht bei jedem VBL-Interrupt einen Bildaufbau durchführen. Es zählt daher die Variable VBLTimer mit dem Startwert 3 bei jedem Interrupt um 1 herunter. Ist sie 0 -also bei jedem dritten Interrupt -, so rufen wir die Prozedur MakePicture auf. Ändern Sie die Initialisierung der Variable VBLTimer (z. B. CONST PicFreq = 1), so beschleunigen Sie die Animation, allerdings verlangsamt sich damit auch die laufende Applikation.

Der Kopiertrick

Würden wir die Sternchen einfach so auf das bestehende Desktopbild malen, bekämen wir Schwierigkeiten spätestens beim Versuch, das ursprüngliche Bild wieder herzustellen. Abhilfe schafft hier der Kopiertrick. Der 68000-Prozessor ist schnell genug, das gesamte Desktopbild in kurzer Zeit in einen anderen Speicherbereich zu kopieren. Dies erledigt die Prozedur CopyScreen im Modul MSGraphics. Die hohe Kopiergeschwindigkeit erreichen wir mit Hilfe des MOVEM-Befehls. Ein einziger MOVEM-Befehl überträgt bis zu 52 Byte.

Wir gehen folgendermaßen vor: Vor dem Malen der Sternchen kopieren wir das aktuelle Bild und zeichnen anschließend die Sternchen in die Bildkopie ein. Nun müssen wir nur noch das so angefertigte Bild anzeigen. Dies erledigen wir durch direktes Beschreiben des Videochips (Prozedur Switch). Die Prozedur Switch ist in zweierlei Hinsicht interessant. Zum einen stellt das Beschreiben des Videochip-Registers ein schönes Beispiel für die Verwendung des MOVEP-Befehls dar, zum anderen nutzt die Prozedur eine Besonderheit des Videochips: Die neue Bildschirmbasisadresse läßt sich jederzeit setzen, wobei die Hardware das derzeit dargestellte Bild zunächst einmal zu Ende zeichnet. Erst wenn die Hardware mit dem nächsten Bild beginnt, verwendet sie die neue Bildschirmadresse. Damit kein Flimmern durch das Kopieren und Zeichnen entsteht, verwenden wir zwei Grafikseiten. Dabei zeigen wir eine Grafikseite an und bauen auf der anderen Grafikseite das neue Bild auf. Anschließend zeigen wir die aufgebaute Grafikseite an und verwenden die zuvor angezeigte zum Aufbau des nächsten Bildes. Die beiden Grafikseiten werden vom Modul MSGraphics erzeugt und jeweils über einen Zeiger auf diese Grafikseiten in den Variablen Display-Screen und WorkScreen bekanntgegeben. Nach jedem Bildwechsel (Prozedur SwitchSides) wechseln diese Variablen ihren Inhalt, so daß Sie WorkScreen immer als Referenz auf das aufzubauende Bild benutzen können.

Daß die Sternchen wirklich zauberhafter Natur sind, zeigt der Versuch, eine Hardcopy des Desktops zu drucken. Die meisten Hardcopy-Routinen drucken oder speichern nur den logischen Bildschirm. Durch das direkte Beschreiben des Videochips mogeln wir uns elegant um das Betriebssystem herum. Das ist auch notwendig, denn das Programm sollte so transparent sein, daß es den normalen Betriebsablauf des Computers nicht stört.

Die Sprite - Routine

Neben einem schnellen Kopieren des Desktopbildes benötigen wir eine schnelle Sprite-Routine, welche die einzelnen Sternchen auf das Desktopbild zeichnet. Zum Zeichnen eines Sternchens benutzen wir die Prozedur Sprite. Dazu geben wir den Zielbildschirm, die zu benutzende Spriteliste, die Spritenummer aus der Spriteliste und die Bildschirmposition an. Die Bilder der einzelnen Sternchenphasen wurden mit einem speziellen Programm aus einem ganz normalen Bild in Tabellenform umgerechnet. Die genaue Struktur einer solchen Spriteliste zu erläutern, würde den Rahmen dieses Artikels sprengen. Interessant ist hier nur das Prinzip der Spritedarstellung: Die Tabelle StarSpriteList enthält für jede Sternchenphase acht Unterbilder. Für jede Bildschirmposition innerhalb eines Bytes also ein entsprechend geshiftetes Bild. Das spart beim späteren Zeichnen Rechenzeit.

Für den eigentlichen Zeichenvorgang benutzen wir eine schleifenlose (lineare) Kopierroutine. Diese »Monsterroutine« (RMSOBlock) besteht aus einfachen Befehlen zur Verknüpfung der Spritebilder mit dem Zielbild innerhalb einer Bytespalte. Die Befehlsfolge wiederholt sich für jede nötige Bildschirmzeile mit den entsprechenden Offsetwerten. Vor dem Aufruf dieser Linearroutine muß das Ende der Routine, also die letzte zu zeichnende Zeile des Sprites, mit einem RTS-Befehl markiert werden. Der Einsprung erfolgt bei der Zeile, bei der das Sprite im Bild beginnt. So verknüpfen wir das Sprite spaltenweise mit dem Desktopbild. Im Programmodul MAGIC existieren zwei verschiedene Spritelisten. Über die Konstante StarType wählen Sie mittels bedingter Compilierung (Compileroption $?) zwischen den Listen aus. Enthält StarType den Wert Star2 anstatt Starl, so erscheinen auf dem Bildschirm andere Sternchenformen.

Das TOS stellt selbst leider keine Funktion zur Verfügung, um die aktuelle Mausposition auf dem Bildschirm abzufragen. Außerdem gelingt es nur mit erheblichen Tricks, z. B. eine XBIOS-Funktion aus unserem Interrupt heraus aufzurufen. Seit Atari aber die erweiterten LineA-Variablen veröffentlicht hat, ist die Abfrage der aktuellen Mausposition sehr bequem: In den Variablen -$258 (X-Position) und -$25A (Y-Position) sind die aktuellen Koordinaten als INTEGER-Werte einfach auszulesen. In Modula-2 definieren wir dazu zwei Variablen vom Typ POINTER TO INTEGER. Einfacher geht's wirklich nimmer.

Ablaufsteuerung

Soweit die grundlegenden Überlegungen und die Basisfunktionen des Programms. Kommen wir zur eigentlichen Ablaufsteuerung: In dem global definierten Feld Stars merkt sich unser Programm den Zustand jedes Sternchens.

Zu Beginn des Programms ist kein Sternchen aktiv, darum initialisieren wir das Feld über IsActive mit dem Wert FALSE. Ein neues Sternchen wird nun bei einer erkannten Mausbewegung mit der Prozedur InitStar gestartet. Hierzu sucht sich die Prozedur ein nicht aktives Element des Feldes Star und beschreibt es mit den entsprechenden Werten wie Position und Animationsphase.

Die Prozedur AnimateAndDrawStars untersucht anschließend das gesamte Feld Stars und zeichnet alle aktiven Sternchen auf den WorkScreen. Gleichzeitig zählt sie bei jedem Sternchen die Animationsphase herunter und deaktiviert das Sternchen ggf. wieder. Das jeweilige Sprite einer Animationsphase definieren wir über das Feld StarSprites. Zur Zeit müssen wir in Megamax-Modula-2 noch eine TABLE-Anweisung benutzen. Die nächsten Version des Megamax-Modula-2 erlaubt es aber, Felder als Konstanten zu definieren.

Falls der Anwender den Mauscursor nicht bewegt und wir somit keine Sternchen zeichnen müssen, zeigt das Programm den normalen Systembildschirm an. Als Flag dient die Variable DirectTOSScreenShow. Besitzt sie den Wert TRUE, so ist zur Zeit keine Zwei-Seiten-Grafik notwendig. Der VBL-Interrupt setzt die Variable TOSScreenOnDisplay auf den Wert FALSE, falls jemand auf eine andere Bildschirmbasis umschaltet. Unter diesen Umständen müssen wir auf die magischen Sternchen verzichten.

Neben den schon erwähnten Konstanten StarTyp und PicFreq lassen sich auch folgende Konstanten verändern: MaxNoOfStars für die maximal gleichzeitig darstellbare Anzahl an Sternchen, StarRate für die Wartezeit zwischen dem Erscheinen der Sternchen und StarArea für den Bereich um den Mauscursor, in dem die Sternchen erscheinen. Einen völlig neuen Effekt erzielen Sie durch Umprogrammieren der Prozedur AnimateAndDrawStars. Mit der zweiten Spriteliste läßt sich so z. B. ein Seifenblaseneffekt realisieren. Mit den Spritenummer 0 und 1 stellen Sie dazu die langsam nach oben driftenden Seifenblasen dar, bis sie irgendwann (Spritenummern 2 bis 8) platzen.

Andere Sprachen

Die Umsetzung auf andere Sprachen oder andere Modula-Systeme bereitet keine unüberwindbaren Probleme, weil ich keine speziellen Bibliotheken des Megamax-Modula-2 benutze. Für die Umsetzung der Assembler-Teile sollten Sie wissen, daß Megamax-Modula-2 die Parameter über den A3-Parameterstack übergibt. Vor allem die Prozedur VBLIRQ nutzt diesen Parameterstack. Außerdem können Sie anstatt der Prozedur EnterSuperVisiorMode auch die Super-Funktion des G EM DOS verwenden. Das war's für heute. In der nächsten Ausgabe gibt's was für starke Nerven: Dann wird scharf geschossen. Mehr verraten wir noch nicht, lassen Sie sich überraschen. (ba)

Über den Autor:

Meinolf Schneider, geboren am 17.4.63, wurde in der ST-Szene durch viele herausragende Programme bekannt. »Bolo«, »Proto«, »Esprit« und der Vorspann des Mac-Emulators »Aladin« entstammen seiner Feder - oder vielmehr seiner Tastatur. »Dr. Mausklick«, wie er bei Application Systems Heidelberg heißt, arbeitet vollberuflich als freier Softwareautor und schreibt seine Programme am liebsten in Modula-2 und Assembler. »Zääh«, wie er sagt, mag er überhaupt nicht. Seine verspielte Natur tobt er zuweilen in kleinen Gimmick-Programmen aus, die - so nebenbei - aus reiner Freude am Programmieren entstehen. Urspünglich waren diese Programme gar nicht zur Veröffentlichung vorgesehen. Für die Leser der TOS war Meinolf Schneider allerdings bereit, seine Trickkiste zu öffnen.


Meinolf Amekudzi
Aus: TOS 07 / 1990, Seite 81

Links

Copyright-Bestimmungen: siehe Über diese Seite