[SNES] SimAnt - The Electronic Ant Colony

Iniciado por Lansk, Junho 24, 2022, 16:18:44 PM

tópico anterior - próximo tópico

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

Anime_World

Vamos por etapas, ok?

Primeiro você tem que aprender a usar o debugger pra localizar os graficos comprimidos, pra decomprimir e posteriormente edita-los. O denim fez um ótimo tutorial sobre isso tempos atrás, procure que você encontra.

Quanto a reinserir o gráfico, você precisa aperfeiçoar seus conhecimentos para fazer isso. Pois se o grafico comprimido ficar maior que o original, não adianta apenas substitui-lo no offset. É preciso remaneja-lo para algum espaço vazio ou expandir a rom. Então, recomendo que se concentre no momento agora apenas em aprender a localiza-los usando o debugger.
nonononono

Lansk

Citação de: Anime_World online Agosto 15, 2022, 13:58:43 PM
Vamos por etapas, ok?

Primeiro você tem que aprender a usar o debugger pra localizar os graficos comprimidos, pra decomprimir e posteriormente edita-los. O denim fez um ótimo tutorial sobre isso tempos atrás, procure que você encontra.

Quanto a reinserir o gráfico, você precisa aperfeiçoar seus conhecimentos para fazer isso. Pois se o grafico comprimido ficar maior que o original, não adianta apenas substitui-lo no offset. É preciso remaneja-lo para algum espaço vazio ou expandir a rom. Então, recomendo que se concentre no momento agora apenas em aprender a localiza-los usando o debugger.

Eu baixei o bsnes plus e usei o debugger dele. Consegui localizar alguns gráficos no Tile Viewer do debugger. O que devo fazer agora?
Eu procurei aqui no site o tutorial que você indicou, mas não achei. Vou dar mais uma olhada depois.

Anime_World

Os gráficos são decompridos na WorkRAM e posteriormente copiados pra VRAM.
nonononono

Lansk

Eu não sei se estou fazendo certo. Eu achei gráficos no debugger, mas não entendo direito se está certo ou o que eu tenho que fazer depois.

Anime_World

Citação de: Lansk online Agosto 17, 2022, 12:11:18 PM
Eu não sei se estou fazendo certo. Eu achei gráficos no debugger, mas não entendo direito se está certo ou o que eu tenho que fazer depois.

Ai você está olhando na VRAM.
Você tem q olhar na WRAM que é aonde é decomprimido o grafico, depois de decomprimido ele é copiado pra VRAM para ser exibido na tela.
Assim que encontrar o endereço aonde ele é decomprimido na WRAM voce insere um breakpoint de escrita nesse endereço pra saber qual rotina que decomprime o gráfico e de onde ele vem.
nonononono

badnest

Olha a VRAM em hexadecimal e coloca um breakpoint pra quando eles forem escritos na VRAM. Quando esse breakpoint ativar, pode olhar na WRAM que eles vão ta lá, aí pega o endereço e faz outro breakpoint como o Anime_World falou. Eles ficam na WRAM por um intervalo de tempo bem curto.

Lansk

Oi, gente. Infelizmente eu não sei fazer nada disso. Eu acho que eu deveria ter começado pelo NES ao invés do SNES, já que a maioria dos gráficos é descomprimida.
Desculpa ter tomado muito o tempo de vocês, mas eu não sei se eu vou conseguir aprender essas partes mais complicadas.

kuroi

#22
O "Breakpoint" que o pessoal está mencionando aí é um recurso de emuladores com Debuggers que permite que você dê uma "pausa" (Break) em determinado local do código de execução do jogo para que você possa obter algum dado ou informação que esteja no jogo. Os Breakpoints podem ser usados para obter um texto, um ponteiro, um gráfico (comprimido ou não), uma fonte e etc.
Como os códigos em Assembly são basicamente atribuições e movimentações de Bytes entre os registradores do processador do console, os Breakpoints são categorizados em três tipos:
1- Exec (Execução)
2- Read (Leitura)
3- Write (Escrita)

Mas aqui no Romhacking usamos mais os de Leitura e Escrita.

Para criar um Breakpoint usando o Emulador Debugger "Geiger's Snes9x" baixado no romhacking.net:

1- Abra o jogo normalmente no emulador
2- Assim que o jogo abrir, a seguinte tela vai ser exibida:

3- Escolha "Breakpoints"
4- Uma nova tela será exibida mostrando que tipo de Breakpoint você quer fazer e qual é o endereço que você quer fazer o Break. Imagem:

5- Escolha o tipo de Breakpoint que você quer fazer entre: Exec, Read ou Write
6- Preencha o endereço que você quer fazer o Break, mas ATENÇÃO A UM PASSO IMPORTANTE!! Este endereço não é da ROM, e sim do código do jogo em tempo de execução! E para que você obtenha esse valor, existe uma ferramenta que também pode ser baixada pelo romhacking.net chamada de "SNEStuff".

No SNEStuff é possível "converter" o endereço da ROM que você tiver (obtido por um Editor Hexadecimal) para o endereço do código de execução do jogo, por meio do tipo da ROM usada no jogo.
Exemplo:

Para obter um endereço que possa ser feito um Breakpoint no jogo do SimAnt:

1- Abra o jogo em um Editor Hexadecimal qualquer
2- Encontre algum conteúdo que você queira fazer um Break. No meu exemplo vou usar o endereço: 0xA550, onde tem o texto: "You can only enter areas..."
3- Agora, de acordo com a documentação da ROM do jogo SimAnt, o mesmo é categorizado como "LoROM", ou seja, a configuração do SNEStuff deve ser esta:

4- Com isso, o endereço agora é: 0x01A550
5- Com o endereço em mãos, vamos inserí-lo na tela de Breakpoint do Degugger e marcar o tipo de Break como Read (leitura), como a imagem abaixo:

6- Clique em OK e clique em Run, para que o jogo comece a rodar
7- Faça o jogo chegar até o ponto de Break e aguarde o jogo pausar a emulação. Pronto! Breakpoint feito!
君の夢が叶うのは誰かの影じゃないぜ。
風の強い日を選んで走ってきた。

badnest

#23
Citação de: Lansk online Agosto 22, 2022, 19:49:23 PM
Oi, gente. Infelizmente eu não sei fazer nada disso. Eu acho que eu deveria ter começado pelo NES ao invés do SNES, já que a maioria dos gráficos é descomprimida.
Desculpa ter tomado muito o tempo de vocês, mas eu não sei se eu vou conseguir aprender essas partes mais complicadas.

Cara, pra ser sincero realmente essa parte é meio complicada. Na minha opinião, o melhor caminho é começar aprendendo a lógica dos ponteiros, encontrar eles e usar para extrair o texto. Isso é algo que vai te dar mais habilidade e confiança pra mais depois trabalhar com os gráficos. E também é mais importante do que os gráficos, pq vai te permitir mudar o tamanho das frases, por exemplo "botar ovo" ao invés de "bota ovo".

Lansk

Citação de: badnest online Agosto 23, 2022, 12:03:25 PM
Citação de: Lansk online Agosto 22, 2022, 19:49:23 PM
Oi, gente. Infelizmente eu não sei fazer nada disso. Eu acho que eu deveria ter começado pelo NES ao invés do SNES, já que a maioria dos gráficos é descomprimida.
Desculpa ter tomado muito o tempo de vocês, mas eu não sei se eu vou conseguir aprender essas partes mais complicadas.

Cara, pra ser sincero realmente essa parte é meio complicada. Na minha opinião, o melhor caminho é começar aprendendo a lógica dos ponteiros, encontrar eles e usar para extrair o texto. Isso é algo que vai te dar mais habilidade e confiança pra mais depois trabalhar com os gráficos. E também é mais importante do que os gráficos, pq vai te permitir mudar o tamanho das frases, por exemplo "botar ovo" ao invés de "bota ovo".

Eu aprendi a fazer breakpoint graças ao turorial do kuroi. Eu gostaria de editar os gráficos, mas posso tentar entender os ponteiros primeiro mesmo. Por onde eu começo?

