notaz.gp2x.de
/
picodrive.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
new code to collect/use more stats, some debug tools
[picodrive.git]
/
Pico
/
sound
/
ym2612.c
diff --git
a/Pico/sound/ym2612.c
b/Pico/sound/ym2612.c
index
625864c
..
56c363a
100644
(file)
--- a/
Pico/sound/ym2612.c
+++ b/
Pico/sound/ym2612.c
@@
-381,7
+381,7
@@
static const UINT8 dt_tab[4 * 32]={
5, 6, 6, 7, 8, 8, 9,10,11,12,13,14,16,16,16,16,
\r
/* FD=3 */
\r
2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7,
\r
5, 6, 6, 7, 8, 8, 9,10,11,12,13,14,16,16,16,16,
\r
/* FD=3 */
\r
2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7,
\r
- 8 ,
8, 9,10,11,12,13,14,16,17,19,20,22,22,22,22
\r
+ 8 ,8, 9,10,11,12,13,14,16,17,19,20,22,22,22,22
\r
};
\r
\r
\r
};
\r
\r
\r
@@
-889,7
+889,7
@@
static void chan_render_loop(chan_rend_context *ct, int *buffer, int length)
{
\r
int out = 0;
\r
\r
{
\r
int out = 0;
\r
\r
- if (ct->pack&0xf000) out = ((ct->op1_out>>16) + (
ct->op1_out<<16
>>16)) << ((ct->pack&0xf000)>>12); /* op1_out0 + op1_out1 */
\r
+ if (ct->pack&0xf000) out = ((ct->op1_out>>16) + (
(ct->op1_out<<16)
>>16)) << ((ct->pack&0xf000)>>12); /* op1_out0 + op1_out1 */
\r
ct->op1_out <<= 16;
\r
ct->op1_out |= (unsigned short)op_calc1(ct->phase1, eg_out, out);
\r
} else {
\r
ct->op1_out <<= 16;
\r
ct->op1_out |= (unsigned short)op_calc1(ct->phase1, eg_out, out);
\r
} else {
\r
@@
-1152,9
+1152,9
@@
static int chan_render(int *buffer, int length, int c, UINT32 flags) // flags: s
UINT32 fn;
\r
int kc,fc;
\r
\r
UINT32 fn;
\r
int kc,fc;
\r
\r
+ blk = block_fnum >> 11;
\r
block_fnum = block_fnum*2 + lfo_fn_table_index_offset;
\r
\r
block_fnum = block_fnum*2 + lfo_fn_table_index_offset;
\r
\r
- blk = (block_fnum&0x7000) >> 12;
\r
fn = block_fnum & 0xfff;
\r
\r
/* keyscale code */
\r
fn = block_fnum & 0xfff;
\r
\r
/* keyscale code */
\r
@@
-1203,10
+1203,14
@@
static int chan_render(int *buffer, int length, int c, UINT32 flags) // flags: s
/* update phase increment and envelope generator */
\r
INLINE void refresh_fc_eg_slot(FM_SLOT *SLOT, int fc, int kc)
\r
{
\r
/* update phase increment and envelope generator */
\r
INLINE void refresh_fc_eg_slot(FM_SLOT *SLOT, int fc, int kc)
\r
{
\r
- int ksr;
\r
+ int ksr
, fdt
;
\r
\r
/* (frequency) phase increment counter */
\r
\r
/* (frequency) phase increment counter */
\r
- SLOT->Incr = ((fc+SLOT->DT[kc])*SLOT->mul) >> 1;
\r
+ fdt = fc+SLOT->DT[kc];
\r
+ /* detect overflow */
\r
+// if (fdt < 0) fdt += fn_table[0x7ff*2] >> (7-blk-1);
\r
+ if (fdt < 0) fdt += fn_table[0x7ff*2] >> 2;
\r
+ SLOT->Incr = fdt*SLOT->mul >> 1;
\r
\r
ksr = kc >> SLOT->KSR;
\r
if( SLOT->ksr != ksr )
\r
\r
ksr = kc >> SLOT->KSR;
\r
if( SLOT->ksr != ksr )
\r
@@
-1258,6
+1262,17
@@
INLINE void refresh_fc_eg_chan(FM_CH *CH)
}
\r
}
\r
\r
}
\r
}
\r
\r
+INLINE void refresh_fc_eg_chan_sl3(void)
\r
+{
\r
+ if( ym2612.CH[2].SLOT[SLOT1].Incr==-1)
\r
+ {
\r
+ refresh_fc_eg_slot(&ym2612.CH[2].SLOT[SLOT1], ym2612.OPN.SL3.fc[1], ym2612.OPN.SL3.kcode[1] );
\r
+ refresh_fc_eg_slot(&ym2612.CH[2].SLOT[SLOT2], ym2612.OPN.SL3.fc[2], ym2612.OPN.SL3.kcode[2] );
\r
+ refresh_fc_eg_slot(&ym2612.CH[2].SLOT[SLOT3], ym2612.OPN.SL3.fc[0], ym2612.OPN.SL3.kcode[0] );
\r
+ refresh_fc_eg_slot(&ym2612.CH[2].SLOT[SLOT4], ym2612.CH[2].fc , ym2612.CH[2].kcode );
\r
+ }
\r
+}
\r
+
\r
/* initialize time tables */
\r
static void init_timetables(const UINT8 *dttable)
\r
{
\r
/* initialize time tables */
\r
static void init_timetables(const UINT8 *dttable)
\r
{
\r
@@
-1293,6
+1308,7
@@
static void reset_channels(FM_CH *CH)
CH[c].SLOT[s].state= EG_OFF;
\r
CH[c].SLOT[s].volume = MAX_ATT_INDEX;
\r
}
\r
CH[c].SLOT[s].state= EG_OFF;
\r
CH[c].SLOT[s].volume = MAX_ATT_INDEX;
\r
}
\r
+ CH[c].mem_value = CH[c].op1_out = 0;
\r
}
\r
ym2612.slot_mask = 0;
\r
}
\r
}
\r
ym2612.slot_mask = 0;
\r
}
\r
@@
-1427,7
+1443,6
@@
static void OPNSetPres(int pres)
\r
ym2612.OPN.eg_timer_add = (1<<EG_SH) * ym2612.OPN.ST.freqbase;
\r
\r
\r
ym2612.OPN.eg_timer_add = (1<<EG_SH) * ym2612.OPN.ST.freqbase;
\r
\r
-
\r
/* make time tables */
\r
init_timetables( dt_tab );
\r
\r
/* make time tables */
\r
init_timetables( dt_tab );
\r
\r
@@
-1481,17
+1496,17
@@
static int OPNWriteReg(int r, int v)
set_ar_ksr(CH,SLOT,v);
\r
break;
\r
\r
set_ar_ksr(CH,SLOT,v);
\r
break;
\r
\r
- case 0x60: /* bit7 = AM ENABLE, DR */
\r
+ case 0x60: /* bit7 = AM ENABLE, DR
| depends on ksr
*/
\r
set_dr(SLOT,v);
\r
if(v&0x80) CH->AMmasks |= 1<<OPN_SLOT(r);
\r
else CH->AMmasks &= ~(1<<OPN_SLOT(r));
\r
break;
\r
\r
set_dr(SLOT,v);
\r
if(v&0x80) CH->AMmasks |= 1<<OPN_SLOT(r);
\r
else CH->AMmasks &= ~(1<<OPN_SLOT(r));
\r
break;
\r
\r
- case 0x70: /* SR */
\r
+ case 0x70: /* SR
| depends on ksr
*/
\r
set_sr(SLOT,v);
\r
break;
\r
\r
set_sr(SLOT,v);
\r
break;
\r
\r
- case 0x80: /* SL, RR */
\r
+ case 0x80: /* SL, RR
| depends on ksr
*/
\r
set_sl_rr(SLOT,v);
\r
break;
\r
\r
set_sl_rr(SLOT,v);
\r
break;
\r
\r
@@
-1502,10
+1517,10
@@
static int OPNWriteReg(int r, int v)
\r
case 0xa0:
\r
switch( OPN_SLOT(r) ){
\r
\r
case 0xa0:
\r
switch( OPN_SLOT(r) ){
\r
- case 0: /* 0xa0-0xa2 : FNUM1 */
\r
+ case 0: /* 0xa0-0xa2 : FNUM1
| depends on fn_h (below)
*/
\r
{
\r
{
\r
- UINT32 fn = (((UINT32)( (
ym2612.OPN.ST.
fn_h)&7))<<8) + v;
\r
- UINT8 blk =
ym2612.OPN.ST.
fn_h>>3;
\r
+ UINT32 fn = (((UINT32)( (
CH->
fn_h)&7))<<8) + v;
\r
+ UINT8 blk =
CH->
fn_h>>3;
\r
/* keyscale code */
\r
CH->kcode = (blk<<2) | opn_fktable[fn >> 7];
\r
/* phase increment counter */
\r
/* keyscale code */
\r
CH->kcode = (blk<<2) | opn_fktable[fn >> 7];
\r
/* phase increment counter */
\r
@@
-1518,7
+1533,7
@@
static int OPNWriteReg(int r, int v)
}
\r
break;
\r
case 1: /* 0xa4-0xa6 : FNUM2,BLK */
\r
}
\r
break;
\r
case 1: /* 0xa4-0xa6 : FNUM2,BLK */
\r
-
ym2612.OPN.ST.
fn_h = v&0x3f;
\r
+
CH->
fn_h = v&0x3f;
\r
ret = 0;
\r
break;
\r
case 2: /* 0xa8-0xaa : 3CH FNUM1 */
\r
ret = 0;
\r
break;
\r
case 2: /* 0xa8-0xaa : 3CH FNUM1 */
\r
@@
-1530,7
+1545,7
@@
static int OPNWriteReg(int r, int v)
ym2612.OPN.SL3.kcode[c]= (blk<<2) | opn_fktable[fn >> 7];
\r
/* phase increment counter */
\r
ym2612.OPN.SL3.fc[c] = fn_table[fn*2]>>(7-blk);
\r
ym2612.OPN.SL3.kcode[c]= (blk<<2) | opn_fktable[fn >> 7];
\r
/* phase increment counter */
\r
ym2612.OPN.SL3.fc[c] = fn_table[fn*2]>>(7-blk);
\r
- ym2612.OPN.SL3.block_fnum[c] = fn;
\r
+ ym2612.OPN.SL3.block_fnum[c] =
(blk<<11) |
fn;
\r
ym2612.CH[2].SLOT[SLOT1].Incr=-1;
\r
}
\r
break;
\r
ym2612.CH[2].SLOT[SLOT1].Incr=-1;
\r
}
\r
break;
\r
@@
-1618,16
+1633,10
@@
int YM2612UpdateOne_(int *buffer, int length, int stereo, int is_buf_empty)
refresh_fc_eg_chan( &ym2612.CH[0] );
\r
refresh_fc_eg_chan( &ym2612.CH[1] );
\r
if( (ym2612.OPN.ST.mode & 0xc0) )
\r
refresh_fc_eg_chan( &ym2612.CH[0] );
\r
refresh_fc_eg_chan( &ym2612.CH[1] );
\r
if( (ym2612.OPN.ST.mode & 0xc0) )
\r
- {
\r
/* 3SLOT MODE */
\r
/* 3SLOT MODE */
\r
- if( ym2612.CH[2].SLOT[SLOT1].Incr==-1)
\r
- {
\r
- refresh_fc_eg_slot(&ym2612.CH[2].SLOT[SLOT1], ym2612.OPN.SL3.fc[1], ym2612.OPN.SL3.kcode[1] );
\r
- refresh_fc_eg_slot(&ym2612.CH[2].SLOT[SLOT2], ym2612.OPN.SL3.fc[2], ym2612.OPN.SL3.kcode[2] );
\r
- refresh_fc_eg_slot(&ym2612.CH[2].SLOT[SLOT3], ym2612.OPN.SL3.fc[0], ym2612.OPN.SL3.kcode[0] );
\r
- refresh_fc_eg_slot(&ym2612.CH[2].SLOT[SLOT4], ym2612.CH[2].fc , ym2612.CH[2].kcode );
\r
- }
\r
- } else refresh_fc_eg_chan( &ym2612.CH[2] );
\r
+ refresh_fc_eg_chan_sl3();
\r
+ else
\r
+ refresh_fc_eg_chan( &ym2612.CH[2] );
\r
refresh_fc_eg_chan( &ym2612.CH[3] );
\r
refresh_fc_eg_chan( &ym2612.CH[4] );
\r
refresh_fc_eg_chan( &ym2612.CH[5] );
\r
refresh_fc_eg_chan( &ym2612.CH[3] );
\r
refresh_fc_eg_chan( &ym2612.CH[4] );
\r
refresh_fc_eg_chan( &ym2612.CH[5] );
\r
@@
-1770,11
+1779,11
@@
int YM2612Write_(unsigned int a, unsigned int v)
}
\r
ret=0;
\r
break;
\r
}
\r
ret=0;
\r
break;
\r
+#endif
\r
case 0x27: /* mode, timer control */
\r
set_timers( v );
\r
ret=0;
\r
break;
\r
case 0x27: /* mode, timer control */
\r
set_timers( v );
\r
ret=0;
\r
break;
\r
-#endif
\r
case 0x28: /* key on / off */
\r
{
\r
UINT8 c;
\r
case 0x28: /* key on / off */
\r
{
\r
UINT8 c;
\r
@@
-1788,7
+1797,6
@@
int YM2612Write_(unsigned int a, unsigned int v)
if(v&0x80) FM_KEYON(c,SLOT4); else FM_KEYOFF(c,SLOT4);
\r
break;
\r
}
\r
if(v&0x80) FM_KEYON(c,SLOT4); else FM_KEYOFF(c,SLOT4);
\r
break;
\r
}
\r
-#if 0
\r
case 0x2a: /* DAC data (YM2612) */
\r
ym2612.dacout = ((int)v - 0x80) << 6; /* level unknown (notaz: 8 seems to be too much) */
\r
ret=0;
\r
case 0x2a: /* DAC data (YM2612) */
\r
ym2612.dacout = ((int)v - 0x80) << 6; /* level unknown (notaz: 8 seems to be too much) */
\r
ret=0;
\r
@@
-1798,7
+1806,6
@@
int YM2612Write_(unsigned int a, unsigned int v)
ym2612.dacen = v & 0x80;
\r
ret=0;
\r
break;
\r
ym2612.dacen = v & 0x80;
\r
ret=0;
\r
break;
\r
-#endif
\r
default:
\r
break;
\r
}
\r
default:
\r
break;
\r
}
\r
@@
-1826,12
+1833,7
@@
int YM2612Write_(unsigned int a, unsigned int v)
ret = OPNWriteReg(addr, v);
\r
break;
\r
}
\r
ret = OPNWriteReg(addr, v);
\r
break;
\r
}
\r
-/*
\r
- if(ret) {
\r
- extern int Scanline;
\r
- dprintf("ymw [%i]", Scanline);
\r
- }
\r
-*/
\r
+
\r
return ret;
\r
}
\r
\r
return ret;
\r
}
\r
\r
@@
-1872,6
+1874,7
@@
void YM2612PicoStateLoad_(void)
ym2612.slot_mask = 0xffffff;
\r
}
\r
\r
ym2612.slot_mask = 0xffffff;
\r
}
\r
\r
+/* rather stupid design because I wanted to fit in unused register "space" */
\r
typedef struct
\r
{
\r
UINT32 state_phase;
\r
typedef struct
\r
{
\r
UINT32 state_phase;
\r
@@
-1887,20
+1890,35
@@
typedef struct
UINT8 unused;
\r
int TAT;
\r
int TBT;
\r
UINT8 unused;
\r
int TAT;
\r
int TBT;
\r
- UINT32 eg_cnt;
\r
+ UINT32 eg_cnt;
// 10
\r
UINT32 eg_timer;
\r
UINT32 lfo_cnt;
\r
UINT16 lfo_ampm;
\r
UINT16 unused2;
\r
UINT32 eg_timer;
\r
UINT32 lfo_cnt;
\r
UINT16 lfo_ampm;
\r
UINT16 unused2;
\r
+ UINT32 keyon_field; // 20
\r
+ UINT32 kcode_fc_sl3_3;
\r
+ UINT32 reserved[2];
\r
} ym_save_addon;
\r
\r
} ym_save_addon;
\r
\r
+typedef struct
\r
+{
\r
+ UINT16 block_fnum[6];
\r
+ UINT16 block_fnum_sl3[3];
\r
+ UINT16 reserved[7];
\r
+} ym_save_addon2;
\r
+
\r
+
\r
void YM2612PicoStateSave2(int tat, int tbt)
\r
{
\r
ym_save_addon_slot ss;
\r
void YM2612PicoStateSave2(int tat, int tbt)
\r
{
\r
ym_save_addon_slot ss;
\r
+ ym_save_addon2 sa2;
\r
ym_save_addon sa;
\r
unsigned char *ptr;
\r
int c, s;
\r
\r
ym_save_addon sa;
\r
unsigned char *ptr;
\r
int c, s;
\r
\r
+ memset(&sa, 0, sizeof(sa));
\r
+ memset(&sa2, 0, sizeof(sa2));
\r
+
\r
// chans 1,2,3
\r
ptr = &ym2612.REGS[0x0b8];
\r
for (c = 0; c < 3; c++)
\r
// chans 1,2,3
\r
ptr = &ym2612.REGS[0x0b8];
\r
for (c = 0; c < 3; c++)
\r
@@
-1908,9
+1926,12
@@
void YM2612PicoStateSave2(int tat, int tbt)
for (s = 0; s < 4; s++) {
\r
ss.state_phase = (ym2612.CH[c].SLOT[s].state << 29) | (ym2612.CH[c].SLOT[s].phase >> 3);
\r
ss.volume = ym2612.CH[c].SLOT[s].volume;
\r
for (s = 0; s < 4; s++) {
\r
ss.state_phase = (ym2612.CH[c].SLOT[s].state << 29) | (ym2612.CH[c].SLOT[s].phase >> 3);
\r
ss.volume = ym2612.CH[c].SLOT[s].volume;
\r
+ if (ym2612.CH[c].SLOT[s].key)
\r
+ sa.keyon_field |= 1 << (c*4 + s);
\r
memcpy(ptr, &ss, 6);
\r
ptr += 6;
\r
}
\r
memcpy(ptr, &ss, 6);
\r
ptr += 6;
\r
}
\r
+ sa2.block_fnum[c] = ym2612.CH[c].block_fnum;
\r
}
\r
// chans 4,5,6
\r
ptr = &ym2612.REGS[0x1b8];
\r
}
\r
// chans 4,5,6
\r
ptr = &ym2612.REGS[0x1b8];
\r
@@
-1919,38
+1940,52
@@
void YM2612PicoStateSave2(int tat, int tbt)
for (s = 0; s < 4; s++) {
\r
ss.state_phase = (ym2612.CH[c].SLOT[s].state << 29) | (ym2612.CH[c].SLOT[s].phase >> 3);
\r
ss.volume = ym2612.CH[c].SLOT[s].volume;
\r
for (s = 0; s < 4; s++) {
\r
ss.state_phase = (ym2612.CH[c].SLOT[s].state << 29) | (ym2612.CH[c].SLOT[s].phase >> 3);
\r
ss.volume = ym2612.CH[c].SLOT[s].volume;
\r
+ if (ym2612.CH[c].SLOT[s].key)
\r
+ sa.keyon_field |= 1 << (c*4 + s);
\r
memcpy(ptr, &ss, 6);
\r
ptr += 6;
\r
}
\r
memcpy(ptr, &ss, 6);
\r
ptr += 6;
\r
}
\r
+ sa2.block_fnum[c] = ym2612.CH[c].block_fnum;
\r
+ }
\r
+ for (c = 0; c < 3; c++)
\r
+ {
\r
+ sa2.block_fnum_sl3[c] = ym2612.OPN.SL3.block_fnum[c];
\r
}
\r
}
\r
+
\r
+ memcpy(&ym2612.REGS[0], &sa2, sizeof(sa2)); // 0x20 max
\r
+
\r
// other things
\r
ptr = &ym2612.REGS[0x100];
\r
sa.magic = 0x41534d59; // 'YMSA'
\r
sa.address = ym2612.OPN.ST.address;
\r
sa.status = ym2612.OPN.ST.status;
\r
sa.addr_A1 = ym2612.addr_A1;
\r
// other things
\r
ptr = &ym2612.REGS[0x100];
\r
sa.magic = 0x41534d59; // 'YMSA'
\r
sa.address = ym2612.OPN.ST.address;
\r
sa.status = ym2612.OPN.ST.status;
\r
sa.addr_A1 = ym2612.addr_A1;
\r
- sa.unused = 0;
\r
sa.TAT = tat;
\r
sa.TBT = tbt;
\r
sa.eg_cnt = ym2612.OPN.eg_cnt;
\r
sa.eg_timer = ym2612.OPN.eg_timer;
\r
sa.lfo_cnt = ym2612.OPN.lfo_cnt;
\r
sa.lfo_ampm = g_lfo_ampm;
\r
sa.TAT = tat;
\r
sa.TBT = tbt;
\r
sa.eg_cnt = ym2612.OPN.eg_cnt;
\r
sa.eg_timer = ym2612.OPN.eg_timer;
\r
sa.lfo_cnt = ym2612.OPN.lfo_cnt;
\r
sa.lfo_ampm = g_lfo_ampm;
\r
- sa.unused2 = 0;
\r
memcpy(ptr, &sa, sizeof(sa)); // 0x30 max
\r
}
\r
\r
int YM2612PicoStateLoad2(int *tat, int *tbt)
\r
{
\r
ym_save_addon_slot ss;
\r
memcpy(ptr, &sa, sizeof(sa)); // 0x30 max
\r
}
\r
\r
int YM2612PicoStateLoad2(int *tat, int *tbt)
\r
{
\r
ym_save_addon_slot ss;
\r
+ ym_save_addon2 sa2;
\r
ym_save_addon sa;
\r
unsigned char *ptr;
\r
ym_save_addon sa;
\r
unsigned char *ptr;
\r
+ UINT32 fn;
\r
+ UINT8 blk;
\r
int c, s;
\r
\r
ptr = &ym2612.REGS[0x100];
\r
memcpy(&sa, ptr, sizeof(sa)); // 0x30 max
\r
if (sa.magic != 0x41534d59) return -1;
\r
\r
int c, s;
\r
\r
ptr = &ym2612.REGS[0x100];
\r
memcpy(&sa, ptr, sizeof(sa)); // 0x30 max
\r
if (sa.magic != 0x41534d59) return -1;
\r
\r
+ ptr = &ym2612.REGS[0];
\r
+ memcpy(&sa2, ptr, sizeof(sa2));
\r
+
\r
ym2612.OPN.ST.address = sa.address;
\r
ym2612.OPN.ST.status = sa.status;
\r
ym2612.addr_A1 = sa.addr_A1;
\r
ym2612.OPN.ST.address = sa.address;
\r
ym2612.OPN.ST.status = sa.status;
\r
ym2612.addr_A1 = sa.addr_A1;
\r
@@
-1970,8
+2005,16
@@
int YM2612PicoStateLoad2(int *tat, int *tbt)
ym2612.CH[c].SLOT[s].state = ss.state_phase >> 29;
\r
ym2612.CH[c].SLOT[s].phase = ss.state_phase << 3;
\r
ym2612.CH[c].SLOT[s].volume = ss.volume;
\r
ym2612.CH[c].SLOT[s].state = ss.state_phase >> 29;
\r
ym2612.CH[c].SLOT[s].phase = ss.state_phase << 3;
\r
ym2612.CH[c].SLOT[s].volume = ss.volume;
\r
+ ym2612.CH[c].SLOT[s].key = (sa.keyon_field & (1 << (c*4 + s))) ? 1 : 0;
\r
+ ym2612.CH[c].SLOT[s].ksr = (UINT8)-1;
\r
ptr += 6;
\r
}
\r
ptr += 6;
\r
}
\r
+ ym2612.CH[c].SLOT[SLOT1].Incr=-1;
\r
+ ym2612.CH[c].block_fnum = sa2.block_fnum[c];
\r
+ fn = ym2612.CH[c].block_fnum & 0x7ff;
\r
+ blk = ym2612.CH[c].block_fnum >> 11;
\r
+ ym2612.CH[c].kcode= (blk<<2) | opn_fktable[fn >> 7];
\r
+ ym2612.CH[c].fc = fn_table[fn*2]>>(7-blk);
\r
}
\r
// chans 4,5,6
\r
ptr = &ym2612.REGS[0x1b8];
\r
}
\r
// chans 4,5,6
\r
ptr = &ym2612.REGS[0x1b8];
\r
@@
-1982,8
+2025,24
@@
int YM2612PicoStateLoad2(int *tat, int *tbt)
ym2612.CH[c].SLOT[s].state = ss.state_phase >> 29;
\r
ym2612.CH[c].SLOT[s].phase = ss.state_phase << 3;
\r
ym2612.CH[c].SLOT[s].volume = ss.volume;
\r
ym2612.CH[c].SLOT[s].state = ss.state_phase >> 29;
\r
ym2612.CH[c].SLOT[s].phase = ss.state_phase << 3;
\r
ym2612.CH[c].SLOT[s].volume = ss.volume;
\r
+ ym2612.CH[c].SLOT[s].key = (sa.keyon_field & (1 << (c*4 + s))) ? 1 : 0;
\r
+ ym2612.CH[c].SLOT[s].ksr = (UINT8)-1;
\r
ptr += 6;
\r
}
\r
ptr += 6;
\r
}
\r
+ ym2612.CH[c].SLOT[SLOT1].Incr=-1;
\r
+ ym2612.CH[c].block_fnum = sa2.block_fnum[c];
\r
+ fn = ym2612.CH[c].block_fnum & 0x7ff;
\r
+ blk = ym2612.CH[c].block_fnum >> 11;
\r
+ ym2612.CH[c].kcode= (blk<<2) | opn_fktable[fn >> 7];
\r
+ ym2612.CH[c].fc = fn_table[fn*2]>>(7-blk);
\r
+ }
\r
+ for (c = 0; c < 3; c++)
\r
+ {
\r
+ ym2612.OPN.SL3.block_fnum[c] = sa2.block_fnum_sl3[c];
\r
+ fn = ym2612.OPN.SL3.block_fnum[c] & 0x7ff;
\r
+ blk = ym2612.OPN.SL3.block_fnum[c] >> 11;
\r
+ ym2612.OPN.SL3.kcode[c]= (blk<<2) | opn_fktable[fn >> 7];
\r
+ ym2612.OPN.SL3.fc[c] = fn_table[fn*2]>>(7-blk);
\r
}
\r
\r
return 0;
\r
}
\r
\r
return 0;
\r