EnterMice (Deutsch)

From Enterprise Wiki
Jump to: navigation, search
EnterMice

Joysticks & PS/2 Mouse Interface for Enterprise 64 & 128 computer

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 GFlorez, 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

Multiplay, Iview, Cview, by Istvan-V.[8]+ File, by Zozosoft.[9]

File.jpg

Paintbox mit dem Maus-Treiber[10]

Paintbox.png

The Enterprise Graphical Interface mit dem Maus-Treiber[11]

EGI.JPG

SymbOS intern, nur im EnterMice Modus by hack[12].By Prodatron[13].

SymbOS.png

Programme in Basic können mit dem Maus-Treiber arbeiten

Alte Programme die Joystick Anschluss 1 verwenden, mit EnterMice im Joystick Modus.

EDC Windows, internally in EnterMice mode and Hsoft driver mode. Use this modified executable: [14]

Edcw.png

SPEmu128 from geco, the great Spectrum emulator for Enterprise, now is capable of emulate Kempston-mouse adapted games[15] from EnterMice mouse movement. The list of compatible games is growing constantly.[16]

Moorhun.png

Games list

Pasziansz(Solitaire)[17]. Rom version[18]

Pasziansz1.PNG

SWAP [19]

Swap.gif

Wolf2004 First person shoot'em up. ZX conversion by Geco[20]

Wolf2004.png

Bricky Prise. Created by Geco, Endi and Szipucsu. Adapted to EnterMice by Isvan-V. [21] and [22]

Bricky.png

Five in a Row. Strategy game written in Basic. Adapted to EnterMice by Lacika. [23]

Fiverow.jpg

Chess Master 2000 Amstrad conversion by Geco[24]

Cm2000.JPG

XEP128 and EP128emu Emulators

Auch wenn du keinen EnterMice Adapter hast, kannst du das Gefühl probieren, einen emulierten Enterprise mit Maus im PC zu benutzen. LGBs tolles XEP128[25] Emulator kann ihn jetzt mit der PC Maus exakt emulieren. You can even combine it with SPEmu128 to emulate a Spectrum within the emulated Enterprise. The Kempston mouse will obey your PC mouse movements...

Here[26] is an explanation on how to organize the XEP128 emulator to correctly work on a Windows PC.

And here[27] is the explanation for OSX.


Thanks to the works of LGB on his XEP128 emulator, IstvanV has also updated EP128emu for EnterMice emulation. There is a Windows installer for easy installation.

You can download the current version here[28].

Allgemeine Beschreibung

EnterMice Vorderseite
EnterMice Rückseite

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 Selbst-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. Der 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 [29] 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 ganz einfach in fast jedes Basic Programm eingebunden werden. Dazu ist die Verwendung einer EXOS Erweiterung namens "mouse driver" ("Mouse.xr") nötig.

This device driver will place a pointer on any graphic or text screen and by monitoring the movements of the mouse it will move the pointer around the screen in sync with it. The pointer on text video pages works internally on pixel coordinates, but is drawn only in character boundaries, so the movement can be shown as jerky on short distances.

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.

Here is a simple way to detect if the driver has been already loaded in Basic:

100 WHEN EXCEPTION USE DRIVER_LOADING
110      SET 189,4 ! try to set EnterMice control mode. Only possible if the driver has been installed.
120 END WHEN


1000 HANDLER  DRIVER_LOADING
1010      EXT "LOAD MOUSE.XR" ! The file has to be on the current directory, if not, the program will give us another error.
1020      PRINT "Loading the Mouse Driver"
1030      SET 189,4                  ! Here we assume that the driver has been correctly installed.
1040 END HANDLER

It can be made more complex and effective, setting a variable on the handler to signal the not-loaded status, loading the driver on the main program. Then, if the file is not found(probably we are on another path), the error can be parsed on the same or on another handler.

It is a good practice to avoid installing several instances of the Mouse Driver.

Das Ausführen von ":HELP 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).

Take in account that a mouse channel is always associated to a video channel where to draw the pointer. Opening a mouse channel without a video channel is not possible and, if the video channel disappears or changes, the mouse routine will detect it, deactivating itself. Remember, the mouse channel will remain opened but ineffective.

Also, if you STOP your mouse-based Basic program, always type CLOSE £? before typing TEXT, as the Basic Editor automatically closes the graphics video channel.

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

download

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:

