summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu
diff options
context:
space:
mode:
author cracyc <cracyc@users.noreply.github.com>2019-12-21 15:05:42 -0600
committer cracyc <cracyc@users.noreply.github.com>2019-12-21 15:05:42 -0600
commit092798b52fba14c3d738ca729b58af573c5a8e78 (patch)
tree7fb0922a432886d8b91cde715291a963809a9255 /src/devices/cpu
parentd58fe33e0e8db4a0dc660e761bd81521519fb84a (diff)
i8087: save pointers in env (nw)
Diffstat (limited to 'src/devices/cpu')
-rw-r--r--src/devices/cpu/i386/x87ops.hxx65
1 files changed, 52 insertions, 13 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)
{