sábado, 8 de março de 2014

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

Um comentário: