mirror of
https://github.com/holub/mame
synced 2025-07-04 17:38:08 +03:00
Modernized the hyprolyb_adpcm device. [Osso]
This commit is contained in:
parent
b02ea9d273
commit
b318608efd
@ -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
|
||||
//-------------------------------------------------
|
||||
|
@ -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;
|
||||
|
@ -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. */
|
||||
|
@ -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 )
|
||||
|
Loading…
Reference in New Issue
Block a user