1 Ostatnio edytowany przez _tzok_ (2021-05-31 21:23:59)

Klawiatura Atari to typowa klawiatura matrycowa (nie licząc klawiszy "funkcyjnych"). Odczyt jest realizowany przez układ POKEy z pomocą 2 multiplekserów analogowych CD4051.

POKEy za pomocą linii K3...K5 wybiera wiersz matrycy klawiatury, na który podaje masę (przez rezystor 100R), natomiast za pomocą linii K0...K2 wybiera kolumnę, której stan odczytuje przez wejście KR1 (podciągnięte do Vcc przez rezystor 47kR). Nieco inaczej są odczytywane klawisze Break, Control i Shift. Używane jest do tego wejście KR2 (również podciągnięte do Vcc przez rezystor 47kR), które jest podłączone na stałe do kolumny klawiatury, w której są te klawisze.

Teraz pora na pytanie - jak rozwiązano komunikację PICa z POKEYem w AKI? Podłączone są tam jedynie linie KR1, KR2 oraz K0 i K5. Jak sądzę, wewnętrznie generowane są opóźnienia, wyzwalane początkiem skanowania wierszy/kolumn i na ich podstawie wystawiane są odpowiednie stany na KR1 i KR2. Dlaczego to jest aż tak przekombinowane. PIC przecież ma dość pinów GPIO, aby mógł "widzieć" wszystkie 6 linii Kn i nie byłoby problemu z timingami.

Przygotowałem "znormalizowaną" (po adresach) mapę klawiszy:
https://obrazki.elektroda.pl/7038795000_1622492630_thumb.jpg

Moja kolekcja: Atari 1040STe (4MB), Atari 1040STfm (4MB, BLiTTER, AT-ONCE+), Atari 800XE (SIMM EXP 1MB), Atari 800XL (RAMBO XL 256kB), Atari 600XL (64kB), Sinclair ZX SPECTRUM+ (48kB), TIMEX Computer 2048 (48kB), Commodore A600 (2MB+4MB, HDD CF 4GB), Commodore C64C.

2 Ostatnio edytowany przez mono (2021-05-31 21:18:12)

@_tzok_: Moim zdaniem nie ma potrzeby generowania wewnętrznych timingów, bo zakładając że linia K0 jest najmłodszym bitem licznika a K5 najstarszym, to wtedy zmiana K0 mówi o zwiększeniu licznika K0..K5, natomiast zmiana K0K5 z 11 na 00 mówi o tym, że licznik K0..K5 zostaje wyzerowany. Krótko mówiąc mając najmłodszy i najstarszy bit licznika jesteś w stanie zregenerować wszystkie bity.

Edit: Oczywiście podstawą jest synchronizacja do zmiany 11->00 K0K5.

hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje

3

No właście - trzeba się synchronizować do tego przejścia, a dalej polegać na wewnętrznym timerze PICa. Czytając wszystkie 6 linii, można realizować komunikację synchronicznie.

Moja kolekcja: Atari 1040STe (4MB), Atari 1040STfm (4MB, BLiTTER, AT-ONCE+), Atari 800XE (SIMM EXP 1MB), Atari 800XL (RAMBO XL 256kB), Atari 600XL (64kB), Sinclair ZX SPECTRUM+ (48kB), TIMEX Computer 2048 (48kB), Commodore A600 (2MB+4MB, HDD CF 4GB), Commodore C64C.

4

Nie timera a licznika. Nie jest potrzebny timer taktowany jakimś swoim zegarem. K0 OR K5 -> reset licznika K1K2K3K4, K0 jest podawane na wejście taktujące licznika K1K2K3K4. Linia K0 + licznik K1K2K3K4 + linia K5 składa się na pełny licznik wierszy i kolumn.

hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje

5 Ostatnio edytowany przez _tzok_ (2021-06-01 07:40:41)

Ale wciąż pozostaje problem startu i pierwszego cyklu.

Reset chyba raczej nie jest taki prosty. Reset powinien być na zmianie stanu K5 z 1 na 0 i zasadniczo, do momentu pierwszego resetu, układ nie powinien nic wysyłać, bo wewnętrzny licznik nie jest zsynchronizowany z licznikiem POKEYa.

Żeby to zrobić bez kombinowania potrzeba 12 linii GPIO, PIC16F84A ma ich 13, ale potrzebuje jeszcze 2, żeby czytać klawiaturę PS/2, stąd te kombinacje. Zapomniałem o Start, Select, Option i Reset...

Moja kolekcja: Atari 1040STe (4MB), Atari 1040STfm (4MB, BLiTTER, AT-ONCE+), Atari 800XE (SIMM EXP 1MB), Atari 800XL (RAMBO XL 256kB), Atari 600XL (64kB), Sinclair ZX SPECTRUM+ (48kB), TIMEX Computer 2048 (48kB), Commodore A600 (2MB+4MB, HDD CF 4GB), Commodore C64C.

6

Tak, pierwsze max 64 cykle są stracone :)
A dałoby się tam dodać jeszcze taki drobiazg z XEGS: "wskazuje fakt podłączenia klawiatury (1 - podłączona)" http://atariki.krap.pl/index.php/Rejestry_GTIA#TRIG2 ?

hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje

7

Wystarczy zwarcie do masy pinu 10 (T2) GTIA.

Moja kolekcja: Atari 1040STe (4MB), Atari 1040STfm (4MB, BLiTTER, AT-ONCE+), Atari 800XE (SIMM EXP 1MB), Atari 800XL (RAMBO XL 256kB), Atari 600XL (64kB), Sinclair ZX SPECTRUM+ (48kB), TIMEX Computer 2048 (48kB), Commodore A600 (2MB+4MB, HDD CF 4GB), Commodore C64C.