fm.h
  1  
  2  #ifndef _H_FM_FM_
  3  #define _H_FM_FM_
  4  
  5  #define HAS_YM2612  1
  6  
  7  #define BUILD_YM2612  (HAS_YM2612 || HAS_YM3438)
  8  
  9  #define FM_STEREO_MIX       0
 10  #define FM_OUTPUT_BIT       16
 11  #define FM_INTERNAL_TIMER   0
 12  
 13  #define FM_LFO_SUPPORT      1
 14  #define FM_SEG_SUPPORT      0
 15  
 16  #if BUILD_YM2612
 17    /* in 2612intf.c */
 18    #define YM2612UpdateReq(chip) YM2612UpdateRequest(chip);
 19  #endif
 20  
 21  /* compiler dependence */
 22  #ifndef OSD_CPU_H
 23  #define OSD_CPU_H
 24  typedef unsigned char	UINT8;   /* unsigned  8bit */
 25  typedef unsigned short	UINT16;  /* unsigned 16bit */
 26  typedef unsigned int	UINT32;  /* unsigned 32bit */
 27  typedef signed char		INT8;    /* signed  8bit   */
 28  typedef signed short	INT16;   /* signed 16bit   */
 29  typedef signed int		INT32;   /* signed 32bit   */
 30  #endif
 31  
 32  #define YM2203_NUMBUF 1
 33  #if FM_STEREO_MIX
 34    #define YM2151_NUMBUF 1
 35    #define YM2608_NUMBUF 1
 36    #define YM2612_NUMBUF 1
 37    #define YM2610_NUMBUF 1
 38  #else
 39    #define YM2151_NUMBUF 2    /* FM L+R */
 40    #define YM2608_NUMBUF 2    /* FM L+R+ADPCM+RYTHM */
 41    #define YM2610_NUMBUF 2    /* FM L+R+ADPCMA+ADPCMB */
 42    #define YM2612_NUMBUF 2    /* FM L+R */
 43  #endif
 44  
 45  #if (FM_OUTPUT_BIT==16)
 46  typedef INT16 FMSAMPLE;
 47  typedef unsigned long FMSAMPLE_MIX;
 48  #endif
 49  #if (FM_OUTPUT_BIT==8)
 50  typedef unsigned char  FMSAMPLE;
 51  typedef unsigned short FMSAMPLE_MIX;
 52  #endif
 53  
 54  typedef void (*FM_TIMERHANDLER)(int n,int c,int cnt,double stepTime);
 55  typedef void (*FM_IRQHANDLER)(int n,int irq);
 56  /* FM_TIMERHANDLER : Stop or Start timer         */
 57  /* int n          = chip number                  */
 58  /* int c          = Channel 0=TimerA,1=TimerB    */
 59  /* int count      = timer count (0=stop)         */
 60  /* doube stepTime = step time of one count (sec.)*/
 61  
 62  /* FM_IRQHHANDLER : IRQ level changing sense     */
 63  /* int n       = chip number                     */
 64  /* int irq     = IRQ level 0=OFF,1=ON            */
 65  
 66  #if BUILD_YM2203
 67  /* -------------------- YM2203(OPN) Interface -------------------- */
 68  
 69  /*
 70  ** Initialize YM2203 emulator(s).
 71  **
 72  ** 'num'           is the number of virtual YM2203's to allocate
 73  ** 'baseclock'
 74  ** 'rate'          is sampling rate
 75  ** 'TimerHandler'  timer callback handler when timer start and clear
 76  ** 'IRQHandler'    IRQ callback handler when changed IRQ level
 77  ** return      0 = success
 78  */
 79  int YM2203Init(int num, int baseclock, int rate,
 80                 FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler);
 81  
 82  /*
 83  ** shutdown the YM2203 emulators .. make sure that no sound system stuff
 84  ** is touching our audio buffers ...
 85  */
 86  void YM2203Shutdown(void);
 87  
 88  /*
 89  ** reset all chip registers for YM2203 number 'num'
 90  */
 91  void YM2203ResetChip(int num);
 92  /*
 93  ** update one of chip
 94  */
 95  
 96  void YM2203UpdateOne(int num, INT16 *buffer, int length);
 97  
 98  /*
 99  ** Write
100  ** return : InterruptLevel
101  */
102  int YM2203Write(int n,int a,unsigned char v);
103  /*
104  ** Read
105  ** return : InterruptLevel
106  */
107  unsigned char YM2203Read(int n,int a);
108  
109  /*
110  **	Timer OverFlow
111  */
112  int YM2203TimerOver(int n, int c);
113  
114  #endif /* BUILD_YM2203 */
115  
116  #if BUILD_YM2608
117  /* -------------------- YM2608(OPNA) Interface -------------------- */
118  int YM2608Init(int num, int baseclock, int rate,
119                 void **pcmroma,int *pcmsizea,short *rhythmrom,int *rhythmpos,
120                 FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler);
121  void YM2608Shutdown(void);
122  void YM2608ResetChip(int num);
123  void YM2608UpdateOne(int num, INT16 **buffer, int length);
124  
125  int YM2608Write(int n, int a,unsigned char v);
126  unsigned char YM2608Read(int n,int a);
127  int YM2608TimerOver(int n, int c );
128  #endif /* BUILD_YM2608 */
129  
130  #if (BUILD_YM2610||BUILD_YM2610B)
131  /* -------------------- YM2610(OPNB) Interface -------------------- */
132  int YM2610Init(int num, int baseclock, int rate,
133                 void **pcmroma,int *pcmasize,void **pcmromb,int *pcmbsize,
134                 FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler);
135  void YM2610Shutdown(void);
136  void YM2610ResetChip(int num);
137  void YM2610UpdateOne(int num, INT16 **buffer, int length);
138  #if BUILD_YM2610B
139  void YM2610BUpdateOne(int num, INT16 **buffer, int length);
140  #endif
141  
142  int YM2610Write(int n, int a,unsigned char v);
143  unsigned char YM2610Read(int n,int a);
144  int YM2610TimerOver(int n, int c );
145  
146  #endif /* BUILD_YM2610 */
147  
148  #if BUILD_YM2612
149  int YM2612Init(int num, int baseclock, int rate,
150                 FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler);
151  void YM2612Shutdown(void);
152  void YM2612ResetChip(int num);
153  void YM2612UpdateOne(int num, INT16 **buffer, int length);
154  int YM2612Write(int n, int a,unsigned char v);
155  unsigned char YM2612Read(int n,int a);
156  int YM2612TimerOver(int n, int c );
157  
158  #endif /* BUILD_YM2612 */
159  
160  #if BUILD_YM2151
161  /* -------------------- YM2151(OPM) Interface -------------------- */
162  int OPMInit(int num, int baseclock, int rate,
163                 FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler);
164  void OPMShutdown(void);
165  void OPMResetChip(int num);
166  
167  void OPMUpdateOne(int num, INT16 **buffer, int length );
168  /* ---- set callback hander when port CT0/1 write ----- */
169  /* CT.bit0 = CT0 , CT.bit1 = CT1 */
170  /*
171  typedef void (*mem_write_handler)(int offset,int data);
172  */
173  void OPMSetPortHander(int n,mem_write_handler PortWrite);
174  /* JB 981119  - so it will match MAME's memory write functions scheme*/
175  
176  int YM2151Write(int n,int a,unsigned char v);
177  unsigned char YM2151Read(int n,int a);
178  int YM2151TimerOver(int n,int c);
179  #endif /* BUILD_YM2151 */
180  
181  #endif /* _H_FM_FM_ */