shared/seibusound.cpp: Read coin inputs through sound device. (#13450)

Coin inputs are read through the sound MCU, so this documents the connections better and allows fake I/O ports to be removed.

Also cleaned up code and improved tags.
This commit is contained in:
cam900 2025-03-13 00:39:27 +09:00 committed by GitHub
parent 515a8c31e8
commit e7ae0c266c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
17 changed files with 127 additions and 106 deletions

View File

@ -1795,9 +1795,6 @@ static INPUT_PORTS_START( mustang )
PORT_DIPSETTING( 0xc000, "3" )
PORT_DIPSETTING( 0x8000, "4" )
PORT_DIPSETTING( 0x0000, "5" )
PORT_START("COIN") // referenced by Seibu sound board
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN )
INPUT_PORTS_END
static INPUT_PORTS_START( hachamf_prot )
@ -2092,13 +2089,6 @@ static INPUT_PORTS_START( strahl )
PORT_SERVICE_DIPLOC( 0x80, IP_ACTIVE_LOW, "SW2:8" )
INPUT_PORTS_END
static INPUT_PORTS_START( strahljbl )
PORT_INCLUDE(strahl)
PORT_START("COIN") // referenced by Seibu sound board
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN )
INPUT_PORTS_END
static INPUT_PORTS_START( acrobatm )
PORT_START("IN0")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_COIN1 )
@ -2205,9 +2195,6 @@ static INPUT_PORTS_START( acrobatmbl )
PORT_DIPSETTING( 0x6000, DEF_STR( 1C_2C ) )
PORT_DIPSETTING( 0xa000, DEF_STR( 1C_3C ) )
PORT_DIPSETTING( 0x2000, DEF_STR( 1C_4C ) )
PORT_START("COIN") // referenced by Seibu sound board
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN )
INPUT_PORTS_END
static INPUT_PORTS_START( bioship )
@ -2471,9 +2458,6 @@ static INPUT_PORTS_START( tdragonb )
PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unused ) ) PORT_DIPLOCATION("SW2:8") // The manual states this dip is "Unused"
PORT_DIPSETTING( 0x0080, DEF_STR( Off ) )
PORT_DIPSETTING( 0x0000, DEF_STR( On ) )
PORT_START("COIN") // referenced by Seibu sound board
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN )
INPUT_PORTS_END
static INPUT_PORTS_START( tdragonb2 )
@ -4669,8 +4653,9 @@ void nmk16_state::mustangb(machine_config &config)
seibu_sound_device &seibu_sound(SEIBU_SOUND(config, "seibu_sound", 0));
seibu_sound.int_callback().set_inputline(m_audiocpu, 0);
seibu_sound.coin_io_callback().set_constant(0xff); // unused
seibu_sound.set_rom_tag("audiocpu");
seibu_sound.set_rombank_tag("seibu_bank1");
seibu_sound.set_rombank_tag("seibu_bank");
seibu_sound.ym_read_callback().set("ymsnd", FUNC(ym3812_device::read));
seibu_sound.ym_write_callback().set("ymsnd", FUNC(ym3812_device::write));
}
@ -4888,8 +4873,9 @@ void nmk16_state::acrobatmbl(machine_config &config)
seibu_sound_device &seibu_sound(SEIBU_SOUND(config, "seibu_sound", 0));
seibu_sound.int_callback().set_inputline(m_audiocpu, 0);
seibu_sound.coin_io_callback().set_constant(0xff); // unused
seibu_sound.set_rom_tag("audiocpu");
seibu_sound.set_rombank_tag("seibu_bank1");
seibu_sound.set_rombank_tag("seibu_bank");
seibu_sound.ym_read_callback().set("ymsnd", FUNC(ym3812_device::read));
seibu_sound.ym_write_callback().set("ymsnd", FUNC(ym3812_device::write));
}
@ -4925,8 +4911,9 @@ void nmk16_state::tdragonb(machine_config &config) // bootleg using Raiden so
seibu_sound_device &seibu_sound(SEIBU_SOUND(config, "seibu_sound", 0));
seibu_sound.int_callback().set_inputline(m_audiocpu, 0);
seibu_sound.coin_io_callback().set_constant(0xff); // unused
seibu_sound.set_rom_tag("audiocpu");
seibu_sound.set_rombank_tag("seibu_bank1");
seibu_sound.set_rombank_tag("seibu_bank");
seibu_sound.ym_read_callback().set("ymsnd", FUNC(ym3812_device::read));
seibu_sound.ym_write_callback().set("ymsnd", FUNC(ym3812_device::write));
}
@ -5201,8 +5188,9 @@ void nmk16_state::strahljbl(machine_config &config)
seibu_sound_device &seibu_sound(SEIBU_SOUND(config, "seibu_sound", 0));
seibu_sound.int_callback().set_inputline(m_audiocpu, 0);
seibu_sound.coin_io_callback().set_constant(0xff); // unused
seibu_sound.set_rom_tag("audiocpu");
seibu_sound.set_rombank_tag("seibu_bank1");
seibu_sound.set_rombank_tag("seibu_bank");
seibu_sound.ym_read_callback().set("ymsnd", FUNC(ym3812_device::read));
seibu_sound.ym_write_callback().set("ymsnd", FUNC(ym3812_device::write));
}
@ -10632,7 +10620,7 @@ GAME( 1990, mustangb2, mustang, mustangb, mustang, nmk16_state, empty
GAME( 1991, acrobatmbl, acrobatm, acrobatmbl, acrobatmbl, nmk16_state, init_acrobatmbl, ROT270, "bootleg", "Acrobat Mission (bootleg with Raiden sounds)", 0 )
GAME( 1991, tdragonb, tdragon, tdragonb, tdragonb, nmk16_state, init_tdragonb, ROT270, "bootleg", "Thunder Dragon (bootleg with Raiden sounds, encrypted)", 0 )
GAME( 1991, tdragonb3, tdragon, tdragonb3, tdragonb, nmk16_state, empty_init, ROT270, "bootleg", "Thunder Dragon (bootleg with Raiden sounds, unencrypted)", 0 )
GAME( 1992, strahljbl, strahl, strahljbl, strahljbl, nmk16_state, empty_init, ROT0, "bootleg", "Koutetsu Yousai Strahl (Japan, bootleg)", 0 )
GAME( 1992, strahljbl, strahl, strahljbl, strahl, nmk16_state, empty_init, ROT0, "bootleg", "Koutetsu Yousai Strahl (Japan, bootleg)", 0 )
// these are bootlegs with tharrier like sound hw
GAME( 1990, mustangb3, mustang, mustangb3, mustang, nmk16_state, empty_init, ROT0, "bootleg (Lettering)", "US AAF Mustang (Lettering bootleg)", 0 )

View File

@ -284,7 +284,7 @@ void airraid_state::sound_map(address_map &map)
map(0x4008, 0x4009).rw(m_seibu_sound, FUNC(seibu_sound_device::ym_r), FUNC(seibu_sound_device::ym_w));
map(0x4010, 0x4011).r(m_seibu_sound, FUNC(seibu_sound_device::soundlatch_r));
map(0x4012, 0x4012).r(m_seibu_sound, FUNC(seibu_sound_device::main_data_pending_r));
map(0x4013, 0x4013).portr("COIN");
map(0x4013, 0x4013).r(m_seibu_sound, FUNC(seibu_sound_device::coin_r));
map(0x4018, 0x4019).w(m_seibu_sound, FUNC(seibu_sound_device::main_data_w));
map(0x401b, 0x401b).w(m_seibu_sound, FUNC(seibu_sound_device::coin_w));
map(0x8000, 0xffff).rom();
@ -449,6 +449,7 @@ void airraid_state::airraid(machine_config &config)
SEIBU_SOUND(config, m_seibu_sound, 0);
m_seibu_sound->int_callback().set_inputline(m_audiocpu, 0);
m_seibu_sound->coin_io_callback().set_ioport("COIN");
m_seibu_sound->set_rom_tag("audiocpu");
m_seibu_sound->ym_read_callback().set("ymsnd", FUNC(ym2151_device::read));
m_seibu_sound->ym_write_callback().set("ymsnd", FUNC(ym2151_device::write));

View File

@ -880,8 +880,9 @@ void bloodbro_state::bloodbro(machine_config &config)
SEIBU_SOUND(config, m_seibu_sound, 0);
m_seibu_sound->int_callback().set_inputline(m_audiocpu, 0);
m_seibu_sound->coin_io_callback().set_ioport("COIN");
m_seibu_sound->set_rom_tag("audiocpu");
m_seibu_sound->set_rombank_tag("seibu_bank1");
m_seibu_sound->set_rombank_tag("seibu_bank");
m_seibu_sound->ym_read_callback().set(m_ymsnd, FUNC(ym3812_device::read));
m_seibu_sound->ym_write_callback().set(m_ymsnd, FUNC(ym3812_device::write));
}

