Annotation of hatari/src/falcon/dsp.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * dsp.c - Atari DSP56001 emulation code
                      3:  *
                      4:  * Copyright (c) 2001-2004 Petr Stehlik of ARAnyM dev team
                      5:  * Adaption to Hatari (C) 2006 by Thomas Huth
                      6:  * 
                      7:  * This program is free software; you can redistribute it and/or modify
                      8:  * it under the terms of the GNU General Public License as published by
                      9:  * the Free Software Foundation; either version 2 of the License, or
                     10:  * (at your option) any later version.
                     11:  *
                     12:  * This program is distributed in the hope that it will be useful,
                     13:  * but WITHOUT ANY WARRANTY; without even the implied warranty of
                     14:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     15:  * GNU General Public License for more details.
                     16:  *
                     17:  * You should have received a copy of the GNU General Public License
                     18:  * along with ARAnyM; if not, write to the Free Software
                     19:  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
                     20:  */
                     21: 
                     22: #include "main.h"
                     23: #include "sysdeps.h"
                     24: #include "ioMem.h"
                     25: #include "dsp.h"
                     26: #include "dsp_cpu.h"
                     27: 
                     28: #define DSP_EMULATION 1
                     29: #define DEBUG 1
                     30: 
                     31: #if DEBUG
                     32: #define D(x) x
                     33: #else
                     34: #define D(x)
                     35: #endif
                     36: 
                     37: #include <math.h>
                     38: 
                     39: #include <SDL.h>
                     40: #include <SDL_thread.h>
                     41: 
                     42: #ifndef M_PI
                     43: #define M_PI   3.141592653589793238462643383279502
                     44: #endif
                     45: 
                     46: 
                     47: /* DSP state */
                     48: uint8  dsp_state;
                     49: 
                     50: /* Registers */
                     51: uint16 dsp_pc;
                     52: uint32 dsp_registers[64];
                     53: 
                     54: /* stack[0=ssh], stack[1=ssl] */
                     55: uint16 dsp_stack[2][15];
                     56: 
                     57: /* ram[0] is x:, ram[1] is y:, ram[2] is p: */
                     58: uint32 dsp_ram[3][DSP_RAMSIZE];
                     59: 
                     60: /* rom[0] is x:, rom[1] is y: */
                     61: uint32 dsp_rom[2][512];
                     62: 
                     63: /* peripheral space, [x|y]:0xffc0-0xffff */
                     64: uint32 dsp_periph[2][64];
                     65: 
                     66: /* host port, CPU side */
                     67: uint8 dsp_hostport[8];
                     68: 
                     69: /* Misc */
                     70: uint32 dsp_loop_rep;           /* executing rep ? */
                     71: uint32 dsp_last_loop_inst;     /* executing the last instruction in DO ? */
                     72: uint32 dsp_first_host_write;   /* first byte written to host port */
                     73: 
                     74: SDL_sem                *dsp56k_sem;
                     75: 
                     76: 
                     77: /* For bootstrap routine */
                     78: static uint16  bootstrap_pos;
                     79: static uint32  bootstrap_accum;
                     80: 
                     81: static SDL_Thread      *dsp56k_thread;
                     82: 
                     83: 
                     84: 
                     85: #if DSP_EMULATION
                     86: 
                     87: /* More disasm infos, if wanted */
                     88: #define DSP_DISASM_HOSTREAD 0  /* Dsp->Host transfer */
                     89: #define DSP_DISASM_HOSTWRITE 0 /* Host->Dsp transfer */
                     90: #define DSP_DISASM_STATE 0             /* State changes */
                     91: 
                     92: /* Execute DSP instructions till the DSP waits for a read/write */
                     93: #define DSP_HOST_FORCEEXEC 0
                     94: 
                     95: 
                     96: static inline Uint32 getHWoffset(void)
                     97: {
                     98:        return 0xFFA200;
                     99: }
                    100: 
                    101: 
                    102: /* Constructor and  destructor for DSP class */
                    103: void DSP_Init(void)
                    104: {
                    105:        int i;
                    106: 
                    107:        memset(dsp_ram, 0,sizeof(dsp_ram));
                    108: 
                    109:        /* Initialize Y:rom[0x0100-0x01ff] with a sin table */
                    110:        {
                    111:                float src;
                    112:                int32 dest;
                    113: 
                    114:                for (i=0;i<256;i++) {
                    115:                        src = (((float) i)*M_PI)/128.0;
                    116:                        dest = (int32) (sin(src) * 8388608.0); /* 1<<23 */
                    117:                        if (dest>8388607) {
                    118:                                dest = 8388607;
                    119:                        } else if (dest<-8388608) {
                    120:                                dest = -8388608;
                    121:                        }
                    122:                        dsp_rom[DSP_SPACE_Y][0x100+i]=dest & 0x00ffffff;
                    123:                }
                    124:        }
                    125: 
                    126:        /* Initialize X:rom[0x0100-0x017f] with a mu-law table */
                    127:        {
                    128:                const uint16 mulaw_base[8]={
                    129:                        0x7d7c, 0x3e7c, 0x1efc, 0x0f3c, 0x075c, 0x036c, 0x0174, 0x0078
                    130:                };
                    131: 
                    132:                uint32 value, offset, position;
                    133:                int j;
                    134: 
                    135:                position = 0x0100;
                    136:                offset = 0x040000;
                    137:                for(i=0;i<8;i++) {
                    138:                        value = mulaw_base[i]<<8;
                    139: 
                    140:                        for (j=0;j<16;j++) {
                    141:                                dsp_rom[DSP_SPACE_X][position++]=value;
                    142:                                value -= offset;
                    143:                        }
                    144: 
                    145:                        offset >>= 1;
                    146:                }
                    147:        }
                    148: 
                    149:        /* Initialize X:rom[0x0180-0x01ff] with a a-law table */
                    150:        {
                    151:                const int32 multiply_base[8]={
                    152:                        0x1580, 0x0ac0, 0x5600, 0x2b00,
                    153:                        0x1580, 0x0058, 0x0560, 0x02b0
                    154:                };
                    155:                const int32 multiply_col[4]={0x10, 0x01, 0x04, 0x02};
                    156:                const int32 multiply_line[4]={0x40, 0x04, 0x10, 0x08};
                    157:                const int32 base_values[4]={0, -1, 2, 1};
                    158:                uint32 pos=0x0180;
                    159:                
                    160:                for (i=0;i<8;i++) {
                    161:                        int32 alawbase, j;
                    162: 
                    163:                        alawbase = multiply_base[i]<<8;
                    164:                        for (j=0;j<4;j++) {
                    165:                                int32 alawbase1, k;
                    166:                                
                    167:                                alawbase1 = alawbase + ((base_values[j]*multiply_line[i & 3])<<12);
                    168: 
                    169:                                for (k=0;k<4;k++) {
                    170:                                        int32 alawbase2;
                    171: 
                    172:                                        alawbase2 = alawbase1 + ((base_values[k]*multiply_col[i & 3])<<12);
                    173: 
                    174:                                        dsp_rom[DSP_SPACE_X][pos++]=alawbase2;
                    175:                                }
                    176:                        }
                    177:                }
                    178:        }
                    179:        
                    180:        D(bug("Dsp: power-on done"));
                    181: 
                    182:        dsp56k_thread = NULL;
                    183:        dsp56k_sem = NULL;
                    184: 
                    185:        dsp_state = DSP_HALT;
                    186: #if DSP_DISASM_STATE
                    187:        D(bug("Dsp: state = HALT"));
                    188: #endif
                    189: }
                    190: 
                    191: void DSP_UnInit(void)
                    192: {
                    193:        DSP_shutdown();
                    194: }
                    195: 
                    196: /* Other functions to init/shutdown dsp emulation */
                    197: void DSP_Reset(void)
                    198: {
                    199:        int i;
                    200: 
                    201:        /* Kill existing thread and semaphore */
                    202:        DSP_shutdown();
                    203: 
                    204:        /* Pause thread */
                    205:        dsp_state = DSP_BOOTING;
                    206: #if DSP_DISASM_STATE
                    207:        D(bug("Dsp: state = BOOTING"));
                    208: #endif
                    209: 
                    210:        /* Memory */
                    211:        memset(dsp_periph, 0,sizeof(dsp_periph));
                    212:        memset(dsp_stack, 0,sizeof(dsp_stack));
                    213:        memset(dsp_registers, 0,sizeof(dsp_registers));
                    214: 
                    215:        bootstrap_pos = bootstrap_accum = 0;
                    216:        
                    217:        /* Registers */
                    218:        dsp_pc = 0x0000;
                    219:        dsp_registers[DSP_REG_OMR]=0x02;
                    220:        for (i=0;i<8;i++) {
                    221:                dsp_registers[DSP_REG_M0+i]=0x00ffff;
                    222:        }
                    223: 
                    224:        /* host port init, dsp side */
                    225:        dsp_periph[DSP_SPACE_X][DSP_HOST_HSR]=(1<<DSP_HOST_HSR_HTDE);
                    226: 
                    227:        /* host port init, cpu side */
                    228:        dsp_hostport[CPU_HOST_CVR]=0x12;
                    229:        dsp_hostport[CPU_HOST_ISR]=(1<<CPU_HOST_ISR_TRDY)|(1<<CPU_HOST_ISR_TXDE);
                    230:        dsp_hostport[CPU_HOST_IVR]=0x0f;
                    231: 
                    232:        /* Other hardware registers */
                    233:        dsp_periph[DSP_SPACE_X][DSP_IPR]=0;
                    234:        dsp_periph[DSP_SPACE_X][DSP_BCR]=0xffff;
                    235: 
                    236:        /* Misc */
                    237:        dsp_loop_rep = 0;
                    238:        dsp_last_loop_inst = 0;
                    239:        dsp_first_host_write = 1;
                    240: 
                    241:        D(bug("Dsp: reset done"));
                    242: 
                    243:        /* Create thread and semaphore if needed */
                    244:        if (dsp56k_sem == NULL) {
                    245:                dsp56k_sem = SDL_CreateSemaphore(0);
                    246:        }
                    247: 
                    248:        if (dsp56k_thread == NULL) {
                    249:                dsp56k_thread = SDL_CreateThread(dsp56k_do_execute, NULL);
                    250:        }
                    251: }
                    252: 
                    253: void DSP_shutdown(void)
                    254: {
                    255:        if (dsp56k_thread != NULL) {
                    256: 
                    257:                /* Stop thread */
                    258:                dsp_state = DSP_STOPTHREAD;
                    259: #if DSP_DISASM_STATE
                    260:                D(bug("Dsp: state = STOPTHREAD"));
                    261: #endif
                    262: 
                    263:                /* Release semaphore, if thread waiting for it */
                    264:                if (SDL_SemValue(dsp56k_sem)==0) {
                    265:                        SDL_SemPost(dsp56k_sem);
                    266:                }
                    267: 
                    268:                /* Wait for the thread to finish */
                    269:                while (dsp_state != DSP_STOPPEDTHREAD) {
                    270:                        SDL_Delay(1);
                    271:                }
                    272: 
                    273:                dsp56k_thread = NULL;
                    274:        }
                    275: 
                    276:        /* Destroy the semaphore */
                    277:        if (dsp56k_sem != NULL) {
                    278:                SDL_DestroySemaphore(dsp56k_sem);
                    279:                dsp56k_sem = NULL;
                    280:        }
                    281: }
                    282: 
                    283: /**********************************
                    284:  *     Force execution of DSP, till something
                    285:  *  to read from/write to host port
                    286:  **********************************/
                    287: 
                    288: static inline void DSP_force_exec(void)
                    289: {
                    290: #if DSP_HOST_FORCEEXEC
                    291:        while (state == DSP_RUNNING) {
                    292:        }
                    293: #endif
                    294: }
                    295: 
                    296: #endif /* DSP_EMULATION */
                    297: 
                    298: /**********************************
                    299:  *     Hardware address read/write by CPU
                    300:  **********************************/
                    301: 
                    302: static uint8 DSP_handleRead(Uint32 addr)
                    303: {
                    304: #if DSP_EMULATION
                    305:        uint8 value=0;
                    306: 
                    307:        addr -= getHWoffset();
                    308: 
                    309: /*     D(bug("HWget_b(0x%08x)=0x%02x at 0x%08x", addr+HW_DSP, value, showPC()));*/
                    310: 
                    311:        /* Whenever the host want to read something on host port, we test if a
                    312:           transfer is needed */
                    313:        DSP_dsp2host();
                    314: 
                    315:        switch(addr) {
                    316:                case CPU_HOST_ICR:
                    317:                        value = dsp_hostport[CPU_HOST_ICR];
                    318:                        break;
                    319:                case CPU_HOST_CVR:
                    320:                        value = dsp_hostport[CPU_HOST_CVR];
                    321:                        break;
                    322:                case CPU_HOST_ISR:
                    323:                        value = dsp_hostport[CPU_HOST_ISR];
                    324:                        break;
                    325:                case CPU_HOST_IVR:
                    326:                        value = dsp_hostport[CPU_HOST_IVR];
                    327:                        break;
                    328:                case CPU_HOST_RX0:
                    329:                        DSP_force_exec();
                    330:                        value = 0;
                    331:                        break;
                    332:                case CPU_HOST_RXH:
                    333:                        DSP_force_exec();
                    334:                        value = dsp_hostport[CPU_HOST_RXH];
                    335:                        break;
                    336:                case CPU_HOST_RXM:
                    337:                        DSP_force_exec();
                    338:                        value = dsp_hostport[CPU_HOST_RXM];
                    339:                        break;
                    340:                case CPU_HOST_RXL:
                    341:                        DSP_force_exec();
                    342:                        value = dsp_hostport[CPU_HOST_RXL];
                    343: 
                    344:                        if (dsp_state!=DSP_BOOTING) {
                    345:                                /* Clear RXDF bit to say that CPU has read */
                    346:                                dsp_hostport[CPU_HOST_ISR] &= 0xff-(1<<CPU_HOST_ISR_RXDF);
                    347: #if DSP_DISASM_HOSTWRITE
                    348:                                D(bug("Dsp: (D->H): Host RXDF cleared"));
                    349: #endif
                    350:                        }
                    351: 
                    352:                        /* Wake up DSP if it was waiting our read */
                    353:                        if (dsp_state==DSP_WAITHOSTREAD) {
                    354: #if DSP_DISASM_STATE
                    355:                                D(bug("Dsp: state = DSP_RUNNING"));
                    356: #endif
                    357:                                dsp_state = DSP_RUNNING;
                    358: 
                    359:                                if (SDL_SemValue(dsp56k_sem)==0) {
                    360:                                        SDL_SemPost(dsp56k_sem);
                    361:                                }
                    362:                        }
                    363: 
                    364:                        break;
                    365:        }
                    366: 
                    367:        return value;
                    368: #else
                    369:        return 0xff;    // this value prevents TOS from hanging in the DSP init code */
                    370: #endif /* DSP_EMULATION */
                    371: }
                    372: 
                    373: void DSP_HandleReadAccess(void)
                    374: {
                    375:        Uint32 a;
                    376:        Uint8 v;
                    377:        for (a = IoAccessBaseAddress; a < IoAccessBaseAddress+nIoMemAccessSize; a++)
                    378:        {
                    379:                v = DSP_handleRead(a);
                    380:                IoMem_WriteByte(a, v);
                    381:        }
                    382: }
                    383: 
                    384: static void DSP_handleWrite(Uint32 addr, uint8 value)
                    385: {
                    386: #if DSP_EMULATION
                    387:        addr -= getHWoffset();
                    388: 
                    389: /*     D(bug("HWput_b(0x%08x,0x%02x) at 0x%08x", addr+HW_DSP, value, showPC()));*/
                    390: 
                    391:        switch(addr) {
                    392:                case CPU_HOST_ICR:
                    393:                        dsp_hostport[CPU_HOST_ICR]=value & 0xfb;
                    394:                        /* Set HF1 and HF0 accordingly on the host side */
                    395:                        dsp_periph[DSP_SPACE_X][DSP_HOST_HSR] &=
                    396:                                        0xff-((1<<DSP_HOST_HSR_HF1)|(1<<DSP_HOST_HSR_HF0));
                    397:                        dsp_periph[DSP_SPACE_X][DSP_HOST_HSR] |=
                    398:                                        dsp_hostport[CPU_HOST_ICR] & ((1<<DSP_HOST_HSR_HF1)|(1<<DSP_HOST_HSR_HF0));
                    399:                        break;
                    400:                case CPU_HOST_CVR:
                    401:                        dsp_hostport[CPU_HOST_CVR]=value & 0x9f;
                    402:                        /* if bit 7=1, host command */
                    403:                        if (value & (1<<7)) {
                    404:                                dsp_periph[DSP_SPACE_X][DSP_HOST_HSR] |= 1<<DSP_HOST_HSR_HCP;
                    405:                        }
                    406:                        break;
                    407:                case CPU_HOST_ISR:
                    408:                        /* Read only */
                    409:                        break;
                    410:                case CPU_HOST_IVR:
                    411:                        dsp_hostport[CPU_HOST_IVR]=value;
                    412:                        break;
                    413:                case CPU_HOST_TX0:
                    414:                        DSP_force_exec();
                    415: 
                    416:                        if (dsp_first_host_write) {
                    417:                                dsp_first_host_write = 0;
                    418:                                bootstrap_accum = 0;
                    419:                        }
                    420:                        break;
                    421:                case CPU_HOST_TXH:
                    422:                        DSP_force_exec();
                    423: 
                    424:                        if (dsp_first_host_write) {
                    425:                                dsp_first_host_write = 0;
                    426:                                bootstrap_accum = 0;
                    427:                        }
                    428:                        dsp_hostport[CPU_HOST_TXH]=value;
                    429:                        bootstrap_accum |= value<<16;
                    430:                        break;
                    431:                case CPU_HOST_TXM:
                    432:                        DSP_force_exec();
                    433: 
                    434:                        if (dsp_first_host_write) {
                    435:                                dsp_first_host_write = 0;
                    436:                                dsp_hostport[CPU_HOST_TXH]=value;       /* FIXME: is it correct ? */
                    437:                                bootstrap_accum = 0;
                    438:                        }
                    439:                        dsp_hostport[CPU_HOST_TXM]=value;
                    440:                        bootstrap_accum |= value<<8;
                    441:                        break;
                    442:                case CPU_HOST_TXL:
                    443:                        DSP_force_exec();
                    444: 
                    445:                        if (dsp_first_host_write) {
                    446:                                dsp_first_host_write = 0;
                    447:                                dsp_hostport[CPU_HOST_TXH]=value;       /* FIXME: is it correct ? */
                    448:                                dsp_hostport[CPU_HOST_TXM]=value;       /* FIXME: is it correct ? */
                    449:                                bootstrap_accum = 0;
                    450:                        }
                    451:                        dsp_hostport[CPU_HOST_TXL]=value;
                    452:                        bootstrap_accum |= value;
                    453: 
                    454:                        dsp_first_host_write = 1;
                    455: 
                    456:                        if (dsp_state != DSP_BOOTING) {
                    457:                                /* Clear TXDE to say that host has written */
                    458:                                dsp_hostport[CPU_HOST_ISR] &= 0xff-(1<<CPU_HOST_ISR_TXDE);
                    459: #if DSP_DISASM_HOSTREAD
                    460:                                D(bug("Dsp: (H->D): Host TXDE cleared"));
                    461: #endif
                    462: 
                    463:                                DSP_host2dsp();
                    464:                        }
                    465: 
                    466:                        switch(dsp_state) {
                    467:                                case DSP_BOOTING:
                    468:                                        dsp_ram[DSP_SPACE_P][bootstrap_pos] = bootstrap_accum;
                    469: /*                                     D(bug("Dsp: bootstrap: p:0x%04x: 0x%06x written", bootstrap_pos, bootstrap_accum));*/
                    470:                                        bootstrap_pos++;
                    471:                                        if (bootstrap_pos == 0x200) {
                    472: #if DSP_DISASM_STATE
                    473:                                                D(bug("Dsp: bootstrap done"));
                    474: #endif
                    475:                                                dsp_state = DSP_RUNNING;
                    476: 
                    477:                                                SDL_SemPost(dsp56k_sem);
                    478:                                        }               
                    479:                                        bootstrap_accum = 0;
                    480:                                        break;
                    481:                                case DSP_WAITHOSTWRITE:
                    482:                                        /* Wake up DSP if it was waiting our write */
                    483: #if DSP_DISASM_STATE
                    484:                                        D(bug("Dsp: state = DSP_RUNNING"));
                    485: #endif
                    486:                                        dsp_state = DSP_RUNNING;
                    487: 
                    488:                                        if (SDL_SemValue(dsp56k_sem)==0) {
                    489:                                                SDL_SemPost(dsp56k_sem);
                    490:                                        }
                    491:                                        break;
                    492:                        }
                    493: 
                    494:                        break;
                    495:        }
                    496: #endif /* DSP_EMULATION */
                    497: }
                    498: 
                    499: void DSP_HandleWriteAccess(void)
                    500: {
                    501:        Uint32 a;
                    502:        Uint8 v;
                    503:        for (a = IoAccessBaseAddress; a < IoAccessBaseAddress+nIoMemAccessSize; a++)
                    504:        {
                    505:                v = IoMem_ReadByte(a);
                    506:                DSP_handleWrite(a,v);
                    507:        }
                    508: }
                    509: 
                    510: 
                    511: #if DSP_EMULATION
                    512: 
                    513: /**********************************
                    514:  *     Host transfer
                    515:  **********************************/
                    516: 
                    517: void DSP_host2dsp(void)
                    518: {
                    519:        int trdy;
                    520: 
                    521:        /* Host port transfer ? (host->dsp) */
                    522:        if (
                    523:                ((dsp_hostport[CPU_HOST_ISR] & (1<<CPU_HOST_ISR_TXDE))==0) &&
                    524:                ((dsp_periph[DSP_SPACE_X][DSP_HOST_HSR] & (1<<DSP_HOST_HSR_HRDF))==0)
                    525:                ) {
                    526: 
                    527:                dsp_periph[DSP_SPACE_X][DSP_HOST_HRX] = dsp_hostport[CPU_HOST_TXL];
                    528:                dsp_periph[DSP_SPACE_X][DSP_HOST_HRX] |= dsp_hostport[CPU_HOST_TXM]<<8;
                    529:                dsp_periph[DSP_SPACE_X][DSP_HOST_HRX] |= dsp_hostport[CPU_HOST_TXH]<<16;
                    530: 
                    531: #if DSP_DISASM_HOSTREAD
                    532:                D(bug("Dsp: (H->D): Transfer 0x%06x",dsp_periph[DSP_SPACE_X][DSP_HOST_HRX]));
                    533: #endif
                    534: 
                    535:                /* Set HRDF bit to say that DSP can read */
                    536:                dsp_periph[DSP_SPACE_X][DSP_HOST_HSR] |= 1<<DSP_HOST_HSR_HRDF;
                    537: #if DSP_DISASM_HOSTREAD
                    538:                D(bug("Dsp: (H->D): Dsp HRDF set"));
                    539: #endif
                    540: 
                    541:                /* Set TXDE bit to say that host can write */
                    542:                dsp_hostport[CPU_HOST_ISR] |= 1<<CPU_HOST_ISR_TXDE;
                    543: #if DSP_DISASM_HOSTREAD
                    544:                D(bug("Dsp: (H->D): Host TXDE set"));
                    545: #endif
                    546: 
                    547:                /* Clear/set TRDY bit */
                    548:                dsp_hostport[CPU_HOST_ISR] &= 0xff-(1<<CPU_HOST_ISR_TRDY);
                    549:                trdy = (dsp_hostport[CPU_HOST_ISR]>>CPU_HOST_ISR_TXDE) & 1;
                    550:                trdy &= !((dsp_periph[DSP_SPACE_X][DSP_HOST_HSR]>>DSP_HOST_HSR_HRDF) & 1);
                    551:                dsp_hostport[CPU_HOST_ISR] |= (trdy & 1)<< CPU_HOST_ISR_TRDY;
                    552:        }
                    553: }
                    554: 
                    555: void DSP_dsp2host(void)
                    556: {
                    557:        /* Host port transfer ? (dsp->host) */
                    558:        if (
                    559:                ((dsp_hostport[CPU_HOST_ISR] & (1<<CPU_HOST_ISR_RXDF))==0) &&
                    560:                ((dsp_periph[DSP_SPACE_X][DSP_HOST_HSR] & (1<<DSP_HOST_HSR_HTDE))==0)
                    561:                ) {
                    562: 
                    563:                dsp_hostport[CPU_HOST_RXL] = dsp_periph[DSP_SPACE_X][DSP_HOST_HTX];
                    564:                dsp_hostport[CPU_HOST_RXM] = dsp_periph[DSP_SPACE_X][DSP_HOST_HTX]>>8;
                    565:                dsp_hostport[CPU_HOST_RXH] = dsp_periph[DSP_SPACE_X][DSP_HOST_HTX]>>16;
                    566: 
                    567: #if DSP_DISASM_HOSTWRITE
                    568:                D(bug("Dsp: (D->H): Transfer 0x%06x",dsp_periph[DSP_SPACE_X][DSP_HOST_HTX]));
                    569: #endif
                    570: 
                    571:                /* Set HTDE bit to say that DSP can write */
                    572:                dsp_periph[DSP_SPACE_X][DSP_HOST_HSR] |= 1<<DSP_HOST_HSR_HTDE;
                    573: #if DSP_DISASM_HOSTWRITE
                    574:                D(bug("Dsp: (D->H): Dsp HTDE set"));
                    575: #endif
                    576: 
                    577:                /* Set RXDF bit to say that host can read */
                    578:                dsp_hostport[CPU_HOST_ISR] |= 1<<CPU_HOST_ISR_RXDF;
                    579: #if DSP_DISASM_HOSTWRITE
                    580:                D(bug("Dsp: (D->H): Host RXDF set"));
                    581: #endif
                    582:        }
                    583: }
                    584: 
                    585: #endif /* DSP_EMULATION */
                    586: 

unix.superglobalmegacorp.com

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