Skip to content

Commit

Permalink
feat: better DMA, MBC1, fixup tests
Browse files Browse the repository at this point in the history
  • Loading branch information
EliseZeroTwo committed Jan 15, 2024
1 parent 01c5a0c commit d89a1d9
Show file tree
Hide file tree
Showing 124 changed files with 710 additions and 466 deletions.
246 changes: 141 additions & 105 deletions .forgejo/workflows/action.yml

Large diffs are not rendered by default.

246 changes: 141 additions & 105 deletions .github/workflows/action.yml

Large diffs are not rendered by default.

28 changes: 17 additions & 11 deletions generate-action-and-tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ EOF
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"
TEST_CMD="./target/release/meowgb-tests test-roms/blargg/roms/$f.gb test -m 100000000 -s meowgb-tests/expected_output/blargg/$f.bin"

cat >>$TEST_SCRIPT_OUTPUT_FILE << EOF
Expand All @@ -69,7 +69,7 @@ fi
EOF

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

tee -a $GH_ACTION_OUTPUT_FILE $FJ_ACTION_OUTPUT_FILE >/dev/null << EOF
Expand All @@ -89,7 +89,7 @@ EOF
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"
TEST_CMD="./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/$f.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/$f.bin"

cat >>$TEST_SCRIPT_OUTPUT_FILE << EOF
Expand All @@ -105,7 +105,7 @@ fi
EOF

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

tee -a $GH_ACTION_OUTPUT_FILE $FJ_ACTION_OUTPUT_FILE >/dev/null << EOF
Expand All @@ -116,16 +116,20 @@ EOF
EOF
done

cat >>$TEST_MD_FILE << EOF
for directory in ./test-roms/mooneye-test-suite/roms/*/
do
d=$(basename $directory)

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

for full_f in ./test-roms/mooneye-test-suite/roms/MBC1/**.gb
do
for full_f in ./test-roms/mooneye-test-suite/roms/$d/*.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"
TEST_CMD="./target/release/meowgb-tests test-roms/mooneye-test-suite/roms/$d/$f.gb test -m 100000000 -s meowgb-tests/expected_output/mooneye-test-suite/$d/$f.bin"

cat >>$TEST_SCRIPT_OUTPUT_FILE << EOF
Expand All @@ -141,15 +145,17 @@ fi
EOF

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

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

done

cat >>$TEST_SCRIPT_OUTPUT_FILE << EOF
Expand Down
17 changes: 10 additions & 7 deletions meowgb-core/src/gameboy/dma.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,9 @@ pub enum DmaMemoryBus {
impl DmaMemoryBus {
pub fn from_base(base: u8) -> Self {
match base {
0..=0x7F
| 0xA0..=0xFD => Self::External,
0..=0x7F | 0xA0..=0xFD => Self::External,
0x80..=0x9F => Self::Video,
_ => Self::Other
_ => Self::Other,
}
}

Expand Down Expand Up @@ -45,9 +44,7 @@ pub struct DmaState {

impl DmaState {
pub fn is_conflict(&self, address: u16) -> bool {
self.in_progress().map(|bus| {
bus.conflict_in_range(address)
}).unwrap_or_default()
self.in_progress().map(|bus| bus.conflict_in_range(address)).unwrap_or_default()
}

pub fn in_progress(&self) -> Option<DmaMemoryBus> {
Expand All @@ -58,7 +55,13 @@ impl DmaState {
}

pub fn new() -> Self {
Self { dma_in_progress: false, original_base: 0, base: 0, remaining_cycles: 0, restarting: None }
Self {
dma_in_progress: false,
original_base: 0,
base: 0,
remaining_cycles: 0,
restarting: None,
}
}

pub fn init_request(&mut self, base: u8) {
Expand Down
100 changes: 67 additions & 33 deletions meowgb-core/src/gameboy/mapper/mbc1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,19 @@ pub struct MBC1 {
rom_bank_number: u8,
extra_2_bit_reg: u8,
banking_mode_select: bool,
is_mbc1m: bool,
}

impl MBC1 {
pub fn new(data: Vec<u8>) -> Self {
let rom_bank_count = 0b10 << data[0x148];
assert!(data[0x147] >= 1 && data[0x147] <= 0x3);
let rom_bank_count = data[0x148];
assert!(rom_bank_count <= 0x6, "{:#X}", rom_bank_count);

let rom_length = (1 << rom_bank_count as usize) * 0x8000;

assert_eq!(data.len(), rom_length);

let ram_bank_count = match data[0x149] {
0 | 1 => 0,
2 => 1,
Expand All @@ -23,13 +31,16 @@ impl MBC1 {
_ => panic!("Bad RAM bank count for MBC1"),
};

let ram = match ram_bank_count {
let ram = match data[0x149] {
0 | 1 => None,
2 | 3 | 4 | 5 => Some(vec![0u8; ram_bank_count as usize * (8 * 1024)]),
_ => panic!("Bad RAM bank count for MBC1"),
};

assert_eq!(data.len(), rom_bank_count as usize * (16 * 1024));
let is_mbc1m = match rom_bank_count > 3 {
true => &data[0x104..0x134] == &data[((0x10 << 14) + 0x104)..((0x10 << 14) + 0x134)],
false => false,
};

Self {
rom: data,
Expand All @@ -40,18 +51,16 @@ impl MBC1 {
ram,
ram_bank_count,
banking_mode_select: false,
is_mbc1m,
}
}

fn set_ram_enabled(&mut self, val: u8) {
self.ram_enabled = val & 0xA != 0;
self.ram_enabled = val & 0b1111 == 0xA;
}

fn set_rom_bank_number(&mut self, mut val: u8) {
if val == 0 {
val = 1;
}
self.rom_bank_number = val & 0b1_1111;
fn set_rom_bank_number(&mut self, val: u8) {
self.rom_bank_number = (val & 0b11111).max(1);
}

fn set_extra_2_bit_reg(&mut self, val: u8) {
Expand All @@ -63,30 +72,44 @@ impl MBC1 {
}

fn is_large_rom(&self) -> bool {
self.rom_bank_count >= 64
self.rom_bank_count >= 5
}

#[allow(unused)]
fn is_large_ram(&self) -> bool {
self.ram_bank_count > 2
self.ram_bank_count >= 4
}
}

impl Mapper for MBC1 {
fn read_rom_u8(&self, address: u16) -> u8 {
if address <= 0x3FFF {
self.rom[if self.is_large_rom() && self.banking_mode_select {
((self.extra_2_bit_reg << 5) as usize * 0x4000) + address as usize
} else {
address as usize
}]
} else {
self.rom[if self.is_large_rom() {
(self.rom_bank_number | (self.extra_2_bit_reg << 5)) as usize * 0x4000
} else {
self.rom_bank_number as usize * 0x4000
} + (address as usize - 0x4000)]
}
let mask = match self.rom_bank_count {
0 => 0b1,
1 => 0b11,
2 => 0b111,
3 => 0b1111,
4 => 0b11111,
5 => 0b111111,
6 => 0b1111111,
_ => unreachable!(),
};
let rom_bank = match address <= 0x3FFF {
true if self.banking_mode_select && self.is_mbc1m => {
(self.extra_2_bit_reg << 4) as usize
}
true if self.is_large_rom() && self.banking_mode_select && !self.is_mbc1m => {
((self.extra_2_bit_reg as usize) << 5) & mask
}
true => 0,
false if self.is_mbc1m => {
((self.rom_bank_number & 0b1111) | (self.extra_2_bit_reg << 4)) as usize
}
false => (self.rom_bank_number | (self.extra_2_bit_reg << 5)) as usize,
} & mask;

let real_address = rom_bank << 14 | (address as usize & 0x3FFF);

self.rom[real_address]
}

fn write_rom_u8(&mut self, address: u16, value: u8) {
Expand All @@ -100,22 +123,33 @@ impl Mapper for MBC1 {
}

fn read_eram_u8(&self, address: u16) -> u8 {
let is_large_ram = self.is_large_ram();

if !self.ram_enabled {
return 0xFF;
}

match self.ram.as_ref() {
Some(ram) => match self.is_large_rom() {
true => ram[address as usize],
false => ram[(self.extra_2_bit_reg as usize * 0x2000) + address as usize],
},
Some(ram) if is_large_ram && self.banking_mode_select => {
ram[(self.extra_2_bit_reg as usize * 0x2000) + address as usize]
}
Some(ram) => ram[address as usize],
None => 0xFF,
}
}

fn write_eram_u8(&mut self, address: u16, value: u8) {
let is_large_rom = self.is_large_rom();
let is_large_ram = self.is_large_ram();

if !self.ram_enabled {
return;
}

match self.ram.as_mut() {
Some(ram) => match is_large_rom {
true => ram[address as usize] = value,
false => ram[(self.extra_2_bit_reg as usize * 0x2000) + address as usize] = value,
},
Some(ram) if is_large_ram && self.banking_mode_select => {
ram[(self.extra_2_bit_reg as usize * 0x2000) + address as usize] = value
}
Some(ram) => ram[address as usize] = value,
None => {}
}
}
Expand Down
2 changes: 1 addition & 1 deletion meowgb-core/src/gameboy/ppu.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use super::{interrupts::Interrupts, dma::DmaState};
use super::{dma::DmaState, interrupts::Interrupts};

pub const FB_HEIGHT: u32 = 144;
pub const FB_WIDTH: u32 = 160;
Expand Down
1 change: 0 additions & 1 deletion meowgb-tests/expected_output/MBC1/bits_mode.bin

This file was deleted.

1 change: 0 additions & 1 deletion meowgb-tests/expected_output/MBC1/bits_ramg.bin

This file was deleted.

1 change: 0 additions & 1 deletion meowgb-tests/expected_output/MBC1/multicart_rom_8Mb.bin

This file was deleted.

1 change: 0 additions & 1 deletion meowgb-tests/expected_output/MBC1/ram_256kb.bin

This file was deleted.

1 change: 0 additions & 1 deletion meowgb-tests/expected_output/MBC1/ram_64kb.bin

This file was deleted.

1 change: 0 additions & 1 deletion meowgb-tests/expected_output/MBC1/rom_16Mb.bin

This file was deleted.

1 change: 0 additions & 1 deletion meowgb-tests/expected_output/MBC1/rom_1Mb.bin

This file was deleted.

1 change: 0 additions & 1 deletion meowgb-tests/expected_output/MBC1/rom_2Mb.bin

This file was deleted.

1 change: 0 additions & 1 deletion meowgb-tests/expected_output/MBC1/rom_4Mb.bin

This file was deleted.

1 change: 0 additions & 1 deletion meowgb-tests/expected_output/MBC1/rom_512kb.bin

This file was deleted.

1 change: 0 additions & 1 deletion meowgb-tests/expected_output/MBC1/rom_8Mb.bin

This file was deleted.

File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"
Expand Down
Loading

0 comments on commit d89a1d9

Please sign in to comment.