View File

@ -532,7 +532,7 @@ void cabal_state::sound_map(address_map &map)
map(0x4008, 0x4009).rw(m_seibu_sound, FUNC(seibu_sound_device::ym_r), FUNC(seibu_sound_device::ym_w));
map(0x4010, 0x4011).r(m_seibu_sound, FUNC(seibu_sound_device::soundlatch_r));
map(0x4012, 0x4012).r(m_seibu_sound, FUNC(seibu_sound_device::main_data_pending_r));
map(0x4013, 0x4013).portr("COIN");
map(0x4013, 0x4013).r(m_seibu_sound, FUNC(seibu_sound_device::coin_r));
map(0x4018, 0x4019).w(m_seibu_sound, FUNC(seibu_sound_device::main_data_w));
map(0x401a, 0x401a).w(m_adpcm[0], FUNC(seibu_adpcm_device::ctl_w));
map(0x401b, 0x401b).w(m_seibu_sound, FUNC(seibu_sound_device::coin_w));
@ -574,7 +574,7 @@ void cabal_state::cabalbl2_sound_map(address_map &map)
map(0x4008, 0x4009).rw(m_seibu_sound, FUNC(seibu_sound_device::ym_r), FUNC(seibu_sound_device::ym_w));
map(0x4010, 0x4011).r(m_seibu_sound, FUNC(seibu_sound_device::soundlatch_r));
map(0x4012, 0x4012).r(m_seibu_sound, FUNC(seibu_sound_device::main_data_pending_r));
map(0x4013, 0x4013).portr("COIN");
map(0x4013, 0x4013).r(m_seibu_sound, FUNC(seibu_sound_device::coin_r));
map(0x4018, 0x4019).w(m_seibu_sound, FUNC(seibu_sound_device::main_data_w));
map(0x401a, 0x401a).w(m_adpcm[0], FUNC(seibu_adpcm_device::ctl_w));
map(0x401b, 0x401b).w(m_seibu_sound, FUNC(seibu_sound_device::coin_w));
@ -870,6 +870,7 @@ void cabal_state::cabal(machine_config &config)
// sound hardware
SEIBU_SOUND(config, m_seibu_sound, 0);
m_seibu_sound->int_callback().set_inputline(m_audiocpu, 0);
m_seibu_sound->coin_io_callback().set_ioport("COIN");
m_seibu_sound->set_rom_tag("audiocpu");
m_seibu_sound->ym_read_callback().set("ymsnd", FUNC(ym2151_device::read));
m_seibu_sound->ym_write_callback().set("ymsnd", FUNC(ym2151_device::write));

View File

@ -573,8 +573,9 @@ void dcon_state::dcon(machine_config &config)
SEIBU_SOUND(config, m_seibu_sound, 0);
m_seibu_sound->int_callback().set_inputline("audiocpu", 0);
m_seibu_sound->coin_io_callback().set_ioport("COIN");
m_seibu_sound->set_rom_tag("audiocpu");
m_seibu_sound->set_rombank_tag("seibu_bank1");
m_seibu_sound->set_rombank_tag("seibu_bank");
m_seibu_sound->ym_read_callback().set("ymsnd", FUNC(ym3812_device::read));
m_seibu_sound->ym_write_callback().set("ymsnd", FUNC(ym3812_device::write));
}
@ -622,8 +623,9 @@ void dcon_state::sdgndmps(machine_config &config) // PCB number is PB91008
SEIBU_SOUND(config, m_seibu_sound, 0);
m_seibu_sound->int_callback().set_inputline("audiocpu", 0);
m_seibu_sound->coin_io_callback().set_ioport("COIN");
m_seibu_sound->set_rom_tag("audiocpu");
m_seibu_sound->set_rombank_tag("seibu_bank1");
m_seibu_sound->set_rombank_tag("seibu_bank");
m_seibu_sound->ym_read_callback().set("ymsnd", FUNC(ym2151_device::read));
m_seibu_sound->ym_write_callback().set("ymsnd", FUNC(ym2151_device::write));
}

View File

@ -562,14 +562,14 @@ void deadang_state::sound_map(address_map &map)
map(0x4008, 0x4009).rw(m_seibu_sound, FUNC(seibu_sound_device::ym_r), FUNC(seibu_sound_device::ym_w));
map(0x4010, 0x4011).r(m_seibu_sound, FUNC(seibu_sound_device::soundlatch_r));
map(0x4012, 0x4012).r(m_seibu_sound, FUNC(seibu_sound_device::main_data_pending_r));
map(0x4013, 0x4013).portr("COIN");
map(0x4013, 0x4013).r(m_seibu_sound, FUNC(seibu_sound_device::coin_r));
map(0x4018, 0x4019).w(m_seibu_sound, FUNC(seibu_sound_device::main_data_w));
map(0x401a, 0x401a).w(m_adpcm[0], FUNC(seibu_adpcm_device::ctl_w));
map(0x401b, 0x401b).w(m_seibu_sound, FUNC(seibu_sound_device::coin_w));
map(0x6005, 0x6006).w(m_adpcm[1], FUNC(seibu_adpcm_device::adr_w));
map(0x6008, 0x6009).rw("ym2", FUNC(ym2203_device::read), FUNC(ym2203_device::write));
map(0x601a, 0x601a).w(m_adpcm[1], FUNC(seibu_adpcm_device::ctl_w));
map(0x8000, 0xffff).bankr("seibu_bank1");
map(0x8000, 0xffff).bankr("seibu_bank");
}
// Air Raid sound config with extra ROM bank
@ -585,16 +585,16 @@ void popnrun_state::sound_map(address_map &map)
map(0x4008, 0x4009).rw(m_seibu_sound, FUNC(seibu_sound_device::ym_r), FUNC(seibu_sound_device::ym_w));
map(0x4010, 0x4011).r(m_seibu_sound, FUNC(seibu_sound_device::soundlatch_r));
map(0x4012, 0x4012).r(m_seibu_sound, FUNC(seibu_sound_device::main_data_pending_r));
map(0x4013, 0x4013).portr("COIN");
map(0x4013, 0x4013).r(m_seibu_sound, FUNC(seibu_sound_device::coin_r));
map(0x4018, 0x4019).w(m_seibu_sound, FUNC(seibu_sound_device::main_data_w));
map(0x401b, 0x401b).w(m_seibu_sound, FUNC(seibu_sound_device::coin_w));
map(0x8000, 0xffff).bankr("seibu_bank1");
map(0x8000, 0xffff).bankr("seibu_bank");
}
void deadang_state::sound_decrypted_opcodes_map(address_map &map)
{
map(0x0000, 0x1fff).r("sei80bu", FUNC(sei80bu_device::opcode_r));
map(0x8000, 0xffff).bankr("seibu_bank1");
map(0x8000, 0xffff).bankr("seibu_bank");
}
@ -822,8 +822,9 @@ void deadang_state::deadang(machine_config &config)
SEIBU_SOUND(config, m_seibu_sound, 0);
m_seibu_sound->int_callback().set_inputline(m_audiocpu, 0);
m_seibu_sound->coin_io_callback().set_ioport("COIN");
m_seibu_sound->set_rom_tag("audiocpu");
m_seibu_sound->set_rombank_tag("seibu_bank1");
m_seibu_sound->set_rombank_tag("seibu_bank");
m_seibu_sound->ym_read_callback().set("ym1", FUNC(ym2203_device::read));
m_seibu_sound->ym_write_callback().set("ym1", FUNC(ym2203_device::write));

View File

@ -437,7 +437,7 @@ void dynduke_state::sound_map(address_map &map)
map(0x4008, 0x4009).rw(m_seibu_sound, FUNC(seibu_sound_device::ym_r), FUNC(seibu_sound_device::ym_w));
map(0x4010, 0x4011).r(m_seibu_sound, FUNC(seibu_sound_device::soundlatch_r));
map(0x4012, 0x4012).r(m_seibu_sound, FUNC(seibu_sound_device::main_data_pending_r));
map(0x4013, 0x4013).portr("COIN");
map(0x4013, 0x4013).r(m_seibu_sound, FUNC(seibu_sound_device::coin_r));
map(0x4018, 0x4019).w(m_seibu_sound, FUNC(seibu_sound_device::main_data_w));
map(0x401b, 0x401b).w(m_seibu_sound, FUNC(seibu_sound_device::coin_w));
map(0x6000, 0x6000).rw("oki", FUNC(okim6295_device::read), FUNC(okim6295_device::write));
@ -451,7 +451,7 @@ void dynduke_state::sound_decrypted_opcodes_map(address_map &map)
void dynduke_state::sei80bu_encrypted_full_map(address_map &map)
{
map(0x0000, 0x7fff).rom().region("audiocpu", 0);
map(0x8000, 0xffff).bankr("seibu_bank1");
map(0x8000, 0xffff).bankr("seibu_bank");
}
@ -671,8 +671,9 @@ void dynduke_state::dynduke(machine_config &config)
SEIBU_SOUND(config, m_seibu_sound, 0);
m_seibu_sound->int_callback().set_inputline("audiocpu", 0);
m_seibu_sound->coin_io_callback().set_ioport("COIN");
m_seibu_sound->set_rom_tag("audiocpu");
m_seibu_sound->set_rombank_tag("seibu_bank1");
m_seibu_sound->set_rombank_tag("seibu_bank");
m_seibu_sound->ym_read_callback().set("ymsnd", FUNC(ym3812_device::read));
m_seibu_sound->ym_write_callback().set("ymsnd", FUNC(ym3812_device::write));
}

