Mercurial > repos > blastem
changeset 1272:be509813b2f2
Fill in the rest of the framebuffer holes created by horizontal border. Work remains for things to be seemless when display gets turned on and off mid frame
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 07 Mar 2017 20:17:12 -0800 |
parents | c865ee5478bc |
children | 6dedaa645843 |
files | vdp.c |
diffstat | 1 files changed, 34 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/vdp.c Tue Mar 07 00:01:16 2017 -0800 +++ b/vdp.c Tue Mar 07 20:17:12 2017 -0800 @@ -1187,7 +1187,16 @@ return; } col -= 2; - dst = context->output + BORDER_LEFT + col * 8; + if (col) { + dst = context->output + BORDER_LEFT + col * 8; + } else { + dst = context->output; + uint32_t bg_color = context->colors[context->regs[REG_BG_COLOR] & 0x3F]; + for (int i = 0; i < BORDER_LEFT; i++, dst++) + { + *dst = bg_color; + } + } uint32_t color = context->colors[context->regs[REG_BG_COLOR] & 0x3F]; for (int i = 0; i < 16; i++) { @@ -1488,6 +1497,20 @@ } else if (context->vcounter == 0xDB) { context->vcounter = 0x1D5; } + + if (context->vcounter > context->inactive_start) { + context->hint_counter = context->regs[REG_HINT]; + } else if (context->hint_counter) { + context->hint_counter--; + } else { + context->flags2 |= FLAG2_HINT_PENDING; + context->pending_hint_start = context->cycles; + context->hint_counter = context->regs[REG_HINT]; + } +} + +static void advance_output_line(vdp_context *context) +{ if (headless) { if (context->vcounter == context->inactive_start) { context->frame++; @@ -1518,21 +1541,11 @@ { context->output[i] = 0xFFFF00FF; } -#endif +#endif if (output_line != INVALID_LINE && (context->regs[REG_MODE_4] & BIT_H40)) { context->h40_lines++; } } - - if (context->vcounter > context->inactive_start) { - context->hint_counter = context->regs[REG_HINT]; - } else if (context->hint_counter) { - context->hint_counter--; - } else { - context->flags2 |= FLAG2_HINT_PENDING; - context->pending_hint_start = context->cycles; - context->hint_counter = context->regs[REG_HINT]; - } } #define CHECK_ONLY if (context->cycles >= target_cycles) { return; } @@ -1626,12 +1639,20 @@ #define SPRITE_RENDER_H40(slot) \ case slot:\ + if ((slot) == BG_START_SLOT + LINEBUF_SIZE/2) {\ + advance_output_line(context);\ + }\ render_sprite_cells( context);\ scan_sprite_table(context->vcounter, context);\ CHECK_LIMIT_HSYNC(slot) +//Note that the line advancement check will fail if BG_START_SLOT is > 6 +//as we're bumping up against the hcounter jump #define SPRITE_RENDER_H32(slot) \ case slot:\ + if ((slot) == BG_START_SLOT + (256+HORIZ_BORDER)/2) {\ + advance_output_line(context);\ + }\ render_sprite_cells( context);\ scan_sprite_table(context->vcounter, context);\ if (context->flags & FLAG_DMA_RUN) { run_dma_src(context, -1); } \ @@ -2277,6 +2298,7 @@ )) { dst = context->output + (context->hslot - BG_START_SLOT) * 2; } else if (context->hslot == bg_end_slot) { + advance_output_line(context); dst = NULL; }