Achando ponteiros de Wonderswan

Iniciado por ØX-Carnage, Outubro 15, 2026, 00:32:22 AM

tópico anterior - próximo tópico

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

ØX-Carnage

Bom, quem viu, viu, quem não viu, não verá mais. Achei válido criar esse post para não deixar o Kuroi sem resposta. Ele havia feito uma pergunta sobre o assunto. Mas durante o post, acho que o Khronos não entendeu o que eu quis dizer e respondeu de uma maneira não muito amigável.
E pelo que eu vi, o cara apagou todos os posts dele. E é por isso que a velha guarda não vem mais :raiva2:
Não sei se o Kuroi chegou a ver o post, mas para não deixar ele no vácuo, segue o que eu havia postado.

"Então, Kronos, na minha visão, esse documento ficou bom, mas para a comunidade que queira entender a arquitetura do NEC V30MZ. Não creio que o Kuroi iria ler 16 páginas para saber algo simples.
Por exemplo, pegando o mesmo jogo que fez.
Para achar os ponteiros:
Pega o endereço da frase do jogo 「かみさまが このらくえんを つくってくれた」 0x3362A2.
Essa frase começa no banco 33000. Como saber isso? O banco é o primeiro byte do endereço, no caso 3362A2, e porque 33000 e não 33? Porque os bancos possuem 64k, convertendo isso em hex: 10000.

Aí, usa a regra clássica de subtração, offset - banco = ponteiro.
  3362A2 ← Offset inicial da frase
- 330000 ← Início do banco
--------
    62A2 ← Valor do ponteiro
Como é Little Endian, inverte: A2 62 00. Pronto, achou!"

kuroi

Opa! Valeu, Ox! Parece que nesse jogo é mesmo mais simples do que o Digimon que eu havia mexido lá no passado, porque lá eu precisava inverter a ordem de alguns Bytes diretamente na tabela de ponteiros, para poder saber "qual era qual".
Na verdade, a minha pergunta era mais pra lançar um "desafio" para o usuário Kronos, já que ele tinha feito o jogo inteiro por IA e não sabia nem o básico da edição dos ponteiros do jogo... Rsrs

Se servir pra ajudar mais alguém, segue o link da minha postagem sobre os ponteiros do "Digimon Anode Cathode" de Wonderswan também:

https://www.romhacking.net.br/index.php?topic=2090.msg13671#msg13671
君の夢が叶うのは誰かの影じゃないぜ。
風の強い日を選んで走ってきた。

ØX-Carnage

#2
Citação de: kuroi online Outubro 15, 2026, 09:29:08 AMOpa! Valeu, Ox! Parece que nesse jogo é mesmo mais simples do que o Digimon que eu havia mexido lá no passado, porque lá eu precisava inverter a ordem de alguns Bytes diretamente na tabela de ponteiros, para poder saber "qual era qual".
Na verdade, a minha pergunta era mais pra lançar um "desafio" para o usuário Kronos, já que ele tinha feito o jogo inteiro por IA e não sabia nem o básico da edição dos ponteiros do jogo... Rsrs

Se servir pra ajudar mais alguém, segue o link da minha postagem sobre os ponteiros do "Digimon Anode Cathode" de Wonderswan também:

https://www.romhacking.net.br/index.php?topic=2090.msg13671#msg13671

Boa, Kuroi! Mas, na verdade, a lógica é parecida, só que aplicada de maneira diferente.

O processador do WonderSwan, o NEC V30MZ, trabalha com dois tipos de endereçamento:

Near Pointer = 16 bits (2 bytes)
Far Pointer  = 32 bits (4 bytes)

No jogo do Khronos, os diálogos utilizam ponteiros de 2 bytes, enquanto os exemplos que você encontrou no Digimon utilizam ponteiros de 4 bytes.

A diferença é que, no jogo do Khronos, a rotina já define o segmento que será utilizado. Por isso, a tabela guarda somente o deslocamento.

No Digimon, o ponteiro guarda o segmento e o deslocamento.

Pegando o endereço que você encontrou:

Endereço da frase: 3B0154

  3B0154 <- Offset inicial da frase
- 3B0000 <- Início do banco
--------
    0154 <- Posição dentro do banco

Até aqui, é a mesma subtração utilizada no jogo do Khronos.

No exemplo do Digimon, o banco 3B está acessível em B0000 da CPU.

Agora soma:

  B0000 <- Janela da CPU onde está o banco
+  0154 <- Posição da frase dentro do banco
-------
  B0154 <- Endereço da CPU

Achando o endereço da CPU!

Como o ponteiro do Digimon utiliza segmento e offset, você precisa separar esses dois valores.

Nos exemplos, você pode fazer isso dividindo o endereço da CPU por 0x10.

Esse 0x10 é uma característica do processador NEC V30MZ, que utiliza segmentos com bases calculadas em múltiplos de 16 bytes. Diferente do NES onde o 10 é o header.

B0154 / 0x10 = B015
Resto = 4

Segmento = B015
Offset  = 0004

Pronto! Temos os dois valores que formam o ponteiro utilizado nesse exemplo:

Segmento: B015
Offset:  0004

Como é Little Endian, invertemos os bytes de cada valor, gravando primeiro o offset e depois o segmento.

Offset:  0004 -> 04 00
Segmento: B015 -> 15 B0

Ponteiro: 04 00 15 B0

Chegamos exatamente ao ponteiro que você encontrou no Digimon!

A diferença entre os dois exemplos seria:

Jogo do Khronos:
Endereço da frase -> Posição dentro do banco -> Ponteiro de 2 bytes.

Digimon:
Endereço da frase -> Posição dentro do banco -> Endereço da CPU -> Segmento + Offset -> Ponteiro de 4 bytes.

No fim, a lógica de endereçamento é a mesma.
O que muda é a maneira como cada jogo organiza e armazena seus ponteiros.