changeset 1775:a9fc826c6a9d mame_interp

Make refresh delay emulation play nice with Musashi
author Michael Pavone <pavone@retrodev.com>
date Wed, 13 Mar 2019 18:57:11 -0700
parents ddcd59a6122e
children d5118d6f9c75
files genesis.c
diffstat 1 files changed, 21 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/genesis.c	Tue Mar 12 22:05:40 2019 -0700
+++ b/genesis.c	Wed Mar 13 18:57:11 2019 -0700
@@ -348,7 +348,7 @@
 static uint32_t last_frame_num;
 
 //My refresh emulation isn't currently good enough and causes more problems than it solves
-//#define REFRESH_EMULATION
+#define REFRESH_EMULATION
 #ifdef REFRESH_EMULATION
 #define REFRESH_INTERVAL 128
 #define REFRESH_DELAY 2
@@ -366,12 +366,14 @@
 	vdp_context * v_context = gen->vdp;
 	z80_context * z_context = gen->z80;
 #ifdef REFRESH_EMULATION
-	//lame estimation of refresh cycle delay
-	refresh_counter += context->current_cycle - last_sync_cycle;
-	if (!gen->bus_busy) {
-		context->current_cycle += REFRESH_DELAY * MCLKS_PER_68K * (refresh_counter / (MCLKS_PER_68K * REFRESH_INTERVAL));
+	if (context->current_cycle != last_sync_cycle) {
+		//lame estimation of refresh cycle delay
+		refresh_counter += context->current_cycle - last_sync_cycle;
+		if (!gen->bus_busy) {
+			context->current_cycle += REFRESH_DELAY * MCLKS_PER_68K * (refresh_counter / (MCLKS_PER_68K * REFRESH_INTERVAL));
+		}
+		refresh_counter = refresh_counter % (MCLKS_PER_68K * REFRESH_INTERVAL);
 	}
-	refresh_counter = refresh_counter % (MCLKS_PER_68K * REFRESH_INTERVAL);
 #endif
 
 	uint32_t mclks = context->current_cycle;
@@ -492,10 +494,12 @@
 	//printf("vdp_port write: %X, value: %X, cycle: %d\n", vdp_port, value, context->current_cycle);
 #ifdef REFRESH_EMULATION
 	//do refresh check here so we can avoid adding a penalty for a refresh that happens during a VDP access
-	refresh_counter += context->current_cycle - 4*MCLKS_PER_68K - last_sync_cycle;
-	context->current_cycle += REFRESH_DELAY * MCLKS_PER_68K * (refresh_counter / (MCLKS_PER_68K * REFRESH_INTERVAL));
-	refresh_counter = refresh_counter % (MCLKS_PER_68K * REFRESH_INTERVAL);
-	last_sync_cycle = context->current_cycle;
+	if (context->current_cycle - 4*MCLKS_PER_68K > last_sync_cycle) {
+		refresh_counter += context->current_cycle - 4*MCLKS_PER_68K - last_sync_cycle;
+		context->current_cycle += REFRESH_DELAY * MCLKS_PER_68K * (refresh_counter / (MCLKS_PER_68K * REFRESH_INTERVAL));
+		refresh_counter = refresh_counter % (MCLKS_PER_68K * REFRESH_INTERVAL);
+		last_sync_cycle = context->current_cycle;
+	}
 #endif
 	sync_components(context, 0);
 	genesis_context * gen = context->system;
@@ -630,11 +634,13 @@
 	vdp_port &= 0x1F;
 	uint16_t value;
 #ifdef REFRESH_EMULATION
-	//do refresh check here so we can avoid adding a penalty for a refresh that happens during a VDP access
-	refresh_counter += context->current_cycle - 4*MCLKS_PER_68K - last_sync_cycle;
-	context->current_cycle += REFRESH_DELAY * MCLKS_PER_68K * (refresh_counter / (MCLKS_PER_68K * REFRESH_INTERVAL));
-	refresh_counter = refresh_counter % (MCLKS_PER_68K * REFRESH_INTERVAL);
-	last_sync_cycle = context->current_cycle;
+	if (context->current_cycle - 4*MCLKS_PER_68K > last_sync_cycle) {
+		//do refresh check here so we can avoid adding a penalty for a refresh that happens during a VDP access
+		refresh_counter += context->current_cycle - 4*MCLKS_PER_68K - last_sync_cycle;
+		context->current_cycle += REFRESH_DELAY * MCLKS_PER_68K * (refresh_counter / (MCLKS_PER_68K * REFRESH_INTERVAL));
+		refresh_counter = refresh_counter % (MCLKS_PER_68K * REFRESH_INTERVAL);
+		last_sync_cycle = context->current_cycle;
+	}
 #endif
 	sync_components(context, 0);
 	genesis_context *gen = context->system;