Impl Thumb Format 1 untested
Former-commit-id: e80617fd415ba951310a42c79b6ca37251d0e250
This commit is contained in:
parent
058760d7e4
commit
fb0d3acb14
|
@ -91,7 +91,7 @@ impl Core {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn register_shift(&mut self, reg: usize, shift: ArmRegisterShift) -> CpuResult<i32> {
|
pub fn register_shift(&mut self, reg: usize, shift: ArmRegisterShift) -> CpuResult<i32> {
|
||||||
let val = self.get_reg(reg) as i32;
|
let val = self.get_reg(reg) as i32;
|
||||||
match shift {
|
match shift {
|
||||||
ArmRegisterShift::ShiftAmount(amount, shift) => {
|
ArmRegisterShift::ShiftAmount(amount, shift) => {
|
||||||
|
@ -264,10 +264,8 @@ impl Core {
|
||||||
|
|
||||||
if insn.load_flag() {
|
if insn.load_flag() {
|
||||||
let data = if insn.transfer_size() == 1 {
|
let data = if insn.transfer_size() == 1 {
|
||||||
// +1N
|
|
||||||
self.load_8(addr, bus) as u32
|
self.load_8(addr, bus) as u32
|
||||||
} else {
|
} else {
|
||||||
// +1N
|
|
||||||
self.load_32(addr, bus)
|
self.load_32(addr, bus)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -275,7 +273,7 @@ impl Core {
|
||||||
|
|
||||||
// +1I
|
// +1I
|
||||||
self.add_cycle();
|
self.add_cycle();
|
||||||
// +y
|
|
||||||
if insn.rd() == REG_PC {
|
if insn.rd() == REG_PC {
|
||||||
pipeline_action = CpuPipelineAction::Flush;
|
pipeline_action = CpuPipelineAction::Flush;
|
||||||
}
|
}
|
||||||
|
@ -284,7 +282,6 @@ impl Core {
|
||||||
if insn.transfer_size() == 1 {
|
if insn.transfer_size() == 1 {
|
||||||
self.store_8(addr, value as u8, bus);
|
self.store_8(addr, value as u8, bus);
|
||||||
} else {
|
} else {
|
||||||
// +1N
|
|
||||||
self.store_32(addr, value, bus);
|
self.store_32(addr, value, bus);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,22 @@ fn pop(cpu: &mut Core, bus: &mut Bus, r: usize) {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Core {
|
impl Core {
|
||||||
|
fn exec_thumb_move_shifted_reg(
|
||||||
|
&mut self,
|
||||||
|
bus: &mut Bus,
|
||||||
|
insn: ThumbInstruction,
|
||||||
|
) -> CpuExecResult {
|
||||||
|
let result = self
|
||||||
|
.register_shift(
|
||||||
|
insn.rs(),
|
||||||
|
ArmRegisterShift::ShiftAmount(insn.offset5() as u8 as u32, insn.format1_op()),
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
self.gpr[insn.rd()] = result as u32;
|
||||||
|
|
||||||
|
Ok(CpuPipelineAction::IncPC)
|
||||||
|
}
|
||||||
|
|
||||||
fn exec_thumb_add_sub(&mut self, bus: &mut Bus, insn: ThumbInstruction) -> CpuExecResult {
|
fn exec_thumb_add_sub(&mut self, bus: &mut Bus, insn: ThumbInstruction) -> CpuExecResult {
|
||||||
let op1 = self.get_reg(insn.rs()) as i32;
|
let op1 = self.get_reg(insn.rs()) as i32;
|
||||||
let op2 = if insn.is_immediate_operand() {
|
let op2 = if insn.is_immediate_operand() {
|
||||||
|
@ -222,6 +238,7 @@ impl Core {
|
||||||
|
|
||||||
pub fn exec_thumb(&mut self, bus: &mut Bus, insn: ThumbInstruction) -> CpuExecResult {
|
pub fn exec_thumb(&mut self, bus: &mut Bus, insn: ThumbInstruction) -> CpuExecResult {
|
||||||
match insn.fmt {
|
match insn.fmt {
|
||||||
|
ThumbFormat::MoveShiftedReg => self.exec_thumb_move_shifted_reg(bus, insn),
|
||||||
ThumbFormat::AddSub => self.exec_thumb_add_sub(bus, insn),
|
ThumbFormat::AddSub => self.exec_thumb_add_sub(bus, insn),
|
||||||
ThumbFormat::DataProcessImm => self.exec_thumb_data_process_imm(bus, insn),
|
ThumbFormat::DataProcessImm => self.exec_thumb_data_process_imm(bus, insn),
|
||||||
ThumbFormat::Mul => self.exec_thumb_mul(bus, insn),
|
ThumbFormat::Mul => self.exec_thumb_mul(bus, insn),
|
||||||
|
@ -233,7 +250,7 @@ impl Core {
|
||||||
ThumbFormat::AddSp => self.exec_thumb_add_sp(bus, insn),
|
ThumbFormat::AddSp => self.exec_thumb_add_sp(bus, insn),
|
||||||
ThumbFormat::PushPop => self.exec_thumb_push_pop(bus, insn),
|
ThumbFormat::PushPop => self.exec_thumb_push_pop(bus, insn),
|
||||||
ThumbFormat::BranchConditional => self.exec_thumb_branch_with_cond(bus, insn),
|
ThumbFormat::BranchConditional => self.exec_thumb_branch_with_cond(bus, insn),
|
||||||
_ => unimplemented!("thumb not implemented {:#?}", insn),
|
_ => unimplemented!("thumb not implemented {:#x?}", insn),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue