Permalink
Cannot retrieve contributors at this time
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
987 lines (841 sloc)
35.9 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| //Copyright (C) 1997-2001 ZSNES Team ( zsknight@zsnes.com / _demo_@zsnes.com ) | |
| // | |
| //This program is free software; you can redistribute it and/or | |
| //modify it under the terms of the GNU General Public License | |
| //as published by the Free Software Foundation; either | |
| //version 2 of the License, or (at your option) any later | |
| //version. | |
| // | |
| //This program is distributed in the hope that it will be useful, | |
| //but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| //MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| //GNU General Public License for more details. | |
| // | |
| //You should have received a copy of the GNU General Public License | |
| //along with this program; if not, write to the Free Software | |
| //Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |
| //#define __ZSNES__ | |
| #if (defined __ZSNES__ && __LINUX__) | |
| #include "../gblhdr.h" | |
| #else | |
| #endif | |
| #include <math.h> | |
| //#define DebugDSP1 | |
| // uncomment some lines to test | |
| //#define printinfo | |
| //#define debug02 | |
| //#define debug0A | |
| //#define debug06 | |
| #define __OPT__ | |
| #ifdef DebugDSP1 | |
| FILE * LogFile = NULL; | |
| void Log_Message (char *Message, ...) | |
| { | |
| char Msg[400]; | |
| va_list ap; | |
| va_start(ap,Message); | |
| vsprintf(Msg,Message,ap ); | |
| va_end(ap); | |
| strcat(Msg,"\r\n\0"); | |
| fwrite(Msg,strlen(Msg),1,LogFile); | |
| fflush (LogFile); | |
| } | |
| #endif | |
| const unsigned short __attribute__((aligned(64))) DSP1ROM[1024] = { | |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, | |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, | |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, | |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, | |
| 0x0000, 0x0000, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, | |
| 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, | |
| 0x4000, 0x7fff, 0x4000, 0x2000, 0x1000, 0x0800, 0x0400, 0x0200, | |
| 0x0100, 0x0080, 0x0040, 0x0020, 0x0001, 0x0008, 0x0004, 0x0002, | |
| 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, | |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, | |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, | |
| 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, | |
| 0x0000, 0x0000, 0x8000, 0xffe5, 0x0100, 0x7fff, 0x7f02, 0x7e08, | |
| 0x7d12, 0x7c1f, 0x7b30, 0x7a45, 0x795d, 0x7878, 0x7797, 0x76ba, | |
| 0x75df, 0x7507, 0x7433, 0x7361, 0x7293, 0x71c7, 0x70fe, 0x7038, | |
| 0x6f75, 0x6eb4, 0x6df6, 0x6d3a, 0x6c81, 0x6bca, 0x6b16, 0x6a64, | |
| 0x69b4, 0x6907, 0x685b, 0x67b2, 0x670b, 0x6666, 0x65c4, 0x6523, | |
| 0x6484, 0x63e7, 0x634c, 0x62b3, 0x621c, 0x6186, 0x60f2, 0x6060, | |
| 0x5fd0, 0x5f41, 0x5eb5, 0x5e29, 0x5d9f, 0x5d17, 0x5c91, 0x5c0c, | |
| 0x5b88, 0x5b06, 0x5a85, 0x5a06, 0x5988, 0x590b, 0x5890, 0x5816, | |
| 0x579d, 0x5726, 0x56b0, 0x563b, 0x55c8, 0x5555, 0x54e4, 0x5474, | |
| 0x5405, 0x5398, 0x532b, 0x52bf, 0x5255, 0x51ec, 0x5183, 0x511c, | |
| 0x50b6, 0x5050, 0x4fec, 0x4f89, 0x4f26, 0x4ec5, 0x4e64, 0x4e05, | |
| 0x4da6, 0x4d48, 0x4cec, 0x4c90, 0x4c34, 0x4bda, 0x4b81, 0x4b28, | |
| 0x4ad0, 0x4a79, 0x4a23, 0x49cd, 0x4979, 0x4925, 0x48d1, 0x487f, | |
| 0x482d, 0x47dc, 0x478c, 0x473c, 0x46ed, 0x469f, 0x4651, 0x4604, | |
| 0x45b8, 0x456c, 0x4521, 0x44d7, 0x448d, 0x4444, 0x43fc, 0x43b4, | |
| 0x436d, 0x4326, 0x42e0, 0x429a, 0x4255, 0x4211, 0x41cd, 0x4189, | |
| 0x4146, 0x4104, 0x40c2, 0x4081, 0x4040, 0x3fff, 0x41f7, 0x43e1, | |
| 0x45bd, 0x478d, 0x4951, 0x4b0b, 0x4cbb, 0x4e61, 0x4fff, 0x5194, | |
| 0x5322, 0x54a9, 0x5628, 0x57a2, 0x5914, 0x5a81, 0x5be9, 0x5d4a, | |
| 0x5ea7, 0x5fff, 0x6152, 0x62a0, 0x63ea, 0x6530, 0x6672, 0x67b0, | |
| 0x68ea, 0x6a20, 0x6b53, 0x6c83, 0x6daf, 0x6ed9, 0x6fff, 0x7122, | |
| 0x7242, 0x735f, 0x747a, 0x7592, 0x76a7, 0x77ba, 0x78cb, 0x79d9, | |
| 0x7ae5, 0x7bee, 0x7cf5, 0x7dfa, 0x7efe, 0x7fff, 0x0000, 0x0324, | |
| 0x0647, 0x096a, 0x0c8b, 0x0fab, 0x12c8, 0x15e2, 0x18f8, 0x1c0b, | |
| 0x1f19, 0x2223, 0x2528, 0x2826, 0x2b1f, 0x2e11, 0x30fb, 0x33de, | |
| 0x36ba, 0x398c, 0x3c56, 0x3f17, 0x41ce, 0x447a, 0x471c, 0x49b4, | |
| 0x4c3f, 0x4ebf, 0x5133, 0x539b, 0x55f5, 0x5842, 0x5a82, 0x5cb4, | |
| 0x5ed7, 0x60ec, 0x62f2, 0x64e8, 0x66cf, 0x68a6, 0x6a6d, 0x6c24, | |
| 0x6dca, 0x6f5f, 0x70e2, 0x7255, 0x73b5, 0x7504, 0x7641, 0x776c, | |
| 0x7884, 0x798a, 0x7a7d, 0x7b5d, 0x7c29, 0x7ce3, 0x7d8a, 0x7e1d, | |
| 0x7e9d, 0x7f09, 0x7f62, 0x7fa7, 0x7fd8, 0x7ff6, 0x7fff, 0x7ff6, | |
| 0x7fd8, 0x7fa7, 0x7f62, 0x7f09, 0x7e9d, 0x7e1d, 0x7d8a, 0x7ce3, | |
| 0x7c29, 0x7b5d, 0x7a7d, 0x798a, 0x7884, 0x776c, 0x7641, 0x7504, | |
| 0x73b5, 0x7255, 0x70e2, 0x6f5f, 0x6dca, 0x6c24, 0x6a6d, 0x68a6, | |
| 0x66cf, 0x64e8, 0x62f2, 0x60ec, 0x5ed7, 0x5cb4, 0x5a82, 0x5842, | |
| 0x55f5, 0x539b, 0x5133, 0x4ebf, 0x4c3f, 0x49b4, 0x471c, 0x447a, | |
| 0x41ce, 0x3f17, 0x3c56, 0x398c, 0x36ba, 0x33de, 0x30fb, 0x2e11, | |
| 0x2b1f, 0x2826, 0x2528, 0x2223, 0x1f19, 0x1c0b, 0x18f8, 0x15e2, | |
| 0x12c8, 0x0fab, 0x0c8b, 0x096a, 0x0647, 0x0324, 0x7fff, 0x7ff6, | |
| 0x7fd8, 0x7fa7, 0x7f62, 0x7f09, 0x7e9d, 0x7e1d, 0x7d8a, 0x7ce3, | |
| 0x7c29, 0x7b5d, 0x7a7d, 0x798a, 0x7884, 0x776c, 0x7641, 0x7504, | |
| 0x73b5, 0x7255, 0x70e2, 0x6f5f, 0x6dca, 0x6c24, 0x6a6d, 0x68a6, | |
| 0x66cf, 0x64e8, 0x62f2, 0x60ec, 0x5ed7, 0x5cb4, 0x5a82, 0x5842, | |
| 0x55f5, 0x539b, 0x5133, 0x4ebf, 0x4c3f, 0x49b4, 0x471c, 0x447a, | |
| 0x41ce, 0x3f17, 0x3c56, 0x398c, 0x36ba, 0x33de, 0x30fb, 0x2e11, | |
| 0x2b1f, 0x2826, 0x2528, 0x2223, 0x1f19, 0x1c0b, 0x18f8, 0x15e2, | |
| 0x12c8, 0x0fab, 0x0c8b, 0x096a, 0x0647, 0x0324, 0x0000, 0xfcdc, | |
| 0xf9b9, 0xf696, 0xf375, 0xf055, 0xed38, 0xea1e, 0xe708, 0xe3f5, | |
| 0xe0e7, 0xdddd, 0xdad8, 0xd7da, 0xd4e1, 0xd1ef, 0xcf05, 0xcc22, | |
| 0xc946, 0xc674, 0xc3aa, 0xc0e9, 0xbe32, 0xbb86, 0xb8e4, 0xb64c, | |
| 0xb3c1, 0xb141, 0xaecd, 0xac65, 0xaa0b, 0xa7be, 0xa57e, 0xa34c, | |
| 0xa129, 0x9f14, 0x9d0e, 0x9b18, 0x9931, 0x975a, 0x9593, 0x93dc, | |
| 0x9236, 0x90a1, 0x8f1e, 0x8dab, 0x8c4b, 0x8afc, 0x89bf, 0x8894, | |
| 0x877c, 0x8676, 0x8583, 0x84a3, 0x83d7, 0x831d, 0x8276, 0x81e3, | |
| 0x8163, 0x80f7, 0x809e, 0x8059, 0x8028, 0x800a, 0x6488, 0x0080, | |
| 0x03ff, 0x0116, 0x0002, 0x0080, 0x4000, 0x3fd7, 0x3faf, 0x3f86, | |
| 0x3f5d, 0x3f34, 0x3f0c, 0x3ee3, 0x3eba, 0x3e91, 0x3e68, 0x3e40, | |
| 0x3e17, 0x3dee, 0x3dc5, 0x3d9c, 0x3d74, 0x3d4b, 0x3d22, 0x3cf9, | |
| 0x3cd0, 0x3ca7, 0x3c7f, 0x3c56, 0x3c2d, 0x3c04, 0x3bdb, 0x3bb2, | |
| 0x3b89, 0x3b60, 0x3b37, 0x3b0e, 0x3ae5, 0x3abc, 0x3a93, 0x3a69, | |
| 0x3a40, 0x3a17, 0x39ee, 0x39c5, 0x399c, 0x3972, 0x3949, 0x3920, | |
| 0x38f6, 0x38cd, 0x38a4, 0x387a, 0x3851, 0x3827, 0x37fe, 0x37d4, | |
| 0x37aa, 0x3781, 0x3757, 0x372d, 0x3704, 0x36da, 0x36b0, 0x3686, | |
| 0x365c, 0x3632, 0x3609, 0x35df, 0x35b4, 0x358a, 0x3560, 0x3536, | |
| 0x350c, 0x34e1, 0x34b7, 0x348d, 0x3462, 0x3438, 0x340d, 0x33e3, | |
| 0x33b8, 0x338d, 0x3363, 0x3338, 0x330d, 0x32e2, 0x32b7, 0x328c, | |
| 0x3261, 0x3236, 0x320b, 0x31df, 0x31b4, 0x3188, 0x315d, 0x3131, | |
| 0x3106, 0x30da, 0x30ae, 0x3083, 0x3057, 0x302b, 0x2fff, 0x2fd2, | |
| 0x2fa6, 0x2f7a, 0x2f4d, 0x2f21, 0x2ef4, 0x2ec8, 0x2e9b, 0x2e6e, | |
| 0x2e41, 0x2e14, 0x2de7, 0x2dba, 0x2d8d, 0x2d60, 0x2d32, 0x2d05, | |
| 0x2cd7, 0x2ca9, 0x2c7b, 0x2c4d, 0x2c1f, 0x2bf1, 0x2bc3, 0x2b94, | |
| 0x2b66, 0x2b37, 0x2b09, 0x2ada, 0x2aab, 0x2a7c, 0x2a4c, 0x2a1d, | |
| 0x29ed, 0x29be, 0x298e, 0x295e, 0x292e, 0x28fe, 0x28ce, 0x289d, | |
| 0x286d, 0x283c, 0x280b, 0x27da, 0x27a9, 0x2777, 0x2746, 0x2714, | |
| 0x26e2, 0x26b0, 0x267e, 0x264c, 0x2619, 0x25e7, 0x25b4, 0x2581, | |
| 0x254d, 0x251a, 0x24e6, 0x24b2, 0x247e, 0x244a, 0x2415, 0x23e1, | |
| 0x23ac, 0x2376, 0x2341, 0x230b, 0x22d6, 0x229f, 0x2269, 0x2232, | |
| 0x21fc, 0x21c4, 0x218d, 0x2155, 0x211d, 0x20e5, 0x20ad, 0x2074, | |
| 0x203b, 0x2001, 0x1fc7, 0x1f8d, 0x1f53, 0x1f18, 0x1edd, 0x1ea1, | |
| 0x1e66, 0x1e29, 0x1ded, 0x1db0, 0x1d72, 0x1d35, 0x1cf6, 0x1cb8, | |
| 0x1c79, 0x1c39, 0x1bf9, 0x1bb8, 0x1b77, 0x1b36, 0x1af4, 0x1ab1, | |
| 0x1a6e, 0x1a2a, 0x19e6, 0x19a1, 0x195c, 0x1915, 0x18ce, 0x1887, | |
| 0x183f, 0x17f5, 0x17ac, 0x1761, 0x1715, 0x16c9, 0x167c, 0x162e, | |
| 0x15df, 0x158e, 0x153d, 0x14eb, 0x1497, 0x1442, 0x13ec, 0x1395, | |
| 0x133c, 0x12e2, 0x1286, 0x1228, 0x11c9, 0x1167, 0x1104, 0x109e, | |
| 0x1036, 0x0fcc, 0x0f5f, 0x0eef, 0x0e7b, 0x0e04, 0x0d89, 0x0d0a, | |
| 0x0c86, 0x0bfd, 0x0b6d, 0x0ad6, 0x0a36, 0x098d, 0x08d7, 0x0811, | |
| 0x0736, 0x063e, 0x0519, 0x039a, 0x0000, 0x7fff, 0x0100, 0x0080, | |
| 0x021d, 0x00c8, 0x00ce, 0x0048, 0x0a26, 0x277a, 0x00ce, 0x6488, | |
| 0x14ac, 0x0001, 0x00f9, 0x00fc, 0x00ff, 0x00fc, 0x00f9, 0xffff, | |
| 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, | |
| 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, | |
| 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, | |
| 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, | |
| 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, | |
| 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, | |
| 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, | |
| 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, | |
| 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, | |
| 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, | |
| 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, | |
| 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, | |
| 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, | |
| 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, | |
| 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, | |
| 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, | |
| 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, | |
| 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, | |
| 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, | |
| 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, | |
| 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, | |
| 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, | |
| 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, | |
| 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, | |
| 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, | |
| 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff}; | |
| /***************************************************************************\ | |
| * Math tables * | |
| \***************************************************************************/ | |
| #define INCR 2048 | |
| #define Angle(x) (((x)/(65536/INCR)) & (INCR-1)) | |
| #define Cos(x) ((float) CosTable2[x]) | |
| #define Sin(x) ((float) SinTable2[x]) | |
| #ifdef PI | |
| #undef PI | |
| #endif | |
| #define PI 3.1415926535897932384626433832795 | |
| float CosTable2[INCR]; | |
| float SinTable2[INCR]; | |
| int32 CosTable2Fix[INCR];//=NULL; | |
| int32 SinTable2Fix[INCR];//=NULL; | |
| #define AngleFix(x) (((x)>>5) & (INCR-1)) | |
| #define CosFix(x) (CosTable2Fix[x]) | |
| #define SinFix(x) (SinTable2Fix[x]) | |
| float Atan(float x) | |
| { | |
| if ((x>=1) || (x<=1)) | |
| return (x/(1+0.28*x*x)); | |
| else | |
| return (PI/2 - Atan(1/x)); | |
| } | |
| /***************************************************************************\ | |
| * DSP1 code * | |
| \***************************************************************************/ | |
| void InitDSP(void) | |
| { | |
| #ifdef __OPT__ | |
| unsigned int i; | |
| // CosTable2Fix = (int32 *) ljz_malloc(INCR*sizeof(int32)); | |
| // SinTable2Fix = (int32 *) ljz_malloc(INCR*sizeof(int32)); | |
| for (i=0; i<INCR; i++){ | |
| CosTable2[i] = (cosf((float)(2*PI*i/INCR))); | |
| SinTable2[i] = (sinf((float)(2*PI*i/INCR))); | |
| CosTable2Fix[i] = (65536*cosf((float)(2*PI*i/INCR))); | |
| SinTable2Fix[i] = (65536*sinf((float)(2*PI*i/INCR))); | |
| } | |
| #endif | |
| #ifdef DebugDSP1 | |
| Start_Log(); | |
| #endif | |
| } | |
| void DSP1_Inverse(short Coefficient, short Exponent, short *iCoefficient, short *iExponent) | |
| { | |
| // Step One: Division by Zero | |
| if (Coefficient == 0x0000) | |
| { | |
| *iCoefficient = 0x7fff; | |
| *iExponent = 0x002f; | |
| } | |
| else | |
| { | |
| short Sign = 1; | |
| // Step Two: Remove Sign | |
| if (Coefficient < 0) | |
| { | |
| if (Coefficient < -32767) Coefficient = -32767; | |
| Coefficient = -Coefficient; | |
| Sign = -1; | |
| } | |
| // Step Three: Normalize | |
| while (Coefficient < 0x4000) | |
| { | |
| Coefficient <<= 1; | |
| Exponent--; | |
| } | |
| // Step Four: Special Case | |
| if (Coefficient == 0x4000) | |
| if (Sign == 1) *iCoefficient = 0x7fff; | |
| else { | |
| *iCoefficient = -0x4000; | |
| Exponent--; | |
| } | |
| else { | |
| // Step Five: Initial Guess | |
| short i = DSP1ROM[(((Coefficient - 0x4000) >> 7) + 0x0065)&123]; | |
| // Step Six: Iterate "estimated" Newton's Method | |
| i = (i + (-i * (Coefficient * i >> 15) >> 15)) << 1; | |
| i = (i + (-i * (Coefficient * i >> 15) >> 15)) << 1; | |
| *iCoefficient = i * Sign; | |
| } | |
| *iExponent = 1 - Exponent; | |
| } | |
| } | |
| const short __attribute__((aligned(64))) DSP1_MulTable[256] = { | |
| 0x0000, 0x0003, 0x0006, 0x0009, 0x000c, 0x000f, 0x0012, 0x0015, | |
| 0x0019, 0x001c, 0x001f, 0x0022, 0x0025, 0x0028, 0x002b, 0x002f, | |
| 0x0032, 0x0035, 0x0038, 0x003b, 0x003e, 0x0041, 0x0045, 0x0048, | |
| 0x004b, 0x004e, 0x0051, 0x0054, 0x0057, 0x005b, 0x005e, 0x0061, | |
| 0x0064, 0x0067, 0x006a, 0x006d, 0x0071, 0x0074, 0x0077, 0x007a, | |
| 0x007d, 0x0080, 0x0083, 0x0087, 0x008a, 0x008d, 0x0090, 0x0093, | |
| 0x0096, 0x0099, 0x009d, 0x00a0, 0x00a3, 0x00a6, 0x00a9, 0x00ac, | |
| 0x00af, 0x00b3, 0x00b6, 0x00b9, 0x00bc, 0x00bf, 0x00c2, 0x00c5, | |
| 0x00c9, 0x00cc, 0x00cf, 0x00d2, 0x00d5, 0x00d8, 0x00db, 0x00df, | |
| 0x00e2, 0x00e5, 0x00e8, 0x00eb, 0x00ee, 0x00f1, 0x00f5, 0x00f8, | |
| 0x00fb, 0x00fe, 0x0101, 0x0104, 0x0107, 0x010b, 0x010e, 0x0111, | |
| 0x0114, 0x0117, 0x011a, 0x011d, 0x0121, 0x0124, 0x0127, 0x012a, | |
| 0x012d, 0x0130, 0x0133, 0x0137, 0x013a, 0x013d, 0x0140, 0x0143, | |
| 0x0146, 0x0149, 0x014d, 0x0150, 0x0153, 0x0156, 0x0159, 0x015c, | |
| 0x015f, 0x0163, 0x0166, 0x0169, 0x016c, 0x016f, 0x0172, 0x0175, | |
| 0x0178, 0x017c, 0x017f, 0x0182, 0x0185, 0x0188, 0x018b, 0x018e, | |
| 0x0192, 0x0195, 0x0198, 0x019b, 0x019e, 0x01a1, 0x01a4, 0x01a8, | |
| 0x01ab, 0x01ae, 0x01b1, 0x01b4, 0x01b7, 0x01ba, 0x01be, 0x01c1, | |
| 0x01c4, 0x01c7, 0x01ca, 0x01cd, 0x01d0, 0x01d4, 0x01d7, 0x01da, | |
| 0x01dd, 0x01e0, 0x01e3, 0x01e6, 0x01ea, 0x01ed, 0x01f0, 0x01f3, | |
| 0x01f6, 0x01f9, 0x01fc, 0x0200, 0x0203, 0x0206, 0x0209, 0x020c, | |
| 0x020f, 0x0212, 0x0216, 0x0219, 0x021c, 0x021f, 0x0222, 0x0225, | |
| 0x0228, 0x022c, 0x022f, 0x0232, 0x0235, 0x0238, 0x023b, 0x023e, | |
| 0x0242, 0x0245, 0x0248, 0x024b, 0x024e, 0x0251, 0x0254, 0x0258, | |
| 0x025b, 0x025e, 0x0261, 0x0264, 0x0267, 0x026a, 0x026e, 0x0271, | |
| 0x0274, 0x0277, 0x027a, 0x027d, 0x0280, 0x0284, 0x0287, 0x028a, | |
| 0x028d, 0x0290, 0x0293, 0x0296, 0x029a, 0x029d, 0x02a0, 0x02a3, | |
| 0x02a6, 0x02a9, 0x02ac, 0x02b0, 0x02b3, 0x02b6, 0x02b9, 0x02bc, | |
| 0x02bf, 0x02c2, 0x02c6, 0x02c9, 0x02cc, 0x02cf, 0x02d2, 0x02d5, | |
| 0x02d8, 0x02db, 0x02df, 0x02e2, 0x02e5, 0x02e8, 0x02eb, 0x02ee, | |
| 0x02f1, 0x02f5, 0x02f8, 0x02fb, 0x02fe, 0x0301, 0x0304, 0x0307, | |
| 0x030b, 0x030e, 0x0311, 0x0314, 0x0317, 0x031a, 0x031d, 0x0321}; | |
| const short __attribute__((aligned(64))) DSP1_SinTable[256] = { | |
| 0x0000, 0x0324, 0x0647, 0x096a, 0x0c8b, 0x0fab, 0x12c8, 0x15e2, | |
| 0x18f8, 0x1c0b, 0x1f19, 0x2223, 0x2528, 0x2826, 0x2b1f, 0x2e11, | |
| 0x30fb, 0x33de, 0x36ba, 0x398c, 0x3c56, 0x3f17, 0x41ce, 0x447a, | |
| 0x471c, 0x49b4, 0x4c3f, 0x4ebf, 0x5133, 0x539b, 0x55f5, 0x5842, | |
| 0x5a82, 0x5cb4, 0x5ed7, 0x60ec, 0x62f2, 0x64e8, 0x66cf, 0x68a6, | |
| 0x6a6d, 0x6c24, 0x6dca, 0x6f5f, 0x70e2, 0x7255, 0x73b5, 0x7504, | |
| 0x7641, 0x776c, 0x7884, 0x798a, 0x7a7d, 0x7b5d, 0x7c29, 0x7ce3, | |
| 0x7d8a, 0x7e1d, 0x7e9d, 0x7f09, 0x7f62, 0x7fa7, 0x7fd8, 0x7ff6, | |
| 0x7fff, 0x7ff6, 0x7fd8, 0x7fa7, 0x7f62, 0x7f09, 0x7e9d, 0x7e1d, | |
| 0x7d8a, 0x7ce3, 0x7c29, 0x7b5d, 0x7a7d, 0x798a, 0x7884, 0x776c, | |
| 0x7641, 0x7504, 0x73b5, 0x7255, 0x70e2, 0x6f5f, 0x6dca, 0x6c24, | |
| 0x6a6d, 0x68a6, 0x66cf, 0x64e8, 0x62f2, 0x60ec, 0x5ed7, 0x5cb4, | |
| 0x5a82, 0x5842, 0x55f5, 0x539b, 0x5133, 0x4ebf, 0x4c3f, 0x49b4, | |
| 0x471c, 0x447a, 0x41ce, 0x3f17, 0x3c56, 0x398c, 0x36ba, 0x33de, | |
| 0x30fb, 0x2e11, 0x2b1f, 0x2826, 0x2528, 0x2223, 0x1f19, 0x1c0b, | |
| 0x18f8, 0x15e2, 0x12c8, 0x0fab, 0x0c8b, 0x096a, 0x0647, 0x0324, | |
| -0x0000, -0x0324, -0x0647, -0x096a, -0x0c8b, -0x0fab, -0x12c8, -0x15e2, | |
| -0x18f8, -0x1c0b, -0x1f19, -0x2223, -0x2528, -0x2826, -0x2b1f, -0x2e11, | |
| -0x30fb, -0x33de, -0x36ba, -0x398c, -0x3c56, -0x3f17, -0x41ce, -0x447a, | |
| -0x471c, -0x49b4, -0x4c3f, -0x4ebf, -0x5133, -0x539b, -0x55f5, -0x5842, | |
| -0x5a82, -0x5cb4, -0x5ed7, -0x60ec, -0x62f2, -0x64e8, -0x66cf, -0x68a6, | |
| -0x6a6d, -0x6c24, -0x6dca, -0x6f5f, -0x70e2, -0x7255, -0x73b5, -0x7504, | |
| -0x7641, -0x776c, -0x7884, -0x798a, -0x7a7d, -0x7b5d, -0x7c29, -0x7ce3, | |
| -0x7d8a, -0x7e1d, -0x7e9d, -0x7f09, -0x7f62, -0x7fa7, -0x7fd8, -0x7ff6, | |
| -0x7fff, -0x7ff6, -0x7fd8, -0x7fa7, -0x7f62, -0x7f09, -0x7e9d, -0x7e1d, | |
| -0x7d8a, -0x7ce3, -0x7c29, -0x7b5d, -0x7a7d, -0x798a, -0x7884, -0x776c, | |
| -0x7641, -0x7504, -0x73b5, -0x7255, -0x70e2, -0x6f5f, -0x6dca, -0x6c24, | |
| -0x6a6d, -0x68a6, -0x66cf, -0x64e8, -0x62f2, -0x60ec, -0x5ed7, -0x5cb4, | |
| -0x5a82, -0x5842, -0x55f5, -0x539b, -0x5133, -0x4ebf, -0x4c3f, -0x49b4, | |
| -0x471c, -0x447a, -0x41ce, -0x3f17, -0x3c56, -0x398c, -0x36ba, -0x33de, | |
| -0x30fb, -0x2e11, -0x2b1f, -0x2826, -0x2528, -0x2223, -0x1f19, -0x1c0b, | |
| -0x18f8, -0x15e2, -0x12c8, -0x0fab, -0x0c8b, -0x096a, -0x0647, -0x0324}; | |
| short DSP1_Sin(short Angle) | |
| { | |
| if (Angle < 0) { | |
| if (Angle == -32768) return 0; | |
| return -DSP1_Sin(-Angle); | |
| } | |
| int S = DSP1_SinTable[Angle >> 8] + (DSP1_MulTable[Angle & 0xff] * DSP1_SinTable[0x40 + (Angle >> 8)] >> 15); | |
| if (S > 32767) S = 32767; | |
| return (short) S; | |
| } | |
| short DSP1_Cos(short Angle) | |
| { | |
| if (Angle < 0) { | |
| if (Angle == -32768) return -32768; | |
| Angle = -Angle; | |
| } | |
| int S = DSP1_SinTable[0x40 + (Angle >> 8)] - (DSP1_MulTable[Angle & 0xff] * DSP1_SinTable[Angle >> 8] >> 15); | |
| if (S < -32768) S = -32767; | |
| return (short) S; | |
| } | |
| void DSP1_Normalize(short m, short *Coefficient, short *Exponent) | |
| { | |
| short i = 0x4000; | |
| short e = 0; | |
| if (m < 0) | |
| while ((m & i) && i) { | |
| i >>= 1; | |
| e++; | |
| } | |
| else | |
| while (!(m & i) && i) { | |
| i >>= 1; | |
| e++; | |
| } | |
| if (e > 0) | |
| *Coefficient = m * DSP1ROM[(0x21 + e)&1023] << 1; | |
| else | |
| *Coefficient = m; | |
| *Exponent -= e; | |
| } | |
| void DSP1_Normalizefloat(int Product, short *Coefficient, short *Exponent) | |
| { | |
| short n = Product & 0x7fff; | |
| short m = Product >> 15; | |
| short i = 0x4000; | |
| short e = 0; | |
| if (m < 0) | |
| while ((m & i) && i) { | |
| i >>= 1; | |
| e++; | |
| } | |
| else | |
| while (!(m & i) && i) { | |
| i >>= 1; | |
| e++; | |
| } | |
| if (e > 0) | |
| { | |
| *Coefficient = m * DSP1ROM[(0x0021 + e)&1023] << 1; | |
| if (e < 15) | |
| *Coefficient += n * DSP1ROM[(0x0040 - e)&1023] >> 15; | |
| else | |
| { | |
| i = 0x4000; | |
| if (m < 0) | |
| while ((n & i) && i) { | |
| i >>= 1; | |
| e++; | |
| } | |
| else | |
| while (!(n & i) && i) { | |
| i >>= 1; | |
| e++; | |
| } | |
| if (e > 15) | |
| *Coefficient = n * DSP1ROM[(0x0012 + e)&1023] << 1; | |
| else | |
| *Coefficient += n; | |
| } | |
| } | |
| else | |
| *Coefficient = m; | |
| *Exponent = e; | |
| } | |
| #define VofAngle 0x3880 | |
| inline void DSPOp02() | |
| { | |
| DSP1.Op02FX = (short)DSP1.parameters16 [0]; | |
| DSP1.Op02FY = (short)DSP1.parameters16 [1]; | |
| DSP1.Op02FZ = (short)DSP1.parameters16 [2]; | |
| DSP1.Op02LFE = (short)DSP1.parameters16 [3]; | |
| DSP1.Op02LES = (short)DSP1.parameters16 [4]; | |
| DSP1.Op02AAS = (unsigned short)DSP1.parameters16 [5]; | |
| DSP1.Op02AZS = (unsigned short)DSP1.parameters16 [6]; | |
| float ViewerX1; | |
| float ViewerY1; | |
| float ViewerZ1; | |
| ViewerZ1=-Cos(Angle(DSP1.Op02AZS)); | |
| ViewerX1=Sin(Angle(DSP1.Op02AZS))*Sin(Angle(DSP1.Op02AAS)); | |
| ViewerY1=Sin(Angle(DSP1.Op02AZS))*Cos(Angle(DSP1.Op02AAS)); | |
| #ifdef debug02 | |
| printf("\nViewerX1 : %f ViewerY1 : %f ViewerZ1 : %f\n",ViewerX1,ViewerY1, | |
| ViewerZ1); | |
| getch(); | |
| #endif | |
| float ViewerX; | |
| float ViewerY; | |
| float ViewerZ; | |
| ViewerX=DSP1.Op02FX-ViewerX1*DSP1.Op02LFE; | |
| ViewerY=DSP1.Op02FY-ViewerY1*DSP1.Op02LFE; | |
| ViewerZ=DSP1.Op02FZ-ViewerZ1*DSP1.Op02LFE; | |
| #ifdef debug02 | |
| float ScreenX; | |
| float ScreenY; | |
| float ScreenZ; | |
| ScreenX=DSP1.Op02FX+ViewerX1*(DSP1.Op02LES-DSP1.Op02LFE); | |
| ScreenY=DSP1.Op02FY+ViewerY1*(DSP1.Op02LES-DSP1.Op02LFE); | |
| ScreenZ=DSP1.Op02FZ+ViewerZ1*(DSP1.Op02LES-DSP1.Op02LFE); | |
| printf("ViewerX : %f ViewerY : %f ViewerZ : %f\n",ViewerX,ViewerY,ViewerZ); | |
| printf("DSP1.Op02FX : %d DSP1.Op02FY : %d DSP1.Op02FZ : %d\n",DSP1.Op02FX,DSP1.Op02FY,DSP1.Op02FZ); | |
| printf("ScreenX : %f ScreenY : %f ScreenZ : %f\n",ScreenX,ScreenY,ScreenZ); | |
| getch(); | |
| #endif | |
| if (ViewerZ1==0)ViewerZ1++; | |
| DSP1.Op02VOF=0x0000; | |
| int ReversedLES=0; | |
| short Op02LESb=DSP1.Op02LES; | |
| if ((DSP1.Op02LES>=VofAngle+16384.0) && (DSP1.Op02LES<VofAngle+32768.0)) { | |
| ReversedLES=1; | |
| Op02LESb=VofAngle+0x4000-(DSP1.Op02LES-(VofAngle+0x4000)); | |
| } | |
| DSP1.Op02VVA = (short)(Op02LESb * tanf((DSP1.Op02AZS-0x4000)*6.2832/65536.0)); | |
| if ((Op02LESb>=VofAngle) && (Op02LESb<=VofAngle+0x4000)) { | |
| DSP1.Op02VOF= (short)(Op02LESb * tanf((DSP1.Op02AZS-0x4000-VofAngle)*6.2832/65536.0)); | |
| DSP1.Op02VVA-=DSP1.Op02VOF; | |
| } | |
| if (ReversedLES){ | |
| DSP1.Op02VOF=-DSP1.Op02VOF; | |
| } | |
| DSP1.NAzsB = (DSP1.Op02AZS-0x4000)*6.2832/65536.0; | |
| DSP1.NAasB = DSP1.Op02AAS*6.2832/65536.0; | |
| if (tanf(DSP1.NAzsB)==0) DSP1.NAzsB=0.1; | |
| DSP1.ScrDispl=0; | |
| if (DSP1.NAzsB>-0.15) {DSP1.NAzsB=-0.15;DSP1.ScrDispl=DSP1.Op02VVA-0xFFDA;} | |
| float CXdistance=1/tanf(DSP1.NAzsB); | |
| DSP1.ViewerXc=DSP1.Op02FX; | |
| DSP1.ViewerYc=DSP1.Op02FY; | |
| DSP1.ViewerZc=DSP1.Op02FZ; | |
| DSP1.CenterX = (-sinf(DSP1.NAasB)*DSP1.ViewerZc*CXdistance)+DSP1.ViewerXc; | |
| DSP1.CenterY = (cosf(DSP1.NAasB)*DSP1.ViewerZc*CXdistance)+DSP1.ViewerYc; | |
| short Op02CX = (short)DSP1.CenterX; | |
| short Op02CY = (short)DSP1.CenterY; | |
| DSP1.ViewerXc=ViewerX;//-DSP1.Op02FX); | |
| DSP1.ViewerYc=ViewerY;//-DSP1.Op02FY); | |
| DSP1.ViewerZc=ViewerZ;//-DSP1.Op02FZ); | |
| DSP1.CenterX = (-sinf(DSP1.NAasB)*DSP1.ViewerZc*CXdistance)+DSP1.ViewerXc; | |
| if (DSP1.CenterX<-32768) DSP1.CenterX = -32768; if (DSP1.CenterX>32767) DSP1.CenterX=32767; | |
| DSP1.CenterY = (cosf(DSP1.NAasB)*DSP1.ViewerZc*CXdistance)+DSP1.ViewerYc; | |
| if (DSP1.CenterY<-32768) DSP1.CenterY = -32768; if (DSP1.CenterY>32767) DSP1.CenterY=32767; | |
| // if (Op02CY < 0) {Op02CYSup = Op02CY/256; Op02CY = 0;} | |
| // if (Op02CX < 0) {Op02CXSup = Op02CX/256; Op02CX = 0;} | |
| // [4/15/2001] (ViewerX+ViewerX1*NumberOfSlope); | |
| // [4/15/2001] (ViewerY+ViewerY1*NumberOfSlope); | |
| // if(DSP1.Op02LFE==0x2200)DSP1.Op02VVA=0xFECD; | |
| // else DSP1.Op02VVA=0xFFB2; | |
| DSP1.out_count = 8; | |
| DSP1.output16 [0] = DSP1.Op02VOF; | |
| DSP1.output16 [1] = DSP1.Op02VVA; | |
| DSP1.output16 [2] = Op02CX; | |
| DSP1.output16 [3] = Op02CY; | |
| #ifdef DebugDSP1 | |
| Log_Message("OP02 FX:%d FY:%d FZ:%d LFE:%d LES:%d",DSP1.Op02FX,DSP1.Op02FY,DSP1.Op02FZ,DSP1.Op02LFE,DSP1.Op02LES); | |
| Log_Message(" AAS:%d AZS:%d VOF:%d VVA:%d",DSP1.Op02AAS,DSP1.Op02AZS,DSP1.Op02VOF,DSP1.Op02VVA); | |
| Log_Message(" VX:%d VY:%d VZ:%d",(short)ViewerX,(short)ViewerY,(short)ViewerZ); | |
| #endif | |
| } | |
| void GetRXYPos(float RVPos, float RHPos){ | |
| float scalar; | |
| if (DSP1.Op02LES==0) return; | |
| float NAzs,NAas; | |
| NAzs = DSP1.NAzsB - Atan((RVPos) / (float)DSP1.Op02LES); | |
| NAas = DSP1.NAasB;// + Atan(RHPos) / (float)DSP1.Op02LES); | |
| if (cosf(NAzs)==0) NAzs+=0.001; | |
| if (tanf(NAzs)==0) NAzs+=0.001; | |
| DSP1.RXRes = (-sinf(NAas)*DSP1.ViewerZc/(tanf(NAzs))+DSP1.ViewerXc); | |
| DSP1.RYRes = (cosf(NAas)*DSP1.ViewerZc/(tanf(NAzs))+DSP1.ViewerYc); | |
| scalar = ((DSP1.ViewerZc/sinf(NAzs))/(float)DSP1.Op02LES); | |
| DSP1.RXRes += scalar*-sinf(NAas+PI/2)*RHPos; | |
| DSP1.RYRes += scalar*cosf(NAas+PI/2)*RHPos; | |
| } | |
| void DSPOp0A() | |
| { | |
| float x2,y2,x3,y3,x4,y4,m,ypos; | |
| if(DSP1.Op0AVS!=0) { | |
| ypos=DSP1.Op0AVS-DSP1.ScrDispl; | |
| // DSP1.CenterX,DSP1.CenterX = Center (x1,y1) | |
| // Get (0,Vs) coords (x2,y2) | |
| GetRXYPos(ypos, 0); x2 = DSP1.RXRes; y2 = DSP1.RYRes; | |
| // Get (-128,Vs) coords (x3,y3) | |
| GetRXYPos(ypos, -128); x3 = DSP1.RXRes; y3 = DSP1.RYRes; | |
| // Get (127,Vs) coords (x4,y4) | |
| GetRXYPos(ypos, 127); x4 = DSP1.RXRes; y4 = DSP1.RYRes; | |
| // A = (x4-x3)/256 | |
| m = (x4-x3)/256*256; if (m>32767) m=32767; if (m<-32768) m=-32768; | |
| DSP1.Op0AA = (short)(m); | |
| // C = (y4-y3)/256 | |
| m = (y4-y3)/256*256; if (m>32767) m=32767; if (m<-32768) m=-32768; | |
| DSP1.Op0AC = (short)(m); | |
| if (ypos==0){ | |
| DSP1.Op0AB = 0; | |
| DSP1.Op0AD = 0; | |
| } | |
| else { | |
| // B = (x2-x1)/Vs | |
| m = (x2-DSP1.CenterX)/ypos*256; if (m>32767) m=32767; if (m<-32768) m=-32768; | |
| DSP1.Op0AB = (short)(m); | |
| // D = (y2-y1)/Vs | |
| m = (y2-DSP1.CenterY)/ypos*256; if (m>32767) m=32767; if (m<-32768) m=-32768; | |
| DSP1.Op0AD = (short)(m); | |
| } | |
| } | |
| DSP1.Op0AVS++; | |
| } | |
| #define SADDMULT1616(res,a,b,c,d) res=((int64)a*(int64)b+(int64)c*(int64)d)>>16; | |
| inline void DSPOp06() | |
| { | |
| int tanval2; | |
| short Op06X = (int16) DSP1.parameters16 [0]; | |
| short Op06Y = (int16) DSP1.parameters16 [1]; | |
| short Op06Z = (int16) DSP1.parameters16 [2]; | |
| int32 ObjPX; | |
| int32 ObjPY; | |
| int32 ObjPZ; | |
| int32 ObjPX1; | |
| int32 ObjPY1; | |
| int32 ObjPZ1; | |
| int32 ObjPX2; | |
| int32 ObjPY2; | |
| int32 ObjPZ2; | |
| unsigned short Op06S; | |
| ObjPX=Op06X-DSP1.Op02FX; | |
| ObjPY=Op06Y-DSP1.Op02FY; | |
| ObjPZ=Op06Z-DSP1.Op02FZ; | |
| // rotate around Z | |
| tanval2 = AngleFix(-DSP1.Op02AAS+32768); | |
| SADDMULT1616(ObjPX1,ObjPX,CosFix(tanval2),ObjPY,-SinFix(tanval2)) | |
| SADDMULT1616(ObjPY1,ObjPX,SinFix(tanval2),ObjPY,CosFix(tanval2)) | |
| ObjPZ1=ObjPZ; | |
| // rotate around X | |
| tanval2 = AngleFix(-DSP1.Op02AZS); | |
| ObjPX2=ObjPX1; | |
| SADDMULT1616(ObjPY2,ObjPY1,CosFix(tanval2),ObjPZ1,-SinFix(tanval2)) | |
| SADDMULT1616(ObjPZ2,ObjPY1,SinFix(tanval2),ObjPZ1,CosFix(tanval2)) | |
| #ifdef debug06 | |
| Log_Message("ObjPX2: %f ObjPY2: %f ObjPZ2: %f\n",ObjPX2,ObjPY2,ObjPZ2); | |
| #endif | |
| ObjPZ2=ObjPZ2-DSP1.Op02LFE; | |
| short Op06H; | |
| short Op06V; | |
| if (ObjPZ2<0) | |
| { | |
| //float d; | |
| int32 d; | |
| Op06H=(short)(-ObjPX2*DSP1.Op02LES/-(ObjPZ2)); //-ObjPX2*256/-ObjPZ2; | |
| Op06V=(short)(-ObjPY2*DSP1.Op02LES/-(ObjPZ2)); //-ObjPY2*256/-ObjPZ2; | |
| d=(((int32)DSP1.Op02LES)<<8)/(-ObjPZ2); | |
| if (d>65535) d=65535; | |
| if (d<0) d=0; | |
| Op06S=(unsigned short)d; | |
| } | |
| else | |
| { | |
| Op06H=0; | |
| Op06V=14*16; | |
| Op06S=0xFFFF; | |
| } | |
| DSP1.out_count = 6; | |
| DSP1.output16 [0] = Op06H; | |
| DSP1.output16 [1] = Op06V; | |
| DSP1.output16 [2] = Op06S; | |
| #ifdef DebugDSP1 | |
| Log_Message("OP06 X:%d Y:%d Z:%d",Op06X,Op06Y,Op06Z); | |
| Log_Message("OP06 H:%d V:%d S:%d",Op06H,Op06V,Op06S); | |
| #endif | |
| } | |
| inline void DSPOp01() | |
| { | |
| short Op01m = (int16) DSP1.parameters16 [0]; | |
| short Op01Zr = (int16) DSP1.parameters16 [1]; | |
| short Op01Yr = (int16) DSP1.parameters16 [2]; | |
| short Op01Xr = (int16) DSP1.parameters16 [3]; | |
| short SinAz = DSP1_Sin(Op01Zr); | |
| short CosAz = DSP1_Cos(Op01Zr); | |
| short SinAy = DSP1_Sin(Op01Yr); | |
| short CosAy = DSP1_Cos(Op01Yr); | |
| short SinAx = DSP1_Sin(Op01Xr); | |
| short CosAx = DSP1_Cos(Op01Xr); | |
| Op01m >>= 1; | |
| DSP1.matrixA[0][0] = (Op01m * CosAz >> 15) * CosAy >> 15; | |
| DSP1.matrixA[0][1] = -((Op01m * SinAz >> 15) * CosAy >> 15); | |
| DSP1.matrixA[0][2] = Op01m * SinAy >> 15; | |
| DSP1.matrixA[1][0] = ((Op01m * SinAz >> 15) * CosAx >> 15) + (((Op01m * CosAz >> 15) * SinAx >> 15) * SinAy >> 15); | |
| DSP1.matrixA[1][1] = ((Op01m * CosAz >> 15) * CosAx >> 15) - (((Op01m * SinAz >> 15) * SinAx >> 15) * SinAy >> 15); | |
| DSP1.matrixA[1][2] = -((Op01m * SinAx >> 15) * CosAy >> 15); | |
| DSP1.matrixA[2][0] = ((Op01m * SinAz >> 15) * SinAx >> 15) - (((Op01m * CosAz >> 15) * CosAx >> 15) * SinAy >> 15); | |
| DSP1.matrixA[2][1] = ((Op01m * CosAz >> 15) * SinAx >> 15) + (((Op01m * SinAz >> 15) * CosAx >> 15) * SinAy >> 15); | |
| DSP1.matrixA[2][2] = (Op01m * CosAx >> 15) * CosAy >> 15; | |
| } | |
| inline void DSPOp11() | |
| { | |
| short Op11m = (int16) DSP1.parameters16 [0]; | |
| short Op11Zr = (int16) DSP1.parameters16 [1]; | |
| short Op11Yr = (int16) DSP1.parameters16 [2]; | |
| short Op11Xr = (int16) DSP1.parameters16 [3]; | |
| short SinAz = DSP1_Sin(Op11Zr); | |
| short CosAz = DSP1_Cos(Op11Zr); | |
| short SinAy = DSP1_Sin(Op11Yr); | |
| short CosAy = DSP1_Cos(Op11Yr); | |
| short SinAx = DSP1_Sin(Op11Xr); | |
| short CosAx = DSP1_Cos(Op11Xr); | |
| Op11m >>= 1; | |
| DSP1.matrixB[0][0] = (Op11m * CosAz >> 15) * CosAy >> 15; | |
| DSP1.matrixB[0][1] = -((Op11m * SinAz >> 15) * CosAy >> 15); | |
| DSP1.matrixB[0][2] = Op11m * SinAy >> 15; | |
| DSP1.matrixB[1][0] = ((Op11m * SinAz >> 15) * CosAx >> 15) + (((Op11m * CosAz >> 15) * SinAx >> 15) * SinAy >> 15); | |
| DSP1.matrixB[1][1] = ((Op11m * CosAz >> 15) * CosAx >> 15) - (((Op11m * SinAz >> 15) * SinAx >> 15) * SinAy >> 15); | |
| DSP1.matrixB[1][2] = -((Op11m * SinAx >> 15) * CosAy >> 15); | |
| DSP1.matrixB[2][0] = ((Op11m * SinAz >> 15) * SinAx >> 15) - (((Op11m * CosAz >> 15) * CosAx >> 15) * SinAy >> 15); | |
| DSP1.matrixB[2][1] = ((Op11m * CosAz >> 15) * SinAx >> 15) + (((Op11m * SinAz >> 15) * CosAx >> 15) * SinAy >> 15); | |
| DSP1.matrixB[2][2] = (Op11m * CosAx >> 15) * CosAy >> 15; | |
| } | |
| inline void DSPOp21() | |
| { | |
| short Op21m = (int16) DSP1.parameters16 [0]; | |
| short Op21Zr = (int16) DSP1.parameters16 [1]; | |
| short Op21Yr = (int16) DSP1.parameters16 [2]; | |
| short Op21Xr = (int16) DSP1.parameters16 [3]; | |
| short SinAz = DSP1_Sin(Op21Zr); | |
| short CosAz = DSP1_Cos(Op21Zr); | |
| short SinAy = DSP1_Sin(Op21Yr); | |
| short CosAy = DSP1_Cos(Op21Yr); | |
| short SinAx = DSP1_Sin(Op21Xr); | |
| short CosAx = DSP1_Cos(Op21Xr); | |
| Op21m >>= 1; | |
| DSP1.matrixC[0][0] = (Op21m * CosAz >> 15) * CosAy >> 15; | |
| DSP1.matrixC[0][1] = -((Op21m * SinAz >> 15) * CosAy >> 15); | |
| DSP1.matrixC[0][2] = Op21m * SinAy >> 15; | |
| DSP1.matrixC[1][0] = ((Op21m * SinAz >> 15) * CosAx >> 15) + (((Op21m * CosAz >> 15) * SinAx >> 15) * SinAy >> 15); | |
| DSP1.matrixC[1][1] = ((Op21m * CosAz >> 15) * CosAx >> 15) - (((Op21m * SinAz >> 15) * SinAx >> 15) * SinAy >> 15); | |
| DSP1.matrixC[1][2] = -((Op21m * SinAx >> 15) * CosAy >> 15); | |
| DSP1.matrixC[2][0] = ((Op21m * SinAz >> 15) * SinAx >> 15) - (((Op21m * CosAz >> 15) * CosAx >> 15) * SinAy >> 15); | |
| DSP1.matrixC[2][1] = ((Op21m * CosAz >> 15) * SinAx >> 15) + (((Op21m * SinAz >> 15) * CosAx >> 15) * SinAy >> 15); | |
| DSP1.matrixC[2][2] = (Op21m * CosAx >> 15) * CosAy >> 15; | |
| } | |
| inline void DSPOp0D() | |
| { | |
| short Op0DX = (int16) DSP1.parameters16 [0]; | |
| short Op0DY = (int16) DSP1.parameters16 [1]; | |
| short Op0DZ = (int16) DSP1.parameters16 [2]; | |
| short Op0DF = (Op0DX * DSP1.matrixA[0][0] >> 15) + (Op0DY * DSP1.matrixA[0][1] >> 15) + (Op0DZ * DSP1.matrixA[0][2] >> 15); | |
| short Op0DL = (Op0DX * DSP1.matrixA[1][0] >> 15) + (Op0DY * DSP1.matrixA[1][1] >> 15) + (Op0DZ * DSP1.matrixA[1][2] >> 15); | |
| short Op0DU = (Op0DX * DSP1.matrixA[2][0] >> 15) + (Op0DY * DSP1.matrixA[2][1] >> 15) + (Op0DZ * DSP1.matrixA[2][2] >> 15); | |
| DSP1.out_count = 6; | |
| DSP1.output16 [0] = Op0DF; | |
| DSP1.output16 [1] = Op0DL; | |
| DSP1.output16 [2] = Op0DU; | |
| #ifdef DebugDSP1 | |
| Log_Message("OP0D X: %d Y: %d Z: %d / F: %d L: %d U: %d",Op0DX,Op0DY,Op0DZ,Op0DF,Op0DL,Op0DU); | |
| #endif | |
| } | |
| inline void DSPOp1D() | |
| { | |
| short Op1DX = (int16) DSP1.parameters16 [0]; | |
| short Op1DY = (int16) DSP1.parameters16 [1]; | |
| short Op1DZ = (int16) DSP1.parameters16 [2]; | |
| short Op1DF = (Op1DX * DSP1.matrixB[0][0] >> 15) + (Op1DY * DSP1.matrixB[0][1] >> 15) + (Op1DZ * DSP1.matrixB[0][2] >> 15); | |
| short Op1DL = (Op1DX * DSP1.matrixB[1][0] >> 15) + (Op1DY * DSP1.matrixB[1][1] >> 15) + (Op1DZ * DSP1.matrixB[1][2] >> 15); | |
| short Op1DU = (Op1DX * DSP1.matrixB[2][0] >> 15) + (Op1DY * DSP1.matrixB[2][1] >> 15) + (Op1DZ * DSP1.matrixB[2][2] >> 15); | |
| DSP1.out_count = 6; | |
| DSP1.output16 [0] = Op1DF; | |
| DSP1.output16 [1] = Op1DL; | |
| DSP1.output16 [2] = Op1DU; | |
| #ifdef DebugDSP1 | |
| Log_Message("OP1D X: %d Y: %d Z: %d / F: %d L: %d U: %d",Op1DX,Op1DY,Op1DZ,Op1DF,Op1DL,Op1DU); | |
| #endif | |
| } | |
| inline void DSPOp2D() | |
| { | |
| short Op2DX = (int16) DSP1.parameters16 [0]; | |
| short Op2DY = (int16) DSP1.parameters16 [1]; | |
| short Op2DZ = (int16) DSP1.parameters16 [2]; | |
| short Op2DF = (Op2DX * DSP1.matrixC[0][0] >> 15) + (Op2DY * DSP1.matrixC[0][1] >> 15) + (Op2DZ * DSP1.matrixC[0][2] >> 15); | |
| short Op2DL = (Op2DX * DSP1.matrixC[1][0] >> 15) + (Op2DY * DSP1.matrixC[1][1] >> 15) + (Op2DZ * DSP1.matrixC[1][2] >> 15); | |
| short Op2DU = (Op2DX * DSP1.matrixC[2][0] >> 15) + (Op2DY * DSP1.matrixC[2][1] >> 15) + (Op2DZ * DSP1.matrixC[2][2] >> 15); | |
| DSP1.out_count = 6; | |
| DSP1.output16 [0] = Op2DF; | |
| DSP1.output16 [1] = Op2DL; | |
| DSP1.output16 [2] = Op2DU; | |
| #ifdef DebugDSP1 | |
| Log_Message("OP2D X: %d Y: %d Z: %d / F: %d L: %d U: %d",Op2DX,Op2DY,Op2DZ,Op2DF,Op2DL,Op2DU); | |
| #endif | |
| } | |
| inline void DSPOp03() | |
| { | |
| short Op03F = (int16) DSP1.parameters16 [0]; | |
| short Op03L = (int16) DSP1.parameters16 [1]; | |
| short Op03U = (int16) DSP1.parameters16 [2]; | |
| short Op03X = (Op03F * DSP1.matrixA[0][0] >> 15) + (Op03L * DSP1.matrixA[1][0] >> 15) + (Op03U * DSP1.matrixA[2][0] >> 15); | |
| short Op03Y = (Op03F * DSP1.matrixA[0][1] >> 15) + (Op03L * DSP1.matrixA[1][1] >> 15) + (Op03U * DSP1.matrixA[2][1] >> 15); | |
| short Op03Z = (Op03F * DSP1.matrixA[0][2] >> 15) + (Op03L * DSP1.matrixA[1][2] >> 15) + (Op03U * DSP1.matrixA[2][2] >> 15); | |
| DSP1.out_count = 6; | |
| DSP1.output16 [0] = Op03X; | |
| DSP1.output16 [1] = Op03Y; | |
| DSP1.output16 [2] = Op03Z; | |
| #ifdef DebugDSP1 | |
| Log_Message("OP03 F: %d L: %d U: %d / X: %d Y: %d Z: %d",Op03F,Op03L,Op03U,Op03X,Op03Y,Op03Z); | |
| #endif | |
| } | |
| inline void DSPOp13() | |
| { | |
| short Op13F = (int16) DSP1.parameters16 [0]; | |
| short Op13L = (int16) DSP1.parameters16 [1]; | |
| short Op13U = (int16) DSP1.parameters16 [2]; | |
| short Op13X = (Op13F * DSP1.matrixB[0][0] >> 15) + (Op13L * DSP1.matrixB[1][0] >> 15) + (Op13U * DSP1.matrixB[2][0] >> 15); | |
| short Op13Y = (Op13F * DSP1.matrixB[0][1] >> 15) + (Op13L * DSP1.matrixB[1][1] >> 15) + (Op13U * DSP1.matrixB[2][1] >> 15); | |
| short Op13Z = (Op13F * DSP1.matrixB[0][2] >> 15) + (Op13L * DSP1.matrixB[1][2] >> 15) + (Op13U * DSP1.matrixB[2][2] >> 15); | |
| DSP1.out_count = 6; | |
| DSP1.output16 [0] = Op13X; | |
| DSP1.output16 [1] = Op13Y; | |
| DSP1.output16 [2] = Op13Z; | |
| #ifdef DebugDSP1 | |
| Log_Message("OP13 F: %d L: %d U: %d / X: %d Y: %d Z: %d",Op13F,Op13L,Op13U,Op13X,Op13Y,Op13Z); | |
| #endif | |
| } | |
| inline void DSPOp23() | |
| { | |
| short Op23F = (int16) DSP1.parameters16 [0]; | |
| short Op23L = (int16) DSP1.parameters16 [1]; | |
| short Op23U = (int16) DSP1.parameters16 [2]; | |
| short Op23X = (Op23F * DSP1.matrixC[0][0] >> 15) + (Op23L * DSP1.matrixC[1][0] >> 15) + (Op23U * DSP1.matrixC[2][0] >> 15); | |
| short Op23Y = (Op23F * DSP1.matrixC[0][1] >> 15) + (Op23L * DSP1.matrixC[1][1] >> 15) + (Op23U * DSP1.matrixC[2][1] >> 15); | |
| short Op23Z = (Op23F * DSP1.matrixC[0][2] >> 15) + (Op23L * DSP1.matrixC[1][2] >> 15) + (Op23U * DSP1.matrixC[2][2] >> 15); | |
| DSP1.out_count = 6; | |
| DSP1.output16 [0] = Op23X; | |
| DSP1.output16 [1] = Op23Y; | |
| DSP1.output16 [2] = Op23Z; | |
| #ifdef DebugDSP1 | |
| Log_Message("OP23 F: %d L: %d U: %d / X: %d Y: %d Z: %d",Op23F,Op23L,Op23U,Op23X,Op23Y,Op23Z); | |
| #endif | |
| } | |
| inline void DSPOp14() | |
| { | |
| short Op14Zr = (int16) DSP1.parameters16 [0]; | |
| short Op14Xr = (int16) DSP1.parameters16 [1]; | |
| short Op14Yr = (int16) DSP1.parameters16 [2]; | |
| short Op14U = (int16) DSP1.parameters16 [3]; | |
| short Op14F = (int16) DSP1.parameters16 [4]; | |
| short Op14L = (int16) DSP1.parameters16 [5]; | |
| short CSec, ESec, CTan, CSin, C, E; | |
| DSP1_Inverse(DSP1_Cos(Op14Xr), 0, &CSec, &ESec); | |
| // Rotation Around Z | |
| DSP1_Normalizefloat(Op14U * DSP1_Cos(Op14Yr) - Op14F * DSP1_Sin(Op14Yr), &C, &E); | |
| E = ESec - E; | |
| DSP1_Normalize(C * CSec >> 15, &C, &E); | |
| if (E > 0) { | |
| if (C > 0) C = 32767; else if (C < 0) C = -32767; | |
| } else { | |
| if (E < 0) C = C * DSP1ROM[(0x31 + E)&1023] >> 15; | |
| } | |
| short Op14Zrr = Op14Zr + C; | |
| // Rotation Around X | |
| short Op14Xrr = Op14Xr + (Op14U * DSP1_Sin(Op14Yr) >> 15) + (Op14F * DSP1_Cos(Op14Yr) >> 15); | |
| // Rotation Around Y | |
| DSP1_Normalizefloat(Op14U * DSP1_Cos(Op14Yr) + Op14F * DSP1_Sin(Op14Yr), &C, &E); | |
| E = ESec - E; | |
| DSP1_Normalize(DSP1_Sin(Op14Xr), &CSin, &E); | |
| CTan = CSec * CSin >> 15; | |
| DSP1_Normalize(-(C * CTan >> 15), &C, &E); | |
| if (E > 0) { | |
| if (C > 0) C = 32767; else if (C < 0) C = -32767; | |
| } else { | |
| if (E < 0) C = C * DSP1ROM[(0x31 + E)&1023] >> 15; | |
| } | |
| short Op14Yrr = Op14Yr + C + Op14L; | |
| DSP1.out_count = 6; | |
| DSP1.output16 [0] = Op14Zrr; | |
| DSP1.output16 [1] = Op14Xrr; | |
| DSP1.output16 [2] = Op14Yrr; | |
| } | |
| inline void DSPOp0B() | |
| { | |
| short Op0BX = (int16) DSP1.parameters16 [0]; | |
| short Op0BY = (int16) DSP1.parameters16 [1]; | |
| short Op0BZ = (int16) DSP1.parameters16 [2]; | |
| short Op0BS = (Op0BX * DSP1.matrixA[0][0] + Op0BY * DSP1.matrixA[0][1] + Op0BZ * DSP1.matrixA[0][2]) >> 15; | |
| DSP1.out_count = 2; | |
| DSP1.output16 [0] = Op0BS; | |
| } | |
| inline void DSPOp1B() | |
| { | |
| short Op1BX = (int16) DSP1.parameters16 [0]; | |
| short Op1BY = (int16) DSP1.parameters16 [1]; | |
| short Op1BZ = (int16) DSP1.parameters16 [2]; | |
| short Op1BS = (Op1BX * DSP1.matrixB[0][0] + Op1BY * DSP1.matrixB[0][1] + Op1BZ * DSP1.matrixB[0][2]) >> 15; | |
| DSP1.out_count = 2; | |
| DSP1.output16 [0] = Op1BS; | |
| } | |
| inline void DSPOp2B() | |
| { | |
| short Op2BX = (int16) DSP1.parameters16 [0]; | |
| short Op2BY = (int16) DSP1.parameters16 [1]; | |
| short Op2BZ = (int16) DSP1.parameters16 [2]; | |
| short Op2BS = (Op2BX * DSP1.matrixC[0][0] + Op2BY * DSP1.matrixC[0][1] + Op2BZ * DSP1.matrixC[0][2]) >> 15; | |
| DSP1.out_count = 2; | |
| DSP1.output16 [0] = Op2BS; | |
| } |