Forum: Mikrocontroller und Digitale Elektronik Gameboy (DMG) ROM mit Arduino auslesen


von Olli Z. (z80freak)


Lesenswert?

Hallo,

ich möchte als Übungsprojekt sowas einen ROM Dumper aufbauen. Zur 
Vereinfachung nehme ich ein Spiel welches nur ein kleines ROM ohne MBC 
hat. Hierzu habe ich einen Arduino Mega 2560 und einen Gameslot Adapter 
zur Verfügung. Elektrisch sollte das kein grosses Problem sein, 
Anleitungen für Dumper gibt es reichlich im Netz.

Leider geht aber keiner auf das Timing der Signale ein. Wann muss was 
anliegen? Auf den ROM Bausteinen im Spielemodul ist keine offizielle 
Bezeichnung vorhanden, so konnte ich nochts finden. Ich könnte mir 
vorstellen, das man zuerst die Datenleitungen auf Input stellen, die 
Adressleitungen anstellen, dann RD auf Low und die Daten am Bus 
einlesen.

Ein erster Test ging aber schief, ich erhielt entweder Datenmüll oder 0. 
Auch extrem hohe delays zwischen den Phasen gaben kein stabiles 
Ergebnis. Um zu wissen das die Sache funktioniert habe ich die Bytes des 
Logos ausgelesen, da diese bei jedem ROM gleich sind und an einer 
definierten Stelle liegen.

von Michael U. (amiga)


Lesenswert?

Hallo,

klingt erstmal richtig. Alle Leitungen des Moduls so wie in irgendeinem 
Beispiel beschaltet? In der Luft hängende Leitungen können nette Efekte 
verursachen, ich kenne die Module nicht.
Timing kann eigenlich kein Problem sein, es sei denn Du programmierst in 
Assembler...

Die Zugriffszeiten üblicher Roms lagen höchstens bei 200-300µs.

PS:
http://hackaday.com/2011/05/09/avr-gameboy-dumper/

Gruß aus Berlin
Michael

: Bearbeitet durch User
von Soul E. (Gast)


Lesenswert?

Olli Z. schrieb:

> Leider geht aber keiner auf das Timing der Signale ein. Wann muss was
> anliegen? Auf den ROM Bausteinen im Spielemodul ist keine offizielle
> Bezeichnung vorhanden, so konnte ich nochts finden.

Guck Dir das Timing von einem 27C256 an. Das ist die programmierbare 
Variante eines 32k ROM-Chips.

Neben /RD (/OE) muss es noch eine zweite Leitung (/CE) geben, die auf 
Low gelegt wird.

von Andreas (Gast)


Lesenswert?

Hallo!
Schau doch mal bei  http://reinerziegler.de/index.html  vorbei. Ich 
hatte damals ein Lesegerät an der parallelen Schnittstelle gebaut. Die 
Quellen waren offen. Gruß Andreas

von Route_66 (Gast)


Lesenswert?

Michael U. schrieb:
> Die Zugriffszeiten üblicher Roms lagen höchstens bei 200-300µs.

Ringkernspeicher oder kein sicheres Gefühl für Zehnerpotenzen?

von Michael U. (amiga)


Lesenswert?

Hallo,

Route_66 schrieb:
> Michael U. schrieb:
>> Die Zugriffszeiten üblicher Roms lagen höchstens bei 200-300µs.
>
> Ringkernspeicher oder kein sicheres Gefühl für Zehnerpotenzen?

vermutlich, KRS4201? ;)
... natürlich ns...

Gruß aus Berlin
Michael

von Stephan H. (stephan-)


Lesenswert?

Warum wird wohl nix auf dem Chip drauf stehen ?
Warum sollte es ein Datenblatt zum Modul geben ?
Arduinos ersetzen nicht die Kenntnisse über Elektronik.
Ein ROM läßt sich auch mit 2 Zählern einem Taster und 8 LED auslesen 
wenn man viel Langeweile hat.

Er kann auch mehrere Sekunden warten und das Datum einlesen.
Langsamer geht immer. :-)

