Programowalny cartridge do SEGA Megadrive

Około września 2016 brałem udział w pisaniu gry VilQ, której głównym autorem jest Axi0maT. Gra została zaprezentowana podczas Retrokomp Gamedev compo 2016, gdzie zajęła pierwsze miejsce. Sukces gry zachęcił nas do wydania gry na cartridge’ach, ale tu zaczęły się schody.

Możliwości wydania gry

Na daną chwilę były zaledwie 3 opcje wydania gry:

  • W formie cyfrowej. Wady: trywialne piractwo, brak kontroli nad sprzedażą.
  • Zamawiając partię cartridge’y na dalekim wschodzie. Wada: możliwe, że nasz “dostawca” cartów zaoferowałby je z naszą grą we własnym asortymencie, nie dzieląc się z nami zyskiem.
  • Zakup “jednorazówek” u Krikzza. Wady:
    • Drogo.  Programator kosztuje 58$, pojedynczy cartridge 9$.
    • Dodatkowo, nie ma on pamięci SRAM na zapisywanie hi-score’ów.
    • Po jakimś czasie napotkałem na wspaniały artykuł o wadach konstrukcyjnych wszelakich flashcartów, co tylko mnie utwierdza w przekonaniu że dobrze że nie zdecydowaliśmy się na to rozwiązanie.

Jak widać, żadna z opcji nie jest idealna, więc nie pozostało nic innego jak zbudowanie własnego carta.

Wersja EPROM

Stwierdziłem, że w pierwszym podejściu zrobię sobie płytkę z samym ROMem, tak by przetrzeć szlaki. Dodatkowo, pozostawię sobie wygodne wyprowadzenia tak, by móc eksperymentować “na żywym organizmie” z dodawaniem pamięci SRAM. Po wstępnym planowaniu nabyłem EPROM M27C40002 na Allegro, zaprojektowałem płytkę i wysłałem do zrobienia. Gdy płytki przyszły, okazało się że otwory montażowe są w złym miejscu, ale reszta wymiarów była mniej więcej okej. Trudno, w końcu to prototyp. W międzyczasie zacząłem rozglądać się za kasowarką i programatorem do kości pamięci, lecz tu się szybko okazało, że taki sprzęt jest dość drogi. Pora na trochę DIY.

Cart, który zaprojektowałem

Podpiąłem kość pamięci na płytce stykowej pod Arduino Mega. Dzięki temu mogłem odczytać jej zawartość. Testowałem najpierw na kickstarcie z Amigi 500, zaś gdy zrzut wykonał się prawidłowo, przeszedłem do właściwej kości. Kość nie była pusta, choć nic ciekawego na niej nie było. Pora ją wyczyścić.

Skasować EPROM dość łatwo, jako że źródło promieni UV każdy ma pod ręką w postaci słońca. Wystarczy wystawić go na działanie promieni słonecznych na parę godzin i… nic się nie stanie. Wystawiłem go na ostre słońce przez parę kolejnych dni i nic. Napisałem sobie programik na Arduino, który zliczy liczbę zer we wsadzie tak, by sprawdzić czy kasowanie choć trochę idzie do przodu. I nic, nie przeskoczył ani jeden bit.

Pora wyciągnąć cięższe działa – sztuczne źródło UV. Jako że mamy XXI wiek, stwierdziłem że zrobię to LEDami, bo czemu nie. Zwłaszcza, że znalazłem informację że jednemu człowiekowi się udało. Zachęcony tym wpisem kupiłem LEDy UV na Allegro, podpiąłem z maksymalnym prądem nad okienkiem i zostawiłem na parę godzin. Oczywiście nic się nie stało. Zacząłem się zastanawiać, szkiełko na moim EPROMie nie jest pokryte jakimś filtrem ale nie, czyszczenie go nic nie zmieniło. Po dalszym czytaniu okazało się, że kasować EPROMy LEDem owszem można, ale tylko takim, który ma długość fali poniżej 400nm. W chwili pisania żadna aukcja na Allegro nie podaje długości fali dla LEDów UV, więc odradzam zaopatrywać się w ten sposób. Zamówiłem na TME różne w miarę tanie LEDy, między innymi klasyczny  OSV4YL5451B  oraz w obudowie SMD OSV4YLS1C1A. O ile ten pierwszy nie chciał działać, tak ten drugi dał już efekty, jednak bardzo powoli. Połączyłem ze sobą trzy takie ledy i przykleiłem taśmą do okienka. Po całym dniu kasowania kość była pusta. No dobra, czas na programowanie!

