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:


             1 0 1 0
             | | | |
             | | | +--> Q1
             | | +----> Q2
             | +------> Q3
             +--------> Q4  

     Vejam acima, a saida que corresponde a cada bit do CD4040, onde ele tem a saida 1 é o que nos interessa, então, nesse caso, nos interessam as saidas Q2 e Q4, analizando o 1010 (11° combinação) .. 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 portasum circuito simples seria 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.