diff options
author | 2013-07-26 03:40:55 +0000 | |
---|---|---|
committer | 2013-07-26 03:40:55 +0000 | |
commit | 6ab38a50eff62f263f4472dce5a1730749a0bf2b (patch) | |
tree | a269a1e0024c8cd875156fd01dfa48482643afe6 | |
parent | 416c9d0190769f86cf75ba87c0fb5840b541b502 (diff) |
Fixed the build.
-rw-r--r-- | .gitattributes | 2 | ||||
-rw-r--r-- | src/emu/debug/dvwpoints.c | 540 | ||||
-rw-r--r-- | src/emu/debug/dvwpoints.h | 111 |
3 files changed, 653 insertions, 0 deletions
diff --git a/.gitattributes b/.gitattributes index 4a4c2c1ca1a..ae73ffefe1f 100644 --- a/.gitattributes +++ b/.gitattributes @@ -989,6 +989,8 @@ src/emu/debug/dvstate.c svneol=native#text/plain src/emu/debug/dvstate.h svneol=native#text/plain src/emu/debug/dvtext.c svneol=native#text/plain src/emu/debug/dvtext.h svneol=native#text/plain +src/emu/debug/dvwpoints.c svneol=native#text/plain +src/emu/debug/dvwpoints.h svneol=native#text/plain src/emu/debug/express.c svneol=native#text/plain src/emu/debug/express.h svneol=native#text/plain src/emu/debug/textbuf.c svneol=native#text/plain diff --git a/src/emu/debug/dvwpoints.c b/src/emu/debug/dvwpoints.c new file mode 100644 index 00000000000..0eed8c98179 --- /dev/null +++ b/src/emu/debug/dvwpoints.c @@ -0,0 +1,540 @@ +/********************************************************************* + + dvwpoints.c + + Watchpoint debugger view. + +**************************************************************************** + + Copyright Aaron Giles + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + * Neither the name 'MAME' nor the names of its contributors may be + used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY AARON GILES ''AS IS'' AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL AARON GILES BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + +***************************************************************************/ + +#include "emu.h" +#include "dvwpoints.h" + + + +//************************************************************************** +// DEBUG VIEW WATCH POINTS +//************************************************************************** + +static const int tableBreaks[] = { 5, 9, 31, 42, 60, 67, 86, 100 }; + +//------------------------------------------------- +// debug_view_watchpoints - constructor +//------------------------------------------------- + +debug_view_watchpoints::debug_view_watchpoints(running_machine &machine, debug_view_osd_update_func osdupdate, void *osdprivate) + : debug_view(machine, DVT_WATCH_POINTS, osdupdate, osdprivate), + m_sortType(SORT_INDEX_ASCENDING) +{ + // 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; +} + + +//------------------------------------------------- +// ~debug_view_watchpoints - destructor +//------------------------------------------------- + +debug_view_watchpoints::~debug_view_watchpoints() +{ +} + + +//------------------------------------------------- +// enumerate_sources - enumerate all possible +// sources for a disassembly view +//------------------------------------------------- + +void debug_view_watchpoints::enumerate_sources() +{ + // start with an empty list + m_source_list.reset(); + + // iterate over devices with disassembly interfaces + disasm_interface_iterator iter(machine().root_device()); + for (device_disasm_interface *dasm = iter.first(); dasm != NULL; dasm = iter.next()) + { + astring name; + name.printf("%s '%s'", dasm->device().name(), dasm->device().tag()); + m_source_list.append(*auto_alloc(machine(), debug_view_source(name.cstr(), &dasm->device()))); + } + + // reset the source to a known good entry + set_source(*m_source_list.head()); +} + + +//------------------------------------------------- +// view_notify - handle notification of updates +// to cursor changes +//------------------------------------------------- + +void debug_view_watchpoints::view_notify(debug_view_notification type) +{ +} + + +//------------------------------------------------- +// view_char - handle a character typed within +// the current view +//------------------------------------------------- + +void debug_view_watchpoints::view_char(int chval) +{ +} + + +//------------------------------------------------- +// view_click - handle a mouse click within the +// current view +//------------------------------------------------- + +void debug_view_watchpoints::view_click(const int button, const debug_view_xy& pos) +{ + bool clickedTopRow = (m_topleft.y == pos.y); + + 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; + 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; + else if (pos.x < tableBreaks[2]) + m_sortType = SORT_CPU_ASCENDING; + else if (pos.x < tableBreaks[3] && m_sortType == SORT_SPACE_ASCENDING) + m_sortType = SORT_SPACE_DESCENDING; + else if (pos.x < tableBreaks[3]) + m_sortType = SORT_SPACE_ASCENDING; + else if (pos.x < tableBreaks[4] && m_sortType == SORT_ADDRESS_ASCENDING) + m_sortType = SORT_ADDRESS_DESCENDING; + else if (pos.x < tableBreaks[4]) + m_sortType = SORT_ADDRESS_ASCENDING; + else if (pos.x < tableBreaks[5] && m_sortType == SORT_TYPE_ASCENDING) + m_sortType = SORT_TYPE_DESCENDING; + else if (pos.x < tableBreaks[5]) + m_sortType = SORT_TYPE_ASCENDING; + else if (pos.x < tableBreaks[6] && m_sortType == SORT_CONDITION_ASCENDING) + m_sortType = SORT_CONDITION_DESCENDING; + else if (pos.x < tableBreaks[6]) + m_sortType = SORT_CONDITION_ASCENDING; + else if (pos.x < tableBreaks[7] && m_sortType == SORT_ACTION_ASCENDING) + m_sortType = SORT_ACTION_DESCENDING; + else if (pos.x < tableBreaks[7]) + m_sortType = SORT_ACTION_ASCENDING; + } + else + { + // Gather a sorted list of all the watchpoints for all the CPUs + device_debug::watchpoint** wpList = NULL; + const int numWPs = watchpoints(SORT_NONE, wpList); + + const int wpIndex = pos.y-1; + if (wpIndex > numWPs || wpIndex < 0) + return; + + // Enable / disable + if (wpList[wpIndex]->enabled()) + wpList[wpIndex]->setEnabled(false); + else + wpList[wpIndex]->setEnabled(true); + + delete[] wpList; + } + + view_update(); +} + + +void debug_view_watchpoints::pad_astring_to_length(astring& str, int len) +{ + int diff = len - str.len(); + if (diff > 0) + { + astring buffer; + buffer.expand(diff); + for (int i = 0; i < diff; i++) + buffer.catprintf(" "); + str.catprintf("%s", buffer.cstr()); + } +} + + +// Sorting functors for the qsort function +static int cIndexAscending(const void* a, const void* b) +{ + const device_debug::watchpoint* left = *(device_debug::watchpoint**)a; + const device_debug::watchpoint* right = *(device_debug::watchpoint**)b; + return left->index() > right->index(); +} + +static int cIndexDescending(const void* a, const void* b) +{ + const device_debug::watchpoint* left = *(device_debug::watchpoint**)a; + const device_debug::watchpoint* right = *(device_debug::watchpoint**)b; + return left->index() < right->index(); +} + +static int cEnabledAscending(const void* a, const void* b) +{ + const device_debug::watchpoint* left = *(device_debug::watchpoint**)a; + const device_debug::watchpoint* right = *(device_debug::watchpoint**)b; + return left->enabled() < right->enabled(); +} + +static int cEnabledDescending(const void* a, const void* b) +{ + const device_debug::watchpoint* left = *(device_debug::watchpoint**)a; + const device_debug::watchpoint* right = *(device_debug::watchpoint**)b; + return left->enabled() > right->enabled(); +} + +static int cCpuAscending(const void* a, const void* b) +{ + const device_debug::watchpoint* left = *(device_debug::watchpoint**)a; + const device_debug::watchpoint* right = *(device_debug::watchpoint**)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::watchpoint* left = *(device_debug::watchpoint**)a; + const device_debug::watchpoint* right = *(device_debug::watchpoint**)b; + const int result = strcmp(left->debugInterface()->device().tag(), right->debugInterface()->device().tag()); + return result < 0; +} + +static int cSpaceAscending(const void* a, const void* b) +{ + const device_debug::watchpoint* left = *(device_debug::watchpoint**)a; + const device_debug::watchpoint* right = *(device_debug::watchpoint**)b; + const int result = strcmp(left->space().name(), right->space().name()); + return result >= 0; +} + +static int cSpaceDescending(const void* a, const void* b) +{ + const device_debug::watchpoint* left = *(device_debug::watchpoint**)a; + const device_debug::watchpoint* right = *(device_debug::watchpoint**)b; + const int result = strcmp(left->space().name(), right->space().name()); + return result < 0; +} + +static int cAddressAscending(const void* a, const void* b) +{ + const device_debug::watchpoint* left = *(device_debug::watchpoint**)a; + const device_debug::watchpoint* right = *(device_debug::watchpoint**)b; + return left->address() > right->address(); +} + +static int cAddressDescending(const void* a, const void* b) +{ + const device_debug::watchpoint* left = *(device_debug::watchpoint**)a; + const device_debug::watchpoint* right = *(device_debug::watchpoint**)b; + return left->address() < right->address(); +} + +static int cTypeAscending(const void* a, const void* b) +{ + const device_debug::watchpoint* left = *(device_debug::watchpoint**)a; + const device_debug::watchpoint* right = *(device_debug::watchpoint**)b; + return left->type() > right->type(); +} + +static int cTypeDescending(const void* a, const void* b) +{ + const device_debug::watchpoint* left = *(device_debug::watchpoint**)a; + const device_debug::watchpoint* right = *(device_debug::watchpoint**)b; + return left->type() < right->type(); +} + +static int cConditionAscending(const void* a, const void* b) +{ + const device_debug::watchpoint* left = *(device_debug::watchpoint**)a; + const device_debug::watchpoint* right = *(device_debug::watchpoint**)b; + const int result = strcmp(left->condition(), right->condition()); + return result >= 0; +} + +static int cConditionDescending(const void* a, const void* b) +{ + const device_debug::watchpoint* left = *(device_debug::watchpoint**)a; + const device_debug::watchpoint* right = *(device_debug::watchpoint**)b; + const int result = strcmp(left->condition(), right->condition()); + return result < 0; +} + +static int cActionAscending(const void* a, const void* b) +{ + const device_debug::watchpoint* left = *(device_debug::watchpoint**)a; + const device_debug::watchpoint* right = *(device_debug::watchpoint**)b; + const int result = strcmp(left->action(), right->action()); + return result >= 0; +} + +static int cActionDescending(const void* a, const void* b) +{ + const device_debug::watchpoint* left = *(device_debug::watchpoint**)a; + const device_debug::watchpoint* right = *(device_debug::watchpoint**)b; + const int result = strcmp(left->action(), right->action()); + return result < 0; +} + + +int debug_view_watchpoints::watchpoints(SortMode sort, device_debug::watchpoint**& wpList) +{ + // Alloc + int numWPs = 0; + wpList = NULL; + for (const debug_view_source *source = m_source_list.head(); source != NULL; source = source->next()) + { + for (address_spacenum spacenum = AS_0; spacenum < ADDRESS_SPACES; spacenum++) + { + /* loop over the watchpoints */ + const device_debug& debugInterface = *source->device()->debug(); + for (device_debug::watchpoint *wp = debugInterface.watchpoint_first(spacenum); wp != NULL; wp = wp->next()) + numWPs++; + } + } + wpList = new device_debug::watchpoint*[numWPs]; + + int wpAddIndex = 0; + for (const debug_view_source *source = m_source_list.head(); source != NULL; source = source->next()) + { + // Collect + for (address_spacenum spacenum = AS_0; spacenum < ADDRESS_SPACES; spacenum++) + { + device_debug& debugInterface = *source->device()->debug(); + for (device_debug::watchpoint *wp = debugInterface.watchpoint_first(spacenum); wp != NULL; wp = wp->next()) + { + wpList[wpAddIndex] = wp; + wpAddIndex++; + } + } + } + + // And now for the sort + switch (m_sortType) + { + case SORT_NONE: + break; + case SORT_INDEX_ASCENDING: + qsort(wpList, numWPs, sizeof(device_debug::watchpoint*), cIndexAscending); + break; + case SORT_INDEX_DESCENDING: + qsort(wpList, numWPs, sizeof(device_debug::watchpoint*), cIndexDescending); + break; + case SORT_ENABLED_ASCENDING: + qsort(wpList, numWPs, sizeof(device_debug::watchpoint*), cEnabledAscending); + break; + case SORT_ENABLED_DESCENDING: + qsort(wpList, numWPs, sizeof(device_debug::watchpoint*), cEnabledDescending); + break; + case SORT_CPU_ASCENDING: + qsort(wpList, numWPs, sizeof(device_debug::watchpoint*), cCpuAscending); + break; + case SORT_CPU_DESCENDING: + qsort(wpList, numWPs, sizeof(device_debug::watchpoint*), cCpuDescending); + break; + case SORT_SPACE_ASCENDING: + qsort(wpList, numWPs, sizeof(device_debug::watchpoint*), cSpaceAscending); + break; + case SORT_SPACE_DESCENDING: + qsort(wpList, numWPs, sizeof(device_debug::watchpoint*), cSpaceDescending); + break; + case SORT_ADDRESS_ASCENDING: + qsort(wpList, numWPs, sizeof(device_debug::watchpoint*), cAddressAscending); + break; + case SORT_ADDRESS_DESCENDING: + qsort(wpList, numWPs, sizeof(device_debug::watchpoint*), cAddressDescending); + break; + case SORT_TYPE_ASCENDING: + qsort(wpList, numWPs, sizeof(device_debug::watchpoint*), cTypeAscending); + break; + case SORT_TYPE_DESCENDING: + qsort(wpList, numWPs, sizeof(device_debug::watchpoint*), cTypeDescending); + break; + case SORT_CONDITION_ASCENDING: + qsort(wpList, numWPs, sizeof(device_debug::watchpoint*), cConditionAscending); + break; + case SORT_CONDITION_DESCENDING: + qsort(wpList, numWPs, sizeof(device_debug::watchpoint*), cConditionDescending); + break; + case SORT_ACTION_ASCENDING: + qsort(wpList, numWPs, sizeof(device_debug::watchpoint*), cActionAscending); + break; + case SORT_ACTION_DESCENDING: + qsort(wpList, numWPs, sizeof(device_debug::watchpoint*), cActionDescending); + break; + } + + return numWPs; +} + + +//------------------------------------------------- +// view_update - update the contents of the +// disassembly view +//------------------------------------------------- + +void debug_view_watchpoints::view_update() +{ + // Gather a list of all the watchpoints for all the CPUs + device_debug::watchpoint** wpList = NULL; + const int numWPs = watchpoints(SORT_NONE, wpList); + + // Set the view region so the scroll bars update + m_total.y = numWPs+1; + + // Draw + debug_view_char *dest = m_viewdata; + for (int row = 0; row < m_visible.y; row++) + { + UINT32 effrow = m_topleft.y + row; + + // Header + if (row == 0) + { + 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("Space"); + if (m_sortType == SORT_SPACE_ASCENDING) header.catprintf("\\"); + else if (m_sortType == SORT_SPACE_DESCENDING) header.catprintf("/"); + pad_astring_to_length(header, tableBreaks[3]); + header.catprintf("Addresses"); + if (m_sortType == SORT_ADDRESS_ASCENDING) header.catprintf("\\"); + else if (m_sortType == SORT_ADDRESS_DESCENDING) header.catprintf("/"); + pad_astring_to_length(header, tableBreaks[4]); + header.catprintf("Type"); + if (m_sortType == SORT_TYPE_ASCENDING) header.catprintf("\\"); + else if (m_sortType == SORT_TYPE_DESCENDING) header.catprintf("/"); + pad_astring_to_length(header, tableBreaks[5]); + 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[6]); + 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[7]); + + for (int i = 0; i < m_visible.x; i++) + { + dest->byte = (i < header.len()) ? header[i] : ' '; + dest->attrib = DCA_ANCILLARY; + dest++; + } + continue; + } + + // watchpoints + int wpi = effrow-1; + if (wpi < numWPs && wpi >= 0) + { + static const char *const types[] = { "unkn ", "read ", "write", "r/w " }; + device_debug::watchpoint* wp = wpList[wpi]; + + astring buffer; + buffer.printf("%x", wp->index()); + pad_astring_to_length(buffer, tableBreaks[0]); + buffer.catprintf("%c", wp->enabled() ? 'X' : 'O'); + pad_astring_to_length(buffer, tableBreaks[1]); + buffer.catprintf("%s", wp->debugInterface()->device().tag()); + pad_astring_to_length(buffer, tableBreaks[2]); + buffer.catprintf("%s", wp->space().name()); + pad_astring_to_length(buffer, tableBreaks[3]); + buffer.catprintf("%s-%s", + core_i64_hex_format(wp->space().byte_to_address(wp->address()), wp->space().addrchars()), + core_i64_hex_format(wp->space().byte_to_address_end(wp->address() + wp->length()) - 1, wp->space().addrchars())); + pad_astring_to_length(buffer, tableBreaks[4]); + buffer.catprintf("%s", types[wp->type() & 3]); + pad_astring_to_length(buffer, tableBreaks[5]); + if (astring(wp->condition()) != astring("1")) + { + buffer.catprintf("%s", wp->condition()); + pad_astring_to_length(buffer, tableBreaks[6]); + } + if (astring(wp->action()) != astring("")) + { + buffer.catprintf("%s", wp->action()); + pad_astring_to_length(buffer, tableBreaks[7]); + } + + for (int i = 0; i < m_visible.x; i++) + { + dest->byte = (i < buffer.len()) ? buffer[i] : ' '; + dest->attrib = DCA_NORMAL; + + // Color disabled watchpoints red + if (i == 5 && dest->byte == 'O') + dest->attrib = DCA_CHANGED; + + dest++; + } + continue; + } + + // Fill the remaining vertical space + for (int i = 0; i < m_visible.x; i++) + { + dest->byte = ' '; + dest->attrib = DCA_NORMAL; + dest++; + } + } + + delete[] wpList; +} diff --git a/src/emu/debug/dvwpoints.h b/src/emu/debug/dvwpoints.h new file mode 100644 index 00000000000..90416421a81 --- /dev/null +++ b/src/emu/debug/dvwpoints.h @@ -0,0 +1,111 @@ +/********************************************************************* + + dvwpoints.h + + Watchpoint debugger view. + +**************************************************************************** + + Copyright Aaron Giles + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + * Neither the name 'MAME' nor the names of its contributors may be + used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY AARON GILES ''AS IS'' AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL AARON GILES BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + +***************************************************************************/ + +#ifndef __DVWPOINTS_H__ +#define __DVWPOINTS_H__ + +#include "debugvw.h" +#include "debugcpu.h" + + +//************************************************************************** +// CONSTANTS +//************************************************************************** + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// debug view for watchpoints +class debug_view_watchpoints : public debug_view +{ + friend resource_pool_object<debug_view_watchpoints>::~resource_pool_object(); + friend class debug_view_manager; + + // construction/destruction + debug_view_watchpoints(running_machine &machine, debug_view_osd_update_func osdupdate, void *osdprivate); + virtual ~debug_view_watchpoints(); + +public: + enum SortMode + { + SORT_NONE, + SORT_INDEX_ASCENDING, + SORT_INDEX_DESCENDING, + SORT_ENABLED_ASCENDING, + SORT_ENABLED_DESCENDING, + SORT_CPU_ASCENDING, + SORT_CPU_DESCENDING, + SORT_SPACE_ASCENDING, + SORT_SPACE_DESCENDING, + SORT_ADDRESS_ASCENDING, + SORT_ADDRESS_DESCENDING, + SORT_TYPE_ASCENDING, + SORT_TYPE_DESCENDING, + SORT_CONDITION_ASCENDING, + SORT_CONDITION_DESCENDING, + SORT_ACTION_ASCENDING, + SORT_ACTION_DESCENDING + }; + + // getters + // setters + +protected: + // view overrides + virtual void view_update(); + virtual void view_notify(debug_view_notification type); + virtual void view_char(int chval); + virtual void view_click(const int button, const debug_view_xy& pos); + +private: + // internal helpers + void enumerate_sources(); + bool recompute(offs_t pc, int startline, int lines); + void pad_astring_to_length(astring& str, int len); + int watchpoints(SortMode sort, device_debug::watchpoint**& bpList); + + + // internal state + SortMode m_sortType; +}; + + +#endif |