⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 s_fme07.c

📁 一款游戏机的模拟器
💻 C
字号:
#include	"..\..\interface.h"
#include	"s_FME07.h"

static	TFME07sound	FME07sound;

static	void	FME07_DoSquare (PFME07sqr ChanData, s16 *Target, int Size)
{
	int x;
	for (x = 0; x < Size; x++)
	{
		ChanData->LCtr -= NES_INC_SIZE_INT;
		while (ChanData->LCtr < 0)
		{
			ChanData->CurP++;
			ChanData->CurP &= 0xF;
			ChanData->LCtr += (ChanData->freq + 1) << 16;
		}
		Target[x] += ChanData->volume * ((ChanData->CurP < 8) ? 3 : -3);
	}
}

static	void	FME07_DoNoise (PFME07noise ChanData, s16 *Target, int Size)
{
	int x, volume;

        volume = 0;
        for (x = 0; x < 3; x++)
	{
		if (!(FME07sound.noise & (1 << x)))
			volume += FME07sound.Sqr[x].volume;	/* 1 noise for each channel */
	}
	for (x = 0; x < Size; x++)
	{
		ChanData->LCtr -= NES_INC_SIZE_INT;
		while (ChanData->LCtr < 0)
		{
			ChanData->ShiftReg.s0 = (ChanData->ShiftReg.s0 << 1) | ((ChanData->ShiftReg.s0 >> 13) & 1) ^ ((ChanData->ShiftReg.s0 >> 14) & 1);
			ChanData->LCtr += (ChanData->freq + 1) << 16;
		}
		Target[x] += volume * ((ChanData->ShiftReg.s0 & 1) ? 3 : -3);
	}
}

void	FME07sound_Init (void)
{
	memset(&FME07sound,0,sizeof(FME07sound));
	FME07sound.Noise.ShiftReg.s0 = 0xFFFF;
}

void	FME07sound_Write (int Where, int What)
{
	switch (Where & 0xE000)
	{
	case 0xC000:	FME07sound.select = What & 0xF;	break;	
	case 0xE000:	switch (FME07sound.select)
			{
			case 0x0:	FME07sound.Sqr[0].byte0 = What;	break;
			case 0x1:	FME07sound.Sqr[0].byte1 = What;	break;
			case 0x2:	FME07sound.Sqr[1].byte0 = What;	break;
			case 0x3:	FME07sound.Sqr[1].byte1 = What;	break;
			case 0x4:	FME07sound.Sqr[2].byte0 = What;	break;
			case 0x5:	FME07sound.Sqr[2].byte1 = What;	break;
			case 0x6:	FME07sound.Noise.byte0 = What;	break;
			case 0x7:	FME07sound.byte7 = What;	break;
			case 0x8:	FME07sound.Sqr[0].byte2 = What;	break;
			case 0x9:	FME07sound.Sqr[1].byte2 = What;	break;
			case 0xA:	FME07sound.Sqr[2].byte2 = What;	break;
			case 0xB:	FME07sound.byteB = What;	break;
			case 0xC:	FME07sound.byteC = What;	break;
			case 0xD:	FME07sound.byteD = What;	break;
			}				break;
	}
}

void	FME07sound_Get (s16 *Target, int Size)
{
	if (!(FME07sound.tone & 1))	FME07_DoSquare(&FME07sound.Sqr[0],Target,Size);
	if (!(FME07sound.tone & 2))	FME07_DoSquare(&FME07sound.Sqr[1],Target,Size);
	if (!(FME07sound.tone & 4))	FME07_DoSquare(&FME07sound.Sqr[2],Target,Size);
	if (!FME07sound.noise)		FME07_DoNoise(&FME07sound.Noise,Target,Size);
}

int	FME07sound_SaveMI (Ar128 MI, int x)
{
	MI[x++] = FME07sound.Sqr[0].byte0;
	MI[x++] = FME07sound.Sqr[0].byte1;
	MI[x++] = FME07sound.Sqr[0].byte2;
	MI[x++] = FME07sound.Sqr[1].byte0;
	MI[x++] = FME07sound.Sqr[1].byte1;
	MI[x++] = FME07sound.Sqr[1].byte2;
	MI[x++] = FME07sound.Sqr[2].byte0;
	MI[x++] = FME07sound.Sqr[2].byte1;
	MI[x++] = FME07sound.Sqr[2].byte2;
	MI[x++] = FME07sound.Noise.byte0;
	MI[x++] = FME07sound.Noise.ShiftReg.b0;
	MI[x++] = FME07sound.Noise.ShiftReg.b1;
	MI[x++] = FME07sound.select;
	return x;
}

int	FME07sound_LoadMI (const Ar128 MI, int x)
{
	FME07sound.Sqr[0].byte0 = MI[x++];
	FME07sound.Sqr[0].byte1 = MI[x++];
	FME07sound.Sqr[0].byte2 = MI[x++];
	FME07sound.Sqr[1].byte0 = MI[x++];
	FME07sound.Sqr[1].byte1 = MI[x++];
	FME07sound.Sqr[1].byte2 = MI[x++];
	FME07sound.Sqr[2].byte0 = MI[x++];
	FME07sound.Sqr[2].byte1 = MI[x++];
	FME07sound.Sqr[2].byte2 = MI[x++];
	FME07sound.Noise.byte0 = MI[x++];
	FME07sound.Noise.ShiftReg.b0 = MI[x++];
	FME07sound.Noise.ShiftReg.b1 = MI[x++];
	FME07sound.select = MI[x++];
	return x;
}

void	FME07sound_Destroy (void)
{
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -