mirror of
https://github.com/holub/mame
synced 2025-07-02 00:29:37 +03:00
t11: fine, be that way (nw)
This commit is contained in:
parent
b5761952c7
commit
db48502ecb
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
@ -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];
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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))
|
||||
|
Loading…
Reference in New Issue
Block a user