quinta-feira, 18 de dezembro de 2014

CD4040 com multicarts

     Vou começar agora a estudar como montar multicarts para o SNES e o MegaDrive, tenho aqui cartuchos onde você troca de jogo apertando RESET no console, sem menu, mas bem melhor que no Atari onde você tem que desligar e religar o game para o jogo trocar, isso para cartuchos usando um contador binário, o mais comum é o CD4040, então resolvi dar uma esclarecida em como ele funciona e em como setar o mesmo para contar somente até o numero que queremos.

     Vejamos o pinout do chip:

     Explicando a legenda: VDD = +5V, VSS é o terra, CLK é o sinal do clock, que faz ele incrementar 1 na contagem, RST é o sinal do RESET, que faz a contagem voltar a ZERO, e os pinos com Qn (Q0, Q1 ... Q12) são os pinos de saida da contagem.

     Bom, contagem em binário, se você não sabe ou não lembra .. em binário só temos 0s e 1s .. não da para fazer uma contagem em decimal como 1, 2 ,3 ... não diretamente, em binário, para contar até 10 por exemplo ficaria assim:

0000 = 0
0001 = 1
0010 = 2
0011 = 3
0100 = 4
0101 = 5
0110 = 6
0111 = 7
1000 = 8
1001 = 9
1010 = 10

     Note que com 4 bits (numero de algarismos que usamos para fazer a contagem) ainda faltam combinações para se realizar, com uma combinação de 4bits entre 0s e 1s temos exatos 16 combinações, então com 4bits podemos contar até 16 (em decimal) ou 16 combinações diferentes.

     Cada algarismo tem um valor, contando da direita para esquerda, no exemplo de 4bits, ficariam assim: o primeiro 0 da direita vale 1, o segundo vale 2, o terceiro vale 4 e o ultimo, mais a esquerda vale 8 ... se vc tem um numero em binário e quer saber quanto ele vale em decimal, da para fazer de cabeça lembrando de quanto cada algarismo vale, veja que começa com 1 e cada proximo algarismo a esquerda dobra seu valor, então para saber quanto vale 1010 em binario é só somar o valor que vale em cada algarismo que estiver com 1. Neste caso o algarismo mais a esquerda que vale 8 e o segundo da direita para esquerda que vale 2, somando 8 + 2 temos como resultado 10, agora volte na tabelinha da contagem acima, veja que 1010 realmente vale 10 em decimal, e fizemos isso sem ter que contar desde o inicio, isso vale para qualquer numero, de que tamanho for, lembrando que o próximo algarismo a esquerda vai valer o dobro do anterior.

     Bom, tudo é muito lindo, mas como implementamos isso nos nossos multicarts ? Vamos la, vou dar um exemplo de cartucho do atari, porque a ROM é pequena e fica um pouco mais facil ... o atari tem jogos comuns com 4kb, 1kb = 1024bits, se vc contar isso em binario, vai ter 12 algarismos, na eprom, os pinos de ADDRESS começam a contar de 0, então para ter uma ROM gravada em uma eprom que a suporte, a mesma tem que ter pinos de address de A0 a A11 (se começamos contar do 0, o décimo segundo é o 11), muito bom, mas se temos uma eprom que tem disponivel o A12, ou ainda o A13 ... cada pinos adicional de address que temos em uma eprom do tipo paralela, ela dobra sua capacidade, ou seja, se uma eprom que vai até o A11 tem 4kb de espaço, uma outra que tem até o A12 tem 8kb e a que tem o A13 suporta 16kb.

     Voltando a rom de 4kb, se a eprom tem 16kb e temos jogos de 4kb, isso quer dizer que é possivel colocar 4 roms de 4kb em uma eprom de 16kb, mas para selecionar qual das roms vai estar ativa ? Justamente nos pinos de address que sobram da rom, ou seja A12 e A13 nesse exemplo, porque se você mudar qualquer valor de address que seja menor que o A12 vc vai cair dentro da rom de 4kb o que vai impedir do jogo funcionar corretamente. Imagine que ja que a rom dos jogos tem 4kb, ele seria um bloco, você quer montar 4 blocos na eprom, ou podemos chamar de páginas para ficar mais claro, paginas de 1 a 4 são os 4 jogos, como a rom vai até o A11, A12 e A13 trocam as paginas, são 2bits que temos ai e em binário a combinação de 2bits nos dá 4 combinações diferentes, ou o numero 3 em binário (mas pera, não era 4 ?? lembre-se que a contagem sempre começa em 0 então de 0 a 3 temos 4 posições diferentes). Então vamos recapitular, cada jogo de 4kb são os blocos, e a combinação dos endereços mais altos, nos permite selecionar entre os blocos, ou seja, paginar.

    Você ja viu por ai, no caso do atari, cartuchos com chaves certo ?? é muito comum ver cartuchos da marca dactar com 2 chaves na frente, com 4 jogos, bom, é exatamente nosso exemplo, cada chave é um bit, 2 chaves são 2bits que são igual a 4 combinações, ou seja, 4 jogos, esse é o sistema de paginação que esses cartuchos usam, mas não é tão elegante, imagine vc ter 32 jogos, são 5 chaves, você vai lembrar a combinação dos jogos será ? e no caso do meu multicart de 240 jogos ? seriam 8 chaves, pior ainda não ? Não tão elegante igual um menu, o CD4040 vai contando até chegar na ultima pagina e depois volta para a primeira, pode ser chato em caso de muitos jogos no cartucho, mas pelo menos você não tem que lembrar a combinação de um monte de chave, basta o chip contar até chegar no jogo que você deseja.

     Bom, 2 chaves, ligando o pino do meio da chave no A12 ou A13 do nosso exemplo e GND e VCC de cada lado, dependendo do lado da chave vamos alimentar o A12 e A13 com GND ou VCC .. imagine que o GND é o nosso 0 em binário e o VCC é o nosso 1, é assim que informamos a combinação à eprom para ela selecionar a pagina do jogo que queremos, o CD4040 funciona da mesma forma, em suas saidas Qn da foto acima, conforme ele vai contando, vamos ter 0s ou 1s nos pinos, ou seja, ou VCC ou GND neles.

     Veja agora essa imagem: 

     Veja que é mostrado a quantidade de combinações que cada pino proporciona, se usarmos somente o Q1, ele vai proporcionar 2 combinações diferentes, que seria 0 e 1 .. se usarmos os 2 primeiros, Q1 e Q2 ja temos 4 combinações, que seriam 00, 01, 10 e 11, justamente o que precisamos para trocar nossas paginas do exemplo dado, mas e o restante dos pinos ? o que faremos ?? bom, vamos deixar eles sem ligação, pois não nos interessam, somente o próximo pino nos interessa, pois ele vai nos dar o sinal do RESET para a eprom voltar a ZERO, repare na contagem binária que mostrei acima, nós não precisamos que seja usado o RESET nesse caso, mas eu uso assim mesmo, na pratica o Q1 é nosso bit mais a direita, o Q2 é o segundo bit mais a direita e assim por diante, na tabela, quando a contagem vai para 5 ou seja, é um numero que ja não nos interessa pois queremos contar até 4, os nossos 2 primeiros bits são realmente zerados, mas os outros continuam contando, você pode deixar assim, apenas ignorar os demais bits do CD4040 ou usar o proximo para o reset, eu faço assim, não custa nada é apenas uma ligação. O pino Q3, quando a contagem chega a 4 (quinta combinação) é setado em 1 pela primeira vez na contagem, ligamos ele diretamente ao pino RST do chip. se quero uma contagem até 8 vamos usar então Q1, Q2 e Q3 para a contagem e vamos usar o bit Q4 para liga-lo diretamente ao RST, pois quando a contagem atingir 8 (nona combinação) ele será setado pela primeira vez.

     Bom, isso tudo funciona bem se sempre tivermos uma contagem binaria perfeita, digo, sempre utilizando a contagem maxima dos bits que temos, mas e se queremos justamente parar a contagem em um numero que não é sempre o dobro do anterior ? Vamos usar novamente nossa contagem acima que foi de 0 a 10, vamos supor que por algum motivo queremos somente 10 jogos na eprom, usando todos os bits, teriamos 16 combinações, tirando o bit mais a esquerda ficamos com somente 8 combinações, nenhuma das 2 opções nos atende, ainda é possivel parar a contagem onde queremos, porem temos que utilizar um artificio que vai identificar o numero que queremos, nesse caso vou utilizar portas NAND, de um chip muito baratinho que é muito conhecido o LS00 (74LS00, 74HC00 entre tantos outros) .. nesse chip temos 4 dessas portas, cada porta com 2 entradas, se ambas entradas forem 1, o chip na saida é setado em 0 qualquer outra combinação o chip seta a saida em 1.

     Veja na nossa contagem binária novamente, se queremos uma contagem até 10, então temos que zerar o contador quando ele chegar no 10, pois o 10 é a décima primeira combinação, e ela não nos interessa, lembrem que a contagem começa em 0 , todos os bits em 0000 ja são uma combinação válida. Bem 10 em binário é 1010 como não temos mais bits na frente podemos analisar somente os bits que estão 1, se fossem 5bits e queremos exatamente o numero 10 teríamos que analisar o bit mais a esquerda visto que se ele for 0 o numero realmente é 10 mas se ele for 1 a nossa contagem estaria em 26 e não em 10, isso seria um erro de lógica, teriamos que analisar se o primeiro bit é zero nesse caso e os demais basta analisar os que são 1, como não temos, vamos analisar todos que são um, 1010 .. onde temos zero podemos desprezar. temos 2 bits para analisar, cada porta NAND tem 2 entradas, então de cara ja vemos que serão usadas pelo menos 2 portas ... a ligação ficaria +/- assim:



     Tudo isso para exemplificar como seria parar a contagem em um numero que não seja o maximo da contagem dos bits que escolhemos.

     Aplicando o CD4040 na eprom finalmente, se temos 2bits na eprom para escolher nossos 4 jogos, vamos também usar 2bits do CD4040 .. sempre respeitando a ordem, vamos ligar o Q1 ao A12 e o Q2 ao A13 .. o pino do reset no contador vai ser ligado ao Q3 ou simplismente deixar sem ligação alguma, visto que as demais combinações até chegar em 4096, o maximo da contagem desse chip, sempre passam por todas combinações que queremos, o pino CLK é o pino do clock, como no atari não temos sinal de clock no barramento, utilizamos o artificio de alimentar o chip com um capacitor, não ligado diretamente ao VCC do slot e o clock será justamente o VCC do barramento, porque ao desligar o console o VCC vai a zero, quando religamos vai a 1 .. uma pequena gambiarra, mas que funciona, o capacitor serve justamente para manter o chip ligado por um breve instante até vc religar o game, mantendo sua contagem. Ja no caso do SNES é muito mais facil, existe o pino /RESET no conector, basta ligar diretamente esse pino do slot ao CLK do contador, mais facil impossivel, ao apertar RESET no console, o sinal passa nesse pino alimentando o clock e incrementando a contagem no chip instalado no cartucho. No mega drive penso ser semelhante, como sei que tem cartuchos com varios jogos que incrementam as paginas ao apertar o RESET do console, a solução vai ser semelhante eu acredito.

     Veja agora um multicart do SNES que fiz com uma eprom 27c160 e um CD4040:


     Neste cartucho, os jogos tem 512kb de tamanho então nesse caso são meus blocos, tenho 4 blocos de 512kb somando então 2mb que é o tamanho maximo da eprom, um bloco de 512kb utiliza os pinos de address de A0 até A18, então até o A18 não mexemos pois cai no bloco de 512kb que faz parte da rom do jogo, acima disso podemos paginar, então essa eprom, configurada em 8bits de saida (ela tb trabalha em 16bits de saida e nesse caso a capacidade cai para 1mb, mas no SNES o barramento é 8bits), temos que além do A18 ela conta com o A19 e A20, ou seja, 2bits sobrando, 2bits = 4 combinações, ou seja, 4 blocos de 512kb, então podemos colocar nessa eprom 4 jogos de 512kb ou 2 jogos de 1mb cada (neste caso o A19 iria fazer parte da ROM e para paginar usariamos somente o A20), eu fiz com 4 jogos pois era para testar, Sendo assim, seguindo a ordem eu liguei o Q1 ao A19 e o Q2 ao A20. Veja como ficou o cartucho teste:




     Bom é isso meninada, é bem facil de utilizar, e aprender binário sempre é legal, adoro.

     "Uma mente que se expande, nunca volta ao tamanho original" - Albert Einstein.

     Abraços, DABLIO.

