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

📄 mls_instruction.cpp

📁 浙江大学的悟空嵌入式系统模拟器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	}

	void MLS_Instruction::LDM2(Core::Instruction_Unit & binary)
	{

		Core::Binary_32Bit bits(binary);
		u32 start_address,end_address,addr,value;
		Core::Bytecode_Type buffer;
		Core::Error_Type error_no;
		u32 original_rn = this->multi_address(binary,start_address,end_address);
		addr = start_address;
		for(u32 i = 0;i<15;i++)
		{
			if(bits.get(i))
			{
				/*if((error_no = get_cpu()->get_mmu().access(Memory_32Bit::MEMORY_READ,addr,4,buffer)) != 0);
				//					Wukong_Get_System().set_last_error(error_no);	*/

				if ( (get_cpu()->get_mmu().access(Core::Memory_32Bit::MEMORY_READ, addr, 4, buffer)) == MMU::PAGE_TRANSLATION_FAULT)
				{
					if(ARM::Instruction::version_num == 5)
					{
						u32 rn_index = bits.convert_to_int(16,19);
						get_cpu()->write_register(rn_index,original_rn);
					}
					get_cpu()->on_dataabt_exception(); 
					return;
				}
				Wukong_Get_System().convert_from_bytecode(buffer,value);
				get_cpu()->write_user_register(i,value);
				addr += 4;
				buffer.clear();
			}
		}
		assert(end_address == addr - 4);
	}

	void MLS_Instruction::LDM3(Core::Instruction_Unit & binary)
	{

		Core::Binary_32Bit bits(binary);
		u32 start_address,end_address,addr,value;
		Core::Bytecode_Type buffer;
		Core::Error_Type error_no;
		u32 original_rn = this->multi_address(binary,start_address,end_address);
		addr = start_address;
		for(u32 i = 0;i<15;i++)
		{
			if(bits.get(i))
			{
				/*if((error_no = get_cpu()->get_mmu().access(Memory_32Bit::MEMORY_READ,addr,4,buffer)) != 0);
				//					Wukong_Get_System().set_last_error(error_no);	*/

				if ( (get_cpu()->get_mmu().access(Core::Memory_32Bit::MEMORY_READ, addr, 4, buffer)) == MMU::PAGE_TRANSLATION_FAULT)
				{
					if(ARM::Instruction::version_num == 5)
					{
						u32 rn_index = bits.convert_to_int(16,19);
						get_cpu()->write_register(rn_index,original_rn);
					}
					get_cpu()->on_dataabt_exception(); 
					return;
				}
				Wukong_Get_System().convert_from_bytecode(buffer,value);
				get_cpu()->write_register(i,value);
				addr += 4;
				buffer.clear();
			}
		}
		u32 spsr_data = get_cpu()->get_spsr().convert_to_int();
		get_cpu()->get_cpsr().convert_from_int(spsr_data);
		CPU_7TDMI::CPU_Interrupt temp_iter = get_cpu()->pop_exception();
		get_cpu()->set_exp_priority(temp_iter);
		get_cpu()->set_cpu_mode();
		/*	if((error_no = get_cpu()->get_mmu().access(Memory_32Bit::MEMORY_READ,addr,4,buffer)) != 0);
		//			Wukong_Get_System().set_last_error(error_no);			*/

		if ( (get_cpu()->get_mmu().access(Core::Memory_32Bit::MEMORY_READ, addr, 4, buffer)) == MMU::PAGE_TRANSLATION_FAULT)
		{
			if(ARM::Instruction::version_num == 5)
			{
				u32 rn_index = bits.convert_to_int(16,19);
				get_cpu()->write_register(rn_index,original_rn);
			}
			get_cpu()->on_dataabt_exception(); 
			return;
		}
		Wukong_Get_System().convert_from_bytecode(buffer,value);
		//architecture 5 or above has different ways to deal with it
		if(bits.get(5))
			get_cpu()->write_register(15,value & 0xfffffffe);
		else
			get_cpu()->write_register(15,value & 0xfffffffc);
		addr += 4;
		buffer.clear();
		assert(end_address == addr - 4);
	}

	void MLS_Instruction::STM1(Core::Instruction_Unit & binary)
	{

		Core::Binary_32Bit bits(binary);
		u32 start_address,end_address,addr,value,original_rn;
		Core::Bytecode_Type buffer;
		Core::Error_Type error_no;
		bool first_flag = true;
		original_rn = this->multi_address(binary,start_address,end_address);
		addr = start_address;
		u32 rn_index = bits.convert_to_int(16,19);
		for(u32 i = 0;i<15;i++)
		{
			if(bits.get(i))
			{
				if(rn_index == i && first_flag)
				{
					Core::Wukong_Get_System().convert_to_bytecode(original_rn, buffer);
					/*	if((error_no = get_cpu()->get_mmu().access(Memory_32Bit::MEMORY_WRITE,addr,4,buffer)) != 0);
					//						Wukong_Get_System().set_last_error(error_no);	*/
					if ( (get_cpu()->get_mmu().access(Core::Memory_32Bit::MEMORY_WRITE, addr, 4, buffer)) == MMU::PAGE_TRANSLATION_FAULT)
					{
						if(ARM::Instruction::version_num == 5)
						{
							u32 rn_index = bits.convert_to_int(16,19);
							get_cpu()->write_register(rn_index,original_rn);
						}
						get_cpu()->on_dataabt_exception(); 
						return;
					}
					first_flag = false;
				}
				else
				{
					get_cpu()->read_register(i,value);
					Core::Wukong_Get_System().convert_to_bytecode(value, buffer);
					/*if((error_no = get_cpu()->get_mmu().access(Memory_32Bit::MEMORY_WRITE,addr,4,buffer)) != 0);
					//						Wukong_Get_System().set_last_error(error_no);			*/

					if ( (get_cpu()->get_mmu().access(Core::Memory_32Bit::MEMORY_WRITE, addr, 4, buffer)) == MMU::PAGE_TRANSLATION_FAULT)
					{
						if(ARM::Instruction::version_num == 5)
						{
							u32 rn_index = bits.convert_to_int(16,19);
							get_cpu()->write_register(rn_index,original_rn);
						}
						get_cpu()->on_dataabt_exception(); 
						return;
					}
				}
				addr += 4;
				buffer.clear();
			}
		}
		if(bits.get(15))
		{
			get_cpu()->read_register(15,value);
			Core::Wukong_Get_System().convert_to_bytecode(value + 8, buffer);
			//architecture 5 or above has different ways to deal with it
			/*if((error_no = get_cpu()->get_mmu().access(Memory_32Bit::MEMORY_WRITE,addr,4,buffer)) != 0);
			//					Wukong_Get_System().set_last_error(error_no);		*/

			if ( (get_cpu()->get_mmu().access(Core::Memory_32Bit::MEMORY_WRITE, addr, 4, buffer)) == MMU::PAGE_TRANSLATION_FAULT)
			{
				if(ARM::Instruction::version_num == 5)
				{
					u32 rn_index = bits.convert_to_int(16,19);
					get_cpu()->write_register(rn_index,original_rn);
				}
				get_cpu()->on_dataabt_exception(); 
				return;
			}
			addr += 4;
			buffer.clear();
		}
		assert(end_address == addr - 4);
	}

	void MLS_Instruction::STM2(Core::Instruction_Unit & binary)
	{

		Core::Binary_32Bit bits(binary);
		u32 start_address,end_address,addr,value;
		Core::Bytecode_Type buffer;
		Core::Error_Type error_no;
		bool first_flag = true;
		u32 original_rn = this->multi_address(binary,start_address,end_address);
		addr = start_address;

		for(u32 i = 0;i<15;i++)
		{
			if(bits.get(i))
			{
				get_cpu()->read_user_register(i,value);
				Core::Wukong_Get_System().convert_to_bytecode(value, buffer);
				/*if((error_no = get_cpu()->get_mmu().access(Memory_32Bit::MEMORY_WRITE,addr,4,buffer)) != 0);
				//					Wukong_Get_System().set_last_error(error_no);		*/

				if ( (get_cpu()->get_mmu().access(Core::Memory_32Bit::MEMORY_WRITE, addr, 4, buffer)) == MMU::PAGE_TRANSLATION_FAULT)
				{
					if(ARM::Instruction::version_num == 5)
					{
						u32 rn_index = bits.convert_to_int(16,19);
						get_cpu()->write_register(rn_index,original_rn);
					}
					get_cpu()->on_dataabt_exception(); 
					return;
				}
				addr += 4;
				buffer.clear();
			}
		}
		if(bits.get(15))
		{
			get_cpu()->read_user_register(15,value);
			Core::Wukong_Get_System().convert_to_bytecode(value + 8, buffer);
			//architecture 5 or above has different ways to deal with it
			/*if((error_no = get_cpu()->get_mmu().access(Memory_32Bit::MEMORY_WRITE,addr,4,buffer)) != 0);
			//					Wukong_Get_System().set_last_error(error_no);			*/

			if ( (get_cpu()->get_mmu().access(Core::Memory_32Bit::MEMORY_WRITE, addr, 4, buffer)) == MMU::PAGE_TRANSLATION_FAULT)
			{
				if(ARM::Instruction::version_num == 5)
				{
					u32 rn_index = bits.convert_to_int(16,19);
					get_cpu()->write_register(rn_index,original_rn);
				}
				get_cpu()->on_dataabt_exception(); 
				return;
			}
			addr += 4;
			buffer.clear();
		}
		assert(end_address == addr - 4);
	}

	void MLS_Instruction::shft_rm(Core::Instruction_Unit & binary,u32 & index)
	{
		Core::Binary_32Bit bits(binary);
		u32 shift_imm = bits.convert_to_int(7,11);
		switch(bits.convert_to_int(5,6))
		{

		case 0://0
			{
				//LSL
				this->logical_left(index,shift_imm);
				return ;
			}
		case 1://1
			{
				//LSR
				if(shift_imm == 0)
					index = 0;
				else
					this->logical_right(index,shift_imm);
				return;
			}
		case 2://2
			{
				//ASR
				if(shift_imm == 0)
				{
					Core::Binary_32Bit test(index);
					if(test.get(31))
						index = 0xffffffff;
					else
						index = 0;
				}
				else
					this->arithmetic_right(index,shift_imm);
				return ;
			}
		case 3://3
			{
				//ROR or RRX
				if(shift_imm == 0)
					this->rotate_right_extend(index,shift_imm);
				else
					this->rotate_right(index,shift_imm);
				return ;
			}
		}
	}
}

⌨️ 快捷键说明

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