From 372a4b8d3435032d4d554e7e4a4366fa88c4c086 Mon Sep 17 00:00:00 2001 From: yz70s Date: Mon, 15 Jan 2024 23:23:48 +0100 Subject: [PATCH] i386: in the cpu state view show the flags of the x87 status words and some of CR0 add constants for the bits in the CRx registers and start using them --- src/devices/cpu/i386/i386.cpp | 64 ++++++++++++++++++++++++++++++-- src/devices/cpu/i386/i386.h | 40 ++++++++++++++++++++ src/devices/cpu/i386/i386ops.hxx | 2 +- src/devices/cpu/i386/i486ops.hxx | 2 +- src/devices/cpu/i386/pentops.hxx | 4 +- 5 files changed, 104 insertions(+), 8 deletions(-) diff --git a/src/devices/cpu/i386/i386.cpp b/src/devices/cpu/i386/i386.cpp index 5f03d5347c8..582afb8d8ac 100644 --- a/src/devices/cpu/i386/i386.cpp +++ b/src/devices/cpu/i386/i386.cpp @@ -2114,7 +2114,7 @@ void i386_device::register_state_i386() state_add( I386_GS_BASE, "GSBASE", m_sreg[GS].base).formatstr("%08X"); state_add( I386_GS_LIMIT, "GSLIMIT", m_sreg[GS].limit).formatstr("%08X"); state_add( I386_GS_FLAGS, "GSFLAGS", m_sreg[GS].flags).mask(0xf0ff).formatstr("%04X"); - state_add( I386_CR0, "CR0", m_cr[0]).formatstr("%08X"); + state_add( I386_CR0, "CR0", m_debugger_temp).formatstr("%32s"); state_add( I386_CR1, "CR1", m_cr[1]).formatstr("%08X"); state_add( I386_CR2, "CR2", m_cr[2]).formatstr("%08X"); state_add( I386_CR3, "CR3", m_cr[3]).formatstr("%08X"); @@ -2152,9 +2152,9 @@ void i386_device::register_state_i386_x87() { register_state_i386(); - state_add( X87_CTRL, "x87_CW", m_x87_cw).formatstr("%04X"); - state_add( X87_STATUS, "x87_SW", m_x87_sw).formatstr("%04X"); - state_add( X87_TAG, "x87_TAG", m_x87_tw).formatstr("%04X"); + state_add( X87_CTRL, "x87_CW", m_debugger_temp).formatstr("%32s"); + state_add( X87_STATUS, "x87_SW", m_debugger_temp).formatstr("%32s"); + state_add( X87_TAG, "x87_TAG", m_debugger_temp).formatstr("%32s"); state_add( X87_ST0, "ST0", m_debugger_temp ).callexport().formatstr("%15s"); state_add( X87_ST1, "ST1", m_debugger_temp ).callexport().formatstr("%15s"); state_add( X87_ST2, "ST2", m_debugger_temp ).callexport().formatstr("%15s"); @@ -2248,6 +2248,8 @@ void i386_device::state_export(const device_state_entry &entry) void i386_device::state_string_export(const device_state_entry &entry, std::string &str) const { + static const char tf[] = { 'V', '0', 'S', 'E' }; + switch (entry.index()) { case STATE_GENFLAGS: @@ -2266,6 +2268,60 @@ void i386_device::state_string_export(const device_state_entry &entry, std::stri m_PF ? " P" : " p", m_CF ? " C" : " c"); break; + case I386_CR0: + str = string_format("%08X %s%s%s%s%s%s%s%s", + m_cr[0], + m_cr[0] & CR0_PG ? "PG" : "pg", + m_cr[0] & CR0_WP ? " WP" : " wp", + m_cr[0] & CR0_NE ? " NE" : " ne", + m_cr[0] & CR0_ET ? " ET" : " et", + m_cr[0] & CR0_TS ? " TS" : " ts", + m_cr[0] & CR0_EM ? " EM" : " em", + m_cr[0] & CR0_MP ? " MP" : " mp", + m_cr[0] & CR0_PE ? " PE" : " pe"); + break; + case X87_CTRL: + str = string_format("%04X %d %d %s%s%s%s%s%s", + m_x87_cw, + (m_x87_cw >> X87_CW_RC_SHIFT) & X87_CW_PC_MASK, + (m_x87_cw >> X87_CW_PC_SHIFT) & X87_CW_RC_MASK, + m_x87_cw & X87_CW_PM ? "P" : "p", + m_x87_cw & X87_CW_UM ? " U" : " u", + m_x87_cw & X87_CW_OM ? " O" : " o", + m_x87_cw & X87_CW_ZM ? " Z" : " z", + m_x87_cw & X87_CW_DM ? " D" : " d", + m_x87_cw & X87_CW_IM ? " I" : " i"); + break; + case X87_STATUS: + str = string_format("%04X %s %d %s%s%s%s%s%s%s%s", + m_x87_sw, + m_x87_sw & X87_SW_BUSY ? "B" : "b", + (m_x87_sw >> X87_SW_TOP_SHIFT) & X87_SW_TOP_MASK, + m_x87_sw &X87_SW_C3 ? "1" : "0", + m_x87_sw &X87_SW_C2 ? "1" : "0", + m_x87_sw &X87_SW_C1 ? "1" : "0", + m_x87_sw &X87_SW_C0 ? "1" : "0", + m_x87_sw & X87_SW_ES ? " E" : " e", + m_x87_sw & X87_SW_SF ? " S" : " s", + m_x87_sw & X87_SW_PE ? " P" : " p", + m_x87_sw & X87_SW_UE ? " U" : " u", + m_x87_sw & X87_SW_OE ? " O" : " o", + m_x87_sw & X87_SW_ZE ? " Z" : " z", + m_x87_sw & X87_SW_DE ? " D" : " d", + m_x87_sw & X87_SW_IE ? " I" : " i"); + break; + case X87_TAG: + str = string_format("%04X %c %c %c %c %c %c %c %c", + m_x87_tw, + tf[(m_x87_tw >> 0) & 3], + tf[(m_x87_tw >> 2) & 3], + tf[(m_x87_tw >> 4) & 3], + tf[(m_x87_tw >> 6) & 3], + tf[(m_x87_tw >> 8) & 3], + tf[(m_x87_tw >> 10) & 3], + tf[(m_x87_tw >> 12) & 3], + tf[(m_x87_tw >> 14) & 3]); + break; case X87_ST0: str = string_format("%f", fx80_to_double(ST(0))); break; diff --git a/src/devices/cpu/i386/i386.h b/src/devices/cpu/i386/i386.h index 51d01b805c4..31ed7887eae 100644 --- a/src/devices/cpu/i386/i386.h +++ b/src/devices/cpu/i386/i386.h @@ -227,6 +227,46 @@ protected: FF_SSE3 = 1 << 0, // SSE3 Extensions }; + enum CR0_BITS : uint32_t { + CR0_PG = (u32)1 << 31, // Paging + CR0_CD = 1 << 30, // Cache disable + CR0_NW = 1 << 29, // Not writethrough + CR0_AM = 1 << 18, // Alignment mask + CR0_WP = 1 << 16, // Write protect + CR0_NE = 1 << 5, // Numeric error + CR0_ET = 1 << 4, // Extension type + CR0_TS = 1 << 3, // Task switched + CR0_EM = 1 << 2, // Emulation + CR0_MP = 1 << 1, // Monitor copreocessor + CR0_PE = 1 << 0, // Protection enabled + }; + + enum CR3_BITS : uint32_t { + CR3_PCD = 1 << 4, + CR3_PWT = 1 << 3, + }; + + enum CR4_BITS : uint32_t { + CR4_SMAP = 1 << 21, + CR4_SMEP = 1 << 20, + CR4_OSXSAVE = 1 << 18, + CR4_PCIDE = 1 << 17, + CR4_FSGSBASE = 1 << 16, + CR4_SMXE = 1 << 14, + CR4_VMXE = 1 << 13, + CR4_OSXMMEXCPT = 1 << 10, + CR4_OSFXSR = 1 << 9, + CR4_PCE = 1 << 8, + CR4_PGE = 1 << 7, + CR4_MCE = 1 << 6, + CR4_PAE = 1 << 5, + CR4_PSE = 1 << 4, + CR4_DE = 1 << 3, + CR4_TSD = 1 << 2, + CR4_PVI = 1 << 1, + CR4_VME = 1 << 0, + }; + typedef void (i386_device::*i386_modrm_func)(uint8_t modrm); typedef void (i386_device::*i386_op_func)(); struct X86_OPCODE { diff --git a/src/devices/cpu/i386/i386ops.hxx b/src/devices/cpu/i386/i386ops.hxx index 3209ba9a823..9051dbbae84 100644 --- a/src/devices/cpu/i386/i386ops.hxx +++ b/src/devices/cpu/i386/i386ops.hxx @@ -2499,7 +2499,7 @@ void i386_device::i386_clts() // Opcode 0x0f 0x06 void i386_device::i386_wait() // Opcode 0x9B { - if ((m_cr[0] & 0xa) == 0xa) + if ((m_cr[0] & (CR0_TS | CR0_MP)) == (CR0_TS | CR0_MP)) { i386_trap(FAULT_NM, 0, 0); return; diff --git a/src/devices/cpu/i386/i486ops.hxx b/src/devices/cpu/i386/i486ops.hxx index d90c9aa59cb..f7b04c072a4 100644 --- a/src/devices/cpu/i386/i486ops.hxx +++ b/src/devices/cpu/i386/i486ops.hxx @@ -536,7 +536,7 @@ void i386_device::i486_mov_cr_r32() // Opcode 0x0f 22 void i386_device::i486_wait() { - if ((m_cr[0] & 0xa) == 0xa) + if ((m_cr[0] & (CR0_TS | CR0_MP)) == (CR0_TS | CR0_MP)) { i386_trap(FAULT_NM, 0, 0); return; diff --git a/src/devices/cpu/i386/pentops.hxx b/src/devices/cpu/i386/pentops.hxx index 2a2f4cb68f0..bd674334498 100644 --- a/src/devices/cpu/i386/pentops.hxx +++ b/src/devices/cpu/i386/pentops.hxx @@ -2801,7 +2801,7 @@ void i386_device::sse_group_0fae() // Opcode 0f ae uint32_t ea; switch ( (modm & 0x38) >> 3 ) { - case 0: // fxsave + case 0: // fxsave instruction { u8 atag = 0; ea = GetEA(modm, 1); @@ -2829,7 +2829,7 @@ void i386_device::sse_group_0fae() // Opcode 0f ae } break; } - case 1: + case 1: // fxrstor instruction { u8 atag; ea = GetEA(modm, 0);