I tu się pojawił problem. Programowanie kości EPROM odbywa się podając napięcie Vpp około 12V na jedną z nóg, zaś zamiast Vcc równego 5V podaje się coś koło 6. Zrobiłem test na sucho z takimi napięciami i oczywiście okazuje się, że cała kość gada wtedy na 6V, więc takie poziomy napięć ubiją Arduino. Zniechęcony zacząłem się rozglądać za innym rozwiązaniem. I wtedy przypomniałem sobie o flashowych zamienników kości 27C – rodzinie 29F.

Flashcart

Kość typu flash rozwiązuje wszystkie problemy – można je programować napięciem 5V, więc Arduino to zrobi bez obaw. Występują one też w wariantach 3,3V, ale mnie interesują pięciowoltowe, jako że sama Sega również gada pięcioma woltami, a projekt miał być możliwie tani, więc konwersja napięć odpada.

Dodatkowo, okazuje się że programowanie i kasowanie odbywa się wysyłając odpowiednie sekwencje na liniach adresu i danych podczas ustawienia pinu /WE na stan niski, więc istnieje szansa by programować fragment kości z poziomu konsoli, zapisując przy tym hi-score’y bez obawy że bateria przestanie działać i dalej redukując cenę – SRAM do dzisiaj jest kosztowny.

Zaprojektowałem naprędce nową płytkę oraz shielda do Arduino Mega. SEGA nie wystawia na złączu cartridge’a sygnału /WE, tylko /OE służący do odczytu, więc musiałem go sobie wygenerować. Wymyśliłem, że dodając na karcie parę bramek NAND mogę wygenerować sygnał /WE wtedy, gdy konsola będzie próbowała czytać z odpowiednio wysokiego adresu. Jako że legalny adres odczytu kości 1MB kończył się na linii A19, użyłem do tego celu linii A20 i /OE. Złącze na cartridge zdobyłem na AliExpress – o dziwo można je kupić do dzisiaj bez większego problemu. W tym samym miejscu zaopatrzyłem się w kości flash.

Płytki: nieobsadzone i złożone

Płytki przyszły, wziąłem się więc do roboty. Zacząłem od shielda. Potem przyszedł czas na testowy firmware, który pozwoliłby na zrzut któregokolwiek cartridge’a z mojej kolekcji – padło na Bram Stoker’s Dracula. Po wielu bojach i dopasowywaniu timingów udało się. Dodatkowo okazuje się, że z nagłówka cartridge’a można odczytać tytuł gry, zaś patrząc kiedy pamięć się zapętli można wywnioskować jej rozmiar. Dodając te dwie funkcjonalności stworzyłem uniwersalny, wygodny dumper ROMów z Segi.

Pierwszy odczyt z cartridge’a Draculi
Cartridge na shieldzie ROMprg

Zlutowałem cartridge i napisałem firmware programujący. Wszystko ładnie zadziałało. Najpierw użyłem zrzuconego przez siebie Draculi, zaś potem wypaliłem sobie ROM testowy 240p testsuite. Efekt widać poniżej.

240p testsuite działa!

W rezultacie na GitHubie powstały dwa projekty:

  • smdRomCart zawierający projekty programowalnych cartridge’y
  • ROMprg z shieldami do programowania różnorakich ROMów i cartridge’ów oraz w miarę wygodną do tego appką.

Przede mną jeszcze napisanie biblioteki do zapisywania hi-score’a w czasie gry. Ale to materiał na oddzielny wpis. 😉

This entry was posted in SEGA and tagged , , , , , . Bookmark the permalink.

One Response to Programowalny cartridge do SEGA Megadrive

  1. rvn says:

    Świetna robota, tak trzymać!

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *