Annotation of hatari/src/falcon/dsp_core.c, revision 1.1.1.10

1.1       root        1: /*
                      2:        DSP M56001 emulation
                      3:        Host/Emulator <-> DSP glue
                      4: 
                      5:        (C) 2003-2008 ARAnyM developer team
                      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
1.1.1.9   root       18:        along with this program; if not, write to the Free Software Foundation,
                     19:        51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA
1.1       root       20: */
                     21: 
                     22: #ifdef HAVE_CONFIG_H
                     23: #include "config.h"
                     24: #endif
                     25: 
1.1.1.7   root       26: #include <stdio.h>
1.1       root       27: #include <string.h>
1.1.1.4   root       28: #include <math.h>
1.1       root       29: 
                     30: #include "dsp_core.h"
                     31: #include "dsp_cpu.h"
1.1.1.3   root       32: #include "ioMem.h"
                     33: #include "dsp.h"
1.1.1.4   root       34: #include "log.h"
1.1.1.3   root       35: 
1.1.1.4   root       36: /*--- the DSP core itself ---*/
                     37: dsp_core_t dsp_core;
1.1       root       38: 
1.1.1.2   root       39: /*--- Defines ---*/
1.1       root       40: #ifndef M_PI
                     41: #define M_PI   3.141592653589793238462643383279502
                     42: #endif
                     43: 
1.1.1.2   root       44: /*--- Functions prototypes ---*/
1.1.1.4   root       45: static void dsp_core_dsp2host(void);
                     46: static void dsp_core_host2dsp(void);
