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

📄 opedec.c

📁 这是模拟器源代码
💻 C
字号:
#define STANDARD_INSTRUCTION_DECODING\
	u32 lenght; \
	strcpy (dest, opcode_strings [((op&0xFF00000)>>16)|((op&0xF0)>>4)]);\
	strcat (dest, condition_strings [(op>>28)&0xF]);\
	lenght = strlen(dest);\
	while (lenght<15) {\
		strcat (dest, " ");\
		lenght++;\
	}

void second_operand (u32 op, u32 adress, char *dest)
{
	u32 temp;
	u32 shift_amount;
	char string [33], string2 [33];

	if (op&0x2000000) {
		shift_amount = ((op>>8)&0xF)<<1;								
		temp = ((op&0xFF)<<(32-shift_amount))|((op&0xFF)>>shift_amount);
		strcat (dest, "#0x");
		itoa(temp, string, 16);
		strcat (dest, string);
	}
	else {
		strcat (dest, register_strings[(op&0xF)]);
		strcpy (string, ", ");
		strcat (string, shift_strings[(op>>5)&0x3]);
		if (op&0x10) {
			strcat (string, " ");
			strcat (string, register_strings[(op>>7)&0xF]);
			strcat (dest, string);
		}
		else {
			temp = (op>>7)&0x1F;
			if (!temp) {
				switch ((op>>5)&0x3) {
					case 0: break;
					case 1: strcpy (string2, ", ");
							strcat (string2, "LSR #32");
							strcat (dest, string2);
							break;
					case 2: 
							strcpy (string2, ", ");
							strcat (string2, "ASR #32");
							strcat (dest, string2);
							break;
					case 3: strcpy (string2, ", ");
							strcat (string2, "RRX");
							strcat (dest, string2);
							break;
				}
			}else {
				strcat (string, " #");
				itoa(temp, string2, 10);
				strcat (string, string2);
				strcat (dest, string);
			}
		}
	}
}

void standard_debug_handle (u32 op, u32 adress, char *dest)
{
	STANDARD_INSTRUCTION_DECODING;
}

void b_debug_handle (u32 op, u32 adress, char *dest)
{
	u32 temp;
	char string [33];

	STANDARD_INSTRUCTION_DECODING;

	strcat (dest, "\t0x");
	if (op&0x800000) temp = adress + (((op&0xFFFFFF)<<2)-0x4000000) + 8;
	else temp = adress + ((op&0x7FFFFF)<<2) + 8;
	itoa (temp, string, 16);	
	strcat (dest, string);
}

void dpsingle_debug_handle (u32 op, u32 adress, char * dest)
{
	STANDARD_INSTRUCTION_DECODING;	

	strcat (dest, "\t");
	strcat (dest, register_strings[(op>>12)&0xF]);
	strcat (dest, ", ");
	
	second_operand (op, adress, dest);
}

void dpnw_debug_handle (u32 op, u32 adress, char * dest)
{
	STANDARD_INSTRUCTION_DECODING;
	
	strcat (dest, "\t");
	strcat (dest, register_strings[(op>>16)&0xF]);
	strcat (dest, ", ");

	second_operand (op, adress, dest);
}

void dp_debug_handle (u32 op, u32 adress, char * dest)
{
	STANDARD_INSTRUCTION_DECODING;	

	strcat (dest, "\t");
	strcat (dest, register_strings[(op>>12)&0xF]);
	strcat (dest, ", ");
	strcat (dest, register_strings[(op>>16)&0xF]);
	strcat (dest, ", ");
	
	second_operand (op, adress, dest);
}

void mul_debug_handle (u32 op, u32 adress, char *dest)
{
	STANDARD_INSTRUCTION_DECODING;	

	strcat (dest, "\t");
	strcat (dest, register_strings[(op>>16)&0xF]);
	strcat (dest, ", ");
	strcat (dest, register_strings[op&0xF]);
	strcat (dest, ", ");
	strcat (dest, register_strings[(op>>8)&0xF]);
	if (op&0x200000) {
		strcat (dest, ", ");
		strcat (dest, register_strings[(op>>12)&0xF]);
	}
}

void mull_debug_handle (u32 op, u32 adress, char *dest)
{
	STANDARD_INSTRUCTION_DECODING;
}

void sdt_debug_handle (u32 op, u32 adress, char *dest)
{
	u32 temp;
	char string [33], string2 [33];
	
	STANDARD_INSTRUCTION_DECODING;
	
	strcat (dest, "\t");
	strcat (dest, register_strings[(op>>12)&0xF]);
		
	if (op&0x2000000) {
		strcat (dest, ", [");
		strcat (dest, register_strings[(op>>16)&0xF]);
		if (!(op&0x1000000)) strcat (dest, "]");
		strcat (dest, ", ");
		strcat (dest, register_strings[(op&0xF)]);
		strcpy (string, ", ");
		strcat (string, shift_strings[(op>>5)&0x3]);

		temp = (op>>7)&0x1F;
		
		if (!temp) {
			switch ((op>>5)&0x3) {
				case 0: break;
				case 1: strcpy (string2, ", "); strcat (string2, "LSR #32"); strcat (dest, string2);
						break;
				case 2: strcpy (string2, ", "); strcat (string2, "ASR #32"); strcat (dest, string2);
						break;
				case 3: strcpy (string2, ", "); strcat (string2, "RRX"); strcat (dest, string2);
						break;
			}
			
		}else {
			strcat (string, " #");
			itoa(temp, string2, 10);
			strcat (string, string2);
			strcat (dest, string);
		}
 
		if ((op&0x1000000)) {
			strcat (dest, "]");
			if (op&0x200000) strcat(dest, "!");
		}
	}
	else {
		temp = (op&0xFFF);
		if (temp) {
			if ((((op>>16)&0xF)==15)&&(op&0x100000)) {
				strcat (dest, ", =0x");
				if (op&0x800000) temp = adress+8+temp; else temp = adress+8-temp;
				if (op&0x400000) temp = (u32)read_byte (temp); else temp = read_word (temp);
				itoa (temp, string, 16);
				strcat (dest, string);
			}else {
				strcat (dest, ", [");
				strcat (dest, register_strings[(op>>16)&0xF]);
				if (!(op&0x1000000))strcat (dest, "]");
				if (op&0x800000) strcat (dest, ", #"); else strcat (dest, ", -#");
				itoa(temp, string, 10);
				strcat (dest, string);
				if ((op&0x1000000)) {
					strcat(dest , "]");
					if (op&0x200000) strcat(dest, "!");
				}
			}
		}
		
		else {
			strcat (dest, ", [");
			strcat (dest, register_strings[(op>>16)&0xF]);
			strcat (dest, "]");
		}
	}
}            

void hwdt_debug_handle (u32 op, u32 adress, char *dest) 
{
	STANDARD_INSTRUCTION_DECODING;
}

void mdt_debug_handle (u32 op, u32 adress, char *dest)
{
	STANDARD_INSTRUCTION_DECODING;
}

void msr_debug_handle (u32 op, u32 adress, char *dest)
{
	STANDARD_INSTRUCTION_DECODING;
}

void mrs_debug_handle (u32 op, u32 adress, char *dest)
{
	STANDARD_INSTRUCTION_DECODING;
}

void swp_debug_handle (u32 op, u32 adress, char *dest)
{
	STANDARD_INSTRUCTION_DECODING;
}

void swi_debug_handle (u32 op, u32 adress, char *dest)
{
	STANDARD_INSTRUCTION_DECODING;
}

⌨️ 快捷键说明

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