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 17:11
       
      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 17:11 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 18:11
       
      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 18:11
       
      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 17:11
       
      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 18:11
       
      @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 18:11
       
      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 18:11
       
      Dokładnie. Poza sprytnym ukrywaniem cheatów nie widzę innego zastosowania.
      • 10: CommentAuthorxxl
      • CommentTime29 Nov 2009 09:11
       
      Krotki: co to znaczy na przemian, w jakich odstepach czasu? ktore kombinacje klawiszy w ten sposob mozna odczytac?
      • 11:
         
        CommentAuthorKrótki
      • CommentTime29 Nov 2009 15:11 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.