1.1       root       47: 
1.1.1.8   root       48: static void (*dsp_host_interrupt)(int);   /* Function to set/clear host interrupt */
1.1.1.3   root       49: 
1.1.1.10! root       50: static Uint32 const x_rom[0x100] = {
        !            51:        /* mulaw table */
        !            52:        /* M_00 */ 0x7D7C00, /* 8031 */
        !            53:        /* M_01 */ 0x797C00, /* 7775 */
        !            54:        /* M_02 */ 0x757C00, /* 7519 */
        !            55:        /* M_03 */ 0x717C00, /* 7263 */
        !            56:        /* M_04 */ 0x6D7C00, /* 7007 */
        !            57:        /* M_05 */ 0x697C00, /* 6751 */
        !            58:        /* M_06 */ 0x657C00, /* 6495 */
        !            59:        /* M_07 */ 0x617C00, /* 6239 */
        !            60:        /* M_08 */ 0x5D7C00, /* 5983 */
        !            61:        /* M_09 */ 0x597C00, /* 5727 */
        !            62:        /* M_0A */ 0x557C00, /* 5471 */
        !            63:        /* M_0B */ 0x517C00, /* 5215 */
        !            64:        /* M_0C */ 0x4D7C00, /* 4959 */
        !            65:        /* M_0D */ 0x497C00, /* 4703 */
        !            66:        /* M_0E */ 0x457C00, /* 4447 */
        !            67:        /* M_0F */ 0x417C00, /* 4191 */
        !            68:        /* M_10 */ 0x3E7C00, /* 3999 */
        !            69:        /* M_11 */ 0x3C7C00, /* 3871 */
        !            70:        /* M_12 */ 0x3A7C00, /* 3743 */
        !            71:        /* M_13 */ 0x387C00, /* 3615 */
        !            72:        /* M_14 */ 0x367C00, /* 3487 */
        !            73:        /* M_15 */ 0x347C00, /* 3359 */
        !            74:        /* M_16 */ 0x327C00, /* 3231 */
        !            75:        /* M_17 */ 0x307C00, /* 3103 */
        !            76:        /* M_18 */ 0x2E7C00, /* 2975 */
        !            77:        /* M_19 */ 0x2C7C00, /* 2847 */
        !            78:        /* M_1A */ 0x2A7C00, /* 2719 */
        !            79:        /* M_1B */ 0x287C00, /* 2591 */
        !            80:        /* M_1C */ 0x267C00, /* 2463 */
        !            81:        /* M_1D */ 0x247C00, /* 2335 */
        !            82:        /* M_1E */ 0x227C00, /* 2207 */
        !            83:        /* M_1F */ 0x207C00, /* 2079 */
        !            84:        /* M_20 */ 0x1EFC00, /* 1983 */
        !            85:        /* M_21 */ 0x1DFC00, /* 1919 */
        !            86:        /* M_22 */ 0x1CFC00, /* 1855 */
        !            87:        /* M_23 */ 0x1BFC00, /* 1791 */
        !            88:        /* M_24 */ 0x1AFC00, /* 1727 */
        !            89:        /* M_25 */ 0x19FC00, /* 1663 */
        !            90:        /* M_26 */ 0x18FC00, /* 1599 */
        !            91:        /* M_27 */ 0x17FC00, /* 1535 */
        !            92:        /* M_28 */ 0x16FC00, /* 1471 */
        !            93:        /* M_29 */ 0x15FC00, /* 1407 */
        !            94:        /* M_2A */ 0x14FC00, /* 1343 */
        !            95:        /* M_2B */ 0x13FC00, /* 1279 */
        !            96:        /* M_2C */ 0x12FC00, /* 1215 */
        !            97:        /* M_2D */ 0x11FC00, /* 1151 */
        !            98:        /* M_2E */ 0x10FC00, /* 1087 */
        !            99:        /* M_2F */ 0x0FFC00, /* 1023 */
        !           100:        /* M_30 */ 0x0F3C00, /* 975 */
        !           101:        /* M_31 */ 0x0EBC00, /* 943 */
        !           102:        /* M_32 */ 0x0E3C00, /* 911 */
        !           103:        /* M_33 */ 0x0DBC00, /* 879 */
        !           104:        /* M_34 */ 0x0D3C00, /* 847 */
        !           105:        /* M_35 */ 0x0CBC00, /* 815 */
        !           106:        /* M_36 */ 0x0C3C00, /* 783 */
        !           107:        /* M_37 */ 0x0BBC00, /* 751 */
        !           108:        /* M_38 */ 0x0B3C00, /* 719 */
        !           109:        /* M_39 */ 0x0ABC00, /* 687 */
        !           110:        /* M_3A */ 0x0A3C00, /* 655 */
        !           111:        /* M_3B */ 0x09BC00, /* 623 */
        !           112:        /* M_3C */ 0x093C00, /* 591 */
        !           113:        /* M_3D */ 0x08BC00, /* 559 */
        !           114:        /* M_3E */ 0x083C00, /* 527 */
        !           115:        /* M_3F */ 0x07BC00, /* 495 */
        !           116:        /* M_40 */ 0x075C00, /* 471 */
        !           117:        /* M_41 */ 0x071C00, /* 455 */
        !           118:        /* M_42 */ 0x06DC00, /* 439 */
        !           119:        /* M_43 */ 0x069C00, /* 423 */
        !           120:        /* M_44 */ 0x065C00, /* 407 */
        !           121:        /* M_45 */ 0x061C00, /* 391 */
        !           122:        /* M_46 */ 0x05DC00, /* 375 */
        !           123:        /* M_47 */ 0x059C00, /* 359 */
        !           124:        /* M_48 */ 0x055C00, /* 343 */
        !           125:        /* M_49 */ 0x051C00, /* 327 */
        !           126:        /* M_4A */ 0x04DC00, /* 311 */
        !           127:        /* M_4B */ 0x049C00, /* 295 */
        !           128:        /* M_4C */ 0x045C00, /* 279 */
        !           129:        /* M_4D */ 0x041C00, /* 263 */
        !           130:        /* M_4E */ 0x03DC00, /* 247 */
        !           131:        /* M_4F */ 0x039C00, /* 231 */
        !           132:        /* M_50 */ 0x036C00, /* 219 */
        !           133:        /* M_51 */ 0x034C00, /* 211 */
        !           134:        /* M_52 */ 0x032C00, /* 203 */
        !           135:        /* M_53 */ 0x030C00, /* 195 */
        !           136:        /* M_54 */ 0x02EC00, /* 187 */
        !           137:        /* M_55 */ 0x02CC00, /* 179 */
        !           138:        /* M_56 */ 0x02AC00, /* 171 */
        !           139:        /* M_57 */ 0x028C00, /* 163 */
        !           140:        /* M_58 */ 0x026C00, /* 155 */
        !           141:        /* M_59 */ 0x024C00, /* 147 */
        !           142:        /* M_5A */ 0x022C00, /* 139 */
        !           143:        /* M_5B */ 0x020C00, /* 131 */
        !           144:        /* M_5C */ 0x01EC00, /* 123 */
        !           145:        /* M_5D */ 0x01CC00, /* 115 */
        !           146:        /* M_5E */ 0x01AC00, /* 107 */
        !           147:        /* M_5F */ 0x018C00, /* 99 */
        !           148:        /* M_60 */ 0x017400, /* 93 */
        !           149:        /* M_61 */ 0x016400, /* 89 */
        !           150:        /* M_62 */ 0x015400, /* 85 */
        !           151:        /* M_63 */ 0x014400, /* 81 */
        !           152:        /* M_64 */ 0x013400, /* 77 */
        !           153:        /* M_65 */ 0x012400, /* 73 */
        !           154:        /* M_66 */ 0x011400, /* 69 */
        !           155:        /* M_67 */ 0x010400, /* 65 */
        !           156:        /* M_68 */ 0x00F400, /* 61 */
        !           157:        /* M_69 */ 0x00E400, /* 57 */
        !           158:        /* M_6A */ 0x00D400, /* 53 */
        !           159:        /* M_6B */ 0x00C400, /* 49 */
        !           160:        /* M_6C */ 0x00B400, /* 45 */
        !           161:        /* M_6D */ 0x00A400, /* 41 */
        !           162:        /* M_6E */ 0x009400, /* 37 */
        !           163:        /* M_6F */ 0x008400, /* 33 */
        !           164:        /* M_70 */ 0x007800, /* 30 */
        !           165:        /* M_71 */ 0x007000, /* 28 */
        !           166:        /* M_72 */ 0x006800, /* 26 */
        !           167:        /* M_73 */ 0x006000, /* 24 */
        !           168:        /* M_74 */ 0x005800, /* 22 */
        !           169:        /* M_75 */ 0x005000, /* 20 */
        !           170:        /* M_76 */ 0x004800, /* 18 */
        !           171:        /* M_77 */ 0x004000, /* 16 */
        !           172:        /* M_78 */ 0x003800, /* 14 */
        !           173:        /* M_79 */ 0x003000, /* 12 */
        !           174:        /* M_7A */ 0x002800, /* 10 */
        !           175:        /* M_7B */ 0x002000, /* 8 */
        !           176:        /* M_7C */ 0x001800, /* 6 */
        !           177:        /* M_7D */ 0x001000, /* 4 */
        !           178:        /* M_7E */ 0x000800, /* 2 */
        !           179:        /* M_7F */ 0x000000, /* 0 */
        !           180: 
        !           181:        /* a-law table */
        !           182:        /* A_80 */ 0x158000, /* 688 */
        !           183:        /* A_81 */ 0x148000, /* 656 */
        !           184:        /* A_82 */ 0x178000, /* 752 */
        !           185:        /* A_83 */ 0x168000, /* 720 */
        !           186:        /* A_84 */ 0x118000, /* 560 */
        !           187:        /* A_85 */ 0x108000, /* 528 */
        !           188:        /* A_86 */ 0x138000, /* 624 */
        !           189:        /* A_87 */ 0x128000, /* 592 */
        !           190:        /* A_88 */ 0x1D8000, /* 944 */
        !           191:        /* A_89 */ 0x1C8000, /* 912 */
        !           192:        /* A_8A */ 0x1F8000, /* 1008 */
        !           193:        /* A_8B */ 0x1E8000, /* 976 */
        !           194:        /* A_8C */ 0x198000, /* 816 */
        !           195:        /* A_8D */ 0x188000, /* 784 */
        !           196:        /* A_8E */ 0x1B8000, /* 880 */
        !           197:        /* A_8F */ 0x1A8000, /* 848 */
        !           198:        /* A_90 */ 0x0AC000, /* 344 */
        !           199:        /* A_91 */ 0x0A4000, /* 328 */
        !           200:        /* A_92 */ 0x0BC000, /* 376 */
        !           201:        /* A_93 */ 0x0B4000, /* 360 */
        !           202:        /* A_94 */ 0x08C000, /* 280 */
        !           203:        /* A_95 */ 0x084000, /* 264 */
        !           204:        /* A_96 */ 0x09C000, /* 312 */
        !           205:        /* A_97 */ 0x094000, /* 296 */
        !           206:        /* A_98 */ 0x0EC000, /* 472 */
        !           207:        /* A_99 */ 0x0E4000, /* 456 */
        !           208:        /* A_9A */ 0x0FC000, /* 504 */
        !           209:        /* A_9B */ 0x0F4000, /* 488 */
        !           210:        /* A_9C */ 0x0CC000, /* 408 */
        !           211:        /* A_9D */ 0x0C4000, /* 392 */
        !           212:        /* A_9E */ 0x0DC000, /* 440 */
        !           213:        /* A_9F */ 0x0D4000, /* 424 */
        !           214:        /* A_A0 */ 0x560000, /* 2752 */
        !           215:        /* A_A1 */ 0x520000, /* 2624 */
        !           216:        /* A_A2 */ 0x5E0000, /* 3008 */
        !           217:        /* A_A3 */ 0x5A0000, /* 2880 */
        !           218:        /* A_A4 */ 0x460000, /* 2240 */
        !           219:        /* A_A5 */ 0x420000, /* 2112 */
        !           220:        /* A_A6 */ 0x4E0000, /* 2496 */
        !           221:        /* A_A7 */ 0x4A0000, /* 2368 */
        !           222:        /* A_A8 */ 0x760000, /* 3776 */
        !           223:        /* A_A9 */ 0x720000, /* 3648 */
        !           224:        /* A_AA */ 0x7E0000, /* 4032 */
        !           225:        /* A_AB */ 0x7A0000, /* 3904 */
        !           226:        /* A_AC */ 0x660000, /* 3264 */
        !           227:        /* A_AD */ 0x620000, /* 3136 */
        !           228:        /* A_AE */ 0x6E0000, /* 3520 */
        !           229:        /* A_AF */ 0x6A0000, /* 3392 */
        !           230:        /* A_B0 */ 0x2B0000, /* 1376 */
        !           231:        /* A_B1 */ 0x290000, /* 1312 */
        !           232:        /* A_B2 */ 0x2F0000, /* 1504 */
        !           233:        /* A_B3 */ 0x2D0000, /* 1440 */
        !           234:        /* A_B4 */ 0x230000, /* 1120 */
        !           235:        /* A_B5 */ 0x210000, /* 1056 */
        !           236:        /* A_B6 */ 0x270000, /* 1248 */
        !           237:        /* A_B7 */ 0x250000, /* 1184 */
        !           238:        /* A_B8 */ 0x3B0000, /* 1888 */
        !           239:        /* A_B9 */ 0x390000, /* 1824 */
        !           240:        /* A_BA */ 0x3F0000, /* 2016 */
        !           241:        /* A_BB */ 0x3D0000, /* 1952 */
        !           242:        /* A_BC */ 0x330000, /* 1632 */
        !           243:        /* A_BD */ 0x310000, /* 1568 */
        !           244:        /* A_BE */ 0x370000, /* 1760 */
        !           245:        /* A_BF */ 0x350000, /* 1696 */
        !           246:        /* A_C0 */ 0x015800, /* 43 */
        !           247:        /* A_C1 */ 0x014800, /* 41 */
        !           248:        /* A_C2 */ 0x017800, /* 47 */
        !           249:        /* A_C3 */ 0x016800, /* 45 */
        !           250:        /* A_C4 */ 0x011800, /* 35 */
        !           251:        /* A_C5 */ 0x010800, /* 33 */
        !           252:        /* A_C6 */ 0x013800, /* 39 */
        !           253:        /* A_C7 */ 0x012800, /* 37 */
        !           254:        /* A_C8 */ 0x01D800, /* 59 */
        !           255:        /* A_C9 */ 0x01C800, /* 57 */
        !           256:        /* A_CA */ 0x01F800, /* 63 */
        !           257:        /* A_CB */ 0x01E800, /* 61 */
        !           258:        /* A_CC */ 0x019800, /* 51 */
        !           259:        /* A_CD */ 0x018800, /* 49 */
        !           260:        /* A_CE */ 0x01B800, /* 55 */
        !           261:        /* A_CF */ 0x01A800, /* 53 */
        !           262:        /* A_D0 */ 0x005800, /* 11 */
        !           263:        /* A_D1 */ 0x004800, /* 9 */
        !           264:        /* A_D2 */ 0x007800, /* 15 */
        !           265:        /* A_D3 */ 0x006800, /* 13 */
        !           266:        /* A_D4 */ 0x001800, /* 3 */
        !           267:        /* A_D5 */ 0x000800, /* 1 */
        !           268:        /* A_D6 */ 0x003800, /* 7 */
        !           269:        /* A_D7 */ 0x002800, /* 5 */
        !           270:        /* A_D8 */ 0x00D800, /* 27 */
        !           271:        /* A_D9 */ 0x00C800, /* 25 */
        !           272:        /* A_DA */ 0x00F800, /* 31 */
        !           273:        /* A_DB */ 0x00E800, /* 29 */
        !           274:        /* A_DC */ 0x009800, /* 19 */
        !           275:        /* A_DD */ 0x008800, /* 17 */
        !           276:        /* A_DE */ 0x00B800, /* 23 */
        !           277:        /* A_DF */ 0x00A800, /* 21 */
        !           278:        /* A_E0 */ 0x056000, /* 172 */
        !           279:        /* A_E1 */ 0x052000, /* 164 */
        !           280:        /* A_E2 */ 0x05E000, /* 188 */
        !           281:        /* A_E3 */ 0x05A000, /* 180 */
        !           282:        /* A_E4 */ 0x046000, /* 140 */
        !           283:        /* A_E5 */ 0x042000, /* 132 */
        !           284:        /* A_E6 */ 0x04E000, /* 156 */
        !           285:        /* A_E7 */ 0x04A000, /* 148 */
        !           286:        /* A_E8 */ 0x076000, /* 236 */
        !           287:        /* A_E9 */ 0x072000, /* 228 */
        !           288:        /* A_EA */ 0x07E000, /* 252 */
        !           289:        /* A_EB */ 0x07A000, /* 244 */
        !           290:        /* A_EC */ 0x066000, /* 204 */
        !           291:        /* A_ED */ 0x062000, /* 196 */
        !           292:        /* A_EE */ 0x06E000, /* 220 */
        !           293:        /* A_EF */ 0x06A000, /* 212 */
        !           294:        /* A_F0 */ 0x02B000, /* 86 */
        !           295:        /* A_F1 */ 0x029000, /* 82 */
        !           296:        /* A_F2 */ 0x02F000, /* 94 */
        !           297:        /* A_F3 */ 0x02D000, /* 90 */
        !           298:        /* A_F4 */ 0x023000, /* 70 */
        !           299:        /* A_F5 */ 0x021000, /* 66 */
        !           300:        /* A_F6 */ 0x027000, /* 78 */
        !           301:        /* A_F7 */ 0x025000, /* 74 */
        !           302:        /* A_F8 */ 0x03B000, /* 118 */
        !           303:        /* A_F9 */ 0x039000, /* 114 */
        !           304:        /* A_FA */ 0x03F000, /* 126 */
        !           305:        /* A_FB */ 0x03D000, /* 122 */
        !           306:        /* A_FC */ 0x033000, /* 102 */
        !           307:        /* A_FD */ 0x031000, /* 98 */
        !           308:        /* A_FE */ 0x037000, /* 110 */
        !           309:        /* A_FF */ 0x035000  /* 106 */
        !           310: };
        !           311: 
        !           312: /* sin table */
        !           313: static Uint32 const y_rom[0x100] = {
        !           314:        /* S_00 */ 0x000000, /* +0.0000000000 */
        !           315:        /* S_01 */ 0x03242b, /* +0.0245412588 */
        !           316:        /* S_02 */ 0x0647d9, /* +0.0490676165 */
        !           317:        /* S_03 */ 0x096a90, /* +0.0735645294 */
        !           318:        /* S_04 */ 0x0c8bd3, /* +0.0980170965 */
        !           319:        /* S_05 */ 0x0fab27, /* +0.1224106550 */
        !           320:        /* S_06 */ 0x12c810, /* +0.1467304230 */
        !           321:        /* S_07 */ 0x15e214, /* +0.1709618568 */
        !           322:        /* S_08 */ 0x18f8b8, /* +0.1950902939 */
        !           323:        /* S_09 */ 0x1c0b82, /* +0.2191011906 */
        !           324:        /* S_0A */ 0x1f19f9, /* +0.2429801226 */
        !           325:        /* S_0B */ 0x2223a5, /* +0.2667127848 */
        !           326:        /* S_0C */ 0x25280c, /* +0.2902846336 */
        !           327:        /* S_0D */ 0x2826b9, /* +0.3136817217 */
        !           328:        /* S_0E */ 0x2b1f35, /* +0.3368898630 */
        !           329:        /* S_0F */ 0x2e110a, /* +0.3598949909 */
        !           330:        /* S_10 */ 0x30fbc5, /* +0.3826833963 */
        !           331:        /* S_11 */ 0x33def3, /* +0.4052413702 */
        !           332:        /* S_12 */ 0x36ba20, /* +0.4275550842 */
        !           333:        /* S_13 */ 0x398cdd, /* +0.4496113062 */
        !           334:        /* S_14 */ 0x3c56ba, /* +0.4713966846 */
        !           335:        /* S_15 */ 0x3f174a, /* +0.4928982258 */
        !           336:        /* S_16 */ 0x41ce1e, /* +0.5141026974 */
        !           337:        /* S_17 */ 0x447acd, /* +0.5349975824 */
        !           338:        /* S_18 */ 0x471ced, /* +0.5555702448 */
        !           339:        /* S_19 */ 0x49b415, /* +0.5758081675 */
        !           340:        /* S_1A */ 0x4c3fe0, /* +0.5956993103 */
        !           341:        /* S_1B */ 0x4ebfe9, /* +0.6152316332 */
        !           342:        /* S_1C */ 0x5133cd, /* +0.6343933344 */
        !           343:        /* S_1D */ 0x539b2b, /* +0.6531728506 */
        !           344:        /* S_1E */ 0x55f5a5, /* +0.6715589762 */
        !           345:        /* S_1F */ 0x5842dd, /* +0.6895405054 */
        !           346:        /* S_20 */ 0x5a827a, /* +0.7071068287 */
        !           347:        /* S_21 */ 0x5cb421, /* +0.7242470980 */
        !           348:        /* S_22 */ 0x5ed77d, /* +0.7409511805 */
        !           349:        /* S_23 */ 0x60ec38, /* +0.7572088242 */
        !           350:        /* S_24 */ 0x62f202, /* +0.7730104923 */
        !           351:        /* S_25 */ 0x64e889, /* +0.7883464098 */
        !           352:        /* S_26 */ 0x66cf81, /* +0.8032075167 */
        !           353:        /* S_27 */ 0x68a69f, /* +0.8175848722 */
        !           354:        /* S_28 */ 0x6a6d99, /* +0.8314696550 */
        !           355:        /* S_29 */ 0x6c2429, /* +0.8448535204 */
        !           356:        /* S_2A */ 0x6dca0d, /* +0.8577286005 */
        !           357:        /* S_2B */ 0x6f5f03, /* +0.8700870275 */
        !           358:        /* S_2C */ 0x70e2cc, /* +0.8819212914 */
        !           359:        /* S_2D */ 0x72552d, /* +0.8932243586 */
        !           360:        /* S_2E */ 0x73b5ec, /* +0.9039893150 */
        !           361:        /* S_2F */ 0x7504d3, /* +0.9142097235 */
        !           362:        /* S_30 */ 0x7641af, /* +0.9238795042 */
        !           363:        /* S_31 */ 0x776c4f, /* +0.9329928160 */
        !           364:        /* S_32 */ 0x788484, /* +0.9415440559 */
        !           365:        /* S_33 */ 0x798a24, /* +0.9495282173 */
        !           366:        /* S_34 */ 0x7a7d05, /* +0.9569402933 */
        !           367:        /* S_35 */ 0x7b5d04, /* +0.9637761116 */
        !           368:        /* S_36 */ 0x7c29fc, /* +0.9700312614 */
        !           369:        /* S_37 */ 0x7ce3cf, /* +0.9757021666 */
        !           370:        /* S_38 */ 0x7d8a5f, /* +0.9807852507 */
        !           371:        /* S_39 */ 0x7e1d94, /* +0.9852776527 */
        !           372:        /* S_3A */ 0x7e9d56, /* +0.9891765118 */
        !           373:        /* S_3B */ 0x7f0992, /* +0.9924795628 */
        !           374:        /* S_3C */ 0x7f6237, /* +0.9951847792 */
        !           375:        /* S_3D */ 0x7fa737, /* +0.9972904921 */
        !           376:        /* S_3E */ 0x7fd888, /* +0.9987955093 */
        !           377:        /* S_3F */ 0x7ff622, /* +0.9996988773 */
        !           378:        /* S_40 */ 0x7fffff, /* +1.0000000000 */
        !           379:        /* S_41 */ 0x7ff622, /* +0.9996988773 */
        !           380:        /* S_42 */ 0x7fd888, /* +0.9987955093 */
        !           381:        /* S_43 */ 0x7fa737, /* +0.9972904921 */
        !           382:        /* S_44 */ 0x7f6237, /* +0.9951847792 */
        !           383:        /* S_45 */ 0x7f0992, /* +0.9924795628 */
        !           384:        /* S_46 */ 0x7e9d56, /* +0.9891765118 */
        !           385:        /* S_47 */ 0x7e1d94, /* +0.9852776527 */
        !           386:        /* S_48 */ 0x7d8a5f, /* +0.9807852507 */
        !           387:        /* S_49 */ 0x7ce3cf, /* +0.9757021666 */
        !           388:        /* S_4A */ 0x7c29fc, /* +0.9700312614 */
        !           389:        /* S_4B */ 0x7b5d04, /* +0.9637761116 */
        !           390:        /* S_4C */ 0x7a7d05, /* +0.9569402933 */
        !           391:        /* S_4D */ 0x798a24, /* +0.9495282173 */
        !           392:        /* S_4E */ 0x788484, /* +0.9415440559 */
        !           393:        /* S_4F */ 0x776c4f, /* +0.9329928160 */
        !           394:        /* S_50 */ 0x7641af, /* +0.9238795042 */
        !           395:        /* S_51 */ 0x7504d3, /* +0.9142097235 */
        !           396:        /* S_52 */ 0x73b5ec, /* +0.9039893150 */
        !           397:        /* S_53 */ 0x72552d, /* +0.8932243586 */
        !           398:        /* S_54 */ 0x70e2cc, /* +0.8819212914 */
        !           399:        /* S_55 */ 0x6f5f03, /* +0.8700870275 */
        !           400:        /* S_56 */ 0x6dca0d, /* +0.8577286005 */
        !           401:        /* S_57 */ 0x6c2429, /* +0.8448535204 */
        !           402:        /* S_58 */ 0x6a6d99, /* +0.8314696550 */
        !           403:        /* S_59 */ 0x68a69f, /* +0.8175848722 */
        !           404:        /* S_5A */ 0x66cf81, /* +0.8032075167 */
        !           405:        /* S_5B */ 0x64e889, /* +0.7883464098 */
        !           406:        /* S_5C */ 0x62f202, /* +0.7730104923 */
        !           407:        /* S_5D */ 0x60ec38, /* +0.7572088242 */
        !           408:        /* S_5E */ 0x5ed77d, /* +0.7409511805 */
        !           409:        /* S_5F */ 0x5cb421, /* +0.7242470980 */
        !           410:        /* S_60 */ 0x5a827a, /* +0.7071068287 */
        !           411:        /* S_61 */ 0x5842dd, /* +0.6895405054 */
        !           412:        /* S_62 */ 0x55f5a5, /* +0.6715589762 */
        !           413:        /* S_63 */ 0x539b2b, /* +0.6531728506 */
        !           414:        /* S_64 */ 0x5133cd, /* +0.6343933344 */
        !           415:        /* S_65 */ 0x4ebfe9, /* +0.6152316332 */
        !           416:        /* S_66 */ 0x4c3fe0, /* +0.5956993103 */
        !           417:        /* S_67 */ 0x49b415, /* +0.5758081675 */
        !           418:        /* S_68 */ 0x471ced, /* +0.5555702448 */
        !           419:        /* S_69 */ 0x447acd, /* +0.5349975824 */
        !           420:        /* S_6A */ 0x41ce1e, /* +0.5141026974 */
        !           421:        /* S_6B */ 0x3f174a, /* +0.4928982258 */
        !           422:        /* S_6C */ 0x3c56ba, /* +0.4713966846 */
        !           423:        /* S_6D */ 0x398cdd, /* +0.4496113062 */
        !           424:        /* S_6E */ 0x36ba20, /* +0.4275550842 */
        !           425:        /* S_6F */ 0x33def3, /* +0.4052413702 */
        !           426:        /* S_70 */ 0x30fbc5, /* +0.3826833963 */
        !           427:        /* S_71 */ 0x2e110a, /* +0.3598949909 */
        !           428:        /* S_72 */ 0x2b1f35, /* +0.3368898630 */
        !           429:        /* S_73 */ 0x2826b9, /* +0.3136817217 */
        !           430:        /* S_74 */ 0x25280c, /* +0.2902846336 */
        !           431:        /* S_75 */ 0x2223a5, /* +0.2667127848 */
        !           432:        /* S_76 */ 0x1f19f9, /* +0.2429801226 */
        !           433:        /* S_77 */ 0x1c0b82, /* +0.2191011906 */
        !           434:        /* S_78 */ 0x18f8b8, /* +0.1950902939 */
        !           435:        /* S_79 */ 0x15e214, /* +0.1709618568 */
        !           436:        /* S_7A */ 0x12c810, /* +0.1467304230 */
        !           437:        /* S_7B */ 0x0fab27, /* +0.1224106550 */
        !           438:        /* S_7C */ 0x0c8bd3, /* +0.0980170965 */
        !           439:        /* S_7D */ 0x096a90, /* +0.0735645294 */
        !           440:        /* S_7E */ 0x0647d9, /* +0.0490676165 */
        !           441:        /* S_7F */ 0x03242b, /* +0.0245412588 */
        !           442:        /* S_80 */ 0x000000, /* +0.0000000000 */
        !           443:        /* S_81 */ 0xfcdbd5, /* -0.0245412588 */
        !           444:        /* S_82 */ 0xf9b827, /* -0.0490676165 */
        !           445:        /* S_83 */ 0xf69570, /* -0.0735645294 */
        !           446:        /* S_84 */ 0xf3742d, /* -0.0980170965 */
        !           447:        /* S_85 */ 0xf054d9, /* -0.1224106550 */
        !           448:        /* S_86 */ 0xed37f0, /* -0.1467304230 */
        !           449:        /* S_87 */ 0xea1dec, /* -0.1709618568 */
        !           450:        /* S_88 */ 0xe70748, /* -0.1950902939 */
        !           451:        /* S_89 */ 0xe3f47e, /* -0.2191011906 */
        !           452:        /* S_8A */ 0xe0e607, /* -0.2429801226 */
        !           453:        /* S_8B */ 0xdddc5b, /* -0.2667127848 */
        !           454:        /* S_8C */ 0xdad7f4, /* -0.2902846336 */
        !           455:        /* S_8D */ 0xd7d947, /* -0.3136817217 */
        !           456:        /* S_8E */ 0xd4e0cb, /* -0.3368898630 */
        !           457:        /* S_8F */ 0xd1eef6, /* -0.3598949909 */
        !           458:        /* S_90 */ 0xcf043b, /* -0.3826833963 */
        !           459:        /* S_91 */ 0xcc210d, /* -0.4052413702 */
        !           460:        /* S_92 */ 0xc945e0, /* -0.4275550842 */
        !           461:        /* S_93 */ 0xc67323, /* -0.4496113062 */
        !           462:        /* S_94 */ 0xc3a946, /* -0.4713966846 */
        !           463:        /* S_95 */ 0xc0e8b6, /* -0.4928982258 */
        !           464:        /* S_96 */ 0xbe31e2, /* -0.5141026974 */
        !           465:        /* S_97 */ 0xbb8533, /* -0.5349975824 */
        !           466:        /* S_98 */ 0xb8e313, /* -0.5555702448 */
        !           467:        /* S_99 */ 0xb64beb, /* -0.5758081675 */
        !           468:        /* S_9A */ 0xb3c020, /* -0.5956993103 */
        !           469:        /* S_9B */ 0xb14017, /* -0.6152316332 */
        !           470:        /* S_9C */ 0xaecc33, /* -0.6343933344 */
        !           471:        /* S_9D */ 0xac64d5, /* -0.6531728506 */
        !           472:        /* S_9E */ 0xaa0a5b, /* -0.6715589762 */
        !           473:        /* S_9F */ 0xa7bd23, /* -0.6895405054 */
        !           474:        /* S_A0 */ 0xa57d86, /* -0.7071068287 */
        !           475:        /* S_A1 */ 0xa34bdf, /* -0.7242470980 */
        !           476:        /* S_A2 */ 0xa12883, /* -0.7409511805 */
        !           477:        /* S_A3 */ 0x9f13c8, /* -0.7572088242 */
        !           478:        /* S_A4 */ 0x9d0dfe, /* -0.7730104923 */
        !           479:        /* S_A5 */ 0x9b1777, /* -0.7883464098 */
        !           480:        /* S_A6 */ 0x99307f, /* -0.8032075167 */
        !           481:        /* S_A7 */ 0x975961, /* -0.8175848722 */
        !           482:        /* S_A8 */ 0x959267, /* -0.8314696550 */
        !           483:        /* S_A9 */ 0x93dbd7, /* -0.8448535204 */
        !           484:        /* S_AA */ 0x9235f3, /* -0.8577286005 */
        !           485:        /* S_AB */ 0x90a0fd, /* -0.8700870275 */
        !           486:        /* S_AC */ 0x8f1d34, /* -0.8819212914 */
        !           487:        /* S_AD */ 0x8daad3, /* -0.8932243586 */
        !           488:        /* S_AE */ 0x8c4a14, /* -0.9039893150 */
        !           489:        /* S_AF */ 0x8afb2d, /* -0.9142097235 */
        !           490:        /* S_B0 */ 0x89be51, /* -0.9238795042 */
        !           491:        /* S_B1 */ 0x8893b1, /* -0.9329928160 */
        !           492:        /* S_B2 */ 0x877b7c, /* -0.9415440559 */
        !           493:        /* S_B3 */ 0x8675dc, /* -0.9495282173 */
        !           494:        /* S_B4 */ 0x8582fb, /* -0.9569402933 */
        !           495:        /* S_B5 */ 0x84a2fc, /* -0.9637761116 */
        !           496:        /* S_B6 */ 0x83d604, /* -0.9700312614 */
        !           497:        /* S_B7 */ 0x831c31, /* -0.9757021666 */
        !           498:        /* S_B8 */ 0x8275a1, /* -0.9807852507 */
        !           499:        /* S_B9 */ 0x81e26c, /* -0.9852776527 */
        !           500:        /* S_BA */ 0x8162aa, /* -0.9891765118 */
        !           501:        /* S_BB */ 0x80f66e, /* -0.9924795628 */
        !           502:        /* S_BC */ 0x809dc9, /* -0.9951847792 */
        !           503:        /* S_BD */ 0x8058c9, /* -0.9972904921 */
        !           504:        /* S_BE */ 0x802778, /* -0.9987955093 */
        !           505:        /* S_BF */ 0x8009de, /* -0.9996988773 */
        !           506:        /* S_C0 */ 0x800000, /* -1.0000000000 */
        !           507:        /* S_C1 */ 0x8009de, /* -0.9996988773 */
        !           508:        /* S_C2 */ 0x802778, /* -0.9987955093 */
        !           509:        /* S_C3 */ 0x8058c9, /* -0.9972904921 */
        !           510:        /* S_C4 */ 0x809dc9, /* -0.9951847792 */
        !           511:        /* S_C5 */ 0x80f66e, /* -0.9924795628 */
        !           512:        /* S_C6 */ 0x8162aa, /* -0.9891765118 */
        !           513:        /* S_C7 */ 0x81e26c, /* -0.9852776527 */
        !           514:        /* S_C8 */ 0x8275a1, /* -0.9807852507 */
        !           515:        /* S_C9 */ 0x831c31, /* -0.9757021666 */
        !           516:        /* S_CA */ 0x83d604, /* -0.9700312614 */
        !           517:        /* S_CB */ 0x84a2fc, /* -0.9637761116 */
        !           518:        /* S_CC */ 0x8582fb, /* -0.9569402933 */
        !           519:        /* S_CD */ 0x8675dc, /* -0.9495282173 */
        !           520:        /* S_CE */ 0x877b7c, /* -0.9415440559 */
        !           521:        /* S_CF */ 0x8893b1, /* -0.9329928160 */
        !           522:        /* S_D0 */ 0x89be51, /* -0.9238795042 */
        !           523:        /* S_D1 */ 0x8afb2d, /* -0.9142097235 */
        !           524:        /* S_D2 */ 0x8c4a14, /* -0.9039893150 */
        !           525:        /* S_D3 */ 0x8daad3, /* -0.8932243586 */
        !           526:        /* S_D4 */ 0x8f1d34, /* -0.8819212914 */
        !           527:        /* S_D5 */ 0x90a0fd, /* -0.8700870275 */
        !           528:        /* S_D6 */ 0x9235f3, /* -0.8577286005 */
        !           529:        /* S_D7 */ 0x93dbd7, /* -0.8448535204 */
        !           530:        /* S_D8 */ 0x959267, /* -0.8314696550 */
        !           531:        /* S_D9 */ 0x975961, /* -0.8175848722 */
        !           532:        /* S_DA */ 0x99307f, /* -0.8032075167 */
        !           533:        /* S_DB */ 0x9b1777, /* -0.7883464098 */
        !           534:        /* S_DC */ 0x9d0dfe, /* -0.7730104923 */
        !           535:        /* S_DD */ 0x9f13c8, /* -0.7572088242 */
        !           536:        /* S_DE */ 0xa12883, /* -0.7409511805 */
        !           537:        /* S_DF */ 0xa34bdf, /* -0.7242470980 */
        !           538:        /* S_E0 */ 0xa57d86, /* -0.7071068287 */
        !           539:        /* S_E1 */ 0xa7bd23, /* -0.6895405054 */
        !           540:        /* S_E2 */ 0xaa0a5b, /* -0.6715589762 */
        !           541:        /* S_E3 */ 0xac64d5, /* -0.6531728506 */
        !           542:        /* S_E4 */ 0xaecc33, /* -0.6343933344 */
        !           543:        /* S_E5 */ 0xb14017, /* -0.6152316332 */
        !           544:        /* S_E6 */ 0xb3c020, /* -0.5956993103 */
        !           545:        /* S_E7 */ 0xb64beb, /* -0.5758081675 */
        !           546:        /* S_E8 */ 0xb8e313, /* -0.5555702448 */
        !           547:        /* S_E9 */ 0xbb8533, /* -0.5349975824 */
        !           548:        /* S_EA */ 0xbe31e2, /* -0.5141026974 */
        !           549:        /* S_EB */ 0xc0e8b6, /* -0.4928982258 */
        !           550:        /* S_EC */ 0xc3a946, /* -0.4713966846 */
        !           551:        /* S_ED */ 0xc67323, /* -0.4496113062 */
        !           552:        /* S_EE */ 0xc945e0, /* -0.4275550842 */
        !           553:        /* S_EF */ 0xcc210d, /* -0.4052413702 */
        !           554:        /* S_F0 */ 0xcf043b, /* -0.3826833963 */
        !           555:        /* S_F1 */ 0xd1eef6, /* -0.3598949909 */
        !           556:        /* S_F2 */ 0xd4e0cb, /* -0.3368898630 */
        !           557:        /* S_F3 */ 0xd7d947, /* -0.3136817217 */
        !           558:        /* S_F4 */ 0xdad7f4, /* -0.2902846336 */
        !           559:        /* S_F5 */ 0xdddc5b, /* -0.2667127848 */
        !           560:        /* S_F6 */ 0xe0e607, /* -0.2429801226 */
        !           561:        /* S_F7 */ 0xe3f47e, /* -0.2191011906 */
        !           562:        /* S_F8 */ 0xe70748, /* -0.1950902939 */
        !           563:        /* S_F9 */ 0xea1dec, /* -0.1709618568 */
        !           564:        /* S_FA */ 0xed37f0, /* -0.1467304230 */
        !           565:        /* S_FB */ 0xf054d9, /* -0.1224106550 */
        !           566:        /* S_FC */ 0xf3742d, /* -0.0980170965 */
        !           567:        /* S_FD */ 0xf69570, /* -0.0735645294 */
        !           568:        /* S_FE */ 0xf9b827, /* -0.0490676165 */
        !           569:        /* S_FF */ 0xfcdbd5  /* -0.0245412588 */
        !           570: };
        !           571: 
        !           572: 
