summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Curt Coder <curtcoder@mail.com>2011-06-26 17:51:00 +0000
committer Curt Coder <curtcoder@mail.com>2011-06-26 17:51:00 +0000
commit2efa40c70317247c74237248b95c5190d57573b8 (patch)
tree87ede40d776e6332cd30a54ca6bfcfeee41d70bc
parent8d4c312fa3ff68e42bbd65b27c07e332eb71d371 (diff)
Added BUSRQ and WAIT input lines to the Z80 CPU core. [Curt Coder]
-rw-r--r--src/emu/cpu/z80/z80.c98
-rw-r--r--src/emu/cpu/z80/z80.h6
2 files changed, 73 insertions, 31 deletions
diff --git a/src/emu/cpu/z80/z80.c b/src/emu/cpu/z80/z80.c
index e6fb680c211..a5acaeda336 100644
--- a/src/emu/cpu/z80/z80.c
+++ b/src/emu/cpu/z80/z80.c
@@ -152,6 +152,8 @@ struct _z80_state
UINT8 nmi_pending; /* nmi pending */
UINT8 irq_state; /* irq line state */
UINT8 nsc800_irq_state[4];/* state of NSC800 restart interrupts A, B, C */
+ int wait_state; // wait line state
+ int busrq_state; // bus request line state
UINT8 after_ei; /* are we in the EI shadow? */
UINT8 after_ldair; /* same, but for LD A,I or LD A,R */
UINT32 ea;
@@ -3445,6 +3447,8 @@ static CPU_INIT( z80 )
device->save_item(NAME(z80->nmi_state));
device->save_item(NAME(z80->nmi_pending));
device->save_item(NAME(z80->irq_state));
+ device->save_item(NAME(z80->wait_state));
+ device->save_item(NAME(z80->busrq_state));
device->save_item(NAME(z80->after_ei));
device->save_item(NAME(z80->after_ldair));
@@ -3473,6 +3477,8 @@ static CPU_INIT( z80 )
z80->nmi_state = 0;
z80->nmi_pending = 0;
z80->irq_state = 0;
+ z80->wait_state = 0;
+ z80->busrq_state = 0;
z80->after_ei = 0;
z80->after_ldair = 0;
z80->ea = 0;
@@ -3553,6 +3559,8 @@ static CPU_RESET( z80 )
z80->nmi_state = CLEAR_LINE;
z80->nmi_pending = FALSE;
z80->irq_state = CLEAR_LINE;
+ z80->wait_state = CLEAR_LINE;
+ z80->busrq_state = CLEAR_LINE;
z80->after_ei = FALSE;
z80->after_ldair = FALSE;
z80->iff1 = 0;
@@ -3692,48 +3700,74 @@ static CPU_BURN( z80 )
****************************************************************************/
static void set_irq_line(z80_state *z80, int irqline, int state)
{
- if (irqline == INPUT_LINE_NMI)
+ switch (irqline)
{
+ case Z80_INPUT_LINE_BUSRQ:
+ z80->busrq_state = state;
+ break;
+
+ case INPUT_LINE_NMI:
/* mark an NMI pending on the rising edge */
if (z80->nmi_state == CLEAR_LINE && state != CLEAR_LINE)
z80->nmi_pending = TRUE;
z80->nmi_state = state;
- }
- else
- {
+ break;
+
+ case INPUT_LINE_IRQ0:
/* update the IRQ state via the daisy chain */
z80->irq_state = state;
if (z80->daisy.present())
z80->irq_state = ( z80->daisy.update_irq_state() == ASSERT_LINE ) ? ASSERT_LINE : z80->irq_state;
/* the main execute loop will take the interrupt */
+ break;
+
+ case Z80_INPUT_LINE_WAIT:
+ z80->wait_state = state;
+ break;
}
}
static void set_irq_line_nsc800(z80_state *z80, int irqline, int state)
{
- if (irqline == INPUT_LINE_NMI)
+ switch (irqline)
{
+ case Z80_INPUT_LINE_BUSRQ:
+ z80->busrq_state = state;
+ break;
+
+ case INPUT_LINE_NMI:
/* mark an NMI pending on the rising edge */
if (z80->nmi_state == CLEAR_LINE && state != CLEAR_LINE)
z80->nmi_pending = TRUE;
z80->nmi_state = state;
- }
- else if (irqline == NSC800_RSTA)
+ break;
+
+ case NSC800_RSTA:
z80->nsc800_irq_state[NSC800_RSTA] = state;
- else if (irqline == NSC800_RSTB)
+ break;
+
+ case NSC800_RSTB:
z80->nsc800_irq_state[NSC800_RSTB] = state;
- else if (irqline == NSC800_RSTC)
+ break;
+
+ case NSC800_RSTC:
z80->nsc800_irq_state[NSC800_RSTC] = state;
- else
- {
+ break;
+
+ case INPUT_LINE_IRQ0:
/* update the IRQ state via the daisy chain */
z80->irq_state = state;
if (z80->daisy.present())
z80->irq_state = z80->daisy.update_irq_state();
/* the main execute loop will take the interrupt */
+ break;
+
+ case Z80_INPUT_LINE_WAIT:
+ z80->wait_state = state;
+ break;
}
}
@@ -3807,8 +3841,10 @@ static CPU_SET_INFO( z80 )
switch (state)
{
/* --- the following bits of info are set as 64-bit signed integers --- */
- case CPUINFO_INT_INPUT_STATE + INPUT_LINE_NMI: set_irq_line(z80, INPUT_LINE_NMI, info->i); break;
- case CPUINFO_INT_INPUT_STATE + 0: set_irq_line(z80, 0, info->i); break;
+ case CPUINFO_INT_INPUT_STATE + Z80_INPUT_LINE_BUSRQ: set_irq_line(z80, Z80_INPUT_LINE_BUSRQ, info->i); break;
+ case CPUINFO_INT_INPUT_STATE + INPUT_LINE_NMI: set_irq_line(z80, INPUT_LINE_NMI, info->i); break;
+ case CPUINFO_INT_INPUT_STATE + INPUT_LINE_IRQ0: set_irq_line(z80, INPUT_LINE_IRQ0, info->i); break;
+ case CPUINFO_INT_INPUT_STATE + Z80_INPUT_LINE_WAIT: set_irq_line(z80, Z80_INPUT_LINE_WAIT, info->i); break;
}
}
@@ -3818,11 +3854,13 @@ static CPU_SET_INFO( nsc800 )
switch (state)
{
/* --- the following bits of info are set as 64-bit signed integers --- */
- case CPUINFO_INT_INPUT_STATE + INPUT_LINE_NMI: set_irq_line_nsc800(z80, INPUT_LINE_NMI, info->i); break;
- case CPUINFO_INT_INPUT_STATE + NSC800_RSTA: set_irq_line_nsc800(z80, NSC800_RSTA, info->i); break;
- case CPUINFO_INT_INPUT_STATE + NSC800_RSTB: set_irq_line_nsc800(z80, NSC800_RSTB, info->i); break;
- case CPUINFO_INT_INPUT_STATE + NSC800_RSTC: set_irq_line_nsc800(z80, NSC800_RSTC, info->i); break;
- case CPUINFO_INT_INPUT_STATE + 0: set_irq_line_nsc800(z80, 0, info->i); break;
+ case CPUINFO_INT_INPUT_STATE + Z80_INPUT_LINE_BUSRQ: set_irq_line(z80, Z80_INPUT_LINE_BUSRQ, info->i); break;
+ case CPUINFO_INT_INPUT_STATE + INPUT_LINE_NMI: set_irq_line_nsc800(z80, INPUT_LINE_NMI, info->i); break;
+ case CPUINFO_INT_INPUT_STATE + NSC800_RSTA: set_irq_line_nsc800(z80, NSC800_RSTA, info->i); break;
+ case CPUINFO_INT_INPUT_STATE + NSC800_RSTB: set_irq_line_nsc800(z80, NSC800_RSTB, info->i); break;
+ case CPUINFO_INT_INPUT_STATE + NSC800_RSTC: set_irq_line_nsc800(z80, NSC800_RSTC, info->i); break;
+ case CPUINFO_INT_INPUT_STATE + INPUT_LINE_IRQ0: set_irq_line_nsc800(z80, INPUT_LINE_IRQ0, info->i); break;
+ case CPUINFO_INT_INPUT_STATE + Z80_INPUT_LINE_WAIT: set_irq_line(z80, Z80_INPUT_LINE_WAIT, info->i); break;
}
}
@@ -3850,7 +3888,7 @@ CPU_GET_INFO( z80 )
{
/* --- the following bits of info are returned as 64-bit signed integers --- */
case CPUINFO_INT_CONTEXT_SIZE: info->i = sizeof(z80_state); break;
- case CPUINFO_INT_INPUT_LINES: info->i = 1; break;
+ case CPUINFO_INT_INPUT_LINES: info->i = 4; break;
case CPUINFO_INT_DEFAULT_IRQ_VECTOR: info->i = 0xff; break;
case DEVINFO_INT_ENDIANNESS: info->i = ENDIANNESS_LITTLE; break;
case CPUINFO_INT_CLOCK_MULTIPLIER: info->i = 1; break;
@@ -3860,15 +3898,17 @@ CPU_GET_INFO( z80 )
case CPUINFO_INT_MIN_CYCLES: info->i = 2; break;
case CPUINFO_INT_MAX_CYCLES: info->i = 16; break;
- case DEVINFO_INT_DATABUS_WIDTH + AS_PROGRAM: info->i = 8; break;
- case DEVINFO_INT_ADDRBUS_WIDTH + AS_PROGRAM: info->i = 16; break;
- case DEVINFO_INT_ADDRBUS_SHIFT + AS_PROGRAM: info->i = 0; break;
- case DEVINFO_INT_DATABUS_WIDTH + AS_IO: info->i = 8; break;
- case DEVINFO_INT_ADDRBUS_WIDTH + AS_IO: info->i = 16; break;
- case DEVINFO_INT_ADDRBUS_SHIFT + AS_IO: info->i = 0; break;
+ case DEVINFO_INT_DATABUS_WIDTH + AS_PROGRAM: info->i = 8; break;
+ case DEVINFO_INT_ADDRBUS_WIDTH + AS_PROGRAM: info->i = 16; break;
+ case DEVINFO_INT_ADDRBUS_SHIFT + AS_PROGRAM: info->i = 0; break;
+ case DEVINFO_INT_DATABUS_WIDTH + AS_IO: info->i = 8; break;
+ case DEVINFO_INT_ADDRBUS_WIDTH + AS_IO: info->i = 16; break;
+ case DEVINFO_INT_ADDRBUS_SHIFT + AS_IO: info->i = 0; break;
- case CPUINFO_INT_INPUT_STATE + INPUT_LINE_NMI: info->i = z80->nmi_state; break;
- case CPUINFO_INT_INPUT_STATE + 0: info->i = z80->irq_state; break;
+ case CPUINFO_INT_INPUT_STATE + Z80_INPUT_LINE_BUSRQ: info->i = z80->busrq_state; break;
+ case CPUINFO_INT_INPUT_STATE + INPUT_LINE_NMI: info->i = z80->nmi_state; break;
+ case CPUINFO_INT_INPUT_STATE + INPUT_LINE_IRQ0: info->i = z80->irq_state; break;
+ case CPUINFO_INT_INPUT_STATE + Z80_INPUT_LINE_WAIT: info->i = z80->wait_state; break;
/* --- the following bits of info are returned as pointers to functions --- */
case CPUINFO_FCT_SET_INFO: info->setinfo = CPU_SET_INFO_NAME(z80); break;
@@ -3891,14 +3931,14 @@ CPU_GET_INFO( z80 )
case DEVINFO_STR_SOURCE_FILE: strcpy(info->s, __FILE__); break;
case DEVINFO_STR_CREDITS: strcpy(info->s, "Copyright Juergen Buchmueller, all rights reserved."); break;
}
-}
+}
CPU_GET_INFO( nsc800 )
{
z80_state *z80 = (device != NULL && device->token() != NULL) ? get_safe_token(device) : NULL;
switch (state)
{
- case CPUINFO_INT_INPUT_LINES: info->i = 4; break;
+ case CPUINFO_INT_INPUT_LINES: info->i = 7; break;
case CPUINFO_INT_INPUT_STATE + NSC800_RSTA: info->i = z80->nsc800_irq_state[NSC800_RSTA]; break;
case CPUINFO_INT_INPUT_STATE + NSC800_RSTB: info->i = z80->nsc800_irq_state[NSC800_RSTB]; break;
diff --git a/src/emu/cpu/z80/z80.h b/src/emu/cpu/z80/z80.h
index 3353240dcaa..b92c7174071 100644
--- a/src/emu/cpu/z80/z80.h
+++ b/src/emu/cpu/z80/z80.h
@@ -5,9 +5,11 @@
enum
{
- NSC800_RSTA = 1,
+ NSC800_RSTA = INPUT_LINE_IRQ0 + 1,
NSC800_RSTB,
- NSC800_RSTC
+ NSC800_RSTC,
+ Z80_INPUT_LINE_WAIT,
+ Z80_INPUT_LINE_BUSRQ
};
enum