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

📄 disasm.c

📁 Coldfire MCF5282 DBug bootloader
💻 C
📖 第 1 页 / 共 4 页
字号:
func51 (int index, uint16 opword)
{
	/* CHK */
	append_size2(dstr,opword,8,TRUE);
	append_ea(dstr,opword,5,isa[index].ea_mask);
	append_string(dstr,",");
	append_register(dstr,opword,DATA_REGISTER,11);
}

/********************************************************************/
static void
func52 (int index, uint16 opword)
{
	/* CMPM */

	(void)index;

	append_size(dstr,opword,7,TRUE);
	append_string(dstr,"(");
	append_register(dstr,opword,ADDRESS_REGISTER,2);
	append_string(dstr,")+,(");
	append_register(dstr,opword,ADDRESS_REGISTER,11);
	append_string(dstr,")+");
}

/********************************************************************/
static void
func53 (int index, uint16 opword)
{
	/* DBcc */
	int disp, target;
#if (defined(SYMBOL_TABLE))
	char tstr[100];
#endif

	(void)index;

	disp = (int)((int16)cpu_read_data((ADDRESS)disasm_pc,16));
	target = (unsigned int)disasm_pc + disp;
	inc_disasm_pc(2);

	append_register(dstr,opword,DATA_REGISTER,2);
	append_string(dstr,",");
#if (defined(SYMBOL_TABLE))
	if (symtab_convert_address((ADDRESS)target,tstr))
	{
		append_string(dstr,tstr);
	}
	else
		append_value(dstr,target,SIZE_LONG);
#else
	append_value(dstr,target,SIZE_LONG);
#endif
}
#endif /* CPU_FAM_MCF5XXX */
/********************************************************************/

#ifdef CPU_FAM_MCF5XXXDIV 

static void
func54 (int index, uint16 opword)
{
	/* DIVS.W DIVU.W */
	if (opword & 0x0100)
		append_instruction(dstr,"DIVS.W");
	else
		append_instruction(dstr,"DIVU.W");
	append_ea(dstr,opword,5,isa[index].ea_mask);
	append_string(dstr,",");
	append_register(dstr,opword,DATA_REGISTER,11);
}

/********************************************************************/
static void
func55 (int index, uint16 opword)
{
	/* DIVS.L DIVU.L DIVSL.L DIVUL.L REMS.L REMU.L*/
	int opword2, same_reg;

	opword2 = cpu_read_data((ADDRESS)disasm_pc,SIZE_WORD);
	inc_disasm_pc(2);

	same_reg = (((opword2 & 0x7000) >> 12) ==
				 (opword2 & 0x0007));
	
	if (opword2 & 0x0800)	/* DIVS or DIVSL or REMS */
	{
		if (same_reg)				/* DIVS */
			append_instruction(dstr,"DIVS.L");
		else if (opword2 & 0x0400)	/* DIVSL */
			append_instruction(dstr,"DIVSL.L");
		else						/* REMS */	
			append_instruction(dstr,"REMS.L");
	}
	else					/* DIVU or DIVUL or REMU */
	{
		if (same_reg)				/* DIVU */
			append_instruction(dstr,"DIVU.L");
		else if (opword2 & 0x0400)	/* DIVUL */
			append_instruction(dstr,"DIVUL.L");
		else						/* REMU */	
			append_instruction(dstr,"REMU.L");
	}
	append_ea(dstr,opword,5,isa[index].ea_mask);
	append_string(dstr,",");
	if (same_reg)
	{
		append_register(dstr,opword2,DATA_REGISTER,14);
	}
	else
	{
		append_register(dstr,opword2,DATA_REGISTER,2);
		append_string(dstr,":");
		append_register(dstr,opword2,DATA_REGISTER,14);
	}
}

#endif /* #ifdef CPU_FAM_MCF5XXXDIV */

/********************************************************************/

#ifndef CPU_FAM_MCF5XXX

static void
func56 (int index, uint16 opword)
{
	/* EXG.L */

	(void)index;

	switch (opword & 0x00F8)
	{
		case 0x0040:
			append_register(dstr,opword,DATA_REGISTER,11);
			append_string(dstr,",");
			append_register(dstr,opword,DATA_REGISTER,2);
			break;
		case 0x0048:
			append_register(dstr,opword,ADDRESS_REGISTER,11);
			append_string(dstr,",");
			append_register(dstr,opword,ADDRESS_REGISTER,2);
			break;
		case 0x0088:
			append_register(dstr,opword,DATA_REGISTER,11);
			append_string(dstr,",");
			append_register(dstr,opword,ADDRESS_REGISTER,2);
			break;
		default:
			valid_instruction = FALSE;
	}
}

/********************************************************************/
static void
func57 (int index, uint16 opword)
{
	/* PACK UNPK -(Ax),-(Ay),#<adj> */
	int adj;

	(void)index;

	adj = cpu_read_data((ADDRESS)disasm_pc,SIZE_WORD);
	inc_disasm_pc(2);

	append_string(dstr,"-(");
	append_register(dstr,opword,ADDRESS_REGISTER,2);
	append_string(dstr,"),-(");
	append_register(dstr,opword,ADDRESS_REGISTER,11);
	append_string(dstr,"),#");
	append_value(dstr,adj,SIZE_WORD);
}

/********************************************************************/
static void
func58 (int index, uint16 opword)
{
	/* PACK UNPK Dx,Dy,#<adj> */
	int adj;

	(void)index;

	adj = cpu_read_data((ADDRESS)disasm_pc,SIZE_WORD);
	inc_disasm_pc(2);

	append_register(dstr,opword,DATA_REGISTER,2);
	append_string(dstr,",");
	append_register(dstr,opword,DATA_REGISTER,11);
	append_string(dstr,",#");
	append_value(dstr,adj,SIZE_WORD);
}

/********************************************************************/
static void
func59 (int index, uint16 opword)
{
	/* TRAPcc .W .L #<data> */
	int data;

	(void)index;

	if (opword & 0x0001)
	{
		/* long */
		data = cpu_read_data((ADDRESS)disasm_pc,SIZE_LONG);
		inc_disasm_pc(4);
		append_size(dstr,0x0002,1,TRUE);
		append_string(dstr,"#");
		append_value(dstr,data,SIZE_LONG);
	}
	else
	{
		/* word */
		data = cpu_read_data((ADDRESS)disasm_pc,SIZE_WORD);
		inc_disasm_pc(2);
		append_size(dstr,0x0002,2,TRUE);
		append_string(dstr,"#");
		append_value(dstr,data,SIZE_WORD);
	}
}

/********************************************************************/
static void
func60 (int index, uint16 opword)
{
	/* MOVE to USP */

	(void)index;

	append_register(dstr,opword,ADDRESS_REGISTER,2);
	append_string(dstr,",USP");
}

/********************************************************************/
static void
func61 (int index, uint16 opword)
{
	/* MOVE from USP */

	(void)index;

	append_string(dstr,"USP,");
	append_register(dstr,opword,ADDRESS_REGISTER,2);
}
#endif /* CPU_FAM_MCF5XXX */

/********************************************************************/
#ifdef CPU32
static void
func62 (int index, uint16 opword)
{
	/* TBL */
	int opword2;

	opword2 = cpu_read_data((ADDRESS)disasm_pc,SIZE_WORD);
	inc_disasm_pc(2);

	switch (opword2 & 0x0C00)
	{
		case 0x0000:
			append_instruction(dstr,"TBLU");
			break;
		case 0x0400:
			append_instruction(dstr,"TBLUN");
			break;
		case 0x0800:
			append_instruction(dstr,"TBLS");
			break;
		case 0x0C00:
			append_instruction(dstr,"TBLSN");
			break;
	}
	append_size(dstr,opword2,7,TRUE);

	if ((opword & 0x0038) == 0)
	{
		/* TBL Dym:Dyn,Dx */
		append_register(dstr,opword,DATA_REGISTER,2);
		append_string(dstr,":");
		append_register(dstr,opword2,DATA_REGISTER,2);
		append_string(dstr,",");
		append_register(dstr,opword2,DATA_REGISTER,14);
	}
	else
	{
		/* TBL <ea>,Dx */
		append_ea(dstr,opword,5,isa[index].ea_mask);
		append_string(dstr,",");
		append_register(dstr,opword2,DATA_REGISTER,14);
	}
}

/********************************************************************/
static void
func63 (int index, uint16 opword)
{
	/* LPSTOP */
	int opword2, data;

	opword2 = cpu_read_data((ADDRESS)disasm_pc,SIZE_WORD);
	inc_disasm_pc(2);

	if (opword == 0x01C0)
	{
		data = cpu_read_data((ADDRESS)disasm_pc,SIZE_WORD);
		inc_disasm_pc(2);

		append_string(dstr,"#");
		append_value(dstr,data,SIZE_WORD);
	}
	else
	{
		/* this opcode matches TBL as well, check it */
		disasm_pc = disasm_pc - 2;
		func62(index,opword);
	}
}
#endif /* CPU32 */

