This repository has been archived on 2024-12-14. You can view files and clone it, but cannot push or open issues or pull requests.
rustboyadvance-ng/src/arm7tdmi/thumb/exec.rs

37 lines
1.2 KiB
Rust
Raw Normal View History

use crate::arm7tdmi::arm::exec::*;
use crate::arm7tdmi::arm::ArmOpCode;
use crate::arm7tdmi::bus::{Bus, MemoryAccessType::*, MemoryAccessWidth::*};
use crate::arm7tdmi::cpu::{Core, CpuExecResult, CpuPipelineAction};
use super::{ThumbFormat, ThumbInstruction};
impl Core {
fn exec_thumb_data_process_imm(
&mut self,
sysbus: &mut Bus,
insn: ThumbInstruction,
) -> CpuExecResult {
let arm_alu_op: ArmOpCode = insn.format3_op().into();
let op1 = self.get_reg(insn.rd()) as i32;
let op2 = insn.offset8() as i32;
let result = self.alu(arm_alu_op, op1, op2, true);
if let Some(result) = result {
self.set_reg(insn.rd(), result as u32);
}
// +1S
self.add_cycles(
self.pc + (self.word_size() as u32),
sysbus,
Seq + MemoryAccess32,
);
Ok(CpuPipelineAction::IncPC)
}
pub fn exec_thumb(&mut self, sysbus: &mut Bus, insn: ThumbInstruction) -> CpuExecResult {
match insn.fmt {
ThumbFormat::DataProcessImm => self.exec_thumb_data_process_imm(sysbus, insn),
_ => unimplemented!("thumb not implemented {:#}", insn),
}
}
}