View File

@ -614,9 +614,10 @@ void goodejan_state::goodejan(machine_config &config)
oki.add_route(ALL_OUTPUTS, "mono", 0.40);
seibu_sound_device &seibu_sound(SEIBU_SOUND(config, "seibu_sound", 0));
seibu_sound.coin_io_callback().set_ioport("COIN");
seibu_sound.int_callback().set_inputline("audiocpu", 0);
seibu_sound.set_rom_tag("audiocpu");
seibu_sound.set_rombank_tag("seibu_bank1");
seibu_sound.set_rombank_tag("seibu_bank");
seibu_sound.ym_read_callback().set("ymsnd", FUNC(ym3812_device::read));
seibu_sound.ym_write_callback().set("ymsnd", FUNC(ym3812_device::write));
}

View File

@ -1228,8 +1228,9 @@ void legionna_state::legionna(machine_config &config)
SEIBU_SOUND(config, m_seibu_sound, 0);
m_seibu_sound->int_callback().set_inputline(m_audiocpu, 0);
m_seibu_sound->coin_io_callback().set_ioport("COIN");
m_seibu_sound->set_rom_tag("audiocpu");
m_seibu_sound->set_rombank_tag("seibu_bank1");
m_seibu_sound->set_rombank_tag("seibu_bank");
m_seibu_sound->ym_read_callback().set("ymsnd", FUNC(ym3812_device::read));
m_seibu_sound->ym_write_callback().set("ymsnd", FUNC(ym3812_device::write));
}
@ -1284,8 +1285,9 @@ void legionna_state::heatbrl(machine_config &config)
SEIBU_SOUND(config, m_seibu_sound, 0);
m_seibu_sound->int_callback().set_inputline(m_audiocpu, 0);
m_seibu_sound->coin_io_callback().set_ioport("COIN");
m_seibu_sound->set_rom_tag("audiocpu");
m_seibu_sound->set_rombank_tag("seibu_bank1");
m_seibu_sound->set_rombank_tag("seibu_bank");
m_seibu_sound->ym_read_callback().set("ymsnd", FUNC(ym3812_device::read));
m_seibu_sound->ym_write_callback().set("ymsnd", FUNC(ym3812_device::write));
}
@ -1345,8 +1347,9 @@ void legionna_state::godzilla(machine_config &config)
SEIBU_SOUND(config, m_seibu_sound, 0);
m_seibu_sound->int_callback().set_inputline(m_audiocpu, 0);
m_seibu_sound->coin_io_callback().set_ioport("COIN");
m_seibu_sound->set_rom_tag("audiocpu");
m_seibu_sound->set_rombank_tag("seibu_bank1");
m_seibu_sound->set_rombank_tag("seibu_bank");
m_seibu_sound->ym_read_callback().set("ymsnd", FUNC(ym2151_device::read));
m_seibu_sound->ym_write_callback().set("ymsnd", FUNC(ym2151_device::write));
}
@ -1403,8 +1406,9 @@ void legionna_state::denjinmk(machine_config &config)
SEIBU_SOUND(config, m_seibu_sound, 0);
m_seibu_sound->int_callback().set_inputline(m_audiocpu, 0);
m_seibu_sound->coin_io_callback().set_ioport("COIN");
m_seibu_sound->set_rom_tag("audiocpu");
m_seibu_sound->set_rombank_tag("seibu_bank1");
m_seibu_sound->set_rombank_tag("seibu_bank");
m_seibu_sound->ym_read_callback().set("ymsnd", FUNC(ym2151_device::read));
m_seibu_sound->ym_write_callback().set("ymsnd", FUNC(ym2151_device::write));
}
@ -1461,8 +1465,9 @@ void legionna_state::grainbow(machine_config &config)
SEIBU_SOUND(config, m_seibu_sound, 0);
m_seibu_sound->int_callback().set_inputline(m_audiocpu, 0);
m_seibu_sound->coin_io_callback().set_ioport("COIN");
m_seibu_sound->set_rom_tag("audiocpu");
m_seibu_sound->set_rombank_tag("seibu_bank1");
m_seibu_sound->set_rombank_tag("seibu_bank");
m_seibu_sound->ym_read_callback().set("ymsnd", FUNC(ym2151_device::read));
m_seibu_sound->ym_write_callback().set("ymsnd", FUNC(ym2151_device::write));
}
@ -1521,8 +1526,9 @@ void legionna_state::cupsoc(machine_config &config)
SEIBU_SOUND(config, m_seibu_sound, 0);
m_seibu_sound->int_callback().set_inputline(m_audiocpu, 0);
m_seibu_sound->coin_io_callback().set_ioport("COIN");
m_seibu_sound->set_rom_tag("audiocpu");
m_seibu_sound->set_rombank_tag("seibu_bank1");
m_seibu_sound->set_rombank_tag("seibu_bank");
m_seibu_sound->ym_read_callback().set("ymsnd", FUNC(ym3812_device::read));
m_seibu_sound->ym_write_callback().set("ymsnd", FUNC(ym3812_device::write));
}

View File

