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);
}
}