mirror of
https://github.com/holub/mame
synced 2025-06-16 01:09:09 +03:00
zodiack: use 2 separate soundlatches instead of a shared one, decrease sound nmi frequency for dogfight
This commit is contained in:
parent
f46efbf607
commit
a6a4997dc3
@ -342,4 +342,3 @@ ROM_END
|
|||||||
|
|
||||||
// written as "Akazukin" on title screen & instruction panel flyer.
|
// written as "Akazukin" on title screen & instruction panel flyer.
|
||||||
GAME( 1983, akazukin, 0, akazukin, akazukin, akazukin_state, empty_init, ROT0, "Sigma", "Akazukin (Japan)", MACHINE_SUPPORTS_SAVE )
|
GAME( 1983, akazukin, 0, akazukin, akazukin, akazukin_state, empty_init, ROT0, "Sigma", "Akazukin (Japan)", MACHINE_SUPPORTS_SAVE )
|
||||||
|
|
||||||
|
@ -113,14 +113,15 @@ namespace {
|
|||||||
class zodiack_state : public driver_device
|
class zodiack_state : public driver_device
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
zodiack_state(const machine_config &mconfig, device_type type, const char *tag)
|
zodiack_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||||
: driver_device(mconfig, type, tag),
|
driver_device(mconfig, type, tag),
|
||||||
m_maincpu(*this, "maincpu"),
|
m_maincpu(*this, "maincpu"),
|
||||||
m_audiocpu(*this, "audiocpu"),
|
m_audiocpu(*this, "audiocpu"),
|
||||||
m_soundlatch(*this, "soundlatch")
|
m_soundlatch(*this, "soundlatch%u", 0)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
void zodiack(machine_config &config);
|
void zodiack(machine_config &config);
|
||||||
|
void dogfight(machine_config &config);
|
||||||
void percuss(machine_config &config);
|
void percuss(machine_config &config);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@ -129,21 +130,22 @@ protected:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void nmi_mask_w(uint8_t data);
|
void nmi_mask_w(uint8_t data);
|
||||||
|
void irq_mask_w(uint8_t data);
|
||||||
void sound_nmi_enable_w(uint8_t data);
|
void sound_nmi_enable_w(uint8_t data);
|
||||||
void master_soundlatch_w(uint8_t data);
|
|
||||||
void control_w(uint8_t data);
|
void control_w(uint8_t data);
|
||||||
|
|
||||||
// devices
|
// devices
|
||||||
required_device<z80_device> m_maincpu;
|
required_device<z80_device> m_maincpu;
|
||||||
required_device<z80_device> m_audiocpu;
|
required_device<z80_device> m_audiocpu;
|
||||||
required_device<generic_latch_8_device> m_soundlatch;
|
required_device_array<generic_latch_8_device, 2> m_soundlatch;
|
||||||
|
|
||||||
// state
|
// state
|
||||||
uint8_t m_main_nmi_enabled = 0;
|
uint8_t m_main_nmi_enabled = 0;
|
||||||
|
uint8_t m_main_irq_enabled = 0;
|
||||||
uint8_t m_sound_nmi_enabled = 0;
|
uint8_t m_sound_nmi_enabled = 0;
|
||||||
|
|
||||||
INTERRUPT_GEN_MEMBER(sound_nmi_gen);
|
INTERRUPT_GEN_MEMBER(sound_nmi_gen);
|
||||||
void vblank_main_nmi_w(int state);
|
void vblank(int state);
|
||||||
|
|
||||||
void io_map(address_map &map) ATTR_COLD;
|
void io_map(address_map &map) ATTR_COLD;
|
||||||
void main_map(address_map &map) ATTR_COLD;
|
void main_map(address_map &map) ATTR_COLD;
|
||||||
@ -155,15 +157,23 @@ void zodiack_state::nmi_mask_w(uint8_t data)
|
|||||||
m_main_nmi_enabled = (data & 1) ^ 1;
|
m_main_nmi_enabled = (data & 1) ^ 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void zodiack_state::irq_mask_w(uint8_t data)
|
||||||
|
{
|
||||||
|
m_main_irq_enabled = data & 1;
|
||||||
|
}
|
||||||
|
|
||||||
void zodiack_state::sound_nmi_enable_w(uint8_t data)
|
void zodiack_state::sound_nmi_enable_w(uint8_t data)
|
||||||
{
|
{
|
||||||
m_sound_nmi_enabled = data & 1;
|
m_sound_nmi_enabled = data & 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void zodiack_state::vblank_main_nmi_w(int state)
|
void zodiack_state::vblank(int state)
|
||||||
{
|
{
|
||||||
if (state && m_main_nmi_enabled)
|
if (state && m_main_nmi_enabled)
|
||||||
m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
|
m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
|
||||||
|
|
||||||
|
if (state && m_main_irq_enabled)
|
||||||
|
m_maincpu->set_input_line(0, HOLD_LINE);
|
||||||
}
|
}
|
||||||
|
|
||||||
INTERRUPT_GEN_MEMBER(zodiack_state::sound_nmi_gen)
|
INTERRUPT_GEN_MEMBER(zodiack_state::sound_nmi_gen)
|
||||||
@ -172,13 +182,6 @@ INTERRUPT_GEN_MEMBER(zodiack_state::sound_nmi_gen)
|
|||||||
m_audiocpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
|
m_audiocpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void zodiack_state::master_soundlatch_w(uint8_t data)
|
|
||||||
{
|
|
||||||
m_soundlatch->write(data);
|
|
||||||
m_audiocpu->set_input_line(0, HOLD_LINE);
|
|
||||||
}
|
|
||||||
|
|
||||||
void zodiack_state::control_w(uint8_t data)
|
void zodiack_state::control_w(uint8_t data)
|
||||||
{
|
{
|
||||||
// Bit 0-1 - coin counters
|
// Bit 0-1 - coin counters
|
||||||
@ -196,10 +199,11 @@ void zodiack_state::main_map(address_map &map)
|
|||||||
map(0x6082, 0x6082).portr("DSW1");
|
map(0x6082, 0x6082).portr("DSW1");
|
||||||
map(0x6083, 0x6083).portr("IN0");
|
map(0x6083, 0x6083).portr("IN0");
|
||||||
map(0x6084, 0x6084).portr("IN1");
|
map(0x6084, 0x6084).portr("IN1");
|
||||||
map(0x6090, 0x6090).r(m_soundlatch, FUNC(generic_latch_8_device::read)).w(FUNC(zodiack_state::master_soundlatch_w));
|
map(0x6090, 0x6090).r(m_soundlatch[1], FUNC(generic_latch_8_device::read)).w(m_soundlatch[0], FUNC(generic_latch_8_device::write));
|
||||||
map(0x7000, 0x7000).nopr().w("watchdog", FUNC(watchdog_timer_device::reset_w)); // NOP???
|
map(0x7000, 0x7000).rw("watchdog", FUNC(watchdog_timer_device::reset_r), FUNC(watchdog_timer_device::reset_w));
|
||||||
map(0x7100, 0x7100).w(FUNC(zodiack_state::nmi_mask_w));
|
map(0x7100, 0x7100).w(FUNC(zodiack_state::nmi_mask_w));
|
||||||
map(0x7200, 0x7200).w("videopcb", FUNC(orca_ovg_40c_device::flipscreen_w));
|
map(0x7200, 0x7200).w("videopcb", FUNC(orca_ovg_40c_device::flipscreen_w));
|
||||||
|
map(0x8000, 0x8000).w(FUNC(zodiack_state::irq_mask_w));
|
||||||
map(0x9000, 0x903f).ram().w("videopcb", FUNC(orca_ovg_40c_device::attributes_w)).share("videopcb:attributeram");
|
map(0x9000, 0x903f).ram().w("videopcb", FUNC(orca_ovg_40c_device::attributes_w)).share("videopcb:attributeram");
|
||||||
map(0x9040, 0x905f).ram().share("videopcb:spriteram");
|
map(0x9040, 0x905f).ram().share("videopcb:spriteram");
|
||||||
map(0x9060, 0x907f).ram().share("videopcb:bulletsram");
|
map(0x9060, 0x907f).ram().share("videopcb:bulletsram");
|
||||||
@ -214,7 +218,7 @@ void zodiack_state::sound_map(address_map &map)
|
|||||||
map(0x0000, 0x1fff).rom();
|
map(0x0000, 0x1fff).rom();
|
||||||
map(0x2000, 0x23ff).ram();
|
map(0x2000, 0x23ff).ram();
|
||||||
map(0x4000, 0x4000).w(FUNC(zodiack_state::sound_nmi_enable_w));
|
map(0x4000, 0x4000).w(FUNC(zodiack_state::sound_nmi_enable_w));
|
||||||
map(0x6000, 0x6000).rw(m_soundlatch, FUNC(generic_latch_8_device::read), FUNC(generic_latch_8_device::write));
|
map(0x6000, 0x6000).r(m_soundlatch[0], FUNC(generic_latch_8_device::read)).w(m_soundlatch[1], FUNC(generic_latch_8_device::write));
|
||||||
}
|
}
|
||||||
|
|
||||||
void zodiack_state::io_map(address_map &map)
|
void zodiack_state::io_map(address_map &map)
|
||||||
@ -538,14 +542,16 @@ INPUT_PORTS_END
|
|||||||
|
|
||||||
void zodiack_state::machine_start()
|
void zodiack_state::machine_start()
|
||||||
{
|
{
|
||||||
save_item(NAME(m_sound_nmi_enabled));
|
|
||||||
save_item(NAME(m_main_nmi_enabled));
|
save_item(NAME(m_main_nmi_enabled));
|
||||||
|
save_item(NAME(m_main_irq_enabled));
|
||||||
|
save_item(NAME(m_sound_nmi_enabled));
|
||||||
}
|
}
|
||||||
|
|
||||||
void zodiack_state::machine_reset()
|
void zodiack_state::machine_reset()
|
||||||
{
|
{
|
||||||
m_sound_nmi_enabled = 0;
|
|
||||||
m_main_nmi_enabled = 0;
|
m_main_nmi_enabled = 0;
|
||||||
|
m_main_irq_enabled = 0;
|
||||||
|
m_sound_nmi_enabled = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -555,16 +561,18 @@ void zodiack_state::zodiack(machine_config &config)
|
|||||||
// basic machine hardware
|
// basic machine hardware
|
||||||
Z80(config, m_maincpu, XTAL(18'432'000) / 6);
|
Z80(config, m_maincpu, XTAL(18'432'000) / 6);
|
||||||
m_maincpu->set_addrmap(AS_PROGRAM, &zodiack_state::main_map);
|
m_maincpu->set_addrmap(AS_PROGRAM, &zodiack_state::main_map);
|
||||||
m_maincpu->set_periodic_int(FUNC(zodiack_state::irq0_line_hold), attotime::from_hz(1 * 60)); // sound related - unknown source, timing is guessed
|
|
||||||
|
|
||||||
Z80(config, m_audiocpu, XTAL(18'432'000) / 6);
|
Z80(config, m_audiocpu, XTAL(18'432'000) / 6);
|
||||||
m_audiocpu->set_addrmap(AS_PROGRAM, &zodiack_state::sound_map);
|
m_audiocpu->set_addrmap(AS_PROGRAM, &zodiack_state::sound_map);
|
||||||
m_audiocpu->set_addrmap(AS_IO, &zodiack_state::io_map);
|
m_audiocpu->set_addrmap(AS_IO, &zodiack_state::io_map);
|
||||||
m_audiocpu->set_periodic_int(FUNC(zodiack_state::sound_nmi_gen), attotime::from_hz(8 * 60)); // sound tempo - unknown source, timing is guessed
|
m_audiocpu->set_periodic_int(FUNC(zodiack_state::sound_nmi_gen), attotime::from_hz(8 * 60)); // sound tempo - unknown source, timing is guessed
|
||||||
|
|
||||||
|
config.set_maximum_quantum(attotime::from_hz(600));
|
||||||
|
|
||||||
WATCHDOG_TIMER(config, "watchdog");
|
WATCHDOG_TIMER(config, "watchdog");
|
||||||
|
|
||||||
SCREEN(config, "screen", SCREEN_TYPE_RASTER).screen_vblank().set(FUNC(zodiack_state::vblank_main_nmi_w));
|
// video hardware
|
||||||
|
SCREEN(config, "screen", SCREEN_TYPE_RASTER).screen_vblank().set(FUNC(zodiack_state::vblank));
|
||||||
|
|
||||||
orca_ovg_40c_device &videopcb(ORCA_OVG_40C(config, "videopcb", 0));
|
orca_ovg_40c_device &videopcb(ORCA_OVG_40C(config, "videopcb", 0));
|
||||||
videopcb.set_screen("screen");
|
videopcb.set_screen("screen");
|
||||||
@ -572,7 +580,10 @@ void zodiack_state::zodiack(machine_config &config)
|
|||||||
// sound hardware
|
// sound hardware
|
||||||
SPEAKER(config, "mono").front_center();
|
SPEAKER(config, "mono").front_center();
|
||||||
|
|
||||||
GENERIC_LATCH_8(config, m_soundlatch);
|
GENERIC_LATCH_8(config, m_soundlatch[0]);
|
||||||
|
m_soundlatch[0]->data_pending_callback().set_inputline(m_audiocpu, 0);
|
||||||
|
|
||||||
|
GENERIC_LATCH_8(config, m_soundlatch[1]);
|
||||||
|
|
||||||
AY8910(config, "aysnd", XTAL(18'432'000) / 12).add_route(ALL_OUTPUTS, "mono", 0.50);
|
AY8910(config, "aysnd", XTAL(18'432'000) / 12).add_route(ALL_OUTPUTS, "mono", 0.50);
|
||||||
}
|
}
|
||||||
@ -585,11 +596,20 @@ void zodiack_state::percuss(machine_config &config)
|
|||||||
videopcb.set_percuss_hardware(true);
|
videopcb.set_percuss_hardware(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void zodiack_state::dogfight(machine_config &config)
|
||||||
|
{
|
||||||
|
zodiack(config);
|
||||||
|
|
||||||
|
m_audiocpu->set_periodic_int(FUNC(zodiack_state::sound_nmi_gen), attotime::from_hz(4 * 60)); // 4 interrupts per frame
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
|
|
||||||
Game driver(s)
|
Game driver(s)
|
||||||
|
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
ROM_START( zodiack )
|
ROM_START( zodiack )
|
||||||
ROM_REGION( 0x10000, "maincpu", 0 )
|
ROM_REGION( 0x10000, "maincpu", 0 )
|
||||||
ROM_LOAD( "ovg30c.2", 0x0000, 0x2000, CRC(a2125e99) SHA1(00ae4ed2c7b6895d2dc58aa2fc51c25b6428e4ba) )
|
ROM_LOAD( "ovg30c.2", 0x0000, 0x2000, CRC(a2125e99) SHA1(00ae4ed2c7b6895d2dc58aa2fc51c25b6428e4ba) )
|
||||||
@ -715,9 +735,9 @@ ROM_END
|
|||||||
} // anonymous namespace
|
} // anonymous namespace
|
||||||
|
|
||||||
|
|
||||||
GAME( 1983, zodiack, 0, zodiack, zodiack, zodiack_state, empty_init, ROT270, "Orca (Esco Trading Co., Inc. license)", "Zodiack", MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE ) /* bullet color needs to be verified */
|
GAME( 1983, zodiack, 0, zodiack, zodiack, zodiack_state, empty_init, ROT270, "Orca (Esco Trading Co., Inc. license)", "Zodiack", MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE ) // bullet color needs to be verified
|
||||||
GAME( 1983, dogfight, 0, zodiack, dogfight, zodiack_state, empty_init, ROT270, "Orca / Thunderbolt", "Dog Fight (Thunderbolt)", MACHINE_IMPERFECT_COLORS | MACHINE_SUPPORTS_SAVE ) /* bullet color needs to be verified */
|
GAME( 1983, dogfight, 0, dogfight, dogfight, zodiack_state, empty_init, ROT270, "Orca / Thunderbolt", "Dog Fight (Thunderbolt)", MACHINE_SUPPORTS_SAVE )
|
||||||
GAME( 1982, moguchan, 0, percuss, moguchan, zodiack_state, empty_init, ROT270, "Orca (Eastern Commerce Inc. license)", "Mogu Chan (bootleg?)", MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE ) /* license copyright taken from ROM string at $0b5c */
|
GAME( 1982, moguchan, 0, percuss, moguchan, zodiack_state, empty_init, ROT270, "Orca (Eastern Commerce Inc. license)", "Mogu Chan (bootleg?)", MACHINE_WRONG_COLORS | MACHINE_SUPPORTS_SAVE ) // license copyright taken from ROM string at $0b5c
|
||||||
GAME( 1981, percuss, 0, percuss, percuss, zodiack_state, empty_init, ROT270, "Orca", "The Percussor", MACHINE_SUPPORTS_SAVE )
|
GAME( 1981, percuss, 0, percuss, percuss, zodiack_state, empty_init, ROT270, "Orca", "The Percussor", MACHINE_SUPPORTS_SAVE )
|
||||||
GAME( 1982, bounty, 0, percuss, bounty, zodiack_state, empty_init, ROT180, "Orca", "The Bounty (set 1)", MACHINE_SUPPORTS_SAVE )
|
GAME( 1982, bounty, 0, percuss, bounty, zodiack_state, empty_init, ROT180, "Orca", "The Bounty (set 1)", MACHINE_SUPPORTS_SAVE )
|
||||||
GAME( 1982, bounty2, bounty, percuss, bounty, zodiack_state, empty_init, ROT180, "Orca", "The Bounty (set 2)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // seems to use a different memory map
|
GAME( 1982, bounty2, bounty, percuss, bounty, zodiack_state, empty_init, ROT180, "Orca", "The Bounty (set 2)", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) // seems to use a different memory map
|
||||||
|
Loading…
Reference in New Issue
Block a user