mirror of
https://github.com/holub/mame
synced 2025-06-29 23:48:56 +03:00
i186: interrupt level triggering and simplify timers (nw)
(mess) rmnimbus: start to fix scsi (nw)
This commit is contained in:
parent
5be5b6cc88
commit
fe11dca5f4
@ -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:
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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 */
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user