mirror of https://github.com/bsnes-emu/bsnes.git
Make the automation results more consistent across revisions, and making use of this change as a chance to add color correction to the automation
This commit is contained in:
parent
8c8d5afe62
commit
9f7255cd23
|
@ -623,7 +623,7 @@ void GB_free(GB_gameboy_t *gb);
|
||||||
void GB_reset(GB_gameboy_t *gb);
|
void GB_reset(GB_gameboy_t *gb);
|
||||||
void GB_switch_model_and_reset(GB_gameboy_t *gb, GB_model_t model);
|
void GB_switch_model_and_reset(GB_gameboy_t *gb, GB_model_t model);
|
||||||
|
|
||||||
/* Returns the time passed, in 4MHz ticks. */
|
/* Returns the time passed, in 8MHz ticks. */
|
||||||
uint8_t GB_run(GB_gameboy_t *gb);
|
uint8_t GB_run(GB_gameboy_t *gb);
|
||||||
/* Returns the time passed since the last frame, in nanoseconds */
|
/* Returns the time passed since the last frame, in nanoseconds */
|
||||||
uint64_t GB_run_frame(GB_gameboy_t *gb);
|
uint64_t GB_run_frame(GB_gameboy_t *gb);
|
||||||
|
|
|
@ -50,12 +50,12 @@ static char *async_input_callback(GB_gameboy_t *gb)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vblank(GB_gameboy_t *gb)
|
static void handle_buttons(GB_gameboy_t *gb)
|
||||||
{
|
{
|
||||||
/* Do not press any buttons during the last two seconds, this might cause a
|
/* Do not press any buttons during the last two seconds, this might cause a
|
||||||
screenshot to be taken while the LCD is off if the press makes the game
|
screenshot to be taken while the LCD is off if the press makes the game
|
||||||
load graphics. */
|
load graphics. */
|
||||||
if (push_start_a && (frames < test_length - 120 || do_not_stop)) {
|
if (push_start_a && (frames < test_length - 120 || do_not_stop)) {
|
||||||
unsigned combo_length = 40;
|
unsigned combo_length = 40;
|
||||||
if (start_is_not_first || push_a_twice) combo_length = 60; /* The start item in the menu is not the first, so also push down */
|
if (start_is_not_first || push_a_twice) combo_length = 60; /* The start item in the menu is not the first, so also push down */
|
||||||
else if (a_is_bad || start_is_bad) combo_length = 20; /* Pressing A has a negative effect (when trying to start the game). */
|
else if (a_is_bad || start_is_bad) combo_length = 20; /* Pressing A has a negative effect (when trying to start the game). */
|
||||||
|
@ -109,7 +109,11 @@ static void vblank(GB_gameboy_t *gb)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static void vblank(GB_gameboy_t *gb)
|
||||||
|
{
|
||||||
/* Detect common crashes and stop the test early */
|
/* Detect common crashes and stop the test early */
|
||||||
if (frames < test_length - 1) {
|
if (frames < test_length - 1) {
|
||||||
if (gb->backtrace_size >= 0x200 + (large_stack? 0x80: 0) || (!allow_weird_sp_values && (gb->registers[GB_REGISTER_SP] >= 0xfe00 && gb->registers[GB_REGISTER_SP] < 0xff80))) {
|
if (gb->backtrace_size >= 0x200 + (large_stack? 0x80: 0) || (!allow_weird_sp_values && (gb->registers[GB_REGISTER_SP] >= 0xfe00 && gb->registers[GB_REGISTER_SP] < 0xff80))) {
|
||||||
|
@ -123,7 +127,7 @@ static void vblank(GB_gameboy_t *gb)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (frames >= test_length ) {
|
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 = 160*144; i--;) {
|
||||||
if (bitmap[i] != bitmap[0]) {
|
if (bitmap[i] != bitmap[0]) {
|
||||||
|
@ -147,11 +151,9 @@ static void vblank(GB_gameboy_t *gb)
|
||||||
running = false;
|
running = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (frames == test_length - 1) {
|
else if (frames >= test_length - 1) {
|
||||||
gb->disable_rendering = false;
|
gb->disable_rendering = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
frames++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void log_callback(GB_gameboy_t *gb, const char *string, GB_log_attributes attributes)
|
static void log_callback(GB_gameboy_t *gb, const char *string, GB_log_attributes attributes)
|
||||||
|
@ -339,6 +341,7 @@ int main(int argc, char **argv)
|
||||||
GB_set_rgb_encode_callback(&gb, rgb_encode);
|
GB_set_rgb_encode_callback(&gb, rgb_encode);
|
||||||
GB_set_log_callback(&gb, log_callback);
|
GB_set_log_callback(&gb, log_callback);
|
||||||
GB_set_async_input_callback(&gb, async_input_callback);
|
GB_set_async_input_callback(&gb, async_input_callback);
|
||||||
|
GB_set_color_correction_mode(&gb, GB_COLOR_CORRECTION_EMULATE_HARDWARE);
|
||||||
|
|
||||||
if (GB_load_rom(&gb, filename)) {
|
if (GB_load_rom(&gb, filename)) {
|
||||||
perror("Failed to load ROM");
|
perror("Failed to load ROM");
|
||||||
|
@ -353,11 +356,14 @@ int main(int argc, char **argv)
|
||||||
/* Restarting in Puzzle Boy/Kwirk (Start followed by A) leaks stack. */
|
/* Restarting in Puzzle Boy/Kwirk (Start followed by A) leaks stack. */
|
||||||
strcmp((const char *)(gb.rom + 0x134), "KWIRK") == 0 ||
|
strcmp((const char *)(gb.rom + 0x134), "KWIRK") == 0 ||
|
||||||
strcmp((const char *)(gb.rom + 0x134), "PUZZLE BOY") == 0;
|
strcmp((const char *)(gb.rom + 0x134), "PUZZLE BOY") == 0;
|
||||||
start_is_bad = strcmp((const char *)(gb.rom + 0x134), "BLUESALPHA") == 0;
|
start_is_bad = strcmp((const char *)(gb.rom + 0x134), "BLUESALPHA") == 0 ||
|
||||||
|
strcmp((const char *)(gb.rom + 0x134), "ONI 5") == 0;
|
||||||
b_is_confirm = strcmp((const char *)(gb.rom + 0x134), "ELITE SOCCER") == 0 ||
|
b_is_confirm = strcmp((const char *)(gb.rom + 0x134), "ELITE SOCCER") == 0 ||
|
||||||
strcmp((const char *)(gb.rom + 0x134), "SOCCER") == 0 ||
|
strcmp((const char *)(gb.rom + 0x134), "SOCCER") == 0 ||
|
||||||
strcmp((const char *)(gb.rom + 0x134), "GEX GECKO") == 0;
|
strcmp((const char *)(gb.rom + 0x134), "GEX GECKO") == 0;
|
||||||
push_faster = strcmp((const char *)(gb.rom + 0x134), "MOGURA DE PON!") == 0;
|
push_faster = strcmp((const char *)(gb.rom + 0x134), "MOGURA DE PON!") == 0 ||
|
||||||
|
strcmp((const char *)(gb.rom + 0x134), "HUGO2 1/2") == 0 ||
|
||||||
|
strcmp((const char *)(gb.rom + 0x134), "HUGO") == 0;
|
||||||
push_slower = strcmp((const char *)(gb.rom + 0x134), "BAKENOU") == 0;
|
push_slower = strcmp((const char *)(gb.rom + 0x134), "BAKENOU") == 0;
|
||||||
do_not_stop = strcmp((const char *)(gb.rom + 0x134), "SPACE INVADERS") == 0;
|
do_not_stop = strcmp((const char *)(gb.rom + 0x134), "SPACE INVADERS") == 0;
|
||||||
push_right = memcmp((const char *)(gb.rom + 0x134), "BOB ET BOB", strlen("BOB ET BOB")) == 0 ||
|
push_right = memcmp((const char *)(gb.rom + 0x134), "BOB ET BOB", strlen("BOB ET BOB")) == 0 ||
|
||||||
|
@ -397,8 +403,14 @@ int main(int argc, char **argv)
|
||||||
running = true;
|
running = true;
|
||||||
gb.turbo = gb.turbo_dont_skip = gb.disable_rendering = true;
|
gb.turbo = gb.turbo_dont_skip = gb.disable_rendering = true;
|
||||||
frames = 0;
|
frames = 0;
|
||||||
|
unsigned cycles = 0;
|
||||||
while (running) {
|
while (running) {
|
||||||
GB_run(&gb);
|
cycles += GB_run(&gb);
|
||||||
|
if (cycles >= 139810) { /* Approximately 1/60 a second. Intentionally not the actual length of a frame. */
|
||||||
|
handle_buttons(&gb);
|
||||||
|
cycles -= 139810;
|
||||||
|
frames++;
|
||||||
|
}
|
||||||
/* This early crash test must not run in vblank because PC might not point to the next instruction. */
|
/* This early crash test must not run in vblank because PC might not point to the next instruction. */
|
||||||
if (gb.pc == 0x38 && frames < test_length - 1 && GB_read_memory(&gb, 0x38) == 0xFF) {
|
if (gb.pc == 0x38 && frames < test_length - 1 && GB_read_memory(&gb, 0x38) == 0xFF) {
|
||||||
GB_log(&gb, "The game is probably stuck in an FF loop.\n");
|
GB_log(&gb, "The game is probably stuck in an FF loop.\n");
|
||||||
|
|
Loading…
Reference in New Issue