summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/emu/cpu/m68000/m68kfpu.c37
1 files changed, 29 insertions, 8 deletions
diff --git a/src/emu/cpu/m68000/m68kfpu.c b/src/emu/cpu/m68000/m68kfpu.c
index 16211127d90..c0abca10a39 100644
--- a/src/emu/cpu/m68000/m68kfpu.c
+++ b/src/emu/cpu/m68000/m68kfpu.c
@@ -1779,8 +1779,22 @@ void m68040_fpu_op0(m68ki_cpu_core *m68k)
}
}
-static void perform_fsave(m68ki_cpu_core *m68k, UINT32 addr, int inc)
+static int perform_fsave(m68ki_cpu_core *m68k, UINT32 addr, int inc)
{
+ if(m68k->cpu_type & CPU_TYPE_040)
+ {
+ if(inc)
+ {
+ m68ki_write_32(m68k, addr, 0x41000000);
+ return 4;
+ }
+ else
+ {
+ m68ki_write_32(m68k, addr-4, 0x41000000);
+ return -4;
+ }
+ }
+
if (inc)
{
// 68881 IDLE, version 0x1f
@@ -1791,16 +1805,18 @@ static void perform_fsave(m68ki_cpu_core *m68k, UINT32 addr, int inc)
m68ki_write_32(m68k, addr+16, 0);
m68ki_write_32(m68k, addr+20, 0);
m68ki_write_32(m68k, addr+24, 0x70000000);
+ return 7*4;
}
else
{
- m68ki_write_32(m68k, addr, 0x70000000);
- m68ki_write_32(m68k, addr-4, 0);
+ m68ki_write_32(m68k, addr-4, 0x70000000);
m68ki_write_32(m68k, addr-8, 0);
m68ki_write_32(m68k, addr-12, 0);
m68ki_write_32(m68k, addr-16, 0);
m68ki_write_32(m68k, addr-20, 0);
- m68ki_write_32(m68k, addr-24, 0x1f180000);
+ m68ki_write_32(m68k, addr-24, 0);
+ m68ki_write_32(m68k, addr-28, 0x1f180000);
+ return -7*4;
}
}
@@ -1832,14 +1848,15 @@ static void m68040_do_fsave(m68ki_cpu_core *m68k, UINT32 addr, int reg, int inc)
else
{
// we normally generate an IDLE frame
+ int delta = perform_fsave(m68k, addr, inc);
if(reg != -1)
- REG_A(m68k)[reg] += inc ? 6*4 : -6*4;
- perform_fsave(m68k, addr, inc);
+ REG_A(m68k)[reg] += delta;
}
}
static void m68040_do_frestore(m68ki_cpu_core *m68k, UINT32 addr, int reg)
{
+ bool m40 = m68k->cpu_type & CPU_TYPE_040;
UINT32 temp = m68ki_read_32(m68k, addr);
// check for NULL frame
@@ -1851,9 +1868,13 @@ static void m68040_do_frestore(m68ki_cpu_core *m68k, UINT32 addr, int reg)
if (reg != -1)
{
// how about an IDLE frame?
- if ((temp & 0x00ff0000) == 0x00180000)
+ if (!m40 && ((temp & 0x00ff0000) == 0x00180000))
+ {
+ REG_A(m68k)[reg] += 7*4;
+ }
+ else if (m40 && ((temp & 0xffff0000) == 0x41000000))
{
- REG_A(m68k)[reg] += 6*4;
+ REG_A(m68k)[reg] += 4;
} // check UNIMP
else if ((temp & 0x00ff0000) == 0x00380000)
{