i186: interrupt level triggering and simplify timers (nw)

(mess) rmnimbus: start to fix scsi (nw)
This commit is contained in:
cracyc 2014-07-12 03:37:25 +00:00
parent 5be5b6cc88
commit fe11dca5f4
5 changed files with 87 additions and 138 deletions

View File

@ -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:

View File

@ -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;

View File

@ -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

View File

@ -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 */

View File

@ -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<rmnimbus_state>();
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<rmnimbus_state>();
@ -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<rmnimbus_state>();
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);
}