OpenXcom  1.0
Open-source clone of the original X-Com
fmopl.h
1 #pragma once
2 
3 /* --- select emulation chips --- */
4 #define BUILD_YM3812 (HAS_YM3812)
5 //#define BUILD_YM3526 (HAS_YM3526)
6 //#define BUILD_Y8950 (HAS_Y8950)
7 
8 /* --- system optimize --- */
9 /* select bit size of output : 8 or 16 */
10 #define OPL_OUTPUT_BIT 16
11 
12 /* compiler dependence */
13 #ifndef OSD_CPU_H
14 #define OSD_CPU_H
15 typedef unsigned char UINT8; /* unsigned 8bit */
16 typedef unsigned short UINT16; /* unsigned 16bit */
17 typedef unsigned int UINT32; /* unsigned 32bit */
18 typedef signed char INT8; /* signed 8bit */
19 typedef signed short INT16; /* signed 16bit */
20 typedef signed int INT32; /* signed 32bit */
21 #endif
22 
23 #if (OPL_OUTPUT_BIT==16)
24 typedef INT16 OPLSAMPLE;
25 #endif
26 #if (OPL_OUTPUT_BIT==8)
27 typedef unsigned char OPLSAMPLE;
28 #endif
29 
30 
31 #if BUILD_Y8950
32 #include "ymdeltat.h"
33 #endif
34 
35 typedef void (*OPL_TIMERHANDLER)(int channel,double interval_Sec);
36 typedef void (*OPL_IRQHANDLER)(int param,int irq);
37 typedef void (*OPL_UPDATEHANDLER)(int param,int min_interval_us);
38 typedef void (*OPL_PORTHANDLER_W)(int param,unsigned char data);
39 typedef unsigned char (*OPL_PORTHANDLER_R)(int param);
40 
41 /* !!!!! here is private section , do not access there member direct !!!!! */
42 
43 #define OPL_TYPE_WAVESEL 0x01 /* waveform select */
44 #define OPL_TYPE_ADPCM 0x02 /* DELTA-T ADPCM unit */
45 #define OPL_TYPE_KEYBOARD 0x04 /* keyboard interface */
46 #define OPL_TYPE_IO 0x08 /* I/O port */
47 
48 /* Saving is necessary for member of the 'R' mark for suspend/resume */
49 /* ---------- OPL one of slot ---------- */
50 typedef struct fm_opl_slot {
51  INT32 TL; /* total level :TL << 8 */
52  INT32 TLL; /* adjusted now TL */
53  UINT8 KSR; /* key scale rate :(shift down bit) */
54  INT32 *AR; /* attack rate :&AR_TABLE[AR<<2] */
55  INT32 *DR; /* decay rate :&DR_TALBE[DR<<2] */
56  INT32 SL; /* sustin level :SL_TALBE[SL] */
57  INT32 *RR; /* release rate :&DR_TABLE[RR<<2] */
58  UINT8 ksl; /* keyscale level :(shift down bits) */
59  UINT8 ksr; /* key scale rate :kcode>>KSR */
60  UINT32 mul; /* multiple :ML_TABLE[ML] */
61  UINT32 Cnt; /* frequency count : */
62  UINT32 Incr; /* frequency step : */
63  /* envelope generator state */
64  UINT8 eg_typ; /* envelope type flag */
65  UINT8 evm; /* envelope phase */
66  INT32 evc; /* envelope counter */
67  INT32 eve; /* envelope counter end point */
68  INT32 evs; /* envelope counter step */
69  INT32 evsa; /* envelope step for AR :AR[ksr] */
70  INT32 evsd; /* envelope step for DR :DR[ksr] */
71  INT32 evsr; /* envelope step for RR :RR[ksr] */
72  /* LFO */
73  UINT8 ams; /* ams flag */
74  UINT8 vib; /* vibrate flag */
75  /* wave selector */
76  INT32 **wavetable;
77 }OPL_SLOT;
78 
79 /* ---------- OPL one of channel ---------- */
80 typedef struct fm_opl_channel {
81  OPL_SLOT SLOT[2];
82  UINT8 CON; /* connection type */
83  UINT8 FB; /* feed back :(shift down bit) */
84  INT32 *connect1; /* slot1 output pointer */
85  INT32 *connect2; /* slot2 output pointer */
86  INT32 op1_out[2]; /* slot1 output for selfeedback */
87  /* phase generator state */
88  UINT32 block_fnum; /* block+fnum : */
89  UINT8 kcode; /* key code : KeyScaleCode */
90  UINT32 fc; /* Freq. Increment base */
91  UINT32 ksl_base; /* KeyScaleLevel Base step */
92  UINT8 keyon; /* key on/off flag */
93 } OPL_CH;
94 
95 /* OPL state */
96 typedef struct fm_opl_f {
97  UINT8 type; /* chip type */
98  int clock; /* master clock (Hz) */
99  int rate; /* sampling rate (Hz) */
100  double freqbase; /* frequency base */
101  double TimerBase; /* Timer base time (==sampling time) */
102  UINT8 address; /* address register */
103  UINT8 status; /* status flag */
104  UINT8 statusmask; /* status mask */
105  UINT32 mode; /* Reg.08 : CSM , notesel,etc. */
106  /* Timer */
107  int T[2]; /* timer counter */
108  UINT8 st[2]; /* timer enable */
109  /* FM channel slots */
110  OPL_CH *P_CH; /* pointer of CH */
111  int max_ch; /* maximum channel */
112  /* Rythm sention */
113  UINT8 rythm; /* Rythm mode , key flag */
114 #if BUILD_Y8950
115  /* Delta-T ADPCM unit (Y8950) */
116  YM_DELTAT *deltat; /* DELTA-T ADPCM */
117 #endif
118  /* Keyboard / I/O interface unit (Y8950) */
119  UINT8 portDirection;
120  UINT8 portLatch;
121  OPL_PORTHANDLER_R porthandler_r;
122  OPL_PORTHANDLER_W porthandler_w;
123  int port_param;
124  OPL_PORTHANDLER_R keyboardhandler_r;
125  OPL_PORTHANDLER_W keyboardhandler_w;
126  int keyboard_param;
127  /* time tables */
128  INT32 AR_TABLE[75]; /* attack rate tables */
129  INT32 DR_TABLE[75]; /* decay rate tables */
130  UINT32 FN_TABLE[1024]; /* fnumber -> increment counter */
131  /* LFO */
132  INT32 *ams_table;
133  INT32 *vib_table;
134  INT32 amsCnt;
135  INT32 amsIncr;
136  INT32 vibCnt;
137  INT32 vibIncr;
138  /* wave selector enable flag */
139  UINT8 wavesel;
140  /* external event callback handler */
141  OPL_TIMERHANDLER TimerHandler; /* TIMER handler */
142  int TimerParam; /* TIMER parameter */
143  OPL_IRQHANDLER IRQHandler; /* IRQ handler */
144  int IRQParam; /* IRQ parameter */
145  OPL_UPDATEHANDLER UpdateHandler; /* stream update handler */
146  int UpdateParam; /* stream update parameter */
147 } FM_OPL;
148 
149 /* ---------- Generic interface section ---------- */
150 #define OPL_TYPE_YM3526 (0)
151 #define OPL_TYPE_YM3812 (OPL_TYPE_WAVESEL)
152 #define OPL_TYPE_Y8950 (OPL_TYPE_ADPCM|OPL_TYPE_KEYBOARD|OPL_TYPE_IO)
153 
154 FM_OPL *OPLCreate(int type, int clock, int rate);
155 void OPLDestroy(FM_OPL *OPL);
156 void OPLSetTimerHandler(FM_OPL *OPL,OPL_TIMERHANDLER TimerHandler,int channelOffset);
157 void OPLSetIRQHandler(FM_OPL *OPL,OPL_IRQHANDLER IRQHandler,int param);
158 void OPLSetUpdateHandler(FM_OPL *OPL,OPL_UPDATEHANDLER UpdateHandler,int param);
159 /* Y8950 port handlers */
160 void OPLSetPortHandler(FM_OPL *OPL,OPL_PORTHANDLER_W PortHandler_w,OPL_PORTHANDLER_R PortHandler_r,int param);
161 void OPLSetKeyboardHandler(FM_OPL *OPL,OPL_PORTHANDLER_W KeyboardHandler_w,OPL_PORTHANDLER_R KeyboardHandler_r,int param);
162 
163 void OPLResetChip(FM_OPL *OPL);
164 int OPLWrite(FM_OPL *OPL,int a,int v);
165 unsigned char OPLRead(FM_OPL *OPL,int a);
166 int OPLTimerOver(FM_OPL *OPL,int c);
167 
168 /* YM3626/YM3812 local section */
169 void YM3812UpdateOne(FM_OPL *OPL, INT16 *buffer, int length, int stripe, float volume);
170 
171 void Y8950UpdateOne(FM_OPL *OPL, INT16 *buffer, int length);
Definition: fmopl.h:80
Definition: fmopl.h:96
Definition: fmopl.h:50