+static void d68040_fpu(void)\r
+{\r
+ char float_data_format[8][3] =\r
+ {\r
+ ".l", ".s", ".x", ".p", ".w", ".d", ".b", ".?"\r
+ };\r
+\r
+ char mnemonic[40];\r
+ uint w2, src, dst_reg;\r
+ LIMIT_CPU_TYPES(M68040_PLUS);\r
+ w2 = read_imm_16();\r
+\r
+ src = (w2 >> 10) & 0x7;\r
+ dst_reg = (w2 >> 7) & 0x7;\r
+\r
+ switch ((w2 >> 13) & 0x7)\r
+ {\r
+ case 0x0:\r
+ case 0x2:\r
+ {\r
+ switch(w2 & 0x7f)\r
+ {\r
+ case 0x00: sprintf(mnemonic, "fmove"); break;\r
+ case 0x01: sprintf(mnemonic, "fint"); break;\r
+ case 0x02: sprintf(mnemonic, "fsinh"); break;\r
+ case 0x03: sprintf(mnemonic, "fintrz"); break;\r
+ case 0x04: sprintf(mnemonic, "fsqrt"); break;\r
+ case 0x06: sprintf(mnemonic, "flognp1"); break;\r
+ case 0x08: sprintf(mnemonic, "fetoxm1"); break;\r
+ case 0x09: sprintf(mnemonic, "ftanh1"); break;\r
+ case 0x0a: sprintf(mnemonic, "fatan"); break;\r
+ case 0x0c: sprintf(mnemonic, "fasin"); break;\r
+ case 0x0d: sprintf(mnemonic, "fatanh"); break;\r
+ case 0x0e: sprintf(mnemonic, "fsin"); break;\r
+ case 0x0f: sprintf(mnemonic, "ftan"); break;\r
+ case 0x10: sprintf(mnemonic, "fetox"); break;\r
+ case 0x11: sprintf(mnemonic, "ftwotox"); break;\r
+ case 0x12: sprintf(mnemonic, "ftentox"); break;\r
+ case 0x14: sprintf(mnemonic, "flogn"); break;\r
+ case 0x15: sprintf(mnemonic, "flog10"); break;\r
+ case 0x16: sprintf(mnemonic, "flog2"); break;\r
+ case 0x18: sprintf(mnemonic, "fabs"); break;\r
+ case 0x19: sprintf(mnemonic, "fcosh"); break;\r
+ case 0x1a: sprintf(mnemonic, "fneg"); break;\r
+ case 0x1c: sprintf(mnemonic, "facos"); break;\r
+ case 0x1d: sprintf(mnemonic, "fcos"); break;\r
+ case 0x1e: sprintf(mnemonic, "fgetexp"); break;\r
+ case 0x1f: sprintf(mnemonic, "fgetman"); break;\r
+ case 0x20: sprintf(mnemonic, "fdiv"); break;\r
+ case 0x21: sprintf(mnemonic, "fmod"); break;\r
+ case 0x22: sprintf(mnemonic, "fadd"); break;\r
+ case 0x23: sprintf(mnemonic, "fmul"); break;\r
+ case 0x24: sprintf(mnemonic, "fsgldiv"); break;\r
+ case 0x25: sprintf(mnemonic, "frem"); break;\r
+ case 0x26: sprintf(mnemonic, "fscale"); break;\r
+ case 0x27: sprintf(mnemonic, "fsglmul"); break;\r
+ case 0x28: sprintf(mnemonic, "fsub"); break;\r
+ case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37:\r
+ sprintf(mnemonic, "fsincos"); break;\r
+ case 0x38: sprintf(mnemonic, "fcmp"); break;\r
+ case 0x3a: sprintf(mnemonic, "ftst"); break;\r
+ case 0x41: sprintf(mnemonic, "fssqrt"); break;\r
+ case 0x45: sprintf(mnemonic, "fdsqrt"); break;\r
+ case 0x58: sprintf(mnemonic, "fsabs"); break;\r
+ case 0x5a: sprintf(mnemonic, "fsneg"); break;\r
+ case 0x5c: sprintf(mnemonic, "fdabs"); break;\r
+ case 0x5e: sprintf(mnemonic, "fdneg"); break;\r
+ case 0x60: sprintf(mnemonic, "fsdiv"); break;\r
+ case 0x62: sprintf(mnemonic, "fsadd"); break;\r
+ case 0x63: sprintf(mnemonic, "fsmul"); break;\r
+ case 0x64: sprintf(mnemonic, "fddiv"); break;\r
+ case 0x66: sprintf(mnemonic, "fdadd"); break;\r
+ case 0x67: sprintf(mnemonic, "fdmul"); break;\r
+ case 0x68: sprintf(mnemonic, "fssub"); break;\r
+ case 0x6c: sprintf(mnemonic, "fdsub"); break;\r
+\r
+ default: sprintf(mnemonic, "FPU (?)"); break;\r
+ }\r
+\r
+ if (w2 & 0x4000)\r
+ {\r
+ sprintf(g_dasm_str, "%s%s %s, FP%d", mnemonic, float_data_format[src], get_ea_mode_str_32(g_cpu_ir), dst_reg);\r
+ }\r
+ else\r
+ {\r
+ sprintf(g_dasm_str, "%s.x FP%d, FP%d", mnemonic, src, dst_reg);\r
+ }\r
+ break;\r
+ }\r
+\r
+ case 0x3:\r
+ {\r
+ sprintf(g_dasm_str, "fmove /todo");\r
+ break;\r
+ }\r
+\r
+ case 0x4:\r
+ case 0x5:\r
+ {\r
+ sprintf(g_dasm_str, "fmove /todo");\r
+ break;\r
+ }\r
+\r
+ case 0x6:\r
+ case 0x7:\r
+ {\r
+ sprintf(g_dasm_str, "fmovem /todo");\r
+ break;\r
+ }\r
+\r
+ default:\r
+ {\r
+ sprintf(g_dasm_str, "FPU (?) ");\r
+ break;\r
+ }\r
+ }\r
+}\r
+\r