@ -798,8 +798,9 @@ void r2dx_v33_state::nzerotea(machine_config &config)
SEIBU_SOUND(config, m_seibu_sound, 0);
m_seibu_sound->int_callback().set_inputline("audiocpu", 0);
m_seibu_sound->coin_io_callback().set_ioport("COIN");
m_seibu_sound->set_rom_tag("audiocpu");
m_seibu_sound->set_rombank_tag("seibu_bank1");
m_seibu_sound->set_rombank_tag("seibu_bank");
m_seibu_sound->ym_read_callback().set("ymsnd", FUNC(ym3812_device::read));
m_seibu_sound->ym_write_callback().set("ymsnd", FUNC(ym3812_device::write));
}

View File

@ -561,7 +561,7 @@ void raiden_state::raiden_sound_map(address_map &map)
map(0x4008, 0x4009).rw(m_seibu_sound, FUNC(seibu_sound_device::ym_r), FUNC(seibu_sound_device::ym_w));
map(0x4010, 0x4011).r(m_seibu_sound, FUNC(seibu_sound_device::soundlatch_r));
map(0x4012, 0x4012).r(m_seibu_sound, FUNC(seibu_sound_device::main_data_pending_r));
map(0x4013, 0x4013).portr("COIN");
map(0x4013, 0x4013).r(m_seibu_sound, FUNC(seibu_sound_device::coin_r));
map(0x4018, 0x4019).w(m_seibu_sound, FUNC(seibu_sound_device::main_data_w));
map(0x401b, 0x401b).w(m_seibu_sound, FUNC(seibu_sound_device::coin_w));
map(0x6000, 0x6000).rw("oki", FUNC(okim6295_device::read), FUNC(okim6295_device::write));
@ -575,7 +575,7 @@ void raiden_state::raiden_sound_decrypted_opcodes_map(address_map &map)
void raiden_state::sei80bu_encrypted_full_map(address_map &map)
{
map(0x0000, 0x7fff).rom().region("audiocpu", 0);
map(0x8000, 0xffff).bankr("seibu_bank1");
map(0x8000, 0xffff).bankr("seibu_bank");
}
@ -753,8 +753,9 @@ void raiden_state::raiden(machine_config &config)
SEIBU_SOUND(config, m_seibu_sound, 0);
m_seibu_sound->int_callback().set_inputline("audiocpu", 0);
m_seibu_sound->coin_io_callback().set_ioport("COIN");
m_seibu_sound->set_rom_tag("audiocpu");
m_seibu_sound->set_rombank_tag("seibu_bank1");
m_seibu_sound->set_rombank_tag("seibu_bank");
m_seibu_sound->ym_read_callback().set("ymsnd", FUNC(ym3812_device::read));
m_seibu_sound->ym_write_callback().set("ymsnd", FUNC(ym3812_device::write));
}

View File

@ -698,13 +698,13 @@ void raiden2_state::raiden2_sound_map(address_map &map)
map(0x4008, 0x4009).rw(m_seibu_sound, FUNC(seibu_sound_device::ym_r), FUNC(seibu_sound_device::ym_w));
map(0x4010, 0x4011).r(m_seibu_sound, FUNC(seibu_sound_device::soundlatch_r));
map(0x4012, 0x4012).r(m_seibu_sound, FUNC(seibu_sound_device::main_data_pending_r));
map(0x4013, 0x4013).portr("COIN");
map(0x4013, 0x4013).r(m_seibu_sound, FUNC(seibu_sound_device::coin_r));
map(0x4018, 0x4019).w(m_seibu_sound, FUNC(seibu_sound_device::main_data_w));
map(0x401a, 0x401a).w(m_seibu_sound, FUNC(seibu_sound_device::bank_w));
map(0x401b, 0x401b).w(m_seibu_sound, FUNC(seibu_sound_device::coin_w));
map(0x6000, 0x6000).rw("oki1", FUNC(okim6295_device::read), FUNC(okim6295_device::write));
map(0x6002, 0x6002).rw("oki2", FUNC(okim6295_device::read), FUNC(okim6295_device::write));
map(0x8000, 0xffff).bankr("seibu_bank1");
map(0x8000, 0xffff).bankr("seibu_bank");
}
void raiden2_state::zeroteam_sound_map(address_map &map)
@ -718,12 +718,12 @@ void raiden2_state::zeroteam_sound_map(address_map &map)
map(0x4008, 0x4009).rw(m_seibu_sound, FUNC(seibu_sound_device::ym_r), FUNC(seibu_sound_device::ym_w));
map(0x4010, 0x4011).r(m_seibu_sound, FUNC(seibu_sound_device::soundlatch_r));
map(0x4012, 0x4012).r(m_seibu_sound, FUNC(seibu_sound_device::main_data_pending_r));
map(0x4013, 0x4013).portr("COIN");
map(0x4013, 0x4013).r(m_seibu_sound, FUNC(seibu_sound_device::coin_r));
map(0x4018, 0x4019).w(m_seibu_sound, FUNC(seibu_sound_device::main_data_w));
map(0x401a, 0x401a).w(m_seibu_sound, FUNC(seibu_sound_device::bank_w));
map(0x401b, 0x401b).w(m_seibu_sound, FUNC(seibu_sound_device::coin_w));
map(0x6000, 0x6000).rw("oki", FUNC(okim6295_device::read), FUNC(okim6295_device::write));
map(0x8000, 0xffff).bankr("seibu_bank1");
map(0x8000, 0xffff).bankr("seibu_bank");
}
@ -1083,8 +1083,9 @@ void raiden2_state::raiden2(machine_config &config)
SEIBU_SOUND(config, m_seibu_sound, 0);
m_seibu_sound->int_callback().set_inputline("audiocpu", 0);
m_seibu_sound->coin_io_callback().set_ioport("COIN");
m_seibu_sound->set_rom_tag("audiocpu");
m_seibu_sound->set_rombank_tag("seibu_bank1");
m_seibu_sound->set_rombank_tag("seibu_bank");
m_seibu_sound->ym_read_callback().set("ymsnd", FUNC(ym2151_device::read));
m_seibu_sound->ym_write_callback().set("ymsnd", FUNC(ym2151_device::write));
}
@ -1143,8 +1144,9 @@ void raiden2_state::zeroteam(machine_config &config)
SEIBU_SOUND(config, m_seibu_sound, 0);
m_seibu_sound->int_callback().set_inputline("audiocpu", 0);
m_seibu_sound->coin_io_callback().set_ioport("COIN");
m_seibu_sound->set_rom_tag("audiocpu");
m_seibu_sound->set_rombank_tag("seibu_bank1");
m_seibu_sound->set_rombank_tag("seibu_bank");
m_seibu_sound->ym_read_callback().set("ymsnd", FUNC(ym3812_device::read));
m_seibu_sound->ym_write_callback().set("ymsnd", FUNC(ym3812_device::write));
}

