Super, extra, cacy cartridge
A to zapowiedź tego co będzie w magazynie SERIOUS #14. Byłoby już w tym ale... dom, dom, dom...
Cały czas męczy mnie i "nawiedza" myśl o tym by wymyślać kartridże. No więc tu opis
kolejnego. Jest to model typu kartridż/programator EEPROM 8kB. Jeżeli nie interesuje Cię programowanie EEPROM to uważaj
ten model za całkiem niezwykły kartridż do różnorakiego zastosowania. Zaletą jest to że:
- możesz zaprogramować go dowolnym plikiem danych
- możesz go uruchomić jako boot
- jego pamięć to dwie pamięci po 8kB które możesz dowolnie używać
- jest lokalny reset
- dostęp do całej przestrzeni adresowej 16kB zawsze pod adresami $8000$9FFF lub $A000-$BFFF. Jak to możliwe by w przestrzeni 8kB mieć dostęp do 16kB? Poczytaj. - lub dostęp jako jeden blok 16kB
- są przełączniki pozwalające automatycznie podmienić pamięć karta
- można też robić to programowo
- rejestr sprzętowy pozwala dobrać się do wszystkich możliwości karta
- rejestr sprzętowy jest do zapisu i do odczytu
- crejestr sprzętowy dostępny jest TYLKO pod adresem $D5FF (54783) nie powoduje konfliktu z innymi "dopałami" używającymi adresów ze strony $D5 (no, nie całkiem), ale to nie wina opisanego tu karta!
- sygnalizacja diodami LED konfiguracji pamięci karta, dla "wzrokowców"
- dzięki zastosowaniu pamięci EEPROM nie potrzeba bateryjki podtrzymującej zawartość karta
- dostęp do CAŁEJ pamięci 16kB z poziomu Bascia, DOSa lub innego programu narzędziowego który sobie napiszesz lub użyjesz istniejącego np tego który napisał Qcyk do obsługi programatora EEPROM (patrz poprzednie numery SERIOUS'a)
Wady:
- mała pojemność pamięci (16kB)
- mam to tylko ja! Ale możesz mieć i Ty gdy zrobisz dokładnie co opisano niżej
- moduł nie posiada programowanej możliwości uaktywnienia lub blokady dostępu do pamięci. Celowo zbudowane jest to tylko na przełączniku, bo uznałem za bardziej praktyczne (czy to wada?). Patrz też bit D6 rejestru sprzętowego $D5FF
- dziwne działanie lokalnego przycisku reset
Kart nazwałem BEATKA.
OPIS WYKONANIA
Spis części elektronicznych:
- AT28C64 - 2szt EEPROM 8kB
- 74LS00 - 2szt
- 74LS30 - 1szt
- 74LS138 - 1szt
- 74LS175 - 1szt
- 74LS244 - 1szt
- 47uF - 1szt elektrolit
- 10uF - 1szt elektrolit
- 100nF - 1szt
- 4k7 - 1szt
- 560ohm - 3szt
- LED - 3szt czerwona, zielona, żółta
- Przełączniki dwupozycyjne stabilne - 3szt
- Przycisk - 1szt lokalny reset
- Płytka uniwersalna,obudowa kartridża Kynar, cyna, podstawki pod US'y
Wszystko polutować, załączyć i zaprogramować! :)
Jak to działa?
Rejestr sprzętowy dostępny jest tylko pod adresem $D5FF (54783). Używa bitów D0, D1, D6, D7.
D0 = 0 = 1 | niezależnie od położenia przełącznika P1 wyłączona pamięć karta $8000 włączona pamięć karta $8000 świeci zielona dioda LED1 |
D1 = 0 = 1 | niezależnie od położenia przełącznika P2 wyłączona pamięć karta $A000 włączona pamięć karta $A000 świeci czerwona dioda LED |
D6 = 0 = 1 | włączona opcja programowanie/odczyt danych karta włączona opcja odczyt danych karta. Blokada wpisu. Programowanie niemożliwe. Świeci żółta dioda LED |
D7 = 0 = 1 | dostępna pamięć karta, normal zamienione miejscami połówki pamięci karta |
Bity D0, D1, D7 do zapisu i odczytu. Bit D6 tylko odczyt.
P1 = 1/2 konfiguracja pamięci $8000 (patrz działanie bitu D0 $D5FF)
P2 = 1/2 konfiguracja pamięci $A000 (patrz działanie bitu D1 $D5FF)
P3 = Z programowanie EEPROM
P3 = B blokada/protect
Do dzieła...
P1 - 1 P2 - 1 P3 - Z
Kart przygotowany do programowania. Jednak jego pamięć nie. Jest odłączona P1-1, P2-1 więc w momencie włączenia
komputera system uaktywnił pamięć RAM.
lda #1
sta $d5ff POKE 54783,1
spowoduje odłączenie pamięci RAM i uaktywnienie pamięci 8kB EEPROM w obszarze $8000-$9FFF. Niestety na ekran "wskoczy"
kaszana, to efekt braku DL które zostało w odłączonej pamięci RAM. RESET w Atari przywróci co trzeba. DL ulokuje się
poniżej pamięci EEPROM. Basicowe PRINT FRE(0) poinformuje że pamięci RAM jest mniej o 8kB. Programowanie z poziomu
Basica np.tak:
POKE 32768,10 (jedna komórka)
Jeżeli chcesz sięgnąć do drugiej połówki EEPROM to wpisz do rejestru $D5FF wartość $81 (129), (bit7=1). Teraz POKE
32768,20 zaprogramuje komórkę w drugiej połówce. Odczyt to oczywiście ? PEEK (32768), lub z poprzedniej połówki:
POKE 54783,1 przełączamy, było 129
? PEEK(32768) odczyt
Gdy w momencie włączenia komputera przełącznik P1 będzie w pozycji 2, to system od razu przełączy pamięć RAM na EEPROM
karta i odpowiednio umieści DL. Pamiętaj! Gdy na ekran wyskoczy coś w rodzaju pasków, kresek, lub różnych dziwacznych
wzorków, to znak że coś nie tak z Display List (DL). Pomaga RESET w Atari (czasami poprzedzony resetem lokalnym w module
carta).
Jak dobrać się do przestrzeni adresowej $A000-BFFF carta?
Odpowiem prosto i elegancko. NIE MOŻNA!!!
Więc po co taki cart?
Już wyjaśniam. Gdy podmieniony jest obszar pamięci $A000... to system zakłada (a robi to procedura reset) że należy
wykonać boot kartridża. Boot się wykona jeżeli:
- w pamięci karta będzie program
- oraz nagłówek który spowoduje eleganckie uruchomienie tegoż programu
Na razie nic z tych rzeczy nie ma, więc gdy przełącznik P2 jest w pozycji 2, i uruchomiony zostanie komputer, to system
wywoła SELF-TEST lub co pewniejsze, zawiesi się! Ten sam efekt wystąpi gdy w czasie uruchomienia komputera przełącznik
P2 będzie w pozycji 1, a w rejestrze $D5FF ustawiony zostanie bit D1, np.
lda #2
sta $dfff POKE 54783,2
Dlatego wymyśliłem sobie, by bit D7 dokonywał zamiany połówek pamięci. Wtedy to co normalnie jest pod adresem $A000...
znajdzie się pod adresem $8000... Proste, prawda? I odwrotnie :)
Teraz czytaj uważnie. Adresujesz 8kB a masz dostęp do 16kB Dzieje się to tak.
Uaktywniona jest przestrzeń adresowa $8000... czyli jest dostęp do 8kB pamięci EEPROM. Gdy osiągniesz ostatni adres tej
przestrzeni, włącz bit D7 rejestru $D5FF. Wtedy znów pod adresami $8000... masz kolejne 8kB pamięci EEPROM.
Programujesz, odczytujesz etc... Robić to można z poziomu Basica, DOS'a lub pod nadzorem jakiegoś programu. Pisałem
wyżej, że nie ma dostępu bezpośredniego do przestrzeni adresowej $A000... Prawda to i nieprawda. Bo... Możesz zrobić
tak. Napisać jakąś dowolną procedurę. Ułożyć nagłówek dzięki któremu kart zostanie zbootowany, ale ta procedura wywoła
DOS'a lub "skoczy" do systemu. Wtedy MMU zrobi swoje, a dostęp do w/w przestrzeni będzie możliwy, oczywiście nie z
poziomu BASIC'a bo jest odłączony. Trudne? Ale możliwe. Teraz jeszcze rzut oka na schemat ideowy. Zastosowana jest pewna
nowość, powiedzmy sztuczka. Zobacz jak rozwiązane jest ustawianie linii RD4 i RD5, oraz wpis danej do rejestru $D5FF.
Gdy P1 jest w pozycji 1, to RD4=0, ale tylko wtedy gdy bit D0=0 (w $D5FF) Wpis 1 na pozycję bitu D0 uaktywni linię RD4.
Tak więc wpis 0 do rejestru wyłącza pamięć karta, a wpis 1 uaktywnia ją. Jeżeli P1 jest w pozycji 2, to w momencie
włączenia zasilania RD4=1 bo ta sterowana jest zanegowanym sygnałem Q0. Ale jednocześnie drugie styki przełącznika P1
powodują że do wejścia D rejestru doprowadzony jest zanegowany sygnał D0. Tak więc wpis 0 do rejestru $D5FF spowoduje w
rzeczywistości wpisanie 1. Na zanegowanym wyjściu pojawi się 0 i linia RD4 staje się nieaktywna. Dzięki zastosowaniu
negującej bramki na wejściu rejestru niezależnie od położenia przełącznika P1 wpis 0 do rejestru odłącza sygnał RD4 a
wpis 1 uaktywnia go. To ważne, bo poprzednie karty budowane przezemnie nie miały tego usprawnienia. Np. RAM-CART czy DRC
zachowywał się inaczej. Raz wpis 0 wyłączał innym razem włączał sygnał uaktywnienia pamięci. Tak rozwiązany był też
sposób sterowania RAM-CARTów rozprowadzanych przez AVALON. Tu jest inaczej, logicznie. 0 wyłącza, 1 włącza. Niezależnie,
jak ustawiony jest przełącznik wpis D0=0 wyłączy a D0=1 włączy pamięć EEPROM w obszar $8000... I... niezależnie co
wpisano na pozycji bitu D0 rejestru $D5FF przełączenie P1 włącza lub wyłącza pamięć EEPROM jak wyżej. ZAWSZE, świecenie
zielonej diody LED sygnalizuje aktywną pamięć EEPROM w obszarze $8000...
Powyższe uwagi odnoszą się też do sterowania sygnałem RD5. Różnica jest ta, że używa się bitu D1, przełącznika P2, a
sygnalizacja to dioda LED czerwona. Pamięć przełącza się w obszarze $A000.
Jeżeli ktoś nie rozumie o co chodzi, proponuję zbudowanie tego karta i praktyczne wypróbowanie sposobu sterowania jego
rejestrem sprzętowym.
Kilka przykładów użytkowania.
P1=1 P2=1 P3=Z
Pamięć modułu niedostępna
Wpisz 1 do rejestru $D5FF oraz naciśnij RESET w Atari. Pamięć $8000-$9FFF modułu dostępna.
Wpisz 129 do rejestru $D5FF. Dostępna druga połówka pamięci modułu nadal pod adresami $8000-$9FFF.
Wyłącz komputer i ustaw: P1=2 P2=2 P3=Z.
Pamięć modułu dostępna pod adresami $8000-$BFFF ale nie zawsze to działa, bo system próbuje wykonać boot carta.
Wpisz 0 do rejestru $D5FF. Pamięć modułu odłączona
Wpisz 129 do rejestru $D5FF. Dostępna druga połówka pamięci modułu pod adresami $8000-$9FFF.
Gdy ją zaprogramujesz i wpiszesz do rejestru $D5FF wartość 1, to dane od tej chwili znajdą się pod adresami $A000... ale
są niedostępne, czyba że zaprogramowałeś pamięć mądrą procedurą która działa i nagłówek jest prawidłowo skonstruowany.
Więc możesz ustawić P2=2 i nacisnąć RESET w Atari a moduł zostanie zbootowany i wszystko będzie OK. :)
Dziwaczne to?
Ach! Piękne!
Kart marzenie. Trochę mała pamięć, ale co tam. Wersja następna będzie większa. Oczywiście, jak pisałem wyżej jest to
kart/programator EEPROM, więc można nim programować EEPROM'ki by używać ich w innym sprzęcie. Np. jako dane do systemu
TURBO dla stacji dysków. Jedno ale... Pamięć jest typu EEPROM więc wymaga by pomiędzy kolejnymi cyklami programującymi
dane upłynęło co najmniej 10ms. Basic jest do tego EXTRA bo jest wolny. Programując w maszynówce zadbać należy o
opóźnienie między cyklami jak niżej:
lda #... pierwsza dana
sta $8000 programowanie
... pusta pętla 10ms
lda #... druga dana
sta $8001 programowanie
... pusta pętla 10ms
itd, itp...
...
...
Przypomnienie!
Zawsze po zakończeniu programowania a przed wyłączeniem komputera przełącznik P3
ustaw w pozycję P. Zawsze przed włączeniem komputera przełącznik P3 ustaw w pozycję P, a po uruchomieniu systemu
przełącz w pozycję Z gdy chcesz programować EEPROM. Zapobiega to przypadkowemu programowaniu komórek EEPROM błędnymi
impulsami. To proste rozwiązanie obniża koszty całego modułu, a jest wystarczająco skuteczne.
Z poziomu DOS'a Stefcia programować można tak:
>D5FF 01 przełączy
>8000 02 pierwsza dana
>8001 10 druga dana
>8002 .. i następne dane
>D5FF 81 przełączy
>8000 DD kolejna dana tym razem jako 8193-cia! (bit D7)!!
Ważne!
Za każdym razem programować należy tylko jedną komórkę, by niejako po drodze wymusić wymagane 10ms. Np. coś takiego:
>8000 01 02 03 06 D0 20
błędnie zaprogramuje dane bo procedura DOS'a zakłada że wpisywane jest to do pamięci RAM. Tam się to wykona, ale do
pamięci EEPROM nie.
I jeszcze o jednym. Jak widać na schemacie ideowym, sygnały S4 i S5 są wymnożone logicznie. Konsekwencją tego jest super
prosty sposób zbootowania kartridża. Programujesz do przestrzeni $8000... Niczego nie przełączasz (przełącznikami) a
boot się wykona. Jak to możliwe? Oto procedura która to zrobi.
Assemblujemy od adresu $0600
lda #$02
sta $d5ff uaktywnij $A000...
jmp $e474 gorący start
no i wywołanie z Basic'a:
A=USR(1536)
lub DOS'a
RUN 0600
"Dziwny" lokalny reset, to efekt zastosowania na wejściach rejestru $D5FF bramek
negujących D0 i D1. Nie zawsze naciśnięcie przycisku reset ma sens, bo lokalny reset poprostu nie wykona się! Reset
zeruje rejestr $D5FF ale co ma zerować gdy jest on już wyzerowany a dioda LED (zielona/czerwona) świeci?
Przeanalizowanie tego pozostawiam czytelnikom, a pytanie jest takie. Kiedy wykona się, a kiedy nie wykona się lokalny
reset? Wskazówka. Pod uwagę należy wziąć położenie przełącznika P1, P2 oraz zawartość rejestru bity D0 i D1.
Zenon/DIAL
|