⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 disasm.c

📁 Coldfire MCF5282 DBug bootloader
💻 C
📖 第 1 页 / 共 4 页
字号:
	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 + -