Anúncios

A história de um emulador

Não é todo dia que você esbarra em alguém que efetivamente programou um emulador de videogame. Todo retrogamer, colecionador e até aquele nostálgico ocasional que digitou “jogar atari online” no Google pra lembrar da cara de River Raid deve muito a estes verdadeiros herois da programação.
Amigos do Cosmic Effect, gostaria de apresentar o Alan Freitas, 32 anos, residente na capital federal deste país. E, falando em ser brasileiro, este cara não desistiu e… escreveu seu próprio emulador de Master System. Insisto para que acompanhem a história do emulador do Alan, que arregaçou as mangas e saiu da tela preta!
O artigo está genuinamente emocionante. Alan, seja bem-vindo!

Uma breve retrospectiva

Faço parte da geração nascida na década de 80, tendo acompanhado o universo dos jogos eletrônicos desde o estrondoso sucesso do Atari 2600. No início dos anos 90 eu já tinha o console há alguns bons anos.

Certo dia, um vizinho me chamou para ir até a sua casa onde vi algo impressionante: o jogo Choplifter rodando no seu Master System.

Aquilo que presenciava era, de fato, um salto qualitativo muito substancial em relação ao que já estava acostumado a ver no velho Atari. O jogo era muito dinâmico, tinha uma ação ininterrupta, seus gráficos eram espetaculares e a música, empolgante.

Lembro de ter jogado um pouco e o meu desempenho não foi dos melhores. Mas isso não importava, pois o meu objetivo estava claro: eu precisava ter um Master System.

O 8-bit da SEGA.

Chopper Command do Atari 2600.

Choplifter do Master System. A evolução era notável.

Algum tempo depois ganhei o console e, ao longo dos anos seguintes, tive muitos bons momentos com ele.

Minha rotina era semelhante a de muitos jogadores brasileiros: devido ao preço dos cartuchos e a uma certa disciplina parental, o esquema era alugar os jogos no sábado, jogá-los intensamente ao longo do fim de semana e devolvê-los na segunda-feira.

Pude apreciar boa parte do catálogo da plataforma, embora sempre restassem alguns títulos cujos gráficos se mostravam bastante atraentes nos encartes que acompanhavam o console, mas eram impossíveis de se encontrar nas locadores as quais tinha acesso.

Vem à memória o jogo Basketball Nightmare, com uma cena espetacular de um garoto fazendo uma cesta, em close.

Imagem chocante no encarte do Master System…

O ponto alto do Master System foi o jogo Phantasy Star, ao qual dediquei várias horas com amigos. Sei que é chover no molhado, mas a qualidade deste título, sobretudo se levarmos em conta quando e para qual plataforma foi produzido é algo que impressiona até hoje.

Pela primeira vez pude, em um jogo, acompanhar um enredo com um certo grau de desenvolvimento, em uma escala verdadeiramente épica (estamos falando de viagens espaciais entre três planetas), com vários mistérios a solucionar e, claro, gráficos e sons de altíssima qualidade.

Impossível não admirar a fluidez com que os extensos labirintos são percorridos, assim como a bela arte realizada principalmente nas cutscenes (outro aspecto inovador) e nos monstros.

Phantasy Star, um feito maiúsculo.

Como muitos de nós, guardo um certo arrependimento por ter vendido o console com a finalidade de seguir à próxima geração. Naturalmente, precisava do dinheiro para comprar o poderoso Mega Drive, que chegava proporcionando um outro avanço tecnológico espetacular.

O nascimento da idéia

Saltemos para o ano 2003. Após concluir a graduação em Computação, senti vontade de trabalhar em um projeto no qual pudesse exercitar alguns dos conhecimentos mais relevantes estudados na universidade.

Ambicionava explorar um pouco mais a parte de arquitetura de computadores e também computação multimídia, em um contexto de programação orientada a objetos.

Tive a idéia de criar, do zero, um emulador de Master System na linguagem C++. Parecia perfeito: os requisitos técnicos e a paixão pelo tema estavam lá, juntamente com um nível de desafio apreciável. O codinome também estava escolhido: Arisa.

Arisa. Ou Alis Landale.

Definindo o escopo

Certamente que não havia necessidade de, do ponto de vista prático, desenvolver um emulador de Master System. A plataforma já contava com vários emuladores muitíssimo competentes, cada qual com sua vocação: velocidade, acurácia, filtros, ferramentas de debug, etc.

Não se tratava, pois, desde o início, de uma iniciativa para trazer à cena mais um emulador disponível na Internet para download. Como já exposto, tratava-se de uma espécie de exercício particular.

FreezeSMS, Meka, Fusion e SMS Plus.

Conhecendo a arquitetura

Decisão tomada, era necessário entender como funcionava a máquina projetada pela SEGA. Para tal, comecei a buscar informações sobre a plataforma.

Nessa fase o site SMS Power se mostrou de grande valia, reunindo muita documentação com excelente nível de detalhes.

Placa de circuito do Master System. O chip central, no alto, é a CPU Z-80.
Foto: classiccomputer.de

Emulando o Z-80

De importância fundamental em qualquer computador, a CPU é candidata óbvia a ser emulada primeiro. Busquei livros e documentações online sobre o Z-80, o processador central do Master System.

Consideremos que o jogador apertou o botão de pulo no Sonic the Hedgehog. Muita coisa acontece:

  • Entrada: é feita a leitura do estado do botão, ou seja, apertado.
  • Lógica: é feita uma verificação se Sonic encontra-se sobre o solo ou uma plataforma, o que viabiliza o salto.
  • Aritmética: o movimento de salto é calculado, levando em consideração o estado presente do personagem (posição, velocidade, etc) e a simulação física concebida pelo programador (gravidade, inércia, etc).

Como compreender o coração do Master System?

Uma questão de interpretação

Uma técnica apropriada para a emulação de um processador como o Z-80 é a chamada interpretação.

Programar um interpretador basicamente consiste em criar, em uma determinada linguagem de programação, variáveis que guardem o estado de cada estrutura interna do processador, além de reproduzir o comportamento de cada instrução, à medida em que o programa é executado.

É, de fato, análogo ao trabalho de um intérprete: trata-se de um processo de tradução, em tempo real, de uma linguagem para outra.

As coisas não são tão simples…

Fazer uma descrição completa da arquitetura de uma CPU foge do escopo desse artigo, mas podemos dizer que o Z-80 é dotado de complexidade nada desprezível.

O processaodr da Zilog disponibiliza 252 diferentes instruções (opcodes, sendo mais exato) para o seu programador. 

Anúncio do competente Z-80 na revista Electronics em 1976.
(Imagem: domínio público)

Com isso, é evidente que a quantidade de código necessária para implementar o interpretador também é substancial.

Além de relativamente longo, o processo também trazia uma série de dúvidas: será que eu estava indo pelo caminho certo? Será que minha interpretação da documentação estava correta?

E se eu tivesse falhado em compreender algum conceito fundamental e todo aquele código sofresse de algum vício dificilmente sanável? 

Bem, não havia muitas opções a não ser estudar atentamente o material e codificar com cuidado.

Passei algumas semanas programando o interpretador. Implementei o que os programadores chamam de um “ambiente de debug”.

Amigos leitores, finalmente a palavra “jogo” aparece: com este ambiente pronto, eu podia acompanhar as alterações nos valores armazenados nas entranhas do Z-80 e da memória, durante a execução do Alex Kidd in Miracle World.

Apesar de não poder ter certeza, as coisas pareciam ir bem: eu conseguia ver que um jogo carregado parecia estar inicializando o processador e memória RAM emulados, num processo análogo ao de um PC ao ser ligado.

Também via o que parecia ser o carregamento de dados (gráficos, músicas?) na memória, entre outras coisas. 

Porém, era apenas uma visão “binária” naquele momento.

Não havia qualquer imagem do jogo rodando, como quando estamos, er… jogando.

Faltava outra peça-chave: o processador de vídeo (VDP).

