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

📄 ls_instruction.cpp

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

	void LS_Instruction::LDRT(Core::Instruction_Unit & binary)
	{
		u32 value;
		u32 addr;
		u8 addr_tale;
		Core::Binary_32Bit bits(binary);
		u32 rd_index = bits.convert_to_int(12,15);//need get usermode register here
		this->get_usermode_address(binary,addr);
		Core::Bytecode_Type buffer;
		addr_tale =(u8) (addr % 4);

		switch(addr_tale)
		{
		case 0:
			{
				//value = [addr]
				/*if((error_no = get_cpu()->get_mmu().access(Memory_32Bit::MEMORY_READ,addr,4,buffer)) != 0);
				//					Core::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)
				{
					get_cpu()->on_dataabt_exception(); 
					return;
				}
				Wukong_Get_System().convert_from_bytecode(buffer,value);
				break;
			}
		case 1:
			{	
				//value = [addr - 1]
				//value = value rotate right 8
				/*if((error_no = get_cpu()->get_mmu().access(Memory_32Bit::MEMORY_READ,addr-1,4,buffer)) != 0);
				//					Core::Wukong_Get_System()	.set_last_error(error_no);*/

				if ( (get_cpu()->get_mmu().access(Core::Memory_32Bit::MEMORY_READ, addr-1, 4, buffer)) == MMU::PAGE_TRANSLATION_FAULT)
				{
					get_cpu()->on_dataabt_exception(); 
					return;
				}
				Core::Wukong_Get_System().convert_from_bytecode(buffer,value);
				this->rotate_right(value,8);
				break;
			}
		case 2:
			{
				//value = [addr - 2]
				//value = value rotate right 16
				/*if(error_no = get_cpu()->get_mmu().access(Memory_32Bit::MEMORY_READ,addr-2,4,buffer) != 0);
				//					Core::Wukong_Get_System()	.set_last_error(error_no);*/

				if ( (get_cpu()->get_mmu().access(Core::Memory_32Bit::MEMORY_READ, addr-2, 4, buffer)) == MMU::PAGE_TRANSLATION_FAULT)
				{
					get_cpu()->on_dataabt_exception(); 
					return;
				}
				Core::Wukong_Get_System().convert_from_bytecode(buffer,value);
				this->rotate_right(value,16);
				break;
			}
		case 3:
			{
				//value = [addr - 3]
				//value = value rotate right 24
				/*if(error_no = get_cpu()->get_mmu().access(Memory_32Bit::MEMORY_READ,addr-3,4,buffer) != 0);
				//					Core::Wukong_Get_System()	.set_last_error(error_no);*/

				if ( (get_cpu()->get_mmu().access(Core::Memory_32Bit::MEMORY_READ, addr-3, 4, buffer)) == MMU::PAGE_TRANSLATION_FAULT)
				{
					get_cpu()->on_dataabt_exception(); 
					return;
				}
				Core::Wukong_Get_System().convert_from_bytecode(buffer,value);
				this->rotate_right(value,24);
				break;
			}
		}
		this->get_cpu()->write_register(rd_index,value);
	}

	void LS_Instruction::STR(Core::Instruction_Unit & binary)
	{
		u32 value;
		u32 addr;
		Core::Binary_32Bit bits(binary);
		u32 rd_index = bits.convert_to_int(12,15);
		this->get_address(binary,addr);
		Core::Bytecode_Type buffer;
		addr = addr & 0xfffffffc;
		get_cpu()->read_register(rd_index,value);
		if(rd_index == 15)
			Core::Wukong_Get_System().convert_to_bytecode(value + 8, buffer);
		else
			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);
		//			Core::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)
		{
			get_cpu()->on_dataabt_exception(); 
			return;
		}
	}

	void LS_Instruction::STRB(Core::Instruction_Unit & binary)
	{
		u8 value_8;
		u32 value,addr;
		Core::Binary_32Bit bits(binary);
		u32 rd_index = bits.convert_to_int(12,15);
		this->get_address(binary,addr);
		Core::Bytecode_Type buffer;
		get_cpu()->read_register(rd_index,value);
		value_8 = (u8)(value);
		Core::Wukong_Get_System().convert_to_bytecode(value_8, buffer);
		/*if((error_no = get_cpu()->get_mmu().access(Memory_32Bit::MEMORY_WRITE,addr,1,buffer)) != 0);
		//			Core::Wukong_Get_System()	.set_last_error(error_no);*/

		if ( (get_cpu()->get_mmu().access(Core::Memory_32Bit::MEMORY_WRITE, addr, 1, buffer)) == MMU::PAGE_TRANSLATION_FAULT)
		{
			get_cpu()->on_dataabt_exception(); 
			return;
		}
	}

	void LS_Instruction::STRT(Core::Instruction_Unit & binary)
	{
		u32 value;
		u32 addr;
		Core::Binary_32Bit bits(binary);
		u32 rd_index = bits.convert_to_int(12,15);//need get usermode register here
		this->get_usermode_address(binary,addr);
		Core::Bytecode_Type buffer;
		addr = addr & 0xfffffffc;
		get_cpu()->read_register(rd_index,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);
		//			Core::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)
		{
			get_cpu()->on_dataabt_exception(); 
			return;
		}
	}

	void LS_Instruction::STRBT(Core::Instruction_Unit & binary)
	{
		u8 value_8;
		u32 value;
		u32 addr;
		Core::Binary_32Bit bits(binary);
		u32 rd_index = bits.convert_to_int(12,15);//need to get usermode reg
		this->get_usermode_address(binary,addr);
		Core::Bytecode_Type buffer;
		get_cpu()->read_register(rd_index,value);
		value_8 = (u8)value;
		Core::Wukong_Get_System().convert_to_bytecode(value_8, buffer);
		/*if((error_no = get_cpu()->get_mmu().access(Memory_32Bit::MEMORY_WRITE,addr,1,buffer)) != 0);
		//			Core::Wukong_Get_System()	.set_last_error(error_no);*/

		if ( (get_cpu()->get_mmu().access(Core::Memory_32Bit::MEMORY_WRITE, addr, 1, buffer)) == MMU::PAGE_TRANSLATION_FAULT)
		{
			get_cpu()->on_dataabt_exception(); 
			return;
		}
	}

	void LS_Instruction::STRH(Core::Instruction_Unit & binary)
	{
		u32  value;
		u16 value_16;
		u32 addr;
		Core::Binary_32Bit bits(binary);
		u32 rd_index = bits.convert_to_int(12,15);
		this->get_sh_address(binary,addr);
		Core::Bytecode_Type buffer;
		addr = addr & 0xfffffffe;
		get_cpu()->read_register(rd_index,value);
		value_16 = (u16)(value);
		Core::Wukong_Get_System().convert_to_bytecode(value, buffer);
		/*if((error_no = get_cpu()->get_mmu().access(Memory_32Bit::MEMORY_WRITE,addr,2,buffer)) != 0);
		//			Core::Wukong_Get_System()	.set_last_error(error_no);*/

		if ( (get_cpu()->get_mmu().access(Core::Memory_32Bit::MEMORY_WRITE, addr, 2, buffer)) == MMU::PAGE_TRANSLATION_FAULT)
		{
			get_cpu()->on_dataabt_exception(); 
			return;
		}
	}

	void LS_Instruction::get_address(Core::Instruction_Unit & binary,u32 & addr)
	{
		u32 offset_12;
		Core::Binary_32Bit bits(binary);
		u32 rn_index = bits.convert_to_int(16,19);
		u32 extra;
		u32 rn_data;
		get_cpu()->read_register(rn_index,rn_data);
		if(rn_index == 15)
			extra = 4;
		else
			extra = 0;
		u32 u_3 = bits.convert_to_int(23,25);
		u32 u_1 = bits.get(21);
		if(u_3 == 3 && u_1 == 0)
		{
			//addr = rn + offset_12
			offset_12 = bits.convert_to_int(0,11);
			addr =rn_data + offset_12;
			addr += extra;
			return ;
		}
		if(u_3 == 2 && u_1 == 0)
		{
			//addr = rn - offset_12;
			offset_12 = bits.convert_to_int(0,11);
			addr = rn_data - offset_12;
			addr += extra;
			return ;
		}
		if(u_3 == 7 && u_1 == 0)
		{
			if(bits.convert_to_int(4,11) == 0)
			{
				//addr = rn + rm
				u32 rm_index = bits.convert_to_int(0,3);
				u32 rm_data;
				get_cpu()->read_register(rm_index,rm_data);
				addr = rn_data + rm_data;
				addr += extra;
			}
			else
			{
				//addr = rn + rm shift imm
				u32 rm_index = bits.convert_to_int(0,3);
				u32 index;
				get_cpu()->read_register(rm_index,index);
				this->shft_rm(binary,index);
				addr = rn_data + index;
				addr += extra;
			}
			return ;
		}
		if(u_3 == 6 && u_1 == 0)//12
		{
			if(bits.convert_to_int(4,11) == 0)
			{
				//addr = rn - rm
				u32 rm_index = bits.convert_to_int(0,3);
				u32 rm_data;
				get_cpu()->read_register(rm_index,rm_data);
				addr = rn_data - rm_data;
				addr += extra;
			}
			else
			{
				//addr = rn - rm shift imm
				u32 rm_index = bits.convert_to_int(0,3);
				u32 index;
				get_cpu()->read_register(rm_index,index);
				this->shft_rm(binary,index);
				addr = rn_data - index;
				addr += extra;
			}
			return ;
		}
		if(u_3 == 3 && u_1 == 1)//7
		{
			//addr = rn + offset_12
			//if(cond) 
			//rn = addr
			offset_12 = bits.convert_to_int(0,11);
			addr = rn_data + offset_12;
			get_cpu()->write_register(rn_index,addr);
			return ;
		}
		if(u_3 == 2 && u_1 == 1)//5
		{
			//addr = rn - offset_12
			//if(cond)
			//rn = addr
			offset_12 = bits.convert_to_int(0,11);
			addr = rn_data - offset_12;
			get_cpu()->write_register(rn_index,addr);
			return ;
		}
		if(u_3 == 7 && u_1 == 1)//15
		{
			//addr = rn + rm or addr = rn + rm shift imm
			//if(cond)
			//rn = addr
			if(bits.convert_to_int(4,11) == 0)
			{
				u32 rm_index = bits.convert_to_int(0,3);
				u32 rm_data;
				get_cpu()->read_register(rm_index,rm_data);
				addr = rn_data + rm_data;
				addr += extra;
			}
			else
			{
				//shift rm here
				u32 rm_index = bits.convert_to_int(0,3);
				u32 index;
				get_cpu()->read_register(rm_index,index);
				this->shft_rm(binary,index);
				addr = rn_data + index;
				addr += extra;
			}
			get_cpu()->write_register(rn_index,addr);
			return ;
		}
		if(u_3 == 6 && u_1 == 1)//13
		{
			//addr = rn - rm or addr = rn - rm shift imm
			//if(cond)
			//rn = addr
			if(bits.convert_to_int(4,11) == 0)
			{
				u32 rm_index = bits.convert_to_int(0,3);
				u32 rm_data;
				get_cpu()->read_register(rm_index,rm_data);
				addr = rn_data - rm_data;
				addr += extra;
			}
			else
			{
				//shift rm here
				u32 rm_index = bits.convert_to_int(0,3);
				u32 index;
				get_cpu()->read_register(rm_index,index);
				this->shft_rm(binary,index);
				addr = rn_data - index;
				addr += extra;
			}
			get_cpu()->write_register(rn_index,addr);
			return ;
		}
		if(u_3 == 1 && u_1 == 0)//2
		{
			//addr = rn
			//if(cond)
			//rn = rn + offset_12
			addr = rn_data;
			{
				offset_12 = bits.convert_to_int(0,11);
				get_cpu()->write_register(rn_index,rn_data + offset_12);
			}
			return ;
		}
		if(u_3 == 0 && u_1 == 0)//0
		{
			//addr = rn
			//if(cond)
			//rn = rn -offset_12
			addr = rn_data;
			{
				offset_12 = bits.convert_to_int(0,11);
				get_cpu()->write_register(rn_index,rn_data - offset_12);
			}
			return ;
		}
		if(u_3 == 4 && u_1 == 0)//8
		{	
			//addr = rn
			//if(cond)
			//rn = rn - rm or rn = rn - rm shift imm
			addr = rn_data;
			{
				u32 rm_index = bits.convert_to_int(0,3);
				u32 rm_data;
				get_cpu()->read_register(rm_index,rm_data);
				if(bits.convert_to_int(4,11) == 0)
					get_cpu()->write_register(rn_index,rn_data - rm_data);
				else
				{
					//shift rm here
					//	rm_index = this->BITS(instr,0,3);
					//	Register_32bit & rm = this->get_register(rm_index);

⌨️ 快捷键说明

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