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) {