Add skeleton Apple Sound Chip device (no whatsnew)

This commit is contained in:
R. Belmont 2010-09-17 02:42:13 +00:00
parent cbcfc6a7fa
commit 893c1f3e81
5 changed files with 331 additions and 0 deletions

2
.gitattributes vendored
View File

@ -870,6 +870,8 @@ src/emu/sound/aica.h svneol=native#text/plain
src/emu/sound/aicadsp.c svneol=native#text/plain
src/emu/sound/aicadsp.h svneol=native#text/plain
src/emu/sound/aicalfo.c svneol=native#text/plain
src/emu/sound/asc.c svneol=native#text/plain
src/emu/sound/asc.h svneol=native#text/plain
src/emu/sound/astrocde.c svneol=native#text/plain
src/emu/sound/astrocde.h svneol=native#text/plain
src/emu/sound/ay8910.c svneol=native#text/plain

190
src/emu/sound/asc.c Normal file
View File

@ -0,0 +1,190 @@
/***************************************************************************
asc.c
Apple Sound Chip (ASC) 344S0063
Enhanced Apple Sound Chip (EASC) 343S1063
Emulation by R. Belmont
***************************************************************************/
#include "emu.h"
#include "streams.h"
#include "asc.h"
//**************************************************************************
// GLOBAL VARIABLES
//**************************************************************************
//**************************************************************************
// DEVICE CONFIGURATION
//**************************************************************************
//-------------------------------------------------
// static_set_type - configuration helper to set
// the chip type
//-------------------------------------------------
void asc_device_config::static_set_type(device_config *device, int type)
{
asc_device_config *asc = downcast<asc_device_config *>(device);
asc->m_type = type;
}
//-------------------------------------------------
// asc_device_config - constructor
//-------------------------------------------------
asc_device_config::asc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock)
: device_config(mconfig, static_alloc_device_config, "ASC", tag, owner, clock),
device_config_sound_interface(mconfig, *this)
{
}
//-------------------------------------------------
// static_alloc_device_config - allocate a new
// configuration object
//-------------------------------------------------
device_config *asc_device_config::static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock)
{
return global_alloc(asc_device_config(mconfig, tag, owner, clock));
}
//-------------------------------------------------
// alloc_device - allocate a new device object
//-------------------------------------------------
device_t *asc_device_config::alloc_device(running_machine &machine) const
{
return auto_alloc(&machine, asc_device(machine, *this));
}
//**************************************************************************
// LIVE DEVICE
//**************************************************************************
//-------------------------------------------------
// asc_device - constructor
//-------------------------------------------------
asc_device::asc_device(running_machine &_machine, const asc_device_config &config)
: device_t(_machine, config),
device_sound_interface(_machine, config, *this),
m_config(config),
m_chip_type(m_config.m_type)
{
}
//-------------------------------------------------
// device_start - device-specific startup
//-------------------------------------------------
void asc_device::device_start()
{
// create the stream
m_stream = stream_create(this, 0, 2, 22257, this, static_stream_generate);
}
//-------------------------------------------------
// device_reset - device-specific reset
//-------------------------------------------------
void asc_device::device_reset()
{
stream_update(m_stream);
}
//-------------------------------------------------
// stream_generate - handle update requests for
// our sound stream
//-------------------------------------------------
STREAM_UPDATE( asc_device::static_stream_generate )
{
reinterpret_cast<asc_device *>(param)->stream_generate(inputs, outputs, samples);
}
void asc_device::stream_generate(stream_sample_t **inputs, stream_sample_t **outputs, int samples)
{
// reset the output stream
memset(outputs[0], 0, samples * sizeof(*outputs[0]));
}
//-------------------------------------------------
// read - read from the chip's registers and internal RAM
//-------------------------------------------------
UINT8 asc_device::read(UINT16 offset)
{
if (offset < 0x400)
{
return fifo_a[offset];
}
else if (offset < 0x800)
{
return fifo_b[offset-0x400];
}
else
{
switch (offset)
{
case 0x800: // VERSION
switch (m_chip_type)
{
case ASC_TYPE_ASC:
return 0;
case ASC_TYPE_V8:
return 0xe8;
case ASC_TYPE_SONORA:
return 0xbc;
default:
return 0;
}
break;
case 0x804: // FIFO Interrupt Status
if (m_chip_type == ASC_TYPE_V8)
{
return 3;
}
break;
default:
break;
}
}
return regs[offset-0x800];
}
//-------------------------------------------------
// write - write to the chip's registers and internal RAM
//-------------------------------------------------
void asc_device::write(UINT16 offset, UINT8 data)
{
if (offset < 0x400)
{
fifo_a[offset] = data;
}
else if (offset < 0x800)
{
fifo_b[offset-0x400] = data;
}
else
{
regs[offset-0x800] = data;
}
}
const device_type ASC = asc_device_config::static_alloc_device_config;

129
src/emu/sound/asc.h Normal file
View File

@ -0,0 +1,129 @@
/***************************************************************************
asc.h
Apple Sound Chip (ASC) 344S0063
Enhanced Apple Sound Chip (EASC) 343S1063
***************************************************************************/
#pragma once
#ifndef __ASC_H__
#define __ASC_H__
#include "streams.h"
//**************************************************************************
// CONSTANTS
//**************************************************************************
// chip behavior types
enum
{
ASC_TYPE_ASC = 0, // original discrete Apple Sound Chip
ASC_TYPE_EASC = 1, // discrete Enhanced Apple Sound Chip
ASC_TYPE_V8 = 2, // Subset of ASC included in the V8 ASIC (LC/LCII)
ASC_TYPE_EAGLE = 3, // Subset of ASC included in the Eagle ASIC (Classic II)
ASC_TYPE_SPICE = 4, // Subset of ASC included in the Spice ASIC (Color Classic)
ASC_TYPE_SONORA = 5, // Subset of ASC included in the Sonora ASIC (LCIII)
ASC_TYPE_VASP = 6, // Subset of ASC included in the VASP ASIC (IIvx/IIvi)
ASC_TYPE_ARDBEG = 7 // Subset of ASC included in the Ardbeg ASIC (LC520)
};
//**************************************************************************
// INTERFACE CONFIGURATION MACROS
//**************************************************************************
#define MDRV_ASC_ADD(_tag, _clock, _type) \
MDRV_DEVICE_ADD(_tag, ASC, _clock) \
MDRV_ASC_TYPE(_type)
#define MDRV_ASC_REPLACE(_tag, _clock, _type) \
MDRV_DEVICE_REPLACE(_tag, ASC, _clock) \
MDRV_ASC_TYPE(_type)
#define MDRV_ASC_TYPE(_type) \
asc_device_config::static_set_type(device, _type); \
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> asc_device_config
class asc_device_config : public device_config, public device_config_sound_interface
{
friend class asc_device;
// construction/destruction
asc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock);
public:
// allocators
static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock);
virtual device_t *alloc_device(running_machine &machine) const;
// inline configuration helpers
static void static_set_type(device_config *device, int type);
protected:
// device_config overrides
virtual const address_space_config *memory_space_config(int spacenum = 0) const;
// internal state
const address_space_config m_space_config;
// inline data
UINT8 m_type;
};
// ======================> asc_device
class asc_device : public device_t, public device_sound_interface
{
friend class asc_device_config;
// construction/destruction
asc_device(running_machine &_machine, const asc_device_config &config);
public:
UINT8 read(UINT16 offset);
void write(UINT16 offset, UINT8 data);
protected:
// device-level overrides
virtual void device_start();
virtual void device_reset();
// internal callbacks
static STREAM_UPDATE( static_stream_generate );
virtual void stream_generate(stream_sample_t **inputs, stream_sample_t **outputs, int samples);
// internal state
const asc_device_config &m_config;
UINT8 m_chip_type;
sound_stream *m_stream;
UINT8 fifo_a[0x400];
UINT8 fifo_b[0x400];
UINT8 regs[0x100];
};
// device type definition
extern const device_type ASC;
#endif /* __ASC_H__ */

View File

@ -72,6 +72,15 @@ $(SOUNDOBJ)/discrete.o: $(SOUNDSRC)/discrete.c \
$(SOUNDSRC)/disc_wav.c
#-------------------------------------------------
# Apple custom sound chips
#-------------------------------------------------
ifneq ($(filter ASC,$(SOUNDS)),)
SOUNDOBJS += $(SOUNDOBJ)/asc.o
endif
#-------------------------------------------------
# Atari custom sound chips

View File

@ -224,6 +224,7 @@ SOUNDS += CDP1864
SOUNDS += ZSG2
SOUNDS += MOS656X
SOUNDS += S2636
#SOUNDS += ASC
#-------------------------------------------------
# this is the list of driver libraries that