Tajemnice ATARI

ATARI INACZEJ: MYSZ DO ATARI XL/XE


    Artykuł ten nie będzie, wbrew pozorom, traktować o firmowej myszy do ATARI XL/XE - "ZOBIAN RAT", praktycznie w Polsce nie spotykanej, lecz o dołączeniu do naszej ulubionej maszynki myszy od AMIGI bądź ATARI ST. Nie jest to trudne ani pracochłonne, lecz wymaga pewnych umiejętności lutowniczych, choć rozwiązanie połowiczne obywa się bez jakichkolwiek ingerencji sprzętowych.

Jak to działa?

    Na początek trochę teorii: mysz czyli "ręczny manipulator stołokulotoczny" jest urządzeniem działającym w oparciu o przekładnię mechaniczno-elektryczną. Przenosi i zamienia na impulsy elektryczne swój ruch po płaszczyźnie. Na każdy, nawet najlżejszy, ruch odpowiada impulsem, skierowanym do komputera. Oczywiście, dzieje się tak wtedy, gdy czułość układu myszy jest większa niż wykonany ruch. Nie jest to jednakże problemem, gdyż np. moja mysz do IBM (dla AMIGI i ST nie mam danych) rozpoznaje ruch już o 0,12 mm.

    Myszy AMIGI i ATARI ST podłączane są do portu joysticka. Wysyłają do komputera sygnały na 7 liniach:

  • cztery, używane są również przez joystick do sygnalizacji kierunku wychylenia,
  • FIRE oddaje stan lewego przycisku myszy,
  • 1 potencjometr oddaje stan prawego przycisku myszy,
  • 2 potencjometr oddaje stan środkowego przycisku myszy,

        Uwagi wymagają głównie potencjometry: przyciski myszy po uaktywnieniu zwierają zawsze odpowiedni sygnał z masą. W przypadku lewego FIRE wszystko jest w porządku, problemy zaczynają się jednak w momencie próby odczytania stanu FIRE: prawego i środkowego. Niestety, POKEY nie sygnalizuje faktu zwarcia z masą linii próbkującej potencjometru. Aby to czynił, należy zamienić sygnał masy z linią zasilania +5V. Dokonać tego można w dwojaki sposób:

  • 1. Dokonując bezpośrednich przeróbek w układzie elektronicznym myszy,
  • 2. Wykonując interfejs pośredniczący między złączem w komputerze, a układem myszy, najlepiej w postaci przedłużacza.

        Sam zastosowałem pierwszą metodę - wykonanie interfejsu w moich warunkach jest niecelowe: myszkę używam wyłącznie do ATARI. Ci jednak, którzy chcą zbudować interfejs, muszą zgromadzić: wtyk i gniazdo joysticka, jakieś małe pudełeczko oraz jakiś inwerter sygnałów TTL (np. UCY 74LS04). Całe działanie interfejsu polega na "odwróceniu" sygnałów 9 i 5 (potencjometry A i B), lub tylko 9 (dla myszy dwuprzyciskowej). Tak wykonany interfejs należy podłączać między port joysticka, a złącze myszy (bez użycia przedłużaczy do joysticków!).

    Wykorzystanie myszy.

        Do konwersji sygnałów z myszy na wskaźnik położenia chciałbym zaproponować własną procedurę, zastosowaną przeze mnie w grze "Najemnik - powrót". Z góry zastrzegam się, że nie znam algorytmu obsługi myszy, zastosowanego w grze "Operation Blood", być może lepszego. Mój ma dwie niewątpliwe zalety - jest krótki, prosty i działa. Aby można było zrozumieć jego ideę, opiszę moją interpretację pracy myszy.

        Sygnały myszy można podzielić na 3 grupy:

  • Odzwierciedlające ruch w poziomie: w myszy AMIGI są to bity 1 i 3, w ST: bity 0 i 1.
  • Odzwierciedlające ruch w plonie: AMIGA: bity 0 i 2, ST: bity 2 i 3.
  • Odzwierciedlające stan przycisków: TRIG0 ($284), PADDL0 ($270), PADDL1 ($271). Stany aktywne: TRIG0 = 0, PADDL0 i PADDL1 = 1.

        Należy utworzyć tablice wartości liczbowych. Zróbmy to np. dla myszy AMIGI:

    POZTAB = 0, 2, 10, 8
    PIONTAB = 0, 1, 5, 4

        Zauważmy, że są to liczby, utworzone z kombinacji odpowiednich bitów (1,3) oraz (0,2). W zasadzie są to kolejne liczby, poza przestawieniem 2 ostatnich (dla ST tak samo!).

        Zainicjujmy indeksy w obu tablicach (wstępne położenia myszy w tablicy):

    XIND = 0
    YIND = 0

        Ustalmy też pierwotne położenie kursora myszki (na środku ekranu):

    XKUR = $80
    YKUR = $80

        Teraz pozostało już tylko cyklicznie odczytywać stan PORTU A (cały czas mowa o jego 4 młodszych bitach - porcie 1), porównywać (po zastosowaniu odpowiedniej maski bitowej) ze stanem dotychczasowym i odpowiednio modyfikować położenie kursora.

    LDA $D300 ; pobierzmy stan PORTU A
    * LSR @ ; (ta i 3 ponizsze linie dla myszy w porcie 2)
    * LSR @
    * LSR @
    * LSR @
    STA POM ; i zapamietajmy, przyda się jeszcze (do pionu)
    AND #$0A ; tylko potrzebne bity (poziom i AMIGA)
    LDY #$3
    ET1 CMP POZTAB,Y ; a teraz przeszukajmy tablice
    BEQ ET2 ; i okreslmy polozenie myszki w poziomie
    DEY ; w postaci indeksu w tablicy POZTAB
    BNE ET1 ; tylko polozenia w tablicy - zaloz, ze = 0
    ET2 TYA ; majac aktualne polozenie w Y
    CLC ; sprawdzmy, czy nowy indeks (mod 4) w tablicy
    ADC #$01 ; w nie poprzedza bezpośrednio starego
    AND #$03
    CMP XIND
    BNE ET3
    STY XIND ; jesli tak, zapamietaj nowy indeks
    DEC XKUR ; i zwieksz polozenie poziome kursora
    ET3 TYA
    SEC ; sprawdzmy, czy nowy indeks (mod 4) w tablicy
    SBC #$0l ; nie nastepuje bezposrednio po starym
    AND #$03
    CMP YIND
    BNE ET4
    STY YIND ; jesli tak, zapamietaj nowy indeks
    INC XKUR ; i zmniejsz polozenie poziome kursora
    ET4 RTS

        To była procedura dla poziomu, podobnie robimy dla pionu - zmieniamy tylko maskę na $05, tablicę na PIONTAB, indeks w tablicy na YIND i współrzędną kursora na YKUR. Te ostatnie odpowiednio 4 i 2 razy.

        Czułość myszy zależy od tego, w którym miejscu zmodyfikujemy współrzędne kursora. Można np. dodatkowo, przed zmodyfikowaniem ich zawartości, sprawdzać, czy wartość odpowiedniego indeksu = 0 - wprowadzi to pewne opóźnienie, czyli zmniejszy dynamikę ruchu kursora. W powyższym przykładzie brak też ograniczeń w ruchu kursora - "wyjeżdża" on poza ekran, pojawiając się z jego przeciwległej strony. Możliwe jest poza tym uogólnienie pokazanej procedury tak, aby obsługiwała ona zarówno myszkę AMIGI, jak i ST. Wystarczy w tym celu odpowiednio zmodyfikować zawartość tablic POZTAB i PIONTAB - może to oczywiście robić sam program - wpisując w tablice dane z pomocniczych tablic dla AMIGI i ST, zależnie od wyboru, dokonanego przez użytkownika. Można wreszcie zautomatyzować proces rozpoznawania myszki (czy w ogóle urządzenia zewnętrznego), zmuszając na wstępie programu jego użytkownika do wskazania kursorem określonego miejsca na ekranie i odpowiednio analizując dane, pochodzące z peryferiów (mysz AMIGI czy ST, joystick czy też paddle). Powyższa procedura ma też niewątpliwą wadę: musi być wykonywana w czasie rzeczywistym ze sporą regularnością. Nie jest to jednak dziwne: na odcinku 20cm myszka generuje ok. 1700 impulsów, a taki ruch myszą wykonuje się w 0.25 - 0.5 sekundy. Częstotliwość próbkowania winna więc wynosić co najmniej 3 kHz, a jeśli przy myszy siedzi bardzo nerwowy osobnik - to i 5 kHZ może być za mało! Z własnego doświadczenia wiem, że wykonywane (w czasie rzeczywistym skoki na przemian do procedur: obsługi myszy i jakiejś własnej (byle krótkiej) pozwalają zachować jeszcze znośną czułość i szybkość myszy. Własną procedurą może być np. procedura odgrywająca jakiegoś sampla o niskiej częstotliwości odtwarzania (po 1 bajcie). Dodatkowa, nie wolno zapomnieć o obowiązkowym w tej sytuacji, usuwaniu ze starej pozycji kursora i ponownym rysowaniu go na nowej pozycji na początku każdego przerwania VBL- początku wyświetlania ekranu (jeśli jest to sprite, należy wyzerować całą stronę pamięci, należącą do tego obiektu), nie wiadomo bowiem, jak dalece, od ostatniego przerwania, zdążyły się mienić jego (kursora) współrzędne.

        Bezpośrednia przeróbka wewnątrz myszy wygląda następująco: jeden ze styków mikroprzełącznika prawego (i środkowej) FIRE myszki jest połączony z masą. Należy przeciąć na płytce dotychczasowe połączenie, a do wyżej wymienionego styku doprowadzić +5V. Można również wbudować w mysz przełącznik 2-pozycyjny, zwierający styk z masą i +5V. Jego położenia można opisać: XL/XE i ST (lub AMIGA). Pomysłu nie zamierzam opatentowywać: wszyscy zainteresowani mogą sobie wykonać dowolną liczbę egzemplarzy (również w celach handlowych).

    Artur Miarecki



  • Powrót na start | Powrót do spisu treści | Powrót na stronę główną

    Pixel 2002