badnest

#25
Ponteiros nada mais são que bytes que o jogo lê pra saber onde começam as strings. Por exemplo, um jogo tem duas strings, cada uma referente a um item:



Na ROM terá dois ponteiros, como o snes é little endian, ou seja, lê os bytes do menor para o maior, serão D118, que aponta para 0x18D1, e D718, que aponta para 0x18D7, organizados em uma tabela, junto com so próximos ponteiros, por exemplo:

D1 18 D7 18 DC 18 E0 18 (..) FE 18 02 19 06 19
(ponteiros de 2 bytes (16-bits))

ou talvez:

D1 18 00 D7 18 00 DC 18 00 E0 18 00 (...) FE 18 00 02 19 00 06 19 00
(ponteiros de 3 bytes (24-bits))

Depende muito do jogo, mas muitas vezes da pra encontrar a tabela só procurando D118 e achando algo que se pareça com essa estrutura.

Ao traduzir o jogo, o texto talvez fique assim:



A primeira string vai aparecer normalmente, pois o jogo vai começar a ler em 18D1 e só vai parar no endbyte no final da palavra, que no exemplo é 00.

A segunda string vai aparecer assim:

RA

Pois o ponteiro de ARMA ainda aponta pra 18D7, que agora é o final da palavra ARMADURA. É preciso achar esse ponteiro e mudar ele pra que aponte pra 18DA, e mudar o próximo também e assim sucessivamente até o final do bloco de texto.  Mas isso geralmente não é feito a mão, normalmente da pra usar tools que recalculam os ponteiros automaticamente de acordo com o novo texto.

Que bom que aprendeu breakpoints, pois a gente vai usar eles pra achar os ponteiros do simant, já que é um método mais certeiro do que pesquisando.

Vamos começar com o exemplo do "bota ovo". Primeira coisa a entender é que o processador não acessa o endereço na ROM diretamente, os bancos da ROM são mapeados a endereços no barramento do processador, no debugger chamado de "S-CPU BUS". Em ROMs LoROM, como é o caso do simant, cada banco vai de 8000 até FFFF, então dados que estão em 0xYY1100 por exemplo na ROM vão aparecer no barramento em 0xZZ9100 no S-CPU BUS. Não vou entrar em mais detalhes sobre isso pq é muita informação e vai alongar muito o tutorial mas se QUISER saber mais sobre o assunto pesquise  sobre o mapeamento da memória do SNES.

Sabemos que na ROM, a string "Bota ovo" está localizada em 0x8741. Abrindo o editor de memória do debugger do bsnes-plus, no modo S-CPU BUS, clicando no binóculos pra fazer uma pesquisa e digitando "Bota ovo"(entre aspas, pra especificar que é texto ascii ao invés de hexadecimal), podemos ver que ele está localizado em 0x18741, mas se clicar em localizar próximo, vai ver que o ele também está espelhado em 0x218741, 0x418741, 0x618741 e assim por diante. Isso se deve ao modo que a ROM é mapeada ao barramento. Pra saber de qual desse endereços o processador lê o texto, vamos fazer exatamente isso mas depois que o texto já apareceu na tela pelo menos uma vez. O texto que foi lido pelo processador vai ficar azul:



Nesse jogo o endereço é o primeiro e não um dos espelhados, mas em outros pode ser diferente!
Colocamos um breakpoint de leitura em 18741 no S-CPU BUS. Ele ativará ao abrir a caixa de ação da formiga.

00c4e4 lda [$79],y   [018741] A:6a01 X:0002 Y:0000 S:04eb D:0100 DB:00 nvMxdIZc V: 29 H: 75 F:32

Essa instrução está carregando o texto do endereço que está guardado em 0x179 (D=0100 + Y=0000 + 79 = 0179), 0x179 faz parte da memória RAM. Se olhar em 0x179 no S-CPU bus, vai ver nosso ponteiro, 41 87. Precisamos descobrir como esse ponteiro foi parar na memória RAM.

Vamos desativar o ponteiro anterior e criar um novo em 0x179, de ESCRITA, e em data vamos colocar 41.

Abrindo a caixa de ação da formiga de novo, o novo breakpoint vai disparar:

00c4db sty $79       [000179] A:6a79 X:0002 Y:8741 S:04eb D:0100 DB:00 nvMxdIzc V: 29 H: 46 F: 4

Esse comando guarda y, que é nosso ponteiro, em 0x179. Beleza, mas como Y virou 8741? Pra descobrir vamos ter que fazer um trace log, que é um arquivo com todas as instruções que o processador executou num intervalo de tempo, quanto maior o intervalo de tempo mais gigantesco o arquivo, então vamos tentar deixar esse intervalo o menor possível.

Com o breakpoint ainda ativo, a caixa de texto ação e o cursor em cima da formiga, clique em break, ative a opção trace s-cpu opcodes, clique em run, rapidamente abra a caixa de ação (o fps pode baixar bastante, pode ser preciso apertar o botão pra abrir a caixa varias vezes). O breakpoint vai disparar, desative trace s-cpu opcodes. Um arquivo será criado com o nome "nomedarom-trace.log". Se estiver num sistema unix use o less pra abrir, se for windows pode ser que alguns programas travem por ser muito longo o arquivo, mas enfim, pode pular direto pro final do arquivo:

[spoiler]009334 lda [$1c],y   [018732] A:0003 X:0b0a Y:0003 S:04ed D:0100 DB:00 nvMxdIzc V: 84 H:323 F:37
009336 iny                    A:0041 X:0b0a Y:0003 S:04ed D:0100 DB:00 nvMxdIzc V: 84 H:334 F:37
009337 xba                    A:0041 X:0b0a Y:0004 S:04ed D:0100 DB:00 nvMxdIzc V: 84 H:337 F:37
009338 lda [$1c],y   [018733] A:4100 X:0b0a Y:0004 S:04ed D:0100 DB:00 nvMxdIZc V: 85 H:  2 F:37
00933a xba                    A:4187 X:0b0a Y:0004 S:04ed D:0100 DB:00 NvMxdIzc V: 85 H: 14 F:37
00933b tay                    A:8741 X:0b0a Y:0004 S:04ed D:0100 DB:00 nvMxdIzc V: 85 H: 19 F:37
00933c jsr $c4d8     [00c4d8] A:8741 X:0b0a Y:8741 S:04ed D:0100 DB:00 NvMxdIzc V: 85 H: 23 F:37
00c4d8 jsr $c4bb     [00c4bb] A:8741 X:0b0a Y:8741 S:04eb D:0100 DB:00 NvMxdIzc V: 85 H: 34 F:37
00c4bb rep #$20               A:8741 X:0b0a Y:8741 S:04e9 D:0100 DB:00 NvMxdIzc V: 85 H: 46 F:37
00c4bd txa                    A:8741 X:0b0a Y:8741 S:04e9 D:0100 DB:00 NvmxdIzc V: 85 H: 51 F:37
00c4be sep #$20               A:0b0a X:0b0a Y:8741 S:04e9 D:0100 DB:00 nvmxdIzc V: 85 H: 55 F:37
00c4c0 asl a                  A:0b0a X:0b0a Y:8741 S:04e9 D:0100 DB:00 nvMxdIzc V: 85 H: 60 F:37
00c4c1 asl a                  A:0b14 X:0b0a Y:8741 S:04e9 D:0100 DB:00 nvMxdIzc V: 85 H: 64 F:37
00c4c2 asl a                  A:0b28 X:0b0a Y:8741 S:04e9 D:0100 DB:00 nvMxdIzc V: 85 H: 67 F:37
00c4c3 rep #$20               A:0b50 X:0b0a Y:8741 S:04e9 D:0100 DB:00 nvMxdIzc V: 85 H: 71 F:37
00c4c5 lsr a                  A:0b50 X:0b0a Y:8741 S:04e9 D:0100 DB:00 nvmxdIzc V: 85 H: 76 F:37
00c4c6 lsr a                  A:05a8 X:0b0a Y:8741 S:04e9 D:0100 DB:00 nvmxdIzc V: 85 H: 80 F:37
00c4c7 lsr a                  A:02d4 X:0b0a Y:8741 S:04e9 D:0100 DB:00 nvmxdIzc V: 85 H: 83 F:37
00c4c8 sep #$20               A:016a X:0b0a Y:8741 S:04e9 D:0100 DB:00 nvmxdIzc V: 85 H: 87 F:37
00c4ca ldx $2c       [00012c] A:016a X:0b0a Y:8741 S:04e9 D:0100 DB:00 nvMxdIzc V: 85 H: 92 F:37
00c4cc sta $0c00,x   [000c00] A:016a X:0000 Y:8741 S:04e9 D:0100 DB:00 nvMxdIZc V: 85 H:100 F:37
00c4cf inx                    A:016a X:0000 Y:8741 S:04e9 D:0100 DB:00 nvMxdIZc V: 85 H:110 F:37
00c4d0 xba                    A:016a X:0001 Y:8741 S:04e9 D:0100 DB:00 nvMxdIzc V: 85 H:113 F:37
00c4d1 ora $89       [000189] A:6a01 X:0001 Y:8741 S:04e9 D:0100 DB:00 nvMxdIzc V: 85 H:118 F:37
00c4d3 sta $0c00,x   [000c01] A:6a79 X:0001 Y:8741 S:04e9 D:0100 DB:00 nvMxdIzc V: 85 H:124 F:37
00c4d6 inx                    A:6a79 X:0001 Y:8741 S:04e9 D:0100 DB:00 nvMxdIzc V: 85 H:144 F:37
00c4d7 rts                    A:6a79 X:0002 Y:8741 S:04e9 D:0100 DB:00 nvMxdIzc V: 85 H:147 F:37
00c4db sty $79       [000179] A:6a79 X:0002 Y:8741 S:04eb D:0100 DB:00 nvMxdIzc V: 85 H:158 F:37
[/spoiler]

