From be1b7517bfcd8939b29011347a1f720e6be1e3e2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Magalh=C3=A3es?= <joamag@gmail.com>
Date: Sun, 3 Jul 2022 04:58:06 +0100
Subject: [PATCH] feat: new roms support

---
 .gitignore               |   2 +-
 examples/sdl/src/main.rs |   2 +-
 examples/web/index.ts    |   2 +-
 res/roms/firstwhite.gb   | Bin 0 -> 32768 bytes
 res/roms/ld_r_r.gb       | Bin 0 -> 32768 bytes
 res/roms/opus5.gb        | Bin 0 -> 32768 bytes
 res/roms/rtc3test.gb     | Bin 0 -> 32768 bytes
 res/roms/special.gb      | Bin 0 -> 32768 bytes
 src/mmu.rs               |   7 ++++---
 9 files changed, 7 insertions(+), 6 deletions(-)
 create mode 100644 res/roms/firstwhite.gb
 create mode 100644 res/roms/ld_r_r.gb
 create mode 100644 res/roms/opus5.gb
 create mode 100644 res/roms/rtc3test.gb
 create mode 100644 res/roms/special.gb

diff --git a/.gitignore b/.gitignore
index 4a77473d..be3d44f6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,5 +5,5 @@ Cargo.lock
 /.idea
 
 /target
-/res/roms
+/res/roms.prop
 /examples/*/target
diff --git a/examples/sdl/src/main.rs b/examples/sdl/src/main.rs
index 6369ac3e..50af56f8 100644
--- a/examples/sdl/src/main.rs
+++ b/examples/sdl/src/main.rs
@@ -80,7 +80,7 @@ fn main() {
 
     let mut game_boy = GameBoy::new();
     game_boy.load_boot_static();
-    game_boy.load_rom_file("../../res/roms/ld_r_r.gb");
+    game_boy.load_rom_file("../../res/roms/firstwhite.gb");
     //game_boy.load_rom_file("../../res/roms/opus5.gb");
 
     let mut counter = 0;
diff --git a/examples/web/index.ts b/examples/web/index.ts
index 076502df..68cd9aaa 100644
--- a/examples/web/index.ts
+++ b/examples/web/index.ts
@@ -49,7 +49,7 @@ const KEYS: Record<string, number> = {
 };
 
 // @ts-ignore: ts(2580)
-const ROM_PATH = require("../../res/roms/tetris.gb");
+const ROM_PATH = require("../../res/roms/firstwhite.gb");
 
 type State = {
     gameBoy: GameBoy;
diff --git a/res/roms/firstwhite.gb b/res/roms/firstwhite.gb
new file mode 100644
index 0000000000000000000000000000000000000000..6d35132175512a3f349dcb4378cfebad2694af6d
GIT binary patch
literal 32768
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
bGz3ONU^E0qLtr!nMnhmU1V%$(=!XCR{NS*N

literal 0
HcmV?d00001

diff --git a/res/roms/ld_r_r.gb b/res/roms/ld_r_r.gb
new file mode 100644
index 0000000000000000000000000000000000000000..d497bfd1275361bc847fa94dc87b43729f180b5d
GIT binary patch
literal 32768
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
TXb6mkz-S1JhQMeD5FG*lJ{)}*

literal 0
HcmV?d00001

diff --git a/res/roms/opus5.gb b/res/roms/opus5.gb
new file mode 100644
index 0000000000000000000000000000000000000000..a3b8028a31c98b753f0b03d8b8faa2da4232ef14
GIT binary patch
literal 32768
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
bqaiRF0;3@?8UmvsFd71*Aut*O0~Z1SKy@PI

literal 0
HcmV?d00001

diff --git a/res/roms/rtc3test.gb b/res/roms/rtc3test.gb
new file mode 100644
index 0000000000000000000000000000000000000000..06836967eb2927b31c99de201a44cfd709380268
GIT binary patch
literal 32768
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

literal 0
HcmV?d00001

diff --git a/res/roms/special.gb b/res/roms/special.gb
new file mode 100644
index 0000000000000000000000000000000000000000..ad3e9984f967b77b7ffdf768842ce3c04517d059
GIT binary patch
literal 32768
zcmZP=>EN(1)48{4X=ivDxS5L?ni+T)co{eZ<vThV`0kv^dv^Ek&6&G*rzhv}y*YFD
z&dm9{cN*KF1z7_F0|O&iEY0^dm>xoeyCA~>J^?Ku8HL{>yb9kd4l^83WN<jlz%+#X
zFzVFN5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7
zfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z
z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC8A#hmX
z&^1<rKk^0)=NK=XU^uz`#8<ofXPFOtv{m>9=KMb^binQkMC9YiuQg`{4%C8pCoz40
zQi8$m|AU4HjSre0G@tx>^y*W^=KpTGe!5}0>(n?-Tb!0WEhTRt5MS}`t$XFW9sX7C
zn!~H#DX1zuQTwk{q*JI<@bKcnk0)ziG2N(n#e748#qOj8lilH0j5khx{l|4A>cCmX
z8y`=8wNrr7Twwa)+2aRZewAQ8yZnIGc7>lGPo8~u;H>b$v$6-zDjz(%>%hscXEhJP
z^qkc^`0?o1gJ=IAIC%1Fg~ZdZl@brXR!Q9bS}k$&YmLO!ueA~vzaFhPt9h{Upv3X7
zN1ePSK7Bpv;w$myY}A3Tr_IkAAN=@?{~wnH(=qmA28S7Md_5|`^Y!RIE(>nHl$}>%
z5At!HjXikG;Oz1P2S1)<(`T7z@Tbwg;_UJRl_wuQ{i>|2^@`<2?JL$BHLuuid_4K|
zZ1zD3rvD5N&-xxXd3M)<r)Lix2uLh0PEBEWXvc6k`_M0z8#WrOwi=Hm_(5_m`FW`@
z8P*&5zu0c1*KOC}JiF__+2aS!?mF;`<;Fk8b0CdhKQ!on{m`iY^+S{X*ALD5AdkcG
z;{zX0erVXOAoQVemjdsHrkx5LADVY4Fdz0maQ4Q*!#fXZosBxcU9nN&`^nFS|L?zI
zxM9cefZdMa0lyu?ga39657g`$9;n&<f1qkt{y;@><MFeT51g$#cy{*jv;GIZ+A*J%
zKVSz=H)la9<?OOUV80mtzyI}Y*`bezPaOXWa`D0gAOA7lP~Zc3%q=l9CpCqO;o(UH
zPeGaC;aL}O6oSKvm&q$gAulyOu_Ut$5(=jd+1S|pV>-0+;NdfeB)&jYF?$6m6yz6Y
z!c<8x!W4n!xmbK$6at)eJbV})DzY55V|a-o&A}SrAE4mq#_*7lLFnkmuNNzyeb{|y
z=Rp=8g^ytUtZXihjtmb485pj9RR4N5>cGR=vrz{`6h2lT6Np!M&6qG%u(asx&x41%
z4<2Qd`^{XjQG@M+%fAT<Uk{!<D{$l&!;NPGN7f&<Q#iZuup&bfAH&%fhZPyR`2L@L
zaoA4emGliehF3B-?0&qGy>T||h(wGc!wfc-avg;~Dy#}WPTDm*$Y2w&`~M)*uKq!$
z9RqgEs&Lni@s<C7JBG6h58E-k^8bHQaP|?lgrjU6Qo<{hlvovh9As7ac=GGnn8S7x
zA2`@CJaD#q^1%IY)e*3e-~)$`C)Z0b*)=?CcqIeQeHyY)zbZ=K(E7)&!1?i?f(F-F
zw<BLaZqqf*D}M+v=xp<mvtdWhHXk`$b>!&NU$QrjalDefVW*%db%RaBh*jZ_o%Ac|
z8xIeHZ9Ut3<d^J?YaI`qKAyY^Qk<`*rl~0?eM44Csrnzg!jFd+;RTEY2rx)6<mBXl
z%bc8lIXVAw7#Jk%5^UINBpA|iBn%RcwK2$;$yns4Su^nP@PO6v$w){@$nY@~SV%}n
zSQIcYq}lwpNn>DOkdUa8kN_)TU@$O9U|?XVgYp;{5)v4g*mxui5*!$8((=mE(rg$c
zK>8)>7;Mr&5_Jr9JQ6%?X*LWzGB!DNJUk3_2{mjWzD+_x4M=?*NST2FgH2i*2!Uuj
zHXaL*y$oP`B_tRmBn%ipwirl&+*${Afq?`MNGHS|1__Y;S$PR|3=%eJX?1C73^i$K
zAjDvkmXMH;X2VdCla`j2Q^8P|kWiD5PzR+G80-=f^3u}m7}CJn(im(&;U{6kzy<<o
zHVkPw6$KSJX$%QqP{(lW-M?$cjvZr2E32!^OG^W}Hx1+ukYx!831EI%jv3hg9I$+X
z4amQBU~?rv_M}1WOS7?&U^sT{*tLJ}jxnUA*?^o5k_S0~0URy~bqsP~eR2#A2_PRc
zF;sy06$}CvImh7fz`*eDK!O33Yr|%jX2$>y-n1G91_qmiganX(?7;RiFxaHkCD<^?
z7}OXT7=ZNHrKQ=i)j-szF-S0gBG85b6zUQZ5(NnfX*nSOgG41HY#10A-hcvtfdS;h
zG*AMu0s9}quSsBF0NcX`;)BA2fdQQG7#KjwNP>@n0p!Cp(5WyWZJ>m8?AWy$P+A2C
z07Tx7t%d=Vat!Ji_#`9@BqaD4z}}XSU?`A~;E|9hU|?WK_%sic9H72Fn|l~k7#bMr
z78j%@XC~%wfy&3P4;bwlA25Bj;{a96H$VmK$HS^e&i*}o_R4Wk(Jb)~o^zlEjZ&i_
zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF
z0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*
kAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0z)eV0EJ0UQ2+n{

literal 0
HcmV?d00001

diff --git a/src/mmu.rs b/src/mmu.rs
index 4eab0ec2..0a1be916 100644
--- a/src/mmu.rs
+++ b/src/mmu.rs
@@ -94,15 +94,16 @@ impl Mmu {
         match addr & 0xf000 {
             // BOOT (256 B) + ROM0 (4 KB/16 KB)
             0x0000 => {
-                println!("Writing to BOOT")
+                self.rom[addr as usize] = value;
+                println!("Writing to BOOT at 0x{:04x}", addr)
             }
             // ROM0 (12 KB/16 KB)
             0x1000 | 0x2000 | 0x3000 => {
-                println!("Writing to ROM 0");
+                println!("Writing to ROM 0 at 0x{:04x}", addr);
             }
             // ROM1 (Unbanked) (16 KB)
             0x4000 | 0x5000 | 0x6000 | 0x7000 => {
-                println!("Writing to ROM 1");
+                println!("Writing to ROM 1 at 0x{:04x}", addr);
             }
             // Graphics: VRAM (8 KB)
             0x8000 | 0x9000 => {
-- 
GitLab