summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/debug/dvbpoints.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/debug/dvbpoints.c')
-rw-r--r--src/emu/debug/dvbpoints.c431
1 files changed, 163 insertions, 268 deletions
diff --git a/src/emu/debug/dvbpoints.c b/src/emu/debug/dvbpoints.c
index e97fe5ba449..b1a2ce8b8fa 100644
--- a/src/emu/debug/dvbpoints.c
+++ b/src/emu/debug/dvbpoints.c
@@ -13,6 +13,80 @@
+// Sorting functors for the qsort function
+static int cIndexAscending(const void* a, const void* b)
+{
+ const device_debug::breakpoint* left = *(device_debug::breakpoint**)a;
+ const device_debug::breakpoint* right = *(device_debug::breakpoint**)b;
+ return left->index() - right->index();
+}
+
+static int cIndexDescending(const void* a, const void* b)
+{
+ return cIndexAscending(b, a);
+}
+
+static int cEnabledAscending(const void* a, const void* b)
+{
+ const device_debug::breakpoint* left = *(device_debug::breakpoint**)a;
+ const device_debug::breakpoint* right = *(device_debug::breakpoint**)b;
+ return (left->enabled() ? 1 : 0) - (right->enabled() ? 1 : 0);
+}
+
+static int cEnabledDescending(const void* a, const void* b)
+{
+ return cEnabledAscending(b, a);
+}
+
+static int cCpuAscending(const void* a, const void* b)
+{
+ const device_debug::breakpoint* left = *(device_debug::breakpoint**)a;
+ const device_debug::breakpoint* right = *(device_debug::breakpoint**)b;
+ return strcmp(left->debugInterface()->device().tag(), right->debugInterface()->device().tag());
+}
+
+static int cCpuDescending(const void* a, const void* b)
+{
+ return cCpuAscending(b, a);
+}
+
+static int cAddressAscending(const void* a, const void* b)
+{
+ const device_debug::breakpoint* left = *(device_debug::breakpoint**)a;
+ const device_debug::breakpoint* right = *(device_debug::breakpoint**)b;
+ return (left->address() > right->address()) ? 1 : (left->address() < right->address()) ? -1 : 0;
+}
+
+static int cAddressDescending(const void* a, const void* b)
+{
+ return cAddressAscending(b, a);
+}
+
+static int cConditionAscending(const void* a, const void* b)
+{
+ const device_debug::breakpoint* left = *(device_debug::breakpoint**)a;
+ const device_debug::breakpoint* right = *(device_debug::breakpoint**)b;
+ return strcmp(left->condition(), right->condition());
+}
+
+static int cConditionDescending(const void* a, const void* b)
+{
+ return cConditionAscending(b, a);
+}
+
+static int cActionAscending(const void* a, const void* b)
+{
+ const device_debug::breakpoint* left = *(device_debug::breakpoint**)a;
+ const device_debug::breakpoint* right = *(device_debug::breakpoint**)b;
+ return strcmp(left->action(), right->action());
+}
+
+static int cActionDescending(const void* a, const void* b)
+{
+ return cActionAscending(b, a);
+}
+
+
//**************************************************************************
// DEBUG VIEW BREAK POINTS
//**************************************************************************
@@ -26,16 +100,12 @@ static const int tableBreaks[] = { 5, 9, 31, 45, 63, 80 };
debug_view_breakpoints::debug_view_breakpoints(running_machine &machine, debug_view_osd_update_func osdupdate, void *osdprivate)
: debug_view(machine, DVT_BREAK_POINTS, osdupdate, osdprivate),
- m_sortType(SORT_INDEX_ASCENDING)
+ m_sortType(cIndexAscending)
{
// fail if no available sources
enumerate_sources();
if (m_source_list.count() == 0)
throw std::bad_alloc();
-
- // configure the view
- m_total.y = 10;
- m_supports_cursor = false;
}
@@ -83,48 +153,30 @@ void debug_view_breakpoints::view_click(const int button, const debug_view_xy& p
if (clickedTopRow)
{
- if (pos.x < tableBreaks[0] && m_sortType == SORT_INDEX_ASCENDING)
- m_sortType = SORT_INDEX_DESCENDING;
- else if (pos.x < tableBreaks[0])
- m_sortType = SORT_INDEX_ASCENDING;
- else if (pos.x < tableBreaks[1] && m_sortType == SORT_ENABLED_ASCENDING)
- m_sortType = SORT_ENABLED_DESCENDING;
+ if (pos.x < tableBreaks[0])
+ m_sortType = (m_sortType == &cIndexAscending) ? &cIndexDescending : &cIndexAscending;
else if (pos.x < tableBreaks[1])
- m_sortType = SORT_ENABLED_ASCENDING;
- else if (pos.x < tableBreaks[2] && m_sortType == SORT_CPU_ASCENDING)
- m_sortType = SORT_CPU_DESCENDING;
+ m_sortType = (m_sortType == &cEnabledAscending) ? &cEnabledDescending : &cEnabledAscending;
else if (pos.x < tableBreaks[2])
- m_sortType = SORT_CPU_ASCENDING;
- else if (pos.x < tableBreaks[3] && m_sortType == SORT_ADDRESS_ASCENDING)
- m_sortType = SORT_ADDRESS_DESCENDING;
+ m_sortType = (m_sortType == &cCpuAscending) ? &cCpuDescending : &cCpuAscending;
else if (pos.x < tableBreaks[3])
- m_sortType = SORT_ADDRESS_ASCENDING;
- else if (pos.x < tableBreaks[4] && m_sortType == SORT_CONDITION_ASCENDING)
- m_sortType = SORT_CONDITION_DESCENDING;
+ m_sortType = (m_sortType == &cAddressAscending) ? &cAddressDescending : &cAddressAscending;
else if (pos.x < tableBreaks[4])
- m_sortType = SORT_CONDITION_ASCENDING;
- else if (pos.x < tableBreaks[5] && m_sortType == SORT_ACTION_ASCENDING)
- m_sortType = SORT_ACTION_DESCENDING;
+ m_sortType = (m_sortType == &cConditionAscending) ? &cConditionDescending : &cConditionAscending;
else if (pos.x < tableBreaks[5])
- m_sortType = SORT_ACTION_ASCENDING;
+ m_sortType = (m_sortType == &cActionAscending) ? &cActionDescending : &cActionAscending;
}
else
{
// Gather a sorted list of all the breakpoints for all the CPUs
- device_debug::breakpoint** bpList = NULL;
- const int numBPs = breakpoints(SORT_NONE, bpList);
+ gather_breakpoints();
- const int bpIndex = pos.y - 1;
- if (bpIndex > numBPs || bpIndex < 0)
+ int const bpIndex = pos.y - 1;
+ if ((bpIndex >= m_buffer.count()) || (bpIndex < 0))
return;
// Enable / disable
- if (bpList[bpIndex]->enabled())
- bpList[bpIndex]->setEnabled(false);
- else
- bpList[bpIndex]->setEnabled(true);
-
- delete[] bpList;
+ m_buffer[bpIndex]->setEnabled(!m_buffer[bpIndex]->enabled());
machine().debug_view().update_all(DVT_DISASSEMBLY);
}
@@ -149,167 +201,19 @@ void debug_view_breakpoints::pad_astring_to_length(astring& str, int len)
}
-// Sorting functors for the qsort function
-static int cIndexAscending(const void* a, const void* b)
+void debug_view_breakpoints::gather_breakpoints()
{
- const device_debug::breakpoint* left = *(device_debug::breakpoint**)a;
- const device_debug::breakpoint* right = *(device_debug::breakpoint**)b;
- return left->index() > right->index();
-}
-
-static int cIndexDescending(const void* a, const void* b)
-{
- const device_debug::breakpoint* left = *(device_debug::breakpoint**)a;
- const device_debug::breakpoint* right = *(device_debug::breakpoint**)b;
- return left->index() < right->index();
-}
-
-static int cEnabledAscending(const void* a, const void* b)
-{
- const device_debug::breakpoint* left = *(device_debug::breakpoint**)a;
- const device_debug::breakpoint* right = *(device_debug::breakpoint**)b;
- return left->enabled() < right->enabled();
-}
-
-static int cEnabledDescending(const void* a, const void* b)
-{
- const device_debug::breakpoint* left = *(device_debug::breakpoint**)a;
- const device_debug::breakpoint* right = *(device_debug::breakpoint**)b;
- return left->enabled() > right->enabled();
-}
-
-static int cCpuAscending(const void* a, const void* b)
-{
- const device_debug::breakpoint* left = *(device_debug::breakpoint**)a;
- const device_debug::breakpoint* right = *(device_debug::breakpoint**)b;
- const int result = strcmp(left->debugInterface()->device().tag(), right->debugInterface()->device().tag());
- return result >= 0;
-}
-
-static int cCpuDescending(const void* a, const void* b)
-{
- const device_debug::breakpoint* left = *(device_debug::breakpoint**)a;
- const device_debug::breakpoint* right = *(device_debug::breakpoint**)b;
- const int result = strcmp(left->debugInterface()->device().tag(), right->debugInterface()->device().tag());
- return result < 0;
-}
-
-static int cAddressAscending(const void* a, const void* b)
-{
- const device_debug::breakpoint* left = *(device_debug::breakpoint**)a;
- const device_debug::breakpoint* right = *(device_debug::breakpoint**)b;
- return left->address() > right->address();
-}
-
-static int cAddressDescending(const void* a, const void* b)
-{
- const device_debug::breakpoint* left = *(device_debug::breakpoint**)a;
- const device_debug::breakpoint* right = *(device_debug::breakpoint**)b;
- return left->address() < right->address();
-}
-
-static int cConditionAscending(const void* a, const void* b)
-{
- const device_debug::breakpoint* left = *(device_debug::breakpoint**)a;
- const device_debug::breakpoint* right = *(device_debug::breakpoint**)b;
- const int result = strcmp(left->condition(), right->condition());
- return result >= 0;
-}
-
-static int cConditionDescending(const void* a, const void* b)
-{
- const device_debug::breakpoint* left = *(device_debug::breakpoint**)a;
- const device_debug::breakpoint* right = *(device_debug::breakpoint**)b;
- const int result = strcmp(left->condition(), right->condition());
- return result < 0;
-}
-
-static int cActionAscending(const void* a, const void* b)
-{
- const device_debug::breakpoint* left = *(device_debug::breakpoint**)a;
- const device_debug::breakpoint* right = *(device_debug::breakpoint**)b;
- const int result = strcmp(left->action(), right->action());
- return result >= 0;
-}
-
-static int cActionDescending(const void* a, const void* b)
-{
- const device_debug::breakpoint* left = *(device_debug::breakpoint**)a;
- const device_debug::breakpoint* right = *(device_debug::breakpoint**)b;
- const int result = strcmp(left->action(), right->action());
- return result < 0;
-}
-
-
-int debug_view_breakpoints::breakpoints(SortMode sort, device_debug::breakpoint**& bpList)
-{
- // Alloc
- int numBPs = 0;
- bpList = NULL;
- for (const debug_view_source *source = m_source_list.first(); source != NULL; source = source->next())
- {
- const device_debug& debugInterface = *source->device()->debug();
- for (device_debug::breakpoint *bp = debugInterface.breakpoint_first(); bp != NULL; bp = bp->next())
- numBPs++;
- }
- bpList = new device_debug::breakpoint*[numBPs];
-
- int bpAddIndex = 0;
+ m_buffer.resize(0);
for (const debug_view_source *source = m_source_list.first(); source != NULL; source = source->next())
{
// Collect
- device_debug& debugInterface = *source->device()->debug();
+ device_debug &debugInterface = *source->device()->debug();
for (device_debug::breakpoint *bp = debugInterface.breakpoint_first(); bp != NULL; bp = bp->next())
- {
- bpList[bpAddIndex] = bp;
- bpAddIndex++;
- }
+ m_buffer.append() = bp;
}
// And now for the sort
- switch (m_sortType)
- {
- case SORT_NONE:
- break;
- case SORT_INDEX_ASCENDING:
- qsort(bpList, numBPs, sizeof(device_debug::breakpoint*), cIndexAscending);
- break;
- case SORT_INDEX_DESCENDING:
- qsort(bpList, numBPs, sizeof(device_debug::breakpoint*), cIndexDescending);
- break;
- case SORT_ENABLED_ASCENDING:
- qsort(bpList, numBPs, sizeof(device_debug::breakpoint*), cEnabledAscending);
- break;
- case SORT_ENABLED_DESCENDING:
- qsort(bpList, numBPs, sizeof(device_debug::breakpoint*), cEnabledDescending);
- break;
- case SORT_CPU_ASCENDING:
- qsort(bpList, numBPs, sizeof(device_debug::breakpoint*), cCpuAscending);
- break;
- case SORT_CPU_DESCENDING:
- qsort(bpList, numBPs, sizeof(device_debug::breakpoint*), cCpuDescending);
- break;
- case SORT_ADDRESS_ASCENDING:
- qsort(bpList, numBPs, sizeof(device_debug::breakpoint*), cAddressAscending);
- break;
- case SORT_ADDRESS_DESCENDING:
- qsort(bpList, numBPs, sizeof(device_debug::breakpoint*), cAddressDescending);
- break;
- case SORT_CONDITION_ASCENDING:
- qsort(bpList, numBPs, sizeof(device_debug::breakpoint*), cConditionAscending);
- break;
- case SORT_CONDITION_DESCENDING:
- qsort(bpList, numBPs, sizeof(device_debug::breakpoint*), cConditionDescending);
- break;
- case SORT_ACTION_ASCENDING:
- qsort(bpList, numBPs, sizeof(device_debug::breakpoint*), cActionAscending);
- break;
- case SORT_ACTION_DESCENDING:
- qsort(bpList, numBPs, sizeof(device_debug::breakpoint*), cActionDescending);
- break;
- }
-
- return numBPs;
+ qsort(&m_buffer[0], m_buffer.count(), sizeof(device_debug::breakpoint *), m_sortType);
}
@@ -321,104 +225,95 @@ int debug_view_breakpoints::breakpoints(SortMode sort, device_debug::breakpoint*
void debug_view_breakpoints::view_update()
{
// Gather a list of all the breakpoints for all the CPUs
- device_debug::breakpoint** bpList = NULL;
- const int numBPs = breakpoints(SORT_NONE, bpList);
+ gather_breakpoints();
// Set the view region so the scroll bars update
- m_total.y = numBPs+1;
+ m_total.x = tableBreaks[ARRAY_LENGTH(tableBreaks) - 1];
+ m_total.y = m_buffer.count() + 1;
+ if (m_total.y < 10)
+ m_total.y = 10;
// Draw
- debug_view_char *dest = m_viewdata;
- for (int row = 0; row < m_visible.y; row++)
- {
- UINT32 effrow = m_topleft.y + row;
+ debug_view_char *dest = m_viewdata;
+ astring linebuf;
- // Header
- if (row == 0)
+ // Header
+ if (m_visible.y > 0)
+ {
+ linebuf.reset();
+ linebuf.cat("ID");
+ if (m_sortType == &cIndexAscending) linebuf.cat('\\');
+ else if (m_sortType == &cIndexDescending) linebuf.cat('/');
+ pad_astring_to_length(linebuf, tableBreaks[0]);
+ linebuf.cat("En");
+ if (m_sortType == &cEnabledAscending) linebuf.cat('\\');
+ else if (m_sortType == &cEnabledDescending) linebuf.cat('/');
+ pad_astring_to_length(linebuf, tableBreaks[1]);
+ linebuf.cat("CPU");
+ if (m_sortType == &cCpuAscending) linebuf.cat('\\');
+ else if (m_sortType == &cCpuDescending) linebuf.cat('/');
+ pad_astring_to_length(linebuf, tableBreaks[2]);
+ linebuf.cat("Address");
+ if (m_sortType == &cAddressAscending) linebuf.cat('\\');
+ else if (m_sortType == &cAddressDescending) linebuf.cat('/');
+ pad_astring_to_length(linebuf, tableBreaks[3]);
+ linebuf.cat("Condition");
+ if (m_sortType == &cConditionAscending) linebuf.cat('\\');
+ else if (m_sortType == &cConditionDescending) linebuf.cat('/');
+ pad_astring_to_length(linebuf, tableBreaks[4]);
+ linebuf.cat("Action");
+ if (m_sortType == &cActionAscending) linebuf.cat('\\');
+ else if (m_sortType == &cActionDescending) linebuf.cat('/');
+ pad_astring_to_length(linebuf, tableBreaks[5]);
+
+ for (UINT32 i = m_topleft.x; i < (m_topleft.x + m_visible.x); i++, dest++)
{
- astring header;
- header.printf("ID");
- if (m_sortType == SORT_INDEX_ASCENDING) header.catprintf("\\");
- else if (m_sortType == SORT_INDEX_DESCENDING) header.catprintf("/");
- pad_astring_to_length(header, tableBreaks[0]);
- header.catprintf("En");
- if (m_sortType == SORT_ENABLED_ASCENDING) header.catprintf("\\");
- else if (m_sortType == SORT_ENABLED_DESCENDING) header.catprintf("/");
- pad_astring_to_length(header, tableBreaks[1]);
- header.catprintf("CPU");
- if (m_sortType == SORT_CPU_ASCENDING) header.catprintf("\\");
- else if (m_sortType == SORT_CPU_DESCENDING) header.catprintf("/");
- pad_astring_to_length(header, tableBreaks[2]);
- header.catprintf("Address");
- if (m_sortType == SORT_ADDRESS_ASCENDING) header.catprintf("\\");
- else if (m_sortType == SORT_ADDRESS_DESCENDING) header.catprintf("/");
- pad_astring_to_length(header, tableBreaks[3]);
- header.catprintf("Condition");
- if (m_sortType == SORT_CONDITION_ASCENDING) header.catprintf("\\");
- else if (m_sortType == SORT_CONDITION_DESCENDING) header.catprintf("/");
- pad_astring_to_length(header, tableBreaks[4]);
- header.catprintf("Action");
- if (m_sortType == SORT_ACTION_ASCENDING) header.catprintf("\\");
- else if (m_sortType == SORT_ACTION_DESCENDING) header.catprintf("/");
- pad_astring_to_length(header, tableBreaks[5]);
-
- for (int i = 0; i < m_visible.x; i++)
- {
- dest->byte = (i < header.len()) ? header[i] : ' ';
- dest->attrib = DCA_ANCILLARY;
- dest++;
- }
- continue;
+ dest->byte = (i < linebuf.len()) ? linebuf[i] : ' ';
+ dest->attrib = DCA_ANCILLARY;
}
+ }
+ for (int row = 1; row < m_visible.y; row++)
+ {
// Breakpoints
- int bpi = effrow-1;
- if (bpi < numBPs && bpi >= 0)
+ int bpi = row + m_topleft.y - 1;
+ if ((bpi < m_buffer.count()) && (bpi >= 0))
{
- device_debug::breakpoint* bp = bpList[bpi];
-
- astring buffer;
- buffer.printf("%X", bp->index());
- pad_astring_to_length(buffer, tableBreaks[0]);
- buffer.catprintf("%c", bp->enabled() ? 'X' : 'O');
- pad_astring_to_length(buffer, tableBreaks[1]);
- buffer.catprintf("%s", bp->debugInterface()->device().tag());
- pad_astring_to_length(buffer, tableBreaks[2]);
- buffer.catprintf("%s", core_i64_hex_format(bp->address(), bp->debugInterface()->logaddrchars()));
- pad_astring_to_length(buffer, tableBreaks[3]);
- if (astring(bp->condition()) != astring("1"))
- {
- buffer.catprintf("%s", bp->condition());
- pad_astring_to_length(buffer, tableBreaks[4]);
- }
- if (astring(bp->action()) != astring(""))
+ device_debug::breakpoint *const bp = m_buffer[bpi];
+
+ linebuf.reset();
+ linebuf.catprintf("%2X", bp->index());
+ pad_astring_to_length(linebuf, tableBreaks[0]);
+ linebuf.cat(bp->enabled() ? 'X' : 'O');
+ pad_astring_to_length(linebuf, tableBreaks[1]);
+ linebuf.cat(bp->debugInterface()->device().tag());
+ pad_astring_to_length(linebuf, tableBreaks[2]);
+ linebuf.cat(core_i64_hex_format(bp->address(), bp->debugInterface()->logaddrchars()));
+ pad_astring_to_length(linebuf, tableBreaks[3]);
+ if (strcmp(bp->condition(), "1"))
+ linebuf.cat(bp->condition());
+ pad_astring_to_length(linebuf, tableBreaks[4]);
+ linebuf.cat(bp->action());
+ pad_astring_to_length(linebuf, tableBreaks[5]);
+
+ for (UINT32 i = m_topleft.x; i < (m_topleft.x + m_visible.x); i++, dest++)
{
- buffer.catprintf("%s", bp->action());
- pad_astring_to_length(buffer, tableBreaks[5]);
- }
-
- for (int i = 0; i < m_visible.x; i++)
- {
- dest->byte = (i < buffer.len()) ? buffer[i] : ' ';
+ dest->byte = (i < linebuf.len()) ? linebuf[i] : ' ';
dest->attrib = DCA_NORMAL;
// Color disabled breakpoints red
- if (i == 5 && dest->byte == 'O')
- dest->attrib = DCA_CHANGED;
-
- dest++;
+ if ((i >= tableBreaks[0]) && (i < tableBreaks[1]) && !bp->enabled())
+ dest->attrib |= DCA_CHANGED;
}
- continue;
}
-
- // Fill the remaining vertical space
- for (int i = 0; i < m_visible.x; i++)
+ else
{
- dest->byte = ' ';
- dest->attrib = DCA_NORMAL;
- dest++;
+ // Fill the remaining vertical space
+ for (UINT32 i = m_topleft.x; i < (m_topleft.x + m_visible.x); i++, dest++)
+ {
+ dest->byte = ' ';
+ dest->attrib = DCA_NORMAL;
+ }
}
}
-
- delete[] bpList;
}