[ASM PATCHING] Aula Básica - 01

Iniciado por Anime_World, Agosto 17, 2020, 14:27:31 PM

tópico anterior - próximo tópico

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

Anime_World

Esta é uma aula introdutória de como fazer um asm patching básico
usando o BASS do byuu que praticamente serve pra varias as plataformas:
Game Boy, NES, SNES, Master System, Mega Drive, Neo Geo, MSX
O que está sendo ensinado aqui são apenas os comandos básicos do "Assembler" e não nenhuma linguaguem "Assembly" específica, que fique claro.

--- Material necessário ----
- BASS Assembler do Byuu
- ROM Altered Beast (UE) (REV02) [!].gen

O assembler BASS pode ser encontrado para compilar em https://github.com/ARM9/bass
mas também é possível encontrar ele já compilado nos anexos abaixo.

---- Iniciando o Projeto ----
Primeiramente vamos criar uma pasta para o projeto e copiar para ela a ROM na qual vamos trabalhar separei pra essa primeira lição o jogo Altered Beast do Mega Drive, assim que copiarmos a rom para a pasta do nosso projeto vamos renomeá-la para rom.bin de modo a facilitar nosso trabalho.

Após isso vamos iniciar nosso patch, para isso vamos criar um arquivo de texto e salva-lo como patch.asm nossa pasta de projeto vai conter dois arquivos:

desta forma podemos abrir o patch.asm no editor de textos de nossa preferência.

---- Configurando o Projeto ----

--> Definindo a Arquitetura <--
A primeira linha que vamos escrever no nosso arquivo será pra definir a arquitetura do sistema na qual vamos trabalhar, no nosso caso vamos trabalhar com o Mega Drive na parte da CPU
portanto ficará dessa forma:
arch md.cpu

Caso estivessemos patcheando uma rom de NES ficaria:
arch nes.cpu

--> Definindo o tipo da ROM <--
Agora que a arquitetura na qual vamos trabalhar foi definida, devemos definir o tipo de rom na qual estamos trabalhando, ou seja, se ela usa sistema little endian ou big endian, no caso do Altered Beast trata-se de uma ROM big-endian:
endian msb
Porém no caso de uma ROM little-endian como acontece com SNES:
endian lsb

--> Definindo o arquivo da ROM patcheada <--
O próximo passo será definir o arquivo da rom patcheada, faremos isso usando output, desta forma:
output "patcheada.bin",create
O argumento ,create permite q o arquivo da rom patcheada seja criado automaticamente ao fim do patch. Nosso arquivo ficará assim até o momento:


--> Inserindo a ROM original <--
Assim teremos quase tudo configurado. Fata apenas inserir a rom original nele, para isso usaremos o origin e insert
origin define o offset aonde iremos inserir um comando
e insert é o comando que especifica a inserção de um binário

No caso da nossa rom original, o código ficará desta forma:
origin $00000000
insert "rom.bin"




Notem que as linhas iniciadas por // são apenas comentários que usei pra facilitar a leitura do código, elas não tem influência alguma sobre o código, são apenas para referência.

---- Criando o Patch ----
Tudo configurado adequadamente, poderemos iniciar nosso patching.

--> Definindo um LABEL para a alteração <--
O primeiro texto que iremos editar em nosso jogo é a frase PUSH START BUTTON
que se encontra no offset 0xBC92 da ROM, para patchear essa frase vamos começar definindo um label para ela, labels são rótulos para identificar pedaços do seu código. No caso vamos chamar o nosso de aperte_start:
aperte_start:

--> Definindo o offset (endereço) da alteração <--
após isso precisamos definir o offset da frase a ser patcheada na rom
vamos usar o origin novamente, antes do label
origin $0000BC92
aperte_start:


--> Inserindo a alteração <--
e para finalizar inserimos a frase traduzida depois do label, usando db:
origin $0000BC92
aperte_start:
  db "  APERTE  START  "


Nota: sempre que formos escrever um texto no asm patch colocaremos o mesmo entre aspas "



--> Executando e aplicando o Patch <--
Patch finalizado, vamos aplica-lo rodando o bass
bass patch.asm

Nota: se você for usuário de windows, copie o bass.exe para a mesma pasta e execute:
bass.exe patch.asm

se tudo ocorreu perfeitamente ao abrir a rom patcheada.bin no offset 0xBC92 teremos


essa rom usa uma tabela diferente da ASCII para exibir os caracteres
na próxima aula ensino como criar uma tabela alternativa no patch

Nota: para quem for traduzir GBA usando o BASS é só remover a linha
arch md.cpu
trocar o tipo da rom e fazer o restante normalmente.

---- Informações Adicionais ----
As outras arquiteturas suportadas pelo BASS seguem na tabela abaixo

gb.cpuGame Boy
gg.cpuGame Gear
md.cpuMega Drive
msx.cpuMSX
n64.cpuNintendo 64
nes.cpuNES
ng.cpuNeo Geo
pce.cpuPC-Engine
sms.cpuMaster System
snes.cpuSuper Nintendo
nonononono

huskie

Parabéns pelo manual, Anime. Pode ter certeza de que será essencial para alguns! Acho que vou criar um PDF diagramado pra ti e te passar depois pra acrescentar no FUT e no site do PO.B.R.E.

Mais um manual!
Through PS4 PSXItarch v3 Linux!

Anime_World

Adicionados separadamente os sources do bass de 18/08/2020 e binário atualizado para Windows para quem estiver com dificuldades de compilar.
nonononono

ØX-Carnage

Parabéns mano. sou suspeito de fala sobre o seu trabalho. Ficou bem fácil de entender..
Show de bola. Tem que fixar esse tópico.

ValugTradutor

#4
Eu tava procurando algo introdutório assim, porém ficou uma dúvida: como eu aplico o patch? Eu não entendi exatamente, eu escrevo todo o código no arquivo, e depois executo o BASS? Eu tentei isso e não funcionou. Estou fazendo algo errado? Eu uso windows, e o código ficou assim:

arch md.cpu

endian msb

output "patcheada.bin",create

origin $00000000
insert "rom.bin"

origin $0000BC92
aperte_start:
  db "  APERTE  START  "

bass.exe patch.asm

ATUALIZAÇÃO: Consegui aplicar, sofro de lerdisse.
Conhecimento que não é compartilhado é inútil

ajkmetiuk

valeu mesmo, magalicia e eu usamos em um teste aqui e funcionou belezinha montar a estrutura, vi até a aula 3 e no caso já foi suficiente para o teste kk obrigado por compartilhar, não tinha experimentado ainda fazer do zero mas é bem interessante.
supremex!