md2612: fix bugs barry and combone reported
This commit is contained in:
parent
03bb224c35
commit
d3069a0902
|
@ -3,8 +3,6 @@
|
||||||
#include "burn_sound.h"
|
#include "burn_sound.h"
|
||||||
#include "burn_md2612.h"
|
#include "burn_md2612.h"
|
||||||
|
|
||||||
#define MAX_MD2612 1
|
|
||||||
|
|
||||||
void (*BurnMD2612Update)(INT16* pSoundBuf, INT32 nSegmentEnd);
|
void (*BurnMD2612Update)(INT16* pSoundBuf, INT32 nSegmentEnd);
|
||||||
|
|
||||||
static INT32 (*BurnMD2612StreamCallback)(INT32 nSoundRate);
|
static INT32 (*BurnMD2612StreamCallback)(INT32 nSoundRate);
|
||||||
|
@ -12,7 +10,7 @@ static INT32 (*BurnMD2612StreamCallback)(INT32 nSoundRate);
|
||||||
static INT32 nBurnMD2612SoundRate;
|
static INT32 nBurnMD2612SoundRate;
|
||||||
|
|
||||||
static INT16* pBuffer;
|
static INT16* pBuffer;
|
||||||
static INT16* pMD2612Buffer[2 * MAX_MD2612];
|
static INT16* pMD2612Buffer[2];
|
||||||
|
|
||||||
static INT32 nMD2612Position;
|
static INT32 nMD2612Position;
|
||||||
|
|
||||||
|
@ -22,8 +20,8 @@ static INT32 nFractionalPosition;
|
||||||
static INT32 nNumChips = 0;
|
static INT32 nNumChips = 0;
|
||||||
static INT32 bMD2612AddSignal;
|
static INT32 bMD2612AddSignal;
|
||||||
|
|
||||||
static double MD2612Volumes[2 * MAX_MD2612];
|
static double MD2612Volumes[2];
|
||||||
static INT32 MD2612RouteDirs[2 * MAX_MD2612];
|
static INT32 MD2612RouteDirs[2];
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// Dummy functions
|
// Dummy functions
|
||||||
|
@ -156,7 +154,6 @@ void BurnMD2612UpdateRequest()
|
||||||
MD2612Render(BurnMD2612StreamCallback(nBurnMD2612SoundRate));
|
MD2612Render(BurnMD2612StreamCallback(nBurnMD2612SoundRate));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// Initialisation, etc.
|
// Initialisation, etc.
|
||||||
|
|
||||||
|
@ -194,7 +191,7 @@ void BurnMD2612Exit()
|
||||||
INT32 BurnMD2612Init(INT32 num, INT32 bIsPal, INT32 (*StreamCallback)(INT32), double (*GetTimeCallback)(), INT32 bAddSignal)
|
INT32 BurnMD2612Init(INT32 num, INT32 bIsPal, INT32 (*StreamCallback)(INT32), double (*GetTimeCallback)(), INT32 bAddSignal)
|
||||||
{
|
{
|
||||||
if (num > 1) {
|
if (num > 1) {
|
||||||
bprintf(0, _T("MD2612 only supports 1 chip!\n"));
|
bprintf(0, _T("BurnMD2612Init(): MD2612 only supports 1 chip!\n"));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -254,11 +251,6 @@ void BurnMD2612SetRoute(INT32 nChip, INT32 nIndex, double nVolume, INT32 nRouteD
|
||||||
MD2612Volumes[nIndex] = nVolume;
|
MD2612Volumes[nIndex] = nVolume;
|
||||||
MD2612RouteDirs[nIndex] = nRouteDir;
|
MD2612RouteDirs[nIndex] = nRouteDir;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nChip == 1) {
|
|
||||||
MD2612Volumes[2 + nIndex] = nVolume;
|
|
||||||
MD2612RouteDirs[2 + nIndex] = nRouteDir;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void BurnMD2612Scan(INT32 nAction, INT32* pnMin)
|
void BurnMD2612Scan(INT32 nAction, INT32* pnMin)
|
||||||
|
@ -278,5 +270,3 @@ void BurnMD2612Scan(INT32 nAction, INT32* pnMin)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#undef MAX_MD2612
|
|
||||||
|
|
|
@ -779,8 +779,6 @@ INLINE void INTERNAL_TIMER_A()
|
||||||
ym2612.OPN.ST.TAC--;
|
ym2612.OPN.ST.TAC--;
|
||||||
if (ym2612.OPN.ST.TAC <= 0)
|
if (ym2612.OPN.ST.TAC <= 0)
|
||||||
{
|
{
|
||||||
//if (!in_reset)
|
|
||||||
//BurnMD2612UpdateRequest();
|
|
||||||
/* set status (if enabled) */
|
/* set status (if enabled) */
|
||||||
if (ym2612.OPN.ST.mode & 0x04)
|
if (ym2612.OPN.ST.mode & 0x04)
|
||||||
ym2612.OPN.ST.status |= 0x01;
|
ym2612.OPN.ST.status |= 0x01;
|
||||||
|
@ -1974,14 +1972,16 @@ void MDYM2612Write(unsigned int a, unsigned int v)
|
||||||
default: /* data port */
|
default: /* data port */
|
||||||
{
|
{
|
||||||
int addr = ym2612.OPN.ST.address; /* verified by Nemesis on real YM2612 */
|
int addr = ym2612.OPN.ST.address; /* verified by Nemesis on real YM2612 */
|
||||||
|
|
||||||
|
if (!in_reset)
|
||||||
|
BurnMD2612UpdateRequest();
|
||||||
|
|
||||||
switch( addr & 0x1f0 )
|
switch( addr & 0x1f0 )
|
||||||
{
|
{
|
||||||
case 0x20: /* 0x20-0x2f Mode */
|
case 0x20: /* 0x20-0x2f Mode */
|
||||||
switch( addr )
|
switch( addr )
|
||||||
{
|
{
|
||||||
case 0x2a: /* DAC data (ym2612) */
|
case 0x2a: /* DAC data (ym2612) */
|
||||||
if (!in_reset)
|
|
||||||
BurnMD2612UpdateRequest();
|
|
||||||
ym2612.dacout = ((int)v - 0x80) << 6; /* convert to 14-bit output */
|
ym2612.dacout = ((int)v - 0x80) << 6; /* convert to 14-bit output */
|
||||||
break;
|
break;
|
||||||
case 0x2b: /* DAC Sel (ym2612) */
|
case 0x2b: /* DAC Sel (ym2612) */
|
||||||
|
@ -1989,15 +1989,11 @@ void MDYM2612Write(unsigned int a, unsigned int v)
|
||||||
ym2612.dacen = v & 0x80;
|
ym2612.dacen = v & 0x80;
|
||||||
break;
|
break;
|
||||||
default: /* OPN section */
|
default: /* OPN section */
|
||||||
if (!in_reset)
|
|
||||||
BurnMD2612UpdateRequest();
|
|
||||||
/* write register */
|
/* write register */
|
||||||
OPNWriteMode(addr,v);
|
OPNWriteMode(addr,v);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default: /* 0x30-0xff OPN section */
|
default: /* 0x30-0xff OPN section */
|
||||||
if (!in_reset)
|
|
||||||
BurnMD2612UpdateRequest();
|
|
||||||
/* write register */
|
/* write register */
|
||||||
OPNWriteReg(addr,v);
|
OPNWriteReg(addr,v);
|
||||||
}
|
}
|
||||||
|
@ -2008,6 +2004,8 @@ void MDYM2612Write(unsigned int a, unsigned int v)
|
||||||
|
|
||||||
unsigned int MDYM2612Read(void)
|
unsigned int MDYM2612Read(void)
|
||||||
{
|
{
|
||||||
|
if (!in_reset)
|
||||||
|
BurnMD2612UpdateRequest();
|
||||||
return ym2612.OPN.ST.status & 0xff;
|
return ym2612.OPN.ST.status & 0xff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2162,7 +2160,6 @@ int MDYM2612LoadContext()
|
||||||
{
|
{
|
||||||
int c,s;
|
int c,s;
|
||||||
UINT8 index;
|
UINT8 index;
|
||||||
int bufferptr = 0;
|
|
||||||
|
|
||||||
/* restore YM2612 context */
|
/* restore YM2612 context */
|
||||||
SCAN_VAR(ym2612);
|
SCAN_VAR(ym2612);
|
||||||
|
@ -2173,7 +2170,6 @@ int MDYM2612LoadContext()
|
||||||
for (s=0; s<4; s++)
|
for (s=0; s<4; s++)
|
||||||
{
|
{
|
||||||
SCAN_VAR(index);
|
SCAN_VAR(index);
|
||||||
bufferptr += sizeof(index);
|
|
||||||
ym2612.CH[c].SLOT[s].DT = ym2612.OPN.ST.dt_tab[index&7];
|
ym2612.CH[c].SLOT[s].DT = ym2612.OPN.ST.dt_tab[index&7];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2186,14 +2182,13 @@ int MDYM2612LoadContext()
|
||||||
setup_connection(&ym2612.CH[4],4);
|
setup_connection(&ym2612.CH[4],4);
|
||||||
setup_connection(&ym2612.CH[5],5);
|
setup_connection(&ym2612.CH[5],5);
|
||||||
|
|
||||||
return bufferptr;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int MDYM2612SaveContext()
|
int MDYM2612SaveContext()
|
||||||
{
|
{
|
||||||
int c,s;
|
int c,s;
|
||||||
UINT8 index;
|
UINT8 index;
|
||||||
int bufferptr = 0;
|
|
||||||
|
|
||||||
/* save YM2612 context */
|
/* save YM2612 context */
|
||||||
SCAN_VAR(ym2612);
|
SCAN_VAR(ym2612);
|
||||||
|
@ -2205,9 +2200,8 @@ int MDYM2612SaveContext()
|
||||||
{
|
{
|
||||||
index = (ym2612.CH[c].SLOT[s].DT - ym2612.OPN.ST.dt_tab[0]) >> 5;
|
index = (ym2612.CH[c].SLOT[s].DT - ym2612.OPN.ST.dt_tab[0]) >> 5;
|
||||||
SCAN_VAR(index);
|
SCAN_VAR(index);
|
||||||
bufferptr += sizeof(index);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return bufferptr;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue