diff options
author | Mike Pavone <pavone@retrodev.com> | 2012-12-19 22:15:16 -0800 |
---|---|---|
committer | Mike Pavone <pavone@retrodev.com> | 2012-12-19 22:15:16 -0800 |
commit | a8cc92ea4de90aed27a5163eabb46114f1e16e25 (patch) | |
tree | 69d4d36cde81e30de899517f644bfc46a8330be3 | |
parent | b0f3220f3ce75fe7103a7e01527bbf71e7f44d4c (diff) |
Fix issue in which VDP would have trouble emptying FIFO because the VDP cycle count got reset at end of frame.
-rw-r--r-- | vdp.c | 18 | ||||
-rw-r--r-- | vdp.h | 1 |
2 files changed, 16 insertions, 3 deletions
@@ -195,7 +195,7 @@ void external_slot(vdp_context * context) //printf("VRAM Write: %X to %X\n", start->value, context->address ^ 1); context->vdpmem[context->address ^ 1] = start->value; } else { - //printf("VRAM Write: %X to %X\n", start->value >> 8, context->address); + //printf("VRAM Write High: %X to %X\n", start->value >> 8, context->address); context->vdpmem[context->address] = start->value >> 8; start->partial = 1; //skip auto-increment and removal of entry from fifo @@ -920,9 +920,9 @@ void vdp_data_port_write(vdp_context * context, uint16_t value) { //printf("data port write: %X\n", value); context->flags &= ~FLAG_PENDING; - /*if (context->fifo_cur == context->fifo_end) { + if (context->fifo_cur == context->fifo_end) { printf("FIFO full, waiting for space before next write at cycle %X\n", context->cycles); - }*/ + } while (context->fifo_cur == context->fifo_end) { vdp_run_context(context, context->cycles + ((context->latched_mode & BIT_H40) ? 16 : 20)); } @@ -981,6 +981,18 @@ uint16_t vdp_data_port_read(vdp_context * context) return value; } +void vdp_adjust_cycles(vdp_context * context, uint32_t deduction) +{ + context->cycles -= deduction; + for(fifo_entry * start = (context->fifo_end - FIFO_SIZE); start < context->fifo_cur; start++) { + if (start->cycle >= deduction) { + start->cycle -= deduction; + } else { + start->cycle = 0; + } + } +} + #define GST_VDP_REGS 0xFA #define GST_VDP_MEM 0x12478 @@ -107,5 +107,6 @@ void vdp_control_port_write(vdp_context * context, uint16_t value); void vdp_data_port_write(vdp_context * context, uint16_t value); uint16_t vdp_control_port_read(vdp_context * context); uint16_t vdp_data_port_read(vdp_context * context); +void vdp_adjust_cycles(vdp_context * context, uint32_t deduction); #endif //VDP_H_ |