From 7f7d0668542162dc71d256a6908ab7d7d743cffc Mon Sep 17 00:00:00 2001 From: David Guillen Fandos Date: Sun, 15 Aug 2021 23:27:04 +0200 Subject: [PATCH] Remove video vars serialization This is not needed at all, since the variables are not updated between reload and end-of-frame (where we take our savestates). Added a reload call during gba_load_state() to initialize it from the I/O regs. --- gba_memory.c | 5 +++-- main.c | 9 +-------- video.c | 13 +++++++++++++ video.h | 3 +-- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/gba_memory.c b/gba_memory.c index 0925a14..cb28486 100644 --- a/gba_memory.c +++ b/gba_memory.c @@ -3122,8 +3122,7 @@ void memory_term(void) input_##type##_savestate(); \ main_##type##_savestate(); \ memory_##type##_savestate(); \ - sound_##type##_savestate(); \ - video_##type##_savestate() + sound_##type##_savestate(); const u8 *state_mem_read_ptr; @@ -3152,6 +3151,8 @@ void gba_load_state(const void* src) convert_palette(current_color); } + video_reload_counters(); + // Oops, these contain raw pointers for(i = 0; i < 4; i++) gbc_sound_channel[i].sample_table_idx = 2; diff --git a/main.c b/main.c index e1508fd..370399f 100644 --- a/main.c +++ b/main.c @@ -195,14 +195,7 @@ u32 update_gba(void) irq_raised |= IRQ_VBLANK; } - affine_reference_x[0] = - (s32)(readaddress32(io_registers, 0x28) << 4) >> 4; - affine_reference_y[0] = - (s32)(readaddress32(io_registers, 0x2C) << 4) >> 4; - affine_reference_x[1] = - (s32)(readaddress32(io_registers, 0x38) << 4) >> 4; - affine_reference_y[1] = - (s32)(readaddress32(io_registers, 0x3C) << 4) >> 4; + video_reload_counters(); for(i = 0; i < 4; i++) { diff --git a/video.c b/video.c index 4dec8bf..8f1e213 100644 --- a/video.c +++ b/video.c @@ -2336,6 +2336,19 @@ static void render_scanline_text_transparent_alpha(u32 layer, s32 affine_reference_x[2]; s32 affine_reference_y[2]; +void video_reload_counters() +{ + /* This happens every Vblank */ + affine_reference_x[0] = (s32)(read_ioreg(REG_BG2X_L) | + ((read_ioreg(REG_BG2X_H) & 0xFFF) << 16)); + affine_reference_y[0] = (s32)(read_ioreg(REG_BG2Y_L) | + ((read_ioreg(REG_BG2Y_H) & 0xFFF) << 16)); + affine_reference_x[1] = (s32)(read_ioreg(REG_BG3X_L) | + ((read_ioreg(REG_BG3X_H) & 0xFFF) << 16)); + affine_reference_y[1] = (s32)(read_ioreg(REG_BG3Y_L) | + ((read_ioreg(REG_BG3Y_H) & 0xFFF) << 16)); +} + #define affine_render_bg_pixel_normal() \ current_pixel = palette_ram_converted[0] \ diff --git a/video.h b/video.h index 0f21d19..35dc0f4 100644 --- a/video.h +++ b/video.h @@ -21,8 +21,7 @@ #define VIDEO_H void update_scanline(void); -void video_write_savestate(void); -void video_read_savestate(void); +void video_reload_counters(void); extern s32 affine_reference_x[2]; extern s32 affine_reference_y[2];