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

📄 i_move.c

📁 SkyEye是一个可以运行嵌入式操作系统的硬件仿真工具
💻 C
字号:
/**********************************//*                                *//*  Copyright 2000, David Grant   *//*                                *//*  see LICENSE for more details  *//*                                *//**********************************/#include "coldfire.h"/* Move instruction *//* Format     15  14  13  12  11  10   9   8   7   6   5   4   3   2   1   0+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+| 0 | 0 | Size  | DRegister |  DMode    |  SMode    | SRegister |+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+   If the destination is an address register, then the condition codes    are unaffected, and MOVEA designates this */INSTRUCTION_6ARGS(MOVE,	unsigned Code1,2,	unsigned Size,2,	unsigned DestRegister,3,	unsigned DestMode,3,	unsigned SourceMode,3,	unsigned SourceRegister,3);const short MOVE_SizeBits[4]={ 0 ,  8 , 32 , 16 }; const char  MOVE_SizeStr[4]= {'?', 'B', 'L', 'W'};int MOVE816Time[][7]= {	{1,1,1,1,1,2,1},			{1,1,1,1,1,2,1},			{3,3,3,3,3,4,3},			{3,3,3,3,3,4,3},			{3,3,3,3,3,4,3},			{3,3,3,3,3,-1,-1},			{4,4,4,4,-1,-1,-1},			{3,3,3,3,-1,-1,-1},			{3,3,3,3,-1,-1,-1},			{3,3,3,3,3,-1,-1},			{4,4,4,4,-1,-1,-1},			{1,3,3,3,-1,-1,-1}			};		int MOVE32Time[][7]= {	{1,1,1,1,1,2,1},			{1,1,1,1,1,2,1},			{2,2,2,2,2,3,2},			{2,2,2,2,2,3,2},			{2,2,2,2,2,3,2},			{2,2,2,2,2,-1,-1},			{3,3,3,3,-1,-1,-1},			{2,2,2,2,-1,-1,-1},			{2,2,2,2,-1,-1,-1},			{2,2,2,2,2,-1,-1},			{3,3,3,3,-1,-1,-1},			{1,2,2,2,-1,-1,-1}			};	static void execute(void){	struct _Address Source, Destination;	unsigned int SValue;	int cycle_source_ea=0, cycle_destination_ea=0;	MOVE_Instr Instr;	Memory_RetrWordFromPC(&Instr.Code);	if(Instr.Bits.Size==0) {		SKYEYE_ERR("Invalid size in instruction, size=0\n");		return;	}	if(!EA_GetFromPC(&Source, MOVE_SizeBits[(short)Instr.Bits.Size], 		Instr.Bits.SourceMode, Instr.Bits.SourceRegister)) return;	EA_GetValue(&SValue, &Source);	if(!EA_GetFromPC(&Destination, MOVE_SizeBits[(short)Instr.Bits.Size], 		Instr.Bits.DestMode, Instr.Bits.DestRegister)) return;	EA_PutValue(&Destination, SValue);	/* 	X - not affected		N - set if result is -ve, cleared otherwise		Z - set if result is zero, cleared otherwise		V - always cleared		C - always cleared */		/* Set the status register */	if(Instr.Bits.DestMode != 1) {		/* MOVE */		memory_core.sr &= 0xFFF0;		SRBits->N = ((int)SValue < 0);		SRBits->Z = (SValue == 0);	} else {		/* MOVEA */		/* Destination is an address register, codes are unaffected */	}	/* Do cycle counting */	cycle_source_ea = cycle_EA(Instr.Bits.SourceRegister, Instr.Bits.SourceMode);	cycle_destination_ea = cycle_EA(Instr.Bits.DestRegister, Instr.Bits.DestMode);	if(Instr.Bits.Size == 0x02) /* 32 bit */		cycle(MOVE32Time[cycle_source_ea][cycle_destination_ea]);	else		cycle(MOVE816Time[cycle_source_ea][cycle_destination_ea]);	return;}static int disassemble(char *Instruction, char *Arg1, char *Arg2){	MOVE_Instr Instr;	Memory_RetrWordFromPC(&Instr.Code);	/* If dest is 'A' an size is (2) == 32 bit or (3)==16 bit, 	 * then it's actually a MOVEA.L/W instruction */	if(Instr.Bits.DestMode == 1 && Instr.Bits.Size >= 2)		sprintf(Instruction, "MOVEA.%c", MOVE_SizeStr[(short)Instr.Bits.Size]);	else		sprintf(Instruction, "MOVE.%c", MOVE_SizeStr[(short)Instr.Bits.Size]);	Addressing_Print(MOVE_SizeBits[(short)Instr.Bits.Size], 			Instr.Bits.SourceMode, Instr.Bits.SourceRegister, Arg1);	Addressing_Print(MOVE_SizeBits[(short)Instr.Bits.Size], 			Instr.Bits.DestMode, Instr.Bits.DestRegister, Arg2);	return 0;}int move_5206_register(void){	/* Register once for each size, we don't want to decode an instruction	 * where the size specifier turns out to be 00 */	instruction_register(0x1000, 0xF000, &execute, &disassemble);	instruction_register(0x2000, 0xF000, &execute, &disassemble);	instruction_register(0x3000, 0xF000, &execute, &disassemble);	instruction_register(0x3000, 0xF000, &execute, &disassemble);	return 1;}

⌨️ 快捷键说明

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