Conserto de cartucho de Mega Drive com Chips BIOS antigos.

Olá.
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  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

WP_20150127_13_22_15_Pro

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 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

WP_20150211_12_41_16_Pro

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.

WP_20150127_13_51_57_Pro

Os pinos de dados não devem ser soldados.

WP_20150127_14_01_40_Pro

16 bit memory. Done.

A pinagem das memórias que consegui na sucata:

020
Pinagem da SST 39sf020.

Depois retirei o chip com problemas do cartucho. Isso foi fácil.

WP_20150127_14_38_48_Pro

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.

pinout Imagem retirada de zophar.net

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.

 

WP_20150211_12_43_06_ProCartucho Pronto.

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).

WP_20150212_16_07_26_Pro

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.

Captura de Tela (30)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.

Creative Commons License
Este trabalho está sobre a licença internacional Creative Commons Attribution-NonCommercial-ShareAlike 4.0.

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.

28 thoughts to “Conserto de cartucho de Mega Drive com Chips BIOS antigos.”

        1. 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

  1. 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) :)

      1. 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!

        1. 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.

  2. 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.

    1. 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.

    1. 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

        1. 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.

          1. 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.

          1. 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.

    1. 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.

Deixe um comentário

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