mirror of
https://github.com/holub/mame
synced 2025-05-22 13:48:55 +03:00
Fixed some memory view-related issues:
* select correct memory region by default when created (should be first address space of visible CPU) * when created, default bytes/chunk is correct * when changing width, cursor no longer moves around * memory regions display more than all 0xff now Also fixed: * qword big-endian memory reads no longer call little-endian handlers * memory regions are tracked in creation order (show up in order in the menu now) * ROMREGION_DISPOSE memory regions are not disposed if the debugger is enabled
This commit is contained in:
parent
12f71dac82
commit
e2c9b10241
@ -2413,6 +2413,7 @@ static const memory_subview_item *memory_view_enumerate_subviews(running_machine
|
||||
subview->next = NULL;
|
||||
subview->index = curindex++;
|
||||
subview->space = space;
|
||||
subview->endianness = space->endianness;
|
||||
subview->prefsize = space->dbits / 8;
|
||||
strcpy(subview->name, astring_c(tempstring));
|
||||
|
||||
@ -2440,7 +2441,11 @@ static const memory_subview_item *memory_view_enumerate_subviews(running_machine
|
||||
subview->index = curindex++;
|
||||
subview->base = memory_region(machine, rgntag);
|
||||
subview->length = memory_region_length(machine, rgntag);
|
||||
subview->offsetxor = memory_region_length(machine, rgntag);
|
||||
#ifdef LSB_FIRST
|
||||
subview->offsetxor = width - 1;
|
||||
#else
|
||||
subview->offsetxor = 0;
|
||||
#endif
|
||||
subview->endianness = little_endian ? ENDIANNESS_LITTLE : ENDIANNESS_BIG;
|
||||
subview->prefsize = MIN(width, 8);
|
||||
strcpy(subview->name, astring_c(tempstring));
|
||||
@ -2530,9 +2535,9 @@ static int memory_view_alloc(debug_view *view)
|
||||
memdata->desc = view->machine->debugvw_data->memory_subviews;
|
||||
|
||||
/* start out with 16 bytes in a single column and ASCII displayed */
|
||||
memdata->chunks_per_row = 16;
|
||||
memdata->bytes_per_chunk = 1;
|
||||
memdata->bytes_per_row = 16;
|
||||
memdata->bytes_per_chunk = memdata->desc->prefsize;
|
||||
memdata->chunks_per_row = 16 / memdata->desc->prefsize;
|
||||
memdata->bytes_per_row = memdata->bytes_per_chunk * memdata->chunks_per_row;
|
||||
memdata->ascii_view = TRUE;
|
||||
|
||||
return TRUE;
|
||||
@ -2888,6 +2893,9 @@ static int memory_view_needs_recompute(debug_view *view)
|
||||
if (debug_view_expression_changed_value(view, &memdata->expression, (space != NULL) ? space->cpu : NULL))
|
||||
{
|
||||
recompute = TRUE;
|
||||
view->topleft.y = (memdata->expression.result - memdata->byte_offset) / memdata->bytes_per_row;
|
||||
view->topleft.y = MAX(view->topleft.y, 0);
|
||||
view->topleft.y = MIN(view->topleft.y, view->total.y - 1);
|
||||
memory_view_set_cursor_pos(view, memdata->expression.result, memdata->bytes_per_chunk * 8 - 4);
|
||||
}
|
||||
|
||||
@ -3261,16 +3269,20 @@ void memory_view_set_bytes_per_chunk(debug_view *view, UINT8 chunkbytes)
|
||||
|
||||
if (chunkbytes != memdata->bytes_per_chunk)
|
||||
{
|
||||
int endianness = memdata->desc->endianness;
|
||||
offs_t address;
|
||||
UINT8 shift;
|
||||
|
||||
debug_view_begin_update(view);
|
||||
memory_view_get_cursor_pos(view, &address, &shift);
|
||||
address += (shift / 8) ^ ((endianness == ENDIANNESS_LITTLE) ? 0 : (memdata->bytes_per_chunk - 1));
|
||||
shift %= 8;
|
||||
|
||||
memdata->bytes_per_chunk = chunkbytes;
|
||||
memdata->chunks_per_row = memdata->bytes_per_row / chunkbytes;
|
||||
view->recompute = view->update_pending = TRUE;
|
||||
address += shift / 8;
|
||||
shift = (shift % 8) + 8 * (address % memdata->bytes_per_chunk);
|
||||
|
||||
shift += 8 * ((address % memdata->bytes_per_chunk) ^ ((endianness == ENDIANNESS_LITTLE) ? 0 : (memdata->bytes_per_chunk - 1)));
|
||||
address -= address % memdata->bytes_per_chunk;
|
||||
memory_view_set_cursor_pos(view, address, shift);
|
||||
debug_view_end_update(view);
|
||||
|
@ -761,22 +761,22 @@ int mame_is_paused(running_machine *machine)
|
||||
UINT8 *memory_region_alloc(running_machine *machine, const char *name, UINT32 length, UINT32 flags)
|
||||
{
|
||||
mame_private *mame = machine->mame_data;
|
||||
region_info *info;
|
||||
region_info **infoptr, *info;
|
||||
|
||||
/* make sure we don't have a region of the same name */
|
||||
for (info = mame->regions; info != NULL; info = info->next)
|
||||
if (astring_cmpc(info->name, name) == 0)
|
||||
/* make sure we don't have a region of the same name; also find the end of the list */
|
||||
for (infoptr = &mame->regions; *infoptr != NULL; infoptr = &(*infoptr)->next)
|
||||
if (astring_cmpc((*infoptr)->name, name) == 0)
|
||||
fatalerror("memory_region_alloc called with duplicate region name \"%s\"\n", name);
|
||||
|
||||
/* allocate the region */
|
||||
info = malloc_or_die(sizeof(*info) + length);
|
||||
info->next = mame->regions;
|
||||
info->next = NULL;
|
||||
info->name = astring_dupc(name);
|
||||
info->length = length;
|
||||
info->flags = flags;
|
||||
|
||||
/* hook us into the list */
|
||||
mame->regions = info;
|
||||
*infoptr = info;
|
||||
return info->base;
|
||||
}
|
||||
|
||||
@ -795,14 +795,14 @@ void memory_region_free(running_machine *machine, const char *name)
|
||||
for (infoptr = &mame->regions; *infoptr != NULL; infoptr = &(*infoptr)->next)
|
||||
if (astring_cmpc((*infoptr)->name, name) == 0)
|
||||
{
|
||||
region_info *deleteme = *infoptr;
|
||||
region_info *info = *infoptr;
|
||||
|
||||
/* remove us from the list */
|
||||
*infoptr = deleteme->next;
|
||||
*infoptr = info->next;
|
||||
|
||||
/* free the region */
|
||||
astring_free(deleteme->name);
|
||||
free(deleteme);
|
||||
astring_free(info->name);
|
||||
free(info);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -1596,12 +1596,14 @@ static void init_machine(running_machine *machine)
|
||||
(*machine->config->video_start)(machine);
|
||||
|
||||
/* free memory regions allocated with REGIONFLAG_DISPOSE (typically gfx roms) */
|
||||
for (rgntag = memory_region_next(machine, NULL); rgntag != NULL; rgntag = nextrgntag)
|
||||
{
|
||||
nextrgntag = memory_region_next(machine, rgntag);
|
||||
if (memory_region_flags(machine, rgntag) & ROMREGION_DISPOSE)
|
||||
memory_region_free(machine, rgntag);
|
||||
}
|
||||
/* but not if the debugger is enabled (so we can look at the data) */
|
||||
if (!options_get_bool(mame_options(), OPTION_DEBUG))
|
||||
for (rgntag = memory_region_next(machine, NULL); rgntag != NULL; rgntag = nextrgntag)
|
||||
{
|
||||
nextrgntag = memory_region_next(machine, rgntag);
|
||||
if (memory_region_flags(machine, rgntag) & ROMREGION_DISPOSE)
|
||||
memory_region_free(machine, rgntag);
|
||||
}
|
||||
|
||||
/* initialize miscellaneous systems */
|
||||
saveload_init(machine);
|
||||
|
@ -3775,8 +3775,8 @@ UINT64 memory_read_qword_masked_8le(const address_space *space, offs_t address,
|
||||
|
||||
UINT64 memory_read_qword_8be(const address_space *space, offs_t address)
|
||||
{
|
||||
UINT64 result = (UINT64)memory_read_dword_8le(space, address + 0) << 32;
|
||||
return result | ((UINT64)memory_read_dword_8le(space, address + 4) << 0);
|
||||
UINT64 result = (UINT64)memory_read_dword_8be(space, address + 0) << 32;
|
||||
return result | ((UINT64)memory_read_dword_8be(space, address + 4) << 0);
|
||||
}
|
||||
|
||||
UINT64 memory_read_qword_masked_8be(const address_space *space, offs_t address, UINT64 mask)
|
||||
@ -3957,8 +3957,8 @@ UINT64 memory_read_qword_masked_16le(const address_space *space, offs_t address,
|
||||
|
||||
UINT64 memory_read_qword_16be(const address_space *space, offs_t address)
|
||||
{
|
||||
UINT64 result = (UINT64)memory_read_dword_16le(space, address + 0) << 32;
|
||||
return result | ((UINT64)memory_read_dword_16le(space, address + 4) << 0);
|
||||
UINT64 result = (UINT64)memory_read_dword_16be(space, address + 0) << 32;
|
||||
return result | ((UINT64)memory_read_dword_16be(space, address + 4) << 0);
|
||||
}
|
||||
|
||||
UINT64 memory_read_qword_masked_16be(const address_space *space, offs_t address, UINT64 mask)
|
||||
@ -4133,8 +4133,8 @@ UINT64 memory_read_qword_masked_32le(const address_space *space, offs_t address,
|
||||
|
||||
UINT64 memory_read_qword_32be(const address_space *space, offs_t address)
|
||||
{
|
||||
UINT64 result = (UINT64)memory_read_dword_32le(space, address + 0) << 32;
|
||||
return result | ((UINT64)memory_read_dword_32le(space, address + 4) << 0);
|
||||
UINT64 result = (UINT64)memory_read_dword_32be(space, address + 0) << 32;
|
||||
return result | ((UINT64)memory_read_dword_32be(space, address + 4) << 0);
|
||||
}
|
||||
|
||||
UINT64 memory_read_qword_masked_32be(const address_space *space, offs_t address, UINT64 mask)
|
||||
|
@ -1683,7 +1683,7 @@ static void memory_create_window(running_machine *machine)
|
||||
const memory_subview_item *subview;
|
||||
debugwin_info *info;
|
||||
HMENU optionsmenu;
|
||||
int cursel = 0;
|
||||
int cursel = -1;
|
||||
|
||||
// create the window
|
||||
info = debugwin_window_create(machine, "Memory", NULL);
|
||||
@ -1738,9 +1738,10 @@ static void memory_create_window(running_machine *machine)
|
||||
TCHAR *t_name = tstring_from_utf8(subview->name);
|
||||
int item = SendMessage(info->otherwnd[0], CB_ADDSTRING, 0, (LPARAM)t_name);
|
||||
free(t_name);
|
||||
if (cursel == 0 && subview->space != NULL && subview->space->cpu == curcpu)
|
||||
if (cursel == -1 && subview->space != NULL && subview->space->cpu == curcpu)
|
||||
cursel = item;
|
||||
}
|
||||
if (cursel == -1) cursel = 0;
|
||||
SendMessage(info->otherwnd[0], CB_SETCURSEL, cursel, 0);
|
||||
memory_view_set_subview(info->view[0].view, cursel);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user