mirror of
https://github.com/ekeeke/Genesis-Plus-GX.git
synced 2024-12-27 11:41:48 +01:00
.fixed broken PSG noise frequency
.improved accuracy Game Gear PSG stereo (cycle-accurate)
This commit is contained in:
parent
c830a70872
commit
54687cde58
@ -547,7 +547,7 @@ void io_gg_write(unsigned int offset, unsigned int data)
|
|||||||
|
|
||||||
case 6: /* PSG Stereo output control */
|
case 6: /* PSG Stereo output control */
|
||||||
io_reg[6] = data;
|
io_reg[6] = data;
|
||||||
SN76489_Config(config.psg_preamp, config.psgBoostNoise, data);
|
SN76489_Config(Z80.cycles, config.psg_preamp, config.psgBoostNoise, data);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
default: /* Read-only */
|
default: /* Read-only */
|
||||||
|
@ -157,29 +157,6 @@ void SN76489_Reset()
|
|||||||
SN76489.clocks = 0;
|
SN76489.clocks = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SN76489_Config(int preAmp, int boostNoise, int stereo)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i=0; i<4; i++)
|
|
||||||
{
|
|
||||||
/* stereo channel pre-amplification */
|
|
||||||
SN76489.PreAmp[i][0] = preAmp * ((stereo >> (i*2)) & 1);
|
|
||||||
SN76489.PreAmp[i][1] = preAmp * ((stereo >> (i*2 + 1)) & 1);
|
|
||||||
|
|
||||||
/* noise channel boost */
|
|
||||||
if (i == 3)
|
|
||||||
{
|
|
||||||
SN76489.PreAmp[3][0] = SN76489.PreAmp[3][0] << boostNoise;
|
|
||||||
SN76489.PreAmp[3][1] = SN76489.PreAmp[3][1] << boostNoise;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* update stereo channel amplitude */
|
|
||||||
SN76489.Channel[i][0]= (PSGVolumeValues[SN76489.Registers[i*2 + 1]] * SN76489.PreAmp[i][0]) / 100;
|
|
||||||
SN76489.Channel[i][1]= (PSGVolumeValues[SN76489.Registers[i*2 + 1]] * SN76489.PreAmp[i][1]) / 100;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void *SN76489_GetContextPtr(void)
|
void *SN76489_GetContextPtr(void)
|
||||||
{
|
{
|
||||||
return (uint8 *)&SN76489;
|
return (uint8 *)&SN76489;
|
||||||
@ -331,6 +308,39 @@ static void SN76489_RunUntil(unsigned int clocks)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SN76489_Config(unsigned int clocks, int preAmp, int boostNoise, int stereo)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* cycle-accurate Game Gear stereo */
|
||||||
|
if (clocks > SN76489.clocks)
|
||||||
|
{
|
||||||
|
/* Run chip until current timestamp */
|
||||||
|
SN76489_RunUntil(clocks);
|
||||||
|
|
||||||
|
/* Update internal M-cycle counter */
|
||||||
|
SN76489.clocks += ((clocks - SN76489.clocks + PSG_MCYCLES_RATIO - 1) / PSG_MCYCLES_RATIO) * PSG_MCYCLES_RATIO;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i=0; i<4; i++)
|
||||||
|
{
|
||||||
|
/* stereo channel pre-amplification */
|
||||||
|
SN76489.PreAmp[i][0] = preAmp * ((stereo >> (i*2)) & 1);
|
||||||
|
SN76489.PreAmp[i][1] = preAmp * ((stereo >> (i*2 + 1)) & 1);
|
||||||
|
|
||||||
|
/* noise channel boost */
|
||||||
|
if (i == 3)
|
||||||
|
{
|
||||||
|
SN76489.PreAmp[3][0] = SN76489.PreAmp[3][0] << boostNoise;
|
||||||
|
SN76489.PreAmp[3][1] = SN76489.PreAmp[3][1] << boostNoise;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* update stereo channel amplitude */
|
||||||
|
SN76489.Channel[i][0]= (PSGVolumeValues[SN76489.Registers[i*2 + 1]] * SN76489.PreAmp[i][0]) / 100;
|
||||||
|
SN76489.Channel[i][1]= (PSGVolumeValues[SN76489.Registers[i*2 + 1]] * SN76489.PreAmp[i][1]) / 100;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void SN76489_Update(unsigned int clocks)
|
void SN76489_Update(unsigned int clocks)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@ -424,7 +434,7 @@ void SN76489_Write(unsigned int clocks, unsigned int data)
|
|||||||
SN76489.NoiseShiftRegister = NoiseInitialState;
|
SN76489.NoiseShiftRegister = NoiseInitialState;
|
||||||
|
|
||||||
/* set noise signal generator frequency */
|
/* set noise signal generator frequency */
|
||||||
SN76489.NoiseFreq = (0x10 << (data&0x3)) * PSG_MCYCLES_RATIO;
|
SN76489.NoiseFreq = 0x10 << (data&0x3);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
/* Function prototypes */
|
/* Function prototypes */
|
||||||
extern void SN76489_Init(blip_t* left, blip_t* right, int type);
|
extern void SN76489_Init(blip_t* left, blip_t* right, int type);
|
||||||
extern void SN76489_Reset(void);
|
extern void SN76489_Reset(void);
|
||||||
extern void SN76489_Config(int preAmp, int boostNoise, int stereo);
|
extern void SN76489_Config(unsigned int clocks, int preAmp, int boostNoise, int stereo);
|
||||||
extern void SN76489_Write(unsigned int clocks, unsigned int data);
|
extern void SN76489_Write(unsigned int clocks, unsigned int data);
|
||||||
extern void SN76489_Update(unsigned int cycles);
|
extern void SN76489_Update(unsigned int cycles);
|
||||||
extern void *SN76489_GetContextPtr(void);
|
extern void *SN76489_GetContextPtr(void);
|
||||||
|
@ -102,7 +102,7 @@ void sound_init( void )
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize PSG chip */
|
/* Initialize PSG chip */
|
||||||
SN76489_Config(config.psg_preamp, config.psgBoostNoise, 0xff);
|
SN76489_Config(0, config.psg_preamp, config.psgBoostNoise, 0xff);
|
||||||
}
|
}
|
||||||
|
|
||||||
void sound_reset(void)
|
void sound_reset(void)
|
||||||
|
@ -117,12 +117,12 @@ int state_load(unsigned char *state)
|
|||||||
if ((system_hw & SYSTEM_PBC) == SYSTEM_MD)
|
if ((system_hw & SYSTEM_PBC) == SYSTEM_MD)
|
||||||
{
|
{
|
||||||
SN76489_Init(snd.blips[0][0], snd.blips[0][1], SN_INTEGRATED);
|
SN76489_Init(snd.blips[0][0], snd.blips[0][1], SN_INTEGRATED);
|
||||||
SN76489_Config(config.psg_preamp, config.psgBoostNoise, 0xff);
|
SN76489_Config(0, config.psg_preamp, config.psgBoostNoise, 0xff);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SN76489_Init(snd.blips[0][0], snd.blips[0][1], (system_hw < SYSTEM_MARKIII) ? SN_DISCRETE : SN_INTEGRATED);
|
SN76489_Init(snd.blips[0][0], snd.blips[0][1], (system_hw < SYSTEM_MARKIII) ? SN_DISCRETE : SN_INTEGRATED);
|
||||||
SN76489_Config(config.psg_preamp, config.psgBoostNoise, io_reg[6]);
|
SN76489_Config(0, config.psg_preamp, config.psgBoostNoise, io_reg[6]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 68000 */
|
/* 68000 */
|
||||||
|
Loading…
Reference in New Issue
Block a user