100 GRAPHICS 
110 SET 180,101
120 SET 183,255
130 OPEN #1:"MOUSE:"
140 ASK 188 A
150 ASK 190 B
160 IF (A) THEN PRINT "Main button"
170 IF (B BAND 128) THEN PRINT "Secondary button"
180 IF (B BAND 16) THEN PRINT "Central button"
190 IF (B BAND 32) THEN PRINT "Fourth button"
200 IF (B BAND 64) THEN PRINT "Fifth button"
210 LET B=(B BAND 15)
220 IF (B BAND 8) THEN LET B=B-16
230 PRINT "Wheel: ";B
240 GOTO 140

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.

The driver works on both graphic and text modes but it is planned to implement it also on editor modes, executing some action just on the pointer coordinates when a button is being pressed. Once achieved it will be easy to use the mouse for example on the Basic editor, WP or EXDOS.


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 Modus des EnterMice Maus Interface

Eine Maus, die an den EnerMice PS/2 Anschluss angeschlossen ist, ist nicht darauf beschränkt nur als Maus zu dienen, sie kann auch verwendet werden um einen Joystick zu simulieren. Um diesen Modus zu aktivieren müssen die beiden Schalter DS1 und DS2 auf OFF eingestellt werden. Das Interface konvertiert dann die Bewegungen auf dem PS/2 Anschluss auf Joystick Anschluss 1. Dazu muss ein evt. vorhandener Joystick nicht abgesteckt werden, da der Anschluss deaktiviert wird. Die Maus sendet dann Bewegungen wie ein Joystick, nützlich für ältere Programme oder Spiele.

Wenn DS3 auf ON steht, leuchtet im Joystick Modus das rote LED. Es blinkt wenn eine Richtungs-Kontakt gekürzt wird.

Hinweis: Der Feuer-Knopf ist der linke Knopf der Maus. Um den rechten Knopf zu verwenden benütze die Routinen die in der Sektion zum Maus Interface vorgestellt wurden.

Die Joystick Anschlüsse

Das EnterMice Maus Interface arbeitet nicht nur als Maus Interface, sondern auch als intelligentes Joystick Interface. Jeder Atari-Kempston-Amiga Joystick kann an einen der beiden 9 Pin-Anschüsse auf der Rückseite des Interface angeschlossen werden. Wenn der Joystick eine Autofeuer-Funktion hat, funktioniert diese. Maus und Joystick können gleichzeitig angeschlossen sein, da sie sich nicht gegenseitig beeinflussen.

Lesen des Joystick Interface

Ursprünglich hatten die Control-Anschlüsse des Enterprise nur einen Feuerknopf, aber nun bietet das EnterMice Interface zwei mehr auf beiden Anschlüssen. Offensichtlich arbeiten sie nicht mit alten Spielen, sondern nur mit neuen Veröffentlichungen oder neuen Umsetzungen von Spielen.

Alle normalen Methoden die beiden Anschlüsse zu lesen funktionieren. Der einzige Extra-Code der benötigt wird ist zum Lesen der extra Feuerknöpfe. Ein Beispiel des Codes ist hier:

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

Das ist die Übersetzung dieses Codes:

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


Du kannst die drei Feuerknöpfe der beiden Joystick-Anschlüsse des EnterMice lesen durch ändern der Basic Zeile "140 LET FIRE2=USR(FIRE,4)", die "4" durch eine "1" oder eine "2".(H=0). Für den zweiten Anschluss muss "1281","1282" or "1284".(H=5) verwendet werden

Diese Methode kann auch genutzt werden die beiden Haupt-Maus-Knöpfe zu lesen, da diese sich die Feuerknöpfe auf Control 1 teilen

Fehlerbehebung

Tastaturproblem

Abbildung 1
Abbildung 2
Abbildung 3

Während der Entwicklung des EnterMice wurde ein ziemlich ernster Fehler im Design des Enterprise praktisch nebenbei entdeckt.

Er bleib völlig unbemerkt so lange nicht an die Anschlüsse Control 1 und Control 2 angeschlossen wird. Wie auch immer, das EnterMice benutzt sie....

Das Problem besteht aus Interferenzen auf den Tastatur-Ports KB0..KB9, die ebenso von den Control Ports verwendet werden.

Wenn nur eine Taste gedrückt wird, das passiert nichts falsches (siehe Abbildung 1).

Wenn zwei Tasten in der gleichen Spalte gleichzeitig gedrückt werden, wird das Signal der gewählten Line auch auf die Line der zweiten Taste übertragen (Abbildung 2).

Dem Enterprise fehlen die entsprechenden Dioden um die Reihen der Tastatur zu unterscheiden!

Elektrisch passier nichts (der LS145 Decoder im Computer hat offene Sammelausgänge), aber das lesen der externen Anschlüsse 1 und 2 verursacht Fehler.

Um die Ursache zu beseitigen, sollten sollten zu jeder Tastenreihe des Enterprise Dioden hinzugefügt werden, um zu vermeiden, das das Drück von mehr als einer Taste Kollisionen verursacht (Abbildung 3).

Pear hat einen Entwurf einer Platine angefertigt, die das Problem beseitigt, diese wurde aber bisher noch nicht getestet. In der Zwischenzeit sollte, um Fehler zu vermeiden, die Tastatur nicht verwendet werden, während der Joystick oder die Maus benutzt werden.

Tastatur-Korrekttur (Visualisierung) Keyboard fixer Keyboard fixer inside the Enterprise Keyboard connected via fixer

Microsoft optische Maus

Die PS/2 Microsoft Optical Maus ist ein spezieller Fall. Sie sollte nur angeschlossen werden, wenn sie mit dem original Microsoft USB PS/2 Adapter verbunden ist. Sie funktionier mit dem EnterMice wenn sie vor dem Einschalten angeschlossen wurde, aber in diesem speziellen Fall kann das die Hot-Plug Funktion nicht verwendet werden, da sie nicht erkannt wird.

EnterMice kann gezwungen werden die Maus während der Arbeit zu erkennen. Es muss nur der RESET auf der Stiftleiste schnell kurzgeschlossen oder man drück den RESET Knopf auf neueren Platinen (es wird nur das Interface resettet und nicht der Computer).

Technische Spezifikationen

Joystick-Port-Belegung

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

Diagram
Prototype
EnterMice Modifikation
EnterMice mit Adapter

zum Anschluss des Sega Pads mit sechs Knöpfen [30]

Sega Sechs-Knopf Controller Hardware Info

Interface Protocol von SEGA MegaDrive's 6-Knopf-Controller

Sega Pad Anschlüsse
Pin Auswahl = Low Auswahl = High Auswahl = pulse-3
1 Oben Oben Knopf Z
2 Unten Unten Knopf Y
3 GND links Knopf X
4 GND rechts nicht verwendet
5 +5V
6 Knopf A Knopf B nicht verwendet
7 Auswahl
8 GND
9 Start Knopf C nicht verwendet

Neos Maus

Neos Twister Diagramm
Neos Maus Belegung
Pin Funktion
1 Oben
2 Unten
3 Links
4 Rechts
5 Nicht angeschlossen
6 /Strobe - linker Schalter
7 +5V
8 GND
9 Knopf Wechsel rechts

MSX Maus

MSX Twister Diagramm
MSX Maus Belegung
Pin Funktion
1 Oben
2 Unten
3 links
4 rechts
5 +5V
6 Knopf Wechsel links
7 Knopf Wechsle rechts
8 Strobe
9 GND

USB gadgets

Der maximale Strom auf der PS/2-Anschluss wird durch die Effizienz der internen Stabilisatoren Enterprise beschränkt. In der Praxis darf die Last sollte nicht mehr als 300 mA.

Informationen für Entwickler

EnterMice Timing

Die Firmware des EnterMice ist für das zyklische Lesen mit 50 Hz Frequenz optimiert (Video IRQ).

Standard Lese-Zyklus 20 ms
Wartezeit um einen Slebsttest der PS"/Maus durchzuführen (Auszeit) ca. 2000 ms
Zeit zum Sammeln der PS/2 Maus-Daten 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.

Datenpuffer

Der Datenpuffer des EnterMice hate eine Größe von 16 Bytes.

Derzeit wird nur die Hälfte benutzt. Der Rest kann in der Zukunft verwendet werden.

Bits Hoch knabbern Nieder knabbern Inhalt
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 1) 0 Btn5 Btn4 Btn3 Protocol identification & buttons 3,4,5 state (1=pressed) Extended MSX protocol
3 Horizontal wheel 2) Z value signed int (positive is wheel moved up)
4 ExCnt 3) 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

1) Wenn nur das Gerät die BoxSoft-Protokoll unterstützt, ist das fünfte knabbern auf 0000 immer gleich.

2) Noch nicht umgesetzt, jetzt repränsentieren alle 8 Bits einen Z Wert (vertikales Rad).

3) Wenn das Gerät nicht das EnterMice-Protokoll unterstützt, ist das neunte knabbern auf 0000 immer gleich.


Du musst nicht alle Daten aus dem Puffer lesen.

Das Lesen kann jederzeit unterbrochen werden. Es wird eine Auszeit geben und das Interface liest nochmal Daten von der Maus und ist dann wieder bereit Daten zu senden.

Der letzte Status des RTS Signals spielt auch keine Rolle. EnterMice reagiert auf den Wechsel-Status und nicht auf den Signalpegel.

Maus lesen

; 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,J_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
J_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 J column
rl d
djnz J_COLUMN
CONTINUE:
ld a,d
ret

Minimum EnterMice reading routine, thanks to Bruce Tanner

This 79 bytes routine is strictly MSX protocol, only reads movement plus the two main buttons. It is intended for easy conversions or adaptations of old programs or games. It must be driven by a 50Hz interrupt, and assumes that X_REL and Y_REL are contiguous in memory.

ld hl, X_REL ;first byte, X displacement since last lecture
ld b,3 ;long delay
call READ_8BIT
inc hl ;Y_REL
ld b,2 ;short delay
call READ_8BIT ;leaves B=0
xor a
out (0B5h), a
in a, (0B6h)
and 6
xor 6
srl a ; here the status of J column is on carry, but is discarded
srl a
rl b ; K column is saved in b
ld (SECBUTT_STATUS), a ; L column is the Right Mouse Button
ld a,b
ld (MAINBUTT_STATUS), a ; K column is the Left Mouse Button
ld a, (HL) ;Y-rel
dec hl ;X-REL
or (hl) ;If a=0, no movement
ret
XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXX
WAIT:
nop
nop
nop
dec b
jr nz, WAIT
ret
XXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXX
READ_8BIT: ld a,2 ;RTS low
out (0B7h), a
call WAIT_READ_4BIT ; read four higher bits
xor a ;RTS high
out (0B7h), a
ld b, 2 ;short delay
WAIT_READ_4BIT: call WAIT ;leaves B=0
READ_4BIT:
ld d, b ;d=0
ld b, 4
READ_LOOP:
ld a, b
out (0B5h), a
in a, (0B6h)
rra ;data is read from K column
rra
rl d
djnz READ_LOOP
ld a, d
rld
ret

A still more condensed Mouse+all buttons+wheel reading routine, thanks by IstvanV

This routine even checks for VSYNC(50Hz)itself.


 ;read EnterMice mouse input, returns:
 ; Z flag = input is valid
 ; H = X_REL
 ; L = Y_REL
 ; A bits 0 and 1 = buttons 1 and 2
 ; D bits 0 to 2 = buttons 3 to 5
 ; E bits 0 to 3 = mouse wheel Y
MOUSEINPUT:
DI
VSYNCWAIT1: IN A,(0B4H)
AND 10H
JR Z,VSYNCWAIT1
VSYNCWAIT2: IN A,(0B4H)
AND 10H
JR NZ,VSYNCWAIT2
LD C,4
READ_LOOP_1: LD H,L
LD L,D
LD D,E
LD E,01H
LD A,02H ;RTS low
READ_LOOP_2: OUT (0B7H),A
LD B,17 ;25.6 us at 10 MHz without wait states
M_WAIT_LOOP: DJNZ M_WAIT_LOOP
LD B,4
READ_LOOP_3: LD A,B
OUT (0B5H),A
IN A,(0B6H)
RRA ;data is read from K column
RRA
RL E
DJNZ READ_LOOP_3
LD A,B ;RTS high
JR NC,READ_LOOP_2
DEC C
JR NZ,READ_LOOP_1
OUT (0B5H),A ;A = 0
IN A,(0B6H)
CPL
AND 06H ;bit 0 = left button,
RRA ;bit 1 = right button
BIT 7,D ;bits 5 to 7 of button state must be 0
RET ;IRQ disabled, Z = mouse detected

Mouse buttons reading without executing the rutine

EnterMice manages main buttons (wired ones) in a different manner than Boxsoft+Neos. On the original interface you always can read the two buttons like you do with the joysticks fire keys, writing a zero or a five to the B5h Z80 port and then reading the returned value on the B6h port. This independently of reading or not the main mouse movement routine.

Due to the software nature of the PS/2 protocol, this can't be done directly on EnterMice, but the buttons alone can be requested easily by changing RTS state (just at least 2 μs and then can again high just before writing zero to B5h port). Then, after 1,5 ms EnterMice will start parsing PS/2 (that lasting in worst case 12 ms) and then putting on B6h port the correct values for the buttons.

Example:

ld a,2
out (0B7h),a ;RTS is put low
CODE
CODE
CODE
CODE
CODE
CODE
CODE
xor a
out (0B7h),a ;RTS is put high again
out (0B5h),a ;Keyboard row 0 is requested
in a, (0B6h) ;The two mouse buttons are read on bits 1 and 2

Handbuch in anderen Sprachen

English

Español

Polski

Ungarisch