/*
  File: ym2612.h -- header file for software emuration for FM sound genelator

*/
#ifndef _H_YM2612_
#define _H_YM2612_

/* --- select emulation chips --- */
#define BUILD_YM2612  1

/* --- system optimize --- */
/* select stereo output buffer : mixing / separate */
#define FM_STEREO_MIX 0
/* select output size : 8bit or 16bit */
#define FM_OUTPUT_BIT 16

#define FM_INTERNAL_TIMER 0

/* --- speed optimize --- */
#define FM_LFO_SUPPORT 1 	/* support LFO unit */
#define FM_SEG_SUPPORT 0	/* OPN SSG type envelope support   */

/* --- external callback funstions for realtime update --- */
#if BUILD_YM2612
  /* in 2612intf.c */
  // dave change  #define YM2612UpdateReq(chip)
#endif

/* compiler dependence */
#ifndef OSD_CPU_H
#define OSD_CPU_H
typedef unsigned char	UINT8;   /* unsigned  8bit */
typedef unsigned short	UINT16;  /* unsigned 16bit */
typedef unsigned int	UINT32;  /* unsigned 32bit */
typedef signed char		INT8;    /* signed  8bit   */
typedef signed short	INT16;   /* signed 16bit   */
typedef signed int		INT32;   /* signed 32bit   */
#endif

#if FM_STEREO_MIX
  #define YM2612_NUMBUF 1
#else
  #define YM2612_NUMBUF 2    /* FM L+R */
#endif

#if (FM_OUTPUT_BIT==16)
typedef INT16 FMSAMPLE;
typedef unsigned long FMSAMPLE_MIX;
#endif
#if (FM_OUTPUT_BIT==8)
typedef unsigned char  FMSAMPLE;
typedef unsigned short FMSAMPLE_MIX;
#endif

typedef void (*FM_TIMERHANDLER)(int n,int c,int cnt,double stepTime);
typedef void (*FM_IRQHANDLER)(int n,int irq);
/* FM_TIMERHANDLER : Stop or Start timer         */
/* int n          = chip number                  */
/* int c          = Channel 0=TimerA,1=TimerB    */
/* int count      = timer count (0=stop)         */
/* doube stepTime = step time of one count (sec.)*/

/* FM_IRQHHANDLER : IRQ level changing sense     */
/* int n       = chip number                     */
/* int irq     = IRQ level 0=OFF,1=ON            */

#if BUILD_YM2612
int YM2612Init(int num, int baseclock, int rate,
               FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler);
void YM2612Shutdown(void);
void YM2612ResetChip(int num);
void YM2612UpdateOne(int num, INT16 **buffer, int length);
int YM2612Write(int n, int a,unsigned char v);
unsigned char YM2612Read(int n,int a);
int YM2612TimerOver(int n, int c );

#endif /* BUILD_YM2612 */

#endif /* _H_YM2612_ */
