[NES] - Achando Ponteiros YS 2 (Método Masoquista)

Iniciado por ØX-Carnage, Outubro 19, 2026, 20:50:18 PM

tópico anterior - próximo tópico

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

ØX-Carnage

Esse tópico tem como objetivo ajudar o amigo Hawksd em sua tradução do YS 2. Esse não é um dos melhores postos no assunto, existem documentações mais claras e detalhes que esse aqui. Mas acho que pode ajudar.

Antes de qualquer coisa, recomendo não usar IA para simplesmente fazer todo o trabalho por você. Primeiro, procure entender como o processo funciona. Repita o procedimento em outras frases e, depois, em jogos diferentes, pois, como diz um velho amigo,
"Romhacking não é uma receita de bolo!"

Depois disso, a IA pode servir como apoio: pergunte por que determinado procedimento é necessário, o que aconteceria se fosse feito de outra maneira e quais são as alternativas. Assim, você realmente começa a compreender o que está fazendo.

Neste exemplo, vamos trocar DABBY LV por DABBY LIVRO. A frase nova não cabe no espaço ocupado pela original, então, precisamos colocá-la em outro local livre do mesmo banco e alterar seu ponteiro.
Abra o Tilemap Viewer do Mesen e deixe o cursor sobre a letra L de LV. No exemplo, ele mostra:
  • Tilemap address: $2475
  • Tile index: $B3
  • Column, Row: 21, 3
  • Mirroring: Horizontal <-- Atenção nesse cara aqui.


  • O endereço $2475 identifica uma posição virtual do tilemap.
  • O valor $B3 identifica o tile usado para desenhar a letra L.
Importante: o cálculo a seguir não existe por causa do espelhamento. Ele apenas converte linha e coluna em um endereço de tilemap. Como cada linha possui 32 tiles, para chegar à linha 3 e à coluna 21 fazemos:

$2000 + (3 × 32) + 21
$2000 + $60 + $15
$2000 + $75 = $2075


O resultado é $2075. Como a ROM usa espelhamento horizontal(lembra do carinha lá?), $2075 e $2475 apontam para a mesma área física da VRAM. O Tilemap Viewer mostrou o alias $2475, mas o jogo escreveu usando $2075.

Vamos achar esse endereço na PPU. No Debugger, crie um breakpoint de escrita em PPU Memory $2075. Entre novamente no inventário e continue a execução até o breakpoint indicar a escrita do valor $B3. Paradas com $FF correspondem à limpeza da tela e não são a ocorrência desejada.
Na parada correta, a rotina envia o tile para a PPU por meio de:

LDA ($07),Y
STA $2007

Nesse momento, o tile $B3 veio do buffer localizado na RAM em $0213.
Agora vanos achar esse buffer na RAM. Desative o breakpoint anterior e crie um breakpoint de escrita em CPU Memory $0213. Continue até aparecer uma escrita de $B3; escritas de $FF apenas limpam o buffer.


A parada relevante ocorre na instrução:
STA ($0B),YA instrução anterior carregou $B3 de $0538. Portanto, crie outro breakpoint de escrita em $0538. Na ocorrência correta, vemos:

LDA ($09),Y [$81D4] = $B3
STA $0538

Isso mostra que o tile da letra L foi lido do endereço de CPU $81D4 e copiado para $0538.
Pronto achamos o que queriamos.
Agora abra o Memory Viewer, selecione CPU Memory e vá até $81D4. Observando os bytes anteriores, encontramos a frase completa iniciando em CPU $81CE:

AB A8 A9 A9 C0 FF B3 BD 00
D  A  B  B  Y     L  V FIM



O byte $00 encerra a frase. Como existem outros dados logo depois dele, não podemos simplesmente escrever LIVRO no local original sem corromper o conteúdo seguinte.
Se quiser confirmar a codificação, altere temporariamente os bytes pelo Memory Viewer e observe o resultado em tempo real. Depois, restaure os valores originais.


Se deixar o cursor ele mostra as informações dess endereço, naquele momento, CPU $81D4 correspondia a PRG $41D4. Isso revela o mapeamento ativo:

CPU $8000–$9FFF ↔ PRG $4000–$5FFFComo a ROM possui cabeçalho de $10 bytes, para converter PRG em offset do arquivo deve somar.
PRG $41D4 + $10 = arquivo $41E4

Csso fosse ao contrário, do arquivo para PRG, subtraímos $10.
A frase começa em CPU $81CE. Como o NES usa little-endian, esse endereço é armazenado com os bytes invertidos:

$81CE → CE 81No Memory Viewer, procure a sequência CE 81. Ela aparece na tabela de ponteiros em PRG $4164. Para obter o offset no arquivo da ROM, some o cabeçalho:
PRG $4164 + $10 = arquivo $4174

Procure espaço livre dentro do mesmo banco. Neste caso, a nova frase foi gravada no offset de arquivo $5FFF. Convertendo o endereço:

arquivo $5FFF − cabeçalho $10 = PRG $5FEF
PRG $5FEF − base PRG $4000 = $1FEF
CPU $8000 + $1FEF = CPU $9FEF

Os bytes da frase nova são:
AB A8 A9 A9 C0 FF B3 B0 BD B9 B6 00
D  A  B  B  Y     L  I  V  R  O FIM

Por fim, no offset de arquivo $4174, substitua o ponteiro antigo CE 81 pelo novo endereço CPU $9FEF em little-endian:

EF 9F

Salve a ROM, recarregue-a completamente no emulador e teste o inventário e as telas relacionadas.
Mudei algumas coisas no meio da explicação justamente para que na hora que você começar a fazer se pergunte! Isso poderia ser feito de outra maneira. Quando você se perguntar isso, sinal que já entendeu o processo.