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!"
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 (https://www.romhacking.net.br/index.php?topic=2090.msg13671#msg13671)
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 (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.