terça-feira, 25 de novembro de 2014

Cartucho do MEGABOY Dynacom

     Lembra daquele console portátil sem fio feito pela Dynacom no final da época do atari ?? Pois bem, para poder alavancar as vendas, desenvolveram um cartucho 'educativo' para mudar o foco do console de apenas brinquedo, para um aparelho que ajudava nos estudos das crianças. 

     Conforme consta na caixa do console, são 4 oitavas musicais, mais de 800 palavras em inglês e mais de um milhão de operações de matemática para resolver.

     Esse cartucho foi lançado com a maior capacidade do mercado, nenhum outro software teve os mesmos 64kb, somente alguns tiveram 32kb, um sistema de bankswitch especialmente desenvolvido para ele foi criado junto. Esse sistema é muito simples, basta acessar o endereço 1FF0 ( e por isso é conhecido como bankswitch F0) que o hardware no cartucho incrementa um banco, são 16 bancos de 4kb no cartucho, para saber qual banco selecionar o cartucho faz a chamada e verifica um byte especifico no banco recém trocado, se for o mesmo que ele espera, executa o código, caso contrário, faz nova chamada para incrementar o contador novamente, até que o banco desejado seja selecionado, muito simples mesmo.

     Bom, tudo muito lindo, se não fosse por ele ser muito raro de achar. Para poder jogar, ou vc pagou os tubos no ML, ou tem o seu desde que ganhou quando criança. Não, os gringos não tem, como eu disse, a Dynacom lançou por aqui, o cartucho tem legendas em português do Brasil ... Então é isso, aliado a baixa produção do console, do cartucho ser distribuído exclusivamente com o console, ser fabricado somente no Brasil, e ser o cartucho de maior capacidade, vc não vai poder jogar no seu console real se não possuir o cartucho fisico.

     Ah tah, vc comprou o cartucho harmony que roda tudo do cartão SD ?? porra, que legal, mas que pena, não vai poder jogar ... não porque não tem a rom disponível, ou porque o sistema de bankswitch não foi implementado (ele utiliza o codigo dos BS do emulador stella e neste tem o esquema), o problema é a capacidade, o cartucho harmony usa um chip que só suporta 32kb, ou seja, metade do que o cartucho do megaboy utiliza.

     Mas não se desespere, com a nova remessa de placas que mandei fazer, ja pensando em montar esses cartuchos, até para mim mesmo, que tenho o console na caixa mas não tenho o cartucho, eu implementei o BS nas 22V10 que utilizo no cartucho, como ja estou meio craque nisso, bastou umas 2h de trabalho para acertar tudo, agora vc pode ter seu cartucho exclusivo do megaboy para jogar em qualquer console atari 2600 ou compatível sem problemas.

     Confira abaixo as fotos da placa, dos labels, e do cartucho já pronto.

