1 /*
2   File: fm.h -- header file for software emuration for FM sound genelator
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 #define BUILD_YM2151  (HAS_YM2151)		/* build YM2151(OPM)   emulator */
15 
16 /* --- system optimize --- */
17 /* select stereo output buffer : 1=mixing / 0=separate */
18 #define FM_STEREO_MIX 0
19 /* select bit size of output : 8 or 16 */
20 #define FM_OUTPUT_BIT 16
21 /* select timer system internal or external */
22 #define FM_INTERNAL_TIMER 0
23 
24 /* --- speedup optimize --- */
25 /* support LFO unit */
26 #define FM_LFO_SUPPORT 1
27 /* support OPN SSG type envelope mode */
28 #define FM_SEG_SUPPORT 0
29 
30 /* --- external SSG(YM2149/AY-3-8910)emulator interface port */
31 /* used by YM2203,YM2608,and YM2610 */
32 
33 /* SSGClk   : Set SSG Clock      */
34 /* int n    = chip number        */
35 /* int clk  = MasterClock(Hz)    */
36 /* int rate = sample rate(Hz) */
37 #define SSGClk(chip,clock) AY8910_set_clock(chip,clock)
38 
39 /* SSGWrite : Write SSG port     */
40 /* int n    = chip number        */
41 /* int a    = address            */
42 /* int v    = data               */
43 #define SSGWrite(n,a,v) AY8910Write(n,a,v)
44 
45 /* SSGRead  : Read SSG port */
46 /* int n    = chip number   */
47 /* return   = Read data     */
48 #define SSGRead(n) AY8910Read(n)
49 
50 /* SSGReset : Reset SSG chip */
51 /* int n    = chip number   */
52 #define SSGReset(chip) AY8910_reset(chip)
53 
54 /* --- external callback funstions for realtime update --- */
55 #if BUILD_YM2203
56   /* in 2203intf.c */
57   #define YM2203UpdateReq(chip) YM2203UpdateRequest(chip)
58 #endif
59 #if BUILD_YM2608
60   /* in 2608intf.c */
61   #define YM2608UpdateReq(chip) YM2608UpdateRequest(chip);
62 #endif
63 #if BUILD_YM2610
64   /* in 2610intf.c */
65   #define YM2610UpdateReq(chip) YM2610UpdateRequest(chip);
66 #endif
67 #if BUILD_YM2612
68   /* in 2612intf.c */
69   #define YM2612UpdateReq(chip) YM2612UpdateRequest(chip);
70 #endif
71 #if BUILD_YM2151
72   /* in 2151intf.c */
73   #define YM2151UpdateReq(chip) YM2151UpdateRequest(chip);
74 #endif
75 
76 /* compiler dependence */
77 #ifndef OSD_CPU_H
78 #define OSD_CPU_H
79 typedef unsigned char	UINT8;   /* unsigned  8bit */
80 typedef unsigned short	UINT16;  /* unsigned 16bit */
81 typedef unsigned int	UINT32;  /* unsigned 32bit */
82 typedef signed char		INT8;    /* signed  8bit   */
83 typedef signed short	INT16;   /* signed 16bit   */
84 typedef signed int		INT32;   /* signed 32bit   */
85 #endif
86 
87 #define YM2203_NUMBUF 1
88 #if FM_STEREO_MIX
89   #define YM2151_NUMBUF 1
90   #define YM2608_NUMBUF 1
91   #define YM2612_NUMBUF 1
92   #define YM2610_NUMBUF 1
93 #else
94   #define YM2151_NUMBUF 2    /* FM L+R */
95   #define YM2608_NUMBUF 2    /* FM L+R+ADPCM+RYTHM */
96   #define YM2610_NUMBUF 2    /* FM L+R+ADPCMA+ADPCMB */
97   #define YM2612_NUMBUF 2    /* FM L+R */
98 #endif
99 
100 #if (FM_OUTPUT_BIT==16)
101 typedef INT16 FMSAMPLE;
102 typedef unsigned long FMSAMPLE_MIX;
103 #endif
104 #if (FM_OUTPUT_BIT==8)
105 typedef unsigned char  FMSAMPLE;
106 typedef unsigned short FMSAMPLE_MIX;
107 #endif
108 
109 typedef void (*FM_TIMERHANDLER)(int n,int c,int cnt,timer_tm 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 /* -------------------- YM2203(OPN) Interface -------------------- */
123 
124 /*
125 ** Initialize YM2203 emulator(s).
126 **
127 ** 'num'           is the number of virtual YM2203's to allocate
128 ** 'baseclock'
129 ** 'rate'          is sampling rate
130 ** 'TimerHandler'  timer callback handler when timer start and clear
131 ** 'IRQHandler'    IRQ callback handler when changed IRQ level
132 ** return      0 = success
133 */
134 int YM2203Init(int num, int baseclock, int rate,
135                FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler);
136 
137 /*
138 ** shutdown the YM2203 emulators .. make sure that no sound system stuff
139 ** is touching our audio buffers ...
140 */
141 void YM2203Shutdown(void);
142 
143 /*
144 ** reset all chip registers for YM2203 number 'num'
145 */
146 void YM2203ResetChip(int num);
147 /*
148 ** update one of chip
149 */
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 ** Read
160 ** return : InterruptLevel
161 */
162 unsigned char YM2203Read(int n,int a);
163 
164 /*
165 **	Timer OverFlow
166 */
167 int YM2203TimerOver(int n, int c);
168 
169 #endif /* BUILD_YM2203 */
170 
171 #if BUILD_YM2608
172 /* -------------------- YM2608(OPNA) Interface -------------------- */
173 int YM2608Init(int num, int baseclock, int rate,
174                void **pcmroma,int *pcmsizea,short *rhythmrom,int *rhythmpos,
175                FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler);
176 void YM2608Shutdown(void);
177 void YM2608ResetChip(int num);
178 void YM2608UpdateOne(int num, INT16 **buffer, int length);
179 
180 int YM2608Write(int n, int a,unsigned char v);
181 unsigned char YM2608Read(int n,int a);
182 int YM2608TimerOver(int n, int c );
183 #endif /* BUILD_YM2608 */
184 
185 #if (BUILD_YM2610||BUILD_YM2610B)
186 /* -------------------- YM2610(OPNB) Interface -------------------- */
187 int YM2610Init(int num, int baseclock, int rate,
188                void **pcmroma,int *pcmasize,void **pcmromb,int *pcmbsize,
189                FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler);
190 void YM2610Shutdown(void);
191 void YM2610ResetChip(int num);
192 void YM2610UpdateOne(int num, INT16 **buffer, int length);
193 #if BUILD_YM2610B
194 void YM2610BUpdateOne(int num, INT16 **buffer, int length);
195 #endif
196 
197 int YM2610Write(int n, int a,unsigned char v);
198 unsigned char YM2610Read(int n,int a);
199 int YM2610TimerOver(int n, int c );
200 
201 #endif /* BUILD_YM2610 */
202 
203 #if BUILD_YM2612
204 int YM2612Init(int num, int baseclock, int rate,
205                FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler);
206 void YM2612Shutdown(void);
207 void YM2612ResetChip(int num);
208 void YM2612UpdateOne(int num, INT16 **buffer, int length);
209 int YM2612Write(int n, int a,unsigned char v);
210 unsigned char YM2612Read(int n,int a);
211 int YM2612TimerOver(int n, int c );
212 
213 #endif /* BUILD_YM2612 */
214 
215 #if BUILD_YM2151
216 /* -------------------- YM2151(OPM) Interface -------------------- */
217 int OPMInit(int num, int baseclock, int rate,
218                FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler);
219 void OPMShutdown(void);
220 void OPMResetChip(int num);
221 
222 void OPMUpdateOne(int num, INT16 **buffer, int length );
223 /* ---- set callback hander when port CT0/1 write ----- */
224 /* CT.bit0 = CT0 , CT.bit1 = CT1 */
225 /*
226 typedef void (*mem_write_handler)(int offset,int data);
227 */
228 void OPMSetPortHander(int n,mem_write_handler PortWrite);
229 /* JB 981119  - so it will match MAME's memory write functions scheme*/
230 
231 int YM2151Write(int n,int a,unsigned char v);
232 unsigned char YM2151Read(int n,int a);
233 int YM2151TimerOver(int n,int c);
234 #endif /* BUILD_YM2151 */
235 
236 #endif /* _H_FM_FM_ */
237