..:: Serious Magazine ::..
wydanie 13

  Wstępniak
  Serious...
  Konkurs - rozwiązanie
  Wspomnienie
  Wiedza
  Koronkowa robota
  Tester EPROM
  Prog. równoległy AT89C2051
  ATMEL - obsługa programu
  EPROM - programator...
  Oporniki, oporniki...
  Blokada komputera
  Archiver
  Wizyta kosmitów...
  Kompresja arytmetyczna
  Analizator stanów logicznych
  ASL - obsługa
  Moja miłość
  Powroty z przeszłości
  Porady
  Pracownia elektronika
  Parowanie tranzystorów
  Pętla induktofoniczna
  Super, extra, cacy cartridge
  Makroassembler ATMAS II

  Wyjście
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


Następny artykuł Do góry Poprzedni artykuł