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?
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ą.
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?
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 :)
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.
@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.
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.