snk: add more side effect checks, tangramq: add sound nmi clear

This commit is contained in:
hap 2024-11-13 13:07:12 +01:00
parent 4c66f371a2
commit 3b9de40b0e
4 changed files with 103 additions and 108 deletions

View File

@ -18,15 +18,15 @@ DEFINE_DEVICE_TYPE(SNKWAVE, snkwave_device, "snkwave", "SNK Wave")
// snkwave_device - constructor
//-------------------------------------------------
snkwave_device::snkwave_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, SNKWAVE, tag, owner, clock),
device_sound_interface(mconfig, *this),
m_stream(nullptr),
m_external_clock(0),
m_sample_rate(0),
m_frequency(0),
m_counter(0),
m_waveform_position(0)
snkwave_device::snkwave_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, SNKWAVE, tag, owner, clock),
device_sound_interface(mconfig, *this),
m_stream(nullptr),
m_external_clock(0),
m_sample_rate(0),
m_frequency(0),
m_counter(0),
m_waveform_position(0)
{
std::fill(std::begin(m_waveform), std::end(m_waveform), 0);
}

View File

@ -260,6 +260,30 @@ void cclimber_state::machine_start()
save_item(NAME(m_nmi_mask));
}
void cclimber_state::nmi_mask_w(int state)
{
m_nmi_mask = state;
}
void cclimber_state::vblank_irq(int state)
{
if (state && m_nmi_mask)
m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
}
void cclimber_state::bagmanf_vblank_irq(int state)
{
if (state && m_nmi_mask)
m_maincpu->set_input_line(0, HOLD_LINE);
}
void cclimber_state::tangramq_sound_nmi_clear_w(uint8_t data)
{
m_audiocpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
}
void swimmer_state::swimmer_sh_soundlatch_w(uint8_t data)
{
m_soundlatch->write(data);
@ -312,19 +336,6 @@ void toprollr_state::toprollr_rombank_w(int state)
}
void cclimber_state::nmi_mask_w(int state)
{
m_nmi_mask = state;
}
uint8_t cclimber_state::bagmanf_a000_r()
{
// Should this actually use the same PAL16R6 as the parent set?
return 0x3f;
}
/* Note that River Patrol reads/writes to a000-a4f0. This is a bug in the code.
The instruction at 0x0593 should say LD DE,$8000 */
@ -493,7 +504,7 @@ void cclimber_state::bagmanf_map(address_map &map)
map(0x9800, 0x9800).portr("SYSTEM");
map(0x98dc, 0x98df).ram().share("bigspritectrl"); // wrong
map(0x9c00, 0x9fff).ram(); // not used, but initialized
map(0xa000, 0xa000).r(FUNC(cclimber_state::bagmanf_a000_r));
map(0xa000, 0xa000).lr8(NAME([]() { return 0x3f; })); // should this actually use the same PAL16R6 as the parent set?
map(0xa000, 0xa007).w(m_mainlatch, FUNC(ls259_device::write_d0));
map(0xa800, 0xa800).nopr().w("cclimber_audio", FUNC(cclimber_audio_device::sample_rate_w));
map(0xb000, 0xb000).portr("DSW").w("cclimber_audio", FUNC(cclimber_audio_device::sample_volume_w));
@ -589,7 +600,7 @@ void cclimber_state::tangramq_sound_map(address_map &map)
map(0x8000, 0x8001).w("ay1", FUNC(ay8910_device::address_data_w));
map(0x8002, 0x8007).w("wave", FUNC(snkwave_device::snkwave_w));
map(0x8008, 0x8009).w("ay2", FUNC(ay8910_device::address_data_w));
map(0xa000, 0xa000).nopw(); // TODO: NMI related?
map(0xa000, 0xa000).w(FUNC(cclimber_state::tangramq_sound_nmi_clear_w));
map(0xe000, 0xe3ff).ram();
}
@ -840,8 +851,8 @@ static INPUT_PORTS_START( tangramq )
PORT_START("P1")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT )
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT )
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN )
@ -850,8 +861,8 @@ static INPUT_PORTS_START( tangramq )
PORT_START("P2")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_COCKTAIL
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_COCKTAIL
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY PORT_COCKTAIL
PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY PORT_COCKTAIL
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN )
@ -919,14 +930,8 @@ static INPUT_PORTS_START( tangramq )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START("SYSTEM2")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN2 )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0xf7, IP_ACTIVE_LOW, IPT_UNUSED )
INPUT_PORTS_END
static INPUT_PORTS_START( swimmer )
@ -1316,17 +1321,6 @@ static GFXDECODE_START( gfx_au )
GFXDECODE_ENTRY( "bigsprite", 0x0000, swimmer_charlayout, 0, 8 ) // big sprites
GFXDECODE_END
void cclimber_state::vblank_irq(int state)
{
if (state && m_nmi_mask)
m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
}
void cclimber_state::bagmanf_vblank_irq(int state)
{
if (state && m_nmi_mask)
m_maincpu->set_input_line(0, HOLD_LINE);
}
void cclimber_state::root(machine_config &config)
{
@ -1389,12 +1383,12 @@ void cclimber_state::tangramq(machine_config &config)
Z80(config, m_audiocpu, 8_MHz_XTAL / 2);
m_audiocpu->set_addrmap(AS_PROGRAM, &cclimber_state::tangramq_sound_map);
m_audiocpu->set_periodic_int(FUNC(cclimber_state::nmi_line_pulse), attotime::from_ticks(0x8000, 8_MHz_XTAL));
m_audiocpu->set_periodic_int(FUNC(cclimber_state::nmi_line_assert), attotime::from_ticks(0x4000, 8_MHz_XTAL / 2)); // 244Hz
// sound hardware
SPEAKER(config, "speaker").front_center();
GENERIC_LATCH_8(config, "soundlatch").data_pending_callback().set_inputline(m_audiocpu, 0, HOLD_LINE);
GENERIC_LATCH_8(config, "soundlatch").data_pending_callback().set_inputline(m_audiocpu, 0, HOLD_LINE); // auto ack
AY8910(config, "ay1", 8_MHz_XTAL / 4).add_route(ALL_OUTPUTS, "speaker", 0.35);
AY8910(config, "ay2", 8_MHz_XTAL / 4).add_route(ALL_OUTPUTS, "speaker", 0.35);
@ -2568,7 +2562,7 @@ ROM_START( tangramq )
ROM_REGION( 0x2000, "audiocpu", 0 )
ROM_LOAD( "s1.a6", 0x0000, 0x2000, CRC(05af38f6) SHA1(7bdbf798964aa4d603fca0178b3f8fc251d207f6) )
// BTANB?: colors look glitchy when in this order, but matches PCB reference and flyers
// BTANB?: bigsprite colors look glitchy when in this order, but matches PCB reference and flyers
ROM_REGION( 0x2000, "bigsprite", 0 )
ROM_LOAD( "b2.e17", 0x0000, 0x1000, CRC(77d21b84) SHA1(7f9bfbfbc7fd51a97f15fee54ac851ddfa97b213) ) // 1xxxxxxxxxxx = 0xFF
ROM_LOAD( "b1.e19", 0x1000, 0x1000, CRC(f3ec2562) SHA1(859473c45b9d22c138b70ea649b93d41721e1e0d) ) // 1xxxxxxxxxxx = 0xFF

View File

@ -97,8 +97,8 @@ private:
bool m_nmi_mask = false;
uint8_t bagmanf_a000_r();
void bagmanf_vblank_irq(int state);
void tangramq_sound_nmi_clear_w(uint8_t data);
void cclimber_palette(palette_device &palette) const;

View File

@ -700,10 +700,8 @@ void snk_state::machine_start()
uint8_t snk_state::snk_cpuA_nmi_trigger_r()
{
if(!machine().side_effects_disabled())
{
if (!machine().side_effects_disabled())
m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
}
return 0xff;
}
@ -714,10 +712,8 @@ void snk_state::snk_cpuA_nmi_ack_w(uint8_t data)
uint8_t snk_state::snk_cpuB_nmi_trigger_r()
{
if(!machine().side_effects_disabled())
{
if (!machine().side_effects_disabled())
m_subcpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
}
return 0xff;
}
@ -743,7 +739,8 @@ enum
uint8_t snk_state::marvins_sound_nmi_ack_r()
{
m_audiocpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
if (!machine().side_effects_disabled())
m_audiocpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
return 0xff;
}
@ -778,19 +775,22 @@ void snk_state::sgladiat_soundlatch_w(uint8_t data)
uint8_t snk_state::sgladiat_soundlatch_r()
{
machine().scheduler().synchronize(timer_expired_delegate(FUNC(snk_state::sgladiat_sndirq_update_callback),this), BUSY_CLEAR);
if (!machine().side_effects_disabled())
machine().scheduler().synchronize(timer_expired_delegate(FUNC(snk_state::sgladiat_sndirq_update_callback),this), BUSY_CLEAR);
return m_soundlatch->read();
}
uint8_t snk_state::sgladiat_sound_nmi_ack_r()
{
machine().scheduler().synchronize(timer_expired_delegate(FUNC(snk_state::sgladiat_sndirq_update_callback),this), CMDIRQ_CLEAR);
if (!machine().side_effects_disabled())
machine().scheduler().synchronize(timer_expired_delegate(FUNC(snk_state::sgladiat_sndirq_update_callback),this), CMDIRQ_CLEAR);
return 0xff;
}
uint8_t snk_state::sgladiat_sound_irq_ack_r()
{
m_audiocpu->set_input_line(0, CLEAR_LINE);
if (!machine().side_effects_disabled())
m_audiocpu->set_input_line(0, CLEAR_LINE);
return 0xff;
}
@ -903,20 +903,23 @@ void snk_state::snk_sound_status_w(uint8_t data)
uint8_t snk_state::tnk3_cmdirq_ack_r()
{
machine().scheduler().synchronize(timer_expired_delegate(FUNC(snk_state::sndirq_update_callback),this), CMDIRQ_CLEAR);
if (!machine().side_effects_disabled())
machine().scheduler().synchronize(timer_expired_delegate(FUNC(snk_state::sndirq_update_callback),this), CMDIRQ_CLEAR);
return 0xff;
}
uint8_t snk_state::tnk3_ymirq_ack_r()
{
machine().scheduler().synchronize(timer_expired_delegate(FUNC(snk_state::sndirq_update_callback),this), YM1IRQ_CLEAR);
if (!machine().side_effects_disabled())
machine().scheduler().synchronize(timer_expired_delegate(FUNC(snk_state::sndirq_update_callback),this), YM1IRQ_CLEAR);
return 0xff;
}
uint8_t snk_state::tnk3_busy_clear_r()
{
// it's uncertain whether the latch should be cleared here or when it's read
m_soundlatch->clear_w();
if (!machine().side_effects_disabled())
m_soundlatch->clear_w();
machine().scheduler().synchronize(timer_expired_delegate(FUNC(snk_state::sndirq_update_callback),this), BUSY_CLEAR);
return 0xff;
}
@ -939,7 +942,6 @@ A trojan could be used on the board to verify the exact behaviour.
*****************************************************************************/
void snk_state::hardflags_scrollx_w(uint8_t data)
{
m_hf_posx = (m_hf_posx & ~0xff) | data;
@ -986,12 +988,12 @@ int snk_state::hardflags_check8(int num)
(hardflags_check(num + 7) << 7);
}
uint8_t snk_state::hardflags1_r(){ return hardflags_check8(0*8); }
uint8_t snk_state::hardflags2_r(){ return hardflags_check8(1*8); }
uint8_t snk_state::hardflags3_r(){ return hardflags_check8(2*8); }
uint8_t snk_state::hardflags4_r(){ return hardflags_check8(3*8); }
uint8_t snk_state::hardflags5_r(){ return hardflags_check8(4*8); }
uint8_t snk_state::hardflags6_r(){ return hardflags_check8(5*8); }
uint8_t snk_state::hardflags1_r() { return hardflags_check8(0*8); }
uint8_t snk_state::hardflags2_r() { return hardflags_check8(1*8); }
uint8_t snk_state::hardflags3_r() { return hardflags_check8(2*8); }
uint8_t snk_state::hardflags4_r() { return hardflags_check8(3*8); }
uint8_t snk_state::hardflags5_r() { return hardflags_check8(4*8); }
uint8_t snk_state::hardflags6_r() { return hardflags_check8(5*8); }
uint8_t snk_state::hardflags7_r()
{
// apparently the startup tests use bits 0&1 while the game uses bits 4&5
@ -1019,7 +1021,6 @@ A trojan could be used on the board to verify the exact behaviour.
*****************************************************************************/
void snk_state::turbocheck16_1_w(uint8_t data)
{
m_tc16_posy = (m_tc16_posy & ~0xff) | data;
@ -1078,18 +1079,18 @@ int snk_state::turbofront_check8(int small, int num)
(turbofront_check(small, num + 7) << 7);
}
uint8_t snk_state::turbocheck16_1_r(){ return turbofront_check8(1, 0*8); }
uint8_t snk_state::turbocheck16_2_r(){ return turbofront_check8(1, 1*8); }
uint8_t snk_state::turbocheck16_3_r(){ return turbofront_check8(1, 2*8); }
uint8_t snk_state::turbocheck16_4_r(){ return turbofront_check8(1, 3*8); }
uint8_t snk_state::turbocheck16_5_r(){ return turbofront_check8(1, 4*8); }
uint8_t snk_state::turbocheck16_6_r(){ return turbofront_check8(1, 5*8); }
uint8_t snk_state::turbocheck16_7_r(){ return turbofront_check8(1, 6*8); }
uint8_t snk_state::turbocheck16_8_r(){ return turbofront_check8(1, 7*8); }
uint8_t snk_state::turbocheck32_1_r(){ return turbofront_check8(0, 0*8); }
uint8_t snk_state::turbocheck32_2_r(){ return turbofront_check8(0, 1*8); }
uint8_t snk_state::turbocheck32_3_r(){ return turbofront_check8(0, 2*8); }
uint8_t snk_state::turbocheck32_4_r(){ return turbofront_check8(0, 3*8); }
uint8_t snk_state::turbocheck16_1_r() { return turbofront_check8(1, 0*8); }
uint8_t snk_state::turbocheck16_2_r() { return turbofront_check8(1, 1*8); }
uint8_t snk_state::turbocheck16_3_r() { return turbofront_check8(1, 2*8); }
uint8_t snk_state::turbocheck16_4_r() { return turbofront_check8(1, 3*8); }
uint8_t snk_state::turbocheck16_5_r() { return turbofront_check8(1, 4*8); }
uint8_t snk_state::turbocheck16_6_r() { return turbofront_check8(1, 5*8); }
uint8_t snk_state::turbocheck16_7_r() { return turbofront_check8(1, 6*8); }
uint8_t snk_state::turbocheck16_8_r() { return turbofront_check8(1, 7*8); }
uint8_t snk_state::turbocheck32_1_r() { return turbofront_check8(0, 0*8); }
uint8_t snk_state::turbocheck32_2_r() { return turbofront_check8(0, 1*8); }
uint8_t snk_state::turbocheck32_3_r() { return turbofront_check8(0, 2*8); }
uint8_t snk_state::turbocheck32_4_r() { return turbofront_check8(0, 3*8); }
@ -4033,18 +4034,18 @@ GFXDECODE_END
void snk_state::marvins(machine_config &config)
{
/* basic machine hardware */
Z80(config, m_maincpu, 3360000); /* 3.36 MHz */
Z80(config, m_maincpu, 3360000); // 3.36 MHz
m_maincpu->set_addrmap(AS_PROGRAM, &snk_state::marvins_cpuA_map);
m_maincpu->set_vblank_int("screen", FUNC(snk_state::irq0_line_hold));
Z80(config, m_subcpu, 3360000); /* 3.36 MHz */
Z80(config, m_subcpu, 3360000); // 3.36 MHz
m_subcpu->set_addrmap(AS_PROGRAM, &snk_state::marvins_cpuB_map);
m_subcpu->set_vblank_int("screen", FUNC(snk_state::irq0_line_hold));
Z80(config, m_audiocpu, 4000000); /* verified on schematics */
Z80(config, m_audiocpu, 8_MHz_XTAL/2); // verified on schematics
m_audiocpu->set_addrmap(AS_PROGRAM, &snk_state::marvins_sound_map);
m_audiocpu->set_addrmap(AS_IO, &snk_state::marvins_sound_portmap);
m_audiocpu->set_periodic_int(FUNC(snk_state::nmi_line_assert), attotime::from_hz(244)); // schematics show a separate 244Hz timer
m_audiocpu->set_periodic_int(FUNC(snk_state::nmi_line_assert), attotime::from_ticks(0x4000, 8_MHz_XTAL/2)); // 244Hz
config.set_maximum_quantum(attotime::from_hz(6000));
@ -4067,11 +4068,11 @@ void snk_state::marvins(machine_config &config)
SPEAKER(config, "mono").front_center();
GENERIC_LATCH_8(config, m_soundlatch);
m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, 0, HOLD_LINE);
m_soundlatch->data_pending_callback().set_inputline(m_audiocpu, 0, HOLD_LINE); // auto ack
AY8910(config, "ay1", 2000000).add_route(ALL_OUTPUTS, "mono", 0.35); /* verified on schematics */
AY8910(config, "ay2", 2000000).add_route(ALL_OUTPUTS, "mono", 0.35);/* verified on schematics */
SNKWAVE(config, "wave", 8000000).add_route(ALL_OUTPUTS, "mono", 0.30); /* verified on schematics */
AY8910(config, "ay1", 8_MHz_XTAL/4).add_route(ALL_OUTPUTS, "mono", 0.35); // verified on schematics
AY8910(config, "ay2", 8_MHz_XTAL/4).add_route(ALL_OUTPUTS, "mono", 0.35); // verified on schematics
SNKWAVE(config, "wave", 8_MHz_XTAL).add_route(ALL_OUTPUTS, "mono", 0.30); // verified on schematics
}
void snk_state::vangrd2(machine_config &config)
@ -4168,15 +4169,15 @@ void snk_state::hal21(machine_config &config)
void snk_state::tnk3(machine_config &config)
{
/* basic machine hardware */
Z80(config, m_maincpu, XTAL(13'400'000)/4); /* verified on pcb */
Z80(config, m_maincpu, 13.4_MHz_XTAL/4); /* verified on pcb */
m_maincpu->set_addrmap(AS_PROGRAM, &snk_state::tnk3_cpuA_map);
m_maincpu->set_vblank_int("screen", FUNC(snk_state::irq0_line_hold));
Z80(config, m_subcpu, XTAL(13'400'000)/4); /* verified on pcb */
Z80(config, m_subcpu, 13.4_MHz_XTAL/4); /* verified on pcb */
m_subcpu->set_addrmap(AS_PROGRAM, &snk_state::tnk3_cpuB_map);
m_subcpu->set_vblank_int("screen", FUNC(snk_state::irq0_line_hold));
Z80(config, m_audiocpu, XTAL(8'000'000)/2); /* verified on pcb */
Z80(config, m_audiocpu, 8_MHz_XTAL/2); /* verified on pcb */
m_audiocpu->set_addrmap(AS_PROGRAM, &snk_state::tnk3_YM3526_sound_map);
config.set_maximum_quantum(attotime::from_hz(6000));
@ -4201,7 +4202,7 @@ void snk_state::tnk3(machine_config &config)
GENERIC_LATCH_8(config, m_soundlatch);
ym3526_device &ym1(YM3526(config, "ym1", XTAL(8'000'000)/2)); /* verified on pcb */
ym3526_device &ym1(YM3526(config, "ym1", 8_MHz_XTAL/2)); /* verified on pcb */
ym1.irq_handler().set(FUNC(snk_state::ymirq_callback_1));
ym1.add_route(ALL_OUTPUTS, "mono", 2.0);
}
@ -4227,7 +4228,7 @@ void snk_state::athena(machine_config &config)
m_audiocpu->set_addrmap(AS_PROGRAM, &snk_state::YM3526_YM3526_sound_map);
/* sound hardware */
ym3526_device &ym2(YM3526(config, "ym2", XTAL(8'000'000)/2)); /* verified on pcb */
ym3526_device &ym2(YM3526(config, "ym2", 8_MHz_XTAL/2)); /* verified on pcb */
ym2.irq_handler().set(FUNC(snk_state::ymirq_callback_2));
ym2.add_route(ALL_OUTPUTS, "mono", 2.0);
}
@ -4241,7 +4242,7 @@ void snk_state::fitegolf(machine_config &config)
m_audiocpu->set_addrmap(AS_PROGRAM, &snk_state::YM3812_sound_map);
/* sound hardware */
ym3812_device &ym1(YM3812(config.replace(), "ym1", XTAL(4'000'000))); /* verified on pcb */
ym3812_device &ym1(YM3812(config.replace(), "ym1", 4_MHz_XTAL)); /* verified on pcb */
ym1.irq_handler().set(FUNC(snk_state::ymirq_callback_1));
ym1.add_route(ALL_OUTPUTS, "mono", 2.0);
}
@ -4261,15 +4262,15 @@ void snk_state::countryc(machine_config &config)
void snk_state::ikari(machine_config &config)
{
/* basic machine hardware */
Z80(config, m_maincpu, XTAL(13'400'000)/4); /* verified on pcb */
Z80(config, m_maincpu, 13.4_MHz_XTAL/4); /* verified on pcb */
m_maincpu->set_addrmap(AS_PROGRAM, &snk_state::ikari_cpuA_map);
m_maincpu->set_vblank_int("screen", FUNC(snk_state::irq0_line_hold));
Z80(config, m_subcpu, XTAL(13'400'000)/4); /* verified on pcb */
Z80(config, m_subcpu, 13.4_MHz_XTAL/4); /* verified on pcb */
m_subcpu->set_addrmap(AS_PROGRAM, &snk_state::ikari_cpuB_map);
m_subcpu->set_vblank_int("screen", FUNC(snk_state::irq0_line_hold));
Z80(config, m_audiocpu, XTAL(8'000'000)/2); /* verified on pcb */
Z80(config, m_audiocpu, 8_MHz_XTAL/2); /* verified on pcb */
m_audiocpu->set_addrmap(AS_PROGRAM, &snk_state::YM3526_YM3526_sound_map);
config.set_maximum_quantum(attotime::from_hz(6000));
@ -4293,11 +4294,11 @@ void snk_state::ikari(machine_config &config)
GENERIC_LATCH_8(config, m_soundlatch);
ym3526_device &ym1(YM3526(config, "ym1", XTAL(8'000'000)/2)); /* verified on pcb */
ym3526_device &ym1(YM3526(config, "ym1", 8_MHz_XTAL/2)); /* verified on pcb */
ym1.irq_handler().set(FUNC(snk_state::ymirq_callback_1));
ym1.add_route(ALL_OUTPUTS, "mono", 2.0);
ym3526_device &ym2(YM3526(config, "ym2", XTAL(8'000'000)/2)); /* verified on pcb */
ym3526_device &ym2(YM3526(config, "ym2", 8_MHz_XTAL/2)); /* verified on pcb */
ym2.irq_handler().set(FUNC(snk_state::ymirq_callback_2));
ym2.add_route(ALL_OUTPUTS, "mono", 2.0);
}
@ -4310,7 +4311,7 @@ void snk_state::victroad(machine_config &config)
m_audiocpu->set_addrmap(AS_PROGRAM, &snk_state::YM3526_Y8950_sound_map);
/* sound hardware */
y8950_device &ym2(Y8950(config.replace(), "ym2", XTAL(8'000'000)/2)); /* verified on pcb */
y8950_device &ym2(Y8950(config.replace(), "ym2", 8_MHz_XTAL/2)); /* verified on pcb */
ym2.irq_handler().set(FUNC(snk_state::ymirq_callback_2));
ym2.add_route(ALL_OUTPUTS, "mono", 2.0);
}
@ -4318,15 +4319,15 @@ void snk_state::victroad(machine_config &config)
void snk_state::bermudat(machine_config &config)
{
/* basic machine hardware */
Z80(config, m_maincpu, XTAL(8'000'000)/2); /* verified on pcb */
Z80(config, m_maincpu, 8_MHz_XTAL/2); /* verified on pcb */
m_maincpu->set_addrmap(AS_PROGRAM, &snk_state::bermudat_cpuA_map);
m_maincpu->set_vblank_int("screen", FUNC(snk_state::irq0_line_hold));
Z80(config, m_subcpu, XTAL(8'000'000)/2); /* verified on pcb */
Z80(config, m_subcpu, 8_MHz_XTAL/2); /* verified on pcb */
m_subcpu->set_addrmap(AS_PROGRAM, &snk_state::bermudat_cpuB_map);
m_subcpu->set_vblank_int("screen", FUNC(snk_state::irq0_line_hold));
Z80(config, m_audiocpu, XTAL(8'000'000)/2); /* verified on pcb */
Z80(config, m_audiocpu, 8_MHz_XTAL/2); /* verified on pcb */
m_audiocpu->set_addrmap(AS_PROGRAM, &snk_state::YM3526_Y8950_sound_map);
config.set_maximum_quantum(attotime::from_hz(24000));
@ -4350,11 +4351,11 @@ void snk_state::bermudat(machine_config &config)
GENERIC_LATCH_8(config, m_soundlatch);
ym3526_device &ym1(YM3526(config, "ym1", XTAL(8'000'000)/2)); /* verified on pcb */
ym3526_device &ym1(YM3526(config, "ym1", 8_MHz_XTAL/2)); /* verified on pcb */
ym1.irq_handler().set(FUNC(snk_state::ymirq_callback_1));
ym1.add_route(ALL_OUTPUTS, "mono", 2.0);
y8950_device &ym2(Y8950(config, "ym2", XTAL(8'000'000)/2)); /* verified on pcb */
y8950_device &ym2(Y8950(config, "ym2", 8_MHz_XTAL/2)); /* verified on pcb */
ym2.irq_handler().set(FUNC(snk_state::ymirq_callback_2));
ym2.add_route(ALL_OUTPUTS, "mono", 2.0);
}