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