git.y1.nz

SameBoy

Accurate GB/GBC emulator
download: https://git.y1.nz/archives/sameboy.tar.gz
README | Files | Log | Refs | LICENSE

commit 6b38c535755b4ff2b069efac404b2844292249b7
parent a7b218f638d02574653280d644106cdcc4bfbd79
Author: Lior Halphon <LIJI32@gmail.com>
Date:   Sun, 14 Sep 2025 22:28:59 +0300

Prevent abnormal vblank events from updating the SNES-side buffers prematurely. Fixes #721

Diffstat:
MCore/display.c6+++---
MCore/memory.c2+-
MCore/sgb.c4++--
MCore/sgb.h2+-
4 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/Core/display.c b/Core/display.c @@ -193,7 +193,7 @@ void GB_display_vblank(GB_gameboy_t *gb, GB_vblank_type_t type) /* TODO: Slow in turbo mode! */ if (GB_is_hle_sgb(gb)) { - GB_sgb_render(gb); + GB_sgb_render(gb, type != GB_VBLANK_TYPE_NORMAL_FRAME); } if (gb->turbo) { @@ -2186,7 +2186,7 @@ skip_slow_mode_3: gb->frame_skip_state = GB_FRAMESKIP_FIRST_FRAME_RENDERED; } else { - if (!GB_is_sgb(gb) || gb->current_lcd_line < LINES) { + if (!GB_is_sgb(gb)) { update_frame_parity(gb); // TODO: test actual timing GB_display_vblank(gb, GB_VBLANK_TYPE_NORMAL_FRAME); } @@ -2194,7 +2194,7 @@ skip_slow_mode_3: } } else { - if (!GB_is_sgb(gb) || gb->current_lcd_line < LINES) { + if (!GB_is_sgb(gb)) { update_frame_parity(gb); // TODO: test actual timing GB_display_vblank(gb, GB_VBLANK_TYPE_NORMAL_FRAME); } diff --git a/Core/memory.c b/Core/memory.c @@ -1494,7 +1494,7 @@ static void write_high_memory(GB_gameboy_t *gb, uint16_t addr, uint8_t value) gb->lcd_status_callback(gb, true); } if (!gb->lcd_disabled_outside_of_vblank && - (gb->cycles_since_vblank_callback > 10 * 456 || GB_is_sgb(gb))) { + (gb->cycles_since_vblank_callback > 10 * 456)) { // Trigger a vblank here so we don't exceed LCDC_PERIOD GB_display_vblank(gb, GB_VBLANK_TYPE_ARTIFICIAL); } diff --git a/Core/sgb.c b/Core/sgb.c @@ -593,7 +593,7 @@ static void render_boot_animation (GB_gameboy_t *gb) } static void render_jingle(GB_gameboy_t *gb, size_t count); -void GB_sgb_render(GB_gameboy_t *gb) +void GB_sgb_render(GB_gameboy_t *gb, bool incomplete) { if (gb->apu_output.sample_rate) { render_jingle(gb, gb->apu_output.sample_rate / GB_get_usual_frame_rate(gb)); @@ -670,7 +670,7 @@ void GB_sgb_render(GB_gameboy_t *gb) colors[i] = convert_rgb15(gb, LE16(gb->sgb->effective_palettes[i])); } - if (gb->sgb->mask_mode != MASK_FREEZE) { + if (gb->sgb->mask_mode != MASK_FREEZE && !incomplete) { memcpy(gb->sgb->effective_screen_buffer, gb->sgb->screen_buffer, sizeof(gb->sgb->effective_screen_buffer)); diff --git a/Core/sgb.h b/Core/sgb.h @@ -63,7 +63,7 @@ struct GB_sgb_s { }; internal void GB_sgb_write(GB_gameboy_t *gb, uint8_t value); -internal void GB_sgb_render(GB_gameboy_t *gb); +internal void GB_sgb_render(GB_gameboy_t *gb, bool incomplete); internal void GB_sgb_load_default_data(GB_gameboy_t *gb); #endif

This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.