Mercurial > repos > blastem
comparison vdp.c @ 1887:bb3edb4ec605
Small optimization to read_map_scroll
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 21 Sep 2019 20:20:03 -0700 |
parents | 183b86ba0212 |
children | bd60e74fd173 |
comparison
equal
deleted
inserted
replaced
1886:183b86ba0212 | 1887:bb3edb4ec605 |
---|---|
1146 } | 1146 } |
1147 vscroll &= context->vscroll_latch[vsram_off] + line; | 1147 vscroll &= context->vscroll_latch[vsram_off] + line; |
1148 context->v_offset = vscroll & v_offset_mask; | 1148 context->v_offset = vscroll & v_offset_mask; |
1149 //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); | 1149 //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); |
1150 vscroll >>= vscroll_shift; | 1150 vscroll >>= vscroll_shift; |
1151 uint16_t hscroll_mask; | 1151 //TODO: Verify the behavior for a setting of 2 |
1152 uint16_t v_mul; | 1152 static const uint16_t hscroll_masks[] = {0x1F, 0x3F, 0x1F, 0x7F}; |
1153 switch(context->regs[REG_SCROLL] & 0x3) | 1153 static const uint16_t v_shifts[] = {6, 7, 0, 8}; |
1154 { | 1154 uint16_t hscroll_mask = hscroll_masks[context->regs[REG_SCROLL] & 0x3]; |
1155 case 0: | 1155 uint16_t v_shift = v_shifts[context->regs[REG_SCROLL] & 0x3]; |
1156 hscroll_mask = 0x1F; | |
1157 v_mul = 64; | |
1158 break; | |
1159 case 0x1: | |
1160 hscroll_mask = 0x3F; | |
1161 v_mul = 128; | |
1162 break; | |
1163 case 0x2: | |
1164 //TODO: Verify this behavior | |
1165 hscroll_mask = 0x1F; | |
1166 v_mul = 0; | |
1167 break; | |
1168 case 0x3: | |
1169 hscroll_mask = 0x7F; | |
1170 v_mul = 256; | |
1171 break; | |
1172 } | |
1173 uint16_t hscroll, offset; | 1156 uint16_t hscroll, offset; |
1174 for (int i = 0; i < 2; i++) { | 1157 for (int i = 0; i < 2; i++) { |
1175 hscroll = (column - 2 + i - ((hscroll_val/8) & 0xFFFE)) & hscroll_mask; | 1158 hscroll = (column - 2 + i - ((hscroll_val/8) & 0xFFFE)) & hscroll_mask; |
1176 offset = address + ((vscroll * v_mul + hscroll*2) & 0x1FFF); | 1159 offset = address + (((vscroll << v_shift) + hscroll*2) & 0x1FFF); |
1177 //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); | 1160 //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); |
1178 uint16_t col_val = (context->vdpmem[offset] << 8) | context->vdpmem[offset+1]; | 1161 uint16_t col_val = (context->vdpmem[offset] << 8) | context->vdpmem[offset+1]; |
1179 if (i) { | 1162 if (i) { |
1180 context->col_2 = col_val; | 1163 context->col_2 = col_val; |
1181 } else { | 1164 } else { |