亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? sn76496.c

?? 這個是延伸mame的在wince平臺下的游戲模擬器的代碼
?? C
字號:
/***************************************************************************

  sn76496.c

  Routines to emulate the Texas Instruments SN76489 and SN76496 programmable
  tone /noise generator.

  Noise emulation is not accurate due to lack of documentation. The noise
  generator uses a shift register with a XOR-feedback network, but the exact
  layout is unknown. It can be set for either period or white noise; again,
  the details are unknown.

***************************************************************************/

#include "driver.h"


#ifdef SIGNED_SAMPLES
	#define MAX_OUTPUT 0x7fff
	#define AUDIO_CONV(A) (A)
#else
	#define MAX_OUTPUT 0xffff
	#define AUDIO_CONV(A) (A)
#endif

#define STEP 0x10000


/* Formulas for noise generator */
/* bit0 = output */

/* noise feedback for white noise mode */
#define FB_WNOISE 0x12000	/* bit15.d(16bits) = bit0(out) ^ bit2 */

/* noise feedback for periodic noise mode */
/* it is correct maybe (it was in the Megadrive sound manual) */
#define FB_PNOISE 0x08000   /* JH 981127 - fixes Do Run Run */

/* noise generator start preset (for periodic noise) */
#define NG_PRESET 0x0f35


struct SN76496
{
	int Channel;
	int SampleRate;
	unsigned int UpdateStep;
	int VolTable[16];	/* volume table         */
	int Register[8];	/* registers */
	int LastRegister;	/* last register written */
	int Volume[4];		/* volume of voice 0-2 and noise */
	unsigned int RNG;		/* noise generator      */
	int NoiseFB;		/* noise feedback mask */
	int Period[4];
	int Count[4];
	int Output[4];
};


static struct SN76496 sn[MAX_76496];



static void SN76496Write(int chip,int data)
{
	struct SN76496 *R = &sn[chip];


	/* update the output buffer before changing the registers */
	stream_update(R->Channel,0);

	if (data & 0x80)
	{
		int r = (data & 0x70) >> 4;
		int c = r/2;

		R->LastRegister = r;
		R->Register[r] = (R->Register[r] & 0x3f0) | (data & 0x0f);
		switch (r)
		{
			case 0:	/* tone 0 : frequency */
			case 2:	/* tone 1 : frequency */
			case 4:	/* tone 2 : frequency */
				R->Period[c] = R->UpdateStep * R->Register[r];
				if (R->Period[c] == 0) R->Period[c] = R->UpdateStep;
				if (r == 4)
				{
					/* update noise shift frequency */
					if ((R->Register[6] & 0x03) == 0x03)
						R->Period[3] = 2 * R->Period[2];
				}
				break;
			case 1:	/* tone 0 : volume */
			case 3:	/* tone 1 : volume */
			case 5:	/* tone 2 : volume */
			case 7:	/* noise  : volume */
				R->Volume[c] = R->VolTable[data & 0x0f];
				break;
			case 6:	/* noise  : frequency, mode */
				{
					int n = R->Register[6];
					R->NoiseFB = (n & 4) ? FB_WNOISE : FB_PNOISE;
					n &= 3;
					/* N/512,N/1024,N/2048,Tone #3 output */
					R->Period[3] = (n == 3) ? 2 * R->Period[2] : (R->UpdateStep << (5+n));

					/* reset noise shifter */
					R->RNG = NG_PRESET;
					R->Output[3] = R->RNG & 1;
				}
				break;
		}
	}
	else
	{
		int r = R->LastRegister;
		int c = r/2;

		switch (r)
		{
			case 0:	/* tone 0 : frequency */
			case 2:	/* tone 1 : frequency */
			case 4:	/* tone 2 : frequency */
				R->Register[r] = (R->Register[r] & 0x0f) | ((data & 0x3f) << 4);
				R->Period[c] = R->UpdateStep * R->Register[r];
				if (R->Period[c] == 0) R->Period[c] = R->UpdateStep;
				if (r == 4)
				{
					/* update noise shift frequency */
					if ((R->Register[6] & 0x03) == 0x03)
						R->Period[3] = 2 * R->Period[2];
				}
				break;
		}
	}
}


void SN76496_0_w(int offset,int data) {	SN76496Write(0,data); }
void SN76496_1_w(int offset,int data) {	SN76496Write(1,data); }
void SN76496_2_w(int offset,int data) {	SN76496Write(2,data); }
void SN76496_3_w(int offset,int data) {	SN76496Write(3,data); }



static void SN76496Update_8(int chip,void *buffer,int length)
{
#define DATATYPE unsigned char
#define DATACONV(A) AUDIO_CONV((A) / (STEP * 256))
#include "sn76496u.c"
#undef DATATYPE
#undef DATACONV
}

static void SN76496Update_16(int chip,void *buffer,int length)
{
#define DATATYPE unsigned short
#define DATACONV(A) ((A) / STEP)
#include "sn76496u.c"
#undef DATATYPE
#undef DATACONV
}



void SN76496_set_clock(int chip,int clock)
{
	struct SN76496 *R = &sn[chip];


	/* the base clock for the tone generators is the chip clock divided by 16; */
	/* for the noise generator, it is clock / 256. */
	/* Here we calculate the number of steps which happen during one sample */
	/* at the given sample rate. No. of events = sample rate / (clock/16). */
	/* STEP is a multiplier used to turn the fraction into a fixed point */
	/* number. */
	R->UpdateStep = ((double)STEP * R->SampleRate * 16) / clock;
}



static void SN76496_set_volume(int chip,int volume,int gain)
{
	struct SN76496 *R = &sn[chip];
	int i;
	double out;


	stream_set_volume(R->Channel,volume);

	gain &= 0xff;

	/* increase max output basing on gain (0.2 dB per step) */
	out = MAX_OUTPUT / 3;
	while (gain-- > 0)
		out *= 1.023292992;	/* = (10 ^ (0.2/20)) */

	/* build volume table (2dB per step) */
	for (i = 0;i < 15;i++)
	{
		/* limit volume to avoid clipping */
		if (out > MAX_OUTPUT / 3) R->VolTable[i] = MAX_OUTPUT / 3;
		else R->VolTable[i] = out;

		out /= 1.258925412;	/* = 10 ^ (2/20) = 2dB */
	}
	R->VolTable[15] = 0;
}



static int SN76496_init(int chip,int clock,int sample_rate,int sample_bits)
{
	int i;
	struct SN76496 *R = &sn[chip];
	char name[40];


	sprintf(name,"SN76496 #%d",chip);
	R->Channel = stream_init(
			name,sample_rate,sample_bits,
			chip,(sample_bits == 16) ? SN76496Update_16 : SN76496Update_8);

	if (R->Channel == -1)
		return 1;

	R->SampleRate = sample_rate;
	SN76496_set_clock(chip,clock);
	SN76496_set_volume(chip,255,0);

	for (i = 0;i < 4;i++) R->Volume[i] = 0;

	R->LastRegister = 0;
	for (i = 0;i < 8;i+=2)
	{
		R->Register[i] = 0;
		R->Register[i + 1] = 0x0f;	/* volume = 0 */
	}

	for (i = 0;i < 4;i++)
	{
		R->Output[i] = 0;
		R->Period[i] = R->Count[i] = R->UpdateStep;
	}
	R->RNG = NG_PRESET;
	R->Output[3] = R->RNG & 1;

	return 0;
}



int SN76496_sh_start(struct SN76496interface *interface)
{
	int chip;


	for (chip = 0;chip < interface->num;chip++)
	{
		if (SN76496_init(chip,interface->baseclock,Machine->sample_rate,Machine->sample_bits) != 0)
			return 1;

		SN76496_set_volume(chip,interface->volume[chip] & 0xff,(interface->volume[chip] >> 8) & 0xff);
	}
	return 0;
}

void SN76496_sh_stop(void)
{
}

void SN76496_sh_update(void)
{
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
自拍偷自拍亚洲精品播放| 欧美aaaaaa午夜精品| 五月天一区二区三区| 国内精品国产成人| 欧美视频中文字幕| 久久久91精品国产一区二区三区| 中文字幕亚洲电影| 国产精品白丝jk白祙喷水网站| 欧美日本乱大交xxxxx| 中文字幕中文乱码欧美一区二区| 蜜桃av噜噜一区二区三区小说| 欧洲亚洲国产日韩| 亚洲国产高清在线观看视频| 久久99国产精品久久| 欧美群妇大交群中文字幕| 亚洲少妇30p| 成人免费观看av| 国产欧美日韩综合| 国产美女娇喘av呻吟久久| 91精品国产全国免费观看| 亚洲一级片在线观看| 日本黄色一区二区| 中文字幕一区av| 91在线一区二区| 中文字幕一区二区三区乱码在线| 国产乱码精品一区二区三区av| 精品国产一区久久| 免费观看日韩av| 日韩欧美在线综合网| 三级久久三级久久久| 欧美一区在线视频| 日韩激情av在线| 欧美一区二区在线看| 日韩成人精品在线观看| 欧美一级精品大片| 六月丁香婷婷久久| 久久综合狠狠综合久久综合88| 久久97超碰国产精品超碰| 欧美成人三级电影在线| 国内精品伊人久久久久av影院 | 不卡一区中文字幕| 中文字幕精品在线不卡| www.99精品| 另类成人小视频在线| 国产一区二区三区香蕉 | 欧美在线播放高清精品| 亚洲九九爱视频| 欧美日韩精品福利| 免费日本视频一区| www一区二区| 91在线播放网址| 一区二区三区欧美久久| 欧美精品高清视频| 国产一区二区精品在线观看| 国产精品视频观看| 欧美三级乱人伦电影| 青娱乐精品视频| 国产精品三级电影| 欧美三级视频在线| 狠狠色丁香九九婷婷综合五月| 中文字幕成人网| 欧美日韩二区三区| 国产99久久久精品| 亚洲黄一区二区三区| 欧美一级午夜免费电影| 成人中文字幕合集| 偷拍亚洲欧洲综合| 国产午夜精品一区二区三区嫩草| jizzjizzjizz欧美| 奇米一区二区三区av| 国产精品久久久久久久久免费桃花| 日本高清不卡视频| 国产精品一区二区三区网站| 国产精品传媒视频| 日韩欧美成人一区| 色综合久久天天| 国内成人免费视频| 亚洲午夜私人影院| 成人欧美一区二区三区白人| 9191国产精品| 91美女片黄在线观看91美女| 国产精品毛片久久久久久| 一区二区三区小说| 日本一区二区三区国色天香| 欧美女孩性生活视频| 不卡电影一区二区三区| 九九在线精品视频| 亚洲国产精品一区二区久久恐怖片| www国产成人免费观看视频 深夜成人网| 色综合天天综合网国产成人综合天 | 日韩一区二区三区视频在线观看| 成人黄色大片在线观看| 国产在线观看免费一区| 日韩专区一卡二卡| 一区二区三区在线观看网站| 欧美韩日一区二区三区| 久久只精品国产| 精品久久久久av影院| 69堂成人精品免费视频| 欧美综合视频在线观看| 色综合天天做天天爱| av在线不卡观看免费观看| 国产91在线看| 国产精品123区| 紧缚奴在线一区二区三区| 日本中文在线一区| 日韩成人午夜精品| 日本成人中文字幕| 蜜乳av一区二区三区| 日本亚洲视频在线| 美女视频一区二区三区| 日本不卡一区二区三区高清视频| 五月综合激情网| 亚洲一区中文日韩| 亚洲不卡在线观看| 三级亚洲高清视频| 欧美aa在线视频| 另类小说图片综合网| 美女高潮久久久| 国产又黄又大久久| 高清beeg欧美| 97精品国产97久久久久久久久久久久 | 欧美在线观看禁18| 欧美日韩在线播放一区| 欧美日韩免费一区二区三区| 欧洲一区二区av| 91麻豆精品国产91久久久久久 | 久久综合五月天婷婷伊人| 久久久欧美精品sm网站| 中文一区二区在线观看 | 欧美激情一区二区三区全黄| 欧美韩日一区二区三区| 亚洲婷婷国产精品电影人久久| 亚洲天堂福利av| 亚洲第一会所有码转帖| 麻豆国产一区二区| 成人免费看视频| 欧美三级蜜桃2在线观看| 精品久久久久久最新网址| 久久精品夜夜夜夜久久| 亚洲少妇中出一区| 免费视频最近日韩| 不卡影院免费观看| 337p亚洲精品色噜噜狠狠| 精品国产精品网麻豆系列| 国产精品麻豆一区二区| 亚洲成人免费在线观看| 精品一区二区三区影院在线午夜| 欧美在线视频你懂得| 国产精品免费av| 亚洲成人动漫在线免费观看| 国产综合色产在线精品| 色综合久久综合网97色综合 | 日产国产高清一区二区三区 | 欧美极品aⅴ影院| 亚洲国产精品久久人人爱蜜臀| 理论片日本一区| 在线观看成人小视频| 久久精品一区二区三区不卡| 亚洲一区二区三区精品在线| 国产成人在线视频网站| 欧美日韩精品一区二区| 国产校园另类小说区| 日韩成人dvd| 色综合久久久久综合体| 精品久久久网站| 亚洲一区二区视频| 成人免费视频一区| 欧美手机在线视频| 亚洲人成在线观看一区二区| 26uuu色噜噜精品一区| 亚洲电影一级片| 国产精品国产三级国产a| 久久成人久久鬼色| 欧美国产精品专区| 欧美精品日韩精品| 久久99蜜桃精品| 欧美精品一级二级三级| 黄网站免费久久| 国产精品高潮久久久久无| 成人激情av网| 国产精品久久久久aaaa樱花| 国产乱子伦视频一区二区三区| 午夜精品福利一区二区蜜股av| 国产成人午夜视频| 日韩一区二区三免费高清| 亚洲福利电影网| 91视频免费看| 中文字幕亚洲区| 99精品视频免费在线观看| 久久久99精品免费观看不卡| 精品一区中文字幕| 精品国产污网站| 麻豆精品新av中文字幕| 日韩亚洲欧美中文三级| 亚洲成av人片在线观看| 欧美日韩亚洲综合在线| 亚洲国产一区二区视频| 欧美色电影在线| 亚洲高清免费观看|