Add VCS links
[debian-dgen.git] / fm.h
blobd3c12011a1bb66c46b1ae96c3ed0791c05269b89
1 /*
2 File: fm.h -- header file for software emulation for FM sound generator
4 */
5 #ifndef _H_FM_FM_
6 #define _H_FM_FM_
8 #include <stdint.h>
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 */
17 //#define BUILD_YM2151 (HAS_YM2151) /* build YM2151(OPM) emulator */
19 #define FM_SSG_PRESCALER 0
21 /* select bit size of output : 8 or 16 */
22 #define FM_SAMPLE_BITS 16
24 /* select timer system internal or external */
25 #define FM_INTERNAL_TIMER 0
27 /* --- speedup optimize --- */
28 /* busy flag enulation , The definition of FM_GET_TIME_NOW() is necessary. */
29 #define FM_BUSY_FLAG_SUPPORT 0
31 /* --- external SSG(YM2149/AY-3-8910)emulator interface port */
32 /* used by YM2203,YM2608,and YM2610 */
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)
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)
46 /* SSGRead : Read SSG port */
47 /* int n = chip number */
48 /* return = Read data */
49 #define SSGRead(n) AY8910Read((n)+ay8910_index_ym)
51 /* SSGReset : Reset SSG chip */
52 /* int n = chip number */
53 #define SSGReset(chip) AY8910Reset((chip)+ay8910_index_ym)
56 /* --- external callback funstions for realtime update --- */
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()
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
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 */
100 #define INLINE static inline
102 #if (FM_SAMPLE_BITS==16)
103 typedef INT16 FMSAMPLE;
104 #endif
105 #if (FM_SAMPLE_BITS==8)
106 typedef UINT8 FMSAMPLE;
107 #endif
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.)*/
117 /* FM_IRQHHANDLER : IRQ level changing sense */
118 /* int n = chip number */
119 /* int irq = IRQ level 0=OFF,1=ON */
121 //#if BUILD_YM2203
122 #if 1
123 /* -------------------- YM2203(OPN) Interface -------------------- */
126 ** Initialize YM2203 emulator(s).
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
135 int YM2203Init(int num, int baseclock, int rate,
136 FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler);
139 ** shutdown the YM2203 emulators
141 void YM2203Shutdown(void);
144 ** reset all chip registers for YM2203 number 'num'
146 void YM2203ResetChip(int num);
149 ** update one of chip
151 void YM2203UpdateOne(int num, INT16 *buffer, int length);
154 ** Write
155 ** return : InterruptLevel
157 int YM2203Write(int n,int a,unsigned char v);
160 ** Read
161 ** return : InterruptLevel
163 unsigned char YM2203Read(int n,int a);
166 ** Timer OverFlow
168 int YM2203TimerOver(int n, int c);
170 #endif /* BUILD_YM2203 */
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);
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 */
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
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 */
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);
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 );
217 void YM2612_dump(int num, uint8_t buf[512]);
218 void YM2612_restore(int num, uint8_t buf[512]);
219 #endif /* BUILD_YM2612 */
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);
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 */
232 typedef void (*write8_handler)(int offset,int data);
234 void OPMSetPortHander(int n,write8_handler PortWrite);
235 /* JB 981119 - so it will match MAME's memory write functions scheme*/
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 */
242 #endif /* _H_FM_FM_ */