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