all repos — mgba @ c9145e18d7504e07c3d67aaadae7de5e22ea3179

mGBA Game Boy Advance Emulator

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))