Entrando no mundo dos pixels

Hoje temos nos PCs e consoles placas de vídeo com um poder computacional absurdo, que conseguem renderizar imagens com um grau de realismo realmente impressionante.

Na época dos 8-bit, os processadores de vídeo eram relativamente primitivos, e o limitado poder computacional das CPUs de então também deixava as coisas mais complicadas.

Como produzir gráficos atraentes e dinâmicos em uma velocidade aceitável? 

A resolução de 256 x 192 pixels do Master System pode parecer pífia para os padrões atuais, mas estamos falando de quase 50 mil pontos na tela. Era impossível manipular cada um deles de forma individual em tempo real. A solução clássica, simples e genial: Tiles.

Asterix, com os tiles ressaltados…

Como vocês estão carecas de saber, qualquer jogo da época, por mais complexos ou sofisticados que sejam os seus gráficos, é uma espécie de mosaico.

Os artistas desenhavam todos tiles de tal maneira que, arranjados corretamente, eles se integrassem de forma harmoniosa na tela.

…aqui, o conjunto de tiles usado na cena anterior…

Os tiles são formados a partir uma paleta de 16 cores para os sprites e mais 16 cores para o cenário.

Essas cores podem ser escolhidas dentro de um universo de 64 possíveis.

Paleta

…e, por fim, a paleta de cores da mesma cena.


Como estamos lidando com um hardware que possui muito pouca memória, se for possível reutilizar um mesmo tile fazendo seu espelhamento isso pode economizar bytes preciosos.

Assim, tínhamos belos gráficos em tela cheia.

Alguns efeitos colaterais curiosos apareceram. Inconsistência do ponto de vista físico era um dos campeões e hoje pode ser considerado um charme peculiar ao visual dos jogos eletrônicos.

Note a iluminação na cena abaixo.

Espelhamento de tiles em Phantasy Star.
Repare que a cena é perfeitamente simétrica, até nas sombras…

Tamanho não é documento

Após sentir-me seguro com a emulação do Z-80, o processador de vídeo era o próximo desafio. Menos código que o da CPU, porém com muitas particularidades e uma boa dose de complexidade.

É uma forma de conceber a montagem e exibição de imagens bem peculiar; muito diferente do que se faz na computação hoje em dia.

Aqui as inseguranças se intensificaram. No Z-80, eu inspecionava seu estado ao longo da execução. Dava pra ter uma impressão do funcionamento.

No caso do VDP… eu trabalhava às cegas, sem ter por muito tempo uma interpretação da representação binária em debug que me auxiliasse.

Fui em frente, esperando que meu entendimento dos documentos estivesse correto…

Uma grande emoção

Após algumas semanas, terminei a codificação da emulação do VDP. Junto com a emulação do Z-80 e das memórias RAM e ROM, também concluídas, isso deveria ser suficiente para executar um jogo comercial.

Claro que certamente existiam bugs no meu código; Mas, com sorte, talvez um jogo rodasse, ainda que de forma defeituosa.

A hora havia chegado: carreguei a ROM de Alex Kidd in Miracle World e após breves instantes de tensão…

 Nada além de uma tela preta.

Animador…

De certa forma, era esperado. Muito código e, pela própria natureza do problema que ele se propunha a resolver, um pequeno bug em qualquer trecho poderia causar uma falha em exibir qualquer coisa que lembrasse o jogo original.

Tentei outros jogos, com esperança de que algum funcionasse. Nada feito.

Um aspecto cruel de um emulador é que, diferentemente da maioria dos softwares, você muitas vezes não tem idéia de onde pode estar o problema do seu código. Isso porque o programa se comporta como a máquina na qual o jogo executa, mas o desenvolvedor do emulador pouco ou nada sabe sobre o código do jogo em si!

Paradoxalmente, é aí que reside a beleza pouco convencional do conceito da emulação: o jogo executando nada “sabe” sobre estar executando em um emulador, e não na máquina real.

A beleza de dar vida a um cartucho de Master System sem consumir espaço físico…

Por outro lado, o programador do emulador nada sabe sobre o código do jogo em si. Ele “apenas” implementa um software que se comporta como um hardware.

Não é necessário saber programar um jogo para aquela máquina. À medida que eu me embrenhava nas entranhas daquilo tudo, observando internamente a execução dos jogos… foi possível perceber a qualidade excepcional daqueles programadores.

Pude ver, desta vez com olhos de programador, quão impressionante eram seus resultados em plataformas tão limitadas.

Voltando aos bugs do nosso emulador. Foi um processo longo e tedioso. Todo programador sabe que criar código é bacana. Corrigi-lo, quase nunca. 

Após finalizar essa primeira revisão geral (dias depois), carreguei Alex Kidd in Miracle World novamente e… 

Escutou a musiquinha daí?

Funcionou! A tela de apresentação apareceu, mostrando várias cenas do jogo. Logo em seguida começou a demonstração: Alex Kidd percorria a fase em alta velocidade com a sua motocicleta!

Um momento de grande emoção, pois era o resultado de um longo trabalho sem resultados intermediários. Julguei, algumas vezes, que poderia ser, no fim, algo infrutífero de minha parte.

Mas não foi!

Alex Kidd: um cara maneiro.

Inevitável também o sentimento de nostalgia dos tempos da jogatina no Master System real. De alguma forma eu me aproximava um pouco mais daqueles admiráveis engenheiros, programadores, artistas gráficos, músicos, entre outros, que deixaram, com sua inteligência e criatividade, um legado tecnológico e cultural bastante relevante.

Uma mancada

Ao ver o game executando com aparente perfeição, o instinto falou mais alto: meus dedos deslizaram para o teclado, visando efetivamente jogar o jogo.

A demonstração seguiu, inabalada.

Claro: eu não havia implementado o input do joystick!

Ávido por jogar Alex Kidd sendo “empurrado” por Arisa, consultei correndo a documentação sobre o console, para aprender sobre o joystick do Master.

Até que foi rápido — bonus stage? — e pude, então, jogar Alex Kidd in Miracle World.

Mais algumas correções, rumo a uma conclusão 

Depois dessa primeira partida, rapidamente testei outros jogos. A maioria executou sem problemas, mas alguns apresentaram inconsistências, como comportamentos bizarros nas colisões ou nas cores. 

Corrigi mais alguns bugs, o que fez com que mais jogos executassem perfeitamente. Ainda restavam alguns detalhes que poderiam ser melhorados. Nesse período eu também comecei a programar a emulação do som. 

Havia, entretanto, uma nítida queda na motivação. Sentia que o desafio particular que havia proposto a mim mesmo tinha sido superado. Como nunca pensei em disponibilizar Arisa para terceiros, acabei abandonando o projeto aos poucos. 

Hoje não julgo provável retomar o desenvolvimento, mas foi algo no qual gostei muito de trabalhar. Sem dúvida foi um dos softwares mais legais que programei.

Valeu a pena.

“Linguagem de comunicação

Confesso que tive dúvidas sobre a redação desse texto no que diz respeito ao escopo.

Ao mesmo tempo que emuladores têm importância central no universo retrogamer, é muito fácil se aprofundar em questões excessivamente técnicas que podem alienar um leitor que, embora interessado no assunto, não esteja familiarizado com arquitetura de computadores ou programação. Dessa forma, tentei mesclar a tecnologia com os aspectos mais humanos e históricos.

Não sei se fui bem-sucedido, mas estou à disposição para tentar dirimir dúvidas, fornecer algum aprofundamento ou ainda esclarecer algum ponto que não foi devidamente explanado.

Muito obrigado aos leitores do Cosmic Effect!

* * *

Anúncios

Solar Fox (Atari 2600)

A Atari anda chateada com alguns desenvolvedores atuais. A companhia tem removido das lojas de aplicativos qualquer jogo que tenha a menor semelhança com seus títulos antigos. A popularidade do iPhone e Android como plataforma de games tem chamado a atenção da empresa que criou a indústria dos videogames. Assim como a música pop mostrou-se ser um movimento de estilos cíclicos, os jogos eletrônicos também têm demonstrado esta característica. Talvez, exatamente agora, estejamos justamente vicenciando a completude do seu primeiro ciclo.

Afinal, o que jogávamos no início dos anos 80? Qual era a mecânica predominante? Se você pensou nos assim chamados “jogos casuais”, estamos em pleno acordo. Outro dia saiu na loja de aplicativos da Apple um jogo intitulado Vector Tanks. Sim, Battlezone… “reimaginado” para os smartphones branquelos. Pois é amigos, quem diria: o Atari Flashback é muito mais do que o nome daquele console retrô sucesso de vendas nos EUA…

E ainda há muito terreno para peregrinação, especialmente no Atari 2600. Com seu hardware inspirador para engenheiros e programadores da época, não há como negar a genialidade eterna de certos títulos. Sem mencionar os Pitfalls e H.E.R.O.s da vida, temos ainda em sua biblioteca centenas de jogos de mecânica cativante, viciante e rápidos de compreender: a originalidade, para uns tão difícil de ser encontrada na indústria dos jogos, pode ser vista de camarote por aqueles que continuam jogando este console até os dias do hoje; até o final dos tempos…

Solar Fox pode vir a ser um bom exemplo. Um port relativamente fiel ao original de arcade da Midway, é um dos cartuchos desconhecidos que tem muito a oferecer no terreno da jogatina rápida, gratificante e — como estamos falando de retrogaming e não de jogos de smartphone — desafiadora.

Alguma coisa relacionada com o nosso planeta necessitando obter células de energia fora do nosso sistema solar por conta dos “séculos de desperdício” dos humanos e… ah, ora, onde é que eu atiro?

Em Solar Fox, o jogador controla uma espaçonave com movimentos limitados a uma grade não-visível, devendo comer quadradinhos (as “células solares”) em 20 fases diferentes, mais 6 de bônus. A nave nunca deixa de se movimentar na tela e, ao manter pressionado o botão do joystick, voa mais rapidamente. Há dois sentinelas protegendo as células, disparando bolas de fogo. E não, você não atira.

O negócio é rapidamente desviar-se das bolas de fogo e tentar comer os quadradinhos o mais rápido possível. Comeu todos, próximo rack (fase). Até o sexto rack, cada célula (quadradinho) é única; a partir da sétima fase, as células são duplas, obrigando o jogador a passar duas vezes (similar a Q-Bert nos estágios mais avançados, onde os cubos precisam ser “pisados” mais de uma vez). Aqui entra uma novidade interessante: o “Skip-A-Rack™” (Sim, trademark: há um “Featuring the Skip-A-Rack Timer” gravado na caixa original do cartucho, hehe).

Se o jogador consegue comer todas as células antes do timer exibido no canto inferior-esquerdo da tela terminar, a próxima fase é pulada completamente — e o  melhor: todos os pontos referentes à mesma são somados ao score. Sacada genial: estimula a velocidade do jogador e, ao mesmo tempo, pode virar sua própria ruína: uma morte e o timer desaparece naquela fase, sem chance para tentar de novo. Mas você não deixa de correr no próximo rack: afinal, quem nunca desejou pular completamente uma fase? Mais gratificante, impossível! :) Algo similar acontece nas fases de bônus, porém o benefício neste caso é, no mínimo, curioso: se o jogador completar o Challenge Rack antes do medidor “challenge” desaparecer, é exibida uma letra na tela. E só.

Estes mistérios eram uma delícia, cortesia da época do Atari. Uma letra e nada mais. Como naquele tempo nem sempre (ou quase nunca) tínhamos acesso aos manuais dos jogos, estes acontecimentos tinham um sabor diferente. “H”, é a primeira letra exibida ao completar o primeiro Challenge Rack com sucesso; 5 fases depois, mais uma de bônus… e, caso consiga novamente comer todos os quadradinhos antes do CHALLENGE! desaparecer por completo, mais uma letra: “E”. Um código? O que devo fazer, anotar? Sim… havia algum tipo de prêmio oferecido pela CBS, possivelmente um emblema de pano similar ao que a Activision costumava enviar aos jogadores que “destravavam certos achievements” em seus jogos.

