diff options
author | 2016-08-26 14:32:37 -0500 | |
---|---|---|
committer | 2016-08-26 14:32:37 -0500 | |
commit | db48502ecbf882a0d4558d440a16803b1365f17d (patch) | |
tree | fdb02771984761aee717f7ee9d801ad794e5f956 | |
parent | b5761952c7511dbcdbe46cafea82efce56f83349 (diff) |
t11: fine, be that way (nw)
-rw-r--r-- | src/devices/cpu/t11/t11.cpp | 59 | ||||
-rw-r--r-- | src/devices/cpu/t11/t11.h | 4 | ||||
-rw-r--r-- | src/mame/drivers/atarisy2.cpp | 16 | ||||
-rw-r--r-- | src/mame/drivers/galgame.cpp | 4 | ||||
-rw-r--r-- | src/mame/drivers/vt240.cpp | 56 |
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)) |