RSP: Added some missing files
[mupen64plus-pandora.git] / source / mupen64plus-rsp-hle / src / ucode3mp3.c
CommitLineData
df00ea13 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 *
6 * *
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. *
11 * *
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. *
16 * *
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 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
22
23# include <string.h>
24#include <stdint.h>
25
26#include "m64p_plugin.h"
27#include "hle.h"
28
29static 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
162};
163
164static uint8_t mp3data[0x1000];
165
166static int32_t v[32];
167
168static void MP3AB0(void)
169{
170 /* Part 2 - 100% Accurate */
171 static const uint16_t LUT2[8] = {
172 0xFEC4, 0xF4FA, 0xC5E4, 0xE1C4,
173 0x1916, 0x4A50, 0xA268, 0x78AE
174 };
175 static const uint16_t LUT3[4] = { 0xFB14, 0xD4DC, 0x31F2, 0x8E3A };
176 int i;
177
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;
181 }
182
183 /* Part 3: 4-wide butterflies */
184
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;
188
189 v[8 + i] = v[24 + i] + v[28 + i];
190 v[12 + i] = ((v[24 + i] - v[28 + i]) * LUT3[i]) >> 0x10;
191 }
192
193 /* Part 4: 2-wide butterflies - 100% Accurate */
194
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;
198
199 v[17 + i] = v[1 + i] + v[3 + i];
200 v[19 + i] = ((v[1 + i] - v[3 + i]) * 0x61F8) >> 0x10;
201 }
202}
203
204static void InnerLoop();
205
206static uint32_t inPtr, outPtr;
207
208static uint32_t t6;/* = 0x08A0; - I think these are temporary storage buffers */
209static uint32_t t5;/* = 0x0AC0; */
210static uint32_t t4;/* = (inst1 & 0x1E); */
211
212void MP3(uint32_t inst1, uint32_t inst2)
213{
214 /* Initialization Code */
215 uint32_t readPtr; /* s5 */
216 uint32_t writePtr; /* s6 */
217 uint32_t tmp;
218 int cnt, cnt2;
219
220 /* I think these are temporary storage buffers */
221 t6 = 0x08A0;
222 t5 = 0x0AC0;
223 t4 = (inst1 & 0x1E);
224
225 writePtr = inst2 & 0xFFFFFF;
226 readPtr = writePtr;
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 */
230 readPtr += 8;
231
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) {
239 t6 &= 0xFFE0;
240 t5 &= 0xFFE0;
241 t6 |= t4;
242 t5 |= t4;
243 InnerLoop();
244 t4 = (t4 - 2) & 0x1E;
245 tmp = t6;
246 t6 = t5;
247 t5 = tmp;
248 inPtr += 0x40;
249 }
250/* --------------- Inner Loop End -------------------- */
251 memcpy(rsp.RDRAM + writePtr, mp3data + 0xe70, 0x180);
252 writePtr += 0x180;
253 readPtr += 0x180;
254 }
255}
256
257
258
259static void InnerLoop(void)
260{
261 /* Part 1: 100% Accurate */
262
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
269 };
270 int i;
271 uint32_t t0;
272 uint32_t t1;
273 uint32_t t2;
274 uint32_t t3;
275 int32_t v2 = 0, v4 = 0, v6 = 0, v8 = 0;
276 uint32_t offset;
277 uint32_t addptr;
278 int x;
279 int32_t mult6;
280 int32_t mult4;
281 int tmp;
282 int32_t hi0;
283 int32_t hi1;
284 int32_t vt;
285
286 v[0] = *(int16_t *)(mp3data + inPtr + (0x00 ^ S16));
287 v[31] = *(int16_t *)(mp3data + inPtr + (0x3E ^ S16));
288 v[0] += v[31];
289 v[1] = *(int16_t *)(mp3data + inPtr + (0x02 ^ S16));
290 v[30] = *(int16_t *)(mp3data + inPtr + (0x3C ^ S16));
291 v[1] += v[30];
292 v[2] = *(int16_t *)(mp3data + inPtr + (0x06 ^ S16));
293 v[28] = *(int16_t *)(mp3data + inPtr + (0x38 ^ S16));
294 v[2] += v[28];
295 v[3] = *(int16_t *)(mp3data + inPtr + (0x04 ^ S16));
296 v[29] = *(int16_t *)(mp3data + inPtr + (0x3A ^ S16));
297 v[3] += v[29];
298
299 v[4] = *(int16_t *)(mp3data + inPtr + (0x0E ^ S16));
300 v[24] = *(int16_t *)(mp3data + inPtr + (0x30 ^ S16));
301 v[4] += v[24];
302 v[5] = *(int16_t *)(mp3data + inPtr + (0x0C ^ S16));
303 v[25] = *(int16_t *)(mp3data + inPtr + (0x32 ^ S16));
304 v[5] += v[25];
305 v[6] = *(int16_t *)(mp3data + inPtr + (0x08 ^ S16));
306 v[27] = *(int16_t *)(mp3data + inPtr + (0x36 ^ S16));
307 v[6] += v[27];
308 v[7] = *(int16_t *)(mp3data + inPtr + (0x0A ^ S16));
309 v[26] = *(int16_t *)(mp3data + inPtr + (0x34 ^ S16));
310 v[7] += v[26];
311
312 v[8] = *(int16_t *)(mp3data + inPtr + (0x1E ^ S16));
313 v[16] = *(int16_t *)(mp3data + inPtr + (0x20 ^ S16));
314 v[8] += v[16];
315 v[9] = *(int16_t *)(mp3data + inPtr + (0x1C ^ S16));
316 v[17] = *(int16_t *)(mp3data + inPtr + (0x22 ^ S16));
317 v[9] += v[17];
318 v[10] = *(int16_t *)(mp3data + inPtr + (0x18 ^ S16));
319 v[19] = *(int16_t *)(mp3data + inPtr + (0x26 ^ S16));
320 v[10] += v[19];
321 v[11] = *(int16_t *)(mp3data + inPtr + (0x1A ^ S16));
322 v[18] = *(int16_t *)(mp3data + inPtr + (0x24 ^ S16));
323 v[11] += v[18];
324
325 v[12] = *(int16_t *)(mp3data + inPtr + (0x10 ^ S16));
326 v[23] = *(int16_t *)(mp3data + inPtr + (0x2E ^ S16));
327 v[12] += v[23];
328 v[13] = *(int16_t *)(mp3data + inPtr + (0x12 ^ S16));
329 v[22] = *(int16_t *)(mp3data + inPtr + (0x2C ^ S16));
330 v[13] += v[22];
331 v[14] = *(int16_t *)(mp3data + inPtr + (0x16 ^ S16));
332 v[20] = *(int16_t *)(mp3data + inPtr + (0x28 ^ S16));
333 v[14] += v[20];
334 v[15] = *(int16_t *)(mp3data + inPtr + (0x14 ^ S16));
335 v[21] = *(int16_t *)(mp3data + inPtr + (0x2A ^ S16));
336 v[15] += v[21];
337
338 /* Part 2-4 */
339
340 MP3AB0();
341
342 /* Part 5 - 1-Wide Butterflies - 100% Accurate but need SSVs!!! */
343
344 t0 = t6 + 0x100;
345 t1 = t6 + 0x200;
346 t2 = t5 + 0x100;
347 t3 = t5 + 0x200;
348
349 /* 0x13A8 */
350 v[1] = 0;
351 v[11] = ((v[16] - v[17]) * 0xB504) >> 0x10;
352
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];
357
358
359 v[11] = -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.... */
365 v[2] = -v[2];
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;
378 v[5] = v[5] - v[4];
379 v[7] = v[7] - v[5];
380 v[6] = v[6] + v[6];
381 v[5] = v[5] - v[6];
382 v[4] = -v[4] - v[6];
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];
390
391
392 v[9] = ((v[24] - v[25]) * 0x16A09) >> 0x10;
393 v[2] = v[8] + v[9];
394 v[11] = ((v[26] - v[27]) * 0x2D413) >> 0x10;
395 v[13] = ((v[28] - v[29]) * 0x2D413) >> 0x10;
396
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];
402 v[3] = v[8] + v[10];
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];
408 v[9] = v[9] + v[14];
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];
417 v[8] = -v[8];
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... */
430
431 /* Part 6 - 100% Accurate */
432
433 v[0] = *(int16_t *)(mp3data + inPtr + (0x00 ^ S16));
434 v[31] = *(int16_t *)(mp3data + inPtr + (0x3E ^ S16));
435 v[0] -= v[31];
436 v[1] = *(int16_t *)(mp3data + inPtr + (0x02 ^ S16));
437 v[30] = *(int16_t *)(mp3data + inPtr + (0x3C ^ S16));
438 v[1] -= v[30];
439 v[2] = *(int16_t *)(mp3data + inPtr + (0x06 ^ S16));
440 v[28] = *(int16_t *)(mp3data + inPtr + (0x38 ^ S16));
441 v[2] -= v[28];
442 v[3] = *(int16_t *)(mp3data + inPtr + (0x04 ^ S16));
443 v[29] = *(int16_t *)(mp3data + inPtr + (0x3A ^ S16));
444 v[3] -= v[29];
445
446 v[4] = *(int16_t *)(mp3data + inPtr + (0x0E ^ S16));
447 v[24] = *(int16_t *)(mp3data + inPtr + (0x30 ^ S16));
448 v[4] -= v[24];
449 v[5] = *(int16_t *)(mp3data + inPtr + (0x0C ^ S16));
450 v[25] = *(int16_t *)(mp3data + inPtr + (0x32 ^ S16));
451 v[5] -= v[25];
452 v[6] = *(int16_t *)(mp3data + inPtr + (0x08 ^ S16));
453 v[27] = *(int16_t *)(mp3data + inPtr + (0x36 ^ S16));
454 v[6] -= v[27];
455 v[7] = *(int16_t *)(mp3data + inPtr + (0x0A ^ S16));
456 v[26] = *(int16_t *)(mp3data + inPtr + (0x34 ^ S16));
457 v[7] -= v[26];
458
459 v[8] = *(int16_t *)(mp3data + inPtr + (0x1E ^ S16));
460 v[16] = *(int16_t *)(mp3data + inPtr + (0x20 ^ S16));
461 v[8] -= v[16];
462 v[9] = *(int16_t *)(mp3data + inPtr + (0x1C ^ S16));
463 v[17] = *(int16_t *)(mp3data + inPtr + (0x22 ^ S16));
464 v[9] -= v[17];
465 v[10] = *(int16_t *)(mp3data + inPtr + (0x18 ^ S16));
466 v[19] = *(int16_t *)(mp3data + inPtr + (0x26 ^ S16));
467 v[10] -= v[19];
468 v[11] = *(int16_t *)(mp3data + inPtr + (0x1A ^ S16));
469 v[18] = *(int16_t *)(mp3data + inPtr + (0x24 ^ S16));
470 v[11] -= v[18];
471
472 v[12] = *(int16_t *)(mp3data + inPtr + (0x10 ^ S16));
473 v[23] = *(int16_t *)(mp3data + inPtr + (0x2E ^ S16));
474 v[12] -= v[23];
475 v[13] = *(int16_t *)(mp3data + inPtr + (0x12 ^ S16));
476 v[22] = *(int16_t *)(mp3data + inPtr + (0x2C ^ S16));
477 v[13] -= v[22];
478 v[14] = *(int16_t *)(mp3data + inPtr + (0x16 ^ S16));
479 v[20] = *(int16_t *)(mp3data + inPtr + (0x28 ^ S16));
480 v[14] -= v[20];
481 v[15] = *(int16_t *)(mp3data + inPtr + (0x14 ^ S16));
482 v[21] = *(int16_t *)(mp3data + inPtr + (0x2A ^ S16));
483 v[15] -= v[21];
484
485 for (i = 0; i < 16; i++)
486 v[0 + i] = (v[0 + i] * LUT6[i]) >> 0x10;
487 v[0] = v[0] + v[0];
488 v[1] = v[1] + v[1];
489 v[2] = v[2] + v[2];
490 v[3] = v[3] + v[3];
491 v[4] = v[4] + v[4];
492 v[5] = v[5] + v[5];
493 v[6] = v[6] + v[6];
494 v[7] = v[7] + v[7];
495 v[12] = v[12] + v[12];
496 v[13] = v[13] + v[13];
497 v[15] = v[15] + v[15];
498
499 MP3AB0();
500
501 /* Part 7: - 100% Accurate + SSV - Unoptimized */
502
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];
511 /* 0x16A8 */
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];
534 v[9] = v[9] + v[10];
535 v[1] = v[1] + v[6];
536 v[6] = v[10] - v[6];
537 v[1] = v[9] - v[1];
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];
547 v[5] = v[4] + v[5];
548 v[4] = v[8] - v[4];
549 /* Store v[4] -> (T2 + 0x60) */
550 *(int16_t *)(mp3data + ((t2 + (short)0x60))) = (short)v[4];
551 v[0] = v[0] - v[8];
552 /* Store v[0] -> (T3 + 0xFFA0) */
553 *(int16_t *)(mp3data + ((t3 + (short)0xFFA0))) = (short)v[0];
554 v[7] = v[7] - v[11];
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];
563 v[3] = v[3] - v[13];
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... */
573
574 /* Step 8 - Dewindowing */
575
576 addptr = t6 & 0xFFE0;
577
578 offset = 0x10 - (t4 >> 1);
579 for (x = 0; x < 8; x++) {
580 int32_t v0;
581 int32_t v18;
582 v2 = v4 = v6 = v8 = 0;
583
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;
589 addptr += 2;
590 offset++;
591 }
592 v0 = v2 + v4;
593 v18 = v6 + v8;
594 /* Clamp(v0); */
595 /* Clamp(v18); */
596 /* clamp??? */
597 *(int16_t *)(mp3data + (outPtr ^ S16)) = v0;
598 *(int16_t *)(mp3data + ((outPtr + 2)^S16)) = v18;
599 outPtr += 4;
600 addptr += 0x30;
601 offset += 0x38;
602 }
603
604 offset = 0x10 - (t4 >> 1) + 8 * 0x40;
605 v2 = v4 = 0;
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;
609 addptr += 2;
610 offset++;
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;
613 addptr += 2;
614 offset++;
615 }
616 mult6 = *(int32_t *)(mp3data + 0xCE8);
617 mult4 = *(int32_t *)(mp3data + 0xCEC);
618 if (t4 & 0x2) {
619 v2 = (v2 **(uint32_t *)(mp3data + 0xCE8)) >> 0x10;
620 *(int16_t *)(mp3data + (outPtr ^ S16)) = v2;
621 } else {
622 v4 = (v4 **(uint32_t *)(mp3data + 0xCE8)) >> 0x10;
623 *(int16_t *)(mp3data + (outPtr ^ S16)) = v4;
624 mult4 = *(uint32_t *)(mp3data + 0xCE8);
625 }
626 addptr -= 0x50;
627
628 for (x = 0; x < 8; x++) {
629 int32_t v0;
630 int32_t v18;
631 v2 = v4 = v6 = v8 = 0;
632
633 offset = (0x22F - (t4 >> 1) + x * 0x40);
634
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;
644 addptr += 4;
645 offset += 2;
646 }
647 v0 = v2 + v4;
648 v18 = v6 + v8;
649 /* Clamp(v0); */
650 /* Clamp(v18); */
651 /* clamp??? */
652 *(int16_t *)(mp3data + ((outPtr + 2)^S16)) = v0;
653 *(int16_t *)(mp3data + ((outPtr + 4)^S16)) = v18;
654 outPtr += 4;
655 addptr -= 0x50;
656 }
657
658 tmp = outPtr;
659 hi0 = mult6;
660 hi1 = mult4;
661
662 hi0 = (int)hi0 >> 0x10;
663 hi1 = (int)hi1 >> 0x10;
664 for (i = 0; i < 8; i++) {
665 /* v0 */
666 vt = (*(int16_t *)(mp3data + ((tmp - 0x40)^S16)) * hi0);
667 if (vt > 32767) {
668 vt = 32767;
669 } else {
670 if (vt < -32767)
671 vt = -32767;
672 }
673 *(int16_t *)((uint8_t *)mp3data + ((tmp - 0x40)^S16)) = (int16_t)vt;
674
675 /* v17 */
676 vt = (*(int16_t *)(mp3data + ((tmp - 0x30)^S16)) * hi0);
677 if (vt > 32767) {
678 vt = 32767;
679 } else {
680 if (vt < -32767)
681 vt = -32767;
682 }
683 *(int16_t *)((uint8_t *)mp3data + ((tmp - 0x30)^S16)) = vt;
684
685 /* v2 */
686 vt = (*(int16_t *)(mp3data + ((tmp - 0x1E)^S16)) * hi1);
687 if (vt > 32767) {
688 vt = 32767;
689 } else {
690 if (vt < -32767)
691 vt = -32767;
692 }
693 *(int16_t *)((uint8_t *)mp3data + ((tmp - 0x1E)^S16)) = vt;
694
695 /* v4 */
696 vt = (*(int16_t *)(mp3data + ((tmp - 0xE)^S16)) * hi1);
697 if (vt > 32767) {
698 vt = 32767;
699 } else {
700 if (vt < -32767)
701 vt = -32767;
702 }
703 *(int16_t *)((uint8_t *)mp3data + ((tmp - 0xE)^S16)) = vt;
704 tmp += 2;
705 }
706}
707