atarionline.pl Ctrl i Shift. Jak wykryć stan? - Forum Atarum

Jeśli chcesz wziąć udział w dyskusjach na forum - zaloguj się. Jeżeli nie masz loginu - poproś o członkostwo.

  • :
  • :

Vanilla 1.1.4 jest produktem Lussumo. Więcej informacji: Dokumentacja, Forum.

    • 1:
       
      CommentAuthorzilq
    • CommentTime26 Nov 2009
     
    Witam

    Mam pytanie związane z klawiszami jak w temacie.
    Czy jest możliwość wykrycia stanu wciśnięcia klawiszy Control i/lub Shift, bez kombinacji z innymi klawiszami?
    • 2: CommentAuthormono
    • CommentTime26 Nov 2009 zmieniony
     
    Bieżący stan shifta znajduje w rejestre SKSTAT ($d20f) na bicie 3. Controla się nie da :( Chyba, że ktoś wie, jak przestawić skanning klawiatury i jak nim rozsądnie sterować.
    W oderwaniu od klawiatury da się sprawdzać jeszcze tylko start, select i option - help jest zintegrowany z klawiaturą.
    • 3:
       
      CommentAuthorzilq
    • CommentTime26 Nov 2009
     
    ysz... akurat na Control mi zależało :/
    a w ogóle to takie przestawienie skanowania klawiatury jest możliwe? i czy dałoby się dzięki temu zrobić np. multikey'a?
    • 4: CommentAuthormono
    • CommentTime26 Nov 2009
     
    Nic pewnego nie wiem. Pamiętam, że dawniej udało się to zrobić resetując układ w SKCTL ($d20f) połowicznie (tylko 1 albo tylko 0 bit zapalony). Wtedy w KBCODE ($d209) pojawiały się wartości bardzo dziwnie i sugerowałoby to, że da się w ten sposób zbadać wciśnięcie więcej niż 1 klawisza, ale nie udało mi się z tego nic rozsądnego wywnioskować. Możliwe, że gdyby się temu dokładniej przyjrzeć udałoby się coś pożytecznego zauważyć, ale nie mam obecnie mojego Atari w domu :/ Warto by też chyba zerknąć na schemat czy w ogóle technicznie taki skanning jak np. klawiatury matrycowej jest możliwy - 8 kolumn x 8 wierszy, wybieramy numer wiersza (może zapisując KBCODE?) i czytamy kolumny (odczytując KBCODE). Być może nr wiersza jest automatycznie wybierany jakimś licznikiem pokeya? To takie lamerskie dywagacje :)
  1.  
    peek(53775) can be used to detect the shift key
    if it's 255, no key pressed
    if it's 247, shift key has been pressed.
    • 6:
       
      CommentAuthorKrótki
    • CommentTime27 Nov 2009
     
    Nie "resetując POKEY w połowie", tylko należy po prostu wyłączyć bit 0 w SKCTL, odpowiadający za włączenie tzw. debounce. Dzięki temu POKEY przestaje reagować na pojedyncze klawisze - reaguje tylko wtedy, gdy naciśnie się ich 2 lub więcej (a i tak tylko okreslone kombinacje). Naciśnięcie określonej kombinacji 3 lub więcej klawiszy powoduje, że na KBCODE zaczynają pojawiać się na przemian wartości odpowiadające tym klawiszom - można więc powiedzieć, że POKEY potrawi rozpoznać naciśnięcie kilku klawiszy naraz.

    Jednak w Atari 8-bit nie jest to specjalnie użyteczne. Natomiast w Atari5200 wyłączony bit debounce wraz ze specyficzną konstrukcją klawiatury w joysticku (inną niż w 8-bit) pozwalał w grach wykrywac naciśnięcie kilku klawiszy naraz.

    Polecam lekturę POKEY.PDF, gdzie szczegółowo opisano mechanizm debounce i skanowania klawiatury w ogóle.

    Natomiast Controla samego wykryć się po prostu nie da, nawet po przestawieniu bitu debounce.
    • 7: CommentAuthormono
    • CommentTime27 Nov 2009
     
    @Krótki: Dzięki za wyjaśnienie. Nie miałem styczności z tą dokumentacją - bazuję tylko na własnych doświadczeniach. Chętnie się tym pobawię, bo możliwość sprawdzenia wciśnięcia kilku klawiszy naraz jest dość kusząca.
    • 8: CommentAuthorAlex
    • CommentTime27 Nov 2009
     
    W 1995 roku się tym bawiłem. Chodziło o zrobienie cheata do gry lub dema. Da się :-) Niestety sa to jedynie wybrane kombinacje klawiszy.
    • 9:
       
      CommentAuthorKrótki
    • CommentTime27 Nov 2009
     
    Dokładnie. Poza sprytnym ukrywaniem cheatów nie widzę innego zastosowania.
    • 10: CommentAuthorxxl
    • CommentTime29 Nov 2009
     
    Krotki: co to znaczy na przemian, w jakich odstepach czasu? ktore kombinacje klawiszy w ten sposob mozna odczytac?
    • 11:
       
      CommentAuthorKrótki
    • CommentTime29 Nov 2009 zmieniony
     
    To jest dość skomplikowana sprawa, pełny obraz da Ci dopiero przeanalizowanie algorytmu skanowania klawiatury (w POKEY.PDF, s. 11). W każdym razie: jest matryca klawiszy 8x8, i POKEY co skanlinię skanuje kolejne pole matrycy. (Czyli co 8 linii ekranu następuje skanowanie następnej linii matrycy.) Jeśli POKEYowi wyłączyć debounce, to efektem ubocznym jest to, że zaczyna on reagować dopiero gdy naciśnie się co najmniej 2 klawisze, które na matrycy są położone obok siebie - np. G i S. Wtedy do KBCODE leci kod jednego z tych klawiszy - w tej chwili nie pamiętam którego. Leci też normalne przerwanie klawiatury.

    I teraz: jeśli naciśniesz klawisze G i S (leżą obok siebie na matrycy) oraz P i U (też leżą obok siebie na matrycy, ale NIE obok G i S, to ważne) to POKEY będzie na przemian wysyłać do KBCODE kod klawisza z 1 i 2 grupy. Ponieważ klawisz P leży na matrycy o 51 pozycji dalej niż G, to efekt będzie taki: na 51 skanlinii ustawia się kod klawisza G (albo S, nie pamiętam), a na pozostałe 13 skanlinii - kod klawisza P (albo U, nie pamiętam). I tak w koło Macieju. Nie pamiętam dokładnie, ale przerwania klawiatury chyba też lecą w takich odstępach.

    W Atari 5200 wyłączenie debounce ma sens ponieważ w joystickach 5200 naciśnięcie każdego klawisza powoduje zwarcie 2 kolejnych punktów na matrycy klawiatury. Niestety w 8-bit to od użytkownika należałoby wymagać naciskania 2 klawiszy naraz, przez co użyteczność tego jest wątpliwa.