Na esquerda: placa original do megaboy
direita: apenas comparativo de placa comum.





Confira um video do cartucho em funcionamento:





      É isso ai, querendo uma cópia é só me procurar, ou procure diretamente no mercadolivre, enquanto eu estiver produzindo as cópias, vou ter um anuncio ativo no mercadolivre para as vendas ok ?

Abraços,

DABLIO.


sábado, 15 de novembro de 2014

Finalmente o novo multicart !

     Já estão disponiveis os novos multicarts para o Atari 2600, recebi na sexta feira um lote de placas que mandei fazer, plaquinhas com ótima qualidade, testadas e tudo funcionando perfeitamente, agora é possivel, dependendo do tamanho das roms obviamente, montar multicarts de até 240 jogos por cartucho, com escolha por menu na tela.
     
     Alguns detalhes que foram acertados, comparando a versão anterior que eu vendia, com essa nova versão que vou vender agora: de 15 jogos, ou 30 com uma chave on-off no cartucho para selecionar apenas 2 paginas para até 240 jogos, tudo controlado pelo menu. Menu com som finalmente. E possivelmente, assim que eu acertar, vamos ter um botão de reset no cartucho, que vai permitir voltar ao menu de escolha sem ter que desligar o console, funciona em varios jogos, mas não em todos, então por enquanto vou vender os cartuchos sem o botão RESET.

     Bom, é isso, agora o cliente vai poder escolher a lista dos jogos, de 4 listas que vou montar (somente 4k, 4k+8k, 4k+16k e 4k+32k), e como muita gente fica boiando com o papo de 4k, 8k etc .. vou apenas disponibilizar as listas e ele escolhe, algo como lista A, lista B etc, sem poder misturar as listas. Agora a quantidade de jogos tambem é escolhida pelo cliente, limitado ao numero maximo de jogos, de acordo com a lista escolhida apenas, se for somente jogos de 4k (lista A) o cartucho vai acomodar até 240 jogos. Qualquer quantidade multiplos de 15 são aceitos agora, ou seja, 15, 30, 45, 60, 75, 90, 105, 120 até 240 se o cartucho for da lista A como disse.

     Sim, os valores serão estipulados em cima da lista escolhida e quantidade de jogos, isso porque um cartucho de 60 jogos da lista A custa o mesmo de 30 jogos da lista B ou 15 jogos da lista C.

    Vejam abaixo algumas fotos da nova placa, virgem e montada, e em comparação com a placa anterior, de cor verde mais forte, mas que só permitia 15 jogos por cartucho.







