From 39beb6b62d60c49468d1a45445afeeeafbe82e68 Mon Sep 17 00:00:00 2001 From: Patrick Mackinlay Date: Thu, 4 Nov 2021 16:40:08 +0700 Subject: m68kfpu: bug fix for fmovem with empty register list --- src/devices/cpu/m68000/m68kfpu.cpp | 44 ++++++++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/src/devices/cpu/m68000/m68kfpu.cpp b/src/devices/cpu/m68000/m68kfpu.cpp index c265bf2b2f7..c62ee96e010 100644 --- a/src/devices/cpu/m68000/m68kfpu.cpp +++ b/src/devices/cpu/m68000/m68kfpu.cpp @@ -1860,19 +1860,27 @@ void m68000_base_device::fmovem(u16 w2) int di_mode = imode == 5; uint32 di_mode_ea = di_mode ? (REG_A()[reg] + MAKE_INT_16(m68ki_read_imm_16())) : 0; - for (i=0; i < 8; i++) + if (reglist) { - if (reglist & (1 << i)) + for (i=0; i < 8; i++) { - WRITE_EA_FPE(imode, reg, m_fpr[i], di_mode_ea); - if (di_mode) + if (reglist & (1 << i)) { - di_mode_ea += 12; - } + WRITE_EA_FPE(imode, reg, m_fpr[i], di_mode_ea); + if (di_mode) + { + di_mode_ea += 12; + } - m_icount -= 2; + m_icount -= 2; + } } } + else if (imode == 6) + // advance PC if the register list is empty + EA_AY_IX_32(); + else if (imode == 7) + fatalerror("m68881: fmovem addressing mode %d unimplemented at 0x%08x\n", imode, m_pc - 4); break; } @@ -1887,19 +1895,27 @@ void m68000_base_device::fmovem(u16 w2) int di_mode = (imode == 5); uint32 di_mode_ea = di_mode ? (REG_A()[reg] + MAKE_INT_16(m68ki_read_imm_16())) : 0; - for (i=0; i < 8; i++) + if (reglist) { - if (reglist & (1 << i)) + for (i=0; i < 8; i++) { - WRITE_EA_FPE(imode, reg, m_fpr[7 - i], di_mode_ea); - if (di_mode) + if (reglist & (1 << i)) { - di_mode_ea += 12; - } + WRITE_EA_FPE(imode, reg, m_fpr[7 - i], di_mode_ea); + if (di_mode) + { + di_mode_ea += 12; + } - m_icount -= 2; + m_icount -= 2; + } } } + else if (imode == 6) + // advance PC if the register list is empty + EA_AY_IX_32(); + else if (imode == 7) + fatalerror("m68881: fmovem addressing mode %d unimplemented at 0x%08x\n", imode, m_pc - 4); break; } -- cgit v1.2.3