Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Zgrywarka gier PEGASUSA na PC na Atmega32 i USB

phanick 21 Lut 2014 00:33 16812 6
  • Zgrywarka gier PEGASUSA na PC na Atmega32 i USB

    Jakiś czas temu pisałem, jak nagrywać gry z PC na PEGASUSA. Teraz pora podejść do tematu z drugiej strony – jak zgrać naszą ulubioną kolekcję kartrydży na komputer. Wiele osób może się dziwić, po co taki zabieg, zwłaszcza, że większość gier z tej konsoli krąży już po Internecie. Czasem jednak mamy w kolekcji jakąś unikalną, rzadką grę, której nie ma w sieci, a chcielibyśmy ją mieć na PC. Jest kilka powodów:
    • chcemy zrobić kopie bezpieczeństwa naszych cennych gier,
    • chcemy podejrzeć w debuggerze pod emulatorem jak działa gra (jeśli jesteśmy zapalonymi hobbystami-miłośnikami procesora 6502)
    • chcemy podzielić się z innymi naszą grą.

    W kartrydżu jest pamięć ROM dla procesora + pamięć ROM dla układu graficznego (albo pamięć RAM). Można byłoby więc wylutować układy, zgrać je pod programatorem i osiągnęlibyśmy sukces. Jednak na drodze stoi kilka przeszkód:
    * wylutowując układ moglibyśmy go uszkodzić,
    * w kartrydżach w większości stosowane są pamięci jednokrotnego zapisu, programowane na etapie produkcji (tzw. mask romy), które mogą mieć zmieniony rozkład wyprowadzeń względem pamięci programowalnych (EEPROM) i programator mógłby ich nie odczytać
    * w obecnych czasach 99% gier posiada pamięć w postaci czarnego bąbla zalanego tworzywem, do którego nie da się dostać. Dlatego mój pomysł jest trochę inny i nie wymaga ingerencji w sam nośnik... Skoro konsola ma dostęp do danych na nośniku, to i my możemy do ich ten dostęp uzyskać. Wystarczy zbudować urządzenie ze złączem na kartrydż (takim jak w konsoli) i `prosić` układy zawarte w kartrydżu o dane w taki sam sposób, jak robi to konsola. Potem zebrać wszystko do kupy, dodać odpowiedni nagłówek i mamy ROM z grą, w który możemy grać na emulatorze..

    Wszystko byłoby pięknie, ale jest jedno drobne `ale`. Tylko kartrydże z najprostszymi grami zawierają jedynie powyższe pamięci (NROM). Większość posiada dodatkowe układy, zajmujące się przełączaniem banków, które pozwalają zobaczyć `ograniczonym’ procesorom w konsoli więcej pamięci, niż wynikałoby z ich architektury. Przełączenie banku jest realizowane zwykle poprzez cykl zapisu procesora konsoli pod specjalny adres. Wartość zapisywana pod ten adres oznacza numer banku (w uproszczeniu). Każda gra może mieć swoje, autorskie rozwiązanie.

    Dlatego też samo urządzenie potrafi wykonywać 4 operacje:
    • cykl zapisu procesora (CPU) podanej wartości pod wskazany adres
    • cykl odczytu procesora (CPU) z podanego zakresu adresów
    • cykl zapisu układu graficznego (PPU) podanej wartości pod wskazany adres
    • cykl odczytu układu graficznego (PPU) z podanego zakresu adresów

    PC steruje urządzeniem, wysyłając do niego komunikaty wykonania odpowiednich cykli pod odpowiednimi adresami..

    Zgrywarka gier PEGASUSA na PC na Atmega32 i USB Zgrywarka gier PEGASUSA na PC na Atmega32 i USB Zgrywarka gier PEGASUSA na PC na Atmega32 i USB Zgrywarka gier PEGASUSA na PC na Atmega32 i USB Zgrywarka gier PEGASUSA na PC na Atmega32 i USB

    Informacje techniczne:
    Procesor Atmega 32 za pomocą swoich pinów komunikuje się z układami w kartrydżu. Ponieważ cykle CPU i PPU i tak trzeba wykonywać oddzielnie, można bez problemu połączyć obie magistrale adresowe oraz danych w kartrydżu, a dodatkowe sygnały sterujące będą wybierać pomiędzy CPU i PPU.

    Linie danych zostały zabezpieczone rezystorami na wypadek, gdyby i atmega i układ w kartrydżu w tej samej chwili chcieli wystawić dane. Może to mieć miejsce w przypadku nośników z maperami bez zabezpieczenia przeciw konfliktem na magistrali (ang. bus conflicts)..

    Do komunikacji między PC używane jest złącze USB, a jego obsługą zajmuje się po stronie atmegi biblioteka V-USB, a po stronie PC: LibUsbDotNet. Na PC została napisana przeze mnie specjalna aplikacja, sterująca urządzeniem

    Zgrywarka gier PEGASUSA na PC na Atmega32 i USB

    Przykładowo, żeby zdumpować najprostszy nośnik (NROM) wystarczą następujące operacje:
    • odczyt zawartej w kartrydżu pamięci PRG spod 0x8000-0xFFFF ,
    • odczyt zawartej w kartrydżu pamięci CHR spod 0x0000-0x1FFF ,
    Użytkownik w aplikacji może wszystko `wyklikać`. Następnie wystarczy tylko określić numer mapera z nośnikiem, kliknąć przycisk `Generate NES file`, a aplikacja sama stworzy plik NES (z dodanym nagłówkiem), gotowy do uruchomienia pod emulatorem.
    Zgrywarka gier PEGASUSA na PC na Atmega32 i USB

    W przypadku dumpowania gier UNROM, należy wykonać cykle zapisu, przełączające banki:
    Zgrywarka gier PEGASUSA na PC na Atmega32 i USB

    Nie odczytujemy pamięci dla układu graficznego, bo te kartrydże mają CHR-RAM. Dziwić mogą tylko adresy, pod które wykonujemy cykle zapisu (0xD388, 0xD389, ... ) przełączając banki, zamiast standardowego 0x8000 (dla UNROMa wystarczy dowolny adres 0x8000-0xFFFF). Niestety, mamy tutaj do czynienia z konfliktami na magistrali – pamięć w UNROMie nie wie, czy dany cykl CPU jest cyklem odczytu czy cyklem zapisu i zawsze wystawia dane spod wskazanego adresu. Gdyby nie było rezystorów, mielibyśmy zwarcie. Rezystory zabezpieczają, ale.. układ w kartrydżu widzi te dane, które wystawia pamięć, a nie te, które wystawia nasz zgrywacz (bo są po tej samej stronie rezystorów). Dlatego układ musi zapisywać dane pod taki adres, pod którym są już takie właśnie dane.

    Ponieważ dupowanie ROMów przez wyklikiwanie jest dość czasochłonne, aplikacja ma możliwość wczytania plików ze skryptem dumpującym. Plik taki to nic innego jak polecenia dla mojej aplikacji, co ma po kolei wykonywać. Fragment takiego pliku:

    Code:

    #flipull (cnrom - mapper 3)
    CPU R 8000 FFFF

    CPU W 00 8234
    PPU R 0000 1FFF

    CPU W 01 8235
    PPU R 0000 1FFF

    CPU W 02 8236
    PPU R 0000 1FFF

    CPU W 03 8237
    PPU R 0000 1FFF


    Dumpowanie nieznanych gier:
    Do tej pory opisywałem wszystko tak, jakbyśmy widzieli, jaki maper jest w danej grze. Czasem może się jednak zdarzyć, że nic nie wiemy o kartrydżu, który zgrywamy. W takiej sytuacji należy podejść do sprawy indywidualnie. Należy odczytać przestrzeń adresową 0x8000-0xFFFF (bo procesor tuż po starcie zaczyna wykonywanie kodu właśnie tam), zdeasemblować taki kod i prześledzić instrukcje zapisu pod 0x8000-0xFFFF, które będą oznaczały przełączanie banków. Jest to zagadnienie dość trudne, ale naprawdę bardzo fascynujące.

    Podsumowanie
    W sieci istniał już wcześniej podobny projekt (o nazwie Kazzo). Ja swój wykonywałem zupełnie samodzielnie i jedynie nazwa (MyKazzo) nawiązuje do tamtego. Mój jest moi zdaniem lepszy, bo:
    * opiera się jedynie na atmedze i nie wymaga dodatkowych układów scalonych,
    * zabezpiecza nośnik (i procesor) rezystorami przed ewentualnymi problemami, które możemy spowodować nieumiejętnie dumpując grę.

    Udało mi się z powodzeniem zdumpować większość z posiadanych przez siebie gier. Cenne są:
    * przeróbki gier z NESa na Pegasusa, które (prawdopodobnie z obawy przed prawami autorskii) posiadają wycięte loga producenta, jak np. Robocop 2, Flipull, 168-in-1.
    * wiele składanek (które zawierają proste gry), ale w całości nie istnieją w sieci
    * gry niedostępne do tej pory (np. Go Dizzy Go jako samodzielna gra, a nie jedna z występujących na składance Quattro Arcade)

    Fajne! Ranking DIY
    Potrafisz napisać podobny artykuł? Wyślij do mnie a otrzymasz kartę SD 64GB.
    O autorze
    phanick
    Poziom 28  
    Offline 
    Specjalizuje się w: energetyk najwyższych napięć
    phanick napisał 2099 postów o ocenie 1999, pomógł 49 razy. Mieszka w mieście Warszawa. Jest z nami od 2007 roku.
  • #2
    ja.czekanski
    Poziom 12  
    Gdy nie wiemy z jakim typem mappera mamy do czynienia warto odwiedzić tę stronę: http://tuxnes.sourceforge.net/nesmapper.txt (zakładam, że autor ją zna i korzysta).
    Następnie gdy wiemy jaki układ steruje stronicowaniem w kartrydżu (lub mamy przypuszczenie) udajemy się tutaj: http://wiki.nesdev.com/w/index.php/Mapper
    Może to oszczędzić dużo czasu związanego z disassemblacją kodu gry.
  • #3
    jackfinch
    Poziom 16  
    Witam
    Z czego wykonane jest gniazdo do kardridża? Czy będziesz udostepniał wsad do atmegi i program na PC?

    Pozdrawiam
  • #4
    phanick
    Poziom 28  
    W starych płytach głównych było gniazdo ISA o identycznym rastrze wyprowadzeń. Składało się z dwóch części, z których jedna miała 62 pin (czyli o 2 więcej, niż gniazdo pegasusowe). Niedawno zakupiłem na Allegro kilka takich gniazd. Wystarczy wyciąć nadmiarową parę pinów i mamy doskonałe gniazdo pod Pegasusa. Wsad i program udostępnie jak dodam do nich wszystkie zamierzone funkcjonalności (m.in. wbudowany heksedytor do poglądania odczytanych danych czy deasembler ułatwiający rozpoznanie, jak działa dany maper).
  • #5
    BigBoyPL
    Poziom 10  
    Zastanawiałem się nad jedną rzeczą ;] Jeśli są jakieś bardziej zautomatyzowane zgrywarki które same wiedzą jaki mamy typ romu i same zgrywają go do odpowiedniej formy, co się stanie jeśli podepniemy coś typu Retrovision i spróbujemy zgrać grę ;]
  • #6
    Gloomwing
    Poziom 17  
    phanick napisał:
    Ponieważ dupowanie ROMów przez wyklikiwanie jest dość czasochłonne
  • #7
    admak1
    Poziom 1  
    Szacunek z opracowanie tematu : )
    Mam pytanie – czy istnieje podobne opracowanie kartridża do Super Nintendo (SNES) ?
    Jak można wejść w oprogramowanie NES/SNES aby np. zwiększyć ilość żyć ?
    Pozdrawiam