/*	
 *	clipp62.h
 *
 *	P/ECE HuC6280-PSG Emulator
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2001-2004 Naoyuki Sawa
 *
 *	* Mon Feb 23 04:28:00 JST 2004 Naoyuki Sawa
 *	- 作成開始。
 *	* Wed Nov 18 21:37:53 JST 2015 Naoyuki Sawa
 *	- 'extern "C" {'〜'}'で囲みました。.cppを含むWin32プロジェクトからもインクルード出来るようにするためです。
 */
#ifndef __CLIP_P62_H__
#define __CLIP_P62_H__

#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus

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

/*
 *	HuC6280-PSGチャネル
 */
typedef struct _HUC6280PSGCHANNEL {
	unsigned char reg[6];		/* + 0, 6: $0802〜$0807の値を保持 */
	//
	unsigned char enable;		/* + 6, 1: チャネル  1:ON/0:OFF */
	unsigned char dda;		/* + 7, 1: DirectD/A 1:ON/0:OFF */
	unsigned char noise;		/* + 8, 1: ノイズ    1:ON/0:OFF (Ch4,5のみ) */
	unsigned char wave_index;	/* + 9, 1: 波形データ書き込みインデクス */
	//
	short volume;			/* +10, 2: ボリューム (14bit) */
	//
	int tone_period;		/* +12, 4: トーン周期 */
	int tone_progress;		/* +16, 4: トーン進行カウンタ */
	//
	int noise_period;		/* +20, 4: ノイズ周期 */
	int noise_progress;		/* +24, 4: ノイズ進行カウンタ */
	//
	unsigned short tone_index;	/* +28, 2: トーン波形インデクス */
	unsigned short noise_lfsr;	/* +30, 2: ノイズLFSR(Linear Feedback Shift Register) */
	//
	char wave[32];			/* +32,32: 波形データ (DDA時はwave[0]を出力) */
} HUC6280PSGCHANNEL;			/* =64 */

/*
 *	HuC6280-PSGコア
 */
typedef struct _HUC6280PSG {
	int channel_select;		/* 設定チャネル選択 */
	int main_volume;		/* メインボリューム (チャネルボリューム更新時のみ参照) */
	HUC6280PSGCHANNEL channel[6];	/* チャネル */
	//
	DDA clock_progress;		/* クロック進行DDA */
} HUC6280PSG;

/****************************************************************************
 *	内部関数
 ****************************************************************************/

void huc6280psg_update_volume(HUC6280PSG* psg, HUC6280PSGCHANNEL* channel);

int huc6280psg_process(HUC6280PSG* psg, int cycle);
int huc6280psg_channel_process(HUC6280PSG* psg, HUC6280PSGCHANNEL* channel, int cycle);

/****************************************************************************
 *	アプリケーション用関数
 ****************************************************************************/

/* HuC6280-PSGコアをリセットします。
 * [in]
 *	psg		HUC6280PSG構造体。
 *	clock		入力クロック。
 * [note]
 *	* アプリケーションプログラムは、少なくとも最初に一度、この関数を呼び出してください。
 *	  その後は、HuC6280-PSGリセットを行う場合に、必要に応じて呼び出してください。
 */
void huc6280psg_reset(HUC6280PSG* psg, int clock);

/* レジスタ値を書き込みます。
 * [in]
 *	psg		HUC6280PSG構造体。
 *	addr		レジスタアドレス。(0〜9)
 *	data		レジスタ値。
 */
void huc6280psg_write(HUC6280PSG* psg, int addr, unsigned char data);

/* 出力サンプリングレート=SPEAKER_OUTPUT[Hz]で、指定されたサンプル数のミキシングを行います。
 * [in]
 *	psg		HUC6280PSG構造体。
 *	wbuff		出力サンプルバッファ。
 *	count		出力サンプル数。
 */
void huc6280psg_mix(HUC6280PSG* psg, short wbuff[/*count*/], int count);

#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus

#endif /*__CLIP_P62_H__*/
