Add SGB and CGB flags to the tester

This commit is contained in:
Lior Halphon 2021-10-09 15:57:15 +03:00
parent 004b004f98
commit 3b1094058b

View File

@ -33,7 +33,7 @@ GB_gameboy_t gb;
static unsigned int frames = 0; static unsigned int frames = 0;
static bool use_tga = false; static bool use_tga = false;
static const uint8_t bmp_header[] = { static uint8_t bmp_header[] = {
0x42, 0x4D, 0x48, 0x68, 0x01, 0x00, 0x00, 0x00, 0x42, 0x4D, 0x48, 0x68, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x38, 0x00,
0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0x70, 0xFF, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0x70, 0xFF,
@ -45,13 +45,13 @@ static const uint8_t bmp_header[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
}; };
static const uint8_t tga_header[] = { static uint8_t tga_header[] = {
0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x00, 0x90, 0x00,
0x20, 0x28, 0x20, 0x28,
}; };
uint32_t bitmap[160*144]; uint32_t bitmap[256*224];
static char *async_input_callback(GB_gameboy_t *gb) static char *async_input_callback(GB_gameboy_t *gb)
{ {
@ -140,7 +140,7 @@ static void vblank(GB_gameboy_t *gb)
if (frames >= test_length && !gb->disable_rendering) { if (frames >= test_length && !gb->disable_rendering) {
bool is_screen_blank = true; bool is_screen_blank = true;
for (unsigned i = 160*144; i--;) { for (unsigned i = GB_get_screen_width(gb) * GB_get_screen_height(gb); i--;) {
if (bitmap[i] != bitmap[0]) { if (bitmap[i] != bitmap[0]) {
is_screen_blank = false; is_screen_blank = false;
break; break;
@ -151,12 +151,20 @@ static void vblank(GB_gameboy_t *gb)
if (!is_screen_blank || frames >= test_length + 60 * 4) { if (!is_screen_blank || frames >= test_length + 60 * 4) {
FILE *f = fopen(bmp_filename, "wb"); FILE *f = fopen(bmp_filename, "wb");
if (use_tga) { if (use_tga) {
tga_header[0xC] = GB_get_screen_width(gb);
tga_header[0xD] = GB_get_screen_width(gb) >> 8;
tga_header[0xE] = GB_get_screen_height(gb);
tga_header[0xF] = GB_get_screen_height(gb) >> 8;
fwrite(&tga_header, 1, sizeof(tga_header), f); fwrite(&tga_header, 1, sizeof(tga_header), f);
} }
else { else {
(*(uint32_t *)&bmp_header[0x2]) = sizeof(bmp_header) + sizeof(bitmap[0]) * GB_get_screen_width(gb) * GB_get_screen_height(gb);
(*(uint32_t *)&bmp_header[0x12]) = GB_get_screen_width(gb);
(*(int32_t *)&bmp_header[0x16]) = -GB_get_screen_height(gb);
(*(uint32_t *)&bmp_header[0x22]) = sizeof(bitmap[0]) * GB_get_screen_width(gb) * GB_get_screen_height(gb);
fwrite(&bmp_header, 1, sizeof(bmp_header), f); fwrite(&bmp_header, 1, sizeof(bmp_header), f);
} }
fwrite(&bitmap, 1, sizeof(bitmap), f); fwrite(&bitmap, 1, sizeof(bitmap[0]) * GB_get_screen_width(gb) * GB_get_screen_height(gb), f);
fclose(f); fclose(f);
if (!gb->boot_rom_finished) { if (!gb->boot_rom_finished) {
GB_log(gb, "Boot ROM did not finish.\n"); GB_log(gb, "Boot ROM did not finish.\n");
@ -271,7 +279,7 @@ int main(int argc, char **argv)
fprintf(stderr, "SameBoy Tester v" GB_VERSION "\n"); fprintf(stderr, "SameBoy Tester v" GB_VERSION "\n");
if (argc == 1) { if (argc == 1) {
fprintf(stderr, "Usage: %s [--dmg] [--start] [--length seconds] [--sav] [--boot path to boot ROM]" fprintf(stderr, "Usage: %s [--dmg] [--sgb] [--cgb] [--start] [--length seconds] [--sav] [--boot path to boot ROM]"
#ifndef _WIN32 #ifndef _WIN32
" [--jobs number of tests to run simultaneously]" " [--jobs number of tests to run simultaneously]"
#endif #endif
@ -285,6 +293,7 @@ int main(int argc, char **argv)
#endif #endif
bool dmg = false; bool dmg = false;
bool sgb = false;
bool sav = false; bool sav = false;
const char *boot_rom_path = NULL; const char *boot_rom_path = NULL;
@ -294,6 +303,21 @@ int main(int argc, char **argv)
if (strcmp(argv[i], "--dmg") == 0) { if (strcmp(argv[i], "--dmg") == 0) {
fprintf(stderr, "Using DMG mode\n"); fprintf(stderr, "Using DMG mode\n");
dmg = true; dmg = true;
sgb = false;
continue;
}
if (strcmp(argv[i], "--sgb") == 0) {
fprintf(stderr, "Using SGB mode\n");
sgb = true;
dmg = false;
continue;
}
if (strcmp(argv[i], "--cgb") == 0) {
fprintf(stderr, "Using CGB mode\n");
dmg = false;
sgb = false;
continue; continue;
} }
@ -374,6 +398,13 @@ int main(int argc, char **argv)
exit(1); exit(1);
} }
} }
else if (sgb) {
GB_init(&gb, GB_MODEL_SGB2);
if (GB_load_boot_rom(&gb, boot_rom_path ?: executable_relative_path("sgb2_boot.bin"))) {
fprintf(stderr, "Failed to load boot ROM from '%s'\n", boot_rom_path ?: executable_relative_path("sgb2_boot.bin"));
exit(1);
}
}
else { else {
GB_init(&gb, GB_MODEL_CGB_E); GB_init(&gb, GB_MODEL_CGB_E);
if (GB_load_boot_rom(&gb, boot_rom_path ?: executable_relative_path("cgb_boot.bin"))) { if (GB_load_boot_rom(&gb, boot_rom_path ?: executable_relative_path("cgb_boot.bin"))) {