ROM-Reader for Super Nintendo / Super Famicom Game Cartridges

RyoHazuki:
Ok, so i just need to plug it directly on these pins right?

Yep!

Some updates:

I have written code to flash a N64 Gameshark in case it's bricked or just for updating if it doesn't have a parallel port.

And I also have compiled a parts list for 10 Cart Readers(without battery addon) for ~$300 which brings the price per Cart Reader down to $30 thanks to falling prices, economy of scale and the Winter Sale on Aliexpress right now.

Perfect for a group buy, a retro community or a maker space. One of you needs a 3d printer and one a PIC programmer.

Nice work sanni!

I sent you some GS files to test. :wink:

I ran into a strange issue just now attempting to dump my collection of GBA games.

My cart reader is on the latest version of it's firmware at the time of this post, version V2.6 from Jan 18, 2019.

I tried dumping all of the GBA games I have, both the cartridge and save, and then loaded them in an emulator to check that everything was working, and two games had an issue. The first and second Castlevania games for the GBA (Castlevania: Circle of the Moon and Castlevania: Harmony of Dissonance) had an empty save.

I tried plugging the physical carts into my GBA to check, and the save data was gone there too. I was testing Harmony of Dissonance a few minutes before dumping all of them and saw that the save data was still intact, so it wasn't the save battery having died.

I had backed up my GBA collection years ago using a homebrew application on my Nintendo DS to dump a GBA cartridge's ROM and save data to a SD card, so I dug up those old files and attempted to restore my old save from there using this cart reader, and it worked.

I tried testing it and it seems that any attempt to dump either the cartridge's ROM or save erases the save on the cart and dumps a blank save, although it dumps the rom just fine. It also is able to restore the save from a different source just fine too.

I don't have many GBA games, only about a dozen or so, but these seemed to be the only two games effected. I thought maybe it's an issue with GBA games that use SRAM to save, since those games were uncommon, but the third Castlevania game (which I think is SRAM, but not certain) kept it's save when I dumped it, as did other GBA games that use SRAM like Wario Land 4.

Thanks for the bug report. Does the save also get erased if you just load up the Cart Reader's GBA menu without actually reading the rom or save?

sanni:
Thanks for the bug report. Does the save also get erased if you just load up the Cart Reader's GBA menu without actually reading the rom or save?

Yes it does, I tried testing it and that is the part where it appears to erase the save. I tried putting both carts in and just going to the GBA menu without doing anything, and the saves were erased again.

Furthermore, I tried then restoring my save, and without exiting the GBA menu dumping the ROM and save, and this time it both dumped the save correctly and didn't erase it from the cart. So it seems it's entering the GBA menu that's erasing the save of these two games, and not the actual process of dumping the ROM or save itself.

Could you try if it also erases the save if you just turn on the Cart Reader without actually going into the GBA submenu. Just let it sit on the Cart Reader's main menu for a while and then turn it off again.

To clarify, by "GBA Submenu" do you mean the menu where it's asking you to choose between Gameboy, Gameboy Advance, or GB Memory?

Or do you mean after choosing GBA where it's asking you to read the rom, read the save, restore save, etc?

I tried leaving it at the GB/GBA/GB Memory menu for a bit and nothing happened.

But as soon as I enter the GBA menu and it displays information about the connected cartridge is when the save seems to get erased.

From what I can tell, this screen is the exact moment it seems to get erased, the save remains on the cart until before this screen, and as soon as I see this screen, even if I turn the reader off and don't press any button to go to the next screen, seems to be when the save is erased:

Could you please comment out this line and see if it still erases the save?

This time it should not list the name of the cartridge or any other info.

With that line commented out the information screen still appeared, just all the information in it was empty or listed as "unknown", the save was still erased as soon as that screen was displayed.

Okay, now also comment setROM_GBA(); out and try again, it will still display "unknown" but the question is will it still erase the save.

/******************************************
Setup
*****************************************/
void setup_GBA() {
//setROM_GBA();

// Print start page
//getCartInfo_GBA();
display_Clear();

With the setROM_GBA() line commented out the saves on the cart were no longer erased, although of course I could no longer dump the cart and save.

Ok, luckily setROM_GBA() is only a small function so finding the bug in there shouldn't be too hard. :slight_smile:

So as a first try I would just test if changing the order of the operations fixes the issue.
Could you please change it like so and try again, the stuff we changed in my previous posts needs to be reverted to stock again ofc:

void setROM_GBA() {
// Set Control Pins to Output CS_SRAM(PH0) CS_ROM(PH3) WR(PH5) RD(PH6)
// CLK is N/C and IRQ is conected to GND inside the cartridge
DDRH |= (1 << 0) | (1 << 3) | (1 << 5) | (1 << 6);
// Output a high signal on CS_SRAM(PH0) CS_ROM(PH3) WR(PH5) RD(PH6)
// At power-on all the control lines are high/disabled
PORTH |= (1 << 0) | (1 << 3) | (1 << 5) | (1 << 6);

// Set address/data pins to OUTPUT
// AD0-AD7
DDRF = 0xFF;
// AD8-AD15
DDRK = 0xFF;
// AD16-AD23
DDRC = 0xFF;

delay(500);
}

Swapping those two sets of operations doesn't seem to have had any effect, save is still erased.

I guess the only thing left to do would be to comment out one line at the time until the save doesn't get erased anymore.

Hmm, as someone who has little experience with Arduino, is that safe to do? Nothing in the setROM_GBA function would be setting voltages or anything like that which could damage the reader or the cart if I change it or comment it out?

Hi Sanni
Whenever I try to rewrite cartridges through the "HiROM repro" menu does not work, and I get errors in the "verifying" this only happens when the memory /OE is connected to the /CART. Connecting the /OE from memory to CPU_CLOCK during recording works normally.
Rewrite by the menu "LoROM repro" works normally even with the /OE connected to the /CART.
tested with cartridges with and without SRAM. cart reader v2.6
Any idea?
Thank you :slight_smile:

Cyber_Akuma:
Hmm, as someone who has little experience with Arduino, is that safe to do?

No worries, I'll try to reproduce the error, I got an old spare cart reader I can risk. But normally nothing bad should happen.

SputnikBR:
Any idea?

Can you make a picture of the repro? What flashrom does it use? If it's a 29F032 then it might the busyCheck29F032 function since I didn't add the SNES OE/Cart pin there.

void busyCheck29F032(byte c) {
// Set data pins to input
dataIn8();

// Setting OE(PH1) OE_SNS(PH3) CE(PH6)LOW
PORTH &= ~((1 << 1) | (1 << 3) | (1 << 6));
// Setting WE(PH4) WE_SNES(PH5) HIGH
PORTH |= (1 << 4) | (1 << 5);

//When the Embedded Program algorithm is complete, the device outputs the datum programmed to D7
while ((PINC & 0x80) != (c & 0x80)) {}

// Set data pins to output
dataOut();

// Setting OE(PH1) OE_SNS(PH3) HIGH
PORTH |= (1 << 1) | (1 << 3);
}

sanni:
No worries, I'll try to reproduce the error, I got an old spare cart reader I can risk. But normally nothing bad should happen.

Can you make a picture of the repro? What flashrom does it use? If it's a 29F032 then it might the busyCheck29F032 function since I didn't add the SNES OE/Cart pin there.

void busyCheck29F032(byte c) {
// Set data pins to input
dataIn8();

// Setting OE(PH1) OE_SNS(PH3) CE(PH6)LOW
PORTH &= ~((1 << 1) | (1 << 3) | (1 << 6));
// Setting WE(PH4) WE_SNES(PH5) HIGH
PORTH |= (1 << 4) | (1 << 5);

//When the Embedded Program algorithm is complete, the device outputs the datum programmed to D7
while ((PINC & 0x80) != (c & 0x80)) {}

// Set data pins to output
dataOut();

// Setting OE(PH1) OE_SNS(PH3) HIGH
PORTH |= (1 << 1) | (1 << 3);
}

Great! now works by replacing that part of the code :slight_smile:
yes the memory is at 29f032. I figured it was something with the "OE_SNS (PH3)" tried to edit but without success haha
Thank you Sanni. your cartreader is with every addition getting better and better!

Hello Everyone,

I got my hands on two NP GB Memory cartridges recently, and they all seem to have been rewritten. I'd like to reflash these myself, if possible. It seems this reader/writer is the only way to do it. I have two questions though.

The first is, does anyone know where I can get my hands on the menu file from the GB Memory? I can't find it anywhere, and it seem to be required for Infinest's GB Memory Binary Maker.

Second, is there anywhere I can get my hands on this cart reader preassembled? I recently moved abroad and no longer have the tools or space to assemble a project like this.

Thank you.