Auf der TOS-Disk: Wunderbare Welt der Schwerkraft - Das dritte Gimmick-Programm

Schon vor langer Zeit entdeckte der Physiker Newton das Gesetz der Gravitation. Doch trotz der Mühe vieler Programmierer, die neue Schnittstelle Mensch-Computer durch eine realistische Simulation eines natürlichen Arbeitsplatzes zu verbessern, bewegt sich die Maus immer noch völlig unnatürlich. Als gäbe es keine Masse, keine Reibung, keine Muskelkraft und keine Gravitation.

Das müsse sich doch erreichen lassen: eine Maus, die den Naturgesetzen unterliegt. Und es geht! Aber zunächst mußten wir in langjähriger Grundlagenforschung das Verhalten natürlicher Mäuse untersuchen. Wie, so fragten wir uns, verhält sich z. B. eine Maus, wenn man sie auf einen schräg gestellten Schreibtisch fallen läßt? (Unsere Experimente gingen bis zu einer Fallhöhe von 10 Metern.) Krabbelt sie womöglich wieder hoch? Welche Auswirkung zeigt häufiges Beschleunigen der Maus auf einem mittelmäßig rauen Belag? Bildet sich auf Dauer eine schützende Hornhaut oder gibt es Blutspuren? Viele Fragen gab es, doch nur wenig Antworten.

Nun, die Forschungen sind abgeschlossen und die erstaunlichen Ergebnisse in einem Programm zusammenfaßt, das den bisherigen Schwachpunkt des Betriebssystems beseitigt. Dieses sensationelle Programm finden Sie auf der Diskette, wie immer im PRO-GRAME-Ordner unter dem Namen »PHYSICAL.PRG«. Das Programm sollten Sie zur ständigen Nutzung in den Auto-Ordner kopieren, es läßt sich aber auch vom Desktop aus starten. Es verbannt die alte Maus in ihren Käfig und ersetzt sie durch unsere neue Züchtung. Wenn Sie jetzt unsere Neuzüchtung auf Ihrem Schreibtisch ausprobieren möchten, nur zu! Sie werden feststellen, wieviel Spaß das natürliche Verhalten der Maus Ihnen bereitet. Wie? Zu schwerfällig, meinen Sie? Aber Moment, da haben wir was für Sie: Durch den Verwendung spezieller onkodyaxidreversibler Gene ist es uns sogar gelungen, diese Maus direkt vom Desktop programmierbar zu gestalten. Solange Sie die rechte Maustaste gedrückt halten, können Sie mit den in Bild 1 aufgezählten Tasten die Mauseigenschaften Ihren Bedürfnissen anpassen.

Ein besonders praktisches Vergnügen bereitet unsere Maus übrigens bei diversen Malprogrammen. Die beste B-Spline-Funktion im »Creator« kommt bei unserer Maus mit eingebauter M-Spline-Funktion (M für Maus) nicht mit.

Oder, wo haben Sie schon eine Freihand-Spline-Funktion gesehen? Probieren Sie es doch mit einem Zeichenprogramm aus. Unsere Mauszüchtung funktioniert mit allen Programmen, die die entsprechende VDI-Routine zum Auslesen der Mauskoordinaten benutzen. Nur bei Programmen, die die Mausimpulse selbst auswerten, ist unsere physikalische Maus nicht lebensfähig. Im Gegensatz zu den vorherigen Gimmickprogrammen, ist unsere heute vorgestellte Maus auf allen Systemen außerordentlich lauffreudig. Selbst auf Großbildschirmen fühlt sie sich wohl. (Laut unseren Experimenten darf die Bildschirmdiagonale bzw. die Fallhöhe nicht 10 Meter übersteigen -Sie könnten sich sonst den Mauszeiger verbiegen!) Aber kommen wir nun zum Eingemachten: Das Programm ist mit Megamax-Modula-2 geschrieben, besteht aber im wesentlichen aus Assembler, so daß eine Übertragung in ein anderes Assembler-Entwicklungssystem keine Probleme bereiten sollte.

Neuer Datentyp »FIXREAL

fix, das sind diese Zahlen auch. Aber »FIXREAL« steht hier erst einmal für einen Datentyp, der Festkommazahlen darstellt. Die Geschwindigkeit der Maus muß intern wesentlich höher dargestellt werden, als es die Bildschirmauflösung zuläßt. Außerdem benötigt das Programm auch Geschwindigkeiten, die kleiner als ein Pixel pro Bild (PpB) sind. Diese Darstellung beherrscht erst der neue Datentyp. Es handelt sich dabei um 32-Bit breite Zahlen vom Typ LONGINT, wobei diese Zahlen aber anders betrachtet werden. Das obere Wort gibt den Vorkommateil an und kann somit als INTEGER-Typ gelten, das untere Wort stellt den Nachkommateil in 1 /65536-tel Einheiten dar. in Modula-2 ist der Datentyp gemäß Listing 1 definiert.

