Moved sprite irq DMA into a timer callback, nw

This commit is contained in:
angelosa 2016-02-01 21:03:59 +01:00
parent 0cd30c1a66
commit 59e2e7e7ff
2 changed files with 24 additions and 7 deletions

View File

@ -82,7 +82,6 @@ TIMER_DEVICE_CALLBACK_MEMBER(overdriv_state::overdriv_cpuA_scanline)
{ {
// m_screen->frame_number() & 1 // m_screen->frame_number() & 1
m_maincpu->set_input_line(4, HOLD_LINE); m_maincpu->set_input_line(4, HOLD_LINE);
m_subcpu->set_input_line(4, HOLD_LINE); // likely wrong
} }
else if(m_fake_timer >= timer_threshold) // timer irq else if(m_fake_timer >= timer_threshold) // timer irq
{ {
@ -91,13 +90,12 @@ TIMER_DEVICE_CALLBACK_MEMBER(overdriv_state::overdriv_cpuA_scanline)
} }
} }
#ifdef UNUSED_FUNCTION
INTERRUPT_GEN_MEMBER(overdriv_state::cpuB_interrupt) INTERRUPT_GEN_MEMBER(overdriv_state::cpuB_interrupt)
{ {
// this doesn't get turned on until the irq has happened? wrong irq? // this doesn't get turned on until the irq has happened? wrong irq?
if (m_k053246->k053246_is_irq_enabled())
m_subcpu->set_input_line(6, HOLD_LINE); // likely wrong
} }
#endif
WRITE16_MEMBER(overdriv_state::cpuA_ctrl_w) WRITE16_MEMBER(overdriv_state::cpuA_ctrl_w)
{ {
@ -149,6 +147,7 @@ WRITE16_MEMBER(overdriv_state::overdriv_cpuB_irq_x_w)
WRITE16_MEMBER(overdriv_state::overdriv_cpuB_irq_y_w) WRITE16_MEMBER(overdriv_state::overdriv_cpuB_irq_y_w)
{ {
m_subcpu->set_input_line(4, HOLD_LINE);
} }
static ADDRESS_MAP_START( overdriv_master_map, AS_PROGRAM, 16, overdriv_state ) static ADDRESS_MAP_START( overdriv_master_map, AS_PROGRAM, 16, overdriv_state )
@ -203,6 +202,19 @@ WRITE16_MEMBER( overdriv_state::overdriv_k053246_word_w )
} }
#endif #endif
TIMER_CALLBACK_MEMBER(overdriv_state::objdma_end_cb )
{
m_subcpu->set_input_line(6, HOLD_LINE);
}
WRITE16_MEMBER(overdriv_state::objdma_w)
{
if(data & 0x10)
machine().scheduler().timer_set(attotime::from_usec(100), timer_expired_delegate(FUNC(overdriv_state::objdma_end_cb), this));
m_k053246->k053246_w(space,5,data,mem_mask);
}
static ADDRESS_MAP_START( overdriv_slave_map, AS_PROGRAM, 16, overdriv_state ) static ADDRESS_MAP_START( overdriv_slave_map, AS_PROGRAM, 16, overdriv_state )
AM_RANGE(0x000000, 0x03ffff) AM_ROM AM_RANGE(0x000000, 0x03ffff) AM_ROM
AM_RANGE(0x080000, 0x083fff) AM_RAM /* work RAM */ AM_RANGE(0x080000, 0x083fff) AM_RAM /* work RAM */
@ -212,6 +224,7 @@ static ADDRESS_MAP_START( overdriv_slave_map, AS_PROGRAM, 16, overdriv_state )
AM_RANGE(0x118000, 0x118fff) AM_DEVREADWRITE("k053246", k053247_device, k053247_word_r, k053247_word_w) // data gets copied to sprite chip with DMA.. AM_RANGE(0x118000, 0x118fff) AM_DEVREADWRITE("k053246", k053247_device, k053247_word_r, k053247_word_w) // data gets copied to sprite chip with DMA..
AM_RANGE(0x120000, 0x120001) AM_DEVREAD("k053246", k053247_device, k053246_word_r) AM_RANGE(0x120000, 0x120001) AM_DEVREAD("k053246", k053247_device, k053246_word_r)
AM_RANGE(0x128000, 0x128001) AM_READWRITE(cpuB_ctrl_r, cpuB_ctrl_w) /* enable K053247 ROM reading, plus something else */ AM_RANGE(0x128000, 0x128001) AM_READWRITE(cpuB_ctrl_r, cpuB_ctrl_w) /* enable K053247 ROM reading, plus something else */
AM_RANGE(0x130004, 0x130005) AM_WRITE(objdma_w)
AM_RANGE(0x130000, 0x130007) AM_DEVREADWRITE8("k053246", k053247_device, k053246_r,k053246_w,0xffff) AM_RANGE(0x130000, 0x130007) AM_DEVREADWRITE8("k053246", k053247_device, k053246_r,k053246_w,0xffff)
//AM_RANGE(0x140000, 0x140001) used in later stages //AM_RANGE(0x140000, 0x140001) used in later stages
AM_RANGE(0x200000, 0x203fff) AM_RAM AM_SHARE("share1") AM_RANGE(0x200000, 0x203fff) AM_RAM AM_SHARE("share1")
@ -303,8 +316,9 @@ static MACHINE_CONFIG_START( overdriv, overdriv_state )
MCFG_CPU_ADD("sub", M68000, XTAL_24MHz/2) /* 12 MHz */ MCFG_CPU_ADD("sub", M68000, XTAL_24MHz/2) /* 12 MHz */
MCFG_CPU_PROGRAM_MAP(overdriv_slave_map) MCFG_CPU_PROGRAM_MAP(overdriv_slave_map)
MCFG_CPU_VBLANK_INT_DRIVER("screen", overdriv_state, cpuB_interrupt) /* IRQ 5 and 6 are generated by the main CPU. */ //MCFG_CPU_VBLANK_INT_DRIVER("screen", overdriv_state, cpuB_interrupt)
/* IRQ 5 is used only in test mode, to request the checksums of the gfx ROMs. */ /* IRQ 5 and 6 are generated by the main CPU. */
/* IRQ 5 is used only in test mode, to request the checksums of the gfx ROMs. */
MCFG_CPU_ADD("audiocpu", M6809, XTAL_3_579545MHz) /* 1.789 MHz?? This might be the right speed, but ROM testing */ MCFG_CPU_ADD("audiocpu", M6809, XTAL_3_579545MHz) /* 1.789 MHz?? This might be the right speed, but ROM testing */
MCFG_CPU_PROGRAM_MAP(overdriv_sound_map) /* takes a little too much (the counter wraps from 0000 to 9999). */ MCFG_CPU_PROGRAM_MAP(overdriv_sound_map) /* takes a little too much (the counter wraps from 0000 to 9999). */

View File

@ -53,10 +53,13 @@ public:
DECLARE_WRITE8_MEMBER(sound_ack_w); DECLARE_WRITE8_MEMBER(sound_ack_w);
DECLARE_WRITE16_MEMBER(overdriv_cpuB_irq_x_w); DECLARE_WRITE16_MEMBER(overdriv_cpuB_irq_x_w);
DECLARE_WRITE16_MEMBER(overdriv_cpuB_irq_y_w); DECLARE_WRITE16_MEMBER(overdriv_cpuB_irq_y_w);
DECLARE_WRITE16_MEMBER(objdma_w);
TIMER_CALLBACK_MEMBER(objdma_end_cb);
virtual void machine_start() override; virtual void machine_start() override;
virtual void machine_reset() override; virtual void machine_reset() override;
UINT32 screen_update_overdriv(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); UINT32 screen_update_overdriv(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
INTERRUPT_GEN_MEMBER(cpuB_interrupt); //INTERRUPT_GEN_MEMBER(cpuB_interrupt);
TIMER_DEVICE_CALLBACK_MEMBER(overdriv_cpuA_scanline); TIMER_DEVICE_CALLBACK_MEMBER(overdriv_cpuA_scanline);
int m_fake_timer; int m_fake_timer;