
Dendy Keyboard Transformer - podłącz klawiaturę i magnetofon do Pegasusa!
Artykuł powstał jako opis zmagań z próbą zrobienia reprodukcji kardridża Keyboard Transformer - rosyjskiego wynalazku, który umożliwia pisanie programów w BASICU. Kardridż udostępnia gniazdo klawiatury i magnetofonu - do pierwszego podłącza się standardową klawiaturę od PC, aby wprowadzać tekst. Do drugiego - magnetofon, który umożliwi zapis i odczyt napisanych programów z taśmy. Tak jak za czasów poczciwego Commodore 64, gdzie programy i gry również zapisywało się na kasetach magnetofonowych w postaci impulsow dźwiękowych.
Schemat (jak się później okazało - wymagający poprawek) i zdjęcia pochodzą ze strony http://www.nedopc.org/forum/viewtopic.php?t=10219 Gdybym nie był elektronikiem i nie posiadał odpowiednich narzędzi, poddałbym się chyba z kilka razy w różnych etapach próby jego `reprodukcji`, bo w każdym miejscu problem leżał gdzie indziej.



Własne PCB
Kardridż chciałem wykonać w domu, a ta technika nakłada pewne ograniczenia (brak metalizowanych otworów, a zamiast nich - przelotki wykonywane drutem), pierwszym krokiem było odtworzenie schematu i stworzenie własnego PCB. Schemat z powyższej strony był praktycznie zgodny z mozaiką ścieżek. W mojej wersji PCB wszystkie elementy (z wyłączeniem przelotek) lutuje się jedynie po dolnej stronie - ogromnie ułatwia to wykonanie, a zamiast scalaków można nawet wlutować podstawki! W rozmieszczeniu elementów starałem się być zgodny z oryginałem. Duże nieporęczne gniazdo klawiatury DIN5 zastąpiłem małym Mini-DIN6 (klawiatury PS/2). Poniższy mój schemat jest już kompletny, po wszystkich poprawkach.


Rosyjskie scalaki
Występujące na oryginalnym schemacie elementy o rosyjskich oznaczeniach mają swoje europejskie odpowiedni. Nie musiałem więc jechać do Rosji w celu ich poszukiwań

DD1 К561ЛН2 CD4069AR
DD2 К561ИР2 CD4015AE
DD3 КР1533ТМ2 74LS74
DD4 К555ЛА9 74LS03
DD5 К555ЛИ3 74LS11
DD6 КР1533КП11А 74LS257
VD1-VD3 КД522 1N4148
ROM
Linki do ROMU (PRG + CHR) z powyższej strony są już nieaktywne, ale sam ROM można pobrać ze strony CaH4e3. Ten niestety zapisany jest w mało popularnym formacie UNIF (zamiast iNES), co sprawiło drobną trudność w celu wyłuskania z niego części do zaprogramowania EPROMu PRG i CHR.
Pierwsze uruchomienie - problem z klawiaturą
Pierwsze uruchomienie (po usunięciu jednego mini zwarcia) i... chyba działa, bo już coś widać na ekranie konsoli! Niestety, żadna z moich trzech klawiatur (dwie Mini-DIN6, jedna DIN5 + adapter DIN5->Mini-DIN6) nie chciała współpracować. Przy okazji odkryłem, że posiadany przeze mnie adapter DIN5->MiniDIN6 miał jakieś niezgodne połączenia (co naprawiłem) oraz wreszcie zmotywowałem się, aby naprawić kilka niedziałających klawiszy w jednej z klawiatur (nie stykał jeden pin na folii). Mimo wszystko, czas chyba przypomnieć sobie, jak wygląda protokół komunikacji klawiatury z PC:

A jest to prosty protokół, w którym informacje o naciśniętych (i puszczonych) klawiszach przesyłane są szeregowo (linia zegarowa + linia danych) w formie pakietów składających się z 11 bitów (bit startu + 8 bitów kodu klawisza + bit parzystości + bit stopu)

Kody klawiszy (keyboard scancodes) to unikalne numery każdego z klawiszy, nie mające nic wspólnego z kodami ASCII. Protokół umożliwia także komunikacje w druga stronę, czyli komputer->klawiatura (np. w celu zapalenia/zgaszenia diod NumLock/ScrollLock/CapsLock).
Potem przyglądając się na schemat kardridża próbowałem zrozumieć, jak rosjanie rozwiązali sposób odczytu szeregowej transmisji bajtów przez procesor. W kadridżu są dwa rejestry 4 bitowe połączone kaskadowo + przerzutnik (co daję 9 bitowy rejestr). Wszystkie trzy taktowane są sygnałem zegarowym pochodzącym z klawiatury, więc niejako rejestry same napełniają się bitami, gdy klawisz zostanie wciśnięty. Dodatkowy, dziewiąty bit to zapamiętany sygnał startu (bit o wartości 1), który w momencie odebrania wszystkich ośmiu bitów jest podawany zanegowany na linię przerwania procesora, dzięki temu po każdym naciśnietym klawiszu, do procesora przychodzi przerwanie. Sprytne!

No właśnie, ale to 9 bitów, a w powyższym protokole jest ich przecież 11. Zagłębiając się dopiero w szczegóły odkryłem, że do komunikacji z klawiaturą powstały tak naprawdę dwa protokoły:
* AT (nowy), 11 bitów, używany przez wszystkie dzisiejsze klawiatur,
* XT (stary), 9 bitów, używany przez oryginalne klawiatury IBM XT chyba do połowy lat 90 (komputery 386 już go chyba nie używały).
Niestety, kardridż (pochodzący z 94 roku) był przystosowany do obsługi jedynie starych klawiatur XT. Postanowiłem więc stworzyć prosty konwerter AT->XT oparty na procesorze AVR Atmega 8 (wystarczy nawet Attiny 13).
Różnice między AT a XT:
* 11 bitów (AT) / 9 bitów (XT),
* odmienne kody każdego klawisza,
* inaczej przesyłana informacja o puszczeniu klawisza (XT: kod klawisza z ustawionym bitem nr 7, AT: bajt F0 + kod klawisza, który puszczono),
* XT umożliwia jedynie komunikacje w jedną stronę (klawiatura->komputer), AT - komunikacja dwustronna