FIXREAL „ RECORD 
    CASE BOOLEAN: OF 
        FALSE:
            I: INTEGER; (* Vorkommateil *)
            F: CARDINAL| (* Nachkommateil *)

        TRUE:
            H: LONGINT| (* Gesamte Zahl *)
        END;

END;

Listing 1. Um die Darstellung großer Zahlen mit Nachkommateil zu beschleunigen, haben wir den neuen Datentyp »FIXREAL« eingeführt

Wir erhalten auf diese Weise beliebigen Zugriff auf die einzelnen Bestandteile der Festkommazahl oder auf die gesamte Zahl. Bei der Positionsangabe des Mauscursors benötigt das Programm z. B. nur den Vorkommateil. Zur Verdeutlichung einige Beispiele: 0.5 würde als $000.8000, die Kreiszahl PI als $003.243F dargestellt. Das Rechnen mit diesem neuen Datentyp gestaltet sich einfach: Addition und Subtraktion übernehmen die entsprechenden LONGINT-Funktionen des Modula-2. Bei Multiplikation und Division wird es etwas schwieriger. Hier betrachten wir nur die Multiplikation, die in unserem Gimmick-Programm Verwendung findet. Die Prozedur heißt MulFixReals, multipliziert zwei Festkommazahlen und gibt als Funktionswert eine Zahl desselben Datentyps zurück. Die Prozedur ist vollständig in Assembler programmiert. Der wichtigste Befehl ist dabei der MULU-Befehl. Leider kann der Prozessor nur zwei 16-Bit-Zahlen multiplizieren, was für unseren Zweck leider einen höheren Aufwand bedeutet. Das Programm arbeitet nur mit positiven Zahlen; erst das Ergebnis erhält wieder ein Vorzeichen (auf dem Stack merkt sich die Prozedur das Vorzeichen).

Im Prinzip erfolgt eine 32x32-Bit-Multiplikation, bei der am Ende die mittleren beiden Worte des 64-Bit-Ergebnisses die gewünschte FIXREAL-Zahl ergeben. Das untere Wort fällt der Genauigkeit zum Opfer. Das obere Wort des 64-Bit-Ergebnisses muß Null sein, ansonsten ist eine Bereichsüberschreitung aufgetreten.

»Kampf der Gladiavektoren«

für unser Unternehmen müssen wir drei Vektoren umbiegen: Den Mausvektor, den Tastaturvektor und natürlich unseren beliebten VBL-Vektor. Den Tastaturvektor (Prozedur NewKeyVector) benötigen wir einzig für die Direkt-Programmierung der Maus. Nur wenn die rechte Maustaste gedrückt ist (Abfrage über die LineA-Variable MOUSE_BT), wird der Tastaturpuffer nach den notwendigen Tasten durchsucht und die entspechenden Funktionen ausgeführt. Der Einfachheit halber löschen wir anschließend den gesamten Puffer durch Setzen des Auslesezeigers (HEAD) auf die Position des Schreibzeigers (TAIL).

Der Mausvektor (Prozedur NewMausVector) wird immer dann aufgerufen, wenn die Tastatur über die Schnittstelle ein neues Mauspaket gesendet hat. Dieses Paket erhält die Mausvektorroutine als Zeiger in A0.

Tastenbelegung

Halten Sie die rechte Maustaste gedrückt und betätigen Sie eine der folgenden Tasten:

Leertaste . Schaltet zwischen der normalen und der physikalischen Maus um

5 .......... Stellt die Gravitation ab. (Alternativ können Sie es ja mal mit Bierdeckeln unter dem Monitor versuchen!)

8 .......... Verstärkt die vertikale Gravitation

6 .......... Verstärkt die horizontale Gravitation

4 ........... Vermindert die horizontale Gravitation

1 ........... Verringert die Reibung des Desktops. (Wuuuahhhhü! Glatteis!)

3 ........... Erhöht die Reibung des Desktops

7 .......... Verringert die Kraft des Benutzers. (Messen Sie mal Ihren Bizeps nach!)

9 .......... Erhöht die Kraft des Benutzers. (Nur nicht angeben!)

Bild 1. Dank der Verwendung spezieller onkodyaxidreversibler Gene ist unsere Maus direkt zu programmieren

Unsere Mausroutine tut nichts anderes, als die Impulse aus dem Paket auszulesen und »einzusammeln«, indem sie die Impulsanzahl zu einer globalen Variable (Mouse.Impulse) addiert. Anschließend wird wieder die alte Routine (OldMouseVector) aufgerufen, die dann ihrerseits das Mauspaket auswertet. Zuvor stecken wir dem Mauspaket noch zwei faule Ostereier in Form von zwei Nullen unter: Die alte Routine soll unsere Maus ja nicht mehr bewegen und darf folglich in ihrem Paket keine Bewegungsimpulse mehr vorfinden.

