Cartridge "Corina" EPROM - SRAM - EEPROM




      Kartridż został zaprojektowany z myślą o prostym konfigurowaniu na użytek różnorakich gier. Założenia były takie: jak najmniej elektroniki, możliwie dużo kombinacji konfiguracji modułu, maksymalnie dużo pamięci. Moduł spełnia wszystkie wymienione postulaty z jednym wyjątkiem, nie oddaje do dyspozycji maksymalnie dużo pamięci, co nie wyklucza możliwości dołączenia kolejnych bloków, na co elektronika modułu pozwala. Szczególne marnotrawstwo zasobami pamięci widoczne jest w użyciu pamięci EEPROM która ma tylko 8kB, a swobodnie w tej przestrzeni mieścić się może 512kB lub nawet 1MB.
Analizując sterowanie bankami poprzez rejestr sprzętowy, możliwe jest sterowanie pamięci o pojemności 2MB. Bit D7 włącza/wyłącza moduł (bloki pamięci 16kB), bity D0-D6 wybierają bank 16kB. Ze względu na specyfikę konfiguracji poprzez przelutowywanie zwor należy przyjąć że moduł sterowany jest dziewięcioma bitami a nie ośmioma. Rolę dziewiątego bitu przejmuje zwora Z1 dla konfiguracji 1MB EPROM (opcjonalnie + 8kB EEPROM). Rolę bitu D5 przejmuje opornik symulujący działanie bitu D5 zawsze jako zero logiczne. Stąd sterując modułem należy przyjąć taką ideę:

D5 = 0, D6 = 0
Wybór EPROM (bit D5 jest symulowany przez opornik dla konfiguracji 1MB EPROM, znaczenie ma tylko bit D6 = 0, a bit D5 wykorzystany jest do wyboru banku EPROM).

D5 = 1, D6 = 0 wybór SRAM

D5 = 0, D6 = 1
Wybór EEPROM (bit D5 jest symulowany przez opornik dla konfiguracji 1MB EPROM + 8kB EEPROM, znaczenie ma tylko bit D6 a bit D5 wykorzystany jest do wyboru banku EPROM ).

D5 = 1, D6 = 1 kombinacja nieużywana, zarezerwowana dla dalszej rozbudowy modułu.

To czy przyjęte zostanie nazewnictwo - wybór banku + wybór rodzaju pamięci EPROM, SRAM, EEPROM czy tylko wybór banku nie ma znaczenia. Użytkownik sam określi sposób dla siebie wygodny. Poniższa tabela określa konfiguracje. Jest rzeczą oczywistą że tylko od fantazji użytkownika zależy jak rozdysponuje zasobami pamięci modułu. Nie jest wykluczone użycie CORINY w roli RAM-CARTA o pojemności 512kB czy nawet 1MB wspomaganego oprogramowaniem umieszczonym w pamięci EPROM modułu.
Dodatkowo opcjonalnie montowany zegar czasu rzeczywistego RTC pomysłu PASIA (zegar stosowany w module SpartaDOS X), czyni CORINĘ elastyczniejszą. Zegar ma zmienione adresy rejestrów by nie dochodziło do konfliktu z zegarem SpartaDOS X, no i należy zadbać by oprogramowanie nie nakładało wyświetlania czasu jednego zegara na drugi.
Konfiguracje.

Dla wszystkich konfiguracji bit D7=0 włącza moduł, D7=1 wyłącza moduł. Przełączana jest pamięć w obszarze $8000 - $BFFF jako blok 16kB. Zawsze jest to JEDEN blok, zależnie od wybranej pamięci EPROM, SRAM, EEPROM (patrz użycie bitów D5 - D6) Moduł wyposażony jest w zwory Z1-Z4, w zależności od konfiguracji należy je odpowiednio ustawić w pozycję A lub B lub w pozycję dowolną oznaczoną X.

1MB EPROM
       Z1 = A, Z2 = A, Z3 = A, Z4 = X
       D0 - D5 wybór banku EPROM
       D6 = 0 wybór pamięci EPROM

1MB EPROM + 8kB EEPROM
       Z1 = A, Z2 = A, Z3 = A, Z4 = X
       D0 - D5 wybór banku EPROM
       D6 = 0 wybór EPROM
       D6 = 1 wybór EEPROM

512kB EPROM
       Z1 = B, Z2 = A, Z3 = B, Z4 = X
       D0 - D4 wybór banku EPROM
       D5 = 0, D6 = 0 wybór EPROM

512kB EPROM + 512kB SRAM
       Z1 = B, Z2 = A, Z3 = B, Z4 = A
       D0 - D4 wybór banku EPROM lub SRAM
       D5 = 0, D6 = 0 wybór EPROM
       D5 = 1, D6 = 0 Wybór RAM

