From 9ba7165752489a5aafaa9d6896bd865ab8a0e593 Mon Sep 17 00:00:00 2001 From: Michael Pavone Date: Mon, 21 Aug 2017 23:08:36 -0700 Subject: Fix timing of VDP ODD flag toggle --- vdp.c | 15 ++++++++------- vdp.h | 1 + 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/vdp.c b/vdp.c index 8118bd3..06685be 100644 --- a/vdp.c +++ b/vdp.c @@ -149,6 +149,7 @@ void init_vdp_context(vdp_context * context, uint8_t region_pal) context->output = malloc(LINEBUF_SIZE * sizeof(uint32_t)); context->output_pitch = 0; } else { + context->cur_buffer = FRAMEBUFFER_ODD; context->fb = render_get_framebuffer(FRAMEBUFFER_ODD, &context->output_pitch); } context->linebuf = malloc(LINEBUF_SIZE + SCROLL_BUFFER_SIZE*2); @@ -1729,11 +1730,9 @@ static void advance_output_line(vdp_context *context) : 224 + BORDER_TOP_V28 + BORDER_BOT_V28; if (context->output_lines == lines_max) { - render_framebuffer_updated(context->flags2 & FLAG2_EVEN_FIELD ? FRAMEBUFFER_EVEN: FRAMEBUFFER_ODD, context->h40_lines > (context->inactive_start + context->border_top) / 2 ? LINEBUF_SIZE : (256+HORIZ_BORDER)); - if (context->double_res) { - context->flags2 ^= FLAG2_EVEN_FIELD; - } - context->fb = render_get_framebuffer(context->flags2 & FLAG2_EVEN_FIELD ? FRAMEBUFFER_EVEN : FRAMEBUFFER_ODD, &context->output_pitch); + render_framebuffer_updated(context->cur_buffer, context->h40_lines > (context->inactive_start + context->border_top) / 2 ? LINEBUF_SIZE : (256+HORIZ_BORDER)); + context->cur_buffer = context->flags2 & FLAG2_EVEN_FIELD ? FRAMEBUFFER_EVEN : FRAMEBUFFER_ODD; + context->fb = render_get_framebuffer(context->cur_buffer, &context->output_pitch); context->h40_lines = 0; context->frame++; context->output_lines = 0; @@ -1771,13 +1770,13 @@ static void advance_output_line(vdp_context *context) void vdp_release_framebuffer(vdp_context *context) { - render_framebuffer_updated(context->flags2 & FLAG2_EVEN_FIELD ? FRAMEBUFFER_EVEN: FRAMEBUFFER_ODD, context->h40_lines > (context->inactive_start + context->border_top) / 2 ? LINEBUF_SIZE : (256+HORIZ_BORDER)); + render_framebuffer_updated(context->cur_buffer, context->h40_lines > (context->inactive_start + context->border_top) / 2 ? LINEBUF_SIZE : (256+HORIZ_BORDER)); context->output = context->fb = NULL; } void vdp_reacquire_framebuffer(vdp_context *context) { - context->fb = render_get_framebuffer(context->flags2 & FLAG2_EVEN_FIELD ? FRAMEBUFFER_EVEN : FRAMEBUFFER_ODD, &context->output_pitch); + context->fb = render_get_framebuffer(context->cur_buffer, &context->output_pitch); uint16_t lines_max = (context->flags2 & FLAG2_REGION_PAL) ? 240 + BORDER_TOP_V30_PAL + BORDER_BOT_V30_PAL : 224 + BORDER_TOP_V28 + BORDER_BOT_V28; @@ -2825,6 +2824,8 @@ static void vdp_inactive(vdp_context *context, uint32_t target_cycles, uint8_t i } else if (context->vcounter == vint_line && context->hslot == vint_slot) { context->flags2 |= FLAG2_VINT_PENDING; context->pending_vint_start = context->cycles; + } else if (context->vcounter == context->inactive_start && context->hslot == 1 && (context->regs[REG_MODE_4] & BIT_INTERLACE)) { + context->flags2 ^= FLAG2_EVEN_FIELD; } if (dst) { diff --git a/vdp.h b/vdp.h index 6d43c74..de420d1 100644 --- a/vdp.h +++ b/vdp.h @@ -209,6 +209,7 @@ typedef struct { uint8_t debug_pal; uint8_t pending_byte; uint8_t state; + uint8_t cur_buffer; uint8_t *tmp_buf_a; uint8_t *tmp_buf_b; } vdp_context; -- cgit v1.2.3