From 897e93c816f4ede03b09d7184f7560eeed76c73a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Magalh=C3=A3es?= <joamag@gmail.com>
Date: Sun, 10 Jul 2022 09:37:28 +0100
Subject: [PATCH] fix: small rom bank tweaks

---
 examples/sdl/src/main.rs                      |  29 ++++++++++--------
 res/roms/paradius/cpu/cpu_instrs.gb           | Bin 0 -> 65536 bytes
 .../paradius/interrupt_time/interrupt_time.gb | Bin 0 -> 32768 bytes
 src/rom.rs                                    |  15 ++++++---
 4 files changed, 27 insertions(+), 17 deletions(-)
 create mode 100644 res/roms/paradius/cpu/cpu_instrs.gb
 create mode 100644 res/roms/paradius/interrupt_time/interrupt_time.gb

diff --git a/examples/sdl/src/main.rs b/examples/sdl/src/main.rs
index b072728f..ef757e75 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
GIT binary patch
literal 65536
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

literal 0
HcmV?d00001

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
GIT binary patch
literal 32768
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
MqaiRF0z)?h0C-7fb^rhX

literal 0
HcmV?d00001

diff --git a/src/rom.rs b/src/rom.rs
index ea1c7ed2..e7cd9ba0 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;
                 }
-- 
GitLab