summaryrefslogtreecommitdiffstatshomepage
path: root/trunk/src/mame/audio/timeplt.c
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/src/mame/audio/timeplt.c')
-rw-r--r--trunk/src/mame/audio/timeplt.c274
1 files changed, 274 insertions, 0 deletions
diff --git a/trunk/src/mame/audio/timeplt.c b/trunk/src/mame/audio/timeplt.c
new file mode 100644
index 00000000000..886f45d9d14
--- /dev/null
+++ b/trunk/src/mame/audio/timeplt.c
@@ -0,0 +1,274 @@
+/***************************************************************************
+
+ This code is used by the following module:
+
+ timeplt.c
+ pooyan.c
+ rallyx.c (for locomotn)
+ tutankhm.c
+ rocnrope.c
+
+***************************************************************************/
+
+#include "emu.h"
+#include "cpu/z80/z80.h"
+#include "sound/ay8910.h"
+#include "sound/flt_rc.h"
+#include "audio/timeplt.h"
+
+
+#define MASTER_CLOCK XTAL_14_31818MHz
+
+typedef struct _timeplt_audio_state timeplt_audio_state;
+struct _timeplt_audio_state
+{
+ UINT8 m_last_irq_state;
+ cpu_device *m_soundcpu;
+
+ device_t *m_filter_0_0;
+ device_t *m_filter_0_1;
+ device_t *m_filter_0_2;
+ device_t *m_filter_1_0;
+ device_t *m_filter_1_1;
+ device_t *m_filter_1_2;
+};
+
+INLINE timeplt_audio_state *get_safe_token( device_t *device )
+{
+ assert(device != NULL);
+ assert(device->type() == TIMEPLT_AUDIO);
+
+ return (timeplt_audio_state *)downcast<legacy_device_base *>(device)->token();
+}
+
+
+/*************************************
+ *
+ * Initialization
+ *
+ *************************************/
+
+static DEVICE_START( timeplt_audio )
+{
+ running_machine &machine = device->machine();
+ timeplt_audio_state *state = get_safe_token(device);
+
+ state->m_soundcpu = machine.device<cpu_device>("tpsound");
+ state->m_filter_0_0 = machine.device("filter.0.0");
+ state->m_filter_0_1 = machine.device("filter.0.1");
+ state->m_filter_0_2 = machine.device("filter.0.2");
+ state->m_filter_1_0 = machine.device("filter.1.0");
+ state->m_filter_1_1 = machine.device("filter.1.1");
+ state->m_filter_1_2 = machine.device("filter.1.2");
+
+ state->m_last_irq_state = 0;
+ device->save_item(NAME(state->m_last_irq_state));
+}
+
+
+
+/*************************************
+ *
+ * Sound timer
+ *
+ *************************************/
+
+/* The timer clock which feeds the upper 4 bits of */
+/* AY-3-8910 port A is based on the same clock */
+/* feeding the sound CPU Z80. It is a divide by */
+/* 5120, formed by a standard divide by 512, */
+/* followed by a divide by 10 using a 4 bit */
+/* bi-quinary count sequence. (See LS90 data sheet */
+/* for an example). */
+/* */
+/* Bit 4 comes from the output of the divide by 1024 */
+/* 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 */
+/* Bit 5 comes from the QC output of the LS90 producing a sequence of */
+/* 0, 0, 1, 1, 0, 0, 1, 1, 1, 0 */
+/* Bit 6 comes from the QD output of the LS90 producing a sequence of */
+/* 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 */
+/* Bit 7 comes from the QA output of the LS90 producing a sequence of */
+/* 0, 0, 0, 0, 0, 1, 1, 1, 1, 1 */
+
+static READ8_DEVICE_HANDLER( timeplt_portB_r )
+{
+ timeplt_audio_state *state = get_safe_token(device);
+
+ static const int timeplt_timer[10] =
+ {
+ 0x00, 0x10, 0x20, 0x30, 0x40, 0x90, 0xa0, 0xb0, 0xa0, 0xd0
+ };
+
+ return timeplt_timer[(state->m_soundcpu->total_cycles() / 512) % 10];
+}
+
+
+
+/*************************************
+ *
+ * Filter controls
+ *
+ *************************************/
+
+static void filter_w( device_t *device, int data )
+{
+ int C = 0;
+
+ if (data & 1)
+ C += 220000; /* 220000pF = 0.220uF */
+ if (data & 2)
+ C += 47000; /* 47000pF = 0.047uF */
+
+ filter_rc_set_RC(device, FLT_RC_LOWPASS, 1000, 5100, 0, CAP_P(C));
+}
+
+
+static WRITE8_DEVICE_HANDLER( timeplt_filter_w )
+{
+ timeplt_audio_state *state = get_safe_token(device);
+
+ filter_w(state->m_filter_1_0, (offset >> 0) & 3);
+ filter_w(state->m_filter_1_1, (offset >> 2) & 3);
+ filter_w(state->m_filter_1_2, (offset >> 4) & 3);
+ filter_w(state->m_filter_0_0, (offset >> 6) & 3);
+ filter_w(state->m_filter_0_1, (offset >> 8) & 3);
+ filter_w(state->m_filter_0_2, (offset >> 10) & 3);
+}
+
+
+
+/*************************************
+ *
+ * External interfaces
+ *
+ *************************************/
+
+WRITE8_HANDLER( timeplt_sh_irqtrigger_w )
+{
+ device_t *audio = space->machine().device("timeplt_audio");
+ timeplt_audio_state *state = get_safe_token(audio);
+
+ if (state->m_last_irq_state == 0 && data)
+ {
+ /* setting bit 0 low then high triggers IRQ on the sound CPU */
+ device_set_input_line_and_vector(state->m_soundcpu, 0, HOLD_LINE, 0xff);
+ }
+
+ state->m_last_irq_state = data;
+}
+
+
+
+/*************************************
+ *
+ * Memory maps
+ *
+ *************************************/
+
+static ADDRESS_MAP_START( timeplt_sound_map, AS_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x2fff) AM_ROM
+ AM_RANGE(0x3000, 0x33ff) AM_MIRROR(0x0c00) AM_RAM
+ AM_RANGE(0x4000, 0x4000) AM_MIRROR(0x0fff) AM_DEVREADWRITE("ay1", ay8910_r, ay8910_data_w)
+ AM_RANGE(0x5000, 0x5000) AM_MIRROR(0x0fff) AM_DEVWRITE("ay1", ay8910_address_w)
+ AM_RANGE(0x6000, 0x6000) AM_MIRROR(0x0fff) AM_DEVREADWRITE("ay2", ay8910_r, ay8910_data_w)
+ AM_RANGE(0x7000, 0x7000) AM_MIRROR(0x0fff) AM_DEVWRITE("ay2", ay8910_address_w)
+ AM_RANGE(0x8000, 0xffff) AM_DEVWRITE("timeplt_audio", timeplt_filter_w)
+ADDRESS_MAP_END
+
+
+static ADDRESS_MAP_START( locomotn_sound_map, AS_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x1fff) AM_ROM
+ AM_RANGE(0x2000, 0x23ff) AM_MIRROR(0x0c00) AM_RAM
+ AM_RANGE(0x3000, 0x3fff) AM_DEVWRITE("timeplt_audio", timeplt_filter_w)
+ AM_RANGE(0x4000, 0x4000) AM_MIRROR(0x0fff) AM_DEVREADWRITE("ay1", ay8910_r, ay8910_data_w)
+ AM_RANGE(0x5000, 0x5000) AM_MIRROR(0x0fff) AM_DEVWRITE("ay1", ay8910_address_w)
+ AM_RANGE(0x6000, 0x6000) AM_MIRROR(0x0fff) AM_DEVREADWRITE("ay2", ay8910_r, ay8910_data_w)
+ AM_RANGE(0x7000, 0x7000) AM_MIRROR(0x0fff) AM_DEVWRITE("ay2", ay8910_address_w)
+ADDRESS_MAP_END
+
+
+
+/*************************************
+ *
+ * Sound chip interfaces
+ *
+ *************************************/
+
+static const ay8910_interface timeplt_ay8910_interface =
+{
+ AY8910_LEGACY_OUTPUT,
+ AY8910_DEFAULT_LOADS,
+ DEVCB_MEMORY_HANDLER("tpsound", PROGRAM, soundlatch_r),
+ DEVCB_DEVICE_HANDLER("timeplt_audio", timeplt_portB_r),
+ DEVCB_NULL,
+ DEVCB_NULL
+};
+
+
+
+/*************************************
+ *
+ * Machine drivers
+ *
+ *************************************/
+
+MACHINE_CONFIG_FRAGMENT( timeplt_sound )
+
+ /* basic machine hardware */
+ MCFG_CPU_ADD("tpsound",Z80,MASTER_CLOCK/8)
+ MCFG_CPU_PROGRAM_MAP(timeplt_sound_map)
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+
+ MCFG_SOUND_ADD("timeplt_audio", TIMEPLT_AUDIO, 0)
+
+ MCFG_SOUND_ADD("ay1", AY8910, MASTER_CLOCK/8)
+ MCFG_SOUND_CONFIG(timeplt_ay8910_interface)
+ MCFG_SOUND_ROUTE(0, "filter.0.0", 0.60)
+ MCFG_SOUND_ROUTE(1, "filter.0.1", 0.60)
+ MCFG_SOUND_ROUTE(2, "filter.0.2", 0.60)
+
+ MCFG_SOUND_ADD("ay2", AY8910, MASTER_CLOCK/8)
+ MCFG_SOUND_ROUTE(0, "filter.1.0", 0.60)
+ MCFG_SOUND_ROUTE(1, "filter.1.1", 0.60)
+ MCFG_SOUND_ROUTE(2, "filter.1.2", 0.60)
+
+ MCFG_SOUND_ADD("filter.0.0", FILTER_RC, 0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ MCFG_SOUND_ADD("filter.0.1", FILTER_RC, 0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ MCFG_SOUND_ADD("filter.0.2", FILTER_RC, 0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+
+ MCFG_SOUND_ADD("filter.1.0", FILTER_RC, 0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ MCFG_SOUND_ADD("filter.1.1", FILTER_RC, 0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+ MCFG_SOUND_ADD("filter.1.2", FILTER_RC, 0)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
+MACHINE_CONFIG_END
+
+
+MACHINE_CONFIG_DERIVED( locomotn_sound, timeplt_sound )
+
+ /* basic machine hardware */
+ MCFG_CPU_MODIFY("tpsound")
+ MCFG_CPU_PROGRAM_MAP(locomotn_sound_map)
+MACHINE_CONFIG_END
+
+/*****************************************************************************
+ DEVICE DEFINITION
+*****************************************************************************/
+
+
+static const char DEVTEMPLATE_SOURCE[] = __FILE__;
+
+#define DEVTEMPLATE_ID(p,s) p##timeplt_audio##s
+#define DEVTEMPLATE_FEATURES DT_HAS_START
+#define DEVTEMPLATE_NAME "Time Pilot Audio"
+#define DEVTEMPLATE_FAMILY "Time Pilot Audio IC"
+#include "devtempl.h"
+
+DEFINE_LEGACY_SOUND_DEVICE(TIMEPLT_AUDIO, timeplt_audio);
+