diff --git a/examples/sdl/src/main.rs b/examples/sdl/src/main.rs index b072728fc9119ea2b0e84a3341c967ceacda1f78..ef757e75e0488f11ddcf1fe8a282b7732d2bb042 100644 --- a/examples/sdl/src/main.rs +++ b/examples/sdl/src/main.rs @@ -98,23 +98,26 @@ fn main() { //game_boy.load_rom_file("../../res/roms.prop/dr_mario.gb"); //game_boy.load_rom_file("../../res/roms.prop/alleyway.gb"); //game_boy.load_rom_file("../../res/roms.prop/super_mario.gb"); - let rom = game_boy.load_rom_file("../../res/roms.prop/super_mario_2.gb"); - println!("{}", rom); + //let rom = game_boy.load_rom_file("../../res/roms.prop/super_mario_2.gb"); //game_boy.load_rom_file("../../res/roms/firstwhite.gb"); //game_boy.load_rom_file("../../res/roms/opus5.gb"); - //game_boy.load_rom_file("../../res/roms/paradius/cpu/01-special.gb"); // PASSED - //game_boy.load_rom_file("../../res/roms/paradius/cpu/02-interrupts.gb"); // PASSED - //game_boy.load_rom_file("../../res/roms/paradius/cpu/03-op sp,hl.gb"); // PASSED - //game_boy.load_rom_file("../../res/roms/paradius/cpu/04-op r,imm.gb"); // PASSED - //game_boy.load_rom_file("../../res/roms/paradius/cpu/05-op rp.gb"); // PASSED - //game_boy.load_rom_file("../../res/roms/paradius/cpu/06-ld r,r.gb"); // PASSED - //game_boy.load_rom_file("../../res/roms/paradius/cpu/07-jr,jp,call,ret,rst.gb"); // PASSED - //game_boy.load_rom_file("../../res/roms/paradius/cpu/08-misc instrs.gb"); // PASSED - //game_boy.load_rom_file("../../res/roms/paradius/cpu/09-op r,r.gb"); // PASSED - //game_boy.load_rom_file("../../res/roms/paradius/cpu/10-bit ops.gb"); // - //game_boy.load_rom_file("../../res/roms/paradius/cpu/11-op a,(hl).gb"); // PASSED + //let rom = game_boy.load_rom_file("../../res/roms/paradius/cpu/cpu_instrs.gb"); // CRASHED + let rom = game_boy.load_rom_file("../../res/roms/paradius/interrupt_time/interrupt_time.gb"); // CRASHED + //let rom = game_boy.load_rom_file("../../res/roms/paradius/cpu/01-special.gb"); // PASSED + //let rom = game_boy.load_rom_file("../../res/roms/paradius/cpu/02-interrupts.gb"); // PASSED + //let rom = game_boy.load_rom_file("../../res/roms/paradius/cpu/03-op sp,hl.gb"); // PASSED + //let rom = game_boy.load_rom_file("../../res/roms/paradius/cpu/04-op r,imm.gb"); // PASSED + //let rom = game_boy.load_rom_file("../../res/roms/paradius/cpu/05-op rp.gb"); // PASSED + //let rom = game_boy.load_rom_file("../../res/roms/paradius/cpu/06-ld r,r.gb"); // PASSED + //let rom = game_boy.load_rom_file("../../res/roms/paradius/cpu/07-jr,jp,call,ret,rst.gb"); // PASSED + //let rom = game_boy.load_rom_file("../../res/roms/paradius/cpu/08-misc instrs.gb"); // PASSED + //let rom = game_boy.load_rom_file("../../res/roms/paradius/cpu/09-op r,r.gb"); // PASSED + //let rom = game_boy.load_rom_file("../../res/roms/paradius/cpu/10-bit ops.gb"); // + //let rom = game_boy.load_rom_file("../../res/roms/paradius/cpu/11-op a,(hl).gb"); //let rom PASSED + + println!("ROM Information:\n{}", rom); let mut counter = 0u32; diff --git a/res/roms/paradius/cpu/cpu_instrs.gb b/res/roms/paradius/cpu/cpu_instrs.gb new file mode 100644 index 0000000000000000000000000000000000000000..7b06221b23dcd84644e7910bb8ba91a957c9ba04 Binary files /dev/null and b/res/roms/paradius/cpu/cpu_instrs.gb differ diff --git a/res/roms/paradius/interrupt_time/interrupt_time.gb b/res/roms/paradius/interrupt_time/interrupt_time.gb new file mode 100644 index 0000000000000000000000000000000000000000..1b17845e33205df4c97eaa140f8e6db2a1194ee0 Binary files /dev/null and b/res/roms/paradius/interrupt_time/interrupt_time.gb differ diff --git a/src/rom.rs b/src/rom.rs index ea1c7ed2858e34bb486c408d01446bdcd06b11ec..e7cd9ba04807fd23d63433e67459e28560285195 100644 --- a/src/rom.rs +++ b/src/rom.rs @@ -1,5 +1,8 @@ use core::fmt; -use std::fmt::{Display, Formatter}; +use std::{ + cmp::max, + fmt::{Display, Formatter}, +}; use crate::debugln; @@ -257,6 +260,8 @@ impl Cartridge { self.ram_offset = 0x0000; self.set_mbc(); self.allocate_ram(); + self.set_rom_bank(1); + self.set_ram_bank(0); } fn set_mbc(&mut self) { @@ -264,7 +269,8 @@ impl Cartridge { } fn allocate_ram(&mut self) { - self.ram_data = vec![0; self.ram_size().ram_banks() as usize * RAM_BANK_SIZE] + let ram_banks = max(self.ram_size().ram_banks(), 1); + self.ram_data = vec![0; ram_banks as usize * RAM_BANK_SIZE]; } } @@ -320,11 +326,12 @@ pub static MBC1: Mbc = Mbc { write_rom: |rom: &mut Cartridge, addr: u16, value: u8| { match addr & 0xf000 { 0x0000 | 0x1000 => { - debugln!("RAM enable => {}", value); + println!("RAM enable => {}", value); } 0x2000 | 0x3000 => { // @todo this is slow and must be pre-computed in cartridge - let mut rom_bank = value & (rom.rom_size().rom_banks() * 2 - 1) as u8; + let mut rom_bank = value & 0x1f; + rom_bank = rom_bank & (rom.rom_size().rom_banks() * 2 - 1) as u8; if rom_bank == 0 { rom_bank = 1; }