EnterMice (Polski)

From Enterprise Wiki
Revision as of 17:11, 10 February 2016 by Pear (talk | contribs) (Polecenia i funkcje drukowania)

Jump to: navigation, search
EnterMice

Interfejs joysticków i myszy PS/2 dla komputera Enterprise 64 / 128

Wstęp

Opisany poniżej zintegrowany interfejs został zaprojektowany dla komputerów Enterprise 64/128.

Jest efektem sześciu miesięcy pracy polskiego hobbysty znanego na forach dyskusyjnych pod nickiem Pear. Prace zostały rozpoczęte za namową hiszpańskiego kolegi GFlorez (który wraz z Zozo, jako pierwsi użytkownicy testowali EnterMice) z forum EnterpriseForever.com.

Głównym przeznaczeniem interfejsu jest możliwość podłączenia taniej i powszechnie dostępnej myszki PS/2 do komputera Enterprise. Ponadto umożliwia podłączenie dwóch joysticków standardu Atari bezpośrednio, bez konieczności stosowania dodatkowych adapterów.

EnterMice bazuje na rozwiązaniach zastosowanych w interfejsie BoxSoft, który obsługuje protokół myszy Neos (MSX).

W jednym z dostępnych trybów pracy EnterMice jest całkowicie kompatybilny ze starszym interfejsem myszki BoxSoft. W innym trybie ruch myszki zamieniany jest na impulsy symulujące ruch joysticka.


Krótka historia o Enterprise i myszy

Rozszerzenie możliwości Enterprise 128 o sterowanie myszką nie jest nowym, ekscentrycznym pomysłem grupy komputerowych retromaniaków. Było to planowane już przez projektantów tego komputera. Problem polegał na tym, że zadanie zostało powierzone skromnej, angielskiej firmie Aztec Software Ltd, która zaprezentowała rozczarowujący efekt swojej pracy. Z dwóch głównych powodów. Po pierwsze, myszka była po prostu brzydka [1], w niczym nie przypominała zaokrąglonych kształtów Enterprise. Po drugie, urządzenie tak naprawdę nie działało jak myszka, tylko naśladowało ruchy joysticka. Również w tym czasie firma Enterprise Computing Ltd. zniknęła z rynku.

Jednakże baza użytkowników w Wielkiej Brytanii pozostała bardzo aktywna w kolejnych latach. Pasjonaci Enterprise zakładali małe firmy. Oferowane były nowe produkty: rozszerzenia pamięci, dedykowane okablowanie, gry, programy użytkowe, emulatory ZX Spectrum, kontrolery dysków IDE, karty EPROM, rozszerzenia płyty głównej, modemy i wiele innych.

Najbardziej płodna była firma Boxsoft, której założycielem był Tim Box. Boxsoft oferowała większość produktów wymienionych powyżej. W pakiecie z programem graficznym Paintbox [2], wprowadzono do sprzedaży adapter [3] wraz z myszką Neos oraz dołączonym do niej sterownikiem. Mysz Neos, wewnętrznie [4] niemal nie różni się od myszy dla komputerów MSX [5] i była już z powodzeniem dostosowywana do innych komputerów 8-bitowych takich jak na przykład Commodore 64.

W tamtym czasie tylko kilka komputerów 8-bitowych posiadało myszkę oraz graficzny interfejs użytkownika (GUI). Było niezwykle trudno sprzedać nowy, nieznany wynalazek do tego nie w pełni zintegrowany z komputerem. Patrząc z dzisiejszej perspektywy, zalety nawigacji systemem operacyjnym i aplikacjami przy użyciu myszki jest czymś oczywistym. Wygoda kończy się natychmiast, gdy mysz przestaje działać ...


Mimo wszystko udało się sprzedać około stu pakietów Paintbox.

Program Paintbox przybył na Węgry oddzielnie. Węgrzy kupowali komputery Enterprise wiedząc o nich tylko tyle, że pochodzą z Wielkiej Brytanii i nic więcej. Gdy wszyskie Enterprise 128 zostały sprzedane, użytkowników pozostawiono samym sobie podobnie jak w macierzystym kraju. Kolejny raz wypłynęły na rynek małe firmy oferujące nowe produkty. Wówczas firma "A studio" rozpoczęła produkcję i sprzedaż produktów Boxsoft, maskując je jako własne produkty. Jedna z wersji Paintbox została pozbawiona opcji sterowania myszką. Mimo to wciąż potrzebowała do pracy sterownika tejże myszki. Po wschodniej stronie Żelaznej Kurtyny nikt nigdy nie słyszał o myszy Neos.

