Tutorial de Tradução de ROMs
Artigo III
Versão 1.12: 08/08/99
Conteúdo:
1 - Tradução para NES
1.1 - Os gráficos do Nintendo
1.2 - Edição hexadecimal
1.3 - Tabelas de caracteres
3 - Software relacionado
3.1 - NESticle
3.2 - Hexposure

Começaremos agora a estudar o processo de tradução para o Nintendo 8-bit. Para traduzir uma ROM desse sistema, é importante que você tenha uma noção de como ele funciona.
A maioria dos sistemas das chamadas 3a. e 4a. gerações, como NES, Mega Drive e Super NES, utilizam o esquema de gráficos baseados em "tiles".
Tiles são pequenos retângulos, geralmente quadrados, de imagem (figura ao lado). O NES exibe seus gráficos agrupando uma grande quantidade de tiles na tela, como se a tela fosse uma matriz de tiles ou, ainda, um quebra-cabeça, no qual os tiles são as pecinhas. Se um certo jogo apresenta um carro na tela, por exemplo, deve haver armazenados na ROM alguns tiles para compor um carro. Assim, em um tile poderia estar desenhada a parte traseira do carro, em outro uma porta e em outro ainda a parte frontal do veículo. O Nintendo se encarrega de agrupar esses tiles da forma correta, apresentando o carro completo no vídeo.
No caso do NES, especificamente, cada tile tem uma largura de 8 pixels (pontos na tela) e uma altura também de 8 pixels. Como a resolução de vídeo desse sistema é de 256x240 pixels (largura x altura), é necessário apresentar 30 linhas de tiles, cada uma com 32 tiles lado a lado, para preencher a tela inteira. Ou seja, a tela do NES é uma matriz de 32x30 tiles.
Observe, no entanto, que um tile não precisa ser um "desenho". Para simplificar o sistema, os programadores de Nintendo resolveram colocar também os caracteres dentro de tiles e utilizaram, na maioria dos casos, uma relação de um tile para um caracter. Se um jogo opera desse forma, para exibir uma palavra na tela, só é necessário exibir o tile de cada caracter dessa palavra, um depois do outro.
Na prática, os tiles estão armazenados em tabelas chamadas "pattern tables" (tabelas de padrões). Cada uma dessas tabelas, possui 256 tiles. Na imagem ao lado você tem um exemplo de pattern table (são duas, na verdade).
Você se lembra de que um byte pode assumir valores de 0 a 255, não é? Isso torna tudo bem simples. Para exibir um certo tile na tela, um programador de jogos indica qual dos tiles da tabela ele quer através do valor de um único byte. Numa linguagem mais técnica, diríamos que o programador "referencia" um tile com apenas um byte, já que a cada tile está associado a um valor de 0 a 255.
Vamos parar um pouco com a teoria para ver como isso tudo funciona na prática. Você pode ver facilmente os tiles em ação utilizando o emulador NESticle (mais informações na seção 3.1).
Carregue uma ROM no NESticle, jogue até um momento em que sejam exibidos textos e gráficos no vídeo e pause o emulador. Faça aparecer o menu e clique em "View | Pattern Tables" (ou tecle <F2>).
O NESticle exibirá uma janela com as tabelas de tiles atuais (há sempre duas tabelas acessíveis em um dado instante). Cada pequena imagem apresentada na tabela é um tile. Clique em algum lugar da tabela para exibir uma janela com o tile correspondente ampliado. Nessa nova janela, há no canto superior esquerdo um número hexadecimal (após o "#"). Esse é o número ao qual o tile que você está vendo está associado. Para exibir esse tile na tela, um programador de jogos deve referenciar esse número.
Se o jogo está parado em uma tela que contenha textos, você deve ver alguns tiles com letras desenhadas nas pattern tables. Observe como os caracteres ficam ajustados na proporção de um tile para cada caracter. Clique num desses tiles em forma de letra. Será exibida, como de costume, a janela com a ampliação do tile e o seu número no canto. Conhecer o número associado a um tile que contém um caracter será uma das informações mais importantes no processo de tradução.
Uma das principais ferramentas para a tradução de textos é a alteração da ROM em um editor hexadecimal, processo também conhecido como "edição binária". No nosso caso, é altamente recomendado que utilizemos um editor hexa que seja orientado à tradução de ROMs. Neste tutorial, trabalharemos com o programa Hexposure (ver seção 3.2) para esse fim.
O editor hexadecimal costuma apresentar três campos principais na tela. No Hexposure, é exatamente o que ocorre. Na esquerda do vídeo, em forma de uma coluna, estão apresentados os endereços dos dados do arquivo (em hexa). Cada linha possui um número associado. Esse número é a posição do primeiro byte da linha dentro do arquivo. Para encontrar o endereço dos demais bytes da linha, adicione ao endereço base exibido na esquerda valores de 00h a 0Fh (a partir de agora, utilizaremos a letra "h" ao lado de um número para representar um valor hexadecimal). Dentro de uma certa linha, os endereços crescem da esquerda para a direita.
Os dois outros campos apresentados são o próprio conteúdo do arquivo. No centro da tela, estão os valores dos bytes em hexadecimal. Na direita, estão os caracteres do código ASCII correspondentes a cada byte.
O código ASCII é uma padronização para a representação de caracteres ou elementos de texto. Por esse código, cada caracter possui um valor de byte associado. Maiúsculas e minúsculas possuem valores diferentes, inclusive. Para que você tenha uma idéia, o ASCII determina os seguintes valores para as letras do alfabeto (incluindo "k", "w" e "y"):
A = 65 = 41h B = 66 = 42h . . . Y = 89 = 59h Z = 90 = 5Ah a = 97 = 61h b = 98 = 62h . . . y = 121 = 79h z = 122 = 7Ah
O ASCII é, de fato, padrão internacional para essa representação. Quando você salva um arquivo de texto, seu editor usa esses valores de byte para representá-lo. Portanto, como padrão, o Hexposure exibe os caracteres na direita baseado nesse código. No nosso caso, no entanto, não poderemos, na grande maioria das vezes, editar as ROMs baseando-nos no ASCII. Isso porque, nas ROMs de Nintendo e de outros sistemas, os caracteres estão representados pelo valor do tile em que foram desenhados e armazenados. Para contornar este problema, o Hexposure suporta um recurso conhecido como tabela de caracteres.
Uma tabela de caracteres é um arquivo que configura o Hexposure para que ele saiba que símbolos deve apresentar na coluna da direita, ao invés dos determinados pelo ASCII. A tabela terá um formato semelhante ao que foi utilizado acima para apresentar o código ASCII. Precisamos apenas observar a eliminação dos espaços em branco e apresentar somente os valores hexadecimais. Cada linha tem o seguinte formato: valor hexa = caracter.
Se montássemos uma tabela relativa ao código ASCII (o que não é realmente útil, já que o ASCII é o padrão), o arquivo teria o seguinte conteúdo:
41=A 42=B 43=C . . (complete com os demais aqui) . 58=X 59=Y 5A=Z 61=a 62=b 63=c . . (complete com os demais aqui) . 78=x 79=y 7A=z
(Observe que existe uma "falha" na seqüencia de valores entre "Z" e "a", mas isso não causa problema algum.)
A tabela é um arquivo de texto puro e pode ser criado em um editor comum. Observe que a notação hexadecimal é padrão. Criar uma tabela de caracteres é o primeiro passo para fazer uma tradução. Vejamos como proceder no caso do Nintendo.
Execute a ROM no emulador NESticle e pause o jogo no momento em que aparecerem os textos que você deseja traduzir. Clique no menu "View | Pattern Tables". Aparecendo a tabela de padrões, clique no tile da letra "A".
Agora anote em um papel o valor relativo ao tile da letra "A". Anote também o valor da letra "Z". Se existirem outros tiles com símbolos de texto (dígitos, pontuação, etc.) copie para o papel também os seus valores, um por um. Agora você pode fechar o emulador e abrir um novo arquivo de texto no seu editor preferido.
Comece a criação da tabela digitando em cada linha um valor hexadecimal, o sinal de igual e o caracter correspondente. Se as letras estavam colocadas na tabela de padrões na ordem alfabética normal, você pode ter certeza de que o valor de "B" é igual ao valor de "A" mais um e assim por diante. Quando chegar no "Z", confira o valor com aquele que você anotou, para ter certeza de que não cometeu nenhum erro na digitação da tabela.
Você pode, então, salvar a tabela como arquivo de texto puro, utilizando como nome de arquivo o nome da ROM relacionada, mais a extensão ".TBL", por exemplo: "MARIOBRS.TBL". Coloque a tabela no mesmo diretório onde se encontra a ROM e carregue essa última no programa Hexposure. A tabela de caracteres será automaticamente interpretada e as letras deverão aparecer da forma correta agora. Dê uma passeada pelo arquivo e você encontrará os textos.
Geralmente, além dos caracteres gráficos, é importante incluir na tabela também alguns caracteres especiais, tais como espaço e fim de linha. Para conseguir os valores desses caracteres, é necessário alguma observação e intuição. Uma maneira fácil de encontrar o valor do espaço é analizar um texto da ROM no editor hexa. Simplesmente observe o valor dos bytes que separam uma palavra da outra. Se esse valor sempre se repetir, deve ser o byte de espaço. Valores comuns para o tile de espaço são 00h e FFh, mas pode ser qualquer outro valor, dependendo da ROM em questão.
Para descobrir o valor do fim de linha, rode o jogo e anote alguns textos dele, marcando onde cada linha se encerra. Vá para o editor e veja se algum valor de byte se repete sempre no final das linhas de texto. Se houver um valor assim, você pode considerá-lo como o procurado.
Para adicionar os valores desse tipo de caracter na sua tabela, tome alguns cuidados. Para incluir o espaço, digite o valor hexa, o sinal de igual, um espaço e dê <ENTER> para acabar a linha.
Já o caracter de fim de linha não pode ser acessado dessa maneira. Você deve usar um símbolo para representá-lo. No Hexposure o símbolo preferencialmente utilizado é o asterisco. Isso porque, se você utilizar o asterisco como marca de fim de linha, a tecla <ENTER> passará a corresponder ao seu valor. Se em um certo jogo, o fim de linha é representado por F0h, poderia constar na tabela de caracteres uma linha como a seguinte:
F0=*
Onde você enxergar um asterisco no editor hexa, isso representará um fim de linha no texto do jogo. Para incluir um fim de linha nos textos da ROM, você apenas tecla <ENTER>. Aquele byte será exibido como asterisco, mas conterá o valor do fim de linha, como definido na tabela de caracteres.

Esta seção passará a ser incluída nos artigos de agora em diante, lhe fornecendo algumas informações importantes para o processo de tradução. Assim como o conteúdo do tutorial, as dicas se tornarão mais avançadas com o decorrer dos artigos.
A primeira recomendação é para que você faça backups regulares da ROM sendo traduzida. Tenha sempre à mão a ROM original e a última versão de sua tradução que funcione. Assim é possível fazer experiências com a ROM sem ter problemas de comprometer o jogo por causa de uma modificação indevida.
Preste atenção neste ponto. Por enquanto, procure alterar somente dados que lhe pareçam realmente textos. Modificação de outras partes da ROM podem fazer com que o jogo pare de funcionar. É importante também que você não altere o tamanho do arquivo de ROM, não aumente nem diminua o arquivo, apenas edite os bytes já existentes.
Além disso, existe um problema muito comum na tradução. Às vezes, no espaço do texto original não cabe o texto traduzido. Tente modificar a tradução para que ela caiba exatamente no espaço que o texto anterior ocupava. Não avance seu texto sobre outros bytes do arquivo. Mais adiante veremos algumas técnicas que permitem contornar essa questão.

Além de ser um dos melhores emuladores de NES da atualidade, esse programa tem muitas ferramentas que auxiliam no processo de tradução de ROMs. Não deixe de tê-lo. O site oficial é: http://www.maelstrom.net/callus/.
Voltaremos a falar nele em breve.
Um dos editores hexa para traduções com maiores opções e facilidade de uso. Pegue-o em: http://www.zophar.net/trans/tranutil.html.
Quando se carrega um arquivo nesse programa, a tabela de caracteres correspondente (mesmo nome do arquivo, mas com extensão ".TBL") é automaticamente acionada. Alterne entre os modos de edição hexadecimal e de caracteres utilizando a tecla <TAB>. Mas adiante veremos como utilizar outros recursos do Hexposure.

| Anterior | Índice | Próximo |
© Skewer by ERTR |