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 (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:
(https://i.paste.pics/fa2fe82c9b2d658db0bbf6f2f56c5d4a.png)
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
CPUportanto 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:
(https://i.paste.pics/85fb38771e22e665c622e034c314f13e.png)
--> Inserindo a ROM original <--Assim teremos quase tudo configurado. Fata apenas inserir a rom original nele, para isso usaremos o
origin e
insertorigin define o
offset aonde iremos inserir um comando
e
insert é o comando que especifica a
inserção de um binárioNo caso da nossa rom original, o código ficará desta forma:
origin $00000000
insert "rom.bin"
(https://i.paste.pics/f2e5537798ada9626f33daa3af3a9a70.png)
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 BUTTONque 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
labelorigin $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
"(https://i.paste.pics/0c431e3a7e9ef8af9ca639c90b2a6e9c.png)
--> Executando e aplicando o Patch <--Patch finalizado, vamos aplica-lo rodando o
bassbass 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
(https://i.paste.pics/15aed6dafb6c7254261e28bde02d345d.png)
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.cpu | Game Boy |
gg.cpu | Game Gear |
md.cpu | Mega Drive |
msx.cpu | MSX |
n64.cpu | Nintendo 64 |
nes.cpu | NES |
ng.cpu | Neo Geo |
pce.cpu | PC-Engine |
sms.cpu | Master System |
snes.cpu | Super Nintendo |
Adicionados separadamente os sources do bass de 18/08/2020 e binário atualizado para Windows para quem estiver com dificuldades de compilar.
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.
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.
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.