summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/debug/dvmemory.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/debug/dvmemory.cpp')
-rw-r--r--src/emu/debug/dvmemory.cpp230
1 files changed, 117 insertions, 113 deletions
diff --git a/src/emu/debug/dvmemory.cpp b/src/emu/debug/dvmemory.cpp
index e4daaff1a80..eaffcac33b8 100644
--- a/src/emu/debug/dvmemory.cpp
+++ b/src/emu/debug/dvmemory.cpp
@@ -257,6 +257,118 @@ static inline float u64_to_double(u64 value)
}
//-------------------------------------------------
+// generate_row - read one row of data and make a
+// text representation of the chunks
+//-------------------------------------------------
+
+void debug_view_memory::generate_row(debug_view_char *destmin, debug_view_char *destmax, debug_view_char *destrow, offs_t address)
+{
+ // get positional data
+ const memory_view_pos &posdata = s_memory_pos_table[m_data_format];
+ int spacing = posdata.m_spacing;
+
+ // generate the address
+ char addrtext[20];
+ sprintf(addrtext, m_addrformat.c_str(), address);
+ debug_view_char *dest = destrow + m_section[0].m_pos + 1;
+ for (int ch = 0; addrtext[ch] != 0 && ch < m_section[0].m_width - 1; ch++, dest++)
+ if (dest >= destmin && dest < destmax)
+ dest->byte = addrtext[ch];
+
+ // generate the data and the ascii string
+ std::string chunkascii;
+ if (m_data_format <= 8)
+ {
+ for (int chunknum = 0; chunknum < m_chunks_per_row; chunknum++)
+ {
+ u64 chunkdata;
+ bool ismapped = read_chunk(address, chunknum, chunkdata);
+
+ int chunkindex = m_reverse_view ? (m_chunks_per_row - 1 - chunknum) : chunknum;
+ dest = destrow + m_section[1].m_pos + 1 + chunkindex * spacing;
+ for (int ch = 0; ch < spacing; ch++, dest++)
+ if (dest >= destmin && dest < destmax)
+ {
+ u8 shift = posdata.m_shift[ch];
+ if (shift < 64)
+ dest->byte = ismapped ? "0123456789ABCDEF"[(chunkdata >> shift) & 0x0f] : '*';
+ }
+
+ for (int i = 0; i < m_bytes_per_chunk; i++)
+ {
+ u8 chval = chunkdata >> (8 * (m_bytes_per_chunk - i - 1));
+ chunkascii += char((ismapped && isprint(chval)) ? chval : '.');
+ }
+ }
+ }
+ else
+ {
+ for (int chunknum = 0; chunknum < m_chunks_per_row; chunknum++)
+ {
+ char valuetext[64];
+ u64 chunkdata = 0;
+ extFloat80_t chunkdata80 = { 0, 0 };
+ bool ismapped;
+
+ if (m_data_format != 11)
+ ismapped = read(m_bytes_per_chunk, address + chunknum * m_steps_per_chunk, chunkdata);
+ else
+ ismapped = read(m_bytes_per_chunk, address + chunknum * m_steps_per_chunk, chunkdata80);
+
+ if (ismapped)
+ switch (m_data_format)
+ {
+ case 9:
+ sprintf(valuetext, "%.8g", u32_to_float(u32(chunkdata)));
+ break;
+ case 10:
+ sprintf(valuetext, "%.24g", u64_to_double(chunkdata));
+ break;
+ case 11:
+ float64_t f64 = extF80M_to_f64(&chunkdata80);
+ sprintf(valuetext, "%.24g", u64_to_double(f64.v));
+ break;
+ }
+ else
+ {
+ valuetext[0] = '*';
+ valuetext[1] = 0;
+ }
+
+ int ch;
+ int chunkindex = m_reverse_view ? (m_chunks_per_row - 1 - chunknum) : chunknum;
+ dest = destrow + m_section[1].m_pos + 1 + chunkindex * spacing;
+ // first copy the text
+ for (ch = 0; (ch < spacing) && (valuetext[ch] != 0); ch++, dest++)
+ if (dest >= destmin && dest < destmax)
+ dest->byte = valuetext[ch];
+ // then fill with spaces
+ for (; ch < spacing; ch++, dest++)
+ if (dest >= destmin && dest < destmax)
+ dest->byte = ' ';
+
+ for (int i = 0; i < m_bytes_per_chunk; i++)
+ {
+ u8 chval = chunkdata >> (8 * (m_bytes_per_chunk - i - 1));
+ chunkascii += char((ismapped && isprint(chval)) ? chval : '.');
+ }
+ }
+ }
+
+ // generate the ASCII data, but follow the chunks
+ if (m_section[2].m_width > 0)
+ {
+ dest = destrow + m_section[2].m_pos + 1;
+ for (size_t i = 0; i != chunkascii.size(); i++)
+ {
+ if (dest >= destmin && dest < destmax)
+ dest->byte = chunkascii[i];
+ dest++;
+ }
+ }
+}
+
+//-------------------------------------------------
// view_update - update the contents of the
// memory view
//-------------------------------------------------
@@ -269,9 +381,6 @@ void debug_view_memory::view_update()
if (needs_recompute())
recompute();
- // get positional data
- const memory_view_pos &posdata = s_memory_pos_table[m_data_format];
-
// loop over visible rows
for (u32 row = 0; row < m_visible.y; row++)
{
@@ -281,10 +390,9 @@ void debug_view_memory::view_update()
u32 effrow = m_topleft.y + row;
// reset the line of data; section 1 is normal, others are ancillary, cursor is selected
- debug_view_char *dest = destmin;
- for (int ch = 0; ch < m_visible.x; ch++, dest++)
+ u32 effcol = m_topleft.x;
+ for (debug_view_char *dest = destmin; dest != destmax; dest++, effcol++)
{
- u32 effcol = m_topleft.x + ch;
dest->byte = ' ';
dest->attrib = DCA_ANCILLARY;
if (m_section[1].contains(effcol))
@@ -300,96 +408,7 @@ void debug_view_memory::view_update()
{
offs_t addrbyte = m_byte_offset + effrow * m_bytes_per_row;
offs_t address = (source.m_space != nullptr) ? source.m_space->byte_to_address(addrbyte) : addrbyte;
- char addrtext[20];
-
- // generate the address
- sprintf(addrtext, m_addrformat.c_str(), address);
- dest = destrow + m_section[0].m_pos + 1;
- for (int ch = 0; addrtext[ch] != 0 && ch < m_section[0].m_width - 1; ch++, dest++)
- if (dest >= destmin && dest < destmax)
- dest->byte = addrtext[ch];
-
- // generate the data and the ascii string
- std::string chunkascii;
- for (int chunknum = 0; chunknum < m_chunks_per_row; chunknum++)
- {
- int chunkindex = m_reverse_view ? (m_chunks_per_row - 1 - chunknum) : chunknum;
- int spacing = posdata.m_spacing;
-
- if (m_data_format <= 8) {
- u64 chunkdata;
- bool ismapped = read_chunk(address, chunknum, chunkdata);
- dest = destrow + m_section[1].m_pos + 1 + chunkindex * spacing;
- for (int ch = 0; ch < posdata.m_spacing; ch++, dest++)
- if (dest >= destmin && dest < destmax)
- {
- u8 shift = posdata.m_shift[ch];
- if (shift < 64)
- dest->byte = ismapped ? "0123456789ABCDEF"[(chunkdata >> shift) & 0x0f] : '*';
- }
- for (int i=0; i < m_bytes_per_chunk; i++) {
- u8 chval = chunkdata >> (8 * (m_bytes_per_chunk - i - 1));
- chunkascii += char((ismapped && isprint(chval)) ? chval : '.');
- }
- }
- else {
- int ch;
- char valuetext[64];
- u64 chunkdata = 0;
- extFloat80_t chunkdata80 = { 0, 0 };
- bool ismapped;
-
- if (m_data_format != 11)
- ismapped = read(m_bytes_per_chunk, address + chunknum * m_steps_per_chunk, chunkdata);
- else
- ismapped = read(m_bytes_per_chunk, address + chunknum * m_steps_per_chunk, chunkdata80);
-
- if (ismapped)
- switch (m_data_format)
- {
- case 9:
- sprintf(valuetext, "%.8g", u32_to_float(u32(chunkdata)));
- break;
- case 10:
- sprintf(valuetext, "%.24g", u64_to_double(chunkdata));
- break;
- case 11:
- float64_t f64 = extF80M_to_f64(&chunkdata80);
- sprintf(valuetext, "%.24g", u64_to_double(f64.v));
- break;
- }
- else {
- valuetext[0] = '*';
- valuetext[1] = 0;
- }
-
- dest = destrow + m_section[1].m_pos + 1 + chunkindex * spacing;
- // first copy the text
- for (ch = 0; (ch < spacing) && (valuetext[ch] != 0); ch++, dest++)
- if (dest >= destmin && dest < destmax)
- dest->byte = valuetext[ch];
- // then fill with spaces
- for (; ch < spacing; ch++, dest++)
- if (dest >= destmin && dest < destmax)
- dest->byte = ' ';
-
- for (int i=0; i < m_bytes_per_chunk; i++) {
- u8 chval = chunkdata >> (8 * (m_bytes_per_chunk - i - 1));
- chunkascii += char((ismapped && isprint(chval)) ? chval : '.');
- }
- }
- }
-
- // generate the ASCII data, but follow the chunks
- if (m_section[2].m_width > 0)
- {
- dest = destrow + m_section[2].m_pos + 1;
- for (size_t i = 0; i != chunkascii.size(); i++) {
- if (dest >= destmin && dest < destmax)
- dest->byte = chunkascii[i];
- dest++;
- }
- }
+ generate_row(destmin, destmax, destrow, address);
}
}
}
@@ -784,15 +803,7 @@ bool debug_view_memory::read(u8 size, offs_t offs, u64 &data)
}
data = ~u64(0);
if (ismapped)
- {
- switch (size)
- {
- case 1: data = machine().debugger().cpu().read_byte(*source.m_space, offs, !m_no_translation); break;
- case 2: data = machine().debugger().cpu().read_word(*source.m_space, offs, !m_no_translation); break;
- case 4: data = machine().debugger().cpu().read_dword(*source.m_space, offs, !m_no_translation); break;
- case 8: data = machine().debugger().cpu().read_qword(*source.m_space, offs, !m_no_translation); break;
- }
- }
+ data = m_expression.context().read_memory(*source.m_space, offs, size, !m_no_translation);
return ismapped;
}
@@ -883,14 +894,7 @@ void debug_view_memory::write(u8 size, offs_t offs, u64 data)
if (source.m_space)
{
auto dis = machine().disable_side_effects();
-
- switch (size)
- {
- case 1: machine().debugger().cpu().write_byte(*source.m_space, offs, data, !m_no_translation); break;
- case 2: machine().debugger().cpu().write_word(*source.m_space, offs, data, !m_no_translation); break;
- case 4: machine().debugger().cpu().write_dword(*source.m_space, offs, data, !m_no_translation); break;
- case 8: machine().debugger().cpu().write_qword(*source.m_space, offs, data, !m_no_translation); break;
- }
+ m_expression.context().write_memory(*source.m_space, offs, data, size, !m_no_translation);
return;
}