From a92e965cde3ae3f1c784d56041ecdcba1e1afa41 Mon Sep 17 00:00:00 2001 From: Franco Colmenarez Date: Sun, 10 Nov 2024 17:51:49 -0500 Subject: [PATCH] fix more instructions --- snes-core/src/cpu/instructions/plp.rs | 5 +++++ snes-core/src/cpu/instructions/xce.rs | 7 +++++-- snes-core/src/ppu/registers.rs | 1 + snes-frontend/src/emu_ui/debug/ppu.rs | 3 ++- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/snes-core/src/cpu/instructions/plp.rs b/snes-core/src/cpu/instructions/plp.rs index 21d1753..58eed86 100644 --- a/snes-core/src/cpu/instructions/plp.rs +++ b/snes-core/src/cpu/instructions/plp.rs @@ -15,6 +15,11 @@ impl CPUInstruction for PLP { if registers.emulation_mode { registers.set_memory_select_flag(true); registers.set_index_register_select_flag(true); + } else { + if !registers.is_16bit_index() { + registers.x &= 0xFF; + registers.y &= 0xFF; + } } let (bytes, cycles) = cycles::increment_cycles_plp(); registers.increment_pc(bytes); registers.cycles += cycles; diff --git a/snes-core/src/cpu/instructions/xce.rs b/snes-core/src/cpu/instructions/xce.rs index 9b1cc39..87aff7d 100644 --- a/snes-core/src/cpu/instructions/xce.rs +++ b/snes-core/src/cpu/instructions/xce.rs @@ -10,11 +10,14 @@ pub struct XCE {} impl CPUInstruction for XCE { fn execute(&self, registers: &mut Registers, _bus: &mut Bus) { - let did_mode_change = registers.emulation_mode != registers.get_carry_flag(); registers.exchange_carry_and_emulation(); - if did_mode_change { + if registers.emulation_mode { registers.set_memory_select_flag(true); registers.set_index_register_select_flag(true); + registers.x &= 0xFF; + registers.y &= 0xFF; + registers.sp &= 0xFF; + registers.sp |= 0x100; } let (bytes, cycles) = cycles::increment_cycles_exchange(); registers.increment_pc(bytes); registers.cycles += cycles; diff --git a/snes-core/src/ppu/registers.rs b/snes-core/src/ppu/registers.rs index 0a4e866..06ace9e 100644 --- a/snes-core/src/ppu/registers.rs +++ b/snes-core/src/ppu/registers.rs @@ -274,6 +274,7 @@ impl PPURegisters { _ => unreachable!(), }; if address_translation_rotate > 0 { + println!("ADDRESS ROTATE {}", address_translation_rotate); // TODO: implement address translation } let increment_when_lo = (register >> 7) == 0; diff --git a/snes-frontend/src/emu_ui/debug/ppu.rs b/snes-frontend/src/emu_ui/debug/ppu.rs index 2a40182..d4046a8 100644 --- a/snes-frontend/src/emu_ui/debug/ppu.rs +++ b/snes-frontend/src/emu_ui/debug/ppu.rs @@ -190,7 +190,8 @@ fn build_vram_window(ctx: &egui::Context, ppu_debug_options: &mut PPUDebugContro for row in chunks { let mut address_row = format!("{:04X} | ", row[0]); for address in row { - address_row = format!("{}{:04X} ", address_row, ppu_registers.vram()[((*address) & 0x7FFF) as usize]); + let effective_vram_address = ((*address) & 0x7FFF) as usize; + address_row = format!("{}{:04X} ", address_row, ppu_registers.vram()[effective_vram_address]); } ui.monospace(address_row); }