Hey, welcome again!
This time i want to share my Mega Drive flash cart made of old BIOS chips. I made it because my Sonic cart was not working since always. I used Arduino, Python and a bit of Processing (nice to show visual info) to programm. Sorry for the bad pictures and a good reading!
The patient
I have my Mega drive since 12, (I have 20 now). One of the games I got with it was ‘Sonic the hedgehog’, but it never worked well, in the begining it bugged only in the ‘Marble Zone’ stage, and then it started to show the messages saying “illegal instruction” after reset. So i never had the chance to play the others stages than the first, but this changed this week…
The victims
So, what is the thing with these flash carts? They are flash, don’t they? I have a pile of old tech and scrap here in the house, and these days I discovered these flash memories, they are in a lot of things: DVD players, Printer boards and old computers. The memories I found were EN29F040, 39v040 and others, but only one with parallel interface was the EN29F040.
I already saw people making Game Boy flash carts, they use exactly these kind of memories, but they are smd format. The only one memory I had, was a 8 bit memory, so i needed at leats two of them as the Mega Drive uses a 16 bit data bus.
Thinking, I found out that these memories are used in some really old computers, like the giant bunch of trash we have in university. I was in there and had harvest the most memories I could, that means 6, that was the number of memories that I could find. The memories used in the these motherboards are most 256KB or 2Mbit with 8 bit data bus.
I find the following memories:
ASD AE29f2008
EON 29f002
Winbond W49F002u
Macronix 28f1000
2x SST 39s020
Who designed this board maybe never thought i would do this.
The plan
Ok. Now I have the memories(flash, not childhood), but they are 8 bit memories, and the Mega Drive is a 16 bit video game, what to do now?The answer is simple: Just use two chips.
I learned that in my microprocessors classes, if you want to make a memory with a 2n bits data bus from two memories with a n data bus, just share the addresses, write, enable, and read lines between the two, simple.
The procedure.
The first thing I did was stack the memories and solder them in the lines we talked before, VCC and VSS, leaving only the data pins unsoldered.
The data pins aren’t soldered.
16 bit memory. Done.
The pinout for the memory i’m using:
Then desolder the faulty chip from the Sonic cartridge. That was simple.
Original and faulty chip removed, I also changed the capacitors.
Someone has already made a pinout of the Sonic chip, what a luck, In this link you can found a lot of info about genesis development.
Knowing this, i rewired every pin on the flash memory to theiir places on the original ROM. It’s not be most beautiful thing you will see today, but gave me expected results.
I used the data pins D7-D0 from one of the memories as D15-D8 on the cart.
mensagem do dia dos namorados em espanholCart made.
The thing was built, but his souls was still BIOS programs, i just needed to put 4194304 new bits on their places.
Connecting the wires.
I had the cart in hands, how to test If it was working at least?
Yeah, I could use a ATmega8 in a protoboard and some 595s to control the eighteen addresses, sixteen data and three control pins. Hey! I could use only NAND gates! Just kidding, I used my Arduino Mega.
Another thing from scrap was the ISA slot that I got from a old motherboard. The ISA slot, its largest sub-slot (that word exists?) actually, has 2×31 pins and the Mega Drive cart slot has 2×32 pins, the good thing is that the last pins are a redundant ground an unconnected pin, so the ISA slot can be used fine.
I used the pins 14-29 to data, 30 -50 to addresses and 51-53 as output enable, chip enable and write enable.
Sorry for the bad photo.
Programming.
I made the cart in one afternoon, thinking that I could finish the software before the day after, completely wrong, I know nothing…
I used three software pairs:
1 – Test software, the standart Firmata example on the Arduino and an adaptation of one of the Firmata examples in Processing, that let me access every word on the chip and see what was programed in the chip, if the words were equal to the ones on the ROM and test if all the lines were connected right and if they were working.
https://dragaosemchama.com/texto-de-9-meses-de-namoro-para-seu-namorado/This is the begining of the ROM header, 0x5345 can be read. That is Ascii ‘SE’ from ‘SEGA MEGA DRIVE’.
2 – Dumping software, well this was a learning trip, why not use the hardware to read ROMs? This also let me if the ROM image programmed is working. It’s composed by a Arduino code that read the words on the cart and send them as bytes to computer, and a python script to receive the bytes and save them in a file.
3 – Burning software, the burning software is composed by a python script that read a file in the ‘.bin’ format and sends them to the Arduino, and an Arduino code to receive the bytes and put them in their places on the flash.
All the codes used can be found namorada de ludmilla cantora. Please, don’t expect beauty.
It’s alive!
To my surprise, the cart works very well, no bugs or “illegal instruction” messages as with the old chip.
Below it is a video of the thing working, I am not really good, but at least I can reach Spring yard stage now without the old bugs.
Muito legal! Ficou da hora e a trabalheira valeu a pena hehehe
Obrigado. Valeu a pena sim, agora eu seu um bocado sobre esses video games antigos.Poder jogar Sonic depois de todo esse tempo é algo indescritível.
Já tentou compilar outro jogo neste mesmo cartucho para ver se da certo? Muito legal, parabéns.
Muito obrigado.
Só gravei o Sonic mesmo, mas qualquer ROM poderia ser gravada, desde que esteja no formato binário(.bin) e que seja menor ou igual a capacidade do cartucho (512KB).
But, source files are missing. :-)
Sorry. I fixed that.
I can download them now.
Thank you !
Vc está estudando engenharia da computação ou algo parecido? No mais, muito da hora o trampo haha
Ah, muito obrigado.
Na verdade eu faço engenharia elétrica, mas tenho uma paixãozinha por computadores haha.
Programação geralmente eu tenho que estudar por mim mesmo ou pedir ajuda aos meus amigos integrantes do site que fazem todos engenharia da computação.
Obrigado pela leitura.
Haha, desconfiei que era algo do tipo… Da hora, vai ser um bom engenheiro kkk.
Muito obrigado!
Hummm… legal, mas.. soh pra saber não era mais facil e pratico usar uma eprom 27C322?? tem a mesma pinagem do cartucho e praticamente o mesmo endereçamento, iria poupar uma mao de obra extrema e ficaria mais “apresentavel”
Sou graduando em engenharia elétrica pela Unicamp, e achei fantástica sua ideia. acabei parando aqui na página ao buscar algumas referencias no google sobre memórias, para a disciplina de sistemas embarcados. Eu só queria entender melhor como funciona a última parte que você fez, a gravação do jogo em si na memória, o arquivo bin. Fiquei com vontade de reproduzir sua experiência aqui em casa, até porque tenho um megadrive aqui em pleno funcionamento. Abraços
Ola Matheus, muito obrigado.
Desculpa pela demora, mas se ainda esta interessado, a gravção na memoria é bastante simples.
O que me guiou pelo processo foi apenas o datasheet das memorias que usei.
O Arduino foi utilizado para controlar as linhas de enderço, dados e controle da memória, aproveitei as muitas portas do Mega pra controlar os chips diretamente, mas registradores de deslocamento podem ser usados pra controlar o baramento de endereco.
Quanto ao chip, diferementemte de memorias RAM, apenas um pulso no pino WR não é suficiente para gravar um dado, sendo necessario uma sequencia de bytes para “desbloquear” ou permitir a gravacao de um byte.
Do meu código:
writeWord(0x5555,0xAAAA);//these comands enable writing
writeWord(0x2AAA,0x5555);
writeWord(0x5555,0xA0A0);
writeWord(i,wordData); //the data itself
Espero que tenha ajudado, mas se desejar especificar melhor sua duvida, pode responder aqui.
Abraços.
can be use EN29LV640 (4Mx16bit) ?
Hi Ozam. I am not sure, but I guess LV memories are 3.0V. The mega drive is a 5V system, I think I have seen people use this kind of memory despite this. But you have to feed it 3.0V. This can be done with a regulator, however its adress pins will be exposed to 5V.
This said, we are not responsible for whatever happens. Good luck o/
Estou montando um cartucho flash de Atari, supostamente teria como fazer o cartucho ler a imagem da rom gravada na própria eeprom do arduino?
Olá Hans.
Resposta curta: Não.
A memória eeprom de um arduino convencional é apenas 1KB. Mesmo que você grave a rom na flash do arduino, o arduino roda a 16MHz e o Atari a 1MHz. O que significa que você teria mais ou menos 16 instruções assembly pra trabalhar por cada ciclo de clock do Atari. Isso pra ler as gpios do arduino, processar a localização do dado, pegar na memoria e colocar na gpio.
Vale muito mais a pena utilizar uma memoria flash como fiz nesse caso do mega drive.
Robson