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