680x0: Improve disassembly for various FMOVE forms [R. Belmont]

This commit is contained in:
R. Belmont 2010-03-11 05:23:24 +00:00
parent dfff696a55
commit 4c0a6f40e7

View File

@ -1697,6 +1697,10 @@ static void d68040_fpu(void)
{ {
".l", ".s", ".x", ".p", ".w", ".d", ".b", ".?" ".l", ".s", ".x", ".p", ".w", ".d", ".b", ".?"
}; };
const char *spec_reg[8] =
{
"?", "FPIAR", "FPSR", "?", "FPCR", "?", "?", "?"
};
char mnemonic[40]; char mnemonic[40];
UINT32 w2, src, dst_reg; UINT32 w2, src, dst_reg;
@ -1783,21 +1787,88 @@ static void d68040_fpu(void)
case 0x3: 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; break;
} }
case 0x4: case 0x4: // ea to control
case 0x5:
{ {
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; break;
} }
case 0x6: case 0x5: // control to ea
case 0x7:
{ {
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<<i))
{
if ((w2>>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<<i))
{
if ((w2>>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; break;
} }