RSP: Added some missing files
[mupen64plus-pandora.git] / source / mupen64plus-rsp-hle / src / ucode3mp3.c
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
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
162 };
163
164 static uint8_t mp3data[0x1000];
165
166 static int32_t v[32];
167
168 static 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
204 static void InnerLoop();
205
206 static uint32_t inPtr, outPtr;
207
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); */
211
212 void 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
259 static 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