EnterMice (Deutsch)
Joysticks & PS/2 Mouse Interface for Enterprise 64 & 128 computer
Contents
- 1 Einführung
- 2 Aktuelle Liste von Programmen die kompatibel mit der Maus sind
- 3 Allgemeine Beschreibung
- 4 Wichtig
- 5 Verbindung mit einem Computer
- 6 Eigenschaften
- 7 Verwendung des Treiber
- 8 Troubleshooting
- 9 Technical specification
- 10 Information for developers
- 11 Manual in other langauges
Einführung
Dieses komplexe Interface wurde für die Enterprise 64/128 Computer Modelle entwickelt.
Die Fertigstellung ist der Höhepunkt von sechs Monaten Arbeit eines multidisziplinären Polnischen Entwicklers, der in einigen Foren als Pear bekannt ist (angestiftet vom spanischen Kollegen GFlorenz, der zusammen mit Zozo (aus Ungarn) einer der ersten Tester des EnterMice war).
Das Hauptziel des Adapters ist es, die Verwendung von billigen und gut verfügbaren PS/2 Mäusen am Enterprise Rechner zu ermöglichen. Zusätzlich ermöglicht er den Anschluss von zwei Joysticks nach dem Atari-Standard ohne zusätzliche Adapter.
EnterMice basiert auf Lösungen, die im BoxSoft Maus Interface verwendet wurden, das die Neos Maus unterstützt (MSX Protokoll)
Einer der EnterMice Arbeits-Modi ist voll rückwärtskompatibel mit dem alten BoxSoft Maus Interface. Ein anderer Arbeits-Modus wandelt die Maus Bewegungen in Joystick Pulsationen um.
Eine kleine Geschichte über den Enterprise und die Mäuse
Die Erweiterung des Enterprise 128 um die Möglichkeit eine Maus zu verwenden ist nicht neu und auch keine exzentrische Idee einiger Geeks einer Retro-Computing Gruppe, sondern war schon von den ursprünglichen Enterprise Designern geplant. Das Problem war, das die Aufgabe an eine einfache Englische Firma mit Namen Aztec Software Ltd abgegeben wurde, die eine enttäuschende Arbeit ablieferten. Vor allem aus aus zwei Gründen: Das Produkt war hässlich [1], nicht mal ansatzweise Nahe an der abgerundeten Form des Enterprise. Zweitens, war es keine richtige Maus, da sie auf emulierten Joystick Bewegungen basierte. Ebenso verschwand zu dieser Zeit auch Enterprise Computing Ltd.
Die Benutzer Basis in England blieb aber in den folgenden Jahren sehr aktiv. Kleine Firmen wurden von Enterprise Enthusiasten gegründet. Neue Produkte wurden angeboten: Speichererweiterungen, kundenspezifische Kabel, Spiele, Utilities, Spectrum Emulatoren, ein IDE Controller, Eprom, Erweiterungen der Hauptplatine, serielle Modems und so weiter.
Die profilierteste Firma war Boysoft, gegründet von dem Entwickler Tim Box. Boxsoft bot die meisten der oben angeführten Produkte an. Meist im Paket mit einem Zeichenprogramm namens Paintbox [2], sie vertrieben einen Adapter [3] plus eine Neo Maus inkl. einem Treiber. Die Neos, im Inneren [4] eine MSX Maus [5], wurde auch erfolgreich auf andere 8-Bit Computer wie den Commodore 64 umgesetzt.
Zu dieser Zeit hatten nur wenige 8-Bit Computer eine funktionierende Maus mit so was ähnlichen wie einem GUI. Es war schwierig etwas Neues zu verkaufen, dessen Nutzen unbekannt war und das nicht vollständig in den Computer integriert war. Aus heutiger Sicht ist der Vorteil der Bedienung eines Betriebssystems und Anwendungen mit einer Maus offensichtlich, die bequeme Handhabung wird sofort bemerkt, wenn die Maus die Arbeit einstellt...
Letztendlich wurden nur ungefähr hundert der Paintbox-Pakete verkauft.
Das Paintbox Programm erreicht Ungarn separat. Ungarn kauften Enterprise Computer nur mit dem Wissen, dass sie aus UK kamen, aber nicht viel mehr. Als alle Enterprise 128 verkauft waren, wurden die Benutzer, wie im Ursprungsland verlassen. Noch einmal boten neue Firmen neue Produkte an. Dann begann eine Firma mit Namen "A studio" die Box Soft Gegenstände herzustellen und zu vertreiben und tarnten sie dabei als ihre eigenen Produkte. Eines der Programme war eine Paintbox Version ohne die Maus Option. Es benötigte nach wie vor den Treiber, war aber ein verkrüppelte Version. Auf der östlichen Seie des eisernen Vorhangs hatte nie jemand von der Neos Maus gehört.
Später wurde in Ungarn eine serielle Erweiterungskarte [6] für den Enterprise umgesetzt, dank dem Genie eines Teams von ungarischen Entwicklern: Gyula Mészáros für die Hardware und László Haluska (HSOFT) für die Software. HSOFT nahm den verkrüppelten "A studio" Maus Treiber und modifizierte ihn so, dass das er zu dem seriellen Interface mit einer Mouse System Maus passte und lieferte später einen eingebauten Treiber für das EPDOS 2.x Betriebssystem.
Das sind uralte Geschichten, aber vor einigen Jahren mit WWW, Internet und Globalisierung, tauchten einige der alten Boxsoft+Neo Artefakte auf und alle Teile des Puzzles begannen zueinander zu passen. Endlichen wurden die alten Versprechungen (wie auf der Werbung der Enterprise Computers Ltd. zu sehen) eines wirklichen proprietären Enterprise Maus Interface Wirklichkeit
Das neue EnterMice Interface, das hier vorgestellt wird, basiert auf der Arbeit des Boxsoft Team, wurde aber auf einen aktuellen Stand gebracht und unterstützt zusätzliche Optionen. (Es ist ein Wunder was Tim Box mit nur ein paar logischen Gattern und Dioden damals gemacht hat[7]) Was die Software betrifft, wurde der Treiber von D. Rabson, Andrew Fitter und Andrew Richards sehr gut geschrieben. Mit kleinen Modifikationen wirde der gleiche Treiber vom EnterMice Adapter verwendet.
Das grundsätzlich Problem auf das man beim Enterprise trifft, ist das die Anschlüsse und Signale weit von einem Joystick-Maus Standard entfernt sind. Kleine Anschlüsse auf der Rückseite die leicht falsch herum benutzt werden können und dann +5V for die Knöpfe verwenden wo es normal 0 Volt wären. Das Fehlen eines Schutzes vor dem Signal das zurück kommt wenn zwei oder mehr Knöpfe gleichzeitig gedrückt werden, keine Möglichkeit Informationen oder Stati an den Controller zu senden und noch weitere Probleme.
Das was Boxsoft mit gewöhnlichen, billigen Komponenten erreicht hat, wurde neu designed und verbessert mit zwei programmierbaren Chips und anderen modernen Bauteilen. Einer der Chips (ein Xilinx) ist zuständig für das Pinout und die Signalumsetzung auf die Atari-Standard Anschlüsse. Das original Boxsoft Interface definierte/standardisierte nur den ersten Anschluss, der benutzt wurde um die Neos Maus oder einen Standard-Joystick anzuschließen (aber nicht beide zur gleichen Zeit). Im aktuellen Projekt werden zwei Joystick-Anschlüsse zur Verfügung gestellt und stören dabei den Maus-Anschluß nicht.
Die Neos/MSX Maus ist heute nicht weit verbreitet, so das ein PS/2 auf MSX Umsetzung integriert wurde. Dies wird durch einen einfachen und billigen 12 MHz Atmel AT89C4051 erledigt, der fähig ist sich selbst auf die Frequenz des im Enterprise verwendeten Z80 Prozessor einzustellen. Mit diesem Chip und dem entsprechenden Coding, kann EnterMice sowohl mit einem 4 Mhz EP als auch mit einem beschleunigten 10 MHz EP auf die gleich Weise arbeiten.
Ebenso wurde das Maus-Lese-Protokoll erweitert, dabei dem neuen erweiterten MSX Protokoll von Prodatron und NYYRIKKI folgend, so dass Informationen über fünf Knöpfe auf einer Maus mit Scrollrad gesendet werden können, wenn vorhanden.
Aktuelle Liste von Programmen die kompatibel mit der Maus sind
Paintbox mit dem Maus-Treiber
The Enterprise Graphical Interfance mit dem Maus-Treiber
SymbOS intern, nur im Boxsoft Modus, aber bald auch im EnterMice Modus
Programme in Basic können mit dem Maus-Treiber arbeiten
Alte Programme die Joystick Anschluss 1 verwenden, mit EnterMice im Joystick Modus.
EPDOS 2.X intern, nur mit einer seriellen Erweiterungskarte.
Allgemeine Beschreibung
Wichtig
Das Interface darf nicht angeschlossen werden wenn der Computer eingeschaltet ist !
Wenn nach dem Anschluß des Interface der Computer nicht normal startet oder sich ungewöhnlich verhält, muss er sofort abgeschaltet werden !
Prüfe ob das Interface richtig verbunden ist und versuche es nochmal.
Maus und Joystick können ein- und ausgesteckt werden, während der Computer eingeschaltet ist, ist aber nicht empfohlen. Es ist sicherer Geräte anzuschließen wenn der Computer ausgeschaltet ist.
Warnung: Bitte lese den Abschnitt "Anschluss anderer Geräte an EnterMice" bevor du ein Gerät anschließt, für das das EnterMice ursprünglich nicht entwickelt wurde.
Verbindung mit einem Computer
Das Interface sollte gleichzeitig mit allen drei Anschlüssen auf der Rückseite des Enterprise verbunden werden: Control 1, Control 2 und Serial. Wie man erkennen kann, sind die Anschlüsse in einem etwas größeren Winkel als 90 Grad verbaut. Das ist beabsichtigt um sicher zu stellen, das das Entermice besser zur Form der Rückseite der Enterprise passt.
Es kann nur auf eine Art eingesteckt werden, aber die Anschluss-Pins könnten evt. nicht zentriert auf den Kontakten der Anschlüsse auf der Rückseite sitzen. Wenn das passiert könnte der Kontakt instabil sein und/oder das Interface nicht richtig funktionieren.
Richtig verbunden, funktioniert das Interface direkt nach einschalten des Stroms.
Nach dem Einschalten wird ein Selbs-Test durchgeführt, während dem sowohl das rote als auch das grüne LED dreimal blinken (unabhängig von der Einstellung von DIP-Schalter drei).
Das Entermice ist mit einem sogenannten "Hot-Plug" ausgestattet, so dass eine Maus während des Betriebs eingesteckt werden kann und dann auch klassifiziert und initialisiert wird und damit funktioniert. Allerdings ist es ratsam die Maus an das Entermice anzuschließen bevor der Enterprise eingeschaltet wird.
Nach erfolgreichem Abschluß der Initialisierung der Maus, leuchtet das grüne LED (wenn DS3 ON ist).
Eigenschaften
Das Interface kann in verschiedenen Modi arbeiten. Zur Konfiguration steht ein DIP-Schalter mit fünf Sektionen zur Verfügung.
Die Konfigurations-Einstellungen kann während das Interface in Betrieb ist geändert werden. Das Computer muss dazu nicht neu gestartet werden.
Hier ist die Beschreibung aller möglichen Einstellungen.
DS1 | DS2 | Arbeits Modus |
---|---|---|
ON | ON | EnterMice nativer Modus |
OFF | ON | BoxSoft Maus-Modus. Die zwei Haupt-Knöpfe sind vertauscht. Der Hauptknopf ist nun der rechte Knopf. |
OFF | OFF | EnterMice Joystick Modus (Bewegungen mit der Maus werden auf den Eingang von Joystick 1 umgeleitet und dieser Anschluss wird dekativiert) |
ON | OFF | nicht benutzt (tatsächlich aber EnterMice als Joystick auf der Tastatur Spalte K) |
Joystick 2 arbeitet immer auf die gleiche Weise, unabhängig von dem auf dem Interface ausgewählten Modus.
DS3 | LED Status |
---|---|
OFF | LED Status deaktiviert |
ON | LED Status aktiviert |
Konfiguration des Joystick Emulations Modus
DS4 | Empfindlichkeit |
---|---|
OFF | normal |
ON | hoch |
DS5 | diagonale Korrektur |
---|---|
OFF | deaktiviert |
ON | aktiviert |
Die diagonale Korrektur verbessert die Präzision der Joystick Simulation bei diagonalen Bewegungen, auf Kosten einer geringen Abnahme der Geschwindigkeit.
Verwendung des Treiber
Hier [8] kannst Du den Treiber finden.
Die folgenden Anweisungen wurden dem originalen Paintbox Handbuch entnommen, korrigiert und die neuen EnterMice Fähigkeien hinzugefügt.
Die Maus und wie sie in deinen Programmen zu verwenden ist
Die Verwendung der Maus ist nicht auf Programme in Maschinensprache beschränkt, sie kann auch gant einfach in fast jedes Basic Programm eingebunden werden. Dazu ist die Verwendung einer EXOS Erweiterung namens "mouse driver" ("Mouse.xr") nötig.
Dieser Geräte-Treiber platziert auf jedem Grafik-Bildschirm einen Zeiger und bewegt diesen durch die Überwachung der Maus-Bewegung synchron über den Bildschirm.
Der Maus Treiber kann angewiesen werden verschiedene Befehle und Funktionen auszuführen - z.B. den Zeiger ein- und ausschalten. Es gibt zwei Wege mit dem Maus Treiber zu kommunizieren, wobei der erste ist, ihn zu lesen und zu schreiben und der zweite ist durch System Variablen.
Laden
Der Maus Treiber kann durch viele Methoden geladen werden; "START" aus Basic (wenn von Kassette) oder load "MOUSE.XR". Es kann auch aus "WP", aus EXDOS oder jeder anderen Sprache geladen werden (bitte die entsprechende Sprache zu Rate ziehen).
Einmal geladen bleibt er resistent bis zum nächsten Hard-Reset oder wenn der Rechner ausgeschaltet wird.
Um richtig zu funktionieren ist es notwendig ihn mit dem EXOS Befehl ":PB" zu initialisieren. EGI und Paintbox machen das intern.
Die angezeigte Fehlermeldung einfach ignorieren. Der Fehlercode (in BASIC mit EXTYPE zu erhalten) lautet 9000+Speicherseite wo der Treiber geladen wurde. Das wurde bewusst von den Autoren des Treibers so gemacht.
Eine Version die sich selbständig initialisiert kann zur Verfügung gestellt werden, funktioniert dann aber nicht mit EGI oder Paintbox, sondern nur in Basic.
Lade nie zwei Instanzen des Treiber oder führe zweimal den Initialisierungs Befehl aus, da der Enterprise dadurch abstürzen könnte.
Das Ausführen von ":MOUSE" zeigt einige Informationen über den Treiber und, falls eine EnterMice eingesteckt ist, ebenfalls Information über dieses Gerät.
Kommunikation mit dem Maus-Treiber
Wie oben beschrieben gibt es zwei Wege um mit dem Maustreiber zu kommunizieren. Um diese zwei Methoden und ihre Aktionen zu demonstrieren, sollten wir erst einen Blick auf alle Befehle, funktionen und Variablen werfen und dann ihre Verwendung in einem Programm demonstrieren.
Gedruckt Befehle und Funktionen
Die erste und wichtigste Aktion ist es, einen Kanal für die Maus zu öffnen, z.B. OPEN £?:"MOUSE:" (? ist eine Kanal Nummer).
Befehle die durch Drucken von Zeichen auf dem Maus-Kanal ausgeführt werden:
O | Mauszeiger einschalten |
---|---|
o | Mauszeiger ausschalten |
P | X & Y Position anfordern |
Ergebnisse oder Stati die erhalten werden durch das Lesen eines Zeichens vom Maus-Kanal:
Nur Lesen nach dem Senden von "P":
X | Low byte |
X | High byte |
Y | Low byte |
Y | High byte |
Immer lesbar:
Feuer = "1" wenn der Haupt-Knopf gedrückt ist, "0" wenn nicht.
System Variablen
Addresse | Inhalt | Standard |
---|---|---|
180 | Video Kanal, Zeige muss "Ein" sein | 101 |
181 | Position von X,Y Koordinaen auf der Sttatuszeile | 30 |
182 | Status Koordinaten Anzeige: 1 ein, 0 aus | 0 |
183 | Farbe des Zeigers {prüfe Technische Sektion} | 255 |
184 | Low Byte der X Koordinate | |
185 | High Byte der X Koordinate. Prüfe das Demo Programm für dei Koordinaten Umwandlung | |
186 | Low Byte der Y Koordinate | |
187 | High Byte der Y Koordinate | |
188 | Status des Feuerknopf, 0 aus, 1 ein | |
189 | Eingabe-Gerät:
0 - interner Joystikc 1 - Control 1 2 - Control 2 3 - Boxsoft 4 - EnterMice (Standard) 5 - Serial Mouse Sytems 6 - Serial Microsoft in einer zukünftigen Version(aktuell verhält sich 6 wie 5) >6 - nicht implementiert |
|
190 | Status des zweiten Knopf und Ersatzknopf falls vorhanden, Zähler des Mausrads wenn vorhanden
Bits 0 to 3 signiertes Halbbyte des Mauszählers(7 -> -8) Bit 4 Mausrad-Knopf Bit 6 and 5 Ersatzknöpfe Bit 7 zweiter Knopf Stati der Knöpfe: 0 aus, 1 ein |
Beispiele
100 PROGRAM "ms_test.bas" 110 NUMERIC X,V,MAX_Y",X_COUNT,LASTX,LASTY 120 GRAPHICS 130 CALL MOUSE_SETUP 130 OPEN £1:"mouse:" ! Open a channel to the Mouse 140 DO 15D CALL MOUSE_POS 160 LOOK 1:FIRE ! Check the fire button 170 IF FIRE THEN 130 PRINT £1:"o"; ! Turn the pointer off 190 PLOT LASTX,LASTY,X,Y 200 PRINT 1:"O"; ! Turn the pointer on 210 ELSE I10 PLOT X,Y, 230 END IF 240 LET LASTX=X:LET LASTY=Y 250 LOOP 250 END 270 DEF MOUSE_SETUP 280 LET CHAR_Y=20 ! No. of characters screen high 290 LET X_COUNT=2 ! Pixel calc no 300 SET 180,101 ! Video channel to put mouse pointer on 310 SET 181,30 ! Position of co-ordinates on status line 320 SET 182,1 ! Show co-ordinates 330 SET 183,255" ! Colour of pointer 310 LET MAX_Y=CHAR_Y*36-2 ! Convert char_y to co-ordinates 350 END DEF - Beachte X_COUNT ist = "2" in 2 Farben-Modus, "4" in vier Farben-Modus, "8" in 16 Farben-Modus und "16" in 2500 Farben-Modus. Alle diese Werte verdoppeln sich in LoRes.
Nun musst du die MOUSE_POS Routine hinzufügen. Diese überträgt die Maus-Position an den Treiber. Wähle einen der folgenden beiden Wege:
Lesen der Zeiger Koordinaten durch das Lesen vom Maus-Kanal.
DEF MOUSE_POS PRINT £1:"P" LOOK £1:XL LOOK £1:XH LOOK £1:YL LOOK £1:YH LET X=XL+256*XH LET Y=YL+256*YH END DEF
Lesen der Zeiger Koordinaten aus den System-Variablen.
DEF MOUSE_POS ASK 184 XL ASK 185 XH ASK 186 YL ASK 187 YH LET X1=XL+256*XH LET X=X1*X_COUNT LET Y=YL+256*YH LET Y=Y*2 LET Y=MAX_Y—Y END DEF
Du kanns adem Treiber auch befehlen den Zeiger an die gewünschte Stelle zu setzen:
Setzen der Maus Koordinaten durch die System Variablen.
DEF POS_MOUSE LET X=INT(X/X_COUNT) LET XL=X-256*INT(X/256) LET XH=INT(X/256) LET Y=MAX_Y-Y:LET Y=INT(Y/2) LET YL=Y-256*INT(Y/256) LET LET YH=INT(Y/256) SET 184,XL SET 185,XH SET 186,YL SET 187,YH END DEF
Dieses Programm ist eine sehr einfaches Zeichen Programm; einfach eine Linie zeichnen um der Bewegung der Maus zu folgen wenn der Maus-Knopf gedrückt ist. Ein Aufruf an MOUSE_POS wird in Zeile 150 gemacht, davon abhängig wie die Daten gelesen werden sollen, musst du die entsprechende Prozedur von den beiden aufgeführten, einfügen. Es ist noch einer andere Prozedur angeführt, deren Routine dir die Möglichkeit gibt die Position des Zeigers fest zu legen. Ruf sie einfach auf mit der gewünschten Position in der Variablen X und Y auf, experimentiere mit den verschiedenen Routinen. teste sie und füge sie deinen eigenen Routinen hinzu. Es wird nicht lange dauern ein Gefühl dafür zu entwickeln und nach einer kurzen Zeit wirst du entdecken wie einfach es ist die Maus in existierende Programme einzubinden und spezielle Programm für die Maus zu entwickeln.
Benutzung des Mausrads und der Extra-Knöpfe in eigenen Programmen
Die Verwendung von Bits in Enterprise Baisc ist langsam und schwierig. Die System Variable 190 enthält viele Infomationen, diese sind aber nicht einfach zu extrahieren. Du kannst diese Maschinen-Sprache Routine in einem Basic Programm verwenden um es in fünf Bytes zu zerteilen. Zusätzlich setzt diese MC Routine den Z_COUNTER immer bei Ausführung auf Null:
100 ALLOCATE 42 110 CODE XPLOD=HEX$("18,05,00,00,00,00,00,23,06, 00,0E,BE,F7,10,FE,00,C0,7A,06,04,23,36,00,17,CB, 16,10,F8,23,7A,36,00,ED,6F,57,06,01,0E,BE,F7,10,C9") 120 GRAPHICS 130 OPEN £1:"MOUSE:" ><><><><><><> 520 CALL USR(XPLOD,XPLOD)! We pass the XPLOD address in "hl" register pair ><><><><><><> 930 PRINT PEEK(XPLOD+2)! Secondary mouse button \ 940 PRINT PEEK(XPLOD+3)! Spare button \ 950 PRINT PEEK(XPLOD+4)! Spare button / 0 idle, 1 pressed 960 PRINT PEEK(XPLOD+5)! Wheel button / 970 LET B=PEEK(XPLOD+6)! Z_COUNTER(wheel) two's complement 7 to -8 980 IF B<8 THEN PRINT B 990 IF B>7 THEN PRINT B-16
Hier ist das Disassembly der Mschinensprache Routine:
ORG: jr CODE ;hl contains the ORG address BUTTON2: db 0 BUTTON3: db 0 BUTTON4: db 0 BUTTON5: db 0 Z_COUNT: db 0 CODE: inc hl ld b,0 ; read ld c, 0BEh ; 190 rst 030h db 10h ;EXOS 16, Read System Var 190 cp 0 ret nz ; if var 190 not found, the driver has not been loaded, return to Basic ld a, d ;put the obtained value in "a" to be exploded ld b, 4 ; we need a count of 4 for the buttons loop LOOP: inc hl ld (hl), 0 ; we don't need old values rla ; rotate left "a" and put bit 7 on carry rl (hl) ; put the carry bit on bit 0 of (hl) djnz LOOP inc hl ; we still have to extract the wheel count ld a,d ; recover original 190 variable content on "a" ld (hl), 0 ; we don't need old value rld ; we are only interested on low nibble of "a" ld d, a ; a nibble filled of zeros has come from (hl) to reset the wheel counter ; on low nibble of "a" but leaving the buttons intact on high nibble ld b, 1 ; now we need to write the variable ld c, 0BEh ; 190 rst 030h db 10h ;EXOS 16, Write System Var 190 ret ;return to Basic
Dies ist eine Erklärung der Prozedur um das Mausrad zu programmieren:
Das niedrige Halbbyte der System-Variable 190 enthält die Anzahl der Impulse die vom Mausrad seit dem letzten Reset empfangen wurden. Die Impulse sind psotiv oder negativ, der Treiber addiert oder subtrahiert sie zum Zähler, der einen Wert von 7 bis -8 haben kann. Das Programm muss eine Timer-Routine zur Verfügung stellen, die den Zähler prüft (mit XPLOD). Einmal geprüft, wird der Zähler auf 0 zurückgesetzt (ebenso durch die XPLOD Routine) und der Wert, der gfunden wird (XPLPD+6) kann für eine Aufgabe verwendet werden, zum Beispiel zum Scrollen des Bildschirms.
Geht man davon aus, das der zweite Maus-Knopf auch "verdrahtet" ist und daher auch drekt von der Tastatur-Matrix gelesen werden kann (mit der beschriebenen Routine aus dem Abschnit "Lesen des Joystick Interface") oder einfacher durch vergleichen von Variable 190 mit Variable 127 (der zweite Knopf ist das 7 bit):
ASK 190 SECBUTT IF SECBUTT>127 THEN GOTO MENU !secondary mouse button pressed!!!
Technische Informationen zum Treiber
Durch Ausführen des HELP Befehls in EXOS kannst du die Version des Teribers in einer Liste sehen die alle Erweiterungen anzeigt.
Zur Zeit arbeitet der Treiber nur in graphischen Modi, es ist aber geplant eine Art von Zeiger auch im Text Modus zu implementieren. Einmal erreicht, wird es einfach sein die Maus z.B. im Basic Editor, WP oder EXDOS zu verwenden.
Werte für EXOS Variable 183 zum Wechseln der Farbe des Mauszeigers
Einstellung | Resultat | |
---|---|---|
INK | Farbe | |
2 Farben-Modus | 0 | 0 |
255 | 1 | |
4 Farben-Modus | 0 | 0 |
240 | 1 | |
15 | 2 | |
255 | 3 | |
16 Farben-Modus | 0 | 0 |
192 | 1 | |
12 | 2 | |
204 | 3 | |
36 | 4 | |
228 | 5 | |
48 | 6 | |
240 | 7 | |
3 | 8 | |
195 | 9 | |
15 | 10 | |
207 | 11 | |
51 | 12 | |
243 | 13 | |
63 | 14 | |
255 | 15 | |
256 Farben-Modus | 0-255 | 0-255 |
Joystick mode of the EnterMice mouse interface
A mouse plugged on the EnterMice PS/2 port is not just restricted to acting as a mouse, it can be made to simulate a joystick. To activate this mode you must put to OFF both DS1 and DS2 switches. The interface then will convert the mouse movement on the PS/2 connector to joystick movement on Joy 1 port. You don't have to unplug your real joystick from that port as it will be disabled. The mouse will then send movement like that of a joystick, useful to manage old programs or games.
If DS3 is ON, in joystick mode lights up red LED. It's blinking when any direction-contact is shorted.
NOTE: The fire button is the left hand button on the mouse. To make use of the right hand button use the routines shown in the section on the mouse interface.
The joystick ports
The EnterMice mouse interface will not only work as a mouse interface but as an intelligent joystick interface. Any ATARI-Kempston-Amiga style joystick can then be inserted into one of the two 9 pin connectors at the back of the interface board. If the joystick has an autofire option it will work. Mouse and joysticks can stay connected at the same time as they don't interfere one to the others.
Reading the joystick interface
Originally the control ports of the Enterprise only had 1 FIRE button, but now the EnterMice interface provides two more on both ports. Obviously, they will not work on old games, only on new releases or new conversions of games.
All normal methods of reading the two ports work. The only extra code required is to read the extra fire buttons. An example of the code is listed below.
100 PROGRAM "JOYFIRE2.BAS" 110 ALLOCATE 40 120 CODE FIRE=HEX$("7C,F3,D3,B5,DB,B6,FB,A5,28,04,21,00,00,C9, 21,01,00,C9") 130 DO 140 LET FIRE2=USR(FIRE,4) 150 IF FIRE2 THEN PRINT "FIRE I PRESSED" 160 LOOP
This is the disassembly of that little code:
org: 7c ld a,h ; h is the row, l is the column. (H*256+L) f3 di d3b5 out (b5h),a dbb6 in a,(b6h) fb ei a5 and l ; bit 0 is J column, bit 1 is K column, and bit 2 is L column. 2804 jr z,pressed 210000 ld hl, 00h c9 ret pressed: 210100 ld hl,01h c9 ret
You can read the three Fire buttons of the two joystick ports of EnterMice changing in the Basic line "140 LET FIRE2=USR(FIRE,4)", the "4" by a "1" or a "2".(H=0) For the second port you must use "1281","1282" or "1284".(H=5)
This method also can be utilised to read the two main mouse buttons, that are shared with the FIREs of control 1.
Troubleshooting
Keyboard issue
During the creation of the EnterMice, a fairly serious error in the design of the Enterprise was casually discovered.
It stays totally unnoticed if nothing is connected to the ports Control 1 and Control 2. However, the EnterMice uses them...
The issue is about interferences on KB0..KB9 ports from keyboard, that are also utilised by the control ports.
If only one key is pressed at the keyboard, then nothing wrong happens (see figure 1).
However, if you press two keys in the same column simultaneously, the signal from the selected line will be transferred to the line of the second key as well (figure 2).
The Enterprise lacks blocking return diodes to separate the rows of the keyboard!
Electrically nothing will happen (the LS145 decoder inside the computer has open collector outputs), but reading from the external ports Control 1 and Control 2 causes errors.
In order to eliminate the cause, diodes should be added to each row of keys on the Enterprise, to avoid that pressing more than one key it can cause "collisions" (figure 3).
Pear has prepared a draft of a PCB to fix it, but it has not been tested yet. In the meanwhile, in order to avoid errors, the keyboard should not be operated while joysticks or mouse are in use.
Microsoft Optical Mouse
The PS/2 Microsoft Optical Mouse is a special case. It should be only connected inserted on its original Microsoft USB to PS/2 converter. It will work with EnterMice if connected before power on, but in this particular case, you can not use the hot-plug feature as it will be not recognised.
EnterMice can be forced to recognise the Microsoft mouse during operation, you only need to momentarily short the RESET pin-header on the interface or press RESET button on newer board version (it resets only the interface, not the computer).
Technical specification
Joystick port pinout
pin | signal |
---|---|
1 | Up |
2 | Down |
3 | Left |
4 | Right |
5 | Fire 3 |
6 | Fire 1 |
7 | +5 V |
8 | GND |
9 | Fire 2 |
Control Map
J column (bit 0) | K column (bit 1) | L column (bit 2) | |||||
---|---|---|---|---|---|---|---|
JM=0* | JM=1* | JM=0 | JM=1 | JM=0 | JM=1 | ||
Control 1 | Row 0 Fire | Joy 1 Fire 1 | Mice Left Btn | Mice Left Btn or Joy 1 Fire 2* | Joy 1 Fire 2 | Mice Right Btn or Joy 1 Fire 3* | |
Row 1 Up | Joy 1 Up | Mice D0 | Mice D0 | spare | spare | spare | |
Row 2 Down | Joy 1 Down | Mice D1 | Mice D1 | spare | spare | spare | |
Row 3 Left | Joy 1 Left | Mice D2 | Mice D2 | spare | spare | spare | |
Row 4 Right | Joy 1 Right | Mice D3 | Mice D3 | spare | spare | spare | |
Control 2 | Row 5 Fire | Joy 2 Fire 1 | Joy 2 Fire 2 | Joy 2 Fire 3 | |||
Row 6 Up | Joy 2 Up | spare | spare | spare | spare | ||
Row 7 Down | Joy 2 Down | spare | spare | spare | spare | ||
Row 8 Left | Joy 2 Left | spare | spare | spare | spare | ||
Row 9 Right | Joy 2 Right | spare | spare | spare | spare |
* Mouse buttons have higher priority * JM=0 (DS1 ON) native EnterMice mouse mode JM=1 (DS1 OFF) joystick emulation & BoxSoft compatible mode
Anschluss anderer Geräte an EnterMice
SEGA Twister
to connect the Sega six-button pad [9]
Sega Six Button Controller Hardware Info
Interface Protocol of SEGA MegaDrive's 6-Button-Controller
pin | Select = Low | Select = High | Select = pulse-3 |
---|---|---|---|
1 | Up | Up | Button Z |
2 | Down | Down | Button Y |
3 | GND | Left | Button X |
4 | GND | Right | not used |
5 | +5V | ||
6 | Button A | Button B | not used |
7 | Select | ||
8 | GND | ||
9 | Start | Button C | not used |
Neos mouse
pin | Function |
---|---|
1 | Up |
2 | Down |
3 | Left |
4 | Right |
5 | Not connected |
6 | /Strobe - Left Switch |
7 | +5V |
8 | GND |
9 | Button Switch Right |
MSX mouse
pin | Function |
---|---|
1 | Up |
2 | Down |
3 | Left |
4 | Right |
5 | +5V |
6 | Button Switch Left |
7 | Button Switch Right |
8 | Strobe |
9 | GND |
USB gadgets
Information for developers
EnterMice timings
The firmware of EnterMice is optimized for the cyclic reading with 50 Hz frequency (video IRQ).
Default reading cycle | 20 ms |
Waiting time to perform self-test the PS/2 mouse (timeout) | ca. 2000 ms |
Time of collecting the PS/2 mouse data | max. 12 ms |
Time from change state of RTS signal to issue data (nibble) for reading | 25 μs |
Standby time for the next reading (counting from data issue) | 14 μs |
Time from read the last nibble of data to reset the nibble counter (timeout)* | 1500 μs |
Default mouse polling time in joystick emulation mode | 30 ms |
Mouse polling time in joystick emulation mode when mouse doesn't move (minimize polling delay) | 12,5 ms |
* After this time starts another mouse data polling.
Data buffer
Data buffer in EnterMice has a size of 16 bytes.
Currently is used only a half. The remainder may be used in the future.
Bits | High nibble | Low nibble | Content | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Byte | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||||
0 | X value | signed int (positive is moved left) | BoxSoft protocol | |||||||||
1 | Y value | signed int (positive is moved up) | ||||||||||
2 | 0 | 0 | 0 | 1 | 0 | Btn5 | Btn4 | Btn3 | Protocol identification & buttons 3,4,5 state (1=pressed) | Extended MSX protocol | ||
3 | Horizontal wheel* | Z value | signed int (positive is wheel moved up) | |||||||||
4 | ExCnt | Mouse ID | Extra bytes available to read (include this) & PS/2 mouse ID | EnterMice extension protocol | ||||||||
5 | Hw ver. mj. | Hw ver. mn. | Hardware version (major.minor) | |||||||||
6 | Fw ver. mj. | Fw ver. mn. | Firmware version (major.minor) | |||||||||
7 | Device ID | EnterMice ID is 5Dh |
* not implemented yet, now all 8 bits represents a Z value (Vertical wheel)
You do not need to read all the data from the buffer.
Reading can be interrupted at any time. There will be the timeout and interface performs another read data from mice, then once again be ready to send data.
Last state of RTS signal also not matter. EnterMice reacts to the change state, not on the signal level.
Mouse reading
; Here begin the Neos mouse reading | ||
ld hl,X_REL | ; first byte | |
ld a,2 | ; put RTS low, the contrary to normal MSX | |
out (0B7h),a | ||
ld b,3 | ; long delay. Stock was 8 | |
call WAIT | ||
call READ_4BIT | ; read four higher bits | |
rld | ; push them in (HL) | |
xor a | ; put RTS high | |
out (0B7h),a | ||
ld b,2 | ; short delay. Stock was 5 | |
call WAIT | ||
call READ_4BIT | ; read four lower bits | |
rld | ; push them in (HL) | |
ld hl,Y_REL | ; second byte | |
ld a,2 | ; put RTS low | |
out (0B7h),a | ||
ld b,2 | ; short delay. Stock was 5 | |
call WAIT | ||
call READ_4BIT | ; read four higher bits | |
rld | ; push them in (HL) | |
xor a | ; put RTS high | |
out (0B7h),a | ||
ld b,2 | ; short delay. Stock was 5 | |
call WAIT | ||
call READ_4BIT | ; read four lower bits | |
rld | ; push them in (HL) | |
;<======Here will be added the future Wheel and three spare buttons reading. SECOND TENTATIVE | ||
ld hl,SW_Z_STATUS | ||
ld a,2 | ; put RTS low | |
out (0B7h),a | ||
ld b,2 | ; short delay. Stock was 5 | |
call WAIT | ||
call READ_4BIT | ; read four higher bits | |
and 15 | ||
cp 1 | ; IF THIS NIBBLE=0001 THEN THE MOUSE IS IN EXTENDED PROTOCOL | |
jr z,CONTINUE_READ | ||
xor a | ; we must leave RTS high for the next mouse reading cycle | |
out (0B7h),a | ;IGNORE THAT NIBBLE | |
ld (hl),0 | ; we don't need old values | |
jr STOP_READ | ||
CONTINUE_READ: | ||
xor a | ; put RTS high | |
out (0B7h),a | ||
ld b,2 | ; short delay. Stock was 5 | |
call WAIT | ||
call READ_4BIT | ; read four higher bits, the three lower bits are the buttons. They come ready to store | |
push af | ; push them in stack. they are in the lower nibble. | |
ld a,(hl) | ; | |
push af | ;save the Z counter for later. | |
ld a,2 | ; put RTS low | |
out (0B7h),a | ||
ld b,2 | ; short delay. Stock was 5 | |
call WAIT | ||
call READ_4BIT | ; read four bits | |
rld | ;we need z displacement in 8 bit | |
xor a | ; put RTS high for the next mouse reading cycle | |
out (0B7h),a | ||
ld b,2 | ; short delay. Stock was 5 | |
call WAIT | ||
call READ_4BIT | ; read four lower bits. Z displacement | |
rld | ; push them in (HL) ;NOW WE HAVE Z displacement in (hl) | |
pop af | ; restored Z counter to "a", but we have garbage on high nibble | |
and 00Fh | ||
bit 3,a | ||
jr z,SIGN_DONE | ||
or 0F0h | ||
SIGN_DONE: | ; now we have the sign extended to 8 bits on "a" | |
add a,(hl) | ||
cp 128 | ; positive or negative? | |
jr c,POSITIVE | ||
cp 248 | ; lower than -8? | |
jr nc,FINISHED | ; | |
ld a,248 | ; -8 is the bottom | |
jr FINISHED | ||
POSITIVE: | ||
cp 8 | ; higher than 7? | |
jr c,FINISHED | ||
ld a,7 | ; 7 is the top | |
FINISHED: | ; the excess of 7 or -8 has been wiped | |
ld c,a | ; save Z addition on c | |
pop af | ; retrieve the buttons status. They are now on first nibble of a | |
rld | ; buttons stored | |
ld a,c | ; we only need the first nibble of Z counter addition | |
rld | ; the spare buttons status and the Z counter are now in SW_Z_STATUS | |
STOP_READ: | ||
xor a | ; recall buttons on row 0 | |
out (0B5h),a | ||
in a,(0B6h) | ; read Mouse buttons | |
and 7 | ; mask | |
xor 7 | ; flip them all as on Enterprise a pressed key is 1 and released 0 | |
rl (hl) | ; Get ready the bit 7 of "hl" register pair. Inside is SW_Z_STATUS, variable number 190 | |
srl a | ; This is the very FIRST "srl a". The button status is now in the carry flag | |
; secondary button of Boxsoft is read on J column. Primary button of EnterMice is read on K column | ||
push af | ||
ld a,(INPUT_DEVICE) | ||
cp 3 | ; Boxsoft interface mode buttons | |
jr nz,L_BUTTON | ||
pop af | ; We need the value of "a" and "f" registers. Carry flag still stores the value of secondary button | |
rr (hl) | ; secondary button goes to bit 7 of SW_Z_STATUS, variable number 190 | |
srl a | ; Primary button of Boxsoft is on J column. This is the second "srl a" | |
JR MAIN_BUTTON | ||
L_BUTTON: | ; EnterMice interface mode buttons | |
pop af | ; retrieve the value of register "a". "f" is disposable, soon we will load the button on carry flag | |
push af | ; I still will need later the register "a" value | |
srl a | ; two "srl a" because the secondary button of EnterMice is read on L column | |
srl a | ; the proper button status is now in the carry flag | |
rr (hl) | ; secondary button goes to bit 7 of SW_Z_STATUS, variable number 190 | |
pop af | ; retrieve the value of register "a" just after the FIRST "srl a" | |
MAIN_BUTTON: | ||
and 1 | ||
ld (FIRE_STATUS),a | ; EXOS Variable 188. K column if Boxsoft or L column if EnterMice | |
call sub_C3A6 | ; this is the "corrections and drawing" routine where the "velocity" 1.1 modification was made | |
ld a,(X_REL) | ||
ld c,a | ||
ld a,(Y_REL) | ||
or c | ||
ret | ||
XXXXXXXXXXXXXX | XXXXXXXXXXXXXXXXXXXX | XXXXXXXXXXXXXX |
WAIT: | ||
nop | ||
nop | ||
nop | ||
dec b | ||
jr nz,WAIT | ||
ret | ||
XXXXXXXXXXXXXX | XXXXXXXXXXXXXXXXXXXX | XXXXXXXXXXXXXX |
READ_4BIT: | ; I split the routine in two to not put more processor time | |
ld b,4 | ||
ld d,0 | ||
ld a,(INPUT_DEVICE) | ||
cp 3 | ||
jr z,L_COLUMN | ||
K_COLUMN: | ||
ld a,b | ||
;inc c | ; this is not necessary | |
out (0B5h),a | ||
in a,(0B6h) | ||
;ld c,a | ; this is not necessary | |
rra | ; data read from K column | |
rra | ||
rl d | ||
djnz K_COLUMN | ||
jr CONTINUE | ||
L_COLUMN: | ||
ld a,b | ||
;inc c | ; this is not necessary | |
out (0B5h),a | ||
in a,(0B6h) | ||
;ld c,a | ; this is not necessary | |
rra | ; data read from L column | |
rl d | ||
djnz L_COLUMN | ||
CONTINUE: | ||
ld a,d | ||
ret |