Added support to ymz280.cpp for volume and left/right selection for each route. Updated necessary drivers to support.

This commit is contained in:
Barry Harris 2012-05-22 14:48:21 +00:00
parent 33dfb87696
commit 2c338d332f
14 changed files with 84 additions and 47 deletions

View File

@ -568,7 +568,9 @@ static INT32 DrvInit()
CaveTileInitLayer(1, 0x400000, 8, 0x4000);
CaveTileInitLayer(2, 0x200000, 8, 0x4000);
YMZ280BInit(16934400, &TriggerSoundIRQ, 3);
YMZ280BInit(16934400, &TriggerSoundIRQ);
YMZ280BSetRoute(BURN_SND_YMZ280B_YMZ280B_ROUTE_1, 1.00, BURN_SND_ROUTE_LEFT);
YMZ280BSetRoute(BURN_SND_YMZ280B_YMZ280B_ROUTE_2, 1.00, BURN_SND_ROUTE_RIGHT);
bDrawScreen = true;

View File

@ -578,7 +578,9 @@ static INT32 DrvInit()
CaveTileInitLayer(1, 0x800000, 8, 0x4000);
CaveTileInitLayer(2, 0x400000, 8, 0x4000);
YMZ280BInit(16934400, &TriggerSoundIRQ, 3);
YMZ280BInit(16934400, &TriggerSoundIRQ);
YMZ280BSetRoute(BURN_SND_YMZ280B_YMZ280B_ROUTE_1, 1.00, BURN_SND_ROUTE_LEFT);
YMZ280BSetRoute(BURN_SND_YMZ280B_YMZ280B_ROUTE_2, 1.00, BURN_SND_ROUTE_RIGHT);
bDrawScreen = true;

View File

@ -546,7 +546,9 @@ static INT32 DrvInit()
CaveTileInitLayer(0, 0x400000, 8, 0x4000);
CaveTileInitLayer(1, 0x400000, 8, 0x4000);
YMZ280BInit(16934400, &TriggerSoundIRQ, 3);
YMZ280BInit(16934400, &TriggerSoundIRQ);
YMZ280BSetRoute(BURN_SND_YMZ280B_YMZ280B_ROUTE_1, 1.00, BURN_SND_ROUTE_LEFT);
YMZ280BSetRoute(BURN_SND_YMZ280B_YMZ280B_ROUTE_2, 1.00, BURN_SND_ROUTE_RIGHT);
bDrawScreen = true;

View File

@ -812,7 +812,9 @@ static INT32 DrvInit()
CaveTileInitLayer(1, 0x400000, 8, 0x4000);
CaveTileInitLayer(2, 0x400000, 8, 0x4000);
YMZ280BInit(16000000, &TriggerSoundIRQ, 3);
YMZ280BInit(16000000, &TriggerSoundIRQ);
YMZ280BSetRoute(BURN_SND_YMZ280B_YMZ280B_ROUTE_1, 1.00, BURN_SND_ROUTE_LEFT);
YMZ280BSetRoute(BURN_SND_YMZ280B_YMZ280B_ROUTE_2, 1.00, BURN_SND_ROUTE_RIGHT);
bDrawScreen = true;

View File

@ -609,7 +609,9 @@ static INT32 DrvInit()
CaveTileInitLayer(1, 0x400000, 8, 0x4000);
CaveTileInitLayer(2, 0x400000, 8, 0x4000);
YMZ280BInit(16934400, &TriggerSoundIRQ, 3);
YMZ280BInit(16934400, &TriggerSoundIRQ);
YMZ280BSetRoute(BURN_SND_YMZ280B_YMZ280B_ROUTE_1, 1.00, BURN_SND_ROUTE_LEFT);
YMZ280BSetRoute(BURN_SND_YMZ280B_YMZ280B_ROUTE_2, 1.00, BURN_SND_ROUTE_RIGHT);
bDrawScreen = true;

View File

@ -587,7 +587,9 @@ static INT32 DrvInit()
CaveSpriteInit(1, 0x300000);
CaveTileInitLayer(0, 0x200000, 4, 0x4400);
YMZ280BInit(16934400, &TriggerSoundIRQ, 3);
YMZ280BInit(16934400, &TriggerSoundIRQ);
YMZ280BSetRoute(BURN_SND_YMZ280B_YMZ280B_ROUTE_1, 1.00, BURN_SND_ROUTE_LEFT);
YMZ280BSetRoute(BURN_SND_YMZ280B_YMZ280B_ROUTE_2, 1.00, BURN_SND_ROUTE_RIGHT);
bDrawScreen = true;
@ -665,7 +667,9 @@ static INT32 crushermInit()
CaveSpriteInit(1, 0x400000);
CaveTileInitLayer(0, 0x200000, 4, 0x4400);
YMZ280BInit(16934400, &TriggerSoundIRQ, 3);
YMZ280BInit(16934400, &TriggerSoundIRQ);
YMZ280BSetRoute(BURN_SND_YMZ280B_YMZ280B_ROUTE_1, 1.00, BURN_SND_ROUTE_LEFT);
YMZ280BSetRoute(BURN_SND_YMZ280B_YMZ280B_ROUTE_2, 1.00, BURN_SND_ROUTE_RIGHT);
bDrawScreen = true;

View File

@ -538,7 +538,9 @@ static INT32 DrvInit()
CaveSpriteInit(1, 0x800000);
CaveTileInitLayer(0, 0x400000, 8, 0x4000);
YMZ280BInit(16934400, &TriggerSoundIRQ, 3);
YMZ280BInit(16934400, &TriggerSoundIRQ);
YMZ280BSetRoute(BURN_SND_YMZ280B_YMZ280B_ROUTE_1, 1.00, BURN_SND_ROUTE_LEFT);
YMZ280BSetRoute(BURN_SND_YMZ280B_YMZ280B_ROUTE_2, 1.00, BURN_SND_ROUTE_RIGHT);
bDrawScreen = true;

View File

@ -391,7 +391,9 @@ static INT32 DrvInit(UINT32 speedhack)
EEPROMInit(&eeprom_interface_93C46);
YMZ280BInit(14000000, NULL, 3);
YMZ280BInit(14000000, NULL);
YMZ280BSetRoute(BURN_SND_YMZ280B_YMZ280B_ROUTE_1, 1.00, BURN_SND_ROUTE_LEFT);
YMZ280BSetRoute(BURN_SND_YMZ280B_YMZ280B_ROUTE_2, 1.00, BURN_SND_ROUTE_RIGHT);
deco16Init(0, 0, 1);
deco16_set_bank_callback(0, backfire_bank_callback);

View File

@ -564,7 +564,9 @@ static INT32 DrvInit()
SekSetWriteByteHandler(1, jchan_sub_command_write_byte);
SekClose();
YMZ280BInit(16000000, NULL, 3);
YMZ280BInit(16000000, NULL);
YMZ280BSetRoute(BURN_SND_YMZ280B_YMZ280B_ROUTE_1, 1.00, BURN_SND_ROUTE_LEFT);
YMZ280BSetRoute(BURN_SND_YMZ280B_YMZ280B_ROUTE_2, 1.00, BURN_SND_ROUTE_RIGHT);
GenericTilesInit();

View File

@ -335,7 +335,9 @@ static INT32 DrvInit()
SekSetReadWordHandler(0, midas_read_word);
SekClose();
YMZ280BInit(16934400, NULL, 3);
YMZ280BInit(16934400, NULL);
YMZ280BSetRoute(BURN_SND_YMZ280B_YMZ280B_ROUTE_1, 0.80, BURN_SND_ROUTE_LEFT);
YMZ280BSetRoute(BURN_SND_YMZ280B_YMZ280B_ROUTE_2, 0.80, BURN_SND_ROUTE_RIGHT);
EEPROMInit(&eeprom_interface_93C46);

View File

@ -666,7 +666,9 @@ static INT32 CommonInit(INT32 (*pRomLoadCallback)(), INT32 spritelen, INT32 sndl
// ymf262
YMZ280BInit(16900000, NULL, 3);
YMZ280BInit(16900000, NULL);
YMZ280BSetRoute(BURN_SND_YMZ280B_YMZ280B_ROUTE_1, 0.30, BURN_SND_ROUTE_LEFT);
YMZ280BSetRoute(BURN_SND_YMZ280B_YMZ280B_ROUTE_2, 0.30, BURN_SND_ROUTE_RIGHT);
MSM6295Init(0, 2000000 / 132, 1);
MSM6295SetRoute(0, 0.50, BURN_SND_ROUTE_BOTH);

View File

@ -858,7 +858,8 @@ static INT32 bbakraidInit()
DrvZ80Init(); // Initialize Z80
YMZ280BInit(16934400, NULL, 2);
YMZ280BInit(16934400, NULL);
YMZ280BSetAllRoutes(1.00, BURN_SND_ROUTE_BOTH);
BurnTimerInit(bbakraidTimerOver, NULL);
BurnTimerAttachZet(TOA_Z80_SPEED);

View File

@ -21,7 +21,6 @@ static INT32 nYMZ280BIRQStatus;
void (*YMZ280BIRQCallback)(INT32 nStatus) = NULL;
static INT32* pBuffer = NULL;
static INT32 nOutputChannels;
static double nYMZ280BFrequency;
@ -29,6 +28,9 @@ static INT32 YMZ280BDeltaTable[16];
static INT32 YMZ280BStepShift[8] = {0x0E6, 0x0E6, 0x0E6, 0x0E6, 0x133, 0x199, 0x200, 0x266};
static double YMZ280BVolumes[2];
static INT32 YMZ280BRouteDirs[2];
struct sYMZ280BChannelInfo {
bool bEnabled;
bool bPlaying;
@ -119,7 +121,7 @@ INT32 YMZ280BScan()
return 0;
}
INT32 YMZ280BInit(INT32 nClock, void (*IRQCallback)(INT32), INT32 nChannels)
INT32 YMZ280BInit(INT32 nClock, void (*IRQCallback)(INT32))
{
DebugSnd_YMZ280BInitted = 1;
@ -152,13 +154,28 @@ INT32 YMZ280BInit(INT32 nClock, void (*IRQCallback)(INT32), INT32 nChannels)
YMZ280BChannelData[j] = (INT32*)malloc(0x1000 * sizeof(INT32));
}
nOutputChannels = nChannels;
// default routes
YMZ280BVolumes[BURN_SND_YMZ280B_YMZ280B_ROUTE_1] = 1.00;
YMZ280BVolumes[BURN_SND_YMZ280B_YMZ280B_ROUTE_2] = 1.00;
YMZ280BRouteDirs[BURN_SND_YMZ280B_YMZ280B_ROUTE_1] = BURN_SND_ROUTE_LEFT;
YMZ280BRouteDirs[BURN_SND_YMZ280B_YMZ280B_ROUTE_2] = BURN_SND_ROUTE_RIGHT;
YMZ280BReset();
return 0;
}
void YMZ280BSetRoute(INT32 nIndex, double nVolume, INT32 nRouteDir)
{
#if defined FBA_DEBUG
if (!DebugSnd_YMZ280BInitted) bprintf(PRINT_ERROR, _T("BurnYMZ280BSetRoute called without init\n"));
if (nIndex < 0 || nIndex > 1) bprintf(PRINT_ERROR, _T("BurnYMZ280BSetRoute called with invalid index %i\n"), nIndex);
#endif
YMZ280BVolumes[nIndex] = nVolume;
YMZ280BRouteDirs[nIndex] = nRouteDir;
}
void YMZ280BExit()
{
#if defined FBA_DEBUG
@ -487,38 +504,25 @@ INT32 YMZ280BRender(INT16* pSoundBuf, INT32 nSegmentLength)
}
}
switch (nOutputChannels) {
case 1: // Use only the left output channel
case 2: { // Use only the right output channel
nCount = nSegmentLength;
buf = pBuffer + (nOutputChannels >> 1);
while (nCount--) {
nSample = *buf >> 8;
buf += 2;
if (nSample > 32767) {
nSample = 32767;
} else {
if (nSample < -32768) {
nSample = -32768;
for (INT32 i = 0; i < nSegmentLength; i++) {
INT32 nLeftSample = 0, nRightSample = 0;
if ((YMZ280BRouteDirs[BURN_SND_YMZ280B_YMZ280B_ROUTE_1] & BURN_SND_ROUTE_LEFT) == BURN_SND_ROUTE_LEFT) {
nLeftSample += (INT32)((pBuffer[(i << 1) + 0] >> 8) * YMZ280BVolumes[BURN_SND_YMZ280B_YMZ280B_ROUTE_1]);
}
if ((YMZ280BRouteDirs[BURN_SND_YMZ280B_YMZ280B_ROUTE_1] & BURN_SND_ROUTE_RIGHT) == BURN_SND_ROUTE_RIGHT) {
nRightSample += (INT32)((pBuffer[(i << 1) + 0] >> 8) * YMZ280BVolumes[BURN_SND_YMZ280B_YMZ280B_ROUTE_1]);
}
*pSoundBuf++ = (INT16)nSample;
*pSoundBuf++ = (INT16)nSample;
if ((YMZ280BRouteDirs[BURN_SND_YMZ280B_YMZ280B_ROUTE_2] & BURN_SND_ROUTE_LEFT) == BURN_SND_ROUTE_LEFT) {
nLeftSample += (INT32)((pBuffer[(i << 1) + 1] >> 8) * YMZ280BVolumes[BURN_SND_YMZ280B_YMZ280B_ROUTE_2]);
}
break;
}
case 3: { // Use both output channels
if (bBurnUseMMX) {
#if defined BUILD_X86_ASM
BurnSoundCopyClamp_A(pBuffer, pSoundBuf, nSegmentLength);
#endif
} else {
BurnSoundCopyClamp_C(pBuffer, pSoundBuf, nSegmentLength);
if ((YMZ280BRouteDirs[BURN_SND_YMZ280B_YMZ280B_ROUTE_2] & BURN_SND_ROUTE_RIGHT) == BURN_SND_ROUTE_RIGHT) {
nRightSample += (INT32)((pBuffer[(i << 1) + 1] >> 8) * YMZ280BVolumes[BURN_SND_YMZ280B_YMZ280B_ROUTE_2]);
}
break;
}
pSoundBuf[(i << 1) + 0] = BURN_SND_CLIP(nLeftSample);
pSoundBuf[(i << 1) + 1] = BURN_SND_CLIP(nRightSample);
}
return 0;

View File

@ -1,6 +1,7 @@
// Yamaha YMZ280B module
INT32 YMZ280BInit(INT32 nClock, void (*IRQCallback)(INT32), INT32 nChannels);
INT32 YMZ280BInit(INT32 nClock, void (*IRQCallback)(INT32));
void YMZ280BSetRoute(INT32 nIndex, double nVolume, INT32 nRouteDir);
void YMZ280BReset();
INT32 YMZ280BScan();
void YMZ280BExit();
@ -42,3 +43,10 @@ inline static UINT32 YMZ280BRead(INT32 offset)
return 0;
}
#define BURN_SND_YMZ280B_YMZ280B_ROUTE_1 0
#define BURN_SND_YMZ280B_YMZ280B_ROUTE_2 1
#define YMZ280BSetAllRoutes(v, d) \
YMZ280BSetRoute(BURN_SND_YMZ280B_YMZ280B_ROUTE_1, v, d); \
YMZ280BSetRoute(BURN_SND_YMZ280B_YMZ280B_ROUTE_2, v, d);