Logo após os primeiros testes com meu multicart do atari descobri que havia alguns jogos que ocupavam 8kB e 16kB de memória. Aparentemente esses jogos não poderiam rodar no videogame pois o máximo que o processador (6507) consegue acessar é 4kB. Seria necessário um circuito de bankswitch para controlar os bancos de memória.
Pois bem, entre os jogos de 8KB e 16KB estão os melhores já lançados para Atari como Hero, Dukes of Hazzard e Smurfs. Precisava encontrar uma solução para testar esses jogos. Procurei um pouco (em 2003) e encontrei aquele que hoje é considerado o melhor documento sobre cartuchos de Atari 2600, o Sizes.txt do Kevin Horton. Nesse documento estão listados quase todos os cartuchos lançados e protótipos com seus respectivos sistemas de Bankswitch e mais outros dados. No inicio do texto existe uma descrição de cada sistema e algumas dicas de implementação.
Com essas informações consegui projetar um novo cartucho de testes, desta vez com capacidade não só para jogos normais de 2kB e 4kB mas também para 8KB e 16kB (F8 e F6 respectivamente). Isso já cobre quase 75% dos jogos existentes para o console.
Antes de falar do meu cartucho vamos dar uma relembrada do funcionamento dos dois principais sistemas de bankswitch:
Sistema F8: Neste caso a memória do cartucho é dividida em dois bancos de 4kB cada. Um circuito extra no cartucho monitora os endereços e caso ocorra um acesso ao ponto 1FF8 ou 1FF9 ocorre uma troca do banco de memória. O mapeamento fica:
1FF8 -> Banco 0
1FF9 -> Banco 1
Sistema F6: Parecido com o sistema acima, mas com dois pontos extras em 1FF6 e1FF7. Assim a memória é dividida em 4 bancos de 4kB:
1FF6 – Banco 0
1FF7 – Banco 1
1FF8 – Banco 2
1FF9 – Banco 4
Então, existem várias formas de se fazer essa brincadeira. A mais comum é usando portas lógicas (74LS) e Flip-Flops como esses F6 e F8. Já vi uma implementação F8 num cartucho Zaxxon da Dactar muito parecido com esse F8. Também usava 3 CI´s (um 74LS30 para armadilha de endereços, um inversor 74LS04 e um flip-flop 74LS74). Aparentemente era um cartucho bem antigo, pois nunca mais vi outro igual.
Depois alguém aqui no Brasil descobriu uma forma mais barata de fazer isso com apenas dois CI´s 74LS10. Eu tirei o esquema desse circuito, mas não sei onde coloquei. No momento não tenho nenhum cartucho destes e não posso fornecer mais detalhes. Essa foi a implementação mais comum do F8, muito usada pela Dactar, Atarimania e outros fabricantes. Nunca vi um cartucho F6 nacional, apenas importado e com chip´s bolha na placa.
Pois bem, entre os jogos de 8KB e 16KB estão os melhores já lançados para Atari como Hero, Dukes of Hazzard e Smurfs. Precisava encontrar uma solução para testar esses jogos. Procurei um pouco (em 2003) e encontrei aquele que hoje é considerado o melhor documento sobre cartuchos de Atari 2600, o Sizes.txt do Kevin Horton. Nesse documento estão listados quase todos os cartuchos lançados e protótipos com seus respectivos sistemas de Bankswitch e mais outros dados. No inicio do texto existe uma descrição de cada sistema e algumas dicas de implementação.
Com essas informações consegui projetar um novo cartucho de testes, desta vez com capacidade não só para jogos normais de 2kB e 4kB mas também para 8KB e 16kB (F8 e F6 respectivamente). Isso já cobre quase 75% dos jogos existentes para o console.
Antes de falar do meu cartucho vamos dar uma relembrada do funcionamento dos dois principais sistemas de bankswitch:
Sistema F8: Neste caso a memória do cartucho é dividida em dois bancos de 4kB cada. Um circuito extra no cartucho monitora os endereços e caso ocorra um acesso ao ponto 1FF8 ou 1FF9 ocorre uma troca do banco de memória. O mapeamento fica:
1FF8 -> Banco 0
1FF9 -> Banco 1
Sistema F6: Parecido com o sistema acima, mas com dois pontos extras em 1FF6 e1FF7. Assim a memória é dividida em 4 bancos de 4kB:
1FF6 – Banco 0
1FF7 – Banco 1
1FF8 – Banco 2
1FF9 – Banco 4
Então, existem várias formas de se fazer essa brincadeira. A mais comum é usando portas lógicas (74LS) e Flip-Flops como esses F6 e F8. Já vi uma implementação F8 num cartucho Zaxxon da Dactar muito parecido com esse F8. Também usava 3 CI´s (um 74LS30 para armadilha de endereços, um inversor 74LS04 e um flip-flop 74LS74). Aparentemente era um cartucho bem antigo, pois nunca mais vi outro igual.
Depois alguém aqui no Brasil descobriu uma forma mais barata de fazer isso com apenas dois CI´s 74LS10. Eu tirei o esquema desse circuito, mas não sei onde coloquei. No momento não tenho nenhum cartucho destes e não posso fornecer mais detalhes. Essa foi a implementação mais comum do F8, muito usada pela Dactar, Atarimania e outros fabricantes. Nunca vi um cartucho F6 nacional, apenas importado e com chip´s bolha na placa.
Voltando a meu cartucho... Não queria implementar um circuito com mais de 2 CI´s por isso pensei que a melhor solução seria uma PLD pequena. Já existiam placas dessas à venda lá fora. Pensei até em comprar uma, mas iria perder a diversão de projetar e montar a minha versão.
Como eu não consegui uma PLD pequena e um gravador tive que tentar uma abordagem mais estranha criando a minha própria PLD. Ou melhor, uma implementação baseada na teoria das PLD´s.
Assim nasceu a EPROM PLD. Uma EPROM comum programada para se comportar como um circuito de bankswitch F8 ou F6. Através de realimentação de endereços consegui emular os Flip-Flops necessários para chavear os bancos.
Seguem os esquemas para F8 e F6:
Como eu não consegui uma PLD pequena e um gravador tive que tentar uma abordagem mais estranha criando a minha própria PLD. Ou melhor, uma implementação baseada na teoria das PLD´s.
Assim nasceu a EPROM PLD. Uma EPROM comum programada para se comportar como um circuito de bankswitch F8 ou F6. Através de realimentação de endereços consegui emular os Flip-Flops necessários para chavear os bancos.
Seguem os esquemas para F8 e F6:
Baseado no circuito clássico para F8 e no mapeamento de memória do Atari calculei os dados necessários para cada endereço da memória, que ficou assim:
Para F8 (27C128):
0000 a 0FFF = 02
1000 a 1FFF = 00 -> 1FF8 = 00 1FF9 = 01
2000 a 2FFF = 03
3000 a 3FFF = 01 -> 3FF8 = 00 3FF9 = 01
Para F6 (27C256):
0000 a 0FFF = 04
1000 a 1FFF = 00 -> 1FF6= 00 1FF7 = 01 1FF8 = 02 1FF9 = 03
2000 a 2FFF = 05
3000 a 3FFF = 01 -> 3FF6= 00 3FF7 = 01 3FF8 = 02 3FF9 = 03
4000 a 4FFF = 06
5000 a 5FFF = 02 -> 5FF6= 00 5FF7 = 01 5FF8 = 02 5FF9 = 03
6000 a 6FFF = 07
7000 a 7FFF = 03 -> 5FF6= 00 5FF7 = 01 5FF8 = 02 5FF9 = 03
Pelo mapa vemos que abaixo dos endereços 0FFF o sistema do videogame não acessa o cartucho então não é necessário monitorar a troca de bancos. Nos hot sposts a memória coloca em sua saída 0 ou 1 de acordo com o banco e o mantém assim. Este efeito é conseguido ligando a saída ao endereço MSB da própria memória chaveadora, emulando um Flip-flop.
No caso do circuito F6 duas das saídas são usadas para chaveamento de bancos. Pelo esquema dá pra ver que a memória dobrou. Cada Flip-Flop emulado necessita do dobro de memória. Aproveitei e coloquei a famosa inversão do endereço A12 que no Atari é usado como Chip Select do cartucho.
O único problema dessa maluquice é a escolha das memórias. Os tempos de acesso influenciam muito no funcionamento. Com duas memórias EPROM de 150ns o circuito não funcionou de jeito nenhum. Os melhores resultados eu consegui com uma Flash de BIOS recuperada de uma placa mãe velha (90ns) e uma EPROM de 100ns. Os jogos de 16kB são os mais sensíveis. Alguns não funcionaram e outros funcionaram parcialmente.
Em 2005 apresentei esse conceito em minha antiga página e recebi comentários de pessoas que testaram com memórias mais rápidas e não houve problemas. Posso afirmar então que a EPROM PLD funciona.
A última vez que liguei esse cartucho foi em 2005/2006. Abandonei o projeto por falta de memórias mais rápidas. Qualquer hora vou ver se consigo umas de 70ns ou mesmo de 50ns que hoje são comuns em modens ADSL e DVD players para guardar o firmware.
Nota:
Percebi que muitos chegaram até o blog procurando pelo esquema do Atari. Ele pode ser encontrado no site AtariAge nas versões PAL e NTSC. Vale lembrar que o console fabricado no Brasil pela Polyvox é o NTSC com uma placa de Transcoder NTSC para PAL-M.
Atualização 16/03/2015: Fiz um programinha pra gerar os arquivos .bin das memórias e subi para o GitHub.
Para F8 (27C128):
0000 a 0FFF = 02
1000 a 1FFF = 00 -> 1FF8 = 00 1FF9 = 01
2000 a 2FFF = 03
3000 a 3FFF = 01 -> 3FF8 = 00 3FF9 = 01
Para F6 (27C256):
0000 a 0FFF = 04
1000 a 1FFF = 00 -> 1FF6= 00 1FF7 = 01 1FF8 = 02 1FF9 = 03
2000 a 2FFF = 05
3000 a 3FFF = 01 -> 3FF6= 00 3FF7 = 01 3FF8 = 02 3FF9 = 03
4000 a 4FFF = 06
5000 a 5FFF = 02 -> 5FF6= 00 5FF7 = 01 5FF8 = 02 5FF9 = 03
6000 a 6FFF = 07
7000 a 7FFF = 03 -> 5FF6= 00 5FF7 = 01 5FF8 = 02 5FF9 = 03
Pelo mapa vemos que abaixo dos endereços 0FFF o sistema do videogame não acessa o cartucho então não é necessário monitorar a troca de bancos. Nos hot sposts a memória coloca em sua saída 0 ou 1 de acordo com o banco e o mantém assim. Este efeito é conseguido ligando a saída ao endereço MSB da própria memória chaveadora, emulando um Flip-flop.
No caso do circuito F6 duas das saídas são usadas para chaveamento de bancos. Pelo esquema dá pra ver que a memória dobrou. Cada Flip-Flop emulado necessita do dobro de memória. Aproveitei e coloquei a famosa inversão do endereço A12 que no Atari é usado como Chip Select do cartucho.
O único problema dessa maluquice é a escolha das memórias. Os tempos de acesso influenciam muito no funcionamento. Com duas memórias EPROM de 150ns o circuito não funcionou de jeito nenhum. Os melhores resultados eu consegui com uma Flash de BIOS recuperada de uma placa mãe velha (90ns) e uma EPROM de 100ns. Os jogos de 16kB são os mais sensíveis. Alguns não funcionaram e outros funcionaram parcialmente.
Em 2005 apresentei esse conceito em minha antiga página e recebi comentários de pessoas que testaram com memórias mais rápidas e não houve problemas. Posso afirmar então que a EPROM PLD funciona.
A última vez que liguei esse cartucho foi em 2005/2006. Abandonei o projeto por falta de memórias mais rápidas. Qualquer hora vou ver se consigo umas de 70ns ou mesmo de 50ns que hoje são comuns em modens ADSL e DVD players para guardar o firmware.
Nota:
Percebi que muitos chegaram até o blog procurando pelo esquema do Atari. Ele pode ser encontrado no site AtariAge nas versões PAL e NTSC. Vale lembrar que o console fabricado no Brasil pela Polyvox é o NTSC com uma placa de Transcoder NTSC para PAL-M.
Atualização 16/03/2015: Fiz um programinha pra gerar os arquivos .bin das memórias e subi para o GitHub.
Cara, sensacional a sua idéia de usar uma segunda rom para fazer o chaveamento. Parabéns. Tenho um projeto interessante de um Emulador de Cartucho que funciona para Atari, Odyssey, Colecovision e mais alguns. De uma olhada no video que subi http://www.youtube.com/watch?v=sHuRIzfnXhQ
ResponderExcluirVamos manter contato. vtrucco@finalboss.com
Grande abraço.
Fantastic!
ResponderExcluirKnow anyone more about the cart or the author?
I want to build on.
Infos please.
spyke2@gmx.de
Anonimo (Spyke ?)
ResponderExcluirI am the author... And all the info is in the post... Try the google translator or use the e-mail in the right for more info.
Ola, fantastica ideia..... voce tem uma copia desse arquivo Sizes.txt do Kevin Horton ? ja tentei no google, o site dele esta fora, e nao achei em lugar algum, agradeco se enviar para martinsvicente@hotmail.com. Abracos.
ResponderExcluirAnonimo,
ResponderExcluirveja aqui: http://web.textfiles.com/games/sizes.txt
Eu tenho um cartucho implementado o BS com 2 74ls10, se ainda interessar posso tirar o esquema dele.
ResponderExcluirEu costumo passar pelo PAKEQUIS e está postagens sobre o cartucho do Atari me chamou muito à atenção.
ResponderExcluirEntão eu te pergunto qual a maneira mais fácil de se reproduzir um cartucho do Atari.
Peço a sua ajuda com alguma dica e ou material.
email: hard_gb@hotmail.com
Hehehe, muito engenhoso mesmo, KUDOS! :-)
ResponderExcluirComo você falou trocar PLD por EPROM eu enfiei na cabeça o uso tradicional disso, que é pra lógica combinacional (dada uma entrada, calcula a saída).
A ficha caiu quando você disse que ao invés de flip-flops havia cartuchos que faziam isso apenas com ports NAND (dois 74LS10 dá 6 NANDs) ao invés de flip-flops... O macete é implementar um latch usando "cross-coupled NAND gates", ou seja, ligar a saída de uma NAND na entrada da outra e vice-versa - assim dá pra armazenar qual dos bancos está atualmente selecionado. Isso é o exemplo típico de lógica sequencial (ao invés de combinacional).
Programando a memória para se comportar como NANDs e "ligando a saída ao endereço MSB da própria memória" você está fazendo exatamente a mesma coisa. Eu só não diria que a EPROM está EMULANDO um flip-flop (ou um latch): você efetivamente IMPLEMENTOU um latch (ou flip-flop) usando uma EPROM.
Dá até uma boa questão pra prova: Como ARMAZENAR dados numa ROM? Quantos bits cabem? :-D
Parabéns mais uma vez, eu realmente achei a sua solução um barato!
Olá, voce poderia publicar o arquivo do F8 para ser gravado na EPROM (caso ainda tenha e não haja problema autoral)?
ResponderExcluirestou trabalhando num multicart para F8 e essa sua ideia para troca de bancos seria perfeita para fazer um protótipo, fico grato se for possivel compartilha-lo, meu projeto não tem fins comerciais.
Já olhei este post muitas vezes, ainda vou montar este cartucho mais pela curiosidade do funcionamento .
ResponderExcluirAjudando um amigo eu refiz este esquema usando dois 74ls10 (acho que deve ser o mesmo que você está falando) Meu nome aparece como cetics aqui neste post: https://atariage.com/forums/topic/293883-did-i-miss-something-while-doing-this-dump/?tab=comments#comment-4317376
ResponderExcluir