| ... | ... |
@@ -214,7 +214,7 @@ static const uint32_t ARM7_HACKY_SIWRAM_LOCATION = 0x03000000; |
| 214 | 214 |
// NOTE - this whole approach is probably fundamentally wrong. |
| 215 | 215 |
// according to dasShiny research, its possible to map multiple banks to the same addresses. something more sophisticated would be needed. |
| 216 | 216 |
// however, it hasnt proven necessary yet for any known test case. |
| 217 |
-template<int PROCNUM> static inline uint32_t MMU_LCDmap(uint32_t addr, bool &unmapped, bool &restricted) |
|
| 217 |
+static inline uint32_t MMU_LCDmap(int PROCNUM, uint32_t addr, bool &unmapped, bool &restricted) |
|
| 218 | 218 |
{
|
| 219 | 219 |
unmapped = false; |
| 220 | 220 |
restricted = false; // this will track whether 8bit writes are allowed |
| ... | ... |
@@ -988,7 +988,7 @@ uint16_t DSI_TSC::read16() |
| 988 | 988 |
|
| 989 | 989 |
// TODO: |
| 990 | 990 |
// NAND flash support (used in Made in Ore/WarioWare D.I.Y.) |
| 991 |
-template<int PROCNUM> void FASTCALL MMU_writeToGCControl(uint32_t val) |
|
| 991 |
+void FASTCALL MMU_writeToGCControl(int PROCNUM, uint32_t val) |
|
| 992 | 992 |
{
|
| 993 | 993 |
int TEST_PROCNUM = PROCNUM; |
| 994 | 994 |
nds_dscard &card = MMU.dscard[TEST_PROCNUM]; |
| ... | ... |
@@ -1069,7 +1069,7 @@ template<int PROCNUM> void FASTCALL MMU_writeToGCControl(uint32_t val) |
| 1069 | 1069 |
triggerDma(EDMAMode_Card); |
| 1070 | 1070 |
} |
| 1071 | 1071 |
|
| 1072 |
-template<int PROCNUM> uint32_t MMU_readFromGC() |
|
| 1072 |
+uint32_t MMU_readFromGC(int PROCNUM) |
|
| 1073 | 1073 |
{
|
| 1074 | 1074 |
int TEST_PROCNUM = PROCNUM; |
| 1075 | 1075 |
|
| ... | ... |
@@ -1109,7 +1109,7 @@ template<int PROCNUM> uint32_t MMU_readFromGC() |
| 1109 | 1109 |
return val; |
| 1110 | 1110 |
} |
| 1111 | 1111 |
|
| 1112 |
-template<int PROCNUM> static void REG_IF_WriteByte(uint32_t addr, uint8_t val) |
|
| 1112 |
+static void REG_IF_WriteByte(int PROCNUM, uint32_t addr, uint8_t val) |
|
| 1113 | 1113 |
{
|
| 1114 | 1114 |
// the following bits are generated from logic and should not be affected here |
| 1115 | 1115 |
// Bit 21 NDS9 only: Geometry Command FIFO |
| ... | ... |
@@ -1132,18 +1132,18 @@ template<int PROCNUM> static void REG_IF_WriteByte(uint32_t addr, uint8_t val) |
| 1132 | 1132 |
NDS_Reschedule(); |
| 1133 | 1133 |
} |
| 1134 | 1134 |
|
| 1135 |
-template<int PROCNUM> static void REG_IF_WriteWord(uint32_t addr, uint16_t val) |
|
| 1135 |
+static void REG_IF_WriteWord(int PROCNUM, uint32_t addr, uint16_t val) |
|
| 1136 | 1136 |
{
|
| 1137 |
- REG_IF_WriteByte<PROCNUM>(addr, val & 0xFF); |
|
| 1138 |
- REG_IF_WriteByte<PROCNUM>(addr + 1, (val >> 8) & 0xFF); |
|
| 1137 |
+ REG_IF_WriteByte(PROCNUM, addr, val & 0xFF); |
|
| 1138 |
+ REG_IF_WriteByte(PROCNUM, addr + 1, (val >> 8) & 0xFF); |
|
| 1139 | 1139 |
} |
| 1140 | 1140 |
|
| 1141 |
-template<int PROCNUM> static void REG_IF_WriteLong(uint32_t val) |
|
| 1141 |
+static void REG_IF_WriteLong(int PROCNUM, uint32_t val) |
|
| 1142 | 1142 |
{
|
| 1143 |
- REG_IF_WriteByte<PROCNUM>(0, val & 0xFF); |
|
| 1144 |
- REG_IF_WriteByte<PROCNUM>(1, (val >> 8) & 0xFF); |
|
| 1145 |
- REG_IF_WriteByte<PROCNUM>(2, (val >> 16) & 0xFF); |
|
| 1146 |
- REG_IF_WriteByte<PROCNUM>(3, (val >> 24) & 0xFF); |
|
| 1143 |
+ REG_IF_WriteByte(PROCNUM, 0, val & 0xFF); |
|
| 1144 |
+ REG_IF_WriteByte(PROCNUM, 1, (val >> 8) & 0xFF); |
|
| 1145 |
+ REG_IF_WriteByte(PROCNUM, 2, (val >> 16) & 0xFF); |
|
| 1146 |
+ REG_IF_WriteByte(PROCNUM, 3, (val >> 24) & 0xFF); |
|
| 1147 | 1147 |
} |
| 1148 | 1148 |
|
| 1149 | 1149 |
template<int PROCNUM> uint32_t MMU_struct::gen_IF() |
| ... | ... |
@@ -1650,16 +1650,16 @@ void FASTCALL _MMU_ARM9_write08(uint32_t adr, uint8_t val) |
| 1650 | 1650 |
#endif |
| 1651 | 1651 |
|
| 1652 | 1652 |
case REG_IF: |
| 1653 |
- REG_IF_WriteByte<ARMCPU_ARM9>(0, val); |
|
| 1653 |
+ REG_IF_WriteByte(ARMCPU_ARM9, 0, val); |
|
| 1654 | 1654 |
break; |
| 1655 | 1655 |
case REG_IF + 1: |
| 1656 |
- REG_IF_WriteByte<ARMCPU_ARM9>(1, val); |
|
| 1656 |
+ REG_IF_WriteByte(ARMCPU_ARM9, 1, val); |
|
| 1657 | 1657 |
break; |
| 1658 | 1658 |
case REG_IF + 2: |
| 1659 |
- REG_IF_WriteByte<ARMCPU_ARM9>(2, val); |
|
| 1659 |
+ REG_IF_WriteByte(ARMCPU_ARM9, 2, val); |
|
| 1660 | 1660 |
break; |
| 1661 | 1661 |
case REG_IF + 3: |
| 1662 |
- REG_IF_WriteByte<ARMCPU_ARM9>(3, val); |
|
| 1662 |
+ REG_IF_WriteByte(ARMCPU_ARM9, 3, val); |
|
| 1663 | 1663 |
break; |
| 1664 | 1664 |
|
| 1665 | 1665 |
case REG_VRAMCNTA: |
| ... | ... |
@@ -1779,10 +1779,11 @@ void FASTCALL _MMU_ARM9_write16(uint32_t adr, uint16_t val) |
| 1779 | 1779 |
MMU.reg_IE[ARMCPU_ARM9] = (MMU.reg_IE[ARMCPU_ARM9] & 0xFFFF) | (val << 16); |
| 1780 | 1780 |
return; |
| 1781 | 1781 |
case REG_IF: |
| 1782 |
- REG_IF_WriteWord<ARMCPU_ARM9>(0, val); |
|
| 1782 |
+ REG_IF_WriteWord(ARMCPU_ARM9, 0, val); |
|
| 1783 |
+ return; |
|
| 1784 |
+ case REG_IF + 2: |
|
| 1785 |
+ REG_IF_WriteWord(ARMCPU_ARM9, 2, val); |
|
| 1783 | 1786 |
return; |
| 1784 |
- case REG_IF+2: |
|
| 1785 |
- REG_IF_WriteWord<ARMCPU_ARM9>(2, val); return; |
|
| 1786 | 1787 |
|
| 1787 | 1788 |
case REG_IPCSYNC: |
| 1788 | 1789 |
MMU_IPCSync(ARMCPU_ARM9, val); |
| ... | ... |
@@ -1808,10 +1809,10 @@ void FASTCALL _MMU_ARM9_write16(uint32_t adr, uint16_t val) |
| 1808 | 1809 |
} |
| 1809 | 1810 |
|
| 1810 | 1811 |
case REG_GCROMCTRL: |
| 1811 |
- MMU_writeToGCControl<ARMCPU_ARM9>((T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x1A4) & 0xFFFF0000) | val); |
|
| 1812 |
+ MMU_writeToGCControl(ARMCPU_ARM9, (T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x1A4) & 0xFFFF0000) | val); |
|
| 1812 | 1813 |
return; |
| 1813 | 1814 |
case REG_GCROMCTRL + 2: |
| 1814 |
- MMU_writeToGCControl<ARMCPU_ARM9>((T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x1A4) & 0xFFFF) | (val << 16)); |
|
| 1815 |
+ MMU_writeToGCControl(ARMCPU_ARM9, (T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x1A4) & 0xFFFF) | (val << 16)); |
|
| 1815 | 1816 |
return; |
| 1816 | 1817 |
} |
| 1817 | 1818 |
|
| ... | ... |
@@ -1820,7 +1821,7 @@ void FASTCALL _MMU_ARM9_write16(uint32_t adr, uint16_t val) |
| 1820 | 1821 |
} |
| 1821 | 1822 |
|
| 1822 | 1823 |
bool unmapped, restricted; |
| 1823 |
- adr = MMU_LCDmap<ARMCPU_ARM9>(adr, unmapped, restricted); |
|
| 1824 |
+ adr = MMU_LCDmap(ARMCPU_ARM9, adr, unmapped, restricted); |
|
| 1824 | 1825 |
if (unmapped) |
| 1825 | 1826 |
return; |
| 1826 | 1827 |
|
| ... | ... |
@@ -1892,7 +1893,7 @@ void FASTCALL _MMU_ARM9_write32(uint32_t adr, uint32_t val) |
| 1892 | 1893 |
return; |
| 1893 | 1894 |
|
| 1894 | 1895 |
case REG_IF: |
| 1895 |
- REG_IF_WriteLong<ARMCPU_ARM9>(val); |
|
| 1896 |
+ REG_IF_WriteLong(ARMCPU_ARM9, val); |
|
| 1896 | 1897 |
return; |
| 1897 | 1898 |
|
| 1898 | 1899 |
case REG_TM0CNTL: |
| ... | ... |
@@ -1953,7 +1954,7 @@ void FASTCALL _MMU_ARM9_write32(uint32_t adr, uint32_t val) |
| 1953 | 1954 |
return; |
| 1954 | 1955 |
|
| 1955 | 1956 |
case REG_GCROMCTRL: |
| 1956 |
- MMU_writeToGCControl<ARMCPU_ARM9>(val); |
|
| 1957 |
+ MMU_writeToGCControl(ARMCPU_ARM9, val); |
|
| 1957 | 1958 |
return; |
| 1958 | 1959 |
case REG_DISPA_DISPCAPCNT: |
| 1959 | 1960 |
T1WriteLong(MMU.ARM9_REG, 0x64, val); |
| ... | ... |
@@ -1969,7 +1970,7 @@ void FASTCALL _MMU_ARM9_write32(uint32_t adr, uint32_t val) |
| 1969 | 1970 |
} |
| 1970 | 1971 |
|
| 1971 | 1972 |
bool unmapped, restricted; |
| 1972 |
- adr = MMU_LCDmap<ARMCPU_ARM9>(adr, unmapped, restricted); |
|
| 1973 |
+ adr = MMU_LCDmap(ARMCPU_ARM9, adr, unmapped, restricted); |
|
| 1973 | 1974 |
if (unmapped) |
| 1974 | 1975 |
return; |
| 1975 | 1976 |
|
| ... | ... |
@@ -2047,7 +2048,7 @@ uint8_t FASTCALL _MMU_ARM9_read08(uint32_t adr) |
| 2047 | 2048 |
} |
| 2048 | 2049 |
|
| 2049 | 2050 |
bool unmapped, restricted; |
| 2050 |
- adr = MMU_LCDmap<ARMCPU_ARM9>(adr, unmapped, restricted); |
|
| 2051 |
+ adr = MMU_LCDmap(ARMCPU_ARM9, adr, unmapped, restricted); |
|
| 2051 | 2052 |
if (unmapped) |
| 2052 | 2053 |
return 0; |
| 2053 | 2054 |
|
| ... | ... |
@@ -2181,7 +2182,7 @@ uint32_t FASTCALL _MMU_ARM9_read32(uint32_t adr) |
| 2181 | 2182 |
} |
| 2182 | 2183 |
|
| 2183 | 2184 |
case REG_GCDATAIN: |
| 2184 |
- return MMU_readFromGC<ARMCPU_ARM9>(); |
|
| 2185 |
+ return MMU_readFromGC(ARMCPU_ARM9); |
|
| 2185 | 2186 |
} |
| 2186 | 2187 |
return T1ReadLong_guaranteedAligned(MMU.MMU_MEM[ARMCPU_ARM9][adr >> 20], adr & MMU.MMU_MASK[ARMCPU_ARM9][adr >> 20]); |
| 2187 | 2188 |
} |
| ... | ... |
@@ -2227,16 +2228,16 @@ void FASTCALL _MMU_ARM7_write08(uint32_t adr, uint8_t val) |
| 2227 | 2228 |
switch (adr) |
| 2228 | 2229 |
{
|
| 2229 | 2230 |
case REG_IF: |
| 2230 |
- REG_IF_WriteByte<ARMCPU_ARM7>(0, val); |
|
| 2231 |
+ REG_IF_WriteByte(ARMCPU_ARM7, 0, val); |
|
| 2231 | 2232 |
break; |
| 2232 | 2233 |
case REG_IF + 1: |
| 2233 |
- REG_IF_WriteByte<ARMCPU_ARM7>(1, val); |
|
| 2234 |
+ REG_IF_WriteByte(ARMCPU_ARM7, 1, val); |
|
| 2234 | 2235 |
break; |
| 2235 | 2236 |
case REG_IF + 2: |
| 2236 |
- REG_IF_WriteByte<ARMCPU_ARM7>(2, val); |
|
| 2237 |
+ REG_IF_WriteByte(ARMCPU_ARM7, 2, val); |
|
| 2237 | 2238 |
break; |
| 2238 | 2239 |
case REG_IF + 3: |
| 2239 |
- REG_IF_WriteByte<ARMCPU_ARM7>(3, val); |
|
| 2240 |
+ REG_IF_WriteByte(ARMCPU_ARM7, 3, val); |
|
| 2240 | 2241 |
break; |
| 2241 | 2242 |
|
| 2242 | 2243 |
case REG_POSTFLG: |
| ... | ... |
@@ -2530,10 +2531,10 @@ void FASTCALL _MMU_ARM7_write16(uint32_t adr, uint16_t val) |
| 2530 | 2531 |
return; |
| 2531 | 2532 |
|
| 2532 | 2533 |
case REG_IF: |
| 2533 |
- REG_IF_WriteWord<ARMCPU_ARM7>(0, val); |
|
| 2534 |
+ REG_IF_WriteWord(ARMCPU_ARM7, 0, val); |
|
| 2534 | 2535 |
return; |
| 2535 | 2536 |
case REG_IF + 2: |
| 2536 |
- REG_IF_WriteWord<ARMCPU_ARM7>(2, val); |
|
| 2537 |
+ REG_IF_WriteWord(ARMCPU_ARM7, 2, val); |
|
| 2537 | 2538 |
return; |
| 2538 | 2539 |
|
| 2539 | 2540 |
case REG_IPCSYNC: |
| ... | ... |
@@ -2560,10 +2561,10 @@ void FASTCALL _MMU_ARM7_write16(uint32_t adr, uint16_t val) |
| 2560 | 2561 |
} |
| 2561 | 2562 |
|
| 2562 | 2563 |
case REG_GCROMCTRL: |
| 2563 |
- MMU_writeToGCControl<ARMCPU_ARM7>((T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x1A4) & 0xFFFF0000) | val); |
|
| 2564 |
+ MMU_writeToGCControl(ARMCPU_ARM7, (T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x1A4) & 0xFFFF0000) | val); |
|
| 2564 | 2565 |
return; |
| 2565 | 2566 |
case REG_GCROMCTRL + 2: |
| 2566 |
- MMU_writeToGCControl<ARMCPU_ARM7>((T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x1A4) & 0xFFFF) | (val << 16)); |
|
| 2567 |
+ MMU_writeToGCControl(ARMCPU_ARM7, (T1ReadLong(MMU.MMU_MEM[ARMCPU_ARM7][0x40], 0x1A4) & 0xFFFF) | (val << 16)); |
|
| 2567 | 2568 |
return; |
| 2568 | 2569 |
} |
| 2569 | 2570 |
|
| ... | ... |
@@ -2619,7 +2620,7 @@ void FASTCALL _MMU_ARM7_write32(uint32_t adr, uint32_t val) |
| 2619 | 2620 |
return; |
| 2620 | 2621 |
|
| 2621 | 2622 |
case REG_IF: |
| 2622 |
- REG_IF_WriteLong<ARMCPU_ARM7>(val); |
|
| 2623 |
+ REG_IF_WriteLong(ARMCPU_ARM7, val); |
|
| 2623 | 2624 |
return; |
| 2624 | 2625 |
|
| 2625 | 2626 |
case REG_TM0CNTL: |
| ... | ... |
@@ -2645,7 +2646,7 @@ void FASTCALL _MMU_ARM7_write32(uint32_t adr, uint32_t val) |
| 2645 | 2646 |
return; |
| 2646 | 2647 |
|
| 2647 | 2648 |
case REG_GCROMCTRL: |
| 2648 |
- MMU_writeToGCControl<ARMCPU_ARM7>(val); |
|
| 2649 |
+ MMU_writeToGCControl(ARMCPU_ARM7, val); |
|
| 2649 | 2650 |
return; |
| 2650 | 2651 |
|
| 2651 | 2652 |
case REG_GCDATAIN: |
| ... | ... |
@@ -2818,7 +2819,7 @@ uint32_t FASTCALL _MMU_ARM7_read32(uint32_t adr) |
| 2818 | 2819 |
case REG_GCROMCTRL: |
| 2819 | 2820 |
break; |
| 2820 | 2821 |
case REG_GCDATAIN: |
| 2821 |
- return MMU_readFromGC<ARMCPU_ARM7>(); |
|
| 2822 |
+ return MMU_readFromGC(ARMCPU_ARM7); |
|
| 2822 | 2823 |
|
| 2823 | 2824 |
case REG_VRAMSTAT: |
| 2824 | 2825 |
// make sure WRAMSTAT is stashed and then fallthrough return the value from memory. i know, gross. |
| ... | ... |
@@ -787,7 +787,7 @@ void SPU_WriteLong(uint32_t addr, uint32_t val) |
| 787 | 787 |
|
| 788 | 788 |
////////////////////////////////////////////////////////////////////////////// |
| 789 | 789 |
|
| 790 |
-template<SPUInterpolationMode INTERPOLATE_MODE> static inline int32_t Interpolate(int32_t a, int32_t b, double ratio) |
|
| 790 |
+static inline int32_t Interpolate(int32_t a, int32_t b, double ratio, SPUInterpolationMode INTERPOLATE_MODE) |
|
| 791 | 791 |
{
|
| 792 | 792 |
double sampleA = static_cast<double>(a); |
| 793 | 793 |
double sampleB = static_cast<double>(b); |
| ... | ... |
@@ -817,7 +817,7 @@ template<SPUInterpolationMode INTERPOLATE_MODE> static inline int32_t Interpolat |
| 817 | 817 |
|
| 818 | 818 |
////////////////////////////////////////////////////////////////////////////// |
| 819 | 819 |
|
| 820 |
-template<SPUInterpolationMode INTERPOLATE_MODE> static inline void Fetch8BitData(channel_struct *chan, int32_t *data) |
|
| 820 |
+static inline void Fetch8BitData(const channel_struct *const chan, int32_t *const data, SPUInterpolationMode INTERPOLATE_MODE) |
|
| 821 | 821 |
{
|
| 822 | 822 |
if (chan->sampcnt < 0) |
| 823 | 823 |
{
|
| ... | ... |
@@ -832,7 +832,7 @@ template<SPUInterpolationMode INTERPOLATE_MODE> static inline void Fetch8BitData |
| 832 | 832 |
if (loc < (chan->totlength << 2) - 1) |
| 833 | 833 |
{
|
| 834 | 834 |
int32_t b = static_cast<int32_t>(read_s8(chan->addr + loc + 1) << 8); |
| 835 |
- a = Interpolate<INTERPOLATE_MODE>(a, b, chan->sampcnt); |
|
| 835 |
+ a = Interpolate(a, b, chan->sampcnt, INTERPOLATE_MODE); |
|
| 836 | 836 |
} |
| 837 | 837 |
*data = a; |
| 838 | 838 |
} |
| ... | ... |
@@ -840,7 +840,7 @@ template<SPUInterpolationMode INTERPOLATE_MODE> static inline void Fetch8BitData |
| 840 | 840 |
*data = static_cast<int32_t>(read_s8(chan->addr + loc) << 8); |
| 841 | 841 |
} |
| 842 | 842 |
|
| 843 |
-template<SPUInterpolationMode INTERPOLATE_MODE> static inline void Fetch16BitData(const channel_struct * const chan, int32_t *data) |
|
| 843 |
+static inline void Fetch16BitData(const channel_struct *const chan, int32_t *const data, SPUInterpolationMode INTERPOLATE_MODE) |
|
| 844 | 844 |
{
|
| 845 | 845 |
if (chan->sampcnt < 0) |
| 846 | 846 |
{
|
| ... | ... |
@@ -848,7 +848,7 @@ template<SPUInterpolationMode INTERPOLATE_MODE> static inline void Fetch16BitDat |
| 848 | 848 |
return; |
| 849 | 849 |
} |
| 850 | 850 |
|
| 851 |
- if(INTERPOLATE_MODE != SPUInterpolation_None) |
|
| 851 |
+ if (INTERPOLATE_MODE != SPUInterpolation_None) |
|
| 852 | 852 |
{
|
| 853 | 853 |
uint32_t loc = u32floor(chan->sampcnt); |
| 854 | 854 |
|
| ... | ... |
@@ -856,7 +856,7 @@ template<SPUInterpolationMode INTERPOLATE_MODE> static inline void Fetch16BitDat |
| 856 | 856 |
if (loc < (chan->totlength << 1) - 1) |
| 857 | 857 |
{
|
| 858 | 858 |
int32_t b = static_cast<int32_t>(read16(loc * 2 + chan->addr + 2)); |
| 859 |
- a = Interpolate<INTERPOLATE_MODE>(a, b, chan->sampcnt); |
|
| 859 |
+ a = Interpolate(a, b, chan->sampcnt, INTERPOLATE_MODE); |
|
| 860 | 860 |
} |
| 861 | 861 |
*data = a; |
| 862 | 862 |
} |
| ... | ... |
@@ -864,7 +864,7 @@ template<SPUInterpolationMode INTERPOLATE_MODE> static inline void Fetch16BitDat |
| 864 | 864 |
*data = read16(chan->addr + u32floor(chan->sampcnt) * 2); |
| 865 | 865 |
} |
| 866 | 866 |
|
| 867 |
-template<SPUInterpolationMode INTERPOLATE_MODE> static inline void FetchADPCMData(channel_struct * const chan, int32_t * const data) |
|
| 867 |
+static inline void FetchADPCMData(channel_struct *const chan, int32_t *const data, SPUInterpolationMode INTERPOLATE_MODE) |
|
| 868 | 868 |
{
|
| 869 | 869 |
if (chan->sampcnt < 8) |
| 870 | 870 |
{
|
| ... | ... |
@@ -900,7 +900,7 @@ template<SPUInterpolationMode INTERPOLATE_MODE> static inline void FetchADPCMDat |
| 900 | 900 |
} |
| 901 | 901 |
|
| 902 | 902 |
if (INTERPOLATE_MODE != SPUInterpolation_None) |
| 903 |
- *data = Interpolate<INTERPOLATE_MODE>(static_cast<int32_t>(chan->pcm16b_last), static_cast<int32_t>(chan->pcm16b), chan->sampcnt); |
|
| 903 |
+ *data = Interpolate(static_cast<int32_t>(chan->pcm16b_last), static_cast<int32_t>(chan->pcm16b), chan->sampcnt, INTERPOLATE_MODE); |
|
| 904 | 904 |
else |
| 905 | 905 |
*data = static_cast<int32_t>(chan->pcm16b); |
| 906 | 906 |
} |
| ... | ... |
@@ -969,7 +969,7 @@ static inline void MixLR(SPU_struct *SPU, channel_struct *chan, int32_t data) |
| 969 | 969 |
|
| 970 | 970 |
////////////////////////////////////////////////////////////////////////////// |
| 971 | 971 |
|
| 972 |
-template<int FORMAT> static inline void TestForLoop(SPU_struct *SPU, channel_struct *chan) |
|
| 972 |
+static inline void TestForLoop(SPU_struct *SPU, channel_struct *chan, int FORMAT) |
|
| 973 | 973 |
{
|
| 974 | 974 |
int shift = !FORMAT ? 2 : 1; |
| 975 | 975 |
|
| ... | ... |
@@ -1026,7 +1026,7 @@ static inline void TestForLoop2(SPU_struct *SPU, channel_struct *chan) |
| 1026 | 1026 |
} |
| 1027 | 1027 |
} |
| 1028 | 1028 |
|
| 1029 |
-template<int CHANNELS> static inline void SPU_Mix(SPU_struct *SPU, channel_struct *chan, int32_t data) |
|
| 1029 |
+static inline void SPU_Mix(SPU_struct *SPU, channel_struct *chan, int32_t data, int CHANNELS) |
|
| 1030 | 1030 |
{
|
| 1031 | 1031 |
switch (CHANNELS) |
| 1032 | 1032 |
{
|
| ... | ... |
@@ -1043,7 +1043,7 @@ template<int CHANNELS> static inline void SPU_Mix(SPU_struct *SPU, channel_struc |
| 1043 | 1043 |
} |
| 1044 | 1044 |
|
| 1045 | 1045 |
// WORK |
| 1046 |
-template<int FORMAT, SPUInterpolationMode INTERPOLATE_MODE, int CHANNELS> static inline void ____SPU_ChanUpdate(SPU_struct *const SPU, channel_struct *const chan) |
|
| 1046 |
+static inline void ____SPU_ChanUpdate(SPU_struct *const SPU, channel_struct *const chan, int FORMAT, SPUInterpolationMode INTERPOLATE_MODE, int CHANNELS) |
|
| 1047 | 1047 |
{
|
| 1048 | 1048 |
for (; SPU->bufpos < SPU->buflength; ++SPU->bufpos) |
| 1049 | 1049 |
{
|
| ... | ... |
@@ -1053,25 +1053,25 @@ template<int FORMAT, SPUInterpolationMode INTERPOLATE_MODE, int CHANNELS> static |
| 1053 | 1053 |
switch (FORMAT) |
| 1054 | 1054 |
{
|
| 1055 | 1055 |
case 0: |
| 1056 |
- Fetch8BitData<INTERPOLATE_MODE>(chan, &data); |
|
| 1056 |
+ Fetch8BitData(chan, &data, INTERPOLATE_MODE); |
|
| 1057 | 1057 |
break; |
| 1058 | 1058 |
case 1: |
| 1059 |
- Fetch16BitData<INTERPOLATE_MODE>(chan, &data); |
|
| 1059 |
+ Fetch16BitData(chan, &data, INTERPOLATE_MODE); |
|
| 1060 | 1060 |
break; |
| 1061 | 1061 |
case 2: |
| 1062 |
- FetchADPCMData<INTERPOLATE_MODE>(chan, &data); |
|
| 1062 |
+ FetchADPCMData(chan, &data, INTERPOLATE_MODE); |
|
| 1063 | 1063 |
break; |
| 1064 | 1064 |
case 3: |
| 1065 | 1065 |
FetchPSGData(chan, &data); |
| 1066 | 1066 |
} |
| 1067 |
- SPU_Mix<CHANNELS>(SPU, chan, data); |
|
| 1067 |
+ SPU_Mix(SPU, chan, data, CHANNELS); |
|
| 1068 | 1068 |
} |
| 1069 | 1069 |
|
| 1070 | 1070 |
switch (FORMAT) |
| 1071 | 1071 |
{
|
| 1072 | 1072 |
case 0: |
| 1073 | 1073 |
case 1: |
| 1074 |
- TestForLoop<FORMAT>(SPU, chan); |
|
| 1074 |
+ TestForLoop(SPU, chan, FORMAT); |
|
| 1075 | 1075 |
break; |
| 1076 | 1076 |
case 2: |
| 1077 | 1077 |
TestForLoop2(SPU, chan); |
| ... | ... |
@@ -1082,33 +1082,33 @@ template<int FORMAT, SPUInterpolationMode INTERPOLATE_MODE, int CHANNELS> static |
| 1082 | 1082 |
} |
| 1083 | 1083 |
} |
| 1084 | 1084 |
|
| 1085 |
-template<int FORMAT, SPUInterpolationMode INTERPOLATE_MODE> static inline void ___SPU_ChanUpdate(bool actuallyMix, SPU_struct *const SPU, channel_struct *const chan) |
|
| 1085 |
+static inline void ___SPU_ChanUpdate(bool actuallyMix, SPU_struct *const SPU, channel_struct *const chan, int FORMAT, SPUInterpolationMode INTERPOLATE_MODE) |
|
| 1086 | 1086 |
{
|
| 1087 | 1087 |
if (!actuallyMix) |
| 1088 |
- ____SPU_ChanUpdate<FORMAT, INTERPOLATE_MODE, -1>(SPU, chan); |
|
| 1088 |
+ ____SPU_ChanUpdate(SPU, chan, FORMAT, INTERPOLATE_MODE, -1); |
|
| 1089 | 1089 |
else if (!chan->pan) |
| 1090 |
- ____SPU_ChanUpdate<FORMAT, INTERPOLATE_MODE, 0>(SPU, chan); |
|
| 1090 |
+ ____SPU_ChanUpdate(SPU, chan, FORMAT, INTERPOLATE_MODE, 0); |
|
| 1091 | 1091 |
else if (chan->pan == 127) |
| 1092 |
- ____SPU_ChanUpdate<FORMAT, INTERPOLATE_MODE, 2>(SPU, chan); |
|
| 1092 |
+ ____SPU_ChanUpdate(SPU, chan, FORMAT, INTERPOLATE_MODE, 2); |
|
| 1093 | 1093 |
else |
| 1094 |
- ____SPU_ChanUpdate<FORMAT, INTERPOLATE_MODE, 1>(SPU, chan); |
|
| 1094 |
+ ____SPU_ChanUpdate(SPU, chan, FORMAT, INTERPOLATE_MODE, 1); |
|
| 1095 | 1095 |
} |
| 1096 | 1096 |
|
| 1097 |
-template<SPUInterpolationMode INTERPOLATE_MODE> static inline void __SPU_ChanUpdate(bool actuallyMix, SPU_struct *const SPU, channel_struct *const chan) |
|
| 1097 |
+static inline void __SPU_ChanUpdate(bool actuallyMix, SPU_struct *const SPU, channel_struct *const chan, SPUInterpolationMode INTERPOLATE_MODE) |
|
| 1098 | 1098 |
{
|
| 1099 | 1099 |
switch (chan->format) |
| 1100 | 1100 |
{
|
| 1101 | 1101 |
case 0: |
| 1102 |
- ___SPU_ChanUpdate<0, INTERPOLATE_MODE>(actuallyMix, SPU, chan); |
|
| 1102 |
+ ___SPU_ChanUpdate(actuallyMix, SPU, chan, 0, INTERPOLATE_MODE); |
|
| 1103 | 1103 |
break; |
| 1104 | 1104 |
case 1: |
| 1105 |
- ___SPU_ChanUpdate<1, INTERPOLATE_MODE>(actuallyMix, SPU, chan); |
|
| 1105 |
+ ___SPU_ChanUpdate(actuallyMix, SPU, chan, 1, INTERPOLATE_MODE); |
|
| 1106 | 1106 |
break; |
| 1107 | 1107 |
case 2: |
| 1108 |
- ___SPU_ChanUpdate<2, INTERPOLATE_MODE>(actuallyMix, SPU, chan); |
|
| 1108 |
+ ___SPU_ChanUpdate(actuallyMix, SPU, chan, 2, INTERPOLATE_MODE); |
|
| 1109 | 1109 |
break; |
| 1110 | 1110 |
case 3: |
| 1111 |
- ___SPU_ChanUpdate<3, INTERPOLATE_MODE>(actuallyMix, SPU, chan); |
|
| 1111 |
+ ___SPU_ChanUpdate(actuallyMix, SPU, chan, 3, INTERPOLATE_MODE); |
|
| 1112 | 1112 |
break; |
| 1113 | 1113 |
default: |
| 1114 | 1114 |
assert(false); |
| ... | ... |
@@ -1120,13 +1120,13 @@ static inline void _SPU_ChanUpdate(bool actuallyMix, SPU_struct *const SPU, chan |
| 1120 | 1120 |
switch (CommonSettings.spuInterpolationMode) |
| 1121 | 1121 |
{
|
| 1122 | 1122 |
case SPUInterpolation_None: |
| 1123 |
- __SPU_ChanUpdate<SPUInterpolation_None>(actuallyMix, SPU, chan); |
|
| 1123 |
+ __SPU_ChanUpdate(actuallyMix, SPU, chan, SPUInterpolation_None); |
|
| 1124 | 1124 |
break; |
| 1125 | 1125 |
case SPUInterpolation_Linear: |
| 1126 |
- __SPU_ChanUpdate<SPUInterpolation_Linear>(actuallyMix, SPU, chan); |
|
| 1126 |
+ __SPU_ChanUpdate(actuallyMix, SPU, chan, SPUInterpolation_Linear); |
|
| 1127 | 1127 |
break; |
| 1128 | 1128 |
case SPUInterpolation_Cosine: |
| 1129 |
- __SPU_ChanUpdate<SPUInterpolation_Cosine>(actuallyMix, SPU, chan); |
|
| 1129 |
+ __SPU_ChanUpdate(actuallyMix, SPU, chan, SPUInterpolation_Cosine); |
|
| 1130 | 1130 |
break; |
| 1131 | 1131 |
default: |
| 1132 | 1132 |
assert(false); |
| ... | ... |
@@ -32,7 +32,7 @@ |
| 32 | 32 |
|
| 33 | 33 |
#define DESMUME_NAME "DeSmuME" |
| 34 | 34 |
|
| 35 |
-#if defined(__x86_64__) || defined(__LP64) || defined(__IA64__) || defined(_M_X64) || defined(_WIN64) |
|
| 35 |
+#if defined(__x86_64__) || defined(__LP64) || defined(__IA64__) || defined(_M_X64) || defined(_WIN64) |
|
| 36 | 36 |
# define DESMUME_PLATFORM_STRING " x64" |
| 37 | 37 |
#elif defined(__i386__) || defined(_M_IX86) || defined(_WIN32) |
| 38 | 38 |
# define DESMUME_PLATFORM_STRING " x86" |