Zenon Rakoczy z grupy Dial napisał dla nas o projekcie
"Weronika":
Założenia projektu
Założenia były takie. Moduł kartridża zawiera w sobie dowolny
procesor pracujący z dowolną szybkością. Słowo "dowolny" proszę
traktować w granicach rozsądku. Może to być procesor 6502 lub jego
młodszy brat, 16-bitowy taktowany np. 10MHz, albo AT89C2051
taktowany np. 6MHz. W zasadzie dowolne procesory taktowane dowolną
częstotliwością. Po co to? Otóż drugi procesor ma wspomagać
procesor Atari przygotowując dla niego coś, co będzie potrzebne,
gdy ten zajęty jest np. odczytem pliku ze stacji dysków.
Jak to jest synchronizowane? I na jakiej zasadzie przesyłane są
dane do obróbki między jednym a drugim? Opiszę pierwotny projekt,
który w czasie testów ulegał modyfikacjom i na końcu przyjął nieco
inną ostateczną formę. Trzon pozostał ten sam. Otóż mówimy o
kartridżu wyposażonym w drugi procesor. Do tego pamięć RAM o
pojemności 8KB, pamięć EPROM też o pojemności 8KB (trochę na
wyrost) oraz druga pamięć RAM na użytek tylko procesora kartridża,
no i nieco elektroniki.
Od strony Atari nic ponad to, w co wyposażyli go konstruktorzy. A
że lubię BASIC i łatwo posługując się nim przeprowadzać testy, więc
używana będzie przestrzeń adresowa $8000-$9FFF. Nie bez znaczenia
jest fakt, że BASIC nadal jest dostępny, a przestrzeń tą można
używać w zasadzie bezkarnie, bez nieprzyjemnych konsekwencji.
Natomiast w kartridżu umieszczony jest rejestr stanowiący ogniwo
łączące dwa procesory, by jeden nie następował na odcisk drugiemu.
Dostęp do tego rejestru ma zarówno procesor Atari, jak i ten drugi,
umieszczony w kartridżu. Procesor Atari może do niego wpisać 1 lub
0 i odczytywać jego stan. Procesor kartridża może go tylko
wyzerować, co równoważne jest wpisowi zera, i może odczytywać jego
stan.
Pamięć RAM 8KB umieszczona jest w kartridżu, dostęp do niej ma
zarówno jeden jak i drugi procesor, ale o tym do którego jest
przypisana decyduje wyłącznie procesor Atari. Pamięć ta przełączana
jest na zasadzie multipleksowania i albo podłączana jest w obszar
$8000-9FFF Atari, albo w obszar adresowania drugiego procesora.
Powtórzę: przełączenia dokonuje tylko i wyłącznie procesor Atari.
Ale obydwa mogą ją zapisywać i odczytywać.
Jak to działa?
Zaczynamy! Włączenie zasilania uruchamia procesor kartridża który
pracuje według programu umieszczonego w pamięci EPROM. A program
ten przymusza go do testowania rejestru w pętli, bo na razie nie ma
nic innego do roboty. Czeka na informację: masz dane, możesz je
obrobić i przygotowane podstawić procesorowi Atari. Jednocześnie
zaczął pracować procesor Atari. Co robi? Ano właśnie odczytał jakiś
plik z dyskietki i przystępuje do wykonywania poleceń w nim
zawartych. A te między innymi zawierają polecenie: ustaw linię RD4,
przełącz się na pamięć RAM kartridża, wpisz tam dane i ewentualnie
program, który ma wykonać drugi procesor. Potem: przełącz pamięć i
jeszcze ustaw rejestr, przekazując drugiemu procesorowi informację,
że ma przygotowane co trzeba. Procesor Atari robi swoje, jak
potrzeba testuje rejestr a ten jest ustawiony i niesie sobą
informację. Drugi procesor jeszcze pracuje: nie przełączaj pamięci,
bo będzie konflikt (w rzeczywistości Atari odczyta stan rejestru
jako zero, o czym dalej).
Pracujący drugi procesor testując rejestr wykrył że jest on
ustawiony, więc „wskakuje” w obszar pamięci RAM, która tyle co
dostępna była dla procesora Atari, a teraz zawiera co trzeba
przygotowane dla niego i co ważne, jest dla niego dostępna.
Fizycznego przełączenia dokonał procesor Atari, procesor kartridża
posługuje się nią, a jeżeli trzeba, „biega” po jej adresach,
wykonując to i tamto. Pracuje, przetwarza, liczy czy co tam
jeszcze. Korzysta na przykład z procedury, którą przesłał procesor
Atari, lub korzysta z procedur swojej pamięci EPROM, w razie
potrzeby posiłkując się swoją pamięcią operacyjną RAM. W końcu
praca została zakończona. Nie używa już pamięci RAM, by mogła stać
się dostępna dla procesora Atari, zeruje rejestr i wchodzi w pętlę
testującą rejestr, po drodze robi co programista mu nakazał.
Rejestr jest przez niego wyzerowany więc niesie sobą informację:
nie używaj tej pamięci RAM, bo będzie konflikt, czekaj w pętli lub
rób swoje, bo procesor Atari nie podstawił ci nowych danych. Będzie
ustawiony, to zadziałaj.
Procesor Atari oczywiście pracuje wykonując jakieś tam zadania,
jednocześnie raz i drugi testuje rejestr. Rejestr ustawiony.
Ignoruje go (odczyt daje zero), ale oto odczyt daje informację, że
rejestr jest wyzerowany (Atari odczytuje że jest jedynka). Acha,
drugi procesor zrobił swoje. Więc można przełączyć się na
podstawioną pamięć i zrealizować to, co kolega przygotował. Więc
myk i mam co trzeba. Praca, praca..., przetwarzanie, rysowanie,
animowanie, etc. Nie trzeba liczyć jak szybko to idzie, bo
policzone, wymierzone, uporządkowane. Kolejne dane podstawione są
do pamięci i zasygnalizowane to jest ustawieniem rejestru (Atari
wpisuje jedynkę), cykl się powtarza. Jak widać, procesor Atari jest
nadrzędny nad drugim procesorem. To Atari inicjuje synchronizację
sterowaną rejestrem. Sama pamięć RAM stanowi rzeczywistą kość
(układ scalony), która multiplekserem jest albo podłączona w
przestrzeń Atari $8000-$9FFF, albo w przestrzeń $8000-$9FFF
drugiego procesora. A o tym co i kiedy się wykonuje decyduje
program, a raczej programista, który oprogramować musi dwa
procesory.
Opisałem prosty sposób wymiany danych i ich obróbkę. W
rzeczywistości są dwie fizyczne kości pamięci po 8KB, w tym samym
czasie jedna przypisana procesorowi Atari, druga procesorowi
kartridża. Jak trzeba, a zdecyduje o tym procesor Atari, pamięci są
zamienione elektronicznie miejscami (multiplekserem) i fakt ten
zasygnalizowany jest odpowiednim ustawieniem rejestru, który
znajduje się na stronie $D5. Zatem, każdy procesor ma swoje 8KB i w
tym samym czasie robić może co trzeba, a potem pyk i gotowe,
pamięci zamienione miejscami. Stąd szybkość i raz jeszcze szybkość
wynikająca z pracy dwu procesorów, jak trzeba, drugiego taktowanego
np. 10MHz.
Nietrudno zorientować się że nie ma tu żadnej synchronizacji, nie
licząc rejestru, który sygnalizuje jednemu i drugiemu procesorowi
co może zrobić, nie narzucając kiedy ma to zrobić, stąd idea, że
drugi procesor może pracować z dowolną częstotliwością, a i tak
będzie się to zazębiać i jeden drugiego nie zablokuje. Chyba że
ignorować będzie informacje jakie niesie sobą rejestr. A że drugi
procesor może być dowolnym procesorem, stąd procedury do niego
przesyłane przez procesor Atari powinny być dla niego zrozumiałe. O
tym decyduje już programista. By ułatwić sobie zadanie, dobrym
pomysłem jest by drugi procesor też rozumiał polecenia procesora
6502, programista przez to dłużej pożyje i mniej ponarzeka na mnie
za wymyślonego dziwoląga.
Opis
To teraz pora na schemat i opis, ale tylko fragmentu dotyczącego
rejestru, który jest sercem i motorem napędowym całości. A jak ktoś
chce niech nazwie go sobie rejestrem synchronizującym pracę dwu
procesorów. Przedtem krótka wstawka. Dlaczego to coś nazwałem
"Weronika". Otóż gdy realizowałem inne pomysły, nie omieszkałem
pochwalić się jednym z nich w szkole, w której pracowałem. Jedna z
uczennic (gimnazjalistka) zapytała wprost... co to? Odpowiedziałem,
to "Beatka", bo właśnie ten model kartridża był prezentowany.
„Zrobi pan też taki, co nazywać się będzie Weronika? Jak ja?”.
Rozumiecie, jak mogłem odmówić? Nie wypadało. I tak Weronika
przeszła do historii, przynajmniej tej związanej z Atari.
Zanim pojawi się schemat wcześniej pewne uporządkowanie. To
włączone, to wyłączone, ten ustawia, drugi zeruje... mętlik.
Rejestr ma działać według tej samej zasady dla jednego i drugiego
procesora. Tabelka prawdę powie o działaniu rejestru:
Włączone zasilanie, nastąpił reset.
Atari: odczyt =1, pamięci można przełączyć
Drugi procesor: odczyt = 0, czekaj na przełączenie pamięci.
Praca procesorów.
Atari: wpis = 1 (odczyt = 0), przełączone pamięci, czekaj na
odpowiedź drugiego procesora, nie przełączaj ponownie.
Drugi procesor: odczyt = 1, ma przełączoną pamięć, pracuj, nie
odczytuj ponownie rejestru.
Po wykonaniu poleceń wpisz 0, odczyt = 0
Teraz Atari
Odczyt = 0, czekaj, drugi procesor jeszcze nie skończył.
Odczyt = 1, można przełączyć pamięć, wpisać nowe dane, przełączyć
ją i do rejestru wpisać 1, co odczyta jako 0, drugi procesor jako
1.
I jest porządek, obowiązuje ta sama zasada reagowania na odczyt
rejestru. Ze schematu wynika, że Atari może do rejestru wpisać 1
lub 0, co wydaje się nieporozumieniem. Służyć to ma przyszłym innym
(lepszym) sterowaniem całością. Póki co od strony Atari NIE WOLNO
DO REJESTRU WPISYWAĆ ZERA, bo całość się zawiesi. Sekwencja STA
$D500,#bxxxxxxx0 jest zabroniona.
Schemat
Wreszcie schemat. Całościowy, według którego budowałem pierwszy
model. Schemat drugi to sam rejestr i opis jego działania.
Zamieszczam to w formie zdjęć oryginału, byście poczuli epokę i
związany z tym klimat i wkład pracy:
Co do czego i po co. Dekoder 74138 generuje dwa sygnały, wpis i
odczyt rejestru, na podstawie sygnałów R/W i CCTL. Z pinu15
sterowane jest wejście zegarowe przerzutnika 7474. Jego wejście D
sterowane jest bitem D0 szyny danych Atari. Rejestr ma adres $D500
więc POKE 54528,1 ustawi rejestr, natomiast PRINT PEEK(54528) -
dokona jego odczytu. Odczyt dokonuje się poprzez bufor trójstanowy
74367, również na pozycji bitu D0 szyny danych. Proszę zauważyć, że
wpis 1, da odczyt = 0, bo sygnał do odczytu pobierany jest z
wyjścia zanegowanego, pin6 przerzutnika 7474.
Drugi procesor dokonuje odczytu rejestru z pinu5 przerzutnika 7474
poprzez bufor 74367. Jego pin13 połączony jest z bitem D0 szyny
danych.
Drugi procesor wpisuje zero do rejestru, po prostu go resetując.
Sygnał przychodzi z układów dekodujących wybrany adres szyny
adresowej i poprzez diodę D2, zeruje przerzutnik. Atari odczyta to
jako 1, drugi procesor jako 0. Od strony drugiego procesora cała
64kB przestrzeń adresowa sygnałami adresowymi A14, A15 no i
elektroniką, podzielona jest na bloki po 16kB. Każdy blok
przypisany jest do czegoś innego. Jeden z nich do rejestru, to ten
o adresach $4000-$7FFF. Wystarczy zatem zaadresować ten obszar, a
rejestr zostanie wyzerowany, zresetowany. Dlaczego tak. Bo
zyskujemy nieco na szybkości, upraszcza się elektronika, dekoder
adresowy i takie tam. Zamiast:
LDA #00
STA $4000
wystarczy samo STA $4000, z dowolną zawartością akumulatora. Niby
niewiele, ale zawsze szybciej.
Inny obszar $8000-$BFFF przypisany jest przełączanej pamięci, by
było jak w Atari, jeszcze inny pamięci EPROM i pamięci operacyjnej
RAM. Dekoder jest dekoderem niepełnym, stąd „zawijanie” adresów, bo
rejestr potrzebuje jednego adresu, przełączana pamięć to 8KB,
pamięć operacyjna powiedzmy też 8KB, EPROM wystarczy 4kB.
I jeszcze, po włączeniu zasilania przerzutnik 7474 jest resetowany
impulsem generowanym przez opornik 3kohm i kondensator 10uF. No i
wiadomo, że Atari ma podstawioną pamięć, drugi procesor nie. Dioda
D1 pełni rolę separatora. Właściwie zamiast diod D1 i D2 powinna
być bramka AND (uwaga, tu było omyłkowo NAND, tekst zmieniony), ale
nie miałem już na płytce wolnej bramki do wykorzystania, stąd
namiastka jej zbudowana na diodach i oporniku 2kohm podciągniętego
do Vcc.
Na schemacie zauważyć można drugi przerzutnik 7474 który stanowi
integralną część rejestru sprzętowego. Sterowany jest bitem D1
szyny danych Atari. Służy do przełączania multipleksera, tym samym
zamianie przyporządkowania przełączanych pamięci. Opisu nie
zamieszczam, bo tu skupiam uwagę na mechanizmie komunikacji między
procesorami. No to tyle.
I jeszcze Nir Dary prezentuje dalekiego krewnego "Weroniki":
Prototypy
Początkowy projekt zakładał użycie pamięci EEPROM, SRAM, po stronie
drugiego procesora, rejestr sterujący dwubitowy. D0 steruje
rejestrem, D1 przełączaniem pamięci. Na pewnym etapie część
elektroniki wprogramowana była w GAL, zamiast EEPROM pojawiła się
kolejna SRAM, w której Atari mogło umieścić nazwijmy to OS drugiego
procesora. Nastąpiła rozbudowa rejestru o kolejne bity sterujące,
inne przypisanie adresów, możliwość współpracy ze SpartaDOS X i
różne inne różności. Dla mnie to zadziałało, projekt był zakończony
i zamysł okazał się słuszny. Idea rejestru sterującego wykorzystana
została w innych projektach o podobnym zabarwieniu, bo już wtedy
ludziki pytali mnie o jego działanie, a ja odpowiadałem, rysowałem
schematy i opisywałem co i jak ma działać. Na zakończenie, fotki
pierwszego modelu do testów z procesorem 6502, druga fotka to już
model z GAL-em i dołączanym modułem z procesorem, tu 16-to bitowy
brat 6502, taktowany jak pamiętam 8 czy 10MHz. Brak scalaków? Upływ
czasu zrobił swoje, potrzebne były do czegoś innego.
Dziękuję za uwagę. Zenon/DIAL, 25 grudnia 2019 roku.
PS. od Kaza - wszystkie zdjęcia Zenona są też dostępne w
oryginalnych rozmiarach tutaj.
Kaz 2019-12-27 16:43:07
Dzięki Zenon za poetycki opis :D xxl 2019-12-27 18:09:13
a co sie stanie jak sie procesor na karcie zawiesi? czy to z powodu bledu w kodzie usera czy to z powodu przerwania pracy zmiana pamieci? maly_swd 2019-12-27 18:44:55
Wyjąć i włożyć ;) Cyprian 2019-12-27 19:09:57
fajny projekt, tutaj inny opis: www serious-dial atari pl / zzone/ weronika html Konop 2019-12-27 19:44:21
Miło słyszeć, że Zenek odzyskał zdrowie i emanuje energią.
@xxl. W skomercjalizowanej wersji Weroniki wyasygnownay jest bit do kontrolowania resetu CPU. 65816 wymaga pewnych zabiegów zsynchronizowanych czasowo, aby dokonać jego resetu.
Nie pamiętam, czy prototypowa wersja posiadała mechanizm resetu. Zenek będzie wiedział lepiej. Zenon 2019-12-27 20:06:17
Jak się zawiesi, robi się to samo co przy innych zawieszeniach. Najlepiej ponownie całość odpalić, wyłączając i włączając zasilanie. Model nie jest bezwzględnie odporny i doskonały. Awaryjność jak wszystko inne. Zawiesi się stacja, odpalamy ponownie. Jak się user pomyli.... nauka polega na eliminowaniu pomyłek. W czasie przełączenia nie powinno się zawiesić. Procesor musi zapomnieć że można korzystać z przełączanej pamięci, wykonać np skok do swojej pamięci EPROM (operacyjnej) gdy operował na adresach przełączanej i realizując jakąś tam procedurę wydać dopiero polecenie do rejestru. Opisałem model pierwotny, prototyp. W kolejnych stosowany był przycisk RESET, pomagał wybrnąć z kłopotów. Na youtube, etap testów. Jak widać animacja się realizuje a migające LEDy sygnalizują przełączanie. Wchodząc do youtube wpisać poniższe. Veronica 0.3 cartridge running some example programs. IRATA4 2019-12-27 20:15:11
@Zenon Proszę o kontakt mailowy irata.atari(małpa)vp(DOT)pl WAŻNE. Kaz 2019-12-27 21:31:51
Wrzuciłem filmik do nowinki. Creonix 2019-12-27 22:00:14
Piękne te rysunki itd. ale muszę się rozeznać o co chodzi. anon 2019-12-27 22:20:08
We love Zenon/Dial Kaz 2019-12-27 22:32:35
Na prośbę pana Zenona drobna poprawka tekście - AND zamiast NAND. Kaz 2019-12-27 22:38:41
I jeszcze Zenon poprosił o wstawienie filmiku Nira Diarego z prezentacją kuzynostwa Weroniki :)