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