mirror of
https://github.com/holub/mame
synced 2025-05-30 09:33:05 +03:00
Fix the memory windows (nw)
This commit is contained in:
parent
a203fc9d0c
commit
82d9463dc0
@ -98,6 +98,7 @@ debug_view_memory::debug_view_memory(running_machine &machine, debug_view_osd_up
|
||||
m_expression(machine),
|
||||
m_chunks_per_row(16),
|
||||
m_bytes_per_chunk(1),
|
||||
m_steps_per_chunk(1),
|
||||
m_data_format(1),
|
||||
m_reverse_view(false),
|
||||
m_ascii_view(true),
|
||||
@ -197,6 +198,7 @@ void debug_view_memory::view_notify(debug_view_notification type)
|
||||
if (m_bytes_per_chunk > 8)
|
||||
m_bytes_per_chunk = 8;
|
||||
m_data_format = m_bytes_per_chunk;
|
||||
m_steps_per_chunk = source.m_space ? source.m_space->byte_to_address(m_bytes_per_chunk) : m_bytes_per_chunk;
|
||||
if (source.m_space != nullptr)
|
||||
m_expression.set_context(&source.m_space->device().debug()->symtable());
|
||||
else
|
||||
@ -290,7 +292,8 @@ void debug_view_memory::view_update()
|
||||
if (dest >= destmin && dest < destmax)
|
||||
dest->byte = addrtext[ch];
|
||||
|
||||
// generate the data
|
||||
// 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;
|
||||
@ -298,7 +301,7 @@ void debug_view_memory::view_update()
|
||||
|
||||
if (m_data_format <= 8) {
|
||||
u64 chunkdata;
|
||||
bool ismapped = read(m_bytes_per_chunk, addrbyte + chunknum * m_bytes_per_chunk, chunkdata);
|
||||
bool ismapped = read(m_bytes_per_chunk, address + chunknum * m_steps_per_chunk, 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)
|
||||
@ -307,6 +310,10 @@ void debug_view_memory::view_update()
|
||||
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;
|
||||
@ -316,9 +323,9 @@ void debug_view_memory::view_update()
|
||||
bool ismapped;
|
||||
|
||||
if (m_data_format != 11)
|
||||
ismapped = read(m_bytes_per_chunk, addrbyte + chunknum * m_bytes_per_chunk, chunkdata);
|
||||
ismapped = read(m_bytes_per_chunk, address + chunknum * m_steps_per_chunk, chunkdata);
|
||||
else
|
||||
ismapped = read(m_bytes_per_chunk, addrbyte + chunknum * m_bytes_per_chunk, chunkdata80);
|
||||
ismapped = read(m_bytes_per_chunk, address + chunknum * m_steps_per_chunk, chunkdata80);
|
||||
|
||||
if (ismapped)
|
||||
switch (m_data_format)
|
||||
@ -338,6 +345,7 @@ void debug_view_memory::view_update()
|
||||
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++)
|
||||
@ -347,20 +355,23 @@ void debug_view_memory::view_update()
|
||||
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
|
||||
// generate the ASCII data, but follow the chunks
|
||||
if (m_section[2].m_width > 0)
|
||||
{
|
||||
dest = destrow + m_section[2].m_pos + 1;
|
||||
for (int ch = 0; ch < m_bytes_per_row; ch++, dest++)
|
||||
for (size_t i = 0; i != chunkascii.size(); i++) {
|
||||
if (dest >= destmin && dest < destmax)
|
||||
{
|
||||
u64 chval;
|
||||
bool ismapped = read(1, addrbyte + ch, chval);
|
||||
dest->byte = (ismapped && isprint(chval)) ? chval : '.';
|
||||
}
|
||||
dest->byte = chunkascii[i];
|
||||
dest++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -563,7 +574,10 @@ void debug_view_memory::recompute()
|
||||
|
||||
// recompute the byte offset based on the most recent expression result
|
||||
m_bytes_per_row = m_bytes_per_chunk * m_chunks_per_row;
|
||||
m_byte_offset = m_expression.value() % m_bytes_per_row;
|
||||
offs_t val = m_expression.value();
|
||||
if (source.m_space)
|
||||
val = source.m_space->address_to_byte(val);
|
||||
m_byte_offset = val % m_bytes_per_row;
|
||||
|
||||
// compute the section widths
|
||||
m_section[0].m_width = 1 + 8 + 1;
|
||||
@ -612,17 +626,20 @@ bool debug_view_memory::needs_recompute()
|
||||
// handle expression changes
|
||||
if (m_expression.dirty())
|
||||
{
|
||||
const debug_view_memory_source &source = downcast<const debug_view_memory_source &>(*m_source);
|
||||
offs_t val = m_expression.value();
|
||||
if (source.m_space)
|
||||
val = source.m_space->address_to_byte(val);
|
||||
recompute = true;
|
||||
m_topleft.y = (m_expression.value() - m_byte_offset) / m_bytes_per_row;
|
||||
m_topleft.y = (val - m_byte_offset) / m_bytes_per_row;
|
||||
m_topleft.y = std::max(m_topleft.y, 0);
|
||||
m_topleft.y = std::min(m_topleft.y, m_total.y - 1);
|
||||
|
||||
const debug_view_memory_source &source = downcast<const debug_view_memory_source &>(*m_source);
|
||||
offs_t resultbyte;
|
||||
if (source.m_space != nullptr)
|
||||
resultbyte = m_expression.value() & source.m_space->logaddrmask();
|
||||
resultbyte = val & source.m_space->logaddrmask();
|
||||
else
|
||||
resultbyte = m_expression.value();
|
||||
resultbyte = val;
|
||||
|
||||
set_cursor_pos(cursor_pos(resultbyte, m_bytes_per_chunk * 8 - 4));
|
||||
}
|
||||
@ -740,7 +757,7 @@ bool debug_view_memory::read(u8 size, offs_t offs, u64 &data)
|
||||
const debug_view_memory_source &source = downcast<const debug_view_memory_source &>(*m_source);
|
||||
|
||||
// if no raw data, just use the standard debug routines
|
||||
if (source.m_space != nullptr)
|
||||
if (source.m_space)
|
||||
{
|
||||
auto dis = machine().disable_side_effect();
|
||||
|
||||
@ -823,7 +840,7 @@ void debug_view_memory::write(u8 size, offs_t offs, u64 data)
|
||||
const debug_view_memory_source &source = downcast<const debug_view_memory_source &>(*m_source);
|
||||
|
||||
// if no raw data, just use the standard debug routines
|
||||
if (source.m_space != nullptr)
|
||||
if (source.m_space)
|
||||
{
|
||||
auto dis = machine().disable_side_effect();
|
||||
|
||||
|
@ -107,6 +107,7 @@ private:
|
||||
debug_view_expression m_expression; // expression describing the start address
|
||||
u32 m_chunks_per_row; // number of chunks displayed per line
|
||||
u8 m_bytes_per_chunk; // bytes per chunk
|
||||
u8 m_steps_per_chunk; // bytes per chunk
|
||||
int m_data_format; // 1-8 current values 9 32bit floating point
|
||||
bool m_reverse_view; // reverse-endian view?
|
||||
bool m_ascii_view; // display ASCII characters?
|
||||
|
Loading…
Reference in New Issue
Block a user