www.pudn.com > ncdzsrc.rar > 2610intf.c


/*************************************************************************** 
 
	2610intf.c 
 
	YM2610用インタフェース 
 
***************************************************************************/ 
 
#include "neogeocd.h" 
 
static void IRQHandler(int irq); 
static void timer_callback_2610(int param); 
static void TimerHandler(int channel, int count, double stepTime); 
 
 
/**************************************************************************** 
	ローカル変数 
 ***************************************************************************/ 
 
static void *Timer[2]; 
 
 
/*************************************************************************** 
	グローバル関数 
 ***************************************************************************/ 
 
/*------------------------------------------------------ 
 
	YM2610エミュレーションの開始 
 
	引  数: なし 
	戻り値: 1:成功 0:失敗 
 
 -----------------------------------------------------*/ 
 
int YM2610_sh_start(void) 
{ 
	void *pcmbufa; 
	int  pcmsizea; 
 
	Timer[0] = timer_alloc(timer_callback_2610); 
	Timer[1] = timer_alloc(timer_callback_2610); 
 
	stream_init(YM2610Update); 
 
	pcmbufa = (void *)memory_region(REGION_SOUND1); 
	pcmsizea = memory_region_length(REGION_SOUND1); 
 
	return YM2610Init(8000000, sample_rate, pcmbufa, pcmsizea, TimerHandler, IRQHandler); 
} 
 
 
/*------------------------------------------------------ 
 
	YM2610エミュレーションの停止 
 
	引  数: なし 
	戻り値: 1:成功 0:失敗 
 
 -----------------------------------------------------*/ 
 
void YM2610_sh_stop(void) 
{ 
} 
 
 
/*------------------------------------------------------ 
 
	YM2610エミュレーションのリセット 
 
	引  数: なし 
	戻り値: なし 
 
 -----------------------------------------------------*/ 
 
void YM2610_sh_reset(void) 
{ 
	YM2610Reset(); 
} 
 
 
/*------------------------------------------------------ 
 
	YM2610の更新要求 
 
	引  数: なし 
	戻り値: なし 
 
 -----------------------------------------------------*/ 
 
void YM2610UpdateRequest(void) 
{ 
	stream_update(100); 
} 
 
 
/*------------------------------------------------------ 
 
	YM2610のポートリード 
 
	引  数: offs_t offset オフセット(未使用) 
	戻り値: ポートの値 
 
 -----------------------------------------------------*/ 
 
READ8_HANDLER( YM2610_status_port_A_r ) 
{ 
	return YM2610Read(0); 
} 
 
READ8_HANDLER( YM2610_status_port_B_r ) 
{ 
	return YM2610Read(2); 
} 
 
READ8_HANDLER( YM2610_read_port_r ) 
{ 
	return YM2610Read(1); 
} 
 
 
/*------------------------------------------------------ 
 
	YM2610のポートライト 
 
	引  数: offs_t offset オフセット(未使用) 
			UINT8 data    データ 
	戻り値: なし 
 
 -----------------------------------------------------*/ 
 
WRITE8_HANDLER( YM2610_control_port_A_w ) 
{ 
	YM2610Write(0, data); 
} 
 
WRITE8_HANDLER( YM2610_control_port_B_w ) 
{ 
	YM2610Write(2, data); 
} 
 
WRITE8_HANDLER( YM2610_data_port_A_w ) 
{ 
	YM2610Write(1, data); 
} 
 
WRITE8_HANDLER( YM2610_data_port_B_w ) 
{ 
	YM2610Write(3, data); 
} 
 
 
/*************************************************************************** 
	ローカル関数 
 ***************************************************************************/ 
 
/*------------------------------------------------------ 
 
	YM2610 IRQハンドラ 
 
	引  数: int irq  IRQ 
	戻り値: なし 
 
 -----------------------------------------------------*/ 
 
static void IRQHandler(int irq) 
{ 
	if (irq) 
		z80_set_irq_line(irq, ASSERT_LINE); 
	else 
		z80_set_irq_line(0, CLEAR_LINE); 
} 
 
 
/*------------------------------------------------------ 
 
	YM2610 タイマーコールバック関数 
 
	引  数: int param  タイマーの番号 
	戻り値: なし 
 
 -----------------------------------------------------*/ 
 
static void timer_callback_2610(int param) 
{ 
//	logerror("2610 TimerOver %d\n", param); 
	YM2610TimerOver(param); 
} 
 
 
/*------------------------------------------------------ 
 
	YM2610 タイマーハンドラ 
 
	引  数: int channel      タイマーの番号 
	        int count        タイマーを実行するカウント 
	        double stepTime  1カウントの時間 
	戻り値: なし 
 
 -----------------------------------------------------*/ 
 
static void TimerHandler(int channel, int count, double stepTime) 
{ 
	if (count == 0) 
	{ 
		/* Reset FM Timer */ 
//		logerror("2610 TimerReset %d\n", channel); 
		timer_enable(Timer[channel], 0); 
	} 
	else 
	{ 
		/* Start FM Timer */ 
		double timeSec = (double)count * stepTime; 
 
		if (!timer_enable(Timer[channel], 1)) 
			timer_adjust(Timer[channel], timeSec, channel, 0); 
	} 
}