Później, na Węgrzech, powstała karta interfejsu szeregowego [6] dla Enterprise, dzięki genialnemu zespołowi węgierskich projektantów: Gyula Mészáros sprzęt i László Haluska (HSOFT) oprogramowanie. HSOFT przystosował okrojony przez "A studio" sterownik myszki do współpracy z szeregową myszką Mouse Systems, a następnie stworzył sterownik wbudowany w system operacyjny EPDOS 2.x.

To już odległa historia, ale w obecnych czasach globalizacji i ogólnodostępnego Internetu, pojawiło się kilka starych artefaktów Boxsoft+Neos i wszystkie kawałki układanki zaczęły do siebie pasować. W końcu, spełniły się stare obietnice (zobacz reklamy Enterprise Computers Ltd.) i Enterprise doczekał się własnego interfejsu myszki z prawdziwego zdarzenia.




Nowy interfejs EnterMice prezentowany tutaj bazuje na pracy grupy Boxsoft, ale został zaadaptowany do współczesnych potrzeb i stwarza nowe możliwości. (To cud co osiągnął Tim Box wyłącznie przy pomocy kilku bramek i diod [7]). Co do oprogramowania zaś, to sterownik był bardzo dobrze napisany przez D. Rabson, Andrew Fitter i Andrew Richards. Z niewielkimi modyfikacjami, ten sam sterownik jest używany przez interfejs EnterMice.

Podstawowym problemem interfejsów dla Enterprise są złącza oraz sygnały dalece odbiegające od standardów myszy i josticka. Małe złącza krawędziowe, które przypadkowo można podłączyć do góry nogami, sygnały przycisków podciągnięte do +5V podczas, gdy standardem jest łączenie ich do 0V, brak jakichkolwiek zabezpieczeń przed zwarciem kilku przycisków jednocześnie, brak możliwości przesłania informacji zwrotnie do sterownika i prawdopodobnie jeszcze wiele innych przypadłości.

Teraz to co Boxsoft wykonał przy użyciu dostępnych, tanich komponentów, zostało przeprojektowane i ulepszone z użyciem dwóch nowocześniejszych programowalnych układów. Jeden z tych układów (Xilinx XC9572) jest odpowiedzialny za połączenia i konwersję sygnałów do standardowego joysticka Atari. Oryginalny interfejs Boxsoft korzystał tylko z portu Control 1, który mógł być używany do podłączenia myszy Neos lub joysticka (ale nie obu jednocześnie). W niniejszym projekcie są podłączone i udostępnione oba porty joysticków nie zakłócające się ze złączem myszki.

Myszki Neos/MSX nie są dziś często spotykane w związku z czym zaimplementowano konwersję protokołu myszy PS/2 do MSX. Tą część obsługuje drugi z układów, prosty i niedrogi kontroler Atmel AT89C4051, którego oprogramowanie wewnętrzne zostało zoptymalizowane do pracy nawet z podrasowanym komputerem Enterprise. EnterMice działa równie dobrze z Enterprise ze standardowym zegarem 4 MHz jak i z jego superdoładowaną 10 MHz wersją.

Również protokół odczytu myszy został wzbogacony o nowe rozszerzenie protokołu MSX autorstwa Prodatron i NYYRIKKI, które pozwala na odczytanie stanu nawet pięciu przycisków oraz kółka, jeśli myszka je posiada.

Lista programów współpracujących z myszką (aktualizowana)

Paintbox ze sterownikiem myszy.[8]

Enterprise Graphical Interfance (EGI) ze sterownikiem myszy.[9]

SymbOS wewnętrznie, tylko w trybie zgodności z Boxsoft, ale wkrótce również w podstawowym trybie myszy EnterMice.

Programy w Basicu mogą korzystać ze sterownika myszy.

Stare programy używające joysticka w porcie 1, z EnterMice w trybie emulacji joysticka.

EPDOS 2.X wewnętrznie, tylko z kartą portu szeregowego.

