diff options
author | Mike Pavone <pavone@retrodev.com> | 2012-12-09 17:10:08 -0800 |
---|---|---|
committer | Mike Pavone <pavone@retrodev.com> | 2012-12-09 17:10:08 -0800 |
commit | 5dfc70429524c34b5eb8f56c62c3383f0f6f3e43 (patch) | |
tree | 9d624f3c2a6f4b7957f0eebc752d23ccab294aaf | |
parent | 394cb5ffa9f540a5f136af825501a88264733993 (diff) |
More correct window support, maybe
-rw-r--r-- | vdp.c | 62 |
1 files changed, 30 insertions, 32 deletions
@@ -187,48 +187,46 @@ void read_map_scroll(uint16_t column, uint16_t vsram_off, uint32_t line, uint16_ top_line = 0; bottom_line = 241; #else if (context->regs[REG_WINDOW_H] & WINDOW_RIGHT) { + left_col = (context->regs[REG_WINDOW_H] & 0x1F) * 2; + right_col = 42; + } else { left_col = 0; right_col = (context->regs[REG_WINDOW_H] & 0x1F) * 2; if (right_col) { right_col += 2; } + } + uint16_t top_line, bottom_line; + if (context->regs[REG_WINDOW_V] & WINDOW_DOWN) { + top_line = (context->regs[REG_WINDOW_V] & 0x1F) * 8; + bottom_line = 241; } else { - left_col = (context->regs[REG_WINDOW_H] & 0x1F) * 2; - right_col = 42; + top_line = 0; + bottom_line = (context->regs[REG_WINDOW_V] & 0x1F) * 8; } - if (column >= left_col && column < right_col) { - uint16_t top_line, bottom_line; - if (context->regs[REG_WINDOW_V] & WINDOW_DOWN) { - top_line = (context->regs[REG_WINDOW_V] & 0x1F) * 8; - bottom_line = 241; + if ((column >= left_col && column < right_col) || (line >= top_line && line < bottom_line)) { + #endif + uint16_t address = context->regs[REG_WINDOW] << 10; + uint16_t line_offset, offset, mask; + if (context->latched_mode & BIT_H40) { + address &= 0xF000; + line_offset = (((line/* - top_line */) / 8) * 64 * 2) & 0xFFF; + mask = 0x7F; + } else { - top_line = 0; - bottom_line = (context->regs[REG_WINDOW_V] & 0x1F) * 8; + address &= 0xF800; + line_offset = (((line/* - top_line*/) / 8) * 32 * 2) & 0xFFF; + mask = 0x3F; } - if (line >= top_line && line < bottom_line) { - #endif - uint16_t address = context->regs[REG_WINDOW] << 10; - uint16_t line_offset, offset, mask; - if (context->latched_mode & BIT_H40) { - address &= 0xF000; - line_offset = (((line/* - top_line */) / 8) * 64 * 2) & 0xFFF; - mask = 0x7F; - - } else { - address &= 0xF800; - line_offset = (((line/* - top_line*/) / 8) * 32 * 2) & 0xFFF; - mask = 0x3F; - } - offset = address + line_offset + (((column - 2/* - left_col*/) * 2) & mask); - context->col_1 = (context->vdpmem[offset] << 8) | context->vdpmem[offset+1]; - printf("Window | top: %d, bot: %d, left: %d, right: %d, base: %X, line: %X offset: %X, tile: %X, reg: %X\n", top_line, bottom_line, left_col, right_col, address, line_offset, offset, ((context->col_1 & 0x3FF) << 5), context->regs[REG_WINDOW]); - offset = address + line_offset + (((column - 1/* - left_col*/) * 2) & mask); - context->col_2 = (context->vdpmem[offset] << 8) | context->vdpmem[offset+1]; - context->v_offset = (line/* - top_line*/) & 0x7; - context->flags |= FLAG_WINDOW; - return; + offset = address + line_offset + (((column - 2/* - left_col*/) * 2) & mask); + context->col_1 = (context->vdpmem[offset] << 8) | context->vdpmem[offset+1]; + printf("Window | top: %d, bot: %d, left: %d, right: %d, base: %X, line: %X offset: %X, tile: %X, reg: %X\n", top_line, bottom_line, left_col, right_col, address, line_offset, offset, ((context->col_1 & 0x3FF) << 5), context->regs[REG_WINDOW]); + offset = address + line_offset + (((column - 1/* - left_col*/) * 2) & mask); + context->col_2 = (context->vdpmem[offset] << 8) | context->vdpmem[offset+1]; + context->v_offset = (line/* - top_line*/) & 0x7; + context->flags |= FLAG_WINDOW; + return; #if !ALWAYS_WINDOW - } } context->flags &= ~FLAG_WINDOW; #endif |