mirror of
https://github.com/holub/mame
synced 2025-04-25 01:40:16 +03:00
i8087: save pointers in env (nw)
This commit is contained in:
parent
d58fe33e0e
commit
092798b52f
@ -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)
|
||||
switch(((PROTECTED_MODE && !V8086_MODE) ? 1 : 0) | (m_operand_size & 1)<<1)
|
||||
{
|
||||
// 32-bit real/protected mode
|
||||
x87_write_cw(READ16(ea));
|
||||
m_x87_sw = READ16(ea + 4);
|
||||
m_x87_tw = READ16(ea + 8);
|
||||
}
|
||||
else
|
||||
{
|
||||
// 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)
|
||||
{
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user