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

📄 nesintf.c

📁 这个是延伸mame的在wince平台下的游戏模拟器的代码
💻 C
字号:
/***************************************************************************

  nesintf.c


  Support interface for NES PSG

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

#include "driver.h"
#include "nes.h"


#define MIN_SLICE 10

static int emulation_rate;
static int buffer_len;
static int sample_bits;

static struct NESinterface *intf;


static void *buffer[MAX_NESPSG];
static int sample_pos[MAX_NESPSG];

static int volume[MAX_NESPSG];

static int channel;

int NESPSG_sh_start(struct NESinterface *interface)
{
	int i;


	intf = interface;

	buffer_len = Machine->sample_rate / Machine->drv->frames_per_second;
	emulation_rate = buffer_len * Machine->drv->frames_per_second;

	sample_bits = Machine->sample_bits;

	for (i = 0;i < MAX_NESPSG;i++)
	{
		sample_pos[i] = 0;

		buffer[i] = 0;
	}
	for (i = 0;i < intf->num;i++)
	{
		if ((buffer[i] = malloc((sample_bits/8)*buffer_len)) == 0)
		{
			while (--i >= 0) free(buffer[i]);
			return 1;
		}
	}
	if (NESInit(intf->num,intf->baseclock,emulation_rate,sample_bits,buffer_len,buffer) == 0)
	{
		channel = get_play_channels( intf->num );

		for (i = 0;i < intf->num;i++)
		{
			int gain;


			volume[i] = intf->volume[i] & 0xff;
			gain = (intf->volume[i] >> 8) & 0xff;
			NESSetGain(i,gain);
		}

		return 0;
	}
	for (i = 0;i < intf->num;i++) free(buffer[i]);
	return 1;
}

void NESPSG_sh_stop(void)
{
	int i;

	NESShutdown();
	for (i = 0;i < intf->num;i++){
		free(buffer[i]);
	}
}

static void update(int chip)
{
	int newpos;


	newpos = cpu_scalebyfcount(buffer_len);	/* get current position based on the timer */

	if( newpos - sample_pos[chip] < MIN_SLICE ) return;
	NESUpdateOne(chip, newpos );

	sample_pos[chip] = newpos;
}


int NESPSG_0_r(int offset)
{
	return NESReadReg(0,offset);
}
int NESPSG_1_r(int offset)
{
	return NESReadReg(1,offset);
}

void NESPSG_0_w(int offset,int data)
{
	update(0);
	NESWriteReg(0,offset,data);
}
void NESPSG_1_w(int offset,int data)
{
	update(1);
	NESWriteReg(1,offset,data);
}


void NESPSG_sh_update(void)
{
	int i;

	if (Machine->sample_rate == 0 ) return;
	NESUpdate();

	for (i = 0;i < intf->num;i++)
	{
		sample_pos[i] = 0;
		if( sample_bits == 16 )
			osd_play_streamed_sample_16(channel+i,buffer[i],2*buffer_len,emulation_rate,volume[i],OSD_PAN_CENTER);
		else
			osd_play_streamed_sample(channel+i,buffer[i],buffer_len,emulation_rate,volume[i],OSD_PAN_CENTER);
	}
}

⌨️ 快捷键说明

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