static void WRITE_EA_FPE(m68000_base_device *m68k, int ea, floatx80 fpr) { int mode = (ea >> 3) & 0x7; int reg = (ea & 0x7); switch (mode) { case 2: // (An) { UINT32 ea; ea = REG_A(m68k)[reg]; store_extended_float80(m68k, ea, fpr); break; } case 3: // (An)+ { UINT32 ea; ea = REG_A(m68k)[reg]; store_extended_float80(m68k, ea, fpr); REG_A(m68k)[reg] += 12; break; } case 4: // -(An) { UINT32 ea; REG_A(m68k)[reg] -= 12; ea = REG_A(m68k)[reg]; store_extended_float80(m68k, ea, fpr); break; } case 7: { switch (reg) { default: fatalerror("M68kFPU: WRITE_EA_FPE: unhandled mode %d, reg %d, at %08X\n", mode, reg, REG_PC(m68k)); } } default: fatalerror("M68kFPU: WRITE_EA_FPE: unhandled mode %d, reg %d, at %08X\n", mode, reg, REG_PC(m68k)); } }
static void fmovem(m68ki_cpu_core *m68k, UINT16 w2) { int i; int ea = m68k->ir & 0x3f; int dir = (w2 >> 13) & 0x1; int mode = (w2 >> 11) & 0x3; int reglist = w2 & 0xff; UINT32 mem_addr = 0; switch (ea >> 3) { case 5: // (d16, An) mem_addr= EA_AY_DI_32(m68k); break; case 6: // (An) + (Xn) + d8 mem_addr= EA_AY_IX_32(m68k); break; } if (dir) // From FP regs to mem { switch (mode) { case 1: // Dynamic register list, postincrement or control addressing mode. // FIXME: not really tested, but seems to work reglist = REG_D(m68k)[(reglist >> 4) & 7]; case 0: // Static register list, predecrement or control addressing mode { for (i=0; i < 8; i++) { if (reglist & (1 << i)) { switch (ea >> 3) { case 5: // (d16, An) case 6: // (An) + (Xn) + d8 store_extended_float80(m68k, mem_addr, REG_FP(m68k)[i]); mem_addr += 12; break; default: WRITE_EA_FPE(m68k, ea, REG_FP(m68k)[i]); break; } m68k->remaining_cycles -= 2; } } break; } case 2: // Static register list, postdecrement or control addressing mode { for (i=0; i < 8; i++) { if (reglist & (1 << i)) { switch (ea >> 3) { case 5: // (d16, An) case 6: // (An) + (Xn) + d8 store_extended_float80(m68k, mem_addr, REG_FP(m68k)[7-i]); mem_addr += 12; break; default: WRITE_EA_FPE(m68k, ea, REG_FP(m68k)[7-i]); break; } m68k->remaining_cycles -= 2; } } break; } default: fatalerror("M680x0: FMOVEM: mode %d unimplemented at %08X\n", mode, REG_PC(m68k)-4); } } else // From mem to FP regs { switch (mode)