Wie so oft, so sorgt auch diesmal der bewährte VBL-Interrupt (Prozedur VBLIRQ) für eine regelmäßige Aktivität unseres Programms. Hier wertet das Programm alle Mausimpulse aus, die es zwischen dem letzten und dem aktuellen VBL-Interrupt eingesammelt hat. Die Impulsanzahl repräsentiert die Kraft, die auf unsere Maus wirkt. Die Kraft berechnet sich aus der Anzahl der Impulse (Mouse.Impulse) multipliziert mit der Krafteinheit des Benutzers (Mouse.User-Power). Nach dieser Berechnung benötigen wir die alte Impulsanzahl nicht mehr und können unseren »Korb« entleeren (»clr.l MouseRec.Impulse.X(A0)«). Mit der nun bekannten Kraft F berechnen wir die Beschleunigung a der Maus. Sie ist nach dem physikalischen Gesetz a=F/m von der Masse (Mouse.Mass) direkt proportional abhängig. Die Masse erscheint in dem Programm reziprok (1/x). Das hat den Vorteil, daß man nicht dividieren muß, sondern gleich die schon vorhandene Prozedur MulFixReals verwenden kann. Zu der Beschleunigung mittels der Benutzerkraft kommt die Beschleunigung, die durch die Gravitation entsteht. Diese wird einfach hinzuaddiert. Aus der Gesamtbeschleunigung a läßt sich jetzt die neue Geschwindigkeit s (Mouse.Speed) durch Addition ermitteln. Zum Schluß berechnen wir die Reibung: Die Reibung (Mouse.DesktopFriction) wird durch eine Zahl zwischen 0.0 und 1.0 (bzw. $.0000 und $1.0000) dargestellt und bestimmt somit den Faktor, um den sich die Geschwindigkeit je Zeiteinheit vermindert.

Auch hier kommt wieder die Prozedur MulFixReals zur Anwendung. In Bild 2 finden Sie alle Formeln übersichtlich aufgelistet. Jetzt endlich ist man im Besitz der neuen Geschwindigkeit, mit der sich die neue Position wiederum durch einfaches Addieren errechnet. Nach einem kleinen Test auf Randkollisionen, bei dem eventuell die Positionen korrigiert und die Geschwindigkeiten negiert werden müssen, müssen wir den Mauscursor nur noch an die neue Position setzen.

Mausdressur

Es ist leichter, einen Hund zu dressieren, als die Maus am ST. Bei Atari hat offensichtlich niemand daran gedacht, daß jemand einmal die Maus auf eine bestimmte Koordinate setzen will. Glücklicherweise helfen einem hierbei die negativen LineA-Variablen weiter. Mit etwas Frechheit überlisten wir das System: Wir schreiben die neu zu setzende Koordinate direkt in die Variablen GCURX,GCURY (-$25A und -$258) und CUR_X,CUR_Y (-$158 und -$156). Anschließend gaukeln wir dem System vor, daß sich die Maus bewegt hat: Also müssen wir in die Variable CUR_FLAG (-$154) einen Wert ungleich Null schreiben und das Bewegungsflag (Bit in der Variable CUR_MS_STAT (-$15C) setzen. Beim TOS 1.4 können wir diese Variablen immer beschreiben. Weil aber das Blitter-TOS bei einer abgeschalteten Maus sehr unangenehm reagiert, sollte man diese Variablen nur setzen, wenn die Maus auch sichtbar ist. Dazu überprüfen wir die Anzahl der erfolgten »Hide-Mouse«-Aufrufe (H_HID_CT -$256) und setzen CUR_FLAG und CUR_M_STAT nur dann, wenn M_HID_CT den Wert Null enthält.

Soweit funktioniert schon einmal die Darstellung des Mauscursors problemlos. Allerdings erkennt das übrige System die neue Koordinate nur dann an, wenn man diese mit einem Aufruf über den Mausbewegungsvektor (-$32) informiert. Andernfalls wäre z. B. die Rubberbox auf dem Desktop nicht auf die neue Koordinate ausgerichtet, obwohl der Mauscursor an dieser neuen Stelle sichtbar ist. Die Routine erwartet die aktuellen Koordinaten in den Registern D0 und D1. Wer will, kann das vorliegende Programm um einige Effekte erweitern. Beispielsweise um einen freipositionierbaren Magnet, der den Mauszeiger anzieht. Eine völlig neue Art der Benutzerführung tut sich auf: Knöpfe in Dialogboxen, die irreversible Funktionen auslösen, könnten eine abstoßende Wirkung erhalten. »ABBRUCH«-Knöpfe könnten hingegen anziehend wirken. (ba)

Physikalische Formeln

Kraft:

= Anzahl Maus Impulse * BenutzerKraft;

Beschleunigung:

= Kraft * 1/Mausmasse) +
  Gravitationsbeschleunigung;
  ( * Reibungsfaktor zwischen 0.0 und 1.0 *)

Geschwindigkeit:

= (Geschwindigkeit+Beschleunigung) * Reibungsfaktor;

Position:

= Position + Geschwindigkeit;

Listing 2. Physikalischen Gesetze in einer Hochsprache formuliert


Meinolf Amekudzi
Links

Copyright-Bestimmungen: siehe Über diese Seite
Classic Computer Magazines
[ Join Now | Ring Hub | Random | << Prev | Next >> ]