summaryrefslogtreecommitdiffstatshomepage
path: root/trunk/src/mame/audio/hyprolyb.c
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/src/mame/audio/hyprolyb.c')
-rw-r--r--trunk/src/mame/audio/hyprolyb.c151
1 files changed, 151 insertions, 0 deletions
diff --git a/trunk/src/mame/audio/hyprolyb.c b/trunk/src/mame/audio/hyprolyb.c
new file mode 100644
index 00000000000..074417e7299
--- /dev/null
+++ b/trunk/src/mame/audio/hyprolyb.c
@@ -0,0 +1,151 @@
+#include "emu.h"
+#include "cpu/m6800/m6800.h"
+#include "sound/msm5205.h"
+#include "audio/hyprolyb.h"
+
+typedef struct _hyprolyb_adpcm_state hyprolyb_adpcm_state;
+struct _hyprolyb_adpcm_state
+{
+ device_t *m_msm;
+ address_space *m_space;
+ UINT8 m_adpcm_ready; // only bootlegs
+ UINT8 m_adpcm_busy;
+ UINT8 m_vck_ready;
+};
+
+INLINE hyprolyb_adpcm_state *get_safe_token( device_t *device )
+{
+ assert(device != NULL);
+ assert(device->type() == HYPROLYB_ADPCM);
+
+ return (hyprolyb_adpcm_state *)downcast<legacy_device_base *>(device)->token();
+}
+
+static DEVICE_START( hyprolyb_adpcm )
+{
+ hyprolyb_adpcm_state *state = get_safe_token(device);
+
+ state->m_space = device->machine().device("audiocpu")->memory().space(AS_PROGRAM);
+ state->m_msm = device->machine().device("msm");
+ device->save_item(NAME(state->m_adpcm_ready)); // only bootlegs
+ device->save_item(NAME(state->m_adpcm_busy));
+ device->save_item(NAME(state->m_vck_ready));
+}
+
+
+static DEVICE_RESET( hyprolyb_adpcm )
+{
+ hyprolyb_adpcm_state *state = get_safe_token(device);
+
+ state->m_adpcm_ready = 0;
+ state->m_adpcm_busy = 0;
+ state->m_vck_ready = 0;
+}
+
+WRITE8_DEVICE_HANDLER( hyprolyb_adpcm_w )
+{
+ hyprolyb_adpcm_state *state = get_safe_token(device);
+
+ soundlatch2_w(state->m_space, offset, data);
+ state->m_adpcm_ready = 0x80;
+}
+
+READ8_DEVICE_HANDLER( hyprolyb_adpcm_busy_r )
+{
+ hyprolyb_adpcm_state *state = get_safe_token(device);
+
+ return state->m_adpcm_busy ? 0x10 : 0x00;
+}
+
+static WRITE8_DEVICE_HANDLER( hyprolyb_msm_data_w )
+{
+ hyprolyb_adpcm_state *state = get_safe_token(device);
+
+ msm5205_data_w(state->m_msm, data);
+ state->m_adpcm_busy = ~data & 0x80;
+}
+
+static READ8_DEVICE_HANDLER( hyprolyb_msm_vck_r )
+{
+ hyprolyb_adpcm_state *state = get_safe_token(device);
+
+ UINT8 old = state->m_vck_ready;
+ state->m_vck_ready = 0x00;
+ return old;
+}
+
+static READ8_DEVICE_HANDLER( hyprolyb_adpcm_ready_r )
+{
+ hyprolyb_adpcm_state *state = get_safe_token(device);
+
+ return state->m_adpcm_ready;
+}
+
+static READ8_DEVICE_HANDLER( hyprolyb_adpcm_data_r )
+{
+ hyprolyb_adpcm_state *state = get_safe_token(device);
+
+ state->m_adpcm_ready = 0x00;
+ return soundlatch2_r(state->m_space, offset);
+}
+
+static ADDRESS_MAP_START( hyprolyb_adpcm_map, AS_PROGRAM, 8 )
+ AM_RANGE(0x0000, 0x007f) AM_RAM
+ AM_RANGE(0x1000, 0x1000) AM_DEVREAD("hyprolyb_adpcm", hyprolyb_adpcm_data_r)
+ AM_RANGE(0x1001, 0x1001) AM_DEVREAD("hyprolyb_adpcm", hyprolyb_adpcm_ready_r)
+ AM_RANGE(0x1002, 0x1002) AM_DEVWRITE("hyprolyb_adpcm", hyprolyb_msm_data_w)
+ AM_RANGE(0x1003, 0x1003) AM_DEVREAD("hyprolyb_adpcm", hyprolyb_msm_vck_r)
+ // on init:
+ // $1003 = $00
+ // $1002 = $FF
+ // $1003 = $34
+ // $1001 = $36
+ // $1002 = $80
+ // loops while ($1003) & 0x80 == 0
+ // 1002 = ADPCM data written (low 4 bits)
+ //
+ // $1003 & $80 (in) = 5205 DRQ
+ // $1002 & $0f (out) = 5205 data
+ // $1001 & $80 (in) = sound latch request
+ // $1000 (in) = sound latch data
+ AM_RANGE(0x8000, 0xffff) AM_ROM
+ADDRESS_MAP_END
+
+static void adpcm_vck_callback( device_t *device )
+{
+ device_t *adpcm = device->machine().device("hyprolyb_adpcm");
+ hyprolyb_adpcm_state *state = get_safe_token(adpcm);
+
+ state->m_vck_ready = 0x80;
+}
+
+static const msm5205_interface hyprolyb_msm5205_config =
+{
+ adpcm_vck_callback, /* VCK function */
+ MSM5205_S96_4B /* 4 kHz */
+};
+
+MACHINE_CONFIG_FRAGMENT( hyprolyb_adpcm )
+ MCFG_CPU_ADD("adpcm", M6802, XTAL_14_31818MHz/8) /* unknown clock */
+ MCFG_CPU_PROGRAM_MAP(hyprolyb_adpcm_map)
+
+ MCFG_SOUND_ADD("hyprolyb_adpcm", HYPROLYB_ADPCM, 0)
+
+ MCFG_SOUND_ADD("msm", MSM5205, 384000)
+ MCFG_SOUND_CONFIG(hyprolyb_msm5205_config)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
+MACHINE_CONFIG_END
+
+/*****************************************************************************
+ DEVICE DEFINITION
+*****************************************************************************/
+
+static const char DEVTEMPLATE_SOURCE[] = __FILE__;
+
+#define DEVTEMPLATE_ID(p,s) p##hyprolyb_adpcm##s
+#define DEVTEMPLATE_FEATURES DT_HAS_START | DT_HAS_RESET
+#define DEVTEMPLATE_NAME "Hyper Olympics Audio"
+#define DEVTEMPLATE_FAMILY "Hyper Olympics Audio IC"
+#include "devtempl.h"
+
+DEFINE_LEGACY_SOUND_DEVICE(HYPROLYB_ADPCM, hyprolyb_adpcm);