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_ */ 243