segunda-feira, 10 de junho de 2013

Recompilando estaticamente jogo de NES como binário nativo

Vi esta notícia no BR-Linux

Fonte: Wikipédia.
Uma das abordagens mais empregadas para rodar jogos antigos é a emulação, onde um programa interpreta o código de máquina cada instrução por vez, e o traduz para o sistema em que está sendo executado. No caso do NES (Nintendo Entertainment System) há, entre outros emuladores, FCE Ultra e Nestopia

Porém o que Andrew Kelley fez é diferente: compilou um jogo (no caso, Super Mario Bros) para produzir um binário nativo pronto para rodar em Linux de 64 bits. O vídeo abaixo ilustra o processo: 



Como é comum para os jogos de 8 bits, os programadores faziam otimizações agressivas no código dos jogos, onde era muito comum o reuso de partes de certas instruções para economizar preciosos bytes. Entretanto isso dificulta a compilação, pois um mesmo trecho do código pode, dependendo de como foi chamado, produzir diferentes resultados. Esta e outras dificuldades levaram Andrew a concluir que a sua abordagem não é muito prática para rodar jogos clássicos.

Apesar disso, pessoalmente, eu acho que é uma forma válida para apreciar os antigos jogos nos sistemas modernos. Seria muito interessante poder compilar alguns megagames do TK90X para o Linux. 

4 comentários:

  1. Existem inúmeros emuladores que, para melhorar o desempenho, transformam de forma automática e transparente o assembly da máquina emulada em código nativo - isso é a famosa compilação Just-In-Time (JIT).

    Uma coisa legal que o autor fez foi usar as instruções da LLVM como representação intermediária entre o assembly NES e o assembly x86. Isso é interessante porque se deixa mais fácil você portar para outra plataforma (ARM, por exemplo).

    Mas nem isso é lá muito original: essa dissertação de mestrado de 2010 discute usar LLVM para recompilação dinâmica (just in time) para emuladores:

    http://www.llvm.org/pubs/2010-01-Wennborg-Thesis.html

    ResponderExcluir
    Respostas
    1. Não sabia que existia até um trabalho acadêmico a respeito, pensei que era coisa de hobbysta. Obrigado por compartilhar, Murilo.

      Excluir
  2. Coisa finíssima. Falando de LLVM (e indo ainda mais offtopic), seria possível então compilar esse código do Mario... para Javascript, da mesma maneira que a Mozilla Foundation e a Epic fizeram com o Unreal Engine 4, de modo a rodar no Firefox Nightly sem a necessidade de qualquer plugin:

    http://www.unrealengine.com/html5_faq/

    ResponderExcluir

Seu comentário é bem vindo, mas peço que use este espaço adequadamente.