Fotos em comparação com a placa prototipo que montei para os testes:



E finalizando com um videozinho:



É isso pessoal, ja podem encomendar seu cartuchos personalizados com a DablioGames =-)

Ah, lembrando que é tudo novo ano 2014 modelo 2015 hein, nada de componente remanofaturado, recuperado etc.

Abraços,

DABLIO.








sábado, 18 de outubro de 2014

Multicart 2600 - correção do clock

     Video rápido só para mostrar a correção do sinal de clock que estava pendente, antes ao ligar o console nem sempre o menu aparecia, um jogo aleartorio ela escolhido e em algumas vezes o menu aparecia certinho. Agora é testar jogos com 8k, estando ok, ai é só mandar fazer as placas fora e poder montar os cartuchos para o pessoal, lembrando que agora vai ser possível montar cartuchos de 15 até 120 jogos (ou 240 se forem todos jogos de 4k) com jogos a escolha do cliente.



quinta-feira, 16 de outubro de 2014

Multicart 2600 nova versão

      Nova versão do multicart atari, o povo pediu e vou voltar a vender, mas depois de resolver um probleminha como é mostrado no video.


domingo, 21 de setembro de 2014

Blog parado ?

Agradeçam ao sistema de entrega de mercadorias =-) ... e não, não é só os correios que estão indo mal .. tem 2 meses que comprei um único chipzinho insignificante e o mesmo nem sequer chegou no Brasil de acordo com rastreio, se tivesse sem rastreio eu ia imaginar o óbvio, que chegou e sumiu no nosso correio, o que não foi o caso, por isso não compro mais de fora sem rastreio.

O que isso tem a ver com o tema do blog ?? bom, tudo a ver ... o chip insignificante em questão é um CPLD que vai ajudar muito a produzir multicarts do atari 2600, infelizmente não mais baratos, mas mais rapidos de montar e de menor tamanho, visto que o CPLD em questão esta extinto já, e muito dificil de achar, mas acha em quantidade ainda se souber procurar, por isso do seu preço alto.

