セガサターンのエミュレーターを語ろう 6

このエントリーをはてなブックマークに追加
189名無しさん@お腹いっぱい。
mAPF1 = *((ushort *) 0x1F801DC0) * 4;
mAPF2 = *((ushort *) 0x1F801DC2) * 4;
gIIR = *((short *) 0x1F801DC4) / 32768.0;
gCOMB1 = *((short *) 0x1F801DC6) / 32768.0;
gCOMB2 = *((short *) 0x1F801DC8) / 32768.0;
gCOMB3 = *((short *) 0x1F801DCA) / 32768.0;
gCOMB4 = *((short *) 0x1F801DCC) / 32768.0;
gWALL = *((short *) 0x1F801DCE) / 32768.0;
gAPF1 = *((short *) 0x1F801DD0) / 32768.0;
gAPF2 = *((short *) 0x1F801DD2) / 32768.0;
z0_Lsame = *((ushort *) 0x1F801DD4) * 4;
z0_Rsame = *((ushort *) 0x1F801DD6) * 4;
m1_Lcomb = *((ushort *) 0x1F801DD8) * 4;
m1_Rcomb = *((ushort *) 0x1F801DDA) * 4;
m2_Lcomb = *((ushort *) 0x1F801DDC) * 4;
m2_Rcomb = *((ushort *) 0x1F801DDE) * 4;
zm_Lsame = *((ushort *) 0x1F801DE0) * 4;
zm_Rsame = *((ushort *) 0x1F801DE2) * 4;
z0_Ldiff = *((ushort *) 0x1F801DE4) * 4;
z0_Rdiff = *((ushort *) 0x1F801DE6) * 4;
m3_Lcomb = *((ushort *) 0x1F801DE8) * 4;
m3_Rcomb = *((ushort *) 0x1F801DEA) * 4;
m4_Lcomb = *((ushort *) 0x1F801DEC) * 4;
m4_Rcomb = *((ushort *) 0x1F801DEE) * 4;
zm_Ldiff = *((ushort *) 0x1F801DF0) * 4;
zm_Rdiff = *((ushort *) 0x1F801DF2) * 4;
z0_Lapf1 = *((ushort *) 0x1F801DF4) * 4;
z0_Rapf1 = *((ushort *) 0x1F801DF6) * 4;
z0_Lapf2 = *((ushort *) 0x1F801DF8) * 4;
z0_Rapf2 = *((ushort *) 0x1F801DFA) * 4;
gLIN = *((short *) 0x1F801DFC) / 32768.0;
gRIN = *((short *) 0x1F801DFE) / 32768.0;
z1_Lsame = z0_Lsame - 1;
z1_Rsame = z0_Rsame - 1;
z1_Ldiff = z0_Ldiff - 1;
z1_Rdiff = z0_Rdiff - 1;
zm_Lapf1 = z0_Lapf1 - mAPF1;
zm_Rapf1 = z0_Rapf1 - mAPF1;
zm_Lapf2 = z0_Lapf2 - mAPF2;
zm_Rapf2 = z0_Rapf2 - mAPF2;
for (;;) {
/*
* LoadFromLowPassFilterは35もしくは39タップのFIRフィルタ
* 最外周の係数が0でも結果は同じなので、35か39かは特定できず
*/
L_in = gLIN * LoadFromLowPassFilterL();
R_in = gRIN * LoadFromLowPassFilterR();

/* Left -> Wall -> Left Reflection */
L_temp = ReadReverbWork(zm_Lsame);
R_temp = ReadReverbWork(zm_Rsame);
L_same = L_in + gWALL * L_temp;
R_same = R_in + gWALL * R_temp;