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

📄 psgintf.c

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

#include <math.h>
#include "driver.h"
#include "ay8910.h"
#include "fm.h"

static int stream[MAX_2203];

static double syncTime[MAX_2203];

static struct YM2203interface *intf;

static int FMMode;
#define CHIP_YM2203_DAC 2
#define CHIP_YM2203_OPL 3   /* YM2203 with OPL chip */

static void *Timer[MAX_2203][2];
static void (*timer_callback)(int param);

/* TimerHandler from fm.c */
static void TimerHandler(int n,int c,int count,double stepTime)
{
	if( count == 0 )
	{	/* Reset FM Timer */
		if( Timer[n][c] )
		{
	 		timer_remove (Timer[n][c]);
			Timer[n][c] = 0;
		}
	}
	else
	{	/* Start FM Timer */
		if( Timer[n][c] == 0 )
		{
			double timeNow;
			double timeSec;
			/* Syncronus Start Timming */
			timeSec = ( (double)count * stepTime );
			timeNow = timer_get_time();
			if (syncTime[n] < timeNow)
			{
				syncTime[n] =  timeNow + (stepTime-fmod(timeNow-syncTime[n],stepTime));
			}
			Timer[n][c] = timer_set (timeSec+(syncTime[n]-timeNow), (c<<7)|n, timer_callback );
		}
	}
}

static void FMTimerInit( void )
{
	int i;

	for( i = 0 ; i < MAX_2203 ; i++ )
		Timer[i][0] = Timer[i][1] = 0;
}



/*------------------------- TM2203 -------------------------------*/
/* Timer overflow callback from timer.c */
static void timer_callback_2203(int param)
{
	int n=param&0x7f;
	int c=param>>7;

	Timer[n][c] = 0;
	if( YM2203TimerOver(n,c) )
	{	/* IRQ is active */;
		/* User Interrupt call */
		if(intf->handler[n]) intf->handler[n]();
	}
#ifdef NICK_BUBLBOBL_CHANGE
	/* Sync another timer */
	c ^= 1;
	if( Timer[n][c] )
	{
		if( timer_timeleft(Timer[n][c]) < 0.008 )
		{
			timer_remove (Timer[n][c]);
			Timer[n][c] = 0;
			if( YM2203TimerOver(n,c) )
			{	/* IRQ is active */;
				/* User Interrupt call */
				if(intf->handler[n]) intf->handler[n]();
			}
		}
	}
#endif
}
/* update request from fm.c */
void YM2203UpdateRequest(int chip)
{
	stream_update(stream[chip],0);
}

#if 0
/* update callback from stream.c */
static void YM2203UpdateCallback(int chip,void *buffer,int length)
{
	YM2203UpdateOne(chip,buffer,length);
}
#endif

int YM2203_sh_start(struct YM2203interface *interface)
{
	int i;

	if( AY8910_sh_start(interface,"YM2203") ) return 1;

	/* FM init */
	FMMode = CHIP_YM2203_DAC;

	intf = interface;

	/* Timer Handler set */
	timer_callback = timer_callback_2203;
	FMTimerInit();
	/* stream system initialize */
	for (i = 0;i < intf->num;i++)
	{
		int volume;
		char name[20];
		sprintf(name,"YM2203 #%d FM",i);
		stream[i] = stream_init(name,Machine->sample_rate,Machine->sample_bits,i,YM2203UpdateOne/*YM2203UpdateCallback*/);
		/* volume setup */
		volume = intf->volume[i]>>16; /* high 16 bit */
		if( volume > 255 ) volume = 255;
		stream_set_volume(stream[i],volume);
	}
	/* Initialize FM emurator */
	if (YM2203Init(intf->num,intf->baseclock,Machine->sample_rate,Machine->sample_bits,TimerHandler,0) == 0)
	{
		/* Ready */
		return 0;
	}
	/* error */
	/* stream close */
	AY8910_sh_stop();
	return 1;
}

void YM2203_sh_stop(void)
{
	AY8910_sh_stop();
	{
		YM2203Shutdown();
	}
}



