From 092798b52fba14c3d738ca729b58af573c5a8e78 Mon Sep 17 00:00:00 2001 From: cracyc Date: Sat, 21 Dec 2019 15:05:42 -0600 Subject: i8087: save pointers in env (nw) --- src/devices/cpu/i386/x87ops.hxx | 65 ++++++++++++++++++++++++++++++++--------- src/devices/machine/i8087.cpp | 24 +++++++++++++-- 2 files changed, 74 insertions(+), 15 deletions(-) diff --git a/src/devices/cpu/i386/x87ops.hxx b/src/devices/cpu/i386/x87ops.hxx index c9503732784..ba2c97247af 100644 --- a/src/devices/cpu/i386/x87ops.hxx +++ b/src/devices/cpu/i386/x87ops.hxx @@ -4708,20 +4708,59 @@ void i386_device::x87_fldenv(uint8_t modrm) if (x87_mf_fault()) return; uint32_t ea = Getx87EA(modrm, 0); + uint32_t temp; - if (m_operand_size) - { - // 32-bit real/protected mode - x87_write_cw(READ16(ea)); - m_x87_sw = READ16(ea + 4); - m_x87_tw = READ16(ea + 8); - } - else + switch(((PROTECTED_MODE && !V8086_MODE) ? 1 : 0) | (m_operand_size & 1)<<1) { - // 16-bit real/protected mode - x87_write_cw(READ16(ea)); - m_x87_sw = READ16(ea + 2); - m_x87_tw = READ16(ea + 4); + case 0: // 16-bit real mode + x87_write_cw(READ16(ea)); + m_x87_sw = READ16(ea + 2); + m_x87_tw = READ16(ea + 4); + m_x87_inst_ptr = READ16(ea + 6); + temp = READ16(ea + 8); + m_x87_opcode = temp & 0x7ff; + m_x87_inst_ptr |= ((temp & 0xf000) << 4); + m_x87_data_ptr = READ16(ea + 10) | ((READ16(ea + 12) & 0xf000) << 4); + m_x87_cs = 0; + m_x87_ds = 0; + ea += 14; + break; + case 1: // 16-bit protected mode + x87_write_cw(READ16(ea)); + m_x87_sw = READ16(ea + 2); + m_x87_tw = READ16(ea + 4); + m_x87_inst_ptr = READ16(ea + 6); + m_x87_opcode = 0; + m_x87_cs = READ16(ea + 8); + m_x87_data_ptr = READ16(ea + 10); + m_x87_ds = READ16(ea + 12); + ea += 14; + break; + case 2: // 32-bit real mode + x87_write_cw(READ16(ea)); + m_x87_sw = READ16(ea + 4); + m_x87_tw = READ16(ea + 8); + m_x87_inst_ptr = READ16(ea + 12); + temp = READ32(ea + 16); + m_x87_opcode = temp & 0x7ff; + m_x87_inst_ptr |= ((temp & 0xffff000) << 4); + m_x87_data_ptr = READ16(ea + 20) | ((READ32(ea + 24) & 0xffff000) << 4); + m_x87_cs = 0; + m_x87_ds = 0; + ea += 28; + break; + case 3: // 32-bit protected mode + x87_write_cw(READ16(ea)); + m_x87_sw = READ16(ea + 4); + m_x87_tw = READ16(ea + 8); + m_x87_inst_ptr = READ32(ea + 12); + temp = READ32(ea + 16); + m_x87_opcode = (temp >> 16) & 0x7ff; + m_x87_cs = temp & 0xffff; + m_x87_data_ptr = READ32(ea + 20); + m_x87_ds = READ16(ea + 24); + ea += 28; + break; } x87_check_exceptions(); @@ -4836,7 +4875,7 @@ void i386_device::x87_frstor(uint8_t modrm) if (x87_mf_fault()) return; uint32_t ea = GetEA(modrm, 0); - uint32 temp; + uint32_t temp; switch(((PROTECTED_MODE && !V8086_MODE) ? 1 : 0) | (m_operand_size & 1)<<1) { diff --git a/src/devices/machine/i8087.cpp b/src/devices/machine/i8087.cpp index fd942656885..f0c96cadd3a 100644 --- a/src/devices/machine/i8087.cpp +++ b/src/devices/machine/i8087.cpp @@ -261,7 +261,8 @@ void i8087_device::execute() WRITE32_MEMBER(i8087_device::insn_w) { - m_ppc = m_pc = data; + m_ppc = m_pc; + m_pc = data; } WRITE32_MEMBER(i8087_device::addr_w) @@ -4185,12 +4186,17 @@ void i8087_device::fstcw(u8 modrm) void i8087_device::fldenv(u8 modrm) { - // TODO: Pointers and selectors u32 ea = m_ea; + u16 temp; write_cw(READ16(ea)); m_sw = READ16(ea + 2); m_tw = READ16(ea + 4); + m_ppc = READ16(ea + 6); + temp = READ16(ea + 8); + m_opcode = temp & 0x7ff; + m_ppc |= ((temp & 0xf000) << 4); + m_ea = READ16(ea + 10) | ((READ16(ea + 12) & 0xf000) << 4); check_exceptions(); @@ -4205,6 +4211,10 @@ void i8087_device::fstenv(u8 modrm) WRITE16(ea + 0, m_cw); WRITE16(ea + 2, m_sw); WRITE16(ea + 4, m_tw); + WRITE16(ea + 6, m_ppc & 0xffff); + WRITE16(ea + 8, (m_opcode & 0x07ff) | ((m_ppc & 0x0f0000) >> 4)); + WRITE16(ea + 10, m_ea & 0xffff); + WRITE16(ea + 12, (m_ea & 0x0f0000) >> 4); CYCLES(67); } @@ -4215,6 +4225,10 @@ void i8087_device::fsave(u8 modrm) WRITE16(ea + 0, m_cw); WRITE16(ea + 2, m_sw); WRITE16(ea + 4, m_tw); + WRITE16(ea + 6, m_ppc & 0xffff); + WRITE16(ea + 8, (m_opcode & 0x07ff) | ((m_ppc & 0x0f0000) >> 4)); + WRITE16(ea + 10, m_ea & 0xffff); + WRITE16(ea + 12, (m_ea & 0x0f0000) >> 4); for (int i = 0; i < 8; ++i) WRITE80(ea + i*10, ST(i)); @@ -4225,10 +4239,16 @@ void i8087_device::fsave(u8 modrm) void i8087_device::frstor(u8 modrm) { u32 ea = m_ea; + u16 temp; write_cw(READ16(ea)); m_sw = READ16(ea + 2); m_tw = READ16(ea + 4); + m_ppc = READ16(ea + 6); + temp = READ16(ea + 8); + m_opcode = temp & 0x7ff; + m_ppc |= ((temp & 0xf000) << 4); + m_ea = READ16(ea + 10) | ((READ16(ea + 12) & 0xf000) << 4); for (int i = 0; i < 8; ++i) write_stack(i, READ80(ea + i*10), false); -- cgit v1.2.3