From fe11dca5f4e35aa578d7f14b3a9e2709357a793a Mon Sep 17 00:00:00 2001 From: cracyc Date: Sat, 12 Jul 2014 03:37:25 +0000 Subject: [PATCH] i186: interrupt level triggering and simplify timers (nw) (mess) rmnimbus: start to fix scsi (nw) --- src/emu/cpu/i86/i186.c | 71 +++++++++---------- src/emu/cpu/i86/i186.h | 14 ++-- src/mess/drivers/rmnimbus.c | 2 +- src/mess/includes/rmnimbus.h | 7 +- src/mess/machine/rmnimbus.c | 131 ++++++++++++----------------------- 5 files changed, 87 insertions(+), 138 deletions(-) diff --git a/src/emu/cpu/i86/i186.c b/src/emu/cpu/i86/i186.c index 6b980653445..9f2efe148d7 100644 --- a/src/emu/cpu/i86/i186.c +++ b/src/emu/cpu/i86/i186.c @@ -5,7 +5,6 @@ #include "debugger.h" #include "i86inline.h" -#define LATCH_INTS 1 #define LOG_PORTS 0 #define LOG_INTERRUPTS 0 #define LOG_INTERRUPTS_EXT 0 @@ -561,20 +560,14 @@ void i80186_cpu_device::device_start() save_item(NAME(m_timer[0].maxB)); save_item(NAME(m_timer[0].active_count)); save_item(NAME(m_timer[0].count)); - save_item(NAME(m_timer[0].time_timer_active)); - save_item(NAME(m_timer[0].last_time)); save_item(NAME(m_timer[1].control)); save_item(NAME(m_timer[1].maxA)); save_item(NAME(m_timer[1].maxB)); save_item(NAME(m_timer[1].active_count)); save_item(NAME(m_timer[1].count)); - save_item(NAME(m_timer[1].time_timer_active)); - save_item(NAME(m_timer[1].last_time)); save_item(NAME(m_timer[2].control)); save_item(NAME(m_timer[2].maxA)); save_item(NAME(m_timer[2].count)); - save_item(NAME(m_timer[2].time_timer_active)); - save_item(NAME(m_timer[2].last_time)); save_item(NAME(m_dma[0].source)); save_item(NAME(m_dma[0].dest)); save_item(NAME(m_dma[0].count)); @@ -593,6 +586,7 @@ void i80186_cpu_device::device_start() save_item(NAME(m_intr.timer)); save_item(NAME(m_intr.dma)); save_item(NAME(m_intr.ext)); + save_item(NAME(m_intr.ext_state)); save_item(NAME(m_mem.lower)); save_item(NAME(m_mem.upper)); save_item(NAME(m_mem.middle)); @@ -603,9 +597,6 @@ void i80186_cpu_device::device_start() m_timer[0].int_timer = timer_alloc(TIMER_INT0); m_timer[1].int_timer = timer_alloc(TIMER_INT1); m_timer[2].int_timer = timer_alloc(TIMER_INT2); - m_timer[0].time_timer = timer_alloc(TIMER_TIME0); - m_timer[1].time_timer = timer_alloc(TIMER_TIME1); - m_timer[2].time_timer = timer_alloc(TIMER_TIME2); m_out_tmrout0_func.resolve_safe(); m_out_tmrout1_func.resolve_safe(); @@ -632,13 +623,13 @@ void i80186_cpu_device::device_reset() m_intr.request = 0x0000; m_intr.status = 0x0000; m_intr.poll_status = 0x0000; + m_intr.ext_state = 0x00; m_reloc = 0x20ff; m_dma[0].drq_state = false; m_dma[1].drq_state = false; for(int i = 0; i < ARRAY_LENGTH(m_timer); ++i) { m_timer[i].control = 0; - m_timer[i].time_timer_active = 0; m_timer[i].maxA = 0; m_timer[i].maxB = 0; m_timer[i].count = 0; @@ -714,11 +705,17 @@ IRQ_CALLBACK_MEMBER(i80186_cpu_device::int_callback) oldreq=m_intr.request; /* clear the request and set the in-service bit */ -#if LATCH_INTS - m_intr.request &= ~m_intr.ack_mask; -#else - m_intr.request &= ~(m_intr.ack_mask & 0x0f); -#endif + if(m_intr.ack_mask & 0xf0) + { + int i; + for(i = 0; i < 4; i++) + if((m_intr.ack_mask >> (i + 4)) & 1) + break; + if(!(m_intr.ext[i] & EXTINT_CTRL_LTM)) + m_intr.request &= ~m_intr.ack_mask; + } + else + m_intr.request &= ~m_intr.ack_mask; if((LOG_INTERRUPTS) && (m_intr.request!=oldreq)) logerror("intr.request changed from %02X to %02X\n",oldreq,m_intr.request); @@ -927,18 +924,24 @@ void i80186_cpu_device::handle_eoi(int data) } /* Trigger an external interrupt, optionally supplying the vector to take */ -void i80186_cpu_device::external_int(UINT16 intno, int state, UINT8 vector) +void i80186_cpu_device::external_int(UINT16 intno, int state) { - if (LOG_INTERRUPTS_EXT) logerror("generating external int %02X, vector %02X\n",intno,vector); + if(!(m_intr.ext_state & (1 << intno)) == !state) + return; + + if (LOG_INTERRUPTS_EXT) logerror("generating external int %02X\n",intno); if(!state) { m_intr.request &= ~(0x010 << intno); m_intr.ack_mask &= ~(0x0010 << intno); + m_intr.ext_state &= ~(1 << intno); } else // Turn on the requested request bit and handle interrupt + { m_intr.request |= (0x010 << intno); - + m_intr.ext_state |= (1 << intno); + } update_interrupt_state(); } @@ -1014,7 +1017,8 @@ void i80186_cpu_device::device_timer(emu_timer &timer, device_timer_id id, int p count = t->maxA; count = count ? count : 0x10000; - t->int_timer->adjust((attotime::from_hz(clock()/8) * count), which); + if(!(t->control & 4)) + t->int_timer->adjust((attotime::from_hz(clock()/8) * count), which); t->count = 0; if (LOG_TIMER) logerror(" Repriming interrupt\n"); } @@ -1022,9 +1026,6 @@ void i80186_cpu_device::device_timer(emu_timer &timer, device_timer_id id, int p t->int_timer->adjust(attotime::never, which); break; } - case TIMER_TIME0: - case TIMER_TIME1: - case TIMER_TIME2: default: break; } @@ -1036,14 +1037,8 @@ void i80186_cpu_device::internal_timer_sync(int which) struct timer_state *t = &m_timer[which]; /* if we have a timing timer running, adjust the count */ - if (t->time_timer_active && !(t->control & 0x0c)) - { - attotime current_time = t->time_timer->elapsed(); - int net_clocks = ((current_time - t->last_time) * (clock()/8)).seconds; - t->last_time = current_time; - - t->count = t->count + net_clocks; - } + if ((t->control & 0x8000) && !(t->control & 0x0c)) + t->count = (((which != 2) && t->active_count) ? t->maxB : t->maxA) - t->int_timer->remaining().as_ticks(clock() / 8); } void i80186_cpu_device::inc_timer(int which) @@ -1139,19 +1134,12 @@ void i80186_cpu_device::internal_timer_update(int which,int new_count,int new_ma { /* compute the final count */ internal_timer_sync(which); - - /* nuke the timer and force the interrupt timer to be recomputed */ - t->time_timer->adjust(attotime::never, which); - t->time_timer_active = 0; update_int_timer = 1; } /* if we're going on, start the timers running except with external clock or prescale */ else if ((diff & 0x8000) && (new_control & 0x8000) && !(new_control & 0xc)) { - /* start the timing */ - t->time_timer->adjust(attotime::never, which); - t->time_timer_active = 1; update_int_timer = 1; } @@ -1528,36 +1516,43 @@ WRITE16_MEMBER(i80186_cpu_device::internal_port_w) case 0x19: if (LOG_PORTS) logerror("%05X:80186 timer interrupt contol = %04X\n", pc(), data); m_intr.timer = data & 0x000f; + update_interrupt_state(); break; case 0x1a: if (LOG_PORTS) logerror("%05X:80186 DMA 0 interrupt control = %04X\n", pc(), data); m_intr.dma[0] = data & 0x000f; + update_interrupt_state(); break; case 0x1b: if (LOG_PORTS) logerror("%05X:80186 DMA 1 interrupt control = %04X\n", pc(), data); m_intr.dma[1] = data & 0x000f; + update_interrupt_state(); break; case 0x1c: if (LOG_PORTS) logerror("%05X:80186 INT 0 interrupt control = %04X\n", pc(), data); m_intr.ext[0] = data & 0x007f; + update_interrupt_state(); break; case 0x1d: if (LOG_PORTS) logerror("%05X:80186 INT 1 interrupt control = %04X\n", pc(), data); m_intr.ext[1] = data & 0x007f; + update_interrupt_state(); break; case 0x1e: if (LOG_PORTS) logerror("%05X:80186 INT 2 interrupt control = %04X\n", pc(), data); m_intr.ext[2] = data & 0x001f; + update_interrupt_state(); break; case 0x1f: if (LOG_PORTS) logerror("%05X:80186 INT 3 interrupt control = %04X\n", pc(), data); m_intr.ext[3] = data & 0x001f; + update_interrupt_state(); break; case 0x28: diff --git a/src/emu/cpu/i86/i186.h b/src/emu/cpu/i86/i186.h index 22f96db990b..21964a14981 100644 --- a/src/emu/cpu/i86/i186.h +++ b/src/emu/cpu/i86/i186.h @@ -24,10 +24,10 @@ public: DECLARE_WRITE_LINE_MEMBER(drq1_w) { if(state) drq_callback(1); m_dma[1].drq_state = state; } DECLARE_WRITE_LINE_MEMBER(tmrin0_w) { if(state && (m_timer[0].control & 0x8004) == 0x8004) { inc_timer(0); } } DECLARE_WRITE_LINE_MEMBER(tmrin1_w) { if(state && (m_timer[1].control & 0x8004) == 0x8004) { inc_timer(1); } } - DECLARE_WRITE_LINE_MEMBER(int0_w) { external_int(0, state, 0); } - DECLARE_WRITE_LINE_MEMBER(int1_w) { external_int(1, state, 0); } - DECLARE_WRITE_LINE_MEMBER(int2_w) { external_int(2, state, 0); } - DECLARE_WRITE_LINE_MEMBER(int3_w) { external_int(3, state, 0); } + DECLARE_WRITE_LINE_MEMBER(int0_w) { external_int(0, state); } + DECLARE_WRITE_LINE_MEMBER(int1_w) { external_int(1, state); } + DECLARE_WRITE_LINE_MEMBER(int2_w) { external_int(2, state); } + DECLARE_WRITE_LINE_MEMBER(int3_w) { external_int(3, state); } // device_memory_interface overrides virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const { return (spacenum == AS_PROGRAM) ? &m_program_config : ( (spacenum == AS_IO) ? &m_io_config : NULL ); } @@ -55,7 +55,7 @@ protected: private: void update_interrupt_state(); void handle_eoi(int data); - void external_int(UINT16 intno, int state, UINT8 vector); + void external_int(UINT16 intno, int state); void internal_timer_sync(int which); void internal_timer_update(int which,int new_count,int new_maxA,int new_maxB,int new_control); void update_dma_control(int which, int new_control); @@ -81,9 +81,6 @@ private: bool active_count; UINT16 count; emu_timer *int_timer; - emu_timer *time_timer; - UINT8 time_timer_active; - attotime last_time; }; struct dma_state @@ -108,6 +105,7 @@ private: UINT16 timer; UINT16 dma[2]; UINT16 ext[4]; + UINT8 ext_state; }; static const device_timer_id TIMER_INT0 = 0; diff --git a/src/mess/drivers/rmnimbus.c b/src/mess/drivers/rmnimbus.c index 7bffeb6a799..e4e306feca9 100644 --- a/src/mess/drivers/rmnimbus.c +++ b/src/mess/drivers/rmnimbus.c @@ -176,7 +176,7 @@ static MACHINE_CONFIG_START( nimbus, rmnimbus_state ) MCFG_VIA6522_WRITEPA_HANDLER(DEVWRITE8("cent_data_out", output_latch_device, write)) MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(rmnimbus_state,nimbus_via_write_portb)) MCFG_VIA6522_CA2_HANDLER(DEVWRITELINE(CENTRONICS_TAG, centronics_device, write_strobe)) - MCFG_VIA6522_IRQ_HANDLER(WRITELINE(rmnimbus_state,nimbus_via_irq_w)) + MCFG_VIA6522_IRQ_HANDLER(DEVWRITELINE(MAINCPU_TAG, i80186_cpu_device, int3_w)) MCFG_CENTRONICS_ADD(CENTRONICS_TAG, centronics_printers, "printer") MCFG_CENTRONICS_ACK_HANDLER(DEVWRITELINE(VIA_TAG, via6522_device, write_ca1)) MCFG_DEVCB_INVERT diff --git a/src/mess/includes/rmnimbus.h b/src/mess/includes/rmnimbus.h index 6d8d79f1806..28328a7772f 100644 --- a/src/mess/includes/rmnimbus.h +++ b/src/mess/includes/rmnimbus.h @@ -90,7 +90,6 @@ public: UINT8 m_iou_reg092; UINT8 m_last_playmode; UINT8 m_ay8910_a; - UINT8 m_sio_int_state; UINT16 m_x, m_y, m_yline; UINT8 m_colours, m_mode, m_op; UINT32 m_debug_video; @@ -126,7 +125,6 @@ public: DECLARE_WRITE_LINE_MEMBER(nimbus_fdc_intrq_w); DECLARE_WRITE_LINE_MEMBER(nimbus_fdc_drq_w); DECLARE_WRITE8_MEMBER(nimbus_via_write_portb); - DECLARE_WRITE_LINE_MEMBER(nimbus_via_irq_w); DECLARE_WRITE_LINE_MEMBER(write_scsi_bsy); DECLARE_WRITE_LINE_MEMBER(write_scsi_cd); DECLARE_WRITE_LINE_MEMBER(write_scsi_io); @@ -144,9 +142,8 @@ public: void move_pixel_line(UINT16 x, UINT16 y, UINT8 width); void write_pixel_data(UINT16 x, UINT16 y, UINT16 data); void change_palette(UINT8 bank, UINT16 colours); - void external_int(UINT16 intno, UINT8 vector); + void external_int(UINT8 vector, bool state); DECLARE_READ8_MEMBER(cascade_callback); - void *get_dssi_ptr(address_space &space, UINT16 ds, UINT16 si); void nimbus_bank_memory(); void memory_reset(); void fdc_reset(); @@ -160,6 +157,7 @@ public: void iou_reset(); void rmni_sound_reset(); void mouse_js_reset(); + void check_scsi_irq(); int m_scsi_iena; int m_scsi_msg; @@ -182,7 +180,6 @@ public: UINT8 reg418; UINT8 drq_ff; - UINT8 int_ff; } m_nimbus_drives; /* 8031 Peripheral controler */ diff --git a/src/mess/machine/rmnimbus.c b/src/mess/machine/rmnimbus.c index c42b44332dc..34036de383b 100644 --- a/src/mess/machine/rmnimbus.c +++ b/src/mess/machine/rmnimbus.c @@ -108,8 +108,6 @@ enum #define MOUSE_INT_ENABLED(state) (((state)->m_iou_reg092 & MOUSE_INT_ENABLE) ? 1 : 0) -#define VIA_INT 0x03 - #define LINEAR_ADDR(seg,ofs) ((seg<<4)+ofs) #define OUTPUT_SEGOFS(mess,seg,ofs) logerror("%s=%04X:%04X [%08X]\n",mess,seg,ofs,((seg<<4)+ofs)) @@ -168,7 +166,6 @@ struct t_nimbus_brush }; -static void execute_debug_irq(running_machine &machine, int ref, int params, const char *param[]); static void nimbus_debug(running_machine &machine, int ref, int params, const char *param[]); static int instruction_hook(device_t &device, offs_t curpc); @@ -181,30 +178,20 @@ static void decode_dssi_f_set_new_clt(device_t *device,UINT16 ds, UINT16 si, UI static void decode_dssi_f_plonk_char(device_t *device,UINT16 ds, UINT16 si, UINT8 raw_flag); static void decode_dssi_f_rw_sectors(device_t *device,UINT16 ds, UINT16 si, UINT8 raw_flag); -void rmnimbus_state::external_int(UINT16 intno, UINT8 vector) +void rmnimbus_state::external_int(UINT8 vector, bool state) { + + if(!state && (vector != m_vector)) + return; + m_vector = vector; - switch(intno) - { - case 0: - m_maincpu->int0_w(1); - break; - case 1: - m_maincpu->int1_w(1); - break; - case 2: - m_maincpu->int2_w(1); - break; - case 3: - m_maincpu->int3_w(1); - break; - default: - return; - } + + m_maincpu->int0_w(state); } READ8_MEMBER(rmnimbus_state::cascade_callback) { + m_maincpu->int0_w(0); return m_vector; } @@ -237,7 +224,6 @@ void rmnimbus_state::machine_start() /* setup debug commands */ if (machine().debug_flags & DEBUG_FLAG_ENABLED) { - debug_console_register_command(machine(), "nimbus_irq", CMDFLAG_NONE, 0, 0, 2, execute_debug_irq); debug_console_register_command(machine(), "nimbus_debug", CMDFLAG_NONE, 0, 0, 1, nimbus_debug); /* set up the instruction hook */ @@ -248,26 +234,6 @@ void rmnimbus_state::machine_start() m_fdc->dden_w(0); } -static void execute_debug_irq(running_machine &machine, int ref, int params, const char *param[]) -{ - rmnimbus_state *state = machine.driver_data(); - int IntNo; - int Vector; - - if(params>1) - { - sscanf(param[0],"%X",&IntNo); - sscanf(param[1],"%X",&Vector); - - debug_console_printf(machine,"triggering IRQ%d, Vector=%02X\n",IntNo,Vector); - state->external_int(IntNo,Vector); - } - else - { - debug_console_printf(machine,"Error, you must supply an intno and vector to trigger\n"); - } -} - static void nimbus_debug(running_machine &machine, int ref, int params, const char *param[]) { rmnimbus_state *state = machine.driver_data(); @@ -655,7 +621,7 @@ static void decode_subbios(device_t *device,offs_t pc, UINT8 raw_flag) } } -void *rmnimbus_state::get_dssi_ptr(address_space &space, UINT16 ds, UINT16 si) +static inline void *get_dssi_ptr(address_space &space, UINT16 ds, UINT16 si) { int addr; @@ -675,7 +641,7 @@ static void decode_dssi_generic(device_t *device,UINT16 ds, UINT16 si, UINT8 ra if(raw_flag) return; - params=(UINT16 *)state->get_dssi_ptr(space,ds,si); + params=(UINT16 *)get_dssi_ptr(space,ds,si); for(count=0; count<10; count++) logerror("%04X ",params[count]); @@ -694,7 +660,7 @@ static void decode_dssi_f_fill_area(device_t *device,UINT16 ds, UINT16 si, UINT t_nimbus_brush *brush; int cocount; - area_params = (t_area_params *)state->get_dssi_ptr(space,ds,si); + area_params = (t_area_params *)get_dssi_ptr(space,ds,si); if (!raw_flag) OUTPUT_SEGOFS("SegBrush:OfsBrush",area_params->seg_brush,area_params->ofs_brush); @@ -750,7 +716,7 @@ static void decode_dssi_f_plot_character_string(device_t *device,UINT16 ds, UIN if(raw_flag) return; - plot_string_params=(t_plot_string_params *)state->get_dssi_ptr(space,ds,si); + plot_string_params=(t_plot_string_params *)get_dssi_ptr(space,ds,si); OUTPUT_SEGOFS("SegFont:OfsFont",plot_string_params->seg_font,plot_string_params->ofs_font); OUTPUT_SEGOFS("SegData:OfsData",plot_string_params->seg_data,plot_string_params->ofs_data); @@ -774,7 +740,7 @@ static void decode_dssi_f_set_new_clt(device_t *device,UINT16 ds, UINT16 si, UI address_space &space = state->m_maincpu->space(AS_PROGRAM); UINT16 *new_colours; int colour; - new_colours=(UINT16 *)state->get_dssi_ptr(space,ds,si); + new_colours=(UINT16 *)get_dssi_ptr(space,ds,si); if(raw_flag) return; @@ -791,7 +757,7 @@ static void decode_dssi_f_plonk_char(device_t *device,UINT16 ds, UINT16 si, UIN rmnimbus_state *state = device->machine().driver_data(); address_space &space = state->m_maincpu->space(AS_PROGRAM); UINT16 *params; - params=(UINT16 *)state->get_dssi_ptr(space,ds,si); + params=(UINT16 *)get_dssi_ptr(space,ds,si); if(raw_flag) return; @@ -811,7 +777,7 @@ static void decode_dssi_f_rw_sectors(device_t *device,UINT16 ds, UINT16 si, UIN if(raw_flag) return; - params=(UINT16 *)state->get_dssi_ptr(space,ds,si); + params=(UINT16 *)get_dssi_ptr(space,ds,si); for(param_no=0;param_no<16;param_no++) logerror("%04X ",params[param_no]); @@ -1035,14 +1001,7 @@ WRITE_LINE_MEMBER(rmnimbus_state::sio_interrupt) if(LOG_SIO) logerror("SIO Interrupt state=%02X\n",state); - // Don't re-trigger if already active ! - if(state!=m_sio_int_state) - { - m_sio_int_state=state; - - if(state) - external_int(0, m_z80sio->m1_r()); - } + external_int(m_z80sio->m1_r(), state); } /* Floppy disk */ @@ -1051,7 +1010,6 @@ void rmnimbus_state::fdc_reset() { m_nimbus_drives.reg400=0; m_scsi_ctrl_out->write(0); - m_nimbus_drives.int_ff=0; } WRITE_LINE_MEMBER(rmnimbus_state::nimbus_fdc_intrq_w) @@ -1061,10 +1019,7 @@ WRITE_LINE_MEMBER(rmnimbus_state::nimbus_fdc_intrq_w) if(m_iou_reg092 & DISK_INT_ENABLE) { - m_nimbus_drives.int_ff=state; - - if(state) - external_int(0,EXTERNAL_INT_DISK); + external_int(EXTERNAL_INT_DISK,state); } } @@ -1119,10 +1074,10 @@ READ8_MEMBER(rmnimbus_state::scsi_r) switch(offset*2) { case 0x00 : - result |= !m_scsi_req << 7; - result |= !m_scsi_cd << 6; - result |= !m_scsi_io << 5; - result |= !m_scsi_bsy << 4; + result |= m_scsi_req << 7; + result |= m_scsi_cd << 6; + result |= m_scsi_io << 5; + result |= m_scsi_bsy << 4; result |= m_scsi_msg << 3; if(floppy) { @@ -1196,11 +1151,11 @@ WRITE8_MEMBER(rmnimbus_state::scsi_w) switch(offset*2) { - case 0x10 : + case 0x00 : m_scsi_ctrl_out->write(data); break; - case 0x18 : + case 0x08 : m_scsi_data_out->write(data); hdc_post_rw(); break; @@ -1210,21 +1165,28 @@ WRITE8_MEMBER(rmnimbus_state::scsi_w) void rmnimbus_state::hdc_reset() { m_nimbus_drives.drq_ff=0; + m_scsi_iena = 0; + m_scsi_msg = 0; + m_scsi_bsy = 0; + m_scsi_io = 0; + m_scsi_cd = 0; + m_scsi_req = 0; +} + +void rmnimbus_state::check_scsi_irq() +{ + nimbus_fdc_intrq_w(m_scsi_io && m_scsi_cd && m_scsi_req && m_scsi_iena); } WRITE_LINE_MEMBER(rmnimbus_state::write_scsi_iena) { - int last = m_scsi_iena; m_scsi_iena = state; - - // If we enable the HDC interupt, and an interrupt is pending, go deal with it. - if (m_scsi_iena && !last && !m_scsi_io && !m_scsi_cd && !m_scsi_req) - nimbus_fdc_intrq_w(1); + check_scsi_irq(); } void rmnimbus_state::hdc_post_rw() { - if(!m_scsi_req) + if(m_scsi_req) m_scsibus->write_ack(1); m_nimbus_drives.drq_ff=0; @@ -1246,6 +1208,7 @@ WRITE_LINE_MEMBER( rmnimbus_state::write_scsi_bsy ) WRITE_LINE_MEMBER( rmnimbus_state::write_scsi_cd ) { m_scsi_cd = state; + check_scsi_irq(); } WRITE_LINE_MEMBER( rmnimbus_state::write_scsi_io ) @@ -1256,6 +1219,7 @@ WRITE_LINE_MEMBER( rmnimbus_state::write_scsi_io ) { m_scsi_data_out->write(0); } + check_scsi_irq(); } WRITE_LINE_MEMBER( rmnimbus_state::write_scsi_msg ) @@ -1280,6 +1244,7 @@ WRITE_LINE_MEMBER( rmnimbus_state::write_scsi_req ) { m_scsibus->write_ack(0); } + check_scsi_irq(); } /* 8031/8051 Peripheral controler 80186 side */ @@ -1369,7 +1334,7 @@ READ8_MEMBER(rmnimbus_state::nimbus_pc8031_iou_r) } if(((offset==2) || (offset==3)) && (m_iou_reg092 & PC8031_INT_ENABLE)) - external_int(0,EXTERNAL_INT_PC8031_8C); + external_int(EXTERNAL_INT_PC8031_8C, true); if(LOG_PC8031) logerror("8031: PCIOR %04X read of %04X returns %02X\n",pc,offset,result); @@ -1403,7 +1368,7 @@ WRITE8_MEMBER(rmnimbus_state::nimbus_pc8031_iou_w) m_ipc_interface.status_out &= ~IPC_OUT_ADDR; m_ipc_interface.status_in |= IPC_IN_READ_PEND; if(m_iou_reg092 & PC8031_INT_ENABLE) - external_int(0,EXTERNAL_INT_PC8031_8F); + external_int(EXTERNAL_INT_PC8031_8F, true); break; case 0x03 : m_ipc_interface.ipc_out=data; @@ -1411,7 +1376,7 @@ WRITE8_MEMBER(rmnimbus_state::nimbus_pc8031_iou_w) m_ipc_interface.status_out |= IPC_OUT_ADDR; m_ipc_interface.status_in |= IPC_IN_READ_PEND; if(m_iou_reg092 & PC8031_INT_ENABLE) - external_int(0,EXTERNAL_INT_PC8031_8E); + external_int(EXTERNAL_INT_PC8031_8E, true); break; } } @@ -1545,7 +1510,7 @@ WRITE8_MEMBER(rmnimbus_state::nimbus_sound_ay8910_portb_w) WRITE_LINE_MEMBER(rmnimbus_state::nimbus_msm5205_vck) { if(m_iou_reg092 & MSM5205_INT_ENABLE) - external_int(0,EXTERNAL_INT_MSM5205); + external_int(EXTERNAL_INT_MSM5205,state); } static const int MOUSE_XYA[3][4] = { { 0, 0, 0, 0 }, { 1, 1, 0, 0 }, { 0, 1, 1, 0 } }; @@ -1663,7 +1628,7 @@ void rmnimbus_state::device_timer(emu_timer &timer, device_timer_id id, int para { xint=mxa ? EXTERNAL_INT_MOUSE_XR : EXTERNAL_INT_MOUSE_XL; - external_int(0,xint); + external_int(xint, true); // logerror("Xint:%02X, mxb=%02X\n",xint,mxb); } @@ -1673,7 +1638,7 @@ void rmnimbus_state::device_timer(emu_timer &timer, device_timer_id id, int para { yint=myb ? EXTERNAL_INT_MOUSE_YU : EXTERNAL_INT_MOUSE_YD; - external_int(0,yint); + external_int(yint, true); // logerror("Yint:%02X, myb=%02X\n",yint,myb); } } @@ -1751,9 +1716,3 @@ collector output only. It usially acts as the printer strobe line. WRITE8_MEMBER(rmnimbus_state::nimbus_via_write_portb) { } - -WRITE_LINE_MEMBER(rmnimbus_state::nimbus_via_irq_w) -{ - if(state) - external_int(VIA_INT,0x00); -}