sync (nw)

This commit is contained in:
Olivier Galibert 2012-02-16 05:38:17 +00:00
parent 431af6c164
commit e6dad37593

View File

@ -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) if (inc)
{ {
// 68881 IDLE, version 0x1f // 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+16, 0);
m68ki_write_32(m68k, addr+20, 0); m68ki_write_32(m68k, addr+20, 0);
m68ki_write_32(m68k, addr+24, 0x70000000); m68ki_write_32(m68k, addr+24, 0x70000000);
return 7*4;
} }
else else
{ {
m68ki_write_32(m68k, addr, 0x70000000); m68ki_write_32(m68k, addr-4, 0x70000000);
m68ki_write_32(m68k, addr-4, 0);
m68ki_write_32(m68k, addr-8, 0); m68ki_write_32(m68k, addr-8, 0);
m68ki_write_32(m68k, addr-12, 0); m68ki_write_32(m68k, addr-12, 0);
m68ki_write_32(m68k, addr-16, 0); m68ki_write_32(m68k, addr-16, 0);
m68ki_write_32(m68k, addr-20, 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 else
{ {
// we normally generate an IDLE frame // we normally generate an IDLE frame
int delta = perform_fsave(m68k, addr, inc);
if(reg != -1) if(reg != -1)
REG_A(m68k)[reg] += inc ? 6*4 : -6*4; REG_A(m68k)[reg] += delta;
perform_fsave(m68k, addr, inc);
} }
} }
static void m68040_do_frestore(m68ki_cpu_core *m68k, UINT32 addr, int reg) 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); UINT32 temp = m68ki_read_32(m68k, addr);
// check for NULL frame // check for NULL frame
@ -1851,9 +1868,13 @@ static void m68040_do_frestore(m68ki_cpu_core *m68k, UINT32 addr, int reg)
if (reg != -1) if (reg != -1)
{ {
// how about an IDLE frame? // how about an IDLE frame?
if ((temp & 0x00ff0000) == 0x00180000) if (!m40 && ((temp & 0x00ff0000) == 0x00180000))
{ {
REG_A(m68k)[reg] += 6*4; REG_A(m68k)[reg] += 7*4;
}
else if (m40 && ((temp & 0xffff0000) == 0x41000000))
{
REG_A(m68k)[reg] += 4;
} // check UNIMP } // check UNIMP
else if ((temp & 0x00ff0000) == 0x00380000) else if ((temp & 0x00ff0000) == 0x00380000)
{ {