From 79e8f385dd4e2cafb2089d6fb24cd0d58b4ee928 Mon Sep 17 00:00:00 2001 From: Michael Pavone Date: Sat, 21 Sep 2019 20:20:03 -0700 Subject: Small optimization to read_map_scroll --- vdp.c | 29 ++++++----------------------- 1 file changed, 6 insertions(+), 23 deletions(-) (limited to 'vdp.c') diff --git a/vdp.c b/vdp.c index 59ac529..09381cb 100644 --- a/vdp.c +++ b/vdp.c @@ -1148,32 +1148,15 @@ static void read_map_scroll(uint16_t column, uint16_t vsram_off, uint32_t line, context->v_offset = vscroll & v_offset_mask; //printf("%s | line %d, vsram: %d, vscroll: %d, v_offset: %d\n",(vsram_off ? "B" : "A"), line, context->vsram[context->regs[REG_MODE_3] & 0x4 ? column : 0], vscroll, context->v_offset); vscroll >>= vscroll_shift; - uint16_t hscroll_mask; - uint16_t v_mul; - switch(context->regs[REG_SCROLL] & 0x3) - { - case 0: - hscroll_mask = 0x1F; - v_mul = 64; - break; - case 0x1: - hscroll_mask = 0x3F; - v_mul = 128; - break; - case 0x2: - //TODO: Verify this behavior - hscroll_mask = 0x1F; - v_mul = 0; - break; - case 0x3: - hscroll_mask = 0x7F; - v_mul = 256; - break; - } + //TODO: Verify the behavior for a setting of 2 + static const uint16_t hscroll_masks[] = {0x1F, 0x3F, 0x1F, 0x7F}; + static const uint16_t v_shifts[] = {6, 7, 0, 8}; + uint16_t hscroll_mask = hscroll_masks[context->regs[REG_SCROLL] & 0x3]; + uint16_t v_shift = v_shifts[context->regs[REG_SCROLL] & 0x3]; uint16_t hscroll, offset; for (int i = 0; i < 2; i++) { hscroll = (column - 2 + i - ((hscroll_val/8) & 0xFFFE)) & hscroll_mask; - offset = address + ((vscroll * v_mul + hscroll*2) & 0x1FFF); + offset = address + (((vscroll << v_shift) + hscroll*2) & 0x1FFF); //printf("%s | line: %d, col: %d, x: %d, hs_mask %X, scr reg: %X, tbl addr: %X\n", (vsram_off ? "B" : "A"), line, (column-2+i), hscroll, hscroll_mask, context->regs[REG_SCROLL], offset); uint16_t col_val = (context->vdpmem[offset] << 8) | context->vdpmem[offset+1]; if (i) { -- cgit v1.2.3