: Bearbeitet durch User
von Sebastian V. (sebi_s)


Lesenswert?

Olli Z. schrieb:
> Leider geht aber keiner auf das Timing der Signale ein. Wann muss was
> anliegen? Auf den ROM Bausteinen im Spielemodul ist keine offizielle
> Bezeichnung vorhanden, so konnte ich nochts finden. Ich könnte mir
> vorstellen, das man zuerst die Datenleitungen auf Input stellen, die
> Adressleitungen anstellen, dann RD auf Low und die Daten am Bus
> einlesen.

Die Module sind da recht flexibel. Wenn der Gameboy Instructions von der 
Cartridge ließt bleibt RD oft ganze Zeit auf Low und nur die Adressdaten 
ändern sich. Was das Timing angeht haben eigene Messungen gezeigt, dass 
der Gameboy ca. 450ns nach einer Adressänderung die Daten ließt. Bei 
Gameboy Color Spielen im Double Speed Modus doppelt so schnell.

soul e. schrieb:
> Neben /RD (/OE) muss es noch eine zweite Leitung (/CE) geben, die auf
> Low gelegt wird.

An den Chips vielleicht irgendwas mit dem CE Pin am Pinout der Cartridge 
war merkwürdig. Ich glaube den CE Pin braucht man nur wenn man vom SRAM 
in der Cartridge etwas lesen möchte, aber auch nicht bei allen Modulen, 
denn einige Module haben diesen Pin gar nicht angeschlossen. Da kann ich 
heute Abend nochmal in den Code meines eigenen Cartridge Dumpers 
schauen.

: Bearbeitet durch User
von Soul E. (Gast)


Lesenswert?

Sebastian V. schrieb:

> An den Chips vielleicht aber am Pinout der Cartridge gibt es schon kein
> OE Pin und einen CE Pin findet man zwar in manchen Bildern die man so
> online findet aber irgendwas mit dem CE Pin war merkwürdig.

/OE liegt auf Pin 21 der Cartridge, /OE auf Pin 4. Zum Lesen müssen 
beide low sein. Pin 6..20 ist die Adresse (A0..A14), Pin 22..29 die 
Daten (D0..D7)

von Sebastian V. (sebi_s)


Lesenswert?

soul e. schrieb:
> /OE liegt auf Pin 21 der Cartridge, /OE auf Pin 4. Zum Lesen müssen
> beide low sein. Pin 6..20 ist die Adresse (A0..A14), Pin 22..29 die
> Daten (D0..D7)

Mir ist auch gerade wieder aufgefallen das OE und RD ja das gleiche 
sind. Ich denke du hast auch einen Tippfehler und wolltest sagen Pin 21 
ist CS? So kann man das zwar auch sehen weil alle Adressen <0x8000 
irgendwas im ROM entsprechen.

Edit: Ich sprach vorhin von dem CS der häufig als Pin 5 am Pinout der 
Cartridge aufgeführt wird. Dieser Pin ist wie gesagt merkwürdig da er 
selten angeschlossen ist und scheinbar nur beim Auslesen des SRAM 
benötigt wird.

: Bearbeitet durch User
von Soul E. (Gast)


Lesenswert?

Sebastian V. schrieb:

> Mir ist auch gerade wieder aufgefallen das OE und RD ja das gleiche
> sind. Ich denke du hast auch einen Tippfehler und wolltest sagen Pin 21
> ist CS?

Richtig, das erste /OE auf Pin 21 sollte ein /CE sein

> Edit: Ich sprach vorhin von dem CS der häufig als Pin 5 am Pinout der
> Cartridge aufgeführt wird. Dieser Pin ist wie gesagt merkwürdig da er
> selten angeschlossen ist und scheinbar nur beim Auslesen des SRAM
> benötigt wird.

/RAMCS ist Pin 5 und /WR ist Pin 3. Die Module mit RAM haben aber 
eigentlich alle einen Memory Bank Controller an Bord, und dann wird's 
komplizierter.

von Sebastian V. (sebi_s)


Lesenswert?

soul e. schrieb:
> Die Module mit RAM haben aber
> eigentlich alle einen Memory Bank Controller an Bord, und dann wird's
> komplizierter.

Nur unwesentlich. Von 0x0000 bis 0x3FFF liegt eh immer ROM Bank 0. Den 
Rest muss man dann umschalten wenn man die komplette Cartridge lesen 
will. Aber wenn das Lesen erstmal klappt ist das schreiben zum ROM Bank 
wechsel auch schnell gemacht.

von Olli Z. (z80freak)


Lesenswert?

Erstmal vielen Dank fürd die rege Beteiligung!

Ich habe jetzt mal ein paar Module meines Sohnes (der Arme ;-) geöffnet 
und angesehen.

Das einfachste hat nur einen Chip (ROM) und dort sind einige Pins des 
Slot garnicht belegt. Dort ist nur die /RD Leitung, sowie einige 
Adressleitungrn und natürlich die Datenleitungen belegt

Das einfache Modul habe ich dann über ein Breadbord so verschaltet, das 
es nur Betriebsspannung hat. Die Adressleitungen habe ich nach 
Binärmuster mit der Adresse 0x104 beschaltet. Die /RD Leitung mittels 
Pullup auf VCC und via Taster gegen GND. Die Datenleitungrn lasse ich 
mir über einen 74541 (non inverting buffer) auf LEDs anzeigen.

Ohne gedrückte RD-Taste zeigen sich teils wild blinkende Bitmuster am 
Datenport. Sobald ich die RD auf low ziehe kommt ein stabiles Bitmuster, 
welches exakt dem erwarteten Wert dieser Speicheradresse entspricht 
(0xCE). Soweit alles gut.

Als nächstes werde ich dann die Adressleitungen und das RD vom Arduino 
ansteuern lassen und das Datenwort zurücklesen. Passt das, kann ich ja 
das Tastverhältnis des RD solange reduzieren, bis ich nicht mehr die 
erwartete Antwort erhalte. Dann hätte ich meine Minimalzeit.

Grundsätzlich sollte aber doch die Z80-CPU aufschluss über das Timing 
geben, denn an ihr sind die Module ja angepasst...

von Michael U. (amiga)


Lesenswert?

Hallo,

auch wenn ich oben ein peer Zehnerpotenzen dazugeschullt hatte...
Mehr als 500ns Zugriffszeit gab es da nie.
Adressen ran, warten (Vorhaltezeit), /RD auf L, warten (Zugriffszeit) 
und lesen.

Ich habe mal vor ein paar Jahren von einem DDR-Schachcomouter die Roms 
mit einem Mega32 ausgelesen, Leitungen an den vorhandenen Testverbinder, 
den Z80 mit HALT in TriState geschickt, Daten gelesen und als Hex-Dump 
oder BIN-File zum PC geschickt. BIN-File mit XModem, da kann man das 
einfach in 128Byte-Blöcken lesen und rüberschicken. Die Sourcen gibt es 
noch, wäre aber in Assembler/AVR-Studio.

Gruß aus Berlin
Michael

: Bearbeitet durch User
von Olli Z. (z80freak)


Lesenswert?

Das mit dem 74HCT541 war keine gute Idee. Anscheinend zieht die Led 
ihren gesamten Strom durch den Buffer vom Eingang, also vom ROM :-(
Hat gottseidank überlebt da ich nur eine angeschlossen hatte...

Dann habe ich die Adressleitungen an die Ports A0-A15 des Mega geklemmt. 
Sind zwar eigentlicht für Analogeingänge, aber dem Atmega ist das 
wurscht, der kann die Ports auch als digitale Eingänge schalten.

Die Datenleitungrn an Port A und die RD an Pin 40. Beim ersten 
Leseversuch via Software habe ich wieder das Problem gehabt, das nur 
0x00 zurück kam. Dann aber hab ich meinen Fehler gefunden, ich habe zum 
lesen versehentlich "val = PORTA;" geschrieben anstelle "val = PINA;".
Dann ging alles und ich konnte Title, etc. auslesen.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.