BR Games
Tutorial de Ponteiros.


Aqui segue um tutorial bem complexo sobre ponteiros, peo para voc que
ainda no modifique esses tutoriais que escrevi para voc. 

Bom, aqui vai mais um tutorial. Nele, vou tentar te ensinar como localizar
a rea de ponteiros. Na verdade, essa coisa de "rea de ponteiros" foi
definida por mim para poder trabalhar com o ROMPont, isso porque, pelo que
vi at agora, os ponteiros esto sempre juntos, um depois do outro. 

O que  um ponteiro? Imagine que um certo texto na ROM comea no endereo
3F45A (por exemplo, um texto que aparece numa certa janela da fala de uma
pessoa em uma cidade qualquer), o texto  "Existe uma passagem secreta
numa caverna para leste.". Sabendo que o texto comea com a letra "e"
maiscula da palavra existe, se voc olhar o endereo dessa letra num editor
hexa, voc ver o endereo 3F45A, porque a letra "E"  o incio do texto. Em
algum lugar da ROM (veja bem que eu j usei esse termo antes com voc,
vrias vezes, para definir onde esto as DTEs por extenso, pois as DTEs
SEMPRE existem por extenso em algum lugar, de onde o jogo deve puxar a
informao), do mesmo jeito, tem que existir um lugar na ROM que define
onde comea cada texto que aparece na tela. Ento, em algum lugar da ROM,
deve estar escrito "por extenso" esse endereo 3F54A. Bom,  quase isso,
do mesmo jeito que te ensinei a localizar as DTEs, voc tem que procurar
esse endereo... A comea a parte mais difcil, vou tentar te explicar
como no passo a passo que li. Vou usar como exemplo uma ROM real e bem
conhecida por voc, o Final Fantasy (1). Com uma diferena, vou usar uma
verso traduzida para o portugus, isso mesmo a nossa lngua! Heheheheh :) 

Acho que chega de enrolar, vamos ao que interessa!  O texto exemplo 
"Nada aqui" mas, poderia ser qualquer outro, peguei esse para ficar mais
didtico, pois  a primeira fala do bloco de histria.  Quando me referir
ao endereo de uma fala, estarei me referindo ao 1o.  byte dessa fala,
isso  a letra "N". Ento o endereo dessa fala  28210 (hexa). Voc ter
que achar esse endereo "escrito" em alguma parte da ROM, como 
impossvel se fazer isso sem macetes especficos vou tentar exemplificar ao
mximo. Imagine a diferena entre um cartucho de video-game e uma ROM. O
cartucho foi feito especialmente para o video-game, a informao gravada
nele  lida diretamente pelo video-game qdo se liga. A ROM (apesar de ter
sido criada h muito mais tempo que os emuladores) tem informaes extras
para serem usadas pelos emuladores, digamos assim. Essas informaes no
existem no cartucho, ento um ponteiro estaria escrito no cartucho
exatamente com os mesmos valores do endereo da fala, no caso da ROM,
temos que "descontar" alguns bytes para nossa localizao ser perfeita.
Precisamos saber quantos bytes essa informao ocupa na ROM, este dado eu
vou passar e voc vai ter que aceitar, no tenho como explicar isso, mas o
valor  10 (hexa) bytes. Usei o hexa entre parnteses para diferenciar do
10 decimal. No se voc tem noes de converso decimal/hexa, mas 10 hexa
= 16 decimal (o nosso 16 usado para contar laranjas, por exemplo). Ento o
que fazer com esse 10h? Entenda bem essa parte para saber porque fazemos
isso, temos que subtrair do endereo da fala 10h, pois esses 10h bytes no 
so importantes num cartucho real, eles compem o "header" da ROM. Ento, se
vc no sabe subtrair hexadecimal, utilize a calculadora do Windows em modo
cientfico e mude ela p/ o modo "Hex". Antes de subtrair esses 10h,
mantenha apenas as ltimas quattro casas do endereo, pois da quinta casa
para frente nunca ser importante. 

Ento o 28210h ficaria:  8210h

V na calculadora e coloque nela 8210h - 10h, isso vai dar 8200h.  Separe
em duas partes: 82 00 Cada valor ser um byte, lembra que falei que um
ponteiro tem dois bytes?  Ento, um dos bytes tem valor 82h e o outro tem
valor 00h. Voc acha o que deve procurar no ponteiro dessa fala! 82h e 00h
que na ROM seriam uma seqncia: 8200.  Por algum motivo que eu no sei o
qual voc tambm deve aceitar isso, o ponteiro no estar desse jeito... Ele
estar armazenado como 0082 (apenas inverta os bytes). 

Bom, agora j estamos prontos para localizar o ponteiro! J estamos com o
valor nas mos e vamos abrir nosso editor hexa Thingy'98 preferido! :) 

Nele, apertando "s" como se fssemos fazer uma busca normal de um texto,
entramos na tela de procura. Como no sabemos o que esses bytes
significam, sabemos apenas os valores deles, devemos procurar por valor, o
Thingy'98 faz isso quando apertamos a tecla de acento de crase (aquele
acento agudo invertido). Colocamos ele e digitamos "00", depois colocamos
ele novamente e digitamos "82". Repare que o texto no apareceu na parte
de baixo, os valores que vc digitou apareceram em cima. Pronto, d um ESC
e espere p/ ele encontrar. Espere um pouco e pronto! Vc achou seu primeiro
pobnteiro! Nesse caso especfico, a primeira ocorrncia , realmente, o
ponteiro, mas poderiam ser dois bytes com os mesmos valores do ponteiros
indicando uma outra coisa qualquer, portanto, no se preocupe se depois vc
achar um ponteiro descobrir que ele no era o ponteiro. Mas, como conferir
se  o ponteiro? Normalmente (eu sempre digo normalmente pq qse sempre vc
vai encontrar as coisas assim, mas, no existe uma coisa fixa em ROMs,
sempre vc vai descobrir coisas novas,  at melhor, pq isso faz vc ganhar
experincia, no  sempre a mesma coisa repetitiva), bom, continuando,
normalmente, o bloco de ponteiros vem diretamente antes do bloco com as
falas. Isto , um grupo de bytes que representa os ponteiros  seguido por
outro grupo de bytes com o texto do jogo. Ento, para achar o texto, uma
regra boa  achar o ponteiro que est mais prximo, acima do comeo do
bloco de texto. Podem existir vrios poteiros com valores iguais, o que
significa isso? Se vc mudar o valor de um, tem que mudar de todos os
outros. Como exemplo, podemos citar uma frase hipottica: "Voc morreu!"; 
suponha que ele pode ser chamada em vrios casos diferentes, ento, vrios
ponteiros tm o valor dessa fala. Talvez eu esteja complicando muito, mas
muito do que falo aqui aprendi por experincia, vc s vai se acostumar
mexendo. Bom, expliquei como vc faz p/ saber se  o ponteiro, mas,  um
mtodo que pode ser trabalhoso, vc pode tentar outro mtodo onde vc muda o
valor do ponteiro e v o que acontece. Lembra do endereo 28210h? Lembra p/
onde ele aponta? "N" de "Nada aqui", vamos fazer um teste p/ mostrar como
os ponteiros funcionam e, ainda, saber se  o ponteiro p/ esse texto
mesmo. 

Imagine a palava "Nada" de "Nada aqui", se 28210h  o endereo do "N",
28210h + 1h  o endereo da primeira letra "a" de "Nada". Vamos fazer os
testes supondo que o ponteiro apontasse parra essa letra "a" e sabendo que
o jogo l o texto at o "delimitador de texto" o novo texto seria: "ada
aqui", como? Bem, vamos fazer o processo de achar o ponteiro novamente,
sabendo que o endereo agora  28211h: 

28211 - 10 
28201
 8201 
82 01 
01 82 
0182

Se vc procurar esse endereo, no vai achar, pode at achar alguma coisa
com esse valor, mas no vai ser o endereo pq no existe endereo algum
apontando para "ada aqui". Ento p/ que achamos isso?????? Bom, lebra de
onde est o ponteiro antigo? Aquele com valor 0082, sabe o que vc faz? no
lugar de 0082, coloca 0182. Agora sai do editor hexa e entra no jogo,
procura algum lugar onde apareceria a fala "Nada aqui". Veja o que aparece
agora: "ada aqui". Vc modificou seu primeiro ponteiro e viu seus efeitos
na ROM! Vc poderia, por exemplo, mostrar outro texto, usando o valor do
ponteiro desse outro texto no mesmo lugar do ponteiro de "Nada qui"!
Lembre-se sempre de fazer seus backups heim! 

A partir daqui, a utilidade  apenas p/ a prtica, ser til no uso do
ROMPont. O tutorial sobre como saber o que  um ponteiro termina aqui. 

Vc achou um ponteiro, mas inda no achou o bloco de ponteiros. Podem
existir vrios espalhados pela ROM, cada um p/ um bloco de texto (assim
como o Final Fantasy (1) e o Y's (1) Master System). No Final Fantasy 3,
todos os ponteiros para qualquer texto esto sempre no mesmo bloco. Tente
ver o que parece ser o bloco de texto no existe uma definio de onde
comea  onde termina, vc deve achar o incio e o fim. tente mtodos como
o ponteiro da primeiro fala do bloco e o ponteiro da ltima fala do bloco. 
O ponteiro da ltima fala, quase sempre, vem logo antes do primeiro bytes
do bloco e fala que corresponde ao bloco de ponteiro. Ento, os dois
ltimos bytes antes do bloco de fala devem ser parte do ltimo ponteiro. 
faa um teste, a partir de um ponteiro, tente achar o texto
correspondente. Os ltimos dois bytes antes de "Nada Aqui" so uma DTE
"yo" e uma letra "q". Isso  bom p/ vc saber que no interessa o contedo
por extenso dos ponteiros mas sim o seu valor. Os valores, que devem
aparecer na coluna da esquerda de QUALQUER editor hexadecimal so os que
devem ser usados. Eles so 56B4. vamos fazer o caminho inverso p/ ver se
ele aponta p/ alguma coisa: 

56B4 
56 B4 
B4 56 
B456 
B456 + 10 
B466

Agora, tem um problema, qdo vc procura o ponteiro, vc desconsidera
qualquer casa a partir da quinta. Se vc desconsidera, qual valor deve
colocar p/ transformar num endereo real. Isso no  um chute. O endereo
do texto no  B466h. O endereo verdadeiro  o prximo endereo, depois
do ponteiro com o final B466. Ento vai procurando o "primeiro" B466
depois do ponteiro. O ponteiro est no endereo 2820Eh, o prximo endereo
B466h seria 2B466h. V nesse endereo e olhe se tem alguma fala. A fala
nesse endereo  "H uma placa de pedra no poro...". Perceba que existe
um delimitador de texto logo antes de "H". Como vc deve ter reparado essa
no  a ltima fala do bloco. Isso prova que um ponteiro pode apontar p/
qualquer lugar, no esto seqncia exata das falas. Mas, uma coisa boa vc
descobriu, que esse  um ponteiro real e  o ltimo ponteiro do bloco de
ponteiros, pq o ltimo? Pq logo depois vem o bloco de texto. Agora vamos
ver se o ponteiro de "Nada aqui"  o primeiro do bloco de ponteiros. Os
bytes que esto antes do 0082 so 0303. Se vc procurar pelo prximo 0313
(j com os clculos) ser o 30313. No existe nada nesse endereo. Logo, o
0082  o primeiro endereo do bloco de ponteiros.  O bloco de texto  mais
fcil de se ver. Pode se achado apenas visualmente, sem clculos. O bloco
de texto referente a esse bloco de ponteiros comea em "Nada aqui' e
termina em "A placa de pedra est no cho vocs entem algo". Vc pode
definir isso, pq depois de "A placa..."  no existe mais texto, mas alguns
lixos, s bem depois etm texto novamente. 

Tudo isso que vc achou na segunda parte do tutorial serve p/ vc achar os
valores p/ serem usados no ROMPont. Pegue o endereo do primeiro e do
ltimo ponteiro do bloco de ponteiros: o 0082 est em: 28010h o 56B4 est
em: 2820Eh o "Nada aqui" est em: 28210h o "A placa de" est em: 2B5CBh

Lemra aquele primeiro ROMPOnt que te madei? Lembra o que ele fez com a sua
ROM (eu sei o que veio na sua mente: "Nem me lembre...")? Sabe pq ele fez
aquilo? Pq os ponteiros no esto na mesma seqncia das falas! Esse novo
ROMPont, como j disse vrias vezes, usa uma oitra ROM "boa" como apoio. 
Assim, ele olha o endereo de uma fala (faz aqueles clculos) acha onde
est o ponteiro, olha o endereo da fala na ROM nova, vai no mesmo lugar
do ponteiro antigo mas na ROM nova e nuda o valor, passa p/ a prxima fala
e faz a mesma coisa.  qse impossvel ele errar, no teste In Game, no
achei erro de ponteiro algum. Com isto  bom vc saber, vc pode mudar o
texto de lugar desde que atualize o valor de seus ponteiros. Vc no pode
mudar os ponteiros de lugar. 

Aqui vai um exemplo do uso do ROMPont:
ROMPont ff3p.nes ff3e.nes 30D70 320C4 30D70 30010 30D6E

ff3p.nes  o nome da ROM nova ff3e.nes  o nome da rOM de apoio 30D70  o
endereo inicial de um bloco e texto do FF3 320C4  o endereo final do
mesmo bloco citado acima Esses dois endereos so da ROM nova, onde o
programa navega p/ saber o novo valor do ponteiro. o segundo 30D70,  o
endereo inicial do texto da ROM velha, serve p/ saber onde comea a
comparao. Sabendo que a quantidade de falas  sempre a mesma mesmo
depois da traduo, no  necessrioo informar o endereo final do texto
da ROM antiga. Qdo o programa chegar no fim do bloco de texto na ROM nova
(ltima fala), automaticamente estar no fim do bloco de texto da ROM
antiga.  30010  o endereo inicial do bloco de ponteiros 30D6E  o
endereo final do bloco de ponteiros

Mas, coo ficaria o uso do ROMPont nesse teste do Final Fanatay (1) feito
nesse tutorial? Assim:  ROMPont ff1p.nes ff1e.nes 28210 2B5CB 28210 28010
2820E Fcil n?  Como vc j tem uma verso traduzida que funciona com os
ponteiros em seus lugares corretos, vc pode usar essa ROM como ROM antiga. 
O importante  que a ROM antiga "funcione".  Em algum email que eu te
mandei, tem um tutorial mais explicativo do ROMPont, use ele em conjunto
com a segunda parte desse tutorial. Espero que vc tenha tido pacincia p/
chegar at o fim desse tutorial e que ele seja de grande utilidade p/ vc.
Estarei sempre disposto a ensinar quem quiser aprender! :) 

Dicas: 

Vc pode ver que existem algumas coisas semelhantes entre ponteiros, por
exemplo, falas armazenadas em pates prximas da ROM, tem endereos
parecidos, olhe os ponteiros que seguem depois do 0082, eles so: 0982
5C82 BD82 D982 etc. 

No tente reajustar o espao do texto dentro do editor hexa, vc ter que
levar todo o texto para a frente redigitando-o. Faa um Dump, mude o que
vc quiser do bloco inteiro de texto reinsira e use o ROMPont. 

Sempre queira aprender mais, tenha ganncia pelo conhecimento. 

Nunca deixe o mundo dos emuladores. 

Nunca pare de traduzir ROMs. 

Este tutorial pode ser distribudo e modificado desde que sejam mantidos
os crditos. Foi feito em homenagem a quem me incentivou voltar ao mundo
das tradues!! Valeu Jackal!!

BR Games - http://brgames.tsx.org
Copyright 2000 The EmuMan.