#ifdef CPU_FAM_MCF5XXXM
/********************************************************************/
static void
mac1 (int index, uint16 opword)
{
	/* MAC.W Rw,Rx */
	/* MAC.L Rw,Rx */
	/* MSAC.W Rw,Rx */
	/* MSAC.L Rw,Rx */

	int opword2;
	(void)index;

	opword2 = cpu_read_data((ADDRESS)disasm_pc,SIZE_WORD);
	inc_disasm_pc(2);

	if (opword2 & 0x0100)							/* if MSAC */
	{
		if (opword2 & 0x0800)
			append_instruction(dstr,"MSAC.L");
		else
			append_instruction(dstr,"MSAC.W");
	}
	else											/* else MAC */
	{
		if (opword2 & 0x0800)
			append_instruction(dstr,"MAC.L");
		else
			append_instruction(dstr,"MAC.W");
	}

	append_register(dstr,opword,6,11);	/* Ry */
	if (opword2 & 0x0080)
		append_string(dstr,".U,");
	else
		append_string(dstr,".L,");

	append_register(dstr,opword,3,2);	/* Rx */
	if (opword2 & 0x0040)
		append_string(dstr,".U");
	else
		append_string(dstr,".L");

	if ((opword2 & 0x0600) == 0x0200)
		append_string(dstr,",<<1");
	else if ((opword2 & 0x0600) == 0x0600)
		append_string(dstr,",>>1");
}

/********************************************************************/
static void
mac2 (int index, uint16 opword)
{
	/* MACL.W Rw,Rx */
	/* MACL.L Rw,Rx */
	/* MSACL.W Rw,Rx */
	/* MSACL.L Rw,Rx */
	int opword2;
	(void)index;

	opword2 = cpu_read_data((ADDRESS)disasm_pc,SIZE_WORD);
	inc_disasm_pc(2);

	if (opword2 & 0x0100)
	{
		if (opword2 & 0x0800)
			append_instruction(dstr,"MSACL.L");
		else
			append_instruction(dstr,"MSACL.W");
	}
	else
	{
		if (opword2 & 0x0800)
			append_instruction(dstr,"MACL.L");
		else
			append_instruction(dstr,"MACL.W");
	}

	append_register(dstr,opword,6,11);		/* Ry */
	if (opword2 & 0x0080)
		append_string(dstr,".U,");
	else
		append_string(dstr,".L,");

	append_register(dstr,opword2,3,2);		/* Rx */
	if (opword2 & 0x0040)
		append_string(dstr,".U,");
	else
		append_string(dstr,".L,");

	if ((opword2 & 0x0600) == 0x0200)
		append_string(dstr,"<<1,");
	else if ((opword2 & 0x0600) == 0x0600)
		append_string(dstr,">>1,");

	append_ea(dstr,opword,5,isa[index].ea_mask);
		
	if ((opword2 & 0x0020)== 0x0020)
		append_string(dstr,"&");

	append_string(dstr,",");

	append_register(dstr,opword2,15,14);	/* Rw */

}

/********************************************************************/
static void
mac3 (int index, uint16 opword)
{
	/* MOVE.L <ea>,ACC */
	(void)index;
	append_size(dstr,opword,13,TRUE);
	append_ea(dstr,opword,5,isa[index].ea_mask);
	append_string(dstr,",ACC");
}

/********************************************************************/
static void
mac4 (int index, uint16 opword)
{
	/* MOVE.L <ea>,MACSR */
	(void)index;
	append_size(dstr,opword,13,TRUE);
	append_ea(dstr,opword,5,isa[index].ea_mask);
	append_string(dstr,",MACSR");
}

/********************************************************************/
static void
mac5 (int index, uint16 opword)
{
	/* MOVE.L ACC,Rx */
	(void)index;
	append_size(dstr,opword,13,TRUE);
	append_string(dstr,"ACC,");
	append_register(dstr,opword,3,2);
}

/********************************************************************/
static void
mac6 (int index, uint16 opword)
{
	/* MOVE.L MACSR,Rx */
	(void)index;
	append_size(dstr,opword,13,TRUE);
	append_string(dstr,"MACSR,");
	append_register(dstr,opword,3,2);
}

/********************************************************************/
static void
mac7 (int index, uint16 opword)
{
	/* MOVE.L MACSR,CCR */
	(void)index;
	(void)opword;
	append_size(dstr,opword,13,TRUE);
	append_string(dstr,"MACSR,CCR");
}

/********************************************************************/
static void
mac8 (int index, uint16 opword)
{
	/* MOVE.L <ea>,MASK */
	append_size(dstr,opword,13,TRUE);
	append_ea(dstr,opword,5,isa[index].ea_mask);
	append_string(dstr,",MASK");
}
/********************************************************************/
static void
mac9 (int index, uint16 opword)
{
	/* MOVE.L MASK,Rx */
	(void)index;
	append_size(dstr,opword,13,TRUE);
	append_string(dstr,"MASK,");
	append_register(dstr,opword,3,2);
}
/********************************************************************/
#endif /* CPU_FAM_MCF5XXXM */

#ifdef CPU_MCF5407
/********************************************************************/
static void
func64 (int index, uint16 opword)
{
	(void)index;
	/* INTOUCH */
	append_register(dstr,opword,3,2);
}
/********************************************************************/
static void
func65 (int index, uint16 opword)
{
	/* MOV3Q */
	int data;

	data = ((opword & 0x0E00) >> 9);

	append_size(dstr,opword,13,TRUE);
	append_string(dstr,"#");
	
	if (data == 0)
		append_string(dstr,"-1");
	else
		append_value(dstr,data,8);
	
	append_string(dstr,",");
	append_ea(dstr,opword,5,isa[index].ea_mask);
}
/********************************************************************/
static void
func66 (int index, uint16 opword)
{
	/* MVS MVZ */
	
	append_size(dstr,(opword & 0x40),7,TRUE);
	append_ea(dstr,opword,5,isa[index].ea_mask);
	append_string(dstr,",");
	append_register(dstr,opword,15,11);

}
/********************************************************************/
static void
func67 (int index, uint16 opword)
{
	/* TAS*/
	disasm_op_size = SIZE_BYTE;
	append_instruction(dstr,"TAS.B");
	append_ea(dstr,opword,5,isa[index].ea_mask);
}
/********************************************************************/
#endif /*CPU_MCF5407 */


#include "src/cpu/coldfire/itable.h"


/********************************************************************/
static void
disasm_display (char *stmt, ADDRESS init_pc, ADDRESS next_pc)
{
	int nw, ad, done, i, spaces;
	ADDRESS pc;
#if (defined(SYMBOL_TABLE))
	char sstr[100];
#endif

	pc = init_pc;
	ad = FALSE;
	done = FALSE;

#if (defined(SYMBOL_TABLE))
	if (symtab_convert_address(pc,sstr))
	{
		printf("%08X:\n%08X: %s:\n",
			(unsigned int)pc,
			(unsigned int)pc,
			sstr);
	}
#endif
	
	while (!done)
	{
		nw = 0;
		printf("%08lX: ",(unsigned long)pc);
		spaces = 10;	/* used 10 chars up so far on screen */
		while (pc < next_pc)
		{
			printf("%04X ",cpu_read_data((ADDRESS)pc,16));
			pc = (ADDRESS)((unsigned int)pc + (unsigned int)2);
			spaces += 5;
			if (++nw >= 4)
			{
				break;
			}
		}

		if (!ad)
		{
			for (i = spaces; i < 31; i++)
				printf(" ");
			printf("%s",stmt);
			ad = TRUE;
		}
		printf("\n");

		if (pc >= next_pc)
			done = TRUE;
	}
}

/********************************************************************/
ADDRESS
cpu_disasm (ADDRESS init_pc, int display)
{
	/*
	 * This routine disassembles one ColdFire instruction, and
	 * returns the address of the next instruction.
	 */
	int index;
	uint16 opword;

	disasm_pc = init_pc;
	opword = (uint16)cpu_read_data((ADDRESS)disasm_pc,16);
	valid_instruction = FALSE;
	dstr[0] = '\0';

	for (index = 0; index < ISASIZE; index++)
	{
		if ((opword & isa[index].keepers) == isa[index].match)
		{
			valid_instruction = TRUE;
			append_instruction(dstr,isa[index].instruction);
			inc_disasm_pc(2);
			isa[index].handler(index,opword);	/* disassemble */
			break;
		}
	}
	if (valid_instruction)
	{
	}
	else
	{
		append_instruction(dstr,"DC.W");
		append_value(dstr,opword,16);
		/* inc_disasm_pc(2); */
		disasm_pc = init_pc + 2;
	}
	if (display)
	{
		disasm_display(dstr,init_pc,disasm_pc);
	}

	return disasm_pc;
}

/********************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -