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(1, 0x400000, 8, 0x4000);
|
||||||
CaveTileInitLayer(2, 0x200000, 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;
|
bDrawScreen = true;
|
||||||
|
|
||||||
|
|
|
@ -578,7 +578,9 @@ static INT32 DrvInit()
|
||||||
CaveTileInitLayer(1, 0x800000, 8, 0x4000);
|
CaveTileInitLayer(1, 0x800000, 8, 0x4000);
|
||||||
CaveTileInitLayer(2, 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;
|
bDrawScreen = true;
|
||||||
|
|
||||||
|
|
|
@ -546,7 +546,9 @@ static INT32 DrvInit()
|
||||||
CaveTileInitLayer(0, 0x400000, 8, 0x4000);
|
CaveTileInitLayer(0, 0x400000, 8, 0x4000);
|
||||||
CaveTileInitLayer(1, 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;
|
bDrawScreen = true;
|
||||||
|
|
||||||
|
|
|
@ -812,7 +812,9 @@ static INT32 DrvInit()
|
||||||
CaveTileInitLayer(1, 0x400000, 8, 0x4000);
|
CaveTileInitLayer(1, 0x400000, 8, 0x4000);
|
||||||
CaveTileInitLayer(2, 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;
|
bDrawScreen = true;
|
||||||
|
|
||||||
|
|
|
@ -609,7 +609,9 @@ static INT32 DrvInit()
|
||||||
CaveTileInitLayer(1, 0x400000, 8, 0x4000);
|
CaveTileInitLayer(1, 0x400000, 8, 0x4000);
|
||||||
CaveTileInitLayer(2, 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;
|
bDrawScreen = true;
|
||||||
|
|
||||||
|
|
|
@ -587,7 +587,9 @@ static INT32 DrvInit()
|
||||||
CaveSpriteInit(1, 0x300000);
|
CaveSpriteInit(1, 0x300000);
|
||||||
CaveTileInitLayer(0, 0x200000, 4, 0x4400);
|
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;
|
bDrawScreen = true;
|
||||||
|
|
||||||
|
@ -665,7 +667,9 @@ static INT32 crushermInit()
|
||||||
CaveSpriteInit(1, 0x400000);
|
CaveSpriteInit(1, 0x400000);
|
||||||
CaveTileInitLayer(0, 0x200000, 4, 0x4400);
|
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;
|
bDrawScreen = true;
|
||||||
|
|
||||||
|
|
|
@ -538,7 +538,9 @@ static INT32 DrvInit()
|
||||||
CaveSpriteInit(1, 0x800000);
|
CaveSpriteInit(1, 0x800000);
|
||||||
CaveTileInitLayer(0, 0x400000, 8, 0x4000);
|
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;
|
bDrawScreen = true;
|
||||||
|
|
||||||
|
|
|
@ -391,7 +391,9 @@ static INT32 DrvInit(UINT32 speedhack)
|
||||||
|
|
||||||
EEPROMInit(&eeprom_interface_93C46);
|
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);
|
deco16Init(0, 0, 1);
|
||||||
deco16_set_bank_callback(0, backfire_bank_callback);
|
deco16_set_bank_callback(0, backfire_bank_callback);
|
||||||
|
|
|
@ -564,7 +564,9 @@ static INT32 DrvInit()
|
||||||
SekSetWriteByteHandler(1, jchan_sub_command_write_byte);
|
SekSetWriteByteHandler(1, jchan_sub_command_write_byte);
|
||||||
SekClose();
|
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();
|
GenericTilesInit();
|
||||||
|
|
||||||
|
|
|
@ -335,7 +335,9 @@ static INT32 DrvInit()
|
||||||
SekSetReadWordHandler(0, midas_read_word);
|
SekSetReadWordHandler(0, midas_read_word);
|
||||||
SekClose();
|
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);
|
EEPROMInit(&eeprom_interface_93C46);
|
||||||
|
|
||||||
|
|
|
@ -666,7 +666,9 @@ static INT32 CommonInit(INT32 (*pRomLoadCallback)(), INT32 spritelen, INT32 sndl
|
||||||
|
|
||||||
// ymf262
|
// 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);
|
MSM6295Init(0, 2000000 / 132, 1);
|
||||||
MSM6295SetRoute(0, 0.50, BURN_SND_ROUTE_BOTH);
|
MSM6295SetRoute(0, 0.50, BURN_SND_ROUTE_BOTH);
|
||||||
|
|
|
@ -858,7 +858,8 @@ static INT32 bbakraidInit()
|
||||||
|
|
||||||
DrvZ80Init(); // Initialize Z80
|
DrvZ80Init(); // Initialize Z80
|
||||||
|
|
||||||
YMZ280BInit(16934400, NULL, 2);
|
YMZ280BInit(16934400, NULL);
|
||||||
|
YMZ280BSetAllRoutes(1.00, BURN_SND_ROUTE_BOTH);
|
||||||
|
|
||||||
BurnTimerInit(bbakraidTimerOver, NULL);
|
BurnTimerInit(bbakraidTimerOver, NULL);
|
||||||
BurnTimerAttachZet(TOA_Z80_SPEED);
|
BurnTimerAttachZet(TOA_Z80_SPEED);
|
||||||
|
|
|
@ -21,7 +21,6 @@ static INT32 nYMZ280BIRQStatus;
|
||||||
void (*YMZ280BIRQCallback)(INT32 nStatus) = NULL;
|
void (*YMZ280BIRQCallback)(INT32 nStatus) = NULL;
|
||||||
|
|
||||||
static INT32* pBuffer = NULL;
|
static INT32* pBuffer = NULL;
|
||||||
static INT32 nOutputChannels;
|
|
||||||
|
|
||||||
static double nYMZ280BFrequency;
|
static double nYMZ280BFrequency;
|
||||||
|
|
||||||
|
@ -29,6 +28,9 @@ static INT32 YMZ280BDeltaTable[16];
|
||||||
|
|
||||||
static INT32 YMZ280BStepShift[8] = {0x0E6, 0x0E6, 0x0E6, 0x0E6, 0x133, 0x199, 0x200, 0x266};
|
static INT32 YMZ280BStepShift[8] = {0x0E6, 0x0E6, 0x0E6, 0x0E6, 0x133, 0x199, 0x200, 0x266};
|
||||||
|
|
||||||
|
static double YMZ280BVolumes[2];
|
||||||
|
static INT32 YMZ280BRouteDirs[2];
|
||||||
|
|
||||||
struct sYMZ280BChannelInfo {
|
struct sYMZ280BChannelInfo {
|
||||||
bool bEnabled;
|
bool bEnabled;
|
||||||
bool bPlaying;
|
bool bPlaying;
|
||||||
|
@ -119,7 +121,7 @@ INT32 YMZ280BScan()
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
INT32 YMZ280BInit(INT32 nClock, void (*IRQCallback)(INT32), INT32 nChannels)
|
INT32 YMZ280BInit(INT32 nClock, void (*IRQCallback)(INT32))
|
||||||
{
|
{
|
||||||
DebugSnd_YMZ280BInitted = 1;
|
DebugSnd_YMZ280BInitted = 1;
|
||||||
|
|
||||||
|
@ -152,13 +154,28 @@ INT32 YMZ280BInit(INT32 nClock, void (*IRQCallback)(INT32), INT32 nChannels)
|
||||||
YMZ280BChannelData[j] = (INT32*)malloc(0x1000 * sizeof(INT32));
|
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();
|
YMZ280BReset();
|
||||||
|
|
||||||
return 0;
|
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()
|
void YMZ280BExit()
|
||||||
{
|
{
|
||||||
#if defined FBA_DEBUG
|
#if defined FBA_DEBUG
|
||||||
|
@ -487,38 +504,25 @@ INT32 YMZ280BRender(INT16* pSoundBuf, INT32 nSegmentLength)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (nOutputChannels) {
|
for (INT32 i = 0; i < nSegmentLength; i++) {
|
||||||
case 1: // Use only the left output channel
|
INT32 nLeftSample = 0, nRightSample = 0;
|
||||||
case 2: { // Use only the right output channel
|
|
||||||
nCount = nSegmentLength;
|
if ((YMZ280BRouteDirs[BURN_SND_YMZ280B_YMZ280B_ROUTE_1] & BURN_SND_ROUTE_LEFT) == BURN_SND_ROUTE_LEFT) {
|
||||||
buf = pBuffer + (nOutputChannels >> 1);
|
nLeftSample += (INT32)((pBuffer[(i << 1) + 0] >> 8) * YMZ280BVolumes[BURN_SND_YMZ280B_YMZ280B_ROUTE_1]);
|
||||||
while (nCount--) {
|
|
||||||
nSample = *buf >> 8;
|
|
||||||
buf += 2;
|
|
||||||
if (nSample > 32767) {
|
|
||||||
nSample = 32767;
|
|
||||||
} else {
|
|
||||||
if (nSample < -32768) {
|
|
||||||
nSample = -32768;
|
|
||||||
}
|
}
|
||||||
|
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;
|
if ((YMZ280BRouteDirs[BURN_SND_YMZ280B_YMZ280B_ROUTE_2] & BURN_SND_ROUTE_LEFT) == BURN_SND_ROUTE_LEFT) {
|
||||||
*pSoundBuf++ = (INT16)nSample;
|
nLeftSample += (INT32)((pBuffer[(i << 1) + 1] >> 8) * YMZ280BVolumes[BURN_SND_YMZ280B_YMZ280B_ROUTE_2]);
|
||||||
}
|
}
|
||||||
break;
|
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]);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
pSoundBuf[(i << 1) + 0] = BURN_SND_CLIP(nLeftSample);
|
||||||
}
|
pSoundBuf[(i << 1) + 1] = BURN_SND_CLIP(nRightSample);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
// Yamaha YMZ280B module
|
// 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();
|
void YMZ280BReset();
|
||||||
INT32 YMZ280BScan();
|
INT32 YMZ280BScan();
|
||||||
void YMZ280BExit();
|
void YMZ280BExit();
|
||||||
|
@ -42,3 +43,10 @@ inline static UINT32 YMZ280BRead(INT32 offset)
|
||||||
|
|
||||||
return 0;
|
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