mirror of
https://github.com/holub/mame
synced 2025-04-21 16:01:56 +03:00
Cleaned up mustache boy vblank interrupts: Got rid of the nasty long-int
hack in mustache boy in favor of the same 'vblank in+vblank out' int scheme the other similar seibu games of this era used (panicrd, darkmist). This seems much more likely to be what the actual pcb used, and works just fine. [Lord Nightmare]
This commit is contained in:
parent
b0d3421599
commit
0a7b50a005
@ -157,37 +157,29 @@ static GFXDECODE_START( mustache )
|
||||
GFXDECODE_ENTRY( "gfx2", 0, spritelayout, 0x80, 8 )
|
||||
GFXDECODE_END
|
||||
|
||||
TIMER_CALLBACK_MEMBER(mustache_state::clear_irq_cb)
|
||||
{
|
||||
machine().device("maincpu")->execute().set_input_line(0, CLEAR_LINE);
|
||||
}
|
||||
|
||||
INTERRUPT_GEN_MEMBER(mustache_state::assert_irq)
|
||||
{
|
||||
device.execute().set_input_line(0, ASSERT_LINE);
|
||||
m_clear_irq_timer->adjust(downcast<cpu_device *>(&device)->cycles_to_attotime(14288));
|
||||
/* Timing here is an educated GUESS, Z80 /INT must stay high so the irq
|
||||
fires no less than TWICE per frame, else game doesn't work right.
|
||||
6000000 / 56.747 = 105732.4616 cycles per frame, we'll call it A
|
||||
screen size is 256x256, though less is visible.
|
||||
lets assume we have 256 lines L and 40 'lines' (really line-times)
|
||||
of vblank V:
|
||||
So (A/(L+V))*V = the number of cycles spent in vblank.
|
||||
(105732.4616 / (256+40)) * 40 = 14288.17049 z80 clocks in vblank
|
||||
*/
|
||||
}
|
||||
|
||||
void mustache_state::machine_start()
|
||||
{
|
||||
m_clear_irq_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(mustache_state::clear_irq_cb),this));
|
||||
// do nothing, not even sure why this is here anymore.
|
||||
}
|
||||
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(mustache_state::mustache_scanline)
|
||||
{
|
||||
int scanline = param;
|
||||
|
||||
if(scanline == 240) // vblank-out irq
|
||||
machine().device("maincpu")->execute().set_input_line_and_vector(0, HOLD_LINE,0x10); /* RST 10h */
|
||||
|
||||
if(scanline == 0) // vblank-in irq
|
||||
machine().device("maincpu")->execute().set_input_line_and_vector(0, HOLD_LINE,0x08); /* RST 08h */
|
||||
}
|
||||
|
||||
|
||||
static MACHINE_CONFIG_START( mustache, mustache_state )
|
||||
|
||||
/* basic machine hardware */
|
||||
MCFG_CPU_ADD("maincpu", Z80, CPU_CLOCK)
|
||||
MCFG_CPU_PROGRAM_MAP(memmap)
|
||||
MCFG_CPU_VBLANK_INT_DRIVER("screen", mustache_state, assert_irq)
|
||||
MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", mustache_state, mustache_scanline, "screen", 0, 1)
|
||||
|
||||
MCFG_CPU_ADD(CPUTAG_T5182,Z80, T5182_CLOCK)
|
||||
MCFG_CPU_PROGRAM_MAP(t5182_map)
|
||||
|
@ -7,7 +7,7 @@ public:
|
||||
m_spriteram(*this, "spriteram"){ }
|
||||
|
||||
required_shared_ptr<UINT8> m_videoram;
|
||||
emu_timer *m_clear_irq_timer;
|
||||
emu_timer *m_clear_irq_timer;
|
||||
tilemap_t *m_bg_tilemap;
|
||||
int m_control_byte;
|
||||
required_shared_ptr<UINT8> m_spriteram;
|
||||
@ -16,10 +16,9 @@ public:
|
||||
DECLARE_WRITE8_MEMBER(mustache_scroll_w);
|
||||
DECLARE_DRIVER_INIT(mustache);
|
||||
TILE_GET_INFO_MEMBER(get_bg_tile_info);
|
||||
virtual void machine_start();
|
||||
virtual void machine_start();
|
||||
virtual void video_start();
|
||||
virtual void palette_init();
|
||||
UINT32 screen_update_mustache(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
INTERRUPT_GEN_MEMBER(assert_irq);
|
||||
TIMER_CALLBACK_MEMBER(clear_irq_cb);
|
||||
TIMER_DEVICE_CALLBACK_MEMBER(mustache_scanline);
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user