Ein Maustreiber für alle Fälle
von Ralf Kästner
Zum Treffen gab es das neue UNIPIC 2.0 zu sehen, u.a. wurde an mich die Bitte herangetragen, etwas zum verwendeten Maustreiber zu schreiben, was ich hiermit tun möchte. Im Archiv MAUS.PMA befinden sich die notwendigen Dateien, welche in der vergangenen Zeit entstanden sind.
Ich beziehe mich nachfolgend auf die News-Artikel ,,PC-MOUSE-Nachtrag`` von mir, Ausgabe 1/95 S. 12, ,,Ein Mauspfeiltreiber für CAOS`` von Mario Leubner, Ausgabe 3/95 S. 5ff., ,,Die neue Maus unter CAOS`` von mir, Ausgabe 4/95 S. 8ff. und ,,Neue Standards`` von Jörg Linder, Ausgabe 1/96 S. 2ff. Im jetzt vorliegenden Treiber habe ich versucht, alle Forderungen unter einen Hut zu bekommen, das Beste aus den eben genannten Artikeln zusammenzufassen und die Erfahrungen aus UNIPIC 2.0 mit einfließen zu lassen. Dort wird allerdings der Mauspfeil nicht im Interrupt gezeichnet, sondern vom Eingabe-Unterprogramm, das erste Ergebnis möchte ich heute vorstellen, damit es begutachtet werden kann. Als Ausgangspunkt habe ich MOUSEPF.ASM (siehe Artikel von Mario) benutzt, da er für meine Pläne am geeignetsten erschien.
Um es vorwegzunehmen, ich habe erst mal alles hineingepackt, was mir so vorschwebte, so daß die jetzige Form eine Maximalvariante darstellt, was einerseits eine ganze Menge an Speicherplatz erfordert, andererseits wird natürlich auch Leistung geboten, was die Nutzung erleichtert. Der Treiber müßte mit jeglichen Konstellationen klarkommen, es werden keine bestimmten Konfigurationen oder irgendwelche Systemzustände vorausgesetzt und durch den Treiber auch nichts verändert, so daß zum Beispiel auch eine Nutzung möglich ist, während das KC-BASIC läuft, wo der IRM immer aus ist.
Zunächst wurden mehrere Fehler im gewählten MOUSEPF.ASM beseitigt:
- Zeichenroutine für den Mauspfeil verursacht keine Fehler mehr, wen sich der Mauspfeil in den letzten beiden Bildschirmspalten befindet
- der Mauspfeil wird jetzt auch im Hires-Mode korrekt gezeichnet
- eine gesperrte Mausbewegung (MOVENA off) wird durch Cursorblinken bzw. Zeichenausgaben nicht mehr aufgehoben
- die Mauskoordinaten entsprechen den KC-Grafikkoordinaten, so daß der Ursprung links unten liegt
Ein größeres Problem war die Störung der Tastatur-CTC durch die Mausinterrupts im alten Treiber, auch das ist jetzt gelöst durch eine spezielle Initialisierung der Tastatur-CTC beim Ausschalten nach einem Keyboard-Interrupt. Die Tastatur geht dann immer vor und die Maus muß warten, wenn der CTC-Interrupt der Tastatur läuft, das funktioniert auch bei wilder gleichzeitiger Traktur von Maus und Keyboard, damit kommt man also auch ohne Eingriff in das M003 aus und hat trotzdem eine relativ ruhige flackerfreie Bewegung. Zusätzlich spart man einen CTC-Kanal im M003 ein, so daß für jeden SIO-Kanal ein freier CTC-Kanal bleibt, was eine symetrische Verteilung der Ressourcen für die COM-Schnittstellen ermöglicht.
Als nächstes wurden einige Erweiterungen vorgenommen. Die Zeichenroutine akzeptiert jetzt einen Offset zwischen Maussymbolmuster (16*16 Pixel) und sensitivem Mauspunkt (dieser entspricht den aktuellen Mauskoordinaten). Über diesen Offset, welcher frei wählbar ist, kann man das ebenfalls frei definierbare Mauspfeilmuster gegeneinander verschieben, so daß beispielsweise auch ein nach rechts unten weisender Pfeil realisiert werden kann oder eine stilisierte Hand, wo der Mauspunkt in deren Mittelpunkt plaziert werden sollte. Man muß nur entsprechende Muster bereitstellen und den gewünschten Offset angeben, die Zeichenarbeit übernimmt der Maustreiber.
Schließlich habe ich dann einige Programmteile aus UNIPIC 2.0 eingebaut und schon wieder etwas erweitert (siehe Artikel oben, ,,Die neue Maus unter CAOS``), so daß jetzt jede Taste Autorepeat auslösen kann und linke und rechte Taste einen Doppelklick, dafür bot sich der noch ungenutzte Mauscode 0EFH an. Doppelklick und Autorepeat schließen sich jetzt gegenseitig aus, das war eine Erfahrung aus UNIPIC, dort wandelt das Hauptprogramm bei erlaubtem Autorepeat die Doppelklicks umständlicherweise wieder in einfache um, da kann man das auch gleich den Int.-Treiber machen lassen, das nutzende Programm muß hier also dem Treiber mitteilen, ob Autorepeat gewünscht wird oder nicht, Normaleinstellung ist Aus.
Um nun eventuellen Diskussionen über den verwendeten Maus-Mode aus dem Wege zu gehen, habe ich den SIO-Treiber gleich universell geschrieben, er kann also jetzt sowohl im SYSTEM- als auch im MICROSOFT-Mode initialisiert werden, was ja auch einer flexiblen Handhabung anderer MS-kompatibler Eingabegeräte entgegenkommt.
Abschließend war dann noch die COM-Verwaltung zu realisieren, dort habe ich versucht, die beschlossenen Grundsätze von 1995 (siehe Artikel von Jörg oben) umzusetzen, auch das funktioniert. Die Maus kann also an COM1...4 initialisiert werden, wobei eine evtl. bereits initialisierte externe Tastatur an COM2 automatisch mit in die anschließend laufende COM-Verwaltung eingebunden wird. Hier können u.U. Probleme auftreten, wenn Geräte bereits per Interrupt an einer anderen COM-Schnittstelle betrieben werden. Diese Problematik löst sich wahrscheinlich erst, wenn die COM-Verwaltung mal von CAOS übernommen wird und dann im ROM steht.
Ich möchte heute noch nichts weiter zu einer programmtechnischen Auswertung der Mauscodes schreiben, das ist erst sinnvoll, wenn alles in CAOS integriert ist. Alle Informationen, welche für die Initialisierung und Programmierung von Interesse sind, stehen im Quelltext MAUS7500.ASM, den ich reichlichst kommentiert habe. Besonderes Augenmerk habe ich darauf verwendet, daß die ganze Angelegenheit auch unter BASIC nutzbar ist, deshalb auch einige ,,Verrenkungen`` in den Interruptroutinen und das Zeichnen/Löschen des Maussymbols im DI. Den Treiber MAUS7500.KCC habe ich für Tests unter BASIC bzw. in der CP/M-Betriebsart erst mal auf 7500H übersetzt, so daß er unmittelbar unter dem IRM steht. Am beiliegenden Quelltext kann man auch sehen, daß im Monitor-RAM nur wichtige Mausarbeitszellen gelassen wurden (alle, welche für die nutzenden Programme wichtig sind) alle anderen befinden sich im reservierten Bereich ab 0A830H, da bleiben im Monitor-RAM noch 8 Bytes frei, welche evtl. für den auch noch fehlenden Joysticktreiber verwendet werden können.
Für einen Test unter CAOS lädt man einfach MAUS7500.KCC und es erscheinen Kommandos in der Menüleiste, welche den Sprungverteiler am Anfang des Treibers aufrufen, so sollen es später mal alle mausbasierten Anwendungsprogramme machen. Die notwendigen Parameter für die Initialisierung bitte dem Quelltext entnehmen. Mit den Kommandos kann man ,,per Hand`` die Darstellung des Maussymbols, die Bewegung der Maus, die Maustasten und den Autorepeat der Tasten ein- und auschalten. %GETMICK gibt die aktuellen Mauskoordinaten hexadezimal auf dem Bildschirm aus. Mit %CODSW kann man die Ausgabe der Mauscodes an das Betriebssystem ein- und ausschalten, dann läuft der Bildschirm nicht so voll, man kann dann aber auch nur noch die Bewegung des Mauspfeils verfolgen.
Um alle Probleme beim Test unter BASIC auszuschließen, empfehle ich die RAM-Obergrenze auf beispielsweise 29900 beim Kaltstart zu begrenzen (Abfrage MEMORY END: nach %BASIC). Mit CALL*7520 kann man wieder die Mauscodes ein- und ausschalten. Mit CALL*7500 / 7503 / 7506 / 7509 / 750C / 750F / 7512 / 7515 / 7518 erreicht man die analogen CAOS-Kommandos auch direkt vom Basic-Interpreter aus. Sehr originell macht sich beispielsweise MUSIK.SSS, dort spielt der KC die Musiktitel, zeichnet nebenbei etwas Grafik und bewegt zwischendurch auch noch den Mauspfeil - bei mir funktionierte das problemlos!!! BASIC-Programme, welche PSET, LINE, CIRCLE usw. verwenden, nehmen bei diesen Befehlen aber den Mauspfeil nicht weg, so daß es dort zu Bildverfälschungen kommen kann, im Maustreiber werden momentan nur die normalen Zeichenausgaben umgeleitet, was zum Testen erst mal ausreicht! Probleme traten bei einigen Programmen in Form von unvermittelten Abstürzen auf, das lag aber nicht am Maustreiber, sondern an der RAM-Begrenzung beim Kaltstart, sie stürzten ohne Maustreiber mit RAM-Begrenzung genauso ab, merkwürdigerweise ohne RAM-Begrenzung nicht mehr.
Für einen Test unter der CP/M-Betriebsart habe ich für das neue HCBASIC2.COM von Mario (geht nur damit!, in MAUS.PMA nochmal enthalten), ein kleines BASIC-Programm geschrieben, dort wird der Maustreiber geladen und initialisiert bzw. ausgeschaltet. Die Abfrage CODES schaltet mit SWITCH die Codes ein/aus, mit OLD bleibt alles wie vorher. Am besten ist der Start gleich von der Kommandozeile über >HCBASIC2 MAUSHCB2, es startet selbst und beendet sich auch gleich wieder. Die Dateien HCBASIC2.COM, MAUSHCB2.SSS und MAUS7500.KCC müssen dann im Zugriff sein, es wird allerdings auch nichts überprüft, da es ja erst mal nur zum Testen gedacht ist. Der Mauspfeil wird allerdings von ZAS noch nicht berücksichtigt, so daß es hier generell zu Bildverfälschungen kommt, wenn sich Ausgaben mit dem Pfeil überschneiden, nach CLS ist er erst nach einer Bewegung der Maus wieder zu sehen.
Fazit, man muß zwar momentan noch ein paar Kompromisse eingehen, da der Treiber im RAM steht, auf alle Fälle läßt sich aber bereits jetzt die Funktion nachweisen und es ist ein komisches Gefühl, wenn beispielsweise in ML.COM wie auf dem PC ein richtiger Mauspfeil zu sehen ist, welcher die zukünftigen programmtechnischen Möglichkeiten erahnen läßt. Ich nehme auch gern noch Veränderungen vor, wenn dies gewünscht wird. Momentan läßt sich der Treiber nur in eigene Maschinenprogramme für die CAOS-Betriebsart einbinden, dort müssen dann alle Bildschirmausgaben (ESC-Codes nicht vergessen!) selbst den Mauspfeil berücksichtigen, wie das gemacht wird, kann man den Unterprogrammen OUTPUT bzw. CUCPL des Quelltextes entnehmen. Wenn die Unterprogramme des Betriebssystems bzw. von ZAS hier so weit sind, wird man weitestgehend von dieser Aufgabe entlastet und man muß sich im Programm überhaupt nicht mehr um die Maus an sich kümmern, nur die Codes muß man natürlich entsprechend in irgendeiner Form auswerten und umsetzen. Mario hatte ich den Treiber bereits zur Verfügung gestellt und er hat Zustimmung geäußert, so daß einer Einbindung ins CAOS, bis auf die Arbeit natürlich, nicht mehr viel entgegenstehen dürfte.
In diesem Sinne wünsche ich viel Spaß beim Ausprobieren.