From f5b4c558ff071b791447aac61defe5851739c0de Mon Sep 17 00:00:00 2001 From: Barry Harris <44396066+barry65536@users.noreply.github.com> Date: Sun, 20 May 2012 06:44:34 +0000 Subject: [PATCH] Added support to upd7759.cpp for volume and left/right selection for each route. Updated necessary drivers to support. --- src/burn/drv/konami/d_88games.cpp | 2 ++ src/burn/drv/konami/d_mainevt.cpp | 1 + src/burn/drv/konami/d_tmnt.cpp | 1 + src/burn/drv/konami/d_twin16.cpp | 1 + src/burn/drv/pre90s/d_prehisle.cpp | 1 + src/burn/drv/pre90s/d_rpunch.cpp | 1 + src/burn/drv/pre90s/d_snk68.cpp | 1 + src/burn/drv/sega/sys16_run.cpp | 1 + src/burn/snd/upd7759.cpp | 35 ++++++++++++++++++++++++++++-- src/burn/snd/upd7759.h | 21 +++++++++--------- 10 files changed, 53 insertions(+), 12 deletions(-) diff --git a/src/burn/drv/konami/d_88games.cpp b/src/burn/drv/konami/d_88games.cpp index e95527135..37e08edc6 100644 --- a/src/burn/drv/konami/d_88games.cpp +++ b/src/burn/drv/konami/d_88games.cpp @@ -482,6 +482,8 @@ static INT32 DrvInit() UPD7759Init(0, UPD7759_STANDARD_CLOCK, DrvSndROM0); UPD7759Init(1, UPD7759_STANDARD_CLOCK, DrvSndROM1); + UPD7759SetRoute(0, 0.30, BURN_SND_ROUTE_BOTH); + UPD7759SetRoute(1, 0.30, BURN_SND_ROUTE_BOTH); K052109Init(DrvGfxROM0, 0x7ffff); K052109SetCallback(K052109Callback); diff --git a/src/burn/drv/konami/d_mainevt.cpp b/src/burn/drv/konami/d_mainevt.cpp index 46e5a2864..e2bb1f372 100644 --- a/src/burn/drv/konami/d_mainevt.cpp +++ b/src/burn/drv/konami/d_mainevt.cpp @@ -762,6 +762,7 @@ static INT32 DrvInit(INT32 type) BurnYM2151SetAllRoutes(0.30, BURN_SND_ROUTE_BOTH); UPD7759Init(0, UPD7759_STANDARD_CLOCK, DrvSndROM1); + UPD7759SetRoute(0, 0.50, BURN_SND_ROUTE_BOTH); GenericTilesInit(); diff --git a/src/burn/drv/konami/d_tmnt.cpp b/src/burn/drv/konami/d_tmnt.cpp index 43f022e49..c4f0a3956 100644 --- a/src/burn/drv/konami/d_tmnt.cpp +++ b/src/burn/drv/konami/d_tmnt.cpp @@ -4408,6 +4408,7 @@ static INT32 TmntInit() K007232SetPortWriteHandler(0, DrvK007232VolCallback); UPD7759Init(0, UPD7759_STANDARD_CLOCK, DrvUPD7759CRom); + UPD7759SetRoute(0, 0.60, BURN_SND_ROUTE_BOTH); GenericTilesInit(); diff --git a/src/burn/drv/konami/d_twin16.cpp b/src/burn/drv/konami/d_twin16.cpp index 51741b578..e10f4ec71 100644 --- a/src/burn/drv/konami/d_twin16.cpp +++ b/src/burn/drv/konami/d_twin16.cpp @@ -1026,6 +1026,7 @@ static INT32 DrvInit(INT32 (pLoadCallback)()) BurnYM2151SetRoute(BURN_SND_YM2151_YM2151_ROUTE_2, 1.00, BURN_SND_ROUTE_RIGHT); UPD7759Init(0, UPD7759_STANDARD_CLOCK, DrvSndROM1); + UPD7759SetRoute(0, 0.20, BURN_SND_ROUTE_BOTH); GenericTilesInit(); diff --git a/src/burn/drv/pre90s/d_prehisle.cpp b/src/burn/drv/pre90s/d_prehisle.cpp index 8ad1e38b7..d206cbf79 100644 --- a/src/burn/drv/pre90s/d_prehisle.cpp +++ b/src/burn/drv/pre90s/d_prehisle.cpp @@ -550,6 +550,7 @@ INT32 PrehisleInit() BurnYM3812SetRoute(BURN_SND_YM3812_ROUTE, 1.00, BURN_SND_ROUTE_BOTH); UPD7759Init(0, UPD7759_STANDARD_CLOCK, PrehisleADPCMSamples); + UPD7759SetRoute(0, 0.90, BURN_SND_ROUTE_BOTH); GenericTilesInit(); diff --git a/src/burn/drv/pre90s/d_rpunch.cpp b/src/burn/drv/pre90s/d_rpunch.cpp index d7e856ebe..2bc20d771 100644 --- a/src/burn/drv/pre90s/d_rpunch.cpp +++ b/src/burn/drv/pre90s/d_rpunch.cpp @@ -577,6 +577,7 @@ static INT32 DrvInit(INT32 (*pRomLoadCallback)(), INT32 game) BurnYM2151SetAllRoutes(0.50, BURN_SND_ROUTE_BOTH); UPD7759Init(0, UPD7759_STANDARD_CLOCK, DrvSndROM); + UPD7759SetRoute(0, 0.50, BURN_SND_ROUTE_BOTH); DrvDoReset(); diff --git a/src/burn/drv/pre90s/d_snk68.cpp b/src/burn/drv/pre90s/d_snk68.cpp index aacaa0d8a..7e92353b4 100644 --- a/src/burn/drv/pre90s/d_snk68.cpp +++ b/src/burn/drv/pre90s/d_snk68.cpp @@ -958,6 +958,7 @@ static INT32 DrvInit(INT32 game) BurnYM3812SetRoute(BURN_SND_YM3812_ROUTE, 1.00, BURN_SND_ROUTE_BOTH); UPD7759Init(0, UPD7759_STANDARD_CLOCK, DrvSnd0); + UPD7759SetRoute(0, 0.50, BURN_SND_ROUTE_BOTH); DrvDoReset(); diff --git a/src/burn/drv/sega/sys16_run.cpp b/src/burn/drv/sega/sys16_run.cpp index 892e582cd..54d5cadf5 100644 --- a/src/burn/drv/sega/sys16_run.cpp +++ b/src/burn/drv/sega/sys16_run.cpp @@ -1925,6 +1925,7 @@ INT32 System16Init() if (System16UPD7759DataSize) { UPD7759Init(0,UPD7759_STANDARD_CLOCK, NULL); UPD7759SetDrqCallback(0,System16UPD7759DrqCallback); + UPD7759SetRoute(0, 0.48, BURN_SND_ROUTE_BOTH); } System16TileBankSize = 0x1000; diff --git a/src/burn/snd/upd7759.cpp b/src/burn/snd/upd7759.cpp index 1dbcda3be..41253bdd8 100644 --- a/src/burn/snd/upd7759.cpp +++ b/src/burn/snd/upd7759.cpp @@ -63,6 +63,10 @@ struct upd7759_chip UINT8 * rom; /* pointer to ROM data or NULL for slave mode */ UINT8 * rombase; /* pointer to ROM data or NULL for slave mode */ UINT32 romoffset; /* ROM offset to make save/restore easier */ + + /* route */ + double volume; + INT32 output_dir; }; static struct upd7759_chip *Chips[2]; // more? @@ -328,8 +332,21 @@ void UPD7759Update(INT32 chip, INT16 *pSoundBuf, INT32 nLength) while (nLength != 0) { /* store the current sample */ - pSoundBuf[0] += Sample << 7; - pSoundBuf[1] += Sample << 7; + INT32 nLeftSample = 0; + INT32 nRightSample = 0; + + if ((Chip->output_dir & BURN_SND_ROUTE_LEFT) == BURN_SND_ROUTE_LEFT) { + nLeftSample += (INT32)((Sample << 7) * Chip->volume); + } + if ((Chip->output_dir & BURN_SND_ROUTE_RIGHT) == BURN_SND_ROUTE_RIGHT) { + nRightSample += (INT32)((Sample << 7) * Chip->volume); + } + + nLeftSample = BURN_SND_CLIP(nLeftSample); + nRightSample = BURN_SND_CLIP(nRightSample); + + pSoundBuf[0] += nLeftSample; + pSoundBuf[1] += nRightSample; pSoundBuf += 2; nLength--; @@ -425,12 +442,26 @@ void UPD7759Init(INT32 chip, INT32 clock, UINT8* pSoundData) Chip->reset = 1; Chip->start = 1; + Chip->volume = 1.00; + Chip->output_dir = BURN_SND_ROUTE_BOTH; nNumChips = chip; UPD7759Reset(); } +void UPD7759SetRoute(INT32 chip, double nVolume, INT32 nRouteDir) +{ +#if defined FBA_DEBUG + if (!DebugSnd_UPD7759Initted) bprintf(PRINT_ERROR, _T("UPD7759SetRoute called without init\n")); + if (chip > nNumChips) bprintf(PRINT_ERROR, _T("UPD7759SetRoute called with invalid chip %i\n"), chip); +#endif + + Chip = Chips[chip]; + Chip->volume = nVolume; + Chip->output_dir = nRouteDir; +} + void UPD7759SetDrqCallback(INT32 chip, drqcallback Callback) { #if defined FBA_DEBUG diff --git a/src/burn/snd/upd7759.h b/src/burn/snd/upd7759.h index a9c35d1fe..17afab879 100644 --- a/src/burn/snd/upd7759.h +++ b/src/burn/snd/upd7759.h @@ -2,13 +2,14 @@ typedef void (*drqcallback)(INT32 param); -extern void UPD7759Update(INT32 chip, INT16 *pSoundBuf, INT32 nLength); -extern void UPD7759Reset(); -extern void UPD7759Init(INT32 chip, INT32 clock, UINT8* pSoundData); -extern void UPD7759SetDrqCallback(INT32 chip, drqcallback Callback); -extern INT32 UPD7759BusyRead(INT32 chip); -extern void UPD7759ResetWrite(INT32 chip, UINT8 Data); -extern void UPD7759StartWrite(INT32 chip, UINT8 Data); -extern void UPD7759PortWrite(INT32 chip, UINT8 Data); -extern INT32 UPD7759Scan(INT32 chip, INT32 nAction,INT32 *pnMin); -extern void UPD7759Exit(); +void UPD7759Update(INT32 chip, INT16 *pSoundBuf, INT32 nLength); +void UPD7759Reset(); +void UPD7759Init(INT32 chip, INT32 clock, UINT8* pSoundData); +void UPD7759SetRoute(INT32 chip, double nVolume, INT32 nRouteDir); +void UPD7759SetDrqCallback(INT32 chip, drqcallback Callback); +INT32 UPD7759BusyRead(INT32 chip); +void UPD7759ResetWrite(INT32 chip, UINT8 Data); +void UPD7759StartWrite(INT32 chip, UINT8 Data); +void UPD7759PortWrite(INT32 chip, UINT8 Data); +INT32 UPD7759Scan(INT32 chip, INT32 nAction,INT32 *pnMin); +void UPD7759Exit();