/*	
 *	clipsn7.h
 *
 *	P/ECE SN76489/SN76496(DCSG) Emulator
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2001-2005 Naoyuki Sawa
 *
 *	* Mon Jan 24 18:30:00 JST 2005 Naoyuki Sawa
 *	- 高速化のために大幅な改造を行いました。
 *	  VGM Player全体で2.5倍程度速くなったので、単体ではもっと速くなっていると思います。
 *	- 動作実績のある旧コードは keep/SN76489改造前保存-20050124.zip に保存してあります。
 *	* Wed Nov 18 21:37:53 JST 2015 Naoyuki Sawa
 *	- 'extern "C" {'〜'}'で囲みました。.cppを含むWin32プロジェクトからもインクルード出来るようにするためです。
 */
#ifndef __CLIP_SN7_H__
#define __CLIP_SN7_H__

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

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

/* Channel0..2: Tone */
typedef struct _SN76489TONE {
	int volume;		/* + 0,4: 音量 (小:0..15:大)   */
	int period;		/* + 4,4: 出力極性反転周期     */
	int progress;		/* + 8,4: 進行カウンタ         */
	int polarity;		/* +12,4: 出力極性 (0=正,1=負) */
} SN76489TONE;			/* =16 */

/* Channel3: Noise */
typedef struct _SN76489NOISE {
	int volume;		/* + 0,4: 音量 (小:0..15:大)                    */
	int period;		/* + 4,4: LFSRシフト周期                        */
	int progress;		/* + 8,4: 進行カウンタ                          */
	int lfsr;		/* +12,4: LFSR(Linear Feedback Shift Register)  */
				/*        LFSRのbit0が出力極性です (0:正,1:負)  */
	int fbtype;		/* +16,4: フィードバックタイプ                  */
				/*        0=周期ノイズ     (タップビット=0x1)   */
				/*        1=ホワイトノイズ (タップビット=0x9)   */
} SN76489NOISE;			/* =20 */

/* SN76489 Chip */
typedef struct _SN76489 {
	int clock;		/* + 0, 4: 入力クロック       */
	int i_channel;		/* + 4, 4: 設定チャネル番号   */
	SN76489TONE tone[3];	/* + 8,48: トーンチャネル0〜2 */
	SN76489NOISE noise;	/* +56,20: ノイズチャネル     */
} SN76489;			/* =76 */

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

void sn76489_tone_mix(SN76489* sn, SN76489TONE* tone, short wbuff[/*count*/], int count);
void sn76489_noise_mix(SN76489* sn, SN76489NOISE* noise, short wbuff[/*count*/], int count);
void sn76489_volume_shift(short wbuff[/*count*/], int count);

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

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

/* SN76489に1バイト書き込みます。
 * [in]
 *	sn		SN76489構造体。
 *	data		書き込むデータ。
 */
void sn76489_write(SN76489* sn, unsigned char data);

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

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

#endif /*__CLIP_SN7_H__*/
