DGen/SDL
Main Page
Related Pages
Classes
Files
File List
File Members
All
Classes
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Pages
fm.h
Go to the documentation of this file.
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_ */
Generated on Sat Feb 9 2013 21:30:13 for DGen/SDL by
1.8.1.1