1.1       root      573: /* Init DSP emulation */
1.1.1.8   root      574: void dsp_core_init(void (*host_interrupt)(int))
1.1       root      575: {
1.1.1.4   root      576:        LOG_TRACE(TRACE_DSP_STATE, "Dsp: core init\n");
1.1       root      577: 
1.1.1.3   root      578:        dsp_host_interrupt = host_interrupt;
1.1.1.4   root      579:        memset(&dsp_core, 0, sizeof(dsp_core_t));
1.1.1.10! root      580:        memcpy(&dsp_core.rom[DSP_SPACE_X][0x100], x_rom, sizeof(x_rom));
        !           581:        memcpy(&dsp_core.rom[DSP_SPACE_Y][0x100], y_rom, sizeof(y_rom));
1.1       root      582: }
                    583: 
                    584: /* Shutdown DSP emulation */
1.1.1.4   root      585: void dsp_core_shutdown(void)
1.1       root      586: {
1.1.1.4   root      587:        dsp_core.running = 0;
                    588:        LOG_TRACE(TRACE_DSP_STATE, "Dsp: core shutdown\n");
1.1       root      589: }
                    590: 
                    591: /* Reset */
1.1.1.4   root      592: void dsp_core_reset(void)
1.1       root      593: {
                    594:        int i;
                    595: 
1.1.1.4   root      596:        LOG_TRACE(TRACE_DSP_STATE, "Dsp: core reset\n");
                    597:        dsp_core_shutdown();
1.1       root      598: 
                    599:        /* Memory */
1.1.1.4   root      600:        memset((void*)dsp_core.periph, 0, sizeof(dsp_core.periph));
                    601:        memset(dsp_core.stack, 0, sizeof(dsp_core.stack));
                    602:        memset(dsp_core.registers, 0, sizeof(dsp_core.registers));
                    603:        dsp_core.dsp_host_rtx = 0;
                    604:        dsp_core.dsp_host_htx = 0;
1.1       root      605: 
1.1.1.4   root      606:        dsp_core.bootstrap_pos = 0;
1.1.1.8   root      607: 
1.1       root      608:        /* Registers */
1.1.1.4   root      609:        dsp_core.pc = 0x0000;
                    610:        dsp_core.registers[DSP_REG_OMR]=0x02;
1.1       root      611:        for (i=0;i<8;i++) {
1.1.1.4   root      612:                dsp_core.registers[DSP_REG_M0+i]=0x00ffff;
1.1       root      613:        }
                    614: 
1.1.1.2   root      615:        /* Interruptions */
1.1.1.4   root      616:        memset((void*)dsp_core.interrupt_isPending, 0, sizeof(dsp_core.interrupt_isPending));
                    617:        dsp_core.interrupt_state = DSP_INTERRUPT_NONE;
                    618:        dsp_core.interrupt_instr_fetch = -1;
                    619:        dsp_core.interrupt_save_pc = -1;
                    620:        dsp_core.interrupt_counter = 0;
                    621:        dsp_core.interrupt_pipeline_count = 0;
1.1.1.3   root      622:        for (i=0;i<5;i++) {
1.1.1.4   root      623:                dsp_core.interrupt_ipl[i] = 3;
1.1.1.3   root      624:        }
                    625:        for (i=5;i<12;i++) {
1.1.1.4   root      626:                dsp_core.interrupt_ipl[i] = -1;
1.1.1.3   root      627:        }
1.1.1.2   root      628: 
1.1       root      629:        /* host port init, dsp side */
1.1.1.4   root      630:        dsp_core.periph[DSP_SPACE_X][DSP_HOST_HSR]=(1<<DSP_HOST_HSR_HTDE);
1.1       root      631: 
                    632:        /* host port init, cpu side */
1.1.1.5   root      633:        dsp_core.hostport[CPU_HOST_ICR] = 0x0;
                    634:        dsp_core.hostport[CPU_HOST_CVR] = 0x12;
                    635:        dsp_core.hostport[CPU_HOST_ISR] = (1<<CPU_HOST_ISR_TRDY)|(1<<CPU_HOST_ISR_TXDE);
                    636:        dsp_core.hostport[CPU_HOST_IVR] = 0x0f;
                    637:        dsp_core.hostport[CPU_HOST_RX0] = 0x0;
1.1       root      638: 
1.1.1.2   root      639:        /* SSI registers */
1.1.1.4   root      640:        dsp_core.periph[DSP_SPACE_X][DSP_SSI_SR]=1<<DSP_SSI_SR_TDE;
                    641:        dsp_core.ssi.waitFrameTX = 1;
                    642:        dsp_core.ssi.waitFrameRX = 1;
                    643:        dsp_core.ssi.TX = 0;
                    644:        dsp_core.ssi.RX = 0;
                    645:        dsp_core.ssi.dspPlay_handshakeMode_frame = 0;
1.1.1.5   root      646:        dsp_core_ssi_configure(DSP_SSI_CRA, 0);
                    647:        dsp_core_ssi_configure(DSP_SSI_CRB, 0);
                    648: 
1.1       root      649:        /* Other hardware registers */
1.1.1.4   root      650:        dsp_core.periph[DSP_SPACE_X][DSP_IPR]=0;
                    651:        dsp_core.periph[DSP_SPACE_X][DSP_BCR]=0xffff;
1.1       root      652: 
                    653:        /* Misc */
1.1.1.4   root      654:        dsp_core.loop_rep = 0;
1.1       root      655: 
1.1.1.4   root      656:        LOG_TRACE(TRACE_DSP_STATE, "Dsp: reset done\n");
                    657:        dsp56k_init_cpu();
1.1.1.2   root      658: }
                    659: 
