Subversion Repositories pentevo

Rev

Rev 797 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
797 DimkaM 1
/*
2
typedef unsigned int UINT32;
3
typedef signed int INT32;
4
typedef unsigned short UINT16;
5
typedef signed short INT16;
6
typedef unsigned char UINT8;
7
typedef signed char INT8;
8
*/
9
typedef INT16 stream_sample_t;
10
typedef stream_sample_t FMSAMPLE;
11
#ifndef EMUL2203_H
12
#define EMUL2203_H
13
 
14
/* select bit size of output : 8 or 16 */
15
#define FM_SAMPLE_BITS 16
16
 
17
/* select timer system internal or external */
18
#define FM_INTERNAL_TIMER 0
19
 
20
/* --- speedup optimize --- */
21
/* busy flag enulation , The definition of FM_GET_TIME_NOW() is necessary. */
22
#define FM_BUSY_FLAG_SUPPORT 1
23
 
24
 
25
/* struct describing a single operator (SLOT) */
26
typedef struct
27
{
28
        INT32   *DT;            /* detune          :dt_tab[DT] */
29
        UINT8   KSR;            /* key scale rate  :3-KSR */
30
        UINT32  ar;             /* attack rate  */
31
        UINT32  d1r;            /* decay rate   */
32
        UINT32  d2r;            /* sustain rate */
33
        UINT32  rr;             /* release rate */
34
        UINT8   ksr;            /* key scale rate  :kcode>>(3-KSR) */
35
        UINT32  mul;            /* multiple        :ML_TABLE[ML] */
36
 
37
        /* Phase Generator */
38
        UINT32  phase;          /* phase counter */
39
        UINT32  Incr;           /* phase step */
40
 
41
        /* Envelope Generator */
42
        UINT8   state;          /* phase type */
43
        UINT32  tl;             /* total level: TL << 3 */
44
        INT32   volume;         /* envelope counter */
45
        UINT32  sl;             /* sustain level:sl_table[SL] */
46
        UINT32  vol_out;        /* current output from EG circuit (without AM from LFO) */
47
 
48
        UINT8   eg_sh_ar;       /*  (attack state) */
49
        UINT8   eg_sel_ar;      /*  (attack state) */
50
        UINT8   eg_sh_d1r;      /*  (decay state) */
51
        UINT8   eg_sel_d1r;     /*  (decay state) */
52
        UINT8   eg_sh_d2r;      /*  (sustain state) */
53
        UINT8   eg_sel_d2r;     /*  (sustain state) */
54
        UINT8   eg_sh_rr;       /*  (release state) */
55
        UINT8   eg_sel_rr;      /*  (release state) */
56
 
57
        UINT8   ssg;            /* SSG-EG waveform */
58
        UINT8   ssgn;           /* SSG-EG negated output */
59
 
60
        UINT32  key;            /* 0=last key was KEY OFF, 1=KEY ON */
61
 
62
} FM_SLOT;
63
 
64
typedef struct
65
{
66
        FM_SLOT SLOT[4];        /* four SLOTs (operators) */
67
 
68
        UINT8   ALGO;           /* algorithm */
69
        UINT8   FB;             /* feedback shift */
70
        INT32   op1_out[2];     /* op1 output for feedback */
71
 
72
        INT32   *connect1;      /* SLOT1 output pointer */
73
        INT32   *connect2;      /* SLOT2 output pointer */
74
        INT32   *connect3;      /* SLOT3 output pointer */
75
        INT32   *connect4;      /* SLOT4 output pointer */
76
 
77
        INT32   *mem_connect;/* where to put the delayed sample (MEM) */
78
        INT32   mem_value;      /* delayed sample (MEM) value */
79
 
80
        INT32   pms;            /* channel PMS */
81
        UINT8   ams;            /* channel AMS */
82
 
83
        UINT32  fc;             /* fnum,blk:adjusted to sample rate */
84
        UINT8   kcode;          /* key code:                        */
85
        UINT32  block_fnum;     /* current blk/fnum value for this slot (can be different betweeen slots of one channel in 3slot mode) */
86
} FM_CH;
87
 
88
typedef struct
89
{
90
        void *  param;          /* this chip parameter  */
91
        int     clock;          /* master clock  (Hz)   */
92
        int     SSGclock;       /* clock for SSG (Hz)   */
93
        int     rate;           /* sampling rate (Hz)   */
94
        double  freqbase;       /* frequency base       */
95
        double  TimerBase;      /* Timer base time      */
96
#if FM_BUSY_FLAG_SUPPORT
97
        double  BusyExpire;     /* ExpireTime of Busy clear */
98
#endif
99
        UINT8   address;        /* address register     */
100
        UINT8   irq;            /* interrupt level      */
101
        UINT8   irqmask;        /* irq mask             */
102
        UINT8   status;         /* status flag          */
103
        UINT32  mode;           /* mode  CSM / 3SLOT    */
104
        UINT8   prescaler_sel;/* prescaler selector */
105
        UINT8   fn_h;           /* freq latch           */
106
        int     TA;             /* timer a              */
107
        int     TAC;            /* timer a counter      */
108
        UINT8   TB;             /* timer b              */
109
        int     TBC;            /* timer b counter      */
110
        /* local time tables */
111
        INT32   dt_tab[8][32];/* DeTune table       */
112
        /* Extention Timer and IRQ handler */
113
//      FM_TIMERHANDLER Timer_Handler;
114
//      FM_IRQHANDLER   IRQ_Handler;
115
//      const struct ssg_callbacks *SSG;
116
} FM_ST;
117
 
118
/***********************************************************/
119
/* OPN unit                                                */
120
/***********************************************************/
121
 
122
/* OPN 3slot struct */
123
typedef struct
124
{
125
        UINT32  fc[3];                  /* fnum3,blk3: calculated */
126
        UINT8   fn_h;                   /* freq3 latch */
127
        UINT8   kcode[3];               /* key code */
128
        UINT32  block_fnum[3];  /* current fnum value for this slot (can be different betweeen slots of one channel in 3slot mode) */
129
} FM_3SLOT;
130
 
131
/* OPN/A/B common state */
132
typedef struct
133
{
134
        UINT8   type;                   /* chip type */
135
        FM_ST   ST;                     /* general state */
136
        FM_3SLOT SL3;                   /* 3 slot mode state */
137
        FM_CH   *P_CH;                  /* pointer of CH */
138
 
139
        UINT32  eg_cnt;                 /* global envelope generator counter */
140
        UINT32  eg_timer;               /* global envelope generator counter works at frequency = chipclock/64/3 */
141
        UINT32  eg_timer_add;   /* step of eg_timer */
142
        UINT32  eg_timer_overflow;/* envelope generator timer overlfows every 3 samples (on real chip) */
143
 
144
 
145
        /* there are 2048 FNUMs that can be generated using FNUM/BLK registers
146
        but LFO works with one more bit of a precision so we really need 4096 elements */
147
 
148
        UINT32  fn_table[2048]; /* fnumber->increment counter */
149
 
150
} FM_OPN;
151
 
152
/* here's the virtual YM2203(OPN) */
153
typedef struct
154
{
155
        UINT8 REGS[256];                /* registers         */
156
        FM_OPN OPN;                             /* OPN state         */
157
        FM_CH CH[3];                    /* channel state     */
158
} YM2203;
159
 
160
#define FM_GET_TIME_NOW() 0
161
//timer_get_time()
162
 
163
#ifndef PI
164
#define PI 3.14159265358979323846
165
#endif
166
 
167
/* -------------------- YM2203(OPN) Interface -------------------- */
168
 
169
/*
170
** Initialize YM2203 emulator(s).
171
**
172
** 'num'           is the number of virtual YM2203's to allocate
173
** 'baseclock'
174
** 'rate'          is sampling rate
175
** 'TimerHandler'  timer callback handler when timer start and clear
176
** 'IRQHandler'    IRQ callback handler when changed IRQ level
177
** return      0 = success
178
*/
179
void * YM2203Init(void *param, int index, int baseclock, int rate
180
//                      ,FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler, const struct ssg_callbacks *ssg
181
                           );
182
 
183
/*
184
** shutdown the YM2203 emulators
185
*/
186
void YM2203Shutdown(void *chip);
187
 
188
/*
189
** reset all chip registers for YM2203 number 'num'
190
*/
191
void YM2203ResetChip(void *chip);
192
 
193
/*
194
** update one of chip
195
*/
196
void YM2203UpdateOne(void *chip, FMSAMPLE *buffer, int length);
197
 
198
/*
199
** Write
200
** return : InterruptLevel
201
*/
202
int YM2203Write(void *chip,int a,unsigned char v);
203
 
204
/*
205
** Read
206
** return : InterruptLevel
207
*/
208
unsigned char YM2203Read(void *chip,int a);
209
 
210
/*
211
**  Timer OverFlow
212
*/
213
int YM2203TimerOver(void *chip, int c);
214
 
215
/*
216
**  State Save
217
*/
218
#ifdef _STATE_H
219
void YM2203Postload(void *chip);
220
 
221
void YM2203_save_state(void *chip, int index);
222
#endif // _STATE_H
223
void OPNPrescaler_w(FM_OPN *OPN , int addr, int pre_divider);
224
#endif