[NES] Gráficos Interleaved

Iniciado por spyblack, Maio 28, 2017, 10:52:48 AM

tópico anterior - próximo tópico

0 Membros e 2 Visitantes estão vendo este tópico.

spyblack

Repostando esse tutorial lendário para ajudar um colega da cena espanica, o blade133bo!

Gente, abaixo vou descrever algo que a maioria nunca viu ou quando se deparou falou "ISSO AE EH COMPRESSAUM"... Então, vou descrever o que é e como editar Gráficos Interleaved.

!! AVISO, NÃO IREI EXPLICAR BASES HEXA E TAMPOUCO ROMHACKING BÁSICO !!

Primeiramente, o que são:
  Geralmente os gráficos de um game de NES utilizam algum tipo de sistema para armazenamento dos TILES na memória ram, visto que a mesma tem espaço para poucos gráficos, dai surgiu os famigerados MAPPERS, existem muitos tipos e geralmente eles se comportam da mesma maneira na rom, e assim fazem swap gráfico para exibir corretamente o que o programador quer, não vou falar a respeito disso, se quiserem saber mais procurem no RH.NET, lá tem livros em TXT que descrevem todos os formatos MMC do NES.

  Assim, o mapper arruma os tiles em posição na tela, mas algumas vezes eles funcionam de forma diferente do convencional, por exemplo, para mostrar de forma convencional um texto, a ROM teria armazenado exatamente a ordem correta de mostra na tela, assim com uma busca relativa (que nada mais é do que buscar pelas sequencias de caracteres ordenados sempre por a-z sendo a diferença entre os 25 caracteres, a=1 e z=25) você deverá encontrar os resultados independentize de qual for a tabela, isso é o modo comum utilizado nas roms.

  Mas, imagine que o programador falhou na noite passada, ou perdeu o seu NDS no ônibus, e ao invés de usar um método comum utilizasse um mapeamento completamente diferente, embaralhando o texto e só arrumando via MMC, que não usa um encoding facilmente interpretável?

É exatamente isso que se trata os Gráficos Interleaved, o texto em questão não é arrumado corretamente, mas sim de forma completamente absurda, impossibilitando a edição comum e a busca relativa.

  *** Aviso, se o seu game pode ter esse tipo de codificação, eu não tenho a mínima ideia, mas o método é abrangente apenas para NES, mas acredito eu que você poderá usar para outras plataformas adequando as coisas. ***

Mão na Massa:
Ferramentas:


ROM            : Mega Man 3 (U) [!].nes / CRC32: 452D8089
EMULADOR       : FCEUXD SP
GERADOR TABELAS: Table Maneger
OUTRA          : BLOCO DE NOTAS OU EDITOR DE TEXTO SIMPLES


Procedimentos:
   Primeiramente, localize onde está localizado o texto que você não localiza por vias normais, no caso do tutorial esse está na Title Screen, como a imagem abaixo mostra:

No caso, chegar até ai é rápido, mas se for algo demorado para chegar no game (como por exemplo os créditos finais), você pode fazer um save state, mas vai um alerta NUNCA FAÇA O SAVE STATE NO LUGAR DO TEXTO, faz antes um pouco, vou explicar o porque mais a frente.

   Após localizar o texto, clique em:
TOOLS / PPU VIEWER

   Você chegará na imagem abaixo, bem conhecida dos romhackers de nes por conter todos os tiles utilizados na imagem que está sendo mostrada no emulador no exato momento:


Veja abaixo para exemplificar o endereçamento da PPU em hexa:


Sabendo essas informações, anote os valores HEXA, e clique em:
TOOLS / HEX EDITOR

   Na imagem abaixo você vê o editor hexa integrado ao emulador, e diretamente mostra a MEM RAM do console em ação, você pode ver também a PPU do console e também a ROM, no caso vamos ver a PPU, para isso clique em:


Nesse passo, uma tabela dos valores dos caracteres encontrados na PPU ajudam bastante, com ela completa, clique em FILE/LOAD *.TBL FILE e encontre a tabela que você criou. Agora encontre a PRIMEIRA OCORRÊNCIA DO TEXTO que iremos editar, no caso o GAME START, veja as imagens abaixo que mostram os passos:


Agora vem a parte mais complexa, clique com o botão direito sobre a letra "G" que tem o valor 0x10, e clique como abaixo é mostrado:


Depois disso você encontra a tela abaixo, que é o Debugger do emulador:


Observando no canto superior direito, encontramos o nosso endereço da PPU selecionado, o que estava escrito o G que vamos buscar. Clique no botão EDIT, irá aparecer um janela para editar o breakpoint, escreva A==#10 na linha CONDITION.

   Por que foi feito isso? Para que o emulador tivesse uma condição tal para executar alguma coisa alem nesse espaço de memória do PPU, já que a opção PPU MEM está acionada, visto que esse endereço que nós localizamos é da PPU, assim, no caso o "A==" é uma condição para o emulador dar um break na emulação assim saltar a janela do Debugger mostrando no topo dela a instrução onde foi utilizado aquela condição, no caso o #10, que equivale a letra G no PPU do emulador. Editando a condição, clique em OK e faça um RESET, ou aperte F10 na janela do emulador.


Depois do game iniciado, quando a instrução do endereço fornecido for o emulador vai "pular" para frente o Debugger, mostrando no topo a instrução, depois disso clique algumas vezes para cima nessa janela até aparecer as instruções de forma completa, como está abaixo:


A instrução LDA faz referência sempre a STA, assim quando STA tem valor 2006/2007 que é o registrador da especial da PPU, o LDA mostra o endereçamento incrementado por X que a PPU está mostrando, no caso o valor incrementado é 079B. Nós anteriormente clicamos para cima nessa janela para voltar algumas linhas e ver a instrução que resultou na referencia ao registrador, no caso STA $2007 = #$00, que vai ser incrementado pelo valor que foi apontado por 0783+X, que resulta em 079B que é igual a #$10, que foi o valor que nós buscamos.

  Com esse valor anotado (079B), vamos editar o Breakpoint para buscar a referencia anterior desse valor, como feito na imagem abaixo, notem que foi modificado a busca para CPU:


   A busca foi mudada para CPU visto que agora nós temos o endereço a ultima instrução do CPU antes de incrementar na PPU (2007), assim vamos buscar a referencia anterior a esse endereço de memória, para tanto RESET mais uma vez o emulador, vai resultar na imagem abaixo:


   Note que o endereço que fizemos a busca e o break está agora na instrução STA, note que clicando alguma vezes para cima temos a instrução LDA que resulta no valor que estamos buscando.

   A próxima busca está na instrução LDA que depois de incrementada po X resultou em 079B, assim vamos encontrar mais um valor, vamos editar novamente o breakpoint, depois clicando em Ok e fazendo RESET no emulador:


   Olha só, alguma coisa mudou, agora não está sendo incrementado por X o endereço, mas por Y, não sei explicar ainda (claro que tem uma lógica nisso tudo) mas geralmente quando se incrementa por Y a instrução faz alguma referencia a um endereço na RAM que tem relação direta com a ROM, no caso o que estamos buscando, porque se continuarmos fazendo esse processo invertido vamos ir para lugares que não fazem mais break na emulação, então encontramos a primeira instrução depois de carregado o setor da ROM na RAM.

   Agora, vamos encontrar qual o OFFSET da ROM para editar os caracteres interleaved. Para isso anote o resultado mostrado na ultima figura (o resultado da busca por 079B), abra o editor hexa do emulador (como mostrado antes), e encontre esse endereço, sobre o endereço clique com o botão direito e clique em GO HERE IN ROM FILE, como a figura abaixo mostra:


   Você vai ser jogado diretamente no lugar onde sua busca resultou na ROM, como mostra a figura abaixo:


  Veja que já localizei todos os outros valores, alguns por dedução, outros por buscas semelhantes a feita com a letra G, fiz troca de valores colocando números e letras ordenadas para melhor entendimento da sequencia. O resultado de tudo é ver que as letras estão simplesmente espalhadas em um pedaço de código misturado ao mapper da title screen, mesmo ficando confuso para editar, fica claro que o mapper apenas "upa" esses hexas em um ponteiro, e esse é colocado com um code simples no mapper (aparentemente ele aparece logo abaixo ou acima do OFFSET estudado).

   Abaixo um code de tudo que foi feito para a edição desses caracteres, ajuda para o estudo:

