From ba07e7ba85606cedee791b5e96be9a808d0fba1f Mon Sep 17 00:00:00 2001 From: Lior Halphon Date: Mon, 2 Apr 2018 19:57:39 +0300 Subject: [PATCH] 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. --- Cocoa/Document.m | 1 + Core/debugger.c | 20 ++++++++++++++++++++ Core/debugger.h | 1 + Core/gb.c | 13 +------------ 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/Cocoa/Document.m b/Cocoa/Document.m index a7ab0e1..40b6847 100644 --- a/Cocoa/Document.m +++ b/Cocoa/Document.m @@ -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]); }]; diff --git a/Core/debugger.c b/Core/debugger.c index 5e169d5..02cf6d6 100644 --- a/Core/debugger.c +++ b/Core/debugger.c @@ -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); diff --git a/Core/debugger.h b/Core/debugger.h index 143a6c0..2906ad9 100644 --- a/Core/debugger.h +++ b/Core/debugger.h @@ -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 */ diff --git a/Core/gb.c b/Core/gb.c index e0da579..b242015 100644 --- a/Core/gb.c +++ b/Core/gb.c @@ -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)); }