Skip to content

Commit

Permalink
feat: slightly better PPU timings
Browse files Browse the repository at this point in the history
  • Loading branch information
EliseZeroTwo committed Jan 7, 2024
1 parent 8ae96ec commit c37d5d5
Show file tree
Hide file tree
Showing 35 changed files with 397 additions and 56 deletions.
56 changes: 56 additions & 0 deletions .forgejo/workflows/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -161,3 +161,59 @@ jobs:
- name: Run test ROM (mooneye-test-suite unused_hwio-GS)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/unused_hwio-GS.gb test -m 100000000 -s meowgb-tests/expected_output/unused_hwio-GS.bin

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

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

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

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

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

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

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

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

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

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

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

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

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

- name: Run test ROM (mooneye-test-suite rom_8Mb)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/rom_8Mb.gb test -m 100000000 -s meowgb-tests/expected_output/MBC1/rom_8Mb.bin
56 changes: 56 additions & 0 deletions .github/workflows/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -161,3 +161,59 @@ jobs:
- name: Run test ROM (mooneye-test-suite unused_hwio-GS)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/unused_hwio-GS.gb test -m 100000000 -s meowgb-tests/expected_output/unused_hwio-GS.bin

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

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

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

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

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

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

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

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

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

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

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

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

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

- name: Run test ROM (mooneye-test-suite rom_8Mb)
if: always()
run: ./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/rom_8Mb.gb test -m 100000000 -s meowgb-tests/expected_output/MBC1/rom_8Mb.bin
42 changes: 39 additions & 3 deletions generate-action-and-tests.sh
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#!/bin/bash
#!/bin/zsh
GH_ACTION_OUTPUT_FILE=./.github/workflows/action.yml
FJ_ACTION_OUTPUT_FILE=./.forgejo/workflows/action.yml
TEST_SCRIPT_OUTPUT_FILE=./run-test-roms.sh
Expand Down Expand Up @@ -50,7 +50,7 @@ cat >>$TEST_MD_FILE << EOF
EOF

for full_f in ./test-roms/blargg/roms/*
for full_f in ./test-roms/blargg/roms/*.gb
do
f="${full_f##*/}"; f="${f%.*}";
TEST_CMD="./target/release/meowgb-tests test-roms/blargg/roms/$f.gb test -m 100000000 -s meowgb-tests/expected_output/$f.bin"
Expand Down Expand Up @@ -86,7 +86,7 @@ cat >>$TEST_MD_FILE << EOF
EOF

for full_f in ./test-roms/mooneye-test-suite/roms/*
for full_f in ./test-roms/mooneye-test-suite/roms/*.gb
do
f="${full_f##*/}"; f="${f%.*}";
TEST_CMD="./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/$f.gb test -m 100000000 -s meowgb-tests/expected_output/$f.bin"
Expand All @@ -97,6 +97,42 @@ echo "Running test ROM $full_f"
TEST_TOTAL=\$((TEST_TOTAL + 1))
if res=\$($TEST_CMD 2>&1 > /dev/null) ; then
TEST_SUCCESS=\$((TEST_SUCCESS + 1))
else
echo "Failed: \$res"
fi
EOF

cat >>$TEST_MD_FILE << EOF
* $f.gb - [ROM]($full_f) - [Expected Serial Output](./meowgb-tests/expected_output/MBC1/$f.bin)
EOF

tee -a $GH_ACTION_OUTPUT_FILE $FJ_ACTION_OUTPUT_FILE >/dev/null << EOF
- name: Run test ROM (mooneye-test-suite $f)
if: always()
run: $TEST_CMD
EOF
done

cat >>$TEST_MD_FILE << EOF
### MBC1
EOF

for full_f in ./test-roms/mooneye-test-suite/roms/MBC1/**.gb
do
f="${full_f##*/}"; f="${f%.*}";
TEST_CMD="./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/MBC1/$f.gb test -m 100000000 -s meowgb-tests/expected_output/MBC1/$f.bin"

cat >>$TEST_SCRIPT_OUTPUT_FILE << EOF
echo "Running test ROM $full_f"
TEST_TOTAL=\$((TEST_TOTAL + 1))
if res=\$($TEST_CMD 2>&1 > /dev/null) ; then
TEST_SUCCESS=\$((TEST_SUCCESS + 1))
else
Expand Down
5 changes: 4 additions & 1 deletion meowgb-core/src/gameboy.rs
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,10 @@ impl<S: SerialWriter> Gameboy<S> {
}
0xFF41 => self.ppu.set_stat(&mut self.interrupts, value),
0xFF42 => self.ppu.registers.scy = value,
0xFF43 => self.ppu.registers.scx = value,
0xFF43 => {
// println!("Setting SCX to {} from {}", value, self.ppu.registers.scx);
self.ppu.registers.scx = value;
},
0xFF44 => {} // LY is read only
0xFF45 => self.ppu.set_lyc(&mut self.interrupts, value),
0xFF46 => self.dma.init_request(value),
Expand Down
58 changes: 39 additions & 19 deletions meowgb-core/src/gameboy/ppu.rs
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ impl<const SIZE: usize> WrappedBuffer<SIZE> {
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum PPUMode {
/// Mode 0
HBlank,
HBlank = 0,
/// Mode 1
VBlank,
/// Mode 2
Expand Down Expand Up @@ -272,6 +272,8 @@ pub struct PpuRegisters {
pub scy: u8,
pub scx: u8,
pub ly: u8,
cycles_since_last_ly_increment: u64,
cycles_since_last_last_mode_start_increment: [u64; 4],
pub lyc: u8,
pub wy: u8,
pub wx: u8,
Expand Down Expand Up @@ -335,6 +337,8 @@ impl Ppu {
scy: 0,
scx: 0,
ly: 0,
cycles_since_last_ly_increment: 0,
cycles_since_last_last_mode_start_increment: [0; 4],
lyc: 0,
wy: 0,
wx: 0,
Expand Down Expand Up @@ -517,6 +521,7 @@ impl Ppu {
}

pub fn set_mode(&mut self, interrupts: &mut Interrupts, mode: PPUMode) {
self.registers.cycles_since_last_last_mode_start_increment[mode.mode_flag() as usize] = 0;
if mode == PPUMode::HBlank {
assert_eq!(self.mode(), PPUMode::TransferringData);
assert!(self.current_dot >= 172);
Expand Down Expand Up @@ -545,15 +550,29 @@ impl Ppu {
}

fn set_scanline(&mut self, interrupts: &mut Interrupts, scanline: u8) {
// println!("LY incrementing: {} cycles since last incrementation. cycles since: {:?}", self.registers.cycles_since_last_ly_increment, self.registers.cycles_since_last_last_mode_start_increment.iter().enumerate().map(|(idx, value)| {
// let idx_enum = match idx {
// 0 => PPUMode::HBlank,
// 1 => PPUMode::VBlank,
// 2 => PPUMode::SearchingOAM,
// 3 => PPUMode::TransferringData,
// _ => unreachable!(),
// };

// (idx_enum, value)
// }).collect::<Vec<_>>());
self.registers.cycles_since_last_ly_increment = 0;
self.registers.ly = scanline;
self.handle_stat_irq(interrupts);
self.registers.ly_lyc = self.registers.ly == self.registers.lyc;
}

pub fn tick(&mut self, interrupts: &mut Interrupts) -> bool {
if self.enabled() {
self.registers.cycles_since_last_ly_increment += 1;
match self.mode() {
PPUMode::SearchingOAM => {
self.registers.cycles_since_last_last_mode_start_increment[2] += 1;
if self.current_dot == 0 {
if self.registers.ly == 0 {
self.wy_match = self.registers.wy == self.registers.ly;
Expand Down Expand Up @@ -600,6 +619,7 @@ impl Ppu {
false
}
PPUMode::TransferringData => {
self.registers.cycles_since_last_last_mode_start_increment[3] += 1;
if !self.first_frame && self.current_dot == 0 {
assert_eq!(self.total_dots, 80);
}
Expand All @@ -617,11 +637,8 @@ impl Ppu {
self.current_dot += 1;
self.total_dots += 1;

// if self.current_dot == self.dot_target - 1 {
// self.handle_stat_irq(interrupts, true);
// }

if self.current_dot == self.dot_target {
// println!("Mode 3 DT: {}", self.dot_target);
// assert_eq!(self.total_dots, match self.first_frame && self.first_line {
// true => self.dot_target,
// false => 80 + self.dot_target
Expand All @@ -633,17 +650,24 @@ impl Ppu {
false
}
PPUMode::HBlank => {
if self.first_line && self.current_dot == 64 && self.dot_target == 0 {
self.registers.cycles_since_last_last_mode_start_increment[0] += 1;
self.current_dot += 1;
self.total_dots += 1;
if !self.first_line {
assert_ne!(self.dot_target, 0);
}
if self.first_line && self.current_dot == 80 && self.dot_target == 0 {
self.set_mode(interrupts, PPUMode::TransferringData);
} else if self.dot_target != 0 && self.current_dot == self.dot_target {
// println!("Mode 0 DT: {}", self.dot_target);
self.set_scanline(interrupts, self.registers.ly + 1);

assert_eq!(
self.total_dots,
match self.first_frame && self.first_line {
true => 456 - (80 - 64),
false => 456,
}
456 // match self.first_frame && self.first_line {
// true => 456 - (80 - 64),
// false => 456,
// }
);
self.total_dots = 0;
self.first_line = false;
Expand All @@ -654,31 +678,25 @@ impl Ppu {
};

self.set_mode(interrupts, next_mode);
} else {
self.current_dot += 1;
self.total_dots += 1;
if !self.first_line {
assert_ne!(self.dot_target, 0);
}
}

false
}
PPUMode::VBlank => {
if self.current_dot != 0 && self.current_dot % 456 == 0 {
self.registers.cycles_since_last_last_mode_start_increment[1] += 1;
self.current_dot += 1;
if self.current_dot % 456 == 0 {
if self.registers.ly >= 153 {
self.set_scanline(interrupts, 0);
self.set_mode(interrupts, PPUMode::SearchingOAM);
self.first_frame = false;
true
} else {
self.set_scanline(interrupts, self.registers.ly + 1);
self.current_dot += 1;
false
}
} else {
assert!(self.current_dot < 4560);
self.current_dot += 1;
false
}
}
Expand Down Expand Up @@ -711,8 +729,10 @@ impl Ppu {
Some(state) => state,
None => {
let scrolling_delay = self.registers.scx % 8;
// println!("{}", scrolling_delay);
self.dot_target += scrolling_delay as u16;
if scrolling_delay != 0 {
// println!("Scrolling delay of {:#X} with scx of {}", scrolling_delay, self.registers.scx);
LineDrawingState::BackgroundScrolling(
scrolling_delay as usize,
self.registers.scx,
Expand Down
File renamed without changes.
1 change: 1 addition & 0 deletions meowgb-tests/expected_output/MBC1/bits_bank2.bin
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"
Expand Down
1 change: 1 addition & 0 deletions meowgb-tests/expected_output/MBC1/bits_mode.bin
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
BBBBBB
1 change: 1 addition & 0 deletions meowgb-tests/expected_output/MBC1/bits_ramg.bin
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
BBBBBB
1 change: 1 addition & 0 deletions meowgb-tests/expected_output/MBC1/multicart_rom_8Mb.bin
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
BBBBBB
1 change: 1 addition & 0 deletions meowgb-tests/expected_output/MBC1/ram_256kb.bin
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
BBBBBB
1 change: 1 addition & 0 deletions meowgb-tests/expected_output/MBC1/ram_64kb.bin
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
BBBBBB
1 change: 1 addition & 0 deletions meowgb-tests/expected_output/MBC1/rom_16Mb.bin
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
BBBBBB
1 change: 1 addition & 0 deletions meowgb-tests/expected_output/MBC1/rom_1Mb.bin
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
BBBBBB
1 change: 1 addition & 0 deletions meowgb-tests/expected_output/MBC1/rom_2Mb.bin
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
BBBBBB
1 change: 1 addition & 0 deletions meowgb-tests/expected_output/MBC1/rom_4Mb.bin
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
BBBBBB
1 change: 1 addition & 0 deletions meowgb-tests/expected_output/MBC1/rom_512kb.bin
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
BBBBBB
1 change: 1 addition & 0 deletions meowgb-tests/expected_output/MBC1/rom_8Mb.bin
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
BBBBBB
1 change: 1 addition & 0 deletions meowgb-tests/expected_output/vblank_stat_intr-GS.bin
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"
Expand Down
Loading

0 comments on commit c37d5d5

Please sign in to comment.