mirror of
https://github.com/holub/mame
synced 2025-07-02 16:49:22 +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 }
|
{ 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))
|
int vector = irq->vector;
|
||||||
break;
|
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;
|
PAIR m_psw;
|
||||||
UINT16 m_initial_pc;
|
UINT16 m_initial_pc;
|
||||||
UINT8 m_wait_state;
|
UINT8 m_wait_state;
|
||||||
UINT16 m_irq_state;
|
UINT8 m_irq_state;
|
||||||
int m_icount;
|
int m_icount;
|
||||||
address_space *m_program;
|
address_space *m_program;
|
||||||
direct_read_data *m_direct;
|
direct_read_data *m_direct;
|
||||||
@ -92,7 +92,7 @@ protected:
|
|||||||
inline void WWORD(int addr, int data);
|
inline void WWORD(int addr, int data);
|
||||||
inline void PUSH(int val);
|
inline void PUSH(int val);
|
||||||
inline int POP();
|
inline int POP();
|
||||||
void t11_check_irqs(int prio = 0);
|
void t11_check_irqs();
|
||||||
|
|
||||||
typedef void ( t11_device::*opcode_func )(UINT16 op);
|
typedef void ( t11_device::*opcode_func )(UINT16 op);
|
||||||
static const opcode_func s_opcode_table[65536 >> 3];
|
static const opcode_func s_opcode_table[65536 >> 3];
|
||||||
|
@ -144,24 +144,24 @@
|
|||||||
void atarisy2_state::update_interrupts()
|
void atarisy2_state::update_interrupts()
|
||||||
{
|
{
|
||||||
if (m_video_int_state)
|
if (m_video_int_state)
|
||||||
m_maincpu->set_input_line(8, ASSERT_LINE);
|
m_maincpu->set_input_line(3, ASSERT_LINE);
|
||||||
else
|
else
|
||||||
m_maincpu->set_input_line(8, CLEAR_LINE);
|
m_maincpu->set_input_line(3, CLEAR_LINE);
|
||||||
|
|
||||||
if (m_scanline_int_state)
|
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);
|
m_maincpu->set_input_line(2, ASSERT_LINE);
|
||||||
else
|
else
|
||||||
m_maincpu->set_input_line(2, CLEAR_LINE);
|
m_maincpu->set_input_line(2, CLEAR_LINE);
|
||||||
|
|
||||||
if (m_p2portrd_state)
|
if (m_p2portwr_state)
|
||||||
m_maincpu->set_input_line(1, ASSERT_LINE);
|
m_maincpu->set_input_line(1, ASSERT_LINE);
|
||||||
else
|
else
|
||||||
m_maincpu->set_input_line(1, CLEAR_LINE);
|
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)
|
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;
|
return 0x40;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -304,7 +304,7 @@ INTERRUPT_GEN_MEMBER(galaxygame_state::galaxygame_irq)
|
|||||||
{
|
{
|
||||||
if ( m_clk & 0x40 )
|
if ( m_clk & 0x40 )
|
||||||
{
|
{
|
||||||
device.execute().set_input_line(1, ASSERT_LINE);
|
device.execute().set_input_line(0, ASSERT_LINE);
|
||||||
m_interrupt = 1;
|
m_interrupt = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -103,6 +103,10 @@ public:
|
|||||||
DECLARE_DRIVER_INIT(vt240);
|
DECLARE_DRIVER_INIT(vt240);
|
||||||
virtual void machine_reset() override;
|
virtual void machine_reset() override;
|
||||||
UPD7220_DISPLAY_PIXELS_MEMBER(hgdc_draw);
|
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_i8085_out, m_t11_out, m_i8085_rdy, m_t11;
|
||||||
UINT8 m_mem_map[16];
|
UINT8 m_mem_map[16];
|
||||||
@ -111,10 +115,45 @@ public:
|
|||||||
UINT8 m_char_idx, m_mask, m_reg0, m_reg1, m_lu;
|
UINT8 m_char_idx, m_mask, m_reg0, m_reg1, m_lu;
|
||||||
UINT8 m_vom[16];
|
UINT8 m_vom[16];
|
||||||
UINT8 m_vpat, m_patmult, m_patcnt, m_patidx;
|
UINT8 m_vpat, m_patmult, m_patcnt, m_patidx;
|
||||||
|
UINT16 m_irqs;
|
||||||
bool m_lb;
|
bool m_lb;
|
||||||
UINT16 m_scrl;
|
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)
|
WRITE_LINE_MEMBER(vt240_state::write_keyboard_clock)
|
||||||
{
|
{
|
||||||
m_i8251->write_txc(state);
|
m_i8251->write_txc(state);
|
||||||
@ -147,7 +186,7 @@ WRITE_LINE_MEMBER(vt240_state::tx_w)
|
|||||||
|
|
||||||
WRITE_LINE_MEMBER(vt240_state::i8085_rdy_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;
|
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_rts(BIT(data, 0) ? ASSERT_LINE : CLEAR_LINE);
|
||||||
m_host->write_dtr(BIT(data, 2) ? 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);
|
irq_encoder(15, BIT(data, 4) ? CLEAR_LINE : ASSERT_LINE);
|
||||||
m_maincpu->set_input_line(14, BIT(data, 5) ? CLEAR_LINE : ASSERT_LINE);
|
irq_encoder(14, BIT(data, 5) ? CLEAR_LINE : ASSERT_LINE);
|
||||||
m_maincpu->set_input_line(11, BIT(data, 6) ? CLEAR_LINE : ASSERT_LINE);
|
irq_encoder(11, BIT(data, 6) ? CLEAR_LINE : ASSERT_LINE);
|
||||||
m_maincpu->set_input_line(10, BIT(data, 7) ? CLEAR_LINE : ASSERT_LINE);
|
irq_encoder(10, BIT(data, 7) ? CLEAR_LINE : ASSERT_LINE);
|
||||||
}
|
}
|
||||||
|
|
||||||
READ8_MEMBER(vt240_state::mem_map_cs_r)
|
READ8_MEMBER(vt240_state::mem_map_cs_r)
|
||||||
@ -570,6 +609,7 @@ void vt240_state::machine_reset()
|
|||||||
m_patcnt = 0;
|
m_patcnt = 0;
|
||||||
m_patidx = 0;
|
m_patidx = 0;
|
||||||
m_reg0 = 0x80;
|
m_reg0 = 0x80;
|
||||||
|
m_irqs = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const gfx_layout vt240_chars_8x10 =
|
static const gfx_layout vt240_chars_8x10 =
|
||||||
@ -629,7 +669,7 @@ static MACHINE_CONFIG_START( vt240, vt240_state )
|
|||||||
MCFG_VIDEO_SET_SCREEN("screen")
|
MCFG_VIDEO_SET_SCREEN("screen")
|
||||||
|
|
||||||
MCFG_MC68681_ADD("duart", XTAL_3_6864MHz) /* 2681 duart (not 68681!) */
|
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_A_TX_CALLBACK(DEVWRITELINE("host", rs232_port_device, write_txd))
|
||||||
MCFG_MC68681_B_TX_CALLBACK(DEVWRITELINE("printer", 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))
|
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_DEVICE_ADD("i8251", I8251, 0)
|
||||||
MCFG_I8251_TXD_HANDLER(WRITELINE(vt240_state, tx_w))
|
MCFG_I8251_TXD_HANDLER(WRITELINE(vt240_state, tx_w))
|
||||||
MCFG_I8251_DTR_HANDLER(WRITELINE(vt240_state, lben_w))
|
MCFG_I8251_DTR_HANDLER(WRITELINE(vt240_state, lben_w))
|
||||||
MCFG_I8251_RXRDY_HANDLER(INPUTLINE("maincpu", 9))
|
MCFG_I8251_RXRDY_HANDLER(WRITELINE(vt240_state, irq9_w))
|
||||||
MCFG_I8251_TXRDY_HANDLER(INPUTLINE("maincpu", 7))
|
MCFG_I8251_TXRDY_HANDLER(WRITELINE(vt240_state, irq7_w))
|
||||||
|
|
||||||
MCFG_DEVICE_ADD("lk201", LK201, 0)
|
MCFG_DEVICE_ADD("lk201", LK201, 0)
|
||||||
MCFG_LK201_TX_HANDLER(DEVWRITELINE("i8251", i8251_device, write_rxd))
|
MCFG_LK201_TX_HANDLER(DEVWRITELINE("i8251", i8251_device, write_rxd))
|
||||||
|
Loading…
Reference in New Issue
Block a user