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