diff --git a/snes-core/src/cpu/instructions.rs b/snes-core/src/cpu/instructions.rs index 14da111..33db4ce 100644 --- a/snes-core/src/cpu/instructions.rs +++ b/snes-core/src/cpu/instructions.rs @@ -859,7 +859,7 @@ impl CPU { } fn stx(&mut self, bus: &mut Bus, addressing_mode: AddressingMode) { - if self.registers.is_16bit_mode() { + if self.registers.is_16bit_index() { self.set_16bit_to_address(bus, addressing_mode, self.registers.x); } else { self.set_8bit_to_address(bus, addressing_mode, self.registers.x as u8); @@ -868,7 +868,7 @@ impl CPU { } fn sty(&mut self, bus: &mut Bus, addressing_mode: AddressingMode) { - if self.registers.is_16bit_mode() { + if self.registers.is_16bit_index() { self.set_16bit_to_address(bus, addressing_mode, self.registers.y); } else { self.set_8bit_to_address(bus, addressing_mode, self.registers.y as u8); diff --git a/snes-core/src/ppu/registers.rs b/snes-core/src/ppu/registers.rs index 5bfef49..dfaf043 100644 --- a/snes-core/src/ppu/registers.rs +++ b/snes-core/src/ppu/registers.rs @@ -146,7 +146,7 @@ pub enum Background { pub struct PPURegisters { data: [u8; 64], - vram: [u8; 0x10000], + vram: [u16; 0x10000], pub vblank_nmi: bool, pub h_count: u16, pub v_count: u16, @@ -167,7 +167,7 @@ impl PPURegisters { &self.data } - pub fn vram(&self) -> &[u8] { + pub fn vram(&self) -> &[u16] { &self.vram } @@ -215,14 +215,14 @@ impl PPURegisters { } fn handle_write_vram(&mut self, byte_lo: Option, byte_hi: Option) { - let address = ((self.read(VMADDH) as u16) << 8) | (self.read(VMADDL) as u16); - let effective_address = (address & 0x7FFF) * 2; + let address = (((self.read(VMADDH) as u16) << 8) | (self.read(VMADDL) as u16)) & 0x7FFF; + let current_word = self.vram[address as usize]; if let Some(byte) = byte_lo { - self.vram[effective_address.wrapping_add(1) as usize] = byte; + self.vram[address as usize] = (current_word & 0xFF00) | (byte as u16); self._write(RDVRAML, byte); } if let Some(byte) = byte_hi { - self.vram[effective_address as usize] = byte; + self.vram[address as usize] = (current_word & 0x00FF) | ((byte as u16) << 8); self._write(RDVRAMH, byte); } self.handle_vram_addr_auto_increment(byte_lo, byte_hi); diff --git a/snes-frontend/src/ppu.rs b/snes-frontend/src/ppu.rs index cc47240..dcea3bd 100644 --- a/snes-frontend/src/ppu.rs +++ b/snes-frontend/src/ppu.rs @@ -70,14 +70,15 @@ fn render_background_char_2bpp(bgdebug: &mut BgDebug, registers: &PPURegisters) let current_char_row = y.rem_euclid(8); // 8x8 pixels, 2 bitplanes, each word (16bit) holds 8 pixels // so 1 char is 8 bytes x 2 - let char_base_vram_address = current_char * 8 * 2; + let char_base_vram_address = current_char * 8; let effective_vram_address = vram_base_address + ( - char_base_vram_address + (current_char_row * 2) + char_base_vram_address + (current_char_row) ); let current_pixel = x + (y * width); - let lsb_bitplane= vram[effective_vram_address]; - let msb_bitplane= vram[effective_vram_address + 1]; + let vram_word = vram[effective_vram_address]; + let lsb_bitplane= vram_word as u8; + let msb_bitplane= (vram_word >> 8) as u8; let pixels = [ ( (lsb_bitplane >> 7) | @@ -296,12 +297,12 @@ pub fn vram_window(ppu_registers: &PPURegisters, vram_debug: &mut VRAMMap, show_ let address_end = vram_debug.address_end; let mut header = String::from(" | "); for page in 0x00..=0x0F { - header = format!("{}{:02X} ", header, page); + header = format!("{} {:02X} ", header, page); } ui.text(header); let mut divider = String::from("-----|-"); for _ in 0x00..=0x0F { - divider = format!("{}---", divider); + divider = format!("{}-----", divider); } ui.text(divider); let vector = (address_start..=address_end).collect::>(); @@ -309,7 +310,7 @@ pub fn vram_window(ppu_registers: &PPURegisters, vram_debug: &mut VRAMMap, show_ for row in chunks { let mut address_row = format!("{:04X} | ", row[0]); for address in row { - address_row = format!("{}{:02X} ", address_row, ppu_registers.vram()[(*address) as usize]); + address_row = format!("{}{:04X} ", address_row, ppu_registers.vram()[(*address) as usize]); } ui.text(address_row); }