src/gb/test/mbc.c (view raw)
1/* Copyright (c) 2013-2016 Jeffrey Pfau
2 *
3 * This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6#include "util/test/suite.h"
7
8#include <mgba/core/core.h>
9#include <mgba/gb/core.h>
10#include <mgba/internal/gb/gb.h>
11#include <mgba/internal/gb/mbc.h>
12#include <mgba-util/vfs.h>
13
14M_TEST_SUITE_SETUP(GBMBC) {
15 struct VFile* vf = VFileMemChunk(NULL, 2048);
16 GBSynthesizeROM(vf);
17 struct mCore* core = GBCoreCreate();
18 core->init(core);
19 mCoreInitConfig(core, NULL);
20 core->loadROM(core, vf);
21 *state = core;
22 return 0;
23}
24
25M_TEST_SUITE_TEARDOWN(GBMBC) {
26 if (!*state) {
27 return 0;
28 }
29 struct mCore* core = *state;
30 core->deinit(core);
31 return 0;
32}
33M_TEST_DEFINE(detectNone) {
34 struct mCore* core = *state;
35 struct GB* gb = core->board;
36 struct GBCartridge* cart = (struct GBCartridge*) &gb->memory.rom[0x100];
37
38 gb->memory.mbcType = GB_MBC_AUTODETECT;
39 cart->type = 0x00;
40 core->reset(core);
41 assert_int_equal(gb->memory.mbcType, GB_MBC_NONE);
42
43 gb->memory.mbcType = GB_MBC_AUTODETECT;
44 cart->type = 0x08;
45 core->reset(core);
46 assert_int_equal(gb->memory.mbcType, GB_MBC_NONE);
47
48
49 gb->memory.mbcType = GB_MBC_AUTODETECT;
50 cart->type = 0x09;
51 core->reset(core);
52 assert_int_equal(gb->memory.mbcType, GB_MBC_NONE);
53
54
55 gb->memory.mbcType = GB_MBC_AUTODETECT;
56 cart->type = 0x0A;
57 core->reset(core);
58 assert_int_not_equal(gb->memory.mbcType, GB_MBC_NONE);
59}
60
61M_TEST_DEFINE(detect1) {
62 struct mCore* core = *state;
63 struct GB* gb = core->board;
64 struct GBCartridge* cart = (struct GBCartridge*) &gb->memory.rom[0x100];
65
66 gb->memory.mbcType = GB_MBC_AUTODETECT;
67 cart->type = 0x00;
68 core->reset(core);
69 assert_int_not_equal(gb->memory.mbcType, GB_MBC1);
70
71 gb->memory.mbcType = GB_MBC_AUTODETECT;
72 cart->type = 0x01;
73 core->reset(core);
74 assert_int_equal(gb->memory.mbcType, GB_MBC1);
75
76 gb->memory.mbcType = GB_MBC_AUTODETECT;
77 cart->type = 0x02;
78 core->reset(core);
79 assert_int_equal(gb->memory.mbcType, GB_MBC1);
80
81 gb->memory.mbcType = GB_MBC_AUTODETECT;
82 cart->type = 0x03;
83 core->reset(core);
84 assert_int_equal(gb->memory.mbcType, GB_MBC1);
85
86 gb->memory.mbcType = GB_MBC_AUTODETECT;
87 cart->type = 0x04;
88 core->reset(core);
89 assert_int_not_equal(gb->memory.mbcType, GB_MBC1);
90}
91
92M_TEST_DEFINE(detect2) {
93 struct mCore* core = *state;
94 struct GB* gb = core->board;
95 struct GBCartridge* cart = (struct GBCartridge*) &gb->memory.rom[0x100];
96
97 gb->memory.mbcType = GB_MBC_AUTODETECT;
98 cart->type = 0x04;
99 core->reset(core);
100 assert_int_not_equal(gb->memory.mbcType, GB_MBC2);
101
102 gb->memory.mbcType = GB_MBC_AUTODETECT;
103 cart->type = 0x05;
104 core->reset(core);
105 assert_int_equal(gb->memory.mbcType, GB_MBC2);
106
107 gb->memory.mbcType = GB_MBC_AUTODETECT;
108 cart->type = 0x06;
109 core->reset(core);
110 assert_int_equal(gb->memory.mbcType, GB_MBC2);
111
112 gb->memory.mbcType = GB_MBC_AUTODETECT;
113 cart->type = 0x07;
114 core->reset(core);
115 assert_int_not_equal(gb->memory.mbcType, GB_MBC2);
116}
117
118M_TEST_DEFINE(detect3) {
119 struct mCore* core = *state;
120 struct GB* gb = core->board;
121 struct GBCartridge* cart = (struct GBCartridge*) &gb->memory.rom[0x100];
122
123 gb->memory.mbcType = GB_MBC_AUTODETECT;
124 cart->type = 0x0E;
125 core->reset(core);
126 assert_int_not_equal(gb->memory.mbcType, GB_MBC3);
127 assert_int_not_equal(gb->memory.mbcType, GB_MBC3_RTC);
128
129 gb->memory.mbcType = GB_MBC_AUTODETECT;
130 cart->type = 0x0F;
131 core->reset(core);
132 assert_int_equal(gb->memory.mbcType, GB_MBC3_RTC);
133
134 gb->memory.mbcType = GB_MBC_AUTODETECT;
135 cart->type = 0x10;
136 core->reset(core);
137 assert_int_equal(gb->memory.mbcType, GB_MBC3_RTC);
138
139 gb->memory.mbcType = GB_MBC_AUTODETECT;
140 cart->type = 0x11;
141 core->reset(core);
142 assert_int_equal(gb->memory.mbcType, GB_MBC3);
143
144 gb->memory.mbcType = GB_MBC_AUTODETECT;
145 cart->type = 0x12;
146 core->reset(core);
147 assert_int_equal(gb->memory.mbcType, GB_MBC3);
148
149 gb->memory.mbcType = GB_MBC_AUTODETECT;
150 cart->type = 0x13;
151 core->reset(core);
152 assert_int_equal(gb->memory.mbcType, GB_MBC3);
153
154 gb->memory.mbcType = GB_MBC_AUTODETECT;
155 cart->type = 0x14;
156 core->reset(core);
157 assert_int_not_equal(gb->memory.mbcType, GB_MBC3);
158 assert_int_not_equal(gb->memory.mbcType, GB_MBC3_RTC);
159}
160
161M_TEST_DEFINE(detect5) {
162 struct mCore* core = *state;
163 struct GB* gb = core->board;
164 struct GBCartridge* cart = (struct GBCartridge*) &gb->memory.rom[0x100];
165
166 gb->memory.mbcType = GB_MBC_AUTODETECT;
167 cart->type = 0x19;
168 core->reset(core);
169 assert_int_equal(gb->memory.mbcType, GB_MBC5);
170
171 gb->memory.mbcType = GB_MBC_AUTODETECT;
172 cart->type = 0x1A;
173 core->reset(core);
174 assert_int_equal(gb->memory.mbcType, GB_MBC5);
175
176 gb->memory.mbcType = GB_MBC_AUTODETECT;
177 cart->type = 0x1B;
178 core->reset(core);
179 assert_int_equal(gb->memory.mbcType, GB_MBC5);
180
181 gb->memory.mbcType = GB_MBC_AUTODETECT;
182 cart->type = 0x1C;
183 core->reset(core);
184 assert_int_equal(gb->memory.mbcType, GB_MBC5_RUMBLE);
185
186 gb->memory.mbcType = GB_MBC_AUTODETECT;
187 cart->type = 0x1D;
188 core->reset(core);
189 assert_int_equal(gb->memory.mbcType, GB_MBC5_RUMBLE);
190
191 gb->memory.mbcType = GB_MBC_AUTODETECT;
192 cart->type = 0x1E;
193 core->reset(core);
194 assert_int_equal(gb->memory.mbcType, GB_MBC5_RUMBLE);
195}
196
197M_TEST_DEFINE(detect6) {
198 struct mCore* core = *state;
199 struct GB* gb = core->board;
200 struct GBCartridge* cart = (struct GBCartridge*) &gb->memory.rom[0x100];
201
202 gb->memory.mbcType = GB_MBC_AUTODETECT;
203 cart->type = 0x1F;
204 core->reset(core);
205 assert_int_not_equal(gb->memory.mbcType, GB_MBC6);
206
207 gb->memory.mbcType = GB_MBC_AUTODETECT;
208 cart->type = 0x20;
209 core->reset(core);
210 assert_int_equal(gb->memory.mbcType, GB_MBC6);
211
212 gb->memory.mbcType = GB_MBC_AUTODETECT;
213 cart->type = 0x21;
214 core->reset(core);
215 assert_int_not_equal(gb->memory.mbcType, GB_MBC6);
216}
217
218M_TEST_DEFINE(detect7) {
219 struct mCore* core = *state;
220 struct GB* gb = core->board;
221 struct GBCartridge* cart = (struct GBCartridge*) &gb->memory.rom[0x100];
222
223 gb->memory.mbcType = GB_MBC_AUTODETECT;
224 cart->type = 0x21;
225 core->reset(core);
226 assert_int_not_equal(gb->memory.mbcType, GB_MBC7);
227
228 gb->memory.mbcType = GB_MBC_AUTODETECT;
229 cart->type = 0x22;
230 core->reset(core);
231 assert_int_equal(gb->memory.mbcType, GB_MBC7);
232
233 gb->memory.mbcType = GB_MBC_AUTODETECT;
234 cart->type = 0x23;
235 core->reset(core);
236 assert_int_not_equal(gb->memory.mbcType, GB_MBC7);
237}
238
239M_TEST_SUITE_DEFINE_SETUP_TEARDOWN(GBMBC,
240 cmocka_unit_test(detectNone),
241 cmocka_unit_test(detect1),
242 cmocka_unit_test(detect2),
243 cmocka_unit_test(detect3),
244 cmocka_unit_test(detect5),
245 cmocka_unit_test(detect6),
246 cmocka_unit_test(detect7))