From 9287b992771f3a048fd68144fed6d657ecdf75f9 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Fri, 10 Mar 2023 20:16:16 +0200 Subject: [PATCH] Show full memory map in hardware info panel when emulation is running. --- expansion.cpp | 109 ++++++++++++++++++++++++++++++++++++++++++ include/autoconf.h | 1 + od-win32/win32gui.cpp | 44 ++++++++++++----- 3 files changed, 141 insertions(+), 13 deletions(-) diff --git a/expansion.cpp b/expansion.cpp index a5deafae..ac65082b 100644 --- a/expansion.cpp +++ b/expansion.cpp @@ -2761,6 +2761,115 @@ void free_expansion_bank(addrbank *bank) bank->reserved_size = 0; } +struct autoconfig_info *expansion_get_bank_data(struct uae_prefs *p, uaecptr *addrp) +{ + uaecptr addr = *addrp; + static struct autoconfig_info acid; + struct autoconfig_info *aci = NULL; + + if (addr >= 0x01000000 && currprefs.address_space_24) { + return NULL; + } + for (;;) { + addrbank *ab = &get_mem_bank(addr); + if (ab && ab != &dummy_bank) { + aci = expansion_get_autoconfig_by_address(p, addr, 0); + if (aci && expansion_get_autoconfig_by_address(p, addr - 1, 0) != aci) { + addrbank *ab2 = ab; + struct autoconfig_info *aci2; + int size = 0; + for (;;) { + addr += 65536; + size += 65536; + ab2 = &get_mem_bank(addr); + aci2 = expansion_get_autoconfig_by_address(p, addr, 0); + if (ab != ab2) { + break; + } + if (aci2 != aci) { + break; + } + if (aci->size > 0 && size >= aci->size) { + break; + } + } + *addrp = addr; + return aci; + } + uaecptr addr2 = addr; + aci = &acid; + memset(aci, 0, sizeof(struct autoconfig_info)); + aci->autoconfig_bytes[0] = 0xff; + if (ab->sub_banks) { + uaecptr saddr = addr; + uaecptr saddr1 = saddr; + uaecptr saddr2 = saddr; + addrbank *sab1 = get_sub_bank(&saddr1); + for (;;) { + saddr2 = saddr1 + 1; + addrbank *sab2 = get_sub_bank(&saddr2); + if (sab1 != sab2 || (saddr1 & 65535) == 65535) { + aci->addrbank = sab1; + aci->start = addr; + aci->size = saddr2 - addr; + if (sab1->name) { + _tcscpy(aci->name, sab1->name); + } + addr = saddr2; + *addrp = addr; + break; + } + saddr1++; + } + if (aci->addrbank == &dummy_bank) { + addr = saddr2; + continue; + } + return aci; + } else { + aci->addrbank = ab; + aci->start = addr; + aci->size = ab->allocated_size; + if (ab->name) { + _tcscpy(aci->name, ab->name); + } + addrbank *ab2 = ab; + int size = 0; + for (;;) { + addr += 65536; + size += 65536; + ab2 = &get_mem_bank(addr); + if (ab != ab2) { + break; + } + if (aci->size > 0 && size >= aci->size) { + break; + } + } + } + if (aci->size == 0) { + aci->size = addr - addr2; + } + *addrp = addr; + return aci; + } + + for (;;) { + addr += 65536; + if (addr >= 0x01000000 && currprefs.address_space_24) { + return NULL; + } + if (addr < 65536) { + return NULL; + } + ab = &get_mem_bank(addr); + if (ab != NULL && ab != &dummy_bank) { + break; + } + } + } +} + struct autoconfig_info *expansion_get_autoconfig_data(struct uae_prefs *p, int index) { if (index >= cardno) diff --git a/include/autoconf.h b/include/autoconf.h index de95e087..887bb4ff 100644 --- a/include/autoconf.h +++ b/include/autoconf.h @@ -156,6 +156,7 @@ extern void expansion_generate_autoconfig_info(struct uae_prefs *p); extern struct autoconfig_info *expansion_get_autoconfig_info(struct uae_prefs*, int romtype, int devnum); extern struct autoconfig_info *expansion_get_autoconfig_data(struct uae_prefs *p, int index); extern struct autoconfig_info *expansion_get_autoconfig_by_address(struct uae_prefs *p, uaecptr addr, int index); +extern struct autoconfig_info *expansion_get_bank_data(struct uae_prefs *p, uaecptr *addr); extern void expansion_set_autoconfig_sort(struct uae_prefs *p); extern int expansion_autoconfig_move(struct uae_prefs *p, int index, int direction, bool test); extern bool expansion_can_move(struct uae_prefs *p, int index); diff --git a/od-win32/win32gui.cpp b/od-win32/win32gui.cpp index 4ca383b9..fe931a17 100644 --- a/od-win32/win32gui.cpp +++ b/od-win32/win32gui.cpp @@ -4658,7 +4658,7 @@ static int clicked_entry = -1; #define MISC1_COLUMNS 1 #define MAX_COLUMN_HEADING_WIDTH 20 #define CD_COLUMNS 3 -#define BOARD_COLUMNS 5 +#define BOARD_COLUMNS 6 #define LV_LOADSAVE 1 #define LV_HARDDISK 2 @@ -5007,8 +5007,9 @@ static void InitializeListView (HWND hDlg) _tcscpy(column_heading[0], _T("Type")); _tcscpy(column_heading[1], _T("Name")); _tcscpy(column_heading[2], _T("Start")); - _tcscpy(column_heading[3], _T("Size")); - _tcscpy(column_heading[4], _T("ID")); + _tcscpy(column_heading[3], _T("End")); + _tcscpy(column_heading[4], _T("Size")); + _tcscpy(column_heading[5], _T("ID")); } else if (hDlg == pages[HARDDISK_ID]) { @@ -5115,17 +5116,25 @@ static void InitializeListView (HWND hDlg) if (lv_type == LV_BOARD) { + listview_column_width[0] = MulDiv(40, dpi, 72); listview_column_width[1] = MulDiv(200, dpi, 72); listview_column_width[2] = MulDiv(90, dpi, 72); listview_column_width[3] = MulDiv(90, dpi, 72); listview_column_width[4] = MulDiv(90, dpi, 72); + listview_column_width[5] = MulDiv(90, dpi, 72); i = 0; if (full_property_sheet) expansion_generate_autoconfig_info(&workprefs); uaecptr highest_expamem = 0; + uaecptr addr = 0; for (;;) { TCHAR tmp[200]; - struct autoconfig_info *aci = expansion_get_autoconfig_data(full_property_sheet ? &workprefs : &currprefs, i); + struct autoconfig_info *aci = NULL; + if (full_property_sheet) { + aci = expansion_get_autoconfig_data(&workprefs, i); + } else { + aci = expansion_get_bank_data(&currprefs, &addr); + } if (aci) { if (aci->zorro == 3 && aci->size != 0 && aci->start + aci->size > highest_expamem) highest_expamem = aci->start + aci->size; @@ -5144,7 +5153,7 @@ static void InitializeListView (HWND hDlg) if (expansion_can_move(&workprefs, i)) lvstruct.lParam |= 1; // outside or crosses 2G "border" - if (aci->zorro == 3 && aci->start + aci->size > 0x80000000 || aci->start + aci->size < aci->start) + if (aci->zorro == 3 && (aci->start + aci->size > 0x80000000 || aci->start + aci->size < aci->start)) lvstruct.lParam |= 2; // outside or crosses 4G "border" if (aci->zorro == 3 && aci->start == 0xffffffff) @@ -5166,13 +5175,17 @@ static void InitializeListView (HWND hDlg) result = ListView_InsertItem(list, &lvstruct); tmp[0] = 0; TCHAR *s = tmp; - if (aci && aci->parent_of_previous) { - _tcscat(s, _T(" - ")); + if (full_property_sheet) { + if (aci && aci->parent_of_previous) { + _tcscat(s, _T(" - ")); + } + if (aci && (aci->parent_address_space || aci->parent_romtype) && !aci->parent_of_previous) { + _tcscat(s, _T("? ")); + } } - if (aci && (aci->parent_address_space || aci->parent_romtype) && !aci->parent_of_previous) - _tcscat(s, _T("? ")); - if (aci) + if (aci && aci->name) { _tcscat(s, aci->name); + } ListView_SetItemText(list, result, 1, tmp); if (aci) { if (aci->start != 0xffffffff) @@ -5181,17 +5194,22 @@ static void InitializeListView (HWND hDlg) _tcscpy(tmp, _T("-")); ListView_SetItemText(list, result, 2, tmp); if (aci->size != 0) - _stprintf(tmp, _T("0x%08x"), aci->size); + _stprintf(tmp, _T("0x%08x"), aci->start + aci->size - 1); else _tcscpy(tmp, _T("-")); ListView_SetItemText(list, result, 3, tmp); + if (aci->size != 0) + _stprintf(tmp, _T("0x%08x"), aci->size); + else + _tcscpy(tmp, _T("-")); + ListView_SetItemText(list, result, 4, tmp); if (aci->autoconfig_bytes[0] != 0xff) _stprintf(tmp, _T("0x%04x/0x%02x"), (aci->autoconfig_bytes[4] << 8) | aci->autoconfig_bytes[5], aci->autoconfig_bytes[1]); else _tcscpy(tmp, _T("-")); - ListView_SetItemText(list, result, 4, tmp); - } else { + ListView_SetItemText(list, result, 5, tmp); + } else if (full_property_sheet) { _stprintf(tmp, _T("0x%08x"), highest_expamem); ListView_SetItemText(list, result, 2, tmp); } -- 2.47.3