Using IRQ_CALLBACK_MEMBER for irqs in MZ-2500, nw.

This commit is contained in:
Angelo Salese 2014-12-20 00:12:56 +01:00
parent 46ca56f304
commit 7e894f7bfe

View File

@ -18,7 +18,7 @@
- Dust Box vol. 1-3: they die with text garbage, might be bad dumps;
- Dust Box vol. 4: window effect transition is bugged;
- Dust Box vol. n: three items returns "purple" text, presumably HW failures (DFJustin: joystick "digital", mouse "not installed", HDD "not installed");
- LayDock: hangs by reading the FDC status and expecting it to become 0x81;
- LayDock: hangs at title screen due of a PIT bug (timer irq dies for whatever reason);
- Moon Child: needs mixed 3+3bpp tvram supported, kludged for now (not a real test case);
- Moon Child: window masking doesn't mask bottom part of the screen?
- Moon Child: appears to be a network / system link game, obviously doesn't work with current MAME / MESS framework;
@ -95,6 +95,7 @@ public:
UINT8 m_irq_sel;
UINT8 m_irq_vector[4];
UINT8 m_irq_mask[4];
UINT8 m_irq_pending[4];
UINT8 m_kanji_bank;
UINT8 m_dic_bank;
UINT8 m_fdc_reverse;
@ -204,6 +205,7 @@ public:
DECLARE_WRITE8_MEMBER(opn_porta_w);
DECLARE_WRITE_LINE_MEMBER(pit8253_clk0_irq);
DECLARE_WRITE_LINE_MEMBER(mz2500_rtc_alarm_irq);
IRQ_CALLBACK_MEMBER( mz2500_irq_ack );
void draw_80x25(bitmap_ind16 &bitmap,const rectangle &cliprect,UINT16 map_addr);
void draw_40x25(bitmap_ind16 &bitmap,const rectangle &cliprect,int plane,UINT16 map_addr);
@ -1795,8 +1797,10 @@ void mz2500_state::machine_reset()
/* disable IRQ */
for(i=0;i<4;i++)
{
m_irq_mask[i] = 0;
m_irq_pending[i] = 0;
}
m_kanji_bank = 0;
m_cg_clear_flag = 0;
@ -1853,11 +1857,28 @@ GFXDECODE_END
INTERRUPT_GEN_MEMBER(mz2500_state::mz2500_vbl)
{
if(m_irq_mask[0])
device.execute().set_input_line_and_vector(0, HOLD_LINE, m_irq_vector[0]);
{
m_irq_pending[0] = 1;
m_maincpu->set_input_line(0, ASSERT_LINE);
}
m_cg_clear_flag = 0;
}
IRQ_CALLBACK_MEMBER(mz2500_state::mz2500_irq_ack)
{
int i;
for(i=0;i<4;i++)
{
if(m_irq_mask[i] && m_irq_pending[i])
{
m_irq_pending[i] = 0;
m_maincpu->set_input_line(0, CLEAR_LINE);
return m_irq_vector[i];
}
}
return 0;
}
READ8_MEMBER(mz2500_state::mz2500_porta_r)
{
logerror("PPI PORTA R\n");
@ -2032,8 +2053,11 @@ PALETTE_INIT_MEMBER(mz2500_state, mz2500)
WRITE_LINE_MEMBER(mz2500_state::pit8253_clk0_irq)
{
if(m_irq_mask[1]/* && state & 1*/)
m_maincpu->set_input_line_and_vector(0, HOLD_LINE,m_irq_vector[1]);
if(m_irq_mask[1] && state & 1)
{
m_irq_pending[1] = 1;
m_maincpu->set_input_line(0, ASSERT_LINE);
}
}
WRITE_LINE_MEMBER(mz2500_state::mz2500_rtc_alarm_irq)
@ -2049,6 +2073,7 @@ static MACHINE_CONFIG_START( mz2500, mz2500_state )
MCFG_CPU_PROGRAM_MAP(mz2500_map)
MCFG_CPU_IO_MAP(mz2500_io)
MCFG_CPU_VBLANK_INT_DRIVER("screen", mz2500_state, mz2500_vbl)
MCFG_CPU_IRQ_ACKNOWLEDGE_DRIVER(mz2500_state,mz2500_irq_ack)
MCFG_DEVICE_ADD("i8255_0", I8255, 0)
MCFG_I8255_IN_PORTA_CB(READ8(mz2500_state, mz2500_porta_r))
@ -2071,8 +2096,9 @@ static MACHINE_CONFIG_START( mz2500, mz2500_state )
MCFG_DEVICE_ADD("pit", PIT8253, 0)
MCFG_PIT8253_CLK0(31250)
MCFG_PIT8253_OUT0_HANDLER(WRITELINE(mz2500_state, pit8253_clk0_irq))
// TODO: is this really right?
MCFG_PIT8253_CLK1(0)
MCFG_PIT8253_CLK2(16) //CH2, trusted, used by Super MZ demo / The Black Onyx and a bunch of others (TODO: timing of this)
MCFG_PIT8253_CLK2(16) //CH2, used by Super MZ demo / The Black Onyx and a few others (TODO: timing of this)
MCFG_PIT8253_OUT2_HANDLER(DEVWRITELINE("pit", pit8253_device, write_clk1))
MCFG_DEVICE_ADD("mb8877a", MB8877, 0)