Opis ogólny

EnterMice przód
EnterMice tył

Ważne

Nie podłączaj interfejsu do komputera przy załączonym zasilaniu !
Natychmiast wyłącz zasilanie, jeśli po podłączeniu interfejsu
komputer nie uruchomi się prawidłowo lub zauważysz jego nietypowe zachowanie !

Sprawdź czy interfejs jest podłączony prawidłowo i spróbuj ponownie.

Myszkę i joysticki można podłączać i odłączać podczas pracy komputera, jednak nie jest to zalecane. Bezpieczniej jest wykonać wszystkie podłączenia przy wyłączonym zasilaniu.

Uwaga: Zanim podłączysz jakiekolwiek urządzenie, dla którego interfejs EnterMice nie został zaprojektowany, przeczytaj proszę rozdział "Podłączanie innych urządzeń do EnterMice".

Podłączenie do komputera

Płytka interfejsu jest podłączona jednocześnie do trzech złączy krawędziowych z tyłu komputera: Control 1, Control 2 oraz Serial. Złącza w interfejsie są zamontowane pod kątem nieco większym niż 90°. Jest to celowe, aby zapewnić lepsze dopasowanie interfejsu do złącz Enterprise.

Możliwe jest podłączenie tylko w jeden sposób, jednak może się zdarzyć, że styki nie trafią centralnie w kontakty złącza krawędziowego. Jeśli tak się stanie połączenie może być niestabilne i komputer i/lub interfejs mogą nie pracować prawidłowo.

Właściwie podłączony interfejs działa prawidłowo od razu po załączeniu zasilania komputera.

Po uruchomieniu wykonywany jest self-test interfejsu, podczas którego obie diody LED błyskają 3 razy (bez względu na ustawienie przełącznika DS3).

Po podłączeniu EnterMice do komputera, zalecane jest podłączenie myszki przed załączeniem zasilania. Mimo to interfejs posiada funkcję hot-plug umożliwiającą rozpoznanie podłączenia myszki w trakcie pracy, wówczas jest ona identyfikowana i przygotowywana do pracy (trwa to około 2-3 sekund).

Pomyślne zakończenie inicjalizacji myszki sygnalizowane świeceniem zielonej diody LED (jeśli przełącznik DS3 jest ustawiony w pozycji ON).

Funkcje

Interfejs posiada kilka trybów pracy. Do konfiguracji służy pięcio-sekcyjny przełącznik (DS).

Ustawienia konfiguracji mogą być zmieniane podczas pracy interfejsu. Nie jest wymagane wyłączanie ani restartowanie komputera.

Poniżej opis wszystkich możliwych ustawień.

DS1 DS2 Tryb pracy
ON ON Podstawowy tryb myszy EnterMice
OFF ON Tryb myszy zgodny z BoxSoft. Przyciski myszy są odwrócone. Głównym przyciskiem jest prawy przycisk myszy.
OFF OFF Tryb emulacji joysticka (ruchy myszy są przekierowane do portu Control 1, złącze Joystick 1 zostaje odłączone)
ON OFF nie używane (faktycznie EnterMice emuluje joystick w kolumnie K klawiatury)

Złącze Joystick 2 działa zawsze w ten sam sposób, niezależnie od wybranego trybu pracy interfejsu.


DS3 Kontrolki LED
OFF Wyłączone
ON Załączone


Konfiguracja trybu emulacji joysticka

DS4 Czułość
OFF Normalna
ON Podwyższona
DS5 Korekcja ruchów ukośnych
OFF Wyłączona
ON Załączona

Korekcja ruchów ukośnych poprawia precyzję emulacji joysticka dla ruchów po skosie kosztem niewielkiego zmniejszenia prędkości.

Korzystanie ze sterownika

W tym miejscu znajdziesz sterownik myszy.

Poniższy tekst pochodzi z oryginalnej instrukcji obsługi Paintbox, poprawionej i uzupełnionej o nowe możliwości EnterMice.


Jak używać myszy we własnych programach ?

Korzystanie z myszy nie jest zarezerwowane wyłącznie dla programów w kodzie maszynowym. Łatwo można dodać obsługę myszy niemal do każdego programu w BASIC'u. W tym celu konieczne jest użycie rozszerzenia EXOS nazywanego sterownikiem myszy ("MOUSE.XR").

Sterowniki ten umieści wskaźnik myszy na dowolnym ekranie graficznym i będzie odzwierciedlał ruchy myszy poprzez przemieszczanie kursora po ekranie.

Sterownik myszy może wykonywać różne polecenia i funkcje, na przykład włączyć lub wyłączyć kursor. Istnieją dwie metody komunikacji ze sterownikiem, pierwsza przez bezpośredni odczyt i zapis, druga z pośrednictwem zmiennych systemowych.

Ładowanie sterownika

Sterownik myszy może być załadowany dowolną metodą, tj; "START" z poziomu BASIC (jeśli z taśmy) lub LOAD "MOUSE.XR". Może też być załadowany z "WP", z EXDOS lub jakiegokolwiek innego języka (sprawdź szczegółowy opis dla odpowiedniego języka).

Po załadowaniu sterownik pozostanie w pamięci (program rezydentny) do następnego restartu lub wyłączenia komputera.

We wcześniejszych wersjach, do poprawnej pracy, konieczna była inicjalizacja za pomocą polecenia EXOS ":PB". EGI i Paintbox wykonują tę operację wewnętrznie.

Jeśli korzystasz ze starszej wersji, nigdy nie wykonuj inicjalizacji więcej niż raz. Przy drugiej próbie komputer się zawiesi. Zignoruj ​​komunikat o błędzie, który się pojawi. Kod błędu (otrzymywany w BASIC z EXTYPE) to 9000+strona pamięci, do której został załadowany sterownik. Zostało to zrobione ceolowo przez autorów sterownika.

Bieżąca wersja wykonuje ​​automatyczną inicjalizację, ale również poprawnie współpracuje ze starszymi programami (EGI i Paintbox), które nadal mogą bezproblemowo używać usuniętego polecenia :PB.

Wielokrotne ładowanie sterownika nie jest szkodliwe, ale ponieważ tylko ostatni załadowany będzie pracował, marnuje się pamięć.

Wykonanie polecenia ":MOUSE" wyświetla informacje o wersji sterownika, a jeśli wykryty zostanie interfejs EnterMice, to wyświetlone zostaną dodatkowe informacje: identyfikator podłączonej myszki, wersja sprzętu i frimware.

Komunikacja ze sterownikiem myszki

Jak wspomniano powyżej, istnieją dwa sposoby komunikacji ze sterownikiem myszki. Aby zaprezentować obie metody i ich działanie, powinniśmy najpierw poznać wszystkie polecenia, funkcje i zmienne, a następnie pokazać sposoby ich użycia w programie.

Polecenia i funkcje drukowania

Pierwszą i najważniejszą czynnością jes otwarcie kanału myszki, np. OPEN £n:"MOUSE:" (n oznacza numer kanału).

Trzeba pamiętać, że kanał myszki jest zawsze powiązany z kanałem wideo, na którym wyświetlany jest wskaźnik. Otwarcie kanału myszki bez kanału wideo jest niemożliwe. Jeśli kanał wideo zostanie zamknięty, podczas gdy kanał myszki jest otwarty, może dojść do uszkodzenia zawartości pamięci, ponieważ sterownik myszki nie ma możliwości wykryć tej sytuacji. Aby tego uniknąć w programie, w pierwszej kolejności należy zamykać kanał myszy, a dopiero potem kanał wideo.

Również po zatrzymaniu przez STOP programu w Basic'u zawsze wykonaj polecenie CLOSE £? przed wykonaniem polecenia TEXT, ponieważ edytor Basic automatycznie zamyka kanał wideo trybu graficznego.

Polecenia wydawane przez drukowanie do kanału myszki:

O Pokaż wskaźnik myszki na ekranie
o Ukryj wskaźnik myszki
P Pobierz współrzędne X i Y

Wyniki lub stany uzyskiwane przez odczyt znaków z kanału myszki:

Odczyt tylko po wcześniejszym przesłaniu "P":

X Młodszy bajt
X Starszy bajt
Y Młodszy bajt
Y Starszy bajt

Zawsze możliwe do odczytu:

Fire = "1" jeśli główny (prawy) przycisk wciśnięty lub "0" w przeciwnym wypadku.

Zmienne systemowe

Adres Zawartość Wartość domyślna
180 Kanał wideo, wymagany do pokazania wskaźnika myszy 101
181 Pozycja współrzędnych X,Y w linii statusu 30
182 Współrzędna wyświetlania stanu: 1 załączony, 0 wyłączony 0
183 Kolor wskaźnika myszy (patrz informacje techniczne poniżej) 255
184 Młodszy bajt współrzędnej X
185 Starszy bajt współrzędnej X. W dalszej części znajdziesz przykładowy program przeliczania współrzędnych.
186 Młodszy bajt współrzędnej Y
187 Starszy bajt współrzędnej Y
188 Stan przycisku 0 zwolniony, 1 wciśnięty
189 Urządzenie wejściowe:
  0 - Wewnętrzny joystick             2 przyciski, Spacja i Enter
  1 - Joystick w porcie Control 1     3 przyciski
  2 - Joystick w porcie Control 2     3 przyciski
  3 - Mysz BoxSoft                    2 do 5 przycisków
  4 - EnterMice (domyślne ustawienie) 2 do 5 przycisków
  5 - Mysz szeregowa Mouse Sytems     3 przyciski
  6 - Mysz szeregowa Microsoft        2 przyciski
 >6 - nie zaimplementowane
190 Stan drugiego i pozostałych przycisków, jeśli są obecne oraz licznik kółka, jeśli jest.
  Bity 0 do 3 wartość z przedziału -8 do 7 (4 bity ze znakiem)
  Bit 4 przycisk pod kółkiem lub środkowy
  Bit 5 przycisk 4.
  Bit 6 przycisk 5.
  Bit 7 drugi przycisk (lewy)
      Stan przycisków: 0 zwolniony, 1 wciśnięty, jeśli obecny jest trzeci przycisk, jego stan jest przypisany do bitu 4

Przykłady

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
-
Note X_COUNT is = to "2" in 2 colour mode "4" in 4 colour mode "8" in 16 colour mode and "16" in 255 colour mode. 
All these values double when in lores.

Teraz należy dodać funkcję MOUSE_POS. Zwraca ona pozycję wskaźnika myszy. Wybierz jedną z dwóch możliwości:

Odczytaj współrzędne wskaźnika z kanału myszy:

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

lub odczytaj współrzędne wskaźnika ze zmiennych systemowych:

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

Możesz również skorzystać z polecenia sterownika, aby umieścić wskaźnik myszy w dowolnym miejscu na ekranie:

Współrzędne wskaźnika ustaw poprzez zmienne systemowe.

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

To bardzo prosty program graficzny; pozwala rysować linie za pomocą ruchów myszki, gdy przycisk jest wciśnięty, Funkcja MOUSE_POS jest wywoływana w linii 150. W zależności od tego jak chcesz odczytać położenie wskaźnika myszy, użyj jednej z dwóch przedstawionych powyżej wersji funkcji.

Kolejna pokazana procedura pozwala na ustawienie położenia wskaźnika myszy. Po prostu wywołaj procedurę podając współrzędne X oraz Y.

Eksperymentuj z różnymi funkcjami i procedurami i próbuj dodawać je do własnych programów. Nawet nie zauważysz jak szybko odkryjesz, że dodanie obsługi myszki do istniejącego programu, czy też napisanie nowego programu z jej wykorzystaniem jest bardzo proste.

Jak użyć kółka i dodatkowych przycisków we własnych programach ?

Operowanie na bitach w BASIC-u Enterprise jest powolne i skomplikowane. Zmienna systemowa 190 zawiera wiele informacji, ale nie są łatwe do wydobycia:

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

Wewnątrz programu w BASIC-u możesz użyć procedury w kodzie maszynowym, aby rozbić te informacje na pięć bajtów. Dodatkowo procedura zeruje licznik Z po każdym jej wywołaniu:

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

Procedura w assemblerze:

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   

Poniżej wyjaśnienie działania procedury obsługi kółka:

Młodszy półbajt zmiennej systemowej 190 zawiera licznik impulsów odwbranych z kółka od chwili jego ostatniego zerowania. Impulsy mogą być dodatnie lub ujemne, sterownik dodaje lub odejmuje je od stanu licznika, a następnie przechowuje wartość w przedziale od -8 do 7. Główny program powinien zapewnić cykliczne wywoływanie procedury odczytu licznika (z XPLOD). Po wywołaniu licznik jest zerowany (również w procedurze XPLOD), a odczytane wartości znajdują się pod adresem (XPLOD+6) i mogą być wykorzystane na przykład do przewijania zawartości ekranu.

Zauważ, że drugi przycisk myszy jest podłączony oddzielnym przewodem i jego stan może być odczytany bezpośrednio z matrycy klawiatury (z użyciem procedury opisanej w sekcji "Odczyt stanu joysticków") lub łatwiej przez porównanie zmiennej 190 z wartością 127 (stan drugiego przycisku znajduje się w bicie 7):

ASK 190 SECBUTT
IF SECBUTT>127 THEN GOTO MENU !secondary mouse button pressed!!!

Informacje techniczne o sterowniku

Wywołanie polecenia HELP w EXOS pozwala wyświetlić na ekranie listę wszystkich rozszerzeń i wersji sterowników.

Aktualni sterownik myszy działa tylko w trybach graficznych, ale planowana jest implementacja wskaźnika myszy w trybach tekstowych. Wówczas użycie myszki stanie się łatwiejsze na przykład w edytorze BASIC, WP czy EXDOS.

Wartości zmiennej EXOS 183 do zmiany koloru wskaźnika myszy

Ustawienie Wynik
Kolor Numer
Tryb 2-kolorowy 0 0
255 1
Tryb 4-kolorowy 0 0
240 1
15 2
255 3
Tryb 16-kolorowy 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
Tryb 256 kolorów 0-255 0-255

Tryb emulacji joysticka za pomocą myszy

Mysz podłączona do portu PS/2 EnterMice nie jest ograniczona wyłącznie do pracy jako typowa mysz, lecz może również symulować joystick. Ten tryb pracy aktywuje się ustawiając oba przełączniki DS1 oraz DS2 w pozycję OFF. Od tej chwili interfejs konwertuje ruchy myszki z portu PS/2 na przechylenia joysticka w porcie Joy 1. Nie trzeba odłączać wtyczki prawdziwego joysticka z tego portu, zostanie on wyłączony. Mysz będzie przekazywać ruchy tak jak joystick, co może być przydatne w przypadku starszych programów i gier.

Jeśli przełącznik DS3 jest w pozycji ON, to czerwona dioda LED będzie sygnalizować aktywny tryb joysticka. Dioda przygasa na czas, gdy którykolwiek ze styków kierunkowych w porcie joysticka zostanie zwarty.

UWAGA: Przycisk Fire jest lewym przyciskiem myszki. Aby skorzystać z prawego przycisku użyj procedur pokazanych w sekcji dotyczącej interfejsu myszki.

Porty joysticków

EnterMice jest nie tylko interfejsem myszki, ale również umożliwia podłączenie dwóch joysticków standardu ATARI-Kempston-Amiga bez konieczności stosowania dodatkowych adapterów. Obsługiwana jest opcja autofire, jeśli joystick jest w nią wyposażony. Mysz i oba joysticki mogą być podłączone jednocześnie w tym samym czasie. Nie zakłócają się nawzajem.

Odczyt stanu joysticków

Oryginalnie porty Control w Enterprise mają po jednym przycisku Fire, ale w interfejsie EnterMice obsługiwane są po dwa dodatkowe przyciski na każdy port. Oczywiście nie będą one działać w starych grach, ale można je wykorzystać w nowych produkcjach lub nowych konwersjach gier.

Wszystkie sposoby odczytu obu portów działają normalnie. Potrzebny jest tylko dodatkowy kod do odczytu dodatkowych przycisków Fire 2 i 3. Przykładowy kod poniżej.


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


Krótka procedura w assemblerze:


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

Możesz odczytać stan trzech przycisków Fire z obu portów joysticków EnterMice modyfikując linię BASIC-a "140 LET FIRE2=USR(FIRE,4)". Zastąp "4" przez "1" lub "2" (H=0). Dla drugiego portu użyj wartości "1281", "1282" lub "1284" (H=5).

Tą metodą można również odczytać stan dwóch przycisków myszy, które są współdzielone z przyciskami Fire pierwszego joysticka.

Znane problemy

Błędy klawiatury

Rysunek 1
Rysunek 2
Rysunek 3