View File

@ -603,9 +603,10 @@ void sengokmj_state::sengokmj(machine_config &config)
oki.add_route(ALL_OUTPUTS, "mono", 0.40);
seibu_sound_device &seibu_sound(SEIBU_SOUND(config, "seibu_sound", 0));
seibu_sound.coin_io_callback().set_ioport("COIN");
seibu_sound.int_callback().set_inputline("audiocpu", 0);
seibu_sound.set_rom_tag("audiocpu");
seibu_sound.set_rombank_tag("seibu_bank1");
seibu_sound.set_rombank_tag("seibu_bank");
seibu_sound.ym_read_callback().set("ymsnd", FUNC(ym3812_device::read));
seibu_sound.ym_write_callback().set("ymsnd", FUNC(ym3812_device::write));
}

View File

@ -584,17 +584,17 @@ void toki_state::toki_audio_map(address_map &map)
map(0x4008, 0x4009).rw(m_seibu_sound, FUNC(seibu_sound_device::ym_r), FUNC(seibu_sound_device::ym_w));
map(0x4010, 0x4011).r(m_seibu_sound, FUNC(seibu_sound_device::soundlatch_r));
map(0x4012, 0x4012).r(m_seibu_sound, FUNC(seibu_sound_device::main_data_pending_r));
map(0x4013, 0x4013).portr("COIN");
map(0x4013, 0x4013).r(m_seibu_sound, FUNC(seibu_sound_device::coin_r));
map(0x4018, 0x4019).w(m_seibu_sound, FUNC(seibu_sound_device::main_data_w));
map(0x401b, 0x401b).w(m_seibu_sound, FUNC(seibu_sound_device::coin_w));
map(0x6000, 0x6000).rw("oki", FUNC(okim6295_device::read), FUNC(okim6295_device::write));
map(0x8000, 0xffff).bankr("seibu_bank1");
map(0x8000, 0xffff).bankr("seibu_bank");
}
void toki_state::toki_audio_opcodes_map(address_map &map)
{
map(0x0000, 0x1fff).r("sei80bu", FUNC(sei80bu_device::opcode_r));
map(0x8000, 0xffff).bankr("seibu_bank1");
map(0x8000, 0xffff).bankr("seibu_bank");
}
void toki_state::jujuba_audio_map(address_map &map)
@ -609,17 +609,17 @@ void toki_state::jujuba_audio_map(address_map &map)
map(0x4008, 0x4009).rw(m_seibu_sound, FUNC(seibu_sound_device::ym_r), FUNC(seibu_sound_device::ym_w));
map(0x4010, 0x4011).r(m_seibu_sound, FUNC(seibu_sound_device::soundlatch_r));
map(0x4012, 0x4012).r(m_seibu_sound, FUNC(seibu_sound_device::main_data_pending_r));
map(0x4013, 0x4013).portr("COIN");
map(0x4013, 0x4013).r(m_seibu_sound, FUNC(seibu_sound_device::coin_r));
map(0x4018, 0x4019).w(m_seibu_sound, FUNC(seibu_sound_device::main_data_w));
map(0x401b, 0x401b).w(m_seibu_sound, FUNC(seibu_sound_device::coin_w));
map(0x6000, 0x6000).rw("oki", FUNC(okim6295_device::read), FUNC(okim6295_device::write));
map(0x8000, 0xffff).bankr("seibu_bank1");
map(0x8000, 0xffff).bankr("seibu_bank");
}
void toki_state::jujuba_audio_opcodes_map(address_map &map)
{
map(0x0000, 0x1fff).rom().region("audiocpu", 0);
map(0x8000, 0xffff).bankr("seibu_bank1");
map(0x8000, 0xffff).bankr("seibu_bank");
}
uint8_t toki_state::jujuba_z80_data_decrypt(offs_t offset)
@ -919,8 +919,9 @@ void toki_state::toki(machine_config &config)
SEIBU_SOUND(config, m_seibu_sound, 0);
m_seibu_sound->int_callback().set_inputline(m_audiocpu, 0);
m_seibu_sound->coin_io_callback().set_ioport("COIN");
m_seibu_sound->set_rom_tag(m_audiocpu_rom);
m_seibu_sound->set_rombank_tag("seibu_bank1");
m_seibu_sound->set_rombank_tag("seibu_bank");
m_seibu_sound->ym_read_callback().set("ymsnd", FUNC(ym3812_device::read));
m_seibu_sound->ym_write_callback().set("ymsnd", FUNC(ym3812_device::write));
}

View File

