Ein Mauspfeiltreiber für CAOS
von Mario Leubner
Anlehnend an die MOUSEALL-Treiber, die bereits in den KC-News 1/95 vorgestellt wurden, möchte ich heute mal zwei "echte" Mauspfeiltreiber für den KC85/4 vorstellen. Die Ideen und Programmstrukturen stammen ebenfalls wieder von Henrik Haftmann, der auf diesem Gebiet gute Vorarbeit geleistet hat. (siehe P.S. im letzten Beitrag.) Ich habe die Quelltexte bearbeitet, ein paar Schwächen beseitigt und etwas erweitert. Prinzipiell wäre es auch möglich, die Treiber für den KC85/3 umzuschreiben, wenn man bei der Spritegrafik den Bildaufbau des KC85/3 beachtet.
Die Spriteverwaltung macht eine Umlenkung aller Betriebssystemroutinen erforderlich. In den heute vorgestellten Treibern leite ich die CRT-, die KBD- und die Scroll-Routine um, ohne dabei alle Erfordernisse abgedeckt zu haben. Programmteile aus CAOS4.3 sind ebenfalls mit eingeflossen: der blinkende Strichcursor und das wählbare Cursormuster.
Zum Testen der Treiber reicht dies vorerst aus, später müssen alle Bildschirmroutinen (auch LINE, CIRCLE... ) die Maus berücksichtigen. Ich habe geplant einen Maustreiber in irgendeiner Form in ein neues CAOS einzubauen. Mit diesem Beitrag möchte ich die Diskussion eröffnen, welcher Treiber es sein soll. Ein MOUSEALL-Treiber wäre ja kein Problem, aber ich glaube ein Mauspfeil steht unserem KC besser!
Ich habe zwei Treiber geschrieben, die (fast) gleichwertig benutzt werden können. MOUSEP2 ist für die 2-Tasten-Maus (Microsoft-Modus) und MOUSEP3 für die 3-Tasten-Maus (Mouse-Systems-Modus). Beim Austesten des Treibers für die 2-Tastenmaus ist mir aufgefallen, daß die Beschreibung der Sendeworte von Henrik Haftmann noch nicht ganz korrekt ist, hier die korrigierte Aufstellung:
1. Byte: Tastenstati und Richtungsinfo
6 5 4 3 2 1 0 1 L R Y Y X X | | | | | | + Bit 6 der X-Schrittanzahl | | | | | + Bit 7 der X-Schrittanzahl | | | | + Bit 6 der Y-Schrittanzahl | | | + Bit 7 der Y-Schrittanzahl | | + R=1 rechte Maustaste gedrückt | + L=1 linke Maustaste gedrückt + 1 Kennung für erstes Byte der Übertragung
2. Byte: Schrittanzahl in X-Richtung
6 5 4 3 2 1 0 0 x x x x x xDie Bits 0 bis 5 sind mit den Bits 0 und 1 des ersten Sendebytes zu einer 8-Bit Zahl zu ergänzen und entsprechen dann der X- Schrittzahl im Zweierkomplement, negative Zahl bedeutet von rechts nach links.
3. Byte: Schrittanzahl in Y-Richtung
6 5 4 3 2 1 0 0 y y y y y yDie Bits 0 bis 5 sind mit den Bits 2 und 3 des ersten Sendebytes zu einer 8-Bit Zahl zu ergänzen und entsprechen dann der Y- Schrittzahl im Zweierkomplement, negative Zahl bedeutet von unten nach oben.
Nun zu den Mauspfeiltreibern
- bis auf die Abfrage der mittleren Taste sind MOUSEP2 und MOUSEP3 in der Reaktion identisch. Der wesentliche Unterschied besteht nur in der internen Verarbeitung der Richtungsinformationen
- beide sind wegen der vom Bildaufbau abhängigen Spritegrafik nur auf dem KC85/4 lauffähig
- Treiber sind verschieblich, werden ab 200H geladen
- IRM muß permanent eingeschaltet sein
- unterstützt werden 2 Interruptquellen am ersten V.24-Modul im System
- eine Umlenkungsroutine erlaubt das Schreiben und das Cursorblinken unter dem Mauspfeil
Anwendung
%MOUSE kanal usertaste
usertaste=0
holt bei Betätigung der rechten Maustaste den Cursor zur Mausposition, sonst wird der angegebene Tastencode emuliert
kanal
= Kanalnummer des V.24-Moduls (1 oder 2)
%MOUSE 0
Totlegen des Maustreibers
%MOUSE
Ohne Parameter
Übernahme der vorhergehenden Parameter zur Aktivierung des Maustreibers.
Belegung der Maustasten
Links
Cursor zur Mausposition holen und <ENTER> emulieren
Mitte
(nur bei MOUSEP3!)
aktuelles Zeichen unter Mauspfeilspitze zum momentanen Cursor holen (emulieren)
Rechts
Cursor zur Mausposition holen oder Code der USER-Taste
Die Mauspfeiltreiber haben am Anfang eine Sprungverteilertabelle mit folgenden Funktionen:
0200H Holen Mickey-Counter nach HL,DE (HL=x, DE=y-Koordinate)
0203H Mauspfeil wegnehmen
0206H Mauspfeil setzen
0209H Init Maustreiber entsprechend Menüwort
020CH Mauspfeil fesseln (Bewegung verbieten)
020FH Mauspfeil freigeben (Bewegung erlauben)
0212H Maustasten ausschalten (Symbol: Sanduhr)
0215H Maustasten aktivieren (Symbol: Pfeil)
Auf diese Funktionsbibliothek müßten im Idealfall alle Bildschirmroutinen zugreifen! Das Anwählen des Menüwortes %MOUSE bzw. Sprung zur Adresse 0209H aktiviert den Maustreiber und lenkt die CRT- und KBD-Routine um. Für Scrolling wird ebenfalls eine neue Routine eingetragen.
Etwas für Insider
Wem an dieser Stelle das nötige Verständnis fehlt, der kann beim nächsten Abschnitt mit dem Spielprogramm Minesweeper weitermachen...
Ich habe in einer weiteren Studie versucht, das ständige Flackern des Mauspfeiles bei der Bewegung zu beseitigen. Dazu müßte das Zeichnen der Spritegrafik in dem Augenblick erfolgen, wenn der Elektronenstrahl des Monitors das Mauspfeilsymbol gerade passiert hat. Die Zeit bis zum nächsten Elektronenstrahl dürfte ausreichen, um den Mauspfeil auf der neuen Position zu haben.
Den genauen Zeitpunkt könnte man per Interrupt aus dem Signal /BI ermitteln. /BI liegt z.B. an den Zählereingängen der CTC-Kanäle 2 und 3 des System-CTC und am PIO des Joystickmoduls. Da man nicht voraussetzen kann, daß sich ein Joystickmodul im System befindet, kann dieses nicht verwendet werden. Die beiden System-CTC-Kanäle sind jedoch auch schon belegt:
CTC2 für das Blinken der Vordergrundfarbe und die Tonlänge.
CTC3 zur Zeiterfassung der Tastatur-Interrupts.
Es ist also nicht ohne weiteres möglich, einen dieser CTC-Kanäle auch noch für die Maussteuerung zu verwenden. CTC2 läuft zwar ständig und könnte über Interrupt die Mausbewegung mitsteuern, aber dann würde die Maus nicht mehr frei beweglich sein, sondern im Blinkrhythmus springen. Oder das Blinken muß bei einer Mausbewegung im 50Hz-Takt erfolgen, was auch nicht akzeptabel ist.
CTC3 läuft, sobald die KC-Tastatur betätigt wird. Hier habe ich angesetzt mit dem Treiber MOUSEPF.KCC (nur für die 2-Tastenmaus): Er demonstriert, daß die Synchronisation mit den Bildimpulsen funktioniert, einziger Nachteil daß während der Mausbewegung eine Tastaturbedienung fehlerhafte Zeichen bringt. Wer also nicht gleichzeitig mit der einen Hand die Maus bewegt und mit der anderen auf der Tastatur schreibt, kann den Treiber MOUSEPF.KCC mal ausprobieren.
Im M003 befinden sich noch zwei freie CTC-Kanäle, die sich geradezu für die gewünschten Aufgaben anbieten. Doch leider ist auf der Anschlußleiste des M003 an der Stelle, wo sich der Kontakt B25 (Signal /BI) befinden sollte nicht einmal eine Kontaktfläche vorhanden. Somit ist es schwierig, dieses Signal an einen CTC-Zählereingang anzuschließen.
Ich habe in meinem V.24- Modul die Kontaktleiste um diesen Kontakt erweitert, dazu habe ich die Leiterplatte an der entsprechenden Stelle auf die halbe Stärke ausgefräst und von einer anderen Leiterplatte die Kontakte ebenfalls. Dieses Kontaktstück habe ich mit 2-Komponentenkleber in die M003-Leiterplatte eingesetzt. Dabei muß auf die genaue Lage geachtet werden, damit kein Schluß zu benachbarten Kontakten entsteht. Wer sich diesen Umbau jedoch zutraut, hat eine perfekte Lösung des Problems.
Der Treiber MOUSCTC.KCC ist für diese Variante und ebenfalls für die 2-Tastenmaus. Ich persönlich würde diesen Treiber bevorzugen, da die Systemeigenschaften (CTC2/3) nicht verändert werden und die bessere optische Umsetzung erreicht wird.
Minesweeper
Und nun noch eine Anwendung zum Mauspfeiltreiber, damit jeder ausprobieren kann, welcher Treiber der beste ist. Das Spiel MINESWEEPER (engl., "Minenräumer") ist bisher vielleicht als MS-WINDOWS-Spiel bekannt.
In der KC-Version ist es nur mit der Maus spielbar. Nachdem mit dem Menüwort %MOUSE der Mauspfeil bereits auf dem Bildschirm sichtbar ist, %MINESWEEPER am besten gleich mit Maus anklicken. Wird %MINESWEEPER gestartet, ohne vorher die Maus einzuschalten, nimmt es MINESWEEPER automatisch vor; der Maustreiber muß aber geladen sein! Am oberen Bildschirmrand stehen mehrere Worte, die mit der linken Maustaste angeklickt werden können:
- Spielfeld erzeugt ein leeres Spielfeld.
- Ende führt zurück zum CAOS.
- Info gibt eine kurze Spielanleitung aus.
- Minen stellt die die Anzahl der Minen ein, die ausgelegt werden.
- BRK ist überall möglich.
Es geht darum, alle Felder mit Minen zu markieren (rechte Maustaste benutzen) und alle minenfreien Felder aufzudecken (linke Maustaste). Das Spiel beginnt, indem man ein willkürliches Feld mit der linken Maustaste anklickt. Hat man ein Feld ohne Mine aufgedeckt, erscheint eine Zahl, die darüber Auskunft gibt, wieviele der umliegenden 8 Felder (an Rand und Ecke entsprechend weniger) mit Minen belegt sind.
Daraus lassen sich Schlußfolgerungen über die Nachbarfelder treffen. Erscheint z.B eine Null, kann man getrost alle 8 Nachbarfelder aufklicken, dies übernimmt der Rechner gleich von selbst. Versehentlich mit "Mine" markierte Felder kann man mit der rechten Maustaste in Frage stellen ("?") oder die Markierung wieder entfernen (durch nochmaliges Drücken der rechten Maustaste). Klickt man 1 Feld mit Mine auf, "explodiert" sie und alle anderen, und das Spiel ist zu Ende. Falsche Markierungen werden durch grüne Minen angezeigt.
Na denn, viel Spaß mit dem allerersten richtigen Mausspiel auf KC!!
[haftmann#software]
Den Mauspfeiltreibern gebe ich alle Quelltexte mit. Dazu der Hinweis, daß die von mir gewählten Speicherbereiche für Arbeitszellen, Sprungtabellen, und Quittierung mit Bit2 (IX+8) noch nicht endgültig festgelegt sind und ich damit zur Diskussion anregen will.
Eine Reduzierung aller Arbeitszellen der Y-Positionen auf je ein Byte gestattet dann im geplanten CAOS das Auskommen mit dem Bereich von B7F0H bis B7FFH, weniger ist aber nicht machbar! Ebenso würde mich interessieren, ob es USER gibt, die mehrere V.24-Module am KC betreiben wollen. Dann müßte noch eine Modulverwaltung wie bei MOUSE2 hinzukommen, was zwar technisch machbar ist, aber auch wieder mehr Programm und weitere Arbeitszellen erfordert.
Für die V.24-Verwaltung würde ich Arbeitszellen ab A820H vorschlagen, also im Bereich der V.24-Init-Tabellen des KC85/4. In diesem Bereich müßten dann auch die Steckplätze und Portadressen der verwendeten V.24-Module und die Adressen der Interruptroutinen für COM1 bis COM4 bei der Verwendung von zwei V.24-Modulen stehen.