Mercurial > repos > blastem
comparison vdp.c @ 1365:6dd2c3edd0b5
Add a bit of a hack to HINT start cycle to give correct values in my test ROM and further improve prevelance of CRAM dot noise in Outrunners and OD2
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 19 May 2017 22:07:50 -0700 |
parents | 83bdd358f3a7 |
children | c74a2f31ae5f |
comparison
equal
deleted
inserted
replaced
1364:30123ca5856c | 1365:6dd2c3edd0b5 |
---|---|
2084 SPRITE_RENDER_H40(172) | 2084 SPRITE_RENDER_H40(172) |
2085 SPRITE_RENDER_H40(173) | 2085 SPRITE_RENDER_H40(173) |
2086 SPRITE_RENDER_H40(174) | 2086 SPRITE_RENDER_H40(174) |
2087 SPRITE_RENDER_H40(175) | 2087 SPRITE_RENDER_H40(175) |
2088 SPRITE_RENDER_H40(176) | 2088 SPRITE_RENDER_H40(176) |
2089 SPRITE_RENDER_H40(177) | 2089 SPRITE_RENDER_H40(177)//End of border? |
2090 SPRITE_RENDER_H40(178) | 2090 SPRITE_RENDER_H40(178) |
2091 SPRITE_RENDER_H40(179) | 2091 SPRITE_RENDER_H40(179) |
2092 SPRITE_RENDER_H40(180) | 2092 SPRITE_RENDER_H40(180) |
2093 SPRITE_RENDER_H40(181) | 2093 SPRITE_RENDER_H40(181) |
2094 SPRITE_RENDER_H40(182) | 2094 SPRITE_RENDER_H40(182) |
3254 uint32_t vdp_cycles_to_frame_end(vdp_context * context) | 3254 uint32_t vdp_cycles_to_frame_end(vdp_context * context) |
3255 { | 3255 { |
3256 return context->cycles + vdp_cycles_to_line(context, context->inactive_start); | 3256 return context->cycles + vdp_cycles_to_line(context, context->inactive_start); |
3257 } | 3257 } |
3258 | 3258 |
3259 //This gives correct values in my test ROM. Kind of a hack, might be partly | |
3260 //due to interrupts getting latched at the end of a "dbi" micro-instruction | |
3261 //but that would only account for 28 of the 36 cycles. More hardware testing | |
3262 //necessary to determine the cause of the discrepency | |
3263 #define HINT_FUDGE 36 | |
3259 uint32_t vdp_next_hint(vdp_context * context) | 3264 uint32_t vdp_next_hint(vdp_context * context) |
3260 { | 3265 { |
3261 if (!(context->regs[REG_MODE_1] & BIT_HINT_EN)) { | 3266 if (!(context->regs[REG_MODE_1] & BIT_HINT_EN)) { |
3262 return 0xFFFFFFFF; | 3267 return 0xFFFFFFFF; |
3263 } | 3268 } |
3264 if (context->flags2 & FLAG2_HINT_PENDING) { | 3269 if (context->flags2 & FLAG2_HINT_PENDING) { |
3265 return context->pending_hint_start; | 3270 return context->pending_hint_start - HINT_FUDGE; |
3266 } | 3271 } |
3267 uint32_t hint_line; | 3272 uint32_t hint_line; |
3268 if (context->state != ACTIVE) { | 3273 if (context->state != ACTIVE) { |
3269 hint_line = context->regs[REG_HINT]; | 3274 hint_line = context->regs[REG_HINT]; |
3270 if (hint_line > context->inactive_start) { | 3275 if (hint_line > context->inactive_start) { |
3288 if (hint_line < context->vcounter && hint_line > context->inactive_start) { | 3293 if (hint_line < context->vcounter && hint_line > context->inactive_start) { |
3289 return 0xFFFFFFFF; | 3294 return 0xFFFFFFFF; |
3290 } | 3295 } |
3291 } | 3296 } |
3292 } | 3297 } |
3293 return context->cycles + vdp_cycles_to_line(context, hint_line); | 3298 return context->cycles + vdp_cycles_to_line(context, hint_line) - HINT_FUDGE; |
3294 } | 3299 } |
3295 | 3300 |
3296 static uint32_t vdp_next_vint_real(vdp_context * context) | 3301 static uint32_t vdp_next_vint_real(vdp_context * context) |
3297 { | 3302 { |
3298 if (!(context->regs[REG_MODE_2] & BIT_VINT_EN)) { | 3303 if (!(context->regs[REG_MODE_2] & BIT_VINT_EN)) { |