Implement thumb17 (Swi)
Former-commit-id: 62d7e14e9b84e74d9236e1f0a5e961ae805f861c
This commit is contained in:
parent
eea26d2393
commit
7501adfd12
|
@ -3,7 +3,6 @@ use crate::bit::BitIndex;
|
||||||
use crate::core::arm7tdmi::alu::*;
|
use crate::core::arm7tdmi::alu::*;
|
||||||
use crate::core::arm7tdmi::bus::Bus;
|
use crate::core::arm7tdmi::bus::Bus;
|
||||||
use crate::core::arm7tdmi::cpu::{Core, CpuExecResult};
|
use crate::core::arm7tdmi::cpu::{Core, CpuExecResult};
|
||||||
use crate::core::arm7tdmi::exception::Exception;
|
|
||||||
use crate::core::arm7tdmi::psr::RegPSR;
|
use crate::core::arm7tdmi::psr::RegPSR;
|
||||||
use crate::core::arm7tdmi::{
|
use crate::core::arm7tdmi::{
|
||||||
Addr, CpuError, CpuMode, CpuResult, CpuState, DecodedInstruction, REG_PC,
|
Addr, CpuError, CpuMode, CpuResult, CpuState, DecodedInstruction, REG_PC,
|
||||||
|
@ -20,7 +19,7 @@ impl Core {
|
||||||
ArmFormat::BX => self.exec_bx(bus, insn),
|
ArmFormat::BX => self.exec_bx(bus, insn),
|
||||||
ArmFormat::B_BL => self.exec_b_bl(bus, insn),
|
ArmFormat::B_BL => self.exec_b_bl(bus, insn),
|
||||||
ArmFormat::DP => self.exec_data_processing(bus, insn),
|
ArmFormat::DP => self.exec_data_processing(bus, insn),
|
||||||
ArmFormat::SWI => self.exec_swi(bus, insn),
|
ArmFormat::SWI => self.exec_swi(),
|
||||||
ArmFormat::LDR_STR => self.exec_ldr_str(bus, insn),
|
ArmFormat::LDR_STR => self.exec_ldr_str(bus, insn),
|
||||||
ArmFormat::LDR_STR_HS_IMM => self.exec_ldr_str_hs(bus, insn),
|
ArmFormat::LDR_STR_HS_IMM => self.exec_ldr_str_hs(bus, insn),
|
||||||
ArmFormat::LDR_STR_HS_REG => self.exec_ldr_str_hs(bus, insn),
|
ArmFormat::LDR_STR_HS_REG => self.exec_ldr_str_hs(bus, insn),
|
||||||
|
@ -70,12 +69,6 @@ impl Core {
|
||||||
self.branch_exchange(self.get_reg(insn.rn()))
|
self.branch_exchange(self.get_reg(insn.rn()))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn exec_swi(&mut self, _bus: &mut Bus, _insn: ArmInstruction) -> CpuExecResult {
|
|
||||||
self.exception(Exception::SoftwareInterrupt);
|
|
||||||
self.flush_pipeline();
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn exec_mrs(&mut self, _bus: &mut Bus, insn: ArmInstruction) -> CpuExecResult {
|
fn exec_mrs(&mut self, _bus: &mut Bus, insn: ArmInstruction) -> CpuExecResult {
|
||||||
let mode = self.cpsr.mode();
|
let mode = self.cpsr.mode();
|
||||||
let result = if insn.spsr_flag() {
|
let result = if insn.spsr_flag() {
|
||||||
|
|
|
@ -240,6 +240,12 @@ impl Core {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn exec_swi(&mut self) -> CpuExecResult {
|
||||||
|
self.exception(Exception::SoftwareInterrupt);
|
||||||
|
self.flush_pipeline();
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
fn step_arm_exec(&mut self, insn: u32, sb: &mut Bus) -> CpuResult<()> {
|
fn step_arm_exec(&mut self, insn: u32, sb: &mut Bus) -> CpuResult<()> {
|
||||||
let pc = self.pc;
|
let pc = self.pc;
|
||||||
match self.pipeline_state {
|
match self.pipeline_state {
|
||||||
|
|
|
@ -261,6 +261,14 @@ impl ThumbInstruction {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn fmt_thumb_swi(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
write!(
|
||||||
|
f,
|
||||||
|
"swi\t{value:#x}",
|
||||||
|
value = self.raw & 0xff,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
fn fmt_thumb_branch(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
fn fmt_thumb_branch(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
write!(
|
write!(
|
||||||
f,
|
f,
|
||||||
|
@ -304,6 +312,7 @@ impl fmt::Display for ThumbInstruction {
|
||||||
ThumbFormat::PushPop => self.fmt_thumb_push_pop(f),
|
ThumbFormat::PushPop => self.fmt_thumb_push_pop(f),
|
||||||
ThumbFormat::LdmStm => self.fmt_thumb_ldm_stm(f),
|
ThumbFormat::LdmStm => self.fmt_thumb_ldm_stm(f),
|
||||||
ThumbFormat::BranchConditional => self.fmt_thumb_branch_with_cond(f),
|
ThumbFormat::BranchConditional => self.fmt_thumb_branch_with_cond(f),
|
||||||
|
ThumbFormat::Swi => self.fmt_thumb_swi(f),
|
||||||
ThumbFormat::Branch => self.fmt_thumb_branch(f),
|
ThumbFormat::Branch => self.fmt_thumb_branch(f),
|
||||||
ThumbFormat::BranchLongWithLink => self.fmt_thumb_branch_long_with_link(f),
|
ThumbFormat::BranchLongWithLink => self.fmt_thumb_branch_long_with_link(f),
|
||||||
_ => write!(f, "({:?})", self),
|
_ => write!(f, "({:?})", self),
|
||||||
|
|
|
@ -436,6 +436,7 @@ impl Core {
|
||||||
ThumbFormat::PushPop => self.exec_thumb_push_pop(bus, insn),
|
ThumbFormat::PushPop => self.exec_thumb_push_pop(bus, insn),
|
||||||
ThumbFormat::LdmStm => self.exec_thumb_ldm_stm(bus, insn),
|
ThumbFormat::LdmStm => self.exec_thumb_ldm_stm(bus, insn),
|
||||||
ThumbFormat::BranchConditional => self.exec_thumb_branch_with_cond(bus, insn),
|
ThumbFormat::BranchConditional => self.exec_thumb_branch_with_cond(bus, insn),
|
||||||
|
ThumbFormat::Swi => self.exec_swi(),
|
||||||
ThumbFormat::Branch => self.exec_thumb_branch(bus, insn),
|
ThumbFormat::Branch => self.exec_thumb_branch(bus, insn),
|
||||||
ThumbFormat::BranchLongWithLink => self.exec_thumb_branch_long_with_link(bus, insn),
|
ThumbFormat::BranchLongWithLink => self.exec_thumb_branch_long_with_link(bus, insn),
|
||||||
_ => unimplemented!("thumb not implemented {:#x?}", insn),
|
_ => unimplemented!("thumb not implemented {:#x?}", insn),
|
||||||
|
|
Reference in a new issue