23#include "resid-config.h"
496 enum { value = summer_offset<i - 1>::value + ((2 + i - 1) << 16) };
500struct summer_offset<0>
509 enum { value = mixer_offset<i - 1>::value + ((i - 1) << 16) };
513struct mixer_offset<1>
519struct 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);
594 chip_model sid_model;
612 unsigned short opamp_rev[1 << 16];
614 unsigned short summer[summer_offset<5>::value];
615 unsigned short gain[16][1 << 16];
616 unsigned short resonance[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;
637 int solve_gain_d(opamp_t* opamp,
double n,
int vi_t,
int& x, model_filter_t& mf);
638 int solve_integrate_6581(
int dt,
int vi_t,
int& x,
int& vc, model_filter_t& mf);
639 int solve_integrate_8580(
int dt,
int vi_t,
int& x,
int& vc, model_filter_t& mf);
642 static unsigned short vcr_kVg[1 << 16];
643 static unsigned short vcr_n_Ids_term[1 << 16];
645 static model_filter_t model_filter[2];
657#if RESID_INLINING || defined(RESID_FILTER_CC)
663void Filter::clock(
int voice1,
int voice2,
int voice3)
665 model_filter_t& f = model_filter[sid_model];
667 v1 = (voice1*f.voice_scale_s14 >> 18) + f.voice_DC;
668 v2 = (voice2*f.voice_scale_s14 >> 18) + f.voice_DC;
669 v3 = (voice3*f.voice_scale_s14 >> 18) + f.voice_DC;
678 offset = summer_offset<0>::value;
682 offset = summer_offset<1>::value;
686 offset = summer_offset<1>::value;
690 offset = summer_offset<2>::value;
694 offset = summer_offset<1>::value;
698 offset = summer_offset<2>::value;
702 offset = summer_offset<2>::value;
706 offset = summer_offset<3>::value;
710 offset = summer_offset<1>::value;
714 offset = summer_offset<2>::value;
718 offset = summer_offset<2>::value;
722 offset = summer_offset<3>::value;
726 offset = summer_offset<2>::value;
730 offset = summer_offset<3>::value;
734 offset = summer_offset<3>::value;
737 Vi = ve + v3 + v2 + v1;
738 offset = summer_offset<4>::value;
743 if (sid_model == 0) {
745 Vlp = solve_integrate_6581(1, Vbp, Vlp_x, Vlp_vc, f);
746 Vbp = solve_integrate_6581(1, Vhp, Vbp_x, Vbp_vc, f);
747 Vhp = f.summer[offset + f.resonance[res][Vbp] + Vlp + Vi];
751 Vlp = solve_integrate_8580(1, Vbp, Vlp_x, Vlp_vc, f);
752 Vbp = solve_integrate_8580(1, Vhp, Vbp_x, Vbp_vc, f);
753 Vhp = f.summer[offset + f.resonance[res][Vbp] + Vlp + Vi];
761void Filter::clock(cycle_count delta_t,
int voice1,
int voice2,
int voice3)
763 model_filter_t& f = model_filter[sid_model];
765 v1 = (voice1*f.voice_scale_s14 >> 18) + f.voice_DC;
766 v2 = (voice2*f.voice_scale_s14 >> 18) + f.voice_DC;
767 v3 = (voice3*f.voice_scale_s14 >> 18) + f.voice_DC;
773 if (unlikely(!enabled)) {
784 offset = summer_offset<0>::value;
788 offset = summer_offset<1>::value;
792 offset = summer_offset<1>::value;
796 offset = summer_offset<2>::value;
800 offset = summer_offset<1>::value;
804 offset = summer_offset<2>::value;
808 offset = summer_offset<2>::value;
812 offset = summer_offset<3>::value;
816 offset = summer_offset<1>::value;
820 offset = summer_offset<2>::value;
824 offset = summer_offset<2>::value;
828 offset = summer_offset<3>::value;
832 offset = summer_offset<2>::value;
836 offset = summer_offset<3>::value;
840 offset = summer_offset<3>::value;
843 Vi = ve + v3 + v2 + v1;
844 offset = summer_offset<4>::value;
850 cycle_count delta_t_flt = 3;
852 if (sid_model == 0) {
855 if (unlikely(delta_t < delta_t_flt)) {
856 delta_t_flt = delta_t;
860 Vlp = solve_integrate_6581(delta_t_flt, Vbp, Vlp_x, Vlp_vc, f);
861 Vbp = solve_integrate_6581(delta_t_flt, Vhp, Vbp_x, Vbp_vc, f);
862 Vhp = f.summer[offset + f.resonance[res][Vbp] + Vlp + Vi];
864 delta_t -= delta_t_flt;
870 if (unlikely(delta_t < delta_t_flt)) {
871 delta_t_flt = delta_t;
875 Vlp = solve_integrate_8580(delta_t_flt, Vbp, Vlp_x, Vlp_vc, f);
876 Vbp = solve_integrate_8580(delta_t_flt, Vhp, Vbp_x, Vbp_vc, f);
877 Vhp = f.summer[offset + f.resonance[res][Vbp] + Vlp + Vi];
879 delta_t -= delta_t_flt;
889void Filter::input(
short sample)
900 model_filter_t& f = model_filter[sid_model];
901 ve = (sample*f.voice_scale_s14*3 >> 14) + f.mixer[0];
909short Filter::output()
911 model_filter_t& f = model_filter[sid_model];
936 switch (mix & 0x7f) {
939 offset = mixer_offset<0>::value;
943 offset = mixer_offset<1>::value;
947 offset = mixer_offset<1>::value;
951 offset = mixer_offset<2>::value;
955 offset = mixer_offset<1>::value;
959 offset = mixer_offset<2>::value;
963 offset = mixer_offset<2>::value;
967 offset = mixer_offset<3>::value;
971 offset = mixer_offset<1>::value;
975 offset = mixer_offset<2>::value;
979 offset = mixer_offset<2>::value;
983 offset = mixer_offset<3>::value;
987 offset = mixer_offset<2>::value;
991 offset = mixer_offset<3>::value;
995 offset = mixer_offset<3>::value;
998 Vi = ve + v3 + v2 + v1;
999 offset = mixer_offset<4>::value;
1003 offset = mixer_offset<1>::value;
1007 offset = mixer_offset<2>::value;
1011 offset = mixer_offset<2>::value;
1015 offset = mixer_offset<3>::value;
1019 offset = mixer_offset<2>::value;
1023 offset = mixer_offset<3>::value;
1027 offset = mixer_offset<3>::value;
1030 Vi = Vlp + v3 + v2 + v1;
1031 offset = mixer_offset<4>::value;
1035 offset = mixer_offset<2>::value;
1039 offset = mixer_offset<3>::value;
1043 offset = mixer_offset<3>::value;
1046 Vi = Vlp + ve + v2 + v1;
1047 offset = mixer_offset<4>::value;
1051 offset = mixer_offset<3>::value;
1054 Vi = Vlp + ve + v3 + v1;
1055 offset = mixer_offset<4>::value;
1058 Vi = Vlp + ve + v3 + v2;
1059 offset = mixer_offset<4>::value;
1062 Vi = Vlp + ve + v3 + v2 + v1;
1063 offset = mixer_offset<5>::value;
1067 offset = mixer_offset<1>::value;
1071 offset = mixer_offset<2>::value;
1075 offset = mixer_offset<2>::value;
1079 offset = mixer_offset<3>::value;
1083 offset = mixer_offset<2>::value;
1087 offset = mixer_offset<3>::value;
1091 offset = mixer_offset<3>::value;
1094 Vi = Vbp + v3 + v2 + v1;
1095 offset = mixer_offset<4>::value;
1099 offset = mixer_offset<2>::value;
1103 offset = mixer_offset<3>::value;
1107 offset = mixer_offset<3>::value;
1110 Vi = Vbp + ve + v2 + v1;
1111 offset = mixer_offset<4>::value;
1115 offset = mixer_offset<3>::value;
1118 Vi = Vbp + ve + v3 + v1;
1119 offset = mixer_offset<4>::value;
1122 Vi = Vbp + ve + v3 + v2;
1123 offset = mixer_offset<4>::value;
1126 Vi = Vbp + ve + v3 + v2 + v1;
1127 offset = mixer_offset<5>::value;
1131 offset = mixer_offset<2>::value;
1134 Vi = Vbp + Vlp + v1;
1135 offset = mixer_offset<3>::value;
1138 Vi = Vbp + Vlp + v2;
1139 offset = mixer_offset<3>::value;
1142 Vi = Vbp + Vlp + v2 + v1;
1143 offset = mixer_offset<4>::value;
1146 Vi = Vbp + Vlp + v3;
1147 offset = mixer_offset<3>::value;
1150 Vi = Vbp + Vlp + v3 + v1;
1151 offset = mixer_offset<4>::value;
1154 Vi = Vbp + Vlp + v3 + v2;
1155 offset = mixer_offset<4>::value;
1158 Vi = Vbp + Vlp + v3 + v2 + v1;
1159 offset = mixer_offset<5>::value;
1162 Vi = Vbp + Vlp + ve;
1163 offset = mixer_offset<3>::value;
1166 Vi = Vbp + Vlp + ve + v1;
1167 offset = mixer_offset<4>::value;
1170 Vi = Vbp + Vlp + ve + v2;
1171 offset = mixer_offset<4>::value;
1174 Vi = Vbp + Vlp + ve + v2 + v1;
1175 offset = mixer_offset<5>::value;
1178 Vi = Vbp + Vlp + ve + v3;
1179 offset = mixer_offset<4>::value;
1182 Vi = Vbp + Vlp + ve + v3 + v1;
1183 offset = mixer_offset<5>::value;
1186 Vi = Vbp + Vlp + ve + v3 + v2;
1187 offset = mixer_offset<5>::value;
1190 Vi = Vbp + Vlp + ve + v3 + v2 + v1;
1191 offset = mixer_offset<6>::value;
1195 offset = mixer_offset<1>::value;
1199 offset = mixer_offset<2>::value;
1203 offset = mixer_offset<2>::value;
1207 offset = mixer_offset<3>::value;
1211 offset = mixer_offset<2>::value;
1215 offset = mixer_offset<3>::value;
1219 offset = mixer_offset<3>::value;
1222 Vi = Vhp + v3 + v2 + v1;
1223 offset = mixer_offset<4>::value;
1227 offset = mixer_offset<2>::value;
1231 offset = mixer_offset<3>::value;
1235 offset = mixer_offset<3>::value;
1238 Vi = Vhp + ve + v2 + v1;
1239 offset = mixer_offset<4>::value;
1243 offset = mixer_offset<3>::value;
1246 Vi = Vhp + ve + v3 + v1;
1247 offset = mixer_offset<4>::value;
1250 Vi = Vhp + ve + v3 + v2;
1251 offset = mixer_offset<4>::value;
1254 Vi = Vhp + ve + v3 + v2 + v1;
1255 offset = mixer_offset<5>::value;
1259 offset = mixer_offset<2>::value;
1262 Vi = Vhp + Vlp + v1;
1263 offset = mixer_offset<3>::value;
1266 Vi = Vhp + Vlp + v2;
1267 offset = mixer_offset<3>::value;
1270 Vi = Vhp + Vlp + v2 + v1;
1271 offset = mixer_offset<4>::value;
1274 Vi = Vhp + Vlp + v3;
1275 offset = mixer_offset<3>::value;
1278 Vi = Vhp + Vlp + v3 + v1;
1279 offset = mixer_offset<4>::value;
1282 Vi = Vhp + Vlp + v3 + v2;
1283 offset = mixer_offset<4>::value;
1286 Vi = Vhp + Vlp + v3 + v2 + v1;
1287 offset = mixer_offset<5>::value;
1290 Vi = Vhp + Vlp + ve;
1291 offset = mixer_offset<3>::value;
1294 Vi = Vhp + Vlp + ve + v1;
1295 offset = mixer_offset<4>::value;
1298 Vi = Vhp + Vlp + ve + v2;
1299 offset = mixer_offset<4>::value;
1302 Vi = Vhp + Vlp + ve + v2 + v1;
1303 offset = mixer_offset<5>::value;
1306 Vi = Vhp + Vlp + ve + v3;
1307 offset = mixer_offset<4>::value;
1310 Vi = Vhp + Vlp + ve + v3 + v1;
1311 offset = mixer_offset<5>::value;
1314 Vi = Vhp + Vlp + ve + v3 + v2;
1315 offset = mixer_offset<5>::value;
1318 Vi = Vhp + Vlp + ve + v3 + v2 + v1;
1319 offset = mixer_offset<6>::value;
1323 offset = mixer_offset<2>::value;
1326 Vi = Vhp + Vbp + v1;
1327 offset = mixer_offset<3>::value;
1330 Vi = Vhp + Vbp + v2;
1331 offset = mixer_offset<3>::value;
1334 Vi = Vhp + Vbp + v2 + v1;
1335 offset = mixer_offset<4>::value;
1338 Vi = Vhp + Vbp + v3;
1339 offset = mixer_offset<3>::value;
1342 Vi = Vhp + Vbp + v3 + v1;
1343 offset = mixer_offset<4>::value;
1346 Vi = Vhp + Vbp + v3 + v2;
1347 offset = mixer_offset<4>::value;
1350 Vi = Vhp + Vbp + v3 + v2 + v1;
1351 offset = mixer_offset<5>::value;
1354 Vi = Vhp + Vbp + ve;
1355 offset = mixer_offset<3>::value;
1358 Vi = Vhp + Vbp + ve + v1;
1359 offset = mixer_offset<4>::value;
1362 Vi = Vhp + Vbp + ve + v2;
1363 offset = mixer_offset<4>::value;
1366 Vi = Vhp + Vbp + ve + v2 + v1;
1367 offset = mixer_offset<5>::value;
1370 Vi = Vhp + Vbp + ve + v3;
1371 offset = mixer_offset<4>::value;
1374 Vi = Vhp + Vbp + ve + v3 + v1;
1375 offset = mixer_offset<5>::value;
1378 Vi = Vhp + Vbp + ve + v3 + v2;
1379 offset = mixer_offset<5>::value;
1382 Vi = Vhp + Vbp + ve + v3 + v2 + v1;
1383 offset = mixer_offset<6>::value;
1386 Vi = Vhp + Vbp + Vlp;
1387 offset = mixer_offset<3>::value;
1390 Vi = Vhp + Vbp + Vlp + v1;
1391 offset = mixer_offset<4>::value;
1394 Vi = Vhp + Vbp + Vlp + v2;
1395 offset = mixer_offset<4>::value;
1398 Vi = Vhp + Vbp + Vlp + v2 + v1;
1399 offset = mixer_offset<5>::value;
1402 Vi = Vhp + Vbp + Vlp + v3;
1403 offset = mixer_offset<4>::value;
1406 Vi = Vhp + Vbp + Vlp + v3 + v1;
1407 offset = mixer_offset<5>::value;
1410 Vi = Vhp + Vbp + Vlp + v3 + v2;
1411 offset = mixer_offset<5>::value;
1414 Vi = Vhp + Vbp + Vlp + v3 + v2 + v1;
1415 offset = mixer_offset<6>::value;
1418 Vi = Vhp + Vbp + Vlp + ve;
1419 offset = mixer_offset<4>::value;
1422 Vi = Vhp + Vbp + Vlp + ve + v1;
1423 offset = mixer_offset<5>::value;
1426 Vi = Vhp + Vbp + Vlp + ve + v2;
1427 offset = mixer_offset<5>::value;
1430 Vi = Vhp + Vbp + Vlp + ve + v2 + v1;
1431 offset = mixer_offset<6>::value;
1434 Vi = Vhp + Vbp + Vlp + ve + v3;
1435 offset = mixer_offset<5>::value;
1438 Vi = Vhp + Vbp + Vlp + ve + v3 + v1;
1439 offset = mixer_offset<6>::value;
1442 Vi = Vhp + Vbp + Vlp + ve + v3 + v2;
1443 offset = mixer_offset<6>::value;
1446 Vi = Vhp + Vbp + Vlp + ve + v3 + v2 + v1;
1447 offset = mixer_offset<7>::value;
1452 return (
short)(f.gain[vol][f.mixer[offset + Vi]] - (1 << 15));
1510int Filter::solve_gain(opamp_t* opamp,
int n,
int vi,
int& x, model_filter_t& mf)
1519 int ak = mf.ak, bk = mf.bk;
1521 int a = n + (1 << 7);
1524 if (b_vi < 0) b_vi = 0;
1525 int c = n*int(
unsigned(b_vi)*
unsigned(b_vi) >> 12);
1531 int vx = opamp[x].vx;
1532 int dvx = opamp[x].dvx;
1537 int vo = vx + (x << 1) - (1 << 16);
1538 if (vo >= (1 << 16)) {
1545 if (b_vx < 0) b_vx = 0;
1547 if (b_vo < 0) b_vo = 0;
1549 int f = a*int(
unsigned(b_vx)*
unsigned(b_vx) >> 12) - c - int(
unsigned(b_vo)*
unsigned(b_vo) >> 5);
1551 int df = ((b_vo*(dvx + (1 << 11)) >> 1) - (a*(b_vx*dvx >> 8))) >> 14;
1559 if (unlikely(x == xk)) {
1574 if (unlikely(x <= ak) || unlikely(x >= bk)) {
1577 if (unlikely(x == ak)) {
1586int Filter::solve_gain_d(opamp_t* opamp,
double n,
int vi,
int& x, model_filter_t& mf)
1595 int ak = mf.ak, bk = mf.bk;
1599 double b_vi = b > vi ? double(b - vi) : 0.;
1600 double c = n*(b_vi*b_vi);
1606 int vx = opamp[x].vx;
1607 int dvx = opamp[x].dvx;
1612 int vo = vx + (x << 1) - (1 << 16);
1613 if (vo > (1 << 16) - 1) {
1619 double b_vx = b > vx ? double(b - vx) : 0.;
1620 double b_vo = b > vo ? double(b - vo) : 0.;
1622 double f = a*(b_vx*b_vx) - c - (b_vo*b_vo);
1624 double df = 2.*(b_vo - a*b_vx)*
double(dvx);
1631 x -= int(
double(1<<11)*f/df);
1633 if (unlikely(x == xk)) {
1648 if (unlikely(x <= ak) || unlikely(x >= bk)) {
1651 if (unlikely(x == ak)) {
1780int Filter::solve_integrate_6581(
int dt,
int vi,
int& vx,
int& vc, model_filter_t& mf)
1787 int kVddt = mf.kVddt;
1790 unsigned int Vgst = kVddt - vx;
1791 unsigned int Vgdt = kVddt - vi;
1792 unsigned int Vgdt_2 = Vgdt*Vgdt;
1795 int n_I_snake = n_snake*(int(Vgst*Vgst - Vgdt_2) >> 15);
1799 int kVg = vcr_kVg[(Vddt_Vw_2 + (Vgdt_2 >> 1)) >> 16];
1802 int Vgs = kVg - vx + (1 << 15);
1803 int Vgd = kVg - vi + (1 << 15);
1806 int n_I_vcr = int(
unsigned(vcr_n_Ids_term[Vgs] - vcr_n_Ids_term[Vgd]) << 15);
1809 vc -= (n_I_snake + n_I_vcr)*dt;
1822 vx = mf.opamp_rev[(vc >> 15) + (1 << 15)];
1825 return vx + (vc >> 14);
1848int Filter::solve_integrate_8580(
int dt,
int vi,
int& vx,
int& vc, model_filter_t& mf)
1856 unsigned int Vgst = nVgt - vx;
1857 unsigned int Vgdt = (vi < nVgt) ? nVgt - vi : 0;
1860 int n_I_rfc = n_dac*(int(Vgst*Vgst - Vgdt*Vgdt) >> 15);
1866 vx = mf.opamp_rev[(vc >> 15) + (1 << 15)];
1869 return vx + (vc >> 14);