Added support to msm5205.cpp for left/right selection for each route. Changed volume to fraction rather than percentage. Updated necessary drivers to support.

This commit is contained in:
Barry Harris 2012-05-21 10:17:19 +00:00
parent 4f753f5e62
commit 125f54da67
16 changed files with 106 additions and 85 deletions

View File

@ -80,8 +80,8 @@ void __fastcall FcrashZ80Write(UINT16 a, UINT8 d)
}
case 0xe000: {
MSM5205SetVolume(0, (d & 0x08) ? 0 : 20);
MSM5205SetVolume(1, (d & 0x10) ? 0 : 20);
MSM5205SetRoute(0, (d & 0x08) ? 0 : 0.25, BURN_SND_ROUTE_BOTH);
MSM5205SetRoute(1, (d & 0x10) ? 0 : 0.25, BURN_SND_ROUTE_BOTH);
FcrashZ80BankAddress = (d & 0x07) * 0x4000;
ZetMapArea(0x8000, 0xbfff, 0, CpsZRom + FcrashZ80BankAddress);
@ -168,8 +168,10 @@ INT32 FcrashSoundInit()
BurnYM2203SetRoute(1, BURN_SND_YM2203_AY8910_ROUTE_2, 0.07, BURN_SND_ROUTE_BOTH);
BurnYM2203SetRoute(1, BURN_SND_YM2203_AY8910_ROUTE_3, 0.07, BURN_SND_ROUTE_BOTH);
MSM5205Init(0, FcrashSynchroniseStream, 24000000 / 64, FcrashMSM5205Vck0, MSM5205_S96_4B, 20, 1);
MSM5205Init(1, FcrashSynchroniseStream, 24000000 / 64, FcrashMSM5205Vck1, MSM5205_S96_4B, 20, 1);
MSM5205Init(0, FcrashSynchroniseStream, 24000000 / 64, FcrashMSM5205Vck0, MSM5205_S96_4B, 1);
MSM5205Init(1, FcrashSynchroniseStream, 24000000 / 64, FcrashMSM5205Vck1, MSM5205_S96_4B, 1);
MSM5205SetRoute(0, 0.25, BURN_SND_ROUTE_BOTH);
MSM5205SetRoute(1, 0.25, BURN_SND_ROUTE_BOTH);
nCpsZ80Cycles = (24000000 / 6) * 100 / nBurnFPS;

View File

@ -67,8 +67,8 @@ void __fastcall Sf2mdtZ80Write(UINT16 a, UINT8 d)
}
case 0xe000: {
MSM5205SetVolume(0, (d & 0x20) ? 0 : 20);
MSM5205SetVolume(1, (d & 0x10) ? 0 : 20);
MSM5205SetRoute(0, (d & 0x20) ? 0 : 0.25, BURN_SND_ROUTE_BOTH);
MSM5205SetRoute(1, (d & 0x10) ? 0 : 0.25, BURN_SND_ROUTE_BOTH);
Sf2mdtZ80BankAddress = (d & Sf2mdtNumZ80Banks) * 0x4000;
ZetMapArea(0x8000, 0xbfff, 0, CpsZRom + Sf2mdtZ80BankAddress);
@ -135,8 +135,10 @@ INT32 Sf2mdtSoundInit()
BurnYM2151Init(3579540);
BurnYM2151SetAllRoutes(0.35, BURN_SND_ROUTE_BOTH);
MSM5205Init(0, Sf2mdtSynchroniseStream, 24000000 / 64, Sf2mdtMSM5205Vck0, MSM5205_S96_4B, 20, 1);
MSM5205Init(1, Sf2mdtSynchroniseStream, 24000000 / 64, Sf2mdtMSM5205Vck1, MSM5205_S96_4B, 20, 1);
MSM5205Init(0, Sf2mdtSynchroniseStream, 24000000 / 64, Sf2mdtMSM5205Vck0, MSM5205_S96_4B, 1);
MSM5205Init(1, Sf2mdtSynchroniseStream, 24000000 / 64, Sf2mdtMSM5205Vck1, MSM5205_S96_4B, 1);
MSM5205SetRoute(0, 0.25, BURN_SND_ROUTE_BOTH);
MSM5205SetRoute(1, 0.25, BURN_SND_ROUTE_BOTH);
nCpsZ80Cycles = 3579540 * 100 / nBurnFPS;

View File

@ -5407,7 +5407,8 @@ static INT32 CsilverInit()
BurnYM2203SetRoute(0, BURN_SND_YM2203_AY8910_ROUTE_2, 0.23, BURN_SND_ROUTE_BOTH);
BurnYM2203SetRoute(0, BURN_SND_YM2203_AY8910_ROUTE_3, 0.23, BURN_SND_ROUTE_BOTH);
MSM5205Init(0, CsilverMSM5205SynchroniseStream, 384000, CsilverADPCMInt, MSM5205_S48_4B, 80, 1);
MSM5205Init(0, CsilverMSM5205SynchroniseStream, 384000, CsilverADPCMInt, MSM5205_S48_4B, 1);
MSM5205SetRoute(0, 0.88, BURN_SND_ROUTE_BOTH);
GenericTilesInit();

View File

@ -3391,8 +3391,10 @@ static void M62MachineInit()
pAY8910Buffer[4] = pFMBuffer + nBurnSoundLen * 4;
pAY8910Buffer[5] = pFMBuffer + nBurnSoundLen * 5;
MSM5205Init(0, M62SynchroniseStream, 384000, M62MSM5205Vck0, MSM5205_S96_4B, 50, 1);
MSM5205Init(1, M62SynchroniseStream, 384000, NULL, MSM5205_SEX_4B, 50, 1);
MSM5205Init(0, M62SynchroniseStream, 384000, M62MSM5205Vck0, MSM5205_S96_4B, 1);
MSM5205Init(1, M62SynchroniseStream, 384000, NULL, MSM5205_SEX_4B, 1);
MSM5205SetRoute(0, 0.50, BURN_SND_ROUTE_BOTH);
MSM5205SetRoute(1, 0.50, BURN_SND_ROUTE_BOTH);
AY8910Init(0, 894886, nBurnSoundRate, &M62SoundLatchRead, NULL, NULL, &AY8910_0PortBWrite);
AY8910Init(1, 894886, nBurnSoundRate, NULL, NULL, NULL, NULL);

View File

@ -1853,8 +1853,10 @@ static INT32 DrvMachineInit()
BurnYM2151SetIrqHandler(&DrvYM2151IrqHandler);
BurnYM2151SetAllRoutes(0.60, BURN_SND_ROUTE_BOTH);
MSM5205Init(0, DrvSynchroniseStream, 375000, DrvMSM5205Vck0, MSM5205_S48_4B, 45, 1);
MSM5205Init(1, DrvSynchroniseStream, 375000, DrvMSM5205Vck1, MSM5205_S48_4B, 45, 1);
MSM5205Init(0, DrvSynchroniseStream, 375000, DrvMSM5205Vck0, MSM5205_S48_4B, 1);
MSM5205Init(1, DrvSynchroniseStream, 375000, DrvMSM5205Vck1, MSM5205_S48_4B, 1);
MSM5205SetRoute(0, 0.50, BURN_SND_ROUTE_BOTH);
MSM5205SetRoute(1, 0.50, BURN_SND_ROUTE_BOTH);
}
if (DrvGameType == DD_GAME_DARKTOWR) {

View File

@ -1043,7 +1043,8 @@ static INT32 TrojanInit()
ZetMemEnd();
ZetClose();
MSM5205Init(0, DrvMSM5205SynchroniseStream, 455000, NULL, MSM5205_SEX_4B, 50, 1);
MSM5205Init(0, DrvMSM5205SynchroniseStream, 455000, NULL, MSM5205_SEX_4B, 1);
MSM5205SetRoute(0, 0.50, BURN_SND_ROUTE_BOTH);
MSM5205InUse = 1;
GenericTilesInit();

View File

@ -860,8 +860,10 @@ static INT32 DrvInit(INT32 initver)
BurnYM2151SetRoute(BURN_SND_YM2151_YM2151_ROUTE_1, 0.60, BURN_SND_ROUTE_LEFT);
BurnYM2151SetRoute(BURN_SND_YM2151_YM2151_ROUTE_2, 0.60, BURN_SND_ROUTE_RIGHT);
MSM5205Init(0, DrvSynchroniseStream, 384000, NULL, MSM5205_SEX_4B, 100, 1);
MSM5205Init(1, DrvSynchroniseStream, 384000, NULL, MSM5205_SEX_4B, 100, 1);
MSM5205Init(0, DrvSynchroniseStream, 384000, NULL, MSM5205_SEX_4B, 1);
MSM5205Init(1, DrvSynchroniseStream, 384000, NULL, MSM5205_SEX_4B, 1);
MSM5205SetRoute(0, 1.00, BURN_SND_ROUTE_BOTH);
MSM5205SetRoute(1, 1.00, BURN_SND_ROUTE_BOTH);
GenericTilesInit();

View File

@ -549,7 +549,9 @@ void __fastcall rygar_sound_write(UINT16 address, UINT8 data)
case 0xc800:
case 0xe000:
if (DrvHasADPCM) MSM5205SetVolume(0, (data & 0x0f) * 100 / 15);
if (DrvHasADPCM) {
MSM5205SetRoute(0, (data & 0x0f) / 15, BURN_SND_ROUTE_BOTH);
}
return;
case 0xf000:
@ -768,7 +770,8 @@ static INT32 RygarInit()
BurnTimerAttachZetYM3812(4000000);
BurnYM3812SetRoute(BURN_SND_YM3812_ROUTE, 1.00, BURN_SND_ROUTE_BOTH);
MSM5205Init(0, TecmoSynchroniseStream, 400000, TecmoMSM5205Vck, MSM5205_S48_4B, 100, 1);
MSM5205Init(0, TecmoSynchroniseStream, 400000, TecmoMSM5205Vck, MSM5205_S48_4B, 1);
MSM5205SetRoute(0, 0.50, BURN_SND_ROUTE_BOTH);
GenericTilesInit();
@ -848,7 +851,8 @@ static INT32 SilkwormInit()
BurnTimerAttachZetYM3812(4000000);
BurnYM3812SetRoute(BURN_SND_YM3812_ROUTE, 1.00, BURN_SND_ROUTE_BOTH);
MSM5205Init(0, TecmoSynchroniseStream, 400000, TecmoMSM5205Vck, MSM5205_S48_4B, 100, 1);
MSM5205Init(0, TecmoSynchroniseStream, 400000, TecmoMSM5205Vck, MSM5205_S48_4B, 1);
MSM5205SetRoute(0, 0.50, BURN_SND_ROUTE_BOTH);
GenericTilesInit();
@ -928,7 +932,10 @@ static INT32 GeminiInit()
BurnTimerAttachZetYM3812(4000000);
BurnYM3812SetRoute(BURN_SND_YM3812_ROUTE, 1.00, BURN_SND_ROUTE_BOTH);
if (DrvHasADPCM) MSM5205Init(0, TecmoSynchroniseStream, 400000, TecmoMSM5205Vck, MSM5205_S48_4B, 100, 1);
if (DrvHasADPCM) {
MSM5205Init(0, TecmoSynchroniseStream, 400000, TecmoMSM5205Vck, MSM5205_S48_4B, 1);
MSM5205SetRoute(0, 0.50, BURN_SND_ROUTE_BOTH);
}
GenericTilesInit();

View File

@ -733,7 +733,10 @@ static INT32 DrvInit(INT32 (*pInitCallback)())
BurnYM2203SetAllRoutes(0, 0.25, BURN_SND_ROUTE_BOTH);
BurnYM2203SetAllRoutes(1, 0.25, BURN_SND_ROUTE_BOTH);
if (toramich) MSM5205Init(0, DrvMSM5205SynchroniseStream, 384000, NULL, MSM5205_SEX_4B, 100, 1);
if (toramich) {
MSM5205Init(0, DrvMSM5205SynchroniseStream, 384000, NULL, MSM5205_SEX_4B, 1);
MSM5205SetRoute(0, 1.00, BURN_SND_ROUTE_BOTH);
}
GenericTilesInit();

View File

@ -984,7 +984,8 @@ static INT32 TokibInit()
BurnTimerAttachZetYM3812(3579545);
BurnYM3812SetRoute(BURN_SND_YM3812_ROUTE, 1.00, BURN_SND_ROUTE_BOTH);
MSM5205Init(0, TokibSynchroniseStream, 384000, toki_adpcm_int, MSM5205_S96_4B, 45, 1);
MSM5205Init(0, TokibSynchroniseStream, 384000, toki_adpcm_int, MSM5205_S96_4B, 1);
MSM5205SetRoute(0, 0.60, BURN_SND_ROUTE_BOTH);
GenericTilesInit();

View File

@ -649,7 +649,8 @@ static INT32 Wc90b1Init()
BurnTimerAttachZet(5000000);
BurnYM2203SetAllRoutes(0, 0.20, BURN_SND_ROUTE_BOTH);
MSM5205Init(0, Wc90b1SynchroniseStream, 384000, Wc90b1MSM5205Vck0, MSM5205_S96_4B, 100, 1);
MSM5205Init(0, Wc90b1SynchroniseStream, 384000, Wc90b1MSM5205Vck0, MSM5205_S96_4B, 1);
MSM5205SetRoute(0, 0.30, BURN_SND_ROUTE_BOTH);
Wc90b1DoReset();

View File

@ -399,7 +399,8 @@ static INT32 DrvInit()
ZetSetInHandler(ashnojoe_sound_read_port);
ZetMemEnd();
MSM5205Init(0, DrvSynchroniseStream, 384000, ashnojoe_vclk_cb, MSM5205_S48_4B, 100, 1);
MSM5205Init(0, DrvSynchroniseStream, 384000, ashnojoe_vclk_cb, MSM5205_S48_4B, 1);
MSM5205SetRoute(0, 1.00, BURN_SND_ROUTE_BOTH);
BurnYM2203Init(1, 4000000, &DrvIRQHandler, DrvSynchroniseStream, DrvGetTime, 0);
BurnYM2203SetPorts(0, NULL, NULL, &DrvYM2203WritePortA, &DrvYM2203WritePortB);

View File

@ -1324,7 +1324,8 @@ static void AsukaSoundSetup()
BurnYM2151SetPortHandler(&DrvSoundBankSwitch);
BurnYM2151SetAllRoutes(0.50, BURN_SND_ROUTE_BOTH);
MSM5205Init(0, DrvSynchroniseStream, 384000, AsukaMSM5205Vck, MSM5205_S48_4B, 100, 1);
MSM5205Init(0, DrvSynchroniseStream, 384000, AsukaMSM5205Vck, MSM5205_S48_4B, 1);
MSM5205SetRoute(0, 1.00, BURN_SND_ROUTE_BOTH);
TaitoNumYM2151 = 1;
TaitoNumMSM5205 = 1;

View File

@ -4153,7 +4153,8 @@ static INT32 DariusInit()
BurnYM2203SetRoute(1, BURN_SND_YM2203_AY8910_ROUTE_2, 0.08, BURN_SND_ROUTE_BOTH);
BurnYM2203SetRoute(1, BURN_SND_YM2203_AY8910_ROUTE_3, 0.08, BURN_SND_ROUTE_BOTH);
MSM5205Init(0, TaitoSynchroniseStream, 384000, DariusAdpcmInt, MSM5205_S48_4B, 50, 1);
MSM5205Init(0, TaitoSynchroniseStream, 384000, DariusAdpcmInt, MSM5205_S48_4B, 1);
MSM5205SetRoute(0, 0.50, BURN_SND_ROUTE_BOTH);
GenericTilesInit();
@ -4252,8 +4253,10 @@ static INT32 OpwolfInit()
BurnYM2151SetRoute(BURN_SND_YM2151_YM2151_ROUTE_1, 0.75, BURN_SND_ROUTE_LEFT);
BurnYM2151SetRoute(BURN_SND_YM2151_YM2151_ROUTE_2, 0.75, BURN_SND_ROUTE_RIGHT);
MSM5205Init(0, TaitoSynchroniseStream, 384000, OpwolfMSM5205Vck0, MSM5205_S48_4B, 60, 1);
MSM5205Init(1, TaitoSynchroniseStream, 384000, OpwolfMSM5205Vck1, MSM5205_S48_4B, 60, 1);
MSM5205Init(0, TaitoSynchroniseStream, 384000, OpwolfMSM5205Vck0, MSM5205_S48_4B, 1);
MSM5205Init(1, TaitoSynchroniseStream, 384000, OpwolfMSM5205Vck1, MSM5205_S48_4B, 1);
MSM5205SetRoute(0, 0.60, BURN_SND_ROUTE_BOTH);
MSM5205SetRoute(1, 0.60, BURN_SND_ROUTE_BOTH);
GenericTilesInit();
@ -4370,8 +4373,10 @@ static INT32 OpwolfbInit()
BurnYM2151SetRoute(BURN_SND_YM2151_YM2151_ROUTE_1, 0.75, BURN_SND_ROUTE_LEFT);
BurnYM2151SetRoute(BURN_SND_YM2151_YM2151_ROUTE_2, 0.75, BURN_SND_ROUTE_RIGHT);
MSM5205Init(0, TaitoSynchroniseStream, 384000, OpwolfMSM5205Vck0, MSM5205_S48_4B, 60, 1);
MSM5205Init(1, TaitoSynchroniseStream, 384000, OpwolfMSM5205Vck1, MSM5205_S48_4B, 60, 1);
MSM5205Init(0, TaitoSynchroniseStream, 384000, OpwolfMSM5205Vck0, MSM5205_S48_4B, 1);
MSM5205Init(1, TaitoSynchroniseStream, 384000, OpwolfMSM5205Vck1, MSM5205_S48_4B, 1);
MSM5205SetRoute(0, 0.60, BURN_SND_ROUTE_BOTH);
MSM5205SetRoute(1, 0.60, BURN_SND_ROUTE_BOTH);
GenericTilesInit();
@ -4662,7 +4667,8 @@ static INT32 RastanInit()
BurnYM2151SetPortHandler(&RastanBankSwitch);
BurnYM2151SetAllRoutes(0.50, BURN_SND_ROUTE_BOTH);
MSM5205Init(0, TaitoSynchroniseStream, 384000, RastanMSM5205Vck, MSM5205_S48_4B, 60, 1);
MSM5205Init(0, TaitoSynchroniseStream, 384000, RastanMSM5205Vck, MSM5205_S48_4B, 1);
MSM5205SetRoute(0, 0.60, BURN_SND_ROUTE_BOTH);
GenericTilesInit();
@ -4770,7 +4776,8 @@ static INT32 TopspeedInit()
BurnYM2151SetPortHandler(&TopspeedBankSwitch);
BurnYM2151SetAllRoutes(0.30, BURN_SND_ROUTE_BOTH);
MSM5205Init(0, TaitoSynchroniseStream, 384000, TopspeedMSM5205Vck, MSM5205_S48_4B, 60, 1);
MSM5205Init(0, TaitoSynchroniseStream, 384000, TopspeedMSM5205Vck, MSM5205_S48_4B, 1);
MSM5205SetRoute(0, 0.60, BURN_SND_ROUTE_BOTH);
GenericTilesInit();

View File

@ -15,7 +15,8 @@ struct _MSM5205_state
INT32 bitwidth; /* bit width selector -3B/4B */
INT32 signal; /* current ADPCM signal */
INT32 step; /* current ADPCM step */
INT32 volume;
double volume;
INT32 output_dir;
INT32 clock; /* clock rate */
@ -123,7 +124,7 @@ static void MSM5205StreamUpdate(INT32 chip)
{
INT32 i = 0;
INT32 volval = ((voice->signal * 16) * voice->volume) / 100;
INT32 volval = (INT32)((voice->signal * 16) * voice->volume);
INT16 val = volval;
while (len)
{
@ -181,38 +182,27 @@ void MSM5205Render(INT32 chip, INT16 *buffer, INT32 len)
voice->streampos = 0;
if (voice->bAdd) {
for (INT32 i = 0; i < len; i++)
{
INT32 nSample0 = buffer[0] + source[i];
INT32 nSample1 = buffer[1] + source[i];
if (nSample0 < -32768) {
nSample0 = -32768;
} else {
if (nSample0 > 32767) {
nSample0 = 32767;
}
}
if (nSample1 < -32768) {
nSample1 = -32768;
} else {
if (nSample1 > 32767) {
nSample1 = 32767;
}
}
buffer[0] = nSample0;
buffer[1] = nSample1;
buffer += 2;
for (INT32 i = 0; i < len; i++) {
INT32 nLeftSample = 0, nRightSample = 0;
if ((voice->output_dir & BURN_SND_ROUTE_LEFT) == BURN_SND_ROUTE_LEFT) {
nLeftSample += source[i];
}
} else {
for (INT32 i = 0; i < len; i++)
{
buffer[0] = buffer[1] = source[i];
buffer+=2;
if ((voice->output_dir & BURN_SND_ROUTE_RIGHT) == BURN_SND_ROUTE_RIGHT) {
nRightSample += source[i];
}
nLeftSample = BURN_SND_CLIP(nLeftSample);
nRightSample = BURN_SND_CLIP(nRightSample);
if (voice->bAdd) {
buffer[0] += nLeftSample;
buffer[1] += nRightSample;
} else {
buffer[0] = nLeftSample;
buffer[1] = nRightSample;
}
buffer += 2;
}
}
@ -239,7 +229,7 @@ void MSM5205Reset()
}
}
void MSM5205Init(INT32 chip, INT32 (*stream_sync)(INT32), INT32 clock, void (*vclk_callback)(), INT32 select, INT32 volume, INT32 bAdd)
void MSM5205Init(INT32 chip, INT32 (*stream_sync)(INT32), INT32 clock, void (*vclk_callback)(), INT32 select, INT32 bAdd)
{
DebugSnd_MSM5205Initted = 1;
@ -252,17 +242,30 @@ void MSM5205Init(INT32 chip, INT32 (*stream_sync)(INT32), INT32 clock, void (*vc
voice->select = select;
voice->clock = clock;
voice->bAdd = bAdd;
voice->volume = volume;
voice->volume = 1.00;
voice->output_dir = BURN_SND_ROUTE_BOTH;
float FPSRatio = (float)(6000 - nBurnFPS) / 6000;
INT32 nSoundLen = nBurnSoundLen + (INT32)((float)nBurnSoundLen * FPSRatio) + 1;
stream[chip] = (INT16*)malloc(nSoundLen * sizeof(INT16));
stream[chip] = (INT16*)BurnMalloc(nSoundLen * sizeof(INT16));
ComputeTables (chip);
nNumChips = chip;
}
void MSM5205SetRoute(INT32 chip, double nVolume, INT32 nRouteDir)
{
#if defined FBA_DEBUG
if (!DebugSnd_MSM5205Initted) bprintf(PRINT_ERROR, _T("MSM5205SetRoute called without init\n"));
if (chip > nNumChips) bprintf(PRINT_ERROR, _T("MSM5205SetRoute called with invalid chip %x\n"), chip);
#endif
voice = &chips[chip];
voice->volume = nVolume;
voice->output_dir = nRouteDir;
}
void MSM5205Exit()
{
#if defined FBA_DEBUG
@ -277,10 +280,7 @@ void MSM5205Exit()
memset (voice, 0, sizeof(_MSM5205_state));
if (stream[chip]) {
free (stream[chip]);
stream[chip] = NULL;
}
BurnFree (stream[chip]);
}
DebugSnd_MSM5205Initted = 0;
@ -343,17 +343,6 @@ void MSM5205PlaymodeWrite(INT32 chip, INT32 select)
MSM5205_playmode(chip,select);
}
void MSM5205SetVolume(INT32 chip, INT32 volume)
{
#if defined FBA_DEBUG
if (!DebugSnd_MSM5205Initted) bprintf(PRINT_ERROR, _T("MSM5205SetVolume called without init\n"));
if (chip > nNumChips) bprintf(PRINT_ERROR, _T("MSM5205SetVolume called with invalid chip %x\n"), chip);
#endif
voice = &chips[chip];
voice->volume = volume;
}
void MSM5205Update()
{
#if defined FBA_DEBUG

View File

@ -14,9 +14,8 @@ void MSM5205DataWrite(INT32 chip, INT32 data);
void MSM5205VCLKWrite(INT32 chip, INT32 reset);
void MSM5205PlaymodeWrite(INT32 chip, INT32 select);
void MSM5205SetVolume(INT32 chip, INT32 volume);
void MSM5205Init(INT32 chip, INT32 (*stream_sync)(INT32), INT32 clock, void (*vclk_callback)(), INT32 select, INT32 volume, INT32 bAdd);
void MSM5205Init(INT32 chip, INT32 (*stream_sync)(INT32), INT32 clock, void (*vclk_callback)(), INT32 select, INT32 bAdd);
void MSM5205SetRoute(INT32 chip, double nVolume, INT32 nRouteDir);
void MSM5205Reset();
/*