changeset 2391:664c3e749428

Restore reset of refresh counter after DMA since its removal caused some regressions
author Michael Pavone <pavone@retrodev.com>
date Wed, 29 Nov 2023 22:56:36 -0800
parents 9264c847ceb7
children a71176b9903d
files genesis.c
diffstat 1 files changed, 11 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/genesis.c	Sat Nov 25 11:54:56 2023 -0800
+++ b/genesis.c	Wed Nov 29 22:56:36 2023 -0800
@@ -705,11 +705,13 @@
 	sync_components(context, 0);
 	vdp_context *v_context = gen->vdp;
 	uint32_t before_cycle = v_context->cycles;
+	uint8_t did_dma = 0;
 	if (vdp_port < 0x10) {
 		int blocked;
 		if (vdp_port < 4) {
 			while (vdp_data_port_write(v_context, value) < 0) {
 				while(v_context->flags & FLAG_DMA_RUN) {
+					did_dma = 1;
 					vdp_run_dma_done(v_context, gen->frame_end);
 					if (v_context->cycles >= gen->frame_end) {
 						uint32_t cycle_diff = v_context->cycles - context->current_cycle;
@@ -732,6 +734,7 @@
 			if (blocked) {
 				while (blocked) {
 					while(v_context->flags & FLAG_DMA_RUN) {
+						did_dma = 1;
 						vdp_run_dma_done(v_context, gen->frame_end);
 						if (v_context->cycles >= gen->frame_end) {
 							uint32_t cycle_diff = v_context->cycles - context->current_cycle;
@@ -779,9 +782,14 @@
 		vdp_test_port_write(gen->vdp, value);
 	}
 
-	//refresh may have happened while we were waiting on the VDP,
-	//so advance refresh_counter but don't add any delays
-	gen_update_refresh_no_wait(context);
+	if (did_dma) {
+		gen->refresh_counter = 0;
+		gen->last_sync_cycle = context->current_cycle;
+	} else {
+		//refresh may have happened while we were waiting on the VDP,
+		//so advance refresh_counter but don't add any delays
+		gen_update_refresh_no_wait(context);
+	}
 	return context;
 }