Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  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.