Um garoto de garoto, desmontador.
Requer Python v3.6 ou posterior.
Os arquivos de montagem gerados pelo MGBDIS são projetados para serem montados com RGBDS v0.6.0 ou posterior.
Desmonte uma ROM:
./mgbdis.py some-game.gb
A saída padrão é para o diretório disassembly . Você pode verificar o resultado da desmontagem, executando make e verificando o arquivo game.gb (ou game.gbc ) criado:
cd disassembly && make
Há também várias opções disponíveis para controlar o estilo de formatação e instrução do código de montagem gerado. Você pode visualizá -los executando:
./mgbdis.py -h
Os arquivos de símbolo permitem indicar onde estão os blocos de código, dados, teste e dados de imagem na ROM.
As instruções da CPU Game Boy (SM83) têm comprimentos diferentes, e os dados podem ser intercalados com o código na ROM, portanto, não é possível sempre identificar com precisão onde uma instrução começa e para. Definir blocos de código em um arquivo de símbolo pode ajudar a evitar problemas com o MGBDIS tentando desmontar no meio de uma instrução.
Se você não possui um arquivo de símbolo, pode tentar gerar um com meu emulador de garoto de jogo - espancado morrendo lua. Você pode usar a demonstração da web ou há compilações disponíveis para Windows e MacOS. Ele pode gerar um arquivo de símbolos com definições de bloco de código com base nos endereços das instruções que realmente foram executadas enquanto você está jogando o jogo, evitando problemas de alinhamento de instruções.
Para usar um arquivo de símbolo com MGBDIS, ele deve existir no mesmo diretório que a ROM e ter o mesmo nome, exceto alterar a extensão para ser .sym .
Todos os valores (exceto as larguras da imagem) devem estar em hexadecimal. As entradas começam com um número de banco seguido pelo endereço na memória.
Os tipos de bloco podem ser definidos usando os rótulos .code , .data , .text e .image mágicos, seguidos pelo comprimento do bloco em bytes.
Adicionando um rótulo para algum código:
03:47f2 Read_Joypad_State
Adicionando um rótulo para 512 bytes de dados:
0d:4800 Level_Data
0d:4800 .data:200
Adicionando um rótulo para 16 bytes de texto:
00:3d00 Character_Name
00:3d00 .text:10
A etiqueta mágica .image permite definir blocos de 1 ou 2 bits por pixels de dados de ladrilhos na ROM. As imagens são emitidas como arquivos PNG no diretório /gfx da desmontagem e são convertidas de volta em dados de ladrilhos 1BPP ou 2BPP pelo Makefile usando RGBGFX. Se um rótulo for especificado no endereço do bloco de imagem, ele será usado para o nome do arquivo PNG.
O comprimento do bloco em bytes deve ser um múltiplo de 16, pois cada ladrilho requer 16 bytes de dados da imagem.
A largura da imagem em pixels pode ser especificada como um número decimal prefixado com w . O valor da largura deve ser um múltiplo de 8, e a combinação de comprimento do bloco e largura da imagem deve resultar em uma imagem retangluar sem ladrilhos vazios. A largura da imagem padrão é de 128 pixels ou, se o comprimento do bloco indicar um número ímpar de ladrilhos, será gerada uma imagem com uma única linha de ladrilhos.
A paleta é um valor de tamanho de byte que seleciona os tons de cinza para usar ao gerar a imagem. Ele usa o mesmo formato que o BGP Register em 0xFF47 . O valor pode ser especificado em hexidecimal prefixado com p . A paleta padrão é E4 .
O padrão é tratá -lo como 2 bits por dados de ladrilhos de pixels. Uma opção 1bpp pode ser fornecida para tratar os dados como 1 bit por pixels de ladrilhos.
Adicionando um rótulo para 1280 bytes de dados de ladrilhos, com uma largura de 128 pixels e paleta 0xe4:
02:791a Title_Screen_Tile_Data
02:791a .image:500:w128,pe4
Imagem resultante:
Exemplo de dados de ladrilhos 1BPP:
05:4000 Font
05:4000 .image:200:w128,1bpp
Imagem resultante:
NOP após STOP e HALT , para que o desmontador os produza como bytes de dados se a instrução não for seguida por um NOP na ROM original. Use --disable-halt-nops com MGBDIs para instruir RGBDs para desativar a inserção de instruções automáticas NOP após as instruções HALT .