Cartridge do Atari


      Czy to wada, że programy przed uruchomieniem należy wgrać do pamięci komputera? I tak i nie. Aby przyspieszyć proces, konstruktorzy ATARI zaproponowali inną metodę. Polega na tym, że gotowe programy, (nie tylko), można umieścić na cartridge'u. Niejeden użytkownik Atari który używał tego sposobu być może zastanawiał się nad tym: jak to jest zrobione? Niniejszy artykuł stawia sobie za cel, opisanie całego procesu od strony technicznej.

      Zatem... rozglądamy się wokół komputera. W modelach XL nad klawiaturą widać jakieś dziwne okienko, które na dodatek zamknięte jest dwoma "klapkami". Inne modele, mają takie gniazdo na tylnej ściance obudowy. Właśnie w to okienko/gniazdo wsuwa się cartridg'e. Dla dociekliwaych podaję opis styków tego gniazda. Odchylając klapki/zasłonki w 800XL widać gniazdo cartridge'a:

                       1 1 1 1 1 1
     1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
     - - - - - - - - - - - - - - -
     - - - - - - - - - - - - - - -
     A B C D E F G H I J K L M N O

A to.... schemat tego gniazda, ale widziany "od tyłu" (dla 130XE):
     O N M L K J I H G F E D C B A
     - - - - - - - - - - - - - - -
     - - - - - - - - - - - - - - -
     1 1 1 1 1 1 9 8 7 6 5 4 3 2 1
     5 4 3 2 1 0

Opis styków/sygnałów sterujących:

       1 - FI/2 druga faza zegara
       2 - RW odczyt/zapis
      14 - GND masa
      15 - RD4 opis dalej
       A - S4 opis dalej
       L - S5 opis dalej
       M - +5V zasilanie
       N - RD5 opis dalej
       O - CCTL opis dalej

wejścia adresowe: E-A0   B-A3   11-A6   8-A9   7-A12   D-A1   13-A4   10-A7   3-A10   C-A2   12-A5   9-A8   4-A11

wejścia/wyjścia danych: J-D0   H-D2   F-D4   K-D6   I-D1   6-D3   G-D5   5-D7

Dodatkowe objaśnienia styków gniazda:

1-FI/2Zbocze opadające tego sygnału powinno być wykorzystywane do sterowania (taktowania). Jest to sygnał, tzw druga faza zegara taktującego w Atari _ 2-R/W Czytaj/pisz. Gdy na tej linii pojawi się sygnał jedynki logicznej, znaczy to, że procesor czyta dane pojawiające się na szynie danych. Gdy pojawi się zero ligiczne to procesor zapisuje dane.
15-RD4Po podaniu na ten styk jedynki logicznej, albo łącząc ją z +5V, w komputerze odłączona zostaje pamięć RAM w przestrzeni adresowej $8000-$9FFF W to miejsce podłącza się pamięć cartridge'a o wielkości 8KB.
N-RD5Takie samo działanie jak sygnał RD4, lecz dotyczy przestrzeni adresowej $A000-$BFFF. Jeżeli obecny jest Basic, lub cokolwiek innego (jako moduł ROM) zajmujący powyższe adresy, to również zostanie odłączony.
  __
A-S4

Jeżeli wewnętrzna pamięć RAM jest odłączona (RD4=1),to gdy na szynie adresowej pojawi się adres z zakresu $8000$9FFF, linia S4 przyjmuje stan zera logicznego.
  __
L-S5

Takie samo działanie jak sygnał S4, lecz dotyczy adresów $A000-$BFFF.
  ____
O-CCTL

Gdy na szynie adresowej pojawi się adres z zakresu strony $D5 ($D5000-$D5FF), to linia ta przyjmuje stan zera logicznego.

Sądzę, że opis linii danych (D0-D7) oraz adresowych (A0-A12) jest zbędny, bo każdy "rasowy" elektronik i nie tylko, wie co to jest. Przypomnę tylko, że na liniach danych pojawia się zawartość zaadresowanej komórki. O tym, która to komórka stanowi włąśnie adres podany na linie adresowe (A0-A12).

Jak zrobić cartridge'a

Spis elemetów potrzebnych do wykonania cartridge'a

  • EPROM 27128 lub np. 27256
  • UCY 7400 lub odpowiednik
  • Opornik 4k7
  • Opornik 1k
  • Kondensatory
  • elektrolityczne 22mF (2 sztuki)
  • Podstawki
  • Obudowa cartridge'a
  • Płytka uniwersalna, cyna, kalafonia, KYNAR itp drobiazgi...
Schemat

Schemat

Opis

Układ UCY7400 łączyć należy następująco:

  1. Zlutować końcówki 2 i 6
  2. Zlutować końcówki 3 i 4 oraz połączyć je do łączówek RD4 i RD5
  3. Zlutować końcówki 10 i 11
  4. Do końcówki 1 podłączyć opornik 4k7 i kondensator elektrolityczny 22mF (plus na końcówkę 1)
  5. Drugą końcówkę opornika podłączyć do +5V
  6. Drugą końcówkę kondensatora połączyć do GND (masa)
  7. Do końcówki 5 podłączyć opornik 1k drugą końcówkę opornika podłączyć do +5V
  8. Końcówkę 9 połączyć z łączówką RW
  9. Końcówkę 8 połączyć z końcówką 22 (OE) pamięci EPROM
  10. Końcówkę 12 połączyć z łączówką S5
  11. Końcówkę 13 połączyć z łączówką S4 i z końcówką 26 (A13) pamięci EPROM
Pamięć EPROM połączyć następująco:
  1. Zlutować końcówki 1, 27,28 i podłączyć do +5V
  2. Końcówkę 20 (CE) i 14 podłączyć do GND (masa)
  3. Końcówki 22 i 26 są już podłączone odpowiednio do końcówek 8 i 13 układu UCY 7400
EPROM/gniazdo:

      końcówka 2 do A12
      końcówka 3 do A7
      końcówka 4 do A6
      końcówka 5 do A5
      końcówka 6 do A4
      końcówka 7 do A3
      końcówka 8 do A2
      końcówka 9 do A1
      końcówka 10 do A0
      końcówka 11 do D0
      końcówka 12 do D1
      końcówka 13 do D2
      końcówka 15 do D3
      końcówka 16 do D4
      końcówka 17 do D5
      końcówka 18 do D6
      końcówka 19 do D7
      końcówka 21 do A10
      końcówka 23 do A11
      końcówka 24 do A9
      końcówka 25 do A8

Drugi kondensator elektrolityczny należy połączyć pomiędzy GND a +5V.

Jak działa cartridge

      Po włączeniu napięcia zasilania wygenerowany zostaje ujemny impuls który wymusza na końcówce 3 (7400) stan wysoki (jedynka logiczna). Sygnał ten podany na RD4 i RD5 odłącza wewnętrzną pamięć komputera o adresach $8000 do $BFFF. W to miejsce podłączona zostaje pamięć EPROM cartridge'a. A że na szynie adresowej utrzymuje się adres różny od $8000-$BFFF, więc stan linii S4 i S5 jest wysoki, tym samym na końcówkę 26 (A13) pamięci EPROM podana zostaje jedynka logiczna i wybrana jest druga, ta o wyższych adresach połówka pamięci EPROM. System operacyjny jest w stanie BOOT, i po chwili odczytany zostaje nagłówek programu cartridge'a umieszczony właśnie w komórkach o najwyższych adresach pamięci EPROM. W końcu startuje program umieszczony na cartridge'u, zadba o to system operacyjny Atari.

Co powinno interesować programistów (koderów) piszących program uruchamiany z cartridge'a?

Sześć ostatnich komórek EPROM zajmuje tzw. nagłówek. Po włożeniu cartridge'a do gniazda wpisane tam wartości znajdą się pod adresami:

- adres startu programu

      $BFFA - LSB CARTRUN
      $BFFB - MSB CARTRUN

- znacznik obecności cartridge'a, gdy jest to CARTINS=0

      $BFFC - CARTINS

- znacznik opcji

      $BFFD - CARTOPT

            bit 0=0 zabroniony BOOT
            bit 0=1 dozwolony BOOT
            bit 2=0 tylko inicjacja cartridge'a
            bit 2=1 inicjacja+start cartridge'a
            bit 7=0 zwykły cartridge
            bit 7=1 cartridg'e diagnostyczny, przejmuje kontrolę przed systemem operacyjnym

- adres inicjacji cąrtridge'a wywołuje procedurę inicjującą, zakończoną rozkazem RTS. Gdy inicjacja nie jest wymagana, wskazuje tylko rozkaz RTS

      $BFFE - LSB CARTINI
      $BFFF - MSB CARTINI

Powyższy opis obowiązuje dla modułu który zajmuje adresy $A000-$BFFF. Odpowiednio, dla modułu umieszczonego pod adresami $8000-$9FFF, dane wpisać należy pod adresy $9FFA-$9FFF.

Jeden przykład zamiast potoku słów

Założenie:

  • program wpisze do komórki 712 wartość #8 i wejdzie w pętlę bez końca
  • program umieszczony będzie od $A000
  • dozwolony BOOT dyskowy
  • brak procedury inicjującej
  • start programu: $A000
Realizacja: Program należy umieścić w drugiej połówce pamięci EPROM, (dotyczy EPROM 27128), dlatego jej końcówka A13 <26> musi być podłączona do +5V w czasie programowania).

Program zostanie umieszczony od najniższej lokacji, tak że ostatecznie znajdzie się pod adresami od $A000...

Przykładowy program:

         lda #8
         sta 712
   skok  jmp skok
         rts       jest potrzebny!

A to po kompilacji:
  $A000  $A0   lda
  $A001  $08   #8
  $A002  $8D   sta
  $A003  $C8   712 ($02C8)
  $A004  $02
  $A005  $4C   jmp   pod
  $A006  $05   $A005
  $A007  $A0
  $A008  $60   rts

A tu umieszczony jest nagłówek dla cartridge'a

      $BFFA  $00  adres startu programu to $A000
      $BFFB  $A0
      $BFFC  $00  jest cartridge, bajt=0
      $BFFD  $05  inicjacja + start + BOOT
      $BFFE  $08  adres inicjacji, (wskazuje RTS pod adresem $A008)
      $BFFF  $A0

Dodatkowe informacje dla jeszcze bardziej dociekliwych...

      Cartridg'e skonstruowany jest tak, że odłącza wewnętrzną pamięć od $8000 do $BFFF. Nie zawsze jest to konieczne. Dla powyższego przykładowego programu wystarczy, by dla celów programu cartridge'a dostępna była tylko pamięć od $A000-$BFFF. Zatem, można przerwać połączenie łączące RD4 z końcówką 3 (7400). Używając odpowiednio linii RD4, RD5 oraz S4 i S5 można odłączać jeden z dwóch bloków pamięci (po 8kB każdy) i w to miejsce podłączać pamięć EPROM cartridge'a. Oczywiście zadbać należy by nagłówek był odpowiednio opisany, no i by sam program zajmował miejsce wskazane przez ten nagłówek! Temat ten wykracza poza ramy tego artykułu, niemniej stwarza ciekawe możliwości manipulowania pamięcią.

W gnieździe cartridge'a dostępny jest sygnał oznaczany CCTL. Gdy na magistrali adresowej pojawi się adres ze strony $D5, to linia CCTL przechodzi w stan zera logicznego. Fakt ten można wykorzystać do modyfikacji i rozbudowy cartridge'a np.programowego odłączenia cartridge'a lub włączenia innej EPROM w przestrzeń adresową $8000-$BFFF, tworząc w ten sposób naprawdę TWARDY DYSK dla Atari. Jest to jednak temat na kolejny artytuł. A może jednak zdradzę jak się to robi?

Robi się to tak: (patrz na schemat!) Sygnał CCTL doprowadź do drugiego wejścia przerzutnika r-s, do tego, do którego dołączony jest opornik 1kohm. Opornik oczywiście wylutuj, bo jest teraz niepotrzebny. Cartridg'e zostanie odłączony, tym samym prawdopodobnie komputer się zawiesi gdy program jest kiepsko napisany. Ponowny start powinien nastąpić jak zawsze po wyłączeniu i włączeniu komputera. Aaaaa.... powie niejeden zjadacz chleba. To prosta droga do uszkodzenia komputera! Zatem? Proszę dobudować przycisk. Jeden styk łączymy z masą, a drugi z wejściem przerzutnika r-s do którego dołączony jest opornik 4k7 (opornik tym razem zostaje!), oraz kondensator 22mF. Jeżeli komputer się zablokuje, (zawiesi), to wystarczy nacisnąć ten przycisk a po chwili RESET w komputerze. Działa? I to bez wyłączania komputera! Programowe wyłączenie cartridge'a może wyglądać tak:

     sta $d500


to wszystko, nastąpiło odłączenie, a dlaczego tak się dzieje opisałem wyżej.

Uwagi końcowe...

      Opisany tu sposób wykonania cartridge'a jest tylko przykładowym. Jak łatwo zauważyć, połówka EPROM jest w ogóle nie wykorzystana.

Najczęściej popełniany błąd w czasie pisania programu dla cartridge'a: pisząc w assemblerze program rozpoczynający się np. od $A000 można zrobić to tak:

      org $A000

      .......
      .......
      lda #1
      sta $A004
      .......
      .......

Po zasemblowaniu i uruchomieniu programu, wszystko zadziała prawidłowo, bo rozkaz STA $A004 wpisze co trzeba do komórki RAM, ale.... gdy ten program umieścimy w EPROM, to pod adresem $A004 nie jest już dostępna komórka RAM lecz ROM!!! Zatem, do adresowanej komórki nic się nie wpisze! Winę ponosi.... programista.

Zenon/DIAL