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 {