Compute 2bpp background framebuffer (#4)

This commit is contained in:
2024-01-21 18:59:58 -05:00
committed by GitHub
parent e2446514db
commit 01b3493547
16 changed files with 199 additions and 26 deletions
+1 -1
View File
@@ -24,7 +24,7 @@ impl CPUInstruction for BRL {
}
fn mnemonic(&self, registers: &Registers, bus: &Bus, opcode: u8) -> String {
decoder_common::mnemonic_absolute(opcode, INSTR_NAME, registers, bus)
decoder_common::mnemonic_absolute_16bit(opcode, INSTR_NAME, registers, bus)
}
}
@@ -10,7 +10,10 @@ pub fn mnemonic_arithmetic(is_16bit: bool, opcode: u8, instr_name: &str, address
true => mnemonic_16bit_immediate(opcode, instr_name, registers, bus),
false => mnemonic_8bit_immediate(opcode, instr_name, registers, bus),
},
A::Absolute => mnemonic_absolute(opcode, instr_name, registers, bus),
A::Absolute => match is_16bit {
true => mnemonic_absolute_16bit(opcode, instr_name, registers, bus),
false => mnemonic_absolute_8bit(opcode, instr_name, registers, bus),
},
A::AbsoluteLong => mnemonic_absolute_long(opcode, instr_name, registers, bus),
A::DirectPage => mnemonic_direct_page(opcode, instr_name, registers, bus),
A::DirectPageIndirect => mnemonic_direct_page_indirect(opcode, instr_name, registers, bus),
@@ -38,14 +41,21 @@ pub fn mnemonic_8bit_immediate(opcode: u8, instr_name: &str, registers: &Registe
pub fn mnemonic_16bit_immediate(opcode: u8, instr_name: &str, registers: &Registers, bus: &Bus) -> String {
let next_byte = bus.read_external(registers.get_pc_address() + 1);
let next_second_byte = bus.read_external(registers.get_pc_address() + 2);
let word = (next_byte as u16) | ((next_byte as u16) << 8);
let word = (next_byte as u16) | ((next_second_byte as u16) << 8);
format!("{:02X} {:02X} {:02X} __ | {} #${:04X}", opcode, next_byte, next_second_byte, instr_name, word)
}
pub fn mnemonic_absolute(opcode: u8, instr_name: &str, registers: &Registers, bus: &Bus) -> String {
pub fn mnemonic_absolute_8bit(opcode: u8, instr_name: &str, registers: &Registers, bus: &Bus) -> String {
let next_byte = bus.read_external(registers.get_pc_address() + 1);
let next_second_byte = bus.read_external(registers.get_pc_address() + 2);
let word = (next_byte as u16) | ((next_byte as u16) << 8);
let word = (next_byte as u16) | ((next_second_byte as u16) << 8);
format!("{:02X} {:02X} {:02X} __ | {} ${:04X}", opcode, next_byte, next_second_byte, instr_name, word)
}
pub fn mnemonic_absolute_16bit(opcode: u8, instr_name: &str, registers: &Registers, bus: &Bus) -> String {
let next_byte = bus.read_external(registers.get_pc_address() + 1);
let next_second_byte = bus.read_external(registers.get_pc_address() + 2);
let word = (next_byte as u16) | ((next_second_byte as u16) << 8);
format!("{:02X} {:02X} {:02X} __ | {} ${:04X}", opcode, next_byte, next_second_byte, instr_name, word)
}
+1 -1
View File
@@ -19,7 +19,7 @@ impl CPUInstruction for PEA {
}
fn mnemonic(&self, registers: &Registers, bus: &Bus, opcode: u8) -> String {
decoder_common::mnemonic_absolute(opcode, INSTR_NAME, registers, bus)
decoder_common::mnemonic_absolute_16bit(opcode, INSTR_NAME, registers, bus)
}
}
+1 -1
View File
@@ -24,7 +24,7 @@ impl CPUInstruction for PER {
}
fn mnemonic(&self, registers: &Registers, bus: &Bus, opcode: u8) -> String {
decoder_common::mnemonic_absolute(opcode, INSTR_NAME, registers, bus)
decoder_common::mnemonic_absolute_16bit(opcode, INSTR_NAME, registers, bus)
}
}
+4 -2
View File
@@ -57,9 +57,11 @@ impl InternalRegisters {
}
fn read_vblank_nmi_mut(&self, ppu_registers: &mut PPURegisters) -> u8 {
let byte = self._read(RDNMI);
let result = self.read_vblank_nmi(ppu_registers);
if result == 0x80 {
println!("nmi set");
}
// When register is read, bit 7 is cleared
let result = (byte & 0x7F) | ((ppu_registers.vblank_nmi as u8) << 7);
ppu_registers.vblank_nmi = false;
result
}
+7 -7
View File
@@ -111,7 +111,7 @@ pub enum BgSize {
T32x32,
T64x32, // V Mirror
T32x64, // H Mirror
T64x64, // H Mirror
T64x64, // H/V Mirror
}
impl BgSize {
@@ -266,10 +266,10 @@ impl PPURegisters {
pub fn get_bg_tile_size(&self, background: Background) -> TileSize {
let byte = self._read(BGMODE);
let bit = match background {
Background::Bg1 => byte >> 3 & 0b1 == 1, // Bit 4
Background::Bg2 => byte >> 4 & 0b1 == 1, // Bit 5
Background::Bg3 => byte >> 5 & 0b1 == 1, // Bit 6
Background::Bg4 => byte >> 6 & 0b1 == 1, // Bit 7
Background::Bg1 => byte >> 4 & 0b1 == 1, // Bit 4
Background::Bg2 => byte >> 5 & 0b1 == 1, // Bit 5
Background::Bg3 => byte >> 6 & 0b1 == 1, // Bit 6
Background::Bg4 => byte >> 7 & 0b1 == 1, // Bit 7
};
match bit {
true => TileSize::P16x16,
@@ -393,9 +393,9 @@ mod ppu_registers_test {
#[test]
fn test_get_bg_tile_size() {
let mut registers = PPURegisters::new();
registers.write(BGMODE, 0b00000100);
registers.write(BGMODE, 0b00000000);
assert_eq!(registers.get_bg_tile_size(Background::Bg1), TileSize::P8x8);
registers.write(BGMODE, 0b00001100);
registers.write(BGMODE, 0b00010000);
assert_eq!(registers.get_bg_tile_size(Background::Bg1), TileSize::P16x16);
}
+1 -1
View File
@@ -27,7 +27,7 @@ impl ROM for LoROM {
let address = LoROM::adjust_address(address);
match self.data.get(address as usize) {
Some(byte) => *byte,
None => 0xFF,
None => 0x00,
}
}