Added support to ymz280.cpp for volume and left/right selection for each route. Updated necessary drivers to support.
This commit is contained in:
parent
33dfb87696
commit
2c338d332f
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue