Tutorial sobre Ponteiros
5 participantes
Tutorial sobre Ponteiros
INTRODUÇÃO
Para traduzir uma rom, "cujos dados não estejam comprimidos", basicamente você precisa abrí-la em um editor hexadecimal e pesquisar por alguma palavra que tenha visto no jogo. Ao localizá-la, você deve simplesmente trocar a palavra por alguma outra em português, porém esta palavra deve conter o mesmo número (ou menos) de caracteres que a original, caso insira mais espaços ali ou sobrescreva os dados posteriores, você irá danificar a rom.
O que deve ser feito para aumentar o tamanho de uma palavra ou frase, então?
A resposta para essa pergunta está na edição de ponteiros. Os ponteiros indicam onde algo (imagem, palavras/frases, música etc) irá iniciar, ou seja, para aumentar o espaço de uma palavra/frase basta alterar o local onde ela inicia, alterar seu ponteiro.
Exemplo básico:
00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a (offset)
#__#__#__P__R__E__S__S_____S__T__A__R__T__#__#__#__O__P__T__I__O__N__S__#__#__#
PRESS START (11 letras) = APERTE START (12 letras)
OPTIONS (7 letras) = OPCOES (6 letras)
# = EndString (ao contrário dos ponteiros, eles idicam o fim de algo, porém podem ser movidos livremente)
$ = significa que o número está em hexadecimal (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e e f)
No início do exemplo temos uma sequência de números hexadecimais, suponhamos que eles sejam os offsets (posições em hexadecimal) dos caracteres abaixo deles, então poderiamos traduzir essa linha, conforme as traduções citadas acima.
00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a (offset)
#__#__#__A__P__E__R__T__E_____S__T__A__R__T__#__#__#__O__P__Ç__Õ__E__S__#__#__#
Agora vamos analisar, a palavra APERTE START iniciava no offset $03 na frase em inglês, agora continua iníciando no offset $03, até ai nenhum problema. Porém a palavra OPÇÕES que iniciava no offset $11 passou a iniciar no offset $12, interpretando o comando da rom, logo a palavra OPÇÕES não irá aparecer quando a rom for emulada, pois seu ponteiro está dizento que ela inicia no offset $11, mas ela está iniciando no offset $12, em outras palavras ela esta programada para iniciar em cima de um endstring, ou seja está a palavra esta sendo inicianda e finalizanda no offset $11, por isso não aparecerá nada no jogo.
Para solucionar tal problema devemos editar o ponteito da palavra OPTIONS, somando $01, assim ela passaria a iniciar no offset $12.
Bom, acho que agora você já deve ter uma breve noção de como usar os ponteiros, se uma palavra iniciar depois da posição que iniciava a original, você deve adicionar essa quantidade de espaços ao ponteiro original e se ela iniciar antes você deve deduzir esse valor do ponteiro original.
Ponteiros são facéis de compeender, porém são complicados de trabalhar, pois os padrões de ponteiros das roms váriam de uma para outra, mesmo que sejam do mesmo tipo, logo cada rom deve ser tratada de forma destinta.
Nesse tutorial usarei a rom Pokémon Stadium 2. Está rom usa um tipo de Ponteiro conhecido como Ponteiro Relativo.
O que são Ponteiros Relativos?
São ponteiros que buscam refrencia em diferentes áreas da rom, ou seja enquanto nos Ponteiros Absolutos a rom usa como referência o HEADER (cabeçalho, espaço acrescido no início da rom quando ela é dumpada do cartucho) para agrupar os ponteiros, nas Roms com Ponteiros Relativos a referência geralmente é o inicio do container (será explicado mais abaixo), além disso os containers também possuem ponteiros. Nesse tipo de ponteiro as palavras/frases não podem ser movidas para fora do container, uma das formas de aumentar os espaços dentro dos containers e movendo todo ele para outro local, o fim da rom por exemplo.
Depois de toda essa teoria, vamos partir para a prática. Mas antes você precisa saber o que é um container, container é a junção de um bloco de ponteiros com um bloco de texto, geralmente os ponteiros vem acima e os textos abaixo, as ROMs podem possuir um ou vários containers.
Analisar é a chave para trabalhar com ponteiros, então analisemos a imagem abaixo:
Exemplo de ponteiro, container in-rom.
Analisando percebemos que os ponteiros dessa rom são de 4 bytess e que não estão invertidos, conforme os retangulos coloridos. Podemos localizar os ponteiros dentro de um container usando a seguinte fórmula: OFFSET DO INICIO DA PALAVRA/FRASE - OFFSET DO INÍCIO DO CONTAINER.
Outra forma de trabalhar com esses ponteiros, seria extrair todo o container, fazendo isso geralmente obtemos a seguinte:
OFFSET DO INICIO DA PALAVRA/FRASE - váriável
OFFSET DO INÍCIO DO CONTAINER - 0 (zero)
Ou seja, o offset das palavras/frases serão iguais ao seu ponteiro (invertido ou não)
Exemplo de ponteiro, container extraído.
Exemplo de ponteiro, container extraído.
Exemplo de ponteiro, container extraído.
Só para não passar em branco, note que na primeira imagem tem uma retangulo azul envolvendo 4bytess, nas imagens abaixo temos os ponteiros da primeira palavra: $00000080, o da segunda: $00000086, o da terceira seria: $0000008b etc, note que a partir do ponteiro da primeira palavra, os ponteiros estão em ordem crescente, logo os primeiros 4bytess não são ponteiros, eles simplesmente indicam a quatidade de ponteiros em hexadecimal que possui o container $0000001f = 31 ponteiros. Mas isso é um detalhe da própria rom, pode ser que ocorra em outras também.
Agora que já sabemos manusear os ponteiros dentro do container, eles geralmente estão situados acima do primeiro container, nessa ROM eles estão entre os offsets 0x0d170010 e 0x01d714cf, o segredo para localizá-los é buscar alguma "padronização". Dentro dos containers os ponteiros estão organizados de 4 em 4bytess, de acordo com a primeira imagem, os ponteiros do container não serão tão diferentes, vamos analizar entre os endereços citados acima.
Em vermelho temos o ponteiro do container e em azul o seu tamanho. Exemplo: ponteiro $00 00 14 c0, tamanho $00 00 0c 30
Note que há uma sequência de "bytess" padronizados, pois bem, estes são os ponteiros dos container, eles sempre apontam para o início dos containers.
Lembra que na primeira imagem o retangulo azul (primeiros 4 bytess) não eram ponteiros, nesse caso os ponteiros são formados por (4 + 4) bytess, os os primeiros 4 bytess (retangulos vermelhos) são ponteiros e o últimos 4 bytess (retangulos azuis) determinam o tamanho dos containers em hexadecimal, ou seja, se você aumentar ou diminuir o tamanho do container, será necessário adicionar ou subtrair essa mesma quantidade a esses 4 bytess.
Podemos usar a seguinte fórmula para trabalhar com esses ponteiros, mas para isso você precisar descobrir pelo menos o ponteiro de um container:
(Passo 1) Offset do inicio do container - Ponteiro do container = variável X
(Passo 2) Offset do início do container - variável X = Ponteiro do container
Se reparar bem verá que os ponteiros dos containers também estão em ordem crescente, isso significa que o primeiro ponteiro corresponte ao primeiro container. Vamos para a formula:
(Passo 1)
$01d714c0 - $000014c0 = $01d70000
(Passo 2)
$01d8c180 - $01d70000 = $0001c180
Observações:
$01d714c0 - offset do início do primeiro container (não postei uma imagem pois esse container é muito grande)
$000014c0 - é o primeiro ponteiro de container, conforme pode ser visto na imagem 5.
$01d70000 - corresponde ao resultado da variável X, o offset de início de qualquer container subtraido desse valor será igual ao ponteiro do mesmo.
$01d8c180 - offset de início do container utilizado na imagem 1.
$000014c0, $0001c180 - ponteiros de containers obtidos usando a fórmula acima.
OK, agora que já sabemos como os ponteiros da rom funcionam, vamos práticar um pouco:
Em breve...
To be continued!
O que deve ser feito para aumentar o tamanho de uma palavra ou frase, então?
A resposta para essa pergunta está na edição de ponteiros. Os ponteiros indicam onde algo (imagem, palavras/frases, música etc) irá iniciar, ou seja, para aumentar o espaço de uma palavra/frase basta alterar o local onde ela inicia, alterar seu ponteiro.
Exemplo básico:
00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a (offset)
#__#__#__P__R__E__S__S_____S__T__A__R__T__#__#__#__O__P__T__I__O__N__S__#__#__#
PRESS START (11 letras) = APERTE START (12 letras)
OPTIONS (7 letras) = OPCOES (6 letras)
# = EndString (ao contrário dos ponteiros, eles idicam o fim de algo, porém podem ser movidos livremente)
$ = significa que o número está em hexadecimal (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e e f)
No início do exemplo temos uma sequência de números hexadecimais, suponhamos que eles sejam os offsets (posições em hexadecimal) dos caracteres abaixo deles, então poderiamos traduzir essa linha, conforme as traduções citadas acima.
00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17 18 19 1a (offset)
#__#__#__A__P__E__R__T__E_____S__T__A__R__T__#__#__#__O__P__Ç__Õ__E__S__#__#__#
Agora vamos analisar, a palavra APERTE START iniciava no offset $03 na frase em inglês, agora continua iníciando no offset $03, até ai nenhum problema. Porém a palavra OPÇÕES que iniciava no offset $11 passou a iniciar no offset $12, interpretando o comando da rom, logo a palavra OPÇÕES não irá aparecer quando a rom for emulada, pois seu ponteiro está dizento que ela inicia no offset $11, mas ela está iniciando no offset $12, em outras palavras ela esta programada para iniciar em cima de um endstring, ou seja está a palavra esta sendo inicianda e finalizanda no offset $11, por isso não aparecerá nada no jogo.
Para solucionar tal problema devemos editar o ponteito da palavra OPTIONS, somando $01, assim ela passaria a iniciar no offset $12.
Bom, acho que agora você já deve ter uma breve noção de como usar os ponteiros, se uma palavra iniciar depois da posição que iniciava a original, você deve adicionar essa quantidade de espaços ao ponteiro original e se ela iniciar antes você deve deduzir esse valor do ponteiro original.
Ponteiros são facéis de compeender, porém são complicados de trabalhar, pois os padrões de ponteiros das roms váriam de uma para outra, mesmo que sejam do mesmo tipo, logo cada rom deve ser tratada de forma destinta.
Nesse tutorial usarei a rom Pokémon Stadium 2. Está rom usa um tipo de Ponteiro conhecido como Ponteiro Relativo.
PONTEIROS RELATIVOS
O que são Ponteiros Relativos?
São ponteiros que buscam refrencia em diferentes áreas da rom, ou seja enquanto nos Ponteiros Absolutos a rom usa como referência o HEADER (cabeçalho, espaço acrescido no início da rom quando ela é dumpada do cartucho) para agrupar os ponteiros, nas Roms com Ponteiros Relativos a referência geralmente é o inicio do container (será explicado mais abaixo), além disso os containers também possuem ponteiros. Nesse tipo de ponteiro as palavras/frases não podem ser movidas para fora do container, uma das formas de aumentar os espaços dentro dos containers e movendo todo ele para outro local, o fim da rom por exemplo.
Depois de toda essa teoria, vamos partir para a prática. Mas antes você precisa saber o que é um container, container é a junção de um bloco de ponteiros com um bloco de texto, geralmente os ponteiros vem acima e os textos abaixo, as ROMs podem possuir um ou vários containers.
Analisar é a chave para trabalhar com ponteiros, então analisemos a imagem abaixo:
Exemplo de ponteiro, container in-rom.
Analisando percebemos que os ponteiros dessa rom são de 4 bytess e que não estão invertidos, conforme os retangulos coloridos. Podemos localizar os ponteiros dentro de um container usando a seguinte fórmula: OFFSET DO INICIO DA PALAVRA/FRASE - OFFSET DO INÍCIO DO CONTAINER.
Outra forma de trabalhar com esses ponteiros, seria extrair todo o container, fazendo isso geralmente obtemos a seguinte:
OFFSET DO INICIO DA PALAVRA/FRASE - váriável
OFFSET DO INÍCIO DO CONTAINER - 0 (zero)
Ou seja, o offset das palavras/frases serão iguais ao seu ponteiro (invertido ou não)
Exemplo de ponteiro, container extraído.
Exemplo de ponteiro, container extraído.
Exemplo de ponteiro, container extraído.
Só para não passar em branco, note que na primeira imagem tem uma retangulo azul envolvendo 4bytess, nas imagens abaixo temos os ponteiros da primeira palavra: $00000080, o da segunda: $00000086, o da terceira seria: $0000008b etc, note que a partir do ponteiro da primeira palavra, os ponteiros estão em ordem crescente, logo os primeiros 4bytess não são ponteiros, eles simplesmente indicam a quatidade de ponteiros em hexadecimal que possui o container $0000001f = 31 ponteiros. Mas isso é um detalhe da própria rom, pode ser que ocorra em outras também.
Agora que já sabemos manusear os ponteiros dentro do container, eles geralmente estão situados acima do primeiro container, nessa ROM eles estão entre os offsets 0x0d170010 e 0x01d714cf, o segredo para localizá-los é buscar alguma "padronização". Dentro dos containers os ponteiros estão organizados de 4 em 4bytess, de acordo com a primeira imagem, os ponteiros do container não serão tão diferentes, vamos analizar entre os endereços citados acima.
Em vermelho temos o ponteiro do container e em azul o seu tamanho. Exemplo: ponteiro $00 00 14 c0, tamanho $00 00 0c 30
Note que há uma sequência de "bytess" padronizados, pois bem, estes são os ponteiros dos container, eles sempre apontam para o início dos containers.
Lembra que na primeira imagem o retangulo azul (primeiros 4 bytess) não eram ponteiros, nesse caso os ponteiros são formados por (4 + 4) bytess, os os primeiros 4 bytess (retangulos vermelhos) são ponteiros e o últimos 4 bytess (retangulos azuis) determinam o tamanho dos containers em hexadecimal, ou seja, se você aumentar ou diminuir o tamanho do container, será necessário adicionar ou subtrair essa mesma quantidade a esses 4 bytess.
Podemos usar a seguinte fórmula para trabalhar com esses ponteiros, mas para isso você precisar descobrir pelo menos o ponteiro de um container:
(Passo 1) Offset do inicio do container - Ponteiro do container = variável X
(Passo 2) Offset do início do container - variável X = Ponteiro do container
Se reparar bem verá que os ponteiros dos containers também estão em ordem crescente, isso significa que o primeiro ponteiro corresponte ao primeiro container. Vamos para a formula:
(Passo 1)
$01d714c0 - $000014c0 = $01d70000
(Passo 2)
$01d8c180 - $01d70000 = $0001c180
Observações:
$01d714c0 - offset do início do primeiro container (não postei uma imagem pois esse container é muito grande)
$000014c0 - é o primeiro ponteiro de container, conforme pode ser visto na imagem 5.
$01d70000 - corresponde ao resultado da variável X, o offset de início de qualquer container subtraido desse valor será igual ao ponteiro do mesmo.
$01d8c180 - offset de início do container utilizado na imagem 1.
$000014c0, $0001c180 - ponteiros de containers obtidos usando a fórmula acima.
PRATICANDO
OK, agora que já sabemos como os ponteiros da rom funcionam, vamos práticar um pouco:
Em breve...
To be continued!
Última edição por Kamppello em Dom 17 Jul 2011, 07:51, editado 6 vez(es)
Re: Tutorial sobre Ponteiros
Opa... Entendi o esquema dos ponteiros... Vou precisar apenas dos offsets de início e fim dos textos e dos ponteiros (que você já disse que daria)... A rom e a sua tabela também... Não garanto nada, pois ainda vou fazer alguns testes... Sou noob ainda no python...
Ganondorf- Administrador NBR
- Mensagens : 142
Membro desde : 16/10/2010
Idade : 39
Cidade : Maricá
Re: Ponteiros Relativos
Tudo bem, mano Ganon.
Estou alterando este arquivo para que ele se pareça realmente com um tutorial. Do jeito que está, apenas quem já compreende o assunto irá entender.
Esse jogo possui quase 200 containers, em breve te passo os ponteiros deles.
A próposito, parabéns pela nova configuração do Fórum, ficou excelente, 10 X 0 na anterior.
Estou alterando este arquivo para que ele se pareça realmente com um tutorial. Do jeito que está, apenas quem já compreende o assunto irá entender.
Esse jogo possui quase 200 containers, em breve te passo os ponteiros deles.
A próposito, parabéns pela nova configuração do Fórum, ficou excelente, 10 X 0 na anterior.
Re: Tutorial sobre Ponteiros
Olá Kamppello,
Legal o tutorial, vai ajudar os iniciantes que passarem por aqui, porém eu gostaria de indicar alguns acertos, um ocasionado talvez por CTRL+C/CTRL+V que é quando você diz: "[...] o da segunda: $00000080, [...]". O ponteiro "$00000086", coisa boba.
Outras coisa é quando você diz que os ponteiros são representados por 4 bits, está errado, são representados por 4 bytes, ou seja, 32 bits. Fazer confusão do que é bit e byte é complicado ainda mais se tratando de um tutorial, onde esses conceitos devem ficar bem claros. Você comete esse erro 10 vezes no tutorial, dê uma olhada nisso também.
Espero que minha crítica seja vista com bons olhos, abraço!
Legal o tutorial, vai ajudar os iniciantes que passarem por aqui, porém eu gostaria de indicar alguns acertos, um ocasionado talvez por CTRL+C/CTRL+V que é quando você diz: "[...] o da segunda: $00000080, [...]". O ponteiro "$00000086", coisa boba.
Outras coisa é quando você diz que os ponteiros são representados por 4 bits, está errado, são representados por 4 bytes, ou seja, 32 bits. Fazer confusão do que é bit e byte é complicado ainda mais se tratando de um tutorial, onde esses conceitos devem ficar bem claros. Você comete esse erro 10 vezes no tutorial, dê uma olhada nisso também.
Espero que minha crítica seja vista com bons olhos, abraço!
Vingdel- Membro NBR Novato
- Mensagens : 4
Membro desde : 16/07/2011
Idade : 42
Re: Tutorial sobre Ponteiros
Com certeza. Sempre fiz essa confusão entre bit e byte e não é a primeira vez que você me avisa sobre isso, tem várias postagens minhas com esse mesmo erro aqui e no FUT.
Obrigadão por ter se cadastrado no fórum e pelos reportes de erros...
Obrigadão por ter se cadastrado no fórum e pelos reportes de erros...
Re: Tutorial sobre Ponteiros
Isso ai, mais gente se cadastrando no fórum e dessa vez foi alguém que se cadastrou para ajudar com sugestão
Beleza é isso ai.
Beleza é isso ai.
Quil- Moderador NBR
- Mensagens : 425
Membro desde : 06/12/2010
Cidade : At World's End.
Re: Tutorial sobre Ponteiros
Isso aí pessoal, continuem divulvando o trabalho de vocês. Alguns deixando a cena e outros iniciando para dar continuidade com o trabalho, o que importa é manter a qualidade e aprender cada vez mais sobre o que a gente gosta.
Não estou mais tão atuante no mundo do Romhacking, porém dou meus pulinhos vez ou outra, no que precisarem e eu puder ajudar farei com prazer.
Abraço e boas traduções a NINTENDO BR!
Não estou mais tão atuante no mundo do Romhacking, porém dou meus pulinhos vez ou outra, no que precisarem e eu puder ajudar farei com prazer.
Abraço e boas traduções a NINTENDO BR!
Vingdel- Membro NBR Novato
- Mensagens : 4
Membro desde : 16/07/2011
Idade : 42
Re: Tutorial sobre Ponteiros
Valeu pelo incentivo Vingdel, também é legal saber que tem gente que acompanha nosso fórum.Apesar que ele é 99% dele usado pelos membros do grupo,para trocarem experiencias e ideias também. Mas é legal quando vem gente "de fora" e que se interessa.
E Kamppello, 1 byte são 8 bits, acho que não tem segredos para se lembrar disso, rs.Abraço!
E Kamppello, 1 byte são 8 bits, acho que não tem segredos para se lembrar disso, rs.Abraço!
L-Slayer- Administrador NBR
- Mensagens : 156
Membro desde : 28/09/2010
Idade : 33
Cidade : Mateus Leme
Tópicos semelhantes
» Tutorial de ponteiros Parte 1
» [Video Tutorial] Editando Ponteiros
» [Video Tutorial] Editando a Paleta de Cores do GBA
» [TUTORIAL]Usando o CrytalTile2 Para visualizar Texto em japonês em Roms de Nintendo DS
» Dificuldades com Ponteiros !
» [Video Tutorial] Editando Ponteiros
» [Video Tutorial] Editando a Paleta de Cores do GBA
» [TUTORIAL]Usando o CrytalTile2 Para visualizar Texto em japonês em Roms de Nintendo DS
» Dificuldades com Ponteiros !
Permissões neste sub-fórum
Não podes responder a tópicos