summaryrefslogtreecommitdiffstatshomepage
path: root/trunk/src/emu/sound/fm.h
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/src/emu/sound/fm.h')
-rw-r--r--trunk/src/emu/sound/fm.h214
1 files changed, 214 insertions, 0 deletions
diff --git a/trunk/src/emu/sound/fm.h b/trunk/src/emu/sound/fm.h
new file mode 100644
index 00000000000..120ca9bdea8
--- /dev/null
+++ b/trunk/src/emu/sound/fm.h
@@ -0,0 +1,214 @@
+/*
+ File: fm.h -- header file for software emulation for FM sound generator
+
+*/
+
+#pragma once
+
+#ifndef __FM_H__
+#define __FM_H__
+
+/* --- select emulation chips --- */
+#define BUILD_YM2203 (1) /* build YM2203(OPN) emulator */
+#define BUILD_YM2608 (1) /* build YM2608(OPNA) emulator */
+#define BUILD_YM2610 (1) /* build YM2610(OPNB) emulator */
+#define BUILD_YM2610B (1) /* build YM2610B(OPNB?)emulator */
+#define BUILD_YM2612 (1) /* build YM2612(OPN2) emulator */
+#define BUILD_YM3438 (1) /* build YM3438(OPN) emulator */
+
+/* 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 1
+
+/* --- external SSG(YM2149/AY-3-8910)emulator interface port */
+/* used by YM2203,YM2608,and YM2610 */
+typedef struct _ssg_callbacks ssg_callbacks;
+struct _ssg_callbacks
+{
+ void (*set_clock)(void *param, int clock);
+ void (*write)(void *param, int address, int data);
+ int (*read)(void *param);
+ void (*reset)(void *param);
+};
+
+/* --- external callback funstions for realtime update --- */
+
+#if FM_BUSY_FLAG_SUPPORT
+#define TIME_TYPE attotime
+#define UNDEFINED_TIME attotime::zero
+#define FM_GET_TIME_NOW(machine) (machine)->time()
+#define ADD_TIMES(t1, t2) ((t1) + (t2))
+#define COMPARE_TIMES(t1, t2) (((t1) == (t2)) ? 0 : ((t1) < (t2)) ? -1 : 1)
+#define MULTIPLY_TIME_BY_INT(t,i) ((t) * (i))
+#endif
+
+#if BUILD_YM2203
+ /* in 2203intf.c */
+ void ym2203_update_request(void *param);
+ #define ym2203_update_req(chip) ym2203_update_request(chip)
+#endif /* BUILD_YM2203 */
+
+#if BUILD_YM2608
+ /* in 2608intf.c */
+ void ym2608_update_request(void *param);
+ #define ym2608_update_req(chip) ym2608_update_request(chip);
+#endif /* BUILD_YM2608 */
+
+#if (BUILD_YM2610||BUILD_YM2610B)
+ /* in 2610intf.c */
+ void ym2610_update_request(void *param);
+ #define ym2610_update_req(chip) ym2610_update_request(chip);
+#endif /* (BUILD_YM2610||BUILD_YM2610B) */
+
+#if (BUILD_YM2612||BUILD_YM3438)
+ /* in 2612intf.c */
+ void ym2612_update_request(void *param);
+ #define ym2612_update_req(chip) ym2612_update_request(chip);
+#endif /* (BUILD_YM2612||BUILD_YM3438) */
+
+/* compiler dependence */
+#if 0
+#ifndef OSD_CPU_H
+#define OSD_CPU_H
+typedef unsigned char UINT8; /* unsigned 8bit */
+typedef unsigned short UINT16; /* unsigned 16bit */
+typedef unsigned int UINT32; /* unsigned 32bit */
+typedef signed char INT8; /* signed 8bit */
+typedef signed short INT16; /* signed 16bit */
+typedef signed int INT32; /* signed 32bit */
+#endif /* OSD_CPU_H */
+#endif
+
+
+
+typedef stream_sample_t FMSAMPLE;
+/*
+#if (FM_SAMPLE_BITS==16)
+typedef INT16 FMSAMPLE;
+#endif
+#if (FM_SAMPLE_BITS==8)
+typedef unsigned char FMSAMPLE;
+#endif
+*/
+
+typedef void (*FM_TIMERHANDLER)(void *param,int c,int cnt,int clock);
+typedef void (*FM_IRQHANDLER)(void *param,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
+/* -------------------- 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
+*/
+void * ym2203_init(void *param, device_t *device, int baseclock, int rate,
+ FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler, const ssg_callbacks *ssg);
+
+/*
+** shutdown the YM2203 emulators
+*/
+void ym2203_shutdown(void *chip);
+
+/*
+** reset all chip registers for YM2203 number 'num'
+*/
+void ym2203_reset_chip(void *chip);
+
+/*
+** update one of chip
+*/
+void ym2203_update_one(void *chip, FMSAMPLE *buffer, int length);
+
+/*
+** Write
+** return : InterruptLevel
+*/
+int ym2203_write(void *chip,int a,unsigned char v);
+
+/*
+** Read
+** return : InterruptLevel
+*/
+unsigned char ym2203_read(void *chip,int a);
+
+/*
+** Timer OverFlow
+*/
+int ym2203_timer_over(void *chip, int c);
+
+/*
+** State Save
+*/
+void ym2203_postload(void *chip);
+#endif /* BUILD_YM2203 */
+
+#if BUILD_YM2608
+/* -------------------- YM2608(OPNA) Interface -------------------- */
+void * ym2608_init(void *param, device_t *device, int baseclock, int rate,
+ void *pcmroma,int pcmsizea,
+ FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler, const ssg_callbacks *ssg);
+void ym2608_shutdown(void *chip);
+void ym2608_reset_chip(void *chip);
+void ym2608_update_one(void *chip, FMSAMPLE **buffer, int length);
+
+int ym2608_write(void *chip, int a,unsigned char v);
+unsigned char ym2608_read(void *chip,int a);
+int ym2608_timer_over(void *chip, int c );
+void ym2608_postload(void *chip);
+#endif /* BUILD_YM2608 */
+
+#if (BUILD_YM2610||BUILD_YM2610B)
+/* -------------------- YM2610(OPNB) Interface -------------------- */
+void * ym2610_init(void *param, device_t *device, int baseclock, int rate,
+ void *pcmroma,int pcmasize,void *pcmromb,int pcmbsize,
+ FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler, const ssg_callbacks *ssg);
+void ym2610_shutdown(void *chip);
+void ym2610_reset_chip(void *chip);
+void ym2610_update_one(void *chip, FMSAMPLE **buffer, int length);
+
+#if BUILD_YM2610B
+void ym2610b_update_one(void *chip, FMSAMPLE **buffer, int length);
+#endif /* BUILD_YM2610B */
+
+int ym2610_write(void *chip, int a,unsigned char v);
+unsigned char ym2610_read(void *chip,int a);
+int ym2610_timer_over(void *chip, int c );
+void ym2610_postload(void *chip);
+#endif /* (BUILD_YM2610||BUILD_YM2610B) */
+
+#if (BUILD_YM2612||BUILD_YM3438)
+void * ym2612_init(void *param, device_t *device, int baseclock, int rate,
+ FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler);
+void ym2612_shutdown(void *chip);
+void ym2612_reset_chip(void *chip);
+void ym2612_update_one(void *chip, FMSAMPLE **buffer, int length);
+
+int ym2612_write(void *chip, int a,unsigned char v);
+unsigned char ym2612_read(void *chip,int a);
+int ym2612_timer_over(void *chip, int c );
+void ym2612_postload(void *chip);
+#endif /* (BUILD_YM2612||BUILD_YM3438) */
+
+
+#endif /* __FM_H__ */