Podstawowym celem, jaki sobie postawiłem projektując rozszerzenie
1MB do Atari była zgodność z układem SIMM Expansion, które wyznacza
obecnie pewien standard. Zamiast pamięci SIMM chciałem jednak
wykorzystać dwie nowoczesne pamięci statyczne o pojemności 512kB
każda, stworzyć możliwie małą i łatwą w montażu płytkę i uniknąć
dużej liczby przewodów lutowanych do płyty Atari.
Rozszerzenie można zastosować w komputerach wyposażonych w pamięci
dynamiczne 4x64kB i układ Freddie oraz posiadających miejsce na
dodatkową pamięć 64kB. Rozszerzenie może pracować w trzech trybach:
- 1MB, ze wspólnym dostępem CPU i Antica do dodatkowej pamięci
sterowanym bitem PB4 PortB;
- 512kB, w którym dostęp CPU i Anticowi przydziela się na
podstawie stanu bitów PB4 i PB5 PortB;
- trybie, w którym dodatkowa pamięć jest wyłączona.
Aby zainstalować rozszerzenie, należy usunąć zworki w miejscu na
sterownik pamięci rozszerzonej (MMMU), bądź wylutować ten układ (w
130XE) i w to miejsce umieścić goldpiny. Takie same golpiny lutuje
się zamiast pamięci rozszerzonej 130XE. Płytka rozszerzenia posiada
styki pasujące do golpinów tak, że rozszerzenie nasuwa się na płytę
Atari. W trakcie montażu należy pamiętać o tym, aby rozszerzenie
nie było umieszczone zbyt wysoko nad płytą i nie dotykało
klawiatury od spodu po zamknięciu obudowy. Ja poradziłem sobie z
tym w ten sposób, że zeszlifowałem papierem ściernym czarne osłonki
styków golpinów na wysokość 11 mm, a same styki nieco przyciąłem w
miejscach, gdzie zaciskane i lutowane są przewody. Dzięki temu
klawiatura po zamknięciu obudowy nie dotyka dolnej krawędzi płytki
rozszerzenia.
Na płycie Atari należy wykonać kilka zmian, ale nie jest ich dużo:
1. Należy przeciąć ścieżki doprowadzające sygnały PB7 i PB1
do układu U3 typu PAL16L8 (MMU). Układ ten ma 20 nóżek i położony
jest na prawo od płytki rozszerzenia. Sygnały PB7 i PB1 występują
na nóżkach 6 i 18 U3.
2. Nóżkę 6 układu U3 (MAP) należy połączyć z pinem nr 11 w
miejscu MMMU, a nóżkę 18 U3 (BE) z pinem nr 12.
3. Do goldpinów MMMU doprowadzamy jeszcze dodatkowe sygnały:
PB7 do pinu nr 9, PB5 do pinu nr 18, PB1 do pinu nr 7 i PB6 do pinu
nr 8. Do pinów nr 7 i 8 doprowadzony jest sygnał masy, który należy
odciąć.
4. Na płytce drukowanej rozszerzenia należy dodać jedno
dodatkowe połączenie pomiędzy wyprowadzeniem 29 pamięci, a
wyprowadzeniem 13 układu GAL.
Są to wszystkie zmiany, które należy wykonać. U mnie dodatkowe
sygnały do goldpinów MMMU są doprowadzone od spodu płyty.
Tak jak napisałem, zastosowałem dwie statyczne pamięci dynamiczne o
pojemności 8x512kB. Pamięci zlutowane są ze sobą nóżkami z
wyjątkiem wyprowadzenia nr 22. Wyprowadzenie o tym numerze należące
do pamięci umieszczonej "na górze" należy połączyć przewodem z
punktem lutowniczym oznaczonym literką 'X'. Punkt ten znajduje się
blisko złączy goldpinów i łączy się
z wyprowadzeniem nr 14 GAL-a.
Poniżej znajduje się opis działania rozszerzenia i problemów, jakie
napotkałem przy jego uruchomieniu. Starałem się bardzo, aby opis
ten był zrozumiały dla jak największej liczby osób, dlatego podane
informacje są nieco uproszczone. Są one jednak moim zdaniem ważne,
ponieważ dotyczą też pośrednio rozszerzenia SIMM Expansion i
pułapek, na które łatwo można natrafić projektując własne
układy.
W komputerach Atari standardowo wykorzystywane są pamięci
dynamiczne. Do pamięci tych musi być doprowadzona informacja o
adresie odczytywanej lub zapisywanej komórki oraz informacja o
odczytywanych lub zapisywanych danych. Adresu komórki nie podaje
się jednak w formie 16 sygnałów odpowiadających 16-bitowej
magistrali, ale robi się to dwuetapowo przy pomocy pomocniczej
magistrali RA. Magistrala ta zawiera tylko 8 sygnałów. Najpierw
podaje się młodszą
część adresu, którą pamięć zapamiętuje a następnie na magistrali RA
umieszcza się starszą część adresu, po czym podaje się sygnał
rozpoczęcia operacji odczytu lub zapisu.
W Atari zamianą adresu na młodszą i starszą jego część zajmuje się
układ Freddie. Generuje on dwa sygnały: RAS, którego niski stan
informuje o wystawieniu młodszej części adresu na magistrali RA
oraz CAS, który informuje u podaniu starszej części i stanowi
żądanie rozpoczęcia operacji na pamięci.
Jeżeli chcemy zamiast pamięci dynamicznej zastosować pamięc
statyczną mającą 19-bitową magistralę adresową i zechcemy ją
podłączyć korzystając z magistrali RA, musimy zapamiętać w pewnym
rejestrze młodszą część adresu, którą przesyła Freddie w pierwszej
fazie. U mnie funkcję tę pełni układ 74HCT574. Zapamiętana młodsza
część adresu jest wykorzystywana w momencie, gdy Freddie poda
starszą jej część. Operacje na pamięci przeprowadzamy dopiero po
uzystaniu
pełnego adresu i przejściu sygnału CAS w stan niski. Brakujące bity
adresu dla naszej pamięci będą oczywiście bitami PortB. Co prawda
pamięć statyczna nie operuje na sygnałach RAS i CAS, lecz posiada
sygnał CE, który ją uaktywnia, jednak możemy przyjąć, że zasada
działania jest podobna.
Poniższe zrzuty ekranu z oscyloskopu pokazują, w jaki sposób
wygląda sygnał CAS generowany przez Freddiego (dolny przebieg) na
tle sygnału zegarowego O2 (przebieg górny). Opadające zbocza
sygnału zegarowego wyznaczają granice kolejnych operacji odczytu
lub zapisu. Niski stan CAS powoduje wykonanie operacji na pamięci.
Jak widać stan ten "wchodzi" nieco w następny cykl zegarowy (na
czas ok 90 nanosekund). Każdy cykl zegarowy ma długość ok 560
nanosekund.
Mimo przedłużenia sygnału CAS, na standardowym Atari wszystko
działa prawidłowo. Stan magistrali RA nie zmianie się od razu po
rozpoczęciu następnego cyklu odczytu/zapisu, ale trwa jeszcze przez
kilkadziesiąt nanosekund, co jest spowodowane opóźnieniami układu
Freddie. Dzięki temu nie ma niebezpieczeństwa, że pamięć "zobaczy"
młodszą część następnego adresu.
Jeżeli chcemy teraz rozszerzyć w Atari pamięć, to sytuacja się
komplikuje. Jak wiadomo, banki włączane są w obszarze $4000-$7fff,
a zatem w bardzo dużym uproszczeniu rozszerzenie pamięci musi
działać na następującej zasadzie:
- wykryj adres na 16-bitowej magistrali A, w którym A14=1 i
A15=0,
- jeżeli wykryto, to wygeneruj sygnał dostępu do pamięci
rozszerzonej po opadającym zboczu CAS,
- zakończ cykl odczytu/zapisu do dodatkowej pamięci wraz z
opadającym zboczem O2.
Jak widać, cykl zapisu jest skrócony właśnie o te 90 nanosekund.
Robi się tak dlatego, że stan magistrali A zmienia się szybko po
opadającym zboczu O2, ponieważ pochodzi bezpośrednio od
procesora i nie "przechodzi" przez Freddiego i w związku z tym nie
jest opóźniany. Dzięki skróceniu cyklu operacji na pamięci unika
się sytuacji, gdy po opadającym zboczu O2 szybko zmienia się stan
sygnału A14 lub A15 i rozszerzenie błędnie "uaktywnia" pamięć
podstawową na kilkadziesiąt nanosekund.
Cykl dostępu do pamięci jest krótszy, jednak dalej wszystko działa
prawidłowo, pod warunkiem, że w rozszerzeniu stosujemy pojedyncze
bramki. Jeżeli jednak zastosujemy układ GAL i skrócimy cykl
dostępu do pamięci według opisu powyżej, czekają nas
niespodzianki.
Przyznam się, że w pierwszej wersji mojego rozszerzenia też tak
samo zrobiłem, zwłaszcza, że dekompilacja zawartości układu GAL
rozszerzenia SIMM Expansion wykazała, że wykonuje ono to samo. Po
zmontowaniu układ niby działał prawidłowo, ale raz na jakiś czas
pojawiały się złośliwe błędy odczytu, których nie dawało się
przewidzieć i występowały one średnio raz na kilka- kilkanaście
minut ciągłych testów. W odczytywanej komórce pamięci rozszerzonej
jeden z bitów ustawiał się zawsze na 1 i nie odpowiadało to
wartości jaką do niej wcześniej wpisano. Co się
zatem mogło dziać?
Przyczyną tego zachowania jest sposób działania procesora i
opóźnienia generowane przez układy scalone. Po analizie
dokumentacji procesora 6502 okazało się, że odczytuje on dane z
pamięci w opadającym zboczu O2, czyli dokładnie w momencie, gdy
kończymy cykl dostępu do pamięci! Jeżeli zastosujemy pojedyncze
bramki, wszystko jest w porządku, gdyż każda z nich daje
przynajmniej kilkanaście nanosekund opóźnienia i w rzeczywistości
cykl dostępu zakończy się o te kilkanaście nanosekund później.
Jednak układ GAL daje niewielkie opóźnienia, według dokumentacji
tylko
około 5 nanosekund. Niestety może się zdarzyć i zdarza się często,
że pamięć jest już nieaktywna w momencie, gdy procesor odczytuje
dane, skutkiem czego kilka bitów ulega przekłamaniu. Ustawiane są
one na 1 dlatego, że w Atari znajdują się rezystory podciągające
magistralę danych do +5V.
Widać zatem, że stosując szybkie układu logiczne nie możemy kończyć
cyklu odczytu natychmiast po opadającym zboczu O2. Można byłoby
wprawdzie opóźnić nieco impuls dostępu do pamięci korzystając z
rezystora i kondensatora, ja jednak zdecydowałem się na inne
rozwiązanie.
Gdy wykonujemy zapis do pamięci, sygnał dostępu do pamięci musimy
zakończyć po opadającym zboczu O2. W przeciwnym wypadku stan A14 i
A15 wkrótce zmieni się i stan magistrali danych może "niechcący"
zapisać się do innej komórki. Sygnał dostępu do pamięci podczas
operacji zapisu będzie wyglądał zatem tak:
Jeżeli natomiast wykonujemy odczyt, sygnał dostępu możemy bezkarnie
przedłużyć, do pełnej długości impulsu CAS generowanego przez
Freddiego, nawet jeżeli stan A14 i A15 ma się niedługo zmienić.
Jeżeli doprowadzi to do zmiany stanu na magistrali danych, to nic
nie szkodzi, jest to odczyt, a więc procesor przeczyta dane z
magistrali danych w momencie, gdy dane te dotyczą jeszcze
prawidłowej komórki (nie wystawiono jeszcze nowego adresu i nie
zmienił się stan A14 i A15). Sygnał dostępu do pamięci podczas
operacji odczytu będzie wyglądał zatem tak:
Opisane zjawiska nie występowałyby prawdopodobnie przy stosowaniu
wolniejszych pamięci, gdyż także i one dają opóźnienia. Tymczasem
czas dostępu do pamięci statycznej, którą ja użyłem wynosi tylko 55
nanosekund, podczas gdy standardowej pamięci dynamicznej Atari aż
150 nanosekund.
Po zmontowaniu układu okazało się, że warto dodać jeszcze
kondensator o niewielkiej pojemności łączący sygnał PB4 z masą.
Zapobiega to przypadkowemu zatrzaskiwaniu przerzutników D,
które
zapamiętują stan Basic-a i SELF-Testu. Zastosowałem kondensator o
pojemności 100pF, ale moim zdaniem warto spróbować na początku z
pojemnością mniejszą, aby nie obciążać zbytnio wyprowadzenia PB4 w
momencie przełączania.
Po wprowadzeniu opisanych poprawek układ zaczął działać bardzo
dobrze. Do testowania użyłem specjalnego programu PROG2.OBX, który
w sposób ciągły testuje pamięć i po kilkugodzinnych ciągłych
testach błąd odczytu pamięci rozszerzonej nie wystąpił mi ani razu.
Dla uproszczenia program nie wykrywa rozmiaru pamięci rozszerzonej,
jedynie testuje rozszerzenie 1MB. Program udostępniam wszystkim
zainteresowanych, główna jego część to przerobiona procedura
testująca ze znanego programu "Extended RAM Test 0.21.0". Jestem
bardzo ciekawy jak program ten będzie działał na komputerach
wyposażonych w rozszerzenie SIMM Expansion. Czy ktoś mógłby to
sprawdzić? Niebieski kolor ekranu oznacza, że wszystko jest w
porządku, zmiana koloru i napis
w dolnym wierszu oznacza, że wykryto błąd odczytu. Rozszerzone
Atari testowałem również innymi programami np. "Numen", "Getris",
"Commando", "Bomb Jack". Wszystkie działały bez zarzutu.
W rozszerzeniu pamięci nie zastosowałem rezystorów podciągających
wyprowadzenia PB4, PB5, PB6 do +5V, ponieważ w wielu
rozszerzeniach, których schematy oglądałem ich nie ma. Skutkiem
tego jest to, że po przestawieniu PortB w tryb odczytu stan tych
wyprowadzeń jest nieokreślony. Jeżeli ktoś chce, aby w takiej
sytuacji automatycznie wybierał się bank podstawowy (wszystkie bity
w stanie 1), to należy brakujące rezystory dolutować.
Dla zainteresowanych rozszerzeniem mogę udostępnić kilka gotowych
płytek drukowanych wykonanych w profesjonalnym zakładzie oraz
zaprogramować układ GAL. Pliki JED, PLG, a także rysunki płytki i
program PROG2.OBX
tutaj.
=====
Uzupełnienie z tego samego dnia: dodałem zdjęcia podesłane przez
Adama, dostępne są one także w większej rozdzielczości
tutaj.