static void fmove_reg_mem(m68ki_cpu_core *m68k, UINT16 w2) { int ea = m68k->ir & 0x3f; int src = (w2 >> 7) & 0x7; int dst = (w2 >> 10) & 0x7; //int kfactor = w2 & 0x7f; switch (dst) { case 0: // Long-Word Integer { INT32 d = (INT32)(REG_FP[src].f); WRITE_EA_32(m68k, ea, d); break; } case 1: // Single-precision Real { float f = (float)(REG_FP[src].f); UINT32 d = *(UINT32 *)&f; WRITE_EA_32(m68k, ea, d); break; } case 2: // Extended-precision Real { fatalerror("fmove_reg_mem: extended-precision real store unimplemented at %08X\n", REG_PC-4); break; } case 3: // Packed-decimal Real with Static K-factor { fatalerror("fmove_reg_mem: packed-decimal real store unimplemented at %08X\n", REG_PC-4); break; } case 4: // Word Integer { INT16 d = (INT16)(REG_FP[src].f); WRITE_EA_16(m68k, ea, d); break; } case 5: // Double-precision Real { UINT64 d = REG_FP[src].i; WRITE_EA_64(m68k, ea, d); break; } case 6: // Byte Integer { INT8 d = (INT16)(REG_FP[src].f); WRITE_EA_8(m68k, ea, d); break; } case 7: // Packed-decimal Real with Dynamic K-factor { fatalerror("fmove_reg_mem: packed-decimal real store unimplemented at %08X\n", REG_PC-4); break; } } m68k->remaining_cycles -= 12; }
static void fmove_reg_mem(m68000_base_device *m68k, UINT16 w2) { int ea = m68k->ir & 0x3f; int src = (w2 >> 7) & 0x7; int dst = (w2 >> 10) & 0x7; int k = (w2 & 0x7f); switch (dst) { case 0: // Long-Word Integer { INT32 d = (INT32)floatx80_to_int32(REG_FP(m68k)[src]); WRITE_EA_32(m68k, ea, d); break; } case 1: // Single-precision Real { UINT32 d = floatx80_to_float32(REG_FP(m68k)[src]); WRITE_EA_32(m68k, ea, d); break; } case 2: // Extended-precision Real { WRITE_EA_FPE(m68k, ea, REG_FP(m68k)[src]); break; } case 3: // Packed-decimal Real with Static K-factor { // sign-extend k k = (k & 0x40) ? (k | 0xffffff80) : (k & 0x7f); WRITE_EA_PACK(m68k, ea, k, REG_FP(m68k)[src]); break; } case 4: // Word Integer { int32 value = floatx80_to_int32(REG_FP(m68k)[src]); if (value > 0x7fff || value < -0x8000 ) { REG_FPSR(m68k) |= FPES_OE | FPAE_IOP; } WRITE_EA_16(m68k, ea, (INT16)value); break; } case 5: // Double-precision Real { UINT64 d; d = floatx80_to_float64(REG_FP(m68k)[src]); WRITE_EA_64(m68k, ea, d); break; } case 6: // Byte Integer { int32 value = floatx80_to_int32(REG_FP(m68k)[src]); if (value > 127 || value < -128) { REG_FPSR(m68k) |= FPES_OE | FPAE_IOP; } WRITE_EA_8(m68k, ea, (INT8) value); break; } case 7: // Packed-decimal Real with Dynamic K-factor { WRITE_EA_PACK(m68k, ea, REG_D(m68k)[k>>4], REG_FP(m68k)[src]); break; } } m68k->remaining_cycles -= 12; }