summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
author cracyc <cracyc@users.noreply.github.com>2016-08-26 14:32:37 -0500
committer cracyc <cracyc@users.noreply.github.com>2016-08-26 14:32:37 -0500
commitdb48502ecbf882a0d4558d440a16803b1365f17d (patch)
treefdb02771984761aee717f7ee9d801ad794e5f956 /src
parentb5761952c7511dbcdbe46cafea82efce56f83349 (diff)
t11: fine, be that way (nw)
Diffstat (limited to 'src')
-rw-r--r--src/devices/cpu/t11/t11.cpp59
-rw-r--r--src/devices/cpu/t11/t11.h4
-rw-r--r--src/mame/drivers/atarisy2.cpp16
-rw-r--r--src/mame/drivers/galgame.cpp4
-rw-r--r--src/mame/drivers/vt240.cpp56
5 files changed, 88 insertions, 51 deletions
diff --git a/src/devices/cpu/t11/t11.cpp b/src/devices/cpu/t11/t11.cpp
index 76b157370a3..262c69cb17a 100644
--- a/src/devices/cpu/t11/t11.cpp
+++ b/src/devices/cpu/t11/t11.cpp
@@ -193,41 +193,38 @@ static const struct irq_table_entry irq_table[] =
{ 7<<5, 0x60 }
};
-void t11_device::t11_check_irqs(int prio)
+void t11_device::t11_check_irqs()
{
- int i, priority = PSW & 0xe0;
+ const struct irq_table_entry *irq = &irq_table[m_irq_state & 15];
+ int priority = PSW & 0xe0;
- for(i = prio; i < 16; i++)
+ /* compare the priority of the interrupt to the PSW */
+ if (irq->priority > priority)
{
- if(((m_irq_state >> i) & 1) && (irq_table[i].priority > priority))
- break;
+ int vector = irq->vector;
+ int new_pc, new_psw;
+
+ /* call the callback; if we don't get -1 back, use the return value as our vector */
+ int new_vector = standard_irq_callback(m_irq_state & 15);
+ if (new_vector != -1)
+ vector = new_vector;
+
+ /* fetch the new PC and PSW from that vector */
+ assert((vector & 3) == 0);
+ new_pc = RWORD(vector);
+ new_psw = RWORD(vector + 2);
+
+ /* push the old state, set the new one */
+ PUSH(PSW);
+ PUSH(PC);
+ PCD = new_pc;
+ PSW = new_psw;
+ t11_check_irqs();
+
+ /* count cycles and clear the WAIT flag */
+ m_icount -= 114;
+ m_wait_state = 0;
}
- if(i >= 16)
- return;
-
- int vector = irq_table[i].vector;
- int new_pc, new_psw;
-
- /* call the callback; if we don't get -1 back, use the return value as our vector */
- int new_vector = standard_irq_callback(i);
- if (new_vector != -1)
- vector = new_vector;
-
- /* fetch the new PC and PSW from that vector */
- assert((vector & 3) == 0);
- new_pc = RWORD(vector);
- new_psw = RWORD(vector + 2);
-
- /* push the old state, set the new one */
- PUSH(PSW);
- PUSH(PC);
- PCD = new_pc;
- PSW = new_psw;
- t11_check_irqs(i + 1);
-
- /* count cycles and clear the WAIT flag */
- m_icount -= 114;
- m_wait_state = 0;
}
diff --git a/src/devices/cpu/t11/t11.h b/src/devices/cpu/t11/t11.h
index f0b6f9677b6..690be3d333c 100644
--- a/src/devices/cpu/t11/t11.h
+++ b/src/devices/cpu/t11/t11.h
@@ -79,7 +79,7 @@ protected:
PAIR m_psw;
UINT16 m_initial_pc;
UINT8 m_wait_state;
- UINT16 m_irq_state;
+ UINT8 m_irq_state;
int m_icount;
address_space *m_program;
direct_read_data *m_direct;
@@ -92,7 +92,7 @@ protected:
inline void WWORD(int addr, int data);
inline void PUSH(int val);
inline int POP();
- void t11_check_irqs(int prio = 0);
+ void t11_check_irqs();
typedef void ( t11_device::*opcode_func )(UINT16 op);
static const opcode_func s_opcode_table[65536 >> 3];
diff --git a/src/mame/drivers/atarisy2.cpp b/src/mame/drivers/atarisy2.cpp
index ce0a7a775f0..10641c5e4c8 100644
--- a/src/mame/drivers/atarisy2.cpp
+++ b/src/mame/drivers/atarisy2.cpp
@@ -144,24 +144,24 @@
void atarisy2_state::update_interrupts()
{
if (m_video_int_state)
- m_maincpu->set_input_line(8, ASSERT_LINE);
+ m_maincpu->set_input_line(3, ASSERT_LINE);
else
- m_maincpu->set_input_line(8, CLEAR_LINE);
+ m_maincpu->set_input_line(3, CLEAR_LINE);
if (m_scanline_int_state)
- m_maincpu->set_input_line(4, ASSERT_LINE);
- else
- m_maincpu->set_input_line(4, CLEAR_LINE);
-
- if (m_p2portwr_state)
m_maincpu->set_input_line(2, ASSERT_LINE);
else
m_maincpu->set_input_line(2, CLEAR_LINE);
- if (m_p2portrd_state)
+ if (m_p2portwr_state)
m_maincpu->set_input_line(1, ASSERT_LINE);
else
m_maincpu->set_input_line(1, CLEAR_LINE);
+
+ if (m_p2portrd_state)
+ m_maincpu->set_input_line(0, ASSERT_LINE);
+ else
+ m_maincpu->set_input_line(0, CLEAR_LINE);
}
diff --git a/src/mame/drivers/galgame.cpp b/src/mame/drivers/galgame.cpp
index f8bb996747a..07c9b348eec 100644
--- a/src/mame/drivers/galgame.cpp
+++ b/src/mame/drivers/galgame.cpp
@@ -296,7 +296,7 @@ ADDRESS_MAP_END
IRQ_CALLBACK_MEMBER(galaxygame_state::galaxygame_irq_callback)
{
- device.execute().set_input_line(1, CLEAR_LINE);
+ device.execute().set_input_line(0, CLEAR_LINE);
return 0x40;
}
@@ -304,7 +304,7 @@ INTERRUPT_GEN_MEMBER(galaxygame_state::galaxygame_irq)
{
if ( m_clk & 0x40 )
{
- device.execute().set_input_line(1, ASSERT_LINE);
+ device.execute().set_input_line(0, ASSERT_LINE);
m_interrupt = 1;
}
}
diff --git a/src/mame/drivers/vt240.cpp b/src/mame/drivers/vt240.cpp
index fef82d47a19..9bd72f279f8 100644
--- a/src/mame/drivers/vt240.cpp
+++ b/src/mame/drivers/vt240.cpp
@@ -103,6 +103,10 @@ public:
DECLARE_DRIVER_INIT(vt240);
virtual void machine_reset() override;
UPD7220_DISPLAY_PIXELS_MEMBER(hgdc_draw);
+ void irq_encoder(int irq, int state);
+ DECLARE_WRITE_LINE_MEMBER(irq7_w);
+ DECLARE_WRITE_LINE_MEMBER(irq9_w);
+ DECLARE_WRITE_LINE_MEMBER(irq13_w);
UINT8 m_i8085_out, m_t11_out, m_i8085_rdy, m_t11;
UINT8 m_mem_map[16];
@@ -111,10 +115,45 @@ public:
UINT8 m_char_idx, m_mask, m_reg0, m_reg1, m_lu;
UINT8 m_vom[16];
UINT8 m_vpat, m_patmult, m_patcnt, m_patidx;
+ UINT16 m_irqs;
bool m_lb;
UINT16 m_scrl;
};
+void vt240_state::irq_encoder(int irq, int state)
+{
+ if(state == ASSERT_LINE)
+ m_irqs |= (1 << irq);
+ else
+ m_irqs &= ~(1 << irq);
+
+ int i;
+ for(i = 15; i > 0; i--)
+ {
+ if(m_irqs & (1 << i))
+ break;
+ }
+ m_maincpu->set_input_line(3, (i & 8) ? ASSERT_LINE : CLEAR_LINE);
+ m_maincpu->set_input_line(2, (i & 4) ? ASSERT_LINE : CLEAR_LINE);
+ m_maincpu->set_input_line(1, (i & 2) ? ASSERT_LINE : CLEAR_LINE);
+ m_maincpu->set_input_line(0, (i & 1) ? ASSERT_LINE : CLEAR_LINE);
+}
+
+WRITE_LINE_MEMBER(vt240_state::irq7_w)
+{
+ irq_encoder(7, state);
+}
+
+WRITE_LINE_MEMBER(vt240_state::irq9_w)
+{
+ irq_encoder(9, state);
+}
+
+WRITE_LINE_MEMBER(vt240_state::irq13_w)
+{
+ irq_encoder(13, state);
+}
+
WRITE_LINE_MEMBER(vt240_state::write_keyboard_clock)
{
m_i8251->write_txc(state);
@@ -147,7 +186,7 @@ WRITE_LINE_MEMBER(vt240_state::tx_w)
WRITE_LINE_MEMBER(vt240_state::i8085_rdy_w)
{
- m_maincpu->set_input_line(3, state ? CLEAR_LINE : ASSERT_LINE);
+ irq_encoder(3, state ? CLEAR_LINE : ASSERT_LINE);
m_i8085_rdy = state;
}
@@ -241,10 +280,10 @@ WRITE8_MEMBER(vt240_state::duartout_w)
{
m_host->write_rts(BIT(data, 0) ? ASSERT_LINE : CLEAR_LINE);
m_host->write_dtr(BIT(data, 2) ? ASSERT_LINE : CLEAR_LINE);
- m_maincpu->set_input_line(15, BIT(data, 4) ? CLEAR_LINE : ASSERT_LINE);
- m_maincpu->set_input_line(14, BIT(data, 5) ? CLEAR_LINE : ASSERT_LINE);
- m_maincpu->set_input_line(11, BIT(data, 6) ? CLEAR_LINE : ASSERT_LINE);
- m_maincpu->set_input_line(10, BIT(data, 7) ? CLEAR_LINE : ASSERT_LINE);
+ irq_encoder(15, BIT(data, 4) ? CLEAR_LINE : ASSERT_LINE);
+ irq_encoder(14, BIT(data, 5) ? CLEAR_LINE : ASSERT_LINE);
+ irq_encoder(11, BIT(data, 6) ? CLEAR_LINE : ASSERT_LINE);
+ irq_encoder(10, BIT(data, 7) ? CLEAR_LINE : ASSERT_LINE);
}
READ8_MEMBER(vt240_state::mem_map_cs_r)
@@ -570,6 +609,7 @@ void vt240_state::machine_reset()
m_patcnt = 0;
m_patidx = 0;
m_reg0 = 0x80;
+ m_irqs = 0;
}
static const gfx_layout vt240_chars_8x10 =
@@ -629,7 +669,7 @@ static MACHINE_CONFIG_START( vt240, vt240_state )
MCFG_VIDEO_SET_SCREEN("screen")
MCFG_MC68681_ADD("duart", XTAL_3_6864MHz) /* 2681 duart (not 68681!) */
- MCFG_MC68681_IRQ_CALLBACK(INPUTLINE("maincpu", 13))
+ MCFG_MC68681_IRQ_CALLBACK(WRITELINE(vt240_state, irq13_w))
MCFG_MC68681_A_TX_CALLBACK(DEVWRITELINE("host", rs232_port_device, write_txd))
MCFG_MC68681_B_TX_CALLBACK(DEVWRITELINE("printer", rs232_port_device, write_txd))
MCFG_MC68681_OUTPORT_CALLBACK(WRITE8(vt240_state, duartout_w))
@@ -637,8 +677,8 @@ static MACHINE_CONFIG_START( vt240, vt240_state )
MCFG_DEVICE_ADD("i8251", I8251, 0)
MCFG_I8251_TXD_HANDLER(WRITELINE(vt240_state, tx_w))
MCFG_I8251_DTR_HANDLER(WRITELINE(vt240_state, lben_w))
- MCFG_I8251_RXRDY_HANDLER(INPUTLINE("maincpu", 9))
- MCFG_I8251_TXRDY_HANDLER(INPUTLINE("maincpu", 7))
+ MCFG_I8251_RXRDY_HANDLER(WRITELINE(vt240_state, irq9_w))
+ MCFG_I8251_TXRDY_HANDLER(WRITELINE(vt240_state, irq7_w))
MCFG_DEVICE_ADD("lk201", LK201, 0)
MCFG_LK201_TX_HANDLER(DEVWRITELINE("i8251", i8251_device, write_rxd))