|
@@ -36,10 +36,11 @@ typedef enum { |
|
|
} DataType; |
|
|
} DataType; |
|
|
|
|
|
|
|
|
typedef struct { |
|
|
typedef struct { |
|
|
const uint8_t *data; |
|
|
|
|
|
DataType *types; |
|
|
|
|
|
|
|
|
size_t index; |
|
|
size_t size; |
|
|
size_t size; |
|
|
int8_t slot; |
|
|
int8_t slot; |
|
|
|
|
|
const uint8_t *data; |
|
|
|
|
|
DataType *types; |
|
|
} ROMBank; |
|
|
} ROMBank; |
|
|
|
|
|
|
|
|
/* |
|
|
/* |
|
@@ -166,12 +167,13 @@ static char* size_to_string(char *output, size_t size) |
|
|
static void disassemble_header(Disassembly *dis, const ROM *rom) |
|
|
static void disassemble_header(Disassembly *dis, const ROM *rom) |
|
|
{ |
|
|
{ |
|
|
char buf[64]; |
|
|
char buf[64]; |
|
|
const char *size, *product, *region; |
|
|
|
|
|
|
|
|
const char *size, *product, *region, *declsize; |
|
|
|
|
|
|
|
|
DEBUG("Disassembling header") |
|
|
DEBUG("Disassembling header") |
|
|
size = size_to_string(buf, rom->size); |
|
|
size = size_to_string(buf, rom->size); |
|
|
product = rom_product(rom); |
|
|
product = rom_product(rom); |
|
|
region = rom_region(rom); |
|
|
region = rom_region(rom); |
|
|
|
|
|
declsize = size_to_string(buf, size_code_to_bytes(rom->declared_size)); |
|
|
|
|
|
|
|
|
WRITE_LINE(dis, ".rom_size\t\"%s\"%s\t; $%zX bytes in %zu banks", |
|
|
WRITE_LINE(dis, ".rom_size\t\"%s\"%s\t; $%zX bytes in %zu banks", |
|
|
size, strlen(size) < 6 ? "\t" : "", rom->size, NUM_BANKS(rom)) |
|
|
size, strlen(size) < 6 ? "\t" : "", rom->size, NUM_BANKS(rom)) |
|
@@ -186,8 +188,7 @@ static void disassemble_header(Disassembly *dis, const ROM *rom) |
|
|
WRITE_LINE(dis, ".rom_region\t%u\t\t; %s", |
|
|
WRITE_LINE(dis, ".rom_region\t%u\t\t; %s", |
|
|
rom->region_code, region ? region : "(unknown)") |
|
|
rom->region_code, region ? region : "(unknown)") |
|
|
WRITE_LINE(dis, ".rom_declsize\t$%X\t\t; %s", |
|
|
WRITE_LINE(dis, ".rom_declsize\t$%X\t\t; %s", |
|
|
rom->declared_size, |
|
|
|
|
|
size_to_string(buf, size_code_to_bytes(rom->declared_size))) |
|
|
|
|
|
|
|
|
rom->declared_size, declsize) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/* |
|
|
/* |
|
@@ -200,14 +201,16 @@ static ROMBank* init_banks(const ROM *rom) |
|
|
DataType *types = cr_calloc(sizeof(DataType), rom->size); |
|
|
DataType *types = cr_calloc(sizeof(DataType), rom->size); |
|
|
|
|
|
|
|
|
for (i = 0; i < nbanks; i++) { |
|
|
for (i = 0; i < nbanks; i++) { |
|
|
|
|
|
banks[i].index = i; |
|
|
if (i == nbanks - 1 && rom->size % MMU_ROM_BANK_SIZE) |
|
|
if (i == nbanks - 1 && rom->size % MMU_ROM_BANK_SIZE) |
|
|
banks[i].size = rom->size % MMU_ROM_BANK_SIZE; |
|
|
banks[i].size = rom->size % MMU_ROM_BANK_SIZE; |
|
|
else |
|
|
else |
|
|
banks[i].size = MMU_ROM_BANK_SIZE; |
|
|
banks[i].size = MMU_ROM_BANK_SIZE; |
|
|
|
|
|
banks[i].slot = -1; |
|
|
banks[i].data = rom->data + (i * MMU_ROM_BANK_SIZE); |
|
|
banks[i].data = rom->data + (i * MMU_ROM_BANK_SIZE); |
|
|
banks[i].types = types + (i * MMU_ROM_BANK_SIZE); |
|
|
banks[i].types = types + (i * MMU_ROM_BANK_SIZE); |
|
|
banks[i].slot = -1; |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
banks[nbanks].data = NULL; // Sentinel |
|
|
banks[nbanks].data = NULL; // Sentinel |
|
|
return banks; |
|
|
return banks; |
|
|
} |
|
|
} |
|
@@ -222,6 +225,15 @@ static void free_banks(ROMBank *banks) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/* |
|
|
/* |
|
|
|
|
|
Return the offset in bytes of the first address in the given bank. |
|
|
|
|
|
*/ |
|
|
|
|
|
static size_t get_bank_offset(const ROMBank *bank) |
|
|
|
|
|
{ |
|
|
|
|
|
return MMU_ROM_BANK_SIZE * ((bank->slot >= 0) ? bank->slot : |
|
|
|
|
|
(bank->index > 2) ? 2 : bank->index); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
Mark the ROM's header as non-binary/non-code inside of the relevant bank. |
|
|
Mark the ROM's header as non-binary/non-code inside of the relevant bank. |
|
|
*/ |
|
|
*/ |
|
|
static void mark_header(const ROM *rom, ROMBank *banks) |
|
|
static void mark_header(const ROM *rom, ROMBank *banks) |
|
@@ -266,7 +278,8 @@ static void render_code(Disassembly *dis, size_t *idx, const ROMBank *bank) |
|
|
strcpy(padding, "\t\t\t\t\t"); |
|
|
strcpy(padding, "\t\t\t\t\t"); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
WRITE_LINE(dis, "\t%s%s\t; %s", instr->line, padding, instr->bytestr) |
|
|
|
|
|
|
|
|
WRITE_LINE(dis, "\t%s%s\t; $%04zX: %s", |
|
|
|
|
|
instr->line, padding, get_bank_offset(bank) + *idx, instr->bytestr) |
|
|
(*idx) += instr->size; |
|
|
(*idx) += instr->size; |
|
|
disas_instr_free(instr); |
|
|
disas_instr_free(instr); |
|
|
} |
|
|
} |
|
|