# HG changeset patch # User Michael Pavone # Date 1437953554 25200 # Node ID 092524bb2e8f0f9f19ab8e9e9da0449ef4f395d1 # Parent ec23202df6a6ef2a6592b30d7e4c734938442c33 Fix GDB remote debugging support diff -r ec23202df6a6 -r 092524bb2e8f blastem.c --- a/blastem.c Sun Jul 26 13:33:48 2015 -0700 +++ b/blastem.c Sun Jul 26 16:32:34 2015 -0700 @@ -1050,6 +1050,8 @@ gen.vdp = &v_context; gen.ym = &y_context; gen.psg = &p_context; + gen.work_ram = ram; + gen.zram = z80_ram; genesis = &gen; setup_io_devices(config, gen.ports); diff -r ec23202df6a6 -r 092524bb2e8f blastem.h --- a/blastem.h Sun Jul 26 13:33:48 2015 -0700 +++ b/blastem.h Sun Jul 26 16:32:34 2015 -0700 @@ -22,6 +22,8 @@ vdp_context *vdp; ym2612_context *ym; psg_context *psg; + uint16_t *work_ram; + uint8_t *zram; uint8_t *save_storage; eeprom_map *eeprom_map; uint32_t num_eeprom; diff -r ec23202df6a6 -r 092524bb2e8f gdb_remote.c --- a/gdb_remote.c Sun Jul 26 13:33:48 2015 -0700 +++ b/gdb_remote.c Sun Jul 26 16:32:34 2015 -0700 @@ -115,34 +115,40 @@ uint8_t read_byte(m68k_context * context, uint32_t address) { - uint16_t * word; - //TODO: Use generated read/write functions so that memory map is properly respected - if (address < 0x400000) { - word = context->mem_pointers[0] + address/2; - } else if (address >= 0xE00000) { - word = context->mem_pointers[1] + (address & 0xFFFF)/2; - } else if (address >= 0xA00000 && address < 0xA04000) { - return z80_ram[address & 0x1FFF]; - } else { - return 0; + + genesis_context *gen = context->system; + //TODO: Use generated read/write functions to support access to hardware that is not ROM or RAM + uint16_t * word = get_native_pointer(address & 0xFFFFFFFE, (void **)context->mem_pointers, &context->options->gen); + if (word) { + if (address & 1) { + return *word; + } + return *word >> 8; } - if (address & 1) { - return *word; + if (address >= 0xA00000 && address < 0xA04000) { + return gen->zram[address & 0x1FFF]; } - return *word >> 8; + return 0; } void write_byte(m68k_context * context, uint32_t address, uint8_t value) { - uint16_t * word; + genesis_context *gen = context->system; //TODO: Use generated read/write functions so that memory map is properly respected - if (address < 0x400000) { - //TODO: Invalidate translated code - word = context->mem_pointers[0] + address/2; - } else if (address >= 0xE00000) { - m68k_handle_code_write(address & 0xFFFF, context); - word = context->mem_pointers[1] + (address & 0xFFFF)/2; - } else if (address >= 0xA00000 && address < 0xA04000) { + uint16_t * word = get_native_pointer(address & 0xFFFFFFFE, (void **)context->mem_pointers, &context->options->gen); + if (word) { + if (address & 1) { + *word = (*word & 0xFF00) | value; + } else { + *word = (*word & 0xFF) | value << 8; + } + //TODO: Deal with this more generally once m68k_handle_code_write can handle it + if (address >= 0xE00000) { + m68k_handle_code_write(address, context); + } + return; + } + if (address >= 0xA00000 && address < 0xA04000) { z80_ram[address & 0x1FFF] = value; genesis_context * gen = context->system; #ifndef NO_Z80 @@ -152,11 +158,6 @@ } else { return; } - if (address & 1) { - *word = (*word & 0xFF00) | value; - } else { - *word = (*word & 0xFF) | value << 8; - } } void gdb_run_command(m68k_context * context, uint32_t pc, char * command) @@ -180,12 +181,9 @@ goto not_impl; } m68kinst inst; - uint16_t * pc_ptr; - if (pc < 0x400000) { - pc_ptr = cart + pc/2; - } else if(pc > 0xE00000) { - pc_ptr = ram + (pc & 0xFFFF)/2; - } else { + genesis_context *gen = context->system; + uint16_t * pc_ptr = get_native_pointer(pc, (void **)context->mem_pointers, &context->options->gen); + if (!pc_ptr) { fatal_error("Entered gdb remote debugger stub at address %X\n", pc); } uint16_t * after_pc = m68k_decode(pc_ptr, &inst, pc & 0xFFFFFF); @@ -400,12 +398,9 @@ case 's': case 'S': { m68kinst inst; - uint16_t * pc_ptr; - if (pc < 0x400000) { - pc_ptr = cart + pc/2; - } else if(pc > 0xE00000) { - pc_ptr = ram + (pc & 0xFFFF)/2; - } else { + genesis_context *gen = context->system; + uint16_t * pc_ptr = get_native_pointer(pc, (void **)context->mem_pointers, &context->options->gen); + if (!pc_ptr) { fatal_error("Entered gdb remote debugger stub at address %X\n", pc); } uint16_t * after_pc = m68k_decode(pc_ptr, &inst, pc & 0xFFFFFF);