mirror of https://github.com/LIJI32/SameBoy.git
Make sure the CPU graph advanced correctly even in turbo mode
This commit is contained in:
parent
d211120312
commit
f0a672c39e
|
@ -288,6 +288,7 @@ static void debuggerReloadCallback(GB_gameboy_t *gb)
|
||||||
GB_set_user_data(&_gb, (__bridge void *)(self));
|
GB_set_user_data(&_gb, (__bridge void *)(self));
|
||||||
GB_set_boot_rom_load_callback(&_gb, (GB_boot_rom_load_callback_t)boot_rom_load);
|
GB_set_boot_rom_load_callback(&_gb, (GB_boot_rom_load_callback_t)boot_rom_load);
|
||||||
GB_set_vblank_callback(&_gb, (GB_vblank_callback_t) vblank);
|
GB_set_vblank_callback(&_gb, (GB_vblank_callback_t) vblank);
|
||||||
|
GB_set_enable_skipped_frame_vblank_callbacks(&_gb, true);
|
||||||
GB_set_log_callback(&_gb, (GB_log_callback_t) consoleLog);
|
GB_set_log_callback(&_gb, (GB_log_callback_t) consoleLog);
|
||||||
GB_set_input_callback(&_gb, (GB_input_callback_t) consoleInput);
|
GB_set_input_callback(&_gb, (GB_input_callback_t) consoleInput);
|
||||||
GB_set_async_input_callback(&_gb, (GB_input_callback_t) asyncConsoleInput);
|
GB_set_async_input_callback(&_gb, (GB_input_callback_t) asyncConsoleInput);
|
||||||
|
@ -359,6 +360,12 @@ static void debuggerReloadCallback(GB_gameboy_t *gb)
|
||||||
|
|
||||||
- (void)vblankWithType:(GB_vblank_type_t)type
|
- (void)vblankWithType:(GB_vblank_type_t)type
|
||||||
{
|
{
|
||||||
|
if (type == GB_VBLANK_TYPE_SKIPPED_FRAME) {
|
||||||
|
double frameUsage = GB_debugger_get_frame_cpu_usage(&_gb);
|
||||||
|
[_cpuView addSample:frameUsage];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (_gbsVisualizer) {
|
if (_gbsVisualizer) {
|
||||||
dispatch_async(dispatch_get_main_queue(), ^{
|
dispatch_async(dispatch_get_main_queue(), ^{
|
||||||
[_gbsVisualizer setNeedsDisplay:true];
|
[_gbsVisualizer setNeedsDisplay:true];
|
||||||
|
|
|
@ -197,7 +197,13 @@ void GB_display_vblank(GB_gameboy_t *gb, GB_vblank_type_t type)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gb->turbo) {
|
if (gb->turbo) {
|
||||||
|
#ifndef GB_DISABLE_DEBUGGER
|
||||||
|
if (unlikely(gb->backstep_instructions)) return;
|
||||||
|
#endif
|
||||||
if (GB_timing_sync_turbo(gb)) {
|
if (GB_timing_sync_turbo(gb)) {
|
||||||
|
if (gb->vblank_callback && gb->enable_skipped_frame_vblank_callbacks) {
|
||||||
|
gb->vblank_callback(gb, GB_VBLANK_TYPE_SKIPPED_FRAME);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2485,3 +2491,8 @@ double GB_get_usual_frame_rate(GB_gameboy_t *gb)
|
||||||
{
|
{
|
||||||
return GB_get_clock_rate(gb) / (double)LCDC_PERIOD;
|
return GB_get_clock_rate(gb) / (double)LCDC_PERIOD;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GB_set_enable_skipped_frame_vblank_callbacks(GB_gameboy_t *gb, bool enable)
|
||||||
|
{
|
||||||
|
gb->enable_skipped_frame_vblank_callbacks = enable;
|
||||||
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@ typedef enum {
|
||||||
GB_VBLANK_TYPE_LCD_OFF, // An artificial frame pushed while the LCD was off
|
GB_VBLANK_TYPE_LCD_OFF, // An artificial frame pushed while the LCD was off
|
||||||
GB_VBLANK_TYPE_ARTIFICIAL, // An artificial frame pushed for some other reason
|
GB_VBLANK_TYPE_ARTIFICIAL, // An artificial frame pushed for some other reason
|
||||||
GB_VBLANK_TYPE_REPEAT, // A frame that would not render on actual hardware, but the screen should retain the previous frame
|
GB_VBLANK_TYPE_REPEAT, // A frame that would not render on actual hardware, but the screen should retain the previous frame
|
||||||
|
GB_VBLANK_TYPE_SKIPPED_FRAME, // If enabled via GB_set_enable_skipped_frame_vblank_callbacks, called on skipped frames during turbo mode
|
||||||
} GB_vblank_type_t;
|
} GB_vblank_type_t;
|
||||||
|
|
||||||
typedef void (*GB_vblank_callback_t)(GB_gameboy_t *gb, GB_vblank_type_t type);
|
typedef void (*GB_vblank_callback_t)(GB_gameboy_t *gb, GB_vblank_type_t type);
|
||||||
|
@ -95,6 +96,7 @@ static const GB_color_correction_mode_t __attribute__((deprecated("Use GB_COLOR_
|
||||||
static const GB_color_correction_mode_t __attribute__((deprecated("Use GB_COLOR_CORRECTION_MODERN_BOOST_CONTRAST instead"))) GB_COLOR_CORRECTION_PRESERVE_BRIGHTNESS = GB_COLOR_CORRECTION_MODERN_BOOST_CONTRAST;
|
static const GB_color_correction_mode_t __attribute__((deprecated("Use GB_COLOR_CORRECTION_MODERN_BOOST_CONTRAST instead"))) GB_COLOR_CORRECTION_PRESERVE_BRIGHTNESS = GB_COLOR_CORRECTION_MODERN_BOOST_CONTRAST;
|
||||||
|
|
||||||
void GB_set_vblank_callback(GB_gameboy_t *gb, GB_vblank_callback_t callback);
|
void GB_set_vblank_callback(GB_gameboy_t *gb, GB_vblank_callback_t callback);
|
||||||
|
void GB_set_enable_skipped_frame_vblank_callbacks(GB_gameboy_t *gb, bool enable);
|
||||||
void GB_set_rgb_encode_callback(GB_gameboy_t *gb, GB_rgb_encode_callback_t callback);
|
void GB_set_rgb_encode_callback(GB_gameboy_t *gb, GB_rgb_encode_callback_t callback);
|
||||||
void GB_set_palette(GB_gameboy_t *gb, const GB_palette_t *palette);
|
void GB_set_palette(GB_gameboy_t *gb, const GB_palette_t *palette);
|
||||||
const GB_palette_t *GB_get_palette(GB_gameboy_t *gb);
|
const GB_palette_t *GB_get_palette(GB_gameboy_t *gb);
|
||||||
|
|
|
@ -833,6 +833,7 @@ struct GB_gameboy_internal_s {
|
||||||
/* Misc */
|
/* Misc */
|
||||||
bool turbo;
|
bool turbo;
|
||||||
bool turbo_dont_skip;
|
bool turbo_dont_skip;
|
||||||
|
bool enable_skipped_frame_vblank_callbacks;
|
||||||
bool disable_rendering;
|
bool disable_rendering;
|
||||||
uint8_t boot_rom[0x900];
|
uint8_t boot_rom[0x900];
|
||||||
bool vblank_just_occured; // For slow operations involving syscalls; these should only run once per vblank
|
bool vblank_just_occured; // For slow operations involving syscalls; these should only run once per vblank
|
||||||
|
|
Loading…
Reference in New Issue