feat(memory): retain sequential Thumb IWRAM bus lanes
Track a separate IWRAM latch with known lanes and transactional updates. Sequential Thumb prefetches and IWRAM byte/halfword/word reads and writes drive only addressed lanes. Other regions and host inspection do not replace the latch. Failed instructions discard staged changes. Keep cold, refill, discontinuous-entry, IRQ, and DMA-transition history conservative. Share Thumb refill classification with nominal timing, including PC writes to fallthrough. Successful DMA and accepted machine IRQs invalidate history; failed DMA preserves it. Document source evidence, bounded scope, and remaining hardware-validation limits. Add original lane, alignment, mirror/wrap, signed/unaligned-load, mode, block-transfer, rollback, isolation, control-flow, IRQ/DMA, and nominal-cost regressions. Darwin arm64 validation: 905 workspace tests and 836 core/demo tests per debug/release profile; 39 preparation tests; native ROM windows in both profiles; ten graphics/window smoke modes; fmt, clippy, and rustdoc. Public ARM, Thumb, memory, and BIOS reports remain identical to prior passing reports and between profiles.
This commit is contained in:
parent
8360ba4652
commit
46af481487
17 changed files with 761 additions and 28 deletions
|
|
@ -22,6 +22,8 @@ mod exception_tests;
|
|||
#[cfg(test)]
|
||||
mod instruction_tests;
|
||||
#[cfg(test)]
|
||||
mod iwram_open_bus_tests;
|
||||
#[cfg(test)]
|
||||
mod load_alias_tests;
|
||||
#[cfg(test)]
|
||||
mod open_bus_tests;
|
||||
|
|
@ -208,9 +210,15 @@ impl Cpu {
|
|||
fn execute_fetched(&mut self, instruction: u32, memory: &mut Memory) -> Result<(), CpuError> {
|
||||
// Record the executing instruction, not an operand's pipelined PC value.
|
||||
// Always clear the access context, including on diagnostic errors.
|
||||
memory.begin_cpu_access(self.pc(), self.instruction_set);
|
||||
let pc = self.pc();
|
||||
let sequential_thumb =
|
||||
self.instruction_set == InstructionSet::Thumb && !self.thumb_refills(instruction);
|
||||
memory.begin_cpu_access(pc, self.instruction_set);
|
||||
let result = self.execute_instruction(instruction, memory);
|
||||
memory.end_cpu_access(result.is_ok());
|
||||
let sequential = sequential_thumb
|
||||
&& self.instruction_set == InstructionSet::Thumb
|
||||
&& self.pc() == pc.wrapping_add(2);
|
||||
memory.end_cpu_access(result.is_ok(), sequential);
|
||||
result
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue