mirror of
https://github.com/holub/mame
synced 2025-05-03 21:13:18 +03:00
Added BUSRQ and WAIT input lines to the Z80 CPU core. [Curt Coder]
This commit is contained in:
parent
8d4c312fa3
commit
2efa40c703
@ -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;
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user