Dados da frase via PPU:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
GAME START
||||||||||-> T = $1D
|||||||||--> R = $1B
||||||||---> A = $0A
|||||||----> T = $1D
||||||-----> S = $1C
|||||------> _ = $24
||||-------> E = $0E
|||--------> M = $16
||---------> A = $0A
|----------> G = $10

Debug da letra G

ENDEREÇO NA PPU + passos no debug:
Address / MEM / Condition
- 2267 / PPU / A==#10

- Encontrado:
$C50D:BD 83 07  LDA $0783,X @ $079B = #$10
$C510:8D 07 20  STA $2007 = #$00

- 079B / CPU / A==#10
- Encontrado:
$EF41:BD CC 06  LDA $06CC,X @ $06CF = #$10
$EF44:9D 98 07  STA $0798,X @ $079B = #$24

- 06CF / CPU / A==#10
- Encontrado:
$E816:B9 00 BE  LDA $BE00,Y @ $BEBB = #$10
$E819:9D C5 06  STA $06C5,X @ $06CF = #$24

BEBB apontou para o endereço 027ECB na ROM
OFFSET mostra Carregamento de utilizados, não é o mapper:
Feito teste e descoberto que não são todas as letras:
8A2E3S4A5T6 -> GAME START
7ASS WORD   -> PASS WORD (manter igual)

(02 03 04 24 24 24 24 05 06 07 08)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Debug da letra A

ENDEREÇO NA PPU + passos no debug:
Address / MEM / Condition

- 2268 / PPU / A==#0A
- Encontrado:
$C50D:BD 83 07  LDA $0783,X @ $0798 = #$0A
$C510:8D 07 20  STA $2007 = #$00

- 0798 / CPU / A==#0A
- Encontrado:
$EF41:BD CC 06  LDA $06CC,X @ $06CC = #$0A
$EF44:9D 98 07  STA $0798,X @ $0798 = #$24

- 0798 / CPU / A==#0A
- Encontrado:
$E810:B9 00 BD  LDA $BD00,Y @ $BDB1 = #$0A
$E813:9D C4 06  STA $06C4,X @ $06CC = #$24

BDB1 apontou para o endereço 027DC1 na ROM
Hexa Original do trexo 27DC0-27DCF

(24 0A 0E 1C 24 24 24 24 0A 1D 24 24 00 00 00 00)
na linha de baixo contem mais dois caracteres (W R)

GAME_START_
Descostruindo para entendimento
LETRAS  -> abcdefghijkl (27dc0-27dcb)
numeros -> 123456789xy  (27ec1-27ecb)

E4F5G6H7     -> abaixo do logotipo do numero III
LYB1C2D3I8J9 -> referente a GAME_START_
KXASS WORD   -> referente a PASS WORD

Processo de substituição do game start para iniciar

L -> j
Y -> o
B -> g
1 -> a
C -> r
2 -> _
D -> a
I -> g
8 -> o
J -> r
9 -> a

Ajustando o Pass Word para uma espaço antes:
_ -> 27DCA -> P
P -> 27ECA -> A
A -> 27D8D -> S
S -> 27E8E -> S
S -> 27DE5 -> _
_ -> 27EE5 -> W
W -> 27DD7 -> O
O -> 27ED7 -> R
R -> 27DDF -> D
D -> 27EDF -> _


   Enfim resultando na imagem abaixo no game:

azoreseuropa

#1
PLEASE UPDATE YOUR ACCOUNT TO ENABLE 3RD PARTY HOSTING ?? A sério ??? Não consigo ver a imagem. :raiva2:

azoreseuropa

Oi! Você resolveu o problema? Talvez mudar para um novo site de fotos? Uma vez que o site Photobucket ainda exige 300 dólares por ano. Isso é ridículo.

azoreseuropa

Sim, adoraríamos isso. Faça o upload de volta.

Lobim

Itinerante

azoreseuropa


spyblack

Feito, agora deixa eu dormir novamente e não me acordem mais, e não me cobrem mais ok.

Luiz M

Olá, voce conhece a ferramente interleave?
Eu gostaria de intercalar duas roms, mas não sei como usar o interleave?