No shopping Boulevard em BH tem um arcade da Dona Barata! Apesar de ter projetado esse arcade, eu nunca tinha visto um de perto!
Por volta de 2003, o que estava bombando era o DDR. Nessa época, tinha um fábrica nacional era que especializada em importar placa de street fighter e montar o gabinete por aqui, e eles queriam entrar na onda no DDR também. Então eles foram até a USP perguntar se alguém por lá saberia projetar um clone. Acabou que o projeto caiu na mão da minha equipe, e o plano era fazer um DDR-light para crianças, você tinha que pisar em baratinhas que acendiam no chão.
Eu fiquei com dois pedaços do projeto: a lógica do jogo e o subsistema de som. Cada um tem uma anedota :)
Para a lógica do jogo, nós escolhemos uma variante do 8051 que tem tudo num chip só: cpu, ram, rom e i/o. O código eu fiz todo no assemblão mesmo, mas a dificuldade era: como testar? Não tinha emulador, então o único jeito de testar era gravando a eprom do chip e plugando na placa.
Mas que desperdício né? Queimar um chip a cada teste! Foi aí que a gente teve uma idéia muito boa. Internamente, a eprom tem todos os bits setados em 1, o processo de queimar o código nela deixa os bits 1 como estavam, e queima os bits 0 de maneira permanente. Mas o jogo inteiro era pouco menos de 1kb, e a eprom interna era maior que isso (32kb se minha memória não falha).
A solução foi olhar na tabela de opcodes do 8051 e notar que o NOP codifica como 00! Então quando eu queria testar o código, era só preencher 1kb de NOPs na frente do código, assim eu podia reutilizar o mesmo chip. A única diferença é que demorava alguns microsegundos a mais no boot para percorrer todos os NOPs no começo até chegar no código. Com isso conseguíamos usar o mesmo chip 32 vezes :)
O subsistema de som foi divertido também. Para o som rodar em paralelo com o 8051, decidimos fazer um chip dedicado só pra isso (eu implementei o chip em vhdl e na placa ele era uma fpga). O problema era a rom, para ficar barato eu tinha que enfiar a trilha sonora inteira dentro de 1MB, então tinha que rolar uma compressão bonita.
Depois de quebrar a cabeça um pouco, eu consegui bolar um algoritmo para comprimir a música. Eu levei o sample pro gerente ouvir, e o diálogo foi mais ou menos assim:
- Ficou muito boa a qualidade, Ricbit! Que método você usou?
- ADPCM de 5 bits.
- Não, peraí. Eu sou engenheiro de áudio faz anos, eu SEI que não dá para fazer essa qualidade com 5 bits. Pode falar a verdade, qual método você usou?
- ADPCM de 5 bits.
E realmente era ADPCM de 5 bits! Mas eu usei um truque. :)
O DAC na saída era uma rede R2R de 12 bits, mas eu usava só 5 bits por vez. A cada 10ms eu media a potência na saída, e escolhia só os 5 bits mais altos desse trechinho de audio. Isso introduz ruído de quantização, mas na prática o ouvido humano faz mascaramento, então você não ouve esse ruído. É o mesmo método de compressão com perdas que o mp3 usa, só que de um jeito mais fácil de implementar em hardware.
No fim nós entregamos o projeto pronto e eu nunca cheguei a ver como ficou montado, hoje foi a primeira vez. E ainda tive a oportunidade de ver uma menina de 8 anos brincando no arcade, então eu sei o jogo deve ter ficado divertido :)
Por volta de 2003, o que estava bombando era o DDR. Nessa época, tinha um fábrica nacional era que especializada em importar placa de street fighter e montar o gabinete por aqui, e eles queriam entrar na onda no DDR também. Então eles foram até a USP perguntar se alguém por lá saberia projetar um clone. Acabou que o projeto caiu na mão da minha equipe, e o plano era fazer um DDR-light para crianças, você tinha que pisar em baratinhas que acendiam no chão.
Eu fiquei com dois pedaços do projeto: a lógica do jogo e o subsistema de som. Cada um tem uma anedota :)
Para a lógica do jogo, nós escolhemos uma variante do 8051 que tem tudo num chip só: cpu, ram, rom e i/o. O código eu fiz todo no assemblão mesmo, mas a dificuldade era: como testar? Não tinha emulador, então o único jeito de testar era gravando a eprom do chip e plugando na placa.
Mas que desperdício né? Queimar um chip a cada teste! Foi aí que a gente teve uma idéia muito boa. Internamente, a eprom tem todos os bits setados em 1, o processo de queimar o código nela deixa os bits 1 como estavam, e queima os bits 0 de maneira permanente. Mas o jogo inteiro era pouco menos de 1kb, e a eprom interna era maior que isso (32kb se minha memória não falha).
A solução foi olhar na tabela de opcodes do 8051 e notar que o NOP codifica como 00! Então quando eu queria testar o código, era só preencher 1kb de NOPs na frente do código, assim eu podia reutilizar o mesmo chip. A única diferença é que demorava alguns microsegundos a mais no boot para percorrer todos os NOPs no começo até chegar no código. Com isso conseguíamos usar o mesmo chip 32 vezes :)
O subsistema de som foi divertido também. Para o som rodar em paralelo com o 8051, decidimos fazer um chip dedicado só pra isso (eu implementei o chip em vhdl e na placa ele era uma fpga). O problema era a rom, para ficar barato eu tinha que enfiar a trilha sonora inteira dentro de 1MB, então tinha que rolar uma compressão bonita.
Depois de quebrar a cabeça um pouco, eu consegui bolar um algoritmo para comprimir a música. Eu levei o sample pro gerente ouvir, e o diálogo foi mais ou menos assim:
- Ficou muito boa a qualidade, Ricbit! Que método você usou?
- ADPCM de 5 bits.
- Não, peraí. Eu sou engenheiro de áudio faz anos, eu SEI que não dá para fazer essa qualidade com 5 bits. Pode falar a verdade, qual método você usou?
- ADPCM de 5 bits.
E realmente era ADPCM de 5 bits! Mas eu usei um truque. :)
O DAC na saída era uma rede R2R de 12 bits, mas eu usava só 5 bits por vez. A cada 10ms eu media a potência na saída, e escolhia só os 5 bits mais altos desse trechinho de audio. Isso introduz ruído de quantização, mas na prática o ouvido humano faz mascaramento, então você não ouve esse ruído. É o mesmo método de compressão com perdas que o mp3 usa, só que de um jeito mais fácil de implementar em hardware.
No fim nós entregamos o projeto pronto e eu nunca cheguei a ver como ficou montado, hoje foi a primeira vez. E ainda tive a oportunidade de ver uma menina de 8 anos brincando no arcade, então eu sei o jogo deve ter ficado divertido :)
Muito classe.
ResponderExcluir