Przy okazji też musiałem rozpracować jak działa mapper tego kardridża (co jak się potem okazało - było opisane na rosyjskiej stronie po rosyjsku

Obszary pamięci:
$6000-$7FFF: dodatkowe 8 kB RAMu (zapewne na potrzeby basica)
$8000-$ffff: 1 bank PRG 32 kB
Rejestry:
$5000 : odczyt tego rejestru powoduje odczytanie młodszych 4 bitów kodu klawisza
$5001 : odczyt tego rejestru powoduje odczytanie starszych 4 bitów kodu klawisza
Po wciśnięciu/puszczeniu klawisza zgłaszane jest przerwanie (IRQ) do CPU - patrząc na schemat realizacja techniczna jego także jest pomysłowa - bit startu (1) zapamiętywany jest właśnie w 9 bicie. Zanegowany bit puszczany jest na linię przerwania.
$5002 : odczyt tego rejestru powoduje potwierdzenie przerwania i wyczyszczenie rejestrów (gotowość do odczytu następnego klawisza)
$5000 : zapis na taśmę bitu 0
$5004 : zapis na taśmę bitu 1
$5000 : odczyt z taśmy bitu
Jak widać, niektóre rejestry pełnią kilka funkcji. Ale co ciekawe, wszystkie rejestry (nawet te do zapisu) reagują zarówno, gdy procesor odczytuje lub zapisuję spod tego adresu (nie brana jest w ogóle pod uwagę linia CPU_R/!W). To chyba jedyny mi znany przypadek, gdy odczyt jakiejś komórki pamięci powoduje wysłanie rozkazu do mappera!
BASIC
Gdy klawiatura już działa, mogłem przetestować możliwości kardridża - sterowanie odbywa się wyłączenie klawiaturą (standardowy joypad w ogóle nie jest używany). Kardridż, oprócz BASICa udostępnia jakiś edytor grafiki i coś, co się nazywa TRANSFORMER (jakaś gra?)




Zapis na magnetofon
Sygnał zapisu na magnetofon pochodzi z przerzutnika w nastepującym bloku w kardridżu:

$5000 zapis na taśmę bitu 0, $5004 zapis na taśmę bitu 1. C7 powoduje odcięcie składowej stałej, a R3/C4 to filtr dolnoprzepustowy (f3DB = 1/(2*pi*R*C) = 723 kHz). W oryginale na schemacie C7 był 100 pF, co w ogóle nie pozwalało na przenoszenie jakiegokolwiek sygnału.
Jednak i tak próba zapisu czegokolwiek na taśmę (polecenie `SAVE` w BASICu) nie powodował generowania jakiegokolwiek sygnału na wyjściu. Jak się później okazało, sygnał CLK do przerzutnika przychodził zbyt późno, a więc wysyłana na wyjście była zła wartość (zawsze 1). Ale dlaczego?
Obecne na wyjściach bramki rezystory początkowo mnie zastanawiały (myślałem, że może autorzy się pomylili i zamiast nich powinny być kondensatory, aby zewrzeć krótkie stany przejściowe). Potem dopiero zauważyłem, że to bramki z otwartym kolektorem, a więc rezystory utrzymują stan wysoki. A dlaczego nie zastosowano zwykłych bramek? Z oszczędności - bo sygnał odczytywany z magnetofonu, przekazywany na linię danych wymagałby bufora + dekodera. Zastosowana bramka pełni obie funkcje. Niestety w oryginalnym schemacie na wyjściach bramek były rezystory 11 k. Takie duże rezystory powodują wolny czas ładowania pojemności. Dodatkowo sygnał przechodzi przez trzy bramki, więc sie nie wyrabiał. Zamiana rezystorów na 1 k rozwiązała problem.

Sygnał cyfrowy zapisu na taśmę prostego programu - to prosta modulacja częstotliwościowa (1 kHz / 2 kHz):

Załączam także próbkę dźwięku wysyłanego na tasmę
Odczyt z magnetofonu
Odczyt z magnetofonu także nie działał początkowo poprawnie. Za jego realizację odpowiada następujący blok na schemacie:

Układ złożony z inwerterów to wzmacniacz sygnału, którego zadaniem jest konwersja analogowego sygnału z magnetofonu na postać cyfrową dla procesora. Postać cyfrowa powinna:
* mieć odpowiednie poziomy logiczne (0 / + 5V), niezależnie od głośności dźwięku magnetofonu (karta dźwiękowa PC generuje sygnał 0-1V),
* mieć odpowiednio strome zbocza,
* być wolna od szumów

Tutaj także, kondensatory C6/C5 mylnie oznaczono jako 100 pF. Zamiana na 100 nF pozwoliła przywrócić działanie układu. Ponadto, sygnał z wyjścia bramki U4A wymaga także podciągnięcia rezystorem do VCC!
Podsumowanie
Po spędzeniu ok. 3 dni nad projektem udało się osiągnąć sukces - zapis i odczyt programu napisanego w BASICu działa poprawnie! Jedyny kłopot którego jeszcze nie rozwiązałem, to jak przerwać działanie np. takiego programu w BASICu:
10 PRINT "HELLO WORLD"
20 GOTO 10
A może autorzy tego kardridża nie przewidzieli takiej ewentualności?
Moje stanowisko pracy i efekt końcowy:







Cool? Ranking DIY