[AJUDA] Ponteiros Relativos(?) em GBA

Iniciado por D!sturbed, Novembro 28, 2025, 11:57:33 AM

tópico anterior - próximo tópico

0 Membros e 1 Visitante estão vendo este tópico.

D!sturbed

Estou estudando alguns jogos de GBA para compreender melhor a arquitetura do portátil e me deparei com 1 jogo que usa um padrão de ponteiros bem diferente do comum, que não consegui identificar...

Só para contextualizar, como funciona um ponteiro "normal" de GBA:

No Game Boy Advance, ponteiros geralmente representam endereços da ROM.
A ROM é mapeada no intervalo:

0x08000000 → 0x09FFFFFF
Portanto, quando um ponteiro aponta para um texto na ROM, o valor armazenado costuma começar com 0x08, indicando a região de ROM no espaço de endereçamento do GBA.

Como o GBA utiliza little-endian, os bytes do endereço são gravados invertidos na ROM.
Por exemplo, se o texto estiver no endereço:

0AB2C3
O valor armazenado no arquivo será:

C3 B2 0A 08
Podemos até ignorar o 08 na busca pelo ponteiro, mas ele estará lá. E a partir daqui é só editar esse valor para o novo e teremos o ponteiro editado. Isso resume um ponteiro "comum" de GBA para quem não entende sobre o assunto.


O problema:

Estou com 1 jogo aqui que não usa esse padrão e gostaria de saber sobre outros padrões conhecidos de ponteiros de GBA. Sei que não é exatamente incomum, só não encontrei material sobre o assunto e por isso decidi perguntar, afinal, alguém aqui já deve ter passado por isso.

Desde já, grato!

PS: Não postei o nome do jogo para não enviesar a resposta, gostaria que a discussão se desenrolasse num nível mais técnico e menos específico, ou que sirva para um único caso.

===---  EDIT  ---===
Consegui identificar os ponteiros, eles são Pointer to Pointer, tem um ponteiro absoluto que aponta para uma tabela que funciona como um índice, daí é só ir acrescendo ou alterando os valores conforme a necessidade nesse índice... mas é chatinho, pra não dizer outra coisa)

Exemplo, ponteiro absoluto aponta para 1BCD1D, que é um índice sequencial, vamos até o endereço e encontramos:

A0000000 A8000000 BF000000 B8000000
Se queremos mover a entrada, deslocamos a quantidade de bytes do valor, por exemplo, queremos mover 3 posições a frente o 4o registro dessa entrada. Se ele tiver o valor B8, mudamos para BB... Ainda estou entendendo o funcionamento disso, pois nunca havia lidado com ponteiros desse tipo e nunca havia ouvido falar de ponteiros assim em GBA... Se souberem de mais anomalias, postem, sempre aparecerá um jogo que saí dos padrões e conhecimento sempre é bem-vindo!

===---  EDIT  2 ---===
Não feliz em apenas alterar, fui tentar entender e descobri que (obviamente) existe uma lógica na edição. Há um endereço base no inicio do bloco de textos, basicamente pegamos o endereço do texto que queremos modificar e subtraímos o offset, o valor corresponde a base

base = text_address - offset
Ou seja, se eu tenho a string "Hello World" em 1CD4C7 e quero move-lá para 1CD4C9, faço:

novo_offset = 1CD4C9 - 1CD464 = 0x65
E na tabela de ponteiros, substituo 63 00 00 00 por 65 00 00 00... Essa info é útil para lidar com um volume maior de scripts e automatizar o processo.

Encontrei um link em russo que me ajudou a entender isso, não era exatamente o mesmo caso, mas ajudou, com uma ROM de N64... achei bem completo o material, aborda diversos ponteiros, segue para referência, se alguém quiser: (Não falo russo, só pra deixar claro).

http://chief-net.ru/index.php?option=com_content&task=view&id=109&Itemid=33

Quem sabe no futuro eu não escreva um material mais completo sobre isso!