1 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
2 * Mupen64plus-rsp-hle - ucode3mp3.h *
3 * Mupen64Plus homepage: http://code.google.com/p/mupen64plus/ *
4 * Copyright (C) 2009 Richard Goedeken *
5 * Copyright (C) 2002 Hacktarux *
7 * This program is free software; you can redistribute it and/or modify *
8 * it under the terms of the GNU General Public License as published by *
9 * the Free Software Foundation; either version 2 of the License, or *
10 * (at your option) any later version. *
12 * This program is distributed in the hope that it will be useful, *
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15 * GNU General Public License for more details. *
17 * You should have received a copy of the GNU General Public License *
18 * along with this program; if not, write to the *
19 * Free Software Foundation, Inc., *
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
21 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
26 #include "m64p_plugin.h"
29 static const uint16_t DeWindowLUT [0x420] = {
30 0x0000, 0xFFF3, 0x005D, 0xFF38, 0x037A, 0xF736, 0x0B37, 0xC00E,
31 0x7FFF, 0x3FF2, 0x0B37, 0x08CA, 0x037A, 0x00C8, 0x005D, 0x000D,
32 0x0000, 0xFFF3, 0x005D, 0xFF38, 0x037A, 0xF736, 0x0B37, 0xC00E,
33 0x7FFF, 0x3FF2, 0x0B37, 0x08CA, 0x037A, 0x00C8, 0x005D, 0x000D,
34 0x0000, 0xFFF2, 0x005F, 0xFF1D, 0x0369, 0xF697, 0x0A2A, 0xBCE7,
35 0x7FEB, 0x3CCB, 0x0C2B, 0x082B, 0x0385, 0x00AF, 0x005B, 0x000B,
36 0x0000, 0xFFF2, 0x005F, 0xFF1D, 0x0369, 0xF697, 0x0A2A, 0xBCE7,
37 0x7FEB, 0x3CCB, 0x0C2B, 0x082B, 0x0385, 0x00AF, 0x005B, 0x000B,
38 0x0000, 0xFFF1, 0x0061, 0xFF02, 0x0354, 0xF5F9, 0x0905, 0xB9C4,
39 0x7FB0, 0x39A4, 0x0D08, 0x078C, 0x038C, 0x0098, 0x0058, 0x000A,
40 0x0000, 0xFFF1, 0x0061, 0xFF02, 0x0354, 0xF5F9, 0x0905, 0xB9C4,
41 0x7FB0, 0x39A4, 0x0D08, 0x078C, 0x038C, 0x0098, 0x0058, 0x000A,
42 0x0000, 0xFFEF, 0x0062, 0xFEE6, 0x033B, 0xF55C, 0x07C8, 0xB6A4,
43 0x7F4D, 0x367E, 0x0DCE, 0x06EE, 0x038F, 0x0080, 0x0056, 0x0009,
44 0x0000, 0xFFEF, 0x0062, 0xFEE6, 0x033B, 0xF55C, 0x07C8, 0xB6A4,
45 0x7F4D, 0x367E, 0x0DCE, 0x06EE, 0x038F, 0x0080, 0x0056, 0x0009,
46 0x0000, 0xFFEE, 0x0063, 0xFECA, 0x031C, 0xF4C3, 0x0671, 0xB38C,
47 0x7EC2, 0x335D, 0x0E7C, 0x0652, 0x038E, 0x006B, 0x0053, 0x0008,
48 0x0000, 0xFFEE, 0x0063, 0xFECA, 0x031C, 0xF4C3, 0x0671, 0xB38C,
49 0x7EC2, 0x335D, 0x0E7C, 0x0652, 0x038E, 0x006B, 0x0053, 0x0008,
50 0x0000, 0xFFEC, 0x0064, 0xFEAC, 0x02F7, 0xF42C, 0x0502, 0xB07C,
51 0x7E12, 0x3041, 0x0F14, 0x05B7, 0x038A, 0x0056, 0x0050, 0x0007,
52 0x0000, 0xFFEC, 0x0064, 0xFEAC, 0x02F7, 0xF42C, 0x0502, 0xB07C,
53 0x7E12, 0x3041, 0x0F14, 0x05B7, 0x038A, 0x0056, 0x0050, 0x0007,
54 0x0000, 0xFFEB, 0x0064, 0xFE8E, 0x02CE, 0xF399, 0x037A, 0xAD75,
55 0x7D3A, 0x2D2C, 0x0F97, 0x0520, 0x0382, 0x0043, 0x004D, 0x0007,
56 0x0000, 0xFFEB, 0x0064, 0xFE8E, 0x02CE, 0xF399, 0x037A, 0xAD75,
57 0x7D3A, 0x2D2C, 0x0F97, 0x0520, 0x0382, 0x0043, 0x004D, 0x0007,
58 0xFFFF, 0xFFE9, 0x0063, 0xFE6F, 0x029E, 0xF30B, 0x01D8, 0xAA7B,
59 0x7C3D, 0x2A1F, 0x1004, 0x048B, 0x0377, 0x0030, 0x004A, 0x0006,
60 0xFFFF, 0xFFE9, 0x0063, 0xFE6F, 0x029E, 0xF30B, 0x01D8, 0xAA7B,
61 0x7C3D, 0x2A1F, 0x1004, 0x048B, 0x0377, 0x0030, 0x004A, 0x0006,
62 0xFFFF, 0xFFE7, 0x0062, 0xFE4F, 0x0269, 0xF282, 0x001F, 0xA78D,
63 0x7B1A, 0x271C, 0x105D, 0x03F9, 0x036A, 0x001F, 0x0046, 0x0006,
64 0xFFFF, 0xFFE7, 0x0062, 0xFE4F, 0x0269, 0xF282, 0x001F, 0xA78D,
65 0x7B1A, 0x271C, 0x105D, 0x03F9, 0x036A, 0x001F, 0x0046, 0x0006,
66 0xFFFF, 0xFFE4, 0x0061, 0xFE2F, 0x022F, 0xF1FF, 0xFE4C, 0xA4AF,
67 0x79D3, 0x2425, 0x10A2, 0x036C, 0x0359, 0x0010, 0x0043, 0x0005,
68 0xFFFF, 0xFFE4, 0x0061, 0xFE2F, 0x022F, 0xF1FF, 0xFE4C, 0xA4AF,
69 0x79D3, 0x2425, 0x10A2, 0x036C, 0x0359, 0x0010, 0x0043, 0x0005,
70 0xFFFF, 0xFFE2, 0x005E, 0xFE10, 0x01EE, 0xF184, 0xFC61, 0xA1E1,
71 0x7869, 0x2139, 0x10D3, 0x02E3, 0x0346, 0x0001, 0x0040, 0x0004,
72 0xFFFF, 0xFFE2, 0x005E, 0xFE10, 0x01EE, 0xF184, 0xFC61, 0xA1E1,
73 0x7869, 0x2139, 0x10D3, 0x02E3, 0x0346, 0x0001, 0x0040, 0x0004,
74 0xFFFF, 0xFFE0, 0x005B, 0xFDF0, 0x01A8, 0xF111, 0xFA5F, 0x9F27,
75 0x76DB, 0x1E5C, 0x10F2, 0x025E, 0x0331, 0xFFF3, 0x003D, 0x0004,
76 0xFFFF, 0xFFE0, 0x005B, 0xFDF0, 0x01A8, 0xF111, 0xFA5F, 0x9F27,
77 0x76DB, 0x1E5C, 0x10F2, 0x025E, 0x0331, 0xFFF3, 0x003D, 0x0004,
78 0xFFFF, 0xFFDE, 0x0057, 0xFDD0, 0x015B, 0xF0A7, 0xF845, 0x9C80,
79 0x752C, 0x1B8E, 0x1100, 0x01DE, 0x0319, 0xFFE7, 0x003A, 0x0003,
80 0xFFFF, 0xFFDE, 0x0057, 0xFDD0, 0x015B, 0xF0A7, 0xF845, 0x9C80,
81 0x752C, 0x1B8E, 0x1100, 0x01DE, 0x0319, 0xFFE7, 0x003A, 0x0003,
82 0xFFFE, 0xFFDB, 0x0053, 0xFDB0, 0x0108, 0xF046, 0xF613, 0x99EE,
83 0x735C, 0x18D1, 0x10FD, 0x0163, 0x0300, 0xFFDC, 0x0037, 0x0003,
84 0xFFFE, 0xFFDB, 0x0053, 0xFDB0, 0x0108, 0xF046, 0xF613, 0x99EE,
85 0x735C, 0x18D1, 0x10FD, 0x0163, 0x0300, 0xFFDC, 0x0037, 0x0003,
86 0xFFFE, 0xFFD8, 0x004D, 0xFD90, 0x00B0, 0xEFF0, 0xF3CC, 0x9775,
87 0x716C, 0x1624, 0x10EA, 0x00EE, 0x02E5, 0xFFD2, 0x0033, 0x0003,
88 0xFFFE, 0xFFD8, 0x004D, 0xFD90, 0x00B0, 0xEFF0, 0xF3CC, 0x9775,
89 0x716C, 0x1624, 0x10EA, 0x00EE, 0x02E5, 0xFFD2, 0x0033, 0x0003,
90 0xFFFE, 0xFFD6, 0x0047, 0xFD72, 0x0051, 0xEFA6, 0xF16F, 0x9514,
91 0x6F5E, 0x138A, 0x10C8, 0x007E, 0x02CA, 0xFFC9, 0x0030, 0x0003,
92 0xFFFE, 0xFFD6, 0x0047, 0xFD72, 0x0051, 0xEFA6, 0xF16F, 0x9514,
93 0x6F5E, 0x138A, 0x10C8, 0x007E, 0x02CA, 0xFFC9, 0x0030, 0x0003,
94 0xFFFE, 0xFFD3, 0x0040, 0xFD54, 0xFFEC, 0xEF68, 0xEEFC, 0x92CD,
95 0x6D33, 0x1104, 0x1098, 0x0014, 0x02AC, 0xFFC0, 0x002D, 0x0002,
96 0xFFFE, 0xFFD3, 0x0040, 0xFD54, 0xFFEC, 0xEF68, 0xEEFC, 0x92CD,
97 0x6D33, 0x1104, 0x1098, 0x0014, 0x02AC, 0xFFC0, 0x002D, 0x0002,
98 0x0030, 0xFFC9, 0x02CA, 0x007E, 0x10C8, 0x138A, 0x6F5E, 0x9514,
99 0xF16F, 0xEFA6, 0x0051, 0xFD72, 0x0047, 0xFFD6, 0xFFFE, 0x0003,
100 0x0030, 0xFFC9, 0x02CA, 0x007E, 0x10C8, 0x138A, 0x6F5E, 0x9514,
101 0xF16F, 0xEFA6, 0x0051, 0xFD72, 0x0047, 0xFFD6, 0xFFFE, 0x0003,
102 0x0033, 0xFFD2, 0x02E5, 0x00EE, 0x10EA, 0x1624, 0x716C, 0x9775,
103 0xF3CC, 0xEFF0, 0x00B0, 0xFD90, 0x004D, 0xFFD8, 0xFFFE, 0x0003,
104 0x0033, 0xFFD2, 0x02E5, 0x00EE, 0x10EA, 0x1624, 0x716C, 0x9775,
105 0xF3CC, 0xEFF0, 0x00B0, 0xFD90, 0x004D, 0xFFD8, 0xFFFE, 0x0003,
106 0x0037, 0xFFDC, 0x0300, 0x0163, 0x10FD, 0x18D1, 0x735C, 0x99EE,
107 0xF613, 0xF046, 0x0108, 0xFDB0, 0x0053, 0xFFDB, 0xFFFE, 0x0003,
108 0x0037, 0xFFDC, 0x0300, 0x0163, 0x10FD, 0x18D1, 0x735C, 0x99EE,
109 0xF613, 0xF046, 0x0108, 0xFDB0, 0x0053, 0xFFDB, 0xFFFE, 0x0003,
110 0x003A, 0xFFE7, 0x0319, 0x01DE, 0x1100, 0x1B8E, 0x752C, 0x9C80,
111 0xF845, 0xF0A7, 0x015B, 0xFDD0, 0x0057, 0xFFDE, 0xFFFF, 0x0003,
112 0x003A, 0xFFE7, 0x0319, 0x01DE, 0x1100, 0x1B8E, 0x752C, 0x9C80,
113 0xF845, 0xF0A7, 0x015B, 0xFDD0, 0x0057, 0xFFDE, 0xFFFF, 0x0004,
114 0x003D, 0xFFF3, 0x0331, 0x025E, 0x10F2, 0x1E5C, 0x76DB, 0x9F27,
115 0xFA5F, 0xF111, 0x01A8, 0xFDF0, 0x005B, 0xFFE0, 0xFFFF, 0x0004,
116 0x003D, 0xFFF3, 0x0331, 0x025E, 0x10F2, 0x1E5C, 0x76DB, 0x9F27,
117 0xFA5F, 0xF111, 0x01A8, 0xFDF0, 0x005B, 0xFFE0, 0xFFFF, 0x0004,
118 0x0040, 0x0001, 0x0346, 0x02E3, 0x10D3, 0x2139, 0x7869, 0xA1E1,
119 0xFC61, 0xF184, 0x01EE, 0xFE10, 0x005E, 0xFFE2, 0xFFFF, 0x0004,
120 0x0040, 0x0001, 0x0346, 0x02E3, 0x10D3, 0x2139, 0x7869, 0xA1E1,
121 0xFC61, 0xF184, 0x01EE, 0xFE10, 0x005E, 0xFFE2, 0xFFFF, 0x0005,
122 0x0043, 0x0010, 0x0359, 0x036C, 0x10A2, 0x2425, 0x79D3, 0xA4AF,
123 0xFE4C, 0xF1FF, 0x022F, 0xFE2F, 0x0061, 0xFFE4, 0xFFFF, 0x0005,
124 0x0043, 0x0010, 0x0359, 0x036C, 0x10A2, 0x2425, 0x79D3, 0xA4AF,
125 0xFE4C, 0xF1FF, 0x022F, 0xFE2F, 0x0061, 0xFFE4, 0xFFFF, 0x0006,
126 0x0046, 0x001F, 0x036A, 0x03F9, 0x105D, 0x271C, 0x7B1A, 0xA78D,
127 0x001F, 0xF282, 0x0269, 0xFE4F, 0x0062, 0xFFE7, 0xFFFF, 0x0006,
128 0x0046, 0x001F, 0x036A, 0x03F9, 0x105D, 0x271C, 0x7B1A, 0xA78D,
129 0x001F, 0xF282, 0x0269, 0xFE4F, 0x0062, 0xFFE7, 0xFFFF, 0x0006,
130 0x004A, 0x0030, 0x0377, 0x048B, 0x1004, 0x2A1F, 0x7C3D, 0xAA7B,
131 0x01D8, 0xF30B, 0x029E, 0xFE6F, 0x0063, 0xFFE9, 0xFFFF, 0x0006,
132 0x004A, 0x0030, 0x0377, 0x048B, 0x1004, 0x2A1F, 0x7C3D, 0xAA7B,
133 0x01D8, 0xF30B, 0x029E, 0xFE6F, 0x0063, 0xFFE9, 0xFFFF, 0x0007,
134 0x004D, 0x0043, 0x0382, 0x0520, 0x0F97, 0x2D2C, 0x7D3A, 0xAD75,
135 0x037A, 0xF399, 0x02CE, 0xFE8E, 0x0064, 0xFFEB, 0x0000, 0x0007,
136 0x004D, 0x0043, 0x0382, 0x0520, 0x0F97, 0x2D2C, 0x7D3A, 0xAD75,
137 0x037A, 0xF399, 0x02CE, 0xFE8E, 0x0064, 0xFFEB, 0x0000, 0x0007,
138 0x0050, 0x0056, 0x038A, 0x05B7, 0x0F14, 0x3041, 0x7E12, 0xB07C,
139 0x0502, 0xF42C, 0x02F7, 0xFEAC, 0x0064, 0xFFEC, 0x0000, 0x0007,
140 0x0050, 0x0056, 0x038A, 0x05B7, 0x0F14, 0x3041, 0x7E12, 0xB07C,
141 0x0502, 0xF42C, 0x02F7, 0xFEAC, 0x0064, 0xFFEC, 0x0000, 0x0008,
142 0x0053, 0x006B, 0x038E, 0x0652, 0x0E7C, 0x335D, 0x7EC2, 0xB38C,
143 0x0671, 0xF4C3, 0x031C, 0xFECA, 0x0063, 0xFFEE, 0x0000, 0x0008,
144 0x0053, 0x006B, 0x038E, 0x0652, 0x0E7C, 0x335D, 0x7EC2, 0xB38C,
145 0x0671, 0xF4C3, 0x031C, 0xFECA, 0x0063, 0xFFEE, 0x0000, 0x0009,
146 0x0056, 0x0080, 0x038F, 0x06EE, 0x0DCE, 0x367E, 0x7F4D, 0xB6A4,
147 0x07C8, 0xF55C, 0x033B, 0xFEE6, 0x0062, 0xFFEF, 0x0000, 0x0009,
148 0x0056, 0x0080, 0x038F, 0x06EE, 0x0DCE, 0x367E, 0x7F4D, 0xB6A4,
149 0x07C8, 0xF55C, 0x033B, 0xFEE6, 0x0062, 0xFFEF, 0x0000, 0x000A,
150 0x0058, 0x0098, 0x038C, 0x078C, 0x0D08, 0x39A4, 0x7FB0, 0xB9C4,
151 0x0905, 0xF5F9, 0x0354, 0xFF02, 0x0061, 0xFFF1, 0x0000, 0x000A,
152 0x0058, 0x0098, 0x038C, 0x078C, 0x0D08, 0x39A4, 0x7FB0, 0xB9C4,
153 0x0905, 0xF5F9, 0x0354, 0xFF02, 0x0061, 0xFFF1, 0x0000, 0x000B,
154 0x005B, 0x00AF, 0x0385, 0x082B, 0x0C2B, 0x3CCB, 0x7FEB, 0xBCE7,
155 0x0A2A, 0xF697, 0x0369, 0xFF1D, 0x005F, 0xFFF2, 0x0000, 0x000B,
156 0x005B, 0x00AF, 0x0385, 0x082B, 0x0C2B, 0x3CCB, 0x7FEB, 0xBCE7,
157 0x0A2A, 0xF697, 0x0369, 0xFF1D, 0x005F, 0xFFF2, 0x0000, 0x000D,
158 0x005D, 0x00C8, 0x037A, 0x08CA, 0x0B37, 0x3FF2, 0x7FFF, 0xC00E,
159 0x0B37, 0xF736, 0x037A, 0xFF38, 0x005D, 0xFFF3, 0x0000, 0x000D,
160 0x005D, 0x00C8, 0x037A, 0x08CA, 0x0B37, 0x3FF2, 0x7FFF, 0xC00E,
161 0x0B37, 0xF736, 0x037A, 0xFF38, 0x005D, 0xFFF3, 0x0000, 0x0000
164 static uint8_t mp3data[0x1000];
166 static int32_t v[32];
168 static void MP3AB0(void)
170 /* Part 2 - 100% Accurate */
171 static const uint16_t LUT2[8] = {
172 0xFEC4, 0xF4FA, 0xC5E4, 0xE1C4,
173 0x1916, 0x4A50, 0xA268, 0x78AE
175 static const uint16_t LUT3[4] = { 0xFB14, 0xD4DC, 0x31F2, 0x8E3A };
178 for (i = 0; i < 8; i++) {
179 v[16 + i] = v[0 + i] + v[8 + i];
180 v[24 + i] = ((v[0 + i] - v[8 + i]) * LUT2[i]) >> 0x10;
183 /* Part 3: 4-wide butterflies */
185 for (i = 0; i < 4; i++) {
186 v[0 + i] = v[16 + i] + v[20 + i];
187 v[4 + i] = ((v[16 + i] - v[20 + i]) * LUT3[i]) >> 0x10;
189 v[8 + i] = v[24 + i] + v[28 + i];
190 v[12 + i] = ((v[24 + i] - v[28 + i]) * LUT3[i]) >> 0x10;
193 /* Part 4: 2-wide butterflies - 100% Accurate */
195 for (i = 0; i < 16; i += 4) {
196 v[16 + i] = v[0 + i] + v[2 + i];
197 v[18 + i] = ((v[0 + i] - v[2 + i]) * 0xEC84) >> 0x10;
199 v[17 + i] = v[1 + i] + v[3 + i];
200 v[19 + i] = ((v[1 + i] - v[3 + i]) * 0x61F8) >> 0x10;
204 static void InnerLoop();
206 static uint32_t inPtr, outPtr;
208 static uint32_t t6;/* = 0x08A0; - I think these are temporary storage buffers */
209 static uint32_t t5;/* = 0x0AC0; */
210 static uint32_t t4;/* = (inst1 & 0x1E); */
212 void MP3(uint32_t inst1, uint32_t inst2)
214 /* Initialization Code */
215 uint32_t readPtr; /* s5 */
216 uint32_t writePtr; /* s6 */
220 /* I think these are temporary storage buffers */
225 writePtr = inst2 & 0xFFFFFF;
227 /* Just do that for efficiency... may remove and use directly later anyway */
228 memcpy(mp3data + 0xCE8, rsp.RDRAM + readPtr, 8);
229 /* This must be a header byte or whatnot */
232 for (cnt = 0; cnt < 0x480; cnt += 0x180) {
233 /* DMA: 0xCF0 <- RDRAM[s5] : 0x180 */
234 memcpy(mp3data + 0xCF0, rsp.RDRAM + readPtr, 0x180);
235 inPtr = 0xCF0; /* s7 */
236 outPtr = 0xE70; /* s3 */
237 /* --------------- Inner Loop Start -------------------- */
238 for (cnt2 = 0; cnt2 < 0x180; cnt2 += 0x40) {
244 t4 = (t4 - 2) & 0x1E;
250 /* --------------- Inner Loop End -------------------- */
251 memcpy(rsp.RDRAM + writePtr, mp3data + 0xe70, 0x180);
259 static void InnerLoop(void)
261 /* Part 1: 100% Accurate */
263 /* 0, 1, 3, 2, 7, 6, 4, 5, 7, 6, 4, 5, 0, 1, 3, 2 */
264 static const uint16_t LUT6[16] = {
265 0xFFB2, 0xFD3A, 0xF10A, 0xF854,
266 0xBDAE, 0xCDA0, 0xE76C, 0xDB94,
267 0x1920, 0x4B20, 0xAC7C, 0x7C68,
268 0xABEC, 0x9880, 0xDAE8, 0x839C
275 int32_t v2 = 0, v4 = 0, v6 = 0, v8 = 0;
286 v[0] = *(int16_t *)(mp3data + inPtr + (0x00 ^ S16));
287 v[31] = *(int16_t *)(mp3data + inPtr + (0x3E ^ S16));
289 v[1] = *(int16_t *)(mp3data + inPtr + (0x02 ^ S16));
290 v[30] = *(int16_t *)(mp3data + inPtr + (0x3C ^ S16));
292 v[2] = *(int16_t *)(mp3data + inPtr + (0x06 ^ S16));
293 v[28] = *(int16_t *)(mp3data + inPtr + (0x38 ^ S16));
295 v[3] = *(int16_t *)(mp3data + inPtr + (0x04 ^ S16));
296 v[29] = *(int16_t *)(mp3data + inPtr + (0x3A ^ S16));
299 v[4] = *(int16_t *)(mp3data + inPtr + (0x0E ^ S16));
300 v[24] = *(int16_t *)(mp3data + inPtr + (0x30 ^ S16));
302 v[5] = *(int16_t *)(mp3data + inPtr + (0x0C ^ S16));
303 v[25] = *(int16_t *)(mp3data + inPtr + (0x32 ^ S16));
305 v[6] = *(int16_t *)(mp3data + inPtr + (0x08 ^ S16));
306 v[27] = *(int16_t *)(mp3data + inPtr + (0x36 ^ S16));
308 v[7] = *(int16_t *)(mp3data + inPtr + (0x0A ^ S16));
309 v[26] = *(int16_t *)(mp3data + inPtr + (0x34 ^ S16));
312 v[8] = *(int16_t *)(mp3data + inPtr + (0x1E ^ S16));
313 v[16] = *(int16_t *)(mp3data + inPtr + (0x20 ^ S16));
315 v[9] = *(int16_t *)(mp3data + inPtr + (0x1C ^ S16));
316 v[17] = *(int16_t *)(mp3data + inPtr + (0x22 ^ S16));
318 v[10] = *(int16_t *)(mp3data + inPtr + (0x18 ^ S16));
319 v[19] = *(int16_t *)(mp3data + inPtr + (0x26 ^ S16));
321 v[11] = *(int16_t *)(mp3data + inPtr + (0x1A ^ S16));
322 v[18] = *(int16_t *)(mp3data + inPtr + (0x24 ^ S16));
325 v[12] = *(int16_t *)(mp3data + inPtr + (0x10 ^ S16));
326 v[23] = *(int16_t *)(mp3data + inPtr + (0x2E ^ S16));
328 v[13] = *(int16_t *)(mp3data + inPtr + (0x12 ^ S16));
329 v[22] = *(int16_t *)(mp3data + inPtr + (0x2C ^ S16));
331 v[14] = *(int16_t *)(mp3data + inPtr + (0x16 ^ S16));
332 v[20] = *(int16_t *)(mp3data + inPtr + (0x28 ^ S16));
334 v[15] = *(int16_t *)(mp3data + inPtr + (0x14 ^ S16));
335 v[21] = *(int16_t *)(mp3data + inPtr + (0x2A ^ S16));
342 /* Part 5 - 1-Wide Butterflies - 100% Accurate but need SSVs!!! */
351 v[11] = ((v[16] - v[17]) * 0xB504) >> 0x10;
353 v[16] = -v[16] - v[17];
354 v[2] = v[18] + v[19];
355 /* ** Store v[11] -> (T6 + 0)** */
356 *(int16_t *)(mp3data + ((t6 + (short)0x0))) = (short)v[11];
360 /* ** Store v[16] -> (T3 + 0)** */
361 *(int16_t *)(mp3data + ((t3 + (short)0x0))) = (short)v[16];
362 /* ** Store v[11] -> (T5 + 0)** */
363 *(int16_t *)(mp3data + ((t5 + (short)0x0))) = (short)v[11];
364 /* 0x13E8 - Verified.... */
366 /* ** Store v[2] -> (T2 + 0)** */
367 *(int16_t *)(mp3data + ((t2 + (short)0x0))) = (short)v[2];
368 v[3] = (((v[18] - v[19]) * 0x16A09) >> 0x10) + v[2];
369 /* ** Store v[3] -> (T0 + 0)** */
370 *(int16_t *)(mp3data + ((t0 + (short)0x0))) = (short)v[3];
371 /* 0x1400 - Verified */
372 v[4] = -v[20] - v[21];
373 v[6] = v[22] + v[23];
374 v[5] = ((v[20] - v[21]) * 0x16A09) >> 0x10;
375 /* ** Store v[4] -> (T3 + 0xFF80) */
376 *(int16_t *)(mp3data + ((t3 + (short)0xFF80))) = (short)v[4];
377 v[7] = ((v[22] - v[23]) * 0x2D413) >> 0x10;
383 /* *** Store v[7] -> (T1 + 0xFF80) */
384 *(int16_t *)(mp3data + ((t1 + (short)0xFF80))) = (short)v[7];
385 /* *** Store v[4] -> (T2 + 0xFF80) */
386 *(int16_t *)(mp3data + ((t2 + (short)0xFF80))) = (short)v[4];
387 /* *** Store v[5] -> (T0 + 0xFF80) */
388 *(int16_t *)(mp3data + ((t0 + (short)0xFF80))) = (short)v[5];
389 v[8] = v[24] + v[25];
392 v[9] = ((v[24] - v[25]) * 0x16A09) >> 0x10;
394 v[11] = ((v[26] - v[27]) * 0x2D413) >> 0x10;
395 v[13] = ((v[28] - v[29]) * 0x2D413) >> 0x10;
397 v[10] = v[26] + v[27];
398 v[10] = v[10] + v[10];
399 v[12] = v[28] + v[29];
400 v[12] = v[12] + v[12];
401 v[14] = v[30] + v[31];
403 v[14] = v[14] + v[14];
404 v[13] = (v[13] - v[2]) + v[12];
405 v[15] = (((v[30] - v[31]) * 0x5A827) >> 0x10) - (v[11] + v[2]);
406 v[14] = -(v[14] + v[14]) + v[3];
407 v[17] = v[13] - v[10];
409 /* ** Store v[9] -> (T6 + 0x40) */
410 *(int16_t *)(mp3data + ((t6 + (short)0x40))) = (short)v[9];
411 v[11] = v[11] - v[13];
412 /* ** Store v[17] -> (T0 + 0xFFC0) */
413 *(int16_t *)(mp3data + ((t0 + (short)0xFFC0))) = (short)v[17];
414 v[12] = v[8] - v[12];
415 /* ** Store v[11] -> (T0 + 0x40) */
416 *(int16_t *)(mp3data + ((t0 + (short)0x40))) = (short)v[11];
418 /* ** Store v[15] -> (T1 + 0xFFC0) */
419 *(int16_t *)(mp3data + ((t1 + (short)0xFFC0))) = (short)v[15];
420 v[10] = -v[10] - v[12];
421 /* ** Store v[12] -> (T2 + 0x40) */
422 *(int16_t *)(mp3data + ((t2 + (short)0x40))) = (short)v[12];
423 /* ** Store v[8] -> (T3 + 0xFFC0) */
424 *(int16_t *)(mp3data + ((t3 + (short)0xFFC0))) = (short)v[8];
425 /* ** Store v[14] -> (T5 + 0x40) */
426 *(int16_t *)(mp3data + ((t5 + (short)0x40))) = (short)v[14];
427 /* ** Store v[10] -> (T2 + 0xFFC0) */
428 *(int16_t *)(mp3data + ((t2 + (short)0xFFC0))) = (short)v[10];
429 /* 0x14FC - Verified... */
431 /* Part 6 - 100% Accurate */
433 v[0] = *(int16_t *)(mp3data + inPtr + (0x00 ^ S16));
434 v[31] = *(int16_t *)(mp3data + inPtr + (0x3E ^ S16));
436 v[1] = *(int16_t *)(mp3data + inPtr + (0x02 ^ S16));
437 v[30] = *(int16_t *)(mp3data + inPtr + (0x3C ^ S16));
439 v[2] = *(int16_t *)(mp3data + inPtr + (0x06 ^ S16));
440 v[28] = *(int16_t *)(mp3data + inPtr + (0x38 ^ S16));
442 v[3] = *(int16_t *)(mp3data + inPtr + (0x04 ^ S16));
443 v[29] = *(int16_t *)(mp3data + inPtr + (0x3A ^ S16));
446 v[4] = *(int16_t *)(mp3data + inPtr + (0x0E ^ S16));
447 v[24] = *(int16_t *)(mp3data + inPtr + (0x30 ^ S16));
449 v[5] = *(int16_t *)(mp3data + inPtr + (0x0C ^ S16));
450 v[25] = *(int16_t *)(mp3data + inPtr + (0x32 ^ S16));
452 v[6] = *(int16_t *)(mp3data + inPtr + (0x08 ^ S16));
453 v[27] = *(int16_t *)(mp3data + inPtr + (0x36 ^ S16));
455 v[7] = *(int16_t *)(mp3data + inPtr + (0x0A ^ S16));
456 v[26] = *(int16_t *)(mp3data + inPtr + (0x34 ^ S16));
459 v[8] = *(int16_t *)(mp3data + inPtr + (0x1E ^ S16));
460 v[16] = *(int16_t *)(mp3data + inPtr + (0x20 ^ S16));
462 v[9] = *(int16_t *)(mp3data + inPtr + (0x1C ^ S16));
463 v[17] = *(int16_t *)(mp3data + inPtr + (0x22 ^ S16));
465 v[10] = *(int16_t *)(mp3data + inPtr + (0x18 ^ S16));
466 v[19] = *(int16_t *)(mp3data + inPtr + (0x26 ^ S16));
468 v[11] = *(int16_t *)(mp3data + inPtr + (0x1A ^ S16));
469 v[18] = *(int16_t *)(mp3data + inPtr + (0x24 ^ S16));
472 v[12] = *(int16_t *)(mp3data + inPtr + (0x10 ^ S16));
473 v[23] = *(int16_t *)(mp3data + inPtr + (0x2E ^ S16));
475 v[13] = *(int16_t *)(mp3data + inPtr + (0x12 ^ S16));
476 v[22] = *(int16_t *)(mp3data + inPtr + (0x2C ^ S16));
478 v[14] = *(int16_t *)(mp3data + inPtr + (0x16 ^ S16));
479 v[20] = *(int16_t *)(mp3data + inPtr + (0x28 ^ S16));
481 v[15] = *(int16_t *)(mp3data + inPtr + (0x14 ^ S16));
482 v[21] = *(int16_t *)(mp3data + inPtr + (0x2A ^ S16));
485 for (i = 0; i < 16; i++)
486 v[0 + i] = (v[0 + i] * LUT6[i]) >> 0x10;
495 v[12] = v[12] + v[12];
496 v[13] = v[13] + v[13];
497 v[15] = v[15] + v[15];
501 /* Part 7: - 100% Accurate + SSV - Unoptimized */
503 v[0] = (v[17] + v[16]) >> 1;
504 v[1] = ((v[17] * (int)((short)0xA57E * 2)) + (v[16] * 0xB504)) >> 0x10;
505 v[2] = -v[18] - v[19];
506 v[3] = ((v[18] - v[19]) * 0x16A09) >> 0x10;
507 v[4] = v[20] + v[21] + v[0];
508 v[5] = (((v[20] - v[21]) * 0x16A09) >> 0x10) + v[1];
509 v[6] = (((v[22] + v[23]) << 1) + v[0]) - v[2];
510 v[7] = (((v[22] - v[23]) * 0x2D413) >> 0x10) + v[0] + v[1] + v[3];
512 /* Save v[0] -> (T3 + 0xFFE0) */
513 *(int16_t *)(mp3data + ((t3 + (short)0xFFE0))) = (short) - v[0];
514 v[8] = v[24] + v[25];
515 v[9] = ((v[24] - v[25]) * 0x16A09) >> 0x10;
516 v[10] = ((v[26] + v[27]) << 1) + v[8];
517 v[11] = (((v[26] - v[27]) * 0x2D413) >> 0x10) + v[8] + v[9];
518 v[12] = v[4] - ((v[28] + v[29]) << 1);
519 /* ** Store v12 -> (T2 + 0x20) */
520 *(int16_t *)(mp3data + ((t2 + (short)0x20))) = (short)v[12];
521 v[13] = (((v[28] - v[29]) * 0x2D413) >> 0x10) - v[12] - v[5];
522 v[14] = v[30] + v[31];
523 v[14] = v[14] + v[14];
524 v[14] = v[14] + v[14];
525 v[14] = v[6] - v[14];
526 v[15] = (((v[30] - v[31]) * 0x5A827) >> 0x10) - v[7];
527 /* Store v14 -> (T5 + 0x20) */
528 *(int16_t *)(mp3data + ((t5 + (short)0x20))) = (short)v[14];
529 v[14] = v[14] + v[1];
530 /* Store v[14] -> (T6 + 0x20) */
531 *(int16_t *)(mp3data + ((t6 + (short)0x20))) = (short)v[14];
532 /* Store v[15] -> (T1 + 0xFFE0) */
533 *(int16_t *)(mp3data + ((t1 + (short)0xFFE0))) = (short)v[15];
538 /* Store v[6] -> (T5 + 0x60) */
539 *(int16_t *)(mp3data + ((t5 + (short)0x60))) = (short)v[6];
540 v[10] = v[10] + v[2];
541 v[10] = v[4] - v[10];
542 /* Store v[10] -> (T2 + 0xFFA0) */
543 *(int16_t *)(mp3data + ((t2 + (short)0xFFA0))) = (short)v[10];
544 v[12] = v[2] - v[12];
545 /* Store v[12] -> (T2 + 0xFFE0) */
546 *(int16_t *)(mp3data + ((t2 + (short)0xFFE0))) = (short)v[12];
549 /* Store v[4] -> (T2 + 0x60) */
550 *(int16_t *)(mp3data + ((t2 + (short)0x60))) = (short)v[4];
552 /* Store v[0] -> (T3 + 0xFFA0) */
553 *(int16_t *)(mp3data + ((t3 + (short)0xFFA0))) = (short)v[0];
555 /* Store v[7] -> (T1 + 0xFFA0) */
556 *(int16_t *)(mp3data + ((t1 + (short)0xFFA0))) = (short)v[7];
557 v[11] = v[11] - v[3];
558 /* Store v[1] -> (T6 + 0x60) */
559 *(int16_t *)(mp3data + ((t6 + (short)0x60))) = (short)v[1];
560 v[11] = v[11] - v[5];
561 /* Store v[11] -> (T0 + 0x60) */
562 *(int16_t *)(mp3data + ((t0 + (short)0x60))) = (short)v[11];
564 /* Store v[3] -> (T0 + 0x20) */
565 *(int16_t *)(mp3data + ((t0 + (short)0x20))) = (short)v[3];
566 v[13] = v[13] + v[2];
567 /* Store v[13] -> (T0 + 0xFFE0) */
568 *(int16_t *)(mp3data + ((t0 + (short)0xFFE0))) = (short)v[13];
569 v[2] = (v[5] - v[2]) - v[9];
570 /* Store v[2] -> (T0 + 0xFFA0) */
571 *(int16_t *)(mp3data + ((t0 + (short)0xFFA0))) = (short)v[2];
572 /* 0x7A8 - Verified... */
574 /* Step 8 - Dewindowing */
576 addptr = t6 & 0xFFE0;
578 offset = 0x10 - (t4 >> 1);
579 for (x = 0; x < 8; x++) {
582 v2 = v4 = v6 = v8 = 0;
584 for (i = 7; i >= 0; i--) {
585 v2 += ((int) * (int16_t *)(mp3data + (addptr) + 0x00) * (short)DeWindowLUT[offset + 0x00] + 0x4000) >> 0xF;
586 v4 += ((int) * (int16_t *)(mp3data + (addptr) + 0x10) * (short)DeWindowLUT[offset + 0x08] + 0x4000) >> 0xF;
587 v6 += ((int) * (int16_t *)(mp3data + (addptr) + 0x20) * (short)DeWindowLUT[offset + 0x20] + 0x4000) >> 0xF;
588 v8 += ((int) * (int16_t *)(mp3data + (addptr) + 0x30) * (short)DeWindowLUT[offset + 0x28] + 0x4000) >> 0xF;
597 *(int16_t *)(mp3data + (outPtr ^ S16)) = v0;
598 *(int16_t *)(mp3data + ((outPtr + 2)^S16)) = v18;
604 offset = 0x10 - (t4 >> 1) + 8 * 0x40;
606 for (i = 0; i < 4; i++) {
607 v2 += ((int) * (int16_t *)(mp3data + (addptr) + 0x00) * (short)DeWindowLUT[offset + 0x00] + 0x4000) >> 0xF;
608 v2 += ((int) * (int16_t *)(mp3data + (addptr) + 0x10) * (short)DeWindowLUT[offset + 0x08] + 0x4000) >> 0xF;
611 v4 += ((int) * (int16_t *)(mp3data + (addptr) + 0x00) * (short)DeWindowLUT[offset + 0x00] + 0x4000) >> 0xF;
612 v4 += ((int) * (int16_t *)(mp3data + (addptr) + 0x10) * (short)DeWindowLUT[offset + 0x08] + 0x4000) >> 0xF;
616 mult6 = *(int32_t *)(mp3data + 0xCE8);
617 mult4 = *(int32_t *)(mp3data + 0xCEC);
619 v2 = (v2 **(uint32_t *)(mp3data + 0xCE8)) >> 0x10;
620 *(int16_t *)(mp3data + (outPtr ^ S16)) = v2;
622 v4 = (v4 **(uint32_t *)(mp3data + 0xCE8)) >> 0x10;
623 *(int16_t *)(mp3data + (outPtr ^ S16)) = v4;
624 mult4 = *(uint32_t *)(mp3data + 0xCE8);
628 for (x = 0; x < 8; x++) {
631 v2 = v4 = v6 = v8 = 0;
633 offset = (0x22F - (t4 >> 1) + x * 0x40);
635 for (i = 0; i < 4; i++) {
636 v2 += ((int) * (int16_t *)(mp3data + (addptr) + 0x20) * (short)DeWindowLUT[offset + 0x00] + 0x4000) >> 0xF;
637 v2 -= ((int) * (int16_t *)(mp3data + ((addptr + 2)) + 0x20) * (short)DeWindowLUT[offset + 0x01] + 0x4000) >> 0xF;
638 v4 += ((int) * (int16_t *)(mp3data + (addptr) + 0x30) * (short)DeWindowLUT[offset + 0x08] + 0x4000) >> 0xF;
639 v4 -= ((int) * (int16_t *)(mp3data + ((addptr + 2)) + 0x30) * (short)DeWindowLUT[offset + 0x09] + 0x4000) >> 0xF;
640 v6 += ((int) * (int16_t *)(mp3data + (addptr) + 0x00) * (short)DeWindowLUT[offset + 0x20] + 0x4000) >> 0xF;
641 v6 -= ((int) * (int16_t *)(mp3data + ((addptr + 2)) + 0x00) * (short)DeWindowLUT[offset + 0x21] + 0x4000) >> 0xF;
642 v8 += ((int) * (int16_t *)(mp3data + (addptr) + 0x10) * (short)DeWindowLUT[offset + 0x28] + 0x4000) >> 0xF;
643 v8 -= ((int) * (int16_t *)(mp3data + ((addptr + 2)) + 0x10) * (short)DeWindowLUT[offset + 0x29] + 0x4000) >> 0xF;
652 *(int16_t *)(mp3data + ((outPtr + 2)^S16)) = v0;
653 *(int16_t *)(mp3data + ((outPtr + 4)^S16)) = v18;
662 hi0 = (int)hi0 >> 0x10;
663 hi1 = (int)hi1 >> 0x10;
664 for (i = 0; i < 8; i++) {
666 vt = (*(int16_t *)(mp3data + ((tmp - 0x40)^S16)) * hi0);
673 *(int16_t *)((uint8_t *)mp3data + ((tmp - 0x40)^S16)) = (int16_t)vt;
676 vt = (*(int16_t *)(mp3data + ((tmp - 0x30)^S16)) * hi0);
683 *(int16_t *)((uint8_t *)mp3data + ((tmp - 0x30)^S16)) = vt;
686 vt = (*(int16_t *)(mp3data + ((tmp - 0x1E)^S16)) * hi1);
693 *(int16_t *)((uint8_t *)mp3data + ((tmp - 0x1E)^S16)) = vt;
696 vt = (*(int16_t *)(mp3data + ((tmp - 0xE)^S16)) * hi1);
703 *(int16_t *)((uint8_t *)mp3data + ((tmp - 0xE)^S16)) = vt;