Mercurial > repos > blastem
changeset 534:c641006da28e
Properly sync hardware when frame end is reached during DMA
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Thu, 13 Feb 2014 00:10:36 -0800 |
parents | e7df1b24394a |
children | aaa77e351c24 |
files | blastem.c |
diffstat | 1 files changed, 8 insertions(+), 41 deletions(-) [+] |
line wrap: on
line diff
--- a/blastem.c Wed Feb 12 23:35:10 2014 -0800 +++ b/blastem.c Thu Feb 13 00:10:36 2014 -0800 @@ -319,28 +319,11 @@ while(v_context->flags & FLAG_DMA_RUN) { vdp_run_dma_done(v_context, mclks_per_frame); if (v_context->cycles >= mclks_per_frame) { - if (!headless) { - //printf("reached frame end | 68K Cycles: %d, MCLK Cycles: %d\n", context->current_cycle, v_context->cycles); - wait_render_frame(v_context, frame_limit); - } else if(exit_after){ - --exit_after; - if (!exit_after) { - exit(0); - } + context->current_cycle = v_context->cycles / MCLKS_PER_68K; + if (context->current_cycle * MCLKS_PER_68K < mclks_per_frame) { + ++context->current_cycle; } - vdp_adjust_cycles(v_context, mclks_per_frame); - genesis_context * gen = context->system; - io_adjust_cycles(gen->ports, v_context->cycles/MCLKS_PER_68K, mclks_per_frame/MCLKS_PER_68K); - io_adjust_cycles(gen->ports+1, v_context->cycles/MCLKS_PER_68K, mclks_per_frame/MCLKS_PER_68K); - io_adjust_cycles(gen->ports+2, v_context->cycles/MCLKS_PER_68K, mclks_per_frame/MCLKS_PER_68K); - if (busack_cycle != CYCLE_NEVER) { - if (busack_cycle > mclks_per_frame/MCLKS_PER_68K) { - busack_cycle -= mclks_per_frame/MCLKS_PER_68K; - } else { - busack_cycle = CYCLE_NEVER; - busack = new_busack; - } - } + sync_components(context, 0); } } //context->current_cycle = v_context->cycles / MCLKS_PER_68K; @@ -353,27 +336,11 @@ while(v_context->flags & FLAG_DMA_RUN) { vdp_run_dma_done(v_context, mclks_per_frame); if (v_context->cycles >= mclks_per_frame) { - if (!headless) { - wait_render_frame(v_context, frame_limit); - } else if(exit_after){ - --exit_after; - if (!exit_after) { - exit(0); - } + context->current_cycle = v_context->cycles / MCLKS_PER_68K; + if (context->current_cycle * MCLKS_PER_68K < mclks_per_frame) { + ++context->current_cycle; } - vdp_adjust_cycles(v_context, mclks_per_frame); - genesis_context * gen = context->system; - io_adjust_cycles(gen->ports, v_context->cycles/MCLKS_PER_68K, mclks_per_frame/MCLKS_PER_68K); - io_adjust_cycles(gen->ports+1, v_context->cycles/MCLKS_PER_68K, mclks_per_frame/MCLKS_PER_68K); - io_adjust_cycles(gen->ports+2, v_context->cycles/MCLKS_PER_68K, mclks_per_frame/MCLKS_PER_68K); - if (busack_cycle != CYCLE_NEVER) { - if (busack_cycle > mclks_per_frame/MCLKS_PER_68K) { - busack_cycle -= mclks_per_frame/MCLKS_PER_68K; - } else { - busack_cycle = CYCLE_NEVER; - busack = new_busack; - } - } + sync_components(context, 0); } } if (blocked < 0) {