static int lastreg0,lastreg1,lastreg2,lastreg3,lastreg4;

int YM2203_status_port_0_r(int offset) { return YM2203Read(0,0); }
int YM2203_status_port_1_r(int offset) { return YM2203Read(1,0); }
int YM2203_status_port_2_r(int offset) { return YM2203Read(2,0); }
int YM2203_status_port_3_r(int offset) { return YM2203Read(3,0); }
int YM2203_status_port_4_r(int offset) { return YM2203Read(4,0); }

int YM2203_read_port_0_r(int offset) { return YM2203Read(0,1); }
int YM2203_read_port_1_r(int offset) { return YM2203Read(1,1); }
int YM2203_read_port_2_r(int offset) { return YM2203Read(2,1); }
int YM2203_read_port_3_r(int offset) { return YM2203Read(3,1); }
int YM2203_read_port_4_r(int offset) { return YM2203Read(4,1); }

void YM2203_control_port_0_w(int offset,int data)
{
	if( FMMode == CHIP_YM2203_DAC ) YM2203Write(0,0,data);
	else
	{
		AY8910Write(0,0,data);
		lastreg0 = data;
	}
}
void YM2203_control_port_1_w(int offset,int data)
{
	if( FMMode == CHIP_YM2203_DAC ) YM2203Write(1,0,data);
	else
	{
		AY8910Write(1,0,data);
		lastreg1 = data;
	}
}
void YM2203_control_port_2_w(int offset,int data)
{
	if( FMMode == CHIP_YM2203_DAC ) YM2203Write(2,0,data);
	else
	{
		AY8910Write(2,0,data);
		lastreg2 = data;
	}
}
void YM2203_control_port_3_w(int offset,int data)
{
	if( FMMode == CHIP_YM2203_DAC ) YM2203Write(3,0,data);
	else
	{
		AY8910Write(3,0,data);
		lastreg3 = data;
	}
}
void YM2203_control_port_4_w(int offset,int data)
{
	if( FMMode == CHIP_YM2203_DAC ) YM2203Write(4,0,data);
	else
	{
		AY8910Write(4,0,data);
		lastreg4 = data;
	}
}

void YM2203_write_port_0_w(int offset,int data)
{
	if( FMMode == CHIP_YM2203_DAC )
	{
		YM2203Write(0,1,data);
	}
	else
	{
		if( lastreg0<16 ) AY8910Write(0,1,data);
		else osd_ym2203_write(0,lastreg0,data);
	}
}
void YM2203_write_port_1_w(int offset,int data)
{
	if( FMMode == CHIP_YM2203_DAC )
	{
		YM2203Write(1,1,data);
	}
	else
	{
		if( lastreg1<16 ) AY8910Write(1,1,data);
		else osd_ym2203_write(1,lastreg1,data);
	}
}
void YM2203_write_port_2_w(int offset,int data)
{
	if( FMMode == CHIP_YM2203_DAC ) YM2203Write(2,1,data);
	else
	{
		if( lastreg2<16 ) AY8910Write(2,1,data);
		else osd_ym2203_write(2,lastreg2,data);
	}
}
void YM2203_write_port_3_w(int offset,int data)
{
	if( FMMode == CHIP_YM2203_DAC )
	{
		YM2203Write(3,1,data);
	}
	else
	{
		if( lastreg3<16 ) AY8910Write(3,1,data);
		else osd_ym2203_write(3,lastreg3,data);
	}
}
void YM2203_write_port_4_w(int offset,int data)
{
	if( FMMode == CHIP_YM2203_DAC )
	{
		YM2203Write(4,1,data);
	}
	else
	{
		if( lastreg4<16 ) AY8910Write(4,1,data);
		else              osd_ym2203_write(4,lastreg4,data);
	}
}

void YM2203_sh_update(void)
{
	if (Machine->sample_rate == 0 ) return;

	if( FMMode == CHIP_YM2203_OPL )
		osd_ym2203_update();
}

⌨️ 快捷键说明

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