1.1.1.8   root      660: /*
1.1.1.2   root      661:        SSI INTERFACE processing
                    662: */
                    663: 
1.1.1.3   root      664: /* Set PortC data register : send a frame order to the DMA in handshake mode */
1.1.1.4   root      665: void dsp_core_setPortCDataRegister(Uint32 value)
1.1.1.2   root      666: {
1.1.1.3   root      667:        /* if DSP Record is in handshake mode with DMA Play */
1.1.1.4   root      668:        if ((dsp_core.periph[DSP_SPACE_X][DSP_PCDDR] & 0x10) == 0x10) {
1.1.1.3   root      669:                if ((value & 0x10) == 0x10) {
1.1.1.4   root      670:                        dsp_core.ssi.waitFrameRX = 0;
1.1.1.3   root      671:                        DSP_SsiTransmit_SC1();
1.1.1.4   root      672:                        LOG_TRACE(TRACE_DSP_HOST_SSI, "Dsp record in handshake mode: SSI send SC1 to crossbar\n");
1.1.1.3   root      673:                }
                    674:        }
                    675: 
                    676:        /* if DSP Play is in handshake mode with DMA Record, high or low frame sync */
                    677:        /* to allow / disable transfer of the data */
1.1.1.4   root      678:        if ((dsp_core.periph[DSP_SPACE_X][DSP_PCDDR] & 0x20) == 0x20) {
1.1.1.3   root      679:                if ((value & 0x20) == 0x20) {
1.1.1.4   root      680:                        dsp_core.ssi.dspPlay_handshakeMode_frame = 1;
                    681:                        dsp_core.ssi.waitFrameTX = 0;
                    682:                        LOG_TRACE(TRACE_DSP_HOST_SSI, "Dsp play in handshake mode: frame = 1\n");
1.1.1.3   root      683:                }
                    684:                else {
1.1.1.4   root      685:                        dsp_core.ssi.dspPlay_handshakeMode_frame = 0;
1.1.1.3   root      686:                        DSP_SsiTransmit_SC2(0);
1.1.1.4   root      687:                        LOG_TRACE(TRACE_DSP_HOST_SSI, "Dsp play in handshake mode: SSI send SC2 to crossbar, frame sync = 0\n");
1.1.1.3   root      688:                }
                    689:        }
1.1.1.2   root      690: }
                    691: 
                    692: /* SSI set TX register */
1.1.1.4   root      693: void dsp_core_ssi_writeTX(Uint32 value)
1.1.1.2   root      694: {
                    695:        /* Clear SSI TDE bit */
1.1.1.4   root      696:        dsp_core.periph[DSP_SPACE_X][DSP_SSI_SR] &= 0xff-(1<<DSP_SSI_SR_TDE);
                    697:        dsp_core.ssi.TX = value;
                    698:        LOG_TRACE(TRACE_DSP_HOST_SSI, "Dsp set TX register: 0x%06x\n", value);
1.1.1.3   root      699: 
                    700:        /* if DSP Play is in handshake mode with DMA Record, send frame sync */
                    701:        /* to allow transfer of the data */
1.1.1.4   root      702:        if (dsp_core.ssi.dspPlay_handshakeMode_frame) {
1.1.1.3   root      703:                DSP_SsiTransmit_SC2(1);
1.1.1.4   root      704:                LOG_TRACE(TRACE_DSP_HOST_SSI, "Dsp play in handshake mode: SSI send SC2 to crossbar, frame sync = 1\n");
1.1.1.3   root      705:        }
1.1.1.2   root      706: }
                    707: 
                    708: /* SSI set TDE register (dummy write) */
1.1.1.4   root      709: void dsp_core_ssi_writeTSR(void)
1.1.1.2   root      710: {
                    711:        /* Dummy write : Just clear SSI TDE bit */
1.1.1.4   root      712:        dsp_core.periph[DSP_SPACE_X][DSP_SSI_SR] &= 0xff-(1<<DSP_SSI_SR_TDE);
1.1.1.2   root      713: }
                    714: 
                    715: /* SSI get RX register */
1.1.1.4   root      716: Uint32 dsp_core_ssi_readRX(void)
1.1.1.2   root      717: {
1.1.1.3   root      718:        /* Clear SSI RDF bit */
1.1.1.4   root      719:        dsp_core.periph[DSP_SPACE_X][DSP_SSI_SR] &= 0xff-(1<<DSP_SSI_SR_RDF);
                    720:        LOG_TRACE(TRACE_DSP_HOST_SSI, "Dsp read RX register: 0x%06x\n", dsp_core.ssi.RX);
                    721:        return dsp_core.ssi.RX;
1.1.1.2   root      722: }
                    723: 
1.1       root      724: 
1.1.1.3   root      725: /**
                    726:  * SSI receive serial clock.
                    727:  *
                    728:  */
1.1.1.4   root      729: void dsp_core_ssi_Receive_SC0(void)
1.1.1.3   root      730: {
                    731:        Uint32 value, i, temp=0;
1.1.1.2   root      732: 
                    733:        /* Receive data from crossbar to SSI */
1.1.1.4   root      734:        value = dsp_core.ssi.received_value;
1.1.1.2   root      735: 
                    736:        /* adjust value to receive size word */
1.1.1.4   root      737:        value <<= (24 - dsp_core.ssi.cra_word_length);
1.1.1.2   root      738:        value &= 0xffffff;
                    739: 
                    740:        /* if bit SHFD in CRB is set, swap received data */
1.1.1.4   root      741:        if (dsp_core.ssi.crb_shifter) {
1.1.1.2   root      742:                temp=0;
1.1.1.4   root      743:                for (i=0; i<dsp_core.ssi.cra_word_length; i++) {
1.1.1.2   root      744:                        temp += value & 1;
                    745:                        temp <<= 1;
                    746:                        value >>= 1;
                    747:                }
                    748:                value = temp;
                    749:        }
                    750: 
1.1.1.4   root      751:        LOG_TRACE(TRACE_DSP_HOST_SSI, "Dsp SSI received value from crossbar: 0x%06x\n", value);
                    752: 
                    753:        if (dsp_core.ssi.crb_re && dsp_core.ssi.waitFrameRX == 0) {
1.1.1.3   root      754:                /* Send value to DSP receive */
1.1.1.4   root      755:                dsp_core.ssi.RX = value;
1.1.1.3   root      756: 
                    757:                /* generate interrupt ? */
1.1.1.4   root      758:                if (dsp_core.periph[DSP_SPACE_X][DSP_SSI_CRB] & (1<<DSP_SSI_CRB_RIE)) {
                    759:                        if (dsp_core.periph[DSP_SPACE_X][DSP_SSI_SR] & (1<<DSP_SSI_SR_RDF)) {
1.1.1.3   root      760:                                dsp_add_interrupt(DSP_INTER_SSI_RCV_DATA);
                    761:                        } else {
                    762:                                dsp_add_interrupt(DSP_INTER_SSI_RCV_DATA);
                    763:                        }
1.1.1.2   root      764:                }
1.1.1.3   root      765:        }else{
1.1.1.4   root      766:                dsp_core.ssi.RX = 0;
1.1       root      767:        }
1.1.1.3   root      768: 
                    769:        /* set RDF */
1.1.1.4   root      770:        dsp_core.periph[DSP_SPACE_X][DSP_SSI_SR] |= 1<<DSP_SSI_SR_RDF;
1.1       root      771: }
                    772: 
1.1.1.3   root      773: /**
                    774:  * SSI receive SC1 bit : frame sync for receiver
                    775:  *     value = 1 : beginning of a new frame
                    776:  *     value = 0 : not beginning of a new frame
                    777:  */
1.1.1.4   root      778: void dsp_core_ssi_Receive_SC1(Uint32 value)
1.1.1.2   root      779: {
1.1.1.3   root      780:        /* SSI runs in network mode ? */
1.1.1.4   root      781:        if (dsp_core.ssi.crb_mode) {
1.1.1.3   root      782:                if (value) {
                    783:                        /* Beginning of a new frame */
1.1.1.4   root      784:                        dsp_core.periph[DSP_SPACE_X][DSP_SSI_SR] |= (1<<DSP_SSI_SR_RFS);
                    785:                        dsp_core.ssi.waitFrameRX = 0;
1.1.1.3   root      786:                }else{
1.1.1.4   root      787:                        dsp_core.periph[DSP_SPACE_X][DSP_SSI_SR] &= 0xff-(1<<DSP_SSI_SR_RFS);
1.1.1.3   root      788:                }
                    789:        }else{
                    790:                /* SSI runs in normal mode */
1.1.1.4   root      791:                dsp_core.periph[DSP_SPACE_X][DSP_SSI_SR] |= (1<<DSP_SSI_SR_RFS);
1.1.1.3   root      792:        }
1.1.1.4   root      793: 
                    794:        LOG_TRACE(TRACE_DSP_HOST_SSI, "Dsp SSI receive frame sync: 0x%01x\n", value);
1.1.1.2   root      795: }
1.1       root      796: 
1.1.1.3   root      797: /**
                    798:  * SSI receive SC2 bit : frame sync for transmitter
                    799:  *     value = 1 : beginning of a new frame
                    800:  *     value = 0 : not beginning of a new frame
                    801:  */
1.1.1.4   root      802: void dsp_core_ssi_Receive_SC2(Uint32 value)
1.1       root      803: {
1.1.1.2   root      804:        /* SSI runs in network mode ? */
1.1.1.4   root      805:        if (dsp_core.ssi.crb_mode) {
1.1.1.3   root      806:                if (value) {
                    807:                        /* Beginning of a new frame */
1.1.1.4   root      808:                        dsp_core.periph[DSP_SPACE_X][DSP_SSI_SR] |= (1<<DSP_SSI_SR_TFS);
                    809:                        dsp_core.ssi.waitFrameTX = 0;
1.1.1.2   root      810:                }else{
1.1.1.4   root      811:                        dsp_core.periph[DSP_SPACE_X][DSP_SSI_SR] &= 0xff-(1<<DSP_SSI_SR_TFS);
1.1.1.2   root      812:                }
                    813:        }else{
                    814:                /* SSI runs in normal mode */
1.1.1.4   root      815:                dsp_core.periph[DSP_SPACE_X][DSP_SSI_SR] |= (1<<DSP_SSI_SR_TFS);
1.1       root      816:        }
1.1.1.4   root      817: 
                    818:        LOG_TRACE(TRACE_DSP_HOST_SSI, "Dsp SSI transmit frame sync: 0x%01x\n", value);
1.1       root      819: }
1.1.1.2   root      820: 
1.1.1.3   root      821: /**
                    822:  * SSI transmit serial clock.
                    823:  *
                    824:  */
1.1.1.4   root      825: void dsp_core_ssi_Receive_SCK(void)
1.1.1.3   root      826: {
                    827:        Uint32 value, i, temp=0;
                    828: 
1.1.1.4   root      829:        value = dsp_core.ssi.TX;
1.1.1.3   root      830: 
                    831:        /* Transfer data from SSI to crossbar*/
                    832: 
                    833:        /* adjust value to transnmit size word */
1.1.1.4   root      834:        value >>= (24 - dsp_core.ssi.cra_word_length);
                    835:        value &= dsp_core.ssi.cra_word_mask;
1.1.1.3   root      836: 
                    837:        /* if bit SHFD in CRB is set, swap data to transmit */
1.1.1.4   root      838:        if (dsp_core.ssi.crb_shifter) {
                    839:                for (i=0; i<dsp_core.ssi.cra_word_length; i++) {
1.1.1.3   root      840:                        temp += value & 1;
                    841:                        temp <<= 1;
                    842:                        value >>= 1;
                    843:                }
                    844:                value = temp;
                    845:        }
                    846: 
1.1.1.4   root      847:        LOG_TRACE(TRACE_DSP_HOST_SSI, "Dsp SSI transmit value to crossbar: 0x%06x\n", value);
                    848: 
1.1.1.3   root      849:        /* Transmit the data */
1.1.1.4   root      850:        if (dsp_core.ssi.crb_te && dsp_core.ssi.waitFrameTX == 0) {
1.1.1.3   root      851:                /* Send value to crossbar */
1.1.1.4   root      852:                dsp_core.ssi.transmit_value = value;
1.1.1.3   root      853: 
                    854:                /* generate interrupt ? */
1.1.1.4   root      855:                if (dsp_core.periph[DSP_SPACE_X][DSP_SSI_CRB] & (1<<DSP_SSI_CRB_TIE)) {
                    856:                        if (dsp_core.periph[DSP_SPACE_X][DSP_SSI_SR] & (1<<DSP_SSI_SR_TDE)) {
1.1.1.3   root      857:                                dsp_add_interrupt(DSP_INTER_SSI_TRX_DATA);
                    858:                        } else {
                    859:                                dsp_add_interrupt(DSP_INTER_SSI_TRX_DATA);
                    860:                        }
                    861:                }
                    862:        }else{
1.1.1.4   root      863:                dsp_core.ssi.transmit_value = 0;
1.1.1.3   root      864:        }
                    865: 
                    866:        /* set TDE */
1.1.1.4   root      867:        dsp_core.periph[DSP_SPACE_X][DSP_SSI_SR] |= (1<<DSP_SSI_SR_TDE);
1.1.1.3   root      868: }
                    869: 
                    870: 
                    871: /* SSI initialisations and state management */
1.1.1.6   root      872: void dsp_core_ssi_configure(Uint32 address, Uint32 value)
1.1.1.2   root      873: {
1.1.1.3   root      874:        Uint32 crb_te, crb_re;
1.1.1.2   root      875: 
1.1.1.6   root      876:        switch (address) {
1.1.1.2   root      877:                case DSP_SSI_CRA:
1.1.1.4   root      878:                        dsp_core.periph[DSP_SPACE_X][DSP_SSI_CRA] = value;
1.1.1.2   root      879:                        /* get word size for transfers */
                    880:                        switch ((value>>DSP_SSI_CRA_WL0) & 3) {
                    881:                                case 0:
1.1.1.4   root      882:                                        dsp_core.ssi.cra_word_length = 8;
                    883:                                        dsp_core.ssi.cra_word_mask = 0xff;
1.1.1.2   root      884:                                        break;
                    885:                                case 1:
1.1.1.4   root      886:                                        dsp_core.ssi.cra_word_length = 12;
                    887:                                        dsp_core.ssi.cra_word_mask = 0xfff;
1.1.1.2   root      888:                                        break;
                    889:                                case 2:
1.1.1.4   root      890:                                        dsp_core.ssi.cra_word_length = 16;
                    891:                                        dsp_core.ssi.cra_word_mask = 0xffff;
1.1.1.2   root      892:                                        break;
                    893:                                case 3:
1.1.1.4   root      894:                                        dsp_core.ssi.cra_word_length = 24;
                    895:                                        dsp_core.ssi.cra_word_mask = 0xffffff;
1.1.1.2   root      896:                                        break;
                    897:                        }
                    898: 
1.1.1.4   root      899:                        LOG_TRACE(TRACE_DSP_HOST_SSI, "Dsp SSI CRA write: 0x%06x\n", value);
                    900: 
1.1.1.2   root      901:                        /* Get the Frame rate divider ( 2 < value <32) */
1.1.1.4   root      902:                        dsp_core.ssi.cra_frame_rate_divider = ((value >> DSP_SSI_CRA_DC0) & 0x1f)+1;
1.1.1.2   root      903:                        break;
                    904:                case DSP_SSI_CRB:
1.1.1.4   root      905:                        crb_te = dsp_core.periph[DSP_SPACE_X][DSP_SSI_CRB] & (1<<DSP_SSI_CRB_TE);
                    906:                        crb_re = dsp_core.periph[DSP_SPACE_X][DSP_SSI_CRB] & (1<<DSP_SSI_CRB_RE);
                    907:                        dsp_core.periph[DSP_SPACE_X][DSP_SSI_CRB] = value;
1.1.1.8   root      908: 
1.1.1.4   root      909:                        dsp_core.ssi.crb_src_clock = (value>>DSP_SSI_CRB_SCKD) & 1;
                    910:                        dsp_core.ssi.crb_shifter   = (value>>DSP_SSI_CRB_SHFD) & 1;
                    911:                        dsp_core.ssi.crb_synchro   = (value>>DSP_SSI_CRB_SYN) & 1;
                    912:                        dsp_core.ssi.crb_mode      = (value>>DSP_SSI_CRB_MOD) & 1;
                    913:                        dsp_core.ssi.crb_te        = (value>>DSP_SSI_CRB_TE) & 1;
                    914:                        dsp_core.ssi.crb_re        = (value>>DSP_SSI_CRB_RE) & 1;
                    915:                        dsp_core.ssi.crb_tie       = (value>>DSP_SSI_CRB_TIE) & 1;
                    916:                        dsp_core.ssi.crb_rie       = (value>>DSP_SSI_CRB_RIE) & 1;
1.1.1.2   root      917: 
1.1.1.4   root      918:                        if (crb_te == 0 && dsp_core.ssi.crb_te) {
                    919:                                dsp_core.ssi.waitFrameTX = 1;
1.1.1.3   root      920:                        }
1.1.1.4   root      921:                        if (crb_re == 0 && dsp_core.ssi.crb_re) {
                    922:                                dsp_core.ssi.waitFrameRX = 1;
1.1.1.2   root      923:                        }
1.1.1.4   root      924: 
                    925:                        LOG_TRACE(TRACE_DSP_HOST_SSI, "Dsp SSI CRB write: 0x%06x\n", value);
                    926: 
1.1.1.2   root      927:                        break;
                    928:        }
                    929: }
                    930: 
1.1.1.3   root      931: 
1.1.1.8   root      932: /*
1.1.1.2   root      933:        HOST INTERFACE processing
                    934: */
                    935: 
1.1.1.4   root      936: static void dsp_core_hostport_update_trdy(void)
1.1       root      937: {
                    938:        int trdy;
                    939: 
                    940:        /* Clear/set TRDY bit */
1.1.1.4   root      941:        dsp_core.hostport[CPU_HOST_ISR] &= 0xff-(1<<CPU_HOST_ISR_TRDY);
                    942:        trdy = (dsp_core.hostport[CPU_HOST_ISR]>>CPU_HOST_ISR_TXDE)
                    943:                & ~(dsp_core.periph[DSP_SPACE_X][DSP_HOST_HSR]>>DSP_HOST_HSR_HRDF);
                    944:        dsp_core.hostport[CPU_HOST_ISR] |= (trdy & 1)<< CPU_HOST_ISR_TRDY;
1.1       root      945: }
                    946: 
1.1.1.4   root      947: static void dsp_core_hostport_update_hreq(void)
1.1.1.2   root      948: {
                    949:        int hreq;
                    950: 
1.1.1.8   root      951: #if 0
1.1.1.4   root      952:        hreq = (dsp_core.hostport[CPU_HOST_ICR] & dsp_core.hostport[CPU_HOST_ISR]) & 0x3;
1.1.1.3   root      953: 
                    954:        /* Trigger host interrupt? */
1.1.1.4   root      955:        if (hreq && (dsp_core.hostport[CPU_HOST_ISR] & (1<<CPU_HOST_ISR_HREQ)) == 0) {
1.1.1.3   root      956:                dsp_host_interrupt();
                    957:        }
                    958: 
                    959:        /* Set HREQ bit in hostport */
1.1.1.4   root      960:        dsp_core.hostport[CPU_HOST_ISR] &= 0x7f;
                    961:        dsp_core.hostport[CPU_HOST_ISR] |= (hreq?1:0) << CPU_HOST_ISR_HREQ;
1.1.1.8   root      962: #else
                    963:        hreq = (dsp_core.hostport[CPU_HOST_ICR] & dsp_core.hostport[CPU_HOST_ISR]) & 0x3;
                    964: 
                    965:     if ( hreq != 0 )
                    966:                hreq = 1 << CPU_HOST_ISR_HREQ;
                    967: 
                    968:        /* If hreq doesn't change, we do nothing */
                    969:     if ( hreq == ( dsp_core.hostport[CPU_HOST_ISR] & 0x80 ) )
                    970:                return;
                    971: 
                    972:        if ( hreq )                                                             /* 0->1 transition */
                    973:                dsp_host_interrupt ( 1 );                       /* set host interrupt */
                    974:        else                                                                    /* 1->0 transition */
                    975:                dsp_host_interrupt ( 0 );                       /* unset host interrupt */
                    976: 
                    977:        /* Set/clear HREQ bit in hostport */
                    978:        dsp_core.hostport[CPU_HOST_ISR] &= 0x7f;
                    979:        dsp_core.hostport[CPU_HOST_ISR] |= hreq;
                    980: //fprintf ( stderr , "dsp_core_hostport_update_hreq %x\n" , hreq );
                    981: #endif
                    982: }
1.1.1.2   root      983: 
1.1       root      984: /* Host port transfer ? (dsp->host) */
1.1.1.4   root      985: static void dsp_core_dsp2host(void)
1.1       root      986: {
1.1.1.2   root      987:        /* RXDF = 1 ==> host hasn't read the last value yet */
1.1.1.4   root      988:        if (dsp_core.hostport[CPU_HOST_ISR] & (1<<CPU_HOST_ISR_RXDF)) {
1.1       root      989:                return;
                    990:        }
1.1.1.2   root      991: 
                    992:        /* HTDE = 1 ==> nothing to tranfert from DSP port */
1.1.1.4   root      993:        if (dsp_core.periph[DSP_SPACE_X][DSP_HOST_HSR] & (1<<DSP_HOST_HSR_HTDE)) {
1.1       root      994:                return;
                    995:        }
                    996: 
1.1.1.4   root      997:        dsp_core.hostport[CPU_HOST_RXL] = dsp_core.dsp_host_htx;
                    998:        dsp_core.hostport[CPU_HOST_RXM] = dsp_core.dsp_host_htx>>8;
                    999:        dsp_core.hostport[CPU_HOST_RXH] = dsp_core.dsp_host_htx>>16;
1.1       root     1000: 
                   1001:        /* Set HTDE bit to say that DSP can write */
1.1.1.4   root     1002:        dsp_core.periph[DSP_SPACE_X][DSP_HOST_HSR] |= 1<<DSP_HOST_HSR_HTDE;
1.1.1.2   root     1003: 
                   1004:        /* Is there an interrupt to send ? */
1.1.1.4   root     1005:        if (dsp_core.periph[DSP_SPACE_X][DSP_HOST_HCR] & (1<<DSP_HOST_HCR_HTIE)) {
1.1.1.3   root     1006:                dsp_add_interrupt(DSP_INTER_HOST_TRX_DATA);
1.1.1.2   root     1007:        }
1.1       root     1008: 
                   1009:        /* Set RXDF bit to say that host can read */
1.1.1.4   root     1010:        dsp_core.hostport[CPU_HOST_ISR] |= 1<<CPU_HOST_ISR_RXDF;
                   1011:        dsp_core_hostport_update_hreq();
1.1.1.2   root     1012: 
1.1.1.4   root     1013:        LOG_TRACE(TRACE_DSP_HOST_INTERFACE, "Dsp: (DSP->Host): Transfer 0x%06x, Dsp HTDE=1, Host RXDF=1\n", dsp_core.dsp_host_htx);
1.1       root     1014: }
                   1015: 
                   1016: /* Host port transfer ? (host->dsp) */
1.1.1.4   root     1017: static void dsp_core_host2dsp(void)
1.1       root     1018: {
1.1.1.2   root     1019:        /* TXDE = 1 ==> nothing to tranfert from host port */
1.1.1.4   root     1020:        if (dsp_core.hostport[CPU_HOST_ISR] & (1<<CPU_HOST_ISR_TXDE)) {
1.1       root     1021:                return;
                   1022:        }
1.1.1.8   root     1023: 
1.1.1.2   root     1024:        /* HRDF = 1 ==> DSP hasn't read the last value yet */
1.1.1.4   root     1025:        if (dsp_core.periph[DSP_SPACE_X][DSP_HOST_HSR] & (1<<DSP_HOST_HSR_HRDF)) {
1.1       root     1026:                return;
                   1027:        }
                   1028: 
1.1.1.4   root     1029:        dsp_core.dsp_host_rtx = dsp_core.hostport[CPU_HOST_TXL];
                   1030:        dsp_core.dsp_host_rtx |= dsp_core.hostport[CPU_HOST_TXM]<<8;
                   1031:        dsp_core.dsp_host_rtx |= dsp_core.hostport[CPU_HOST_TXH]<<16;
1.1       root     1032: 
                   1033:        /* Set HRDF bit to say that DSP can read */
1.1.1.4   root     1034:        dsp_core.periph[DSP_SPACE_X][DSP_HOST_HSR] |= 1<<DSP_HOST_HSR_HRDF;
1.1.1.2   root     1035: 
                   1036:        /* Is there an interrupt to send ? */
1.1.1.4   root     1037:        if (dsp_core.periph[DSP_SPACE_X][DSP_HOST_HCR] & (1<<DSP_HOST_HCR_HRIE)) {
1.1.1.3   root     1038:                dsp_add_interrupt(DSP_INTER_HOST_RCV_DATA);
1.1.1.2   root     1039:        }
1.1       root     1040: 
                   1041:        /* Set TXDE bit to say that host can write */
1.1.1.4   root     1042:        dsp_core.hostport[CPU_HOST_ISR] |= 1<<CPU_HOST_ISR_TXDE;
                   1043:        dsp_core_hostport_update_hreq();
1.1.1.2   root     1044: 
1.1.1.4   root     1045:        LOG_TRACE(TRACE_DSP_HOST_INTERFACE, "Dsp: (Host->DSP): Transfer 0x%06x, Dsp HRDF=1, Host TXDE=1\n", dsp_core.dsp_host_rtx);
1.1       root     1046: 
1.1.1.4   root     1047:        dsp_core_hostport_update_trdy();
1.1       root     1048: }
                   1049: 
1.1.1.4   root     1050: void dsp_core_hostport_dspread(void)
1.1       root     1051: {
                   1052:        /* Clear HRDF bit to say that DSP has read */
1.1.1.4   root     1053:        dsp_core.periph[DSP_SPACE_X][DSP_HOST_HSR] &= 0xff-(1<<DSP_HOST_HSR_HRDF);
                   1054: 
                   1055:        LOG_TRACE(TRACE_DSP_HOST_INTERFACE, "Dsp: (Host->DSP): Dsp HRDF cleared\n");
                   1056: 
                   1057:        dsp_core_hostport_update_trdy();
                   1058:        dsp_core_host2dsp();
1.1       root     1059: }
                   1060: 
1.1.1.4   root     1061: void dsp_core_hostport_dspwrite(void)
1.1       root     1062: {
                   1063:        /* Clear HTDE bit to say that DSP has written */
1.1.1.4   root     1064:        dsp_core.periph[DSP_SPACE_X][DSP_HOST_HSR] &= 0xff-(1<<DSP_HOST_HSR_HTDE);
                   1065: 
                   1066:        LOG_TRACE(TRACE_DSP_HOST_INTERFACE, "Dsp: (DSP->Host): Dsp HTDE cleared\n");
1.1.1.3   root     1067: 
1.1.1.4   root     1068:        dsp_core_dsp2host();
1.1       root     1069: }
                   1070: 
                   1071: /* Read/writes on host port */
1.1.1.4   root     1072: Uint8 dsp_core_read_host(int addr)
1.1       root     1073: {
1.1.1.2   root     1074:        Uint8 value;
1.1       root     1075: 
1.1.1.4   root     1076:        value = dsp_core.hostport[addr];
1.1.1.2   root     1077:        if (addr == CPU_HOST_TRXL) {
                   1078:                /* Clear RXDF bit to say that CPU has read */
1.1.1.4   root     1079:                dsp_core.hostport[CPU_HOST_ISR] &= 0xff-(1<<CPU_HOST_ISR_RXDF);
                   1080:                dsp_core_dsp2host();
                   1081:                dsp_core_hostport_update_hreq();
1.1.1.8   root     1082: 
1.1.1.4   root     1083:                LOG_TRACE(TRACE_DSP_HOST_INTERFACE, "Dsp: (DSP->Host): Host RXDF=0\n");
1.1       root     1084:        }
                   1085:        return value;
                   1086: }
                   1087: 
1.1.1.4   root     1088: void dsp_core_write_host(int addr, Uint8 value)
1.1       root     1089: {
                   1090:        switch(addr) {
                   1091:                case CPU_HOST_ICR:
1.1.1.4   root     1092:                        dsp_core.hostport[CPU_HOST_ICR]=value & 0xfb;
1.1       root     1093:                        /* Set HF1 and HF0 accordingly on the host side */
1.1.1.4   root     1094:                        dsp_core.periph[DSP_SPACE_X][DSP_HOST_HSR] &=
1.1       root     1095:                                        0xff-((1<<DSP_HOST_HSR_HF1)|(1<<DSP_HOST_HSR_HF0));
1.1.1.4   root     1096:                        dsp_core.periph[DSP_SPACE_X][DSP_HOST_HSR] |=
                   1097:                                        dsp_core.hostport[CPU_HOST_ICR] & ((1<<DSP_HOST_HSR_HF1)|(1<<DSP_HOST_HSR_HF0));
                   1098:                        dsp_core_hostport_update_hreq();
1.1       root     1099:                        break;
                   1100:                case CPU_HOST_CVR:
1.1.1.4   root     1101:                        dsp_core.hostport[CPU_HOST_CVR]=value & 0x9f;
1.1.1.2   root     1102:                        /* if bit 7=1, host command . HSR(bit HCP) is set*/
1.1       root     1103:                        if (value & (1<<7)) {
1.1.1.4   root     1104:                                dsp_core.periph[DSP_SPACE_X][DSP_HOST_HSR] |= (1<<DSP_HOST_HSR_HCP);
1.1.1.2   root     1105:                                /* Is there an interrupt to send ? */
1.1.1.4   root     1106:                                if (dsp_core.periph[DSP_SPACE_X][DSP_HOST_HCR] & (1<<DSP_HOST_HCR_HCIE)) {
1.1.1.3   root     1107:                                        dsp_add_interrupt(DSP_INTER_HOST_COMMAND);
1.1.1.2   root     1108:                                }
1.1       root     1109:                        }
1.1.1.2   root     1110:                        else{
1.1.1.4   root     1111:                                dsp_core.periph[DSP_SPACE_X][DSP_HOST_HSR] &= 0xff - (1<<DSP_HOST_HSR_HCP);
1.1.1.2   root     1112:                        }
1.1.1.4   root     1113: 
                   1114:                        LOG_TRACE(TRACE_DSP_HOST_COMMAND, "Dsp: (Host->DSP): Host command = %06x\n", value & 0x9f);
                   1115: 
1.1       root     1116:                        break;
                   1117:                case CPU_HOST_ISR:
1.1.1.2   root     1118:                case CPU_HOST_TRX0:
1.1       root     1119:                        /* Read only */
                   1120:                        break;
                   1121:                case CPU_HOST_IVR:
1.1.1.4   root     1122:                        dsp_core.hostport[CPU_HOST_IVR]=value;
1.1       root     1123:                        break;
1.1.1.2   root     1124:                case CPU_HOST_TRXH:
1.1.1.4   root     1125:                        dsp_core.hostport[CPU_HOST_TXH]=value;
1.1.1.2   root     1126:                        break;
                   1127:                case CPU_HOST_TRXM:
1.1.1.4   root     1128:                        dsp_core.hostport[CPU_HOST_TXM]=value;
1.1.1.2   root     1129:                        break;
                   1130:                case CPU_HOST_TRXL:
1.1.1.4   root     1131:                        dsp_core.hostport[CPU_HOST_TXL]=value;
1.1       root     1132: 
1.1.1.4   root     1133:                        if (!dsp_core.running) {
                   1134:                                dsp_core.ramint[DSP_SPACE_P][dsp_core.bootstrap_pos] =
                   1135:                                        (dsp_core.hostport[CPU_HOST_TXH]<<16) |
                   1136:                                        (dsp_core.hostport[CPU_HOST_TXM]<<8) |
                   1137:                                         dsp_core.hostport[CPU_HOST_TXL];
1.1.1.8   root     1138: 
1.1.1.4   root     1139:                                LOG_TRACE(TRACE_DSP_STATE, "Dsp: bootstrap p:0x%04x = 0x%06x\n",
                   1140:                                                                dsp_core.bootstrap_pos,
                   1141:                                                                dsp_core.ramint[DSP_SPACE_P][dsp_core.bootstrap_pos]);
                   1142: 
                   1143:                                if (++dsp_core.bootstrap_pos == 0x200) {
                   1144:                                        LOG_TRACE(TRACE_DSP_STATE, "Dsp: wait bootstrap done\n");
                   1145:                                        dsp_core.running = 1;
1.1.1.2   root     1146:                                }
1.1       root     1147:                        } else {
                   1148: 
1.1.1.2   root     1149:                                /* If TRDY is set, the tranfert is direct to DSP (Burst mode) */
1.1.1.4   root     1150:                                if (dsp_core.hostport[CPU_HOST_ISR] & (1<<CPU_HOST_ISR_TRDY)){
                   1151:                                        dsp_core.dsp_host_rtx = dsp_core.hostport[CPU_HOST_TXL];
                   1152:                                        dsp_core.dsp_host_rtx |= dsp_core.hostport[CPU_HOST_TXM]<<8;
                   1153:                                        dsp_core.dsp_host_rtx |= dsp_core.hostport[CPU_HOST_TXH]<<16;
                   1154: 
                   1155:                                        LOG_TRACE(TRACE_DSP_HOST_INTERFACE, "Dsp: (Host->DSP): Direct Transfer 0x%06x\n", dsp_core.dsp_host_rtx);
1.1.1.2   root     1156: 
                   1157:                                        /* Set HRDF bit to say that DSP can read */
1.1.1.4   root     1158:                                        dsp_core.periph[DSP_SPACE_X][DSP_HOST_HSR] |= 1<<DSP_HOST_HSR_HRDF;
1.1.1.2   root     1159: 
                   1160:                                        /* Is there an interrupt to send ? */
1.1.1.4   root     1161:                                        if (dsp_core.periph[DSP_SPACE_X][DSP_HOST_HCR] & (1<<DSP_HOST_HCR_HRIE)) {
1.1.1.3   root     1162:                                                dsp_add_interrupt(DSP_INTER_HOST_RCV_DATA);
1.1.1.2   root     1163:                                        }
1.1.1.4   root     1164: 
                   1165:                                        LOG_TRACE(TRACE_DSP_HOST_INTERFACE, "Dsp: (Host->DSP): Dsp HRDF set\n");
1.1.1.2   root     1166:                                }
                   1167:                                else{
                   1168:                                        /* Clear TXDE to say that CPU has written */
1.1.1.4   root     1169:                                        dsp_core.hostport[CPU_HOST_ISR] &= 0xff-(1<<CPU_HOST_ISR_TXDE);
                   1170:                                        dsp_core_hostport_update_hreq();
                   1171: 
                   1172:                                        LOG_TRACE(TRACE_DSP_HOST_INTERFACE, "Dsp: (Host->DSP): Host TXDE cleared\n");
1.1.1.2   root     1173:                                }
1.1.1.4   root     1174:                                dsp_core_hostport_update_trdy();
                   1175:                                dsp_core_host2dsp();
1.1       root     1176:                        }
                   1177:                        break;
                   1178:        }
                   1179: }
                   1180: 
                   1181: /*
                   1182: vim:ts=4:sw=4:
                   1183: */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.