From a104f5f494dd363c707768dbdb8943ffe3e1704e Mon Sep 17 00:00:00 2001 From: AJR Date: Thu, 30 Mar 2023 22:30:08 -0400 Subject: powerpc: Minor disassembly improvements - Support over & out debugging flags for a few more instructions - Provide special operand format for POWER svc instruction --- src/devices/cpu/powerpc/ppc_dasm.cpp | 19 +++++++++++++++---- src/devices/cpu/powerpc/ppc_dasm.h | 3 ++- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/devices/cpu/powerpc/ppc_dasm.cpp b/src/devices/cpu/powerpc/ppc_dasm.cpp index fb8b2a955b8..e3409d65daf 100644 --- a/src/devices/cpu/powerpc/ppc_dasm.cpp +++ b/src/devices/cpu/powerpc/ppc_dasm.cpp @@ -238,9 +238,9 @@ const powerpc_disassembler::IDESCR powerpc_disassembler::itab[] = { "oris", D_OP(25), M_RT|M_RA|M_UIMM, F_RA_RT_UIMM, 0, I_POWERPC }, { "oriu", D_OP(25), M_RT|M_RA|M_UIMM, F_RA_RT_UIMM, 0, I_POWER }, { "rac", D_OP(31)|D_XO(818), M_RT|M_RA|M_RB|M_RC, F_RT_RA_0_RB, FL_RC, I_POWER }, - { "rfi", D_OP(19)|D_XO(50), 0, F_NONE, 0, I_COMMON }, - { "rfci", D_OP(19)|D_XO(51), 0, F_NONE, 0, I_POWERPC }, - { "rfsvc", D_OP(19)|D_XO(82), M_LK, F_NONE, FL_LK, I_POWER }, + { "rfi", D_OP(19)|D_XO(50), 0, F_NONE, FL_SO, I_COMMON }, + { "rfci", D_OP(19)|D_XO(51), 0, F_NONE, FL_SO, I_POWERPC }, + { "rfsvc", D_OP(19)|D_XO(82), M_LK, F_NONE, FL_LK|FL_SO, I_POWER }, { "rlimi", D_OP(20), M_RT|M_RA|M_SH|M_MB|M_ME|M_RC, F_RA_RT_SH_MB_ME, FL_RC, I_POWER }, { "rlinm", D_OP(21), M_RT|M_RA|M_SH|M_MB|M_ME|M_RC, F_RA_RT_SH_MB_ME, FL_RC, I_POWER }, { "rlmi", D_OP(22), M_RT|M_RA|M_RB|M_MB|M_ME|M_RC, F_RA_RT_RB_MB_ME, FL_RC, I_POWER }, @@ -319,7 +319,7 @@ const powerpc_disassembler::IDESCR powerpc_disassembler::itab[] = { "subfic", D_OP(8), M_RT|M_RA|M_SIMM, F_RT_RA_SIMM, 0, I_POWERPC }, { "subfme", D_OP(31)|D_XO(232), M_RT|M_RA|M_OE|M_RC, F_RT_RA, FL_OE|FL_RC, I_POWERPC }, { "subfze", D_OP(31)|D_XO(200), M_RT|M_RA|M_OE|M_RC, F_RT_RA, FL_OE|FL_RC, I_POWERPC }, - { "svc", D_OP(17)|2, M_BD|M_AA|M_LK, F_NONE, FL_AA|FL_LK, I_POWER }, // TODO: operands + { "svc", D_OP(17)|2, M_BD|M_AA|M_LK, F_SC, FL_AA|FL_LK, I_POWER }, { "sync", D_OP(31)|D_XO(598), 0, F_NONE, 0, I_POWERPC }, { "t", D_OP(31)|D_XO(4), M_TO|M_RA|M_RB, F_TW, 0, I_POWER }, { "ti", D_OP(3), M_TO|M_RA|M_SIMM, F_TWI, 0, I_POWER }, @@ -1089,7 +1089,18 @@ offs_t powerpc_disassembler::dasm_one(std::ostream &stream, uint32_t pc, uint32_ oprs = util::string_format("%d,r%d,%s", G_TO(op), G_RA(op), signed16); break; + case F_SC: + if (op & M_AA) + oprs = util::string_format("0x%04X", (op & 0x0000fffc) >> 2); + else + oprs = util::string_format("%d,%d,%d", (op & 0x00000fe0) >> 5, (op & 0x0000f000) >> 12, (op & 0x0000001c) >> 2); + break; + case F_NONE: + if ((op >> 26) == 17) // SC (PowerPC) + flags |= STEP_OVER; + [[fallthrough]]; + default: break; } diff --git a/src/devices/cpu/powerpc/ppc_dasm.h b/src/devices/cpu/powerpc/ppc_dasm.h index e3c34a57067..6aad80c62d2 100644 --- a/src/devices/cpu/powerpc/ppc_dasm.h +++ b/src/devices/cpu/powerpc/ppc_dasm.h @@ -102,7 +102,8 @@ private: F_FRT_FRA_FRC, // frT, frA, frC F_RA_RT_SH_MB_ME, // rA, rT, SH, MB, ME F_RA_RT_RB_MB_ME, // rA, rT, rB, MB, ME - F_RT_RB // rT, rB + F_RT_RB, // rT, rB + F_SC // LEV, FL1, FL2 or SV only used by SVC (POWER) }; /* -- cgit v1.2.3