From 8bf6e9ebb59cc01b7db3c573977120c43c6dbd5e Mon Sep 17 00:00:00 2001 From: Curt Coder Date: Wed, 10 Aug 2016 13:05:14 +0300 Subject: [PATCH] pofo: Added skeleton for PCD3311T sound chip. (nw) --- scripts/src/sound.lua | 13 +++++++ scripts/target/mame/mess.lua | 2 ++ src/devices/sound/pcd3311.cpp | 56 +++++++++++++++++++++++++++++ src/devices/sound/pcd3311.h | 67 +++++++++++++++++++++++++++++++++++ src/emu/drivers/xtal.h | 1 + src/mame/drivers/pofo.cpp | 44 ++++++++++++----------- 6 files changed, 163 insertions(+), 20 deletions(-) create mode 100644 src/devices/sound/pcd3311.cpp create mode 100644 src/devices/sound/pcd3311.h diff --git a/scripts/src/sound.lua b/scripts/src/sound.lua index bf1e87ebc7e..30d049c72e1 100644 --- a/scripts/src/sound.lua +++ b/scripts/src/sound.lua @@ -1352,6 +1352,7 @@ if (SOUNDS["UPD1771"]~=null) then MAME_DIR .. "src/devices/sound/upd1771.h", } end + --------------------------------------------------- -- GB_SOUND --@src/devices/sound/gb.h,SOUNDS["GB_SOUND"] = true @@ -1363,3 +1364,15 @@ if (SOUNDS["GB_SOUND"]~=null) then MAME_DIR .. "src/devices/sound/gb.h", } end + +--------------------------------------------------- +-- PCD3311 +--@src/devices/sound/gb.h,SOUNDS["PCD3311"] = true +--------------------------------------------------- + +if (SOUNDS["PCD3311"]~=null) then + files { + MAME_DIR .. "src/devices/sound/pcd3311.cpp", + MAME_DIR .. "src/devices/sound/pcd3311.h", + } +end diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index e78baadfdc6..3554b86e213 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -260,6 +260,8 @@ SOUNDS["ESQPUMP"] = true SOUNDS["VRC6"] = true SOUNDS["UPD1771"] = true SOUNDS["GB_SOUND"] = true +SOUNDS["PCD3311"] = true + -------------------------------------------------- -- specify available video cores -------------------------------------------------- diff --git a/src/devices/sound/pcd3311.cpp b/src/devices/sound/pcd3311.cpp new file mode 100644 index 00000000000..840cdb7ee2f --- /dev/null +++ b/src/devices/sound/pcd3311.cpp @@ -0,0 +1,56 @@ +// license:BSD-3-Clause +// copyright-holders:Curt Coder +/********************************************************************** + + PCD3311 DTMF/modem/musical tone generator emulation + +**********************************************************************/ + +#include "pcd3311.h" + + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +const device_type PCD3311 = &device_creator; + + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// pcd3311_t - constructor +//------------------------------------------------- + +pcd3311_t::pcd3311_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : + device_t(mconfig, PCD3311, "PCD3311", tag, owner, clock, "pcd3311", __FILE__), + device_sound_interface(mconfig, *this) +{ +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void pcd3311_t::device_start() +{ + save_item(NAME(m_a0)); + save_item(NAME(m_mode)); + save_item(NAME(m_strobe)); + save_item(NAME(m_data)); +} + + +//------------------------------------------------- +// sound_stream_update - handle update requests for +// our sound stream +//------------------------------------------------- + +void pcd3311_t::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) +{ +} diff --git a/src/devices/sound/pcd3311.h b/src/devices/sound/pcd3311.h new file mode 100644 index 00000000000..2c50a0a987a --- /dev/null +++ b/src/devices/sound/pcd3311.h @@ -0,0 +1,67 @@ +// license:BSD-3-Clause +// copyright-holders:Curt Coder +/********************************************************************** + + PCD3311 DTMF/modem/musical tone generator emulation + +********************************************************************** + _____ _____ + OSCI 1 |* \_/ | 16 Vdd + OSCO 2 | | 15 Vss + MODE 3 | | 14 D4 + D5 4 | PCD3311T | 13 N/C + N/C 5 | | 12 D3 + STROBE 6 | | 11 D2 + TONE 7 | | 10 D1/SDA + A0 8 |_____________| 9 D0/SCL + +**********************************************************************/ + +#pragma once + +#ifndef __PCD3311__ +#define __PCD3311__ + +#include "emu.h" + + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> pcd3311_t + +class pcd3311_t : public device_t, + public device_sound_interface +{ +public: + // construction/destruction + pcd3311_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + DECLARE_WRITE8_MEMBER( write ) { m_data = data; } + DECLARE_WRITE_LINE_MEMBER( strobe_w ) { m_strobe = state; } + DECLARE_WRITE_LINE_MEMBER( mode_w ) { m_mode = state; } + DECLARE_WRITE_LINE_MEMBER( a0_w ) { m_a0 = state; } + +protected: + // device-level overrides + virtual void device_start() override; + + // internal callbacks + virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override; + +private: + int m_a0; + int m_mode; + int m_strobe; + UINT8 m_data; +}; + + +// device type definition +extern const device_type PCD3311; + + + +#endif diff --git a/src/emu/drivers/xtal.h b/src/emu/drivers/xtal.h index 5cb8b901db8..c74c9ec24b8 100644 --- a/src/emu/drivers/xtal.h +++ b/src/emu/drivers/xtal.h @@ -60,6 +60,7 @@ enum XTAL_3_12MHz = 3120000, /* SP0250 clock on Gottlieb games */ XTAL_3_5MHz = 3500000, /* Reported by Commodore 65 document, true xtal unchecked on PCB */ XTAL_3_52128MHz = 3521280, /* RCA COSMAC VIP */ + XTAL_3_57864MHz = 3578640, /* Atari Portfolio PCD3311T */ XTAL_3_579545MHz = 3579545, /* NTSC color subcarrier, extremely common, used on 100's of PCBs (Keytronic custom part #48-300-010 is equivalent) */ XTAL_3_6864MHz = 3686400, /* CPS3 */ XTAL_4MHz = 4000000, diff --git a/src/mame/drivers/pofo.cpp b/src/mame/drivers/pofo.cpp index 367af13c7ab..57cd2d30ad9 100644 --- a/src/mame/drivers/pofo.cpp +++ b/src/mame/drivers/pofo.cpp @@ -40,7 +40,7 @@ #include "bus/pofo/exp.h" #include "machine/nvram.h" #include "machine/ram.h" -#include "sound/speaker.h" +#include "sound/pcd3311.h" #include "video/hd61830.h" @@ -53,6 +53,7 @@ #define M80C88A_TAG "u1" #define HD61830_TAG "hd61830" +#define PCD3311T_TAG "pcd3311t" #define TIMER_TICK_TAG "tick" #define SCREEN_TAG "screen" @@ -71,7 +72,7 @@ public: driver_device(mconfig, type, tag), m_maincpu(*this, M80C88A_TAG), m_lcdc(*this, HD61830_TAG), - m_speaker(*this, "speaker"), + m_dtmf(*this, PCD3311T_TAG), m_ccm(*this, PORTFOLIO_MEMORY_CARD_SLOT_A_TAG), m_exp(*this, PORTFOLIO_EXPANSION_SLOT_TAG), m_timer_tick(*this, TIMER_TICK_TAG), @@ -93,7 +94,7 @@ public: required_device m_maincpu; required_device m_lcdc; - required_device m_speaker; + required_device m_dtmf; required_device m_ccm; required_device m_exp; required_device m_timer_tick; @@ -146,7 +147,7 @@ public: DECLARE_READ8_MEMBER( counter_r ); DECLARE_WRITE8_MEMBER( irq_mask_w ); - DECLARE_WRITE8_MEMBER( speaker_w ); + DECLARE_WRITE8_MEMBER( dtmf_w ); DECLARE_WRITE8_MEMBER( power_w ); DECLARE_WRITE8_MEMBER( select_w ); DECLARE_WRITE8_MEMBER( counter_w ); @@ -356,33 +357,36 @@ READ8_MEMBER( portfolio_state::keyboard_r ) //************************************************************************** -// INTERNAL SPEAKER +// SOUND //************************************************************************** //------------------------------------------------- -// speaker_w - internal speaker output +// dtmf_w - //------------------------------------------------- -WRITE8_MEMBER( portfolio_state::speaker_w ) +WRITE8_MEMBER( portfolio_state::dtmf_w ) { /* bit description - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 speaker level + 0 PCD3311T D0 + 1 PCD3311T D1 + 2 PCD3311T D2 + 3 PCD3311T D3 + 4 PCD3311T D4 + 5 PCD3311T D5 + 6 PCD3311T STROBE + 7 PCD3311T VDD,MODE,A0 */ - if (LOG) logerror("%s %s SPEAKER %02x\n", machine().time().as_string(), machine().describe_context(), data); + if (LOG) logerror("%s %s DTMF %02x\n", machine().time().as_string(), machine().describe_context(), data); - m_speaker->level_w(!BIT(data, 7)); + m_dtmf->mode_w(!BIT(data, 7)); + m_dtmf->a0_w(!BIT(data, 7)); + m_dtmf->write(space, 0, data & 0x3f); + m_dtmf->strobe_w(BIT(data, 6)); } @@ -735,7 +739,7 @@ WRITE8_MEMBER( portfolio_state::io_w ) break; case 2: - speaker_w(space, 0, data); + dtmf_w(space, 0, data); break; case 3: @@ -1041,7 +1045,7 @@ static MACHINE_CONFIG_START( portfolio, portfolio_state ) // sound hardware MCFG_SPEAKER_STANDARD_MONO("mono") - MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0) + MCFG_SOUND_ADD(PCD3311T_TAG, PCD3311, XTAL_3_57864MHz) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) // devices @@ -1096,4 +1100,4 @@ ROM_END //************************************************************************** // YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS -COMP( 1989, pofo, 0, 0, portfolio, portfolio, driver_device, 0, "Atari", "Portfolio", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE ) +COMP( 1989, pofo, 0, 0, portfolio, portfolio, driver_device, 0, "Atari", "Portfolio", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )