From b318608efd6c03f7af2747e34bb07d76ce7c3eb1 Mon Sep 17 00:00:00 2001 From: Scott Stone Date: Thu, 11 Jul 2013 17:27:40 +0000 Subject: [PATCH] Modernized the hyprolyb_adpcm device. [Osso] --- src/mame/audio/hyprolyb.c | 232 +++++++++++++++--------------------- src/mame/audio/hyprolyb.h | 30 +++-- src/mame/drivers/hyperspt.c | 2 +- src/mame/drivers/trackfld.c | 4 +- 4 files changed, 118 insertions(+), 150 deletions(-) diff --git a/src/mame/audio/hyprolyb.c b/src/mame/audio/hyprolyb.c index 50cea581e3f..42ffafe60a3 100644 --- a/src/mame/audio/hyprolyb.c +++ b/src/mame/audio/hyprolyb.c @@ -1,148 +1,16 @@ #include "emu.h" #include "cpu/m6800/m6800.h" -#include "sound/msm5205.h" #include "audio/hyprolyb.h" -#include "devlegcy.h" - -struct hyprolyb_adpcm_state -{ - msm5205_device *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(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); - driver_device *drvstate = space.machine().driver_data(); - drvstate->soundlatch2_byte_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); - - state->m_msm->data_w(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); - driver_device *drvstate = space.machine().driver_data(); - state->m_adpcm_ready = 0x00; - return drvstate->soundlatch2_byte_r(*state->m_space, offset); -} - -static ADDRESS_MAP_START( hyprolyb_adpcm_map, AS_PROGRAM, 8, driver_device ) - AM_RANGE(0x0000, 0x007f) AM_RAM - AM_RANGE(0x1000, 0x1000) AM_DEVREAD_LEGACY("hyprolyb_adpcm", hyprolyb_adpcm_data_r) - AM_RANGE(0x1001, 0x1001) AM_DEVREAD_LEGACY("hyprolyb_adpcm", hyprolyb_adpcm_ready_r) - AM_RANGE(0x1002, 0x1002) AM_DEVWRITE_LEGACY("hyprolyb_adpcm", hyprolyb_msm_data_w) - AM_RANGE(0x1003, 0x1003) AM_DEVREAD_LEGACY("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, int st ) -{ - 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 = -{ - DEVCB_LINE(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 const device_type HYPROLYB_ADPCM = &device_creator; hyprolyb_adpcm_device::hyprolyb_adpcm_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : device_t(mconfig, HYPROLYB_ADPCM, "Hyper Olympics Audio", tag, owner, clock, "hyprolyb_adpcm", __FILE__), - device_sound_interface(mconfig, *this) + device_sound_interface(mconfig, *this), + m_adpcm_ready(0), + m_adpcm_busy(0), + m_vck_ready(0) { - m_token = global_alloc_clear(hyprolyb_adpcm_state); } //------------------------------------------------- @@ -161,7 +29,11 @@ void hyprolyb_adpcm_device::device_config_complete() void hyprolyb_adpcm_device::device_start() { - DEVICE_START_NAME( hyprolyb_adpcm )(this); + m_space = &machine().device("audiocpu")->memory().space(AS_PROGRAM); + m_msm = machine().device("msm"); + save_item(NAME(m_adpcm_ready)); // only bootlegs + save_item(NAME(m_adpcm_busy)); + save_item(NAME(m_vck_ready)); } //------------------------------------------------- @@ -170,9 +42,93 @@ void hyprolyb_adpcm_device::device_start() void hyprolyb_adpcm_device::device_reset() { - DEVICE_RESET_NAME( hyprolyb_adpcm )(this); + m_adpcm_ready = 0; + m_adpcm_busy = 0; + m_vck_ready = 0; } +WRITE8_MEMBER( hyprolyb_adpcm_device::write ) +{ + driver_device *drvstate = space.machine().driver_data(); + drvstate->soundlatch2_byte_w(*m_space, offset, data); + m_adpcm_ready = 0x80; +} + +READ8_MEMBER( hyprolyb_adpcm_device::busy_r ) +{ + return m_adpcm_busy ? 0x10 : 0x00; +} + +WRITE8_MEMBER( hyprolyb_adpcm_device::msm_data_w ) +{ + m_msm->data_w(data); + m_adpcm_busy = ~data & 0x80; +} + +READ8_MEMBER( hyprolyb_adpcm_device::msm_vck_r ) +{ + UINT8 old = m_vck_ready; + m_vck_ready = 0x00; + return old; +} + +READ8_MEMBER( hyprolyb_adpcm_device::ready_r ) +{ + return m_adpcm_ready; +} + +READ8_MEMBER( hyprolyb_adpcm_device::data_r ) +{ + driver_device *drvstate = space.machine().driver_data(); + m_adpcm_ready = 0x00; + return drvstate->soundlatch2_byte_r(*m_space, offset); +} + +static ADDRESS_MAP_START( hyprolyb_adpcm_map, AS_PROGRAM, 8, driver_device ) + AM_RANGE(0x0000, 0x007f) AM_RAM + AM_RANGE(0x1000, 0x1000) AM_DEVREAD("hyprolyb_adpcm", hyprolyb_adpcm_device, data_r) + AM_RANGE(0x1001, 0x1001) AM_DEVREAD("hyprolyb_adpcm", hyprolyb_adpcm_device, ready_r) + AM_RANGE(0x1002, 0x1002) AM_DEVWRITE("hyprolyb_adpcm", hyprolyb_adpcm_device, msm_data_w) + AM_RANGE(0x1003, 0x1003) AM_DEVREAD("hyprolyb_adpcm", hyprolyb_adpcm_device, 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 + +void hyprolyb_adpcm_device::vck_callback( int st ) +{ + m_vck_ready = 0x80; +} + +static const msm5205_interface hyprolyb_msm5205_config = +{ + DEVCB_DEVICE_LINE_MEMBER("hyprolyb_adpcm", hyprolyb_adpcm_device, 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 + + //------------------------------------------------- // sound_stream_update - handle a stream update //------------------------------------------------- diff --git a/src/mame/audio/hyprolyb.h b/src/mame/audio/hyprolyb.h index c998552cc95..1574cc5ad95 100644 --- a/src/mame/audio/hyprolyb.h +++ b/src/mame/audio/hyprolyb.h @@ -1,17 +1,22 @@ -DECLARE_WRITE8_DEVICE_HANDLER( hyprolyb_adpcm_w ); -DECLARE_READ8_DEVICE_HANDLER( hyprolyb_adpcm_busy_r ); - -MACHINE_CONFIG_EXTERN( hyprolyb_adpcm ); +#include "sound/msm5205.h" class hyprolyb_adpcm_device : public device_t, public device_sound_interface { public: hyprolyb_adpcm_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); - ~hyprolyb_adpcm_device() { global_free(m_token); } + ~hyprolyb_adpcm_device() {} + + DECLARE_WRITE8_MEMBER( write ); + DECLARE_READ8_MEMBER( busy_r ); + + WRITE8_MEMBER( msm_data_w ); + READ8_MEMBER( msm_vck_r ); + READ8_MEMBER( ready_r ); + READ8_MEMBER( data_r ); + + void vck_callback( int st ); - // access to legacy token - void *token() const { assert(m_token != NULL); return m_token; } protected: // device-level overrides virtual void device_config_complete(); @@ -20,9 +25,16 @@ protected: // sound stream update overrides virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples); -private: + + private: // internal state - void *m_token; + msm5205_device *m_msm; + address_space *m_space; + UINT8 m_adpcm_ready; // only bootlegs + UINT8 m_adpcm_busy; + UINT8 m_vck_ready; }; +MACHINE_CONFIG_EXTERN( hyprolyb_adpcm ); + extern const device_type HYPROLYB_ADPCM; diff --git a/src/mame/drivers/hyperspt.c b/src/mame/drivers/hyperspt.c index 9c216f194e5..6e4c3472645 100644 --- a/src/mame/drivers/hyperspt.c +++ b/src/mame/drivers/hyperspt.c @@ -91,7 +91,7 @@ static ADDRESS_MAP_START( soundb_map, AS_PROGRAM, 8, hyperspt_state ) AM_RANGE(0x6000, 0x6000) AM_READ(soundlatch_byte_r) AM_RANGE(0x8000, 0x8000) AM_READ_LEGACY(hyperspt_sh_timer_r) AM_RANGE(0xa000, 0xa000) AM_NOP - AM_RANGE(0xc000, 0xdfff) AM_DEVWRITE_LEGACY("hyprolyb_adpcm", hyprolyb_adpcm_w) /* speech and output control */ + AM_RANGE(0xc000, 0xdfff) AM_DEVWRITE("hyprolyb_adpcm", hyprolyb_adpcm_device, write) /* speech and output control */ AM_RANGE(0xe000, 0xe000) AM_DEVWRITE("dac", dac_device, write_unsigned8) AM_RANGE(0xe001, 0xe001) AM_WRITE(konami_SN76496_latch_w) /* Loads the snd command into the snd latch */ AM_RANGE(0xe002, 0xe002) AM_WRITE(konami_SN76496_w) /* This address triggers the SN chip to read the data port. */ diff --git a/src/mame/drivers/trackfld.c b/src/mame/drivers/trackfld.c index d83b3df2b73..8332df690c8 100644 --- a/src/mame/drivers/trackfld.c +++ b/src/mame/drivers/trackfld.c @@ -423,9 +423,9 @@ static ADDRESS_MAP_START( hyprolyb_sound_map, AS_PROGRAM, 8, trackfld_state ) AM_RANGE(0xc000, 0xc000) AM_MIRROR(0x1fff) AM_READ(trackfld_SN76496_r) AM_WRITE(konami_SN76496_w) AM_RANGE(0xe000, 0xe000) AM_MIRROR(0x1ff8) AM_DEVWRITE("dac", dac_device, write_unsigned8) AM_RANGE(0xe001, 0xe001) AM_MIRROR(0x1ff8) AM_NOP /* watch dog ?; reaktor reads here */ - AM_RANGE(0xe002, 0xe002) AM_MIRROR(0x1ff8) AM_DEVREAD_LEGACY("hyprolyb_adpcm", hyprolyb_adpcm_busy_r) + AM_RANGE(0xe002, 0xe002) AM_MIRROR(0x1ff8) AM_DEVREAD("hyprolyb_adpcm", hyprolyb_adpcm_device, busy_r) AM_RANGE(0xe003, 0xe003) AM_MIRROR(0x1ff8) AM_WRITENOP - AM_RANGE(0xe004, 0xe004) AM_MIRROR(0x1ff8) AM_DEVWRITE_LEGACY("hyprolyb_adpcm", hyprolyb_adpcm_w) + AM_RANGE(0xe004, 0xe004) AM_MIRROR(0x1ff8) AM_DEVWRITE("hyprolyb_adpcm", hyprolyb_adpcm_device, write) ADDRESS_MAP_END static INPUT_PORTS_START( trackfld )