cog/Frameworks/GME/vgmplay/chips/scsp.c

216 lines
5.2 KiB
C

//#include "emu.h"
#include "mamedef.h"
#include <stdlib.h> // for malloc/free
#include <string.h> // for memset
#include "scsp.h"
#include "yam.h"
enum { SCSPRAM_LENGTH = 0x80000 };
#undef YAMSTATE
#define SCSPRAM ((unsigned char *)info)
#define YAMSTATE ((void*)(SCSPRAM+SCSPRAM_LENGTH))
//static STREAM_UPDATE( SCSP_Update )
void SCSP_Update(void *info, stream_sample_t **outputs, int samples)
{
sint16 buffer[400];
stream_sample_t *bufferleft = outputs[0];
stream_sample_t *bufferright = outputs[1];
while (samples) {
int i;
int samplesnow = samples>200 ? 200 : samples;
yam_beginbuffer(YAMSTATE, buffer);
yam_advance(YAMSTATE, samplesnow);
yam_flush(YAMSTATE);
for (i = 0; i < samplesnow; ++i) {
*bufferleft++ = buffer[i * 2] << 8;
*bufferright++ = buffer[i * 2 + 1] << 8;
}
samples -= samplesnow;
}
}
//static DEVICE_START( scsp )
int device_start_scsp(void **_info, int clock, int Flags)
{
void * info = malloc(SCSPRAM_LENGTH + yam_get_state_size(1));
if (info) {
memset(SCSPRAM, 0, SCSPRAM_LENGTH);
device_reset_scsp(info);
*_info = info;
}
return 44100;
}
void device_stop_scsp(void *info)
{
free(info);
}
void device_reset_scsp(void *info)
{
yam_clear_state(YAMSTATE, 1);
yam_setram(YAMSTATE, (uint32*)info, SCSPRAM_LENGTH, 0, EMU_ENDIAN_XOR(1) ^ 1);
yam_enable_dry(YAMSTATE, 1);
yam_enable_dsp(YAMSTATE, 1);
yam_enable_dsp_dynarec(YAMSTATE, 0);
}
/*void scsp_set_ram_base(device_t *device, void *base)
{
scsp_state *scsp = get_safe_token(device);
if (scsp)
{
scsp->SCSPRAM = (unsigned char *)base;
scsp->DSP.SCSPRAM = (UINT16 *)base;
scsp->SCSPRAM_LENGTH = 0x80000;
scsp->DSP.SCSPRAM_LENGTH = 0x80000/2;
}
}*/
//READ16_DEVICE_HANDLER( scsp_r )
UINT16 scsp_r(void *info, offs_t offset)
{
return yam_scsp_load_reg(YAMSTATE, offset*2, 0xFFFF);
}
//WRITE16_DEVICE_HANDLER( scsp_w )
void scsp_w(void *info, offs_t offset, UINT8 data)
{
UINT8 tmp8;
UINT16 tmp;
tmp = yam_scsp_load_reg(YAMSTATE, offset & 0xFFFE, 0xFFFF);
//COMBINE_DATA(&tmp);
if (offset & 1)
tmp = (tmp & 0xFF00) | (data << 0);
else
tmp = (tmp & 0x00FF) | (data << 8);
yam_scsp_store_reg(YAMSTATE, offset & 0xFFFE, tmp, 0xFFFF, &tmp8);
}
/*WRITE16_DEVICE_HANDLER( scsp_midi_in )
{
scsp_state *scsp = get_safe_token(device);
// printf("scsp_midi_in: %02x\n", data);
scsp->MidiStack[scsp->MidiW++]=data;
scsp->MidiW &= 31;
//CheckPendingIRQ(scsp);
}
READ16_DEVICE_HANDLER( scsp_midi_out_r )
{
scsp_state *scsp = get_safe_token(device);
unsigned char val;
val=scsp->MidiStack[scsp->MidiR++];
scsp->MidiR&=31;
return val;
}*/
/*void scsp_write_rom(UINT8 ChipID, offs_t ROMSize, offs_t DataStart, offs_t DataLength,
const UINT8* ROMData)
{
scsp_state *scsp = &SCSPData[ChipID];
if (scsp->SCSPRAM_LENGTH != ROMSize)
{
scsp->SCSPRAM = (unsigned char*)realloc(scsp->SCSPRAM, ROMSize);
scsp->SCSPRAM_LENGTH = ROMSize;
scsp->DSP.SCSPRAM = (UINT16*)scsp->SCSPRAM;
scsp->DSP.SCSPRAM_LENGTH = scsp->SCSPRAM_LENGTH / 2;
memset(scsp->SCSPRAM, 0x00, ROMSize);
}
if (DataStart > ROMSize)
return;
if (DataStart + DataLength > ROMSize)
DataLength = ROMSize - DataStart;
memcpy(scsp->SCSPRAM + DataStart, ROMData, DataLength);
return;
}*/
void scsp_write_ram(void *info, offs_t DataStart, offs_t DataLength, const UINT8* RAMData)
{
if (DataStart >= SCSPRAM_LENGTH)
return;
if (DataStart + DataLength > SCSPRAM_LENGTH)
DataLength = SCSPRAM_LENGTH - DataStart;
memcpy(SCSPRAM + DataStart, RAMData, DataLength);
return;
}
void scsp_set_mute_mask(void *info, UINT32 MuteMask)
{
int CurChn;
for (CurChn = 0; CurChn < 32; CurChn ++)
yam_set_mute(YAMSTATE, CurChn, (MuteMask >> CurChn) & 0x01);
}
/*UINT8 scsp_get_channels(void *_info, UINT32* ChannelMask)
{
scsp_state *scsp = (scsp_state *)_info;
UINT8 CurChn;
UINT8 UsedChns;
UINT32 ChnMask;
ChnMask = 0x00000000;
UsedChns = 0x00;
for (CurChn = 0; CurChn < 32; CurChn ++)
{
if (scsp->Slots[CurChn].active)
{
ChnMask |= (1 << CurChn);
UsedChns ++;
}
}
if (ChannelMask != NULL)
*ChannelMask = ChnMask;
return UsedChns;
}*/
/**************************************************************************
* Generic get_info
**************************************************************************/
/*DEVICE_GET_INFO( scsp )
{
switch (state)
{
// --- the following bits of info are returned as 64-bit signed integers ---
case DEVINFO_INT_TOKEN_BYTES: info->i = sizeof(scsp_state); break;
// --- the following bits of info are returned as pointers to data or functions ---
case DEVINFO_FCT_START: info->start = DEVICE_START_NAME( scsp ); break;
case DEVINFO_FCT_STOP: // Nothing // break;
case DEVINFO_FCT_RESET: // Nothing // break;
// --- the following bits of info are returned as NULL-terminated strings ---
case DEVINFO_STR_NAME: strcpy(info->s, "SCSP"); break;
case DEVINFO_STR_FAMILY: strcpy(info->s, "Sega/Yamaha custom"); break;
case DEVINFO_STR_VERSION: strcpy(info->s, "2.1.1"); break;
case DEVINFO_STR_SOURCE_FILE: strcpy(info->s, __FILE__); break;
case DEVINFO_STR_CREDITS: strcpy(info->s, "Copyright Nicola Salmoria and the MAME Team"); break;
}
}*/
//DEFINE_LEGACY_SOUND_DEVICE(SCSP, scsp);