Bom, comecei montando multicarts de 15 jogos com ROMs de somente 4k, utilizando 2 chips de logica discreta e alguns componentes como resistores, diodos e capacitores + a EPROM com as ROMs gravadas, depois montei cartuchos de 15 jogos, mas ja com ROMs de 8k, para isso adicionei uma PLD para trabalhar como bankswitch ... depois quis aumentar a quantidade de jogos, para isso teoricamente vc aumenta somente o chip com as ROMs, mas o menu tem que ser paginado, o que controla isso por ser feito de algumas maneiras. Para apenas 2 páginas, eu coloquei uma chave no cartucho, como aqueles para 2 jogos, mas essa chave no meu caso controla 2 páginas com 15 jogos cada no cartucho ... depois quis mais jogos ainda .. fui até 240 jogos de 4k ou 120 jogos de 8k, que é o que cabem na memória de 1mb que é fácil de achar, memórias maiores existem mas essa ainda tem um bom preço em relação ao benefício. Para ter mais jogos, eu não ia continuar a adicionar chaves no cartucho, ja que a idéía é um cartucho com menu na tela, mas o problema era a paginação, poderia fazer via software+hardware, mas eram muitos componentes, lembrando aquele monte só para funcionar os 15 jogos de 8k ou 16k ... bom, a saída foi usar um contador binário, que se resume a um chip, alguns resistores e um capacitor a mais ... ocupando menos espaço e resolvendo o problema das paginas .. para isso um botão de pressão foi adicionado no cartucho, com um chip desses consigo ter muitas paginas, muitas mesmo, se não me engano ele tem 12 bits para contar ... e imagine que para os 240 jogos utilizei apenas 4 desses bits ...

Bom, tudo lindo, mas como falei, o cartucho vc escolhe os jogos pela tela, pelos nomes que aparecem, e eu queria controlar as paginas igualmente pelo menu, que é a lógica ... vejam como ficaria uma placa que estava desenhando, mas que desisti até de finalizar por conta do seu tamanho:



Com um CPLD certo, da para fazer a mesma coisa que um monte de componentes, em apenas um chip bem programadinho ... inclusive a capacidade do chip não chegou a 1/3 de utilizada ... o que limita esse tipo de componente é somente a quantidade de pinos de entrada e saída que possuem, que no meu caso foi ao máximo permitido. Vejam agora uma placa que desenhei para fazer exatamente o que a placa anterior:



Ambas placas fazem a mesma coisa, controlam o menu de 15 jogos e 16 páginas no máximo, totalizando 240 jogos, a limitação da CPLD são 240 jogos de 4k / 120 jogos de 8k / 60 jogos de 16k .. mas é justamente o que a EPROM que utilizo comporta, então é o casamento perfeito. A primeira placa ocupa todo o espaço interno do cartucho, já a segunda placa, que ainda pode ser cortada um pedaço, fica entre os 3 furos vistos na imagem da primeira placa, ou seja, muito menor e fazendo a mesma coisa ... tecnologia minha gente hehehe

Não sei se vai dar certo, mas nos testes do programa que compila o código, tudo funcionou, eu não sou expert em CPLD, mas dou minhas dentro as vezes.

Bom, é isso, quem pensou que o blog morreu ou meus ataris morreram ou ainda eu morri, estavam enganados, estou já a uns 4 meses trabalhando nisso, porém nada de componente para testar na pratica o que já testei na teoria, e continuo esperando, nem chegou nessas bandas ainda, depois é esperar a alfândega liberar .. será que esse ano isso sai ???

Até.


sexta-feira, 2 de maio de 2014

Como funciona um cartucho de Atari 2600 com menu.

Quero deixar a minha contribuição para quem esta pensando em montar um multicart e quer fazer bonito.

Vou explicar aqui a ideia de como funciona para ter um multicart com menu, como funciona o 'truque' da escolha etc.

Vamos la, essa explicação é destinada a quem entende um pouco da programação do Atari2600 E de um pouco de eletronica, precisamente portas lógicas, ou seja, não muito difícil de fazer.

Um bankswitch nada mais é que mudar um banco da ROM/EPROM durante o funcionamento, como ja devem saber o atari só endereça diretamente até 4kb, para ter jogos maiores existe um circuito que pula para os próximos 4kb da ROM e com isso seu código dobra de tamanho, existem vários BS por ai, mas não to aqui para falar de BS, porem o menu utiliza da mesma técnica.

O atari quando é ligado, SEMPRE acessa o endereço FFFC da ROM, neste endereço esta o ponto exato da rom onde o jogo começa, pois quando a gente programa, o inicio pode variar, isso faz com que seja normalizada, você acessa o endereço FFFC e o código do jogo indica o lugar certo para inicio.

Muito bem, sabendo disso, montamos um espécie de BS que na verdade é acessada apenas um vez (pelo menu) e depois não trabalha mais, ela retem o endereço do banco que queremos e fica la até você desligar o console.

Então vamos montar um cartucho com 15 jogos, como ficaria ? Mas porque 15 jogos se a lógica me diz que vão ser blocos múltiplos de 2 e nesse caso era para ser 16 (na eprom 27C512 cabem 16 blocos de 4kb) ? bom,  o menu já ocupa um bloco, sendo assim, sobram 15 blocos para os jogos.

No cartucho você inclui um registrador de 4bits, pode ser um 74ls173, atente para que o mesmo tenha um capacitor no reset para zerar efetivamente ao ser ligado, nas 4 saídas do mesmo, temos que ter o endereço 0000 .. esse será o banco que vamos colocar o menu, ou seja, o primeiro banco, o atari vai acessar o endereço FFFC do código do menu que la terá o endereço do inicio do seu código correto.

