ea1a60faa3
git-svn-id: svn://kolibrios.org@9837 a494cfbc-eb01-0410-851d-a64ba20cac60
243 lines
7.1 KiB
C
243 lines
7.1 KiB
C
/*
|
|
File: fm.h -- header file for software emulation for FM sound generator
|
|
|
|
*/
|
|
#ifndef _H_FM_FM_
|
|
#define _H_FM_FM_
|
|
|
|
#include <stdint.h>
|
|
|
|
/* --- select emulation chips --- */
|
|
#define BUILD_YM2203 (HAS_YM2203) /* build YM2203(OPN) emulator */
|
|
#define BUILD_YM2608 (HAS_YM2608) /* build YM2608(OPNA) emulator */
|
|
#define BUILD_YM2610 (HAS_YM2610) /* build YM2610(OPNB) emulator */
|
|
#define BUILD_YM2610B (HAS_YM2610B) /* build YM2610B(OPNB?)emulator */
|
|
#define BUILD_YM2612 1 /* build YM2612(OPN2) emulator */
|
|
|
|
//#define BUILD_YM2151 (HAS_YM2151) /* build YM2151(OPM) emulator */
|
|
|
|
#define FM_SSG_PRESCALER 0
|
|
|
|
/* select bit size of output : 8 or 16 */
|
|
#define FM_SAMPLE_BITS 16
|
|
|
|
/* select timer system internal or external */
|
|
#define FM_INTERNAL_TIMER 0
|
|
|
|
/* --- speedup optimize --- */
|
|
/* busy flag enulation , The definition of FM_GET_TIME_NOW() is necessary. */
|
|
#define FM_BUSY_FLAG_SUPPORT 0
|
|
|
|
/* --- external SSG(YM2149/AY-3-8910)emulator interface port */
|
|
/* used by YM2203,YM2608,and YM2610 */
|
|
|
|
/* SSGClk : Set SSG Clock */
|
|
/* int n = chip number */
|
|
/* int clk = MasterClock(Hz) */
|
|
/* int rate = sample rate(Hz) */
|
|
#define SSGClk(chip,clock) AY8910_set_clock((chip)+ay8910_index_ym,clock)
|
|
|
|
/* SSGWrite : Write SSG port */
|
|
/* int n = chip number */
|
|
/* int a = address */
|
|
/* int v = data */
|
|
#define SSGWrite(n,a,v) AY8910Write((n)+ay8910_index_ym,a,v)
|
|
|
|
/* SSGRead : Read SSG port */
|
|
/* int n = chip number */
|
|
/* return = Read data */
|
|
#define SSGRead(n) AY8910Read((n)+ay8910_index_ym)
|
|
|
|
/* SSGReset : Reset SSG chip */
|
|
/* int n = chip number */
|
|
#define SSGReset(chip) AY8910Reset((chip)+ay8910_index_ym)
|
|
|
|
|
|
/* --- external callback funstions for realtime update --- */
|
|
|
|
/* for busy flag emulation , function FM_GET_TIME_NOW() should */
|
|
/* return present time in seconds with "double" precision */
|
|
/* in timer.c */
|
|
#define FM_GET_TIME_NOW() timer_get_time()
|
|
|
|
#if 0
|
|
#if BUILD_YM2203
|
|
/* in 2203intf.c */
|
|
void BurnYM2203UpdateRequest(void);
|
|
#define YM2203UpdateReq(chip) BurnYM2203UpdateRequest()
|
|
#endif
|
|
#if BUILD_YM2608
|
|
/* in 2608intf.c */
|
|
void BurnYM2608UpdateRequest(void);
|
|
#define YM2608UpdateReq(chip) BurnYM2608UpdateRequest()
|
|
#endif
|
|
#if BUILD_YM2610
|
|
/* in 2610intf.c */
|
|
void BurnYM2610UpdateRequest(void);
|
|
#define YM2610UpdateReq(chip) BurnYM2610UpdateRequest()
|
|
#endif
|
|
#if BUILD_YM2612
|
|
/* in 2612intf.c */
|
|
void BurnYM2612UpdateRequest(void);
|
|
#define YM2612UpdateReq(chip) BurnYM2612UpdateRequest()
|
|
#endif
|
|
#if 0 //BUILD_YM2151
|
|
/* in 2151intf.c */
|
|
#define YM2151UpdateReq(chip) YM2151UpdateRequest(chip);
|
|
#endif
|
|
#else
|
|
#define YM2612UpdateReq(chip) (void)0
|
|
#endif
|
|
|
|
/* compiler dependence */
|
|
typedef uint8_t UINT8; /* unsigned 8bit */
|
|
typedef uint16_t UINT16; /* unsigned 16bit */
|
|
typedef uint32_t UINT32; /* unsigned 32bit */
|
|
typedef int8_t INT8; /* signed 8bit */
|
|
typedef int16_t INT16; /* signed 16bit */
|
|
typedef int32_t INT32; /* signed 32bit */
|
|
|
|
#define INLINE static inline
|
|
|
|
#if (FM_SAMPLE_BITS==16)
|
|
typedef INT16 FMSAMPLE;
|
|
#endif
|
|
#if (FM_SAMPLE_BITS==8)
|
|
typedef UINT8 FMSAMPLE;
|
|
#endif
|
|
|
|
typedef void (*FM_TIMERHANDLER)(int n,int c,int cnt,double stepTime);
|
|
typedef void (*FM_IRQHANDLER)(int n,int irq);
|
|
/* FM_TIMERHANDLER : Stop or Start timer */
|
|
/* int n = chip number */
|
|
/* int c = Channel 0=TimerA,1=TimerB */
|
|
/* int count = timer count (0=stop) */
|
|
/* doube stepTime = step time of one count (sec.)*/
|
|
|
|
/* FM_IRQHHANDLER : IRQ level changing sense */
|
|
/* int n = chip number */
|
|
/* int irq = IRQ level 0=OFF,1=ON */
|
|
|
|
//#if BUILD_YM2203
|
|
#if 1
|
|
/* -------------------- YM2203(OPN) Interface -------------------- */
|
|
|
|
/*
|
|
** Initialize YM2203 emulator(s).
|
|
**
|
|
** 'num' is the number of virtual YM2203's to allocate
|
|
** 'baseclock'
|
|
** 'rate' is sampling rate
|
|
** 'TimerHandler' timer callback handler when timer start and clear
|
|
** 'IRQHandler' IRQ callback handler when changed IRQ level
|
|
** return 0 = success
|
|
*/
|
|
int YM2203Init(int num, int baseclock, int rate,
|
|
FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler);
|
|
|
|
/*
|
|
** shutdown the YM2203 emulators
|
|
*/
|
|
void YM2203Shutdown(void);
|
|
|
|
/*
|
|
** reset all chip registers for YM2203 number 'num'
|
|
*/
|
|
void YM2203ResetChip(int num);
|
|
|
|
/*
|
|
** update one of chip
|
|
*/
|
|
void YM2203UpdateOne(int num, INT16 *buffer, int length);
|
|
|
|
/*
|
|
** Write
|
|
** return : InterruptLevel
|
|
*/
|
|
int YM2203Write(int n,int a,unsigned char v);
|
|
|
|
/*
|
|
** Read
|
|
** return : InterruptLevel
|
|
*/
|
|
unsigned char YM2203Read(int n,int a);
|
|
|
|
/*
|
|
** Timer OverFlow
|
|
*/
|
|
int YM2203TimerOver(int n, int c);
|
|
|
|
#endif /* BUILD_YM2203 */
|
|
|
|
#if BUILD_YM2608
|
|
/* -------------------- YM2608(OPNA) Interface -------------------- */
|
|
int YM2608Init(int num, int baseclock, int rate,
|
|
void **pcmroma,int *pcmsizea,
|
|
FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler);
|
|
void YM2608Shutdown(void);
|
|
void YM2608ResetChip(int num);
|
|
void YM2608UpdateOne(int num, INT16 **buffer, int length);
|
|
|
|
int YM2608Write(int n, int a,unsigned char v);
|
|
unsigned char YM2608Read(int n,int a);
|
|
int YM2608TimerOver(int n, int c );
|
|
#endif /* BUILD_YM2608 */
|
|
|
|
#if (BUILD_YM2610||BUILD_YM2610B)
|
|
/* -------------------- YM2610(OPNB) Interface -------------------- */
|
|
int YM2610Init(int num, int baseclock, int rate,
|
|
void **pcmroma,int *pcmasize,void **pcmromb,int *pcmbsize,
|
|
FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler);
|
|
void YM2610SetRom(int num,
|
|
void *pcmroma,int pcmsizea,void *pcmromb,int pcmsizeb);
|
|
void YM2610Shutdown(void);
|
|
void YM2610ResetChip(int num);
|
|
void YM2610UpdateOne(int num, INT16 **buffer, int length);
|
|
#if BUILD_YM2610B
|
|
void YM2610BUpdateOne(int num, INT16 **buffer, int length);
|
|
#endif
|
|
|
|
int YM2610Write(int n, int a,unsigned char v);
|
|
unsigned char YM2610Read(int n,int a);
|
|
int YM2610TimerOver(int n, int c );
|
|
#endif /* BUILD_YM2610 */
|
|
|
|
#if BUILD_YM2612
|
|
int YM2612Init(int num, int baseclock, int rate, int mjazz,
|
|
FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler);
|
|
void YM2612Shutdown(void);
|
|
void YM2612ResetChip(int num);
|
|
void YM2612UpdateOne(int num, INT16 *buffer, unsigned int length,
|
|
unsigned int volume, int loud);
|
|
|
|
int YM2612Write(int n, int a,unsigned char v);
|
|
unsigned char YM2612Read(int n,int a);
|
|
int YM2612TimerOver(int n, int c );
|
|
|
|
void YM2612_dump(int num, uint8_t buf[512]);
|
|
void YM2612_restore(int num, uint8_t buf[512]);
|
|
#endif /* BUILD_YM2612 */
|
|
|
|
#if 0 //BUILD_YM2151
|
|
/* -------------------- YM2151(OPM) Interface -------------------- */
|
|
int OPMInit(int num, int baseclock, int rate,
|
|
FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler);
|
|
void OPMShutdown(void);
|
|
void OPMResetChip(int num);
|
|
|
|
void OPMUpdateOne(int num, INT16 **buffer, int length );
|
|
/* ---- set callback hander when port CT0/1 write ----- */
|
|
/* CT.bit0 = CT0 , CT.bit1 = CT1 */
|
|
/*
|
|
typedef void (*write8_handler)(int offset,int data);
|
|
*/
|
|
void OPMSetPortHander(int n,write8_handler PortWrite);
|
|
/* JB 981119 - so it will match MAME's memory write functions scheme*/
|
|
|
|
int YM2151Write(int n,int a,unsigned char v);
|
|
unsigned char YM2151Read(int n,int a);
|
|
int YM2151TimerOver(int n,int c);
|
|
#endif /* BUILD_YM2151 */
|
|
|
|
#endif /* _H_FM_FM_ */
|