18.08.2018, 04:52:32 *
Witamy, Gość. Zaloguj się lub zarejestruj.

Zaloguj się podając nazwę użytkownika, hasło i długość sesji
Aktualności: Zapraszamy do rejestracji na forum wszystkich fanów Pegasusa!
 
   Strona główna   Help Szukaj Zaloguj się Rejestracja  
Strony: [1]
  Drukuj  
Autor Wątek: Nagrywanie gier na SNES (Super Nintendo) - dla laików  (Przeczytany 724 razy)
krzysiobal
Aktywny użytkownik
***
Wiadomości: 233


Naprawie pegasusa każdemu!


Zobacz profil
« : 10.02.2018, 20:30:52 »

To wszakże forum o Pegasusie ale z racji pokrewieństwa może temat kogoś zainteresuje Mrugnięcie



W tym artykule opiszę moją próbę zmagań w temacie nagrywania gier na konsolę SNES jako osoby, która z tą konsolą nie miała wcześniej nic wspólnego. W efekcie powstał programowalny kartridż i urządzenie do nagrywania gier.

Motywcja
Wszystko zaczęło się od tego, że ktoś poprosił mnie o przerobienie japońskiej wersji gry Chrono Trigger na polską. Chociaż moja znajomość konsoli SNES kończy się na umiejętności jej włączenia i wyłączenia, to zadanie wydało się banalne - wymiana pamięci MASK-ROM z japońską wersją gry i wlutowanie flasha z polską wersją gry. Niestety, pamięć zastosowana w tej grze ma pojemność 32 Mbit (8bit * 4 MB) i nietypową obudowę (DIL36):
Kod:
               A20   01         36   Vcc
               A21   02         35   A22
               A17   03         34   Vcc
               A18   04         33   /OE
               A15   05         32   A19
               A12   06         31   A14
                A7   07         30   A13
                A6   08         29   A8
                A5   09         28   A9
                A4   10         27   A11
                A3   11         26   A16
                A2   12         25   A10
                A1   13         24   /CS
                A0   14         23   D7
                D0   15         22   D6
                D1   16         21   D5
                D2   17         20   D4
               Vss   18         19   D3

A cały kartridż prezentuje się jak poniżej:


Na rynku brak jest niestety EPROM/Flash będących jej odpowiednikiem. Rozwiązania były w zasadzie trzy:
* zakupić pamięć 27C322 DIL40 (16 bit * 2MB) i dodać do tego dwa multipleksery:


* zakupić pamięć 29F033 i wlutować ją na specjalny adapter stworzony na potrzeby kartridża:


* wykorzystać posiadane przeze mnie pamięci 29LV640 64 Mbit, w obudowie TSOP48 o dość odmiennych rozkładzie wyprowadzeń, które są przeznaczone pod napięcie 3.3V. Wiązało się to z koniecznością dodania 3 buforów konwertujących 74LVC245 i stabilizatora 3.3V. Kolejnym problemem była generacja sygnału aktywującego bufory ('0' gdy !CE='0' && (!WE='0' || '!OE' = '0'), co można było zrealizować za pomocą 3 bramek NAND.

Byłem na tyle zdesperowany, że wykonałem prawie do końca projekt takiej płytki z pamięcią i buforami, który można wykonać termotransferem (bez przelotek pod scalakami!). Cała PCB jest tylko nieznacznie większa od DIP36 i wystaje w miejscach gdzie akurat w kartridżu jest wolne miejsce:


Jednak tuż przed finiszem się poddałem - byłby to projekt dość jednorazowy (być może pasowałby tylko do tego jednego kartridża), a konieczność zaprogramowania takiej pamięci wymagałaby wykonanie odpowiedniej przystawki do programatora. Postanowiłem zmienić koncepcje i... wykonać od zera całą płytkę drukowaną kartridża w oparciu o posiadane pamięci 29LV640.


Budowa kartridża
Przed rozpoczęciem prac postanowiłem wykonać inżynierie wsteczną posiadanego kartridża w celu zrozumienia jego budowy:


kartridż oprócz pamięci Flash posiada 8 kB pamięci RAM (podtrzymywanej bateryjnie), układ CIC (zabezpieczenie regionalne) oraz układ MAD-1 (sterujący pamięcią). W celu pokonania przeciwnika metodą przez rozpoznanie terenu, zacząłem analizować sygnały dostępne na złączu kartridża - jest tu pełna 24 bitowa szyna adresowa konsoli, 8 bitowa szyna danych, sygnały sterujące (rodzaj cyklu procesora: odczyt/zapis, odwołanie do pamięci RAM/ROM). Gniazdo kartridża składa się z trzech części - dużej środkowej i dwóch małych bocznych, ktore nie zawsze występują w kartridżu).

Jedną z różnic w porównaniu do kartridzy Pegasus jest to, że tu do pamięci podpięta jest cała szyna adresowa, natomiast układ MAD-1 aktywuję pamięć ROM/RAM w odpowiednich oknach adresowych. Podobno jest to prosty układ kombinacyjny (jeszcze go nie analizowałem). W innym posiadanym przeze mnie kartridżu (Super Mario Bros All Stars) w ogóle nie ma układu MAD-1, jest tylko dekoder 74*139).

Wykonałem więc projekt swojego kartridża. Oprócz układu CIC dałem tez możliwość wlutowania układu PIC12F629, który może udawać układ CIC!

Płytka wyszła nienagannie i pasuje do obudowy po istniejącym kartridżu bez zarzutu:


Budowa programatora
Mając już kartridż, należało teraz zaprogramować odpowiednim wsadem występującą w nim pamięć. W tym celu zaprojektowałem i zbudowałem odpowiedni programator na USB, do którego wkłądamy kartridż i jednym kliknięciem z aplikacji obsługującej programujemy kartridż. Urządzenie oparte jest o mikrokontroler Atmega8 i 4 zatrzaski 74*574, które zapamiętują adres pamęci. Początkowo obawiałem się, że taki sposób może trochę wydłużyć czas programowania (w przeciwieństwie do sytuacji, gdyby zamiast zatrzasków, zastosować mikrokontroler z większą ilością wyprowadzeń). Jednak ustawienie nowego adresu wymaga w 99% jedynie zaktualizowania odpowiednich 8 bitów, które uległy zmianie (w skrajnej sytuacji $0x00ffff -> 0x01ffff będą to oczywiście wszystkie 24 bity, ale taka sytuacja zdarza się rzadko).
Programowanie kartridża 4 MB trwa ~ 830 sekund (~5kB/s) i ograniczeniem szybkości jest głównie programowa implementacja transferu przez USB. Oprogramowanie do obsługi po stronie PC napisałem w C#

Przy budowie jedynym problemem było znalezienie odpowiedniego gniazda - rozstaw pinów  gnieździe SNES to 2.50 mm, w przeciwieństwie do "standardwoego" 2.54 mm jak w Pegasusach czy kartach rozszerzeń ISA. Ja skupiłem się jedynie na środkowej części gniazda - do tego celu wystarczy w zupełności zwykłe gniazdo 2.54 mm od Pegasusa z przyklejonymi ogranicznikami po obu stronach.


Efekt końcowy
W efekcie udało się osiągnąć zamierzony cel  i wykonać spolszczoną wersję gry:


Plany na przyszłość
Muszę jeszcze mocniej zgłębić temat konsoli SNES bo chciałbym zrobić uniwersalny kartridż obsługujący 99% gier, a być może nawet uruchamianych bezpośrednio z karty micro SD.

Zapisane
Pegasus Gry - forum Pegasusa i gier na Pegasusa
« : 10.02.2018, 20:30:52 »

 Zapisane
TomasZzz
Aktywny użytkownik
***
Wiadomości: 110



Zobacz profil
« Odpowiedz #1 : 10.02.2018, 20:51:05 »

Z gościem rozmawiałem o tej przeróbce i poleciłem aby się skontaktował do Ciebie bo czułem, że będzie problem aby dostać/przerobić na taki duże prg.
Możesz kiedy spróbować zrobić Mario All Stars + SMW bo rzadko się pojawiają  Język
Zapisane
Mcin
Twój Moderator
Moderator Globalny
Stały bywalec PG
*****
Wiadomości: 2781



Zobacz profil
« Odpowiedz #2 : 11.02.2018, 12:32:21 »

Albo to ja jestem mocno niedoedukowany, bo laikiem jestem, i większość artykułu to dla mnie czarna magia :> Ale z tego, co czytam, końcowe urządzenie powinno być prostsze w obsłudze.

Fajny projekt, no i nie powiem, twój rzucony na odchodne pomysł projektu na karty microSD to dopiero przyśpiesza bicie serca - pan Krikzz od Everdrive'ów powinien się bać ^^
Zapisane
alf
Użytkownik
*
Wiadomości: 12



Zobacz profil
« Odpowiedz #3 : 23.07.2018, 09:31:14 »

Hey krzysiobal. Świetna robota! Jestem pod niemałym wrażeniem.
Widzę, że zastosowałeś układ 74LVC245 do konwersji logiki 5V -> 3.3V dla zastosowanej pamięci FLASH. Konwersja jak rozumiem jest tylko w jedną stronę ? Tzn. gdy konsola dobiera się do pamięci ze swoimi 5V liniami adresowymi to konwertujemy na 3.3V i w taki sposób podajemy na FLASH. Z FLASHa wypuszczane są sygnały danych (D0-D7) 3.3V i widze że jeden z 74LVC245 ma sterowany kierunek więc gdy konsola odbiera te dane to zmieniasz kierunek i podajesz w ten sposób dane. Jenakże te dane nadal są 3.3V prawda ? Bo ten 74LVC245 zapewne ma Vcc = 3.3V. Jeżeli tak, to czy konsola bezproblemowo radzi sobie z takim zakresem poziomów logicznych ?
« Ostatnia zmiana: 23.07.2018, 09:32:45 wysłane przez alf » Zapisane
krzysiobal
Aktywny użytkownik
***
Wiadomości: 233


Naprawie pegasusa każdemu!


Zobacz profil
« Odpowiedz #4 : 23.07.2018, 11:18:40 »

Tak, działa bez problemu. Jeśli z jakiegoś powodu potrzeba 5V po drugiej stronie, można zastosować 74LVC4245.
« Ostatnia zmiana: 23.07.2018, 11:21:22 wysłane przez krzysiobal » Zapisane
alf
Użytkownik
*
Wiadomości: 12



Zobacz profil
« Odpowiedz #5 : 23.07.2018, 11:25:25 »

Nie wiedziałem, że logika 3.3V podłączona do logiki 5V ot tak zatrybi bez problemów. Jak widac człowiek ciąglę się uczy. Bardzo dziękuję za objaśnienie!
Zapisane
Strony: [1]
  Drukuj  
 
Skocz do:  

Powered by SMF 1.1.21 | SMF © 2006-2007, Simple Machines
Sitemap
pegasus