Mercurial > repos > blastem
diff vdp.c @ 1267:3772bb926be5
Initial stab at horizontal border emulation. Only works for H40 and still has a few minor holes to fill
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Mon, 06 Mar 2017 00:23:35 -0800 |
parents | 8dc50e50ced6 |
children | ff8e29eeb1ec |
line wrap: on
line diff
--- a/vdp.c Sat Mar 04 21:34:15 2017 -0800 +++ b/vdp.c Mon Mar 06 00:23:35 2017 -0800 @@ -711,8 +711,8 @@ #define VSRAM_BITS 0x7FF #define VSRAM_DIRTY_BITS 0xF800 -//rough estimate of slot number at which active display starts -#define BG_START_SLOT 9 +//rough estimate of slot number at which border display starts +#define BG_START_SLOT 0 void write_cram(vdp_context * context, uint16_t address, uint16_t value) { @@ -733,7 +733,7 @@ context->vcounter < context->inactive_start + context->border_bot || context->vcounter > 0x200 - context->border_top )) { - uint8_t bg_end_slot = BG_START_SLOT + (context->regs[REG_MODE_4] & BIT_H40) ? 320/2 : 256/2; + uint8_t bg_end_slot = BG_START_SLOT + (context->regs[REG_MODE_4] & BIT_H40) ? LINEBUF_SIZE/2 : (256+HORIZ_BORDER)/2; if (context->hslot < bg_end_slot) { uint32_t color = (context->regs[REG_MODE_2] & BIT_MODE_5) ? context->colors[addr] : context->colors[addr + CRAM_SIZE*3]; context->output[(context->hslot - BG_START_SLOT)*2 + 1] = color; @@ -1204,7 +1204,7 @@ if (col) { col-=2; - dst = context->output + col * 8; + dst = context->output + BORDER_LEFT + col * 8; if (context->debug < 2) { sprite_buf = context->linebuf + col * 8; uint8_t a_src, src; @@ -1486,7 +1486,7 @@ context->vcounter &= 0x1FF; } else { if (context->vcounter == context->inactive_start) { - render_framebuffer_updated(context->flags2 & FLAG2_EVEN_FIELD ? FRAMEBUFFER_EVEN: FRAMEBUFFER_ODD, context->h40_lines > (context->inactive_start + context->border_top) / 2 ? 320 : 256); + 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; } @@ -1528,6 +1528,12 @@ read_map_scroll_a(column, context->vcounter, context);\ CHECK_LIMIT\ case ((startcyc+1)&0xFF):\ + if (column == 2) {\ + uint32_t bg_color = context->colors[context->regs[REG_BG_COLOR] & 0x3F];\ + for (int i = 0; i < BORDER_LEFT; i++) {\ + context->output[i] = bg_color;\ + }\ + }\ external_slot(context);\ CHECK_LIMIT\ case ((startcyc+2)&0xFF):\ @@ -1838,9 +1844,15 @@ case 161: external_slot(context); CHECK_LIMIT - case 162: + case 162: { external_slot(context); + uint32_t bg_color = context->colors[context->regs[REG_BG_COLOR] & 0x3F]; + for (int i = LINEBUF_SIZE-BORDER_RIGHT; i < LINEBUF_SIZE; i++) + { + context->output[i] = bg_color; + } CHECK_LIMIT + } //sprite render to line buffer starts case 163: context->cur_slot = MAX_DRAWS-1; @@ -2199,7 +2211,7 @@ if (is_h40) { buf_clear_slot = 161; index_reset_slot = 165; - bg_end_slot = BG_START_SLOT + 320/2; + bg_end_slot = BG_START_SLOT + LINEBUF_SIZE/2; max_draws = MAX_DRAWS-1; max_sprites = MAX_SPRITES_LINE; index_reset_value = 0x80; @@ -2208,7 +2220,7 @@ jump_start = 182; jump_dest = 229; } else { - bg_end_slot = BG_START_SLOT + 256/2; + bg_end_slot = BG_START_SLOT + (256+HORIZ_BORDER)/2; max_draws = MAX_DRAWS_H32-1; max_sprites = MAX_SPRITES_LINE_H32; buf_clear_slot = 128; @@ -2222,7 +2234,7 @@ vint_line = context->inactive_start; active_line = 0x1FF; } else { - bg_end_slot = BG_START_SLOT + 256/2; + bg_end_slot = BG_START_SLOT + (256+HORIZ_BORDER)/2; max_draws = MAX_DRAWS_H32_MODE4; buf_clear_slot = 136; index_reset_slot = 253; @@ -2277,6 +2289,9 @@ } *(dst++) = bg_color; *(dst++) = bg_color; + if (context->hslot == (bg_end_slot-1)) { + *(dst++) = bg_color; + } } if (!is_refresh(context, context->hslot)) {