3DNES Update e Férias

Finalmente férias, depois de um semestre cansativo chegou a hora de aproveitar esse pequeno intervalo para aprimorar meu conhecimento (principalmente na área de eletrônica e exploit, haha), mas de qualquer forma o foco dessa publicação não foi falar do passa tempo das férias e sim do meu hobby na área da emulação.

Para quem não sabe eu e o gdkchan escrevemos um emulador de NES para Nintendo 3DS, que por sinal fez um ótimo sucesso, porém na época por motivos de falta de conhecimento e documentação ele era/é lento em alguns jogos e de certa forma isso é irritante, mesmo implementando frameskip em alguns jogos a velocidade não melhora muito(principalmente jogos que utilizam o mapper MMC3 como Mega Man 3,4,5 e 6), então uma maneira que vi observando(que é utilizado pelo blargSNES) é escrever a CPU em Assembly, porém utilizando um pequeno *truque* para deixar a CPU mais rápida, mas antes de falar do truque, vamos falar um pouco sobre a CPU do NES:

O NES utiliza uma CPU semelhante ao MOS 6502 (podemos dizer que é uma versão personalizada dessa CPU) feita pela Ricoh e funciona a velocidade +- ~= 1.8mhz, possui registradores com 8 bits (X, Y, A, SP, SR) e o PC tem 16 bits e tem 11 addressing modes, é uma CPU simples e ótima para quem deseja iniciar na área da emulação.

Sabendo da estrutura da CPU do NES, fica mais fácil de entender o truque, basicamente para todas as operações realizadas no nosso interpretador (não é possível fazer JIT no 3DS por que o núcleo que roda os jogos tem NX Bit e não permite alocarmos e executarmos páginas, anyway), o truque é fazer todas as operações do nosso interpretador utilizando os registradores do ARM (como se fossem nossos registradores), que é basicamente toda vez que a CPU for ser executada, carregamos todos os registradores do *NES* da memória para os registradores do ARM e realizamos todas as operações em cima deles (vale também ressaltar que além do ganho de velocidade, fica mais fácil realizar optimizações no código, mesmo o compilador *sendo inteligente*, existe maneiras de deixar o código melhor). Além desse pequeno truque, outro ponto importante que estou focando é escrever todos os mappers em Assembly.

Enfim, esse é o pequeno progresso que estou tendo com o emulador, fora as dicas que recebi de várias pessoas e pedidos para implementar, ao finalizar toda a implementação da CPU irei da um foco no Disk System e na APU, de qualquer maneira, falarei mais sobre o progresso do emulador aqui.

This entry was posted in Emuladores and tagged , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *