Dzisiaj mamy kolejną niespodziankę, powrót kolegi Zenona na nasze
łamy! Po poważnych problemach zdrowotnych pan Zenon wrócił do sił,
a także do atarowskiej pasji, i jak zwykle wnosi do społeczności
swoją wiedzę i zapał. Tym razem wziął udział w rozgryzaniu tematu
cartridge'a o nieco dziwnej nazwie "Weekend 3+", którego historię
można było śledzić w
tym wątku na naszym forum. Jest też prośba o pomoc z
oprogramowaniem karta. Ale oddajmy głos Zenonowi:
CARTRIDGE "WEEKEND 3+"
To prawdziwy rarytas, a ile sztuk pałęta się po różnych szufladach
to nie wie nikt. Ile wyprodukowanych modeli było sprzedanych i za
ile, wie zapewne jeszcze mniej ludzików. I takie coś wpadło mi w
ręce. A zaczęło się tak: pojawił się email, a w nim prośba o
uruchomienie RAM-CART-a o nieznanym pochodzeniu i działaniu.
Oprogramowania niet.
Cóż prostszego, wystarczy ustawić rejestr sprzętowy, by urządzenie
wybrało jakiś bank i jakoś tam się uaktywniło. Ze zdjęć, które
dostałem, wynika że używany jest tylko sygnał RD5, co nieuchronnie
sprowadza kłopoty, bo nie można posłużyć się BASIC-iem by jakoś
ożyło, a o procedurach maszynowych należy w ogóle zapomnieć. No to
przelutować trzeba dwa kabelki (ścieżki), by zamiast RD5 używać
RD4, i wtedy będzie łatwiej, bo BASIC da sobie radę. Jedno, drugie,
trzecie polecenie... i nic. Wyglądają na poprawne:
POKE 54528, X ;X dana jako wybór banku i uaktywnienie RD4
POKE 32768,Y ;Y coś się powinno wpisać
(X,Y nie mylić z rejestrami indeksowymi procesora, to dane z
zakresu 0-255)
Tak jeszcze parę razy w przód i tył, ale wciąż zero reakcji, ekran
nie chce się kaszanić, a powinien. Bo przełączenie banku skutkować
powinno utratą DL, które to znajduje się na samej górze wybranego
banku w przestrzeni $8000-$9FFF. A pamięć RAM-CARTa tego nie
zawiera bo i skąd. P O R A Ż K A.
Co to za kart, uszkodzony? Oznaczenia scalaków pościerane, a z
rozkładu ścieżek na fotografii niewiele wynika. Inna sprawa że nie
przyglądałem się dokładnie. Kart to kart, rejestr sprzętowy
powinien dać się ustawić, a stawia opór. Decyzja była jedna.
Właściciel karta, znaczy się Przemek Galanciak, wysyła go do mnie.
Kurier spisał się na medal, a w między czasie dowiedziałem się że
Przemek to gość, który montował RAM-CART-y 64kB i 128kB w firmie UM
w Łodzi. Ło panie... Spodziewałbym się śniegu w grudniu, ale nie
takiej znajomości! Mam w zbiorach jeden i drugi model, a tu sobie
gadam przez telefon i wymieniam pisemka przez net z kimś, kogo
dusza siedzi na płytkach moich RAM-CARTów.


I oto moduł jest u mnie. Mam go w ręku, czuć historię i ten
ciężar... obudowa, scalaki, pamięć, ścieżki polutowane techniką
kosmiczną, jee... to żyje! Czuć upływ czasu i kawał historii, a ja
mam to w ręku. Pewno ktoś pomyśli: zboczeniec, jako żyw. I wiele
się nie pomyli. Proszę tylko spojrzeć na cały moduł. Czy coś
ciekawego widać? No... no... patrzymy, patrzymy... widać. Nie? To
podpowiem. Ta śrubka mocująca. Prawdziwy skarb. Lekko zardzewiała.
To prawdziwa poezja. Warta więcej niż cały moduł. W niej zawarta
historia i klimat tamtych lat, które były i się oddaliły. A
lutowanie... kto tak dziś potrafi? Na płytce wyryte "1991". Kiedy
to było?
I był RAM-CART? Ale jaki? Co zaszyte w środku, że nie chce się
poddać wydawanym poleceniom. Omomierz do ręki i rozpracowywanie
połączeń. Do rejestru sprzętowego łatwo trafić po liniach
adresowych. O! Co za diabeł, rejestr sprzętowy - wypisz, wymaluj -
to dwa liczniki dwójkowe 7493. No tak, już na tym etapie wyjaśniło
się, dlaczego moduł stawia opór. Wydawane polecenia nijak nie mają
się do sposobu ustawiania tego rejestru.
Ale, ale... Dwa liczniki? Toż to podobne do innego modułu, który
posiadam. Nazywa się "GAME SPORT". Jakieś 21 lat wstecz otrzymałem
schemat karta do gier wykonanego na pamięci EPROM o pojemności
64kB. Wypisz, wymaluj, rozszyfrowywanie RAM-CARTa prowadzi do
wniosku, że to tożsame modele. Tyle tylko, że RAM-CART ma bateryjkę
i wyposażony jest w przełącznik i opcję zapisu pamięci. Ostatecznie
schemat prawdę powie. I faktycznie, są tożsame, z dokładnością do
połączeń między bramkami i numeracją. RAM-CART to 32kB, więc nie
używa sygnału QD z wyjścia licznika MSB rejestru. Ot i tyle.
Pytanie jest takie. Co było pierwsze, "GAME SPORT", a potem
"RAM-CART WEEKEND 3+", czy odwrotnie? I kto wpadł na pomysł
zbudowania takowego RAM-CARTa. Ile było modeli? Gier pewno więcej.
Niestety nie mam wglądu do płytki modułu "GAME SPORT", ale sądzę że
to ta sama. Na jej bazie budowane były moduły z pamięcią EPROM lub
SRAM.
I jeszcze jedno zagadnienie - oprogramowanie do ożywienia modułu
WEEKEND 3+. Ja nie mam, Przemek też nie. Może na tym świecie jest
życzliwa dusza, która ma, lub stworzy takowe. Na razie marzenie.
Ale jak znam Atarowców, najpierw ponarzekają na co i po co to, a
potem ktoś przysiądzie tyłka i napisze. W załączeniu fotki tego
czegoś, co jest jak sądzę, prawdziwym skarbem. Voy! Pewno przydałby
się taki model w kolekcji? Wnioskuję po tym, że nie pozwoliłeś
wyrzucić do kosza.
No i oczywiście schemat, a właściwie trzy. Jeden to rozpiska
elementów na płytce i schemat tworzony w czasie rozpracowywania
modułu, a potem już na tej podstawie coś bardziej czytelnego.
Zdecydowałem się zamieścić to w takiej formie, by było czuć klimat
tamtych lat, więc proszę nie marudzić. Tak to ma być.



Co wynika ze schematu. Rejestr sprzętowy sterowany szeregowo to dwa
liczniki 7493. Aby zmienić jego stan i wybrać inny bank należy
wygenerować wymaganą liczbę impulsów na jego wejściu zegarowym. A
wejście to sterowane jest sygnałami CCTL i R/W. Dodatkowo
zezwolenie na zliczanie impulsów uzależnione jest od stanu
przerzutnika r-s zbudowanego na bramkach NOR. Przerzutnik ten
odpowiednio ustawia wejścia zerujące liczników 7493, pozwalając na
zliczanie lub zablokowanie zliczania, gdy dokonywany jest odczyt
danych z wybranego banku. Bank ma pojemność 256 bajtów, a banków
może być 128, co daje pojemność 32kB całego modułu. Sterowanie
wejściami CS, OE i WE pamięci SRAM standardowe, podtrzymanie
bateryjką zrobione tak, jak widać. Ale uwaga! Pamięć zasilana jest
TYLKO bateryjką, nie ma połączenia z Vcc (+5V) Atarynki! Na
schemacie nie zaznaczyłem zasilania układów scalonych i GND
doprowadzonego do pamięci. To fakt oczywisty. Dodatkowo,
przełącznik dwupozycyjny pozwala odpowiednio ustawić linię RD5
niezależnie od ustawienia przerzutnika r-s. Wybrany bank
256-bajtowy lokuje się w początkowe adresy $A000-$BFFF, czyli tam
gdzie normalnie "siedzi" BASIC. W momencie włączenia zasilania
Atarynki generowany jest impuls, który odpowiednio ustawia
przerzutnik r-s oraz, w zależności od ustawienia przełącznika,
pozwala wykonać BOOT systemu i modułu do zapisu lub odczytu. To
tyle. Jak coś pokręciłem to poprawić, uzupełnić, dodać.
Zenon/DIAL, 14 grudnia 2019 roku.
=====
Uzupełnienie / sprostowanie od Zenona dodane tu 4 stycznia 2020
roku:
Powyższy opis zakończyłem apelem: "jak coś pokręciłem to...". W
istocie, pokręciłem, bo moduł nie działa tak jak opisałem. Jedyne
usprawiedliwienie tego to euforia wywołana czymś nowym i pobieżne
spojrzenie na schemat, co za tym idzie błędna analiza. Dziś jest 31
grudnia 2019 roku i jeszcze chce mi się opisać poprawkę.
Zatem, jak to działa? Po pierwsze, opis przełącznika na schemacie
powinien być w takiej kolejności: ODCZYT/PROGRAMOWANIE. Należy
zaznaczyć że w obydwu położeniach przełącznika można dokonać zapisu
i odczytu zawartości pamięci, ale tylko ustawiony jako ODCZYT,
wykona się BOOT. Po drugie, na schemacie brak numeracji wejścia
bramki E, sygnał F/2 dochodzi do pinu 5. Moduł zaprogramowany,
przełącznik w pozycji ODCZYT, włączone zasilanie. R2, C1 generuje
impuls ujemny, przerzutnik r-s, (bramki NOR) ustawia się w ten
sposób że pin 12 bramki E =1. Wymusza to ustawienie sygnału RD5=1,
co system traktuje jako "przełącz przestrzeń adresową $A000-$BFFF
na pamięć modułu". Jednocześnie wygenerowany impuls zeruje liczniki
7493, które są swego rodzaju rejestrem sprzętowym, dzielącym pamięć
modułu na banki. Banków jest 128, bo rejestr steruje adresami
A8-A14 pamięci. Młodsze bity adresowe A0-A7, to część szyny
adresowej Atari. Stąd pojemność banku to 256 bajtów. Przy takim
ustawieniu modułu wybrany jest bank 0 i podstawiony jest pod
$A000-$BFFF, w górne adresy. Wymusza to umieszczenie nagłówka dla
kartridża w górnych adresach banku 0, by ostatecznie „widziany” był
przez system gdzie trzeba.
Z podstawionego banku następuje start programu. Co na pewno MUSI
zrobić? Uruchomić umieszczoną tu procedurę, która albo samą siebie
przepisze w pamięć RAM Atari, dodatkowo przepisze jakieś inne dane
tu umieszczone. Dlaczego MUSI to zrobić? Bo zaadresowanie innego
banku, na przykład przez STA $D500 spowoduje, że przerzutnik r-s
zablokuje bramkę E (pin 12 =0) i po zabawie. RD5=0 i znika dostęp
do pamięci modułu. Ostatecznie jednak bank kiedyś musi być
przełączony na inny. Dzieje się to dopiero w momencie gdy zawartość
banku 0 zostanie przepisana do RAM Atari, i do niej „wskoczy”
procesor. Realizując ją, można wybrać inny bank, ale i tak RD5
stanie się =0, bo aby dokonać przełączenia banku należy dokonać
operacji - ZAPISZ coś pod dowolny adres strony $D5. Wtedy
wygenerowany impuls na wejściu zegarowym C licznika zmieni jego
stan na n+1, jednocześnie przełączy przerzutnik r-s, o czym wyżej
już było. Choć RD5=0, to nie traci się dostępu do pamięci modułu,
bo od teraz banki dostępne są na stronie $D5. Można odczytywać
zawartość kolejnego. Wybór banku następuje po operacji ZAPIS
czegokolwiek do wybranego banku. A to nieuchronnie prowadzi do
zatracenia zawartości komórki pamięci modułu, bo wpisze się tam
jakaś dowolna dana jaką na przykład zawiera akumulator.
NIEDOPUSZCZALNE. Zawartość pamięci MUSI być zachowana. Aby tak było
przełączenie realizuje się tak:
LDA $D500
STA $D500
(adresy dobrane tylko do wytłumaczenia zasady działania, w
rzeczywistości będą to adresy strony $D5 aktualnie potrzebne).
Z danego, wybranego banku można odczytać dowolną komórkę pamięci, z
kolejnego po jego zaadresowaniu. Proces opisany wyżej. Zapamiętać:
a) odczyt komórki banku nie zmienia wyboru banku na kolejny, b)
zapis komórki banku jednocześnie wybiera bank n+1.
Teraz proces programowania, zapisania czegoś do pamięci modułu.
Przełącznik w pozycji PROGRAMOWANIE. Następuje podobna sekwencja
działania jak przy odczycie, tyle że RD5=0 i od razu również bank 0
podstawiony jest na stronę $D5. Przykład wytłumaczy wszystko.
Zakładam, że są cztery banki i każdy ma pojemność czterech
bajtów.Pamięć należy zapisać liczbami w kolejności:
Bank0: 1, 2, 3, 4
Bank1: 5, 6, 7, 8
Bank2: 9, 10, 11, 12
Bank3: 13, 14, 15, 16
Po włączeniu zasilania podstawiony jest bank 0, i zapis powoduje
przełączenie banku na bank n+1. Wykonać należy taką sekwencję:
LDA #1
STA $D500 ;tu nastąpi też przełączenie na następny bank
LDA #5
STA $D500 ;jak wyżej
LDA #9
STA $D500 ;jak wyżej
LDA #13
STA $D500 ;jak wyżej
W każdym banku w pierwszym bajcie wpisana jest liczba przynależna
do niego. Licznik uległ przepełnieniu i znów adresuje bank 0.
Drugie liczby 2, 6, 10, 14 wpisujemy podobnie tylko jako adres
docelowy należy podać $D501, potem 3, 7, 11, 15 pod $D502 i 4, 8,
12, 16 pod $D503. Pamięć zapisana i znów podstawiony jest bank 0,
bo przepełnił się licznik. Można sprawdzić czy wpisało się co
trzeba (polecenia podam w BASICU bo łatwiej):
FOR X=0 TO 3
PRINT PEEK(54528+X)
NEXT X
i powinny „wyskoczyć” liczby 1, 2, 3, 4. Przełączenie na następny
bank:
A=PEEK(54528)
POKE 54528,A
i podobnie jak wyżej tylko adres 54529+X. I tak dalej.
Ale wymyślone! Wynika z tego, że moduł WEEKEND 3+ raczej miał
zastosowanie do wczytania jakiegoś pliku gry, pod nadzorem
odpowiedniego oprogramowania, i potem odpalenia jej z kartridża. Bo
inne zastosowania, jak na przykład normalny RAM- CART firmy UM lub
moje RAM-CARTy, są utrudnione przez sposób wyboru banku. Oczywiście
jest to możliwe, tylko czy wtedy było odpowiednie oprogramowanie?
To tyle. I przepraszam za zamieszczenie pierwotnego, w części
błędnego, opisu działania modułu.
Zenon/DIAL, 31 grudnia 2019 roku.
=====
I jeszcze jedno uzupełnienie od Zenona, z dnia 20 stycznia 2020
roku:
Kolejny postęp w pracach nad modułem WEEKEND 3+. Tu model w wersji
512kB. Jak działa? Pamięć 512kB, dodany trzeci licznik 7493 (F),
połączony w szereg z dwoma już istniejącymi (C, A). Dodane zworki
pozwalające skonfigurować moduł jako 4, 8, 16, 32, 64, 128, 256 lub
512 kB. Dodana dwukolorowa dioda LED aby się coś świeciło,
sygnalizująca położenie przełącznika. Zielona - ZAPIS, Czerwona -
ODCZYT/ BOOT. Zworki łączą odnośny pin adresowy pamięci (A12-A18)
albo z Vcc ( logiczna jedynka) albo z wyjściem liczników (A, F),
jak na schemacie. Reszta połączeń bez zmian. Pozwala to ustalić
pojemność modułu, bo jak plik do wprogramowania ma wielkość np.
3kB, to po co programować niepotrzebnie pozostałe 509kB byle czym.
Bez sensu. A tak być musi by zachować przeplot programowanych
bajtów.
Seban zapewne dołoży opcję wyboru modułu do programu, który już
został na żywym module przetestowany i działa. Właśnie odpaliłem
plik LESTRADE.COM z modułu. Zrobił to wcześniej Galtron (jakieś gry
odpalił) i jako pierwszy pochwalił się że zaskoczyło. W Y S T A R T
O W A Ł O P O P R A W N I E! Seban, jesteś wielki.
Choć mam też już swój program BASIC-owy, ładujący dane do
modułu, to Twój bije go na głowę szybkością działania i
programowania. Nim oko spocznie na tym co niżej, słówko: Seban,
szacunek i uchylam kapelusza. Ciekaw jestem wielkości dziury w
brzuchu, jaką do teraz wywiercił Ci Galtron. Ja powiercę dalej.
Moduł można skonfigurować jak wyżej opisałem, więc prośba, dodaj
opcję wyboru modułu. Teraz, gdy rdzeń już działa, powiększenie
(skrócenie) bufora i programowanie według tej samej zasady z
przeplotem bajtów to pestka i kosmetyka. Dla mniej zorientowanych.
Moduł 512kB ma 2048 banków po 256 bajtów każdy. Gdyby były tylko
dwa banki, przeplot wynosiłby dwa, dla 2048 banków wynosi
tyleż.
Schemat zmian rozszerzających pamięć modułu i fotka modułu w wersji
512kB poniżej. Wygląda to tak, jest model oryginalny i dwa w wersji
512kB. Kto je ma?