@ -74,15 +74,16 @@
DEFINE_DEVICE_TYPE(SEIBU_SOUND, seibu_sound_device, "seibu_sound", "Seibu Sound System")
seibu_sound_device::seibu_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
seibu_sound_device::seibu_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, SEIBU_SOUND, tag, owner, clock),
m_int_cb(*this),
m_coin_io_cb(*this, 0),
m_ym_read_cb(*this, 0),
m_ym_write_cb(*this),
m_sound_rom(*this, finder_base::DUMMY_TAG),
m_rom_bank(*this, finder_base::DUMMY_TAG),
m_main2sub_pending(0),
m_sub2main_pending(0),
m_main2sub_pending(false),
m_sub2main_pending(false),
m_rst10_irq(false),
m_rst18_irq(false),
m_rst10_service(false),
@ -181,17 +182,20 @@ IRQ_CALLBACK_MEMBER(seibu_sound_device::im0_vector_cb)
{
if (m_rst18_irq && !m_rst18_service)
{
update_irq_lines(RST18_ACKNOWLEDGE);
if (!machine().side_effects_disabled())
update_irq_lines(RST18_ACKNOWLEDGE);
return 0xdf;
}
else if (m_rst10_irq && !m_rst10_service)
{
update_irq_lines(RST10_ACKNOWLEDGE);
if (!machine().side_effects_disabled())
update_irq_lines(RST10_ACKNOWLEDGE);
return 0xd7;
}
else
{
logerror("Spurious interrupt taken\n");
if (!machine().side_effects_disabled())
logerror("Spurious interrupt taken\n");
return 0x00;
}
}
@ -233,13 +237,18 @@ void seibu_sound_device::ym_w(offs_t offset, u8 data)
void seibu_sound_device::bank_w(u8 data)
{
if (m_rom_bank.found())
m_rom_bank->set_entry(data & 1);
m_rom_bank->set_entry(BIT(data, 0));
}
u8 seibu_sound_device::coin_r(offs_t offset)
{
return m_coin_io_cb(offset);
}
void seibu_sound_device::coin_w(u8 data)
{
machine().bookkeeping().coin_counter_w(0, data & 1);
machine().bookkeeping().coin_counter_w(1, data & 2);
machine().bookkeeping().coin_counter_w(0, BIT(data, 0));
machine().bookkeeping().coin_counter_w(1, BIT(data, 1));
}
u8 seibu_sound_device::soundlatch_r(offs_t offset)
@ -260,8 +269,8 @@ void seibu_sound_device::main_data_w(offs_t offset, u8 data)
void seibu_sound_device::pending_w(u8)
{
/* just a guess */
m_main2sub_pending = 0;
m_sub2main_pending = 1;
m_main2sub_pending = false;
m_sub2main_pending = true;
}
u8 seibu_sound_device::main_r(offs_t offset)
@ -271,7 +280,7 @@ u8 seibu_sound_device::main_r(offs_t offset)
{
case 2:
case 3:
return m_sub2main[offset-2];
return m_sub2main[offset - 2];
case 5:
return m_main2sub_pending ? 1 : 0;
default:
@ -294,8 +303,8 @@ void seibu_sound_device::main_w(offs_t offset, u8 data)
case 2: //Sengoku Mahjong writes here
case 6:
/* just a guess */
m_sub2main_pending = 0;
m_main2sub_pending = 1;
m_sub2main_pending = false;
m_main2sub_pending = true;
break;
default:
//logerror("%s: seibu_main_w(%x,%02x)\n",machine().describe_context(),offset,data);
@ -330,18 +339,18 @@ void seibu_sound_common::seibu_sound_map(address_map &map)
map(0x4008, 0x4009).rw("seibu_sound", FUNC(seibu_sound_device::ym_r), FUNC(seibu_sound_device::ym_w));
map(0x4010, 0x4011).r("seibu_sound", FUNC(seibu_sound_device::soundlatch_r));
map(0x4012, 0x4012).r("seibu_sound", FUNC(seibu_sound_device::main_data_pending_r));
map(0x4013, 0x4013).portr("COIN");
map(0x4013, 0x4013).r("seibu_sound", FUNC(seibu_sound_device::coin_r));
map(0x4018, 0x4019).w("seibu_sound", FUNC(seibu_sound_device::main_data_w));
map(0x401b, 0x401b).w("seibu_sound", FUNC(seibu_sound_device::coin_w));
map(0x6000, 0x6000).rw("oki", FUNC(okim6295_device::read), FUNC(okim6295_device::write));
map(0x8000, 0xffff).bankr("seibu_bank1");
map(0x8000, 0xffff).bankr("seibu_bank");
}
/***************************************************************************/
DEFINE_DEVICE_TYPE(SEI80BU, sei80bu_device, "sei80bu", "SEI80BU Encrypted Z80 Interface")
sei80bu_device::sei80bu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
sei80bu_device::sei80bu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, SEI80BU, tag, owner, clock),
device_rom_interface(mconfig, *this)
{
@ -349,7 +358,7 @@ sei80bu_device::sei80bu_device(const machine_config &mconfig, const char *tag, d
u8 sei80bu_device::data_r(offs_t offset)
{
u16 a = offset;
u16 const a = offset;
u8 src = read_byte(offset);
if ( BIT(a,9) & BIT(a,8)) src ^= 0x80;
@ -366,7 +375,7 @@ u8 sei80bu_device::data_r(offs_t offset)
u8 sei80bu_device::opcode_r(offs_t offset)
{
u16 a = offset;
u16 const a = offset;
u8 src = read_byte(offset);
if ( BIT(a,9) & BIT(a,8)) src ^= 0x80;
@ -393,13 +402,13 @@ u8 sei80bu_device::opcode_r(offs_t offset)
DEFINE_DEVICE_TYPE(SEIBU_ADPCM, seibu_adpcm_device, "seibu_adpcm", "Seibu ADPCM interface")
seibu_adpcm_device::seibu_adpcm_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
seibu_adpcm_device::seibu_adpcm_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, SEIBU_ADPCM, tag, owner, clock)
, m_msm(*this, finder_base::DUMMY_TAG)
, m_current(0)
, m_end(0)
, m_nibble(0)
, m_playing(0)
, m_playing(false)
, m_base(*this, DEVICE_SELF)
{
}
@ -418,7 +427,7 @@ void seibu_adpcm_device::device_start()
void seibu_adpcm_device::device_reset()
{
m_playing = 0;
m_playing = false;
m_msm->reset_w(1);
}
@ -438,11 +447,11 @@ void seibu_adpcm_device::adr_w(offs_t offset, u8 data)
{
if (offset)
{
m_end = data<<8;
m_end = data << 8;
}
else
{
m_current = data<<8;
m_current = data << 8;
m_nibble = 4;
}
}
@ -454,13 +463,13 @@ void seibu_adpcm_device::ctl_w(u8 data)
{
case 0:
m_msm->reset_w(1);
m_playing = 0;
m_playing = false;
break;
case 2:
break;
case 1:
m_msm->reset_w(0);
m_playing = 1;
m_playing = true;
break;
}
}
@ -470,7 +479,7 @@ void seibu_adpcm_device::msm_int(int state)
if (!state || !m_playing)
return;
int val = (m_base[m_current] >> m_nibble) & 15;
u8 const val = (m_base[m_current] >> m_nibble) & 15;
m_msm->data_w(val);
m_nibble ^= 4;
@ -480,7 +489,7 @@ void seibu_adpcm_device::msm_int(int state)
if (m_current >= m_end)
{
m_msm->reset_w(1);
m_playing = 0;
m_playing = false;
}
}
}

