[AJUDA] Ponteiros Relativos(?) em GBA

Iniciado por Gypsy, 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.

Gypsy

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!

tvtoon

Você está estudando a arquitetura, então deve ter entendido que qüando tratamos de ponteiros, estamos nos referindo ao código da máquina e, portanto, o padrão a ser seguido como o do GBA (região mapeada para a memória da ROM é 0x800000 até 0x9FFFFF). Outras idéias que os jogos de GBA usam regularmente (alguns do NDS também mas já nem tanto, dê uma olhada no "gbatek" para detalhes) é o processamento "Thumb", 16 bits, daí você consegue ver dois tipos de ponteiros: uns que se assemelham ao Game Boy Color, com um byte de banco e endereço 16 bits, e o 16 bits puro de uma seção processada.

Por padrão, isso é tudo o que a máquina pode oferecer fora do "software", vou dar exemplo de jogos que usam esses ponteiros: Shining Soul, Sword of Mana.

Gypsy

Entendi.

Vou dar mais uma fuçada em mais roms de desenvolvedoras diferentes para documentar isso, algum dia. Percebi que as mesmas desenvolvedoras costumam usar os mesmos padrões, isso pode acabar sendo útil para alguém no futuro.