A partir do sétimo rack, com as células duplas, o desafio dá um verdadeiro salto. Há momentos emocionantes com você no controle, concentrado, desviando-se das bolas de fogo e, ao mesmo tempo, buscando o trajeto mais otimizado. É um daqueles jogos nos quais seu cérebro, após algumas partidas, consegue responder tão rapidamente que nem você mesmo acredita. Tanto que a última jogadinha do dia é a que costuma deixar o high-score. Claro que as aleatoriedades dos tiros dos sentinelas podem sabotar seu bom desempenho numa jogada aquecida… bom, é a vida no Atari 2600.

Também, Solar Fox apresenta o tipo de mecânica onde o desempenho costuma ser maior para aqueles que fazem questão de utilizar a excelente alavanca original do Atari 2600, ainda que jogando no teclado (por emulação) há a sensação imediata de estar jogando o bom e velho Nibbles que acompanhava os antigos MS-DOS e, mais tarde, os celulares.

Com incríveis 8 KB, Solar Fox é um ilustre desconhecido que até obteve melhor êxito comercial no console em comparação com o desempenho do original de arcade onde, por sinal, é possível atirar, o grid é visível e há presença de inimigos no campo de jogo — justificando o poder de fogo de sua nave. Sábia decisão do programador que fez o port ao remover o tiro da versão do Atari 2600 pois, ao jogá-lo no MAME, tive a impressão de estar lidando com um jogo típico de nave: atirando, sua estratégia muda naturalmente para algo mais ofensivo, digamos assim. De qualquer maneira, provavelmente o tiro foi removido do Atari por limitação do hardware ou mesmo pela falta de um botão adicional no controle… nunca saberemos.

Para exibir até uma dezena de bolas de fogo em movimento na tela, foi usado a famosa técnica de flicker, aquela do Pac-Man, onde os sprites são desenhados rapidamente em locais diferentes e a fosforecência das TVs da época garantiam a persistência do objeto na tela. Tanto que capturas de tela por emulação nunca captam mais do que duas bolas de fogo… mas não se engane: são até uma dezena delas na tela em alguns momentos na versão do Atari!

Claro. Solar Fox é “mais um jogo de Atari”, console de acervo díspare e pouco confiável por conta da liberdade de desenvolvimento, próprio de um tempo anterior ao conceito “[insira nome de uma empresa de console aqui] Seal Of Quality”. Mas não encare o Atari 2600 apenas pela nostalgia: há, sim, títulos desconhecidos que merecem atenção especial do velho retrogamer que há em todos nós.

Para ilustrar: pequeno vídeo com a “sexy” propaganda americana
do Solar Fox e uma partidinha aquecida (risos) do Cosmonal,
capturada diretamente do Atari da Polyvox do SuperConsole :)

Pelo jeito, a nova geração de jogadores de telefones celulares já esqueceu Nibbles e, volta a pergunta — desta vez, para eles: “Have you played Atari today”? Os atuais desenvolvedores de jogos casuais que o digam…

SCORE

GAMEPLAY: Mais direto e interessante do que a versão original de arcade 5/5
GRÁFICOS: Deixa a desejar, para onde foram os 8 KB? :) 2/5
SOM: Efeitos sonoros demasiadamente tradicionais, ruído branco “basicão”  2/5
TRILHA SONORA: “Arpejo de programador” no start, F- neste quesito! (risos) 1/5
DIFICULDADE: Suas partidas costumam durar menos de 5 minutos… 4/5

DADOS

NOME: Solar Fox
PLATAFORMA: Atari 2600, Commodore 64 e Arcade
DISPONÍVEL EM: Cartucho/ROM
ANO: 1983
DESENVOLVEDORA: Midway
DISTRIBUIDORA: CBS Electronics

* * *