512kB EPROM + 8kB EEPROM
       Z1 = B, Z2 = A, Z3 = B, Z4 = X
       D0 - D4 wybór banku EPROM
       D5 = 0, D6 = 0 wybór EPROM
       D5 = 0, D6 = 1 wybór EEPROM

512kB EPROM + 512kB SRAM + 8kB EEPROM
       Z1 = B, Z2 = A, Z3 = B, Z4 = A
       D0 - D4 wybór banku EPROM lub SRAM
       D5 = 0, D6 = 0 wybór EPROM
       D5 = 1, D6 = 0 wybór SRAM
       D5 = 0, D6 = 1 wybór EEPROM

512kB EPROM + 128kB SRAM
       Z1 = B, Z2 = A, Z3 = B, Z4 = B
       D0 - D4 wybór banku EPROM
       D0 - D2 wybór banku SRAM
       D5 = 0, D6 = 0 wybór EPROM
       D5 = 1, D6 = 0 wybór SRAM

512kB EPROM + 128kB SRAM + 8kB EEPROM
       Z1 = B, Z2 = A, Z3 = B, Z4 = B
       D0 - D4 wybór banku EPROM
       D0 - D2 wybór banku SRAM
       D5 = 0, D6 = 0 wybór EPROM
       D5 = 1, D6 = 0 wybór SRAM
       D5 = 0, D6 = 1 wybór EEPROM

128kB EPROM
       Z1 = B, Z2 = B, Z3 = B, Z4 = X
       D0 - D2 wybór banku EPROM
       D5 = 0, D6 = 0 wybór EPROM

128kB EPROM + 512kB SRAM
       Z1 = B, Z2 = B, Z3 = B, Z4 = A
       D0 - D2 wybór banku EPROM
       D0 - D4 wybór banku SRAM
       D5 = 0, D6 = 0 wybór EPROM
       D5 = 1, D6 = 0 wybór SRAM

128kB EPROM + 18kB SRAM
       Z1 = B, Z2 = B, Z3 = B, Z4 = B
       D0 - D2 wybór banku EPROM lub SRAM
       D5 = 0, D6 = 0 wybór EPROM
       D5 = 1, D6 = 0 wybór SRAM

128kB EPROM + 8kB EPROM
       Z1 = B, Z2 = B, Z3 = B, Z4 = X
       D0 - D2 wybór banku EPROM
       D5 = 0, D6 = 0 wybór EPROM
       D5 = 0, D6 = 1 wybór EEPROM

128kB EPROM + 512kB SRAM + 8kB EEPROM
       Z1 = B, Z2 = B, Z3 = B, Z4 = A
       D0 - D2 wybór banku EPROM
       D0 - D4 wybór banku SRAM
       D5 = 0, D6 = 0 wybór EPROM
       D5 = 1, D6 = 0 wybór SRAM
       D5 = 0, D6 = 1 wybór EEPROM

128kB EPROM + 128kB SRAM + 8kB EEPROM
       Z1 = B, Z2 = B, Z3 = B, Z4 = B
       D0 - D2 wybór banku EPROM lub SRAM
       D5 = 0, D6 = 0 wybór EPROM
       D5 = 1, D6 = 0 wybór SRAM
       D5 = 1, D6 = 1 wybór EEPROM

Gdy występuje inna konfiguracja niż użycie pamięci 1MB EPROM (opcjonalnie + 8kB EEPROM), kombinacja bitów D5 = 1, D6 = 1 jest nieużywana. Można ją wykorzystać do dalszej rozbudowy modułu. W tym celu na pamięć EPROM 1MB należy nalutować drugą pamięć 1MB EPROM ( z odgiętą w bok końcówką 22) i połączyć ją z końcówką 7 dekodera 74139. Lub należy nalutować na pamięć SRAM 512kB drugą pamięć 512kB SRAM ( z odgiętą końcówką 22) i połączyć ją z końcówką 7 dekodera 74139. Można też na pamięć EEPROM nalutować drugą pamięć EEPROM 8kB z odgiętą końcówką 20 którą należy połączyć do końcówki 7 dekodera 74139.

Otrzymuje się konfigurację 2MB EPROM lub 1MB SRAM jako uzupełnienie opisanych wyżej, lub 16kB EEPROM. Sterowanie odbywa się wtedy w/g kombinacji bitów bitów D5, D6 jak niżej:

       D6 = 0 wybór pamięci EPROM, standardowe 1MB
       D5 = 1, D6 = 0 wybór pamięci SRAM, standardowe 512kB
       D5 = 0, D6 = 1 wybór pamięci EEPROM
       D5 = 1, D6 = 1 wybór dodatkowej pamięci EPROM 1MB lub SRAM 512kB lub EEPROM 8kB

Z analizy opisanych konfiguracji wynika że nastąpić może tzw "zawijanie" adresów wyboru banku. I tak np. dla pamięci EPROM 128kB bitami wybierającymi bank są D0 - D2, użycie bitów D3, D4, jest dozwolone ale nastąpi "zawijanie" adresów. Np. bank zerowy dostępny będzie pod adresami 0, 8, 16, 24, czyli powtórzy się cztery razy. Należy zatem unikać adresowania nadmiarowego banków i przyjąć zasadę jak to opisano wyżej w konfiguracjach.

Moduł CORINA posiada rejestr sprzętowy pod adresem $D500 i jest rejestrem do zapisu. W czasie załączenia zasilania jest zerowany i w przestrzeń adresową $8000-$BFFF włączany jest bank zerowy pamięci EPROM. W tym właśnie banku, w najstarszych adresach musi znaleźć się nagłówek dla kartridża by mógł nastąpić BOOT właśnie z niego.
Pamięć EEPROM ma pojemność 8kB ale włączana jest jako blok 16kB. Zatem dana zapisana pod adresem $8000 będzie również dostępna pod adresem $A000, itd... Należy przyjąć zasadę że używając pamięci EEPROM adresuje się ją w przestrzeni $8000-$9FFF by uniknąć ewentualnych konfliktów związanych z przyszłą rozbudową modułu. Programowanie pamięci EEPROM może przebiegać na ogólnych zasadach opisanych w nocie katalogowej, a więc programować można dowolne 64 bajty w jednym cyklu. Jednak aby uprościć proces programowania zostaje przyjęta reguła, że programuje się dowolny jeden bajt w cyklu programowania. Zastosowana pamięć EEPROM jest typu AT68C64.

Przykłady

Włączenie banku 0 pamięci SRAM
LDA #%00100000
STA $D500
Włączenie banku EEPROM
LDA #%01000000
STA $D500
Włączenie banku 4 EPROM
LDA #%00000100
STA $D500
Włączenie banku 9 SRAM
LDA #%00101001
STA $D500
Przykład programowania bajtu dla pamięci EEPROM z uwzględnieniem czasu oczekiwania na wykonanie wewnętrznego procesu programowania. Właściwy algorytm "zaszyty" jest we wnętrzu pamięci . Pierwszy sposób, programowanie z oczekiwaniem i sposób drugi z testowaniem bitu D7 programowanego bajtu.

Sposób pierwszy
LDA #$DANA
STA $8000
Tu pętla oczekiwania na zakończenie procesu programowania, czas około 1ms (mili sekundy)
lub nieco więcej by mieć pewność że programowanie przebiegło poprawnie.
LDA $8000
Tu porównanie czy zaprogramowany bajt jest równoznaczny z bajtem programowanym
Sposób drugi
LDA #$DANA
STA $8000
LDA $8000
Tu testowanie czy bit D7 odczytanej danej jest zgodny z bitem  D7  programowanej danej. Jeżeli są zgodne,
proces programowania się zakończył, jeżeli nie  (są przeciwnej wartości)  to  proces  programowania  trwa
i należy ponownie odczytać daną spod adresu $8000 i przeprowadzić porównanie.
Uwaga, adres $8000 wybrany został tylko dla wyjaśnienia metody, w rzeczywistości jest to adres pod którym
dana ma zostać zaprogramowana.
W czasie programowania pamięci EEPROM wykorzystać można tzw szybki algorytm programowania. Polega na tym, że przed programowaniem danej pod wskazanym adresem, wpierw spod tego adresu odczytać należy daną. Jeżeli dane są równe, programowanie można pominąć, zyskuje się 1ms.

Jak zbudowany jest moduł CORINA

Rejestr sprzętowy jest tylko do zapisu i dostępny jest TYLKO pod adresem $D500 dzięki zastosowaniu bramki NOR 4078. Bity D0-D5 adresują bank 16kB, bit D7 steruje włączeniem/wyłączeniem banku. Drugi dekoder adresowy steruje dostępem do pamięci EPROM, RAM, EEPROM wg ustawień bitów D5, D6. Cztery zwory pozwalają wybrać konfiguracje co równoznaczne jest z włożeniem odpowiedniej pamięci w miejsce dla niej przewidziane. Użycie pamięci niezgodnych z ustawioną konfiguracją skutkować będzie niewłaściwym działaniem (adresowaniem) banków, lub banki będą niedostępne.
Opornik na wejściu dekodera symuluje działanie bitu D5 dla konfiguracji 1MB EPROM (opcjonalnie +8kB EEPROM). Klasyczny układ bramek NAND generuje sygnał wpisu i odczytu dla pamięci RAM i EEPROM.
Zenon/DIAL
      Wersja oryginalna (DOC)