diff options
author | Miodrag Milanovic <mmicko@gmail.com> | 2016-04-30 19:56:18 +0200 |
---|---|---|
committer | Miodrag Milanovic <mmicko@gmail.com> | 2016-04-30 19:56:18 +0200 |
commit | 8bef52ec6d31606ef4e2a7da0fc614e2222d162d (patch) | |
tree | 16b9258d84e14e4ce57f52ef1d25566422ebfb4a /src/mame/drivers/eolith.cpp | |
parent | 5408999eb0724e9b735c11c3e682734b6474c391 (diff) |
fixed wpc, okiadpcm and eolith (nw)
Diffstat (limited to 'src/mame/drivers/eolith.cpp')
-rw-r--r-- | src/mame/drivers/eolith.cpp | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/src/mame/drivers/eolith.cpp b/src/mame/drivers/eolith.cpp index 81113f41cfb..e17c5be26c0 100644 --- a/src/mame/drivers/eolith.cpp +++ b/src/mame/drivers/eolith.cpp @@ -1564,6 +1564,132 @@ DRIVER_INIT_MEMBER(eolith_state,hidctch3) DRIVER_INIT_CALL(eolith); } +/* Eolith Speedup Handling */ + +/* + This uses triggers and a scanline counter to speed up the eolith games a bit + in some cases this results in a 100% speedup + e.g hidden catch 25% -> 50% speed ingame + + this could probably be done a bit better using timers +*/ + +void eolith_state::speedup_read() +{ + /* for debug */ + //if ((space.device().safe_pc()!=m_speedup_address) && (m_speedup_vblank!=1) ) + // printf("%s:eolith speedup_read data %02x\n",space.machine().describe_context(), m_speedup_vblank); + + if (m_speedup_vblank==0 && m_speedup_scanline < m_speedup_resume_scanline) + { + int pc = m_maincpu->pc(); + + if ((pc==m_speedup_address) || (pc==m_speedup_address2)) + { + m_maincpu->spin_until_trigger(1000); + } + } +} + +static const struct +{ + const char *s_name; + int speedup_address; + int speedup_address2; + int speedup_resume_scanline; + +} eolith_speedup_table[] = +{ + /* eolith.c */ + { "linkypip", 0x4000825c, -1,/*0x4000ABAE,*/ 240 }, // 2nd address is used on the planet cutscene between but idle skipping between levels, but seems too aggressive + { "ironfort", 0x40020854, -1, 240 }, + { "ironfortj",0x40020234, -1, 240 }, + { "hidnctch", 0x4000bba0, -1, 240 }, + { "raccoon", 0x40008204, -1, 240 }, + { "puzzlekg", 0x40029458, -1, 240 }, + { "hidctch2", 0x40009524, -1, 240 }, + { "hidctch2a",0x40029B58, -1, 240 }, + { "landbrk", 0x40023574, -1, 240 }, + { "landbrka", 0x4002446c, -1, 240 }, + { "nhidctch", 0x40012778, -1, 240 }, + { "hidctch3", 0x4001f6a0, -1, 240 }, + { "fort2b", 0x000081e0, -1, 240 }, + { "fort2ba", 0x000081e0, -1, 240 }, + { "penfan", 0x4001FA66, -1, 240 }, + { "penfana", 0x4001FAb6, -1, 240 }, + { "candy", 0x4001990C, -1, 240 }, + { "hidnc2k", 0x40016824, -1, 240 }, + /* eolith16.c */ + { "klondkp", 0x0001a046, -1, 240 }, + /* vegaeo.c */ + { "crazywar", 0x00008cf8, -1, 240 }, + { nullptr, 0, 0 } +}; + + +void eolith_state::init_speedup() +{ + int n_game = 0; + m_speedup_address = 0; + m_speedup_address2 = 0; + m_speedup_resume_scanline = 0; + m_speedup_vblank = 0; + m_speedup_scanline = 0; + + while( eolith_speedup_table[ n_game ].s_name != nullptr ) + { + if( strcmp( machine().system().name, eolith_speedup_table[ n_game ].s_name ) == 0 ) + { + m_speedup_address = eolith_speedup_table[ n_game ].speedup_address; + m_speedup_address2 = eolith_speedup_table[ n_game ].speedup_address2; + m_speedup_resume_scanline = eolith_speedup_table[ n_game ].speedup_resume_scanline; + } + n_game++; + } + + save_item(NAME(m_speedup_vblank)); + save_item(NAME(m_speedup_scanline)); +} + +/* todo, use timers instead! */ +TIMER_DEVICE_CALLBACK_MEMBER(eolith_state::eolith_speedup) +{ + if (param==0) + { + m_speedup_vblank = 0; + } + + if (param==m_speedup_resume_scanline) + { + machine().scheduler().trigger(1000); + } + + if (param==240) + { + m_speedup_vblank = 1; + } +} + +CUSTOM_INPUT_MEMBER(eolith_state::eolith_speedup_getvblank) +{ +// printf("%s:eolith speedup_read data %02x\n",machine().describe_context(), m_speedup_vblank); + + + return (m_screen->vpos() >= 240); +} + +// StealSee doesn't use interrupts, just the vblank +CUSTOM_INPUT_MEMBER(eolith_state::stealsee_speedup_getvblank) +{ + int pc = m_maincpu->pc(); + + if (pc==0x400081ec) + if(!m_speedup_vblank) + m_maincpu->eat_cycles(500); + + return (m_screen->vpos() >= 240); +} + /************************************* * |