Fixed a bug where 0:$dxxx reads/writes from the wrong bank in CGB mode. Made sure symbols are reset after reloading a sym file.

This commit is contained in:
Lior Halphon 2018-04-02 19:57:39 +03:00
parent e163026ca9
commit ba07e7ba85
4 changed files with 23 additions and 12 deletions

View File

@ -425,6 +425,7 @@ static void printImage(GB_gameboy_t *gb, uint32_t *image, uint8_t height,
NSString *rom_warnings = [self captureOutputForBlock:^{
GB_load_rom(&gb, [self.fileName UTF8String]);
GB_load_battery(&gb, [[[self.fileName stringByDeletingPathExtension] stringByAppendingPathExtension:@"sav"] UTF8String]);
GB_debugger_clear_symbols(&gb);
GB_debugger_load_symbol_file(&gb, [[[NSBundle mainBundle] pathForResource:@"registers" ofType:@"sym"] UTF8String]);
GB_debugger_load_symbol_file(&gb, [[[self.fileName stringByDeletingPathExtension] stringByAppendingPathExtension:@"sym"] UTF8String]);
}];

View File

@ -115,6 +115,9 @@ static inline void switch_banking_state(GB_gameboy_t *gb, uint16_t bank)
if (gb->is_cgb) {
gb->cgb_ram_bank = bank & 7;
gb->cgb_vram_bank = bank & 1;
if (gb->cgb_ram_bank == 0) {
gb->cgb_ram_bank = 1;
}
}
}
@ -1871,6 +1874,23 @@ void GB_debugger_load_symbol_file(GB_gameboy_t *gb, const char *path)
fclose(f);
}
void GB_debugger_clear_symbols(GB_gameboy_t *gb)
{
for (int i = sizeof(gb->bank_symbols) / sizeof(gb->bank_symbols[0]); i--;) {
if (gb->bank_symbols[i]) {
GB_map_free(gb->bank_symbols[i]);
gb->bank_symbols[i] = 0;
}
}
for (int i = sizeof(gb->reversed_symbol_map.buckets) / sizeof(gb->reversed_symbol_map.buckets[0]); i--;) {
while (gb->reversed_symbol_map.buckets[i]) {
GB_symbol_t *next = gb->reversed_symbol_map.buckets[i]->next;
free(gb->reversed_symbol_map.buckets[i]);
gb->reversed_symbol_map.buckets[i] = next;
}
}
}
const GB_bank_symbol_t *GB_debugger_find_symbol(GB_gameboy_t *gb, uint16_t addr)
{
uint16_t bank = bank_for_addr(gb, addr);

View File

@ -39,4 +39,5 @@ bool GB_debugger_evaluate(GB_gameboy_t *gb, const char *string, uint16_t *result
void GB_debugger_break(GB_gameboy_t *gb);
bool GB_debugger_is_stopped(GB_gameboy_t *gb);
void GB_debugger_set_disabled(GB_gameboy_t *gb, bool disabled);
void GB_debugger_clear_symbols(GB_gameboy_t *gb);
#endif /* debugger_h */

View File

@ -144,18 +144,7 @@ void GB_free(GB_gameboy_t *gb)
if (gb->breakpoints) {
free(gb->breakpoints);
}
for (int i = 0x200; i--;) {
if (gb->bank_symbols[i]) {
GB_map_free(gb->bank_symbols[i]);
}
}
for (int i = 0x400; i--;) {
while (gb->reversed_symbol_map.buckets[i]) {
GB_symbol_t *next = gb->reversed_symbol_map.buckets[i]->next;
free(gb->reversed_symbol_map.buckets[i]);
gb->reversed_symbol_map.buckets[i] = next;
}
}
GB_debugger_clear_symbols(gb);
GB_rewind_free(gb);
memset(gb, 0, sizeof(*gb));
}