Podczas tworzenia interfejsu EnterMice, przypadkowo odkryty został poważny błąd w konstrukcji komputera Enterprise.

Nie ujawnia się on dopóki nic nie jest podłączone do portów Control 1 i Control 2. Jednakże EnterMice z nich korzysta ...

Problem polega na zakłócaniu linii KB0..KB9 portu klawiatury, które przenoszą się również na porty Control.

Jeśli tylko jeden klawisz jest wciśnięty, wtedy nic się nie dzieje (rys. 1).

Jednak, jeśli jednocześnie wciśnięte zostaną dwa klawisze w tej samej kolumnie, to sygnał z wybranej linii klawiatury przedostanie się bez przeszkód na sąsiednią linię (rys. 2).

Enterprise nie posiada diod blokujących, które separowały by od siebie linie klawiatury !

Od strony elektrycznej nie ma żadnego zagrożenia (dekoder LS145 wewnątrz komputera posiada wyjścia z otwartym kolektorem), ale odczyty z portów Control 1 i Control 2 są błędne.

W celu wyeliminowania przyczyny należy dodać diody do każdej z linii klawiatury w Enterprise. Zapobiegnie to powstawaniu "kolizji" podczas wciskania jednocześnie więcej niż jednego klawisza (rys. 3).

Pear przygotował płytkę PCB rozwiązującą problem. Bez tej poprawki, aby zapobiec błędom, należy unikać wciskania wielu klawiszy jednocześnie podczas korzystania z joysticków i myszki.

Keyboard fixer (wizualizacja) Keyboard fixer Keyboard fixer wewnątrz Enterprise Klawiatura podłączona poprzez fixer

Microsoft Optical Mouse

Mysz PS/2 Microsoft Optical Mouse jest szczególnym przypadkiem. Po pierwsze powinna być podłączana wyłącznie przy użyciu oryginalnego adaptera Microsoft USB - PS/2. Po drugie działa poprawnie z interfejsem EnterMice, jeśli zostanie podłączona przed załączeniem zasilania. W tym jednym przypadku nie można korzystać z opcji hot-plug, ponieważ mysz nie zostanie rozpoznana.

EnterMice potrafi wymusić rozpoznanie myszy Microsoft przy załączonym zasilaniu, ale wymaga to chwilowego zwarcia styków RESET interfejsu lub naciśnięcia przycisku RESET w przypadku nowszej wersji płytki (restartowany jest wyłącznie interfejs, nie komputer).

Specyfikacja techniczna

Port joysticka

styk sygnał
1 Góra
2 Dół
3 Lewo
4 Prawo
5 Fire 3
6 Fire 1
7 +5 V
8 GND
9 Fire 2

Matryca połączeń

kolumna J (bit 0) kolumna K (bit 1) kolumna L (bit 2)
JM=0* JM=1* JM=0 JM=1 JM=0 JM=1
Control 1 rząd 0 Fire Joy 1 Fire 1 Mysz Lewy Prz. Mysz Lewy Prz. lub Joy 1 Fire 2* Joy 1 Fire 2 Mysz Prawy Prz. lub Joy 1 Fire 3*
rząd 1 Góra Joy 1 Góra Mysz D0 Mysz D0 wolne wolne wolne
rząd 2 Dół Joy 1 Dół Mysz D1 Mysz D1 wolne wolne wolne
rząd 3 Lewo Joy 1 Lewo Mysz D2 Mysz D2 wolne wolne wolne
rząd 4 Prawo Joy 1 Prawo Mysz D3 Mysz D3 wolne wolne wolne
Control 2 rząd 5 Fire Joy 2 Fire 1 Joy 2 Fire 2 Joy 2 Fire 3
rząd 6 Góra Joy 2 Góra wolne wolne wolne wolne
rząd 7 Dół Joy 2 Dół wolne wolne wolne wolne
rząd 8 Lewo Joy 2 Lewo wolne wolne wolne wolne
rząd 9 Prawo Joy 2 Prawo wolne spare spare spare
* Przyciski myszy mają wyższy priorytet
* JM=0 (DS1 ON)  podstawowy tryb myszy EnterMice
  JM=1 (DS1 OFF) emulacja joysticka oraz tryb zgodności z BoxSoft

Podłączanie innych urządzeń do EnterMice

SEGA Twister

Schemat
Prototyp
Modyfikacja EnterMice
EnterMice z adapterem

do podłączenia sześcioprzyciskowego kontrolera Sega [10]

Informajce o sześcioprzyciskowym kontrolerze Sega

Opis protokołu interfejsu sześcioprzyciskowego kontrolera SEGA MegaDrive

Sega pad pinout
pin Select = Low Select = High Select = pulse-3
1 Góra Góra Przycisk Z
2 Dół Dół Przycisk Y
3 GND Lewo Przycisk X
4 GND Prawo nie używane
5 +5V
6 Przycisk A Przycisk B nie używane
7 Select
8 GND
9 Start Przycisk C nie używane

Neos mouse

Neos Twister schemat
Mysz Neos pinout
pin Funkcja
1 Góra
2 Dół
3 Lewo
4 Prawo
5 Nie podłączone
6 /Strobe - Lewy przycisk
7 +5V
8 GND
9 Prawy przycisk

MSX mouse

MSX Twister schemat
Mysz MSX pinout
pin Funkcja
1 Góra
2 Dół
3 Lewo
4 Prawo
5 +5V
6 Lewy przycisk
7 Prawy przycisk
8 Strobe
9 GND

Gadżety USB

Informacje dla programistów

Stałe czasowe EnterMice

Firmware interfejsu EnterMice został zoptymalizowany dla cyklicznych odczytów z częstotliwością 50 Hz (przerwanie wideo).

Domyślny cykl odczytu 20 ms
Czas oczekiwania na wykonanie self-testu myszy PS/2 (timeout) ok. 2000 ms
Czas pobierania kompletu danych z myszy PS/2 max. 12 ms
Czas od zmiany stanu sygnału RTS do wystawienia danych (półbajtu) gotowych do odczytu 25 μs
Czas bezczynności przed kolejnym odczytem (liczony od wystawienia półbajtu) 14 μs
Czas od ostatniego odczytu do wyzerowania licznika półbajtów (timeout)* 1500 μs
Domyślny czas odpytywania myszy w trybie emulacji joysticka 30 ms
Czas odpytywania myszy w trybie emulacji joysticka, gdy mysz nie jest poruszana (minimalizacja opóźnienia) 12,5 ms
* Po tym czasie rozpoczyna się kolejny odczyt danych z myszy.

Bufor danych

Bufor danych w EnterMice ma rozmiar 16 bajtów.

Aktualnie wykorzystana jest tylko połowa. Reszta może zostać wykorzystana w przyszłości.

Bity Górna połowa Dolna połowa Zawartość
Bajt 7 6 5 4 3 2 1 0
0 wartość X całkowita ze znakiem (dodatnia oznacza ruch w lewo) protokół BoxSoft
1 wartość Y całkowita ze znakiem (dodatnia oznacza ruch w górę)
2 0 0 0 1 0 Btn5 Btn4 Btn3 Identyfikator protokołu i stan przycisków 3,4,5 (1=wciśnięty) rozszerzony protokół MSX
3 kółko poziome* wartość Z całkowita ze znakiem (dodatnia oznacza ruch kółka w górę)
4 ExCnt ID myszy Ilość dodatkowych bajtów możliwych do odczytu (włącznie z tym) i ID myszy PS/2 rozszerzony protokół EnterMice
5 Hw wer. mj. Hw wer. mn. Wersja sprzętu (major.minor)
6 Fw wer. mj. Fw wer. mn. Wersja firmware (major.minor)
7 ID urządzenia Identyfikator EnterMice to 5Dh
* jeszcze nie zaimplementowane, aktualnie wszystkie 8 bitów reprezentuje wartość Z (kółko pionowe)

Nie trzeba za każdym razem odczytywać wszystkich danych z bufora.

Odczyt może zostać przerwany w dowolnym momencie. Nastąpi wówczas timeout i interfejs wykona kolejny odczyt danych z myszki, po czym znów będzie gotowy do przesłania danych z bufora.

Ostatni stan sygnału RTS również nie ma znaczenia. EnterMice reaguje na zmianę stanu sygnału, a nie na jego poziom.

Odczyt myszy

; 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

Instrukcje w innych językach

Wersja angielska

Wersja hiszpańska

Wersja niemiecka