1 /*
2   File: fm.h -- header file for software emulation for FM sound generator
3 
4 */
5 #ifndef _H_FM_FM_
6 #define _H_FM_FM_
7 
8 /* --- select emulation chips --- */
9 #define BUILD_YM2203  (HAS_YM2203)		/* build YM2203(OPN)   emulator */
10 #define BUILD_YM2608  (HAS_YM2608)		/* build YM2608(OPNA)  emulator */
11 #define BUILD_YM2610  (HAS_YM2610)		/* build YM2610(OPNB)  emulator */
12 #define BUILD_YM2610B (HAS_YM2610B)		/* build YM2610B(OPNB?)emulator */
13 #define BUILD_YM2612  (HAS_YM2612 || HAS_YM3438)		/* build YM2612(OPN2)  emulator */
14 
15 //#define BUILD_YM2151  (HAS_YM2151)		/* build YM2151(OPM)   emulator */
16 
17 /* select bit size of output : 8 or 16 */
18 #define FM_SAMPLE_BITS 16
19 
20 /* select timer system internal or external */
21 #define FM_INTERNAL_TIMER 0
22 
23 /* --- speedup optimize --- */
24 /* busy flag enulation , The definition of FM_GET_TIME_NOW() is necessary. */
25 #define FM_BUSY_FLAG_SUPPORT 1
26 
27 /* --- external SSG(YM2149/AY-3-8910)emulator interface port */
28 /* used by YM2203,YM2608,and YM2610 */
29 
30 /* SSGClk   : Set SSG Clock      */
31 /* int n    = chip number        */
32 /* int clk  = MasterClock(Hz)    */
33 /* int rate = sample rate(Hz) */
34 #define SSGClk(chip,clock) AY8910_set_clock((chip)+ay8910_index_ym,clock)
35 
36 /* SSGWrite : Write SSG port     */
37 /* int n    = chip number        */
38 /* int a    = address            */
39 /* int v    = data               */
40 #define SSGWrite(n,a,v) AY8910Write((n)+ay8910_index_ym,a,v)
41 
42 /* SSGRead  : Read SSG port */
43 /* int n    = chip number   */
44 /* return   = Read data     */
45 #define SSGRead(n) AY8910Read((n)+ay8910_index_ym)
46 
47 /* SSGReset : Reset SSG chip */
48 /* int n    = chip number   */
49 #define SSGReset(chip) AY8910Reset((chip)+ay8910_index_ym)
50 
51 
52 /* --- external callback funstions for realtime update --- */
53 
54 /* for busy flag emulation , function FM_GET_TIME_NOW() should */
55 /* return present time in seconds with "double" precision  */
56   /* in timer.c */
57   #define FM_GET_TIME_NOW() timer_get_time()
58 
59 #if BUILD_YM2203
60   /* in 2203intf.c */
61 void BurnYM2203UpdateRequest(void);
62   #define YM2203UpdateReq(chip) BurnYM2203UpdateRequest()
63 #endif
64 #if BUILD_YM2608
65   /* in 2608intf.c */
66 void BurnYM2608UpdateRequest(void);
67   #define YM2608UpdateReq(chip) BurnYM2608UpdateRequest()
68 #endif
69 #if BUILD_YM2610
70   /* in 2610intf.c */
71 void BurnYM2610UpdateRequest(void);
72 #define YM2610UpdateReq(chip) BurnYM2610UpdateRequest()
73 #endif
74 #if BUILD_YM2612
75   /* in 2612intf.c */
76 void BurnYM2612UpdateRequest(void);
77   #define YM2612UpdateReq(chip) BurnYM2612UpdateRequest()
78 #endif
79 #if 0 //BUILD_YM2151
80   /* in 2151intf.c */
81   #define YM2151UpdateReq(chip) YM2151UpdateRequest(chip);
82 #endif
83 
84 /* compiler dependence */
85 #if 0
86 #ifndef OSD_CPU_H
87 #define OSD_CPU_H
88 typedef unsigned char	UINT8;   /* unsigned  8bit */
89 typedef unsigned short	UINT16;  /* unsigned 16bit */
90 typedef unsigned int	UINT32;  /* unsigned 32bit */
91 typedef signed char		INT8;    /* signed  8bit   */
92 typedef signed short	INT16;   /* signed 16bit   */
93 typedef signed int		INT32;   /* signed 32bit   */
94 #endif
95 #endif
96 
97 #ifndef INLINE
98 #define INLINE static __inline__
99 #endif
100 
101 
102 
103 
104 
105 #if (FM_SAMPLE_BITS==16)
106 typedef INT16 FMSAMPLE;
107 #endif
108 #if (FM_SAMPLE_BITS==8)
109 typedef unsigned char  FMSAMPLE;
110 #endif
111 
112 typedef void (*FM_TIMERHANDLER)(int n,int c,int cnt,double stepTime);
113 typedef void (*FM_IRQHANDLER)(int n,int irq);
114 /* FM_TIMERHANDLER : Stop or Start timer         */
115 /* int n          = chip number                  */
116 /* int c          = Channel 0=TimerA,1=TimerB    */
117 /* int count      = timer count (0=stop)         */
118 /* doube stepTime = step time of one count (sec.)*/
119 
120 /* FM_IRQHHANDLER : IRQ level changing sense     */
121 /* int n       = chip number                     */
122 /* int irq     = IRQ level 0=OFF,1=ON            */
123 
124 //#if BUILD_YM2203
125 #if 1
126 /* -------------------- YM2203(OPN) Interface -------------------- */
127 
128 /*
129 ** Initialize YM2203 emulator(s).
130 **
131 ** 'num'           is the number of virtual YM2203's to allocate
132 ** 'baseclock'
133 ** 'rate'          is sampling rate
134 ** 'TimerHandler'  timer callback handler when timer start and clear
135 ** 'IRQHandler'    IRQ callback handler when changed IRQ level
136 ** return      0 = success
137 */
138 int YM2203Init(int num, int baseclock, int rate,
139                FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler);
140 
141 /*
142 ** shutdown the YM2203 emulators
143 */
144 void YM2203Shutdown(void);
145 
146 /*
147 ** reset all chip registers for YM2203 number 'num'
148 */
149 void YM2203ResetChip(int num);
150 
151 /*
152 ** update one of chip
153 */
154 void YM2203UpdateOne(int num, INT16 *buffer, int length);
155 
156 /*
157 ** Write
158 ** return : InterruptLevel
159 */
160 int YM2203Write(int n,int a,UINT8 v);
161 
162 /*
163 ** Read
164 ** return : InterruptLevel
165 */
166 UINT8 YM2203Read(int n,int a);
167 
168 /*
169 **	Timer OverFlow
170 */
171 int YM2203TimerOver(int n, int c);
172 
173 #endif /* BUILD_YM2203 */
174 
175 #if BUILD_YM2608
176 /* -------------------- YM2608(OPNA) Interface -------------------- */
177 int YM2608Init(int num, int baseclock, int rate,
178                void **pcmroma,int *pcmsizea, UINT8 *irom,
179                FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler);
180 void YM2608Shutdown(void);
181 void YM2608ResetChip(int num);
182 void YM2608UpdateOne(int num, INT16 **buffer, int length);
183 
184 int YM2608Write(int n, int a,UINT8 v);
185 UINT8 YM2608Read(int n,int a);
186 int YM2608TimerOver(int n, int c );
187 #endif /* BUILD_YM2608 */
188 
189 #if (BUILD_YM2610||BUILD_YM2610B)
190 /* -------------------- YM2610(OPNB) Interface -------------------- */
191 int YM2610Init(int num, int baseclock, int rate,
192                void **pcmroma,int *pcmasize,void **pcmromb,int *pcmbsize,
193                FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler);
194 void YM2610SetRom(int num,
195 				void *pcmroma,int pcmsizea,void *pcmromb,int pcmsizeb);
196 void YM2610Shutdown(void);
197 void YM2610ResetChip(int num);
198 void YM2610UpdateOne(int num, INT16 **buffer, int length);
199 #if BUILD_YM2610B
200 void YM2610BUpdateOne(int num, INT16 **buffer, int length);
201 #endif
202 
203 int YM2610Write(int n, int a,UINT8 v);
204 UINT8 YM2610Read(int n,int a);
205 int YM2610TimerOver(int n, int c );
206 #endif /* BUILD_YM2610 */
207 
208 #if BUILD_YM2612
209 int YM2612Init(int num, int baseclock, int rate,
210                FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler);
211 void YM2612Shutdown(void);
212 void YM2612ResetChip(int num);
213 void YM2612UpdateOne(int num, INT16 **buffer, int length);
214 
215 int YM2612Write(int n, int a,UINT8 v);
216 UINT8 YM2612Read(int n,int a);
217 int YM2612TimerOver(int n, int c );
218 #endif /* BUILD_YM2612 */
219 
220 #if 0 //BUILD_YM2151
221 /* -------------------- YM2151(OPM) Interface -------------------- */
222 int OPMInit(int num, int baseclock, int rate,
223                FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler);
224 void OPMShutdown(void);
225 void OPMResetChip(int num);
226 
227 void OPMUpdateOne(int num, INT16 **buffer, int length );
228 /* ---- set callback hander when port CT0/1 write ----- */
229 /* CT.bit0 = CT0 , CT.bit1 = CT1 */
230 /*
231 typedef void (*write8_handler)(int offset,int data);
232 */
233 void OPMSetPortHander(int n,write8_handler PortWrite);
234 /* JB 981119  - so it will match MAME's memory write functions scheme*/
235 
236 int YM2151Write(int n,int a,unsigned char v);
237 unsigned char YM2151Read(int n,int a);
238 int YM2151TimerOver(int n,int c);
239 #endif /* BUILD_YM2151 */
240 
241 #endif /* _H_FM_FM_ */
242