summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pavone <pavone@retrodev.com>2013-06-23 10:17:40 -0700
committerMike Pavone <pavone@retrodev.com>2013-06-23 10:17:40 -0700
commitc64a64dc7652359af7eab176175ffae79a99028e (patch)
tree4e0f6222a8de24f3df16d91971268e90c5b4112c
parent4c9b2c6557710707b2e845682393aa9c33093888 (diff)
Fix sprite y mask in interlace mode. Fix framebuffer selection when switching out of interlace mode.
-rw-r--r--render_sdl.c10
-rw-r--r--vdp.c7
2 files changed, 10 insertions, 7 deletions
diff --git a/render_sdl.c b/render_sdl.c
index 6fc59ec..ded1bf0 100644
--- a/render_sdl.c
+++ b/render_sdl.c
@@ -231,20 +231,20 @@ void render_context(vdp_context * context)
switch(gen_color & FBUF_SRC_MASK)
{
case FBUF_SRC_A:
- g = 127;
+ g = 127;//plane a = green
break;
case FBUF_SRC_W:
- g = 127;
+ g = 127;//window = cyan
b = 127;
break;
case FBUF_SRC_B:
- b = 127;
+ b = 127;//plane b = blue
break;
case FBUF_SRC_S:
- r = 127;
+ r = 127;//sprite = red
break;
case FBUF_SRC_BG:
- r = 127;
+ r = 127;//BG = purple
b = 127;
}
if (gen_color & FBUF_BIT_PRIORITY) {
diff --git a/vdp.c b/vdp.c
index 7f54988..f7f3985 100644
--- a/vdp.c
+++ b/vdp.c
@@ -168,7 +168,7 @@ void scan_sprite_table(uint32_t line, vdp_context * context)
uint16_t sat_address = (context->regs[REG_SAT] & 0x7F) << 9;
uint16_t address = context->sprite_index * 8 + sat_address;
line += ymin;
- uint16_t y = ((context->vdpmem[address] & 0x3) << 8 | context->vdpmem[address+1]) & 0x1FF;
+ uint16_t y = ((context->vdpmem[address] & 0x3) << 8 | context->vdpmem[address+1]) & ymask;
uint8_t height = ((context->vdpmem[address+2] & 0x3) + 1) * height_mult;
//printf("Sprite %d | y: %d, height: %d\n", context->sprite_index, y, height);
if (y <= line && line < (y + height)) {
@@ -181,7 +181,7 @@ void scan_sprite_table(uint32_t line, vdp_context * context)
if (context->sprite_index && context->slot_counter)
{
address = context->sprite_index * 8 + sat_address;
- y = ((context->vdpmem[address] & 0x3) << 8 | context->vdpmem[address+1]) & 0x1FF;
+ y = ((context->vdpmem[address] & 0x3) << 8 | context->vdpmem[address+1]) & ymask;
height = ((context->vdpmem[address+2] & 0x3) + 1) * height_mult;
//printf("Sprite %d | y: %d, height: %d\n", context->sprite_index, y, height);
if (y <= line && line < (y + height)) {
@@ -1350,6 +1350,9 @@ int vdp_control_port_write(vdp_context * context, uint16_t value)
}
if (reg == REG_MODE_4) {
context->double_res = (value & (BIT_INTERLACE | BIT_DOUBLE_RES)) == (BIT_INTERLACE | BIT_DOUBLE_RES);
+ if (!context->double_res) {
+ context->framebuf = context->oddbuf;
+ }
}
}
} else {