📄 ls_instruction.cpp
字号:
u32 index;
get_cpu()->read_register(rm_index,index);
this->shft_rm(binary,index);
get_cpu()->write_register(rn_index,rn_data - index);
}
}
return ;
}
if(u_3 == 5 && u_1 == 0)//10
{
//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
u32 index;
get_cpu()->read_register(rm_index,index);
this->shft_rm(binary,index);
get_cpu()->write_register(rn_index,rn_data + index);
}
}
return ;
}
}
void LS_Instruction::get_sh_address(Core::Instruction_Unit & binary,u32 & addr)
{
Core::Binary_32Bit bits(binary);
u32 rn_index = bits.convert_to_int(16,19);
u32 rn_data;
get_cpu()->read_register(rn_index,rn_data);
switch(bits.convert_to_int(21,24))
{
case 14:
{
u32 immed_H,immed_L,offset_8;;
immed_L = bits.convert_to_int(0,3);
immed_H = bits.convert_to_int(8,11);
offset_8 = immed_H << 4 | immed_L;
addr = rn_data + offset_8;;
if(rn_index == 15)
addr = addr + 4;
return;
}
case 10:
{
u32 immed_H,immed_L,offset_8;;
immed_L = bits.convert_to_int(0,3);
immed_H = bits.convert_to_int(8,11);
offset_8 = immed_H << 4 | immed_L;
addr = rn_data - offset_8;;
if(rn_index == 15)
addr = addr + 4;
return;
}
case 12:
{
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;
if(rn_index == 15)
addr = addr + 4;
return;
}
case 8:
{
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;
if(rn_index == 15)
addr = addr + 4;
return;
}
case 15:
{
u32 immed_H,immed_L,offset_8;;
immed_L = bits.convert_to_int(0,3);
immed_H = bits.convert_to_int(8,11);
offset_8 = immed_H << 4 | immed_L;
addr = rn_data + offset_8;
get_cpu()->write_register(rn_index,addr);
return ;
}
case 11:
{
u32 immed_H,immed_L,offset_8;;
immed_L = bits.convert_to_int(0,3);
immed_H = bits.convert_to_int(8,11);
offset_8 = immed_H << 4 | immed_L;
addr = rn_data - offset_8;
get_cpu()->write_register(rn_index,addr);
return ;
}
case 13:
{
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;
get_cpu()->write_register(rn_index,addr);
return;
}
case 9:
{
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;
get_cpu()->write_register(rn_index,addr);
return;
}
case 6:
{
addr = rn_data;
u32 immed_H,immed_L,offset_8;;
immed_L = bits.convert_to_int(0,3);
immed_H = bits.convert_to_int(8,11);
offset_8 = immed_H << 4 | immed_L;
{
get_cpu()->write_register(rn_index,rn_data + offset_8);
}
return ;
}
case 2:
{
addr = rn_data;
u32 immed_H,immed_L,offset_8;;
immed_L = bits.convert_to_int(0,3);
immed_H = bits.convert_to_int(8,11);
offset_8 = immed_H << 4 | immed_L;
{
get_cpu()->write_register(rn_index,rn_data - offset_8);
}
return ;
}
case 4:
{
addr = rn_data;
{
u32 rm_index = bits.convert_to_int(0,3);
u32 rm_data;
get_cpu()->read_register(rm_index,rm_data);
get_cpu()->write_register(rn_index,rn_data + rm_data);
}
return;
}
case 0:
{
addr = rn_data;
{
u32 rm_index = bits.convert_to_int(0,3);
u32 rm_data;
get_cpu()->read_register(rm_index,rm_data);
get_cpu()->write_register(rn_index,rn_data - rm_data);
}
return;
}
}
}
void LS_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 ;
}
}
}
/*
void LS_Instruction::bit_num(u32 & num,Core::Instruction_Unit & binary,u32 start,u32 end)
{
u32 i;
Core::Binary_32Bit bits(binary);
for(i = start;i<=end;i++)
{
if(bits.get(i))
num++;
}
}
u32 LS_Instruction::multi_address(Core::Instruction_Unit & binary,u32 & start_address,u32 & end_address)
{
Core::Binary_32Bit bits(binary);
u32 rn_index = bits.convert_to_int(16,19);
u32 num = 0;
this->bit_num(num,binary,0,15);
u32 rn_data = get_cpu()->read_register(rn_index);
switch(bits.convert_to_int(23,24))
{
case 1://1
{
//IA
start_address = rn_data;
end_address = start_address + num * 4 - 4;
if(bits.get(21))
get_cpu()->write_register(rn_index,rn_data + num * 4);
start_address = start_address & 0xfffffffc;
end_address = end_address & 0xfffffffc;
return rn_data;
}
case 3://3
{
//IB
start_address = rn_data + 4;
end_address = start_address - 4 + num * 4;//end_address = rn + num * 4
if(bits.get(21))
get_cpu()->write_register(rn_index,rn_data + num * 4);
start_address = start_address & 0xfffffffc;
end_address = end_address & 0xfffffffc;
return rn_data;
}
case 0://0
{
//DA
end_address = rn_data;
start_address = end_address + 4 - num * 4;
if(bits.get(21))
get_cpu()->write_register(rn_index,start_address - 4);
start_address = start_address & 0xfffffffc;
end_address = end_address & 0xfffffffc;
return rn_data;
}
case 2://2
{
//DB
end_address = rn_data - 4;
start_address = end_address + 4 - num * 4;
if(bits.get(21))
get_cpu()->write_register(rn_index,end_address + 4 - num * 4);
start_address = start_address & 0xfffffffc;
end_address = end_address & 0xfffffffc;
return rn_data;
}
}
*/
void LS_Instruction::get_usermode_address(Core::Instruction_Unit & binary,u32 & addr)
{
//need func for usemode
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_user_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 == 1 && u_1 == 1)//3
{
//addr = rn
//if(cond)
//rn = rn + offset_12
addr = rn_data;
{
offset_12 = bits.convert_to_int(0,11);
get_cpu()->write_user_register(rn_index,rn_data + offset_12);
}
return ;
}
if(u_3 == 0 && u_1 == 1)//1
{
//addr = rn
//if(cond)
//rn = rn -offset_12
addr = rn_data;
{
offset_12 = bits.convert_to_int(0,11);
get_cpu()->write_user_register(rn_index,rn_data - offset_12);
}
return ;
}
if(u_3 == 4 && u_1 == 1)//9
{
//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_user_register(rm_index,rm_data);
if(bits.convert_to_int(4,11) == 0)
get_cpu()->write_user_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);
u32 index = rm_data;
this->shft_rm(binary,index);
get_cpu()->write_user_register(rn_index,rn_data - index);
}
}
return ;
}
if(u_3 == 5 && u_1 == 1)//11
{
//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_user_register(rm_index,rm_data);
if(bits.convert_to_int(4,11) == 0)
get_cpu()->write_user_register(rn_index,rn_data + rm_data);
else
{
//shift rm here
u32 index = rm_data;
this->shft_rm(binary,index);
get_cpu()->write_user_register(rn_index,rn_data - index);
}
}
return ;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -