# HG changeset patch # User Mike Pavone # Date 1356756389 28800 # Node ID 11d72e471104ec89acc8bd160f2e4dfd93436643 # Parent e821b6fde0e4c1a96c26d44bc2095348c34cdb44 Fix Z80 busreq logic diff -r e821b6fde0e4 -r 11d72e471104 blastem.c --- 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 {