22.09.2019, 22:12:39 *
Witamy, Gość. Zaloguj się lub zarejestruj.

Zaloguj się podając nazwę użytkownika, hasło i długość sesji
Aktualności: Zapraszamy do rejestracji na forum wszystkich fanów Pegasusa!
 
   Strona główna   Help Szukaj Zaloguj się Rejestracja  
Strony: [1]
  Drukuj  
Autor Wątek: Keyboard Transformer - podłącz klawiaturę i magnetofon do Pegasusa!  (Przeczytany 1504 razy)
krzysiobal
Stały bywalec PG
*****
Wiadomości: 292


Naprawie pegasusa każdemu!


Zobacz profil
« : 16.05.2017, 13:02:35 »


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ń ;-) Jak się okazało, to zwykłe układy z rodziny 74XX/40XX.
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:
Kod:
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:


https://www.youtube.com/watch?v=mkqGZGN7f_k

Zapisane
Pegasus Gry - forum Pegasusa i gier na Pegasusa
« : 16.05.2017, 13:02:35 »

 Zapisane
Mcin
Twój Moderator
Moderator Globalny
Stały bywalec PG
*****
Wiadomości: 2838



Zobacz profil
« Odpowiedz #1 : 17.05.2017, 10:45:36 »

Szanuję mocno! :>

Na marginesie, swego czasu, jako człowiek przyzwyczajony do emulatorów i w sumie grający na PC więcej niż na konsoli, zastanawiałem się, co jakby się dało klawiaturę z moim obłożeniem klawiszy podłączyć do Pegasusa zamiast pada, jako kontroler. Wydaje się, patrząc powyżej, że ktoś nawet umiałby to zrobić :>
Zapisane
SebaSan1981
Astromaniac
Stały bywalec PG
*****
Wiadomości: 528



Zobacz profil
« Odpowiedz #2 : 17.05.2017, 17:20:51 »

Świetna robota. Nie licz Krzysiobalu jednak na większe zainteresowanie, ludkowie tutaj na forum wolą się jarać przepłaconymi bezwartościowymi chińsko/tajwano/brazyliskimi plastikowymi podrabianymi niby to kolekcjonerskimi cartridżami z literkami bic i naklejeczkami remarks aniżeli jakąkolwiek nowatorską twórczością z zakresu retrogamingowej elektroniki. Mrugnięcie

A szkoda bo to co tworzysz jest naprawdę ciekawe. I chwała takim ludziom jak Ty że zajmujesz się tego typu wynalazczością. Gratulacje, czekam na kolejne ciekawe projekty!!
Zapisane

VertekS
Aktywny użytkownik
***
Wiadomości: 196



Zobacz profil
« Odpowiedz #3 : 17.05.2017, 20:22:00 »

Cah4e3 napisał, że rosyjski Keyboard Transformer to tłumaczenie Family Basic v2.1a. Załadowałem obraz tej konkretnej wersji Family Basica do Nestopii, przepisałem i uruchomiłem kod, wykonywanie nieskończonej pętli przerywa się tam (w Nestopii) przyciskiem "End".
W sieci znajdziesz instrukcję do Family Basic V1 / V2 przełożoną z oryginału (japoński) na angielski - może tam wyczytasz jeszcze jakieś ciekawe rzeczy.

Jeśli "Transformer" to ekran z ostatniego zdjęcia (ten z kolorowymi kwadracikami), to jest to ekran startowy Family Basica - stąd można przejść między innymi do edytora.
Zapisane
pshq
Aktywny użytkownik
***
Wiadomości: 173



Zobacz profil
« Odpowiedz #4 : 18.05.2017, 17:35:32 »

Krzysiobal, co chwilę zaskakujesz. Jeszcze trochę i na Pegasusie odpalisz Windowsa… Mrugnięcie
No i myślałem, że tylko klony-klawiatury były odpowiednio skonstruowane, że klawiatura musi być gdzieś wewnątrz dołączona do procesora, a tu proszę - przez odpowiedni kartridż też się da. Ciekawe, ile Rosjanie ściągnęli z oryginalnego Family Basic? Bo różnica jest duża, zwłaszcza sposób podłączania klawiatury (na Famicomie była klawiatura pod złącze pistoletu).

Ogółem, gratuluję cierpliwości i umysłu!
Zapisane
krzysiobal
Stały bywalec PG
*****
Wiadomości: 292


Naprawie pegasusa każdemu!


Zobacz profil
« Odpowiedz #5 : 18.05.2017, 20:23:22 »

Cytuj
Cah4e3 napisał, że rosyjski Keyboard Transformer to tłumaczenie Family Basic v2.1a. Załadowałem obraz tej konkretnej wersji Family Basica do Nestopii, przepisałem i uruchomiłem kod, wykonywanie nieskończonej pętli przerywa się tam (w Nestopii) przyciskiem "End".
W sieci znajdziesz instrukcję do Family Basic V1 / V2 przełożoną z oryginału (japoński) na angielski - może tam wyczytasz jeszcze jakieś ciekawe rzeczy.
A jakiej nestopii używasz? Moja nie chciała wczytac tego ROMu, chyba że twój jest w innym formacie.
Ja używam FCEU a on ma jakieś problemy z emulacją klawiatury, litery i cyfry  ale już apostrofy i inne nie bardzo, więc nie mam jak testować.

Krzysiobal, co chwilę zaskakujesz. Jeszcze trochę i na Pegasusie odpalisz Windowsa… Mrugnięcie
No i myślałem, że tylko klony-klawiatury były odpowiednio skonstruowane, że klawiatura musi być gdzieś wewnątrz dołączona do procesora, a tu proszę - przez odpowiedni kartridż też się da. Ciekawe, ile Rosjanie ściągnęli z oryginalnego Family Basic? Bo różnica jest duża, zwłaszcza sposób podłączania klawiatury (na Famicomie była klawiatura pod złącze pistoletu).

Ogółem, gratuluję cierpliwości i umysłu!
Chyba tylko przetłumaczyli rom + dokonali podmian funkcji odczytującej klawisze. Bo  w ROMie Keyboard Transformera jest dużo dziwnych, nic nierobiących instrukcji w funkcji przerwania, np. AND #$FF czy NOPy mimo, zę odczyt klawiatury nie wymaga żadnych specjalnych zależności czasowych.
Zapisane
VertekS
Aktywny użytkownik
***
Wiadomości: 196



Zobacz profil
« Odpowiedz #6 : 18.05.2017, 22:44:37 »

Użyłem Nestopii 1.40.
Sprawdziłem też FCEUX 2.2.2 - tutaj "brejka" w wykonywaniu kodu Basica wywołuje się klawiszem Backspace. Żeby używać Family Keyboard w tym emulatorze, trzeba wcisnąć Scroll Lock, ponadto warto w Config -> Map Hotkeys wyczyścić mapowanie klawiszy pecetowej klawiatury do bajerów emulatora z klawiszy F1 - F12, 0 - 9 i kilku liter. Cudzysłów potrzebny na przykład przy princie, to kombinacja SHIFT + 2, tyle potrzebowałem żeby przepisać kod z pierwszego posta.
Ułożenie klawiszy Famicomowej klawiatury w emulatorach mniej więcej odpowiadają temu, jakie ma prawdziwy Family Keyboard - jest bardzo dobre zdjęcie tej klawiaturki na Wikipedii i widać napisy na każdym klawiszu.

W załączniku masz ROM, którego ja używałem.
« Ostatnia zmiana: 18.05.2017, 22:53:09 wysłane przez VertekS » Zapisane
Strony: [1]
  Drukuj  
 
Skocz do:  

Powered by SMF 1.1.21 | SMF © 2006-2007, Simple Machines
Sitemap
pegasus