From a175ba8d8cfc186e63c85e525cf2f3e0e601c3ee Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Magalh=C3=A3es?= <joamag@gmail.com>
Date: Sun, 30 Apr 2023 20:17:05 +0100
Subject: [PATCH] feat: new test rom and initial speed support The double speed
 mode is still not available.

---
 res/roms/test/cgb_acid2.gbc | Bin 0 -> 32768 bytes
 src/gb.rs                   |   7 +++++++
 src/mmu.rs                  |   7 +++++--
 3 files changed, 12 insertions(+), 2 deletions(-)
 create mode 100644 res/roms/test/cgb_acid2.gbc

diff --git a/res/roms/test/cgb_acid2.gbc b/res/roms/test/cgb_acid2.gbc
new file mode 100644
index 0000000000000000000000000000000000000000..5f71bd36060b46eefcf7785f81ce16a5a6c5fc67
GIT binary patch
literal 32768
zcmeI4e`s6R702(B6iIIULvq*Rfw3ebr>2mSWRz%~_VVn=jpBvQHdA8u&xD&fT4z$%
zrkOUxlcJ2yHpOuhmfGMZ#(%8TEA{qA3nLKHn%NPK?f*u@njw-bW^7%x1yW}b@9x}t
z-_w&Nx!$1J#yI!!{O<RibI&>VbFZHNdXJDVr~T>63G<(ivd|^1e%jxEy@u?x4wEya
zn$!@d+cPpsYCpMt^6t%>H>NIMKJnto+P_@C`N`C!%fI=WeDF~F?zV%6L;FOvR|`e|
z`NF<?d+FNBk?=}m*!ObPyuEcr3H#oJ&YqQE*thO<6HOW+E02d|Df?~TlFgl(l!yhi
z?~ubyrX_{hd_Qxzl}Ww-BN&sC2HE|27?Qd;U;CBjV2$_TGc$U}w`4KHEZNO4j-oJ2
z5I!aSiicmSa+3)u#nQ@3woN{k?T{^5Dtoi-a%;9z{$BQ5K7}sdXMa}NpS$djHlMAN
zUD*y_&|-h=;VIIPXLtW92jJFW%MCdvM!hEY!j11*ZZPZbmKWt1$R7xKVR>901Q`c+
zJ;?`h3T})F`yZBnA)f|0Ddc<0_vN!7-xl)X@?CiX<Of2o?(j;AUeJxg5{QnEU8;&&
ziJi+LbCqG2pc(ygyChkl86IVJZsi^o<Ad31wOEYsW%X@iFGM#ol;nTZc2bmpGb+iy
zt=)7Gh)c&4!uf8=hZ%~Nr;J}=AR#u^FOOg3v4x$nHN48lGb?Mtqs%Uh1&2~Q7<T^B
z7+fJg*gId^+HOYIGnB*^_H<fY%j5rRcHzaVD2Y!D6T313|E|3#02^L5o(KnSt8C{U
z747VYRkkUM3f#_K@kd=WzT!in$j%nF3`&umE$kQBb?as*MdS4?x23%RMeoqkM(E}v
zMHT9$F6yK<YM~M>(c8r<wO7*B)lJZ<tC_7NdnNZTyhp9HF7L?&v+?ZU)$G-*Bw4Kv
zM_rxAbKpQSNoh6lH-z`Nq7zZ?Rd%GJB--Wmx*GJTU0pV3SFf$Lx62mp?X|@Mij)q7
zB}*U**O+8+wT7*(J>R#w0s~f;0%!PTtE=~z)fI(nY{=>wgnRMhR#!@b!FCc;>`E*Q
zXBV8k4kZ?aGY03NgY<m!G1BvmDiU~ZM~(8Fy(VyS$8P1MeRupjl0=j5AN}EOC@PV)
zdf*bZz|4|_c!;<{KjBGys(KQJrb!R8CfPM=@g#(uX?`#9zGbzrIk!S+wQjbIkDFS7
z7LS{n^&F1Py0OvJibBZJlBuVsXJ^xCQ^QV%e{-g0y=&Jt>r~3rBO@Pw{LVY3wn1B4
zGqnp^FlcJ4m3f#tl~NS9+tjSLcdx0PPC_OpP0f1Q>}FlASPq-boJV)J+uhxL_N*k;
z)-vx<sG}nkD(1Gn?sS^mW@l$+W@o3TjmTl%*4GU^Jv{^M$`wO1YQ@}Id1IVK%v7O?
z5hEj`qhn*EqsDl@|IQu1|MqP|Giv9~iQgW(S2`azwC-+mA9QxM^Ja`ce3(6a%yoCU
z7_;rU8RPMa1dsp{Kmter2_OL^fCP{L5<mh-00|%gB!C2v01`j~NB{{S0VIF~kN^@u
z0!RP}AOR$R1dsp{Kmter2_OL^fCP{L5<mh-00|%gB!C2vz#||K466Nffu5%8K|dU<
z!IiGVodvZ&7;J28dXnA)b(-F5da|)G5QxX<8rN&_SRn8SO8T#d92giId-vVBxq$&u
zN;E3o#)?LT?(CeKdk<P?r_f{2#>dm?TepOM_Sue(mX;@;IB`Pg{{Bd$zdr;`=v})a
zk)uZ=k(L&rhll<C=4PL7*Dj&iD{t(zbGu#WmX=85)mI~to*tnG2Nfk6Rg}R&q4)1^
zZ*Oj{ukY&<`l+XSdWMF2pb0%Z918XIwY8l(C3Nv$vEF>;Vf6{oH0>NeG~uPHbQxBg
zpQ;KkcCwxEHk^Nia~(9LQ}jIC&A^qydyWZh5%h22%p~DOM>D>N7YrtjCyvC!i6e>Q
zEMGj%dwzZwUQ2}hbK0VohI3AX8rXQAlkLyKYk_(c{WV5aRohu@W{bz;VK~6v)Fkgy
z`?SUU>l>4~93e2D1^NaZg=!brm_#BGf=bxl=kay>J)RTh!}S#Xo8hnXNo#*^s&8uI
z^`^Cp^bCDK&#-z`Rr`o*JwEU`O&`=%@uRK~Z^4L{Owtdb|6%gS-~o1>7ylKq`5M~b
z<MAY4p-cH`x|Dpy<6$%A8CVvmmXM7NZJgdd@O64y8{gO{<a>~OQI^>Z_4%Bqmmnu!
zAGKd?r@x2seEl>H<}xKtF(2SH1>X96bo&(ZVRoMVl9mP!UV)*ti@6EGTl)xXZ-76~
z2X;1=W#jqy+VuzhtO~xr*i2xp^LO$;&F78%rM(9GiTmer5El+3-{+sxw_r7Y&JQ5K
z<BviNmJzf*UzUxpw=qAnK0d!G@ZV&oZ;J7JeJ+8IzP@~Z;#tY}i$0%1d|fZVY~bn1
z>v;<*WcBg*+zwAxmi4pG^m<usz(DthCoS07GnUs6kzR<0)fWVxTyA4B|GKuQ_R0I$
z{^R_Hn(EadVb`DMeC}*N7>(Br@%ZnJ?RfpS#QbsnVXgm1*FTX^pHB{ZzM33XpHCzT
z&x6AAN|xd2wz@H?t-_9w34#5Zq378zvvSLYv<dG&GVEh5>a`UTUcQofy8iK<@n3s4
zGVsNi1}l6j#zz#1IN@tCnPbgh`HA;Irn$zO&(yxuV5yDWPu;41`qmEb!_0~UK2g(_
zJqVwXxt8sK56Rrg9)i!i#O8e$!geQo35R|3X5I(ip&{OtXV~X#iiD47wKFUG!*X|4
z$rN6buUs_VMFL0w2_OL^fCP{L5<mh-00|%gB!C2v01`j~NB{{S0VIF~kN^@u0!RP}
yAOR$R1dsp{Kmter2_OL^fCP{L5<mh-00|%gB!C2v01`j~NB{{S0VME$PT-$KRhLEp

literal 0
HcmV?d00001

diff --git a/src/gb.rs b/src/gb.rs
index 867e6b0f..a4a936f7 100644
--- a/src/gb.rs
+++ b/src/gb.rs
@@ -82,6 +82,13 @@ impl Display for GameBoyMode {
     }
 }
 
+#[cfg_attr(feature = "wasm", wasm_bindgen)]
+#[derive(Clone, Copy, PartialEq, Eq)]
+pub enum GameBoySpeed {
+    Normal = 0,
+    Double = 1,
+}
+
 #[cfg_attr(feature = "wasm", wasm_bindgen)]
 #[derive(Clone, Copy, PartialEq, Eq)]
 pub struct GameBoyConfig {
diff --git a/src/mmu.rs b/src/mmu.rs
index 7418189c..9914e86a 100644
--- a/src/mmu.rs
+++ b/src/mmu.rs
@@ -1,7 +1,7 @@
 use crate::{
     apu::Apu,
     debugln,
-    gb::{GameBoyConfig, GameBoyMode},
+    gb::{GameBoyConfig, GameBoyMode, GameBoySpeed},
     pad::Pad,
     ppu::Ppu,
     rom::Cartridge,
@@ -29,6 +29,8 @@ pub struct Mmu {
     /// (CGB only).
     pub key0: u8,
 
+    pub speed: GameBoySpeed,
+
     /// Reference to the PPU (Pixel Processing Unit) that is going
     /// to be used both for VRAM reading/writing and to forward
     /// some of the access operations.
@@ -110,6 +112,7 @@ impl Mmu {
             ram_offset: 0x1000,
             ie: 0x0,
             key0: 0x0,
+            speed: GameBoySpeed::Normal,
             mode,
             gbc,
         }
@@ -253,7 +256,7 @@ impl Mmu {
                     0x4c => self.key0,
 
                     // 0xFF4D - KEY1 (CGB only)
-                    0x4d => todo!("CGB speed switch"),
+                    0x4d => (false as u8) | ((self.speed as u8) << 7),
 
                     // 0xFF50 - Boot active flag
                     0x50 => u8::from(self.boot_active),
-- 
GitLab