changeset 333:f16136a3835d

Update Z80 vint timing
author Mike Pavone <pavone@retrodev.com>
date Tue, 14 May 2013 00:40:10 -0700
parents 671a5be51522
children 4c91470e1a53
files blastem.c vdp.c vdp.h
diffstat 3 files changed, 16 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/blastem.c	Tue May 14 00:28:45 2013 -0700
+++ b/blastem.c	Tue May 14 00:40:10 2013 -0700
@@ -162,14 +162,16 @@
 void sync_z80(z80_context * z_context, uint32_t mclks)
 {
 	if (z80_enabled && !reset && !busreq) {
+		genesis_context * gen = z_context->system;
 		if (need_reset) {
 			z80_reset(z_context);
 			need_reset = 0;
 		}
 		z_context->sync_cycle = mclks / MCLKS_PER_Z80;
+		uint32_t vint_cycle = vdp_next_vint_z80(gen->vdp) / MCLKS_PER_Z80;
 		while (z_context->current_cycle < z_context->sync_cycle) {
 			if (z_context->iff1 && z_context->current_cycle < ZVINT_CYCLE) {
-				z_context->int_cycle = ZVINT_CYCLE;
+				z_context->int_cycle = vint_cycle;
 			}
 			z_context->target_cycle = z_context->sync_cycle < z_context->int_cycle ? z_context->sync_cycle : z_context->int_cycle;
 			dprintf("Running Z80 from cycle %d to cycle %d. Native PC: %p\n", z_context->current_cycle, z_context->sync_cycle, z_context->native_pc);
--- a/vdp.c	Tue May 14 00:28:45 2013 -0700
+++ b/vdp.c	Tue May 14 00:40:10 2013 -0700
@@ -1572,6 +1572,18 @@
 	return vcycle;
 }
 
+uint32_t vdp_next_vint_z80(vdp_context * context)
+{
+	uint32_t active_lines = context->latched_mode & BIT_PAL ? PAL_ACTIVE : NTSC_ACTIVE;
+	uint32_t vcycle =  MCLKS_LINE * active_lines;
+	if (context->latched_mode & BIT_H40) {
+		vcycle += VINT_CYCLE_H40;
+	} else {
+		vcycle += VINT_CYCLE_H32;
+	}
+	return vcycle;
+}
+
 void vdp_int_ack(vdp_context * context, uint16_t int_num)
 {
 	if (int_num == 6) {
--- a/vdp.h	Tue May 14 00:28:45 2013 -0700
+++ b/vdp.h	Tue May 14 00:40:10 2013 -0700
@@ -140,6 +140,7 @@
 void vdp_adjust_cycles(vdp_context * context, uint32_t deduction);
 uint32_t vdp_next_hint(vdp_context * context);
 uint32_t vdp_next_vint(vdp_context * context);
+uint32_t vdp_next_vint_z80(vdp_context * context);
 void vdp_int_ack(vdp_context * context, uint16_t int_num);
 void vdp_print_sprite_table(vdp_context * context);
 void vdp_print_reg_explain(vdp_context * context);