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

📄 dis_cf.c

📁 umon bootloader source code, support mips cpu.
💻 C
📖 第 1 页 / 共 5 页
字号:
			break;
		case 0x004:
			append_string(dstr,"ACR0");
			break;
		case 0x005:
			append_string(dstr,"ACR1");
			break;
#endif

#if (defined(MCF5200D) || defined(MCF5202) || \
	 defined(MCF5204)  || defined(MCF5206))
		case 0x801:
			append_string(dstr,"VBR");
			break;
#endif

#if (defined(MCF5204) || defined(MCF5206))
		case 0xC04:
			append_string(dstr,"RAMBAR");
			break;
		case 0xC0F:
			append_string(dstr,"MBAR");
			break;
#endif

#if (defined(MC68010) || defined(MC68020) || defined(MC68030) || \
	defined(MC68040) || defined(MC68EC040) || defined(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(MC68020) || defined(MC68030) || defined(MC68040) || \
	defined(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(MC68040) || defined(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 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 MCF5200
static void
func37 (int index, WORD opword)
{
	/* WDEBUG */
	int opword2;

	opword2 = (int)((WORD)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, WORD 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, WORD opword)
{
	/* MULS MULU .L */
	int opword2,size;

	opword2 = (int)((WORD)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 MCF5200
static void
func40 (int index, WORD opword)
{
	/* CAS2 */
	int opword2, opword3;

	(void)index;

	opword2 = (int)((WORD)cpu_read_data((ADDRESS)disasm_pc,16));
	inc_disasm_pc(2);
	opword3 = (int)((WORD)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, WORD opword)
{
	/* CAS */
	int opword2;

	opword2 = (int)((WORD)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, WORD opword)
{
	/* MOVEP */
	int opword2;

	(void)index;

	opword2 = (int)((WORD)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, WORD 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, WORD opword)
{
	/* BKPT */
	int data;

	(void)index;

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

static void
func45 (int index, WORD 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, WORD 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 /* MCF5200 */

static void
func47 (int index, WORD 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 MCF5200
static void
func48 (int index, WORD 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, WORD 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, WORD 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
func51 (int index, WORD 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, WORD 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, WORD opword)
{
	/* DBcc */
	int disp, target;
#ifdef SYMBOL_TABLE
	char tstr[100];
#endif

	(void)index;

	disp = (int)((SWORD)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,",");
#ifdef 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
}

static void
func54 (int index, WORD opword)
{
	/* DIVS.W 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, WORD opword)
{
	/* DIVS.L DIVU.L DIVSL.L DIVUL.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 */
		if ((opword2 & 0x0400) || same_reg)
		{
			append_instruction(dstr,"DIVS.L");
		}
		else
		{
			append_instruction(dstr,"DIVSL.L");
		}
	}
	else
	{
		/* DIVU */
		if ((opword2 & 0x0400) || same_reg)
		{
			append_instruction(dstr,"DIVU.L");
		}
		else
		{
			append_instruction(dstr,"DIVUL.L");
		}
	}
	append_ea(dstr,opword,5,isa[index].ea_mask);
	append_string(dstr,",");
	if (same_reg)

⌨️ 快捷键说明

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