📄 ls_instruction.cpp
字号:
}
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 + -