20 #ifndef RESID_FILTER_H
21 #define RESID_FILTER_H
23 #include "resid-config.h"
496 enum { value = summer_offset<i - 1>::value + ((2 + i - 1) << 16) };
500 struct summer_offset<0>
509 enum { value = mixer_offset<i - 1>::value + ((i - 1) << 16) };
513 struct mixer_offset<1>
519 struct mixer_offset<0>
530 void enable_filter(
bool enable);
531 void adjust_filter_bias(
double dac_bias);
532 void set_chip_model(chip_model model);
533 void set_voice_mask(reg4 mask);
535 void clock(
int voice1,
int voice2,
int voice3);
536 void clock(cycle_count delta_t,
int voice1,
int voice2,
int voice3);
540 void writeFC_LO(reg8);
541 void writeFC_HI(reg8);
542 void writeRES_FILT(reg8);
543 void writeMODE_VOL(reg8);
546 void input(
short sample);
595 chip_model sid_model;
613 unsigned short opamp_rev[1 << 16];
615 unsigned short summer[summer_offset<5>::value];
616 unsigned short gain[16][1 << 16];
617 unsigned short mixer[mixer_offset<8>::value];
619 unsigned short f0_dac[1 << 11];
624 int Vddt_Vw_2, Vw_bias;
638 static unsigned short resonance[16][1 << 16];
640 int solve_gain(opamp_t* opamp,
int n,
int vi_t,
int& x, model_filter_t& mf);
641 int solve_integrate_6581(
int dt,
int vi_t,
int& x,
int& vc, model_filter_t& mf);
642 int solve_integrate_8580(
int dt,
int vi_t,
int& x,
int& vc, model_filter_t& mf);
645 static unsigned short vcr_kVg[1 << 16];
646 static unsigned short vcr_n_Ids_term[1 << 16];
648 static model_filter_t model_filter[2];
660 #if RESID_INLINING || defined(RESID_FILTER_CC)
666 void Filter::clock(
int voice1,
int voice2,
int voice3)
668 model_filter_t& f = model_filter[sid_model];
670 v1 = (voice1*f.voice_scale_s14 >> 18) + f.voice_DC;
671 v2 = (voice2*f.voice_scale_s14 >> 18) + f.voice_DC;
672 v3 = (voice3*f.voice_scale_s14 >> 18) + f.voice_DC;
681 offset = summer_offset<0>::value;
685 offset = summer_offset<1>::value;
689 offset = summer_offset<1>::value;
693 offset = summer_offset<2>::value;
697 offset = summer_offset<1>::value;
701 offset = summer_offset<2>::value;
705 offset = summer_offset<2>::value;
709 offset = summer_offset<3>::value;
713 offset = summer_offset<1>::value;
717 offset = summer_offset<2>::value;
721 offset = summer_offset<2>::value;
725 offset = summer_offset<3>::value;
729 offset = summer_offset<2>::value;
733 offset = summer_offset<3>::value;
737 offset = summer_offset<3>::value;
740 Vi = ve + v3 + v2 + v1;
741 offset = summer_offset<4>::value;
746 if (sid_model == 0) {
748 Vlp = solve_integrate_6581(1, Vbp, Vlp_x, Vlp_vc, f);
749 Vbp = solve_integrate_6581(1, Vhp, Vbp_x, Vbp_vc, f);
750 Vhp = f.summer[offset + f.gain[_8_div_Q][Vbp] + Vlp + Vi];
754 Vlp = solve_integrate_8580(1, Vbp, Vlp_x, Vlp_vc, f);
755 Vbp = solve_integrate_8580(1, Vhp, Vbp_x, Vbp_vc, f);
756 Vhp = f.summer[offset + resonance[res][Vbp] + Vlp + Vi];
764 void Filter::clock(cycle_count delta_t,
int voice1,
int voice2,
int voice3)
766 model_filter_t& f = model_filter[sid_model];
768 v1 = (voice1*f.voice_scale_s14 >> 18) + f.voice_DC;
769 v2 = (voice2*f.voice_scale_s14 >> 18) + f.voice_DC;
770 v3 = (voice3*f.voice_scale_s14 >> 18) + f.voice_DC;
776 if (unlikely(!enabled)) {
787 offset = summer_offset<0>::value;
791 offset = summer_offset<1>::value;
795 offset = summer_offset<1>::value;
799 offset = summer_offset<2>::value;
803 offset = summer_offset<1>::value;
807 offset = summer_offset<2>::value;
811 offset = summer_offset<2>::value;
815 offset = summer_offset<3>::value;
819 offset = summer_offset<1>::value;
823 offset = summer_offset<2>::value;
827 offset = summer_offset<2>::value;
831 offset = summer_offset<3>::value;
835 offset = summer_offset<2>::value;
839 offset = summer_offset<3>::value;
843 offset = summer_offset<3>::value;
846 Vi = ve + v3 + v2 + v1;
847 offset = summer_offset<4>::value;
853 cycle_count delta_t_flt = 3;
855 if (sid_model == 0) {
858 if (unlikely(delta_t < delta_t_flt)) {
859 delta_t_flt = delta_t;
863 Vlp = solve_integrate_6581(delta_t_flt, Vbp, Vlp_x, Vlp_vc, f);
864 Vbp = solve_integrate_6581(delta_t_flt, Vhp, Vbp_x, Vbp_vc, f);
865 Vhp = f.summer[offset + f.gain[_8_div_Q][Vbp] + Vlp + Vi];
867 delta_t -= delta_t_flt;
873 if (unlikely(delta_t < delta_t_flt)) {
874 delta_t_flt = delta_t;
878 Vlp = solve_integrate_8580(delta_t_flt, Vbp, Vlp_x, Vlp_vc, f);
879 Vbp = solve_integrate_8580(delta_t_flt, Vhp, Vbp_x, Vbp_vc, f);
880 Vhp = f.summer[offset + resonance[res][Vbp] + Vlp + Vi];
882 delta_t -= delta_t_flt;
892 void Filter::input(
short sample)
903 model_filter_t& f = model_filter[sid_model];
904 ve = (sample*f.voice_scale_s14*3 >> 14) + f.mixer[0];
912 short Filter::output()
914 model_filter_t& f = model_filter[sid_model];
939 switch (mix & 0x7f) {
942 offset = mixer_offset<0>::value;
946 offset = mixer_offset<1>::value;
950 offset = mixer_offset<1>::value;
954 offset = mixer_offset<2>::value;
958 offset = mixer_offset<1>::value;
962 offset = mixer_offset<2>::value;
966 offset = mixer_offset<2>::value;
970 offset = mixer_offset<3>::value;
974 offset = mixer_offset<1>::value;
978 offset = mixer_offset<2>::value;
982 offset = mixer_offset<2>::value;
986 offset = mixer_offset<3>::value;
990 offset = mixer_offset<2>::value;
994 offset = mixer_offset<3>::value;
998 offset = mixer_offset<3>::value;
1001 Vi = ve + v3 + v2 + v1;
1002 offset = mixer_offset<4>::value;
1006 offset = mixer_offset<1>::value;
1010 offset = mixer_offset<2>::value;
1014 offset = mixer_offset<2>::value;
1018 offset = mixer_offset<3>::value;
1022 offset = mixer_offset<2>::value;
1026 offset = mixer_offset<3>::value;
1030 offset = mixer_offset<3>::value;
1033 Vi = Vlp + v3 + v2 + v1;
1034 offset = mixer_offset<4>::value;
1038 offset = mixer_offset<2>::value;
1042 offset = mixer_offset<3>::value;
1046 offset = mixer_offset<3>::value;
1049 Vi = Vlp + ve + v2 + v1;
1050 offset = mixer_offset<4>::value;
1054 offset = mixer_offset<3>::value;
1057 Vi = Vlp + ve + v3 + v1;
1058 offset = mixer_offset<4>::value;
1061 Vi = Vlp + ve + v3 + v2;
1062 offset = mixer_offset<4>::value;
1065 Vi = Vlp + ve + v3 + v2 + v1;
1066 offset = mixer_offset<5>::value;
1070 offset = mixer_offset<1>::value;
1074 offset = mixer_offset<2>::value;
1078 offset = mixer_offset<2>::value;
1082 offset = mixer_offset<3>::value;
1086 offset = mixer_offset<2>::value;
1090 offset = mixer_offset<3>::value;
1094 offset = mixer_offset<3>::value;
1097 Vi = Vbp + v3 + v2 + v1;
1098 offset = mixer_offset<4>::value;
1102 offset = mixer_offset<2>::value;
1106 offset = mixer_offset<3>::value;
1110 offset = mixer_offset<3>::value;
1113 Vi = Vbp + ve + v2 + v1;
1114 offset = mixer_offset<4>::value;
1118 offset = mixer_offset<3>::value;
1121 Vi = Vbp + ve + v3 + v1;
1122 offset = mixer_offset<4>::value;
1125 Vi = Vbp + ve + v3 + v2;
1126 offset = mixer_offset<4>::value;
1129 Vi = Vbp + ve + v3 + v2 + v1;
1130 offset = mixer_offset<5>::value;
1134 offset = mixer_offset<2>::value;
1137 Vi = Vbp + Vlp + v1;
1138 offset = mixer_offset<3>::value;
1141 Vi = Vbp + Vlp + v2;
1142 offset = mixer_offset<3>::value;
1145 Vi = Vbp + Vlp + v2 + v1;
1146 offset = mixer_offset<4>::value;
1149 Vi = Vbp + Vlp + v3;
1150 offset = mixer_offset<3>::value;
1153 Vi = Vbp + Vlp + v3 + v1;
1154 offset = mixer_offset<4>::value;
1157 Vi = Vbp + Vlp + v3 + v2;
1158 offset = mixer_offset<4>::value;
1161 Vi = Vbp + Vlp + v3 + v2 + v1;
1162 offset = mixer_offset<5>::value;
1165 Vi = Vbp + Vlp + ve;
1166 offset = mixer_offset<3>::value;
1169 Vi = Vbp + Vlp + ve + v1;
1170 offset = mixer_offset<4>::value;
1173 Vi = Vbp + Vlp + ve + v2;
1174 offset = mixer_offset<4>::value;
1177 Vi = Vbp + Vlp + ve + v2 + v1;
1178 offset = mixer_offset<5>::value;
1181 Vi = Vbp + Vlp + ve + v3;
1182 offset = mixer_offset<4>::value;
1185 Vi = Vbp + Vlp + ve + v3 + v1;
1186 offset = mixer_offset<5>::value;
1189 Vi = Vbp + Vlp + ve + v3 + v2;
1190 offset = mixer_offset<5>::value;
1193 Vi = Vbp + Vlp + ve + v3 + v2 + v1;
1194 offset = mixer_offset<6>::value;
1198 offset = mixer_offset<1>::value;
1202 offset = mixer_offset<2>::value;
1206 offset = mixer_offset<2>::value;
1210 offset = mixer_offset<3>::value;
1214 offset = mixer_offset<2>::value;
1218 offset = mixer_offset<3>::value;
1222 offset = mixer_offset<3>::value;
1225 Vi = Vhp + v3 + v2 + v1;
1226 offset = mixer_offset<4>::value;
1230 offset = mixer_offset<2>::value;
1234 offset = mixer_offset<3>::value;
1238 offset = mixer_offset<3>::value;
1241 Vi = Vhp + ve + v2 + v1;
1242 offset = mixer_offset<4>::value;
1246 offset = mixer_offset<3>::value;
1249 Vi = Vhp + ve + v3 + v1;
1250 offset = mixer_offset<4>::value;
1253 Vi = Vhp + ve + v3 + v2;
1254 offset = mixer_offset<4>::value;
1257 Vi = Vhp + ve + v3 + v2 + v1;
1258 offset = mixer_offset<5>::value;
1262 offset = mixer_offset<2>::value;
1265 Vi = Vhp + Vlp + v1;
1266 offset = mixer_offset<3>::value;
1269 Vi = Vhp + Vlp + v2;
1270 offset = mixer_offset<3>::value;
1273 Vi = Vhp + Vlp + v2 + v1;
1274 offset = mixer_offset<4>::value;
1277 Vi = Vhp + Vlp + v3;
1278 offset = mixer_offset<3>::value;
1281 Vi = Vhp + Vlp + v3 + v1;
1282 offset = mixer_offset<4>::value;
1285 Vi = Vhp + Vlp + v3 + v2;
1286 offset = mixer_offset<4>::value;
1289 Vi = Vhp + Vlp + v3 + v2 + v1;
1290 offset = mixer_offset<5>::value;
1293 Vi = Vhp + Vlp + ve;
1294 offset = mixer_offset<3>::value;
1297 Vi = Vhp + Vlp + ve + v1;
1298 offset = mixer_offset<4>::value;
1301 Vi = Vhp + Vlp + ve + v2;
1302 offset = mixer_offset<4>::value;
1305 Vi = Vhp + Vlp + ve + v2 + v1;
1306 offset = mixer_offset<5>::value;
1309 Vi = Vhp + Vlp + ve + v3;
1310 offset = mixer_offset<4>::value;
1313 Vi = Vhp + Vlp + ve + v3 + v1;
1314 offset = mixer_offset<5>::value;
1317 Vi = Vhp + Vlp + ve + v3 + v2;
1318 offset = mixer_offset<5>::value;
1321 Vi = Vhp + Vlp + ve + v3 + v2 + v1;
1322 offset = mixer_offset<6>::value;
1326 offset = mixer_offset<2>::value;
1329 Vi = Vhp + Vbp + v1;
1330 offset = mixer_offset<3>::value;
1333 Vi = Vhp + Vbp + v2;
1334 offset = mixer_offset<3>::value;
1337 Vi = Vhp + Vbp + v2 + v1;
1338 offset = mixer_offset<4>::value;
1341 Vi = Vhp + Vbp + v3;
1342 offset = mixer_offset<3>::value;
1345 Vi = Vhp + Vbp + v3 + v1;
1346 offset = mixer_offset<4>::value;
1349 Vi = Vhp + Vbp + v3 + v2;
1350 offset = mixer_offset<4>::value;
1353 Vi = Vhp + Vbp + v3 + v2 + v1;
1354 offset = mixer_offset<5>::value;
1357 Vi = Vhp + Vbp + ve;
1358 offset = mixer_offset<3>::value;
1361 Vi = Vhp + Vbp + ve + v1;
1362 offset = mixer_offset<4>::value;
1365 Vi = Vhp + Vbp + ve + v2;
1366 offset = mixer_offset<4>::value;
1369 Vi = Vhp + Vbp + ve + v2 + v1;
1370 offset = mixer_offset<5>::value;
1373 Vi = Vhp + Vbp + ve + v3;
1374 offset = mixer_offset<4>::value;
1377 Vi = Vhp + Vbp + ve + v3 + v1;
1378 offset = mixer_offset<5>::value;
1381 Vi = Vhp + Vbp + ve + v3 + v2;
1382 offset = mixer_offset<5>::value;
1385 Vi = Vhp + Vbp + ve + v3 + v2 + v1;
1386 offset = mixer_offset<6>::value;
1389 Vi = Vhp + Vbp + Vlp;
1390 offset = mixer_offset<3>::value;
1393 Vi = Vhp + Vbp + Vlp + v1;
1394 offset = mixer_offset<4>::value;
1397 Vi = Vhp + Vbp + Vlp + v2;
1398 offset = mixer_offset<4>::value;
1401 Vi = Vhp + Vbp + Vlp + v2 + v1;
1402 offset = mixer_offset<5>::value;
1405 Vi = Vhp + Vbp + Vlp + v3;
1406 offset = mixer_offset<4>::value;
1409 Vi = Vhp + Vbp + Vlp + v3 + v1;
1410 offset = mixer_offset<5>::value;
1413 Vi = Vhp + Vbp + Vlp + v3 + v2;
1414 offset = mixer_offset<5>::value;
1417 Vi = Vhp + Vbp + Vlp + v3 + v2 + v1;
1418 offset = mixer_offset<6>::value;
1421 Vi = Vhp + Vbp + Vlp + ve;
1422 offset = mixer_offset<4>::value;
1425 Vi = Vhp + Vbp + Vlp + ve + v1;
1426 offset = mixer_offset<5>::value;
1429 Vi = Vhp + Vbp + Vlp + ve + v2;
1430 offset = mixer_offset<5>::value;
1433 Vi = Vhp + Vbp + Vlp + ve + v2 + v1;
1434 offset = mixer_offset<6>::value;
1437 Vi = Vhp + Vbp + Vlp + ve + v3;
1438 offset = mixer_offset<5>::value;
1441 Vi = Vhp + Vbp + Vlp + ve + v3 + v1;
1442 offset = mixer_offset<6>::value;
1445 Vi = Vhp + Vbp + Vlp + ve + v3 + v2;
1446 offset = mixer_offset<6>::value;
1449 Vi = Vhp + Vbp + Vlp + ve + v3 + v2 + v1;
1450 offset = mixer_offset<7>::value;
1455 return (
short)(f.gain[vol][f.mixer[offset + Vi]] - (1 << 15));
1498 int Filter::solve_gain(opamp_t* opamp,
int n,
int vi,
int& x, model_filter_t& mf)
1507 int ak = mf.ak, bk = mf.bk;
1509 int a = n + (1 << 7);
1512 if (b_vi < 0) b_vi = 0;
1513 int c = n*int(
unsigned(b_vi)*
unsigned(b_vi) >> 12);
1519 int vx = opamp[x].vx;
1520 int dvx = opamp[x].dvx;
1525 int vo = vx + (x << 1) - (1 << 16);
1526 if (vo >= (1 << 16)) {
1533 if (b_vx < 0) b_vx = 0;
1535 if (b_vo < 0) b_vo = 0;
1537 int f = a*int(
unsigned(b_vx)*
unsigned(b_vx) >> 12) - c - int(
unsigned(b_vo)*
unsigned(b_vo) >> 5);
1539 int df = (b_vo*(dvx + (1 << 11)) - a*(b_vx*dvx >> 7)) >> 15;
1547 if (unlikely(x == xk)) {
1562 if (unlikely(x <= ak) || unlikely(x >= bk)) {
1565 if (unlikely(x == ak)) {
1694 int Filter::solve_integrate_6581(
int dt,
int vi,
int& vx,
int& vc, model_filter_t& mf)
1701 int kVddt = mf.kVddt;
1704 unsigned int Vgst = kVddt - vx;
1705 unsigned int Vgdt = kVddt - vi;
1706 unsigned int Vgdt_2 = Vgdt*Vgdt;
1709 int n_I_snake = n_snake*(int(Vgst*Vgst - Vgdt_2) >> 15);
1713 int kVg = vcr_kVg[(Vddt_Vw_2 + (Vgdt_2 >> 1)) >> 16];
1717 if (Vgs < 0) Vgs = 0;
1719 if (Vgd < 0) Vgd = 0;
1722 int n_I_vcr = int(
unsigned(vcr_n_Ids_term[Vgs] - vcr_n_Ids_term[Vgd]) << 15);
1725 vc -= (n_I_snake + n_I_vcr)*dt;
1738 vx = mf.opamp_rev[(vc >> 15) + (1 << 15)];
1741 return vx + (vc >> 14);
1764 int Filter::solve_integrate_8580(
int dt,
int vi,
int& vx,
int& vc, model_filter_t& mf)
1772 unsigned int Vgst = kVgt - vx;
1773 unsigned int Vgdt = (vi < kVgt) ? kVgt - vi : 0;
1776 int n_I_rfc = n_dac*(int(Vgst*Vgst - Vgdt*Vgdt) >> 15);
1782 vx = mf.opamp_rev[(vc >> 15) + (1 << 15)];
1785 return vx + (vc >> 14);
1788 #endif // RESID_INLINING || defined(RESID_FILTER_CC)
1792 #endif // not RESID_FILTER_H