diff sms.c @ 1154:c83ec07ddbac

Implemented Mode 4 H conter latching
author Michael Pavone <pavone@retrodev.com>
date Thu, 05 Jan 2017 00:36:23 -0800
parents 6b0da6021544
children c4ea535cf57e
line wrap: on
line diff
--- a/sms.c	Thu Jan 05 00:08:28 2017 -0800
+++ b/sms.c	Thu Jan 05 00:36:23 2017 -0800
@@ -12,8 +12,19 @@
 	z80_context *z80 = vcontext;
 	sms_context *sms = z80->system;
 	if (location & 1) {
+		uint8_t fuzzy_ctrl_0 = sms->io.ports[0].control, fuzzy_ctrl_1 = sms->io.ports[1].control;
 		sms->io.ports[0].control = (~value) << 5 & 0x60;
+		fuzzy_ctrl_0 |= sms->io.ports[0].control;
 		sms->io.ports[1].control = (~value) << 3 & 0x60;
+		fuzzy_ctrl_1 |= sms->io.ports[1].control;
+		if (
+			(fuzzy_ctrl_0 & 0x40 & (sms->io.ports[0].output ^ (value << 1)) & (value << 1))
+			|| (fuzzy_ctrl_0 & 0x40 & (sms->io.ports[1].output ^ (value >> 1)) & (value >> 1))
+		) {
+			//TH is an output and it went from 0 -> 1
+			vdp_run_context(sms->vdp, z80->current_cycle);
+			vdp_latch_hv(sms->vdp);
+		}
 		io_data_write(sms->io.ports, value << 1, z80->current_cycle);
 		io_data_write(sms->io.ports + 1, value >> 1, z80->current_cycle);
 	} else {