changeset 115:11d72e471104

Fix Z80 busreq logic
author Mike Pavone <pavone@retrodev.com>
date Fri, 28 Dec 2012 20:46:29 -0800
parents e821b6fde0e4
children 9eaba47c429d
files blastem.c
diffstat 1 files changed, 11 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/blastem.c	Fri Dec 28 19:21:05 2012 -0800
+++ b/blastem.c	Fri Dec 28 20:46:29 2012 -0800
@@ -284,22 +284,21 @@
 				busreq = 1;
 				if(!reset) {
 					busack_cycle = context->current_cycle + Z80_ACK_DELAY;
-					new_busack = 1;
+					new_busack = 0;
 				}
 			} else {
 				busreq = 0;
 				busack_cycle = CYCLE_NEVER;
-				busack = 0;
+				busack = 1;
 			}
 		} else if (location == 0x1200) {
 			if (value & 1) {
 				if (reset && busreq) {
-					new_busack = 1;
+					new_busack = 0;
 					busack_cycle = context->current_cycle + Z80_ACK_DELAY;
 				}
 				reset = 0;
 			} else {
-				busack = 0;
 				reset = 1;
 			}
 		}
@@ -328,7 +327,7 @@
 			break;
 		}
 	} else {
-		//printf("IO Write of %X to %X\n", value, location);
+		printf("IO Write of %X to %X @ %d\n", value, location, context->current_cycle);
 		if (location == 0x1100) {
 			if (busack_cycle > context->current_cycle) {
 				busack = new_busack;
@@ -338,22 +337,21 @@
 				busreq = 1;
 				if(!reset) {
 					busack_cycle = context->current_cycle + Z80_ACK_DELAY;
-					new_busack = 1;
+					new_busack = 0;
 				}
 			} else {
 				busreq = 0;
 				busack_cycle = CYCLE_NEVER;
-				busack = 0;
+				busack = 1;
 			}
 		} else if (location == 0x1200) {
 			if (value & 0x100) {
 				if (reset && busreq) {
-					new_busack = 1;
+					new_busack = 0;
 					busack_cycle = context->current_cycle + Z80_ACK_DELAY;
 				}
 				reset = 0;
 			} else {
-				busack = 0;
 				reset = 1;
 			}
 		}
@@ -392,8 +390,8 @@
 				busack = new_busack;
 				busack_cycle = CYCLE_NEVER;
 			}
-			context->value = (!reset) && busack;
-			//printf("Byte read of BUSREQ returned %d\n", context->value);
+			context->value = reset || busack;
+			printf("Byte read of BUSREQ returned %d @ %d (reset: %d, busack: %d)\n", context->value, context->current_cycle, reset, busack);
 		} else if (location == 0x1200) {
 			context->value = !reset;
 		} else {
@@ -440,8 +438,8 @@
 				busack = new_busack;
 				busack_cycle = CYCLE_NEVER;
 			}
-			context->value = ((!reset) && busack) << 8;
-			//printf("Word read of BUSREQ returned %d\n", context->value);
+			context->value = (reset || busack) << 8;
+			printf("Word read of BUSREQ returned %d\n", context->value);
 		} else if (location == 0x1200) {
 			context->value = (!reset) << 8;
 		} else {