Muito bem, não entrando em como programar para o 2600, então os 15 jogos vão ter que acessar os bancos de 0001 até 1111 correto ? isso nos dá 15 combinações, você cria um menu, que inicia já no primeiro nome com valor 0001 e ao pressionar o controle abaixo ou acima, você aumenta ou diminui esse valor, acho que até aqui tranquilo certo ??

Essa contagem é em binário, então o segundo jogo será 0010, o terceiro será 0011 e assim por diante ...

Ok, já sabemos como atribuir um valor de banco para o jogo selecionado na tela, mas e para transferir isso para o registrador no cartucho ??

O 2600 endereça até 4kb diretamente, o que passar disso tem que ter um truque, o mais famoso BS acessa o endereço FFF9 para ir para seu segundo banco e FFF8 para voltar ao primeiro banco, na linha de endereço do slot, temos de A0 até A12, sendo este ultimo apenas um ativador da rom (ele manda sinal 1 para ativar a ROM e 0 para desativar) então o que interessa esta somente de A0 até A11, são com eles que vamos identificar o endereço enviado pelo atari.

Então veja, para o endereço FFF8, os pinos de address (A0 a A11) vão estar assim:

A A A A A A A A A A A A A < Pinos de endereços
1 1 1 9 8 7 6 5 4 3 2 1 0
2 1 0

1 1 1 1 1 1 1 1 1 1 0 0 0 < valores nos pinos

Agora veja a chamada para o FFF9:

A A A A A A A A A A A A A < Pinos de endereços
1 1 1 9 8 7 6 5 4 3 2 1 0
2 1 0

1 1 1 1 1 1 1 1 1 1 0 0 1 < valores nos pinos

Repare que somente o pino A0 muda seu valor, isso nos facilita muito na hora de montar o hardware.

Quando eu digo FFF8 considere que ele não 'entende' o primeiro F (em binário 1111) pois ele só endereça até o A11, então só cabe ali o 1 mais a direita do F .. então qualquer outro valor que tenha 1 no seu digito mais a direita vai funcionar na verdade, podendo ser 1FF8, 3FF8 e assim vai.

Então temos que designar um endereço que de preferência não entre em conflito com as chamadas, nem da ROM nem dos comandos internos, difícil ?? sim, apesar de regulamentado os endereços a usar, tem jogo (programador) que usam chamadas diferentes nos seus games, e isso acaba dando zica na pratica, imagine se o menu funcionar com FFF9 para escolher o jogo, e eu estou usando um jogo de 8KB que utiliza esse endereço ?? não vai dar certo, em anexo (me peçam por mensagem abaixo) uma lista com os endereços internos utilizados, pelo menos os mais utilizados, e seus mirrors.

Nos meus menus eu utilizo o endereço 03CX  (X = qualquer valor), se você procurar na tabela, vai ver que ele é um mirror de um endereço da RIOT ... então se os programadores utilizarem os endereços padrões nos seus códigos, nenhum problema acontecerá, já os que, por algum motivo, resolvem utilizar um endereço mirror, pode dar problema, e dá no 03CX (alguns jogos não funcionam com meu menu por isso)(OBS: como o exemplo que dei do BS F8 ele utiliza um endereço da ROM pois ativa o pino A12, o programador tem que  saber exatamente o que tem nesse endereço que não vá dar conflito com o resto do código, e eu estou pensando em mudar meu endereço de chamada para uma na ROM, acho que os jogos que não funcionam pela incompatibilidade possam voltar a funcionar, só testando)

X pode ser qualquer valor, não importa, visto que ali teremos a informação de qual banco acionar, já sabemos também que o endereço 03C0 nunca será chamado, pois o banco 0 é utilizado pelo próprio menu certo ??

Então no meu código fica assim, o jogador ao apertar o botão do controle ou acionar a chave RESET no console, retem o numero do jogo selecionado na lista, vamos supor que foi o décimo jogo, transformamos esse numero 10 em decimal para hexadecimal que fica A e adicionamos o endereço da chamada, no meu caso 03C, ficando 03CA.

Vamos ver como é a chamada do 03CX:

A A A A A A A A A A A A A < Pinos de endereços
1 1 1 9 8 7 6 5 4 3 2 1 0
2 1 0

0 0 0 1 1 1 1 0 0 X X X X < valores nos pinos

Sabendo o endereço que se quer usar, filtramos esse endereço na linha de endereços para acionar a função da troca de jogo (do menu para um jogo, isso no cartucho), ai entra a eletrônica, queremos registrar o endereço do banco, no exemplo o A, ou precisamente 1010 em binário.

Precisamos de um circuito que identifique que o endereço 03C foi chamado e ai sim pegar o A final e jogar no registrador.

03C em HEX fica 000111100 em binário, basta no cartucho, com auxilio de portas logicas verificar se é isso que esta chegando respectivamente de A12 a A4 (A3 a A0 não interessa, será jogado diretamente no registrador, não é necessário sua verificação) ... mas eu disse la traz que o A12 era somente para ativação da ROM certo ??? porque eu to verificando ele agora, e porque ele é um 0 e não um 1 para ativar a ROM ??? Porque agora não queremos ativar a rom, queremos apenas selecionar o banco certo na ROM do cartucho apenas, o endereço 13C com toda certeza é um endereço que a ROM do jogo utiliza, nenhum endereço referente a ROM do cartucho pode ser usado, então o 1 do começo não pode estar ali, vamos usar o 0 e temos que verificar se ele é um 0 mesmo, pois o menu e os jogos vão sempre utilizar o endereço 13CX, cagando o que o registrador faz no cartucho (trocando de banco durante o jogo).

Bom, se as portas lógicas determinarem que o endereço 03C realmente foi chamado, então basta pegar os valores dos pinos de A3 a A0 do jeito que vierem e colocar diretamente no registrador de 4bits, a saida do registrador estará ligado diretamente aos pinos da ROM/EPROM que mudam os bancos (no caso de 15 jogos no cartucho na eprom 27C512, serão os pinos A15 a A12, lembrando que o A12 da ROM não é o A12 do barramento, eles não se comunicam).

Legal, o meu código faz uma chamada 03CX e o banco é trocado, fantástico certo ??? errado, ainda temos um grave problema ai que precisa ser resolvido, já vi muitos errarem e abandonarem seus projetos justamente ai, explico.

O atari endereça 4kb, você já está careca de saber isso, legal .... quando usamos um sistema de BS ele troca de banco para ter mais informação no mesmo jogo, porém o jogo está preparado para isso, quando a chamada para troca de banco é feita, o código sabe o que vai ter no segundo banco na sequência de onde o primeiro banco parou, isso porque o atari não 'sabe' que o banco foi trocado, ele continua a acessar as informações da ROM achando que o mesmo banco de 4kb esta ativo, o programador tem que se preocupar que a sequência de informações no segundo banco seja precisa para o código não se perder.

Mas e o menu ?? como será que quando ele faz a chamada, ele vai saber que a ROM do jogo vai estar na posição certa ?? Já foi dito, basta, no código do menu, fazer uma chamada para o endereço FFFC, onde TODO jogo contém o inicio do seu próprio código, então , o menu esteja ele fazendo o que estiver, será desviado para FFFC ao passo que o banco na ROM é trocado.

Certo ?? ainda não, ainda falta uma coisa tão importante quanto a anterior, pense que o atari executa o código ininterruptamente assim que é ligado, ele não para, ele não pausa e tal ... seguindo a lógica vamos pensar como funciona até aqui, o que entendemos:

1. vc liga o cartucho, o registrador no cartucho é zerado escolhendo o banco 0000 da ROM
2. o menu é chamado pelo console pelo endereço FFFC que indica o início correto do código
3. o código fica esperando uma ação do jogador, escolher um dos itens e aguarda um comando de execução
4. ao chamar o código o hardware no cartucho vai trocar de banco
5. banco trocado o código faz a chamada ao FFFC do jogo escolhido para iniciar corretamente
6. todos ficam felizes para sempre ....

Não, ainda não ficam, porque se você trocou o banco no cartucho no passo 4, o endereço seguinte que o código que esta sendo executado pelo console, não será mais do código do menu e sim do código do novo banco, e o que vai conter la ?? ninguém sabe, você trocou de banco, o próximo passo seria uma chamada ao endereço FFFC que nunca será executado, pois o banco foi trocado e essa informação se perdeu, veja, você troca de banco e chama o FFFC, se trocou de banco, o que garante que a próxima instrução será uma chamada ao FFFC ?? Bom, como resolver isso ??

Veja que ao executar a chamada da troca de banco, eu preciso garantir que parte do meu código ainda esteja 'visível' pelo programa do menu para que a troca seja concluída com sucesso.

Então vamos detalhar mais um pouco o momento exato da troca:

jogo escolhido 10 (A como no exemplo)
adiciona o endereço 03C a chamada ficando 03CA
executa uma chamada nesse endereço (nessa hora o banco é trocado pelo cartucho)
agora teríamos que chamar o endereço FFFC, e que ficou de fora.

Então a solução é a seguinte:

jogo escolhido 10 (A)
adiciona o endereço 03C a chamada ficando 03CA
carregamos, ignorando ou não as informações da RAM, um código que vai terminar o processo
executamos o código da RAM
código da RAM faz a chamada 03CA
código da RAM faz a chamada FFFC
novo código do banco escolhido entra em ação e toda essa informação é perdida

Bom, como já trocamos o banco e a chamada de inicialização foi feita, não precisamos mais do menu agora certo ?? então perder a informação dele não causa problema algum.

O que ocorre na solução é que o atari precisa seguir instruções, não importa se é da ROM ou da RAM, o problema é que a RAM tem apenas 128b, muito pouco como você interessado nesse assunto já deve saber, mas na RAM precisamos de poucas instruções, apenas as de chamada, que no caso do exemplo é uma chamada, para 03CA e depois uma chamada para FFFC e pronto, isso ocupa poucos bites e da para ser colocado na RAM sem problemas.

Mas como fazer isso ?? oras, normalmente o código de qualquer jogo não começa limpando a RAM com 00 ? Basta fazer uma rotina que carregue o seu código na RAM em um endereço especifico (quando um jogo da lista for escolhido) e depois fazer uma chamada para ela, sabendo que a RAM esta alocada de 0080 a 00FF, seu código tem que estar dentro desses valores e você faz uma chamada para ele, por exemplo chamar, diretamente o endereço 0080 (ou 80) se você colocou ele no inicio da RAM ... como eu disse, depois que a chamada é feita, nada mais do menu importa, apenas que ele finalize a troca do banco, então o que tinha antes na RAM, que faz o menu funcionar, exibir as coisas certinhas, valor de cor do fundo, valor de cor das letras e tudo mais, não interessam mais agora, você ignora tudo tacando la seu novo código e executando de lá.

Bom, basicamente isso funciona ótemamente bem para um cartucho com 15 jogos de 4kb, o menu que programei tem 15 linhas (16 na verdade, a última eu utilizo para copyright).

E se for utilizar um BS com jogos 8kb com o menu ?? jogos de 8kb utilizam o A12 da ROM, suas chamadas vão ter que mudar para uma ROM maior ou vão caber metade dos jogos, ao invés de utilizar A15 a A12 da ROM, vamos utilizar A16 a A13 para os bancos e o A12 fica para o sistema de BS utilizado, mesma coisa para jogos de 16KB, sendo que esse utiliza A13 e A12 para o sistema de BS, os restantes da ROM podem ser usados para trocar seus bancos com outros jogos, no menu não é necessário mudar absolutamente nada para utilizar um jogo com BS.

Se for misturar jogos de diferentes BS fiquem espertos, jogos que não utilizam BS funcionam de boa (jogos até 4kb), jogos maiores tem que ter o sistema BS próprio para funcionar, mas jogos que não utilizam BS podem ser misturar com eles, mas cuide para que as ROMs dos jogos estejam do mesmo tamanho, dobrando ou quadruplicando as roms de 4kb para ficar do tamanho dos jogos que usam o BS.

Teoricamente, os BS mais utilizados são F8 e F6, com jogos de 8kb e 16kb respectivamente, e na teoria, um jogo dobrado de F8 TERIA que funcionar no BS F6, mas na pratica, metade dos jogos não funciona, então é melhor não misturar, ou se você tiver saco, ir testando quais vão funcionar e colocar uma lista aqui para gente consultar depois =-D

Bom, e se eu quiser um cartucho com mais que 15 jogos ?? Ai você vai ter que se virar =-)) eu desenvolvi algumas soluções, mas eu sou perfeccionista, tive que entrar em acordo comigo mesmo de qual utilizar, eu cheguei em 2 soluções plausíveis e tive que optar por uma delas.

Uma delas foi via código, você precisa de um registrador para cada tela cheia (até agora, expliquei como ter somente 1 tela cheia certo?), e um registrador para as páginas (que são bancos de 16 bancos, parece difícil né ? hehehe) para exemplificar novamente, imagine somente jogos de 4kb, os bancos que controlamos pelo menu são A15 a A12 .. se na ROM tiver o pino A16 moscando (27C010 por exemplo) ele pode controlar 2 páginas, cada página com um conjunto desse explicado (15 jogos). Então você pode controlar via código, que seria fazer uma chamada especifica que controle somente o registrador que cuida das páginas, nesse caso não fazendo nenhuma chamada ao FFFC pois você não quer trocar o jogo, quer continuar no menu, é mais simples que trocar de jogo, faz a chamada sem carregar código algum na RAM, sem fazer chamada nenhuma além da chamada que troca justamente a página (e obviamente é diferente da chamada que troca do menu para o jogo escolhido).

Essa solução é ótema, porém tem um efeito colateral que me irritava bastante, ao fazer a chamada da troca de páginas, funcionava, mas a tela dava uma piscada, e isso irritava, pois comecei a montar cartuchos com muitos jogos (cartucho de 240 jogos tem 16 páginas), mas tem a facilidade de fazer isso com o controle na mão, você coloca para direita, a pagina aumenta, coloca para esquerda, a pagina diminui e tal, comodidade 10.

A outra solução que tive e acabei usando pois não existe a piscada na tela, é de colocar um botão no cartucho, ele age diretamente no registrador (que agora não é mais um registrador, é um contador binário), existem vários tipos de contadores e usei o mais comum, que somente conta para cima (somando e não diminuindo) e para isso a parte chata é ter que adicionar um botão no cartucho que faz a contagem, foi uma escolha, como a pessoa escolhe o jogo e depois pode ficar horas jogando, achei que não seria tão ruim assim, o problema é alguém apertar o botão com o jogo já escolhido, entenderam que vai dar merda né ?? hehehe

Bom, é isso, tudo o que eu aprendi sozinho obviamente, apenas lendo uma coisa e outra por ai, fazendo engenharia reversa em alguns cartuchos e tals, foi o que passei para vocês ai.

Gostaria de ter contato de quem se meter a besta e montar o seu modelo, trocar ideias, de repente uma solução diferente para os problemas que enfrentei etc.

Dablio.