From 0a455b0eff0f6c19039fe731736ccf8903720eae Mon Sep 17 00:00:00 2001 From: mooglyguy Date: Thu, 31 May 2018 18:33:07 +0200 Subject: [PATCH] segag80r: Eliminated machine().device and also split monsterb sound board into a proper device, nw --- scripts/target/mame/arcade.lua | 1 + src/mame/audio/segag80r.cpp | 87 ++++++++++++++++++---------------- src/mame/audio/segag80r.h | 68 ++++++++++++++++++++++++++ src/mame/drivers/segag80r.cpp | 40 ++++++++++------ src/mame/includes/segag80r.h | 19 +++----- 5 files changed, 148 insertions(+), 67 deletions(-) create mode 100644 src/mame/audio/segag80r.h diff --git a/scripts/target/mame/arcade.lua b/scripts/target/mame/arcade.lua index a766198ef74..3a3f069db91 100644 --- a/scripts/target/mame/arcade.lua +++ b/scripts/target/mame/arcade.lua @@ -3282,6 +3282,7 @@ files { MAME_DIR .. "src/mame/machine/segag80.cpp", MAME_DIR .. "src/mame/machine/segag80.h", MAME_DIR .. "src/mame/audio/segag80r.cpp", + MAME_DIR .. "src/mame/audio/segag80r.h", MAME_DIR .. "src/mame/video/segag80r.cpp", MAME_DIR .. "src/mame/drivers/segag80v.cpp", MAME_DIR .. "src/mame/includes/segag80v.h", diff --git a/src/mame/audio/segag80r.cpp b/src/mame/audio/segag80r.cpp index db25e4ed4c0..35e05e7e7b1 100644 --- a/src/mame/audio/segag80r.cpp +++ b/src/mame/audio/segag80r.cpp @@ -12,14 +12,11 @@ #include "emu.h" #include "includes/segag80r.h" -#include "cpu/mcs48/mcs48.h" -#include "machine/i8255.h" -#include "machine/i8243.h" -#include "sound/samples.h" -#include "sound/tms36xx.h" +#include "audio/segag80r.h" #include "sound/dac.h" #include "sound/volt_reg.h" +#include "speaker.h" /************************************* * @@ -662,6 +659,7 @@ WRITE8_MEMBER(segag80r_state::spaceod_sound_w) Port C connects to a NEC7751 (8048 CPU derivative) to control four "samples". */ +DEFINE_DEVICE_TYPE(MONSTERB_SOUND, monsterb_sound_device, "monsterb_sound", "Monster Bash Sound Board") static const char *const monsterb_sample_names[] = { @@ -671,6 +669,23 @@ static const char *const monsterb_sample_names[] = nullptr }; +monsterb_sound_device::monsterb_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, MONSTERB_SOUND, tag, owner, clock) + , m_audiocpu(*this, "audiocpu") + , m_audiocpu_region(*this, "n7751") + , m_music(*this, "music") + , m_samples(*this, "samples") + , m_i8243(*this, "i8243") +{ +} + +void monsterb_sound_device::device_start() +{ + save_item(NAME(m_n7751_command)); + save_item(NAME(m_n7751_busy)); + save_item(NAME(m_sound_state)); + save_item(NAME(m_sound_addr)); +} /************************************* * @@ -678,32 +693,26 @@ static const char *const monsterb_sample_names[] = * *************************************/ -MACHINE_CONFIG_START(segag80r_state::monsterb_sound_board) - MCFG_DEVICE_ADD("ppi8255", I8255A, 0) - MCFG_I8255_OUT_PORTA_CB(WRITE8(*this, segag80r_state, monsterb_sound_a_w)) - MCFG_I8255_OUT_PORTB_CB(WRITE8(*this, segag80r_state, monsterb_sound_b_w)) - MCFG_I8255_IN_PORTC_CB(READ8(*this, segag80r_state, n7751_status_r)) - MCFG_I8255_OUT_PORTC_CB(WRITE8(*this, segag80r_state, n7751_command_w)) - +MACHINE_CONFIG_START(monsterb_sound_device::device_add_mconfig) /* basic machine hardware */ - MCFG_DEVICE_ADD("audiocpu", N7751, 6000000) + MCFG_DEVICE_ADD(m_audiocpu, N7751, 6000000) MCFG_MCS48_PORT_T1_IN_CB(GND) // labelled as "TEST", connected to ground - MCFG_MCS48_PORT_P2_IN_CB(READ8(*this, segag80r_state, n7751_command_r)) - MCFG_MCS48_PORT_BUS_IN_CB(READ8(*this, segag80r_state, n7751_rom_r)) + MCFG_MCS48_PORT_P2_IN_CB(READ8(*this, monsterb_sound_device, n7751_command_r)) + MCFG_MCS48_PORT_BUS_IN_CB(READ8(*this, monsterb_sound_device, n7751_rom_r)) MCFG_MCS48_PORT_P1_OUT_CB(WRITE8("dac", dac_byte_interface, write)) - MCFG_MCS48_PORT_P2_OUT_CB(WRITE8(*this, segag80r_state, n7751_p2_w)) - MCFG_MCS48_PORT_PROG_OUT_CB(WRITELINE("audio_8243", i8243_device, prog_w)) + MCFG_MCS48_PORT_P2_OUT_CB(WRITE8(*this, monsterb_sound_device, n7751_p2_w)) + MCFG_MCS48_PORT_PROG_OUT_CB(WRITELINE(m_i8243, i8243_device, prog_w)) - MCFG_I8243_ADD("audio_8243", NOOP, WRITE8(*this, segag80r_state,n7751_rom_control_w)) + MCFG_DEVICE_ADD(m_i8243, I8243, 0) + MCFG_I8243_READHANDLER(NOOP) + MCFG_I8243_WRITEHANDLER(WRITE8(*this, monsterb_sound_device, n7751_rom_control_w)) - /* sound hardware */ - - MCFG_DEVICE_ADD("samples", SAMPLES) + MCFG_DEVICE_ADD(m_samples, SAMPLES) MCFG_SAMPLES_CHANNELS(2) MCFG_SAMPLES_NAMES(monsterb_sample_names) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.25) - MCFG_TMS36XX_ADD("music", 247) + MCFG_TMS36XX_ADD(m_music, 247) MCFG_TMS36XX_TYPE(TMS3617) MCFG_TMS36XX_DECAY_TIMES(0.5, 0.5, 0.5, 0.5, 0.5, 0.5) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5) @@ -711,6 +720,8 @@ MACHINE_CONFIG_START(segag80r_state::monsterb_sound_board) MCFG_DEVICE_ADD("dac", DAC_8BIT_R2R, 0) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.5) // 50K (R91-97)/100K (R98-106) ladder network MCFG_DEVICE_ADD("vref", VOLTAGE_REGULATOR, 0) MCFG_VOLTAGE_REGULATOR_OUTPUT(5.0) MCFG_SOUND_ROUTE(0, "dac", 1.0, DAC_VREF_POS_INPUT) MCFG_SOUND_ROUTE(0, "dac", -1.0, DAC_VREF_NEG_INPUT) + + SPEAKER(config, "speaker").front_center(); MACHINE_CONFIG_END @@ -720,17 +731,14 @@ MACHINE_CONFIG_END * *************************************/ -WRITE8_MEMBER(segag80r_state::monsterb_sound_a_w) +WRITE8_MEMBER(monsterb_sound_device::sound_a_w) { - tms36xx_device *tms = machine().device("music"); - int enable_val; - /* Lower four data lines get decoded into 13 control lines */ - tms->tms36xx_note_w(0, data & 15); + m_music->tms36xx_note_w(0, data & 15); /* Top four data lines address an 82S123 ROM that enables/disables voices */ - enable_val = machine().root_device().memregion("prom")->base()[(data & 0xF0) >> 4]; - tms->tms3617_enable_w(enable_val >> 2); + int enable_val = machine().root_device().memregion("prom")->base()[(data & 0xF0) >> 4]; + m_music->tms3617_enable_w(enable_val >> 2); } @@ -741,7 +749,7 @@ WRITE8_MEMBER(segag80r_state::monsterb_sound_a_w) * *************************************/ -WRITE8_MEMBER(segag80r_state::monsterb_sound_b_w) +WRITE8_MEMBER(monsterb_sound_device::sound_b_w) { uint8_t diff = data ^ m_sound_state[1]; m_sound_state[1] = data; @@ -763,13 +771,13 @@ WRITE8_MEMBER(segag80r_state::monsterb_sound_b_w) * *************************************/ -READ8_MEMBER(segag80r_state::n7751_status_r) +READ8_MEMBER(monsterb_sound_device::n7751_status_r) { return m_n7751_busy << 4; } -WRITE8_MEMBER(segag80r_state::n7751_command_w) +WRITE8_MEMBER(monsterb_sound_device::n7751_command_w) { /* Z80 7751 control port @@ -783,7 +791,7 @@ WRITE8_MEMBER(segag80r_state::n7751_command_w) } -WRITE8_MEMBER(segag80r_state::n7751_rom_control_w) +WRITE8_MEMBER(monsterb_sound_device::n7751_rom_control_w) { /* P4 - address lines 0-3 */ /* P5 - address lines 4-7 */ @@ -806,7 +814,7 @@ WRITE8_MEMBER(segag80r_state::n7751_rom_control_w) case 3: m_sound_addr &= 0xfff; { - int numroms = memregion("n7751")->bytes() / 0x1000; + int numroms = m_audiocpu_region->bytes() / 0x1000; if (!(data & 0x01) && numroms >= 1) m_sound_addr |= 0x0000; if (!(data & 0x02) && numroms >= 2) m_sound_addr |= 0x1000; if (!(data & 0x04) && numroms >= 3) m_sound_addr |= 0x2000; @@ -817,14 +825,14 @@ WRITE8_MEMBER(segag80r_state::n7751_rom_control_w) } -READ8_MEMBER(segag80r_state::n7751_rom_r) +READ8_MEMBER(monsterb_sound_device::n7751_rom_r) { /* read from BUS */ - return memregion("n7751")->base()[m_sound_addr]; + return m_audiocpu_region->base()[m_sound_addr]; } -READ8_MEMBER(segag80r_state::n7751_command_r) +READ8_MEMBER(monsterb_sound_device::n7751_command_r) { /* read from P2 - 8255's PC0-2 connects to 7751's S0-2 (P24-P26 on an 8048) */ /* bit 0x80 is an alternate way to control the sample on/off; doesn't appear to be used */ @@ -832,11 +840,10 @@ READ8_MEMBER(segag80r_state::n7751_command_r) } -WRITE8_MEMBER(segag80r_state::n7751_p2_w) +WRITE8_MEMBER(monsterb_sound_device::n7751_p2_w) { - i8243_device *device = machine().device("audio_8243"); /* write to P2; low 4 bits go to 8243 */ - device->p2_w(space, offset, data & 0x0f); + m_i8243->p2_w(space, offset, data & 0x0f); /* output of bit $80 indicates we are ready (1) or busy (0) */ /* no other outputs are used */ diff --git a/src/mame/audio/segag80r.h b/src/mame/audio/segag80r.h new file mode 100644 index 00000000000..0c1b62593ea --- /dev/null +++ b/src/mame/audio/segag80r.h @@ -0,0 +1,68 @@ +// license:BSD-3-Clause +// copyright-holders:Aaron Giles +/*************************************************************************** + + Sega G-80 raster hardware + + Across these games, there's a mixture of discrete sound circuitry, + speech boards, ADPCM samples, and a TMS3617 music chip. + +***************************************************************************/ + +#ifndef MAME_AUDIO_SEGAG80R +#define MAME_AUDIO_SEGAG80R + +#pragma once + +#include "cpu/mcs48/mcs48.h" +#include "machine/i8243.h" +#include "machine/i8255.h" +#include "sound/samples.h" +#include "sound/tms36xx.h" + +class monsterb_sound_device : public device_t +{ +public: + template monsterb_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &®ion_tag) + : monsterb_sound_device(mconfig, tag, owner, clock) + { + m_audiocpu_region.set_tag(std::forward(region_tag)); + } + + monsterb_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + DECLARE_READ8_MEMBER(n7751_status_r); + DECLARE_WRITE8_MEMBER(n7751_command_w); + + DECLARE_WRITE8_MEMBER(sound_a_w); + DECLARE_WRITE8_MEMBER(sound_b_w); + + +protected: + // device-level overrides + virtual void device_start() override; + virtual void device_add_mconfig(machine_config &config) override; + + DECLARE_READ8_MEMBER(n7751_command_r); + DECLARE_WRITE8_MEMBER(n7751_p2_w); + + DECLARE_READ8_MEMBER(n7751_rom_r); + DECLARE_WRITE8_MEMBER(n7751_rom_control_w); + + required_device m_audiocpu; + required_memory_region m_audiocpu_region; + + required_device m_music; + required_device m_samples; + + required_device m_i8243; + + uint8_t m_n7751_command; + uint8_t m_n7751_busy; + uint8_t m_sound_state[2]; + uint16_t m_sound_addr; +}; + +DECLARE_DEVICE_TYPE(MONSTERB_SOUND, monsterb_sound_device) + +#endif // MAME_AUDIO_SEGAG80R \ No newline at end of file diff --git a/src/mame/drivers/segag80r.cpp b/src/mame/drivers/segag80r.cpp index 41a860015c5..41caca1f151 100644 --- a/src/mame/drivers/segag80r.cpp +++ b/src/mame/drivers/segag80r.cpp @@ -855,9 +855,6 @@ MACHINE_CONFIG_START(segag80r_state::g80r_base) MCFG_SCREEN_RAW_PARAMS(PIXEL_CLOCK, HTOTAL, HBEND, HBSTART, VTOTAL, VBEND, VBSTART) MCFG_SCREEN_UPDATE_DRIVER(segag80r_state, screen_update_segag80r) MCFG_SCREEN_PALETTE("palette") - - /* sound hardware */ - SPEAKER(config, "speaker").front_center(); MACHINE_CONFIG_END @@ -866,6 +863,9 @@ MACHINE_CONFIG_START(segag80r_state::astrob) /* basic machine hardware */ + /* sound hardware */ + SPEAKER(config, "speaker").front_center(); + /* sound boards */ astrob_sound_board(config); sega_speech_board(config); @@ -880,6 +880,9 @@ MACHINE_CONFIG_START(segag80r_state::sega005) MCFG_DEVICE_MODIFY("maincpu") MCFG_DEVICE_IO_MAP(main_ppi8255_portmap) + /* sound hardware */ + SPEAKER(config, "speaker").front_center(); + /* sound boards */ sega005_sound_board(config); MACHINE_CONFIG_END @@ -897,6 +900,9 @@ MACHINE_CONFIG_START(segag80r_state::spaceod) MCFG_PALETTE_MODIFY("palette") MCFG_PALETTE_ENTRIES(64+64) + /* sound hardware */ + SPEAKER(config, "speaker").front_center(); + /* sound boards */ spaceod_sound_board(config); MACHINE_CONFIG_END @@ -906,17 +912,22 @@ MACHINE_CONFIG_START(segag80r_state::monsterb) g80r_base(config); /* basic machine hardware */ - MCFG_DEVICE_MODIFY("maincpu") MCFG_DEVICE_IO_MAP(main_ppi8255_portmap) + MCFG_DEVICE_ADD(m_ppi, I8255A, 0) + MCFG_I8255_OUT_PORTA_CB(WRITE8(m_soundbrd, monsterb_sound_device, sound_a_w)) + MCFG_I8255_OUT_PORTB_CB(WRITE8(m_soundbrd, monsterb_sound_device, sound_b_w)) + MCFG_I8255_IN_PORTC_CB(READ8(m_soundbrd, monsterb_sound_device, n7751_status_r)) + MCFG_I8255_OUT_PORTC_CB(WRITE8(m_soundbrd, monsterb_sound_device, n7751_command_w)) + /* background board changes */ MCFG_GFXDECODE_MODIFY("gfxdecode", gfx_monsterb) MCFG_PALETTE_MODIFY("palette") MCFG_PALETTE_ENTRIES(64+64) /* sound boards */ - monsterb_sound_board(config); + MCFG_DEVICE_ADD(m_soundbrd, MONSTERB_SOUND, 0) MACHINE_CONFIG_END MACHINE_CONFIG_START(segag80r_state::monster2) @@ -940,6 +951,9 @@ MACHINE_CONFIG_START(segag80r_state::pignewt) MCFG_PALETTE_MODIFY("palette") MCFG_PALETTE_ENTRIES(64+64) + /* sound hardware */ + SPEAKER(config, "speaker").front_center(); + /* sound boards */ MCFG_SEGAUSB_ADD("usbsnd") MACHINE_CONFIG_END @@ -965,8 +979,10 @@ MACHINE_CONFIG_START(segag80r_state::sindbadm) MCFG_PALETTE_MODIFY("palette") MCFG_PALETTE_ENTRIES(64+64) - /* sound boards */ + /* sound hardware */ + SPEAKER(config, "speaker").front_center(); + /* sound boards */ MCFG_DEVICE_ADD("audiocpu", Z80, SINDBADM_SOUND_CLOCK/2) MCFG_DEVICE_PROGRAM_MAP(sindbadm_sound_map) MCFG_DEVICE_PERIODIC_INT_DRIVER(segag80r_state, irq0_line_hold, 4*60) @@ -1280,7 +1296,7 @@ ROM_START( monsterb ) ROM_LOAD( "1800b.prom-u22", 0xb000, 0x0800, CRC(6a062a04) SHA1(cae125f5c0867898f2c0a159026da69ff5a2897f) ) ROM_LOAD( "1801b.prom-u23", 0xb800, 0x0800, CRC(f38488fe) SHA1(dd0f2c655970e8755f9ca1898313ff5fd9f11563) ) - ROM_REGION( 0x400, "audiocpu", 0 ) + ROM_REGION( 0x400, "soundbrd:audiocpu", 0 ) ROM_LOAD( "7751.bin", 0x0000, 0x0400, CRC(6a9534fc) SHA1(67ad94674db5c2aab75785668f610f6f4eccd158) ) /* 7751 - U34 */ ROM_REGION( 0x10000, "gfx1", 0 ) @@ -1290,7 +1306,7 @@ ROM_START( monsterb ) ROM_REGION( 0x2000, "gfx2", 0 ) ROM_LOAD( "1518a.bg-u22", 0x0000, 0x2000, CRC(2d5932fe) SHA1(a9ca239a062e047b307cf3d0740cb6492a55abb4) ) - ROM_REGION( 0x2000, "n7751", 0 ) + ROM_REGION( 0x2000, "soundbrd:n7751", 0 ) ROM_LOAD( "1543snd.bin", 0x0000, 0x1000, CRC(b525ce8f) SHA1(61e541061a0a579101e52ffa2431540010b9df3e) ) /* U19 */ ROM_LOAD( "1544snd.bin", 0x1000, 0x1000, CRC(56c79fb0) SHA1(26de83efcc97318220603f83acf4387f6d70d806) ) /* U23 */ @@ -1307,7 +1323,7 @@ ROM_START( monsterb2 ) ROM_LOAD( "epr-1552.22", 0x8000, 0x2000, CRC(e876e216) SHA1(31301f2b576689aefcb42a4233f8fafb7f4791a7) ) ROM_LOAD( "epr-1553.23", 0xa000, 0x2000, CRC(4a839fb2) SHA1(3a15d74a0abd0548cb90c13f4d5baebe3ec83d23) ) - ROM_REGION( 0x400, "audiocpu", 0 ) + ROM_REGION( 0x400, "soundbrd:audiocpu", 0 ) ROM_LOAD( "7751.34", 0x0000, 0x0400, CRC(6a9534fc) SHA1(67ad94674db5c2aab75785668f610f6f4eccd158) ) ROM_REGION( 0x10000, "gfx1", 0 ) @@ -1317,7 +1333,7 @@ ROM_START( monsterb2 ) ROM_REGION( 0x2000, "gfx2", 0 ) ROM_LOAD( "epr-1554.58", 0x0000, 0x2000, CRC(a87937d0) SHA1(cfc2fca52bd74beb2f20ece07e9dd3e3f1038f7c) ) - ROM_REGION( 0x2000, "n7751", 0 ) + ROM_REGION( 0x2000, "soundbrd:n7751", 0 ) ROM_LOAD( "epr-1543.19", 0x0000, 0x1000, CRC(b525ce8f) SHA1(61e541061a0a579101e52ffa2431540010b9df3e) ) ROM_LOAD( "epr-1544.23", 0x1000, 0x1000, CRC(56c79fb0) SHA1(26de83efcc97318220603f83acf4387f6d70d806) ) @@ -1546,8 +1562,6 @@ void segag80r_state::init_monsterb() save_item(NAME(m_sound_state)); save_item(NAME(m_sound_addr)); - save_item(NAME(m_n7751_command)); - save_item(NAME(m_n7751_busy)); } @@ -1570,8 +1584,6 @@ void segag80r_state::init_monster2() save_item(NAME(m_sound_state)); save_item(NAME(m_sound_addr)); - save_item(NAME(m_n7751_command)); - save_item(NAME(m_n7751_busy)); } diff --git a/src/mame/includes/segag80r.h b/src/mame/includes/segag80r.h index cbb98452890..e1bd22e07a4 100644 --- a/src/mame/includes/segag80r.h +++ b/src/mame/includes/segag80r.h @@ -10,11 +10,12 @@ #pragma once -#include "sound/samples.h" -#include "machine/segag80.h" -#include "sound/sn76496.h" +#include "audio/segag80r.h" #include "audio/segasnd.h" #include "machine/i8255.h" +#include "machine/segag80.h" +#include "sound/samples.h" +#include "sound/sn76496.h" #include "screen.h" @@ -36,6 +37,7 @@ public: m_sn2(*this, "sn2"), m_maincpu(*this, "maincpu"), m_audiocpu(*this, "audiocpu"), + m_soundbrd(*this, "soundbrd"), m_samples(*this, "samples"), m_speech(*this, "segaspeech"), m_usbsnd(*this, "usbsnd"), @@ -53,6 +55,7 @@ public: optional_device m_sn2; required_device m_maincpu; optional_device m_audiocpu; + optional_device m_soundbrd; optional_device m_samples; optional_device m_speech; optional_device m_usbsnd; @@ -73,8 +76,6 @@ public: uint8_t m_sound_data; uint8_t m_square_state; uint8_t m_square_count; - uint8_t m_n7751_command; - uint8_t m_n7751_busy; segag80_decrypt_func m_decrypt; uint8_t m_background_pcb; double m_rweights[3]; @@ -121,8 +122,6 @@ public: DECLARE_WRITE8_MEMBER(sindbadm_back_port_w); DECLARE_WRITE8_MEMBER(astrob_sound_w); DECLARE_WRITE8_MEMBER(spaceod_sound_w); - DECLARE_READ8_MEMBER(n7751_rom_r); - DECLARE_READ8_MEMBER(n7751_command_r); DECLARE_INPUT_CHANGED_MEMBER(service_switch); DECLARE_WRITE8_MEMBER(usb_ram_w); DECLARE_READ8_MEMBER(sindbadm_sound_data_r); @@ -148,12 +147,6 @@ public: DECLARE_WRITE8_MEMBER(sega005_sound_a_w); DECLARE_WRITE8_MEMBER(sega005_sound_b_w); inline void sega005_update_sound_data(); - DECLARE_WRITE8_MEMBER(monsterb_sound_a_w); - DECLARE_WRITE8_MEMBER(monsterb_sound_b_w); - DECLARE_READ8_MEMBER(n7751_status_r); - DECLARE_WRITE8_MEMBER(n7751_command_w); - DECLARE_WRITE8_MEMBER(n7751_rom_control_w); - DECLARE_WRITE8_MEMBER(n7751_p2_w); void vblank_latch_set(); void g80_set_palette_entry(int entry, uint8_t data); void spaceod_bg_init_palette();