diff options
author | 2012-02-16 05:38:17 +0000 | |
---|---|---|
committer | 2012-02-16 05:38:17 +0000 | |
commit | e6dad3759374373e3ce69a76869f16e83ba74df5 (patch) | |
tree | dbe85b5622010cf0f2f1a5ab7827c5d0e9d51851 /src | |
parent | 431af6c1645bfa4a800b2e625ea088562b40053a (diff) |
sync (nw)
Diffstat (limited to 'src')
-rw-r--r-- | src/emu/cpu/m68000/m68kfpu.c | 37 |
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) { |