From c37d5d5e84f57247160062a3b12545a8a727ce90 Mon Sep 17 00:00:00 2001 From: EliseZeroTwo Date: Sat, 6 Jan 2024 17:24:29 -0700 Subject: [PATCH] feat: slightly better PPU timings --- .forgejo/workflows/action.yml | 56 +++++++ .github/workflows/action.yml | 56 +++++++ generate-action-and-tests.sh | 42 +++++- meowgb-core/src/gameboy.rs | 5 +- meowgb-core/src/gameboy/ppu.rs | 58 +++++--- .../{basic.gb => MBC1/bits_bank1.bin} | 0 .../expected_output/MBC1/bits_bank2.bin | 1 + .../expected_output/MBC1/bits_mode.bin | 1 + .../expected_output/MBC1/bits_ramg.bin | 1 + .../MBC1/multicart_rom_8Mb.bin | 1 + .../expected_output/MBC1/ram_256kb.bin | 1 + .../expected_output/MBC1/ram_64kb.bin | 1 + .../expected_output/MBC1/rom_16Mb.bin | 1 + meowgb-tests/expected_output/MBC1/rom_1Mb.bin | 1 + meowgb-tests/expected_output/MBC1/rom_2Mb.bin | 1 + meowgb-tests/expected_output/MBC1/rom_4Mb.bin | 1 + .../expected_output/MBC1/rom_512kb.bin | 1 + meowgb-tests/expected_output/MBC1/rom_8Mb.bin | 1 + .../expected_output/vblank_stat_intr-GS.bin | 1 + run-test-roms.sh | 140 ++++++++++++++++++ .../roms/MBC1/bits_bank1.gb | Bin 0 -> 65536 bytes .../roms/MBC1/bits_bank2.gb | Bin 0 -> 32768 bytes .../mooneye-test-suite/roms/MBC1/bits_mode.gb | Bin 0 -> 32768 bytes .../mooneye-test-suite/roms/MBC1/bits_ramg.gb | Bin 0 -> 65536 bytes .../roms/MBC1/multicart_rom_8Mb.gb | Bin 0 -> 1048576 bytes .../mooneye-test-suite/roms/MBC1/ram_256kb.gb | Bin 0 -> 65536 bytes .../mooneye-test-suite/roms/MBC1/ram_64kb.gb | Bin 0 -> 65536 bytes .../mooneye-test-suite/roms/MBC1/rom_16Mb.gb | Bin 0 -> 2097152 bytes .../mooneye-test-suite/roms/MBC1/rom_1Mb.gb | Bin 0 -> 131072 bytes .../mooneye-test-suite/roms/MBC1/rom_2Mb.gb | Bin 0 -> 262144 bytes .../mooneye-test-suite/roms/MBC1/rom_4Mb.gb | Bin 0 -> 524288 bytes .../mooneye-test-suite/roms/MBC1/rom_512kb.gb | Bin 0 -> 65536 bytes .../mooneye-test-suite/roms/MBC1/rom_8Mb.gb | Bin 0 -> 1048576 bytes .../roms/vblank_stat_intr-GS.gb | Bin 0 -> 32768 bytes tests.md | 83 ++++++----- 35 files changed, 397 insertions(+), 56 deletions(-) rename meowgb-tests/expected_output/{basic.gb => MBC1/bits_bank1.bin} (100%) create mode 100644 meowgb-tests/expected_output/MBC1/bits_bank2.bin create mode 100644 meowgb-tests/expected_output/MBC1/bits_mode.bin create mode 100644 meowgb-tests/expected_output/MBC1/bits_ramg.bin create mode 100644 meowgb-tests/expected_output/MBC1/multicart_rom_8Mb.bin create mode 100644 meowgb-tests/expected_output/MBC1/ram_256kb.bin create mode 100644 meowgb-tests/expected_output/MBC1/ram_64kb.bin create mode 100644 meowgb-tests/expected_output/MBC1/rom_16Mb.bin create mode 100644 meowgb-tests/expected_output/MBC1/rom_1Mb.bin create mode 100644 meowgb-tests/expected_output/MBC1/rom_2Mb.bin create mode 100644 meowgb-tests/expected_output/MBC1/rom_4Mb.bin create mode 100644 meowgb-tests/expected_output/MBC1/rom_512kb.bin create mode 100644 meowgb-tests/expected_output/MBC1/rom_8Mb.bin create mode 100644 meowgb-tests/expected_output/vblank_stat_intr-GS.bin create mode 100644 test-roms/mooneye-test-suite/roms/MBC1/bits_bank1.gb create mode 100644 test-roms/mooneye-test-suite/roms/MBC1/bits_bank2.gb create mode 100644 test-roms/mooneye-test-suite/roms/MBC1/bits_mode.gb create mode 100644 test-roms/mooneye-test-suite/roms/MBC1/bits_ramg.gb create mode 100644 test-roms/mooneye-test-suite/roms/MBC1/multicart_rom_8Mb.gb create mode 100644 test-roms/mooneye-test-suite/roms/MBC1/ram_256kb.gb create mode 100644 test-roms/mooneye-test-suite/roms/MBC1/ram_64kb.gb create mode 100644 test-roms/mooneye-test-suite/roms/MBC1/rom_16Mb.gb create mode 100644 test-roms/mooneye-test-suite/roms/MBC1/rom_1Mb.gb create mode 100644 test-roms/mooneye-test-suite/roms/MBC1/rom_2Mb.gb create mode 100644 test-roms/mooneye-test-suite/roms/MBC1/rom_4Mb.gb create mode 100644 test-roms/mooneye-test-suite/roms/MBC1/rom_512kb.gb create mode 100644 test-roms/mooneye-test-suite/roms/MBC1/rom_8Mb.gb create mode 100644 test-roms/mooneye-test-suite/roms/vblank_stat_intr-GS.gb diff --git a/.forgejo/workflows/action.yml b/.forgejo/workflows/action.yml index 911fbec..9f9f1de 100644 --- a/.forgejo/workflows/action.yml +++ b/.forgejo/workflows/action.yml @@ -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 diff --git a/.github/workflows/action.yml b/.github/workflows/action.yml index 911fbec..9f9f1de 100644 --- a/.github/workflows/action.yml +++ b/.github/workflows/action.yml @@ -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 diff --git a/generate-action-and-tests.sh b/generate-action-and-tests.sh index c2ce06b..915520f 100755 --- a/generate-action-and-tests.sh +++ b/generate-action-and-tests.sh @@ -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 @@ -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" @@ -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" @@ -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 diff --git a/meowgb-core/src/gameboy.rs b/meowgb-core/src/gameboy.rs index 5fb54a4..7b76c9f 100644 --- a/meowgb-core/src/gameboy.rs +++ b/meowgb-core/src/gameboy.rs @@ -221,7 +221,10 @@ impl Gameboy { } 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), diff --git a/meowgb-core/src/gameboy/ppu.rs b/meowgb-core/src/gameboy/ppu.rs index 4ad8dc0..11b4b52 100644 --- a/meowgb-core/src/gameboy/ppu.rs +++ b/meowgb-core/src/gameboy/ppu.rs @@ -94,7 +94,7 @@ impl WrappedBuffer { #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum PPUMode { /// Mode 0 - HBlank, + HBlank = 0, /// Mode 1 VBlank, /// Mode 2 @@ -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, @@ -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, @@ -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); @@ -545,6 +550,18 @@ 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::>()); + 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; @@ -552,8 +569,10 @@ impl Ppu { 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; @@ -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); } @@ -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 @@ -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; @@ -654,18 +678,14 @@ 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); @@ -673,12 +693,10 @@ impl Ppu { 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 } } @@ -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, diff --git a/meowgb-tests/expected_output/basic.gb b/meowgb-tests/expected_output/MBC1/bits_bank1.bin similarity index 100% rename from meowgb-tests/expected_output/basic.gb rename to meowgb-tests/expected_output/MBC1/bits_bank1.bin diff --git a/meowgb-tests/expected_output/MBC1/bits_bank2.bin b/meowgb-tests/expected_output/MBC1/bits_bank2.bin new file mode 100644 index 0000000..2a02163 --- /dev/null +++ b/meowgb-tests/expected_output/MBC1/bits_bank2.bin @@ -0,0 +1 @@ + " \ No newline at end of file diff --git a/meowgb-tests/expected_output/MBC1/bits_mode.bin b/meowgb-tests/expected_output/MBC1/bits_mode.bin new file mode 100644 index 0000000..6dac7b9 --- /dev/null +++ b/meowgb-tests/expected_output/MBC1/bits_mode.bin @@ -0,0 +1 @@ +BBBBBB \ No newline at end of file diff --git a/meowgb-tests/expected_output/MBC1/bits_ramg.bin b/meowgb-tests/expected_output/MBC1/bits_ramg.bin new file mode 100644 index 0000000..6dac7b9 --- /dev/null +++ b/meowgb-tests/expected_output/MBC1/bits_ramg.bin @@ -0,0 +1 @@ +BBBBBB \ No newline at end of file diff --git a/meowgb-tests/expected_output/MBC1/multicart_rom_8Mb.bin b/meowgb-tests/expected_output/MBC1/multicart_rom_8Mb.bin new file mode 100644 index 0000000..6dac7b9 --- /dev/null +++ b/meowgb-tests/expected_output/MBC1/multicart_rom_8Mb.bin @@ -0,0 +1 @@ +BBBBBB \ No newline at end of file diff --git a/meowgb-tests/expected_output/MBC1/ram_256kb.bin b/meowgb-tests/expected_output/MBC1/ram_256kb.bin new file mode 100644 index 0000000..6dac7b9 --- /dev/null +++ b/meowgb-tests/expected_output/MBC1/ram_256kb.bin @@ -0,0 +1 @@ +BBBBBB \ No newline at end of file diff --git a/meowgb-tests/expected_output/MBC1/ram_64kb.bin b/meowgb-tests/expected_output/MBC1/ram_64kb.bin new file mode 100644 index 0000000..6dac7b9 --- /dev/null +++ b/meowgb-tests/expected_output/MBC1/ram_64kb.bin @@ -0,0 +1 @@ +BBBBBB \ No newline at end of file diff --git a/meowgb-tests/expected_output/MBC1/rom_16Mb.bin b/meowgb-tests/expected_output/MBC1/rom_16Mb.bin new file mode 100644 index 0000000..6dac7b9 --- /dev/null +++ b/meowgb-tests/expected_output/MBC1/rom_16Mb.bin @@ -0,0 +1 @@ +BBBBBB \ No newline at end of file diff --git a/meowgb-tests/expected_output/MBC1/rom_1Mb.bin b/meowgb-tests/expected_output/MBC1/rom_1Mb.bin new file mode 100644 index 0000000..6dac7b9 --- /dev/null +++ b/meowgb-tests/expected_output/MBC1/rom_1Mb.bin @@ -0,0 +1 @@ +BBBBBB \ No newline at end of file diff --git a/meowgb-tests/expected_output/MBC1/rom_2Mb.bin b/meowgb-tests/expected_output/MBC1/rom_2Mb.bin new file mode 100644 index 0000000..6dac7b9 --- /dev/null +++ b/meowgb-tests/expected_output/MBC1/rom_2Mb.bin @@ -0,0 +1 @@ +BBBBBB \ No newline at end of file diff --git a/meowgb-tests/expected_output/MBC1/rom_4Mb.bin b/meowgb-tests/expected_output/MBC1/rom_4Mb.bin new file mode 100644 index 0000000..6dac7b9 --- /dev/null +++ b/meowgb-tests/expected_output/MBC1/rom_4Mb.bin @@ -0,0 +1 @@ +BBBBBB \ No newline at end of file diff --git a/meowgb-tests/expected_output/MBC1/rom_512kb.bin b/meowgb-tests/expected_output/MBC1/rom_512kb.bin new file mode 100644 index 0000000..6dac7b9 --- /dev/null +++ b/meowgb-tests/expected_output/MBC1/rom_512kb.bin @@ -0,0 +1 @@ +BBBBBB \ No newline at end of file diff --git a/meowgb-tests/expected_output/MBC1/rom_8Mb.bin b/meowgb-tests/expected_output/MBC1/rom_8Mb.bin new file mode 100644 index 0000000..6dac7b9 --- /dev/null +++ b/meowgb-tests/expected_output/MBC1/rom_8Mb.bin @@ -0,0 +1 @@ +BBBBBB \ No newline at end of file diff --git a/meowgb-tests/expected_output/vblank_stat_intr-GS.bin b/meowgb-tests/expected_output/vblank_stat_intr-GS.bin new file mode 100644 index 0000000..2a02163 --- /dev/null +++ b/meowgb-tests/expected_output/vblank_stat_intr-GS.bin @@ -0,0 +1 @@ + " \ No newline at end of file diff --git a/run-test-roms.sh b/run-test-roms.sh index f949bb6..e315aca 100755 --- a/run-test-roms.sh +++ b/run-test-roms.sh @@ -367,4 +367,144 @@ else echo "Failed: $res" fi +echo "Running test ROM ./test-roms/mooneye-test-suite/roms/vblank_stat_intr-GS.gb" + +TEST_TOTAL=$((TEST_TOTAL + 1)) + +if res=$(./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 2>&1 > /dev/null) ; then + TEST_SUCCESS=$((TEST_SUCCESS + 1)) +else + echo "Failed: $res" +fi + +echo "Running test ROM ./test-roms/mooneye-test-suite/roms/MBC1/bits_bank1.gb" + +TEST_TOTAL=$((TEST_TOTAL + 1)) + +if res=$(./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 2>&1 > /dev/null) ; then + TEST_SUCCESS=$((TEST_SUCCESS + 1)) +else + echo "Failed: $res" +fi + +echo "Running test ROM ./test-roms/mooneye-test-suite/roms/MBC1/bits_bank2.gb" + +TEST_TOTAL=$((TEST_TOTAL + 1)) + +if res=$(./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 2>&1 > /dev/null) ; then + TEST_SUCCESS=$((TEST_SUCCESS + 1)) +else + echo "Failed: $res" +fi + +echo "Running test ROM ./test-roms/mooneye-test-suite/roms/MBC1/bits_mode.gb" + +TEST_TOTAL=$((TEST_TOTAL + 1)) + +if res=$(./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 2>&1 > /dev/null) ; then + TEST_SUCCESS=$((TEST_SUCCESS + 1)) +else + echo "Failed: $res" +fi + +echo "Running test ROM ./test-roms/mooneye-test-suite/roms/MBC1/bits_ramg.gb" + +TEST_TOTAL=$((TEST_TOTAL + 1)) + +if res=$(./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 2>&1 > /dev/null) ; then + TEST_SUCCESS=$((TEST_SUCCESS + 1)) +else + echo "Failed: $res" +fi + +echo "Running test ROM ./test-roms/mooneye-test-suite/roms/MBC1/multicart_rom_8Mb.gb" + +TEST_TOTAL=$((TEST_TOTAL + 1)) + +if res=$(./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 2>&1 > /dev/null) ; then + TEST_SUCCESS=$((TEST_SUCCESS + 1)) +else + echo "Failed: $res" +fi + +echo "Running test ROM ./test-roms/mooneye-test-suite/roms/MBC1/ram_256kb.gb" + +TEST_TOTAL=$((TEST_TOTAL + 1)) + +if res=$(./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 2>&1 > /dev/null) ; then + TEST_SUCCESS=$((TEST_SUCCESS + 1)) +else + echo "Failed: $res" +fi + +echo "Running test ROM ./test-roms/mooneye-test-suite/roms/MBC1/ram_64kb.gb" + +TEST_TOTAL=$((TEST_TOTAL + 1)) + +if res=$(./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 2>&1 > /dev/null) ; then + TEST_SUCCESS=$((TEST_SUCCESS + 1)) +else + echo "Failed: $res" +fi + +echo "Running test ROM ./test-roms/mooneye-test-suite/roms/MBC1/rom_16Mb.gb" + +TEST_TOTAL=$((TEST_TOTAL + 1)) + +if res=$(./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 2>&1 > /dev/null) ; then + TEST_SUCCESS=$((TEST_SUCCESS + 1)) +else + echo "Failed: $res" +fi + +echo "Running test ROM ./test-roms/mooneye-test-suite/roms/MBC1/rom_1Mb.gb" + +TEST_TOTAL=$((TEST_TOTAL + 1)) + +if res=$(./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 2>&1 > /dev/null) ; then + TEST_SUCCESS=$((TEST_SUCCESS + 1)) +else + echo "Failed: $res" +fi + +echo "Running test ROM ./test-roms/mooneye-test-suite/roms/MBC1/rom_2Mb.gb" + +TEST_TOTAL=$((TEST_TOTAL + 1)) + +if res=$(./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 2>&1 > /dev/null) ; then + TEST_SUCCESS=$((TEST_SUCCESS + 1)) +else + echo "Failed: $res" +fi + +echo "Running test ROM ./test-roms/mooneye-test-suite/roms/MBC1/rom_4Mb.gb" + +TEST_TOTAL=$((TEST_TOTAL + 1)) + +if res=$(./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 2>&1 > /dev/null) ; then + TEST_SUCCESS=$((TEST_SUCCESS + 1)) +else + echo "Failed: $res" +fi + +echo "Running test ROM ./test-roms/mooneye-test-suite/roms/MBC1/rom_512kb.gb" + +TEST_TOTAL=$((TEST_TOTAL + 1)) + +if res=$(./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 2>&1 > /dev/null) ; then + TEST_SUCCESS=$((TEST_SUCCESS + 1)) +else + echo "Failed: $res" +fi + +echo "Running test ROM ./test-roms/mooneye-test-suite/roms/MBC1/rom_8Mb.gb" + +TEST_TOTAL=$((TEST_TOTAL + 1)) + +if res=$(./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 2>&1 > /dev/null) ; then + TEST_SUCCESS=$((TEST_SUCCESS + 1)) +else + echo "Failed: $res" +fi + echo "Succeeded in running $TEST_SUCCESS/$TEST_TOTAL" diff --git a/test-roms/mooneye-test-suite/roms/MBC1/bits_bank1.gb b/test-roms/mooneye-test-suite/roms/MBC1/bits_bank1.gb new file mode 100644 index 0000000000000000000000000000000000000000..2de8e237ad216085ec9d3bf95f7ca0923089041b GIT binary patch literal 65536 zcmeI*&r2L<7zglo#*LZyt7Cr1C{vx?F0wIJjFD!M?PQz|W;RMAQVAHLM(ZX*szQVs zGj7(DLQ4wxrUuByQ)~H`BHG19GU} z2WEDkd4GTAeI=(&F1NXZEp`iceoG{7m$TBMQ|w(<#>$ygS@-@2tm5wN(baqRzQ3@r zaC~UA;@8{v?q0aG@Z~=J?Xj`Z;nTw}A0N~vhEGkfzCI=hOxVZvG~L|G+~B!fFUwW)h9LEFRzs6F5bU#<6&^E(5|PYP0P1U92+?~{1)@3m7U3m@odVw zd2`v^8w0C{00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz z00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_@SFvb8-jVUAx$Fx|9Q|m z-5Ao-U`&$edBls2<@CgH_(jhpskSx}QPq-?Sd3Z>49w1+I8jx#dv|d$m8+`eMRj$3 zeRVaj&-kYp+Qx3T~!+zD5IbW>N?$d?%(|ul*eNJ)50gO zFN(ZxO*0HCQk`jLojI}YzZ znKTT?5kv8sC<6nE!o6wEG*doX z%6J*op)4A;ELsm^yfv-RvgYPyXZ!m#O;r^y!eKrOsy{htS#;6eZ=dqQvZ7JHoJ#$2 z$1#k_Ny7`rq4Gk`y=nYZYHrSNPb*I*>28`-pTAl1*LBKOm3BiQ;Mcb-+wSfjAGdAG zqH-FE2VZe}`_NEtZ#>@a1(loT;9yVBp+g-Vynj^avZuXwz-cWB6;AC>T3NbTF(L!q5J3;h-L z3twL}N~eW_`x^#7JAnYrmfml^?Y3>Dyj+%_J-<|og7@d2JN}IBv6v|8dPhfF8)YOz z`*(1#zn^jnex~{QMK5&SH2wPg#Ly}5_phSJax^M?!CN!d+S=7+S*@*s0AEcsN7E7(%jtGNcE{-9^99nB@%soq)y){nwnZ#=%w?F&(MEA z^sK*saL_bqry2(3ZEdt$=nRT^)5gY@78;kz`05pf=FW3jj>TvOh4E>u`udt0UQT|YOlCf}PkYytcb)Mr$GfJzOW8i@ z3a4FR$`#JIg5wI)u3#wZ^RDT>=61S=^h(#zAG-$^AJ`>DpDwMJM2bSnn)h=wN|xr6 zT;fw%zMggkea02%U!|33f2AkCSgN_MZQ1cssq)AE^y&-iB~kI#)?3Y?bWl!JGDFC2 zT`Y@Fuhu=Ni@i7YO*kE7DS>J8i@W0Uu9y{9XO{M-*OvEZmhImcmu>1Uw4+q{^N9Ct zDpaaG%39xkav=Rx=Dd9qKZo<2|7D8dAOHafKmY;|fB*y_009U<00Izz00bZa0SG_< z0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZafz2-P?Ejd)**&m+ z2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$## zAOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;| zfB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U< p00Izz00bZa0SG_<0ub1o0@Br^ovTl3wqIT;&t1HK<;G@H_y-ggJ~99R literal 0 HcmV?d00001 diff --git a/test-roms/mooneye-test-suite/roms/MBC1/bits_bank2.gb b/test-roms/mooneye-test-suite/roms/MBC1/bits_bank2.gb new file mode 100644 index 0000000000000000000000000000000000000000..5c679c034186188d3e8f1b1a751b2480e2866d86 GIT binary patch literal 32768 zcmeI4-D?zA6u|GyZsNF!>7;6ygfY&pOS;B1#5HY}Wjju$LoyqK25Yc{rN*R*rr0D! z3;EcryZxZHQ0zkSPd}LxCU{>Q12Q%D~9NbVRl8w5Et!G;DP@$VJ_dE`_aw? zZQmYN#j+PqmNfdm{`geIjgsga)yH4U++6p}%s#ua`EmP8@4b-z==%HJlb?T= z8NGLH+beIqGZ`PQs(Ep|torpIHtpEGx8UO1{1!VexEIyUe!<4NZ; zIWeA3^9RqgK&Zf~);o!n3QU{LZH{lze&MCF?Aq>3s-6fC0U|&IhyW2F0z`la5CI}U z1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U z1c(3;AOb{y2oM1xKm>>Y5g-CYfCvzQwMHPdN*I?_YKrv#9}hUw)grA3W0C~+5SP_{ zuq2Z>z%EI(wV{xz`h2k%tmy5Xo<4fCs%rc8(o*oNs>Y?dx~{Ie8s}qNcn6UrS%w+1 zjCT0-asfN|>+4lj*HyK?9yAb0P}kv!y8CojfF6sv*5WVD7e$P%X@&tlMF|E?F2SIp zfG$aj0UPVFPkTYb8*@A{Xm;+iQVp&iRW4IbBw5*w# z>FGp5(^OUA5)5J%Fn?^!vS7f|U7zM+S&@kA2e0c-CJke3%;1ttg1@LEZ`ePbo|$pi zL*=OyJWUhk3H@O-g8i~#dj`$f^MzpKmL5B#!RULFYG`jaOiR}|b2YjMvrlL0-* z1^Wx~ipRUV`}^Jez=K@~>swm`flZr=@rwO|^+h6ZTR@P%Vc^~IdLdgl-@@AU>&wtD z%m2Q=Fbf3Zx%Uoj@QlSoQPYd8w0n%?O#Qa z=4S4+cY_rly7lm=AGL zkT2K<2YY&eI=q84HipA+=%`_a?)iW%k?89)P3Tm^06iLoZh<=}7MM0Pgu}2e_^^6K zf!tA-9qC-e|}JS{{232UaKheRFqUnwHxX-HwF|*H{16eJalBl$UU+nHDkF? z>~TIO_?YA)$;T8Q%9CS`FzyHwjxgy6Nk^D+1VdSxbxh}ZXOGjNS2~9Nr_(-n-}ZUV z&oB8xo`CX@e=kPKLq4f_Ol9Fx))DlKBhEetm1vK%W1r5~T+&K5ZYxuMYsoG?vE+-0 zSJqu=3S|9qx{?_}e%)Mod}?v){jIULN4^ba{VXl;Z_LbXj?X$`UR=z~w`3nKwB#1- zU*{HV2p8B`ru=@8zfA>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&I YhyW2F0z`la5CI}U1c(3;_)iJ^1)#cPwg3PC literal 0 HcmV?d00001 diff --git a/test-roms/mooneye-test-suite/roms/MBC1/bits_mode.gb b/test-roms/mooneye-test-suite/roms/MBC1/bits_mode.gb new file mode 100644 index 0000000000000000000000000000000000000000..2f5ee68f6fbe43e51f1b8bcb1074b7c9c5f9ef3a GIT binary patch literal 32768 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 literal 0 HcmV?d00001 diff --git a/test-roms/mooneye-test-suite/roms/MBC1/multicart_rom_8Mb.gb b/test-roms/mooneye-test-suite/roms/MBC1/multicart_rom_8Mb.gb new file mode 100644 index 0000000000000000000000000000000000000000..11c41a01763a1ec136bbd5748a5bd96f3d39a3db GIT binary patch literal 1048576 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 literal 0 HcmV?d00001 diff --git a/test-roms/mooneye-test-suite/roms/MBC1/rom_16Mb.gb b/test-roms/mooneye-test-suite/roms/MBC1/rom_16Mb.gb new file mode 100644 index 0000000000000000000000000000000000000000..6dbb7c1e632a67e98ee8381ddcb21b06282d2bcc GIT binary patch literal 2097152 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 J2oQ(}{4cuuDN6tV literal 0 HcmV?d00001 diff --git a/test-roms/mooneye-test-suite/roms/MBC1/rom_1Mb.gb b/test-roms/mooneye-test-suite/roms/MBC1/rom_1Mb.gb new file mode 100644 index 0000000000000000000000000000000000000000..4ca3f20a18626c57ba74d92bd4a4dfd114df1194 GIT binary patch literal 131072 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 O1Rwwb2teQ|0{;RFk$$%T literal 0 HcmV?d00001 diff --git a/test-roms/mooneye-test-suite/roms/MBC1/rom_8Mb.gb b/test-roms/mooneye-test-suite/roms/MBC1/rom_8Mb.gb new file mode 100644 index 0000000000000000000000000000000000000000..fef2463dccb065cbbd61fbbe8edb9d7c7790d612 GIT binary patch literal 1048576 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 K5FkJxBJgiF>Ou4X literal 0 HcmV?d00001 diff --git a/test-roms/mooneye-test-suite/roms/vblank_stat_intr-GS.gb b/test-roms/mooneye-test-suite/roms/vblank_stat_intr-GS.gb new file mode 100644 index 0000000000000000000000000000000000000000..b68caa794998acc432f37fc87e28682ccb334e7c GIT binary patch literal 32768 zcmeI4T}T{P6o6;Pt(mAXV@zbU(`0s8WMfS*M#y3})7f#Nt0P@WBZ3vQS~a1mN|e@^ zb)!wwYW@R;L=c*{KwqR#8bTmYmLx8lEqQ5ZAu00`A4(gh1p8x)+k5tUyBhmou^^Ol zaAxnh=kMNc&Ry6CCz)KEL@(3$=)~IctXDJ_ZE$@3Q&-o6OvBz`;M`wp zWm=eLXvuabS>dOU`=5&LcdHry#deoeZJnP?HqBp4hUTv(Yo6~JOFsSP?i}fXX=}_n zV~tzqth3ey>%4Wzx=8xqoNFu@f24BOSr~jzW-h>Bmdu=o!L#QsyM}bgdL0I=iv*AW z5tyDTe2 z3JZ&i3k#_~%?o1?K@dgo5Jfr3r#aq5Jds z;Ix2H{+dS5j?)RNh3A`!-MBHE+C}lj^9x=eG#@*6bPn!*KhLXbb#-MWXg~(~x4pfk z1#}R4rs@89BC4wE%%7eZI0dYKB}o*0K9LBG=D3QA`g+5tsBk*zZhSuAU@LFPNX38^})_P9NY5;MvqBZ{mt|2bBO;2FKV!u@2A+Qo5kX+y6U&_K~BV?{Kl{CVQ-vgb-fwD(_AR=E$v5;q1|nedd-oC-DWm@W!QZTcvGe5CT^z zn~VT55iV|~;;LEPNXQ;vO&nbfBzQBGKxYX~h3s>yNf3W46<5XLJ`CAsR}+^m+>uIP zumq<=_J!3Xh`*bPJHX;T3fbpZ6PGUBpGpv92|fwgmsXP?ej*iD&*DA~*%wz67rkPV z*V;G^)ZKlWcxd`ICR)wJYi45HbaB^WF!PE_OU4)I8;r>Pk}|(^Jaj|J&CJMssX*Ai zsd(FNwRw9UexmQ2_)*EFLS6`>0m5#IIz+oxXht`sY7hq(yc1XwCdD6 zOH==}YNFT8tc)8o3t8R_w=_pqA=v;WGDCU9@5C&JI%@IL`{5)izsF`bFJ$@ndmHYR zxnnMIB#+Y^_J-&kb9i>gvmO4^y$?Mx7dPVIl1WZsRf>kkVojs%bZ5