O Y vira 8741 após o comando tay, que nada mais faz do que colocar o valor de A em Y. O A vira 8741 após os comandos lda, não precisa fazer os cálculos pq o debugger já nos diz de cara que o 8741 veio de 0x18732 (entre colchetes). 0x18732 no barramento do processador corresponde ao endereço 0x8732 na ROM, que é logo antes do texto em questão! Em 0x8732 temos 41 87, que é nosso ponteiro, logo antes temos 34 87, que é o ponteiro de "Cava ninho", mais adiante temos os ponteiros 63 87 até b7 87, que são os ponteiros do próximo bloco, e assim por diante.

Sim, nesse caso de os ponteiros serem misturados no texto complica um pouco as coisas, mas a coisa toda segue o seguinte formato:

número de ponteiros que seguem, ponteiros, strings, números de ponteiros que seguem, ponteiros, strings ...

Por exemplo, em 0x8755 temos o segundo "Bota ovo", seguido do endbyte FF, seguido do byte 06, que diz que o que segue são seis ponteiros, seguido dos seis ponteiros, seguido das seis strings que correspondem aos seis ponteiros. Da pra editar tudo a mão respeitando esse padrão, mas não recomendo muito não.

Pra ser sincero não sei como extrair esse texto com o cartographer, com o abcde deve ter algum jeito simples mas nunca usei, vale olhar a documentação dele com atenção e procurar tutoriais. Recomendo também use esse tutorial pra encontrar o restante dos ponteiros do jogo.

Algum hacker que tem experiência com o abcde pode te ajudar melhor daqui pra frente, ou algum certo hacker bom das tool pode fazer uma pra extração e reinserção específica pra esse jogo.

Na tabela da pra mapear todos os caracteres acentuados pros mesmos não acentuados, traduzir o script extraído e inserir normalmente na rom sem os acentos, aí depois da fonte acentuada da pra só mudar a tabela e reinserir sem ter que mexer no texto de novo.


Lansk

Eu acho que entendi como ver os ponteiros, só não sei ainda como editá-los. Como eu edito esses ponteiros agora? Preciso usar alguma tool específica para fazer essa edição ou posso usar o editor hexadecimal?