MAME: FM小小unsafe缓存

This commit is contained in:
sin365 2025-11-12 00:25:19 +08:00
parent 909d1b35f1
commit ec292251e0

View File

@ -617,18 +617,20 @@ namespace MAME.Core
//} //}
//手动内联 //手动内联
public void chan_calc(int c, int chnum) public unsafe void chan_calc(int c, int chnum)
{ {
uint eg_out; uint eg_out;
out_fm[8] = out_fm[9] = out_fm[10] = out_fm[11] = 0;//m2 = c1 = c2 = mem = 0;
//减少寻址 //减少寻址
int imem_To_c = imem[c];// int imem_To_c = imem[c];//
FM_SLOT[] CH_c_SLOT = CH[c].SLOT;//因为是引用类型,所以敢这么玩 fixed (FM_SLOT* CH_c_SLOT = &CH[c].SLOT[0])//因为是引用类型,所以敢这么玩
fixed (int* out_fm_ptr = &out_fm[0])
{
//out_fm[8] = out_fm[9] = out_fm[10] = out_fm[11] = 0; //本来就是注释->m2 = c1 = c2 = mem = 0;
out_fm_ptr[8] = out_fm_ptr[9] = out_fm_ptr[10] = out_fm_ptr[11] = 0;
//set_mem(c); //set_mem(c);
if (imem_To_c == 8 || imem_To_c == 10 || imem_To_c == 11) if (imem_To_c == 8 || imem_To_c == 10 || imem_To_c == 11)
out_fm[imem_To_c] = CH[c].mem_value; out_fm_ptr[imem_To_c] = CH[c].mem_value;
//eg_out = volume_calc(c, 0); //eg_out = volume_calc(c, 0);
eg_out = (uint)(CH_c_SLOT[0].vol_out + ((LFO_AM >> CH[c].ams) & CH_c_SLOT[0].AMmask)); eg_out = (uint)(CH_c_SLOT[0].vol_out + ((LFO_AM >> CH[c].ams) & CH_c_SLOT[0].AMmask));
@ -639,11 +641,11 @@ namespace MAME.Core
//set_value1(c); //set_value1(c);
if (iconnect1[c] == 12) if (iconnect1[c] == 12)
{ {
out_fm[11] = out_fm[9] = out_fm[10] = CH[c].op1_out0; out_fm_ptr[11] = out_fm_ptr[9] = out_fm_ptr[10] = CH[c].op1_out0;
} }
else else
{ {
out_fm[iconnect1[c]] = CH[c].op1_out0; out_fm_ptr[iconnect1[c]] = CH[c].op1_out0;
} }
CH[c].op1_out1 = 0; CH[c].op1_out1 = 0;
@ -659,21 +661,21 @@ namespace MAME.Core
eg_out = (uint)(CH_c_SLOT[1].vol_out + ((LFO_AM >> CH[c].ams) & CH_c_SLOT[1].AMmask)); eg_out = (uint)(CH_c_SLOT[1].vol_out + ((LFO_AM >> CH[c].ams) & CH_c_SLOT[1].AMmask));
if (eg_out < 832) if (eg_out < 832)
{ {
out_fm[iconnect3[c]] += op_calc(CH_c_SLOT[1].phase, eg_out, out_fm[8]); out_fm_ptr[iconnect3[c]] += op_calc(CH_c_SLOT[1].phase, eg_out, out_fm_ptr[8]);
} }
//eg_out = volume_calc(c, 2); //eg_out = volume_calc(c, 2);
eg_out = (uint)(CH_c_SLOT[2].vol_out + ((LFO_AM >> CH[c].ams) & CH_c_SLOT[2].AMmask)); eg_out = (uint)(CH_c_SLOT[2].vol_out + ((LFO_AM >> CH[c].ams) & CH_c_SLOT[2].AMmask));
if (eg_out < 832) if (eg_out < 832)
{ {
out_fm[iconnect2[c]] += op_calc(CH_c_SLOT[2].phase, eg_out, out_fm[9]); out_fm_ptr[iconnect2[c]] += op_calc(CH_c_SLOT[2].phase, eg_out, out_fm_ptr[9]);
} }
//eg_out = volume_calc(c, 3); //eg_out = volume_calc(c, 3);
eg_out = (uint)(CH_c_SLOT[3].vol_out + ((LFO_AM >> CH[c].ams) & CH_c_SLOT[3].AMmask)); eg_out = (uint)(CH_c_SLOT[3].vol_out + ((LFO_AM >> CH[c].ams) & CH_c_SLOT[3].AMmask));
if (eg_out < 832) if (eg_out < 832)
{ {
out_fm[iconnect4[c]] += op_calc(CH_c_SLOT[3].phase, eg_out, out_fm[10]); out_fm_ptr[iconnect4[c]] += op_calc(CH_c_SLOT[3].phase, eg_out, out_fm[10]);
} }
CH[c].mem_value = out_fm[11];//mem; CH[c].mem_value = out_fm_ptr[11];//mem;
if (CH[c].pms != 0) if (CH[c].pms != 0)
{ {
if (((ST.mode & 0xC0) != 0) && (chnum == 2)) if (((ST.mode & 0xC0) != 0) && (chnum == 2))
@ -696,6 +698,7 @@ namespace MAME.Core
CH_c_SLOT[3].phase += (uint)CH_c_SLOT[3].Incr; CH_c_SLOT[3].phase += (uint)CH_c_SLOT[3].Incr;
} }
} }
}
public void refresh_fc_eg_slot(int type, int c, int s, int fc, int kc) public void refresh_fc_eg_slot(int type, int c, int s, int fc, int kc)
{ {
int ksr = kc >> CH[c].SLOT[s].KSR; int ksr = kc >> CH[c].SLOT[s].KSR;