From b729bdacca1aaa95adae3125d6b0c6e30109f4b1 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Tue, 13 Dec 2022 17:47:15 +1100 Subject: -More Mega Drive cleanup: * Moved YM sound out of "core" Mega Drive state, and made more devices required in "base" Mega Drive state. * Made Pico/Copera derive from "core" Mega Drive state so they aren't carrying unnecessary baggage (all it uses is the CPU and VDP). * Corrected title for puckpkmna. -cpu/avr8: Mask ADC samples to ten bits on acquisition. --- src/devices/cpu/avr8/avr8.cpp | 2 +- src/mame/sega/mdconsole.cpp | 3 +- src/mame/sega/megadriv.cpp | 77 +++++++++++++++---------------------- src/mame/sega/megadriv.h | 36 +++++++++--------- src/mame/sega/puckpkmn.cpp | 17 ++++++--- src/mame/sega/segapico.cpp | 88 +++++++++++++++++++++++++++++++------------ 6 files changed, 125 insertions(+), 98 deletions(-) diff --git a/src/devices/cpu/avr8/avr8.cpp b/src/devices/cpu/avr8/avr8.cpp index ba7c21b079c..dfe696252ad 100644 --- a/src/devices/cpu/avr8/avr8.cpp +++ b/src/devices/cpu/avr8/avr8.cpp @@ -2297,7 +2297,7 @@ void avr8_device::adc_start_conversion() // get a sample - the sample-and-hold circuit will hold this for the duration of the conversion if (AVR8_ADMUX_MUX < 0x8) { - m_adc_sample = m_adc_in_cb[AVR8_ADMUX_MUX](); + m_adc_sample = m_adc_in_cb[AVR8_ADMUX_MUX]() & 0x3ff; } else if (AVR8_ADMUX_MUX == 0xe) { diff --git a/src/mame/sega/mdconsole.cpp b/src/mame/sega/mdconsole.cpp index 11993649305..9214a942bb2 100644 --- a/src/mame/sega/mdconsole.cpp +++ b/src/mame/sega/mdconsole.cpp @@ -89,8 +89,7 @@ void md_cons_state::machine_start() if (m_cart) m_cart->save_nvram(); - if (m_z80snd) - m_genz80.z80_run_timer = timer_alloc(FUNC(md_base_state::megadriv_z80_run_state), this); + m_genz80.z80_run_timer = timer_alloc(FUNC(md_cons_state::megadriv_z80_run_state), this); } void md_cons_state::install_cartslot() diff --git a/src/mame/sega/megadriv.cpp b/src/mame/sega/megadriv.cpp index a0f90da458b..1fed6f2cabc 100644 --- a/src/mame/sega/megadriv.cpp +++ b/src/mame/sega/megadriv.cpp @@ -78,9 +78,6 @@ uint8_t md_base_state::megadriv_68k_YM2612_read(offs_t offset, uint8_t mem_mask) LOG("%s: 68000 attempting to access YM2612 (read) without bus\n", machine().describe_context()); return 0; } - - // never executed - //return -1; } @@ -681,8 +678,7 @@ void md_base_state::machine_start() { md_core_state::machine_start(); - if (m_z80snd) - m_genz80.z80_run_timer = timer_alloc(FUNC(md_base_state::megadriv_z80_run_state), this); + m_genz80.z80_run_timer = timer_alloc(FUNC(md_base_state::megadriv_z80_run_state), this); } void md_base_state::machine_reset() @@ -692,14 +688,11 @@ void md_base_state::machine_reset() // default state of z80 = reset, with bus osd_printf_debug("Resetting Megadrive / Genesis\n"); - if (m_z80snd) - { - m_genz80.z80_is_reset = 1; - m_genz80.z80_has_bus = 1; - m_genz80.z80_bank_addr = 0; - m_vdp->set_scanline_counter(-1); - m_genz80.z80_run_timer->adjust(attotime::zero); - } + m_genz80.z80_is_reset = 1; + m_genz80.z80_has_bus = 1; + m_genz80.z80_bank_addr = 0; + m_vdp->set_scanline_counter(-1); + m_genz80.z80_run_timer->adjust(attotime::zero); if (m_megadrive_ram) memset(m_megadrive_ram, 0x00, 0x10000); @@ -732,17 +725,14 @@ void md_base_state::megadriv_stop_scanline_timer() // this comes from the VDP on lines 240 (on) 241 (off) and is connected to the z80 irq 0 WRITE_LINE_MEMBER(md_base_state::vdp_sndirqline_callback_genesis_z80) { - if (m_z80snd) + if (state == ASSERT_LINE) { - if (state == ASSERT_LINE) - { - if ((m_genz80.z80_has_bus == 1) && (m_genz80.z80_is_reset == 0)) - m_z80snd->set_input_line(0, HOLD_LINE); - } - else if (state == CLEAR_LINE) - { - m_z80snd->set_input_line(0, CLEAR_LINE); - } + if ((m_genz80.z80_has_bus == 1) && (m_genz80.z80_is_reset == 0)) + m_z80snd->set_input_line(0, HOLD_LINE); + } + else if (state == CLEAR_LINE) + { + m_z80snd->set_input_line(0, CLEAR_LINE); } } @@ -808,8 +798,6 @@ void md_core_state::md_core_ntsc(machine_config &config) m_screen->set_visarea(0, 32*8-1, 0, 28*8-1); m_screen->set_screen_update(FUNC(md_core_state::screen_update_megadriv)); /* Copies a bitmap */ m_screen->screen_vblank().set(FUNC(md_core_state::screen_vblank_megadriv)); /* Used to Sync the timing */ - - YM2612(config, m_ymsnd, MASTER_CLOCK_NTSC/7); // 7.67 MHz } void md_core_state::md_core_pal(machine_config &config) @@ -834,8 +822,6 @@ void md_core_state::md_core_pal(machine_config &config) m_screen->set_visarea(0, 32*8-1, 0, 28*8-1); m_screen->set_screen_update(FUNC(md_core_state::screen_update_megadriv)); /* Copies a bitmap */ m_screen->screen_vblank().set(FUNC(md_core_state::screen_vblank_megadriv)); /* Used to Sync the timing */ - - YM2612(config, m_ymsnd, MASTER_CLOCK_PAL / 7); // 7.67 MHz } @@ -887,22 +873,23 @@ void md_base_state::md_ntsc(machine_config &config) m_maincpu->set_addrmap(AS_PROGRAM, &md_base_state::megadriv_68k_map); - Z80(config, m_z80snd, MASTER_CLOCK_NTSC / 15); /* 3.58 MHz */ + Z80(config, m_z80snd, MASTER_CLOCK_NTSC / 15); // 3.58 MHz m_z80snd->set_addrmap(AS_PROGRAM, &md_base_state::megadriv_z80_map); m_z80snd->set_addrmap(AS_IO, &md_base_state::megadriv_z80_io_map); - /* IRQ handled via the timers */ + // IRQ handled via the timers - /* I/O port controllers */ + // I/O port controllers megadriv_ioports(config); m_vdp->snd_irq().set(FUNC(md_base_state::vdp_sndirqline_callback_genesis_z80)); m_vdp->add_route(ALL_OUTPUTS, "lspeaker", 0.50); m_vdp->add_route(ALL_OUTPUTS, "rspeaker", 0.50); - /* sound hardware */ + // sound hardware SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); + YM2612(config, m_ymsnd, MASTER_CLOCK_NTSC / 7); // 7.67 MHz m_ymsnd->add_route(0, "lspeaker", 0.50); m_ymsnd->add_route(1, "rspeaker", 0.50); } @@ -925,22 +912,23 @@ void md_base_state::md_pal(machine_config &config) m_maincpu->set_addrmap(AS_PROGRAM, &md_base_state::megadriv_68k_map); - Z80(config, m_z80snd, MASTER_CLOCK_PAL / 15); /* 3.58 MHz */ + Z80(config, m_z80snd, MASTER_CLOCK_PAL / 15); // 3.58 MHz m_z80snd->set_addrmap(AS_PROGRAM, &md_base_state::megadriv_z80_map); m_z80snd->set_addrmap(AS_IO, &md_base_state::megadriv_z80_io_map); - /* IRQ handled via the timers */ + // IRQ handled via the timers - /* I/O port controllers */ + // I/O port controllers megadriv_ioports(config); m_vdp->snd_irq().set(FUNC(md_base_state::vdp_sndirqline_callback_genesis_z80)); m_vdp->add_route(ALL_OUTPUTS, "lspeaker", 0.50); m_vdp->add_route(ALL_OUTPUTS, "rspeaker", 0.50); - /* sound hardware */ + // sound hardware SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); + YM2612(config, m_ymsnd, MASTER_CLOCK_PAL / 7); // 7.67 MHz m_ymsnd->add_route(0, "lspeaker", 0.50); m_ymsnd->add_route(1, "rspeaker", 0.50); } @@ -963,16 +951,13 @@ void md_core_state::megadriv_tas_callback(offs_t offset, uint8_t data) void md_base_state::megadriv_init_common() { - /* Look to see if this system has the standard Sound Z80 */ - if (m_z80snd) - { - m_genz80.z80_prgram = std::make_unique(0x2000); - membank("bank1")->set_base(m_genz80.z80_prgram.get()); - save_item(NAME(m_genz80.z80_is_reset)); - save_item(NAME(m_genz80.z80_has_bus)); - save_item(NAME(m_genz80.z80_bank_addr)); - save_pointer(NAME(m_genz80.z80_prgram), 0x2000); - } + // This system has the standard Sound Z80 + m_genz80.z80_prgram = std::make_unique(0x2000); + membank("bank1")->set_base(m_genz80.z80_prgram.get()); + save_item(NAME(m_genz80.z80_is_reset)); + save_item(NAME(m_genz80.z80_has_bus)); + save_item(NAME(m_genz80.z80_bank_addr)); + save_pointer(NAME(m_genz80.z80_prgram), 0x2000); m_maincpu->set_tas_write_callback(*this, FUNC(md_base_state::megadriv_tas_callback)); } @@ -1007,7 +992,7 @@ void md_base_state::init_megadrie() { megadriv_init_common(); - // todo: move this to the device interface? + // TODO: move this to the device interface? m_vdp->set_use_cram(1); m_vdp->set_vdp_pal(true); m_vdp->set_framerate(50); diff --git a/src/mame/sega/megadriv.h b/src/mame/sega/megadriv.h index 03c3a808a58..e6ef80cb894 100644 --- a/src/mame/sega/megadriv.h +++ b/src/mame/sega/megadriv.h @@ -32,7 +32,6 @@ protected: m_scan_timer(*this, "md_scan_timer"), m_vdp(*this,"gen_vdp"), m_screen(*this,"megadriv"), - m_ymsnd(*this,"ymsnd"), m_io_reset(*this, "RESET") { } @@ -51,7 +50,6 @@ protected: required_device m_scan_timer; required_device m_vdp; optional_device m_screen; - optional_device m_ymsnd; optional_ioport m_io_reset; @@ -68,16 +66,11 @@ private: class md_base_state : public md_core_state { public: - md_base_state(const machine_config &mconfig, device_type type, const char *tag) : - md_core_state(mconfig, type, tag), - m_z80snd(*this,"genesis_snd_z80"), - m_megadrive_ram(*this,"megadrive_ram"), - m_ioports(*this, "ioport%u", 1U) - { } - - optional_device m_z80snd; - optional_shared_ptr m_megadrive_ram; + void init_megadrie(); + void init_megadriv(); + void init_megadrij(); +protected: struct genesis_z80_vars { int z80_is_reset = 0; @@ -87,12 +80,13 @@ public: emu_timer *z80_run_timer = nullptr; }; - genesis_z80_vars m_genz80; - int m_version_hi_nibble; - - void init_megadrie(); - void init_megadriv(); - void init_megadrij(); + md_base_state(const machine_config &mconfig, device_type type, const char *tag) : + md_core_state(mconfig, type, tag), + m_z80snd(*this,"genesis_snd_z80"), + m_ymsnd(*this,"ymsnd"), + m_megadrive_ram(*this,"megadrive_ram"), + m_ioports(*this, "ioport%u", 1U) + { } uint8_t megadriv_68k_YM2612_read(offs_t offset, uint8_t mem_mask = ~0); void megadriv_68k_YM2612_write(offs_t offset, uint8_t data, uint8_t mem_mask = ~0); @@ -124,7 +118,6 @@ public: void md2_pal(machine_config &config); void md_bootleg(machine_config &config); -protected: virtual void machine_start() override; virtual void machine_reset() override; @@ -133,6 +126,13 @@ protected: void megadriv_z80_io_map(address_map &map); void megadriv_z80_map(address_map &map); + required_device m_z80snd; + required_device m_ymsnd; + optional_shared_ptr m_megadrive_ram; + + genesis_z80_vars m_genz80; + int m_version_hi_nibble; + required_device_array m_ioports; private: diff --git a/src/mame/sega/puckpkmn.cpp b/src/mame/sega/puckpkmn.cpp index 54f5592f0bf..247cd090e9a 100644 --- a/src/mame/sega/puckpkmn.cpp +++ b/src/mame/sega/puckpkmn.cpp @@ -61,7 +61,8 @@ class puckpkmn_state : public md_core_state { public: puckpkmn_state(const machine_config &mconfig, device_type type, const char *tag) : - md_core_state(mconfig, type, tag) + md_core_state(mconfig, type, tag), + m_ymsnd(*this,"ymsnd") { } @@ -78,6 +79,8 @@ private: void puckpkmn_map(address_map &map) ATTR_COLD; void puckpkmna_map(address_map &map) ATTR_COLD; void puckpkmnb_map(address_map &map) ATTR_COLD; + + optional_device m_ymsnd; }; @@ -406,6 +409,8 @@ void puckpkmn_state::puckpkmn(machine_config &config) SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); + //YM3812(config, m_ymsnd, 3.579545_MHz_XTAL); breaks tutorial music - confirm PCB picture is correct + YM2612(config, m_ymsnd, MASTER_CLOCK_NTSC / 7); // 7.67 MHz m_ymsnd->add_route(0, "lspeaker", 0.50); m_ymsnd->add_route(1, "rspeaker", 0.50); @@ -547,7 +552,7 @@ ROM_START( puckpkmn ) /* Puckman Pockimon (c)2000 Genie */ ROM_END /* -Puckman Pokimon (alt.) +精靈家族/Jīnglíng Jiāzú (Traditional Chinese) PCB Layout @@ -581,7 +586,7 @@ Notes: TK-20K - custom chip, probably the CPU (QFP100). Clock unknown. M6295 - clock 1.000MHz [4/4] - 4x 1Mx8 flashROMs (B*.U59) are mounted onto a DIP42 carrier board to make a + 4x 1Mx8 Flash ROMs (B*.U59) are mounted onto a DIP42 carrier board to make a 32MBit EPROM equivalent. It appears to contain graphics plus the main program. ROM A.U3 contains samples for the M6295. @@ -615,7 +620,7 @@ ROM_START( puckpkmnb ) ROM_END -//決戰天皇/Juézhàn tiānhuáng (Traditional Chinese) +//決戰天皇/Juézhàn Tiānhuáng (Traditional Chinese) ROM_START( jzth ) ROM_REGION( 0x400000, "maincpu", 0 ) ROM_LOAD16_BYTE( "s.y.u5", 0x000000, 0x080000, CRC(a4a526b5) SHA1(85d0299caf91ff50b6870f845b9aacbd358ed81f) ) @@ -638,6 +643,6 @@ ROM_END // Genie Hardware (uses Genesis VDP) also has 'Sun Mixing Co' put into tile RAM // Is 'Genie 2000' part of the title, and the parent set a bootleg? GAME( 2000, puckpkmn, 0, puckpkmn, puckpkmn, puckpkmn_state, init_puckpkmn, ROT0, "Genie", "Puckman Pockimon (set 1)", 0 ) -GAME( 2000, puckpkmna, puckpkmn, puckpkmna, puckpkmn, puckpkmn_state, init_puckpkmn, ROT0, "IBS", "Puckman Pockimon (set 2)", 0 ) -GAME( 2000, puckpkmnb, puckpkmn, puckpkmnb, puckpkmn, puckpkmn_state, init_puckpkmn, ROT0, "Sun Mixing", "Puckman Pockimon (set 3)", 0 ) +GAME( 2000, puckpkmna, puckpkmn, puckpkmna, puckpkmn, puckpkmn_state, init_puckpkmn, ROT0, "IBS", "Jingling Jiazu", 0 ) +GAME( 2000, puckpkmnb, puckpkmn, puckpkmnb, puckpkmn, puckpkmn_state, init_puckpkmn, ROT0, "Sun Mixing", "Puckman Pockimon (set 2)", 0 ) GAME( 2000, jzth, 0, jzth, jzth, jzth_state, init_puckpkmn, ROT0, "", "Juezhan Tianhuang", MACHINE_IMPERFECT_SOUND ) diff --git a/src/mame/sega/segapico.cpp b/src/mame/sega/segapico.cpp index f2c429fe5c6..bceb8f682ee 100644 --- a/src/mame/sega/segapico.cpp +++ b/src/mame/sega/segapico.cpp @@ -118,10 +118,13 @@ C = MB3514 / 9325 M36 */ #include "emu.h" -#include "mdconsole.h" -#include "sound/315-5641.h" +#include "megadriv.h" + #include "bus/megadrive/rom.h" -#include "softlist.h" +#include "sound/315-5641.h" + +#include "softlist_dev.h" +#include "speaker.h" namespace { @@ -129,11 +132,11 @@ namespace { #define PICO_PENX 1 #define PICO_PENY 2 -class pico_base_state : public md_cons_state +class pico_base_state : public md_core_state { public: pico_base_state(const machine_config &mconfig, device_type type, const char *tag) : - md_cons_state(mconfig, type, tag), + md_core_state(mconfig, type, tag), m_sega_315_5641_pcm(*this, "315_5641"), m_io_page(*this, "PAGE"), m_io_pad(*this, "PAD"), @@ -153,6 +156,8 @@ protected: required_ioport m_io_penx; required_ioport m_io_peny; + int m_version_hi_nibble; + uint8_t m_page_register; uint16_t pico_read_penpos(int pen); @@ -171,8 +176,8 @@ public: m_picocart(*this, "picoslot") { } - void pico(machine_config &config); - void picopal(machine_config &config); + void pico_ntsc(machine_config &config); + void pico_pal(machine_config &config); protected: virtual void machine_start() override; @@ -380,6 +385,8 @@ static void pico_cart(device_slot_interface &device) void pico_state::machine_start() { + pico_base_state::machine_start(); + m_maincpu->space(AS_PROGRAM).install_read_handler(0x000000, 0x7fffff, read16sm_delegate(*m_picocart, FUNC(base_md_cart_slot_device::read))); m_maincpu->space(AS_PROGRAM).install_write_handler(0x000000, 0x7fffff, write16s_delegate(*m_picocart, FUNC(base_md_cart_slot_device::write))); m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xa13000, 0xa130ff, read16sm_delegate(*m_picocart, FUNC(base_md_cart_slot_device::read_a13)), write16sm_delegate(*m_picocart, FUNC(base_md_cart_slot_device::write_a13))); @@ -389,36 +396,42 @@ void pico_state::machine_start() m_vdp->stop_timers(); } -void pico_state::pico(machine_config &config) +void pico_state::pico_ntsc(machine_config &config) { - md_ntsc(config); + md_core_ntsc(config); m_maincpu->set_addrmap(AS_PROGRAM, &pico_state::pico_mem); - config.device_remove("genesis_snd_z80"); - config.device_remove("ymsnd"); + m_vdp->add_route(ALL_OUTPUTS, "lspeaker", 0.50); + m_vdp->add_route(ALL_OUTPUTS, "rspeaker", 0.50); PICO_CART_SLOT(config, m_picocart, pico_cart, nullptr).set_must_be_loaded(true); SOFTWARE_LIST(config, "cart_list").set_original("pico"); + SPEAKER(config, "lspeaker").front_left(); + SPEAKER(config, "rspeaker").front_right(); + SEGA_315_5641_PCM(config, m_sega_315_5641_pcm, upd7759_device::STANDARD_CLOCK*2); m_sega_315_5641_pcm->fifo_cb().set(FUNC(pico_state::sound_cause_irq)); m_sega_315_5641_pcm->add_route(ALL_OUTPUTS, "lspeaker", 0.16); m_sega_315_5641_pcm->add_route(ALL_OUTPUTS, "rspeaker", 0.16); } -void pico_state::picopal(machine_config &config) +void pico_state::pico_pal(machine_config &config) { - md_pal(config); + md_core_pal(config); m_maincpu->set_addrmap(AS_PROGRAM, &pico_state::pico_mem); - config.device_remove("genesis_snd_z80"); - config.device_remove("ymsnd"); + m_vdp->add_route(ALL_OUTPUTS, "lspeaker", 0.50); + m_vdp->add_route(ALL_OUTPUTS, "rspeaker", 0.50); PICO_CART_SLOT(config, m_picocart, pico_cart, nullptr).set_must_be_loaded(true); SOFTWARE_LIST(config, "cart_list").set_original("pico"); + SPEAKER(config, "lspeaker").front_left(); + SPEAKER(config, "rspeaker").front_right(); + SEGA_315_5641_PCM(config, m_sega_315_5641_pcm, upd7759_device::STANDARD_CLOCK*2); m_sega_315_5641_pcm->fifo_cb().set(FUNC(pico_state::sound_cause_irq)); m_sega_315_5641_pcm->add_route(ALL_OUTPUTS, "lspeaker", 0.16); @@ -445,21 +458,39 @@ ROM_END void pico_base_state::init_pico() { - init_megadrie(); + m_maincpu->set_tas_write_callback(*this, FUNC(pico_base_state::megadriv_tas_callback)); + + // TODO: move this to the device interface? + m_vdp->set_use_cram(1); + m_vdp->set_vdp_pal(true); + m_vdp->set_framerate(50); + m_vdp->set_total_scanlines(313); m_version_hi_nibble = 0x60; // Export PAL } void pico_base_state::init_picou() { - init_megadriv(); + m_maincpu->set_tas_write_callback(*this, FUNC(pico_base_state::megadriv_tas_callback)); + + // TODO: move this to the device interface? + m_vdp->set_use_cram(1); + m_vdp->set_vdp_pal(false); + m_vdp->set_framerate(60); + m_vdp->set_total_scanlines(262); m_version_hi_nibble = 0x40; // Export NTSC } void pico_base_state::init_picoj() { - init_megadrij(); + m_maincpu->set_tas_write_callback(*this, FUNC(pico_base_state::megadriv_tas_callback)); + + // TODO: move this to the device interface? + m_vdp->set_use_cram(1); + m_vdp->set_vdp_pal(false); + m_vdp->set_framerate(60); + m_vdp->set_total_scanlines(262); m_version_hi_nibble = 0x00; // JPN NTSC } @@ -586,6 +617,8 @@ static void copera_cart(device_slot_interface &device) void copera_state::machine_start() { + pico_base_state::machine_start(); + m_maincpu->space(AS_PROGRAM).install_read_handler(0x000000, 0x7fffff, read16sm_delegate(*m_picocart, FUNC(base_md_cart_slot_device::read))); m_maincpu->space(AS_PROGRAM).install_write_handler(0x000000, 0x7fffff, write16s_delegate(*m_picocart, FUNC(base_md_cart_slot_device::write))); m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xa13000, 0xa130ff, read16sm_delegate(*m_picocart, FUNC(base_md_cart_slot_device::read_a13)), write16sm_delegate(*m_picocart, FUNC(base_md_cart_slot_device::write_a13))); @@ -596,20 +629,25 @@ void copera_state::machine_start() m_sega_315_5641_pcm->start_w(0); m_sega_315_5641_pcm->reset_w(1); m_sega_315_5641_pcm->start_w(1); + + m_vdp->stop_timers(); } void copera_state::copera(machine_config &config) { - md_ntsc(config); + md_core_ntsc(config); m_maincpu->set_addrmap(AS_PROGRAM, &copera_state::copera_mem); - config.device_remove("genesis_snd_z80"); - config.device_remove("ymsnd"); + m_vdp->add_route(ALL_OUTPUTS, "lspeaker", 0.50); + m_vdp->add_route(ALL_OUTPUTS, "rspeaker", 0.50); COPERA_CART_SLOT(config, m_picocart, copera_cart, nullptr).set_must_be_loaded(true); SOFTWARE_LIST(config, "cart_list").set_original("copera"); + SPEAKER(config, "lspeaker").front_left(); + SPEAKER(config, "rspeaker").front_right(); + SEGA_315_5641_PCM(config, m_sega_315_5641_pcm, upd7759_device::STANDARD_CLOCK); m_sega_315_5641_pcm->fifo_cb().set(FUNC(copera_state::sound_cause_irq)); m_sega_315_5641_pcm->add_route(ALL_OUTPUTS, "lspeaker", 0.16); @@ -626,8 +664,8 @@ ROM_END } // anonymous namespace -CONS( 1994, pico, 0, 0, picopal, pico, pico_state, init_pico, "Sega", "Pico (Europe, PAL)", MACHINE_NOT_WORKING) -CONS( 1994, picou, pico, 0, pico, pico, pico_state, init_picou, "Sega", "Pico (USA, NTSC)", MACHINE_NOT_WORKING) -CONS( 1993, picoj, pico, 0, pico, pico, pico_state, init_picoj, "Sega", "Pico (Japan, NTSC)", MACHINE_NOT_WORKING) +CONS( 1994, pico, 0, 0, pico_pal, pico, pico_state, init_pico, "Sega", "Pico (Europe, PAL)", MACHINE_NOT_WORKING) +CONS( 1994, picou, pico, 0, pico_ntsc, pico, pico_state, init_picou, "Sega", "Pico (USA, NTSC)", MACHINE_NOT_WORKING) +CONS( 1993, picoj, pico, 0, pico_ntsc, pico, pico_state, init_picoj, "Sega", "Pico (Japan, NTSC)", MACHINE_NOT_WORKING) -CONS( 1993, copera, 0, 0, copera, pico, copera_state, init_picoj, "Yamaha / Sega", "Yamaha Mixt Book Player Copera", MACHINE_NOT_WORKING) +CONS( 1993, copera, 0, 0, copera, pico, copera_state, init_picoj, "Yamaha / Sega", "Yamaha Mixt Book Player Copera", MACHINE_NOT_WORKING) -- cgit v1.2.3