diff options
author | Vas Crabb <vas@vastheman.com> | 2018-07-07 02:40:29 +1000 |
---|---|---|
committer | Vas Crabb <vas@vastheman.com> | 2018-07-07 02:40:29 +1000 |
commit | c3fb11c2c98a5c28ece6a27093a0f9def350ac64 (patch) | |
tree | c68b38f05ed1d32358add721fda7f45e8803479f /src/mame/drivers/taito_b.cpp | |
parent | 5d9e33b786d7ef452317439359f3cbd8cc920513 (diff) |
devcb3
There are multiple issues with the current device callbacks:
* They always dispatch through a pointer-to-member
* Chained callbacks are a linked list so the branch unit can't predict the early
* There's a runtime decision made on the left/right shift direction
* There are runtime NULL checks on various objects
* Binding a lambda isn't practical
* Arbitrary transformations are not supported
* When chaining callbacks it isn't clear what the MCFG_DEVCB_ modifiers apply to
* It isn't possible to just append to a callback in derived configuration
* The macros need a magic, hidden local called devcb
* Moving code that uses the magic locals around is error-prone
* Writing the MCFG_ macros to make a device usable is a pain
* You can't discover applicable MCFG_ macros with intellisense
* Macros are not scoped
* Using an inappropriate macro isn't detected at compile time
* Lots of other things
This changeset overcomes the biggest obstacle to remving MCFG_ macros
altogether. Essentially, to allow a devcb to be configured, call
.bind() and expose the result (a bind target for the callback). Bind
target methods starting with "set" repace the current callbacks; methods
starting with "append" append to them. You can't reconfigure a callback
after resolving it. There's no need to use a macro matching the
handler signatures - use FUNC for everything. Current device is implied
if no tag/finder is supplied (no need for explicit this).
Lambdas are supported, and the memory space and offset are optional.
These kinds of things work:
* .read_cb().set([this] () { return something; });
* .read_cb().set([this] (offs_t offset) { return ~offset; });
* .write_cb().set([this] (offs_t offset, u8 data) { m_array[offset] = data; });
* .write_cb().set([this] (int state) { some_var = state; });
Arbitrary transforms are allowed, and they can modify offset/mask for example:
* .read_cb().set(FUNC(my_state::handler)).transform([] (u8 data) { return bitswap<4>(data, 1, 3, 0, 2); });
* .read_cb().set(m_dev, FUNC(some_device::member)).transform([] (offs_t &offset, u8 data) { offset ^= 3; return data; });
It's possible to stack arbitrary transforms, at the cost of compile
time (the whole transform stack gets inlined at compile time). Shifts
count as an arbitrary transform, but mask/exor does not.
Order of mask/shift/exor now matters. Modifications are applied in the
specified order. These are NOT EQUIVALENT:
* .read_cb().set(FUNC(my_state::handler)).mask(0x06).lshift(2);
* .read_cb().set(FUNC(my_state::handler)).lshift(2).mask(0x06);
The bit helper no longer reverses its behaviour for read callbacks, and
I/O ports are no longer aware of the field mask. Binding a read
callback to no-op is not supported - specify a constant. The GND and
VCC aliases have been removed intentionally - they're TTL-centric, and
were already being abused.
Other quirks have been preserved, including write logger only logging
when the data is non-zero (quite unhelpful in many of the cases where
it's used). Legacy syntax is still supported for simple cases, but will
be phased out. New devices should not have MCFG_ macros.
I don't think I've missed any fundamental issues, but if I've broken
something, let me know.
Diffstat (limited to 'src/mame/drivers/taito_b.cpp')
-rw-r--r-- | src/mame/drivers/taito_b.cpp | 302 |
1 files changed, 151 insertions, 151 deletions
diff --git a/src/mame/drivers/taito_b.cpp b/src/mame/drivers/taito_b.cpp index 54e5cfe0af4..d6a56729cac 100644 --- a/src/mame/drivers/taito_b.cpp +++ b/src/mame/drivers/taito_b.cpp @@ -239,7 +239,7 @@ WRITE16_MEMBER(taitob_state::gain_control_w) } } -INPUT_CHANGED_MEMBER(taitob_state::realpunc_sensor) +INPUT_CHANGED_MEMBER(taitob_c_state::realpunc_sensor) { m_maincpu->set_input_line(4, HOLD_LINE); } @@ -319,7 +319,7 @@ WRITE16_MEMBER(taitob_state::spacedxo_tc0220ioc_w) } } -WRITE16_MEMBER(taitob_state::realpunc_output_w) +WRITE16_MEMBER(taitob_c_state::realpunc_output_w) { /* 15 = Camera Enable? @@ -561,19 +561,19 @@ void taitob_state::sbm_map(address_map &map) map(0x900000, 0x97ffff).m(m_tc0180vcu, FUNC(tc0180vcu_device::tc0180vcu_memrw)); } -void taitob_state::realpunc_map(address_map &map) +void taitob_c_state::realpunc_map(address_map &map) { map(0x000000, 0x0fffff).rom(); map(0x100000, 0x10ffff).ram(); map(0x110000, 0x12ffff).ram(); map(0x130000, 0x13ffff).ram(); // Check me map(0x180000, 0x18000f).rw(m_tc0510nio, FUNC(tc0510nio_device::halfword_wordswap_r), FUNC(tc0510nio_device::halfword_wordswap_w)); - map(0x184000, 0x184001).w(FUNC(taitob_state::realpunc_video_ctrl_w)); + map(0x184000, 0x184001).w(FUNC(taitob_c_state::realpunc_video_ctrl_w)); map(0x188000, 0x188001).nopr(); map(0x188000, 0x188000).w("tc0140syt", FUNC(tc0140syt_device::master_port_w)); map(0x188002, 0x188003).nopr(); map(0x188002, 0x188002).w("tc0140syt", FUNC(tc0140syt_device::master_comm_w)); - map(0x18c000, 0x18c001).w(FUNC(taitob_state::realpunc_output_w)); + map(0x18c000, 0x18c001).w(FUNC(taitob_c_state::realpunc_output_w)); map(0x200000, 0x27ffff).m(m_tc0180vcu, FUNC(tc0180vcu_device::tc0180vcu_memrw)); map(0x280000, 0x281fff).ram().w(m_palette, FUNC(palette_device::write16)).share("palette"); map(0x300000, 0x300001).rw("hd63484", FUNC(hd63484_device::status16_r), FUNC(hd63484_device::address16_w)); @@ -583,7 +583,7 @@ void taitob_state::realpunc_map(address_map &map) map(0x320002, 0x320002).w("tc0140syt", FUNC(tc0140syt_device::master_comm_w)); } -void taitob_state::realpunc_hd63484_map(address_map &map) +void taitob_c_state::realpunc_hd63484_map(address_map &map) { map(0x00000, 0x7ffff).ram(); } @@ -1701,9 +1701,9 @@ static INPUT_PORTS_START( realpunc ) PORT_BIT( 0x02, IP_ACTIVE_LOW,IPT_UNKNOWN ) PORT_BIT( 0x04, IP_ACTIVE_LOW,IPT_UNKNOWN ) PORT_BIT( 0x08, IP_ACTIVE_LOW,IPT_UNKNOWN ) - PORT_BIT( 0x10, IP_ACTIVE_LOW,IPT_BUTTON2 ) PORT_NAME("Pad Photosensor 1 (N)") PORT_CHANGED_MEMBER(DEVICE_SELF, taitob_state,realpunc_sensor, 0) - PORT_BIT( 0x20, IP_ACTIVE_LOW,IPT_BUTTON3 ) PORT_NAME("Pad Photosensor 2 (U)") PORT_CHANGED_MEMBER(DEVICE_SELF, taitob_state,realpunc_sensor, 0) - PORT_BIT( 0x40, IP_ACTIVE_LOW,IPT_BUTTON4 ) PORT_NAME("Pad Photosensor 3 (D)") PORT_CHANGED_MEMBER(DEVICE_SELF, taitob_state,realpunc_sensor, 0) + PORT_BIT( 0x10, IP_ACTIVE_LOW,IPT_BUTTON2 ) PORT_NAME("Pad Photosensor 1 (N)") PORT_CHANGED_MEMBER(DEVICE_SELF, taitob_c_state,realpunc_sensor, 0) + PORT_BIT( 0x20, IP_ACTIVE_LOW,IPT_BUTTON3 ) PORT_NAME("Pad Photosensor 2 (U)") PORT_CHANGED_MEMBER(DEVICE_SELF, taitob_c_state,realpunc_sensor, 0) + PORT_BIT( 0x40, IP_ACTIVE_LOW,IPT_BUTTON4 ) PORT_NAME("Pad Photosensor 3 (D)") PORT_CHANGED_MEMBER(DEVICE_SELF, taitob_c_state,realpunc_sensor, 0) PORT_BIT( 0x80, IP_ACTIVE_LOW,IPT_UNKNOWN ) INPUT_PORTS_END @@ -1757,13 +1757,13 @@ MACHINE_CONFIG_START(taitob_state::rastsag2) MCFG_QUANTUM_TIME(attotime::from_hz(600)) - MCFG_DEVICE_ADD("tc0220ioc", TC0220IOC, 0) - MCFG_TC0220IOC_READ_0_CB(IOPORT("DSWA")) - MCFG_TC0220IOC_READ_1_CB(IOPORT("DSWB")) - MCFG_TC0220IOC_READ_2_CB(IOPORT("IN0")) - MCFG_TC0220IOC_READ_3_CB(IOPORT("IN1")) - MCFG_TC0220IOC_WRITE_4_CB(WRITE8(*this, taitob_state, player_12_coin_ctrl_w)) - MCFG_TC0220IOC_READ_7_CB(IOPORT("IN2")) + TC0220IOC(config, m_tc0220ioc, 0); + m_tc0220ioc->read_0_callback().set_ioport("DSWA"); + m_tc0220ioc->read_1_callback().set_ioport("DSWB"); + m_tc0220ioc->read_2_callback().set_ioport("IN0"); + m_tc0220ioc->read_3_callback().set_ioport("IN1"); + m_tc0220ioc->write_4_callback().set(FUNC(taitob_state::player_12_coin_ctrl_w)); + m_tc0220ioc->read_7_callback().set_ioport("IN2"); /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -1815,13 +1815,13 @@ MACHINE_CONFIG_START(taitob_state::masterw) MCFG_QUANTUM_TIME(attotime::from_hz(600)) - MCFG_DEVICE_ADD("tc0040ioc", TC0040IOC, 0) - MCFG_TC0040IOC_READ_0_CB(IOPORT("DSWA")) - MCFG_TC0040IOC_READ_1_CB(IOPORT("DSWB")) - MCFG_TC0040IOC_READ_2_CB(IOPORT("IN0")) - MCFG_TC0040IOC_READ_3_CB(IOPORT("IN1")) - MCFG_TC0040IOC_WRITE_4_CB(WRITE8(*this, taitob_state, player_12_coin_ctrl_w)) - MCFG_TC0040IOC_READ_7_CB(IOPORT("IN2")) + tc0040ioc_device &tc0040ioc(TC0040IOC(config, "tc0040ioc", 0)); + tc0040ioc.read_0_callback().set_ioport("DSWA"); + tc0040ioc.read_1_callback().set_ioport("DSWB"); + tc0040ioc.read_2_callback().set_ioport("IN0"); + tc0040ioc.read_3_callback().set_ioport("IN1"); + tc0040ioc.write_4_callback().set(FUNC(taitob_state::player_12_coin_ctrl_w)); + tc0040ioc.read_7_callback().set_ioport("IN2"); /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -1850,13 +1850,13 @@ MACHINE_CONFIG_START(taitob_state::masterw) /* sound hardware */ SPEAKER(config, "mono").front_center(); - MCFG_DEVICE_ADD("ymsnd", YM2203, 24_MHz_XTAL / 8) /* 3 MHz */ - MCFG_YM2203_IRQ_HANDLER(INPUTLINE("audiocpu", 0)) - MCFG_AY8910_PORT_A_WRITE_CB(MEMBANK("audiobank")) MCFG_DEVCB_MASK(0x03) - MCFG_SOUND_ROUTE(0, "mono", 0.25) - MCFG_SOUND_ROUTE(1, "mono", 0.25) - MCFG_SOUND_ROUTE(2, "mono", 0.25) - MCFG_SOUND_ROUTE(3, "mono", 0.80) + ym2203_device &ymsnd(YM2203(config, m_ym, 24_MHz_XTAL / 8)); /* 3 MHz */ + ymsnd.irq_handler().set_inputline(m_audiocpu, 0); + ymsnd.port_a_write_callback().set_membank(m_audiobank).mask(0x03); + ymsnd.add_route(0, "mono", 0.25); + ymsnd.add_route(1, "mono", 0.25); + ymsnd.add_route(2, "mono", 0.25); + ymsnd.add_route(3, "mono", 0.80); MCFG_DEVICE_ADD("ciu", PC060HA, 0) MCFG_PC060HA_MASTER_CPU("maincpu") @@ -1894,13 +1894,13 @@ MACHINE_CONFIG_START(taitob_state::ashura) MCFG_QUANTUM_TIME(attotime::from_hz(600)) - MCFG_DEVICE_ADD("tc0220ioc", TC0220IOC, 0) - MCFG_TC0220IOC_READ_0_CB(IOPORT("DSWA")) - MCFG_TC0220IOC_READ_1_CB(IOPORT("DSWB")) - MCFG_TC0220IOC_READ_2_CB(IOPORT("IN0")) - MCFG_TC0220IOC_READ_3_CB(IOPORT("IN1")) - MCFG_TC0220IOC_WRITE_4_CB(WRITE8(*this, taitob_state, player_12_coin_ctrl_w)) - MCFG_TC0220IOC_READ_7_CB(IOPORT("IN2")) + TC0220IOC(config, m_tc0220ioc, 0); + m_tc0220ioc->read_0_callback().set_ioport("DSWA"); + m_tc0220ioc->read_1_callback().set_ioport("DSWB"); + m_tc0220ioc->read_2_callback().set_ioport("IN0"); + m_tc0220ioc->read_3_callback().set_ioport("IN1"); + m_tc0220ioc->write_4_callback().set(FUNC(taitob_state::player_12_coin_ctrl_w)); + m_tc0220ioc->read_7_callback().set_ioport("IN2"); /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -1952,13 +1952,13 @@ MACHINE_CONFIG_START(taitob_state::crimec) MCFG_QUANTUM_TIME(attotime::from_hz(600)) - MCFG_DEVICE_ADD("tc0220ioc", TC0220IOC, 0) - MCFG_TC0220IOC_READ_0_CB(IOPORT("DSWA")) - MCFG_TC0220IOC_READ_1_CB(IOPORT("DSWB")) - MCFG_TC0220IOC_READ_2_CB(IOPORT("IN0")) - MCFG_TC0220IOC_READ_3_CB(IOPORT("IN1")) - MCFG_TC0220IOC_WRITE_4_CB(WRITE8(*this, taitob_state, player_12_coin_ctrl_w)) - MCFG_TC0220IOC_READ_7_CB(IOPORT("IN2")) + TC0220IOC(config, m_tc0220ioc, 0); + m_tc0220ioc->read_0_callback().set_ioport("DSWA"); + m_tc0220ioc->read_1_callback().set_ioport("DSWB"); + m_tc0220ioc->read_2_callback().set_ioport("IN0"); + m_tc0220ioc->read_3_callback().set_ioport("IN1"); + m_tc0220ioc->write_4_callback().set(FUNC(taitob_state::player_12_coin_ctrl_w)); + m_tc0220ioc->read_7_callback().set_ioport("IN2"); /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -2011,13 +2011,13 @@ MACHINE_CONFIG_START(taitob_state::hitice) MCFG_QUANTUM_TIME(attotime::from_hz(600)) - MCFG_DEVICE_ADD("tc0220ioc", TC0220IOC, 0) - MCFG_TC0220IOC_READ_0_CB(IOPORT("DSWA")) - MCFG_TC0220IOC_READ_1_CB(IOPORT("DSWB")) - MCFG_TC0220IOC_READ_2_CB(IOPORT("IN0")) - MCFG_TC0220IOC_READ_3_CB(IOPORT("IN1")) - MCFG_TC0220IOC_WRITE_4_CB(WRITE8(*this, taitob_state, player_12_coin_ctrl_w)) - MCFG_TC0220IOC_READ_7_CB(IOPORT("IN2")) + TC0220IOC(config, m_tc0220ioc, 0); + m_tc0220ioc->read_0_callback().set_ioport("DSWA"); + m_tc0220ioc->read_1_callback().set_ioport("DSWB"); + m_tc0220ioc->read_2_callback().set_ioport("IN0"); + m_tc0220ioc->read_3_callback().set_ioport("IN1"); + m_tc0220ioc->write_4_callback().set(FUNC(taitob_state::player_12_coin_ctrl_w)); + m_tc0220ioc->read_7_callback().set_ioport("IN2"); /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -2047,13 +2047,13 @@ MACHINE_CONFIG_START(taitob_state::hitice) /* sound hardware */ SPEAKER(config, "mono").front_center(); - MCFG_DEVICE_ADD("ymsnd", YM2203, 24_MHz_XTAL / 8) /* 3 MHz */ - MCFG_YM2203_IRQ_HANDLER(INPUTLINE("audiocpu", 0)) - MCFG_AY8910_PORT_A_WRITE_CB(MEMBANK("audiobank")) MCFG_DEVCB_MASK(0x03) - MCFG_SOUND_ROUTE(0, "mono", 0.25) - MCFG_SOUND_ROUTE(1, "mono", 0.25) - MCFG_SOUND_ROUTE(2, "mono", 0.25) - MCFG_SOUND_ROUTE(3, "mono", 0.80) + ym2203_device &ymsnd(YM2203(config, m_ym, 24_MHz_XTAL / 8)); /* 3 MHz */ + ymsnd.irq_handler().set_inputline(m_audiocpu, 0); + ymsnd.port_a_write_callback().set_membank(m_audiobank).mask(0x03); + ymsnd.add_route(0, "mono", 0.25); + ymsnd.add_route(1, "mono", 0.25); + ymsnd.add_route(2, "mono", 0.25); + ymsnd.add_route(3, "mono", 0.80); MCFG_DEVICE_ADD("oki", OKIM6295, 1056000, okim6295_device::PIN7_HIGH) // clock frequency & pin 7 not verified MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) @@ -2075,13 +2075,13 @@ MACHINE_CONFIG_START(taitob_state::rambo3p) MCFG_QUANTUM_TIME(attotime::from_hz(600)) - MCFG_DEVICE_ADD("tc0220ioc", TC0220IOC, 0) - MCFG_TC0220IOC_READ_0_CB(IOPORT("DSWA")) - MCFG_TC0220IOC_READ_1_CB(IOPORT("DSWB")) - MCFG_TC0220IOC_READ_2_CB(IOPORT("IN0")) - MCFG_TC0220IOC_READ_3_CB(IOPORT("IN1")) - MCFG_TC0220IOC_WRITE_4_CB(WRITE8(*this, taitob_state, player_12_coin_ctrl_w)) - MCFG_TC0220IOC_READ_7_CB(IOPORT("IN2")) + TC0220IOC(config, m_tc0220ioc, 0); + m_tc0220ioc->read_0_callback().set_ioport("DSWA"); + m_tc0220ioc->read_1_callback().set_ioport("DSWB"); + m_tc0220ioc->read_2_callback().set_ioport("IN0"); + m_tc0220ioc->read_3_callback().set_ioport("IN1"); + m_tc0220ioc->write_4_callback().set(FUNC(taitob_state::player_12_coin_ctrl_w)); + m_tc0220ioc->read_7_callback().set_ioport("IN2"); /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -2134,13 +2134,13 @@ MACHINE_CONFIG_START(taitob_state::rambo3) MCFG_QUANTUM_TIME(attotime::from_hz(600)) - MCFG_DEVICE_ADD("tc0220ioc", TC0220IOC, 0) - MCFG_TC0220IOC_READ_0_CB(IOPORT("DSWA")) - MCFG_TC0220IOC_READ_1_CB(IOPORT("DSWB")) - MCFG_TC0220IOC_READ_2_CB(IOPORT("IN0")) - MCFG_TC0220IOC_READ_3_CB(IOPORT("IN1")) - MCFG_TC0220IOC_WRITE_4_CB(WRITE8(*this, taitob_state, player_12_coin_ctrl_w)) - MCFG_TC0220IOC_READ_7_CB(IOPORT("IN2")) + TC0220IOC(config, m_tc0220ioc, 0); + m_tc0220ioc->read_0_callback().set_ioport("DSWA"); + m_tc0220ioc->read_1_callback().set_ioport("DSWB"); + m_tc0220ioc->read_2_callback().set_ioport("IN0"); + m_tc0220ioc->read_3_callback().set_ioport("IN1"); + m_tc0220ioc->write_4_callback().set(FUNC(taitob_state::player_12_coin_ctrl_w)); + m_tc0220ioc->read_7_callback().set_ioport("IN2"); /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -2195,13 +2195,13 @@ MACHINE_CONFIG_START(taitob_state::pbobble) MCFG_DEVICE_ADD("eeprom", EEPROM_SERIAL_93C46_16BIT) - MCFG_DEVICE_ADD("tc0640fio", TC0640FIO, 0) - MCFG_TC0640FIO_READ_0_CB(IOPORT("SERVICE")) - MCFG_TC0640FIO_READ_1_CB(IOPORT("COIN")) - MCFG_TC0640FIO_READ_2_CB(IOPORT("START")) - MCFG_TC0640FIO_READ_3_CB(IOPORT("P1_P2_A")) - MCFG_TC0640FIO_WRITE_4_CB(WRITE8(*this, taitob_state, player_12_coin_ctrl_w)) - MCFG_TC0640FIO_READ_7_CB(IOPORT("P1_P2_B")) + TC0640FIO(config, m_tc0640fio, 0); + m_tc0640fio->read_0_callback().set_ioport("SERVICE"); + m_tc0640fio->read_1_callback().set_ioport("COIN"); + m_tc0640fio->read_2_callback().set_ioport("START"); + m_tc0640fio->read_3_callback().set_ioport("P1_P2_A"); + m_tc0640fio->write_4_callback().set(FUNC(taitob_state::player_12_coin_ctrl_w)); + m_tc0640fio->read_7_callback().set_ioport("P1_P2_B"); MCFG_DEVICE_ADD("mb87078", MB87078, 0) MCFG_MB87078_GAIN_CHANGED_CB(WRITE8(*this, taitob_state, mb87078_gain_changed)) @@ -2259,13 +2259,13 @@ MACHINE_CONFIG_START(taitob_state::spacedx) MCFG_DEVICE_ADD("eeprom", EEPROM_SERIAL_93C46_16BIT) - MCFG_DEVICE_ADD("tc0640fio", TC0640FIO, 0) - MCFG_TC0640FIO_READ_0_CB(IOPORT("SERVICE")) - MCFG_TC0640FIO_READ_1_CB(IOPORT("COIN")) - MCFG_TC0640FIO_READ_2_CB(IOPORT("START")) - MCFG_TC0640FIO_READ_3_CB(IOPORT("P1_P2_A")) - MCFG_TC0640FIO_WRITE_4_CB(WRITE8(*this, taitob_state, player_12_coin_ctrl_w)) - MCFG_TC0640FIO_READ_7_CB(IOPORT("P1_P2_B")) + TC0640FIO(config, m_tc0640fio, 0); + m_tc0640fio->read_0_callback().set_ioport("SERVICE"); + m_tc0640fio->read_1_callback().set_ioport("COIN"); + m_tc0640fio->read_2_callback().set_ioport("START"); + m_tc0640fio->read_3_callback().set_ioport("P1_P2_A"); + m_tc0640fio->write_4_callback().set(FUNC(taitob_state::player_12_coin_ctrl_w)); + m_tc0640fio->read_7_callback().set_ioport("P1_P2_B"); MCFG_DEVICE_ADD("mb87078", MB87078, 0) MCFG_MB87078_GAIN_CHANGED_CB(WRITE8(*this, taitob_state, mb87078_gain_changed)) @@ -2320,13 +2320,13 @@ MACHINE_CONFIG_START(taitob_state::spacedxo) MCFG_QUANTUM_TIME(attotime::from_hz(600)) - MCFG_DEVICE_ADD("tc0220ioc", TC0220IOC, 0) - MCFG_TC0220IOC_READ_0_CB(IOPORT("DSWA")) - MCFG_TC0220IOC_READ_1_CB(IOPORT("DSWB")) - MCFG_TC0220IOC_READ_2_CB(IOPORT("IN0")) - MCFG_TC0220IOC_READ_3_CB(IOPORT("IN1")) - MCFG_TC0220IOC_WRITE_4_CB(WRITE8(*this, taitob_state, player_12_coin_ctrl_w)) - MCFG_TC0220IOC_READ_7_CB(IOPORT("IN2")) + TC0220IOC(config, m_tc0220ioc, 0); + m_tc0220ioc->read_0_callback().set_ioport("DSWA"); + m_tc0220ioc->read_1_callback().set_ioport("DSWB"); + m_tc0220ioc->read_2_callback().set_ioport("IN0"); + m_tc0220ioc->read_3_callback().set_ioport("IN1"); + m_tc0220ioc->write_4_callback().set(FUNC(taitob_state::player_12_coin_ctrl_w)); + m_tc0220ioc->read_7_callback().set_ioport("IN2"); /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -2381,13 +2381,13 @@ MACHINE_CONFIG_START(taitob_state::qzshowby) MCFG_DEVICE_ADD("eeprom", EEPROM_SERIAL_93C46_16BIT) - MCFG_DEVICE_ADD("tc0640fio", TC0640FIO, 0) - MCFG_TC0640FIO_READ_0_CB(IOPORT("SERVICE")) - MCFG_TC0640FIO_READ_1_CB(IOPORT("COIN")) - MCFG_TC0640FIO_READ_2_CB(IOPORT("START")) - MCFG_TC0640FIO_READ_3_CB(IOPORT("P1_P2_A")) - MCFG_TC0640FIO_WRITE_4_CB(WRITE8(*this, taitob_state, player_12_coin_ctrl_w)) - MCFG_TC0640FIO_READ_7_CB(IOPORT("P1_P2_B")) + TC0640FIO(config, m_tc0640fio, 0); + m_tc0640fio->read_0_callback().set_ioport("SERVICE"); + m_tc0640fio->read_1_callback().set_ioport("COIN"); + m_tc0640fio->read_2_callback().set_ioport("START"); + m_tc0640fio->read_3_callback().set_ioport("P1_P2_A"); + m_tc0640fio->write_4_callback().set(FUNC(taitob_state::player_12_coin_ctrl_w)); + m_tc0640fio->read_7_callback().set_ioport("P1_P2_B"); MCFG_DEVICE_ADD("mb87078", MB87078, 0) MCFG_MB87078_GAIN_CHANGED_CB(WRITE8(*this, taitob_state, mb87078_gain_changed)) @@ -2442,13 +2442,13 @@ MACHINE_CONFIG_START(taitob_state::viofight) MCFG_QUANTUM_TIME(attotime::from_hz(600)) - MCFG_DEVICE_ADD("tc0220ioc", TC0220IOC, 0) - MCFG_TC0220IOC_READ_0_CB(IOPORT("DSWA")) - MCFG_TC0220IOC_READ_1_CB(IOPORT("DSWB")) - MCFG_TC0220IOC_READ_2_CB(IOPORT("IN0")) - MCFG_TC0220IOC_READ_3_CB(IOPORT("IN1")) - MCFG_TC0220IOC_WRITE_4_CB(WRITE8(*this, taitob_state, player_12_coin_ctrl_w)) - MCFG_TC0220IOC_READ_7_CB(IOPORT("IN2")) + TC0220IOC(config, m_tc0220ioc, 0); + m_tc0220ioc->read_0_callback().set_ioport("DSWA"); + m_tc0220ioc->read_1_callback().set_ioport("DSWB"); + m_tc0220ioc->read_2_callback().set_ioport("IN0"); + m_tc0220ioc->read_3_callback().set_ioport("IN1"); + m_tc0220ioc->write_4_callback().set(FUNC(taitob_state::player_12_coin_ctrl_w)); + m_tc0220ioc->read_7_callback().set_ioport("IN2"); /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -2477,13 +2477,13 @@ MACHINE_CONFIG_START(taitob_state::viofight) /* sound hardware */ SPEAKER(config, "mono").front_center(); - MCFG_DEVICE_ADD("ymsnd", YM2203, 24_MHz_XTAL / 8) /* 3 MHz */ - MCFG_YM2203_IRQ_HANDLER(INPUTLINE("audiocpu", 0)) - MCFG_AY8910_PORT_A_WRITE_CB(MEMBANK("audiobank")) MCFG_DEVCB_MASK(0x03) - MCFG_SOUND_ROUTE(0, "mono", 0.25) - MCFG_SOUND_ROUTE(1, "mono", 0.25) - MCFG_SOUND_ROUTE(2, "mono", 0.25) - MCFG_SOUND_ROUTE(3, "mono", 0.80) + ym2203_device &ymsnd(YM2203(config, m_ym, 24_MHz_XTAL / 8)); /* 3 MHz */ + ymsnd.irq_handler().set_inputline(m_audiocpu, 0); + ymsnd.port_a_write_callback().set_membank(m_audiobank).mask(0x03); + ymsnd.add_route(0, "mono", 0.25); + ymsnd.add_route(1, "mono", 0.25); + ymsnd.add_route(2, "mono", 0.25); + ymsnd.add_route(3, "mono", 0.80); MCFG_DEVICE_ADD("oki", OKIM6295, 4.224_MHz_XTAL / 4, okim6295_device::PIN7_HIGH) // 1.056MHz clock frequency, but pin 7 not verified MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) @@ -2505,13 +2505,13 @@ MACHINE_CONFIG_START(taitob_state::silentd) MCFG_QUANTUM_TIME(attotime::from_hz(600)) - MCFG_DEVICE_ADD("tc0220ioc", TC0220IOC, 0) - MCFG_TC0220IOC_READ_0_CB(IOPORT("DSWA")) - MCFG_TC0220IOC_READ_1_CB(IOPORT("DSWB")) - MCFG_TC0220IOC_READ_2_CB(IOPORT("IN0")) - MCFG_TC0220IOC_READ_3_CB(IOPORT("IN1")) - MCFG_TC0220IOC_WRITE_4_CB(WRITE8(*this, taitob_state, player_12_coin_ctrl_w)) - MCFG_TC0220IOC_READ_7_CB(IOPORT("IN2")) + TC0220IOC(config, m_tc0220ioc, 0); + m_tc0220ioc->read_0_callback().set_ioport("DSWA"); + m_tc0220ioc->read_1_callback().set_ioport("DSWB"); + m_tc0220ioc->read_2_callback().set_ioport("IN0"); + m_tc0220ioc->read_3_callback().set_ioport("IN1"); + m_tc0220ioc->write_4_callback().set(FUNC(taitob_state::player_12_coin_ctrl_w)); + m_tc0220ioc->read_7_callback().set_ioport("IN2"); /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -2563,13 +2563,13 @@ MACHINE_CONFIG_START(taitob_state::selfeena) MCFG_QUANTUM_TIME(attotime::from_hz(600)) - MCFG_DEVICE_ADD("tc0220ioc", TC0220IOC, 0) - MCFG_TC0220IOC_READ_0_CB(IOPORT("DSWA")) - MCFG_TC0220IOC_READ_1_CB(IOPORT("DSWB")) - MCFG_TC0220IOC_READ_2_CB(IOPORT("IN0")) - MCFG_TC0220IOC_READ_3_CB(IOPORT("IN1")) - MCFG_TC0220IOC_WRITE_4_CB(WRITE8(*this, taitob_state, player_12_coin_ctrl_w)) - MCFG_TC0220IOC_READ_7_CB(IOPORT("IN2")) + TC0220IOC(config, m_tc0220ioc, 0); + m_tc0220ioc->read_0_callback().set_ioport("DSWA"); + m_tc0220ioc->read_1_callback().set_ioport("DSWB"); + m_tc0220ioc->read_2_callback().set_ioport("IN0"); + m_tc0220ioc->read_3_callback().set_ioport("IN1"); + m_tc0220ioc->write_4_callback().set(FUNC(taitob_state::player_12_coin_ctrl_w)); + m_tc0220ioc->read_7_callback().set_ioport("IN2"); /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -2630,13 +2630,13 @@ MACHINE_CONFIG_START(taitob_state::ryujin) MCFG_QUANTUM_TIME(attotime::from_hz(600)) - MCFG_DEVICE_ADD("tc0220ioc", TC0220IOC, 0) - MCFG_TC0220IOC_READ_0_CB(IOPORT("DSWA")) - MCFG_TC0220IOC_READ_1_CB(IOPORT("DSWB")) - MCFG_TC0220IOC_READ_2_CB(IOPORT("IN0")) - MCFG_TC0220IOC_READ_3_CB(IOPORT("IN1")) - MCFG_TC0220IOC_WRITE_4_CB(WRITE8(*this, taitob_state, player_12_coin_ctrl_w)) - MCFG_TC0220IOC_READ_7_CB(IOPORT("IN2")) + TC0220IOC(config, m_tc0220ioc, 0); + m_tc0220ioc->read_0_callback().set_ioport("DSWA"); + m_tc0220ioc->read_1_callback().set_ioport("DSWB"); + m_tc0220ioc->read_2_callback().set_ioport("IN0"); + m_tc0220ioc->read_3_callback().set_ioport("IN1"); + m_tc0220ioc->write_4_callback().set(FUNC(taitob_state::player_12_coin_ctrl_w)); + m_tc0220ioc->read_7_callback().set_ioport("IN2"); /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -2695,13 +2695,13 @@ MACHINE_CONFIG_START(taitob_state::sbm) MCFG_QUANTUM_TIME(attotime::from_hz(600)) - MCFG_DEVICE_ADD("tc0510nio", TC0510NIO, 0) - MCFG_TC0510NIO_READ_0_CB(IOPORT("DSWA")) - MCFG_TC0510NIO_READ_1_CB(IOPORT("DSWB")) - MCFG_TC0510NIO_READ_2_CB(IOPORT("JOY")) - MCFG_TC0510NIO_READ_3_CB(IOPORT("START")) - MCFG_TC0510NIO_WRITE_4_CB(WRITE8(*this, taitob_state, player_12_coin_ctrl_w)) - MCFG_TC0510NIO_READ_7_CB(IOPORT("PHOTOSENSOR")) + TC0510NIO(config, m_tc0510nio, 0); + m_tc0510nio->read_0_callback().set_ioport("DSWA"); + m_tc0510nio->read_1_callback().set_ioport("DSWB"); + m_tc0510nio->read_2_callback().set_ioport("JOY"); + m_tc0510nio->read_3_callback().set_ioport("START"); + m_tc0510nio->write_4_callback().set(FUNC(taitob_state::player_12_coin_ctrl_w)); + m_tc0510nio->read_7_callback().set_ioport("PHOTOSENSOR"); /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -2752,13 +2752,13 @@ MACHINE_CONFIG_START(taitob_c_state::realpunc) MCFG_QUANTUM_TIME(attotime::from_hz(600)) - MCFG_DEVICE_ADD("tc0510nio", TC0510NIO, 0) - MCFG_TC0510NIO_READ_0_CB(IOPORT("DSWA")) - MCFG_TC0510NIO_READ_1_CB(IOPORT("DSWB")) - MCFG_TC0510NIO_READ_2_CB(IOPORT("IN0")) - MCFG_TC0510NIO_READ_3_CB(IOPORT("IN1")) - MCFG_TC0510NIO_WRITE_4_CB(WRITE8(*this, taitob_state, player_12_coin_ctrl_w)) - MCFG_TC0510NIO_READ_7_CB(IOPORT("IN2")) + TC0510NIO(config, m_tc0510nio, 0); + m_tc0510nio->read_0_callback().set_ioport("DSWA"); + m_tc0510nio->read_1_callback().set_ioport("DSWB"); + m_tc0510nio->read_2_callback().set_ioport("IN0"); + m_tc0510nio->read_3_callback().set_ioport("IN1"); + m_tc0510nio->write_4_callback().set(FUNC(taitob_c_state::player_12_coin_ctrl_w)); + m_tc0510nio->read_7_callback().set_ioport("IN2"); /* video hardware */ MCFG_SCREEN_ADD("screen", RASTER) @@ -2766,13 +2766,13 @@ MACHINE_CONFIG_START(taitob_c_state::realpunc) MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0)) MCFG_SCREEN_SIZE(64*8, 32*8) MCFG_SCREEN_VISIBLE_AREA(0*8, 40*8-1, 2*8, 30*8-1) - MCFG_SCREEN_UPDATE_DRIVER(taitob_state, screen_update_realpunc) + MCFG_SCREEN_UPDATE_DRIVER(taitob_c_state, screen_update_realpunc) MCFG_SCREEN_VBLANK_CALLBACK(WRITELINE("tc0180vcu", tc0180vcu_device, screen_vblank)) MCFG_PALETTE_ADD("palette", 4096) MCFG_PALETTE_FORMAT(RRRRGGGGBBBBxxxx) - MCFG_VIDEO_START_OVERRIDE(taitob_state,realpunc) + MCFG_VIDEO_START_OVERRIDE(taitob_c_state,realpunc) MCFG_HD63484_ADD("hd63484", 0, realpunc_hd63484_map) MCFG_HD63484_AUTO_CONFIGURE_SCREEN(false) |