Gravador de EPROMS – Arduino Mega

English version here

Intro

Meu console de infância foi o Mega Drive, mas faz um tempinho que tenho um snes em casa. Achei um anúncio barato e acabei por comprar, apesar de não vir com jogos exceto por um bootleg de Mortal Kombat.

Okay, agora eu possuo um Super Nintendo, yay! Que nostalgia!

Mas e os jogos? Okay, talvez procurando no mercado livre. Pesquisando, achei anúncios de cartuchos repro como os seguintes:

untitled

145 reais!?? wtf

Então. Um cartucho repro não é um original. Esse tipo de exploração irrita.

Como se faz um cartucho repro (geralmente)?

  • Pega-se um cartucho tosco (aqueles de esportes principalmente)
  • Grava-se uma EPROM com a ROM desejada.
  • Substitui-se a ROM do cartucho pela  EPROM gravada

Depois vendem à preço de original, que bad.

Okay, mas então porque nem todo mundo faz suas próprias repros? Porque um gravador não é tão barato. Willen e afins podem sair bem fora do preço pagável. Também tem os gravadores chineses mas esses ainda não saem barato(~300R$). Tudo tem uma relação custo-benefício, e a galera Maker/Hacker entende bem disso, como criar ferramentas super úteis com materiais baratos.

Em 2014, eu consertei um cartucho de Mega Drive usando uns chips de BIOS que achei na sucata. Gravar memórias flash não é trivial, há um certo algoritmo, mas ainda sim é um processo relativamente simples. Talvez gravar Eproms não fosse complicado.

Gravador

Uma EPROM também não deixa de ser uma memória. E são ainda mais fáceis de se gravar que memórias flash. Para se gravar um byte numa EPROM basta selecionar o endereço através dos pinos A0, A1, A2…em diante; colocar o byte a ser gravado nos pinos Q0, Q1, Q2…etc e dar um pulso com uma alta tensão (13V) no pino Vpp. O problema é fazer isso pra 8*1024*1024=8388608 endereços. Mais informações no datasheet da Eprom 27C801.

Eu já usei Arduino para gravar vários tipos de memória. Porque não tentar também EPROMS? Além disso, Arduino são super baratos (Ebay/Ali express). Mas claro, não precisei comprar um Arduino apenas pra gravar memórias, já tenho alguns aqui em casa que uso pra todo tipo de coisa.

Abaixo um esquema que eu bolei pra o gravador:

schematic

Esquemático para o gravador de Eprom com Arduino.

Ah, a eprom precisa ser alimentada com 6V quando for gravada (5V quando for lida). Por isso o regulador LM317 acima. Na prática usei um jumper para escolher manualmente a tensão de alimentação. O potênciometro no regulador deve ser ajustado a fim de se obter os 6V na saída. Além disso, o pinout do LM317 é bem confuso, bom checar o datasheet antes de montar o circuito.

Montei o circuito em um shield de prototipagem, com um socket ZIF. Assim fica fácil de colocar e tirar a memória do gravador. Os 13 volts são providos por um módulo boost, mas possivelmente uma fonte 12 volts pode ser usada (daí testar já fica a cargo do leitor). Usei um boost porque assim tudo fica alimentado pela USB.

img_20160828_173037268Shield gravador de Eprom (Incompleto, faltavam ainda os transistores)

Beleza. Hardware sem software nesse caso não rola. Python for the win. O script em Python lê os dados de um arquivo e envia pro Arduino pela serial, que recebe os dados e grava na memória, tudo muito simples.

$ python3 eprom.py 
===========================================
           What do you want do do?         
                                           
              1-dump                       
              2-burn                       
              3-info                       
                              2016         
                                  Robson C 
===========================================

As memórias que tenho aqui eu comprei no Ebay, cerca de 2$ cada uma.

Os arquivos do projeto estão disponibilizados no meu github.

Agora você já sabe que é possível gravar eproms apenas com um Arduino Mega e alguns componentes adicionais ;). Abaixo algumas fotos do projeto.

Fotos

img_20160906_153952614Eprom gravada, em um cartucho.

img_20160911_163622728Shield finalizado. Adaptei o código pra gravar memórias flash também. Mas ainda tem alguns bugs. De qualquer forma o código está no meu github também.

zZelda no cartucho acima.

hm

Harvest Moon.

eraser

Apagador de Eproms que uso. Eproms são apagadas com luz ultravioleta apenas.

behind

Verso da placa com todas as ligações.

Considerações Finais

  • Favor não utilizar esse trabalho de forma comercial
  • O Dragão não disponibiliza ROMs ou tutoriais sobre ROMS.
  • Se divirta

Aproveita e mostra o post pra alguém que curta SNES/Arduino e tal ;)

Até um próximo post o/

Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial 3.0 Unported License.

 

 

 

Robson Couto

Recentemente graduado Engenheiro Eletricista. Gosto de dedicar meu tempo a aprender sobre computadores, eletrônica, programação e engenharia reversa. Documento meus projetos no Dragão quando possível.

52 thoughts to “Gravador de EPROMS – Arduino Mega”

    1. Olá Carlos.
      Obrigado pelo comentário. Alguns cartuchos necessitam de chips especiais. Por exemplo Mario Kart, Star Fox, Super Mario RPG, Yoshi Island e por ai vai. Versões japonesas ou versões que usam mesmo chip possuem compatibilidade entre si e podem ter suas ROMs trocadas.
      Há ferramentas e sites pra listar as características dos cartuchos (ROM, SRAM, capacidade e chips especiais). Cartuchos especiais precisam de doadores especiais. Além disso a 27c801 tem capacidade de 1 MB, podendo ser substituída sozinha ou em dupla pra 2MB (Harvest Moon usa duas, por exemplo).

      1. Cara, isso é muito legal!

        Eu faria o seguinte, um cartucho japonês custa bem menos que um cartucho americano. Por exemplo, o Super Mario RPG. Então faria a troca da ROM japonesa por uma EPROM com a ROM americana, e então trocaria o PCB com um cartucho americano. Em teoria, teríamos um cartucho original! ( ͡° ͜ʖ ͡°)

        Brincadeira a parte, obrigado por partilhar estas informações! Sucesso aí, Robson!

    2. Boa tarde.
      Nosso amigo ai do post mandou bem na alternativa do Arduíno (Parabéns) pra quem não tem condição de adquirir aquele joguinho favorito.
      Carlos… Parabéns pelas informações apresentadas no post da Wiki. Contem informações que como jogador da época em que vi a Nintendo crescer que nunca havia se lido. Parabéns mesmo.
      Att

      Thiago Zanoni

  1. Boa noite, otimo artigo, eu tb to gravando alguns usando um gravador genius g540, uma duvida vc ja tentou fazer com epreom maiores como a 27c160 e 27c322 ? queria aprender gravar nelas

    1. Olá Angelo. O raciocínio é exatamente o mesmo. Porém os outros 8bits da eprom precisam ser conectados. e tambem seria necessário uma pequena modificação no código da serial pra se adequar a 16 bit.

  2. Olá, obrigado pelo artigo. Eu procurava algo parecido nas comunidades de fora, mas só coisa bem separada.
    Fiquei com algumas dúvidas e postarei aqui, caso possa ajudar, visto que, apesar de ser um graduando em engenharia de computação, tenho uma pequena experiência com arduinos, visto que foquei em fpga. Logo, pelo humilhante sua assistência.
    O modelo de arduino utilizado pode ser um clone uno r3?
    O adaptar utilizado vende completo ou precisa ser montado?
    Eu adquiri um outro adaptador tipo SOP44 para memórias usadas no Mario RPG, será difícil adaptar para este projeto?
    Você conhece algum site que liste qual tipo de memória pode ser utilizada e em qual placa?
    Agradeço desde já.

    1. Olá Rapha.
      1-Bom, o modelo pode sim ser outro Arduino, mas você precisa expandir o numero de portas, para isso geralmente é usado o 74HC595. A vantagem do Arduino mega é que este possui muito mais pinos que o necessário nesse projeto.
      2-Adaptador? Você quer dizer o socket? O meu é de 40 pinos, apesar de só usar 32. Vem pronto pra se soldar na placa.
      3-Sim, acredito que seja quase impossível de se adaptar seu socket. As memórias que uso são maiores. No entanto barra de pinos fêmea pode ser usadas sem problema. Procure por female pin header no google.
      4- Não, porém os snes central (http://snescentral.com/system.php) lista informações sobre várias pcb usadas em cartuchos, além disso há ferramentas que analisam o arquivo de ROM de um jogo e lista várias informações presentes na ROM, como tamanho da ROM, chips especiais, SRAm e etc.
      Espero ter ajudado.

      1. Obrigado pela pela informação do arduino, vou tentar achar um em conta.
        Sim, eu me referia ao socket, ele vende separado da placa? E qual é o modelo dele e da placa?

        O adaptador que me refiro para o chip do Mario Rpg é este :
        PSOP44 – DIP44/SOP44/SOIC44/SA638-B006 IC test socket adapter SDP-UNV-44PSOP
        http://s.aliexpress.com/NZvQ77Z3

        Eu ainda estou vendo outro adaptador para as memórias de 32Mbit. Gostaria de fazer uma repro de Earthbound.
        http://www.mmmonkey.co.uk/converting-mother-2-cart-to-earthbound/

        A lista achei, só procurar por snes donor cart.

        Obrigado novamente.

          1. Então raph, qualquer Arduino Mega é compatível, sendo original ou não. O post é mais uma prova de conceito que um tutorial, por isso espera-se que o leitor entenda tudo a partir do texto então não coloquei uma lista. Mas claro, ajudo com o que puder.
            Então, esse gravador grava apenas memórias 8bit. Se for gravar outras memórias além da 27C801 podem ser necessárias modificações no circuito ou código, desde que sejam usadas memórias 8 bit. A grande maioria dos cartuchos usa memórias 8 bit, mas acredito que alguns poucos, senão apenas, Super Mario RPG usa uma memoria 16 bit.
            Essa a placa shield de prototipagem que usei: https://goo.gl/FH51Ac
            A memória usada no link que mandou é flash, essas são gravadas diferentemente de eproms, mas acredito que possa usar o mesmo hardware. Já gravei flash com a mesma placa, mas com outro código. Confira meu repositório flash no github.

          2. Robson, muito obrigado pela ajuda.
            Já estou começando a entender melhor o funcionamento.
            Dei também uma pesquisada mais profunda sobre novos códigos e encontrei que um rapaz chamado Sanni fez implementou diversos tipos de códigos para os outros chips, inclusive do Mario RPG, que, perdão pela correção, é de 32Mbit.

            Mesmo que não seja um tutorial, me ajudou bastante e vou pesquisar mais a fundo. Me ajudará até na vida profissional.

            Muito obrigado.

  3. Por nada.
    Então Raph. As memórias são dividas por capacidade (32Mbit=4Mbyte, 16Mbit=2MB, e 8Mbit=1MB) ou largura do bus (8bit ou 16 bit). Meu código (e placa tambem) é apenas para memórias 8bit por enquanto, independente da capacidade. Pra 16 bit são necessarios mais oito pinos no gravador e modificação no código.
    Há outros posts onde explico mais sobre memórias e tal. Veja os posts sobre Game Boy e o do Mega Drive.
    Qualquer outra dúvida só comentar aqui :)

    1. Beleza irmão!
      Eu vou esperar chegar o equipamento e montar, aí as dúvidas vão surgindo.

      A única dúvida que eu ainda tenho são nos componentes que vão na placa de protótipo, além do socket. Não consegui entender com clareza.

      Obrigado!

        1. Olá Raph
          Acredito que esteja se referindo a placa vermelha. Esta é um shield de prototipagem. A minha é essa:https://goo.gl/FH51Ac. Mas é preciso headers macho pra montar, tipo esses https://goo.gl/ep5UyZ
          O regulador de tensão é um LM317 e o modulo boost é esse:https://goo.gl/F4bNMW
          Os transistores sâo 2 bc548 e 2 bc558 e os resistores podem ser tirados da imagem. Esses ultimos são facilmente encontrados em lojas de eletronica

  4. Olá, procurei em placa mãe de computadores e so encontrei memorias flash de 1Mbit, não serve, se eu comprar a 27c801 e quiser regravar uma rom no chip, vou ser obrigado a usar UV ou posso escrever por cima?

    1. Olá Wesley.
      As memórias eprom devem necessariamente ser apagadas com UV antes de serem gravadas. As flash também devem ser apagadas, porém não é necessário UV. Além disso Flash podem ser gravadas a 5V, diferentemente das eprom.
      Há memórias Flash de 8Mbit no ebay, como a AM29F800. Porém nunca usei-as.

  5. Imagina isso com Arduino Uno .. HAHAHAHA é possivel ? tenho um snes e estou engatinhando com Arduino , Gostaria de fazer a eprom de Rock in roll Racing , Porem não tenho o Mega e sim o Uno .. vc poderia disponibilizar algo pra o Uno ou só Funciona com o MEGA ? e parabéns pelo trabalho .. fantástico !

    1. Olá Alersson, muito obrigado! É possível sim usar o UNO, porém são necessários chips como o 74HC595(conversor serial paralelo) ou similares e modificações no código. Usei o Mega porque ele já possui pinos o suficiente pra conectar na EPROM. No ebay ou Aliexpress é possível achar o Arduino Mega a preços acessíveis(em torno de 7 ou 8 dolares), o Arduino não precisa ser original.

  6. Dragão você sabe se poderia fazer cartuchos de gba desse modo?

    Tenho alguns cartuchos aqui que estão repetidos e queria trocar por outros que não acho para venda, você sabe se tem como?

  7. Parabéns! Ficou show, eu andei procurando gravadores de eprom pra comprar para reprogramar uns cartuchos que vieram com meu FAMICOM, mas tudo muito caro. E afastado de projetos que estava essa sua publicação me fez querer montar o meu, fico muito grato. Comprei o Arduino e agora é só aguardar chegar. Se for aparecendo alguma dúvida vou te chamar! Valeu Robson, e mais uma vez parabéns!

  8. Robson, estou precisando gravar umas 27c256 urgente, mas nao tenho conhecimento sobre arduino e phyton haha
    Baixei o datasheet, e entendi como funciona, simplesmente ligo o VPP em 13V, o VCC em 6,5V ( consigui uma fonte regulavel), e os pinos CE e OE sao para o pulso para efetuar a gravacao, certo?
    Estou totalmente perdido no Phyton, ainda consegui baixar a lib serial, mas como adapto seu programa para gravar a 27c256? Ja liguei os pinos da mesma maneira que vc, ate o A14, O7, Vss no ground, VCC e VPP, OE no ARD 2 e CE no ARD3, mas agora preciso de ajuda na parte do programa do arduino e phyton para conseguir efetuar a programacao!!

    1. Olá João.
      Acredito que você pode usar os códigos sem editar.
      Tente não conectar os outros pinos do arduino (A15 em diante) e se me lembro bem, no script python há como escolher o tamanho da eprom. Troque a porta serial no script pra porta no qual seu Arduino estiver conectado.
      PAra encomtrar o nome da porta, se usar windows, use o gerenciador de dispositivos e pra linux use “dmesg | grep tty” no terminal pra encontrar.
      Há alguns exemplos no site da pyserial (https://pythonhosted.org/pyserial/shortintro.html#opening-serial-ports) que podem te ajudar, no windows geralmente é COM1,COM2 etc.
      Muito cuidado, os 13V podem fritar o seu Arduino se forem conectados diretamente a placa, conecte apenas na eprom.

      1. Obrigado pela resposta rapida Robson!
        Vou tentar gravar sem modificar o código.
        Minha principal duvida era se precisaria modificar algo para as portas CE e OE, que parece que são diferentes das usadas no 27C801.
        A OE liguei na ARD2 e o CE na ARD3.
        Pelo datasheet:
        “Programming takes place when:
        c) the OE pin is high, and
        d) the CE pin is low.
        When data and address are stable, a low going pulse on the CE line programs that location.”
        Posso simplesmente rodar o código assim, que deve dar certo?
        Obrigado!

      2. Liguei tudo, e fiz um blank check, e diz que tem coisa gravada. Rodei o programa para ler, e todos os dados sao 01. Rodei sem o OE, sem o CE, sem energia no VCC, e do mesmo jeito, aparecem todos os dados como 01. Rodei ate como sendo chip de 1mb, e da na mesma!

        1. Olá Joao, chequei aqui meu código e vi que voce deve conectar
          OE (output enable)= readPin= 4
          CE (chip enable)= enablePin =2
          Você deve levar em conta que uso o transistor pra aplicar os 13 no pino Vpp apenas quando for programar a eprom, se deixar ligado o tempo todo, há o risco de algo ser gravado acidentalmente dependendo da tensão dos pinos CE e OE. Há a possibilidade de a sua memoria ter sido gravada, mas como as linhas de controle estavam erradas acho improvável.

  9. Boa tarte, meu nome é André.
    Gostei do projeto, estou tentando fazer, baixei os programas, mas para efeito de teste gravei no uno, pois ainda não tenho o mega, mas ao executar o codigo no pyton deu esta msg.

    ==== RESTART: C:\Users\Windows\Desktop\eprom-master\eprom-master\eprom.py ====
    Traceback (most recent call last):
    File “C:\Users\Windows\Desktop\eprom-master\eprom-master\eprom.py”, line 2, in
    import serial,time #You need the pyserial library
    ModuleNotFoundError: No module named ‘serial’

    eu tenho que instalar alguma library no pyton como no arduino? e como eu vejo onde configura as portas “com” no codigo pyton, não localizei.
    Obrigado.

    1. Olá André.
      Você deve instalar o pacote pyserial. Eu uso Linux e o processo é bem trivial, mas não sei o processo para instalação no Windows. Tente “pip install pyserial” no prompt de comando (cmd).
      Para escolher a porta, apenas troque ‘/dev/ttyACM0’ no código eprom.py para COM2, ou qualquer que seja o número da sua porta.
      Para mais informações sobre a PySerial, acesse https://pythonhosted.org/pyserial/shortintro.html#opening-serial-ports

      1. Olá Robson,
        Alterei a porta e instalei o pyserial, deu certo!
        O software ja conecta com o uno, agora esperar chegar o MEGA e a placa de prototipagem para fazer o hardware.
        Obrigado por enquanto.
        vlw

  10. Muito bom, vou criar um vídeo no YouTube dando créditos para o seu trabalho e linkando para a sua página, bom trabalho ;) tenho apenas uma dúvida: no esquema que criou, onde indica “ar5” (liga ao pnp e ao npn para alimentar os 5v ao vpp), não deveria ser “ard4”?

    1. Olá Filipe
      Correto, o certo é o pino digital 4 do Arduino.
      O esquema eu fiz depois do circuito, só pra postar aqui mesmo.
      Fique atento aos pinos que estão listados no código, estes estão corretos.
      Robson

        1. Olá Filipe.
          O pino 3 deve estar em 5V apenas durante as gravações na memoria. Quando esse é colocado em estado alto (5V), a tensão no pino (G/Vpp) é 13V. Já tentou verificar se seu arduino está com esse pino funcionando corretamente?
          Robson

          1. Sim, se apagar a programação do Arduino, o pin 3 fica desligado (low), mas assim que o programo, o pin 3 fica em constante high

  11. Felipe
    Tem razão. No setup(), onde tem:
    programMode();
    substitua por
    readMode();
    Eu posso ter feito alguns testes e deixado isso no código, porém não há chance de a memória ser gravada mesmo assim, por causa do estado dos outros dois pinos.
    Obrigado por avisar

      1. Não estou a conseguir, será que há mais algum erro na programação? Já chequei várias vezes o circuito mas está tudo ok… quando tento gravar, indica-me este erro:

        Please insert a number:2
        What’s the name of the file?sb2.bin
        sb2.bin
        Writing data. Current porcentage:0.00%
        could not get a response, please start again

        Traceback (most recent call last):
        File “C:\Users\Portátil F&T\Desktop\Filipe\EPROM\eprom-master\eprom.py”, line 101, in
        response=ord(ser.read(1))
        TypeError: ord() expected a character, but string of length 0 found
        >>>

        E quando tento ler ou fazer um blank check, indica percentagem a 0% várias vezes até desligar.

        1. Olá Filipe.
          O seu Arduino não está respondendo aos comandos na serial.
          Fiz os testes(leitura e blank check) com o código de esta disponível no github e funcionou corretamente aqui.
          Tente diminuir a velocidade da serial pra 9600 no Arduino e script Pyhton apenas para conferir. Caso funcione vá aumentando até conseguir uma velocidade que seja rápida, mas confiável.
          Mesmo que o circuito não esteja correto, o Arduino deve responder a serial.

          Robson

  12. Aigo, estou com esse problema ao rodar o script em python no meu pc, eu tava adaptando tudo pra grava ruma 27c512 que tenho aqui, mas mesmo rodando todo o programa original eu nao consegui fazer funcionar, pode me ajudar?

    Traceback (most recent call last):
    File “eprom.py”, line 5, in
    ser = serial.Serial(‘/dev/ttyACM0’, 250000, timeout=0)
    File “C:\Users\Jorisclayton\AppData\Local\Programs\Python\Python38\lib\site-packages\pyserial-3.4-py3.8.egg\serial\serialwin32.py”, line 31, in __init__
    File “C:\Users\Jorisclayton\AppData\Local\Programs\Python\Python38\lib\site-packages\pyserial-3.4-py3.8.egg\serial\serialutil.py”, line 240, in __init__
    File “C:\Users\Jorisclayton\AppData\Local\Programs\Python\Python38\lib\site-packages\pyserial-3.4-py3.8.egg\serial\serialwin32.py”, line 62, in open
    serial.serialutil.SerialException: could not open port ‘/dev/ttyACM0’: FileNotFoundError(2, ‘O sistema não pode encontrar o caminho especificado.’, None, 3)

    Obs: ja instalei a biblioteca

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *