📄 disasm.c
字号:
int mask;
mask = (int)((uint16)cpu_read_data((ADDRESS)disasm_pc,16));
inc_disasm_pc(2);
if (opword & 0x0040)
{
/* long */
append_size(dstr,0x0002,1,TRUE);
}
else
{
/* word */
append_size(dstr,0x0002,2,TRUE);
}
if (opword & 0x0400)
{
/* memory to register */
append_ea(dstr,opword,5,isa[index].ea_mask);
append_string(dstr,",");
append_reg_list(mask,opword);
}
else
{
/* register to memory */
append_reg_list(mask,opword);
append_string(dstr,",");
append_ea(dstr,opword,5,isa[index].ea_mask);
}
}
/********************************************************************/
static void
func28 (int index, uint16 opword)
{
/* CMPA ADDA SUBA */
if (opword & 0x0100)
{
/* long */
append_size(dstr,0x0002,1,TRUE);
}
else
{
/* word */
append_size(dstr,0x0002,2,TRUE);
}
append_ea(dstr,opword,5,isa[index].ea_mask);
append_string(dstr,",");
append_register(dstr,opword,ADDRESS_REGISTER,11);
}
/********************************************************************/
static void
func29 (int index, uint16 opword)
{
/* SUBQ ADDQ */
int data;
data = ((opword & 0x0E00) >> 9);
if (data == 0)
data = 8;
append_size(dstr,opword,7,TRUE);
append_string(dstr,"#");
append_value(dstr,data,8);
append_string(dstr,",");
append_ea(dstr,opword,5,isa[index].ea_mask);
}
/********************************************************************/
#ifndef CPU_FAM_MCF5XXX
static void
func30 (int index, uint16 opword)
{
/* MOVES */
int opword2;
append_size(dstr,opword,7,TRUE);
opword2 = (int)((uint16)cpu_read_data((ADDRESS)disasm_pc,16));
inc_disasm_pc(2);
if (opword2 & 0x000800)
{
/* MOVES Rn,<ea> */
append_register(dstr,opword2,15,14);
append_string(dstr,",");
append_ea(dstr,opword,5,isa[index].ea_mask);
}
else
{
/* MOVES <ea>,Rn */
append_ea(dstr,opword,5,isa[index].ea_mask);
append_string(dstr,",");
append_register(dstr,opword2,15,14);
}
}
#endif /* CPU_FAM_MCF5XXX */
/********************************************************************/
static void
func31 (int index, uint16 opword)
{
/* AND OR EOR */
append_size(dstr,opword,7,TRUE);
append_register(dstr,opword,DATA_REGISTER,11);
append_string(dstr,",");
append_ea(dstr,opword,5,isa[index].ea_mask);
}
/********************************************************************/
static void
func32 (int index, uint16 opword)
{
/* LEA */
append_ea(dstr,opword,5,isa[index].ea_mask);
append_string(dstr,",");
append_register(dstr,opword,ADDRESS_REGISTER,11);
}
/********************************************************************/
static void
func33 (int index, uint16 opword)
{
/* SUB AND ADD OR CMP */
append_size(dstr,opword,7,TRUE);
append_ea(dstr,opword,5,isa[index].ea_mask);
append_string(dstr,",");
append_register(dstr,opword,DATA_REGISTER,11);
}
/********************************************************************/
static void
func34 (int index, uint16 opword)
{
/* LSL,LSR,ROL,ROR,ROXL,ROXR,ASL,ASR #<data> */
int data;
(void)index;
data = ((opword & 0x0E00) >> 9);
if (data == 0)
data = 8;
append_size(dstr,opword,7,TRUE);
append_string(dstr,"#");
append_value(dstr,data,8);
append_string(dstr,",");
append_register(dstr,opword,DATA_REGISTER,2);
}
/********************************************************************/
static void
func35 (int index, uint16 opword)
{
/* LSL,LSR,ROL,ROR,ROXL,ROXR,ASL,ASR Dx */
(void)index;
append_size(dstr,opword,7,TRUE);
append_register(dstr,opword,DATA_REGISTER,11);
append_string(dstr,",");
append_register(dstr,opword,DATA_REGISTER,2);
}
/********************************************************************/
static void
func36 (int index, uint16 opword)
{
/* MOVEC */
int opword2;
char buffer[9];
(void)index;
opword2 = (int)((uint16)cpu_read_data((ADDRESS)disasm_pc,16));
inc_disasm_pc(2);
if (opword & 0x0001)
{
append_register(dstr,opword2,15,14);
append_string(dstr,",");
}
switch (opword2 & 0x0FFF)
{
#if (defined(CPU_MCF5202) || defined(CPU_MCF5204) || defined(CPU_MCF5206))
case 0x002:
append_string(dstr,"CACR");
break;
case 0x004:
append_string(dstr,"ACR0");
break;
case 0x005:
append_string(dstr,"ACR1");
break;
#endif
#if (defined(CPU_FAM_MCF5XXX))
case 0x801:
append_string(dstr,"VBR");
break;
#endif
#if (defined(CPU_MCF5204) || defined(CPU_MCF5206))
case 0xC04:
append_string(dstr,"RAMBAR");
break;
case 0xC0F:
append_string(dstr,"MBAR");
break;
#endif
#if (defined(CPU_MC68010) || defined(CPU_MC68020) || defined(CPU_MC68030) || \
defined(CPU_MC68040) || defined(CPU_MC68EC040) || defined(CPU_CPU32))
case 0x000:
append_string(dstr,"SFC");
break;
case 0x001:
append_string(dstr,"DFC");
break;
case 0x800:
append_string(dstr,"USP");
break;
case 0x801:
append_string(dstr,"VBR");
break;
#endif
#if (defined(CPU_MC68020) || defined(CPU_MC68030) || defined(CPU_MC68040) || \
defined(CPU_MC68EC040))
case 0x002:
append_string(dstr,"CACR");
break;
case 0x802:
append_string(dstr,"CAAR");
break;
case 0x803:
append_string(dstr,"MSP");
break;
case 0x804:
append_string(dstr,"ISP");
break;
#endif
#if (defined(CPU_MC68040) || defined(CPU_MC68LC040))
case 0x003:
append_string(dstr,"TCR");
break;
case 0x004:
append_string(dstr,"ITT0");
break;
case 0x005:
append_string(dstr,"ITT1");
break;
case 0x006:
append_string(dstr,"DTT0");
break;
case 0x007:
append_string(dstr,"DTT1");
break;
case 0x805:
append_string(dstr,"MMUSR");
break;
case 0x806:
append_string(dstr,"URP");
break;
case 0x807:
append_string(dstr,"SRP");
break;
#endif
#ifdef CPU_MC68EC040
case 0x004:
append_string(dstr,"IACR0");
break;
case 0x005:
append_string(dstr,"IACR1");
break;
case 0x006:
append_string(dstr,"DACR0");
break;
case 0x007:
append_string(dstr,"DACR1");
break;
#endif
default:
sprintf(buffer,"Rc%03X",opword2);
append_string(dstr,buffer);
break;
}
if (!(opword & 0x0001))
{
append_string(dstr,",");
append_register(dstr,opword2,15,14);
}
}
/********************************************************************/
#ifdef CPU_FAM_MCF5XXX
static void
func37 (int index, uint16 opword)
{
/* WDEBUG */
int opword2;
opword2 = (int)((uint16)cpu_read_data((ADDRESS)disasm_pc,16));
inc_disasm_pc(2);
if (opword2 & 0x0003)
{
append_ea(dstr,opword,5,isa[index].ea_mask);
}
else
{
valid_instruction = FALSE;
}
}
#endif
/********************************************************************/
static void
func38 (int index, uint16 opword)
{
/* MULS MULU .W */
append_ea(dstr,opword,5,isa[index].ea_mask);
append_string(dstr,",");
append_register(dstr,opword,DATA_REGISTER,11);
}
/********************************************************************/
static void
func39 (int index, uint16 opword)
{
/* MULS MULU .L */
int opword2,size;
opword2 = (int)((uint16)cpu_read_data((ADDRESS)disasm_pc,16));
inc_disasm_pc(2);
switch (opword2 & 0x8FF8)
{
case 0x0000:
append_instruction(dstr,"MULU.L");
size=32;
break;
case 0x0400:
append_instruction(dstr,"MULU.L");
size=64;
break;
case 0x0800:
append_instruction(dstr,"MULS.L");
size=32;
break;
case 0x0C00:
append_instruction(dstr,"MULS.L");
size=64;
break;
default:
valid_instruction = FALSE;
return;
break;
}
if (size == 32)
{
/* 32 bit */
append_ea(dstr,opword,5,isa[index].ea_mask);
append_string(dstr,",");
append_register(dstr,opword2,DATA_REGISTER,14);
}
else
{
/* 64 bit */
append_ea(dstr,opword,5,isa[index].ea_mask);
append_string(dstr,",");
append_register(dstr,opword2,DATA_REGISTER,2);
append_string(dstr,"-");
append_register(dstr,opword2,DATA_REGISTER,14);
}
}
/********************************************************************/
#ifndef CPU_FAM_MCF5XXX
static void
func40 (int index, uint16 opword)
{
/* CAS2 */
int opword2, opword3;
(void)index;
opword2 = (int)((uint16)cpu_read_data((ADDRESS)disasm_pc,16));
inc_disasm_pc(2);
opword3 = (int)((uint16)cpu_read_data((ADDRESS)disasm_pc,16));
inc_disasm_pc(2);
if (opword & 0x0200)
{
/* long */
append_size(dstr,0x0002,1,TRUE);
}
else
{
/* word */
append_size(dstr,0x0002,2,TRUE);
}
append_register(dstr,opword2,DATA_REGISTER,2);
append_string(dstr,":");
append_register(dstr,opword3,DATA_REGISTER,2);
append_string(dstr,",");
append_register(dstr,opword2,DATA_REGISTER,8);
append_string(dstr,":");
append_register(dstr,opword3,DATA_REGISTER,8);
append_string(dstr,",(");
append_register(dstr,opword2,15,14);
append_string(dstr,"),(");
append_register(dstr,opword3,15,14);
append_string(dstr,")");
}
/********************************************************************/
static void
func41 (int index, uint16 opword)
{
/* CAS */
int opword2;
opword2 = (int)((uint16)cpu_read_data((ADDRESS)disasm_pc,16));
inc_disasm_pc(2);
append_size2(dstr,opword,10,TRUE);
append_register(dstr,opword2,DATA_REGISTER,2);
append_string(dstr,",");
append_register(dstr,opword2,DATA_REGISTER,8);
append_string(dstr,",");
append_ea(dstr,opword,5,isa[index].ea_mask);
}
/********************************************************************/
static void
func42 (int index, uint16 opword)
{
/* MOVEP */
int opword2;
(void)index;
opword2 = (int)((uint16)cpu_read_data((ADDRESS)disasm_pc,16));
inc_disasm_pc(2);
if (opword & 0x0040)
{
/* long */
append_size(dstr,opword,6,TRUE);
}
else
{
/* word */
append_size(dstr,opword,4,TRUE);
}
if (opword & 0x0080)
{
/* MOVEP Dx,(d16,Ay) */
append_register(dstr,opword,DATA_REGISTER,11);
append_string(dstr,",(");
append_value(dstr,opword2,16);
append_string(dstr,",");
append_register(dstr,opword,ADDRESS_REGISTER,2);
append_string(dstr,")");
}
else
{
/* MOVEP (d16,Ay),Dx */
append_string(dstr,"(");
append_value(dstr,opword2,16);
append_string(dstr,",");
append_register(dstr,opword,ADDRESS_REGISTER,2);
append_string(dstr,"),");
append_register(dstr,opword,DATA_REGISTER,11);
}
}
/********************************************************************/
static void
func43 (int index, uint16 opword)
{
/* LINK long */
int disp;
char buffer[20];
(void)index;
disp = (int)cpu_read_data((ADDRESS)disasm_pc,32);
inc_disasm_pc(4);
append_register(dstr,opword,ADDRESS_REGISTER,2);
append_string(dstr,",#");
sprintf(buffer,"%d",disp);
append_string(dstr,buffer);
}
/********************************************************************/
static void
func44 (int index, uint16 opword)
{
/* BKPT */
int data;
(void)index;
append_string(dstr,"#");
data = opword & 0x0007;
append_value(dstr,data,8);
}
/********************************************************************/
static void
func45 (int index, uint16 opword)
{
/* SBCD ABCD Dy,Dx */
(void)index;
append_register(dstr,opword,DATA_REGISTER,2);
append_string(dstr,",");
append_register(dstr,opword,DATA_REGISTER,11);
}
/********************************************************************/
static void
func46 (int index, uint16 opword)
{
/* SBCD ABCD -(Ay),-(Ax) */
(void)index;
append_string(dstr,"-(");
append_register(dstr,opword,ADDRESS_REGISTER,2);
append_string(dstr,"),-(");
append_register(dstr,opword,ADDRESS_REGISTER,11);
append_string(dstr,")");
}
#endif /* CPU_FAM_MCF5XXX */
/********************************************************************/
static void
func47 (int index, uint16 opword)
{
/* EOR SUB ADD OR */
append_size(dstr,opword,7,TRUE);
append_register(dstr,opword,DATA_REGISTER,11);
append_string(dstr,",");
append_ea(dstr,opword,5,isa[index].ea_mask);
}
/********************************************************************/
#ifndef CPU_FAM_MCF5XXX
static void
func48 (int index, uint16 opword)
{
/* BFCHG BFCLR BFSET BFTST */
int opword2;
opword2 = cpu_read_data((ADDRESS)disasm_pc,SIZE_WORD);
inc_disasm_pc(2);
append_ea(dstr,opword,5,isa[index].ea_mask);
append_string(dstr,"{");
if (opword2 & 0x0800)
{
/* Do = 1 -- Dn */
append_register(dstr,opword2,DATA_REGISTER,8);
}
else
{
append_value(dstr,((opword2 & 0x07C0) >> 6),SIZE_BYTE);
}
append_string(dstr,":");
if (opword2 & 0x0020)
{
/* Dw = 1 -- Dn */
append_register(dstr,opword2,DATA_REGISTER,2);
}
else
{
append_value(dstr,(opword2 & 0x001F),SIZE_BYTE);
}
append_string(dstr,"}");
}
/********************************************************************/
static void
func49 (int index, uint16 opword)
{
/* BFEXTS BFEXTU */
int opword2;
opword2 = cpu_read_data((ADDRESS)disasm_pc,SIZE_WORD);
inc_disasm_pc(2);
append_ea(dstr,opword,5,isa[index].ea_mask);
append_string(dstr,"{");
if (opword2 & 0x0800)
{
/* Do = 1 -- Dn */
append_register(dstr,opword2,DATA_REGISTER,8);
}
else
{
append_value(dstr,((opword2 & 0x07C0) >> 6),SIZE_BYTE);
}
append_string(dstr,":");
if (opword2 & 0x0020)
{
/* Dw = 1 -- Dn */
append_register(dstr,opword2,DATA_REGISTER,2);
}
else
{
append_value(dstr,(opword2 & 0x001F),SIZE_BYTE);
}
append_string(dstr,"},");
append_register(dstr,opword2,DATA_REGISTER,14);
}
/********************************************************************/
static void
func50 (int index, uint16 opword)
{
/* BFINS */
int opword2;
opword2 = cpu_read_data((ADDRESS)disasm_pc,SIZE_WORD);
inc_disasm_pc(2);
append_register(dstr,opword2,DATA_REGISTER,14);
append_string(dstr,",");
append_ea(dstr,opword,5,isa[index].ea_mask);
append_string(dstr,"{");
if (opword2 & 0x0800)
{
/* Do = 1 -- Dn */
append_register(dstr,opword2,DATA_REGISTER,8);
}
else
{
append_value(dstr,((opword2 & 0x07C0) >> 6),SIZE_BYTE);
}
append_string(dstr,":");
if (opword2 & 0x0020)
{
/* Dw = 1 -- Dn */
append_register(dstr,opword2,DATA_REGISTER,2);
}
else
{
append_value(dstr,(opword2 & 0x001F),SIZE_BYTE);
}
append_string(dstr,"}");
}
/********************************************************************/
static void
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -