mirror of
https://github.com/holub/mame
synced 2025-05-22 05:38:52 +03:00
Add skeleton Apple Sound Chip device (no whatsnew)
This commit is contained in:
parent
cbcfc6a7fa
commit
893c1f3e81
2
.gitattributes
vendored
2
.gitattributes
vendored
@ -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
190
src/emu/sound/asc.c
Normal 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
129
src/emu/sound/asc.h
Normal 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__ */
|
||||
|
@ -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
|
||||
|
@ -224,6 +224,7 @@ SOUNDS += CDP1864
|
||||
SOUNDS += ZSG2
|
||||
SOUNDS += MOS656X
|
||||
SOUNDS += S2636
|
||||
#SOUNDS += ASC
|
||||
|
||||
#-------------------------------------------------
|
||||
# this is the list of driver libraries that
|
||||
|
Loading…
Reference in New Issue
Block a user