View File

@ -46,13 +46,14 @@ protected:
class seibu_sound_device : public device_t
{
public:
seibu_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
seibu_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
~seibu_sound_device() { }
// configuration
template <typename T> void set_rom_tag(T &&tag) { m_sound_rom.set_tag(std::forward<T>(tag)); }
template <typename T> void set_rombank_tag(T &&tag) { m_rom_bank.set_tag(std::forward<T>(tag)); }
auto int_callback() { return m_int_cb.bind(); }
auto coin_io_callback() { return m_coin_io_cb.bind(); }
auto ym_read_callback() { return m_ym_read_cb.bind(); }
auto ym_write_callback() { return m_ym_write_cb.bind(); }
@ -65,6 +66,7 @@ public:
u8 ym_r(offs_t offset);
void ym_w(offs_t offset, u8 data);
void bank_w(u8 data);
u8 coin_r(offs_t offset);
void coin_w(u8 data);
void fm_irqhandler(int state);
u8 soundlatch_r(offs_t offset);
@ -85,16 +87,17 @@ private:
// device callbacks
devcb_write_line m_int_cb;
devcb_read8 m_coin_io_cb;
devcb_read8 m_ym_read_cb;
devcb_write8 m_ym_write_cb;
// internal state
optional_region_ptr<uint8_t> m_sound_rom;
optional_region_ptr<u8> m_sound_rom;
optional_memory_bank m_rom_bank;
uint8_t m_main2sub[2];
uint8_t m_sub2main[2];
int m_main2sub_pending;
int m_sub2main_pending;
u8 m_main2sub[2];
u8 m_sub2main[2];
bool m_main2sub_pending;
bool m_sub2main_pending;
bool m_rst10_irq;
bool m_rst18_irq;
bool m_rst10_service;
@ -121,7 +124,7 @@ DECLARE_DEVICE_TYPE(SEIBU_SOUND, seibu_sound_device)
class sei80bu_device : public device_t, public device_rom_interface<16>
{
public:
sei80bu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
sei80bu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
u8 data_r(offs_t offset);
u8 opcode_r(offs_t offset);
@ -138,12 +141,12 @@ DECLARE_DEVICE_TYPE(SEI80BU, sei80bu_device)
class seibu_adpcm_device : public device_t
{
public:
template <typename T> seibu_adpcm_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&msm5205_tag)
template <typename T> seibu_adpcm_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock, T &&msm5205_tag)
: seibu_adpcm_device(mconfig, tag, owner, clock)
{
m_msm.set_tag(std::forward<T>(msm5205_tag));
}
seibu_adpcm_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
seibu_adpcm_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
~seibu_adpcm_device() { }
void decrypt();
@ -159,11 +162,11 @@ protected:
private:
// internal state
required_device<msm5205_device> m_msm;
uint32_t m_current;
uint32_t m_end;
uint8_t m_nibble;
uint8_t m_playing;
required_region_ptr<uint8_t> m_base;
u32 m_current;
u32 m_end;
u8 m_nibble;
bool m_playing;
required_region_ptr<u8> m_base;
};
DECLARE_DEVICE_TYPE(SEIBU_ADPCM, seibu_adpcm_device)

View File

@ -173,11 +173,11 @@ void shanghai_state::kothello_sound_map(address_map &map)
map(0x4008, 0x4009).rw("seibu_sound", FUNC(seibu_sound_device::ym_r), FUNC(seibu_sound_device::ym_w));
map(0x4010, 0x4011).r("seibu_sound", FUNC(seibu_sound_device::soundlatch_r));
map(0x4012, 0x4012).r("seibu_sound", FUNC(seibu_sound_device::main_data_pending_r));
map(0x4013, 0x4013).portr("COIN");
map(0x4013, 0x4013).r("seibu_sound", FUNC(seibu_sound_device::coin_r));
map(0x4018, 0x4019).w("seibu_sound", FUNC(seibu_sound_device::main_data_w));
map(0x401a, 0x401a).w("adpcm", FUNC(seibu_adpcm_device::ctl_w));
map(0x401b, 0x401b).w("seibu_sound", FUNC(seibu_sound_device::coin_w));
map(0x8000, 0xffff).bankr("seibu_bank1");
map(0x8000, 0xffff).bankr("seibu_bank");
}
static INPUT_PORTS_START( kothello )
@ -510,9 +510,10 @@ void shanghai_state::kothello(machine_config &config)
ymsnd.add_route(ALL_OUTPUTS, "mono", 0.15);
seibu_sound_device &seibu_sound(SEIBU_SOUND(config, "seibu_sound", 0));
seibu_sound.coin_io_callback().set_ioport("COIN");
seibu_sound.int_callback().set_inputline("audiocpu", 0);
seibu_sound.set_rom_tag("audiocpu");
seibu_sound.set_rombank_tag("seibu_bank1");
seibu_sound.set_rombank_tag("seibu_bank");
seibu_sound.ym_read_callback().set("ymsnd", FUNC(ym2203_device::read));
seibu_sound.ym_write_callback().set("ymsnd", FUNC(ym2203_device::write));