Neste post vou mostrar meu cartucho flash de Mega Drive feito de chips velhos de BIOS e falar sobre o processo. Eu fiz isso porque meu cartucho do Sonic não estava funcionando desde sempre. Usei Arduino, Python e um pouco de Processing (bom para visualizar os bits e controlar os pinos do Arduino). Desculpe pelas fotos ruins e uma boa leitura!
O paciente
Eu tenho o Mega Drive desde 12, (tenho 20 agora). Um dos jogos que veio com ele foi ‘Sonic the hedgehog‘, mas que nunca funcionou bem. No início só dava defeito na fase ‘Marble Zone’, e depois ele começou a mostrar as mensagens dizendo “illegal instruction” logo após o reset. Então eu nunca tive a oportunidade de jogar as outras fases senão a primeira, mas isso mudou esta semana …
As vítimas
Então, o que há de especial com esses flashcarts? Eles são flash, não é mesmo? Eu tenho uma pilha de sucata aqui em casa, e esses dias eu descobri essas memórias flash, eles estão em um monte de coisas: DVD players, placas de impressora e computadores velhos. As memórias que eu encontrei foram EN29F040, 39v040 entre outras, mas apenas uma delas tinha interface paralela, a EN29F040.
Eu já vi pessoas fazendo flashcarts pra Game Boy, eles usam exatamente este tipo de memórias, mas eles são em formato SMD. A única memória que eu tinha, era uma de 8 bits, logo eu precisava de duas, pois o Mega Drive usa um barramento de dados de 16 bits.
Descobri que essas memórias são usados em alguns computadores realmente antigos, como na pilha de sucata que temos na universidade. Eu tentei colher o maior número de memórias que pude, o que significa 6, que foi o número de memórias que eu pude encontrar. As memórias utilizados nas essas placas-mãe são geralmente de 256KB ou 2 Mbit com barramento de dados de 8 bits.
Encontrei as seguintes memórias:
ASD AE29f2008
EON 29f002
Winbond W49F002u
Macronix 28f1000
2x SST 39s020
Quem criou esta placa nunca pensou que eu iria fazer isso.
O plano
Ok. Agora eu consegui as memórias, mas elas são 8 memórias bit, e o Mega Drive é um videogame 16 bits, o que fazer agora? A resposta é simples: Basta usar dois chips.
Eu aprendi que em minhas aulas de microprocessadores, se você quiser fazer uma memória com um barramento de 2n bits de dados a partir de duas memórias com um barramento de n bits, apenas compartilhar os pinos de endereço(Address) e os pinos de escrita, leitura e ativação (Write, read e enable), deixando apenas os pinos de dados sem compartilhar.
O procedimento.
A primeira coisa que fiz foi empilhar as memórias e soldá-las nos pinos que falamos falamos antes, mais VCC e VSS, deixando apenas os pinos de dados sem soldar.
Os pinos de dados não devem ser soldados.
16 bit memory. Done.
A pinagem das memórias que consegui na sucata:
Depois retirei o chip com problemas do cartucho. Isso foi fácil.
Chip original removido, os capacitores também foram trocados.
Alguém felizmente já havia descoberto a pinagem do chip do Sonic, Que sorte. Nesse link você também pode entender um pouco sobre desenvolvimento de jogos para Mega Drive.
Sabendo disso, eu remapeei cada pino das memórias flash para seu correspondente na ROM original. Não é a coisa mais bonita que você vai ver hoje, mas me deu os resultados esperados.
Eu usei os pinos D7-D0 de uma das memórias como D15-D8 do cartucho.
A coisa estava construida, mas sua alma ainda era de programas BIOS, Eu só precisava colocar 4194304 novos bits em seus lugares exatos.
Fios e Fios.
Eu tinha o cartucho em mãos, como saber se ele funcionava, pelo menos?
Sim, eu poderia usar um ATmega8 em uma protoboard e alguns 595s para controlar os 18 pinos de endereços, 16 pinos de dados e 3 pinos de controle. Ei! Eu poderia usar apenas portas NAND! Brincadeira, eu usei meu Arduino Mega mesmo.
Outra coisa tirada da sucata foi o slot ISA que eu consegui em uma placa-mãe velha também. O slot ISA, ou seu maior sub-slot (existe essa palavra?), tem na verdade, 2×31 pinos e o cartucho de Mega Drive possui 2×32 pinos, a coisa boa é que os últimos pinos são um GND redundante e um pino sem função, de modo que o slot ISA pode ser usado muito bem para conectar um cartucho de Mega.
Eu usei os pinos 14-29 para dados, 30 -50 para endereços e 51-53 como controle, (Write, read e enable).
Desculpe pela qualidade ruim.
Programando.
Eu fiz o cartucho em uma tarde, pensando que eu poderia terminar o software antes do dia depois,estava completamente errado, eu não sei nada …
Eu usei três pares de software:
1 – Software de teste, o exemplo Standard Firmata no Arduino e uma adaptação de um dos exemplos da Firmata no Processing, que me deixa acessar cada word no chip e ver o que está programado, e comparar se os bits são iguais aos da imagem de ROM e testar se todas as linhas estavam ligadas certas e se estavam funcionando.
Esse é o começo da ROM. 0x5345 pode ser lido, isso é Ascii ‘SE’ de ‘SEGA MEGA DRIVE’.
2 – Dumping software, esta foi uma viagem de aprendizado, por que não aproveitar o hardware para fazer backup de ROMs? Isso também me permite saber se a imagem ROM programada está funcionando. Ele é composto por um código Arduino que lê as os bytes no cartucho e envia-os para o computador, e um script python que recebe os bytes e os salva em um arquivo.
3 – Software de Gravação, o software de gravação é composto por um script python que lê um arquivo no formato “.bin” e envia-o pela porta serial, e um código de Arduino para receber os bytes e colocá-los em seus lugares na flash.
Os códigos podem ser encontrados aqui.
E funciona mesmo!
Para minha surpresa, o cartucho funcionou muito bem, sem bugs ou as mensagens de “illegal intruction” como no chip antigo.
Abaixo está um vídeo do cartucho funcionando, não sou muito bom em Sonic, mas pelo menos consigo chegar na fase Spring Yard agora.
É isso, obrigado pela leitura. Até a próxima.
Este trabalho está sobre a licença internacional Creative Commons Attribution-NonCommercial-ShareAlike 4.0.
Poh, mt legal, não manjo dessas coisas, mas isso me deixou curioso para aprender sobre esse assunto, parabéns!
Muito obrigado! Quem bom que incentivei. Todo dia é dia de aprender algo, não é mesmo?
essa parada aí num é lá tão difícil… eu já fiz um esquema parecido mas foi com jogos de ATARI e usei EPROMS antigas mesmo. 27CXXX
Parabéns! Deixe o link da próxima vez.
eu vou tirar um dia pra montar de novo esses “flashcarts” de atari, mas soldando um cabo flat na entrada do cartucho e numa placa que contem a memória ROM e uma porta inversora que será o CS do chip
Parabens pela descoberta, Robson! Agora implemente o que voce conhece de matematica binaria pra fazer um cartucho com 2 ou mais jogos :D
Dica: As eproms e as flashes de 40 pinos tem a mesma pinagem do cartucho (ou bem semelhante) :)
Muito obrigado Alexandre! A coisa mais dífícil é conseguir os chips aqui hahaha. Estou planejando comprar umas flashes(2 ou 4MB) no formato smd e só adaptar pra colocar no slot da ROM antiga.
Robson, depende de onde voce está. Esses chips (de 32 pinos DIP de placa mae) sao muito comuns, praticamente sucata, aqui em SP. As memorias que encaixam direto ai seriam as de 4 digitos (27C1001, 2001, 4001, 8001, 27C160, 27C322) mas sao todas muito caras, o ideal é ir no caminho que voce está mesmo. Boa sorte!
Valeu Alexandre, eu nunca tentei usar EPROMS porque elas, além de serem caras como disse, precisam de tensões maiores que as que o Arduino pode fornecer para serem gravadas, além de que pra apagar é necessário uma luz UV se não me engano.
Era mais fácil ter assoprado a fita!
Hahaha, verdade! Eu tentei até doer a garganta, depois apelei mesmo.
Criamos um monstro…
PS: Deus tá vendo você zoando as portas NAND!
Que é isso professor, longe de monstro ainda.
PS:Hahaha, essa das NANDs é boa.
Muito bom cara, a tempos venho querendo fazer isso pois o flash cart everdrive para mega ainda é muito caro, parabens pela sua descoberta, fez um otimo trabalho.
Muito obrigado Mardex, desculpa o atraso na resposta.
Sim, realmente bem são caros, apesar de serem relativamente simples.
O flashcart de GBA, que é um sistema mais avançado, é vendido no Brasil mesmo até de cem reais.
Mas minha intenção era mesmo consertar o cartucho, ou quem sabe testar se a ideia era possível.
Obrigado novamente e volte mais vezes.
Nossa cara, muito bom, muito bom mesmo! estou começando com eletrônica e Arduíno, fiquei encantado!
Que bom que gostou! Obrigado pela visita.
Posso usar apenas uma flash AT29C020? Mapeando apenas dados do D0 ao D7?
Oi Hans
Infelizmente não. Você pode usar apenas uma memória que já seja 16 bits. O console irá procurar as instruções no bus automaticamente.
Há algumas memórias flash e eprom que já são 16 bit. Há um outro post meu aqui onde explico como gravar memórias eprom com um Arduino
Então Robson, a minha ideia era usar o esquema de mapeamento do conversor de Master para Mega com 1 flash 8 bits apenas. Mas estou com problema com a flash da Atmel, ela funciona diferente da Winbond e mesmo usando seu código como referência tive problemas. Estou tentando arranjar outra pra testar a ideia.
Segue a referencia do esquema do devster.
http://devster.monkeeh.com/sega/sega2sms.png
Oi Hans
Tinha esquecido da possibilidade de usar jogos de master system.
Você viu o meu código no github, né? Recomendo ele pra gravar memórias flash.
Dá uma olhada nesse post tb, é sobre eeproms, mas uso o mesmo shield pra gravar flash.
https://dragaosemchama.com/2016/10/gravador-de-eproms-arduino-mega/
Sobre a sua memória, eu já tive algumas memórias que estavam protegidas e não permitiam gravar novos dados. Claro que as memórias usadas em BIOS não tem esse problema pois o próprio usuário poderia atualizar a mesma.
Valeu pelo esquema!
Se tiver algum problema ou avanço, pode deixar um comentário aqui. Eu posso demorar um pouco, mas sempre respondo hehe.
Bom, muito tempo depois consegui avanços sim Robson. Na verdade montei um DEV Cart usando um arduino nano ligado a flash. Assim consigo reescrever ela apenas conectando o cabo usb ao cartucho.
Boa Hans!
Genial! Que truque você usou para que o arduino não entre em conflito com o Mega?
Um diodo 1N5817 ligado no VIN, assim o arduino só liga quando conectado ao USB para carregar a ROM.
Basicamente usei o Nano conectado a um shift register, que por sua vez vai conectado a CMOS Flash. Quando o arduino não estiver conectado ao USB, a CMOS funciona como uma eeprom de cartucho comum. Ou seja, o Arduino não fica ligando quando o cartucho está conectado ao videogame.
Vou deixar pra você as referencias que eu usei:
Cartucho reprogramado do Raphaël Assénat
https://www.raphnet.net/electronique/genesis_cart/genesis_cart_en.php
Construindo um gravador eeprom com arduino nano (o que você já deve saber):
https://www.youtube.com/watch?v=K88pgWhEb1M
E o dragão sem chama é claro.
Genial! Gostei muito da ideia pra impedir o arduino de funcionar quando o cartucho está no videogame, fico tentado a fazer algo parecido para gameboy.
Também usei esse post do Raphael como referência, o cara manja demais.
Esqueci, vi depois nos marcadores. Esse tópico sobre programar as memórias usando os shift registers ajudou muito também https://forum.arduino.cc/index.php?topic=291015.0
Valeu muito a pena no final, vou ver se monto no Eagle o projeto e compartilho no github. O que deve demorar um pouco pois ainda apanho no Eagle.