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

📄 disasm.c

📁 Coldfire MCF5282 DBug bootloader
💻 C
📖 第 1 页 / 共 4 页
字号:
					}
					ea = IM;
					break;
			}
		default:
			break;
	}
	if (!(ea_mask & ea))
	{
		/* EA was not one of ones in mask */
		valid_instruction = FALSE;
	}
	return ea;	/* needed by MOVE */
}

/********************************************************************/
#if 0
static void
func (int index, uint16 opword)
{
	sprintf(dstr,"%s -- ??????",isa[index].instruction);
}
#endif

/********************************************************************/
static void
func1 (int index, uint16 opword)
{
	/* BTST, BCLR, BCHG, BSET statics */
	int data;
	data = (int)((uint16)cpu_read_data((ADDRESS)disasm_pc,16));
	inc_disasm_pc(2);

	if (0xFF00 & data)
	{
		valid_instruction = FALSE;
		return;
	}
	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
func2 (int index, uint16 opword)
{
	/* ORI ANDI EORI to CCR */
	int data;

	(void)index;
	(void)opword;

	data = (int)((uint32)cpu_read_data((ADDRESS)disasm_pc,16));
	inc_disasm_pc(2);
	append_string(dstr,"#");
	append_value(dstr,data,8);
	append_string(dstr,",CCR");
}

/********************************************************************/
static void
func3 (int index, uint16 opword)
{
	/* ORI ANDI EORI to SR */
	int data;

	(void)index;
	(void)opword;

	data = (int)((uint32)cpu_read_data((ADDRESS)disasm_pc,16));
	inc_disasm_pc(2);
	append_string(dstr,"#");
	append_value(dstr,data,16);
	append_string(dstr,",SR");
}

/********************************************************************/
static void
func4 (int index, uint16 opword)
{
	/* RTM */

	(void)index;
	(void)opword;

	append_register(dstr,opword,3,2);
}

/********************************************************************/
static void
func5 (int index, uint16 opword)
{
	/* CALLM */
	int data;

	data = (int)((uint32)cpu_read_data((ADDRESS)disasm_pc,16));
	inc_disasm_pc(2);
	append_string(dstr,"#");
	append_value(dstr,data,8);
	append_string(dstr,",");
	append_ea(dstr,opword,5,isa[index].ea_mask);
}
#endif /* CPU_FAM_MCF5XXX */

/********************************************************************/
static void
func6 (int index, uint16 opword)
{
	/* ORI EORI ANDI SUBI ADDI CMPI  */
	int data;

	append_size(dstr,opword,7,TRUE);
	append_string(dstr,"#");

	switch (disasm_op_size)
	{
		case SIZE_BYTE:
			data = (int)((uint32)cpu_read_data((ADDRESS)disasm_pc,16));
			inc_disasm_pc(2);
			append_value(dstr,data,8);
			break;
		case SIZE_WORD:
			data = (int)((uint32)cpu_read_data((ADDRESS)disasm_pc,16));
			inc_disasm_pc(2);
			append_value(dstr,data,16);
			break;
		case SIZE_LONG:
			data = (int)((uint32)cpu_read_data((ADDRESS)disasm_pc,32));
			inc_disasm_pc(4);
			append_value(dstr,data,32);
			break;
	}

	append_string(dstr,",");
	append_ea(dstr,opword,5,isa[index].ea_mask);
}

/********************************************************************/
static void
func7 (int index, uint16 opword)
{
	/* BTST, BCHG, BSET, BCLR reg */
	append_register(dstr,opword,DATA_REGISTER,11);
	append_string(dstr,",");
	append_ea(dstr,opword,5,isa[index].ea_mask);
}

/********************************************************************/
static void
func8 (int index, uint16 opword)
{
	/* MOVE .b,.w,.l */
	int opw1, opw2;
#ifdef CPU_FAM_MCF5XXX
	int sea;
#endif

	/* the destination <ea> is swapped from the form expected by */
	/* append_ea().  so make it look right */
	opw1 = opword & 0x0FC0;
	opword = opword & 0xF03F;		/* punch out dest */
	opw2 = (opw1 & 0x01C0) << 3;	/* mode */
	opword = (uint16)(opword | opw2);			/* swapped mode */
	opw2 = (opw1 & 0x0E00) >> 3;	/* reg */
	opword = (uint16)(opword | opw2);			/* swapped reg */

	append_size2(dstr,opword,13,TRUE);
#ifndef CPU_FAM_MCF5XXX
	append_ea(dstr,opword,5,EA_ALL);
	append_string(dstr,",");
	append_ea(dstr,opword,11,isa[index].ea_mask);
#endif

#ifdef CPU_FAM_MCF5XXX
	sea = append_ea(dstr,opword,5,isa[index].ea_mask);
	append_string(dstr,",");

	/* NOTE: On Coldfire, not all dest <ea> are possible! */
	/* See MCF5200 Family Programmer's Reference Manual,  */
	/* pages 4-53 thru 4-55 for further information.      */

	switch (sea)
	{
		case DRD:
		case ARD:
		case ARI:
		case ARIPO:
		case ARIPR:
			append_ea(dstr,opword,11,
				(DRD | ARD | ARI | ARIPO | ARIPR | ARID | ARII8 \
				| AS | AL));
			break;
		case ARID:
		case PCID:
		case IM:
			append_ea(dstr,opword,11,
				(DRD | ARD | ARI | ARIPO | ARIPR | ARID));
			break;
		case ARII8:
		case PCII8:
		case AS:
		case AL:
			append_ea(dstr,opword,11,
				(DRD | ARD | ARI | ARIPO | ARIPR));
			break;
		default:
			valid_instruction = FALSE;
			break;
	}
#endif

}

/********************************************************************/
static void
func9 (int index, uint16 opword)
{
	/* MOVE from SR */
	append_string(dstr,"SR,");
	append_ea(dstr,opword,5,isa[index].ea_mask);
}

/********************************************************************/
static void
func10 (int index, uint16 opword)
{
	/* MOVE to SR */
	disasm_op_size = SIZE_WORD;
	append_ea(dstr,opword,5,isa[index].ea_mask);
	append_string(dstr,",SR");
}

/********************************************************************/
static void
func11 (int index, uint16 opword)
{
	/* MOVE from CCR */
	append_string(dstr,"CCR,");
	append_ea(dstr,opword,5,isa[index].ea_mask);
}

/********************************************************************/
static void
func12 (int index, uint16 opword)
{
	/* MOVE to CCR */
	disasm_op_size = SIZE_WORD;
	append_ea(dstr,opword,5,isa[index].ea_mask);
	append_string(dstr,",CCR");
}

/********************************************************************/
static void
func13 (int index, uint16 opword)
{
	/* SWAP EXT EXTB */
	(void)index;
	append_register(dstr,opword,DATA_REGISTER,2);
}

/********************************************************************/
static void
func14 (int index, uint16 opword)
{
	/* ADDX SUBX */
	(void)index;
	append_size(dstr,opword,7,TRUE);

	if (opword & 0x0008)
	{
		/* ADDX/SUBX -(Ax),-(Ay) */
		append_string(dstr,"-(");
		append_register(dstr,opword,ADDRESS_REGISTER,2);
		append_string(dstr,"),-(");
		append_register(dstr,opword,ADDRESS_REGISTER,11);
		append_string(dstr,")");
	}
	else
	{
		/* ADDX/SUBX Dx,Dy */
		append_register(dstr,opword,DATA_REGISTER,2);
		append_string(dstr,",");
		append_register(dstr,opword,DATA_REGISTER,11);
	}
}

/********************************************************************/
static void
func15 (int index, uint16 opword)
{
	/* NEGX NEG NOT CLR WDDATA */
	append_size(dstr,opword,7,TRUE);
	append_ea(dstr,opword,5,isa[index].ea_mask);
}

/********************************************************************/
static void
func16 (int index, uint16 opword)
{
	/* LINK word */
	int disp;
	char buffer[20];

	(void)index;
	disp = (int)((int16)cpu_read_data((ADDRESS)disasm_pc,16));
	inc_disasm_pc(2);
	append_register(dstr,opword,ADDRESS_REGISTER,2);
	append_string(dstr,",#");
	sprintf(buffer,"%d",disp);
	append_string(dstr,buffer);
}

/********************************************************************/
static void
func17 (int index, uint16 opword)
{
	/* RTE HALT RTS NOP */
	/* instruction printed by calling routine */
	(void)index;
	(void)opword;
}

/********************************************************************/
static void
func18 (int index, uint16 opword)
{
	/* ASL ASR LSL LSR ROR ROL ROXL ROXR NBCD PEA JSR JMP TAS */
	append_ea(dstr,opword,5,isa[index].ea_mask);
}

/********************************************************************/
#ifndef CPU_FAM_MCF5XXX
static void
func19 (int index, uint16 opword)
{
	/* CMP2 and CHK2 */
	int opword2;

	opword2 = (int)((uint16)cpu_read_data((ADDRESS)disasm_pc,16));
	inc_disasm_pc(2);

	/* both instruction have same EA mask */
	if (opword2 & 0x000800)
	{
		append_instruction(dstr,"CHK2");
	}
	else
	{
		append_instruction(dstr,"CMP2");
	}
	append_size(dstr,opword,10,TRUE);
	append_ea(dstr,opword,5,isa[index].ea_mask);
	append_string(dstr,",");
	append_register(dstr,opword2,15,14);
}

/********************************************************************/
#if 0
static void
func20 (int index, uint16 opword)
{
	int data;

	(void)index;

	append_string(dstr,"#");
	data = opword & 0x0007;
	append_value(dstr,data,8);
}
#endif
#endif /* CPU_FAM_MCF5XXX */

/********************************************************************/
static void
func21 (int index, uint16 opword)
{
	(void)index;
	append_register(dstr,opword,ADDRESS_REGISTER,2);
}

/********************************************************************/
static void
func22 (int index, uint16 opword)
{
	/* TRAP */
	int data;
	(void)index;
	append_string(dstr,"#");
	data = opword & 0x000F;
	append_value(dstr,data,8);
}

/********************************************************************/
static void
func23 (int index, uint16 opword)
{
	/* STOP RTD */
	int data;

	(void)index;
	(void)opword;
	append_string(dstr,"#");
	data = (int)((uint16)cpu_read_data((ADDRESS)disasm_pc,16));
	inc_disasm_pc(2);
	append_value(dstr,data,16);
}

/********************************************************************/
static void
func24 (int index, uint16 opword)
{
	/* MOVEQ */
	int data;

	(void)index;
	append_string(dstr,"#");
	data = opword & 0x00FF;
	append_value(dstr,data,8);
	append_string(dstr,",");
	append_register(dstr,opword,DATA_REGISTER,11);
}

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

	(void)index;
	disp = opword & 0x00FF;
	if (disp == 0)
	{
		/* 16 bit disp */
		disp = (int)((int16)cpu_read_data((ADDRESS)disasm_pc,16));
		target = (int)disasm_pc + disp;
		inc_disasm_pc(2);
	}
	else if (disp == 0x00FF)
	{
		#if (defined(CPU_MCF5407))
			/* 32 bit disp */
			disp = (int)((int32)cpu_read_data((ADDRESS)disasm_pc,32));
			target = (int)disasm_pc + disp;
			inc_disasm_pc(4);
		#else
			/* 32 bit disp */ 
			valid_instruction = FALSE;
			return;
		#endif
	}
	else
	{
		/* 8 bit disp */
		disp = (int)((int8)disp);
		target = (int)disasm_pc + disp;
	}

#if (defined(SYMBOL_TABLE))
	if (symtab_convert_address((ADDRESS)target,tstr))
	{
		append_string(dstr,tstr);
	}
	else
		append_value(dstr,target,32);
#else
	append_value(dstr,target,32);
#endif
}

/********************************************************************/
static void
func26 (int index, uint16 opword)
{
	/* MOVEA */

	append_size2(dstr,opword,13,TRUE);
	append_ea(dstr,opword,5,isa[index].ea_mask);
	append_string(dstr,",");
	append_register(dstr,opword,ADDRESS_REGISTER,11);
}

/********************************************************************/
static int
more_bits_set (int cm, int cc, int dir, int reg_mask)
{
	/* cm = current mask, cc = current count */
	switch (dir)
	{
		case 1:
			cm = cm << 1;
			break;
		case -1:
			cm = cm >> 1;
			break;
	}
	++cc;
	while (cc < 8)
	{
		if (cm & reg_mask)
		{
			return TRUE;
		}
		switch (dir)
		{
			case 1:
				cm = cm << 1;
				break;
			case -1:
				cm = cm >> 1;
				break;
		}
		++cc;
	}
	return FALSE;
}

/********************************************************************/
static void
append_reg_list (int reg_mask, int opword)
{
	int mask, i, j, first, need_slash, dir, next_set, some_set;
	char buffer[9];
	char *reg;
	char regA[] = "A";
	char regD[] = "D";

	/* Check for predecrement mode */
	if ((opword & 0x0038) == 0x0020)
	{
		/* predecrement */
		dir = -1;
	}
	else
	{
		dir = 1;
	}

	need_slash = FALSE;
	for (j = 0; j < 2; j++)
	{
		if (j == 0)
		{
			switch (dir)
			{
				case 1:
					mask = 0x0001;
					break;
				case -1:
				default:
					mask = 0x8000;
					break;
			}
			reg = regD;
		}
		else
		{
			switch (dir)
			{
				case 1:
					mask = 0x0100;
					break;
				case -1:
				default:
					mask = 0x0080;
					break;
			}
			reg = regA;
			if (need_slash)
				append_string(dstr,"/");
		}

		some_set = FALSE;
		first = TRUE;
		need_slash = FALSE;

		for (i = 0; i < 8; i++)
		{
			if (reg_mask & mask)
			{
				some_set = TRUE;
				if (first)
				{
					/* first one in subrange */
					if (need_slash)
					{
						append_string(dstr,"/");
						need_slash = FALSE;
					}
					append_string(dstr,reg);
					sprintf(buffer,"%d",i);
					append_string(dstr,buffer);
					if (!more_bits_set(mask,i,dir,reg_mask))
						need_slash = TRUE;
					first = FALSE;
				}
				else
				{
					/* check to see if next set */
					switch (dir)
					{
						case 1:
							next_set = (((reg_mask & (mask << 1))) &&
								(i != 7));
							break;
						default:
						case -1:
							next_set = (((reg_mask & (mask >> 1))) &&
								(i != 7));
							break;
					}
					if (!next_set)
					{
						/* the next isn't set, so display */
						append_string(dstr,"-");
						append_string(dstr,reg);
						sprintf(buffer,"%d",i);
						append_string(dstr,buffer);
							need_slash = TRUE;
						first = TRUE;
					}
				}
			}
			else first = TRUE;
			switch (dir)
			{
				case 1:
					mask = mask << 1;
					break;
				case -1:
					mask = mask >> 1;
					break;
			}
		}
		if ((i == 8) && (j == 0) && some_set)
		{
			switch (dir)
			{
				case 1:
					need_slash = more_bits_set(0x0080,-1,dir,reg_mask);
					break;
				case -1:
					need_slash = more_bits_set(0x0100,-1,dir,reg_mask);
					break;
				default:
					break;
			}
		}
	}
}

/********************************************************************/
static void
func27 (int index, uint16 opword)
{
	/* MOVEM */

⌨️ 快捷键说明

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