diff --git a/src/emu/cpu/m68000/m68kdasm.c b/src/emu/cpu/m68000/m68kdasm.c index 662f0988957..77dd53d8357 100644 --- a/src/emu/cpu/m68000/m68kdasm.c +++ b/src/emu/cpu/m68000/m68kdasm.c @@ -1697,6 +1697,10 @@ static void d68040_fpu(void) { ".l", ".s", ".x", ".p", ".w", ".d", ".b", ".?" }; + const char *spec_reg[8] = + { + "?", "FPIAR", "FPSR", "?", "FPCR", "?", "?", "?" + }; char mnemonic[40]; UINT32 w2, src, dst_reg; @@ -1783,21 +1787,88 @@ static void d68040_fpu(void) case 0x3: { - sprintf(g_dasm_str, "fmove /todo"); + sprintf(g_dasm_str, "fmove FP%d, %s", dst_reg, get_ea_mode_str_32(g_cpu_ir)); break; } - case 0x4: - case 0x5: + case 0x4: // ea to control { - sprintf(g_dasm_str, "fmove /todo"); + sprintf(g_dasm_str, "fmove.l %s, %s", get_ea_mode_str_32(g_cpu_ir), spec_reg[(w2>>10)&7]); break; } - case 0x6: - case 0x7: + case 0x5: // control to ea { - sprintf(g_dasm_str, "fmovem /todo"); + sprintf(g_dasm_str, "fmove.l %s, %s", spec_reg[(w2>>10)&7], get_ea_mode_str_32(g_cpu_ir)); + break; + } + + case 0x6: // memory to FPU, list + { + char temp[32]; + + if ((w2>>11) & 1) // dynamic register list + { + sprintf(g_dasm_str, "fmovem.x %s, D%d", get_ea_mode_str_32(g_cpu_ir), (w2>>4)&7); + } + else // static register list + { + int i; + + sprintf(g_dasm_str, "fmovem.x %s, ", get_ea_mode_str_32(g_cpu_ir)); + + for (i = 0; i < 8; i++) + { + if (w2 & (1<>12) & 1) // postincrement or control + { + sprintf(temp, "FP%d ", 7-i); + } + else // predecrement + { + sprintf(temp, "FP%d ", i); + } + strcat(g_dasm_str, temp); + } + } + } + break; + } + + case 0x7: // FPU to memory, list + { + char temp[32]; + + if ((w2>>11) & 1) // dynamic register list + { + sprintf(g_dasm_str, "fmovem.x D%d, %s", (w2>>4)&7, get_ea_mode_str_32(g_cpu_ir)); + } + else // static register list + { + int i; + + sprintf(g_dasm_str, "fmovem.x "); + + for (i = 0; i < 8; i++) + { + if (w2 & (1<>12) & 1) // postincrement or control + { + sprintf(temp, "FP%d ", 7-i); + } + else // predecrement + { + sprintf(temp, "FP%d ", i); + } + strcat(g_dasm_str, temp); + } + } + + strcat(g_dasm_str, ", "); + strcat(g_dasm_str, get_ea_mode_str_32(g_cpu_ir)); + } break; }