Skip to content

Commit

Permalink
fix: PPU timings are more accurate
Browse files Browse the repository at this point in the history
  • Loading branch information
EliseZeroTwo committed Jan 25, 2024
1 parent c6dd3a7 commit 8e47afa
Show file tree
Hide file tree
Showing 17 changed files with 299 additions and 174 deletions.
12 changes: 12 additions & 0 deletions .forgejo/workflows/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,18 @@ jobs:
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ppu/intr_2_0_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ppu/intr_2_0_timing.bin

- name: Run test ROM (mooneye-test-suite ppu/intr_2_mode0_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ppu/intr_2_mode0_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ppu/intr_2_mode0_timing.bin

- name: Run test ROM (mooneye-test-suite ppu/intr_2_mode3_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ppu/intr_2_mode3_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ppu/intr_2_mode3_timing.bin

- name: Run test ROM (mooneye-test-suite ppu/intr_2_oam_ok_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ppu/intr_2_oam_ok_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ppu/intr_2_oam_ok_timing.bin

- name: Run test ROM (mooneye-test-suite ppu/stat_irq_blocking)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ppu/stat_irq_blocking.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ppu/stat_irq_blocking.bin
Expand Down
12 changes: 12 additions & 0 deletions .github/workflows/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,18 @@ jobs:
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ppu/intr_2_0_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ppu/intr_2_0_timing.bin

- name: Run test ROM (mooneye-test-suite ppu/intr_2_mode0_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ppu/intr_2_mode0_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ppu/intr_2_mode0_timing.bin

- name: Run test ROM (mooneye-test-suite ppu/intr_2_mode3_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ppu/intr_2_mode3_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ppu/intr_2_mode3_timing.bin

- name: Run test ROM (mooneye-test-suite ppu/intr_2_oam_ok_timing)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ppu/intr_2_oam_ok_timing.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ppu/intr_2_oam_ok_timing.bin

- name: Run test ROM (mooneye-test-suite ppu/stat_irq_blocking)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/serial-roms/ppu/stat_irq_blocking.gb test-serial -m 100000000 -s meowgb-tests/expected_output/serial/mooneye-test-suite/ppu/stat_irq_blocking.bin
Expand Down
44 changes: 21 additions & 23 deletions meowgb-core/src/gameboy.rs
Original file line number Diff line number Diff line change
Expand Up @@ -104,13 +104,11 @@ impl<S: SerialWriter> Gameboy<S> {
}

macro_rules! pop8 {
() => {
{
let res = self.debug_read_u8(self.registers.sp);
self.registers.sp = self.registers.sp.overflowing_add(1).0;
res
}
};
() => {{
let res = self.debug_read_u8(self.registers.sp);
self.registers.sp = self.registers.sp.overflowing_add(1).0;
res
}};
}

macro_rules! pop16 {
Expand All @@ -120,22 +118,20 @@ impl<S: SerialWriter> Gameboy<S> {
}

macro_rules! rl {
($reg:ident) => {
{
let new_carry = self.registers.$reg >> 7 == 1;
self.registers.$reg <<= 1;
($reg:ident) => {{
let new_carry = self.registers.$reg >> 7 == 1;
self.registers.$reg <<= 1;

if self.registers.get_carry() {
self.registers.$reg |= 1;
}

self.registers.set_carry(new_carry);
if self.registers.get_carry() {
self.registers.$reg |= 1;
}
};

self.registers.set_carry(new_carry);
}};
}

self.registers.sp = 0xFFFE;

// Clear VRAM
self.registers.a = 0;
let mut address = 0x9FFF;
Expand All @@ -160,7 +156,7 @@ impl<S: SerialWriter> Gameboy<S> {
// self.registers.set_hl(hl_content - 1);
// self.registers.a = 0x77;
// self.debug_write_u8(hl_content, self.registers.a);

// Configure Background Palette
self.registers.a = 0xFC;
self.debug_write_u8(0xFF47, self.registers.a);
Expand All @@ -171,7 +167,7 @@ impl<S: SerialWriter> Gameboy<S> {

loop {
self.registers.a = self.debug_read_u8(self.registers.get_de());

self.registers.c = self.registers.a;
for _ in 0..2 {
self.registers.b = 4;
Expand All @@ -190,7 +186,7 @@ impl<S: SerialWriter> Gameboy<S> {
self.debug_write_u8(self.registers.get_hl(), self.registers.a);
self.registers.set_hl(self.registers.get_hl() + 2);
}

self.registers.set_de(self.registers.get_de() + 1);
self.registers.a = self.registers.e;

Expand Down Expand Up @@ -394,7 +390,7 @@ impl<S: SerialWriter> Gameboy<S> {
0xFF4B => self.ppu.registers.wx = value,
0xFF4C..=0xFF4E => {} // Unused
0xFF4F => {} // CGB VRAM Bank Select
0xFF50 => {} // BROM lockout
0xFF50 => {} // BROM lockout
0xFF51..=0xFF55 => {} // CGB VRAM DMA
0xFF56..=0xFF67 => {} // Unused
0xFF68..=0xFF69 => {} // CGB BG/OBJ Palettes
Expand Down Expand Up @@ -474,7 +470,9 @@ impl<S: SerialWriter> Gameboy<S> {
self.registers.mem_op_happened = true;
let value = match self.dma.is_conflict(address) {
true => match address {
0..=0xFDFF => self.dma.read_next_byte(&self.ppu, &self.memory, self.cartridge.as_deref()),
0..=0xFDFF => {
self.dma.read_next_byte(&self.ppu, &self.memory, self.cartridge.as_deref())
}
0xFE00..=0xFEFF => 0xFF,
0xFF00..=0xFF7F => self.cpu_read_io(address),
0xFF80..=0xFFFE => self.memory.hram[address as usize - 0xFF80],
Expand Down
16 changes: 12 additions & 4 deletions meowgb-core/src/gameboy/dma.rs
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,12 @@ impl DmaState {
self.restarting = Some((base, false));
}

pub fn read_next_byte(&self, ppu: &Ppu, memory: &Memory, cartridge: Option<&GenericCartridge>) -> u8 {
pub fn read_next_byte(
&self,
ppu: &Ppu,
memory: &Memory,
cartridge: Option<&GenericCartridge>,
) -> u8 {
let read_address = self.dma_in_progress.unwrap() as usize;
match self.original_base {
0..=0x7F => match cartridge {
Expand All @@ -83,7 +88,7 @@ impl DmaState {
},
0xC0..=0xDF => memory.wram[read_address - 0xC000],
0xE0..=0xFD => memory.wram[read_address - 0xE000],
0xFE..=0xFF => 0xFF
0xFE..=0xFF => 0xFF,
}
}

Expand All @@ -103,9 +108,12 @@ impl DmaState {
None => {}
}

// We do not clear this after running because the "in progress" should remain the entire cycle
// We do not clear this after running because the "in progress" should remain
// the entire cycle
self.dma_in_progress = match self.remaining_cycles > 0 {
true => Some(((self.original_base as u16) << 8) | (0xA0 - self.remaining_cycles) as u16),
true => {
Some(((self.original_base as u16) << 8) | (0xA0 - self.remaining_cycles) as u16)
}
false => None,
};

Expand Down
5 changes: 1 addition & 4 deletions meowgb-core/src/gameboy/memory.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,7 @@ pub struct Memory {

impl Memory {
pub fn new() -> Self {
Self {
wram: [0; 0x2000],
hram: [0; 0xAF],
}
Self { wram: [0; 0x2000], hram: [0; 0xAF] }
}

pub fn get_bootrom_disabled(&self) -> u8 {
Expand Down
Loading

0 comments on commit 8e47afa

Please sign in to comment.