Tutorial de ponteiros Parte 1

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Tutorial de ponteiros Parte 1

Mensagem  Fou-Lu em Sex 20 Abr 2012, 16:20

Autor: Fou-Lu
Grupo: Nintendo BR - Traduções
Site:http://romhacking.forumbrasil.net/forum
Versão: 1.0
Lançamento: 20/04/2012
Idioma: Português brasileiro
Categoria: Edição de textos
Nível: Intermediário
Sistema: Vários

DESCRIÇÃO:
Primeira parte do tutorial que
fala sobre o sistema de numeração hexadecimal, e sobre localização,
cálculo e modificação de ponteiros, com ênfase ao sistema Super
Nintendo.
_________________________________________________________________________________________

OBS: Algumas coisas desse tutorial é baseado
em outros tutorias, mas com uma explicação melhor...


Indice:
++++++++++++++++++++++++++++++++++++
Introdução
Base Hexadecimal
Ponteiros
Calculando Ponteiros
Achando a Tabela de Ponteiros
Aplicando os Ponteiros
++++++++++++++++++++++++++++++++++
Introdução
++++++++++++++++++++++++++++++++++

Essa técnica é muito fácil e é meio dolorosa de se aplicar, mas a
forma de calcular os ponteiros (vejamos isso depois) é muito fácil
de se fazer, se você tem conhecimentos básicos da base
hexadecimal (na matemática) é possível fazer os calculos de cabeça.
Eu só estou dizendo isso porque as pessoas tem preguiça de aprender
essa técnica pensando que os calculos são difíceis de se fazer.

Eu acho que todos os tradutores deveriam saber essa técnica, pois
ela pode solucionar os problemas de espaço de texto ou outras coisas
que você precisar. Por isso, como já havia falado, essa é uma técnica
essencial.

Você já reparou que depois que você faz uma tabela de uma rom
e roda no hexposure, a ordem de cada string (seqüencia de textos,
os textos de cada sessão) está bagunçada. Por exemplo: os textos
da introdução podem estar no finalzinho da ROM e depois passa
para os textos do meio. Aí você se pergunta. Como é possível isso?
Simples. Em alguma parte da ROM existe uma tabela de códigos (Tabela
de Ponteiros, vejamos isso depois) que indicam a ordem de cada
textos. E como isso é organizado? Simples. Aí entra o calculo de
Ponteiros. Bem já falei demais. Se você for bom em calcular Hexadecimal,
leia direto como se calcula ponteiros. Agora se você não sabe calcular
em Hexadecimal, leia a sessão abaixo que explica muito bem a base
hexadecimal.


++++++++++++++++++++++++++++++++++
Base Hexadecimal
++++++++++++++++++++++++++++++++++

Primeiro vamos falar da base hexadecimal.
Para representar a base decimal (a qual, usamos freqüentemente dia a dia),
precisamos de dez algarismos (0 a 9) e para representar valores maiores que
nove, agrupamos algarismos, atribuindo pesos diferentes a cada um deles. Cada
algarismo representa o seu valor real, multiplicado por uma potência de dez.
O valor do número será a soma desses produtos.

Ex: 20 + 9 = 29

Já a base hexadecimal, cada algarismo tem um peso correspondente a uma
potência de dezesseis. porque precisaremos de 16 símbolos diferentes para
representar os algarismos em hexadecimal. Aqui temos um problema, pois o
sistema arábico que utilizamos só possui dez algarismos (0 a 9). (como
já havia falado).

Assim, se usam as letras de "A" até "F" para representar os algarismos
posteriores ao nove.
Por exemplo: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, 10, 11...

Aqui temos alguns exemplos de aritmética hexadecimal:

2 + 6 = 8 (exatamente como em decimal)
9 + 5 = E ("E" em hexa equivale a 14 em decimal)
E + 1 = F ("F" em hexa equivale a 15 em decimal)

Para a formação de números com mais de um dígito, teríamos o já conhecido
procedimento:
Ex: Quanto vale C3 (hexa) em decimal?

3 x 16^0 = 3
12 x 16^1 = 192
----
195

Mais exemplos:

F + 1 = 10 (10 em hexa equivale a 16 em decimal)
B + D = 18 (em decimal isto seria: 11 + 13 = 24)

4E
+ 25
----
73 (observe o "vai-um" quando se soma E + 5)


49
+ 23
----
6C

(aqui somamos 9 + 3, mas não ocorre "vai-um",
pois ainda podemos utilizar um único dígito (C) para representar
o resultado dessa parte da soma)

Bem eu acho que você já entendeu o básico. Para facilitar seus calculos,
no tópico "Ferramentas/Programas" coloquei um brinde, que é uma calculadora que calcula
números hexadecimais.
Mas acho que logo isso não será preciso, pois logo que as pessoas se
acostumam em usar esses calculos, aprendem a calcular de cabeça. Relativa-
mente você não vai usar muitos métodos difíceis para calcular ponteiros,
isso foi só uma explicação de como funciona a base Hexadecimal, o calculo
dos ponteiros é diferente e fácil.
Faça algumas experiências de calculos em um papel, depois veja sobre
os ponteiros...

++++++++++++++++++++++++++++++++++
Ponteiros
++++++++++++++++++++++++++++++++++

Como o nome já diz, são códigos que apontam para um offset (endereço
do arquivo em hexadecimal, geralmente fica lá embaixo nos editores
hexadecimais).

Agora você quer saber porque você precisa saber isso não é?
Exemplo: considerando que uma endstring (representa o fim de um texto, no
hexposure é representada por um quadrado vermelho) e seja representada
aqui como um *, e o espaço sendo representado aqui por _.
Digamos que você esteja traduzindo o seguinte texto, provavelmente como
você não pode mudar a posição de uma endstring, você terá que colocar assim.


There_are_many_weapons_here.*Take_it_for_you.*
Há_muitas_armas_aqui._______*Pegue_isso_para_*

Ops, o que aconteceu na segunda string? faltou espaço para completar o texto,
mas na primeira string sobrou espaço. Bem como você não pode mover endstring,
porque irão ocorrer defeitos na flexibilidade dos textos, isso fica assim,
certo? Errado, com a técnica de ponteiros, é possivel você mover a posição
das endstrings, assim você doa o espaço da primeira string para a segunda, e
assim completa o texto e ficará assim:

There_are_many_weapons_here.*Take_it_for_you.*
Há_muitas_armas_aqui._*Pegue_isso_para_você._*

Considerando que você não pode fazer isso a não ser que calcule e aplique
os ponteiros e todo o processo em geral...
Agora vamos ver como fazer isso.

++++++++++++++++++++++++++++++++++
Calculando Ponteiros
++++++++++++++++++++++++++++++++++

O primeiro passo é descobrir o endereço de uma offset por onde começa
o texto, observe na imagem 1 anexada do jogo Simcity 2000 para snes e
observe bem onde começa a string e depois continue lendo.



(Lembrando que o início de uma string é partir da primeira letra da própria
string, os quadrados vermelhos são apenas endstrings, as endstrings só servem
para apontar onde cada texto termina.)"

Notamos que na imagem, o início da string "Efeito Estufa".
A offset do inicio dessa string é "00004ED4".
Mas esse Offset é o endereço no arquivo, não o endereço na memória da ROM.
Por que? Porque as ROMs contêm uma informação extra, que não existe no
cartucho, chamada "header" (ou "cabeçalho").
O Header ocupa nas ROMs de NES os 10 primeiros valores hexadecimais (10h).
O tamanho do Header varia para cada console. No NES, são 10h.
No SNES e Genesis, 200h. Algumas podem vir sem um Header.
No caso estamos trabalhando com uma ROM de Snes, então usaremos o header
ocupando 200h. E para que tenho que saber disso? Agora você vai perceber.

Primeiro você terá que achar o código da string atual (o ponteiro).
Para isso siga as instruções passo a passo:

1º: Subtraia o valor do header na offset atual ("00004ED4").
No caso, estamos trabalhando com Snes (como disse acima), você terá
que subtrair 200h.

Ex: 00004ED4 - 200 = 00004CD4

2º": Tire os valores da esquerda para que sobrem apenas 4.
(Isso porque na maioria das ROMs, os ponteiros normalmente são de 2 bytes.)

Ex: 4CD4

3º: Agora inverta os valores.

Ex: D4 4C

Pronto, você acaba de encontrar o ponteiro do começo da string
"Efeito Estufa", agora em algum lugar da ROM, existe uma tabela de ponteiros.
Que é o lugar onde estão a ordem de todos os ponteiros, que é a tabela
de ponteiros, vamos ver como achar isso:

++++++++++++++++++++++++++++++++++
Achando a Tabela de Ponteiros
++++++++++++++++++++++++++++++++++

Obtendo o valor "D4 4C", agora é só procurar esse valor no arquivo.
Geralmente a tabela de ponteiros vem logo antes ou depois dos textos,
mas isso nem sempre acontece, por exemplo: no The 7th Saga, a tabela de
ponteiros está espalhada no arquivo inteiro. Quando ocorre isso, você não
vai ter certeza de que o ponteiro exato é aquele. Então você terá que
fazer testes na ROM para ver o que acontece.

Por sorte, o Simcity 2000 utiliza a tabela de ponteiros normalmente onde
deveria estar, então está um pouco depois do texto. Veja na imagem 2
onde está a tabela de ponteiros.



Percebeu? a tabela de ponteiros vem logo depois dos textos, e por sorte
está separada também por offsets, mas isso nem sempre acontece. Mantenha
isso em mente quando for procurar uma tabela de ponteiros..


