EnterMice (Polski)
Interfejs joysticków i myszy PS/2 dla komputera Enterprise 64 / 128
Contents
- 1 Wstęp
- 2 Lista programów współpracujących z myszką (aktualizowana)
- 3 Opis ogólny
- 4 Ważne
- 5 Podłączenie do komputera
- 6 Funkcje
- 7 Korzystanie ze sterownika
- 8 Znane problemy
- 9 Specyfikacja techniczna
- 10 Informacje dla programistów
- 11 Instrukcje w innych językach
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)
Multiplay, Iview, Cview, by Istvan-V.[8]+ File, by Zozosoft.[9] Wewnętrznie.
Paintbox ze sterownikiem myszy.[10]
Enterprise Graphical Interface (EGI) ze sterownikiem myszy.[11]
SymbOS wewnętrznie, w trybie podstawowym EnterMice (modyfikacja przez hack)[12].By Prodatron[13].
Programy w Basicu mogą korzystać ze sterownika myszy.
Stare programy używające joysticka w porcie 1, z EnterMice w trybie emulacji joysticka.
EDC Windows, wewnętrznie w trybie EnterMice oraz jako driver w trybie Hsoft. Użyj zmodyfikowanych plików: [14]
SPEmu128 autorstwa geco, doskonały emulator ZX Spectrum dla Enterprise, umożliwia emulację myszy Kempston [15] wykorzystując informacje o ruchach myszki z interfejsu EnterMice. Lista kompatybilnych gier stale rośnie.[16]
Lista gier
Pasziansz(Pasjans) [17]. Wersja ROM [18]
SWAP [19]
Wolf2004 First person shoot'em up. Konwersja z ZX Spectrum przez Geco[20]
Bricky Prise. Gra stworzona przez Geco, Endi i Szipucsu. Adaptacja dla EnterMice przez Isvan-V. [21] i [22]
Pięć w rzędzie. Gra strategiczna napisana w BASIC. Adaptacja dla EnterMice przez Lacika. [23]
Chess Master 2000 skonwertowana z Amstrada CPC przez Geco[24]
Emulatory XEP128 i EP128emu
Nawet jeśli nie masz interfejsu EnterMice, możesz przetestować sterowanie myszką na emulatorze Enterprise. Doskonały emulator XEP128[25] autorstwa LGB umożliwia naśladowanie interfejsu z użyciem myszki komputera PC. Możesz również wypróbować emulację ZX Spectrum przez SPEmu128 na emulowanym Enterprise. Mysz Kempston będzie wówczas sterowana myszką komputera PC ...
Tutaj [26] wyjaśnienie w jaki sposób skonfigurować emulator XEP128, aby prawidłowo pracował na PC z systemem Windows.
W tym miejscu[27] opis konfiguracji dla systemu OSX.
Dzięki pracy LGB nad jego emulatorem XEP128, również IstvanV zaktualizował swój EP128emu dodając emulację EnterMice. Dostępny jest prosty instalator dla systemu Windows.
Aktualną wersję można pobrać tutaj [28].
Opis ogólny
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").
Sterownik ten umieści wskaźnik myszy na dowolnym ekranie graficznym lub tekstowym i będzie odzwierciedlał ruchy myszy poprzez przemieszczanie kursora po ekranie. Kursor w trybie tekstowym działa wewnętrznie z dokładnością do piksela, ale rysowany jest w obrębie pojedynczego znaku, więc może się poruszać skokowo na krótkich dystansach.
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ęć.
Poniżej prosta procedura w BASIC-u pozwalająca wykryć czy sterownik został już załadowany:
100 WHEN EXCEPTION USE DRIVER_LOADING 110 SET 189,4 ! próba ustawienia trybu pracy EnterMice jest możliwa tylko gdy sterownik jest załadowany 120 END WHEN
1000 HANDLER DRIVER_LOADING 1010 EXT "LOAD MOUSE.XR" ! plik sterownika powinien się znajdować w bieżącym katalogu, jeśli się tam nie znajduje, otrzymamy błąd 1020 PRINT "Loading the Mouse Driver" 1030 SET 189,4 ! tutaj otrzymujemy potwierdzenie, że sterownik został prawidłowo zainstalowany 1040 END HANDLER
Sprawdzenie można wykonać również w bardziej skomplikowany i skuteczny sposób ustawiając zmienną sygnalizującą status "sterownik niezaładowany", a następnie załadować sterownik w głównym programie. Wówczas, jeśli plik sterownika nie zostanie odnaleziony (prawdopodobnie znajduje się w innym katalogu), to błąd może być rozpoznany w tym samym lub kolejnym podprogramie obsługi.
Dobrą praktyką jest zapobieganie wielokrotnemu instalowaniu sterownika myszy.
Wykonanie polecenia ":HELP 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 lub zmieniony, podczas gdy kanał myszki jest otwarty, procedura obsługi myszy wykryje to i się dezaktywuje. Kanał myszy pozostanie otwarty, ale nie będzie działał. 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
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.
Sterownik myszy działa w trybach graficznych i tekstowych. Planowana w trybie edytora, co pozwoli na wywoływanie akcji po przyciśnięciu przycisku, z uwzględnieniem położenia wskaźnika myszy na ekranie. 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
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.
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
do podłączenia sześcioprzyciskowego kontrolera Sega [29]
Informajce o sześcioprzyciskowym kontrolerze Sega
Opis protokołu interfejsu sześcioprzyciskowego kontrolera SEGA MegaDrive
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
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
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
Maksymalny prąd dostępny na złączu PS/2 jest ograniczony wydajnością wewnętrznych stabilizatorów Enterprise. W praktyce nie należy przekraczać obciążenia 300mA.
Obudowa 3D
Wersja pierwsza (DIP switch po stronie elementów)
Wersja druga (DIP switch po stronie złącz krawędziowych)
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 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 2) | wartość Z | całkowita ze znakiem (dodatnia oznacza ruch kółka w górę) | |||||||||
4 | ExCnt 3) | 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 |
1) Jeśli urządzenie obsługuje tylko protokół BoxSoft, to piąty półbajt jest zawsze równy 0000.
2) Jeszcze nie zaimplementowane, aktualnie wszystkie 8 bitów reprezentuje wartość Z (kółko pionowe)
3) Jeśli urządzenie nie obsługuje protokołu EnterMice, to dziewiąty półbajt jest zawsze równy 0000.
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,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 |
Skrócona procedura odczytu EnterMice (autor Bruce Tanner)
Ta 79 bajtowa procedura obsługuje tylko protokół MSX, odczytuje wyłącznie ruchy oraz dwa przyciski myszki. Służy do łatwej konwersji lub adaptacji starych programów i gier. Musi być wywoływana w przerwaniu 50Hz oraz zakłada, że zmienne X_REL i Y_REL znajdują się w kolejnych słowach pamięci.
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 |
Kompaktowa procedura obsługi myszki wraz ze wszystkimi przyciskami i kółkiem, dzięki IstvanV
Procedura wyzwalana przerwaniem VSYNC (50Hz).
;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 |
Odczyt przycisków myszy bez korzystania z procedury
EnterMice odczytuje stan przycisków w inny sposób niż Boxsoft+Neos. W oryginalnym interfejsie zawsze można odczytać stan dwóch głównych przycisków tak samo jak styki w joysticka, wpisując 0 lub 5 do portu B5h Z80, a następnie odczytując zwróconą wartość z portu B6h. Jest to niezależne od odczytu danych o ruchach myszki.
Ponieważ mysz PS/2 przekazuje dane za pośrednictwem protokołu komunikacyjnego, przyciski myszki nie są wprost podłączone w EnterMice do odpowiednich styków, ale można pobrać ich stan w łatwy sposób poprzez zmianę poziomu linii RTS (stan wysoki co najmniej na 2 μs, później można znów ustawić zero na porcie B5h). Następnie po upływie 1,5 ms EnterMice uruchamia procedurę odczytu danych z myszki PS/2 (która trwa w najgorszym przypadku 12 ms) i w końcu na podstawie odczytanych danych ustawia właściwą wartość w porcie B6h zawierającą informacje o stanie dwóch głównych przycisków.
Przykład:
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 | |
out (0B5h),a | ;Keyboard row 0 is requested | |
in a, (0B6h) | ;The two mouse buttons are read on bits 1 and 2 |
Instrukcje w innych językach
Wersja angielska
Wersja hiszpańska
Wersja niemiecka
Wersja węgierska