1 #define YM2610B_WARNING
2
3 /*
4 **
5 ** File: fm.c -- software implementation of Yamaha FM sound generator
6 **
7 ** Copyright (C) 2001, 2002, 2003 Jarek Burczynski (bujar at mame dot net)
8 ** Copyright (C) 1998 Tatsuyuki Satoh , MultiArcadeMachineEmulator development
9 **
10 ** Version 1.4 (final beta)
11 **
12 */
13
14 /*
15 ** History:
16 **
17 ** 03-08-2003 Jarek Burczynski:
18 ** - fixed YM2608 initial values (after the reset)
19 ** - fixed flag and irqmask handling (YM2608)
20 ** - fixed BUFRDY flag handling (YM2608)
21 **
22 ** 14-06-2003 Jarek Burczynski:
23 ** - implemented all of the YM2608 status register flags
24 ** - implemented support for external memory read/write via YM2608
25 ** - implemented support for deltat memory limit register in YM2608 emulation
26 **
27 ** 22-05-2003 Jarek Burczynski:
28 ** - fixed LFO PM calculations (copy&paste bugfix)
29 **
30 ** 08-05-2003 Jarek Burczynski:
31 ** - fixed SSG support
32 **
33 ** 22-04-2003 Jarek Burczynski:
34 ** - implemented 100% correct LFO generator (verified on real YM2610 and YM2608)
35 **
36 ** 15-04-2003 Jarek Burczynski:
37 ** - added support for YM2608's register 0x110 - status mask
38 **
39 ** 01-12-2002 Jarek Burczynski:
40 ** - fixed register addressing in YM2608, YM2610, YM2610B chips. (verified on real YM2608)
41 ** The addressing patch used for early Neo-Geo games can be removed now.
42 **
43 ** 26-11-2002 Jarek Burczynski, Nicola Salmoria:
44 ** - recreated YM2608 ADPCM ROM using data from real YM2608's output which leads to:
45 ** - added emulation of YM2608 drums.
46 ** - output of YM2608 is two times lower now - same as YM2610 (verified on real YM2608)
47 **
48 ** 16-08-2002 Jarek Burczynski:
49 ** - binary exact Envelope Generator (verified on real YM2203);
50 ** identical to YM2151
51 ** - corrected 'off by one' error in feedback calculations (when feedback is off)
52 ** - corrected connection (algorithm) calculation (verified on real YM2203 and YM2610)
53 **
54 ** 18-12-2001 Jarek Burczynski:
55 ** - added SSG-EG support (verified on real YM2203)
56 **
57 ** 12-08-2001 Jarek Burczynski:
58 ** - corrected sin_tab and tl_tab data (verified on real chip)
59 ** - corrected feedback calculations (verified on real chip)
60 ** - corrected phase generator calculations (verified on real chip)
61 ** - corrected envelope generator calculations (verified on real chip)
62 ** - corrected FM volume level (YM2610 and YM2610B).
63 ** - changed YMxxxUpdateOne() functions (YM2203, YM2608, YM2610, YM2610B, YM2612) :
64 ** this was needed to calculate YM2610 FM channels output correctly.
65 ** (Each FM channel is calculated as in other chips, but the output of the channel
66 ** gets shifted right by one *before* sending to accumulator. That was impossible to do
67 ** with previous implementation).
68 **
69 ** 23-07-2001 Jarek Burczynski, Nicola Salmoria:
70 ** - corrected YM2610 ADPCM type A algorithm and tables (verified on real chip)
71 **
72 ** 11-06-2001 Jarek Burczynski:
73 ** - corrected end of sample bug in ADPCMA_calc_cha().
74 ** Real YM2610 checks for equality between current and end addresses (only 20 LSB bits).
75 **
76 ** 08-12-98 hiro-shi:
77 ** rename ADPCMA -> ADPCMB, ADPCMB -> ADPCMA
78 ** move ROM limit check.(CALC_CH? -> 2610Write1/2)
79 ** test program (ADPCMB_TEST)
80 ** move ADPCM A/B end check.
81 ** ADPCMB repeat flag(no check)
82 ** change ADPCM volume rate (8->16) (32->48).
83 **
84 ** 09-12-98 hiro-shi:
85 ** change ADPCM volume. (8->16, 48->64)
86 ** replace ym2610 ch0/3 (YM-2610B)
87 ** init cur_chip (restart bug fix)
88 ** change ADPCM_SHIFT (10->8) missing bank change 0x4000-0xffff.
89 ** add ADPCM_SHIFT_MASK
90 ** change ADPCMA_DECODE_MIN/MAX.
91 */
92
93
94
95
96 /************************************************************************/
97 /* comment of hiro-shi(Hiromitsu Shioya) */
98 /* YM2610(B) = OPN-B */
99 /* YM2610 : PSG:3ch FM:4ch ADPCM(18.5KHz):6ch DeltaT ADPCM:1ch */
100 /* YM2610B : PSG:3ch FM:6ch ADPCM(18.5KHz):6ch DeltaT ADPCM:1ch */
101 /************************************************************************/
102
103 #include <stdio.h>
104 #include <stdlib.h>
105 #include <string.h>
106 #include <stdarg.h>
107 #include <math.h>
108 #include "fm.h"
109
110
111 #ifndef PI
112 #define PI 3.14159265358979323846
113 #endif
114
115
116 /* include external DELTA-T unit (when needed) */
117 #if (BUILD_YM2608||BUILD_YM2610||BUILD_YM2610B)
118 #include "ymdeltat.h"
119 #endif
120
121 /* shared function building option */
122 #define BUILD_OPN (BUILD_YM2203||BUILD_YM2608||BUILD_YM2610||BUILD_YM2610B||BUILD_YM2612)
123 #define BUILD_OPN_PRESCALER (BUILD_YM2203||BUILD_YM2608)
124
125
126 /* globals */
127 #define TYPE_SSG 0x01 /* SSG support */
128 #define TYPE_LFOPAN 0x02 /* OPN type LFO and PAN */
129 #define TYPE_6CH 0x04 /* FM 6CH / 3CH */
130 #define TYPE_DAC 0x08 /* YM2612's DAC device */
131 #define TYPE_ADPCM 0x10 /* two ADPCM units */
132 #define TYPE_2610 0x20 /* bogus flag to differentiate 2608 from 2610 */
133
134 #define TYPE_YM2203 (TYPE_SSG)
135 #define TYPE_YM2608 (TYPE_SSG |TYPE_LFOPAN |TYPE_6CH |TYPE_ADPCM)
136 #define TYPE_YM2610 (TYPE_SSG |TYPE_LFOPAN |TYPE_6CH |TYPE_ADPCM |TYPE_2610)
137 #define TYPE_YM2612 (TYPE_DAC |TYPE_LFOPAN |TYPE_6CH)
138
139
140
141 #define FREQ_SH 16 /* 16.16 fixed point (frequency calculations) */
142 #define EG_SH 16 /* 16.16 fixed point (envelope generator timing) */
143 #define LFO_SH 24 /* 8.24 fixed point (LFO calculations) */
144 #define TIMER_SH 16 /* 16.16 fixed point (timers calculations) */
145
146 #define FREQ_MASK ((1<<FREQ_SH)-1)
147
148 #define ENV_BITS 10
149 #define ENV_LEN (1<<ENV_BITS)
150 #define ENV_STEP (128.0/ENV_LEN)
151
152 #define MAX_ATT_INDEX (ENV_LEN-1) /* 1023 */
153 #define MIN_ATT_INDEX (0) /* 0 */
154
155 #define EG_ATT 4
156 #define EG_DEC 3
157 #define EG_SUS 2
158 #define EG_REL 1
159 #define EG_OFF 0
160
161 #define SIN_BITS 10
162 #define SIN_LEN (1<<SIN_BITS)
163 #define SIN_MASK (SIN_LEN-1)
164
165 #define TL_RES_LEN (256) /* 8 bits addressing (real chip) */
166
167
168 #if (FM_SAMPLE_BITS==16)
169 #define FINAL_SH (0)
170 #define MAXOUT (+32767)
171 #define MINOUT (-32768)
172 #else
173 #define FINAL_SH (8)
174 #define MAXOUT (+127)
175 #define MINOUT (-128)
176 #endif
177
178
179 /* TL_TAB_LEN is calculated as:
180 * 13 - sinus amplitude bits (Y axis)
181 * 2 - sinus sign bit (Y axis)
182 * TL_RES_LEN - sinus resolution (X axis)
183 */
184 #define TL_TAB_LEN (13*2*TL_RES_LEN)
185 static signed int tl_tab[TL_TAB_LEN];
186
187 #define ENV_QUIET (TL_TAB_LEN>>3)
188
189 /* sin waveform table in 'decibel' scale */
190 static unsigned int sin_tab[SIN_LEN];
191
192 /* sustain level table (3dB per step) */
193 /* bit0, bit1, bit2, bit3, bit4, bit5, bit6 */
194 /* 1, 2, 4, 8, 16, 32, 64 (value)*/
195 /* 0.75, 1.5, 3, 6, 12, 24, 48 (dB)*/
196
197 /* 0 - 15: 0, 3, 6, 9,12,15,18,21,24,27,30,33,36,39,42,93 (dB)*/
198 #define SC(db) (UINT32) ( db * (4.0/ENV_STEP) )
199 static const UINT32 sl_table[16]={
200 SC( 0),SC( 1),SC( 2),SC(3 ),SC(4 ),SC(5 ),SC(6 ),SC( 7),
201 SC( 8),SC( 9),SC(10),SC(11),SC(12),SC(13),SC(14),SC(31)
202 };
203 #undef SC
204
205
206 #define RATE_STEPS (8)
207 static const UINT8 eg_inc[19*RATE_STEPS]={
208
209 /*cycle:0 1 2 3 4 5 6 7*/
210
211 /* 0 */ 0,1, 0,1, 0,1, 0,1, /* rates 00..11 0 (increment by 0 or 1) */
212 /* 1 */ 0,1, 0,1, 1,1, 0,1, /* rates 00..11 1 */
213 /* 2 */ 0,1, 1,1, 0,1, 1,1, /* rates 00..11 2 */
214 /* 3 */ 0,1, 1,1, 1,1, 1,1, /* rates 00..11 3 */
215
216 /* 4 */ 1,1, 1,1, 1,1, 1,1, /* rate 12 0 (increment by 1) */
217 /* 5 */ 1,1, 1,2, 1,1, 1,2, /* rate 12 1 */
218 /* 6 */ 1,2, 1,2, 1,2, 1,2, /* rate 12 2 */
219 /* 7 */ 1,2, 2,2, 1,2, 2,2, /* rate 12 3 */
220
221 /* 8 */ 2,2, 2,2, 2,2, 2,2, /* rate 13 0 (increment by 2) */
222 /* 9 */ 2,2, 2,4, 2,2, 2,4, /* rate 13 1 */
223 /*10 */ 2,4, 2,4, 2,4, 2,4, /* rate 13 2 */
224 /*11 */ 2,4, 4,4, 2,4, 4,4, /* rate 13 3 */
225
226 /*12 */ 4,4, 4,4, 4,4, 4,4, /* rate 14 0 (increment by 4) */
227 /*13 */ 4,4, 4,8, 4,4, 4,8, /* rate 14 1 */
228 /*14 */ 4,8, 4,8, 4,8, 4,8, /* rate 14 2 */
229 /*15 */ 4,8, 8,8, 4,8, 8,8, /* rate 14 3 */
230
231 /*16 */ 8,8, 8,8, 8,8, 8,8, /* rates 15 0, 15 1, 15 2, 15 3 (increment by 8) */
232 /*17 */ 16,16,16,16,16,16,16,16, /* rates 15 2, 15 3 for attack */
233 /*18 */ 0,0, 0,0, 0,0, 0,0, /* infinity rates for attack and decay(s) */
234 };
235
236
237 #define O(a) (a*RATE_STEPS)
238
239 /*note that there is no O(17) in this table - it's directly in the code */
240 static const UINT8 eg_rate_select[32+64+32]={ /* Envelope Generator rates (32 + 64 rates + 32 RKS) */
241 /* 32 infinite time rates */
242 O(18),O(18),O(18),O(18),O(18),O(18),O(18),O(18),
243 O(18),O(18),O(18),O(18),O(18),O(18),O(18),O(18),
244 O(18),O(18),O(18),O(18),O(18),O(18),O(18),O(18),
245 O(18),O(18),O(18),O(18),O(18),O(18),O(18),O(18),
246
247 /* rates 00-11 */
248 O( 0),O( 1),O( 2),O( 3),
249 O( 0),O( 1),O( 2),O( 3),
250 O( 0),O( 1),O( 2),O( 3),
251 O( 0),O( 1),O( 2),O( 3),
252 O( 0),O( 1),O( 2),O( 3),
253 O( 0),O( 1),O( 2),O( 3),
254 O( 0),O( 1),O( 2),O( 3),
255 O( 0),O( 1),O( 2),O( 3),
256 O( 0),O( 1),O( 2),O( 3),
257 O( 0),O( 1),O( 2),O( 3),
258 O( 0),O( 1),O( 2),O( 3),
259 O( 0),O( 1),O( 2),O( 3),
260
261 /* rate 12 */
262 O( 4),O( 5),O( 6),O( 7),
263
264 /* rate 13 */
265 O( 8),O( 9),O(10),O(11),
266
267 /* rate 14 */
268 O(12),O(13),O(14),O(15),
269
270 /* rate 15 */
271 O(16),O(16),O(16),O(16),
272
273 /* 32 dummy rates (same as 15 3) */
274 O(16),O(16),O(16),O(16),O(16),O(16),O(16),O(16),
275 O(16),O(16),O(16),O(16),O(16),O(16),O(16),O(16),
276 O(16),O(16),O(16),O(16),O(16),O(16),O(16),O(16),
277 O(16),O(16),O(16),O(16),O(16),O(16),O(16),O(16)
278
279 };
280
281 static const UINT8 eg_rate_select2612[32+64+32]={ /* Envelope Generator rates (32 + 64 rates + 32 RKS) */
282 /* 32 infinite time rates */
283 O(18),O(18),O(18),O(18),O(18),O(18),O(18),O(18),
284 O(18),O(18),O(18),O(18),O(18),O(18),O(18),O(18),
285 O(18),O(18),O(18),O(18),O(18),O(18),O(18),O(18),
286 O(18),O(18),O(18),O(18),O(18),O(18),O(18),O(18),
287
288 /* rates 00-11 */
289 O( 18),O( 18),O( 0),O( 0),
290 O( 0),O( 0),O( 2),O( 2), // Nemesis's tests
291
292 O( 0),O( 1),O( 2),O( 3),
293 O( 0),O( 1),O( 2),O( 3),
294 O( 0),O( 1),O( 2),O( 3),
295 O( 0),O( 1),O( 2),O( 3),
296 O( 0),O( 1),O( 2),O( 3),
297 O( 0),O( 1),O( 2),O( 3),
298 O( 0),O( 1),O( 2),O( 3),
299 O( 0),O( 1),O( 2),O( 3),
300 O( 0),O( 1),O( 2),O( 3),
301 O( 0),O( 1),O( 2),O( 3),
302
303 /* rate 12 */
304 O( 4),O( 5),O( 6),O( 7),
305
306 /* rate 13 */
307 O( 8),O( 9),O(10),O(11),
308
309 /* rate 14 */
310 O(12),O(13),O(14),O(15),
311
312 /* rate 15 */
313 O(16),O(16),O(16),O(16),
314
315 /* 32 dummy rates (same as 15 3) */
316 O(16),O(16),O(16),O(16),O(16),O(16),O(16),O(16),
317 O(16),O(16),O(16),O(16),O(16),O(16),O(16),O(16),
318 O(16),O(16),O(16),O(16),O(16),O(16),O(16),O(16),
319 O(16),O(16),O(16),O(16),O(16),O(16),O(16),O(16)
320
321 };
322 #undef O
323
324 /*rate 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15*/
325 /*shift 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0 */
326 /*mask 2047, 1023, 511, 255, 127, 63, 31, 15, 7, 3, 1, 0, 0, 0, 0, 0 */
327
328 #define O(a) (a*1)
329 static const UINT8 eg_rate_shift[32+64+32]={ /* Envelope Generator counter shifts (32 + 64 rates + 32 RKS) */
330 /* 32 infinite time rates */
331 O(0),O(0),O(0),O(0),O(0),O(0),O(0),O(0),
332 O(0),O(0),O(0),O(0),O(0),O(0),O(0),O(0),
333 O(0),O(0),O(0),O(0),O(0),O(0),O(0),O(0),
334 O(0),O(0),O(0),O(0),O(0),O(0),O(0),O(0),
335
336 /* rates 00-11 */
337 O(11),O(11),O(11),O(11),
338 O(10),O(10),O(10),O(10),
339 O( 9),O( 9),O( 9),O( 9),
340 O( 8),O( 8),O( 8),O( 8),
341 O( 7),O( 7),O( 7),O( 7),
342 O( 6),O( 6),O( 6),O( 6),
343 O( 5),O( 5),O( 5),O( 5),
344 O( 4),O( 4),O( 4),O( 4),
345 O( 3),O( 3),O( 3),O( 3),
346 O( 2),O( 2),O( 2),O( 2),
347 O( 1),O( 1),O( 1),O( 1),
348 O( 0),O( 0),O( 0),O( 0),
349
350 /* rate 12 */
351 O( 0),O( 0),O( 0),O( 0),
352
353 /* rate 13 */
354 O( 0),O( 0),O( 0),O( 0),
355
356 /* rate 14 */
357 O( 0),O( 0),O( 0),O( 0),
358
359 /* rate 15 */
360 O( 0),O( 0),O( 0),O( 0),
361
362 /* 32 dummy rates (same as 15 3) */
363 O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),
364 O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),
365 O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),
366 O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0),O( 0)
367
368 };
369 #undef O
370
371 static const UINT8 dt_tab[4 * 32]={
372 /* this is YM2151 and YM2612 phase increment data (in 10.10 fixed point format)*/
373 /* FD=0 */
374 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
375 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
376 /* FD=1 */
377 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2,
378 2, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 8, 8, 8, 8,
379 /* FD=2 */
380 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5,
381 5, 6, 6, 7, 8, 8, 9,10,11,12,13,14,16,16,16,16,
382 /* FD=3 */
383 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7,
384 8 , 8, 9,10,11,12,13,14,16,17,19,20,22,22,22,22
385 };
386
387
388 /* OPN key frequency number -> key code follow table */
389 /* fnum higher 4bit -> keycode lower 2bit */
390 static const UINT8 opn_fktable[16] = {0,0,0,0,0,0,0,1,2,3,3,3,3,3,3,3};
391
392
393 /* 8 LFO speed parameters */
394 /* each value represents number of samples that one LFO level will last for */
395 static const UINT32 lfo_samples_per_step[8] = {108, 77, 71, 67, 62, 44, 8, 5};
396
397
398
399 /*There are 4 different LFO AM depths available, they are:
400 0 dB, 1.4 dB, 5.9 dB, 11.8 dB
401 Here is how it is generated (in EG steps):
402
403 11.8 dB = 0, 2, 4, 6, 8, 10,12,14,16...126,126,124,122,120,118,....4,2,0
404 5.9 dB = 0, 1, 2, 3, 4, 5, 6, 7, 8....63, 63, 62, 61, 60, 59,.....2,1,0
405 1.4 dB = 0, 0, 0, 0, 1, 1, 1, 1, 2,...15, 15, 15, 15, 14, 14,.....0,0,0
406
407 (1.4 dB is loosing precision as you can see)
408
409 It's implemented as generator from 0..126 with step 2 then a shift
410 right N times, where N is:
411 8 for 0 dB
412 3 for 1.4 dB
413 1 for 5.9 dB
414 0 for 11.8 dB
415 */
416 static const UINT8 lfo_ams_depth_shift[4] = {8, 3, 1, 0};
417
418
419
420 /*There are 8 different LFO PM depths available, they are:
421 0, 3.4, 6.7, 10, 14, 20, 40, 80 (cents)
422
423 Modulation level at each depth depends on F-NUMBER bits: 4,5,6,7,8,9,10
424 (bits 8,9,10 = FNUM MSB from OCT/FNUM register)
425
426 Here we store only first quarter (positive one) of full waveform.
427 Full table (lfo_pm_table) containing all 128 waveforms is build
428 at run (init) time.
429
430 One value in table below represents 4 (four) basic LFO steps
431 (1 PM step = 4 AM steps).
432
433 For example:
434 at LFO SPEED=0 (which is 108 samples per basic LFO step)
435 one value from "lfo_pm_output" table lasts for 432 consecutive
436 samples (4*108=432) and one full LFO waveform cycle lasts for 13824
437 samples (32*432=13824; 32 because we store only a quarter of whole
438 waveform in the table below)
439 */
440 static const UINT8 lfo_pm_output[7*8][8]={ /* 7 bits meaningful (of F-NUMBER), 8 LFO output levels per one depth (out of 32), 8 LFO depths */
441 /* FNUM BIT 4: 000 0001xxxx */
442 /* DEPTH 0 */ {0, 0, 0, 0, 0, 0, 0, 0},
443 /* DEPTH 1 */ {0, 0, 0, 0, 0, 0, 0, 0},
444 /* DEPTH 2 */ {0, 0, 0, 0, 0, 0, 0, 0},
445 /* DEPTH 3 */ {0, 0, 0, 0, 0, 0, 0, 0},
446 /* DEPTH 4 */ {0, 0, 0, 0, 0, 0, 0, 0},
447 /* DEPTH 5 */ {0, 0, 0, 0, 0, 0, 0, 0},
448 /* DEPTH 6 */ {0, 0, 0, 0, 0, 0, 0, 0},
449 /* DEPTH 7 */ {0, 0, 0, 0, 1, 1, 1, 1},
450
451 /* FNUM BIT 5: 000 0010xxxx */
452 /* DEPTH 0 */ {0, 0, 0, 0, 0, 0, 0, 0},
453 /* DEPTH 1 */ {0, 0, 0, 0, 0, 0, 0, 0},
454 /* DEPTH 2 */ {0, 0, 0, 0, 0, 0, 0, 0},
455 /* DEPTH 3 */ {0, 0, 0, 0, 0, 0, 0, 0},
456 /* DEPTH 4 */ {0, 0, 0, 0, 0, 0, 0, 0},
457 /* DEPTH 5 */ {0, 0, 0, 0, 0, 0, 0, 0},
458 /* DEPTH 6 */ {0, 0, 0, 0, 1, 1, 1, 1},
459 /* DEPTH 7 */ {0, 0, 1, 1, 2, 2, 2, 3},
460
461 /* FNUM BIT 6: 000 0100xxxx */
462 /* DEPTH 0 */ {0, 0, 0, 0, 0, 0, 0, 0},
463 /* DEPTH 1 */ {0, 0, 0, 0, 0, 0, 0, 0},
464 /* DEPTH 2 */ {0, 0, 0, 0, 0, 0, 0, 0},
465 /* DEPTH 3 */ {0, 0, 0, 0, 0, 0, 0, 0},
466 /* DEPTH 4 */ {0, 0, 0, 0, 0, 0, 0, 1},
467 /* DEPTH 5 */ {0, 0, 0, 0, 1, 1, 1, 1},
468 /* DEPTH 6 */ {0, 0, 1, 1, 2, 2, 2, 3},
469 /* DEPTH 7 */ {0, 0, 2, 3, 4, 4, 5, 6},
470
471 /* FNUM BIT 7: 000 1000xxxx */
472 /* DEPTH 0 */ {0, 0, 0, 0, 0, 0, 0, 0},
473 /* DEPTH 1 */ {0, 0, 0, 0, 0, 0, 0, 0},
474 /* DEPTH 2 */ {0, 0, 0, 0, 0, 0, 1, 1},
475 /* DEPTH 3 */ {0, 0, 0, 0, 1, 1, 1, 1},
476 /* DEPTH 4 */ {0, 0, 0, 1, 1, 1, 1, 2},
477 /* DEPTH 5 */ {0, 0, 1, 1, 2, 2, 2, 3},
478 /* DEPTH 6 */ {0, 0, 2, 3, 4, 4, 5, 6},
479 /* DEPTH 7 */ {0, 0, 4, 6, 8, 8, 0xa, 0xc},
480
481 /* FNUM BIT 8: 001 0000xxxx */
482 /* DEPTH 0 */ {0, 0, 0, 0, 0, 0, 0, 0},
483 /* DEPTH 1 */ {0, 0, 0, 0, 1, 1, 1, 1},
484 /* DEPTH 2 */ {0, 0, 0, 1, 1, 1, 2, 2},
485 /* DEPTH 3 */ {0, 0, 1, 1, 2, 2, 3, 3},
486 /* DEPTH 4 */ {0, 0, 1, 2, 2, 2, 3, 4},
487 /* DEPTH 5 */ {0, 0, 2, 3, 4, 4, 5, 6},
488 /* DEPTH 6 */ {0, 0, 4, 6, 8, 8, 0xa, 0xc},
489 /* DEPTH 7 */ {0, 0, 8, 0xc,0x10,0x10,0x14,0x18},
490
491 /* FNUM BIT 9: 010 0000xxxx */
492 /* DEPTH 0 */ {0, 0, 0, 0, 0, 0, 0, 0},
493 /* DEPTH 1 */ {0, 0, 0, 0, 2, 2, 2, 2},
494 /* DEPTH 2 */ {0, 0, 0, 2, 2, 2, 4, 4},
495 /* DEPTH 3 */ {0, 0, 2, 2, 4, 4, 6, 6},
496 /* DEPTH 4 */ {0, 0, 2, 4, 4, 4, 6, 8},
497 /* DEPTH 5 */ {0, 0, 4, 6, 8, 8, 0xa, 0xc},
498 /* DEPTH 6 */ {0, 0, 8, 0xc,0x10,0x10,0x14,0x18},
499 /* DEPTH 7 */ {0, 0,0x10,0x18,0x20,0x20,0x28,0x30},
500
501 /* FNUM BIT10: 100 0000xxxx */
502 /* DEPTH 0 */ {0, 0, 0, 0, 0, 0, 0, 0},
503 /* DEPTH 1 */ {0, 0, 0, 0, 4, 4, 4, 4},
504 /* DEPTH 2 */ {0, 0, 0, 4, 4, 4, 8, 8},
505 /* DEPTH 3 */ {0, 0, 4, 4, 8, 8, 0xc, 0xc},
506 /* DEPTH 4 */ {0, 0, 4, 8, 8, 8, 0xc,0x10},
507 /* DEPTH 5 */ {0, 0, 8, 0xc,0x10,0x10,0x14,0x18},
508 /* DEPTH 6 */ {0, 0,0x10,0x18,0x20,0x20,0x28,0x30},
509 /* DEPTH 7 */ {0, 0,0x20,0x30,0x40,0x40,0x50,0x60},
510
511 };
512
513 /* all 128 LFO PM waveforms */
514 static INT32 lfo_pm_table[128*8*32]; /* 128 combinations of 7 bits meaningful (of F-NUMBER), 8 LFO depths, 32 LFO output levels per one depth */
515
516
517
518
519
520 /* register number to channel number , slot offset */
521 #define OPN_CHAN(N) (N&3)
522 #define OPN_SLOT(N) ((N>>2)&3)
523
524 /* slot number */
525 #define SLOT1 0
526 #define SLOT2 2
527 #define SLOT3 1
528 #define SLOT4 3
529
530 /* bit0 = Right enable , bit1 = Left enable */
531 #define OUTD_RIGHT 1
532 #define OUTD_LEFT 2
533 #define OUTD_CENTER 3
534
535
536 /* save output as raw 16-bit sample */
537 /* #define SAVE_SAMPLE */
538
539 #ifdef SAVE_SAMPLE
540 static FILE *sample[1];
541 #if 1 /*save to MONO file */
542 #define SAVE_ALL_CHANNELS \
543 { signed int pom = lt; \
544 fputc((unsigned short)pom&0xff,sample[0]); \
545 fputc(((unsigned short)pom>>8)&0xff,sample[0]); \
546 }
547 #else /*save to STEREO file */
548 #define SAVE_ALL_CHANNELS \
549 { signed int pom = lt; \
550 fputc((unsigned short)pom&0xff,sample[0]); \
551 fputc(((unsigned short)pom>>8)&0xff,sample[0]); \
552 pom = rt; \
553 fputc((unsigned short)pom&0xff,sample[0]); \
554 fputc(((unsigned short)pom>>8)&0xff,sample[0]); \
555 }
556 #endif
557 #endif
558
559
560 /* struct describing a single operator (SLOT) */
561 typedef struct
562 {
563 INT32 *DT; /* detune :dt_tab[DT] */
564 UINT8 KSR; /* key scale rate :3-KSR */
565 UINT32 ar; /* attack rate */
566 UINT32 d1r; /* decay rate */
567 UINT32 d2r; /* sustain rate */
568 UINT32 rr; /* release rate */
569 UINT8 ksr; /* key scale rate :kcode>>(3-KSR) */
570 UINT32 mul; /* multiple :ML_TABLE[ML] */
571
572 /* Phase Generator */
573 UINT32 phase; /* phase counter */
574 INT32 Incr; /* phase step */
575
576 /* Envelope Generator */
577 UINT8 state; /* phase type */
578 UINT32 tl; /* total level: TL << 3 */
579 INT32 volume; /* envelope counter */
580 UINT32 sl; /* sustain level:sl_table[SL] */
581 UINT32 vol_out; /* current output from EG circuit (without AM from LFO) */
582
583 UINT8 eg_sh_ar; /* (attack state) */
584 UINT8 eg_sel_ar; /* (attack state) */
585 UINT8 eg_sh_d1r; /* (decay state) */
586 UINT8 eg_sel_d1r; /* (decay state) */
587 UINT8 eg_sh_d2r; /* (sustain state) */
588 UINT8 eg_sel_d2r; /* (sustain state) */
589 UINT8 eg_sh_rr; /* (release state) */
590 UINT8 eg_sel_rr; /* (release state) */
591
592 UINT8 ssg; /* SSG-EG waveform */
593 UINT8 ssgn; /* SSG-EG negated output */
594
595 UINT32 key; /* 0=last key was KEY OFF, 1=KEY ON */
596
597 /* LFO */
598 UINT32 AMmask; /* AM enable flag */
599
600 } FM_SLOT;
601
602 typedef struct
603 {
604 FM_SLOT SLOT[4]; /* four SLOTs (operators) */
605
606 UINT8 ALGO; /* algorithm */
607 UINT8 FB; /* feedback shift */
608 INT32 op1_out[2]; /* op1 output for feedback */
609
610 INT32 *connect1; /* SLOT1 output pointer */
611 INT32 *connect3; /* SLOT3 output pointer */
612 INT32 *connect2; /* SLOT2 output pointer */
613 INT32 *connect4; /* SLOT4 output pointer */
614
615 INT32 *mem_connect;/* where to put the delayed sample (MEM) */
616 INT32 mem_value; /* delayed sample (MEM) value */
617
618 INT32 pms; /* channel PMS */
619 UINT8 ams; /* channel AMS */
620
621 UINT32 fc; /* fnum,blk:adjusted to sample rate */
622 UINT8 kcode; /* key code: */
623 UINT32 block_fnum; /* current blk/fnum value for this slot (can be different betweeen slots of one channel in 3slot mode) */
624 } FM_CH;
625
626
627 typedef struct
628 {
629 UINT8 index; /* this chip index (number of chip) */
630 int clock; /* master clock (Hz) */
631 int rate; /* sampling rate (Hz) */
632 double freqbase; /* frequency base */
633 double TimerBase; /* Timer base time */
634 #if FM_BUSY_FLAG_SUPPORT
635 double BusyExpire; /* ExpireTime of Busy clear */
636 #endif
637 UINT8 address; /* address register */
638 UINT8 irq; /* interrupt level */
639 UINT8 irqmask; /* irq mask */
640 UINT8 status; /* status flag */
641 UINT32 mode; /* mode CSM / 3SLOT */
642 UINT8 prescaler_sel;/* prescaler selector */
643 UINT8 fn_h; /* freq latch */
644 int TA; /* timer a */
645 int TAC; /* timer a counter */
646 UINT8 TB; /* timer b */
647 int TBC; /* timer b counter */
648 /* local time tables */
649 INT32 dt_tab[8][32];/* DeTune table */
650 /* Extention Timer and IRQ handler */
651 FM_TIMERHANDLER Timer_Handler;
652 FM_IRQHANDLER IRQ_Handler;
653 } FM_ST;
654
655
656
657 /***********************************************************/
658 /* OPN unit */
659 /***********************************************************/
660
661 /* OPN 3slot struct */
662 typedef struct
663 {
664 UINT32 fc[3]; /* fnum3,blk3: calculated */
665 UINT8 fn_h; /* freq3 latch */
666 UINT8 kcode[3]; /* key code */
667 UINT32 block_fnum[3]; /* current fnum value for this slot (can be different betweeen slots of one channel in 3slot mode) */
668 } FM_3SLOT;
669
670 /* OPN/A/B common state */
671 typedef struct
672 {
673 UINT8 type; /* chip type */
674 FM_ST ST; /* general state */
675 FM_3SLOT SL3; /* 3 slot mode state */
676 FM_CH *P_CH; /* pointer of CH */
677 unsigned int pan[6*2]; /* fm channels output masks (0xffffffff = enable) */
678
679 UINT32 eg_cnt; /* global envelope generator counter */
680 UINT32 eg_timer; /* global envelope generator counter works at frequency = chipclock/64/3 */
681 UINT32 eg_timer_add; /* step of eg_timer */
682 UINT32 eg_timer_overflow;/* envelope generator timer overlfows every 3 samples (on real chip) */
683
684
685 /* there are 2048 FNUMs that can be generated using FNUM/BLK registers
686 but LFO works with one more bit of a precision so we really need 4096 elements */
687
688 UINT32 fn_table[4096]; /* fnumber->increment counter */
689 UINT32 fn_max;
690
691 /* LFO */
692 UINT32 lfo_cnt;
693 UINT32 lfo_inc;
694
695 UINT32 lfo_freq[8]; /* LFO FREQ table */
696 } FM_OPN;
697
698
699
700 /* current chip state */
701 static void *cur_chip = 0; /* pointer of current chip struct */
702 static FM_ST *State; /* basic status */
703 static FM_CH *cch[8]; /* pointer of FM channels */
704
705
706 static INT32 m2,c1,c2; /* Phase Modulation input for operators 2,3,4 */
707 static INT32 mem; /* one sample delay memory */
708
709 static INT32 out_fm[8]; /* outputs of working channels */
710
711 #if (BUILD_YM2608||BUILD_YM2610||BUILD_YM2610B)
712 static INT32 out_adpcm[4]; /* channel output NONE,LEFT,RIGHT or CENTER for YM2608/YM2610 ADPCM */
713 static INT32 out_delta[4]; /* channel output NONE,LEFT,RIGHT or CENTER for YM2608/YM2610 DELTAT*/
714 #endif
715
716 static UINT32 LFO_AM; /* runtime LFO calculations helper */
717 static INT32 LFO_PM; /* runtime LFO calculations helper */
718
719 /* log output level */
720 #define LOG_ERR 3 /* ERROR */
721 #define LOG_WAR 2 /* WARNING */
722 #define LOG_INF 1 /* INFORMATION */
723 #define LOG_LEVEL LOG_INF
724
725 #define LOG(n,x) (void)0
726
727 /* limitter */
728 #define Limit(val, max,min) { \
729 if ( val > max ) val = max; \
730 else if ( val < min ) val = min; \
731 }
732
733
734 /* status set and IRQ handling */
FM_STATUS_SET(FM_ST * ST,int flag)735 INLINE void FM_STATUS_SET(FM_ST *ST,int flag)
736 {
737 /* set status flag */
738 ST->status |= flag;
739 if ( !(ST->irq) && (ST->status & ST->irqmask) )
740 {
741 ST->irq = 1;
742 /* callback user interrupt handler (IRQ is OFF to ON) */
743 if(ST->IRQ_Handler) (ST->IRQ_Handler)(ST->index,1);
744 }
745 }
746
747 /* status reset and IRQ handling */
FM_STATUS_RESET(FM_ST * ST,int flag)748 INLINE void FM_STATUS_RESET(FM_ST *ST,int flag)
749 {
750 /* reset status flag */
751 ST->status &=~flag;
752 if ( (ST->irq) && !(ST->status & ST->irqmask) )
753 {
754 ST->irq = 0;
755 /* callback user interrupt handler (IRQ is ON to OFF) */
756 if(ST->IRQ_Handler) (ST->IRQ_Handler)(ST->index,0);
757 }
758 }
759
760 /* IRQ mask set */
FM_IRQMASK_SET(FM_ST * ST,int flag)761 INLINE void FM_IRQMASK_SET(FM_ST *ST,int flag)
762 {
763 ST->irqmask = flag;
764 /* IRQ handling check */
765 FM_STATUS_SET(ST,0);
766 FM_STATUS_RESET(ST,0);
767 }
768
769 /* OPN Mode Register Write */
set_timers(FM_ST * ST,int n,int v)770 INLINE void set_timers( FM_ST *ST, int n, int v )
771 {
772 /* b7 = CSM MODE */
773 /* b6 = 3 slot mode */
774 /* b5 = reset b */
775 /* b4 = reset a */
776 /* b3 = timer enable b */
777 /* b2 = timer enable a */
778 /* b1 = load b */
779 /* b0 = load a */
780 ST->mode = v;
781
782 /* reset Timer b flag */
783 if( v & 0x20 )
784 FM_STATUS_RESET(ST,0x02);
785 /* reset Timer a flag */
786 if( v & 0x10 )
787 FM_STATUS_RESET(ST,0x01);
788 /* load b */
789 if( v & 0x02 )
790 {
791 if( ST->TBC == 0 )
792 {
793 ST->TBC = ( 256-ST->TB)<<4;
794 /* External timer handler */
795 if (ST->Timer_Handler) (ST->Timer_Handler)(n,1,ST->TBC,ST->TimerBase);
796 }
797 }
798 else
799 { /* stop timer b */
800 if( ST->TBC != 0 )
801 {
802 ST->TBC = 0;
803 if (ST->Timer_Handler) (ST->Timer_Handler)(n,1,0,ST->TimerBase);
804 }
805 }
806 /* load a */
807 if( v & 0x01 )
808 {
809 if( ST->TAC == 0 )
810 {
811 ST->TAC = (1024-ST->TA);
812 /* External timer handler */
813 if (ST->Timer_Handler) (ST->Timer_Handler)(n,0,ST->TAC,ST->TimerBase);
814 }
815 }
816 else
817 { /* stop timer a */
818 if( ST->TAC != 0 )
819 {
820 ST->TAC = 0;
821 if (ST->Timer_Handler) (ST->Timer_Handler)(n,0,0,ST->TimerBase);
822 }
823 }
824 }
825
826
827 /* Timer A Overflow */
TimerAOver(FM_ST * ST)828 INLINE void TimerAOver(FM_ST *ST)
829 {
830 /* set status (if enabled) */
831 if(ST->mode & 0x04) FM_STATUS_SET(ST,0x01);
832 /* clear or reload the counter */
833 ST->TAC = (1024-ST->TA);
834 if (ST->Timer_Handler) (ST->Timer_Handler)(ST->index,0,ST->TAC,ST->TimerBase);
835 }
836 /* Timer B Overflow */
TimerBOver(FM_ST * ST)837 INLINE void TimerBOver(FM_ST *ST)
838 {
839 /* set status (if enabled) */
840 if(ST->mode & 0x08) FM_STATUS_SET(ST,0x02);
841 /* clear or reload the counter */
842 ST->TBC = ( 256-ST->TB)<<4;
843 if (ST->Timer_Handler) (ST->Timer_Handler)(ST->index,1,ST->TBC,ST->TimerBase);
844 }
845
846
847 #if FM_INTERNAL_TIMER
848 /* ----- internal timer mode , update timer */
849
850 /* ---------- calculate timer A ---------- */
851 #define INTERNAL_TIMER_A(type, ST, CSM_CH) \
852 { \
853 if( ST->TAC && (ST->Timer_Handler==0) ) \
854 if( (ST->TAC -= (int)(ST->freqbase*4096)) <= 0 ) \
855 { \
856 TimerAOver( ST ); \
857 /* CSM mode total level latch and auto key on */ \
858 if( ST->mode & 0x80 ) \
859 CSMKeyControll(type, CSM_CH ); \
860 } \
861 }
862 /* ---------- calculate timer B ---------- */
863 #define INTERNAL_TIMER_B(ST,step) \
864 { \
865 if( ST->TBC && (ST->Timer_Handler==0) ) \
866 if( (ST->TBC -= (int)(ST->freqbase*4096*step)) <= 0 ) \
867 TimerBOver( ST ); \
868 }
869 #else /* FM_INTERNAL_TIMER */
870 /* external timer mode */
871 #define INTERNAL_TIMER_A(type, ST, CSM_CH)
872 #define INTERNAL_TIMER_B(ST,step)
873 #endif /* FM_INTERNAL_TIMER */
874
875
876
877 #if FM_BUSY_FLAG_SUPPORT
FM_STATUS_FLAG(FM_ST * ST)878 INLINE UINT8 FM_STATUS_FLAG(FM_ST *ST)
879 {
880 if( ST->BusyExpire )
881 {
882 if( (ST->BusyExpire - FM_GET_TIME_NOW()) > 0)
883 return ST->status | 0x80; /* with busy */
884 /* expire */
885 ST->BusyExpire = 0;
886 }
887 return ST->status;
888 }
FM_BUSY_SET(FM_ST * ST,int busyclock)889 INLINE void FM_BUSY_SET(FM_ST *ST,int busyclock )
890 {
891 ST->BusyExpire = FM_GET_TIME_NOW() + (ST->TimerBase * busyclock);
892 }
893 #define FM_BUSY_CLEAR(ST) ((ST)->BusyExpire = 0)
894 #else
895 #define FM_STATUS_FLAG(ST) ((ST)->status)
896 #define FM_BUSY_SET(ST,bclock) {}
897 #define FM_BUSY_CLEAR(ST) {}
898 #endif
899
900
901
902
FM_KEYON(UINT8 type,FM_CH * CH,int s)903 INLINE void FM_KEYON(UINT8 type, FM_CH *CH , int s )
904 {
905 FM_SLOT *SLOT = &CH->SLOT[s];
906 if( !SLOT->key )
907 {
908 SLOT->key = 1;
909 SLOT->phase = 0; /* restart Phase Generator */
910 SLOT->ssgn = (SLOT->ssg & 0x04) >> 1;
911
912 if ((type == TYPE_YM2612) || (type == TYPE_YM2608))
913 {
914 if( (SLOT->ar + SLOT->ksr) < 32+62 )
915 {
916 SLOT->state = EG_ATT; /* phase -> Attack */
917 }
918 else
919 {
920 /* directly switch to Decay */
921 SLOT->volume = MIN_ATT_INDEX;
922 SLOT->state = EG_DEC;
923 }
924 }
925 else
926 {
927 SLOT->state = EG_ATT;
928 }
929 }
930 }
931
FM_KEYOFF(FM_CH * CH,int s)932 INLINE void FM_KEYOFF(FM_CH *CH , int s )
933 {
934 FM_SLOT *SLOT = &CH->SLOT[s];
935 if( SLOT->key )
936 {
937 SLOT->key = 0;
938 if (SLOT->state>EG_REL)
939 SLOT->state = EG_REL;/* phase -> Release */
940 }
941 }
942
943 /* set algorithm connection */
setup_connection(FM_CH * CH,int ch)944 static void setup_connection( FM_CH *CH, int ch )
945 {
946 INT32 *carrier = &out_fm[ch];
947
948 INT32 **om1 = &CH->connect1;
949 INT32 **om2 = &CH->connect3;
950 INT32 **oc1 = &CH->connect2;
951
952 INT32 **memc = &CH->mem_connect;
953
954 switch( CH->ALGO ){
955 case 0:
956 /* M1---C1---MEM---M2---C2---OUT */
957 *om1 = &c1;
958 *oc1 = &mem;
959 *om2 = &c2;
960 *memc= &m2;
961 break;
962 case 1:
963 /* M1------+-MEM---M2---C2---OUT */
964 /* C1-+ */
965 *om1 = &mem;
966 *oc1 = &mem;
967 *om2 = &c2;
968 *memc= &m2;
969 break;
970 case 2:
971 /* M1-----------------+-C2---OUT */
972 /* C1---MEM---M2-+ */
973 *om1 = &c2;
974 *oc1 = &mem;
975 *om2 = &c2;
976 *memc= &m2;
977 break;
978 case 3:
979 /* M1---C1---MEM------+-C2---OUT */
980 /* M2-+ */
981 *om1 = &c1;
982 *oc1 = &mem;
983 *om2 = &c2;
984 *memc= &c2;
985 break;
986 case 4:
987 /* M1---C1-+-OUT */
988 /* M2---C2-+ */
989 /* MEM: not used */
990 *om1 = &c1;
991 *oc1 = carrier;
992 *om2 = &c2;
993 *memc= &mem; /* store it anywhere where it will not be used */
994 break;
995 case 5:
996 /* +----C1----+ */
997 /* M1-+-MEM---M2-+-OUT */
998 /* +----C2----+ */
999 *om1 = 0; /* special mark */
1000 *oc1 = carrier;
1001 *om2 = carrier;
1002 *memc= &m2;
1003 break;
1004 case 6:
1005 /* M1---C1-+ */
1006 /* M2-+-OUT */
1007 /* C2-+ */
1008 /* MEM: not used */
1009 *om1 = &c1;
1010 *oc1 = carrier;
1011 *om2 = carrier;
1012 *memc= &mem; /* store it anywhere where it will not be used */
1013 break;
1014 case 7:
1015 /* M1-+ */
1016 /* C1-+-OUT */
1017 /* M2-+ */
1018 /* C2-+ */
1019 /* MEM: not used*/
1020 *om1 = carrier;
1021 *oc1 = carrier;
1022 *om2 = carrier;
1023 *memc= &mem; /* store it anywhere where it will not be used */
1024 break;
1025 }
1026
1027 CH->connect4 = carrier;
1028 }
1029
1030 /* set detune & multiple */
set_det_mul(FM_ST * ST,FM_CH * CH,FM_SLOT * SLOT,int v)1031 INLINE void set_det_mul(FM_ST *ST,FM_CH *CH,FM_SLOT *SLOT,int v)
1032 {
1033 SLOT->mul = (v&0x0f)? (v&0x0f)*2 : 1;
1034 SLOT->DT = ST->dt_tab[(v>>4)&7];
1035 CH->SLOT[SLOT1].Incr=-1;
1036 }
1037
1038 /* set total level */
set_tl(FM_CH * CH,FM_SLOT * SLOT,int v)1039 INLINE void set_tl(FM_CH *CH,FM_SLOT *SLOT , int v)
1040 {
1041 (void)CH;
1042 SLOT->tl = (v&0x7f)<<(ENV_BITS-7); /* 7bit TL */
1043 }
1044
1045 /* set attack rate & key scale */
set_ar_ksr(UINT8 type,FM_CH * CH,FM_SLOT * SLOT,int v)1046 INLINE void set_ar_ksr(UINT8 type, FM_CH *CH,FM_SLOT *SLOT,int v)
1047 {
1048 UINT8 old_KSR = SLOT->KSR;
1049
1050 SLOT->ar = (v&0x1f) ? 32 + ((v&0x1f)<<1) : 0;
1051
1052 SLOT->KSR = 3-(v>>6);
1053 if (SLOT->KSR != old_KSR)
1054 {
1055 CH->SLOT[SLOT1].Incr=-1;
1056 }
1057
1058 /* refresh Attack rate */
1059 if ((SLOT->ar + SLOT->ksr) < 32+62)
1060 {
1061 SLOT->eg_sh_ar = eg_rate_shift [SLOT->ar + SLOT->ksr ];
1062 if ((type == TYPE_YM2612) || (type == TYPE_YM2608))
1063 {
1064 SLOT->eg_sh_ar = eg_rate_shift [SLOT->ar + SLOT->ksr ];
1065 SLOT->eg_sel_ar = eg_rate_select2612[SLOT->ar + SLOT->ksr ];
1066 }
1067 else
1068 {
1069 SLOT->eg_sel_ar = eg_rate_select[SLOT->ar + SLOT->ksr ];
1070 }
1071 }
1072 else
1073 {
1074 SLOT->eg_sh_ar = 0;
1075 SLOT->eg_sel_ar = 17*RATE_STEPS;
1076 }
1077 }
1078
1079 /* set decay rate */
set_dr(UINT8 type,FM_SLOT * SLOT,int v)1080 INLINE void set_dr(UINT8 type, FM_SLOT *SLOT,int v)
1081 {
1082 SLOT->d1r = (v&0x1f) ? 32 + ((v&0x1f)<<1) : 0;
1083
1084 SLOT->eg_sh_d1r = eg_rate_shift [SLOT->d1r + SLOT->ksr];
1085 if ((type == TYPE_YM2612) || (type == TYPE_YM2608))
1086 {
1087 SLOT->eg_sel_d1r= eg_rate_select2612[SLOT->d1r + SLOT->ksr];
1088 }
1089 else
1090 {
1091 SLOT->eg_sel_d1r= eg_rate_select[SLOT->d1r + SLOT->ksr];
1092 }
1093
1094 }
1095
1096 /* set sustain rate */
set_sr(UINT8 type,FM_SLOT * SLOT,int v)1097 INLINE void set_sr(UINT8 type, FM_SLOT *SLOT,int v)
1098 {
1099 SLOT->d2r = (v&0x1f) ? 32 + ((v&0x1f)<<1) : 0;
1100
1101 SLOT->eg_sh_d2r = eg_rate_shift [SLOT->d2r + SLOT->ksr];
1102 if ((type == TYPE_YM2612) || (type == TYPE_YM2608))
1103 {
1104 SLOT->eg_sel_d2r= eg_rate_select2612[SLOT->d2r + SLOT->ksr];
1105 }
1106 else
1107 {
1108 SLOT->eg_sel_d2r= eg_rate_select[SLOT->d2r + SLOT->ksr];
1109 }
1110 }
1111
1112 /* set release rate */
set_sl_rr(UINT8 type,FM_SLOT * SLOT,int v)1113 INLINE void set_sl_rr(UINT8 type, FM_SLOT *SLOT,int v)
1114 {
1115 SLOT->sl = sl_table[ v>>4 ];
1116
1117 SLOT->rr = 34 + ((v&0x0f)<<2);
1118
1119 SLOT->eg_sh_rr = eg_rate_shift [SLOT->rr + SLOT->ksr];
1120 if ((type == TYPE_YM2612) || (type == TYPE_YM2608))
1121 {
1122 SLOT->eg_sel_rr = eg_rate_select2612[SLOT->rr + SLOT->ksr];
1123 }
1124 else
1125 {
1126 SLOT->eg_sel_rr = eg_rate_select[SLOT->rr + SLOT->ksr];
1127 }
1128 }
1129
1130
1131
op_calc(UINT32 phase,unsigned int env,signed int pm)1132 INLINE signed int op_calc(UINT32 phase, unsigned int env, signed int pm)
1133 {
1134 UINT32 p;
1135
1136 p = (env<<3) + sin_tab[ ( ((signed int)((phase & ~FREQ_MASK) + (pm<<15))) >> FREQ_SH ) & SIN_MASK ];
1137
1138 if (p >= TL_TAB_LEN)
1139 return 0;
1140 return tl_tab[p];
1141 }
1142
op_calc1(UINT32 phase,unsigned int env,signed int pm)1143 INLINE signed int op_calc1(UINT32 phase, unsigned int env, signed int pm)
1144 {
1145 UINT32 p;
1146
1147 p = (env<<3) + sin_tab[ ( ((signed int)((phase & ~FREQ_MASK) + pm )) >> FREQ_SH ) & SIN_MASK ];
1148
1149 if (p >= TL_TAB_LEN)
1150 return 0;
1151 return tl_tab[p];
1152 }
1153
1154 /* advance LFO to next sample */
advance_lfo(FM_OPN * OPN)1155 INLINE void advance_lfo(FM_OPN *OPN)
1156 {
1157 UINT8 pos;
1158
1159 if (OPN->lfo_inc) /* LFO enabled ? */
1160 {
1161 OPN->lfo_cnt += OPN->lfo_inc;
1162
1163 pos = (OPN->lfo_cnt >> LFO_SH) & 127;
1164
1165
1166 /* update AM when LFO output changes */
1167
1168 /* actually I can't optimize is this way without rewritting chan_calc()
1169 to use chip->lfo_am instead of global lfo_am */
1170 {
1171
1172 /* triangle */
1173 /* AM: 0 to 126 step +2, 126 to 0 step -2 */
1174 if (pos<64)
1175 LFO_AM = (pos&63) * 2;
1176 else
1177 LFO_AM = 126 - ((pos&63) * 2);
1178 }
1179
1180 /* PM works with 4 times slower clock */
1181 pos >>= 2;
1182 /* update PM when LFO output changes */
1183 /*if (prev_pos != pos)*/ /* can't use global lfo_pm for this optimization, must be chip->lfo_pm instead*/
1184 {
1185 LFO_PM = pos;
1186 }
1187
1188 }
1189 else
1190 {
1191 LFO_AM = 0;
1192 LFO_PM = 0;
1193 }
1194 }
1195
advance_eg_channel(FM_OPN * OPN,FM_SLOT * SLOT)1196 INLINE void advance_eg_channel(FM_OPN *OPN, FM_SLOT *SLOT)
1197 {
1198 unsigned int out;
1199 unsigned int swap_flag = 0;
1200 unsigned int i;
1201
1202
1203 i = 4; /* four operators per channel */
1204 do
1205 {
1206 /* reset SSG-EG swap flag */
1207 swap_flag = 0;
1208
1209 switch(SLOT->state)
1210 {
1211 case EG_ATT: /* attack phase */
1212 if ( !(OPN->eg_cnt & ((1<<SLOT->eg_sh_ar)-1) ) )
1213 {
1214 SLOT->volume += (~SLOT->volume *
1215 (eg_inc[SLOT->eg_sel_ar + ((OPN->eg_cnt>>SLOT->eg_sh_ar)&7)])
1216 ) >>4;
1217
1218 if (SLOT->volume <= MIN_ATT_INDEX)
1219 {
1220 SLOT->volume = MIN_ATT_INDEX;
1221 SLOT->state = EG_DEC;
1222 }
1223 }
1224 break;
1225
1226 case EG_DEC: /* decay phase */
1227 if ((OPN->type == TYPE_YM2612) || (OPN->type == TYPE_YM2608))
1228 {
1229 if ( !(OPN->eg_cnt & ((1<<SLOT->eg_sh_d1r)-1) ) )
1230 {
1231 if (SLOT->ssg&0x08) /* SSG EG type envelope selected */
1232 {
1233 SLOT->volume += 6 * eg_inc[SLOT->eg_sel_d1r + ((OPN->eg_cnt>>SLOT->eg_sh_d1r)&7)];
1234 }
1235 else
1236 {
1237 SLOT->volume += eg_inc[SLOT->eg_sel_d1r + ((OPN->eg_cnt>>SLOT->eg_sh_d1r)&7)];
1238 }
1239 }
1240
1241 /* check transition even if no volume update: this fixes the case when SL = MIN_ATT_INDEX */
1242 if ( SLOT->volume >= (INT32)(SLOT->sl) )
1243 {
1244 SLOT->volume = (INT32)(SLOT->sl);
1245 SLOT->state = EG_SUS;
1246 }
1247 }
1248 else
1249 {
1250 if (SLOT->ssg&0x08) /* SSG EG type envelope selected */
1251 {
1252 if ( !(OPN->eg_cnt & ((1<<SLOT->eg_sh_d1r)-1) ) )
1253 {
1254 SLOT->volume += 4 * eg_inc[SLOT->eg_sel_d1r + ((OPN->eg_cnt>>SLOT->eg_sh_d1r)&7)];
1255
1256 if ( SLOT->volume >= (INT32)(SLOT->sl) )
1257 SLOT->state = EG_SUS;
1258 }
1259 }
1260 else
1261 {
1262 if ( !(OPN->eg_cnt & ((1<<SLOT->eg_sh_d1r)-1) ) )
1263 {
1264 SLOT->volume += eg_inc[SLOT->eg_sel_d1r + ((OPN->eg_cnt>>SLOT->eg_sh_d1r)&7)];
1265
1266 if ( SLOT->volume >= (INT32)(SLOT->sl) )
1267 SLOT->state = EG_SUS;
1268 }
1269 }
1270 }
1271 break;
1272
1273 case EG_SUS: /* sustain phase */
1274 if (SLOT->ssg&0x08) /* SSG EG type envelope selected */
1275 {
1276 if ( !(OPN->eg_cnt & ((1<<SLOT->eg_sh_d2r)-1) ) )
1277 {
1278 if ((OPN->type == TYPE_YM2612) || (OPN->type == TYPE_YM2608))
1279 {
1280 SLOT->volume += 6 * eg_inc[SLOT->eg_sel_d2r + ((OPN->eg_cnt>>SLOT->eg_sh_d2r)&7)];
1281 }
1282 else
1283 {
1284 SLOT->volume += 4 * eg_inc[SLOT->eg_sel_d2r + ((OPN->eg_cnt>>SLOT->eg_sh_d2r)&7)];
1285 }
1286
1287 if ( SLOT->volume >= ENV_QUIET )
1288 {
1289 if ((OPN->type != TYPE_YM2612) && (OPN->type != TYPE_YM2608))
1290 {
1291 SLOT->volume = MAX_ATT_INDEX;
1292 }
1293
1294 if (SLOT->ssg&0x01) /* bit 0 = hold */
1295 {
1296 if (SLOT->ssgn&1) /* have we swapped once ??? */
1297 {
1298 /* yes, so do nothing, just hold current level */
1299 }
1300 else
1301 swap_flag = (SLOT->ssg&0x02) | 1 ; /* bit 1 = alternate */
1302
1303 }
1304 else
1305 {
1306 /* same as KEY-ON operation */
1307
1308 /* restart of the Phase Generator should be here */
1309 SLOT->phase = 0;
1310
1311 if ((OPN->type == TYPE_YM2612) || (OPN->type == TYPE_YM2608))
1312 {
1313 if ((SLOT->ar + SLOT->ksr) < 94 /*32+62*/)
1314 {
1315 SLOT->state = EG_ATT; /* phase -> Attack */
1316 }
1317 else
1318 {
1319 /* Attack Rate is maximal: directly switch to Decay (or Substain) */
1320 SLOT->volume = MIN_ATT_INDEX;
1321 SLOT->state = (SLOT->sl == MIN_ATT_INDEX) ? EG_SUS : EG_DEC;
1322 }
1323 }
1324 else
1325 {
1326 /* phase -> Attack */
1327 SLOT->volume = 511;
1328 SLOT->state = EG_ATT;
1329 }
1330
1331 swap_flag = (SLOT->ssg&0x02); /* bit 1 = alternate */
1332 }
1333 }
1334 }
1335 }
1336 else
1337 {
1338 if ( !(OPN->eg_cnt & ((1<<SLOT->eg_sh_d2r)-1) ) )
1339 {
1340 SLOT->volume += eg_inc[SLOT->eg_sel_d2r + ((OPN->eg_cnt>>SLOT->eg_sh_d2r)&7)];
1341
1342 if ( SLOT->volume >= MAX_ATT_INDEX )
1343 {
1344 SLOT->volume = MAX_ATT_INDEX;
1345 /* do not change SLOT->state (verified on real chip) */
1346 }
1347 }
1348
1349 }
1350 break;
1351
1352 case EG_REL: /* release phase */
1353 if ( !(OPN->eg_cnt & ((1<<SLOT->eg_sh_rr)-1) ) )
1354 {
1355 /* SSG-EG affects Release phase also (Nemesis) */
1356 if ((SLOT->ssg&0x08) && ((OPN->type = TYPE_YM2612) || (OPN->type = TYPE_YM2608)))
1357 {
1358 SLOT->volume += 6 * eg_inc[SLOT->eg_sel_rr + ((OPN->eg_cnt>>SLOT->eg_sh_rr)&7)];
1359 }
1360 else
1361 {
1362 SLOT->volume += eg_inc[SLOT->eg_sel_rr + ((OPN->eg_cnt>>SLOT->eg_sh_rr)&7)];
1363 }
1364
1365 if ( SLOT->volume >= MAX_ATT_INDEX )
1366 {
1367 SLOT->volume = MAX_ATT_INDEX;
1368 SLOT->state = EG_OFF;
1369 }
1370 }
1371 break;
1372
1373 }
1374
1375 out = ((UINT32)SLOT->volume);
1376
1377 /* negate output (changes come from alternate bit, init comes from attack bit) */
1378 if ((SLOT->ssg&0x08) && (SLOT->ssgn&2) && (SLOT->state > EG_REL))
1379 out ^= MAX_ATT_INDEX;
1380
1381 /* we need to store the result here because we are going to change ssgn
1382 in next instruction */
1383 SLOT->vol_out = out + SLOT->tl;
1384
1385 /* reverse SLOT inversion flag */
1386 SLOT->ssgn ^= swap_flag;
1387
1388 SLOT++;
1389 i--;
1390 }while (i);
1391
1392 }
1393
1394
1395
1396 #define volume_calc(OP) ((OP)->vol_out + (AM & (OP)->AMmask))
1397
update_phase_lfo_slot(FM_OPN * OPN,FM_SLOT * SLOT,INT32 pms,UINT32 block_fnum)1398 INLINE void update_phase_lfo_slot(FM_OPN *OPN, FM_SLOT *SLOT, INT32 pms, UINT32 block_fnum)
1399 {
1400 UINT32 fnum_lfo = ((block_fnum & 0x7f0) >> 4) * 32 * 8;
1401 INT32 lfo_fn_table_index_offset = lfo_pm_table[ fnum_lfo + pms + LFO_PM ];
1402
1403 if (lfo_fn_table_index_offset) /* LFO phase modulation active */
1404 {
1405 UINT8 blk;
1406 UINT32 fn;
1407 int kc, fc;
1408
1409 block_fnum = block_fnum*2 + lfo_fn_table_index_offset;
1410
1411 blk = (block_fnum&0x7000) >> 12;
1412 fn = block_fnum & 0xfff;
1413
1414 /* keyscale code */
1415 kc = (blk<<2) | opn_fktable[fn >> 8];
1416
1417 /* phase increment counter */
1418 fc = (OPN->fn_table[fn]>>(7-blk)) + SLOT->DT[kc];
1419
1420 /* detects frequency overflow (credits to Nemesis) */
1421 if (fc < 0) fc += OPN->fn_max;
1422
1423 /* update phase */
1424 SLOT->phase += (fc * SLOT->mul) >> 1;
1425 }
1426 else /* LFO phase modulation = zero */
1427 {
1428 SLOT->phase += SLOT->Incr;
1429 }
1430 }
1431
update_phase_lfo_channel(FM_OPN * OPN,FM_CH * CH)1432 INLINE void update_phase_lfo_channel(FM_OPN *OPN, FM_CH *CH)
1433 {
1434 UINT32 block_fnum = CH->block_fnum;
1435
1436 UINT32 fnum_lfo = ((block_fnum & 0x7f0) >> 4) * 32 * 8;
1437 INT32 lfo_fn_table_index_offset = lfo_pm_table[ fnum_lfo + CH->pms + LFO_PM ];
1438
1439 if (lfo_fn_table_index_offset) /* LFO phase modulation active */
1440 {
1441 UINT8 blk;
1442 UINT32 fn;
1443 int kc, fc, finc;
1444
1445 block_fnum = block_fnum*2 + lfo_fn_table_index_offset;
1446
1447 blk = (block_fnum&0x7000) >> 12;
1448 fn = block_fnum & 0xfff;
1449
1450 /* keyscale code */
1451 kc = (blk<<2) | opn_fktable[fn >> 8];
1452
1453 /* phase increment counter */
1454 fc = (OPN->fn_table[fn]>>(7-blk));
1455
1456 /* detects frequency overflow (credits to Nemesis) */
1457 finc = fc + CH->SLOT[SLOT1].DT[kc];
1458
1459 if (finc < 0) finc += OPN->fn_max;
1460 CH->SLOT[SLOT1].phase += (finc*CH->SLOT[SLOT1].mul) >> 1;
1461
1462 finc = fc + CH->SLOT[SLOT2].DT[kc];
1463 if (finc < 0) finc += OPN->fn_max;
1464 CH->SLOT[SLOT2].phase += (finc*CH->SLOT[SLOT2].mul) >> 1;
1465
1466 finc = fc + CH->SLOT[SLOT3].DT[kc];
1467 if (finc < 0) finc += OPN->fn_max;
1468 CH->SLOT[SLOT3].phase += (finc*CH->SLOT[SLOT3].mul) >> 1;
1469
1470 finc = fc + CH->SLOT[SLOT4].DT[kc];
1471 if (finc < 0) finc += OPN->fn_max;
1472 CH->SLOT[SLOT4].phase += (finc*CH->SLOT[SLOT4].mul) >> 1;
1473 }
1474 else /* LFO phase modulation = zero */
1475 {
1476 CH->SLOT[SLOT1].phase += CH->SLOT[SLOT1].Incr;
1477 CH->SLOT[SLOT2].phase += CH->SLOT[SLOT2].Incr;
1478 CH->SLOT[SLOT3].phase += CH->SLOT[SLOT3].Incr;
1479 CH->SLOT[SLOT4].phase += CH->SLOT[SLOT4].Incr;
1480 }
1481 }
1482
chan_calc(FM_OPN * OPN,FM_CH * CH,int chnum)1483 INLINE void chan_calc(FM_OPN *OPN, FM_CH *CH, int chnum)
1484 {
1485 unsigned int eg_out;
1486
1487 UINT32 AM = LFO_AM >> CH->ams;
1488
1489
1490 m2 = c1 = c2 = mem = 0;
1491
1492 *CH->mem_connect = CH->mem_value; /* restore delayed sample (MEM) value to m2 or c2 */
1493
1494 eg_out = volume_calc(&CH->SLOT[SLOT1]);
1495 {
1496 INT32 out = CH->op1_out[0] + CH->op1_out[1];
1497 CH->op1_out[0] = CH->op1_out[1];
1498
1499 if( !CH->connect1 ){
1500 /* algorithm 5 */
1501 mem = c1 = c2 = CH->op1_out[0];
1502 }
1503 else
1504 {
1505 /* other algorithms */
1506 *CH->connect1 += CH->op1_out[0];
1507 }
1508
1509 CH->op1_out[1] = 0;
1510 if( eg_out < ENV_QUIET ) /* SLOT 1 */
1511 {
1512 if (!CH->FB)
1513 out=0;
1514
1515 CH->op1_out[1] = op_calc1(CH->SLOT[SLOT1].phase, eg_out, (out<<CH->FB) );
1516 }
1517 }
1518
1519 eg_out = volume_calc(&CH->SLOT[SLOT3]);
1520 if( eg_out < ENV_QUIET ) /* SLOT 3 */
1521 *CH->connect3 += op_calc(CH->SLOT[SLOT3].phase, eg_out, m2);
1522
1523 eg_out = volume_calc(&CH->SLOT[SLOT2]);
1524 if( eg_out < ENV_QUIET ) /* SLOT 2 */
1525 *CH->connect2 += op_calc(CH->SLOT[SLOT2].phase, eg_out, c1);
1526
1527 eg_out = volume_calc(&CH->SLOT[SLOT4]);
1528 if( eg_out < ENV_QUIET ) /* SLOT 4 */
1529 *CH->connect4 += op_calc(CH->SLOT[SLOT4].phase, eg_out, c2);
1530
1531
1532 /* store current MEM */
1533 CH->mem_value = mem;
1534
1535 /* update phase counters AFTER output calculations */
1536 if(CH->pms)
1537 {
1538 /* add support for 3 slot mode */
1539 if ((OPN->ST.mode & 0xC0) && (chnum == 2))
1540 {
1541 update_phase_lfo_slot(OPN, &CH->SLOT[SLOT1], CH->pms, OPN->SL3.block_fnum[1]);
1542 update_phase_lfo_slot(OPN, &CH->SLOT[SLOT2], CH->pms, OPN->SL3.block_fnum[2]);
1543 update_phase_lfo_slot(OPN, &CH->SLOT[SLOT3], CH->pms, OPN->SL3.block_fnum[0]);
1544 update_phase_lfo_slot(OPN, &CH->SLOT[SLOT4], CH->pms, CH->block_fnum);
1545 }
1546 else update_phase_lfo_channel(OPN, CH);
1547 }
1548 else /* no LFO phase modulation */
1549 {
1550 CH->SLOT[SLOT1].phase += CH->SLOT[SLOT1].Incr;
1551 CH->SLOT[SLOT2].phase += CH->SLOT[SLOT2].Incr;
1552 CH->SLOT[SLOT3].phase += CH->SLOT[SLOT3].Incr;
1553 CH->SLOT[SLOT4].phase += CH->SLOT[SLOT4].Incr;
1554 }
1555 }
1556
1557 /* update phase increment and envelope generator */
refresh_fc_eg_slot(FM_OPN * OPN,FM_SLOT * SLOT,int fc,int kc)1558 INLINE void refresh_fc_eg_slot(FM_OPN *OPN, FM_SLOT *SLOT , int fc , int kc )
1559 {
1560 int ksr = kc >> SLOT->KSR;
1561
1562 fc += SLOT->DT[kc];
1563
1564 /* detects frequency overflow (credits to Nemesis) */
1565 if (fc < 0) fc += OPN->fn_max;
1566
1567 /* (frequency) phase increment counter */
1568 SLOT->Incr = (fc * SLOT->mul) >> 1;
1569
1570 if( SLOT->ksr != ksr )
1571 {
1572 SLOT->ksr = ksr;
1573
1574 /* calculate envelope generator rates */
1575 if ((SLOT->ar + SLOT->ksr) < 32+62)
1576 {
1577 SLOT->eg_sh_ar = eg_rate_shift [SLOT->ar + SLOT->ksr ];
1578 if ((OPN->type == TYPE_YM2612) || (OPN->type == TYPE_YM2608))
1579 {
1580 SLOT->eg_sel_ar = eg_rate_select2612[SLOT->ar + SLOT->ksr ];
1581 }
1582 else
1583 {
1584 SLOT->eg_sel_ar = eg_rate_select[SLOT->ar + SLOT->ksr ];
1585 }
1586 }
1587 else
1588 {
1589 SLOT->eg_sh_ar = 0;
1590 SLOT->eg_sel_ar = 17*RATE_STEPS;
1591 }
1592
1593 SLOT->eg_sh_d1r = eg_rate_shift [SLOT->d1r + SLOT->ksr];
1594 SLOT->eg_sh_d2r = eg_rate_shift [SLOT->d2r + SLOT->ksr];
1595 SLOT->eg_sh_rr = eg_rate_shift [SLOT->rr + SLOT->ksr];
1596
1597 if ((OPN->type == TYPE_YM2612) || (OPN->type == TYPE_YM2608))
1598 {
1599 SLOT->eg_sel_d1r= eg_rate_select2612[SLOT->d1r + SLOT->ksr];
1600 SLOT->eg_sel_d2r= eg_rate_select2612[SLOT->d2r + SLOT->ksr];
1601 SLOT->eg_sel_rr = eg_rate_select2612[SLOT->rr + SLOT->ksr];
1602 }
1603 else
1604 {
1605 SLOT->eg_sel_d1r= eg_rate_select[SLOT->d1r + SLOT->ksr];
1606 SLOT->eg_sel_d2r= eg_rate_select[SLOT->d2r + SLOT->ksr];
1607 SLOT->eg_sel_rr = eg_rate_select[SLOT->rr + SLOT->ksr];
1608 }
1609 }
1610 }
1611
1612 /* update phase increment counters */
1613 /* Changed from INLINE to static to work around gcc 4.2.1 codegen bug */
refresh_fc_eg_chan(FM_OPN * OPN,FM_CH * CH)1614 static void refresh_fc_eg_chan(FM_OPN *OPN, FM_CH *CH )
1615 {
1616 if( CH->SLOT[SLOT1].Incr==-1){
1617 int fc = CH->fc;
1618 int kc = CH->kcode;
1619 refresh_fc_eg_slot(OPN, &CH->SLOT[SLOT1] , fc , kc );
1620 refresh_fc_eg_slot(OPN, &CH->SLOT[SLOT2] , fc , kc );
1621 refresh_fc_eg_slot(OPN, &CH->SLOT[SLOT3] , fc , kc );
1622 refresh_fc_eg_slot(OPN, &CH->SLOT[SLOT4] , fc , kc );
1623 }
1624 }
1625
1626 /* initialize time tables */
init_timetables(FM_ST * ST,const UINT8 * dttable)1627 static void init_timetables( FM_ST *ST , const UINT8 *dttable )
1628 {
1629 int i,d;
1630 double rate;
1631
1632 #if 0
1633 logerror("FM.C: samplerate=%8i chip clock=%8i freqbase=%f \n",
1634 ST->rate, ST->clock, ST->freqbase );
1635 #endif
1636
1637 /* DeTune table */
1638 for (d = 0;d <= 3;d++){
1639 for (i = 0;i <= 31;i++){
1640 rate = ((double)dttable[d*32 + i]) * SIN_LEN * ST->freqbase * (1<<FREQ_SH) / ((double)(1<<20));
1641 ST->dt_tab[d][i] = (INT32) rate;
1642 ST->dt_tab[d+4][i] = -ST->dt_tab[d][i];
1643 #if 0
1644 logerror("FM.C: DT [%2i %2i] = %8x \n", d, i, ST->dt_tab[d][i] );
1645 #endif
1646 }
1647 }
1648
1649 }
1650
1651
reset_channels(FM_ST * ST,FM_CH * CH,int num)1652 static void reset_channels( FM_ST *ST , FM_CH *CH , int num )
1653 {
1654 int c,s;
1655
1656 ST->mode = 0; /* normal mode */
1657 ST->TA = 0;
1658 ST->TAC = 0;
1659 ST->TB = 0;
1660 ST->TBC = 0;
1661
1662 for( c = 0 ; c < num ; c++ )
1663 {
1664 CH[c].fc = 0;
1665 for(s = 0 ; s < 4 ; s++ )
1666 {
1667 CH[c].SLOT[s].ssg = 0;
1668 CH[c].SLOT[s].ssgn = 0;
1669 CH[c].SLOT[s].state= EG_OFF;
1670 CH[c].SLOT[s].volume = MAX_ATT_INDEX;
1671 CH[c].SLOT[s].vol_out= MAX_ATT_INDEX;
1672 }
1673 }
1674 }
1675
1676 /* initialize generic tables */
init_tables(void)1677 static int init_tables(void)
1678 {
1679 signed int i,x;
1680 signed int n;
1681 double o,m;
1682
1683 for (x=0; x<TL_RES_LEN; x++)
1684 {
1685 m = (1<<16) / pow(2, (x+1) * (ENV_STEP/4.0) / 8.0);
1686 m = floor(m);
1687
1688 /* we never reach (1<<16) here due to the (x+1) */
1689 /* result fits within 16 bits at maximum */
1690
1691 n = (int)m; /* 16 bits here */
1692 n >>= 4; /* 12 bits here */
1693 if (n&1) /* round to nearest */
1694 n = (n>>1)+1;
1695 else
1696 n = n>>1;
1697 /* 11 bits here (rounded) */
1698 n <<= 2; /* 13 bits here (as in real chip) */
1699 tl_tab[ x*2 + 0 ] = n;
1700 tl_tab[ x*2 + 1 ] = -tl_tab[ x*2 + 0 ];
1701
1702 for (i=1; i<13; i++)
1703 {
1704 tl_tab[ x*2+0 + i*2*TL_RES_LEN ] = tl_tab[ x*2+0 ]>>i;
1705 tl_tab[ x*2+1 + i*2*TL_RES_LEN ] = -tl_tab[ x*2+0 + i*2*TL_RES_LEN ];
1706 }
1707 #if 0
1708 logerror("tl %04i", x);
1709 for (i=0; i<13; i++)
1710 logerror(", [%02i] %4x", i*2, tl_tab[ x*2 /*+1*/ + i*2*TL_RES_LEN ]);
1711 logerror("\n");
1712 }
1713 #endif
1714 }
1715 /*logerror("FM.C: TL_TAB_LEN = %i elements (%i bytes)\n",TL_TAB_LEN, (int)sizeof(tl_tab));*/
1716
1717
1718 for (i=0; i<SIN_LEN; i++)
1719 {
1720 /* non-standard sinus */
1721 m = sin( ((i*2)+1) * PI / SIN_LEN ); /* checked against the real chip */
1722
1723 /* we never reach zero here due to ((i*2)+1) */
1724
1725 if (m>0.0)
1726 o = 8*log(1.0/m)/log(2); /* convert to 'decibels' */
1727 else
1728 o = 8*log(-1.0/m)/log(2); /* convert to 'decibels' */
1729
1730 o = o / (ENV_STEP/4);
1731
1732 n = (int)(2.0*o);
1733 if (n&1) /* round to nearest */
1734 n = (n>>1)+1;
1735 else
1736 n = n>>1;
1737
1738 sin_tab[ i ] = n*2 + (m>=0.0? 0: 1 );
1739 /*logerror("FM.C: sin [%4i]= %4i (tl_tab value=%5i)\n", i, sin_tab[i],tl_tab[sin_tab[i]]);*/
1740 }
1741
1742 /*logerror("FM.C: ENV_QUIET= %08x\n",ENV_QUIET );*/
1743
1744
1745 /* build LFO PM modulation table */
1746 for(i = 0; i < 8; i++) /* 8 PM depths */
1747 {
1748 UINT8 fnum;
1749 for (fnum=0; fnum<128; fnum++) /* 7 bits meaningful of F-NUMBER */
1750 {
1751 UINT8 value;
1752 UINT8 step;
1753 UINT32 offset_depth = i;
1754 UINT32 offset_fnum_bit;
1755 UINT32 bit_tmp;
1756
1757 for (step=0; step<8; step++)
1758 {
1759 value = 0;
1760 for (bit_tmp=0; bit_tmp<7; bit_tmp++) /* 7 bits */
1761 {
1762 if (fnum & (1<<bit_tmp)) /* only if bit "bit_tmp" is set */
1763 {
1764 offset_fnum_bit = bit_tmp * 8;
1765 value += lfo_pm_output[offset_fnum_bit + offset_depth][step];
1766 }
1767 }
1768 lfo_pm_table[(fnum*32*8) + (i*32) + step + 0] = value;
1769 lfo_pm_table[(fnum*32*8) + (i*32) +(step^7)+ 8] = value;
1770 lfo_pm_table[(fnum*32*8) + (i*32) + step +16] = -value;
1771 lfo_pm_table[(fnum*32*8) + (i*32) +(step^7)+24] = -value;
1772 }
1773 #if 0
1774 logerror("LFO depth=%1x FNUM=%04x (<<4=%4x): ", i, fnum, fnum<<4);
1775 for (step=0; step<16; step++) /* dump only positive part of waveforms */
1776 logerror("%02x ", lfo_pm_table[(fnum*32*8) + (i*32) + step] );
1777 logerror("\n");
1778 #endif
1779
1780 }
1781 }
1782
1783
1784
1785 #ifdef SAVE_SAMPLE
1786 sample[0]=fopen("sampsum.pcm","wb");
1787 #endif
1788
1789 return 1;
1790
1791 }
1792
1793
1794
FMCloseTable(void)1795 static void FMCloseTable( void )
1796 {
1797 #ifdef SAVE_SAMPLE
1798 fclose(sample[0]);
1799 #endif
1800 return;
1801 }
1802
1803
1804 /* CSM Key Controll */
CSMKeyControll(UINT8 type,FM_CH * CH)1805 INLINE void CSMKeyControll(UINT8 type, FM_CH *CH)
1806 {
1807 /* all key on then off (only for operators which were OFF!) */
1808 if (!CH->SLOT[SLOT1].key)
1809 {
1810 FM_KEYON(type, CH,SLOT1);
1811 FM_KEYOFF(CH, SLOT1);
1812 }
1813 if (!CH->SLOT[SLOT2].key)
1814 {
1815 FM_KEYON(type, CH,SLOT2);
1816 FM_KEYOFF(CH, SLOT2);
1817 }
1818 if (!CH->SLOT[SLOT3].key)
1819 {
1820 FM_KEYON(type, CH,SLOT3);
1821 FM_KEYOFF(CH, SLOT3);
1822 }
1823 if (!CH->SLOT[SLOT4].key)
1824 {
1825 FM_KEYON(type, CH,SLOT4);
1826 FM_KEYOFF(CH, SLOT4);
1827 }
1828 }
1829
1830 #ifdef _STATE_H
1831 /* FM channel save , internal state only */
FMsave_state_channel(const char * name,int num,FM_CH * CH,int num_ch)1832 static void FMsave_state_channel(const char *name,int num,FM_CH *CH,int num_ch)
1833 {
1834 int slot , ch;
1835 char state_name[20];
1836 const char slot_array[4] = { 1 , 3 , 2 , 4 };
1837
1838 for(ch=0;ch<num_ch;ch++,CH++)
1839 {
1840 /* channel */
1841 sprintf(state_name,"%s.CH%d",name,ch);
1842 state_save_register_INT32(state_name, num, "feedback" , CH->op1_out , 2);
1843 state_save_register_UINT32(state_name, num, "phasestep" , &CH->fc , 1);
1844 /* slots */
1845 for(slot=0;slot<4;slot++)
1846 {
1847 FM_SLOT *SLOT = &CH->SLOT[slot];
1848
1849 sprintf(state_name,"%s.CH%d.SLOT%d",name,ch,slot_array[slot]);
1850 state_save_register_UINT32(state_name, num, "phasecount" , &SLOT->phase, 1);
1851 state_save_register_UINT8 (state_name, num, "state" , &SLOT->state, 1);
1852 state_save_register_INT32 (state_name, num, "volume" , &SLOT->volume, 1);
1853 }
1854 }
1855 }
1856
FMsave_state_st(const char * state_name,int num,FM_ST * ST)1857 static void FMsave_state_st(const char *state_name,int num,FM_ST *ST)
1858 {
1859 #if FM_BUSY_FLAG_SUPPORT
1860 state_save_register_double(state_name, num, "BusyExpire", &ST->BusyExpire , 1);
1861 #endif
1862 state_save_register_UINT8 (state_name, num, "address" , &ST->address , 1);
1863 state_save_register_UINT8 (state_name, num, "IRQ" , &ST->irq , 1);
1864 state_save_register_UINT8 (state_name, num, "IRQ MASK" , &ST->irqmask , 1);
1865 state_save_register_UINT8 (state_name, num, "status" , &ST->status , 1);
1866 state_save_register_UINT32(state_name, num, "mode" , &ST->mode , 1);
1867 state_save_register_UINT8 (state_name, num, "prescaler" , &ST->prescaler_sel , 1);
1868 state_save_register_UINT8 (state_name, num, "freq latch", &ST->fn_h , 1);
1869 state_save_register_int (state_name, num, "TIMER A" , &ST->TA );
1870 state_save_register_int (state_name, num, "TIMER Acnt", &ST->TAC );
1871 state_save_register_UINT8 (state_name, num, "TIMER B" , &ST->TB , 1);
1872 state_save_register_int (state_name, num, "TIMER Bcnt", &ST->TBC );
1873 }
1874 #endif /* _STATE_H */
1875
1876 #if BUILD_OPN
1877
1878
1879
1880 /* prescaler set (and make time tables) */
OPNSetPres(FM_OPN * OPN,int pres,int TimerPres,int SSGpres)1881 static void OPNSetPres(FM_OPN *OPN , int pres , int TimerPres, int SSGpres)
1882 {
1883 int i;
1884
1885 /* frequency base */
1886 OPN->ST.freqbase = (OPN->ST.rate) ? ((double)OPN->ST.clock / OPN->ST.rate) / pres : 0;
1887
1888 #if 0
1889 OPN->ST.rate = (double)OPN->ST.clock / pres;
1890 OPN->ST.freqbase = 1.0;
1891 #endif
1892
1893 OPN->eg_timer_add = (1<<EG_SH) * OPN->ST.freqbase;
1894 OPN->eg_timer_overflow = ( 3 ) * (1<<EG_SH);
1895
1896
1897 /* Timer base time */
1898 OPN->ST.TimerBase = 1.0/((double)OPN->ST.clock / (double)TimerPres);
1899
1900 #if FM_SSG_PRESCALER
1901 /* SSG part prescaler set */
1902 if( SSGpres ) SSGClk( OPN->ST.index, OPN->ST.clock * 2 / SSGpres );
1903 #else
1904 (void)SSGpres;
1905 #endif
1906
1907 /* make time tables */
1908 init_timetables( &OPN->ST, dt_tab );
1909
1910 /* there are 2048 FNUMs that can be generated using FNUM/BLK registers
1911 but LFO works with one more bit of a precision so we really need 4096 elements */
1912 /* calculate fnumber -> increment counter table */
1913 for(i = 0; i < 4096; i++)
1914 {
1915 /* freq table for octave 7 */
1916 /* OPN phase increment counter = 20bit */
1917 OPN->fn_table[i] = (UINT32)( (double)i * 32 * OPN->ST.freqbase * (1<<(FREQ_SH-10)) ); /* -10 because chip works with 10.10 fixed point, while we use 16.16 */
1918 #if 0
1919 logerror("FM.C: fn_table[%4i] = %08x (dec=%8i)\n",
1920 i, OPN->fn_table[i]>>6,OPN->fn_table[i]>>6 );
1921 #endif
1922 }
1923
1924 /* maximal frequency is required for Phase overflow calculation, register size is 17 bits (Nemesis) */
1925 OPN->fn_max = (UINT32)( (double)0x20000 * OPN->ST.freqbase * (1<<(FREQ_SH-10)) );
1926
1927 /* LFO freq. table */
1928 for(i = 0; i < 8; i++)
1929 {
1930 /* Amplitude modulation: 64 output levels (triangle waveform); 1 level lasts for one of "lfo_samples_per_step" samples */
1931 /* Phase modulation: one entry from lfo_pm_output lasts for one of 4 * "lfo_samples_per_step" samples */
1932 OPN->lfo_freq[i] = (1.0 / lfo_samples_per_step[i]) * (1<<LFO_SH) * OPN->ST.freqbase;
1933 #if 0
1934 logerror("FM.C: lfo_freq[%i] = %08x (dec=%8i)\n",
1935 i, OPN->lfo_freq[i],OPN->lfo_freq[i] );
1936 #endif
1937 }
1938 }
1939
1940
1941
1942 /* write a OPN mode register 0x20-0x2f */
OPNWriteMode(FM_OPN * OPN,int r,int v)1943 static void OPNWriteMode(FM_OPN *OPN, int r, int v)
1944 {
1945 UINT8 c;
1946 FM_CH *CH;
1947
1948 switch(r){
1949 case 0x21: /* Test */
1950 break;
1951 case 0x22: /* LFO FREQ (YM2608/YM2610/YM2610B/YM2612) */
1952 if( OPN->type & TYPE_LFOPAN )
1953 {
1954 if (v&0x08) /* LFO enabled ? */
1955 {
1956 OPN->lfo_inc = OPN->lfo_freq[v&7];
1957 }
1958 else
1959 {
1960 OPN->lfo_inc = 0;
1961 }
1962 }
1963 break;
1964 case 0x24: /* timer A High 8*/
1965 OPN->ST.TA = (OPN->ST.TA & 0x03)|(((int)v)<<2);
1966 break;
1967 case 0x25: /* timer A Low 2*/
1968 OPN->ST.TA = (OPN->ST.TA & 0x3fc)|(v&3);
1969 break;
1970 case 0x26: /* timer B */
1971 OPN->ST.TB = v;
1972 break;
1973 case 0x27: /* mode, timer control */
1974 set_timers( &(OPN->ST),OPN->ST.index,v );
1975 break;
1976 case 0x28: /* key on / off */
1977 c = v & 0x03;
1978 if( c == 3 ) break;
1979 if( (v&0x04) && (OPN->type & TYPE_6CH) ) c+=3;
1980 CH = OPN->P_CH;
1981 CH = &CH[c];
1982 if(v&0x10) FM_KEYON(OPN->type, CH,SLOT1); else FM_KEYOFF(CH,SLOT1);
1983 if(v&0x20) FM_KEYON(OPN->type, CH,SLOT2); else FM_KEYOFF(CH,SLOT2);
1984 if(v&0x40) FM_KEYON(OPN->type, CH,SLOT3); else FM_KEYOFF(CH,SLOT3);
1985 if(v&0x80) FM_KEYON(OPN->type, CH,SLOT4); else FM_KEYOFF(CH,SLOT4);
1986 break;
1987 }
1988 }
1989
1990 /* write a OPN register (0x30-0xff) */
OPNWriteReg(FM_OPN * OPN,int r,int v)1991 static void OPNWriteReg(FM_OPN *OPN, int r, int v)
1992 {
1993 FM_CH *CH;
1994 FM_SLOT *SLOT;
1995
1996 UINT8 c = OPN_CHAN(r);
1997
1998 if (c == 3) return; /* 0xX3,0xX7,0xXB,0xXF */
1999
2000 if (r >= 0x100) c+=3;
2001
2002 CH = OPN->P_CH;
2003 CH = &CH[c];
2004
2005 SLOT = &(CH->SLOT[OPN_SLOT(r)]);
2006
2007 switch( r & 0xf0 ) {
2008 case 0x30: /* DET , MUL */
2009 set_det_mul(&OPN->ST,CH,SLOT,v);
2010 break;
2011
2012 case 0x40: /* TL */
2013 set_tl(CH,SLOT,v);
2014 break;
2015
2016 case 0x50: /* KS, AR */
2017 set_ar_ksr(OPN->type, CH,SLOT,v);
2018 break;
2019
2020 case 0x60: /* bit7 = AM ENABLE, DR */
2021 set_dr(OPN->type, SLOT,v);
2022
2023 if(OPN->type & TYPE_LFOPAN) /* YM2608/2610/2610B/2612 */
2024 {
2025 SLOT->AMmask = (v&0x80) ? ~0 : 0;
2026 }
2027 break;
2028
2029 case 0x70: /* SR */
2030 set_sr(OPN->type, SLOT,v);
2031 break;
2032
2033 case 0x80: /* SL, RR */
2034 set_sl_rr(OPN->type, SLOT,v);
2035 break;
2036
2037 case 0x90: /* SSG-EG */
2038 SLOT->ssg = v&0x0f;
2039 SLOT->ssgn = (v&0x04)>>1; /* bit 1 in ssgn = attack */
2040
2041 /* SSG-EG envelope shapes :
2042
2043 E AtAlH
2044 1 0 0 0 \\\\
2045
2046 1 0 0 1 \___
2047
2048 1 0 1 0 \/\/
2049 ___
2050 1 0 1 1 \
2051
2052 1 1 0 0 ////
2053 ___
2054 1 1 0 1 /
2055
2056 1 1 1 0 /\/\
2057
2058 1 1 1 1 /___
2059
2060
2061 E = SSG-EG enable
2062
2063
2064 The shapes are generated using Attack, Decay and Sustain phases.
2065
2066 Each single character in the diagrams above represents this whole
2067 sequence:
2068
2069 - when KEY-ON = 1, normal Attack phase is generated (*without* any
2070 difference when compared to normal mode),
2071
2072 - later, when envelope level reaches minimum level (max volume),
2073 the EG switches to Decay phase (which works with bigger steps
2074 when compared to normal mode - see below),
2075
2076 - later when envelope level passes the SL level,
2077 the EG swithes to Sustain phase (which works with bigger steps
2078 when compared to normal mode - see below),
2079
2080 - finally when envelope level reaches maximum level (min volume),
2081 the EG switches to Attack phase again (depends on actual waveform).
2082
2083 Important is that when switch to Attack phase occurs, the phase counter
2084 of that operator will be zeroed-out (as in normal KEY-ON) but not always.
2085 (I havent found the rule for that - perhaps only when the output level is low)
2086
2087 The difference (when compared to normal Envelope Generator mode) is
2088 that the resolution in Decay and Sustain phases is 4 times lower;
2089 this results in only 256 steps instead of normal 1024.
2090 In other words:
2091 when SSG-EG is disabled, the step inside of the EG is one,
2092 when SSG-EG is enabled, the step is four (in Decay and Sustain phases).
2093
2094 Times between the level changes are the same in both modes.
2095
2096
2097 Important:
2098 Decay 1 Level (so called SL) is compared to actual SSG-EG output, so
2099 it is the same in both SSG and no-SSG modes, with this exception:
2100
2101 when the SSG-EG is enabled and is generating raising levels
2102 (when the EG output is inverted) the SL will be found at wrong level !!!
2103 For example, when SL=02:
2104 0 -6 = -6dB in non-inverted EG output
2105 96-6 = -90dB in inverted EG output
2106 Which means that EG compares its level to SL as usual, and that the
2107 output is simply inverted afterall.
2108
2109
2110 The Yamaha's manuals say that AR should be set to 0x1f (max speed).
2111 That is not necessary, but then EG will be generating Attack phase.
2112
2113 */
2114
2115
2116 break;
2117
2118 case 0xa0:
2119 switch( OPN_SLOT(r) ){
2120 case 0: /* 0xa0-0xa2 : FNUM1 */
2121 {
2122 UINT32 fn = (((UINT32)( (OPN->ST.fn_h)&7))<<8) + v;
2123 UINT8 blk = OPN->ST.fn_h>>3;
2124 /* keyscale code */
2125 CH->kcode = (blk<<2) | opn_fktable[fn >> 7];
2126 /* phase increment counter */
2127 CH->fc = OPN->fn_table[fn*2]>>(7-blk);
2128
2129 /* store fnum in clear form for LFO PM calculations */
2130 CH->block_fnum = (blk<<11) | fn;
2131
2132 CH->SLOT[SLOT1].Incr=-1;
2133 }
2134 break;
2135 case 1: /* 0xa4-0xa6 : FNUM2,BLK */
2136 OPN->ST.fn_h = v&0x3f;
2137 break;
2138 case 2: /* 0xa8-0xaa : 3CH FNUM1 */
2139 if(r < 0x100)
2140 {
2141 UINT32 fn = (((UINT32)(OPN->SL3.fn_h&7))<<8) + v;
2142 UINT8 blk = OPN->SL3.fn_h>>3;
2143 /* keyscale code */
2144 OPN->SL3.kcode[c]= (blk<<2) | opn_fktable[fn >> 7];
2145 /* phase increment counter */
2146 OPN->SL3.fc[c] = OPN->fn_table[fn*2]>>(7-blk);
2147 OPN->SL3.block_fnum[c] = (blk<<11) | fn;
2148 (OPN->P_CH)[2].SLOT[SLOT1].Incr=-1;
2149 }
2150 break;
2151 case 3: /* 0xac-0xae : 3CH FNUM2,BLK */
2152 if(r < 0x100)
2153 OPN->SL3.fn_h = v&0x3f;
2154 break;
2155 }
2156 break;
2157
2158 case 0xb0:
2159 switch( OPN_SLOT(r) ){
2160 case 0: /* 0xb0-0xb2 : FB,ALGO */
2161 {
2162 int feedback = (v>>3)&7;
2163 CH->ALGO = v&7;
2164 CH->FB = feedback ? feedback+6 : 0;
2165 setup_connection( CH, c );
2166 }
2167 break;
2168 case 1: /* 0xb4-0xb6 : L , R , AMS , PMS (YM2612/YM2610B/YM2610/YM2608) */
2169 if( OPN->type & TYPE_LFOPAN)
2170 {
2171 /* b0-2 PMS */
2172 CH->pms = (v & 7) * 32; /* CH->pms = PM depth * 32 (index in lfo_pm_table) */
2173
2174 /* b4-5 AMS */
2175 CH->ams = lfo_ams_depth_shift[(v>>4) & 0x03];
2176
2177 /* PAN : b7 = L, b6 = R */
2178 OPN->pan[ c*2 ] = (v & 0x80) ? ~0 : 0;
2179 OPN->pan[ c*2+1 ] = (v & 0x40) ? ~0 : 0;
2180
2181 }
2182 break;
2183 }
2184 break;
2185 }
2186 }
2187
2188 #endif /* BUILD_OPN */
2189
2190 #if BUILD_OPN_PRESCALER
2191 /*
2192 prescaler circuit (best guess to verified chip behaviour)
2193
2194 +--------------+ +-sel2-+
2195 | +--|in20 |
2196 +---+ | +-sel1-+ | |
2197 M-CLK -+-|1/2|-+--|in10 | +---+ | out|--INT_CLOCK
2198 | +---+ | out|-|1/3|-|in21 |
2199 +----------|in11 | +---+ +------+
2200 +------+
2201
2202 reg.2d : sel2 = in21 (select sel2)
2203 reg.2e : sel1 = in11 (select sel1)
2204 reg.2f : sel1 = in10 , sel2 = in20 (clear selector)
2205 reset : sel1 = in11 , sel2 = in21 (clear both)
2206
2207 */
OPNPrescaler_w(FM_OPN * OPN,int addr,int pre_divider)2208 void OPNPrescaler_w(FM_OPN *OPN , int addr, int pre_divider)
2209 {
2210 static const int opn_pres[4] = { 2*12 , 2*12 , 6*12 , 3*12 };
2211 static const int ssg_pres[4] = { 1 , 1 , 4 , 2 };
2212 int sel;
2213
2214 switch(addr)
2215 {
2216 case 0: /* when reset */
2217 OPN->ST.prescaler_sel = 2;
2218 break;
2219 case 1: /* when postload */
2220 break;
2221 case 0x2d: /* divider sel : select 1/1 for 1/3line */
2222 OPN->ST.prescaler_sel |= 0x02;
2223 break;
2224 case 0x2e: /* divider sel , select 1/3line for output */
2225 OPN->ST.prescaler_sel |= 0x01;
2226 break;
2227 case 0x2f: /* divider sel , clear both selector to 1/2,1/2 */
2228 OPN->ST.prescaler_sel = 0;
2229 break;
2230 }
2231 sel = OPN->ST.prescaler_sel & 3;
2232 /* update prescaler */
2233 OPNSetPres( OPN, opn_pres[sel]*pre_divider,
2234 opn_pres[sel]*pre_divider,
2235 ssg_pres[sel]*pre_divider );
2236 }
2237 #endif /* BUILD_OPN_PRESCALER */
2238
2239 #if BUILD_YM2203
2240 /*****************************************************************************/
2241 /* YM2203 local section */
2242 /*****************************************************************************/
2243
2244 /* here's the virtual YM2203(OPN) */
2245 typedef struct
2246 {
2247 #ifdef _STATE_H
2248 UINT8 REGS[256]; /* registers */
2249 #endif
2250 FM_OPN OPN; /* OPN state */
2251 FM_CH CH[3]; /* channel state */
2252 } YM2203;
2253
2254 static YM2203 *FM2203=NULL; /* array of YM2203's */
2255 static int YM2203NumChips; /* number of chips */
2256
2257 /* Generate samples for one of the YM2203s */
YM2203UpdateOne(int num,INT16 * buffer,int length)2258 void YM2203UpdateOne(int num, INT16 *buffer, int length)
2259 {
2260 YM2203 *F2203 = &(FM2203[num]);
2261 FM_OPN *OPN = &(FM2203[num].OPN);
2262 int i;
2263 FMSAMPLE *buf = buffer;
2264
2265 cur_chip = (void *)F2203;
2266 State = &F2203->OPN.ST;
2267 cch[0] = &F2203->CH[0];
2268 cch[1] = &F2203->CH[1];
2269 cch[2] = &F2203->CH[2];
2270
2271
2272 /* refresh PG and EG */
2273 refresh_fc_eg_chan( OPN, cch[0] );
2274 refresh_fc_eg_chan( OPN, cch[1] );
2275 if( (State->mode & 0xc0) )
2276 {
2277 /* 3SLOT MODE */
2278 if( cch[2]->SLOT[SLOT1].Incr==-1)
2279 {
2280 refresh_fc_eg_slot(OPN, &cch[2]->SLOT[SLOT1] , OPN->SL3.fc[1] , OPN->SL3.kcode[1] );
2281 refresh_fc_eg_slot(OPN, &cch[2]->SLOT[SLOT2] , OPN->SL3.fc[2] , OPN->SL3.kcode[2] );
2282 refresh_fc_eg_slot(OPN, &cch[2]->SLOT[SLOT3] , OPN->SL3.fc[0] , OPN->SL3.kcode[0] );
2283 refresh_fc_eg_slot(OPN, &cch[2]->SLOT[SLOT4] , cch[2]->fc , cch[2]->kcode );
2284 }
2285 }else refresh_fc_eg_chan( OPN, cch[2] );
2286
2287
2288 /* YM2203 doesn't have LFO so we must keep these globals at 0 level */
2289 LFO_AM = 0;
2290 LFO_PM = 0;
2291
2292 /* buffering */
2293 for (i=0; i < length ; i++)
2294 {
2295 /* clear outputs */
2296 out_fm[0] = 0;
2297 out_fm[1] = 0;
2298 out_fm[2] = 0;
2299
2300 /* advance envelope generator */
2301 OPN->eg_timer += OPN->eg_timer_add;
2302 while (OPN->eg_timer >= OPN->eg_timer_overflow)
2303 {
2304 OPN->eg_timer -= OPN->eg_timer_overflow;
2305 OPN->eg_cnt++;
2306
2307 advance_eg_channel(OPN, &cch[0]->SLOT[SLOT1]);
2308 advance_eg_channel(OPN, &cch[1]->SLOT[SLOT1]);
2309 advance_eg_channel(OPN, &cch[2]->SLOT[SLOT1]);
2310 }
2311
2312 /* calculate FM */
2313 chan_calc(OPN, cch[0], 0 );
2314 chan_calc(OPN, cch[1], 1 );
2315 chan_calc(OPN, cch[2], 2 );
2316
2317 /* buffering */
2318 {
2319 int lt;
2320
2321 lt = out_fm[0] + out_fm[1] + out_fm[2];
2322
2323 lt >>= FINAL_SH;
2324
2325 Limit( lt , MAXOUT, MINOUT );
2326
2327 #ifdef SAVE_SAMPLE
2328 SAVE_ALL_CHANNELS
2329 #endif
2330
2331 /* buffering */
2332 buf[i] = lt;
2333 }
2334
2335 /* timer A control */
2336 INTERNAL_TIMER_A( State , cch[2] )
2337 }
2338 INTERNAL_TIMER_B(State,length)
2339 }
2340
2341 /* ---------- reset one of chip ---------- */
YM2203ResetChip(int num)2342 void YM2203ResetChip(int num)
2343 {
2344 int i;
2345 FM_OPN *OPN = &(FM2203[num].OPN);
2346
2347 /* Reset Prescaler */
2348 OPNPrescaler_w(OPN, 0 , 1 );
2349 /* reset SSG section */
2350 SSGReset(OPN->ST.index);
2351 /* status clear */
2352 FM_IRQMASK_SET(&OPN->ST,0x03);
2353 FM_BUSY_CLEAR(&OPN->ST);
2354 OPNWriteMode(OPN,0x27,0x30); /* mode 0 , timer reset */
2355
2356 OPN->eg_timer = 0;
2357 OPN->eg_cnt = 0;
2358
2359 FM_STATUS_RESET(&OPN->ST, 0xff);
2360
2361 reset_channels( &OPN->ST , FM2203[num].CH , 3 );
2362 /* reset OPerator paramater */
2363 for(i = 0xb2 ; i >= 0x30 ; i-- ) OPNWriteReg(OPN,i,0);
2364 for(i = 0x26 ; i >= 0x20 ; i-- ) OPNWriteReg(OPN,i,0);
2365 }
2366
2367 #ifdef _STATE_H
YM2203_postload(void)2368 static void YM2203_postload(void)
2369 {
2370 int num , r;
2371
2372 for(num=0;num<YM2203NumChips;num++)
2373 {
2374 /* prescaler */
2375 OPNPrescaler_w(&FM2203[num].OPN,1,1);
2376
2377 /* SSG registers */
2378 for(r=0;r<16;r++)
2379 {
2380 SSGWrite(num,0,r);
2381 SSGWrite(num,1,FM2203[num].REGS[r]);
2382 }
2383
2384 /* OPN registers */
2385 /* DT / MULTI , TL , KS / AR , AMON / DR , SR , SL / RR , SSG-EG */
2386 for(r=0x30;r<0x9e;r++)
2387 if((r&3) != 3)
2388 OPNWriteReg(&FM2203[num].OPN,r,FM2203[num].REGS[r]);
2389 /* FB / CONNECT , L / R / AMS / PMS */
2390 for(r=0xb0;r<0xb6;r++)
2391 if((r&3) != 3)
2392 OPNWriteReg(&FM2203[num].OPN,r,FM2203[num].REGS[r]);
2393
2394 /* channels */
2395 /*FM_channel_postload(FM2203[num].CH,3);*/
2396 }
2397 cur_chip = NULL;
2398 }
2399
YM2203_save_state(void)2400 static void YM2203_save_state(void)
2401 {
2402 int num;
2403 const char statename[] = "YM2203";
2404
2405 for(num=0;num<YM2203NumChips;num++)
2406 {
2407 state_save_register_UINT8 (statename, num, "regs" , FM2203[num].REGS , 256);
2408 FMsave_state_st(statename,num,&FM2203[num].OPN.ST);
2409 FMsave_state_channel(statename,num,FM2203[num].CH,3);
2410 /* 3slots */
2411 state_save_register_UINT32 (statename, num, "slot3fc" , FM2203[num].OPN.SL3.fc , 3);
2412 state_save_register_UINT8 (statename, num, "slot3fh" , &FM2203[num].OPN.SL3.fn_h , 1);
2413 state_save_register_UINT8 (statename, num, "slot3kc" , FM2203[num].OPN.SL3.kcode , 3);
2414 }
2415 state_save_register_func_postload(YM2203_postload);
2416 }
2417 #endif /* _STATE_H */
2418
2419 /* ---------- Initialize YM2203 emulator(s) ----------
2420 'num' is the number of virtual YM2203s to allocate
2421 'clock' is the chip clock in Hz
2422 'rate' is sampling rate
2423 */
YM2203Init(int num,int clock,int rate,FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler)2424 int YM2203Init(int num, int clock, int rate,
2425 FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler)
2426 {
2427 int i;
2428
2429 if (FM2203) return (-1); /* duplicate init. */
2430 cur_chip = NULL; /* hiro-shi!! */
2431
2432 YM2203NumChips = num;
2433
2434 /* allocate ym2203 state space */
2435 if( (FM2203 = (YM2203 *)malloc(sizeof(YM2203) * YM2203NumChips))==NULL)
2436 return (-1);
2437 /* clear */
2438 memset(FM2203,0,sizeof(YM2203) * YM2203NumChips);
2439
2440 if( !init_tables() )
2441 {
2442 if (FM2203) {
2443 free( FM2203 );
2444 FM2203 = NULL;
2445 }
2446 return (-1);
2447 }
2448 for ( i = 0 ; i < YM2203NumChips; i++ ) {
2449 FM2203[i].OPN.ST.index = i;
2450 FM2203[i].OPN.type = TYPE_YM2203;
2451 FM2203[i].OPN.P_CH = FM2203[i].CH;
2452 FM2203[i].OPN.ST.clock = clock;
2453 FM2203[i].OPN.ST.rate = rate;
2454
2455 FM2203[i].OPN.ST.Timer_Handler = TimerHandler;
2456 FM2203[i].OPN.ST.IRQ_Handler = IRQHandler;
2457 YM2203ResetChip(i);
2458 }
2459 #ifdef _STATE_H
2460 YM2203_save_state();
2461 #endif
2462 return(0);
2463 }
2464
2465 /* shut down emulator */
YM2203Shutdown(void)2466 void YM2203Shutdown(void)
2467 {
2468 if (!FM2203) return;
2469
2470 FMCloseTable();
2471 if (FM2203) {
2472 free(FM2203);
2473 FM2203 = NULL;
2474 }
2475 }
2476
2477 /* YM2203 I/O interface */
YM2203Write(int n,int a,UINT8 v)2478 int YM2203Write(int n,int a,UINT8 v)
2479 {
2480 FM_OPN *OPN = &(FM2203[n].OPN);
2481
2482 if( !(a&1) )
2483 { /* address port */
2484 OPN->ST.address = (v &= 0xff);
2485
2486 /* Write register to SSG emulator */
2487 if( v < 16 ) SSGWrite(n,0,v);
2488
2489 /* prescaler select : 2d,2e,2f */
2490 if( v >= 0x2d && v <= 0x2f )
2491 OPNPrescaler_w(OPN , v , 1);
2492 }
2493 else
2494 { /* data port */
2495 int addr = OPN->ST.address;
2496 #ifdef _STATE_H
2497 FM2203[n].REGS[addr] = v;
2498 #endif
2499 switch( addr & 0xf0 )
2500 {
2501 case 0x00: /* 0x00-0x0f : SSG section */
2502 /* Write data to SSG emulator */
2503 SSGWrite(n,a,v);
2504 break;
2505 case 0x20: /* 0x20-0x2f : Mode section */
2506 YM2203UpdateReq(n);
2507 /* write register */
2508 OPNWriteMode(OPN,addr,v);
2509 break;
2510 default: /* 0x30-0xff : OPN section */
2511 YM2203UpdateReq(n);
2512 /* write register */
2513 OPNWriteReg(OPN,addr,v);
2514 }
2515 FM_BUSY_SET(&OPN->ST,1);
2516 }
2517 return OPN->ST.irq;
2518 }
2519
YM2203Read(int n,int a)2520 UINT8 YM2203Read(int n,int a)
2521 {
2522 YM2203 *F2203 = &(FM2203[n]);
2523 int addr = F2203->OPN.ST.address;
2524 UINT8 ret = 0;
2525
2526 if( !(a&1) )
2527 { /* status port */
2528 ret = FM_STATUS_FLAG(&F2203->OPN.ST);
2529 }
2530 else
2531 { /* data port (only SSG) */
2532 if( addr < 16 ) ret = SSGRead(n);
2533 }
2534 return ret;
2535 }
2536
YM2203TimerOver(int n,int c)2537 int YM2203TimerOver(int n,int c)
2538 {
2539 YM2203 *F2203 = &(FM2203[n]);
2540
2541 if( c )
2542 { /* Timer B */
2543 TimerBOver( &(F2203->OPN.ST) );
2544 }
2545 else
2546 { /* Timer A */
2547 YM2203UpdateReq(n);
2548 /* timer update */
2549 TimerAOver( &(F2203->OPN.ST) );
2550 /* CSM mode key,TL control */
2551 if( F2203->OPN.ST.mode & 0x80 )
2552 { /* CSM mode auto key on */
2553 CSMKeyControll( F2203->OPN.type, &(F2203->CH[2]) );
2554 }
2555 }
2556 return F2203->OPN.ST.irq;
2557 }
2558 #endif /* BUILD_YM2203 */
2559
2560
2561
2562 #if (BUILD_YM2608||BUILD_YM2610||BUILD_YM2610B)
2563
2564 /* ADPCM type A channel struct */
2565 typedef struct
2566 {
2567 UINT8 flag; /* port state */
2568 UINT8 flagMask; /* arrived flag mask */
2569 UINT8 now_data; /* current ROM data */
2570 UINT32 now_addr; /* current ROM address */
2571 UINT32 now_step;
2572 UINT32 step;
2573 UINT32 start; /* sample data start address*/
2574 UINT32 end; /* sample data end address */
2575 UINT8 IL; /* Instrument Level */
2576 INT32 adpcm_acc; /* accumulator */
2577 INT32 adpcm_step; /* step */
2578 INT32 adpcm_out; /* (speedup) hiro-shi!! */
2579 INT8 vol_mul; /* volume in "0.75dB" steps */
2580 UINT8 vol_shift; /* volume in "-6dB" steps */
2581 INT32 *pan; /* &out_adpcm[OPN_xxxx] */
2582 } ADPCM_CH;
2583
2584 /* here's the virtual YM2610 */
2585 typedef struct
2586 {
2587 #ifdef _STATE_H
2588 UINT8 REGS[512]; /* registers */
2589 #endif
2590 FM_OPN OPN; /* OPN state */
2591 FM_CH CH[6]; /* channel state */
2592 UINT8 addr_A1; /* address line A1 */
2593
2594 /* ADPCM-A unit */
2595 UINT8 *pcmbuf; /* pcm rom buffer */
2596 UINT32 pcm_size; /* size of pcm rom */
2597 UINT8 adpcmTL; /* adpcmA total level */
2598 ADPCM_CH adpcm[6]; /* adpcm channels */
2599 UINT32 adpcmreg[0x30]; /* registers */
2600 UINT8 adpcm_arrivedEndAddress;
2601 YM_DELTAT deltaT; /* Delta-T ADPCM unit */
2602
2603 UINT8 flagmask; /* YM2608 only */
2604 UINT8 irqmask; /* YM2608 only */
2605 } YM2610;
2606
2607 /* here is the virtual YM2608 */
2608 typedef YM2610 YM2608;
2609
2610
2611 /**** YM2610 ADPCM defines ****/
2612 #define ADPCM_SHIFT (16) /* frequency step rate */
2613 #define ADPCMA_ADDRESS_SHIFT 8 /* adpcm A address shift */
2614
2615 static UINT8 *pcmbufA;
2616 static UINT32 pcmsizeA;
2617
2618
2619 /* Algorithm and tables verified on real YM2608 and YM2610 */
2620
2621 /* usual ADPCM table (16 * 1.1^N) */
2622 static int steps[49] =
2623 {
2624 16, 17, 19, 21, 23, 25, 28,
2625 31, 34, 37, 41, 45, 50, 55,
2626 60, 66, 73, 80, 88, 97, 107,
2627 118, 130, 143, 157, 173, 190, 209,
2628 230, 253, 279, 307, 337, 371, 408,
2629 449, 494, 544, 598, 658, 724, 796,
2630 876, 963, 1060, 1166, 1282, 1411, 1552
2631 };
2632
2633 /* different from the usual ADPCM table */
2634 static int step_inc[8] = { -1*16, -1*16, -1*16, -1*16, 2*16, 5*16, 7*16, 9*16 };
2635
2636 /* speedup purposes only */
2637 static int jedi_table[ 49*16 ];
2638
2639
Init_ADPCMATable(void)2640 static void Init_ADPCMATable(void){
2641
2642 int step, nib;
2643
2644 for (step = 0; step < 49; step++)
2645 {
2646 /* loop over all nibbles and compute the difference */
2647 for (nib = 0; nib < 16; nib++)
2648 {
2649 int value = (2*(nib & 0x07) + 1) * steps[step] / 8;
2650 jedi_table[step*16 + nib] = (nib&0x08) ? -value : value;
2651 }
2652 }
2653 }
2654
2655 /* ADPCM A (Non control type) : calculate one channel output */
ADPCMA_calc_chan(YM2610 * F2610,ADPCM_CH * ch)2656 INLINE void ADPCMA_calc_chan( YM2610 *F2610, ADPCM_CH *ch )
2657 {
2658 UINT32 step;
2659 UINT8 data;
2660
2661
2662 ch->now_step += ch->step;
2663 if ( ch->now_step >= (1<<ADPCM_SHIFT) )
2664 {
2665 step = ch->now_step >> ADPCM_SHIFT;
2666 ch->now_step &= (1<<ADPCM_SHIFT)-1;
2667 do{
2668 /* end check */
2669 /* 11-06-2001 JB: corrected comparison. Was > instead of == */
2670 /* YM2610 checks lower 20 bits only, the 4 MSB bits are sample bank */
2671 /* Here we use 1<<21 to compensate for nibble calculations */
2672
2673 if ( (ch->now_addr & ((1<<21)-1)) == ((ch->end<<1) & ((1<<21)-1)) )
2674 {
2675 ch->flag = 0;
2676 F2610->adpcm_arrivedEndAddress |= ch->flagMask;
2677 return;
2678 }
2679 #if 0
2680 if ( ch->now_addr > (pcmsizeA<<1) ) {
2681 LOG(LOG_WAR,("YM2610: Attempting to play past adpcm rom size!\n" ));
2682 return;
2683 }
2684 #endif
2685 if ( ch->now_addr&1 )
2686 data = ch->now_data & 0x0f;
2687 else
2688 {
2689 ch->now_data = *(pcmbufA+(ch->now_addr>>1));
2690 data = (ch->now_data >> 4) & 0x0f;
2691 }
2692
2693 ch->now_addr++;
2694
2695 ch->adpcm_acc += jedi_table[ch->adpcm_step + data];
2696
2697 /* extend 12-bit signed int */
2698 if (ch->adpcm_acc & 0x800)
2699 ch->adpcm_acc |= ~0xfff;
2700 else
2701 ch->adpcm_acc &= 0xfff;
2702
2703 ch->adpcm_step += step_inc[data & 7];
2704 Limit( ch->adpcm_step, 48*16, 0*16 );
2705
2706 }while(--step);
2707
2708 /* calc pcm * volume data */
2709 ch->adpcm_out = ((ch->adpcm_acc * ch->vol_mul) >> ch->vol_shift) & ~3; /* multiply, shift and mask out 2 LSB bits */
2710 }
2711
2712 /* output for work of output channels (out_adpcm[OPNxxxx])*/
2713 *(ch->pan) += ch->adpcm_out;
2714 }
2715
2716 /* ADPCM type A Write */
FM_ADPCMAWrite(YM2610 * F2610,int r,int v)2717 static void FM_ADPCMAWrite(YM2610 *F2610,int r,int v)
2718 {
2719 ADPCM_CH *adpcm = F2610->adpcm;
2720 UINT8 c = r&0x07;
2721
2722 F2610->adpcmreg[r] = v&0xff; /* stock data */
2723 switch( r ){
2724 case 0x00: /* DM,--,C5,C4,C3,C2,C1,C0 */
2725 if( !(v&0x80) )
2726 {
2727 /* KEY ON */
2728 for( c = 0; c < 6; c++ )
2729 {
2730 if( (v>>c)&1 )
2731 {
2732 /**** start adpcm ****/
2733 adpcm[c].step = (UINT32)((float)(1<<ADPCM_SHIFT)*((float)F2610->OPN.ST.freqbase)/3.0);
2734 adpcm[c].now_addr = adpcm[c].start<<1;
2735 adpcm[c].now_step = 0;
2736 adpcm[c].adpcm_acc = 0;
2737 adpcm[c].adpcm_step= 0;
2738 adpcm[c].adpcm_out = 0;
2739 adpcm[c].flag = 1;
2740
2741 if(F2610->pcmbuf==NULL){ /* Check ROM Mapped */
2742 logerror("YM2608-YM2610: ADPCM-A rom not mapped\n");
2743 adpcm[c].flag = 0;
2744 } else{
2745 if(adpcm[c].end >= F2610->pcm_size){ /* Check End in Range */
2746 logerror("YM2610: ADPCM-A end out of range: $%08x\n",adpcm[c].end);
2747 /*adpcm[c].end = F2610->pcm_size-1;*/ /* JB: DO NOT uncomment this, otherwise you will break the comparison in the ADPCM_CALC_CHA() */
2748 }
2749 if(adpcm[c].start >= F2610->pcm_size) /* Check Start in Range */
2750 {
2751 logerror("YM2608-YM2610: ADPCM-A start out of range: $%08x\n",adpcm[c].start);
2752 adpcm[c].flag = 0;
2753 }
2754 }
2755 }
2756 }
2757 }
2758 else
2759 {
2760 /* KEY OFF */
2761 for( c = 0; c < 6; c++ )
2762 if( (v>>c)&1 )
2763 adpcm[c].flag = 0;
2764 }
2765 break;
2766 case 0x01: /* B0-5 = TL */
2767 F2610->adpcmTL = (v & 0x3f) ^ 0x3f;
2768 for( c = 0; c < 6; c++ )
2769 {
2770 int volume = F2610->adpcmTL + adpcm[c].IL;
2771
2772 if ( volume >= 63 ) /* This is correct, 63 = quiet */
2773 {
2774 adpcm[c].vol_mul = 0;
2775 adpcm[c].vol_shift = 0;
2776 }
2777 else
2778 {
2779 adpcm[c].vol_mul = 15 - (volume & 7); /* so called 0.75 dB */
2780 adpcm[c].vol_shift = 1 + (volume >> 3); /* Yamaha engineers used the approximation: each -6 dB is close to divide by two (shift right) */
2781 }
2782
2783 /* calc pcm * volume data */
2784 adpcm[c].adpcm_out = ((adpcm[c].adpcm_acc * adpcm[c].vol_mul) >> adpcm[c].vol_shift) & ~3; /* multiply, shift and mask out low 2 bits */
2785 }
2786 break;
2787 default:
2788 c = r&0x07;
2789 if( c >= 0x06 ) return;
2790 switch( r&0x38 ){
2791 case 0x08: /* B7=L,B6=R, B4-0=IL */
2792 {
2793 int volume;
2794
2795 adpcm[c].IL = (v & 0x1f) ^ 0x1f;
2796
2797 volume = F2610->adpcmTL + adpcm[c].IL;
2798
2799 if ( volume >= 63 ) /* This is correct, 63 = quiet */
2800 {
2801 adpcm[c].vol_mul = 0;
2802 adpcm[c].vol_shift = 0;
2803 }
2804 else
2805 {
2806 adpcm[c].vol_mul = 15 - (volume & 7); /* so called 0.75 dB */
2807 adpcm[c].vol_shift = 1 + (volume >> 3); /* Yamaha engineers used the approximation: each -6 dB is close to divide by two (shift right) */
2808 }
2809
2810 adpcm[c].pan = &out_adpcm[(v>>6)&0x03];
2811
2812 /* calc pcm * volume data */
2813 adpcm[c].adpcm_out = ((adpcm[c].adpcm_acc * adpcm[c].vol_mul) >> adpcm[c].vol_shift) & ~3; /* multiply, shift and mask out low 2 bits */
2814 }
2815 break;
2816 case 0x10:
2817 case 0x18:
2818 adpcm[c].start = ( (F2610->adpcmreg[0x18 + c]*0x0100 | F2610->adpcmreg[0x10 + c]) << ADPCMA_ADDRESS_SHIFT);
2819 break;
2820 case 0x20:
2821 case 0x28:
2822 adpcm[c].end = ( (F2610->adpcmreg[0x28 + c]*0x0100 | F2610->adpcmreg[0x20 + c]) << ADPCMA_ADDRESS_SHIFT);
2823 adpcm[c].end += (1<<ADPCMA_ADDRESS_SHIFT) - 1;
2824 break;
2825 }
2826 }
2827 }
2828
2829 #ifdef _STATE_H
2830 /* FM channel save , internal state only */
FMsave_state_adpcma(const char * name,int num,ADPCM_CH * adpcm)2831 static void FMsave_state_adpcma(const char *name,int num,ADPCM_CH *adpcm)
2832 {
2833 int ch;
2834 char state_name[20];
2835
2836 for(ch=0;ch<6;ch++,adpcm++)
2837 {
2838 sprintf(state_name,"%s.CH%d",name,ch);
2839
2840 state_save_register_UINT8 (state_name, num, "flag" , &adpcm->flag , 1);
2841 state_save_register_UINT8 (state_name, num, "data" , &adpcm->now_data , 1);
2842 state_save_register_UINT32(state_name, num, "addr" , &adpcm->now_addr , 1);
2843 state_save_register_UINT32(state_name, num, "step" , &adpcm->now_step , 1);
2844 state_save_register_INT32 (state_name, num, "a_acc" , &adpcm->adpcm_acc , 1);
2845 state_save_register_INT32 (state_name, num, "a_step" , &adpcm->adpcm_step, 1);
2846 state_save_register_INT32 (state_name, num, "a_out" , &adpcm->adpcm_out , 1);
2847 }
2848 }
2849 #endif /* _STATE_H */
2850
2851 #endif /* (BUILD_YM2608||BUILD_YM2610||BUILD_YM2610B) */
2852
2853
2854 #if BUILD_YM2608
2855 /*****************************************************************************/
2856 /* YM2608 local section */
2857 /*****************************************************************************/
2858 static YM2608 *FM2608=NULL; /* array of YM2608's */
2859 static int YM2608NumChips; /* total chip */
2860
2861
2862
2863
2864
2865 static unsigned int YM2608_ADPCM_ROM_addr[2*6] = {
2866 0x0000, 0x01bf, /* bass drum */
2867 0x01c0, 0x043f, /* snare drum */
2868 0x0440, 0x1b7f, /* top cymbal */
2869 0x1b80, 0x1cff, /* high hat */
2870 0x1d00, 0x1f7f, /* tom tom */
2871 0x1f80, 0x1fff /* rim shot */
2872 };
2873
2874
2875 /*
2876 This data is derived from the chip's output - internal ROM can't be read.
2877 It was verified, using real YM2608, that this ADPCM stream produces 100% correct output signal.
2878 */
2879
2880 static unsigned char YM2608_ADPCM_ROM[0x2000] = {
2881
2882 /* Source: 01BD.ROM */
2883 /* Length: 448 / 0x000001C0 */
2884
2885 0x88,0x08,0x08,0x08,0x00,0x88,0x16,0x76,0x99,0xB8,0x22,0x3A,0x84,0x3C,0xB1,0x54,
2886 0x10,0xA9,0x98,0x32,0x80,0x33,0x9A,0xA7,0x4A,0xB4,0x58,0xBC,0x15,0x29,0x8A,0x97,
2887 0x9B,0x44,0xAC,0x80,0x12,0xDE,0x13,0x1B,0xC0,0x58,0xC8,0x11,0x0A,0xA2,0x1A,0xA0,
2888 0x00,0x98,0x0B,0x93,0x9E,0x92,0x0A,0x88,0xBE,0x14,0x1B,0x98,0x08,0xA1,0x4A,0xC1,
2889 0x30,0xD9,0x33,0x98,0x10,0x89,0x17,0x1A,0x82,0x29,0x37,0x0C,0x83,0x50,0x9A,0x24,
2890 0x1A,0x83,0x10,0x23,0x19,0xB3,0x72,0x8A,0x16,0x10,0x0A,0x93,0x70,0x99,0x23,0x99,
2891 0x02,0x20,0x91,0x18,0x02,0x41,0xAB,0x24,0x18,0x81,0x99,0x4A,0xE8,0x28,0x9A,0x99,
2892 0xA1,0x2F,0xA8,0x9D,0x90,0x08,0xCC,0xA3,0x1D,0xCA,0x82,0x0B,0xD8,0x08,0xB9,0x09,
2893 0xBC,0xB8,0x00,0xBE,0x90,0x1B,0xCA,0x00,0x9B,0x8A,0xA8,0x91,0x0F,0xB3,0x3D,0xB8,
2894 0x31,0x0B,0xA5,0x0A,0x11,0xA1,0x48,0x92,0x10,0x50,0x91,0x30,0x23,0x09,0x37,0x39,
2895 0xA2,0x72,0x89,0x92,0x30,0x83,0x1C,0x96,0x28,0xB9,0x24,0x8C,0xA1,0x31,0xAD,0xA9,
2896 0x13,0x9C,0xBA,0xA8,0x0B,0xBF,0xB8,0x9B,0xCA,0x88,0xDB,0xB8,0x19,0xFC,0x92,0x0A,
2897 0xBA,0x89,0xAB,0xB8,0xAB,0xD8,0x08,0xAD,0xBA,0x33,0x9D,0xAA,0x83,0x3A,0xC0,0x40,
2898 0xB9,0x15,0x39,0xA2,0x52,0x89,0x02,0x63,0x88,0x13,0x23,0x03,0x52,0x02,0x54,0x00,
2899 0x11,0x23,0x23,0x35,0x20,0x01,0x44,0x41,0x80,0x24,0x40,0xA9,0x45,0x19,0x81,0x12,
2900 0x81,0x02,0x11,0x21,0x19,0x02,0x61,0x8A,0x13,0x3A,0x10,0x12,0x23,0x8B,0x37,0x18,
2901 0x91,0x24,0x10,0x81,0x34,0x20,0x05,0x32,0x82,0x53,0x20,0x14,0x33,0x31,0x34,0x52,
2902 0x00,0x43,0x32,0x13,0x52,0x22,0x13,0x52,0x11,0x43,0x11,0x32,0x32,0x32,0x22,0x02,
2903 0x13,0x12,0x89,0x22,0x19,0x81,0x81,0x08,0xA8,0x08,0x8B,0x90,0x1B,0xBA,0x8A,0x9B,
2904 0xB9,0x89,0xCA,0xB9,0xAB,0xCA,0x9B,0xCA,0xB9,0xAB,0xDA,0x99,0xAC,0xBB,0x9B,0xAC,
2905 0xAA,0xBA,0xAC,0xAB,0x9A,0xAA,0xAA,0xBA,0xB8,0xA9,0xBA,0x99,0xA9,0x9A,0xA0,0x8A,
2906 0xA9,0x08,0x8A,0xA9,0x00,0x99,0x89,0x88,0x98,0x08,0x99,0x00,0x89,0x80,0x08,0x98,
2907 0x00,0x88,0x88,0x80,0x90,0x80,0x90,0x80,0x81,0x99,0x08,0x88,0x99,0x09,0x00,0x1A,
2908 0xA8,0x10,0x9A,0x88,0x08,0x0A,0x8A,0x89,0x99,0xA8,0x98,0xA9,0x99,0x99,0xA9,0x99,
2909 0xAA,0x8A,0xAA,0x9B,0x8A,0x9A,0xA9,0x9A,0xBA,0x99,0x9A,0xAA,0x99,0x89,0xA9,0x99,
2910 0x98,0x9A,0x98,0x88,0x09,0x89,0x09,0x08,0x08,0x09,0x18,0x18,0x00,0x12,0x00,0x11,
2911 0x11,0x11,0x12,0x12,0x21,0x21,0x22,0x22,0x22,0x22,0x22,0x22,0x32,0x31,0x32,0x31,
2912 0x32,0x32,0x21,0x31,0x21,0x32,0x21,0x12,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
2913
2914 /* Source: 02SD.ROM */
2915 /* Length: 640 / 0x00000280 */
2916
2917 0x0A,0xDC,0x14,0x0B,0xBA,0xBC,0x01,0x0F,0xF5,0x2F,0x87,0x19,0xC9,0x24,0x1B,0xA1,
2918 0x31,0x99,0x90,0x32,0x32,0xFE,0x83,0x48,0xA8,0xA9,0x23,0x19,0xBC,0x91,0x02,0x41,
2919 0xDE,0x81,0x28,0xA8,0x0A,0xB1,0x72,0xDA,0x23,0xBC,0x04,0x19,0xB8,0x21,0x8A,0x03,
2920 0x29,0xBA,0x14,0x21,0x0B,0xC0,0x43,0x08,0x91,0x50,0x93,0x0F,0x86,0x1A,0x91,0x18,
2921 0x21,0xCB,0x27,0x0A,0xA1,0x42,0x8C,0xA9,0x21,0x10,0x08,0xAB,0x94,0x2A,0xDA,0x02,
2922 0x8B,0x91,0x09,0x98,0xAE,0x80,0xA9,0x02,0x0A,0xE9,0x21,0xBB,0x15,0x20,0xBE,0x92,
2923 0x42,0x09,0xA9,0x11,0x34,0x08,0x12,0x0A,0x27,0x29,0xA1,0x52,0x12,0x8E,0x92,0x28,
2924 0x92,0x2B,0xD1,0x23,0xBF,0x81,0x10,0x99,0xA8,0x0A,0xC4,0x3B,0xB9,0xB0,0x00,0x62,
2925 0xCF,0x92,0x29,0x92,0x2B,0xB1,0x1C,0xB2,0x72,0xAA,0x88,0x11,0x18,0x80,0x13,0x9E,
2926 0x03,0x18,0xB0,0x60,0xA1,0x28,0x88,0x08,0x04,0x10,0x8F,0x96,0x19,0x90,0x01,0x09,
2927 0xC8,0x50,0x91,0x8A,0x01,0xAB,0x03,0x50,0xBA,0x9D,0x93,0x68,0xBA,0x80,0x22,0xCB,
2928 0x41,0xBC,0x92,0x60,0xB9,0x1A,0x95,0x4A,0xC8,0x20,0x88,0x33,0xAC,0x92,0x38,0x83,
2929 0x09,0x80,0x16,0x09,0x29,0xD0,0x54,0x8C,0xA2,0x28,0x91,0x89,0x93,0x60,0xCD,0x85,
2930 0x1B,0xA1,0x49,0x90,0x8A,0x80,0x34,0x0C,0xC9,0x14,0x19,0x98,0xA0,0x40,0xA9,0x21,
2931 0xD9,0x34,0x0A,0xA9,0x10,0x23,0xCB,0x25,0xAA,0x25,0x9B,0x13,0xCD,0x16,0x09,0xA0,
2932 0x80,0x01,0x19,0x90,0x88,0x21,0xAC,0x33,0x8B,0xD8,0x27,0x3B,0xB8,0x81,0x31,0x80,
2933 0xAF,0x97,0x0A,0x82,0x0A,0xA0,0x21,0x89,0x8A,0xA2,0x32,0x8D,0xBB,0x87,0x19,0x21,
2934 0xC9,0xBC,0x45,0x09,0x90,0x09,0xA1,0x24,0x1A,0xD0,0x10,0x08,0x11,0xA9,0x21,0xE8,
2935 0x60,0xA9,0x14,0x0C,0xD1,0x32,0xAB,0x04,0x0C,0x81,0x90,0x29,0x83,0x9B,0x01,0x8F,
2936 0x97,0x0B,0x82,0x18,0x88,0xBA,0x06,0x39,0xC8,0x23,0xBC,0x04,0x09,0x92,0x08,0x1A,
2937 0xBB,0x74,0x8C,0x81,0x18,0x81,0x9D,0x83,0x41,0xCD,0x81,0x40,0x9A,0x90,0x10,0x12,
2938 0x9C,0xA1,0x68,0xD8,0x33,0x9C,0x91,0x01,0x12,0xBE,0x02,0x09,0x12,0x99,0x9A,0x36,
2939 0x0A,0xB0,0x30,0x88,0xA3,0x2D,0x12,0xBC,0x03,0x3A,0x11,0xBD,0x08,0xC8,0x62,0x80,
2940 0x8B,0xD8,0x23,0x38,0xF9,0x12,0x08,0x99,0x91,0x21,0x99,0x85,0x2F,0xB2,0x30,0x90,
2941 0x88,0xD9,0x53,0xAC,0x82,0x19,0x91,0x20,0xCC,0x96,0x29,0xC9,0x24,0x89,0x80,0x99,
2942 0x12,0x08,0x18,0x88,0x99,0x23,0xAB,0x73,0xCB,0x33,0x9F,0x04,0x2B,0xB1,0x08,0x03,
2943 0x1B,0xC9,0x21,0x32,0xFA,0x33,0xDB,0x02,0x33,0xAE,0xB9,0x54,0x8B,0xA1,0x20,0x89,
2944 0x90,0x11,0x88,0x09,0x98,0x23,0xBE,0x37,0x8D,0x81,0x20,0xAA,0x34,0xBB,0x13,0x18,
2945 0xB9,0x40,0xB1,0x18,0x83,0x8E,0xB2,0x72,0xBC,0x82,0x30,0xA9,0x9A,0x24,0x8B,0x27,
2946 0x0E,0x91,0x20,0x90,0x08,0xB0,0x32,0xB9,0x21,0xB0,0xAC,0x45,0x9A,0xA1,0x50,0xA9,
2947 0x80,0x0A,0x26,0x9B,0x11,0xBB,0x23,0x71,0xCB,0x12,0x10,0xB8,0x40,0xA9,0xA5,0x39,
2948 0xC0,0x30,0xB2,0x20,0xAA,0xBA,0x76,0x1C,0xC1,0x48,0x98,0x80,0x18,0x81,0xAA,0x23,
2949 0x9C,0xA2,0x32,0xAC,0x9A,0x43,0x9C,0x12,0xAD,0x82,0x72,0xBC,0x00,0x82,0x39,0xD1,
2950 0x3A,0xB8,0x35,0x9B,0x10,0x40,0xF9,0x22,0x0A,0xC0,0x51,0xB9,0x82,0x18,0x98,0xA3,
2951 0x79,0xD0,0x20,0x88,0x09,0x01,0x99,0x82,0x11,0x38,0xFC,0x33,0x09,0xC8,0x40,0xA9,
2952 0x11,0x29,0xAA,0x94,0x3A,0xC2,0x4A,0xC0,0x89,0x52,0xBC,0x11,0x08,0x09,0xB8,0x71,
2953 0xA9,0x08,0xA8,0x62,0x8D,0x92,0x10,0x00,0x9E,0x94,0x38,0xBA,0x13,0x88,0x90,0x4A,
2954 0xE2,0x30,0xBA,0x02,0x00,0x19,0xD9,0x62,0xBB,0x04,0x0B,0xA3,0x68,0xB9,0x21,0x88,
2955 0x9D,0x04,0x10,0x8C,0xC8,0x62,0x99,0xAA,0x24,0x1A,0x80,0x9A,0x14,0x9B,0x26,0x8C,
2956 0x92,0x30,0xB9,0x09,0xA3,0x71,0xBB,0x10,0x19,0x82,0x39,0xDB,0x02,0x44,0x9F,0x10,
2957
2958 /* Source: 04TOP.ROM */
2959 /* Length: 5952 / 0x00001740 */
2960
2961 0x07,0xFF,0x7C,0x3C,0x31,0xC6,0xC4,0xBB,0x7F,0x7F,0x7B,0x82,0x8A,0x4D,0x5F,0x7C,
2962 0x3E,0x44,0xD2,0xB3,0xA0,0x19,0x1B,0x6C,0x81,0x28,0xC4,0xA1,0x1C,0x4B,0x18,0x00,
2963 0x2A,0xA2,0x0A,0x7C,0x2A,0x00,0x01,0x89,0x98,0x48,0x8A,0x3C,0x28,0x2A,0x5B,0x3E,
2964 0x3A,0x1A,0x3B,0x3D,0x4B,0x3B,0x4A,0x08,0x2A,0x1A,0x2C,0x4A,0x3B,0x82,0x99,0x3C,
2965 0x5D,0x29,0x2B,0x39,0x0B,0x23,0xAB,0x1A,0x4C,0x79,0xA3,0x01,0xC1,0x2A,0x0A,0x38,
2966 0xA7,0xB9,0x12,0x1F,0x29,0x08,0x82,0xA1,0x08,0xA9,0x42,0xAA,0x95,0xB3,0x90,0x81,
2967 0x09,0xD4,0x1A,0x80,0x1B,0x07,0xB8,0x12,0x8E,0x49,0x81,0x92,0xD3,0x90,0xA1,0x2A,
2968 0x02,0xE1,0xA3,0x99,0x02,0xB3,0x94,0xB3,0xB0,0xF4,0x98,0x93,0x90,0x13,0xE1,0x81,
2969 0x99,0x38,0x91,0xA6,0xD3,0x99,0x94,0xC1,0x83,0xB1,0x92,0x98,0x49,0xC4,0xB2,0xA4,
2970 0xA3,0xD0,0x1A,0x30,0xBA,0x59,0x02,0xD4,0xA0,0xA4,0xA2,0x8A,0x01,0x00,0xB7,0xA8,
2971 0x18,0x2A,0x2B,0x1E,0x23,0xC8,0x1A,0x00,0x39,0xA0,0x18,0x92,0x4F,0x2D,0x5A,0x10,
2972 0x89,0x81,0x2A,0x8B,0x6A,0x02,0x09,0xB3,0x8D,0x48,0x1B,0x80,0x19,0x34,0xF8,0x29,
2973 0x0A,0x7B,0x2A,0x28,0x81,0x0C,0x02,0x1E,0x29,0x09,0x12,0xC2,0x94,0xE1,0x18,0x98,
2974 0x02,0xC4,0x89,0x91,0x1A,0x20,0xA9,0x02,0x1B,0x48,0x8E,0x20,0x88,0x2D,0x08,0x59,
2975 0x1B,0x02,0xA3,0xB1,0x8A,0x1E,0x58,0x80,0xC2,0xB6,0x88,0x91,0x88,0x11,0xA1,0xA3,
2976 0xE2,0x01,0xB0,0x19,0x11,0x09,0xF4,0x88,0x09,0x88,0x19,0x89,0x12,0xF1,0x2A,0x28,
2977 0x8C,0x25,0x99,0xA4,0x98,0x39,0xA1,0x00,0xD0,0x58,0xAA,0x59,0x01,0x0C,0x00,0x2B,
2978 0x00,0x08,0x89,0x6B,0x69,0x90,0x01,0x90,0x98,0x12,0xB3,0xF3,0xA0,0x89,0x02,0x3B,
2979 0x0C,0x50,0xA9,0x4E,0x6B,0x19,0x28,0x09,0xA2,0x08,0x2F,0x20,0x88,0x92,0x8A,0x11,
2980 0xC4,0x93,0xF1,0x18,0x88,0x11,0xF2,0x80,0x92,0xA8,0x02,0xA8,0xB7,0xB3,0xA3,0xA0,
2981 0x88,0x1A,0x40,0xE2,0x91,0x19,0x88,0x18,0x91,0x83,0xC1,0xB5,0x92,0xA9,0xC6,0x90,
2982 0x01,0xC2,0x81,0x98,0x03,0xF0,0x00,0x2C,0x2A,0x92,0x2C,0x83,0x1F,0x3A,0x29,0x00,
2983 0xB8,0x70,0xAB,0x69,0x18,0x89,0x10,0x0D,0x12,0x0B,0x88,0x4A,0x3A,0x9B,0x70,0xA8,
2984 0x28,0x2F,0x2A,0x3A,0x1B,0x85,0x88,0x8B,0x6A,0x29,0x00,0x91,0x91,0x1B,0x7C,0x29,
2985 0x01,0x88,0x90,0x19,0x2B,0x2B,0x00,0x39,0xA8,0x5E,0x21,0x89,0x91,0x09,0x3A,0x6F,
2986 0x2A,0x18,0x18,0x8B,0x50,0x89,0x2B,0x19,0x49,0x88,0x29,0xF5,0x89,0x08,0x09,0x12,
2987 0xAA,0x15,0xB0,0x82,0xAC,0x38,0x00,0x3F,0x81,0x10,0xB0,0x49,0xA2,0x81,0x3A,0xC8,
2988 0x87,0x90,0xC4,0xA3,0x99,0x19,0x83,0xE1,0x84,0xE2,0xA2,0x90,0x80,0x93,0xB5,0xC4,
2989 0xB3,0xA1,0x0A,0x18,0x92,0xC4,0xA0,0x93,0x0C,0x3A,0x18,0x01,0x1E,0x20,0xB1,0x82,
2990 0x8C,0x03,0xB5,0x2E,0x82,0x19,0xB2,0x1B,0x1B,0x6B,0x4C,0x19,0x12,0x8B,0x5A,0x11,
2991 0x0C,0x3A,0x2C,0x18,0x3D,0x08,0x2A,0x5C,0x18,0x00,0x88,0x3D,0x29,0x80,0x2A,0x09,
2992 0x00,0x7A,0x0A,0x10,0x0B,0x69,0x98,0x10,0x81,0x3F,0x00,0x18,0x19,0x91,0xB7,0x9A,
2993 0x28,0x8A,0x48,0x92,0xF3,0xA2,0x88,0x98,0x87,0xA1,0x88,0x80,0x81,0x95,0xD1,0xA3,
2994 0x1B,0x1C,0x39,0x10,0xA1,0x2A,0x0B,0x7A,0x4B,0x80,0x13,0xC1,0xD1,0x2B,0x2A,0x85,
2995 0xB2,0xA2,0x93,0xB2,0xD3,0x80,0xD1,0x18,0x08,0x08,0xB7,0x98,0x81,0x3F,0x01,0x88,
2996 0x01,0xE2,0x00,0x9A,0x59,0x08,0x10,0xC3,0x99,0x84,0xA9,0xA5,0x91,0x91,0x91,0x80,
2997 0xB5,0x94,0xC0,0x01,0x98,0x09,0x84,0xB0,0x80,0x7A,0x08,0x18,0x90,0xA8,0x6A,0x1C,
2998 0x39,0x2A,0xB7,0x98,0x19,0x10,0x2A,0xA1,0x10,0xBD,0x39,0x18,0x2D,0x39,0x3F,0x10,
2999 0x3F,0x01,0x09,0x19,0x0A,0x38,0x8C,0x40,0xB3,0xB4,0x93,0xAD,0x20,0x2B,0xD4,0x81,
3000 0xC3,0xB0,0x39,0xA0,0x23,0xD8,0x04,0xB1,0x9B,0xA7,0x1A,0x92,0x08,0xA5,0x88,0x81,
3001 0xE2,0x01,0xB8,0x01,0x81,0xC1,0xC7,0x90,0x92,0x80,0xA1,0x97,0xA0,0xA2,0x82,0xB8,
3002 0x18,0x00,0x9C,0x78,0x98,0x83,0x0B,0x0B,0x32,0x7D,0x19,0x10,0xA1,0x19,0x09,0x0A,
3003 0x78,0xA8,0x10,0x1B,0x29,0x29,0x1A,0x14,0x2F,0x88,0x4A,0x1B,0x10,0x10,0xAB,0x79,
3004 0x0D,0x49,0x18,0xA0,0x02,0x1F,0x19,0x3A,0x2B,0x11,0x8A,0x88,0x79,0x8A,0x20,0x49,
3005 0x9B,0x58,0x0B,0x28,0x18,0xA9,0x3A,0x7D,0x00,0x29,0x88,0x82,0x3D,0x1A,0x38,0xBA,
3006 0x15,0x09,0xAA,0x51,0x8B,0x83,0x3C,0x8A,0x58,0x1B,0xB5,0x01,0xBB,0x50,0x19,0x99,
3007 0x24,0xCA,0x21,0x1B,0xA2,0x87,0xA8,0xB1,0x68,0xA1,0xA6,0xA2,0xA8,0x29,0x8B,0x24,
3008 0xB4,0xE2,0x92,0x8A,0x00,0x19,0x93,0xB5,0xB4,0xB1,0x81,0xB1,0x03,0x9A,0x82,0xA7,
3009 0x90,0xD6,0xA0,0x80,0x1B,0x29,0x01,0xA4,0xE1,0x18,0x0A,0x2A,0x29,0x92,0xC7,0xA8,
3010 0x81,0x19,0x89,0x30,0x10,0xE0,0x30,0xB8,0x10,0x0C,0x1A,0x79,0x1B,0xA7,0x80,0xA0,
3011 0x00,0x0B,0x28,0x18,0xB1,0x85,0x1E,0x00,0x20,0xA9,0x18,0x18,0x1C,0x13,0xBC,0x15,
3012 0x99,0x2E,0x12,0x00,0xE1,0x00,0x0B,0x3B,0x21,0x90,0x06,0xC9,0x2A,0x49,0x0A,0x18,
3013 0x20,0xD1,0x3C,0x08,0x00,0x83,0xC9,0x41,0x8E,0x18,0x08,0x02,0xA0,0x09,0xA4,0x7B,
3014 0x90,0x19,0x2A,0x10,0x2A,0xA8,0x71,0xBA,0x10,0x4A,0x0E,0x22,0xB2,0xB2,0x1B,0x8C,
3015 0x78,0x1A,0xB5,0x93,0xA9,0x1B,0x49,0x19,0x29,0xA3,0xC6,0x88,0xAA,0x32,0x0D,0x1B,
3016 0x22,0x08,0xC2,0x18,0xB9,0x79,0x3F,0x01,0x10,0xA9,0x84,0x1C,0x09,0x21,0xB0,0xA7,
3017 0x0A,0x99,0x50,0x0C,0x81,0x28,0x8B,0x48,0x2E,0x00,0x08,0x99,0x38,0x5B,0x88,0x14,
3018 0xA9,0x08,0x11,0xAA,0x72,0xC1,0xB3,0x09,0x8A,0x05,0x91,0xF2,0x81,0xA1,0x09,0x02,
3019 0xF2,0x92,0x99,0x1A,0x49,0x80,0xC5,0x90,0x90,0x18,0x09,0x12,0xA1,0xF2,0x81,0x98,
3020 0xC6,0x91,0xA0,0x11,0xA0,0x94,0xB4,0xF2,0x81,0x8B,0x03,0x80,0xD2,0x93,0xA8,0x88,
3021 0x69,0xA0,0x03,0xB8,0x88,0x32,0xBC,0x97,0x80,0xB1,0x3B,0x1A,0xA6,0x00,0xD1,0x01,
3022 0x0B,0x3B,0x30,0x9B,0x31,0x3E,0x92,0x19,0x8A,0xD3,0x5C,0x1B,0x41,0xA0,0x93,0xA2,
3023 0xAF,0x39,0x4C,0x01,0x92,0xA8,0x81,0x3C,0x0D,0x78,0x98,0x00,0x19,0x0A,0x20,0x2D,
3024 0x29,0x3C,0x1B,0x48,0x88,0x99,0x7A,0x2D,0x29,0x2A,0x82,0x80,0xA8,0x49,0x3E,0x19,
3025 0x11,0x98,0x82,0x9A,0x3B,0x28,0x2F,0x20,0x4C,0x90,0x29,0x19,0x9A,0x7A,0x29,0x28,
3026 0x98,0x88,0x33,0xCD,0x11,0x3A,0xC1,0xA4,0xA0,0xC4,0x82,0xC8,0x50,0x98,0xB2,0x21,
3027 0xC0,0xB6,0x98,0x82,0x80,0x9C,0x23,0x00,0xF8,0x30,0xA8,0x1A,0x68,0xA8,0x86,0x9A,
3028 0x01,0x2A,0x0A,0x97,0x91,0xC1,0x18,0x89,0x02,0x83,0xE0,0x01,0x8B,0x29,0x30,0xE2,
3029 0x91,0x0B,0x18,0x3B,0x1C,0x11,0x28,0xAC,0x78,0x80,0x93,0x91,0xA9,0x49,0x8B,0x87,
3030 0x90,0x99,0x3D,0x5A,0x81,0x08,0xA1,0x11,0x2F,0x1A,0x21,0x9B,0x15,0xA2,0xB0,0x11,
3031 0xC0,0x91,0x5B,0x98,0x24,0xA2,0xF2,0x92,0x8B,0x6A,0x18,0x81,0xB5,0xB1,0x88,0x4C,
3032 0x00,0x00,0xA4,0xC1,0x2B,0x1A,0x59,0x0A,0x02,0x80,0x1E,0x02,0x08,0xB3,0x80,0x9A,
3033 0x23,0xB8,0xF2,0x84,0xAB,0x01,0x48,0x90,0xA7,0x90,0x0A,0x29,0x09,0x95,0x99,0xA0,
3034 0x59,0x2B,0x00,0x97,0xB0,0x29,0x89,0x2A,0x03,0xD0,0xB7,0x1B,0x81,0x00,0xA6,0xB1,
3035 0x90,0x09,0x48,0xC0,0x11,0x00,0x8A,0x00,0x5B,0x83,0x9A,0x18,0x2F,0x3C,0x18,0x11,
3036 0xA9,0x04,0x1A,0x4F,0x01,0x98,0x81,0x09,0x09,0x4A,0x18,0xB4,0xA2,0x0B,0x59,0x90,
3037 0x3B,0x49,0xBC,0x40,0x6A,0x88,0x3A,0x08,0x3E,0x3A,0x80,0x93,0xB0,0xE1,0x5A,0x00,
3038 0xA4,0xB3,0xE3,0x90,0x0D,0x38,0x09,0x82,0xC4,0xA1,0xB1,0x4C,0x18,0x10,0x91,0xB2,
3039 0x13,0xEA,0x34,0x99,0x88,0xA6,0x89,0x92,0x91,0xC1,0x20,0xB2,0xC2,0x86,0xD2,0xB3,
3040 0x80,0xB2,0x08,0x09,0x87,0x91,0xC0,0x11,0x89,0x90,0x28,0xB9,0x79,0x19,0xA4,0x82,
3041 0xD0,0x03,0x0C,0xA3,0xA5,0xB2,0xB2,0x1B,0x29,0x13,0xF1,0xB4,0x81,0x9D,0x38,0x00,
3042 0xC4,0xA1,0x89,0x59,0x1A,0x81,0xA4,0xA9,0x1C,0x6A,0x19,0x02,0xB1,0x1A,0x4A,0x0B,
3043 0x78,0x89,0x81,0x1C,0x2A,0x29,0x4A,0xA3,0x3E,0x1C,0x49,0x1A,0x08,0x21,0xAE,0x28,
3044 0x4B,0x19,0x20,0x8C,0x10,0x3A,0xAB,0x26,0x8B,0x18,0x59,0x99,0x13,0xA2,0xAB,0x79,
3045 0x2F,0x18,0x10,0xB2,0x80,0x1B,0x4D,0x5A,0x80,0x82,0x98,0x81,0x80,0x09,0xA5,0x90,
3046 0x91,0x03,0xC2,0xE2,0x81,0xA8,0x82,0x09,0xC6,0xA3,0xB1,0x08,0x5B,0x08,0x05,0xD1,
3047 0xA2,0x89,0x2A,0x28,0x91,0xA6,0x88,0xB0,0x49,0x80,0x09,0x08,0x88,0x07,0xB8,0x05,
3048 0x99,0x81,0x88,0x18,0xE2,0x00,0xC3,0x18,0x0D,0x10,0x30,0xD0,0x93,0x8A,0x09,0x10,
3049 0x2F,0x11,0x90,0xA1,0x20,0x9B,0xB1,0x73,0xC8,0x94,0x98,0x3B,0x01,0x0C,0x30,0x19,
3050 0xF8,0x12,0x90,0xBA,0x78,0x0A,0x11,0x98,0xA0,0x79,0x8A,0x30,0x2B,0xC2,0x11,0x0D,
3051 0x09,0x7A,0x00,0x82,0xB9,0x01,0x7A,0x89,0x21,0x09,0xA1,0x0A,0x7C,0x10,0x88,0xB5,
3052 0x88,0x0A,0x2B,0x69,0x1A,0x10,0xA0,0x5B,0x19,0x1A,0x10,0x19,0x1A,0x6C,0x20,0x90,
3053 0xA5,0x98,0x1B,0x0A,0x69,0x82,0xD1,0x18,0x09,0x19,0x2A,0x93,0xD4,0x9A,0x01,0x49,
3054 0xA2,0xA2,0x82,0xD8,0x22,0xAA,0x97,0xA9,0x2D,0x38,0x2A,0xB6,0x80,0x90,0x0A,0x3C,
3055 0x82,0x94,0xB8,0x21,0x0E,0x2A,0x22,0xB8,0x00,0x4F,0x2B,0x3A,0x81,0xA1,0x29,0x2C,
3056 0x6A,0x13,0xD1,0xA2,0x98,0x28,0x0C,0x01,0xD5,0x08,0xA9,0x31,0xB3,0xB0,0xA7,0xB0,
3057 0x29,0x1B,0x87,0xA2,0xA1,0xB2,0x4A,0x89,0x11,0xC3,0xF3,0x98,0x08,0x03,0xA0,0xA3,
3058 0xC5,0x90,0xB3,0xB5,0xB4,0xB8,0x02,0x91,0x91,0xD3,0xA4,0xC1,0x1B,0x82,0x28,0xA4,
3059 0xD1,0x94,0x8A,0x28,0x08,0x03,0xE0,0x80,0xD4,0x90,0x91,0xA1,0x3B,0x3D,0x02,0xE4,
3060 0xA1,0x92,0x89,0x1A,0x4B,0x95,0xB3,0x90,0x99,0x6A,0x0A,0x30,0xA1,0x93,0xA6,0xA9,
3061 0x85,0x8B,0x82,0x10,0xB1,0xA3,0x94,0xF8,0x38,0x9A,0x30,0x1A,0x8B,0xA7,0x89,0x01,
3062 0x5B,0x19,0x18,0x11,0xF0,0x18,0x1C,0x39,0x19,0x0C,0x12,0x1C,0x2A,0x7B,0x3A,0x88,
3063 0x2B,0x18,0x2B,0x5C,0x20,0x92,0x8D,0x38,0x8A,0x3A,0x5B,0x2E,0x3A,0x2B,0x10,0x12,
3064 0xBB,0x6A,0x4D,0x18,0x10,0xB1,0x81,0x2A,0x8B,0x79,0x80,0x01,0x0A,0x09,0x5B,0x2D,
3065 0x84,0x8A,0x08,0x02,0xA2,0x91,0x82,0xE8,0x50,0x9B,0x85,0xA3,0xB0,0xA3,0x1B,0x02,
3066 0x18,0xF3,0xA2,0x88,0xAB,0x53,0xD1,0xB4,0xA3,0x09,0x09,0x18,0xD4,0x08,0xB0,0x09,
3067 0x58,0xD1,0x82,0x89,0x81,0x1A,0x18,0x05,0xB9,0xC3,0x30,0xC0,0x95,0x80,0xC3,0x89,
3068 0x89,0x13,0x88,0xF2,0x93,0x0E,0x18,0x01,0x92,0xA5,0xB8,0x2A,0x39,0xAA,0x33,0x9A,
3069 0xB1,0x11,0xF5,0xA1,0xA1,0x0A,0x50,0xB8,0x03,0xC4,0xA0,0x4E,0x29,0x10,0x88,0xC2,
3070 0x1A,0x39,0x1D,0x28,0x98,0x94,0x0E,0x10,0x2A,0x3C,0x02,0x2D,0x1B,0x4B,0x3B,0x49,
3071 0x19,0xA9,0x48,0x2F,0x29,0x10,0x89,0x02,0x0C,0x10,0x09,0xB9,0x70,0x1B,0x8A,0x50,
3072 0xA8,0x2B,0x49,0x89,0x69,0x88,0x95,0x89,0x90,0x92,0x4C,0x19,0x82,0xC1,0x01,0x80,
3073 0xA0,0x2B,0x7A,0x81,0x10,0xC2,0xB7,0x98,0x88,0x19,0x2C,0x03,0xB1,0xA4,0xA1,0x0C,
3074 0x3B,0x78,0x88,0x85,0xB1,0xA0,0x1B,0x3A,0x4A,0x08,0x94,0x81,0xF1,0x80,0x00,0x0C,
3075 0x59,0x09,0x18,0x90,0xA6,0x92,0x8C,0x1A,0x79,0x92,0xA8,0x00,0x81,0x2E,0x2A,0x13,
3076 0xA2,0xB0,0xA5,0x88,0x88,0x89,0x11,0x19,0xA0,0xF3,0x82,0xB0,0x83,0x5F,0x2A,0x01,
3077 0xA1,0x94,0xB0,0x09,0x78,0x98,0xA3,0xA6,0xA0,0x91,0x80,0x93,0x98,0xC1,0x12,0x18,
3078 0xC9,0x17,0xA0,0xA0,0x1A,0x21,0x80,0x99,0xD4,0x30,0x9D,0x00,0x10,0x2F,0x08,0x1C,
3079 0x21,0x08,0xB4,0xC3,0x2B,0xA9,0x52,0xD2,0xA3,0xD1,0x09,0x10,0x8B,0x24,0x92,0xD1,
3080 0x80,0x19,0xA0,0x2C,0x12,0x49,0xAA,0xB6,0x95,0xB8,0x08,0x3A,0x2B,0x01,0xF3,0xB3,
3081 0x0B,0x09,0x79,0x18,0xA2,0xA4,0xA0,0x18,0x0C,0x20,0x08,0xA9,0x16,0x0C,0x00,0x1B,
3082 0x08,0x2B,0x7B,0x01,0x01,0xB9,0x59,0x19,0x8B,0x45,0xA8,0x80,0x0C,0x1A,0x41,0x1E,
3083 0x00,0x28,0xA8,0x5A,0x00,0xC1,0x49,0x99,0x21,0x1D,0x08,0x85,0x99,0x95,0x89,0x90,
3084 0x11,0x90,0xD1,0x28,0xB2,0xA7,0x99,0x81,0x02,0xAC,0x13,0x81,0xB2,0xA6,0xA9,0x28,
3085 0x1C,0xB1,0x33,0xD1,0xC1,0x58,0xA8,0x14,0xB0,0xB7,0x91,0xA0,0x82,0x89,0xC2,0x28,
3086 0xA1,0xB2,0x49,0xD2,0x94,0xC8,0x12,0x80,0x99,0x85,0x08,0xD3,0x09,0xA2,0xB3,0x1E,
3087 0x08,0x21,0xB9,0x23,0xB4,0xAB,0x41,0xAC,0x87,0x09,0xA2,0xC5,0x0B,0x2A,0x5A,0x91,
3088 0x20,0x9A,0x89,0x78,0x9B,0x31,0x89,0x80,0x29,0x0A,0xB7,0x3C,0x98,0x48,0x1D,0x00,
3089 0x01,0xB0,0x20,0x2F,0x29,0x4A,0x89,0x94,0x1C,0x88,0x28,0x2B,0x10,0x88,0x9A,0x71,
3090 0x9A,0x08,0x4A,0x2F,0x18,0x2B,0x18,0x02,0xA8,0x4B,0x7A,0x99,0x48,0x80,0xA8,0x20,
3091 0x1D,0x40,0xA8,0x10,0x08,0xA8,0xC5,0x88,0xC2,0x18,0x88,0x2A,0x12,0xF3,0x82,0xD8,
3092 0x20,0x0A,0x09,0xA6,0x98,0x04,0xB9,0x11,0x18,0xC3,0xE1,0x29,0xA1,0x11,0xC1,0x03,
3093 0xE2,0x9A,0x33,0xA9,0xB5,0x98,0x92,0xA1,0x02,0xF8,0x21,0xA8,0x10,0x02,0xC1,0xB7,
3094 0x1B,0x90,0x5B,0x3C,0x83,0x93,0xE0,0x19,0x1A,0x11,0x11,0xF1,0x92,0x89,0x19,0x2C,
3095 0x2C,0x41,0x99,0x92,0x90,0x3F,0x18,0x4B,0x00,0x08,0xD2,0x01,0xB2,0xAA,0x78,0x09,
3096 0x01,0x91,0xA2,0x98,0x2F,0x3A,0x2C,0x01,0x00,0x93,0xE0,0x28,0x2C,0x2B,0x01,0x12,
3097 0xE1,0x80,0xB3,0x3D,0x3A,0x0A,0x50,0x98,0xC2,0xA0,0x11,0xAA,0x30,0x87,0x90,0xC2,
3098 0x29,0x88,0x38,0xC8,0xB5,0x90,0xBA,0x70,0x1A,0x02,0x94,0xD0,0x80,0x1A,0x82,0xA6,
3099 0xB0,0x91,0x18,0xB3,0x00,0x13,0xF1,0xA2,0xC1,0x82,0xB0,0x00,0x15,0x0B,0xD3,0x02,
3100 0xA8,0x91,0x2B,0x1F,0x49,0x88,0xA6,0x80,0x88,0x08,0x1B,0xA5,0x80,0xB9,0x06,0x0B,
3101 0x90,0x21,0x9D,0x48,0x18,0xA0,0x15,0xC9,0x82,0x2B,0x1A,0x42,0x9A,0xC4,0x39,0xBC,
3102 0x69,0x00,0xA0,0x29,0x8C,0x39,0x59,0x08,0x09,0x49,0xA9,0x6B,0x81,0x00,0x98,0xB0,
3103 0x68,0x3D,0x81,0x88,0x18,0x19,0x1D,0x12,0x80,0xB2,0x3A,0x3F,0x85,0x92,0xD0,0x00,
3104 0x0A,0x19,0x12,0xF1,0x02,0x9B,0x19,0x40,0xB9,0x11,0x02,0xF2,0x1A,0x08,0x94,0x0A,
3105 0xC2,0x83,0x0B,0xB4,0xA4,0xC0,0x32,0xD8,0x86,0x98,0x90,0x95,0x89,0xA3,0x83,0xC2,
3106 0x92,0xE1,0x92,0x82,0xD9,0x03,0x08,0xA9,0x85,0x92,0xA2,0x80,0xE0,0x30,0x8B,0xB3,
3107 0x87,0x89,0x90,0x83,0xA0,0x08,0x92,0x93,0x3E,0xAB,0x43,0x89,0xE3,0x80,0x83,0x2F,
3108 0x00,0xA3,0x80,0xC9,0x22,0x3F,0x08,0x81,0x0B,0x33,0x9A,0xA3,0x7B,0x0C,0x29,0x4A,
3109 0x1B,0x21,0xAA,0x70,0x1B,0x0D,0x48,0x1A,0x81,0x88,0xB1,0x39,0x3F,0x08,0x58,0xA0,
3110 0x81,0x1A,0x1A,0x2B,0x6D,0x11,0x0A,0x91,0x01,0x1A,0x98,0x5A,0x0C,0x03,0xB1,0x84,
3111 0xA3,0xAD,0x58,0x2A,0xA1,0x84,0xB1,0xA0,0x5C,0x2B,0x13,0xA8,0x95,0x83,0xE8,0x10,
3112 0x81,0xB0,0x00,0xC2,0x96,0xA0,0x91,0x00,0x2C,0x90,0x30,0xF2,0x80,0xA8,0x39,0x21,
3113 0xC1,0x03,0xAC,0x39,0x7C,0x29,0x91,0x1A,0x00,0x19,0x2C,0x3A,0x93,0xB0,0x29,0x8F,
3114 0x28,0x02,0x93,0xF3,0xA9,0x01,0x03,0xE0,0x08,0x09,0x1D,0x58,0xA1,0x83,0xA9,0x6B,
3115 0x2A,0x3C,0x21,0x89,0xC2,0x2C,0x4B,0x8A,0x50,0x81,0x98,0xA8,0x32,0x0C,0x8E,0x24,
3116 0x0B,0x1A,0x81,0x92,0xA1,0x4F,0x18,0x3A,0x0A,0xB4,0x18,0x2E,0x39,0x82,0x19,0xD3,
3117 0xD0,0x28,0x1B,0x11,0x98,0x07,0xAA,0x28,0x00,0x88,0xB4,0x89,0x1B,0x1F,0x22,0x00,
3118 0xB3,0xC9,0x33,0xAB,0x2B,0xB5,0x48,0x98,0x98,0xA7,0x10,0xD2,0xC1,0x23,0xCA,0x93,
3119 0xC6,0x80,0xA1,0x88,0x02,0x89,0xE2,0x09,0x38,0xBA,0x40,0x89,0x21,0xD8,0x49,0x10,
3120 0x8D,0x02,0x90,0xC3,0x9A,0x24,0x89,0x08,0x84,0xA5,0x9C,0x10,0x11,0x9C,0x88,0x30,
3121 0x3C,0xA1,0x94,0x58,0x8C,0x0B,0x69,0x29,0x9A,0x81,0x12,0x2B,0x8B,0x79,0x94,0xB0,
3122 0xC1,0x84,0xC2,0x99,0x25,0x99,0x11,0xA2,0x93,0xE4,0x99,0x80,0x0A,0x00,0x10,0xB7,
3123 0xB0,0x31,0xBA,0x3C,0x21,0xB3,0xF1,0x18,0xA0,0x2A,0x20,0xA3,0x06,0xE8,0x28,0xA1,
3124 0xB4,0x08,0x0B,0x11,0x4B,0xB7,0x90,0xA5,0x98,0x3D,0x19,0x02,0xA1,0xC4,0xB2,0x19,
3125 0x28,0xC0,0xA5,0x92,0xB1,0xA3,0x0A,0x0A,0x08,0x2B,0x70,0xC4,0xB3,0x00,0xBC,0x4B,
3126 0x39,0x12,0xE3,0xA0,0x00,0x3F,0x18,0x29,0x94,0xD1,0x19,0x09,0x00,0xA1,0x83,0x99,
3127 0x9B,0x35,0x80,0xC4,0xB1,0x6A,0x1A,0x1C,0x29,0x38,0x0E,0x19,0x5A,0x1A,0x82,0x8A,
3128 0x59,0x2A,0x2E,0x20,0x88,0xA8,0x3A,0x38,0x3D,0x00,0xB3,0x29,0xAD,0x49,0x10,0x0C,
3129 0x01,0x01,0xA3,0x8F,0x85,0x09,0x1B,0x88,0x10,0xA3,0xD2,0x90,0x3C,0x5C,0x39,0x03,
3130 0xD1,0xA0,0x00,0x2A,0x0B,0x04,0xA7,0x90,0xA0,0x11,0x90,0x99,0x83,0xB4,0xB1,0xF1,
3131 0x84,0x88,0x90,0x18,0x18,0xD3,0xD2,0xB3,0xA0,0x1A,0x21,0xA7,0xB2,0xB3,0x92,0x9A,
3132 0x22,0xB9,0x28,0x38,0xBD,0x87,0x2A,0xB1,0x13,0x0D,0x0A,0x38,0xC9,0x24,0xC0,0x19,
3133 0x23,0x0F,0x01,0x88,0xC0,0x2A,0x82,0x18,0x28,0xF0,0x18,0x2A,0x29,0x4B,0x35,0xB8,
3134 0xA3,0x9D,0x18,0x1B,0x40,0x00,0x9A,0x5C,0x3A,0x09,0x2F,0x38,0x8A,0x3B,0x3B,0x11,
3135 0x5C,0x19,0x2B,0x4A,0x08,0x0A,0x3D,0x20,0x4F,0x3A,0x19,0x2A,0x18,0x4D,0x1B,0x3A,
3136 0x11,0x0D,0x3A,0x3C,0x4B,0x93,0x81,0xAA,0x6B,0x4A,0x18,0x00,0xC3,0xC3,0x9A,0x59,
3137 0x2A,0x1B,0xA7,0xA1,0x81,0x88,0x88,0x58,0xB2,0xB1,0x2B,0x83,0xD4,0x81,0x08,0x0F,
3138 0x00,0x20,0xC2,0xE2,0x80,0x08,0x1C,0x29,0x04,0xB1,0xA2,0x01,0x1C,0x91,0x00,0x0C,
3139 0x49,0xB0,0x43,0xF2,0x99,0x39,0x3F,0x00,0x81,0x94,0xC1,0x09,0x1A,0x69,0x90,0x80,
3140 0x94,0xAA,0x20,0x2A,0x91,0xB1,0x39,0x7A,0x38,0xD1,0x10,0x8A,0x8C,0x5A,0x01,0xB5,
3141 0x98,0x80,0x2A,0x0B,0x32,0x92,0xF1,0x81,0x9A,0x23,0x8A,0xA3,0xB7,0x09,0x03,0x08,
3142 0xD0,0x94,0x9A,0x09,0x01,0x93,0xB7,0xC2,0x8C,0x3A,0x83,0x99,0x05,0xA0,0x0B,0x29,
3143 0x93,0xE5,0x80,0x89,0x38,0x90,0x8A,0xD7,0xA1,0x19,0x1B,0x48,0x98,0x92,0xC3,0xA1,
3144 0x09,0x3F,0x02,0x0C,0x22,0xC3,0xB2,0xA1,0x01,0x9F,0x4A,0x01,0xA3,0xD3,0xB0,0x28,
3145 0x3F,0x29,0x20,0xA2,0xC2,0xB1,0x08,0x5A,0x98,0x13,0xD2,0xC1,0x01,0xB2,0x80,0x3D,
3146 0x03,0xC1,0x89,0x96,0x90,0x90,0x3A,0x1A,0x9A,0x32,0xB6,0xA2,0x8E,0x4A,0x28,0x8A,
3147 0x84,0xA2,0x8A,0x2D,0x49,0x09,0x88,0x18,0x30,0x9D,0x2C,0x23,0xB1,0x0C,0x92,0x2D,
3148 0x39,0x82,0xC4,0x2E,0x10,0x1A,0x10,0xB9,0x48,0x19,0x39,0xBA,0x34,0xDA,0x2D,0x48,
3149 0x1A,0xA6,0x98,0x83,0x9A,0x1D,0x38,0x04,0xD0,0x18,0x90,0x2C,0x11,0x93,0xD3,0x9A,
3150 0x11,0x08,0x82,0xF1,0x01,0xA0,0x2A,0x93,0xD3,0xB4,0xB8,0x82,0x2F,0x11,0xA3,0xB3,
3151 0xA8,0x3B,0x09,0x23,0x96,0xC8,0x3B,0x3F,0x93,0x82,0xA1,0x90,0x3F,0x28,0x81,0xD1,
3152 0x93,0x08,0x2D,0x18,0x91,0xB3,0xB5,0x98,0x2A,0x2B,0x84,0xB1,0x5B,0x8A,0x31,0x18,
3153 0x80,0x8B,0x7E,0x39,0x2B,0x02,0xC1,0x8B,0x6C,0x49,0x09,0x10,0xA1,0x08,0x01,0x0C,
3154 0x20,0xA1,0x09,0x4F,0x18,0x00,0x01,0xA0,0x5C,0x1B,0x5B,0x10,0x92,0x90,0x2B,0x5A,
3155 0x3D,0x18,0x91,0x19,0x98,0x2D,0x39,0x89,0x2D,0x3A,0x48,0x2C,0x11,0xB5,0x9A,0x19,
3156 0x5B,0x28,0x90,0x95,0x98,0x89,0x2B,0x40,0x08,0x90,0xF3,0x0A,0x08,0xA6,0x80,0x91,
3157 0xB2,0xA0,0x02,0xF2,0xA1,0xB7,0x89,0x81,0x82,0x91,0xB1,0x21,0xAB,0x32,0xE9,0x04,
3158 0xA2,0x8D,0x12,0x91,0xA3,0xA3,0xD2,0x8B,0x39,0xD1,0x84,0xE2,0x90,0x00,0x2B,0x29,
3159 0xA3,0xD4,0xA1,0x91,0x1D,0x5A,0x08,0x19,0x11,0x99,0x08,0x18,0x49,0x0F,0x18,0x10,
3160 0x82,0xF1,0x00,0x89,0x2F,0x3A,0x01,0xB3,0xC2,0x81,0x3F,0x29,0x08,0x10,0xA1,0xA1,
3161 0x3B,0x5D,0x19,0x28,0x0B,0x38,0x82,0x91,0x19,0xBD,0x3B,0x7A,0x80,0x12,0xB3,0xE0,
3162 0x0B,0x6A,0x01,0x88,0xA4,0x08,0x0B,0x08,0x59,0x80,0x80,0x1D,0x49,0x89,0x00,0x84,
3163 0x99,0x1A,0x2B,0x32,0xE3,0xB4,0xA9,0x3A,0x99,0x31,0xE3,0xAA,0x58,0x3B,0x88,0x95,
3164 0xC0,0x18,0x4A,0x09,0x30,0xF2,0xA3,0x1C,0x1B,0x49,0x00,0xD3,0xB2,0xA0,0x18,0x11,
3165 0x92,0xD3,0xB2,0x91,0x80,0xE7,0xA1,0x91,0x98,0x19,0x22,0xC2,0xD2,0x18,0x8D,0x3B,
3166 0x10,0xA5,0x91,0x98,0x02,0x3E,0x80,0x01,0x90,0xAA,0x13,0xF1,0x02,0xD1,0x08,0x19,
3167 0x49,0xB4,0x91,0xB4,0x99,0x2A,0x0C,0x32,0xC0,0x05,0x88,0x0B,0x80,0x2C,0x81,0x10,
3168 0x0B,0x51,0xA9,0x19,0x05,0xBF,0x28,0x20,0xE1,0x90,0x80,0x28,0x19,0x08,0x26,0xB1,
3169 0xA1,0x18,0x88,0x2A,0xF0,0x12,0x8A,0xB3,0x14,0x1B,0xD4,0xD8,0x10,0x08,0x8A,0x17,
3170 0xA0,0x98,0x2B,0x3A,0x29,0x48,0xA4,0x99,0x0E,0x4A,0x12,0x8B,0x31,0x8B,0x4E,0x1A,
3171 0x11,0xB5,0x89,0x91,0x29,0x89,0xC2,0x97,0x90,0x0A,0x19,0x11,0x91,0xC1,0xD5,0x08,
3172 0x89,0x20,0x91,0xB1,0x1A,0x2D,0x18,0x29,0xD2,0x3B,0x3E,0x3A,0x2A,0x90,0x82,0x1C,
3173 0x49,0x3B,0x93,0xB6,0xC8,0x4C,0x02,0x91,0x93,0xF2,0x88,0x2D,0x28,0x81,0x82,0xC1,
3174 0x89,0x2D,0x6B,0x19,0x82,0x80,0x18,0x8B,0x39,0x39,0xC8,0x3A,0x6A,0x0A,0x22,0xD2,
3175 0x09,0x2C,0x1A,0x68,0x92,0xE2,0x89,0x2A,0x2A,0x30,0xC2,0xA3,0xB4,0x1D,0x2A,0x09,
3176 0x93,0x18,0xF2,0x89,0x28,0xB3,0x01,0x8F,0x18,0x11,0xA1,0x93,0x90,0xD1,0x7A,0x20,
3177 0xC3,0xA2,0xA8,0x88,0x1D,0x28,0xA5,0xA2,0xA2,0x0B,0x29,0x2B,0x87,0xC1,0x80,0x0A,
3178 0x19,0x01,0x12,0xF1,0x10,0x80,0x0A,0x18,0x08,0x2F,0x4A,0x02,0x89,0x1B,0x29,0x5D,
3179 0x4C,0x08,0x82,0xA1,0x0A,0x3A,0x4B,0x29,0xC6,0xC3,0x09,0x09,0x88,0x39,0x98,0x82,
3180 0xA5,0x1A,0x30,0x11,0xBD,0x3F,0x12,0x8B,0x28,0xC3,0x88,0x3F,0x2B,0x3B,0x48,0xA1,
3181 0x80,0x8A,0x4D,0x39,0x01,0x93,0xA2,0xF1,0x19,0x19,0x0A,0x02,0xB2,0x8B,0x24,0xD2,
3182 0x4B,0x12,0xC8,0x2E,0x10,0xB5,0x89,0x01,0x09,0x1C,0x2A,0x03,0xD4,0x91,0x98,0x99,
3183 0x11,0x2B,0xE4,0x00,0x00,0x01,0xE0,0xA5,0x89,0x99,0x31,0x18,0xD0,0xB7,0x98,0x18,
3184 0x0A,0x10,0x94,0xC2,0x90,0x18,0x00,0x99,0x87,0xA0,0x90,0x2A,0x3C,0x02,0xB8,0xC1,
3185 0x79,0x1A,0x20,0x08,0xA1,0xD2,0x1C,0x29,0x03,0xD1,0x29,0x99,0x2C,0x50,0xB3,0xD1,
3186 0x08,0x09,0x3C,0x10,0x04,0xB2,0x0D,0x2B,0x59,0x80,0x90,0x01,0x0F,0x3A,0x18,0x01,
3187 0xA2,0x9B,0x5B,0x3D,0x81,0x03,0xD2,0x98,0x59,0x90,0x81,0x92,0xB4,0x8B,0x1B,0x40,
3188 0xB2,0xB5,0x08,0x4B,0x01,0x09,0xD1,0x91,0x8B,0x7A,0x10,0xB3,0xC3,0x99,0x49,0x1A,
3189 0x29,0xB5,0xA2,0xAB,0x40,0x81,0x19,0xB7,0xB0,0x20,0x2B,0xD4,0x88,0xA1,0x91,0x3C,
3190 0x82,0x37,0xD3,0xB1,0x8A,0x1B,0x30,0xB3,0xF4,0xA1,0x91,0x09,0x10,0x03,0xD0,0x83,
3191 0xA9,0x8F,0x10,0x01,0x90,0x18,0x80,0x20,0x2B,0xF1,0x28,0x99,0x2A,0x41,0xF0,0x12,
3192 0xAA,0x83,0x82,0xD1,0xC1,0x08,0x89,0x59,0x09,0x83,0x87,0xB0,0x2A,0x4D,0x18,0x09,
3193 0x19,0xB3,0x4B,0x3F,0x39,0x19,0x09,0x01,0x89,0x03,0x1F,0x00,0x1A,0x0B,0x10,0x68,
3194 0xA0,0x18,0x8C,0x6A,0x09,0x08,0x97,0xA1,0x81,0x1B,0x2B,0x4C,0x03,0xB4,0xA8,0x92,
3195 0x4B,0x3C,0xA1,0x81,0x95,0xA8,0x81,0x12,0xBB,0x92,0x45,0xB9,0x93,0xF4,0x88,0x0A,
3196 0x2D,0x28,0x00,0xA3,0xA3,0x8A,0x3F,0x48,0xB1,0x92,0xB4,0xA8,0x30,0x80,0xD3,0x80,
3197 0xD1,0x19,0x3B,0xC4,0x81,0xC1,0x29,0x0D,0x20,0x13,0xC8,0xB4,0x4C,0x09,0x00,0x82,
3198 0xC2,0x3B,0x0D,0x30,0x0B,0x12,0xF0,0x1B,0x20,0x0A,0xA6,0x80,0x0A,0x4A,0x4A,0x80,
3199 0x94,0xB1,0x2E,0x3B,0x1A,0x10,0x93,0x10,0x4C,0x3D,0x08,0x82,0xC9,0x19,0x6A,0x2B,
3200 0x38,0xD1,0x08,0x19,0x2A,0x5A,0x82,0xB1,0x8D,0x29,0x78,0x09,0x82,0x0A,0x2C,0x1B,
3201 0x19,0x41,0xB8,0x8C,0x79,0x2B,0x11,0x88,0x82,0x91,0xDC,0x28,0x11,0xB0,0x11,0x18,
3202 0xC9,0x62,0xA1,0x91,0x98,0x3B,0x3A,0xB0,0xF4,0x01,0xC0,0x29,0x39,0xF8,0x95,0x91,
3203 0x88,0x88,0x91,0x03,0xA1,0xE2,0x18,0x82,0xD1,0xA2,0xD1,0x80,0x19,0x20,0x83,0xB1,
3204 0xE3,0x80,0x91,0x4D,0x1A,0x03,0xB2,0x09,0x18,0xD1,0x19,0x09,0x92,0xA6,0xA0,0xB6,
3205 0xB2,0x8B,0x38,0x10,0x42,0xD3,0xD0,0xA8,0x20,0x2C,0x10,0x01,0xB1,0xB4,0xAB,0x5B,
3206 0x79,0x80,0x10,0x1A,0xA8,0x3D,0x18,0x20,0xB3,0x8F,0x18,0x01,0x00,0x09,0xF3,0x89,
3207 0x69,0x88,0x81,0x91,0x08,0xE1,0x1A,0x08,0x11,0x81,0x1E,0x29,0xA0,0x01,0x00,0x90,
3208 0x3E,0x7B,0x18,0x82,0xC3,0xA1,0x2A,0x2C,0x5B,0x81,0xA5,0x90,0x81,0x00,0x0B,0x1A,
3209 0x1C,0x2C,0x32,0xC0,0xF3,0x80,0x2D,0x2A,0x10,0x02,0xE4,0xC1,0x89,0x4A,0x09,0x01,
3210 0x03,0xD2,0x98,0x2A,0x39,0x8A,0x89,0x26,0xB1,0xB2,0x12,0xC0,0x0A,0x5A,0x18,0x98,
3211 0xF3,0x92,0x99,0x99,0x79,0x01,0xB5,0xA1,0x80,0x80,0x90,0x83,0xA0,0xE2,0x81,0x29,
3212 0x93,0x8A,0x0A,0x6A,0x1F,0x18,0x02,0xC8,0x01,0x19,0x3B,0x4A,0x98,0x17,0xA8,0x0D,
3213 0x38,0xA1,0x91,0x10,0xA2,0x2B,0x4C,0xA6,0x81,0xBA,0x21,0x4C,0x80,0x21,0xD1,0x92,
3214 0x2C,0x08,0x30,0x9F,0x93,0x2A,0x89,0x03,0x8B,0x87,0x0A,0x0D,0x12,0x98,0xA4,0x93,
3215 0xBB,0x59,0x18,0xA1,0x32,0xE9,0x84,0x08,0x8A,0x02,0xA1,0x91,0x4B,0xB4,0x20,0x88,
3216 0xF0,0x3A,0x1A,0x88,0x87,0xB1,0x92,0x0A,0x08,0x6B,0x83,0xC3,0x91,0xC0,0x2B,0x79,
3217 0x08,0x8A,0x84,0xA0,0x89,0x40,0x1B,0xA1,0x39,0x98,0x17,0xC2,0xA2,0x12,0xCD,0x20,
3218 0x89,0x92,0x25,0xB0,0x2D,0x3A,0x8B,0x58,0x2A,0xA0,0x4C,0x08,0x30,0xAE,0x82,0x59,
3219 0x89,0x1A,0x10,0xC2,0x18,0x2C,0x40,0x1E,0x01,0xA3,0x8A,0x81,0x2C,0x29,0x29,0xA9,
3220 0x13,0x51,0xAD,0x12,0x89,0x8F,0x18,0x2C,0x39,0x00,0xC1,0x10,0x3C,0x2A,0x41,0xC8,
3221 0xA2,0x91,0x0A,0x6C,0x10,0x12,0x88,0xE8,0x30,0x91,0x81,0xD8,0x01,0x1B,0x0D,0x07,
3222 0x00,0xA8,0x92,0x0A,0x28,0xD2,0xC3,0x02,0xAA,0x94,0x81,0xB4,0xB3,0x1A,0x0B,0x13,
3223 0xF9,0x16,0xA1,0x8A,0x59,0x19,0x02,0xC1,0x91,0x8B,0x3D,0x18,0x3B,0xA4,0x94,0x80,
3224 0x99,0x88,0x1C,0x79,0x0A,0x02,0x03,0xF8,0x90,0x39,0x5B,0x19,0x02,0xC3,0x90,0xBB,
3225 0x58,0x6A,0x09,0x02,0x89,0x91,0x88,0x1A,0x69,0x8A,0x19,0x15,0xA0,0xA2,0x00,0x9A,
3226 0x6B,0x49,0x88,0xA3,0x92,0xBB,0x6B,0x3D,0x38,0x01,0x98,0x91,0x3F,0x09,0x18,0x20,
3227 0x90,0x80,0xAC,0x70,0x91,0x9B,0x51,0x09,0x88,0x99,0x14,0x8B,0x98,0x83,0x79,0xA0,
3228 0x99,0x13,0x01,0x19,0xE0,0x83,0x0B,0xB0,0x0C,0x31,0x95,0xB5,0xC2,0x8A,0x39,0x20,
3229 0x80,0x39,0xF3,0xB1,0x10,0x88,0x5E,0x18,0x94,0xA1,0x88,0xA1,0x98,0x15,0xAA,0x39,
3230 0xD4,0x84,0xC0,0xA2,0xA2,0x0C,0x81,0x86,0xB5,0xA1,0xB1,0x14,0x1B,0xB1,0x02,0x92,
3231 0xC3,0xE0,0x88,0x11,0xAA,0x69,0x18,0x81,0xA3,0xB0,0x01,0xBF,0x2A,0x31,0x93,0xF1,
3232 0x00,0x89,0x18,0x19,0x11,0xD3,0xE0,0x10,0x18,0xB1,0x18,0x24,0x9A,0x2B,0xA4,0xC0,
3233 0xB0,0x31,0x6C,0x19,0xB4,0x12,0xA8,0xEA,0x58,0x10,0x8B,0x93,0x82,0x88,0x9A,0x41,
3234 0x10,0xC3,0xEA,0x41,0xA9,0x9C,0x34,0xA1,0x2A,0x79,0xA2,0x01,0xA8,0xB3,0x28,0xCC,
3235 0x41,0x9A,0xB3,0x4B,0xB3,0x27,0x8B,0x83,0x2B,0x2F,0x08,0x28,0xB2,0x80,0x2C,0x30,
3236 0x5E,0x09,0x12,0x9B,0x09,0x22,0x5B,0x19,0x8A,0x11,0x59,0x99,0xA4,0x32,0xCD,0x18,
3237 0x08,0x10,0x85,0xB3,0xB4,0x1E,0x88,0x28,0x8A,0x11,0x09,0xC0,0x79,0x80,0x91,0x3B,
3238 0x80,0x10,0x0F,0x01,0x80,0x91,0x19,0x3D,0x92,0x28,0xA8,0x37,0x9A,0x0A,0x3A,0x8A,
3239 0x45,0xA9,0xA4,0x00,0xAA,0x09,0x3D,0x59,0x20,0xE1,0x08,0x98,0x90,0x59,0x10,0x09,
3240 0xA3,0xC3,0x93,0x99,0x2B,0x69,0x11,0xD1,0xB1,0xA4,0x91,0x3C,0x89,0x83,0xF0,0x10,
3241 0x91,0xA1,0x89,0x59,0x05,0x99,0x93,0x94,0xC8,0x08,0x0A,0x09,0x17,0xB1,0x83,0xC1,
3242 0x91,0x40,0xA2,0xC2,0x98,0xC3,0xBA,0x28,0x23,0x0F,0x80,0x50,0xB8,0x19,0x10,0x96,
3243 0x98,0x8C,0x05,0x98,0x19,0x29,0x2B,0x3B,0x0A,0xE2,0x01,0x0F,0x3C,0x38,0x08,0x09,
3244 0x81,0x4A,0x6C,0x08,0x00,0x88,0x98,0x38,0x2C,0x5A,0x1B,0x20,0x1A,0x39,0xB0,0x09,
3245 0xCB,0x5B,0x49,0x09,0x71,0x00,0xC1,0x0E,0x08,0x38,0x0C,0x02,0x10,0x0E,0x10,0x8A,
3246 0x48,0x19,0x90,0x92,0x0D,0xA3,0x98,0x3B,0x79,0x19,0x01,0x10,0xE1,0x80,0x19,0x2B,
3247 0x10,0xF2,0x02,0xAB,0x84,0x9A,0x29,0xB4,0x80,0x92,0x03,0x88,0x95,0xD0,0x03,0x90,
3248 0xA0,0xC7,0xA1,0xB0,0xA2,0x02,0x18,0xB5,0xD4,0x01,0xC0,0x08,0xA2,0x93,0xA8,0xA0,
3249 0xC3,0x20,0xF3,0x90,0x00,0xD5,0x08,0x89,0xA5,0x80,0xA0,0x81,0x82,0xC2,0x09,0xD1,
3250 0x13,0xCB,0x03,0x84,0x91,0xE1,0x1B,0x12,0x08,0xAB,0x87,0x18,0xAB,0x58,0x89,0x28,
3251 0x81,0xC9,0x33,0xA9,0x80,0x2E,0x20,0x83,0xB9,0x20,0x3B,0x9E,0x7A,0x08,0x81,0x18,
3252 0x0B,0x88,0x79,0x80,0x8B,0x00,0x12,0x0E,0x89,0x51,0x1B,0x81,0xA0,0x3A,0x01,0xAF,
3253 0x11,0x28,0xBA,0x35,0x98,0x88,0x52,0xC0,0x83,0x2F,0xA9,0x11,0x0A,0x19,0x25,0xD0,
3254 0x30,0x9C,0x08,0x21,0x98,0x81,0x2A,0xF3,0x2A,0x80,0xB6,0x2B,0x08,0x93,0xE9,0x02,
3255 0x81,0x8C,0x21,0x00,0xA6,0xA9,0x94,0x01,0x8F,0x80,0x94,0x98,0x93,0xB4,0x00,0x08,
3256 0xC0,0x14,0x98,0xB3,0xB4,0xC1,0x09,0x18,0xA7,0x00,0xA3,0xC8,0x0A,0x3C,0x19,0x96,
3257 0x83,0xC1,0x99,0x19,0x4A,0x85,0x80,0xC1,0x91,0x99,0x90,0x2A,0x17,0x95,0x99,0x88,
3258 0x12,0xAE,0x39,0x08,0x92,0x84,0xB0,0xA8,0x79,0x09,0x19,0x01,0xB2,0xA3,0x8F,0x28,
3259 0x2B,0xA2,0x40,0x82,0xA0,0x4C,0xA9,0x39,0x8D,0x81,0x70,0x88,0xA0,0x1A,0x49,0x2D,
3260 0x1A,0x26,0xA8,0x98,0x08,0x29,0x0B,0x12,0x96,0xB1,0xB2,0x3A,0x13,0x9B,0x60,0xA0,
3261 0x88,0xB2,0x34,0xEA,0x1A,0x2A,0x79,0x98,0x10,0x04,0x8C,0x1C,0x81,0x04,0x8C,0x83,
3262 0x19,0x2F,0x81,0x93,0x98,0x10,0x08,0x30,0x2A,0xFA,0x05,0x08,0x2A,0x89,0x91,0xA3,
3263 0xFA,0x11,0x11,0x00,0x8C,0x04,0x8A,0x2A,0xB5,0x10,0xA9,0xC2,0x3D,0x1B,0x32,0x04,
3264 0x0A,0x1A,0x09,0x40,0x1F,0x92,0x1D,0x2A,0x91,0x10,0x30,0x2F,0x0B,0x68,0x99,0xA2,
3265 0x92,0x88,0x78,0xA9,0x20,0x28,0xE2,0x92,0x1A,0x99,0x4B,0x19,0x22,0xA1,0xE2,0x21,
3266 0x2F,0x98,0x29,0x18,0x91,0x08,0xB0,0x79,0x1A,0x82,0x3B,0xB1,0xA7,0x8A,0xB3,0x98,
3267 0x5B,0x23,0xCA,0x42,0x83,0xF0,0x90,0x18,0x98,0x08,0xB4,0x20,0xA3,0xC0,0x43,0xD8,
3268 0x80,0x81,0xA3,0x99,0xD9,0xA7,0x19,0x90,0x10,0x05,0xB1,0x8B,0x02,0xA4,0xBD,0x23,
3269 0x93,0x8A,0x99,0x4B,0x03,0xC1,0xF8,0x38,0x09,0x2B,0x14,0xD0,0x03,0x8A,0x2A,0x39,
3270 0xB9,0x97,0x90,0xAA,0x50,0x01,0x99,0x51,0xD1,0x09,0x1A,0xB5,0x00,0x8B,0x93,0x08,
3271 0x98,0x11,0xF9,0x85,0x2B,0x08,0x96,0x89,0x90,0x2A,0x12,0x4A,0xD8,0x85,0x2B,0x0E,
3272 0x10,0x00,0x01,0xB1,0x9B,0x69,0x1A,0x90,0x40,0xB8,0x01,0x08,0x0A,0x2C,0x09,0x14,
3273 0x4B,0xE2,0x82,0x88,0xB1,0x78,0x0A,0x01,0xC2,0x93,0x19,0xCE,0x20,0x3C,0x82,0xB4,
3274 0x1B,0x20,0x8C,0x3B,0x29,0xAB,0x86,0x23,0xD8,0x81,0x9A,0x5A,0x49,0xB0,0x16,0xA0,
3275 0xB0,0x28,0x1B,0x13,0x93,0xE4,0xA2,0xA9,0x08,0x5A,0xB3,0x12,0xC1,0xE1,0x10,0x88,
3276 0x01,0x0C,0x92,0x08,0x89,0xB7,0x88,0x81,0x10,0x9A,0x17,0xA0,0xB0,0x13,0x99,0xE0,
3277 0x39,0x31,0xD2,0xB2,0x80,0x0B,0x2D,0x49,0x80,0x01,0xB0,0x06,0x09,0x0C,0x3A,0x69,
3278 0xA0,0x08,0xB2,0xA1,0x69,0x2B,0x5A,0x81,0x92,0xBA,0x21,0xB1,0x7D,0x10,0x80,0x08,
3279 0x88,0x82,0x32,0x0D,0xB0,0x1A,0x1C,0x21,0x94,0xA9,0x58,0xB9,0x5A,0x4A,0xA0,0x13,
3280 0xA9,0x80,0x7C,0x00,0x20,0x8A,0x04,0x0C,0x00,0x82,0x2A,0xB2,0xAC,0x4B,0x69,0xA0,
3281 0xA6,0x81,0x9B,0x19,0x38,0x8B,0x17,0xB2,0x81,0x2A,0xBB,0x94,0x29,0xA2,0x15,0xBA,
3282 0x97,0xA3,0xB9,0x79,0x01,0xB2,0x02,0xF1,0x90,0x0A,0x29,0x11,0x88,0xE5,0xA0,0x81,
3283 0x19,0x91,0x90,0x28,0xB3,0x14,0xD0,0xB5,0x91,0x9A,0x29,0x0B,0x07,0xA2,0xB3,0x01,
3284 0x9D,0x28,0x41,0xD0,0x91,0x90,0x82,0x1A,0xA8,0x44,0x9A,0xA9,0x21,0xE3,0xA9,0x4B,
3285 0x19,0x78,0x89,0x83,0xA3,0xB9,0x5A,0x3D,0x80,0x82,0xA2,0xA0,0x6C,0x10,0x20,0x8B,
3286 0x93,0x8B,0x0E,0x33,0xA9,0xB1,0x68,0x8A,0x31,0xAC,0x94,0xB4,0x8B,0x32,0x0B,0xB4,
3287 0x81,0x91,0x1D,0x33,0xD9,0x31,0xE1,0x8B,0x3B,0x30,0x12,0x49,0xD2,0x8E,0x29,0x18,
3288 0x8A,0x92,0x02,0xAA,0x59,0x1C,0x32,0x88,0x01,0x23,0xFB,0x83,0x29,0xDA,0x59,0x01,
3289 0x81,0x92,0xE1,0x18,0x8A,0x1D,0x30,0x93,0xF1,0x00,0x01,0x0B,0x39,0x92,0x89,0xA0,
3290 0x11,0x5B,0xE0,0x82,0x09,0x13,0xAA,0xB4,0x16,0xD8,0x91,0x2A,0x29,0x84,0x1B,0xC5,
3291 0x98,0x98,0x31,0x98,0x99,0x17,0xA9,0x20,0x92,0xC3,0x18,0x9D,0x20,0x3D,0x89,0x94,
3292 0xA2,0x1C,0x5C,0x29,0x39,0xA0,0xB3,0x00,0x0C,0x4C,0x48,0x92,0x0A,0x91,0x85,0x9A,
3293 0x01,0x82,0x1F,0x10,0x99,0x15,0xC1,0xA0,0x39,0x1A,0x1D,0x85,0xB4,0x90,0x1A,0x2A,
3294 0x4B,0x01,0xB2,0x93,0xBE,0x12,0x83,0xC9,0x18,0x09,0x20,0x78,0xF1,0x08,0x19,0x88,
3295 0x3A,0x83,0xB3,0xA9,0x93,0x7A,0x0A,0x96,0x98,0x00,0xA8,0x3A,0x30,0x92,0xF2,0x9B,
3296 0x3D,0x38,0x92,0x92,0xC3,0xB8,0x6B,0x29,0x01,0x01,0xB2,0x2F,0x09,0x19,0x18,0x01,
3297 0x3B,0x7B,0x10,0xA1,0x90,0x39,0x0F,0x38,0x0A,0xB5,0xA4,0x89,0x8B,0x6A,0x2B,0x12,
3298 0xC8,0x90,0x40,0x2A,0x9E,0x22,0x88,0x18,0x09,0x3A,0xC3,0xE8,0x09,0x59,0x08,0x12,
3299 0x94,0xD0,0x1A,0x2C,0x38,0x00,0xA1,0x83,0xE8,0x08,0x3A,0x08,0x10,0x9E,0x83,0x1D,
3300 0x92,0x19,0x2C,0x39,0x3B,0x59,0x04,0xE1,0x80,0x08,0x8D,0x21,0x81,0xB2,0xB2,0x02,
3301 0x99,0x91,0xA4,0xD6,0x98,0x99,0x03,0x80,0x98,0xA7,0x91,0x09,0xA1,0xB2,0xB3,0xE1,
3302 0x12,0x92,0xB1,0x81,0x06,0x99,0x0A,0x23,0xC4,0xB1,0xF2,0x89,0x19,0x3A,0x94,0x82,
3303 0xE0,0x89,0x38,0x0B,0xA4,0xA5,0x80,0x80,0x8C,0x34,0xB9,0xA9,0x23,0x13,0xB9,0xC1,
3304 0xC7,0x1B,0x89,0x10,0x20,0x11,0xE3,0xA8,0x4B,0x0B,0x40,0x91,0x90,0x1B,0x5F,0x2A,
3305 0x18,0x82,0x91,0x0B,0x4A,0x28,0xCA,0x40,0x80,0x5B,0x2C,0x13,0xB0,0x8A,0xA9,0x5A,
3306 0x58,0x89,0x82,0x88,0x2E,0x3B,0x31,0xA1,0x9B,0x01,0x7A,0x2C,0x01,0x91,0x93,0x3F,
3307 0x88,0x39,0x10,0xF1,0x91,0x8B,0x48,0x0A,0x12,0xE3,0xA8,0x18,0x28,0x92,0x97,0x98,
3308 0x99,0x19,0xA1,0x11,0xB6,0x88,0x3B,0x10,0xD3,0xC3,0xA1,0x2A,0x8A,0x49,0x04,0xF1,
3309 0x91,0x02,0x8A,0x89,0x04,0xF1,0x98,0x80,0x18,0x12,0xE3,0x81,0x98,0x80,0x01,0xB3,
3310 0xF2,0x99,0x12,0x2A,0xB5,0xB3,0x92,0xAA,0x19,0x50,0xB2,0xC3,0x92,0xD0,0x2B,0x68,
3311 0x93,0x99,0xC0,0x2C,0x3E,0x80,0x20,0x08,0x93,0x0D,0x2A,0x31,0x8D,0x02,0x2B,0x91,
3312 0x08,0x0A,0x03,0x2C,0x3C,0x52,0xB9,0xA0,0x12,0xBF,0x3A,0x29,0x01,0x88,0xC0,0x6A,
3313 0x3C,0x0A,0x49,0x18,0x0B,0x39,0x2B,0x69,0x0A,0x84,0x2A,0x2A,0x1C,0x2A,0xC3,0x8C,
3314 0x19,0x50,0x09,0x91,0xA7,0x8D,0x18,0x1A,0x28,0x00,0xA0,0x94,0x10,0x1F,0x20,0x90,
3315 0x8A,0x12,0xD0,0x1A,0x5A,0x81,0x04,0xBC,0x23,0x10,0xE0,0x90,0x90,0x18,0x1A,0xA6,
3316 0x12,0xB1,0xD0,0x4A,0x08,0x82,0x92,0xB6,0x9A,0x0A,0x12,0x88,0xC3,0xC5,0x8A,0x89,
3317 0x20,0xB5,0x93,0x0B,0x18,0x00,0x09,0xF2,0x88,0x2A,0x4A,0x08,0x05,0xB2,0xA9,0x3B,
3318 0x5D,0x28,0xA4,0xB1,0x00,0x19,0x19,0x7A,0xA3,0xB3,0x0A,0x90,0xA1,0xC4,0x80,0xBA,
3319 0x50,0x13,0xC1,0xC2,0x9A,0x2A,0x7B,0x28,0x84,0xC1,0x09,0x3B,0x4E,0x20,0x91,0xA1,
3320 0x18,0xAB,0x79,0x10,0xB4,0x08,0x9A,0x11,0x2B,0xF0,0x93,0xAA,0x01,0x6A,0x01,0x93,
3321 0x80,0xB8,0x2A,0x5B,0x10,0x80,0x89,0x4A,0x5B,0x92,0x15,0xB2,0xA0,0x2F,0x19,0x93,
3322 0xB8,0x95,0x80,0x1C,0x21,0xA9,0x02,0x0B,0xA0,0x5A,0x18,0x98,0x39,0x1B,0x68,0x00,
3323 0x91,0x91,0x9C,0x39,0x3E,0x18,0x84,0xB3,0x9B,0x7A,0x08,0x18,0x0A,0xB5,0x91,0x0B,
3324 0x28,0x39,0x19,0x90,0x0A,0x50,0xAC,0x11,0x01,0xAB,0x88,0x52,0x1B,0x83,0xC4,0xA2,
3325 0x9A,0xAB,0x03,0x90,0x19,0x93,0x81,0x08,0x92,0x9A,0x68,0x98,0x19,0x39,0xC1,0x92,
3326 0x8A,0x38,0x4E,0x02,0xB1,0x90,0xC3,0x18,0x2B,0x04,0xC3,0xD2,0x91,0x90,0x81,0x89,
3327 0x13,0xF1,0x88,0x93,0xA2,0x00,0x91,0xC0,0x5B,0x21,0x99,0x93,0x06,0x9A,0x1B,0x48,
3328 0x99,0xB7,0x90,0x89,0x18,0x1B,0x11,0xA4,0xB2,0x81,0x9A,0x08,0x97,0x98,0x91,0x10,
3329 0xB8,0x06,0xA2,0xA0,0x29,0x2B,0x21,0xC2,0xD1,0x10,0x1A,0x4A,0x29,0xF1,0x98,0x29,
3330 0x1B,0x31,0x10,0xA0,0xA1,0x1D,0x5A,0x29,0xB2,0x82,0xA8,0x0F,0x28,0x21,0x09,0x91,
3331 0x82,0x4D,0x10,0xA3,0xB0,0x89,0x4C,0x39,0xA0,0xA4,0xA1,0x89,0x1E,0x28,0x29,0xA3,
3332 0xC3,0x2D,0x19,0x01,0x49,0x01,0x9B,0x0C,0x21,0xC2,0xA2,0x93,0x7C,0x2A,0x10,0x90,
3333
3334 /* Source: 08HH.ROM */
3335 /* Length: 384 / 0x00000180 */
3336
3337 0x75,0xF2,0xAB,0x7D,0x7E,0x5C,0x3B,0x4B,0x3C,0x4D,0x4A,0x02,0xB3,0xC5,0xE7,0xE3,
3338 0x92,0xB3,0xC4,0xB3,0xC3,0x8A,0x3B,0x5D,0x5C,0x3A,0x84,0xC2,0x91,0xA4,0xE7,0xF7,
3339 0xF7,0xF4,0xA1,0x1B,0x49,0xA5,0xB1,0x1E,0x7F,0x5A,0x00,0x89,0x39,0xB7,0xA8,0x3D,
3340 0x4A,0x84,0xE7,0xF7,0xE2,0x2D,0x4C,0x3A,0x4E,0x7D,0x04,0xB0,0x2D,0x4B,0x10,0x80,
3341 0xA3,0x99,0x10,0x0E,0x59,0x93,0xC4,0xB1,0x81,0xC4,0xA2,0xB2,0x88,0x08,0x3F,0x3B,
3342 0x28,0xA6,0xC3,0xA2,0xA2,0xC5,0xC1,0x3F,0x7E,0x39,0x81,0x93,0xC2,0xA3,0xE5,0xD2,
3343 0x80,0x93,0xB8,0x6D,0x49,0x82,0xD4,0xA1,0x90,0x01,0xA0,0x09,0x04,0xE3,0xB2,0x91,
3344 0xB7,0xB3,0xA8,0x2A,0x03,0xF3,0xA1,0x92,0xC5,0xC3,0xB2,0x0B,0x30,0xB3,0x8E,0x6D,
3345 0x4A,0x01,0xB4,0xB4,0xC4,0xC3,0x99,0x3B,0x12,0xE3,0xA1,0x88,0x82,0xB4,0x9A,0x5C,
3346 0x3A,0x18,0x93,0xC3,0xB3,0xB4,0xA8,0x19,0x04,0xF3,0xA8,0x3B,0x10,0xA2,0x88,0xA5,
3347 0xB2,0x0B,0x6D,0x4B,0x10,0x91,0x89,0x3C,0x18,0x18,0xA6,0xC4,0xC3,0x98,0x19,0x2B,
3348 0x20,0x91,0xA0,0x4E,0x28,0x93,0xB3,0xC2,0x92,0xA9,0x5A,0x96,0xC4,0xC2,0x09,0x01,
3349 0xC4,0xA1,0x92,0xC4,0xA1,0x89,0x10,0xA3,0xA1,0x90,0x1C,0x5A,0x01,0xC5,0xA1,0x92,
3350 0xD4,0xB3,0xC4,0xC4,0xC3,0xA1,0x88,0x1A,0x28,0x89,0x3C,0x3A,0x3D,0x29,0x00,0x93,
3351 0xB0,0x3D,0x28,0x80,0x91,0x82,0xE3,0x99,0x2A,0x11,0xD6,0xC3,0x99,0x29,0x82,0xC4,
3352 0xC3,0xA1,0x0A,0x3B,0x3D,0x3A,0x02,0xC3,0xA2,0x99,0x3B,0x2C,0x7C,0x28,0x81,0xA3,
3353 0xB2,0xA3,0xB1,0x08,0x1A,0x3C,0x18,0x2E,0x4C,0x39,0xA5,0xB3,0xB4,0xC2,0x88,0x08,
3354 0x19,0x0A,0x49,0xB7,0xB3,0xA2,0xA1,0x92,0xA1,0x93,0xB1,0x0C,0x7D,0x39,0x93,0xB3,
3355 0xB1,0x1A,0x19,0x5D,0x28,0xA6,0xC4,0xB2,0x90,0x09,0x2A,0x18,0x1B,0x5B,0x28,0x88,
3356 0x2C,0x29,0x82,0xA0,0x18,0x91,0x2D,0x29,0x2B,0x5C,0x4C,0x3B,0x4C,0x28,0x80,0x92,
3357 0x90,0x09,0x2B,0x28,0x1D,0x6B,0x11,0xC5,0xB2,0x0B,0x39,0x09,0x4D,0x28,0x88,0x00,
3358 0x1B,0x28,0x94,0xE3,0xA0,0x1A,0x28,0xB5,0xB4,0xB3,0xB2,0x93,0xE2,0x91,0x92,0xD4,
3359 0xA0,0x1B,0x4A,0x01,0xA1,0x88,0x2D,0x5C,0x3B,0x28,0x08,0x93,0xD4,0xB2,0x91,0xB4,
3360 0xA0,0x3E,0x3B,0x4B,0x3B,0x29,0x08,0x93,0x9B,0x7B,0x3A,0x19,0x00,0x80,0x80,0xA0,
3361
3362 /* Source: 10TOM.ROM */
3363 /* Length: 640 / 0x00000280 */
3364
3365 0x77,0x27,0x87,0x01,0x2D,0x4F,0xC3,0xC1,0x92,0x91,0x89,0x59,0x83,0x1A,0x32,0xC2,
3366 0x95,0xB1,0x81,0x88,0x81,0x4A,0x3D,0x11,0x9E,0x0B,0x88,0x0C,0x18,0x3B,0x11,0x11,
3367 0x91,0x00,0xA0,0xE2,0x0A,0x48,0x13,0x24,0x81,0x48,0x1B,0x39,0x1C,0x83,0x84,0xA1,
3368 0xD1,0x8E,0x8A,0x0B,0xC0,0x98,0x92,0xB8,0x39,0x90,0x10,0x92,0xF0,0xB5,0x88,0x32,
3369 0x49,0x51,0x21,0x03,0x82,0x10,0x8A,0x7A,0x09,0x00,0xA2,0xCA,0x1B,0xCC,0x1C,0xB9,
3370 0x8E,0x89,0x89,0xA1,0x89,0x92,0x29,0x11,0x60,0x40,0x14,0x22,0x32,0x78,0x40,0x01,
3371 0x02,0x90,0x81,0xAB,0x0B,0x00,0xAF,0x99,0xCC,0xAB,0xDA,0xA9,0x99,0x1B,0x30,0x14,
3372 0x92,0x22,0x19,0x68,0x32,0x14,0x26,0x13,0x23,0x23,0x20,0x12,0x9A,0xA8,0xB9,0xFA,
3373 0xAA,0xCA,0xCC,0x0C,0xA8,0xAE,0x88,0xB9,0x88,0xA0,0x02,0x21,0x50,0x43,0x03,0x81,
3374 0x2A,0x11,0x34,0x63,0x24,0x33,0x22,0x38,0x8B,0xEA,0xAE,0x99,0xA0,0x90,0x82,0x00,
3375 0x89,0xBF,0x8A,0xE8,0xA9,0x90,0x01,0x12,0x13,0x12,0x08,0xA9,0xAA,0xC9,0x22,0x63,
3376 0x63,0x12,0x44,0x00,0x10,0x88,0x9C,0x98,0xA1,0x85,0x03,0x32,0x36,0x80,0x89,0xDB,
3377 0xDB,0xBB,0xB9,0xBA,0x01,0x81,0x28,0x19,0xCB,0xFA,0xBC,0x09,0x13,0x37,0x34,0x34,
3378 0x23,0x31,0x20,0x10,0x00,0x00,0x28,0x38,0x10,0x88,0xEC,0x8D,0xCB,0xBC,0xCC,0xBB,
3379 0xBB,0xC9,0x99,0x00,0x00,0x33,0x11,0x22,0x81,0x07,0x41,0x54,0x34,0x34,0x22,0x31,
3380 0x00,0x88,0x9A,0x9B,0x98,0xAB,0x8E,0x9B,0xBD,0x9C,0xBC,0xBB,0xDA,0xAA,0xA9,0x99,
3381 0x18,0x38,0x60,0x20,0x31,0x13,0x13,0x51,0x14,0x31,0x53,0x33,0x35,0x22,0x01,0x8A,
3382 0x9C,0xA9,0xCA,0xC9,0xA8,0x00,0x10,0x81,0x9C,0x9E,0xAB,0xCC,0xAB,0xBA,0x98,0x30,
3383 0x52,0x03,0x81,0x08,0x9C,0xAC,0xAC,0x18,0x11,0x03,0x51,0x61,0x41,0x31,0x31,0x02,
3384 0x01,0x20,0x24,0x43,0x44,0x40,0x30,0x10,0xBC,0xBE,0xCB,0xDB,0xAB,0xBA,0x99,0x98,
3385 0x99,0xAA,0xBD,0xAA,0xC8,0x90,0x11,0x53,0x37,0x23,0x43,0x34,0x33,0x33,0x33,0x11,
3386 0x28,0x00,0x19,0xA9,0x9A,0xCB,0xCE,0xBB,0xEB,0xBC,0xBB,0xCA,0xBA,0xA8,0x88,0x11,
3387 0x12,0x21,0x20,0x22,0x26,0x26,0x23,0x23,0x43,0x24,0x22,0x32,0x20,0x31,0x81,0x9A,
3388 0xBC,0xBC,0xCB,0xBD,0x9A,0xA9,0x90,0x98,0xBA,0xCC,0xCB,0xBC,0x8B,0x88,0x22,0x35,
3389 0x23,0x12,0x99,0x8B,0xAA,0xAA,0x89,0x82,0x93,0x31,0x42,0x23,0x23,0x21,0x32,0x11,
3390 0x20,0x13,0x13,0x24,0x24,0x24,0x22,0x11,0x8A,0x9E,0xAC,0xAC,0xAA,0xBA,0xAA,0xAB,
3391 0xBD,0xBC,0xCB,0xCB,0xA9,0xA8,0x91,0x12,0x44,0x43,0x44,0x34,0x34,0x42,0x33,0x42,
3392 0x21,0x11,0x11,0x88,0x80,0xAA,0x0B,0xAC,0xCB,0xEC,0xAC,0xBA,0xCA,0xAB,0x9A,0x99,
3393 0x80,0x91,0x09,0x08,0x10,0x22,0x44,0x43,0x44,0x33,0x43,0x22,0x13,0x21,0x22,0x20,
3394 0x09,0x88,0xB9,0xC8,0xBB,0xAB,0xAB,0xA9,0xA9,0x9B,0x9B,0x99,0x90,0x90,0x00,0x81,
3395 0x00,0x08,0x09,0x8A,0x9A,0xAA,0xA9,0xA9,0x99,0x90,0x80,0x01,0x80,0x00,0x09,0x31,
3396 0x32,0x44,0x33,0x43,0x34,0x33,0x24,0x22,0x23,0x12,0x10,0x09,0x9B,0xAB,0xCA,0xCC,
3397 0xBB,0xCB,0xDA,0xCA,0xAB,0xCA,0xAB,0xA9,0xA8,0x92,0x12,0x43,0x53,0x35,0x23,0x33,
3398 0x43,0x43,0x52,0x22,0x22,0x21,0x01,0x09,0x89,0xA9,0xBB,0xBD,0xBC,0xCB,0xDA,0xAB,
3399 0xAB,0xAB,0xAA,0xA9,0x99,0xA8,0x09,0x01,0x11,0x34,0x25,0x23,0x33,0x51,0x22,0x31,
3400 0x12,0x20,0x21,0x12,0x10,0x80,0x99,0x9A,0x99,0x99,0x88,0x08,0x00,0x88,0xA9,0x99,
3401 0x99,0x80,0x80,0x10,0x01,0x00,0x9A,0xAA,0xBB,0xBA,0xBA,0xA9,0x99,0x99,0x89,0x99,
3402 0x99,0x00,0x01,0x33,0x35,0x24,0x23,0x34,0x23,0x33,0x34,0x33,0x43,0x32,0x21,0x88,
3403 0xAB,0xBD,0xBB,0xDB,0xAB,0xBA,0xBB,0xDA,0xBB,0xCB,0xBB,0xBC,0xA8,0x90,0x01,0x12,
3404 0x23,0x43,0x53,0x34,0x34,0x39,0x80,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,
3405
3406 /* Source: 20RIM.ROM */
3407 /* Length: 128 / 0x00000080 */
3408
3409 0x0F,0xFF,0x73,0x8E,0x71,0xCD,0x00,0x49,0x10,0x90,0x21,0x49,0xA0,0xDB,0x02,0x3A,
3410 0xE3,0x0A,0x50,0x98,0xC0,0x59,0xA2,0x99,0x09,0x22,0xA2,0x80,0x10,0xA8,0x5B,0xD2,
3411 0x88,0x21,0x09,0x96,0xA8,0x10,0x0A,0xE0,0x08,0x48,0x19,0xAB,0x52,0xA8,0x92,0x0C,
3412 0x03,0x19,0xE2,0x0A,0x12,0xC2,0x81,0x1E,0x01,0xD0,0x48,0x88,0x98,0x01,0x49,0x91,
3413 0xAA,0x2C,0x25,0x89,0x88,0xB5,0x81,0xA2,0x9A,0x12,0x9E,0x38,0x3B,0x81,0x9B,0x59,
3414 0x01,0x93,0xCA,0x4A,0x21,0xA0,0x3D,0x0A,0x39,0x3D,0x12,0xA8,0x3F,0x18,0x01,0x92,
3415 0x1C,0x00,0xB2,0x48,0xB9,0x94,0xA3,0x19,0x4F,0x19,0xB2,0x32,0x90,0xBA,0x01,0xE6,
3416 0x91,0x80,0xC1,0xA4,0x2A,0x08,0xA1,0xB1,0x25,0xD2,0x88,0x99,0x21,0x80,0x88,0x80,
3417 };
3418
3419
3420
3421 /* flag enable control 0x110 */
YM2608IRQFlagWrite(FM_OPN * OPN,int n,int v)3422 INLINE void YM2608IRQFlagWrite(FM_OPN *OPN, int n, int v)
3423 {
3424 YM2608 *F2608 = &(FM2608[n]);
3425
3426 if( v & 0x80 )
3427 { /* Reset IRQ flag */
3428 FM_STATUS_RESET(&OPN->ST, 0xf7); /* don't touch BUFRDY flag otherwise we'd have to call ymdeltat module to set the flag back */
3429 }
3430 else
3431 { /* Set status flag mask */
3432 F2608->flagmask = (~(v&0x1f));
3433 FM_IRQMASK_SET(&OPN->ST, (F2608->irqmask & F2608->flagmask) );
3434 }
3435 }
3436
3437 /* compatible mode & IRQ enable control 0x29 */
YM2608IRQMaskWrite(FM_OPN * OPN,int n,int v)3438 INLINE void YM2608IRQMaskWrite(FM_OPN *OPN, int n, int v)
3439 {
3440 YM2608 *F2608 = &(FM2608[n]);
3441 /* SCH,xx,xxx,EN_ZERO,EN_BRDY,EN_EOS,EN_TB,EN_TA */
3442
3443 /* extend 3ch. enable/disable */
3444 if(v&0x80)
3445 OPN->type |= TYPE_6CH; /* OPNA mode - 6 FM channels */
3446 else
3447 OPN->type &= ~TYPE_6CH; /* OPN mode - 3 FM channels */
3448
3449 /* IRQ MASK store and set */
3450 F2608->irqmask = v&0x1f;
3451 FM_IRQMASK_SET(&OPN->ST, (F2608->irqmask & F2608->flagmask) );
3452 }
3453
3454 /* Generate samples for one of the YM2608s */
YM2608UpdateOne(int num,INT16 ** buffer,int length)3455 void YM2608UpdateOne(int num, INT16 **buffer, int length)
3456 {
3457 YM2608 *F2608 = &(FM2608[num]);
3458 FM_OPN *OPN = &(FM2608[num].OPN);
3459 YM_DELTAT *DELTAT = &(F2608[num].deltaT);
3460 int i,j;
3461 FMSAMPLE *bufL,*bufR;
3462
3463 /* set bufer */
3464 bufL = buffer[0];
3465 bufR = buffer[1];
3466
3467 if( (void *)F2608 != cur_chip ){
3468 cur_chip = (void *)F2608;
3469
3470 State = &OPN->ST;
3471 cch[0] = &F2608->CH[0];
3472 cch[1] = &F2608->CH[1];
3473 cch[2] = &F2608->CH[2];
3474 cch[3] = &F2608->CH[3];
3475 cch[4] = &F2608->CH[4];
3476 cch[5] = &F2608->CH[5];
3477 /* setup adpcm rom address */
3478 pcmbufA = F2608->pcmbuf;
3479 pcmsizeA = F2608->pcm_size;
3480
3481 }
3482
3483 /* refresh PG and EG */
3484 refresh_fc_eg_chan( OPN, cch[0] );
3485 refresh_fc_eg_chan( OPN, cch[1] );
3486 if( (State->mode & 0xc0) )
3487 {
3488 /* 3SLOT MODE */
3489 if( cch[2]->SLOT[SLOT1].Incr==-1)
3490 {
3491 refresh_fc_eg_slot(OPN, &cch[2]->SLOT[SLOT1] , OPN->SL3.fc[1] , OPN->SL3.kcode[1] );
3492 refresh_fc_eg_slot(OPN, &cch[2]->SLOT[SLOT2] , OPN->SL3.fc[2] , OPN->SL3.kcode[2] );
3493 refresh_fc_eg_slot(OPN, &cch[2]->SLOT[SLOT3] , OPN->SL3.fc[0] , OPN->SL3.kcode[0] );
3494 refresh_fc_eg_slot(OPN, &cch[2]->SLOT[SLOT4] , cch[2]->fc , cch[2]->kcode );
3495 }
3496 }else refresh_fc_eg_chan( OPN, cch[2] );
3497 refresh_fc_eg_chan( OPN, cch[3] );
3498 refresh_fc_eg_chan( OPN, cch[4] );
3499 refresh_fc_eg_chan( OPN, cch[5] );
3500
3501
3502 /* buffering */
3503 for(i=0; i < length ; i++)
3504 {
3505
3506 advance_lfo(OPN);
3507
3508 /* clear output acc. */
3509 out_adpcm[OUTD_LEFT] = out_adpcm[OUTD_RIGHT]= out_adpcm[OUTD_CENTER] = 0;
3510 out_delta[OUTD_LEFT] = out_delta[OUTD_RIGHT]= out_delta[OUTD_CENTER] = 0;
3511 /* clear outputs */
3512 out_fm[0] = 0;
3513 out_fm[1] = 0;
3514 out_fm[2] = 0;
3515 out_fm[3] = 0;
3516 out_fm[4] = 0;
3517 out_fm[5] = 0;
3518
3519 /* advance envelope generator */
3520 OPN->eg_timer += OPN->eg_timer_add;
3521 while (OPN->eg_timer >= OPN->eg_timer_overflow)
3522 {
3523 OPN->eg_timer -= OPN->eg_timer_overflow;
3524 OPN->eg_cnt++;
3525
3526 advance_eg_channel(OPN, &cch[0]->SLOT[SLOT1]);
3527 advance_eg_channel(OPN, &cch[1]->SLOT[SLOT1]);
3528 advance_eg_channel(OPN, &cch[2]->SLOT[SLOT1]);
3529 advance_eg_channel(OPN, &cch[3]->SLOT[SLOT1]);
3530 advance_eg_channel(OPN, &cch[4]->SLOT[SLOT1]);
3531 advance_eg_channel(OPN, &cch[5]->SLOT[SLOT1]);
3532 }
3533
3534 /* calculate FM */
3535 chan_calc(OPN, cch[0], 0 );
3536 chan_calc(OPN, cch[1], 1 );
3537 chan_calc(OPN, cch[2], 2 );
3538 chan_calc(OPN, cch[3], 3 );
3539 chan_calc(OPN, cch[4], 4 );
3540 chan_calc(OPN, cch[5], 5 );
3541
3542 /* deltaT ADPCM */
3543 if( DELTAT->portstate&0x80 )
3544 YM_DELTAT_ADPCM_CALC(DELTAT);
3545
3546 /* ADPCMA */
3547 for( j = 0; j < 6; j++ )
3548 {
3549 if( F2608->adpcm[j].flag )
3550 ADPCMA_calc_chan( F2608, &F2608->adpcm[j]);
3551 }
3552
3553 /* buffering */
3554 {
3555 int lt,rt;
3556
3557 lt = out_adpcm[OUTD_LEFT] + out_adpcm[OUTD_CENTER];
3558 rt = out_adpcm[OUTD_RIGHT] + out_adpcm[OUTD_CENTER];
3559 lt += (out_delta[OUTD_LEFT] + out_delta[OUTD_CENTER])>>9;
3560 rt += (out_delta[OUTD_RIGHT] + out_delta[OUTD_CENTER])>>9;
3561 lt += ((out_fm[0]>>1) & OPN->pan[0]); /* shift right verified on real YM2608 */
3562 rt += ((out_fm[0]>>1) & OPN->pan[1]);
3563 lt += ((out_fm[1]>>1) & OPN->pan[2]);
3564 rt += ((out_fm[1]>>1) & OPN->pan[3]);
3565 lt += ((out_fm[2]>>1) & OPN->pan[4]);
3566 rt += ((out_fm[2]>>1) & OPN->pan[5]);
3567 lt += ((out_fm[3]>>1) & OPN->pan[6]);
3568 rt += ((out_fm[3]>>1) & OPN->pan[7]);
3569 lt += ((out_fm[4]>>1) & OPN->pan[8]);
3570 rt += ((out_fm[4]>>1) & OPN->pan[9]);
3571 lt += ((out_fm[5]>>1) & OPN->pan[10]);
3572 rt += ((out_fm[5]>>1) & OPN->pan[11]);
3573
3574 lt >>= FINAL_SH;
3575 rt >>= FINAL_SH;
3576
3577 Limit( lt, MAXOUT, MINOUT );
3578 Limit( rt, MAXOUT, MINOUT );
3579 /* buffering */
3580 bufL[i] = lt;
3581 bufR[i] = rt;
3582
3583 #ifdef SAVE_SAMPLE
3584 SAVE_ALL_CHANNELS
3585 #endif
3586
3587 }
3588
3589 /* timer A control */
3590 INTERNAL_TIMER_A( State , cch[2] )
3591 }
3592 INTERNAL_TIMER_B(State,length)
3593
3594
3595 /* check IRQ for DELTA-T EOS */
3596 FM_STATUS_SET(State, 0);
3597
3598 }
3599 #ifdef _STATE_H
YM2608_postload(void)3600 static void YM2608_postload(void)
3601 {
3602 int num , r;
3603
3604 for(num=0;num<YM2608NumChips;num++)
3605 {
3606 YM2608 *F2608 = &(FM2608[num]);
3607 /* prescaler */
3608 OPNPrescaler_w(&F2608->OPN,1,2);
3609 F2608->deltaT.freqbase = F2608->OPN.ST.freqbase;
3610 /* IRQ mask / mode */
3611 YM2608IRQMaskWrite(&F2608->OPN, num, F2608->REGS[0x29]);
3612 /* SSG registers */
3613 for(r=0;r<16;r++)
3614 {
3615 SSGWrite(num,0,r);
3616 SSGWrite(num,1,F2608->REGS[r]);
3617 }
3618
3619 /* OPN registers */
3620 /* DT / MULTI , TL , KS / AR , AMON / DR , SR , SL / RR , SSG-EG */
3621 for(r=0x30;r<0x9e;r++)
3622 if((r&3) != 3)
3623 {
3624 OPNWriteReg(&F2608->OPN,r,F2608->REGS[r]);
3625 OPNWriteReg(&F2608->OPN,r|0x100,F2608->REGS[r|0x100]);
3626 }
3627 /* FB / CONNECT , L / R / AMS / PMS */
3628 for(r=0xb0;r<0xb6;r++)
3629 if((r&3) != 3)
3630 {
3631 OPNWriteReg(&F2608->OPN,r,F2608->REGS[r]);
3632 OPNWriteReg(&F2608->OPN,r|0x100,F2608->REGS[r|0x100]);
3633 }
3634 /* FM channels */
3635 /*FM_channel_postload(F2608->CH,6);*/
3636 /* rhythm(ADPCMA) */
3637 FM_ADPCMAWrite(F2608,1,F2608->REGS[0x111]);
3638 for( r=0x08 ; r<0x0c ; r++)
3639 FM_ADPCMAWrite(F2608,r,F2608->REGS[r+0x110]);
3640 /* Delta-T ADPCM unit */
3641 YM_DELTAT_postload(&F2608->deltaT , &F2608->REGS[0x100] );
3642 }
3643 cur_chip = NULL;
3644 }
3645
YM2608_save_state(void)3646 static void YM2608_save_state(void)
3647 {
3648 int num;
3649 const char statename[] = "YM2608";
3650
3651 for(num=0;num<YM2608NumChips;num++)
3652 {
3653 YM2608 *F2608 = &(FM2608[num]);
3654
3655 state_save_register_UINT8 (statename, num, "regs" , F2608->REGS , 512);
3656 FMsave_state_st(statename,num,&FM2608[num].OPN.ST);
3657 FMsave_state_channel(statename,num,FM2608[num].CH,6);
3658 /* 3slots */
3659 state_save_register_UINT32(statename, num, "slot3fc" , F2608->OPN.SL3.fc , 3);
3660 state_save_register_UINT8 (statename, num, "slot3fh" , &F2608->OPN.SL3.fn_h, 1);
3661 state_save_register_UINT8 (statename, num, "slot3kc" , F2608->OPN.SL3.kcode, 3);
3662 /* address register1 */
3663 state_save_register_UINT8 (statename, num, "addr_A1" , &F2608->addr_A1 ,1);
3664 /* rythm(ADPCMA) */
3665 FMsave_state_adpcma(statename,num,F2608->adpcm);
3666 /* Delta-T ADPCM unit */
3667 YM_DELTAT_savestate(statename,num,&FM2608[num].deltaT);
3668 }
3669 state_save_register_func_postload(YM2608_postload);
3670 }
3671 #endif /* _STATE_H */
3672
YM2608_deltat_status_set(UINT8 which,UINT8 changebits)3673 static void YM2608_deltat_status_set(UINT8 which, UINT8 changebits)
3674 {
3675 FM_STATUS_SET(&(FM2608[which].OPN.ST), changebits);
3676 }
YM2608_deltat_status_reset(UINT8 which,UINT8 changebits)3677 static void YM2608_deltat_status_reset(UINT8 which, UINT8 changebits)
3678 {
3679 FM_STATUS_RESET(&(FM2608[which].OPN.ST), changebits);
3680 }
3681 /* YM2608(OPNA) */
YM2608Init(int num,int clock,int rate,void ** pcmrom,int * pcmsize,FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler)3682 int YM2608Init(int num, int clock, int rate,
3683 void **pcmrom,int *pcmsize,
3684 FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler)
3685 {
3686 int i;
3687
3688 if (FM2608) return (-1); /* duplicate init. */
3689 cur_chip = NULL;
3690
3691 YM2608NumChips = num;
3692
3693 /* allocate extend state space */
3694 if( (FM2608 = (YM2608 *)malloc(sizeof(YM2608) * YM2608NumChips))==NULL)
3695 return (-1);
3696 /* clear */
3697 memset(FM2608,0,sizeof(YM2608) * YM2608NumChips);
3698 /* allocate total level table (128kb space) */
3699 if( !init_tables() )
3700 {
3701 if (FM2608) {
3702 free( FM2608 );
3703 FM2608 = NULL;
3704 }
3705 return (-1);
3706 }
3707
3708 for ( i = 0 ; i < YM2608NumChips; i++ ) {
3709 FM2608[i].OPN.ST.index = i;
3710 FM2608[i].OPN.type = TYPE_YM2608;
3711 FM2608[i].OPN.P_CH = FM2608[i].CH;
3712 FM2608[i].OPN.ST.clock = clock;
3713 FM2608[i].OPN.ST.rate = rate;
3714
3715 /* External handlers */
3716 FM2608[i].OPN.ST.Timer_Handler = TimerHandler;
3717 FM2608[i].OPN.ST.IRQ_Handler = IRQHandler;
3718
3719 /* DELTA-T */
3720 FM2608[i].deltaT.memory = (UINT8 *)(pcmrom[i]);
3721 FM2608[i].deltaT.memory_size = pcmsize[i];
3722
3723 /*FM2608[i].deltaT.write_time = 20.0 / clock;*/ /* a single byte write takes 20 cycles of main clock */
3724 /*FM2608[i].deltaT.read_time = 18.0 / clock;*/ /* a single byte read takes 18 cycles of main clock */
3725
3726 FM2608[i].deltaT.status_set_handler = YM2608_deltat_status_set;
3727 FM2608[i].deltaT.status_reset_handler = YM2608_deltat_status_reset;
3728 FM2608[i].deltaT.status_change_which_chip = i;
3729 FM2608[i].deltaT.status_change_EOS_bit = 0x04; /* status flag: set bit2 on End Of Sample */
3730 FM2608[i].deltaT.status_change_BRDY_bit = 0x08; /* status flag: set bit3 on BRDY */
3731 FM2608[i].deltaT.status_change_ZERO_bit = 0x10; /* status flag: set bit4 if silence continues for more than 290 miliseconds while recording the ADPCM */
3732
3733 /* ADPCM Rhythm */
3734 FM2608[i].pcmbuf = YM2608_ADPCM_ROM;
3735 FM2608[i].pcm_size = 0x2000;
3736
3737 YM2608ResetChip(i);
3738 }
3739
3740 Init_ADPCMATable();
3741
3742 #ifdef _STATE_H
3743 YM2608_save_state();
3744 #endif
3745 return 0;
3746 }
3747
3748 /* shut down emulator */
YM2608Shutdown()3749 void YM2608Shutdown()
3750 {
3751 if (!FM2608) return;
3752
3753 FMCloseTable();
3754 if (FM2608) {
3755 free(FM2608);
3756 FM2608 = NULL;
3757 }
3758 }
3759
3760 /* reset one of chips */
YM2608ResetChip(int num)3761 void YM2608ResetChip(int num)
3762 {
3763 int i;
3764 YM2608 *F2608 = &(FM2608[num]);
3765 FM_OPN *OPN = &(FM2608[num].OPN);
3766 YM_DELTAT *DELTAT = &(F2608[num].deltaT);
3767
3768 /* Reset Prescaler */
3769 OPNPrescaler_w(OPN , 0 , 2);
3770 F2608->deltaT.freqbase = OPN->ST.freqbase;
3771 /* reset SSG section */
3772 SSGReset(OPN->ST.index);
3773
3774 /* status clear */
3775 FM_BUSY_CLEAR(&OPN->ST);
3776
3777 /* register 0x29 - default value after reset is:
3778 enable only 3 FM channels and enable all the status flags */
3779 YM2608IRQMaskWrite(OPN, num, 0x1f ); /* default value for D4-D0 is 1 */
3780
3781 /* register 0x10, A1=1 - default value is 1 for D4, D3, D2, 0 for the rest */
3782 YM2608IRQFlagWrite(OPN, num, 0x1c ); /* default: enable timer A and B, disable EOS, BRDY and ZERO */
3783
3784 OPNWriteMode(OPN,0x27,0x30); /* mode 0 , timer reset */
3785
3786 OPN->eg_timer = 0;
3787 OPN->eg_cnt = 0;
3788
3789 FM_STATUS_RESET(&OPN->ST, 0xff);
3790
3791 reset_channels( &OPN->ST , F2608->CH , 6 );
3792 /* reset OPerator paramater */
3793 for(i = 0xb6 ; i >= 0xb4 ; i-- )
3794 {
3795 OPNWriteReg(OPN,i ,0xc0);
3796 OPNWriteReg(OPN,i|0x100,0xc0);
3797 }
3798 for(i = 0xb2 ; i >= 0x30 ; i-- )
3799 {
3800 OPNWriteReg(OPN,i ,0);
3801 OPNWriteReg(OPN,i|0x100,0);
3802 }
3803 for(i = 0x26 ; i >= 0x20 ; i-- ) OPNWriteReg(OPN,i,0);
3804
3805 /* ADPCM - percussion sounds */
3806 for( i = 0; i < 6; i++ )
3807 {
3808 if (i<=3) /* channels 0,1,2,3 */
3809 F2608->adpcm[i].step = (UINT32)((float)(1<<ADPCM_SHIFT)*((float)F2608->OPN.ST.freqbase)/3.0);
3810 else /* channels 4 and 5 work with slower clock */
3811 F2608->adpcm[i].step = (UINT32)((float)(1<<ADPCM_SHIFT)*((float)F2608->OPN.ST.freqbase)/6.0);
3812
3813 F2608->adpcm[i].start = YM2608_ADPCM_ROM_addr[i*2];
3814 F2608->adpcm[i].end = YM2608_ADPCM_ROM_addr[i*2+1];
3815
3816 F2608->adpcm[i].now_addr = 0;
3817 F2608->adpcm[i].now_step = 0;
3818 /* F2608->adpcm[i].delta = 21866; */
3819 F2608->adpcm[i].vol_mul = 0;
3820 F2608->adpcm[i].pan = &out_adpcm[OUTD_CENTER]; /* default center */
3821 F2608->adpcm[i].flagMask = 0;
3822 F2608->adpcm[i].flag = 0;
3823 F2608->adpcm[i].adpcm_acc = 0;
3824 F2608->adpcm[i].adpcm_step= 0;
3825 F2608->adpcm[i].adpcm_out = 0;
3826 }
3827 F2608->adpcmTL = 0x3f;
3828
3829 F2608->adpcm_arrivedEndAddress = 0; /* not used */
3830
3831 /* DELTA-T unit */
3832 DELTAT->freqbase = OPN->ST.freqbase;
3833 DELTAT->output_pointer = out_delta;
3834 DELTAT->portshift = 5; /* always 5bits shift */ /* ASG */
3835 DELTAT->output_range = 1<<23;
3836 YM_DELTAT_ADPCM_Reset(DELTAT,OUTD_CENTER,YM_DELTAT_EMULATION_MODE_NORMAL);
3837 }
3838
3839 /* YM2608 write */
3840 /* n = number */
3841 /* a = address */
3842 /* v = value */
YM2608Write(int n,int a,UINT8 v)3843 int YM2608Write(int n, int a,UINT8 v)
3844 {
3845 YM2608 *F2608 = &(FM2608[n]);
3846 FM_OPN *OPN = &(FM2608[n].OPN);
3847 int addr;
3848
3849 v &= 0xff; /*adjust to 8 bit bus */
3850
3851
3852 switch(a&3)
3853 {
3854 case 0: /* address port 0 */
3855 OPN->ST.address = v;
3856 F2608->addr_A1 = 0;
3857
3858 /* Write register to SSG emulator */
3859 if( v < 16 ) SSGWrite(n,0,v);
3860 /* prescaler selecter : 2d,2e,2f */
3861 if( v >= 0x2d && v <= 0x2f )
3862 {
3863 OPNPrescaler_w(OPN , v , 2);
3864 F2608->deltaT.freqbase = OPN->ST.freqbase;
3865 }
3866 break;
3867
3868 case 1: /* data port 0 */
3869 if (F2608->addr_A1 != 0)
3870 break; /* verified on real YM2608 */
3871
3872 addr = OPN->ST.address;
3873 #ifdef _STATE_H
3874 F2608->REGS[addr] = v;
3875 #endif
3876 switch(addr & 0xf0)
3877 {
3878 case 0x00: /* SSG section */
3879 /* Write data to SSG emulator */
3880 SSGWrite(n,a,v);
3881 break;
3882 case 0x10: /* 0x10-0x1f : Rhythm section */
3883 YM2608UpdateReq(n);
3884 FM_ADPCMAWrite(F2608,addr-0x10,v);
3885 break;
3886 case 0x20: /* Mode Register */
3887 switch(addr)
3888 {
3889 case 0x29: /* SCH,xx,xxx,EN_ZERO,EN_BRDY,EN_EOS,EN_TB,EN_TA */
3890 YM2608IRQMaskWrite(OPN, n, v);
3891 break;
3892 default:
3893 YM2608UpdateReq(n);
3894 OPNWriteMode(OPN,addr,v);
3895 }
3896 break;
3897 default: /* OPN section */
3898 YM2608UpdateReq(n);
3899 OPNWriteReg(OPN,addr,v);
3900 }
3901 break;
3902
3903 case 2: /* address port 1 */
3904 OPN->ST.address = v;
3905 F2608->addr_A1 = 1;
3906 break;
3907
3908 case 3: /* data port 1 */
3909 if (F2608->addr_A1 != 1)
3910 break; /* verified on real YM2608 */
3911
3912 addr = OPN->ST.address;
3913 #ifdef _STATE_H
3914 F2608->REGS[addr | 0x100] = v;
3915 #endif
3916 YM2608UpdateReq(n);
3917 switch( addr & 0xf0 )
3918 {
3919 case 0x00: /* DELTAT PORT */
3920 switch( addr )
3921 {
3922 case 0x0e: /* DAC data */
3923 logerror("YM2608: write to DAC data (unimplemented) value=%02x\n",v);
3924 break;
3925 default:
3926 /* 0x00-0x0d */
3927 YM_DELTAT_ADPCM_Write(&F2608->deltaT,addr,v);
3928 }
3929 break;
3930 case 0x10: /* IRQ Flag control */
3931 if( addr == 0x10 )
3932 {
3933 YM2608IRQFlagWrite(OPN, n, v);
3934 }
3935 break;
3936 default:
3937 OPNWriteReg(OPN,addr | 0x100,v);
3938 }
3939 }
3940 return OPN->ST.irq;
3941 }
3942
YM2608Read(int n,int a)3943 UINT8 YM2608Read(int n,int a)
3944 {
3945 YM2608 *F2608 = &(FM2608[n]);
3946 int addr = F2608->OPN.ST.address;
3947 UINT8 ret = 0;
3948
3949 switch( a&3 ){
3950 case 0: /* status 0 : YM2203 compatible */
3951 /* BUSY:x:x:x:x:x:FLAGB:FLAGA */
3952 ret = FM_STATUS_FLAG(&F2608->OPN.ST) & 0x83;
3953 break;
3954
3955 case 1: /* status 0, ID */
3956 if( addr < 16 ) ret = SSGRead(n);
3957 else if(addr == 0xff) ret = 0x01; /* ID code */
3958 break;
3959
3960 case 2: /* status 1 : status 0 + ADPCM status */
3961 /* BUSY : x : PCMBUSY : ZERO : BRDY : EOS : FLAGB : FLAGA */
3962 ret = (FM_STATUS_FLAG(&F2608->OPN.ST) & (F2608->flagmask|0x80)) | ((F2608->deltaT.PCM_BSY & 1)<<5) ;
3963 break;
3964
3965 case 3:
3966 if(addr == 0x08)
3967 {
3968 ret = YM_DELTAT_ADPCM_Read(&F2608->deltaT);
3969 }
3970 else
3971 {
3972 if(addr == 0x0f)
3973 {
3974 logerror("YM2608 A/D convertion is accessed but not implemented !\n");
3975 ret = 0x80; /* 2's complement PCM data - result from A/D convertion */
3976 }
3977 }
3978 break;
3979 }
3980 return ret;
3981 }
3982
YM2608TimerOver(int n,int c)3983 int YM2608TimerOver(int n,int c)
3984 {
3985 YM2608 *F2608 = &(FM2608[n]);
3986
3987 switch(c)
3988 {
3989 #if 0
3990 case 2:
3991 { /* BUFRDY flag */
3992 YM_DELTAT_BRDY_callback( &F2608->deltaT );
3993 }
3994 break;
3995 #endif
3996 case 1:
3997 { /* Timer B */
3998 TimerBOver( &(F2608->OPN.ST) );
3999 }
4000 break;
4001 case 0:
4002 { /* Timer A */
4003 YM2608UpdateReq(n);
4004 /* timer update */
4005 TimerAOver( &(F2608->OPN.ST) );
4006 /* CSM mode key,TL controll */
4007 if( F2608->OPN.ST.mode & 0x80 )
4008 { /* CSM mode total level latch and auto key on */
4009 CSMKeyControll( F2608->OPN.type, &(F2608->CH[2]) );
4010 }
4011 }
4012 break;
4013 default:
4014 break;
4015 }
4016
4017 return FM2608->OPN.ST.irq;
4018 }
4019
4020 #endif /* BUILD_YM2608 */
4021
4022
4023
4024 #if (BUILD_YM2610||BUILD_YM2610B)
4025 /* YM2610(OPNB) */
4026 static YM2610 *FM2610=NULL; /* array of YM2610's */
4027 static int YM2610NumChips;
4028
4029 /* Generate samples for one of the YM2610s */
YM2610UpdateOne(int num,INT16 ** buffer,int length)4030 void YM2610UpdateOne(int num, INT16 **buffer, int length)
4031 {
4032 YM2610 *F2610 = &(FM2610[num]);
4033 FM_OPN *OPN = &(FM2610[num].OPN);
4034 YM_DELTAT *DELTAT = &(F2610[num].deltaT);
4035 int i,j;
4036 FMSAMPLE *bufL,*bufR;
4037
4038 /* buffer setup */
4039 bufL = buffer[0];
4040 bufR = buffer[1];
4041
4042 if( (void *)F2610 != cur_chip ){
4043 cur_chip = (void *)F2610;
4044 State = &OPN->ST;
4045 cch[0] = &F2610->CH[1];
4046 cch[1] = &F2610->CH[2];
4047 cch[2] = &F2610->CH[4];
4048 cch[3] = &F2610->CH[5];
4049 /* setup adpcm rom address */
4050 pcmbufA = F2610->pcmbuf;
4051 pcmsizeA = F2610->pcm_size;
4052
4053 }
4054 #ifdef YM2610B_WARNING
4055 #define FM_KEY_IS(SLOT) ((SLOT)->key)
4056 #define FM_MSG_YM2610B "YM2610-%d.CH%d is playing,Check whether the type of the chip is YM2610B\n"
4057 /* Check YM2610B warning message */
4058 if( FM_KEY_IS(&F2610->CH[0].SLOT[3]) )
4059 LOG(LOG_WAR,(FM_MSG_YM2610B,num,0));
4060 if( FM_KEY_IS(&F2610->CH[3].SLOT[3]) )
4061 LOG(LOG_WAR,(FM_MSG_YM2610B,num,3));
4062 #endif
4063
4064 /* refresh PG and EG */
4065 refresh_fc_eg_chan( OPN, cch[0] );
4066 if( (State->mode & 0xc0) )
4067 {
4068 /* 3SLOT MODE */
4069 if( cch[1]->SLOT[SLOT1].Incr==-1)
4070 {
4071 refresh_fc_eg_slot(OPN, &cch[1]->SLOT[SLOT1] , OPN->SL3.fc[1] , OPN->SL3.kcode[1] );
4072 refresh_fc_eg_slot(OPN, &cch[1]->SLOT[SLOT2] , OPN->SL3.fc[2] , OPN->SL3.kcode[2] );
4073 refresh_fc_eg_slot(OPN, &cch[1]->SLOT[SLOT3] , OPN->SL3.fc[0] , OPN->SL3.kcode[0] );
4074 refresh_fc_eg_slot(OPN, &cch[1]->SLOT[SLOT4] , cch[1]->fc , cch[1]->kcode );
4075 }
4076 }else refresh_fc_eg_chan( OPN, cch[1] );
4077 refresh_fc_eg_chan( OPN, cch[2] );
4078 refresh_fc_eg_chan( OPN, cch[3] );
4079
4080 /* buffering */
4081 for(i=0; i < length ; i++)
4082 {
4083
4084 advance_lfo(OPN);
4085
4086 /* clear output acc. */
4087 out_adpcm[OUTD_LEFT] = out_adpcm[OUTD_RIGHT]= out_adpcm[OUTD_CENTER] = 0;
4088 out_delta[OUTD_LEFT] = out_delta[OUTD_RIGHT]= out_delta[OUTD_CENTER] = 0;
4089 /* clear outputs */
4090 out_fm[1] = 0;
4091 out_fm[2] = 0;
4092 out_fm[4] = 0;
4093 out_fm[5] = 0;
4094
4095 /* advance envelope generator */
4096 OPN->eg_timer += OPN->eg_timer_add;
4097 while (OPN->eg_timer >= OPN->eg_timer_overflow)
4098 {
4099 OPN->eg_timer -= OPN->eg_timer_overflow;
4100 OPN->eg_cnt++;
4101
4102 advance_eg_channel(OPN, &cch[0]->SLOT[SLOT1]);
4103 advance_eg_channel(OPN, &cch[1]->SLOT[SLOT1]);
4104 advance_eg_channel(OPN, &cch[2]->SLOT[SLOT1]);
4105 advance_eg_channel(OPN, &cch[3]->SLOT[SLOT1]);
4106 }
4107
4108 /* calculate FM */
4109 chan_calc(OPN, cch[0], 1 ); /*remapped to 1*/
4110 chan_calc(OPN, cch[1], 2 ); /*remapped to 2*/
4111 chan_calc(OPN, cch[2], 4 ); /*remapped to 4*/
4112 chan_calc(OPN, cch[3], 5 ); /*remapped to 5*/
4113
4114 /* deltaT ADPCM */
4115 if( DELTAT->portstate&0x80 )
4116 YM_DELTAT_ADPCM_CALC(DELTAT);
4117
4118 /* ADPCMA */
4119 for( j = 0; j < 6; j++ )
4120 {
4121 if( F2610->adpcm[j].flag )
4122 ADPCMA_calc_chan( F2610, &F2610->adpcm[j]);
4123 }
4124
4125 /* buffering */
4126 {
4127 int lt,rt;
4128
4129 lt = out_adpcm[OUTD_LEFT] + out_adpcm[OUTD_CENTER];
4130 rt = out_adpcm[OUTD_RIGHT] + out_adpcm[OUTD_CENTER];
4131 lt += (out_delta[OUTD_LEFT] + out_delta[OUTD_CENTER])>>9;
4132 rt += (out_delta[OUTD_RIGHT] + out_delta[OUTD_CENTER])>>9;
4133
4134
4135 lt += ((out_fm[1]>>1) & OPN->pan[2]); /* the shift right was verified on real chip */
4136 rt += ((out_fm[1]>>1) & OPN->pan[3]);
4137 lt += ((out_fm[2]>>1) & OPN->pan[4]);
4138 rt += ((out_fm[2]>>1) & OPN->pan[5]);
4139
4140 lt += ((out_fm[4]>>1) & OPN->pan[8]);
4141 rt += ((out_fm[4]>>1) & OPN->pan[9]);
4142 lt += ((out_fm[5]>>1) & OPN->pan[10]);
4143 rt += ((out_fm[5]>>1) & OPN->pan[11]);
4144
4145
4146 lt >>= FINAL_SH;
4147 rt >>= FINAL_SH;
4148
4149 Limit( lt, MAXOUT, MINOUT );
4150 Limit( rt, MAXOUT, MINOUT );
4151
4152 #ifdef SAVE_SAMPLE
4153 SAVE_ALL_CHANNELS
4154 #endif
4155
4156 /* buffering */
4157 bufL[i] = lt;
4158 bufR[i] = rt;
4159 }
4160
4161 /* timer A control */
4162 INTERNAL_TIMER_A( State , cch[1] )
4163 }
4164 INTERNAL_TIMER_B(State,length)
4165
4166 }
4167
4168 #if BUILD_YM2610B
4169 /* Generate samples for one of the YM2610Bs */
YM2610BUpdateOne(int num,INT16 ** buffer,int length)4170 void YM2610BUpdateOne(int num, INT16 **buffer, int length)
4171 {
4172 YM2610 *F2610 = &(FM2610[num]);
4173 FM_OPN *OPN = &(FM2610[num].OPN);
4174 YM_DELTAT *DELTAT = &(FM2610[num].deltaT);
4175 int i,j;
4176 FMSAMPLE *bufL,*bufR;
4177
4178 /* buffer setup */
4179 bufL = buffer[0];
4180 bufR = buffer[1];
4181
4182 if( (void *)F2610 != cur_chip ){
4183 cur_chip = (void *)F2610;
4184 State = &OPN->ST;
4185 cch[0] = &F2610->CH[0];
4186 cch[1] = &F2610->CH[1];
4187 cch[2] = &F2610->CH[2];
4188 cch[3] = &F2610->CH[3];
4189 cch[4] = &F2610->CH[4];
4190 cch[5] = &F2610->CH[5];
4191 /* setup adpcm rom address */
4192 pcmbufA = F2610->pcmbuf;
4193 pcmsizeA = F2610->pcm_size;
4194
4195 }
4196
4197 /* refresh PG and EG */
4198 refresh_fc_eg_chan( OPN, cch[0] );
4199 refresh_fc_eg_chan( OPN, cch[1] );
4200 if( (State->mode & 0xc0) )
4201 {
4202 /* 3SLOT MODE */
4203 if( cch[2]->SLOT[SLOT1].Incr==-1)
4204 {
4205 refresh_fc_eg_slot(OPN, &cch[2]->SLOT[SLOT1] , OPN->SL3.fc[1] , OPN->SL3.kcode[1] );
4206 refresh_fc_eg_slot(OPN, &cch[2]->SLOT[SLOT2] , OPN->SL3.fc[2] , OPN->SL3.kcode[2] );
4207 refresh_fc_eg_slot(OPN, &cch[2]->SLOT[SLOT3] , OPN->SL3.fc[0] , OPN->SL3.kcode[0] );
4208 refresh_fc_eg_slot(OPN, &cch[2]->SLOT[SLOT4] , cch[2]->fc , cch[2]->kcode );
4209 }
4210 }else refresh_fc_eg_chan( OPN, cch[2] );
4211 refresh_fc_eg_chan( OPN, cch[3] );
4212 refresh_fc_eg_chan( OPN, cch[4] );
4213 refresh_fc_eg_chan( OPN, cch[5] );
4214
4215 /* buffering */
4216 for(i=0; i < length ; i++)
4217 {
4218
4219 advance_lfo(OPN);
4220
4221 /* clear output acc. */
4222 out_adpcm[OUTD_LEFT] = out_adpcm[OUTD_RIGHT]= out_adpcm[OUTD_CENTER] = 0;
4223 out_delta[OUTD_LEFT] = out_delta[OUTD_RIGHT]= out_delta[OUTD_CENTER] = 0;
4224 /* clear outputs */
4225 out_fm[0] = 0;
4226 out_fm[1] = 0;
4227 out_fm[2] = 0;
4228 out_fm[3] = 0;
4229 out_fm[4] = 0;
4230 out_fm[5] = 0;
4231
4232 /* advance envelope generator */
4233 OPN->eg_timer += OPN->eg_timer_add;
4234 while (OPN->eg_timer >= OPN->eg_timer_overflow)
4235 {
4236 OPN->eg_timer -= OPN->eg_timer_overflow;
4237 OPN->eg_cnt++;
4238
4239 advance_eg_channel(OPN, &cch[0]->SLOT[SLOT1]);
4240 advance_eg_channel(OPN, &cch[1]->SLOT[SLOT1]);
4241 advance_eg_channel(OPN, &cch[2]->SLOT[SLOT1]);
4242 advance_eg_channel(OPN, &cch[3]->SLOT[SLOT1]);
4243 advance_eg_channel(OPN, &cch[4]->SLOT[SLOT1]);
4244 advance_eg_channel(OPN, &cch[5]->SLOT[SLOT1]);
4245 }
4246
4247 /* calculate FM */
4248 chan_calc(OPN, cch[0], 0 );
4249 chan_calc(OPN, cch[1], 1 );
4250 chan_calc(OPN, cch[2], 2 );
4251 chan_calc(OPN, cch[3], 3 );
4252 chan_calc(OPN, cch[4], 4 );
4253 chan_calc(OPN, cch[5], 5 );
4254
4255 /* deltaT ADPCM */
4256 if( DELTAT->portstate&0x80 )
4257 YM_DELTAT_ADPCM_CALC(DELTAT);
4258
4259 /* ADPCMA */
4260 for( j = 0; j < 6; j++ )
4261 {
4262 if( F2610->adpcm[j].flag )
4263 ADPCMA_calc_chan( F2610, &F2610->adpcm[j]);
4264 }
4265
4266 /* buffering */
4267 {
4268 int lt,rt;
4269
4270 lt = out_adpcm[OUTD_LEFT] + out_adpcm[OUTD_CENTER];
4271 rt = out_adpcm[OUTD_RIGHT] + out_adpcm[OUTD_CENTER];
4272 lt += (out_delta[OUTD_LEFT] + out_delta[OUTD_CENTER])>>9;
4273 rt += (out_delta[OUTD_RIGHT] + out_delta[OUTD_CENTER])>>9;
4274
4275 lt += ((out_fm[0]>>1) & OPN->pan[0]); /* the shift right is verified on YM2610 */
4276 rt += ((out_fm[0]>>1) & OPN->pan[1]);
4277 lt += ((out_fm[1]>>1) & OPN->pan[2]);
4278 rt += ((out_fm[1]>>1) & OPN->pan[3]);
4279 lt += ((out_fm[2]>>1) & OPN->pan[4]);
4280 rt += ((out_fm[2]>>1) & OPN->pan[5]);
4281 lt += ((out_fm[3]>>1) & OPN->pan[6]);
4282 rt += ((out_fm[3]>>1) & OPN->pan[7]);
4283 lt += ((out_fm[4]>>1) & OPN->pan[8]);
4284 rt += ((out_fm[4]>>1) & OPN->pan[9]);
4285 lt += ((out_fm[5]>>1) & OPN->pan[10]);
4286 rt += ((out_fm[5]>>1) & OPN->pan[11]);
4287
4288
4289 lt >>= FINAL_SH;
4290 rt >>= FINAL_SH;
4291
4292 Limit( lt, MAXOUT, MINOUT );
4293 Limit( rt, MAXOUT, MINOUT );
4294
4295 #ifdef SAVE_SAMPLE
4296 SAVE_ALL_CHANNELS
4297 #endif
4298
4299 /* buffering */
4300 bufL[i] = lt;
4301 bufR[i] = rt;
4302 }
4303
4304 /* timer A control */
4305 INTERNAL_TIMER_A( State , cch[2] )
4306 }
4307 INTERNAL_TIMER_B(State,length)
4308
4309 }
4310 #endif /* BUILD_YM2610B */
4311
4312
4313 #ifdef _STATE_H
YM2610_postload(void)4314 static void YM2610_postload(void)
4315 {
4316 int num , r;
4317
4318 for(num=0;num<YM2610NumChips;num++)
4319 {
4320 YM2610 *F2610 = &(FM2610[num]);
4321 /* SSG registers */
4322 for(r=0;r<16;r++)
4323 {
4324 SSGWrite(num,0,r);
4325 SSGWrite(num,1,F2610->REGS[r]);
4326 }
4327
4328 /* OPN registers */
4329 /* DT / MULTI , TL , KS / AR , AMON / DR , SR , SL / RR , SSG-EG */
4330 for(r=0x30;r<0x9e;r++)
4331 if((r&3) != 3)
4332 {
4333 OPNWriteReg(&F2610->OPN,r,F2610->REGS[r]);
4334 OPNWriteReg(&F2610->OPN,r|0x100,F2610->REGS[r|0x100]);
4335 }
4336 /* FB / CONNECT , L / R / AMS / PMS */
4337 for(r=0xb0;r<0xb6;r++)
4338 if((r&3) != 3)
4339 {
4340 OPNWriteReg(&F2610->OPN,r,F2610->REGS[r]);
4341 OPNWriteReg(&F2610->OPN,r|0x100,F2610->REGS[r|0x100]);
4342 }
4343 /* FM channels */
4344 /*FM_channel_postload(F2610->CH,6);*/
4345
4346 /* rhythm(ADPCMA) */
4347 FM_ADPCMAWrite(F2610,1,F2610->REGS[0x101]);
4348 for( r=0 ; r<6 ; r++)
4349 {
4350 FM_ADPCMAWrite(F2610,r+0x08,F2610->REGS[r+0x108]);
4351 FM_ADPCMAWrite(F2610,r+0x10,F2610->REGS[r+0x110]);
4352 FM_ADPCMAWrite(F2610,r+0x18,F2610->REGS[r+0x118]);
4353 FM_ADPCMAWrite(F2610,r+0x20,F2610->REGS[r+0x120]);
4354 FM_ADPCMAWrite(F2610,r+0x28,F2610->REGS[r+0x128]);
4355 }
4356 /* Delta-T ADPCM unit */
4357 YM_DELTAT_postload(&F2610->deltaT , &F2610->REGS[0x010] );
4358 }
4359 cur_chip = NULL;
4360 }
4361
YM2610_save_state(void)4362 static void YM2610_save_state(void)
4363 {
4364 int num;
4365 const char statename[] = "YM2610";
4366
4367 for(num=0;num<YM2610NumChips;num++)
4368 {
4369 YM2610 *F2610 = &(FM2610[num]);
4370
4371 state_save_register_UINT8 (statename, num, "regs" , F2610->REGS , 512);
4372 FMsave_state_st(statename,num,&FM2610[num].OPN.ST);
4373 FMsave_state_channel(statename,num,FM2610[num].CH,6);
4374 /* 3slots */
4375 state_save_register_UINT32(statename, num, "slot3fc" , F2610->OPN.SL3.fc , 3);
4376 state_save_register_UINT8 (statename, num, "slot3fh" , &F2610->OPN.SL3.fn_h, 1);
4377 state_save_register_UINT8 (statename, num, "slot3kc" , F2610->OPN.SL3.kcode, 3);
4378 /* address register1 */
4379 state_save_register_UINT8 (statename, num, "addr_A1" , &F2610->addr_A1, 1);
4380
4381 state_save_register_UINT8 (statename, num, "arrivedFlag", &F2610->adpcm_arrivedEndAddress , 1);
4382 /* rythm(ADPCMA) */
4383 FMsave_state_adpcma(statename,num,F2610->adpcm);
4384 /* Delta-T ADPCM unit */
4385 YM_DELTAT_savestate(statename,num,&FM2610[num].deltaT);
4386 }
4387 state_save_register_func_postload(YM2610_postload);
4388 }
4389 #endif /* _STATE_H */
4390
YM2610_deltat_status_set(UINT8 which,UINT8 changebits)4391 static void YM2610_deltat_status_set(UINT8 which, UINT8 changebits)
4392 {
4393 FM2610[which].adpcm_arrivedEndAddress |= changebits;
4394 }
YM2610_deltat_status_reset(UINT8 which,UINT8 changebits)4395 static void YM2610_deltat_status_reset(UINT8 which, UINT8 changebits)
4396 {
4397 FM2610[which].adpcm_arrivedEndAddress &= (~changebits);
4398 }
4399
YM2610Init(int num,int clock,int rate,void ** pcmroma,int * pcmsizea,void ** pcmromb,int * pcmsizeb,FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler)4400 int YM2610Init(int num, int clock, int rate,
4401 void **pcmroma,int *pcmsizea,void **pcmromb,int *pcmsizeb,
4402 FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler)
4403
4404 {
4405 int i;
4406
4407 if (FM2610) return (-1); /* duplicate init. */
4408 cur_chip = NULL; /* hiro-shi!! */
4409
4410 YM2610NumChips = num;
4411
4412 /* allocate extend state space */
4413 if( (FM2610 = (YM2610 *)malloc(sizeof(YM2610) * YM2610NumChips))==NULL)
4414 return (-1);
4415 /* clear */
4416 memset(FM2610,0,sizeof(YM2610) * YM2610NumChips);
4417 /* allocate total level table (128kb space) */
4418 if( !init_tables() )
4419 {
4420 if (FM2610) {
4421 free( FM2610 );
4422 FM2610 = NULL;
4423 }
4424 return (-1);
4425 }
4426
4427 for ( i = 0 ; i < YM2610NumChips; i++ ) {
4428 YM2610 *F2610 = &(FM2610[i]);
4429 /* FM */
4430 F2610->OPN.ST.index = i;
4431 F2610->OPN.type = TYPE_YM2610;
4432 F2610->OPN.P_CH = FM2610[i].CH;
4433 F2610->OPN.ST.clock = clock;
4434 F2610->OPN.ST.rate = rate;
4435 /* Extend handler */
4436 F2610->OPN.ST.Timer_Handler = TimerHandler;
4437 F2610->OPN.ST.IRQ_Handler = IRQHandler;
4438 /* ADPCM */
4439 F2610->pcmbuf = (UINT8 *)(pcmroma[i]);
4440 F2610->pcm_size = pcmsizea[i];
4441 /* DELTA-T */
4442 F2610->deltaT.memory = (UINT8 *)(pcmromb[i]);
4443 F2610->deltaT.memory_size = pcmsizeb[i];
4444
4445 FM2610[i].deltaT.status_set_handler = YM2610_deltat_status_set;
4446 FM2610[i].deltaT.status_reset_handler = YM2610_deltat_status_reset;
4447 FM2610[i].deltaT.status_change_which_chip = i;
4448 FM2610[i].deltaT.status_change_EOS_bit = 0x80; /* status flag: set bit7 on End Of Sample */
4449
4450 YM2610ResetChip(i);
4451 }
4452 Init_ADPCMATable();
4453 #ifdef _STATE_H
4454 YM2610_save_state();
4455 #endif
4456 return 0;
4457 }
4458
4459 /* remap sample memory of chip */
YM2610SetRom(int num,void * pcmroma,int pcmsizea,void * pcmromb,int pcmsizeb)4460 void YM2610SetRom(int num, void *pcmroma,int pcmsizea,void *pcmromb,int pcmsizeb)
4461 {
4462 YM2610 *F2610 = &(FM2610[num]);
4463
4464 /* ADPCM */
4465 F2610->pcmbuf = (UINT8 *)pcmroma;
4466 F2610->pcm_size = pcmsizea;
4467 /* DELTA-T */
4468 F2610->deltaT.memory = (UINT8 *)pcmromb;
4469 F2610->deltaT.memory_size = pcmsizeb;
4470
4471 if( (void *)F2610 == cur_chip ){
4472 pcmbufA = F2610->pcmbuf;
4473 pcmsizeA = F2610->pcm_size;
4474 }
4475 }
4476
4477 /* shut down emulator */
YM2610Shutdown()4478 void YM2610Shutdown()
4479 {
4480 if (!FM2610) return;
4481
4482 FMCloseTable();
4483 if (FM2610) {
4484 free(FM2610);
4485 FM2610 = NULL;
4486 }
4487 }
4488
4489 /* reset one of chip */
YM2610ResetChip(int num)4490 void YM2610ResetChip(int num)
4491 {
4492 int i;
4493 YM2610 *F2610 = &(FM2610[num]);
4494 FM_OPN *OPN = &(FM2610[num].OPN);
4495 YM_DELTAT *DELTAT = &(FM2610[num].deltaT);
4496
4497 /* Reset Prescaler */
4498 OPNSetPres( OPN, 6*24, 6*24, 4*2); /* OPN 1/6 , SSG 1/4 */
4499 /* reset SSG section */
4500 SSGReset(OPN->ST.index);
4501 /* status clear */
4502 FM_IRQMASK_SET(&OPN->ST,0x03);
4503 FM_BUSY_CLEAR(&OPN->ST);
4504 OPNWriteMode(OPN,0x27,0x30); /* mode 0 , timer reset */
4505
4506 OPN->eg_timer = 0;
4507 OPN->eg_cnt = 0;
4508
4509 FM_STATUS_RESET(&OPN->ST, 0xff);
4510
4511 reset_channels( &OPN->ST , F2610->CH , 6 );
4512 /* reset OPerator paramater */
4513 for(i = 0xb6 ; i >= 0xb4 ; i-- )
4514 {
4515 OPNWriteReg(OPN,i ,0xc0);
4516 OPNWriteReg(OPN,i|0x100,0xc0);
4517 }
4518 for(i = 0xb2 ; i >= 0x30 ; i-- )
4519 {
4520 OPNWriteReg(OPN,i ,0);
4521 OPNWriteReg(OPN,i|0x100,0);
4522 }
4523 for(i = 0x26 ; i >= 0x20 ; i-- ) OPNWriteReg(OPN,i,0);
4524 /**** ADPCM work initial ****/
4525 for( i = 0; i < 6 ; i++ ){
4526 F2610->adpcm[i].step = (UINT32)((float)(1<<ADPCM_SHIFT)*((float)F2610->OPN.ST.freqbase)/3.0);
4527 F2610->adpcm[i].now_addr = 0;
4528 F2610->adpcm[i].now_step = 0;
4529 F2610->adpcm[i].start = 0;
4530 F2610->adpcm[i].end = 0;
4531 /* F2610->adpcm[i].delta = 21866; */
4532 F2610->adpcm[i].vol_mul = 0;
4533 F2610->adpcm[i].pan = &out_adpcm[OUTD_CENTER]; /* default center */
4534 F2610->adpcm[i].flagMask = 1<<i;
4535 F2610->adpcm[i].flag = 0;
4536 F2610->adpcm[i].adpcm_acc = 0;
4537 F2610->adpcm[i].adpcm_step= 0;
4538 F2610->adpcm[i].adpcm_out = 0;
4539 }
4540 F2610->adpcmTL = 0x3f;
4541
4542 F2610->adpcm_arrivedEndAddress = 0;
4543
4544 /* DELTA-T unit */
4545 DELTAT->freqbase = OPN->ST.freqbase;
4546 DELTAT->output_pointer = out_delta;
4547 DELTAT->portshift = 8; /* allways 8bits shift */
4548 DELTAT->output_range = 1<<23;
4549 YM_DELTAT_ADPCM_Reset(DELTAT,OUTD_CENTER,YM_DELTAT_EMULATION_MODE_YM2610);
4550 }
4551
4552 /* YM2610 write */
4553 /* n = number */
4554 /* a = address */
4555 /* v = value */
YM2610Write(int n,int a,UINT8 v)4556 int YM2610Write(int n, int a, UINT8 v)
4557 {
4558 YM2610 *F2610 = &(FM2610[n]);
4559 FM_OPN *OPN = &(FM2610[n].OPN);
4560 int addr;
4561 int ch;
4562
4563 v &= 0xff; /* adjust to 8 bit bus */
4564
4565 switch( a&3 ){
4566 case 0: /* address port 0 */
4567 OPN->ST.address = v;
4568 F2610->addr_A1 = 0;
4569
4570 /* Write register to SSG emulator */
4571 if( v < 16 ) SSGWrite(n,0,v);
4572 break;
4573
4574 case 1: /* data port 0 */
4575 if (F2610->addr_A1 != 0)
4576 break; /* verified on real YM2608 */
4577
4578 addr = OPN->ST.address;
4579 #ifdef _STATE_H
4580 F2610->REGS[addr] = v;
4581 #endif
4582 switch(addr & 0xf0)
4583 {
4584 case 0x00: /* SSG section */
4585 /* Write data to SSG emulator */
4586 SSGWrite(n,a,v);
4587 break;
4588 case 0x10: /* DeltaT ADPCM */
4589 YM2610UpdateReq(n);
4590
4591 switch(addr)
4592 {
4593 case 0x10: /* control 1 */
4594 case 0x11: /* control 2 */
4595 case 0x12: /* start address L */
4596 case 0x13: /* start address H */
4597 case 0x14: /* stop address L */
4598 case 0x15: /* stop address H */
4599
4600 case 0x19: /* delta-n L */
4601 case 0x1a: /* delta-n H */
4602 case 0x1b: /* volume */
4603 {
4604 YM_DELTAT_ADPCM_Write(&F2610->deltaT,addr-0x10,v);
4605 }
4606 break;
4607
4608 case 0x1c: /* FLAG CONTROL : Extend Status Clear/Mask */
4609 {
4610 UINT8 statusmask = ~v;
4611 /* set arrived flag mask */
4612 for(ch=0;ch<6;ch++)
4613 F2610->adpcm[ch].flagMask = statusmask&(1<<ch);
4614
4615 F2610->deltaT.status_change_EOS_bit = statusmask & 0x80; /* status flag: set bit7 on End Of Sample */
4616
4617 /* clear arrived flag */
4618 F2610->adpcm_arrivedEndAddress &= statusmask;
4619 }
4620 break;
4621
4622 default:
4623 logerror("YM2610: write to unknown deltat register %02x val=%02x\n",addr,v);
4624 break;
4625 }
4626
4627 break;
4628 case 0x20: /* Mode Register */
4629 YM2610UpdateReq(n);
4630 OPNWriteMode(OPN,addr,v);
4631 break;
4632 default: /* OPN section */
4633 YM2610UpdateReq(n);
4634 /* write register */
4635 OPNWriteReg(OPN,addr,v);
4636 }
4637 break;
4638
4639 case 2: /* address port 1 */
4640 OPN->ST.address = v;
4641 F2610->addr_A1 = 1;
4642 break;
4643
4644 case 3: /* data port 1 */
4645 if (F2610->addr_A1 != 1)
4646 break; /* verified on real YM2608 */
4647
4648 YM2610UpdateReq(n);
4649 addr = OPN->ST.address;
4650 #ifdef _STATE_H
4651 F2610->REGS[addr | 0x100] = v;
4652 #endif
4653 if( addr < 0x30 )
4654 /* 100-12f : ADPCM A section */
4655 FM_ADPCMAWrite(F2610,addr,v);
4656 else
4657 OPNWriteReg(OPN,addr | 0x100,v);
4658 }
4659 return OPN->ST.irq;
4660 }
4661
YM2610Read(int n,int a)4662 UINT8 YM2610Read(int n,int a)
4663 {
4664 YM2610 *F2610 = &(FM2610[n]);
4665 int addr = F2610->OPN.ST.address;
4666 UINT8 ret = 0;
4667
4668 switch( a&3){
4669 case 0: /* status 0 : YM2203 compatible */
4670 ret = FM_STATUS_FLAG(&F2610->OPN.ST) & 0x83;
4671 break;
4672 case 1: /* data 0 */
4673 if( addr < 16 ) ret = SSGRead(n);
4674 if( addr == 0xff ) ret = 0x01;
4675 break;
4676 case 2: /* status 1 : ADPCM status */
4677 /* ADPCM STATUS (arrived End Address) */
4678 /* B,--,A5,A4,A3,A2,A1,A0 */
4679 /* B = ADPCM-B(DELTA-T) arrived end address */
4680 /* A0-A5 = ADPCM-A arrived end address */
4681 ret = F2610->adpcm_arrivedEndAddress;
4682 break;
4683 case 3:
4684 ret = 0;
4685 break;
4686 }
4687 return ret;
4688 }
4689
YM2610TimerOver(int n,int c)4690 int YM2610TimerOver(int n,int c)
4691 {
4692 YM2610 *F2610 = &(FM2610[n]);
4693
4694 if( c )
4695 { /* Timer B */
4696 TimerBOver( &(F2610->OPN.ST) );
4697 }
4698 else
4699 { /* Timer A */
4700 YM2610UpdateReq(n);
4701 /* timer update */
4702 TimerAOver( &(F2610->OPN.ST) );
4703 /* CSM mode key,TL controll */
4704 if( F2610->OPN.ST.mode & 0x80 )
4705 { /* CSM mode total level latch and auto key on */
4706 CSMKeyControll( F2610->OPN.type, &(F2610->CH[2]) );
4707 }
4708 }
4709 return F2610->OPN.ST.irq;
4710 }
4711
4712 #endif /* (BUILD_YM2610||BUILD_YM2610B) */
4713
4714
4715
4716 #if BUILD_YM2612
4717 /*******************************************************************************/
4718 /* YM2612 local section */
4719 /*******************************************************************************/
4720 /* here's the virtual YM2612 */
4721 typedef struct
4722 {
4723 UINT8 REGS[512]; /* registers */
4724 FM_OPN OPN; /* OPN state */
4725 FM_CH CH[6]; /* channel state */
4726 UINT8 addr_A1; /* address line A1 */
4727
4728 /* dac output (YM2612) */
4729 int dacen;
4730 INT32 dacout;
4731 } YM2612;
4732
4733 static int YM2612NumChips; /* total chip */
4734 static YM2612 *FM2612=NULL; /* array of YM2612's */
4735
4736 static int dacen;
4737
4738 /* Generate samples for one of the YM2612s */
YM2612UpdateOne(int num,INT16 * buffer,unsigned int length,unsigned int volume,int loud)4739 void YM2612UpdateOne(int num, INT16 *buffer, unsigned int length,
4740 unsigned int volume, int loud)
4741 {
4742 YM2612 *F2612 = &(FM2612[num]);
4743 FM_OPN *OPN = &(FM2612[num].OPN);
4744 unsigned int i;
4745 INT32 dacout = F2612->dacout;
4746
4747 if( (void *)F2612 != cur_chip ){
4748 cur_chip = (void *)F2612;
4749 State = &OPN->ST;
4750 cch[0] = &F2612->CH[0];
4751 cch[1] = &F2612->CH[1];
4752 cch[2] = &F2612->CH[2];
4753 cch[3] = &F2612->CH[3];
4754 cch[4] = &F2612->CH[4];
4755 cch[5] = &F2612->CH[5];
4756 /* DAC mode */
4757 dacen = F2612->dacen;
4758
4759 }
4760
4761 /* refresh PG and EG */
4762 refresh_fc_eg_chan( OPN, cch[0] );
4763 refresh_fc_eg_chan( OPN, cch[1] );
4764 if( (State->mode & 0xc0) )
4765 {
4766 /* 3SLOT MODE */
4767 if( cch[2]->SLOT[SLOT1].Incr==-1)
4768 {
4769 refresh_fc_eg_slot(OPN, &cch[2]->SLOT[SLOT1] , OPN->SL3.fc[1] , OPN->SL3.kcode[1] );
4770 refresh_fc_eg_slot(OPN, &cch[2]->SLOT[SLOT2] , OPN->SL3.fc[2] , OPN->SL3.kcode[2] );
4771 refresh_fc_eg_slot(OPN, &cch[2]->SLOT[SLOT3] , OPN->SL3.fc[0] , OPN->SL3.kcode[0] );
4772 refresh_fc_eg_slot(OPN, &cch[2]->SLOT[SLOT4] , cch[2]->fc , cch[2]->kcode );
4773 }
4774 }else refresh_fc_eg_chan( OPN, cch[2] );
4775 refresh_fc_eg_chan( OPN, cch[3] );
4776 refresh_fc_eg_chan( OPN, cch[4] );
4777 refresh_fc_eg_chan( OPN, cch[5] );
4778
4779 /* buffering */
4780 for(i=0; i < length ; i++)
4781 {
4782
4783 advance_lfo(OPN);
4784
4785 /* clear outputs */
4786 out_fm[0] = 0;
4787 out_fm[1] = 0;
4788 out_fm[2] = 0;
4789 out_fm[3] = 0;
4790 out_fm[4] = 0;
4791 out_fm[5] = 0;
4792
4793 /* calculate FM */
4794 chan_calc(OPN, cch[0], 0 );
4795 chan_calc(OPN, cch[1], 1 );
4796 chan_calc(OPN, cch[2], 2 );
4797 chan_calc(OPN, cch[3], 3 );
4798 chan_calc(OPN, cch[4], 4 );
4799 if( dacen )
4800 *cch[5]->connect4 += dacout;
4801 else
4802 chan_calc(OPN, cch[5], 5 );
4803
4804 /* advance envelope generator */
4805 OPN->eg_timer += OPN->eg_timer_add;
4806 while (OPN->eg_timer >= OPN->eg_timer_overflow)
4807 {
4808 OPN->eg_timer -= OPN->eg_timer_overflow;
4809 OPN->eg_cnt++;
4810
4811 advance_eg_channel(OPN, &cch[0]->SLOT[SLOT1]);
4812 advance_eg_channel(OPN, &cch[1]->SLOT[SLOT1]);
4813 advance_eg_channel(OPN, &cch[2]->SLOT[SLOT1]);
4814 advance_eg_channel(OPN, &cch[3]->SLOT[SLOT1]);
4815 advance_eg_channel(OPN, &cch[4]->SLOT[SLOT1]);
4816 advance_eg_channel(OPN, &cch[5]->SLOT[SLOT1]);
4817 }
4818
4819 {
4820 int32_t lt, rt;
4821
4822 lt = ((out_fm[0]>>0) & OPN->pan[0]);
4823 rt = ((out_fm[0]>>0) & OPN->pan[1]);
4824 lt += ((out_fm[1]>>0) & OPN->pan[2]);
4825 rt += ((out_fm[1]>>0) & OPN->pan[3]);
4826 lt += ((out_fm[2]>>0) & OPN->pan[4]);
4827 rt += ((out_fm[2]>>0) & OPN->pan[5]);
4828 lt += ((out_fm[3]>>0) & OPN->pan[6]);
4829 rt += ((out_fm[3]>>0) & OPN->pan[7]);
4830 lt += ((out_fm[4]>>0) & OPN->pan[8]);
4831 rt += ((out_fm[4]>>0) & OPN->pan[9]);
4832 lt += ((out_fm[5]>>0) & OPN->pan[10]);
4833 rt += ((out_fm[5]>>0) & OPN->pan[11]);
4834
4835 lt >>= FINAL_SH;
4836 rt >>= FINAL_SH;
4837
4838 #if 0
4839 Limit( lt, MAXOUT, MINOUT );
4840 Limit( rt, MAXOUT, MINOUT );
4841 #endif
4842
4843 #ifdef SAVE_SAMPLE
4844 SAVE_ALL_CHANNELS
4845 #endif
4846
4847 /* Mix with buffer. */
4848 lt += *buffer;
4849 /* Make it louder. */
4850 if (loud)
4851 lt = ((lt * 3) >> 1);
4852 /* Lower volume? */
4853 if (volume != 100)
4854 lt = ((lt * (int)volume) / 100);
4855 /* Hard clipping for signed 16-bit output. */
4856 lt = ((abs(lt + 32767) - abs(lt - 32767)) >> 1);
4857 *(buffer++) = lt;
4858
4859 rt += *buffer;
4860 if (loud)
4861 rt = ((rt * 3) >> 1);
4862 if (volume != 100)
4863 rt = ((rt * (int)volume) / 100);
4864 rt = ((abs(rt + 32767) - abs(rt - 32767)) >> 1);
4865 *(buffer++) = rt;
4866 }
4867
4868 /* timer A control */
4869 INTERNAL_TIMER_A(OPN->type, State, cch[2])
4870 }
4871 INTERNAL_TIMER_B(State,length)
4872
4873 }
4874
4875 #ifdef _STATE_H
YM2612_postload(void)4876 static void YM2612_postload(void)
4877 {
4878 int num , r;
4879
4880 for(num=0;num<YM2612NumChips;num++)
4881 {
4882 /* DAC data & port */
4883 FM2612[num].dacout = ((int)FM2612[num].REGS[0x2a] - 0x80) << 6; /* level unknown */
4884 FM2612[num].dacen = FM2612[num].REGS[0x2d] & 0x80;
4885 /* OPN registers */
4886 /* DT / MULTI , TL , KS / AR , AMON / DR , SR , SL / RR , SSG-EG */
4887 for(r=0x30;r<0x9e;r++)
4888 if((r&3) != 3)
4889 {
4890 OPNWriteReg(&FM2612[num].OPN,r,FM2612[num].REGS[r]);
4891 OPNWriteReg(&FM2612[num].OPN,r|0x100,FM2612[num].REGS[r|0x100]);
4892 }
4893 /* FB / CONNECT , L / R / AMS / PMS */
4894 for(r=0xb0;r<0xb6;r++)
4895 if((r&3) != 3)
4896 {
4897 OPNWriteReg(&FM2612[num].OPN,r,FM2612[num].REGS[r]);
4898 OPNWriteReg(&FM2612[num].OPN,r|0x100,FM2612[num].REGS[r|0x100]);
4899 }
4900 /* channels */
4901 /*FM_channel_postload(FM2612[num].CH,6);*/
4902 }
4903 cur_chip = NULL;
4904 }
4905
YM2612_save_state(void)4906 static void YM2612_save_state(void)
4907 {
4908 int num;
4909 const char statename[] = "YM2612";
4910
4911 for(num=0;num<YM2612NumChips;num++)
4912 {
4913 state_save_register_UINT8 (statename, num, "regs" , FM2612[num].REGS , 512);
4914 FMsave_state_st(statename,num,&FM2612[num].OPN.ST);
4915 FMsave_state_channel(statename,num,FM2612[num].CH,6);
4916 /* 3slots */
4917 state_save_register_UINT32 (statename, num, "slot3fc" , FM2612[num].OPN.SL3.fc , 3);
4918 state_save_register_UINT8 (statename, num, "slot3fh" , &FM2612[num].OPN.SL3.fn_h, 1);
4919 state_save_register_UINT8 (statename, num, "slot3kc" , FM2612[num].OPN.SL3.kcode, 3);
4920 /* address register1 */
4921 state_save_register_UINT8 (statename, num, "addr_A1" , &FM2612[num].addr_A1, 1);
4922 }
4923 state_save_register_func_postload(YM2612_postload);
4924 }
4925 #endif /* _STATE_H */
4926
4927 /* initialize YM2612 emulator(s) */
YM2612Init(int num,int clock,int rate,int mjazz,FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler)4928 int YM2612Init(int num, int clock, int rate, int mjazz,
4929 FM_TIMERHANDLER TimerHandler,FM_IRQHANDLER IRQHandler)
4930 {
4931 int i;
4932
4933 if (FM2612) return (-1); /* duplicate init. */
4934 cur_chip = NULL; /* hiro-shi!! */
4935
4936 YM2612NumChips = num;
4937
4938 /* allocate extend state space */
4939 if( (FM2612 = (YM2612 *)malloc(sizeof(YM2612) * YM2612NumChips))==NULL)
4940 return (-1);
4941 /* clear */
4942 memset(FM2612,0,sizeof(YM2612) * YM2612NumChips);
4943 /* allocate total level table (128kb space) */
4944 if( !init_tables() )
4945 {
4946 if (FM2612) {
4947 free( FM2612 );
4948 FM2612 = NULL;
4949 }
4950 return (-1);
4951 }
4952
4953 for ( i = 0 ; i < YM2612NumChips; i++ ) {
4954 FM2612[i].OPN.ST.index = i;
4955 FM2612[i].OPN.type = TYPE_YM2612;
4956 FM2612[i].OPN.P_CH = FM2612[i].CH;
4957 FM2612[i].OPN.ST.clock = clock;
4958 FM2612[i].OPN.ST.rate = rate;
4959 if (mjazz)
4960 FM2612[i].OPN.ST.rate <<= i;
4961 /* FM2612[i].OPN.ST.irq = 0; */
4962 /* FM2612[i].OPN.ST.status = 0; */
4963 /* Extend handler */
4964 FM2612[i].OPN.ST.Timer_Handler = TimerHandler;
4965 FM2612[i].OPN.ST.IRQ_Handler = IRQHandler;
4966 YM2612ResetChip(i);
4967 }
4968 #ifdef _STATE_H
4969 YM2612_save_state();
4970 #endif
4971 return 0;
4972 }
4973
4974 /* shut down emulator */
YM2612Shutdown()4975 void YM2612Shutdown()
4976 {
4977 if (!FM2612) return;
4978
4979 FMCloseTable();
4980 if (FM2612) {
4981 free(FM2612);
4982 FM2612 = NULL;
4983 }
4984 }
4985
4986 /* reset one of chip */
YM2612ResetChip(int num)4987 void YM2612ResetChip(int num)
4988 {
4989 int i;
4990 YM2612 *F2612 = &(FM2612[num]);
4991 FM_OPN *OPN = &(FM2612[num].OPN);
4992
4993 OPNSetPres( OPN, 6*24, 6*24, 0);
4994 /* status clear */
4995 FM_IRQMASK_SET(&OPN->ST,0x03);
4996 FM_BUSY_CLEAR(&OPN->ST);
4997 OPNWriteMode(OPN,0x27,0x30); /* mode 0 , timer reset */
4998
4999 OPN->eg_timer = 0;
5000 OPN->eg_cnt = 0;
5001
5002 FM_STATUS_RESET(&OPN->ST, 0xff);
5003
5004 reset_channels( &OPN->ST , &F2612->CH[0] , 6 );
5005 for(i = 0xb6 ; i >= 0xb4 ; i-- )
5006 {
5007 OPNWriteReg(OPN,i ,0xc0);
5008 OPNWriteReg(OPN,i|0x100,0xc0);
5009 }
5010 for(i = 0xb2 ; i >= 0x30 ; i-- )
5011 {
5012 OPNWriteReg(OPN,i ,0);
5013 OPNWriteReg(OPN,i|0x100,0);
5014 }
5015 for(i = 0x26 ; i >= 0x20 ; i-- ) OPNWriteReg(OPN,i,0);
5016 /* DAC mode clear */
5017 F2612->dacen = 0;
5018 }
5019
5020 /* YM2612 write */
5021 /* n = number */
5022 /* a = address */
5023 /* v = value */
YM2612Write(int n,int a,UINT8 v)5024 int YM2612Write(int n, int a, UINT8 v)
5025 {
5026 YM2612 *F2612 = &(FM2612[n]);
5027 int addr;
5028
5029 v &= 0xff; /* adjust to 8 bit bus */
5030
5031 switch( a&3){
5032 case 0: /* address port 0 */
5033 F2612->OPN.ST.address = v;
5034 F2612->addr_A1 = 0;
5035 break;
5036
5037 case 1: /* data port 0 */
5038 if (F2612->addr_A1 != 0)
5039 break; /* verified on real YM2608 */
5040
5041 addr = F2612->OPN.ST.address;
5042 /*#ifdef _STATE_H*/
5043 F2612->REGS[addr] = v;
5044 /*#endif*/
5045 switch( addr & 0xf0 )
5046 {
5047 case 0x20: /* 0x20-0x2f Mode */
5048 switch( addr )
5049 {
5050 case 0x2a: /* DAC data (YM2612) */
5051 YM2612UpdateReq(n);
5052 F2612->dacout = ((int)v - 0x80) << 6; /* level unknown */
5053 break;
5054 case 0x2b: /* DAC Sel (YM2612) */
5055 /* b7 = dac enable */
5056 F2612->dacen = v & 0x80;
5057 cur_chip = NULL;
5058 break;
5059 default: /* OPN section */
5060 YM2612UpdateReq(n);
5061 /* write register */
5062 OPNWriteMode(&(F2612->OPN),addr,v);
5063 }
5064 break;
5065 default: /* 0x30-0xff OPN section */
5066 YM2612UpdateReq(n);
5067 /* write register */
5068 OPNWriteReg(&(F2612->OPN),addr,v);
5069 }
5070 break;
5071
5072 case 2: /* address port 1 */
5073 F2612->OPN.ST.address = v;
5074 F2612->addr_A1 = 1;
5075 break;
5076
5077 case 3: /* data port 1 */
5078 if (F2612->addr_A1 != 1)
5079 break; /* verified on real YM2608 */
5080
5081 addr = F2612->OPN.ST.address;
5082 /*#ifdef _STATE_H*/
5083 F2612->REGS[addr | 0x100] = v;
5084 /*#endif*/
5085 YM2612UpdateReq(n);
5086 OPNWriteReg(&(F2612->OPN),addr | 0x100,v);
5087 break;
5088 }
5089 return F2612->OPN.ST.irq;
5090 }
5091
YM2612Read(int n,int a)5092 UINT8 YM2612Read(int n,int a)
5093 {
5094 YM2612 *F2612 = &(FM2612[n]);
5095
5096 switch( a&3){
5097 case 0: /* status 0 */
5098 return FM_STATUS_FLAG(&F2612->OPN.ST);
5099 case 1:
5100 case 2:
5101 case 3:
5102 LOG(LOG_WAR,("YM2612 #%d:A=%d read unmapped area\n",n,a));
5103 return FM_STATUS_FLAG(&F2612->OPN.ST);
5104 }
5105 return 0;
5106 }
5107
YM2612TimerOver(int n,int c)5108 int YM2612TimerOver(int n,int c)
5109 {
5110 YM2612 *F2612 = &(FM2612[n]);
5111
5112 if( c )
5113 { /* Timer B */
5114 TimerBOver( &(F2612->OPN.ST) );
5115 }
5116 else
5117 { /* Timer A */
5118 YM2612UpdateReq(n);
5119 /* timer update */
5120 TimerAOver( &(F2612->OPN.ST) );
5121 /* CSM mode key,TL controll */
5122 if( F2612->OPN.ST.mode & 0x80 )
5123 { /* CSM mode total level latch and auto key on */
5124 CSMKeyControll( F2612->OPN.type, &(F2612->CH[2]) );
5125 }
5126 }
5127 return F2612->OPN.ST.irq;
5128 }
5129
5130 /* Implemented by zamaz for dgen */
YM2612_dump(int num,uint8_t buf[512])5131 void YM2612_dump(int num, uint8_t buf[512])
5132 {
5133 YM2612 *F2612 = &(FM2612[num]);
5134
5135 memcpy(buf, F2612->REGS, 512);
5136 }
5137
5138 /* Implemented by zamaz for dgen */
YM2612_restore(int num,uint8_t buf[512])5139 void YM2612_restore(int num, uint8_t buf[512])
5140 {
5141 YM2612 *F2612 = &(FM2612[num]);
5142 unsigned int r;
5143
5144 memcpy(F2612->REGS, buf, 512);
5145 /* See YM2612_postload(). */
5146 F2612->dacout = ((buf[0x2a] - 0x80) << 6);
5147 F2612->dacen = (buf[0x2d] & 0x80);
5148 for (r = 0x30; (r != 0x9e); ++r) {
5149 if ((r & 3) == 3)
5150 continue;
5151 OPNWriteReg(&F2612->OPN, r, buf[r]);
5152 OPNWriteReg(&F2612->OPN, (r | 0x100), buf[(r | 0x100)]);
5153 }
5154 for (r = 0xb0; (r != 0xb6); ++r) {
5155 if ((r & 3) == 3)
5156 continue;
5157 OPNWriteReg(&F2612->OPN, r, buf[r]);
5158 OPNWriteReg(&F2612->OPN, (r | 0x100), buf[(r | 0x100)]);
5159 }
5160 }
5161
5162 // ---------------------------------------------------------------------------
5163 // Everything below this line is for the debugger.
5164 // It can't be in debug.c because it needs the private structs defined here
5165 // ---------------------------------------------------------------------------
5166
5167 #ifdef WITH_DEBUGGER
5168
5169 /*
5170 * I figure it is easier to extract the parameters directly rather
5171 * than have to interpret the structs defined above
5172 */
5173
5174 /* global ym2612 registers (YMREG_*) */
5175 #define YMREG_LFO 0x22
5176 #define YMREG_TIMER_A1 0x24
5177 #define YMREG_TIMER_A2 0x25
5178 #define YMREG_TIMER_B 0x26
5179 #define YMREG_CH3_TIMERS 0x27
5180 #define YMREG_KEY 0x28
5181 #define YMREG_DAC 0x2a
5182 #define YMREG_DAC_ENABLE 0x2b
5183 #define YMREG_OP_SSG_EG 0x90
5184
5185 /* per channel ym2612 registers (YMREG_CHAN_*) */
5186 #define YMREG_CHAN_FREQ1 0xa0
5187 #define YMREG_CHAN_FREQ2 0xa4
5188 #define YMREG_CHAN_CH3_OP1_FREQ1 0xa2
5189 #define YMREG_CHAN_CH3_OP1_FREQ2 0xa6
5190 #define YMREG_CHAN_CH3_OP2_FREQ1 0xa8
5191 #define YMREG_CHAN_CH3_OP2_FREQ2 0xac
5192 #define YMREG_CHAN_CH3_OP3_FREQ1 0xa9
5193 #define YMREG_CHAN_CH3_OP3_FREQ2 0xad
5194 #define YMREG_CHAN_CH3_OP4_FREQ1 0xaa
5195 #define YMREG_CHAN_CH3_OP4_FREQ2 0xae
5196 #define YMREG_CHAN_FBACK_ALGO 0xb0
5197 #define YMREG_CHAN_LR_AMS_FMS 0xb4
5198
5199 /* per operator um2612 registers (YMREG_OP_*) */
5200 #define YMREG_OP_DT1_MUL 0x30
5201 #define YMREG_OP_TL 0x40
5202 #define YMREG_OP_RS_AR 0x50
5203 #define YMREG_OP_AM_D1R 0x60
5204 #define YMREG_OP_D2R 0x70
5205 #define YMREG_OP_D1L_RR 0x80
5206 #define YMREG_OP_SSG_EG 0x90
5207
5208 /*
5209 * Given a channel return the part (1 or 2) and the channel offset (1-3).
5210 * Eg. Channel 5 is part 2 offset 1
5211 */
5212 void
debug_get_chan_part_and_offset(uint8_t chan,uint8_t * part,uint8_t * offs)5213 debug_get_chan_part_and_offset(uint8_t chan, uint8_t *part, uint8_t *offs)
5214 {
5215 if ((chan >= 1) && (chan <= 3)) {
5216 *part = 1;
5217 } else if (chan <= 6) {
5218 *part = 2;
5219 } else {
5220 *part = 0;
5221 *offs = 0;
5222 printf("%s: bad channel: %d\n", __func__, chan);
5223 return;
5224 }
5225
5226 *offs = (chan - 1) % 3;
5227 }
5228
5229 #define DEBUG_PRINT_GLOBAL_VAL(r, v) printf(" %-15s: 0x%02x\n", r, v);
debug_show_ym2612_global_regs(uint8_t regs[512])5230 void debug_show_ym2612_global_regs(uint8_t regs[512])
5231 {
5232 printf("ym2612 global registers:\n");
5233
5234 DEBUG_PRINT_GLOBAL_VAL("LFO Enable", (regs[YMREG_LFO] & 8) >> 3);
5235 DEBUG_PRINT_GLOBAL_VAL("LFO Freq.", regs[YMREG_LFO] & 7);
5236 DEBUG_PRINT_GLOBAL_VAL("Timer A", (regs[YMREG_TIMER_A1] & 0x3) | (regs[YMREG_TIMER_A2]));
5237 DEBUG_PRINT_GLOBAL_VAL("Timer B", regs[YMREG_TIMER_B]);
5238 DEBUG_PRINT_GLOBAL_VAL("Ch3 Mode",(regs[YMREG_CH3_TIMERS] & 0xa0) >> 6);
5239 DEBUG_PRINT_GLOBAL_VAL("Timer Reset B", (regs[YMREG_CH3_TIMERS] & 0x20) >> 5);
5240 DEBUG_PRINT_GLOBAL_VAL("Timer Reset A", (regs[YMREG_CH3_TIMERS] & 0x10) >> 4);
5241 DEBUG_PRINT_GLOBAL_VAL("Timer Enable B", (regs[YMREG_CH3_TIMERS] & 0x8) >> 3);
5242 DEBUG_PRINT_GLOBAL_VAL("Timer Enable A", (regs[YMREG_CH3_TIMERS] & 0x4) >> 2);
5243 DEBUG_PRINT_GLOBAL_VAL("Timer Load B", (regs[YMREG_CH3_TIMERS] & 0x2) >> 1);
5244 DEBUG_PRINT_GLOBAL_VAL("Timer Load A", regs[YMREG_CH3_TIMERS] & 0x2);
5245 DEBUG_PRINT_GLOBAL_VAL("Operator Enable", (regs[YMREG_KEY] & 0xf0) >> 4);
5246 DEBUG_PRINT_GLOBAL_VAL("Key Enable", regs[YMREG_KEY] & 0xf);
5247 DEBUG_PRINT_GLOBAL_VAL("DAC", regs[YMREG_DAC]);
5248 DEBUG_PRINT_GLOBAL_VAL("DAC Enable", (regs[YMREG_DAC_ENABLE] & 0x80) >> 7);
5249 }
5250
5251 /* get the address of one of the operator specific registers */
debug_get_opn_reg_addr(uint8_t reg,uint8_t ch,uint8_t op)5252 uint8_t debug_get_opn_reg_addr(uint8_t reg, uint8_t ch, uint8_t op)
5253 {
5254 uint8_t part, ch_offset, addr;
5255
5256 if ((ch < 1) || (ch > 6)) {
5257 printf("%s: bad channel: %u\n", __func__, ch);
5258 return (0);
5259 }
5260
5261 if ((op < 1) || (op > 4)) {
5262 printf("%s: bad operator: %u\n", __func__, op);
5263 return (0);
5264 }
5265
5266 debug_get_chan_part_and_offset(ch, &part, &ch_offset);
5267 addr = reg + ((op - 1) * 4) + ch_offset;
5268
5269 if (part > 1)
5270 addr += 0x100; /* part 2 is stored in bytes 256 - 511 */
5271
5272 return addr;
5273 }
5274
5275 /* show a single slot's (aka operator's) registers (many per channel) */
5276 #define DEBUG_PRINT_OP_VAL(r, v) printf(" %-15s: 0x%02x\n", r, v);
debug_show_ym2612_operator_regs(uint8_t regs[512],uint8_t ch,uint8_t op)5277 void debug_show_ym2612_operator_regs(uint8_t regs[512], uint8_t ch, uint8_t op)
5278 {
5279 printf("\n ym2612 channel %u operator %u registers:\n", ch, op);
5280
5281 DEBUG_PRINT_OP_VAL("Detune (DT1)",
5282 (regs[debug_get_opn_reg_addr(YMREG_OP_DT1_MUL, ch, op)] & 0x70) >> 4);
5283 DEBUG_PRINT_OP_VAL("Multiplier (MUL)",
5284 regs[debug_get_opn_reg_addr(YMREG_OP_DT1_MUL, ch, op)] & 0xf);
5285 DEBUG_PRINT_OP_VAL("Total Level (TL)",
5286 regs[debug_get_opn_reg_addr(YMREG_OP_TL, ch, op)] & 0x7f);
5287 DEBUG_PRINT_OP_VAL("Rate Scaling (RS)",
5288 (regs[debug_get_opn_reg_addr(YMREG_OP_RS_AR, ch, op)] & 0xc0) >> 6);
5289 DEBUG_PRINT_OP_VAL("Attack rate (AR)",
5290 regs[debug_get_opn_reg_addr(YMREG_OP_RS_AR, ch, op)] & 0x1f);
5291 DEBUG_PRINT_OP_VAL("AM Enable (AM)",
5292 (regs[debug_get_opn_reg_addr(YMREG_OP_AM_D1R, ch, op)] & 0x80) >> 7);
5293 DEBUG_PRINT_OP_VAL("First Decay Rate (D1R)",
5294 regs[debug_get_opn_reg_addr(YMREG_OP_AM_D1R, ch, op)] & 0x1f);
5295 DEBUG_PRINT_OP_VAL("Second Decay Rate (D2R)",
5296 regs[debug_get_opn_reg_addr(YMREG_OP_D2R, ch, op)] & 0x1f);
5297 DEBUG_PRINT_OP_VAL("Secondary Level (D1L)",
5298 (regs[debug_get_opn_reg_addr(YMREG_OP_D1L_RR, ch, op)] & 0xf0) >> 4);
5299 DEBUG_PRINT_OP_VAL("Release Rate (RR)",
5300 regs[debug_get_opn_reg_addr(YMREG_OP_D1L_RR, ch, op)] & 0xf);
5301 DEBUG_PRINT_OP_VAL("Sega Proproetary (SSG-EG)",
5302 regs[debug_get_opn_reg_addr(YMREG_OP_SSG_EG, ch, op)] & 0xf);
5303 }
5304
5305
5306 /* get the address of one of the operator specific registers */
debug_get_chan_reg_addr(uint8_t reg,uint8_t ch)5307 uint8_t debug_get_chan_reg_addr(uint8_t reg, uint8_t ch)
5308 {
5309 uint8_t part, ch_offset;
5310
5311 if ((ch < 1) || (ch > 6)) {
5312 printf("%s: bad channel: %u\n", __func__, ch);
5313 return (0);
5314 }
5315
5316 debug_get_chan_part_and_offset(ch, &part, &ch_offset);
5317 return (reg + ch_offset + ((part - 1) * 0x100));
5318 }
5319 /* shows a single channel's regsiters */
5320 #define DEBUG_MAX_OPS 4
5321 #define DEBUG_PRINT_CHAN_VAL(r, v) printf(" %-15s: 0x%02x\n", r, v);
debug_show_ym2612_chan_regs(uint8_t regs[512],uint8_t ch)5322 void debug_show_ym2612_chan_regs(uint8_t regs[512], uint8_t ch)
5323 {
5324 uint8_t op;
5325
5326 printf("\n ym2612 channel %u registers:\n", ch);
5327
5328 DEBUG_PRINT_CHAN_VAL("Octave",
5329 ((regs[debug_get_chan_reg_addr(YMREG_CHAN_FREQ2, ch)]) & 0x38) >> 3);
5330
5331 DEBUG_PRINT_CHAN_VAL("Frequency",
5332 (regs[debug_get_chan_reg_addr(YMREG_CHAN_FREQ2, ch)] & 0x7) << 8 |
5333 regs[debug_get_chan_reg_addr(YMREG_CHAN_FREQ1, ch)]);
5334
5335 /* channel 3 and 6 can have separate freq's per op */
5336 if ((ch % 3) == 0) {
5337 DEBUG_PRINT_CHAN_VAL("Supp. Freq 1",
5338 (regs[debug_get_chan_reg_addr(YMREG_CHAN_CH3_OP1_FREQ2, ch)] & 0x7) << 8 |
5339 regs[debug_get_chan_reg_addr(YMREG_CHAN_CH3_OP1_FREQ1, ch)]);
5340 DEBUG_PRINT_CHAN_VAL("Supp. Octave 1",
5341 ((regs[debug_get_chan_reg_addr(YMREG_CHAN_CH3_OP1_FREQ2, ch)]) & 0x38) >> 3);
5342
5343 DEBUG_PRINT_CHAN_VAL("Supp. Freq 2",
5344 (regs[debug_get_chan_reg_addr(YMREG_CHAN_CH3_OP2_FREQ2, ch)] & 0x7) << 8 |
5345 regs[debug_get_chan_reg_addr(YMREG_CHAN_CH3_OP2_FREQ1, ch)]);
5346 DEBUG_PRINT_CHAN_VAL("Supp. Octave 2",
5347 ((regs[debug_get_chan_reg_addr(YMREG_CHAN_CH3_OP2_FREQ2, ch)]) & 0x38) >> 3);
5348
5349 DEBUG_PRINT_CHAN_VAL("Supp. Freq 3",
5350 (regs[debug_get_chan_reg_addr(YMREG_CHAN_CH3_OP3_FREQ2, ch)] & 0x7) << 8 |
5351 regs[debug_get_chan_reg_addr(YMREG_CHAN_CH3_OP3_FREQ1, ch)]);
5352 DEBUG_PRINT_CHAN_VAL("Supp. Octave 3",
5353 ((regs[debug_get_chan_reg_addr(YMREG_CHAN_CH3_OP3_FREQ2, ch)]) & 0x38) >> 3);
5354
5355 DEBUG_PRINT_CHAN_VAL("Supp. Freq 4",
5356 (regs[debug_get_chan_reg_addr(YMREG_CHAN_CH3_OP3_FREQ2, ch)] & 0x7) << 8 |
5357 regs[debug_get_chan_reg_addr(YMREG_CHAN_CH3_OP3_FREQ1, ch)]);
5358 DEBUG_PRINT_CHAN_VAL("Supp. Octave 4",
5359 ((regs[debug_get_chan_reg_addr(YMREG_CHAN_CH3_OP1_FREQ2, ch)]) & 0x38) >> 3);
5360 }
5361
5362 DEBUG_PRINT_CHAN_VAL("Feedback",
5363 ((regs[debug_get_chan_reg_addr(YMREG_CHAN_FBACK_ALGO, ch)]) & 0x38) >> 3);
5364 DEBUG_PRINT_CHAN_VAL("Algorithm",
5365 (regs[debug_get_chan_reg_addr(YMREG_CHAN_FBACK_ALGO, ch)]) & 0x3);
5366 DEBUG_PRINT_CHAN_VAL("Stereo L",
5367 ((regs[debug_get_chan_reg_addr(YMREG_CHAN_LR_AMS_FMS, ch)]) & 0x80) >> 7);
5368 DEBUG_PRINT_CHAN_VAL("Stereo R",
5369 ((regs[debug_get_chan_reg_addr(YMREG_CHAN_LR_AMS_FMS, ch)]) & 0x40) >> 6);
5370 DEBUG_PRINT_CHAN_VAL("AM Sensitivity",
5371 ((regs[debug_get_chan_reg_addr(YMREG_CHAN_LR_AMS_FMS, ch)]) & 0x30) >> 4);
5372 DEBUG_PRINT_CHAN_VAL("FM Sensitivity",
5373 (regs[debug_get_chan_reg_addr(YMREG_CHAN_LR_AMS_FMS, ch)]) & 0x7);
5374
5375
5376 for (op = 1; op <= DEBUG_MAX_OPS; op++)
5377 debug_show_ym2612_operator_regs(regs, ch, op);
5378 }
5379
5380 #define DEBUG_MAX_CHAN 6
debug_show_ym2612_regs()5381 void debug_show_ym2612_regs()
5382 {
5383 uint8_t regs[512], chan;
5384
5385 YM2612_dump(0, regs);
5386
5387 printf("ym2612:\n");
5388 debug_show_ym2612_global_regs(regs);
5389
5390 for (chan = 1; chan <= DEBUG_MAX_CHAN; chan ++)
5391 debug_show_ym2612_chan_regs(regs, chan);
5392 }
5393 #endif
5394
5395 #endif /* BUILD_YM2612 */
5396