++++++++++++++++++++++++++++++++++
Aplicando os Ponteiros
++++++++++++++++++++++++++++++++++

Conhecendo como os ponteiros funciona, agora você pode redirecionar
os textos para economizar espaço para que todo o texto traduzido caiba.

Sempre que você precisar mover uma string, terá sempre que atualizar
o valor na tabela de ponteiros... digamos que você queira mover a string
"00004ED4" para "00004ED1", você terá que fazer os calculos para
achar o ponteiro de "00004ED1". Para fazer isso de cabeça, antes
você achou o ponteiro "D4 4C", e quer mover para trás a string em 3 espaços.
Assim, o ponteiro da nova posição será "D1 4C", depois que mover a string,
nunca esqueça de atualizar o novo valor do ponteiro na tabela de ponteiros.
Mas para tirar a prova, aqui está a continha:

00004ED1 - 200 = 00004CD1 <--- Subtraí 200h
4CD1 <---- Retirei os números da esquerda
D1 4C <---- Ponteiro achado

Isso se pode fazer tanto em textos, como em DTEs, MTEs, Ítens, Etc...

Sempre atualize os ponteiros na tabela de ponteiros.

OBS: Por outro lado, você também pode redirecionar textos para locais não
utilizados da ROM. É comum encontrar nas ROMs espaços em branco (com
bytes de valor 0 ou FFh, por exemplo). Depois que você tiver certeza
de que um certo pedaço da ROM não é utilizado, você pode escrever aí
os textos longos e redirecionar os ponteiros da forma apropriada. No
caso do Nintendo, se estiverem sendo utilizados ponteiros de dois bytes,
esse espaço em branco não pode estar mais de 64KB longe do endereço original
do texto. Isto significa que o endereço original e o redirecionado só
podem diferir pelos dois bytes menos significativos. Por exemplo, é
possível redirecionar o endereço 012378h para 013050h, mas não para
024675h.
Ou seja, a partir do terceiro byte, os endereços têm de ser iguais
(01 e 01, no exemplo).

Novamente, deve ser esclarecido que o modelo de ponteiros pode
aparecer juntamente com outra técnica, como as descritas acima.
Os ponteiros costumam marcar apenas o início das strings. Para
indicar o final, podem aparecer caracteres delimitadores, por exemplo.
Você também deve saber que a implementação de tudo isso varia de jogo
para jogo. Aqui foram apresentados os aspectos mais gerais do assunto.
Estude bastante a ROM que estiver traduzindo para entender como funciona
armazenamento de textos naquele caso específico.


Última edição por Fou-Lu em Sab 21 Abr 2012, 20:13, editado 1 vez(es)

___________________________________________________________________________________________________________________________________________________
avatar
Fou-Lu
Membro NBR Veterano
Membro NBR Veterano

Masculino Mensagens : 118
Membro desde : 13/01/2012
Idade : 23
Cidade : Teresina
Brasil


Voltar ao Topo Ir em baixo

Re: Tutorial de ponteiros Parte 1

Mensagem  Kamppello em Sab 21 Abr 2012, 08:13

Seu tutorial está ficando muito bom, mano Fou-Lu. Parabéns.

___________________________________________________________________________________________________________________________________________________

avatar
Kamppello
Administrador NBR
Administrador NBR

Masculino Mensagens : 927
Membro desde : 28/09/2010
Idade : 28
Cidade : Recanto das Emas
Brasil


http://nbr-traducoes.blogspot.com/

Voltar ao Topo Ir em baixo

Re: Tutorial de ponteiros Parte 1

Mensagem  Fou-Lu em Sab 21 Abr 2012, 14:00


Seu tutorial está ficando muito bom, mano Fou-Lu. Parabéns.

Usei muito os teus tutos em videos

___________________________________________________________________________________________________________________________________________________
avatar
Fou-Lu
Membro NBR Veterano
Membro NBR Veterano

Masculino Mensagens : 118
Membro desde : 13/01/2012
Idade : 23
Cidade : Teresina
Brasil


Voltar ao Topo Ir em baixo

Re: Tutorial de ponteiros Parte 1

Mensagem  Kamppello em Sab 21 Abr 2012, 15:14

Cara, eu tó doido, mas é doido mesmo de alcoól, fico feliz que meus tutos tenham sido utéis para algo.

___________________________________________________________________________________________________________________________________________________

avatar
Kamppello
Administrador NBR
Administrador NBR

Masculino Mensagens : 927
Membro desde : 28/09/2010
Idade : 28
Cidade : Recanto das Emas
Brasil


http://nbr-traducoes.blogspot.com/

Voltar ao Topo Ir em baixo

Re: Tutorial de ponteiros Parte 1

Mensagem  Conteúdo patrocinado


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum