diff options
author | Vas Crabb <vas@vastheman.com> | 2022-11-27 02:17:55 +1100 |
---|---|---|
committer | Vas Crabb <vas@vastheman.com> | 2022-11-27 02:17:55 +1100 |
commit | 24f4988467cded3ca58fd8d8b794479530f06676 (patch) | |
tree | a15d4270d0bcbd7caf5cf5554ea8391f8378f209 /src/emu/debug | |
parent | 473478186ebdc51937dc08a83a1398d13b2912d7 (diff) |
Revert "Make numbers signed in debugger where it matters"
This reverts commit 922d5b3c81459173ce99970dca0e44825f0a4494.
This broke an important use case with MIPS3 address comparisons no
longer behaving intutively.
It's also another case of a debugger change that wasn't followed through
properly, with absolutely no attempt to update the internal debugger
help or the documentation for the web site.
I realise signed maths woud be a useful feature, for the debugger, but
it needs to be done in a way that doesn't break important use cases.
Diffstat (limited to 'src/emu/debug')
-rw-r--r-- | src/emu/debug/debugcmd.cpp | 40 | ||||
-rw-r--r-- | src/emu/debug/express.cpp | 20 |
2 files changed, 31 insertions, 29 deletions
diff --git a/src/emu/debug/debugcmd.cpp b/src/emu/debug/debugcmd.cpp index 25f2ce5fbeb..4ccb88fbe20 100644 --- a/src/emu/debug/debugcmd.cpp +++ b/src/emu/debug/debugcmd.cpp @@ -151,9 +151,6 @@ debugger_commands::debugger_commands(running_machine& machine, debugger_cpu& cpu symtable.add("s32", 1, 1, // sign-extend from 32 bits [] (int params, const u64 *param) -> u64 { return s64(s32(u32(param[0]))); }); - symtable.add("sext", 2, 2, // sign-extend from any width - [] (int params, const u64 *param) -> u64 - { return util::sext(param[0], param[1]); }); symtable.add("cpunum", std::bind(&debugger_commands::get_cpunum, this)); // add all single-entry save state globals @@ -524,7 +521,11 @@ bool debugger_commands::mini_printf(std::ostream &stream, std::string_view forma m_console.printf("Not enough parameters for format!\n"); return false; } - util::stream_format(stream, zerofill ? "%0*X" : "%*X", width, *param); + if (u32(*param >> 32) != 0) + util::stream_format(stream, zerofill ? "%0*X" : "%*X", (width <= 8) ? 1 : width - 8, u32(*param >> 32)); + else if (width > 8) + util::stream_format(stream, zerofill ? "%0*X" : "%*X", width - 8, 0); + util::stream_format(stream, zerofill ? "%0*X" : "%*X", (width < 8) ? width : 8, u32(*param)); param++; params--; break; @@ -536,35 +537,36 @@ bool debugger_commands::mini_printf(std::ostream &stream, std::string_view forma m_console.printf("Not enough parameters for format!\n"); return false; } - util::stream_format(stream, zerofill ? "%0*o" : "%*o", width, *param); - param++; - params--; - break; - - case 'D': - case 'd': - if (params == 0) + if (u32(*param >> 60) != 0) { - m_console.printf("Not enough parameters for format!\n"); - return false; + util::stream_format(stream, zerofill ? "%0*o" : "%*o", (width <= 20) ? 1 : width - 20, u32(*param >> 60)); + util::stream_format(stream, "%0*o", 10, u32(BIT(*param, 30, 30))); + } + else + { + if (width > 20) + util::stream_format(stream, zerofill ? "%0*o" : "%*o", width - 20, 0); + if (u32(BIT(*param, 30, 30)) != 0) + util::stream_format(stream, zerofill ? "%0*o" : "%*o", (width <= 10) ? 1 : width - 10, u32(BIT(*param, 30, 30))); + else if (width > 10) + util::stream_format(stream, zerofill ? "%0*o" : "%*o", width - 10, 0); } - util::stream_format(stream, zerofill ? "%0*d" : "%*d", width, s64(*param)); + util::stream_format(stream, zerofill ? "%0*o" : "%*o", (width < 10) ? width : 10, u32(BIT(*param, 0, 30))); param++; params--; break; - case 'U': - case 'u': + case 'D': + case 'd': if (params == 0) { m_console.printf("Not enough parameters for format!\n"); return false; } - util::stream_format(stream, zerofill ? "%0*u" : "%*u", width, *param); + util::stream_format(stream, zerofill ? "%0*d" : "%*d", width, u32(*param)); param++; params--; break; - case 'C': case 'c': if (params == 0) diff --git a/src/emu/debug/express.cpp b/src/emu/debug/express.cpp index ce4773d34c4..f9074147b7b 100644 --- a/src/emu/debug/express.cpp +++ b/src/emu/debug/express.cpp @@ -1953,14 +1953,14 @@ u64 parsed_expression::execute_tokens() pop_token_rval(t2); pop_token_rval(t1); if (t2.value() == 0) throw expression_error(expression_error::DIVIDE_BY_ZERO, t2.offset()); - push_token(result.configure_number(s64(t1.value()) / s64(t2.value())).set_offset(t1, t2)); + push_token(result.configure_number(t1.value() / t2.value()).set_offset(t1, t2)); break; case TVL_MODULO: pop_token_rval(t2); pop_token_rval(t1); if (t2.value() == 0) throw expression_error(expression_error::DIVIDE_BY_ZERO, t2.offset()); - push_token(result.configure_number(s64(t1.value()) % s64(t2.value())).set_offset(t1, t2)); + push_token(result.configure_number(t1.value() % t2.value()).set_offset(t1, t2)); break; case TVL_ADD: @@ -1980,27 +1980,27 @@ u64 parsed_expression::execute_tokens() case TVL_RSHIFT: pop_token_rval(t2); pop_token_rval(t1); - push_token(result.configure_number(s64(t1.value()) >> t2.value()).set_offset(t1, t2)); + push_token(result.configure_number(t1.value() >> t2.value()).set_offset(t1, t2)); break; case TVL_LESS: pop_token_rval(t2); pop_token_rval(t1); - push_token(result.configure_number(s64(t1.value()) < s64(t2.value())).set_offset(t1, t2)); + push_token(result.configure_number(t1.value() < t2.value()).set_offset(t1, t2)); break; case TVL_LESSOREQUAL: pop_token_rval(t2); pop_token_rval(t1); - push_token(result.configure_number(s64(t1.value()) <= s64(t2.value())).set_offset(t1, t2)); + push_token(result.configure_number(t1.value() <= t2.value()).set_offset(t1, t2)); break; case TVL_GREATER: pop_token_rval(t2); pop_token_rval(t1); - push_token(result.configure_number(s64(t1.value()) > s64(t2.value())).set_offset(t1, t2)); + push_token(result.configure_number(t1.value() > t2.value()).set_offset(t1, t2)); break; case TVL_GREATEROREQUAL: pop_token_rval(t2); pop_token_rval(t1); - push_token(result.configure_number(s64(t1.value()) >= s64(t2.value())).set_offset(t1, t2)); + push_token(result.configure_number(t1.value() >= t2.value()).set_offset(t1, t2)); break; case TVL_EQUAL: @@ -2054,7 +2054,7 @@ u64 parsed_expression::execute_tokens() pop_token_rval(t2); pop_token_lval(t1); if (t2.value() == 0) throw expression_error(expression_error::DIVIDE_BY_ZERO, t2.offset()); - push_token(result.configure_number(s64(t1.get_lval_value(m_symtable)) / s64(t2.value())).set_offset(t1, t2)); + push_token(result.configure_number(t1.get_lval_value(m_symtable) / t2.value()).set_offset(t1, t2)); t1.set_lval_value(m_symtable, result.value()); break; @@ -2062,7 +2062,7 @@ u64 parsed_expression::execute_tokens() pop_token_rval(t2); pop_token_lval(t1); if (t2.value() == 0) throw expression_error(expression_error::DIVIDE_BY_ZERO, t2.offset()); - push_token(result.configure_number(s64(t1.get_lval_value(m_symtable)) % s64(t2.value())).set_offset(t1, t2)); + push_token(result.configure_number(t1.get_lval_value(m_symtable) % t2.value()).set_offset(t1, t2)); t1.set_lval_value(m_symtable, result.value()); break; @@ -2086,7 +2086,7 @@ u64 parsed_expression::execute_tokens() case TVL_ASSIGNRSHIFT: pop_token_rval(t2); pop_token_lval(t1); - push_token(result.configure_number(s64(t1.get_lval_value(m_symtable)) >> t2.value()).set_offset(t1, t2)); + push_token(result.configure_number(t1.get_lval_value(m_symtable) >> t2.value()).set_offset(t1, t2)); t1.set_lval_value(m_symtable, result.value()); break; |