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)
{
// 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] += 6*4;
REG_A(m68k)[reg] += 7*4;
}
else if (m40 && ((temp & 0xffff0000) == 0x41000000))
{
REG_A(m68k)[reg] += 4;
} // check UNIMP
else if ((temp & 0x00ff0000) == 0x00380000)
{