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

📄 2151intf.c

📁 十七种模拟器源代码 非常有用的作课程设计不可缺少的
💻 C
字号:
/***************************************************************************  2151intf.c  Support interface YM2151(OPM)***************************************************************************/#include "driver.h"#include "sasound.h"#include "ym2151.h"#include "fm.h"/* for stream system */static int stream[MAX_2151];static const struct YM2151interface *intf;static int FMMode;#define CHIP_YM2151_DAC 4	/* use Tatsuyuki's FM.C */#define CHIP_YM2151_ALT 5	/* use Jarek's YM2151.C */#if (HAS_YM2151)#define YM2151_NUMBUF 2static void *Timer[MAX_2151][2];/* IRQ Handler */static void IRQHandler(int n,int irq){	if(intf->irqhandler[n]) intf->irqhandler[n](irq);}#ifndef __RAINE__static void timer_callback_2151(int param){	int n=param&0x7f;	int c=param>>7;	Timer[n][c] = 0;	YM2151TimerOver(n,c);}/* 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 */		double timeSec = (double)count * stepTime;		if( Timer[n][c] == 0 )		{			Timer[n][c] = timer_set (timeSec, (c<<7)|n, timer_callback_2151 );		}	}}#endif#endif/* update request from fm.c */void YM2151UpdateRequest(int chip){	stream_update(stream[chip],0);}static int my_YM2151_sh_start(const struct YM2151interface *msound,int mode){	int i,j;	int rate = audio_sample_rate;	char buf[YM2151_NUMBUF][40];	const char *name[YM2151_NUMBUF];	int mixed_vol,vol[YM2151_NUMBUF],pan[YM2151_NUMBUF];	if( rate == 0 ) rate = 1000;	/* kludge to prevent nasty crashes */	intf = msound;	if( mode ) FMMode = CHIP_YM2151_ALT;	else       FMMode = CHIP_YM2151_DAC;	switch(FMMode)	{#if (HAS_YM2151)	case CHIP_YM2151_DAC:	/* Tatsuyuki's */		/* stream system initialize */		for (i = 0;i < intf->num;i++)		{			mixed_vol = intf->volume[i];			/* stream setup */			for (j = 0 ; j < YM2151_NUMBUF ; j++)			{				name[j]=buf[j];				vol[j] = mixed_vol & 0xff;				pan[j] = (mixed_vol>>8) & 0xff;				mixed_vol>>=16;				sprintf(buf[j],"%s #%d Ch%d","YM2151",i,j+1);			}			stream[i] = stream_init_multi(YM2151_NUMBUF,				name,rate,16,i,OPMUpdateOne);			/* volume setup */			for (j = 0 ; j < YM2151_NUMBUF ; j++)			  {			    stream_set_volume(stream[i]+j,vol[j]);			    stream_set_pan(stream[i]+j,pan[j]);			  }		}		/* Set Timer handler */		for (i = 0; i < intf->num; i++)			Timer[i][0] =Timer[i][1] = 0;		if (OPMInit(intf->num,intf->baseclock,audio_sample_rate,0,IRQHandler) == 0)		{			/* set port handler */			for (i = 0; i < intf->num; i++)				OPMSetPortHander(i,intf->portwritehandler[i]);			return 0;		}		/* error */		return 1;#endif#if (HAS_YM2151_ALT)	case CHIP_YM2151_ALT:	/* Jarek's */		/* stream system initialize */		for (i = 0;i < intf->num;i++)		{			/* stream setup */			mixed_vol = intf->volume[i];			for (j = 0 ; j < YM2151_NUMBUF ; j++)			{				name[j]=buf[j];				vol[j] = mixed_vol & 0xff;				pan[j] = (mixed_vol>>8) & 0xff;				mixed_vol>>=16;				sprintf(buf[j],"%s #%d Ch%d","YM2151",i,j+1);			}			stream[i] = stream_init_multi(YM2151_NUMBUF,				name,rate,16,i,YM2151UpdateOne);			/* volume setup */			for (j = 0 ; j < YM2151_NUMBUF ; j++)			  {			    stream_set_volume(stream[i]+j,vol[j]);			    stream_set_pan(stream[i]+j,vol[j]);			  }		}		if (YM2151Init(intf->num,intf->baseclock,audio_sample_rate) == 0)		{			for (i = 0; i < intf->num; i++)			{				YM2151SetIrqHandler(i,intf->irqhandler[i]);				YM2151SetPortWriteHandler(i,intf->portwritehandler[i]);			}			return 0;		}		return 1;#endif	}	return 1;}#if (HAS_YM2151)int YM2151_sh_start(const struct YM2151interface *msound){	return my_YM2151_sh_start(msound,0);}#endif#if (HAS_YM2151_ALT)int YM2151_ALT_sh_start(const struct YM2151interface *msound){	return my_YM2151_sh_start(msound,1);}#endifvoid YM2151_sh_stop(void){	switch(FMMode)	{#if (HAS_YM2151)	case CHIP_YM2151_DAC:		OPMShutdown();		break;#endif#if (HAS_YM2151_ALT)	case CHIP_YM2151_ALT:		YM2151Shutdown();		break;#endif	}}void YM2151_sh_reset(void){	int i;	for (i = 0;i < intf->num;i++)	switch(FMMode)	{#if (HAS_YM2151)	case CHIP_YM2151_DAC:		OPMResetChip(i);		break;#endif#if (HAS_YM2151_ALT)	case CHIP_YM2151_ALT:		YM2151ResetChip(i);		break;#endif	}}static int lastreg0,lastreg1,lastreg2;READ_HANDLER( YM2151_status_port_0_r ){  static int ta;  if(RaineSoundCard>0){	switch(FMMode)	{#if (HAS_YM2151)	case CHIP_YM2151_DAC:		return YM2151Read(0,1);#endif#if (HAS_YM2151_ALT)	case CHIP_YM2151_ALT:		return YM2151ReadStatus(0);#endif	}	return 0;   }   else{      ta = (ta+1)&3;      return ta;   }	}READ_HANDLER( YM2151_status_port_1_r ){	switch(FMMode)	{#if (HAS_YM2151)	case CHIP_YM2151_DAC:		return YM2151Read(1,1);#endif#if (HAS_YM2151_ALT)	case CHIP_YM2151_ALT:		return YM2151ReadStatus(1);#endif	}	return 0;}READ_HANDLER( YM2151_status_port_2_r ){	switch(FMMode)	{#if (HAS_YM2151)	case CHIP_YM2151_DAC:		return YM2151Read(2,1);#endif#if (HAS_YM2151_ALT)	case CHIP_YM2151_ALT:		return YM2151ReadStatus(2);#endif	}	return 0;}WRITE_HANDLER( YM2151_register_port_0_w ){	lastreg0 = data;}WRITE_HANDLER( YM2151_register_port_1_w ){	lastreg1 = data;}WRITE_HANDLER( YM2151_register_port_2_w ){	lastreg2 = data;}WRITE_HANDLER( YM2151_data_port_0_w ){   if(RaineSoundCard>0){       switch(FMMode)	{#if (HAS_YM2151)	case CHIP_YM2151_DAC:		YM2151Write(0,0,(UINT8)(lastreg0&0xFF));		YM2151Write(0,1,data);		break;#endif#if (HAS_YM2151_ALT)	case CHIP_YM2151_ALT:		YM2151UpdateRequest(0);		YM2151WriteReg(0,lastreg0,data);		break;#endif	}   }}WRITE_HANDLER( YM2151_data_port_1_w ){   if(RaineSoundCard>0){       switch(FMMode)	{#if (HAS_YM2151)	case CHIP_YM2151_DAC:		YM2151Write(1,0,(UINT8)(lastreg1&0xFF));		YM2151Write(1,1,data);		break;#endif#if (HAS_YM2151_ALT)	case CHIP_YM2151_ALT:		YM2151UpdateRequest(1);		YM2151WriteReg(1,lastreg1,data);		break;#endif	}   }}WRITE_HANDLER( YM2151_data_port_2_w ){   if(RaineSoundCard>0){  	switch(FMMode)	{#if (HAS_YM2151)	case CHIP_YM2151_DAC:		YM2151Write(2,0,(UINT8)(lastreg2&0xFF));		YM2151Write(2,1,data);		break;#endif#if (HAS_YM2151_ALT)	case CHIP_YM2151_ALT:		YM2151UpdateRequest(2);		YM2151WriteReg(2,lastreg2,data);		break;#endif	}   }}

⌨️ 快捷键说明

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