Modernized the hyprolyb_adpcm device. [Osso]

This commit is contained in:
Scott Stone 2013-07-11 17:27:40 +00:00
parent b02ea9d273
commit b318608efd
4 changed files with 118 additions and 150 deletions

View File

@ -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<hyprolyb_adpcm_device *>(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<msm5205_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<driver_device>();
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<driver_device>();
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::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<msm5205_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<driver_device>();
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<driver_device>();
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
//-------------------------------------------------

View File

@ -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;

View File

@ -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. */

View File

@ -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 )