Annotation of previous/src/dsp/dsp.c, revision 1.1.1.1

1.1       root        1: /*
                      2:        DSP M56001 emulation
                      3:        Dummy emulation, Hatari glue
                      4: 
                      5:        (C) 2001-2008 ARAnyM developer team
                      6:        Adaption to Hatari (C) 2008 by Thomas Huth
                      7: 
                      8:        This program is free software; you can redistribute it and/or modify
                      9:        it under the terms of the GNU General Public License as published by
                     10:        the Free Software Foundation; either version 2 of the License, or
                     11:        (at your option) any later version.
                     12: 
                     13:        This program is distributed in the hope that it will be useful,
                     14:        but WITHOUT ANY WARRANTY; without even the implied warranty of
                     15:        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     16:        GNU General Public License for more details.
                     17: 
                     18:        You should have received a copy of the GNU General Public License
                     19:        along with this program; if not, write to the Free Software
                     20:        Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
                     21: */
                     22: 
                     23: #include <ctype.h>
                     24: 
                     25: #include "main.h"
                     26: #include "sysdeps.h"
                     27: #include "newcpu.h"
                     28: #include "memorySnapShot.h"
                     29: #include "ioMem.h"
                     30: #include "dsp.h"
                     31: #include "configuration.h"
                     32: #include "cycInt.h"
                     33: #include "statusbar.h"
                     34: #include "m68000.h"
                     35: #include "sysReg.h"
                     36: #include "dma.h"
                     37: 
                     38: #if ENABLE_DSP_EMU
                     39: #include "dsp_cpu.h"
                     40: #include "dsp_disasm.h"
                     41: #endif
                     42: 
                     43: #define DEBUG 0
                     44: #if DEBUG
                     45: #define Dprintf(a) printf a
                     46: #else
                     47: #define Dprintf(a)
                     48: #endif
                     49: 
                     50: #define LOG_DSP_LEVEL  LOG_DEBUG
                     51: 
                     52: #define DSP_HW_OFFSET  0xFFA200
                     53: 
                     54: 
                     55: #if ENABLE_DSP_EMU
                     56: static const char* x_ext_memory_addr_name[] = {
                     57:        "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
                     58:        "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
                     59:        "PBC", "PCC", "PBDDR", "PCDDR", "PBD", "PCD", "", "",
                     60:        "HCR", "HSR", "", "HRX/HTX", "CRA", "CRB", "SSISR/TSR", "RX/TX",
                     61:        "SCR", "SSR", "SCCR", "STXA", "SRX/STX", "SRX/STX", "SRX/STX", "",
                     62:        "", "", "", "", "", "", "BCR", "IPR"
                     63: };
                     64: 
                     65: static Sint32 save_cycles;
                     66: #endif
                     67: 
                     68: static bool bDspDebugging;
                     69: 
                     70: bool bDspEnabled = false;
                     71: bool bDspEmulated = false;
                     72: bool bDspHostInterruptPending = false;
                     73: 
                     74: 
                     75: /**
                     76:  * Handle TXD interrupt at host CPU
                     77:  */
                     78: #if ENABLE_DSP_EMU
                     79: void DSP_HandleTXD(int set) {
                     80:     if (set) {
                     81:                Log_Printf(LOG_WARN, "[DSP] Set TXD interrupt");
                     82:         //set_dsp_interrupt(SET_INT);
                     83:     } else {
                     84:                Log_Printf(LOG_WARN, "[DSP] Release TXD interrupt");
                     85:         //set_dsp_interrupt(RELEASE_INT);
                     86:     }
                     87: }
                     88: #endif
                     89: 
                     90: 
                     91: /**
                     92:  * Handle HREQ at the host CPU.
                     93:  */
                     94: #if ENABLE_DSP_EMU
                     95: static void DSP_HandleHREQ(int set)
                     96: {
                     97:     if (dsp_core.dma_mode) {
                     98:                set_dsp_interrupt(RELEASE_INT);
                     99:         if (set) {
                    100:                        dsp_core.dma_request = 1;
                    101:         } else {
                    102:                        dsp_core.dma_request = 0;
                    103:         }
                    104:     } else {
                    105:                dsp_core.dma_request = 0;
                    106:         if (set) {
                    107:             Log_Printf(LOG_DSP_LEVEL, "[DSP] Set HREQ interrupt");
                    108:                        set_dsp_interrupt(SET_INT);
                    109:         } else {
                    110:             Log_Printf(LOG_DSP_LEVEL, "[DSP] Release HREQ interrupt");
                    111:                        set_dsp_interrupt(RELEASE_INT);
                    112:         }
                    113:     }
                    114: }
                    115: #endif
                    116: 
                    117: 
                    118: /**
                    119:  * Host DSP DMA interface
                    120:  */
                    121: 
                    122: /**
                    123:  * Set DSP IRQB at the end of a DMA block.
                    124:  */
                    125: void DSP_SetIRQB(void)
                    126: {
                    127: #if ENABLE_DSP_EMU
                    128:     if (dsp_intr_at_block_end) {
                    129:                dsp_set_interrupt(DSP_INTER_IRQB, 1);
                    130:     }
                    131: #endif
                    132: }
                    133: 
                    134: 
                    135: /**
                    136:  * Handling DMA transfers.
                    137:  */
                    138: void DSP_HandleDMA(void)
                    139: {
                    140: #if ENABLE_DSP_EMU
                    141:        if (dsp_core.dma_mode && dsp_core.dma_request && dma_dsp_ready()) {
                    142:                /* Set the counter according to selected DMA mode */
                    143:                if (dsp_core.dma_address_counter==0) {
                    144:                        dsp_core.dma_address_counter = 4-dsp_core.dma_mode;
                    145:                        /* Handle unpacked mode on Turbo systems */
                    146:                        if (dsp_dma_unpacked && ConfigureParams.System.bTurbo) {
                    147:                                        dsp_core.dma_address_counter = 4;
                    148:                        }
                    149:                }
                    150:                dsp_core.dma_address_counter--;
                    151:                
                    152:                /* Read or write via DMA */
                    153:                if (dsp_core.dma_direction==(1<<CPU_HOST_ICR_TREQ)) {
                    154:                        dsp_core_write_host(CPU_HOST_TRXL-dsp_core.dma_address_counter, dma_dsp_read_memory());
                    155:                } else {
                    156:                        dma_dsp_write_memory(dsp_core_read_host(CPU_HOST_TRXL-dsp_core.dma_address_counter));
                    157:                }
                    158:                
                    159:                /* Handle unpacked mode on non-Turbo systems */
                    160:                if (dsp_dma_unpacked && dsp_core.dma_address_counter==0 && !ConfigureParams.System.bTurbo) {
                    161:                        if (dsp_core.dma_direction==(1<<CPU_HOST_ICR_TREQ)) {
                    162:                                dsp_core_write_host(CPU_HOST_TRX0, dma_dsp_read_memory());
                    163:                        } else {
                    164:                                dma_dsp_write_memory(dsp_core_read_host(CPU_HOST_TRX0));
                    165:                        }
                    166:                        return;
                    167:                }
                    168:        }
                    169: #endif
                    170: }
                    171: 
                    172: 
                    173: /**
                    174:  * This function is called from the CPU emulation part when SPCFLAG_DSP is set.
                    175:  * If the DSP's IRQ signal is set, we check that SR allows a level 6 interrupt,
                    176:  * and if so, we call M68000_Exception.
                    177:  */
                    178: #if ENABLE_DSP_EMU
                    179: bool   DSP_ProcessIRQ(void)
                    180: {
                    181:        if (bDspHostInterruptPending && regs.intmask < 6)
                    182:        {
                    183:                M68000_Exception(IoMem_ReadByte(0xffa203)*4, M68000_EXC_SRC_INT_DSP);
                    184:                bDspHostInterruptPending = false;
                    185: //             M68000_UnsetSpecial(SPCFLAG_DSP);
                    186:                return true;
                    187:        }
                    188: 
                    189:        return false;
                    190: }
                    191: #endif
                    192: 
                    193: 
                    194: /**
                    195:  * Initialize the DSP emulation
                    196:  */
                    197: void DSP_Init(void)
                    198: {
                    199: #if ENABLE_DSP_EMU
                    200:        if (bDspEnabled)
                    201:                return;
                    202:        dsp_core_init(DSP_HandleHREQ);
                    203:        dsp56k_init_cpu();
                    204:        bDspEnabled = true;
                    205:        save_cycles = 0;
                    206: #endif
                    207: }
                    208: 
                    209: 
                    210: /**
                    211:  * Shut down the DSP emulation
                    212:  */
                    213: void DSP_UnInit(void)
                    214: {
                    215: #if ENABLE_DSP_EMU
                    216:        if (!bDspEnabled)
                    217:                return;
                    218:        dsp_core_shutdown();
                    219:        bDspEnabled = false;
                    220: #endif
                    221: }
                    222: 
                    223: 
                    224: /**
                    225:  * Reset the DSP emulation
                    226:  */
                    227: void DSP_Reset(void)
                    228: {
                    229:     //LogTraceFlags = TRACE_DSP_ALL;
                    230:        if (ConfigureParams.System.bDSPMemoryExpansion) {
                    231:                DSP_RAMSIZE = DSP_RAMSIZE_96kB;
                    232:        } else {
                    233:                DSP_RAMSIZE = DSP_RAMSIZE_24kB;
                    234:        }
                    235:        if (ConfigureParams.System.nDSPType==DSP_TYPE_EMU) {
                    236:                bDspEmulated = true;
                    237:        } else {
                    238:                bDspEmulated = false;
                    239:        }
                    240:        Statusbar_SetDspLed(false);
                    241: #if ENABLE_DSP_EMU
                    242:        dsp_core_reset();
                    243:        save_cycles = 0;
                    244: #endif
                    245: }
                    246: 
                    247: 
                    248: /**
                    249:  * Start the DSP emulation
                    250:  */
                    251: void DSP_Start(Uint8 mode)
                    252: {
                    253:        if (!bDspEmulated) {
                    254:                return;
                    255:        }
                    256: #if ENABLE_DSP_EMU
                    257:     dsp_core_start(mode);
                    258:     save_cycles = 0;
                    259: #endif
                    260: }
                    261: 
                    262: 
                    263: /**
                    264:  * Save/Restore snapshot of CPU variables ('MemorySnapShot_Store' handles type)
                    265:  */
                    266: void DSP_MemorySnapShot_Capture(bool bSave)
                    267: {
                    268: #if ENABLE_DSP_EMU
                    269:        if (!bSave)
                    270:                DSP_Reset();
                    271: 
                    272:        MemorySnapShot_Store(&bDspEnabled, sizeof(bDspEnabled));
                    273:        MemorySnapShot_Store(&dsp_core, sizeof(dsp_core));
                    274:        MemorySnapShot_Store(&save_cycles, sizeof(save_cycles));
                    275: #endif
                    276: }
                    277: 
                    278: /**
                    279:  * Run DSP for certain cycles
                    280:  */
                    281: void DSP_Run(int nHostCycles)
                    282: {
                    283: #if ENABLE_DSP_EMU
                    284:        if (dsp_core.running == 0)
                    285:                return;
                    286:        
                    287:        save_cycles += nHostCycles * 2;
                    288: 
                    289:        if (save_cycles <= 0)
                    290:                return;
                    291:        
                    292:        while (save_cycles > 0)
                    293:        {
                    294:                dsp56k_execute_instruction();
                    295:                save_cycles -= dsp_core.instr_cycle;
                    296:        }
                    297:        
                    298:        DSP_HandleDMA();
                    299: #endif
                    300: }
                    301: 
                    302: /**
                    303:  * Enable/disable DSP debugging mode
                    304:  */
                    305: void DSP_SetDebugging(bool enabled)
                    306: {
                    307:        bDspDebugging = enabled;
                    308: }
                    309: 
                    310: /**
                    311:  * Get DSP program counter (for debugging)
                    312:  */
                    313: Uint16 DSP_GetPC(void)
                    314: {
                    315: #if ENABLE_DSP_EMU
                    316:        if (bDspEnabled)
                    317:                return dsp_core.pc;
                    318:        else
                    319: #endif
                    320:        return 0;
                    321: }
                    322: 
                    323: /**
                    324:  * Get next DSP PC without output (for debugging)
                    325:  */
                    326: Uint16 DSP_GetNextPC(Uint16 pc)
                    327: {
                    328: #if ENABLE_DSP_EMU
                    329:        /* code is reduced copy from dsp56k_execute_one_disasm_instruction() */
                    330:        dsp_core_t dsp_core_save;
                    331:        Uint16 instruction_length;
                    332: 
                    333:        if (!bDspEnabled)
                    334:                return 0;
                    335: 
                    336:        /* Save DSP context */
                    337:        memcpy(&dsp_core_save, &dsp_core, sizeof(dsp_core));
                    338: 
                    339:        /* Disasm instruction */
                    340:        dsp_core.pc = pc;
                    341:        /* why dsp56k_execute_one_disasm_instruction() does "-1"
                    342:         * for this value, that doesn't seem right???
                    343:         */
                    344:        instruction_length = dsp56k_disasm(DSP_DISASM_MODE);
                    345: 
                    346:        /* Restore DSP context */
                    347:        memcpy(&dsp_core, &dsp_core_save, sizeof(dsp_core));
                    348: 
                    349:        return pc + instruction_length;
                    350: #else
                    351:        return 0;
                    352: #endif
                    353: }
                    354: 
                    355: /**
                    356:  * Get current DSP instruction cycles (for profiling)
                    357:  */
                    358: Uint16 DSP_GetInstrCycles(void)
                    359: {
                    360: #if ENABLE_DSP_EMU
                    361:        if (bDspEnabled)
                    362:                return dsp_core.instr_cycle;
                    363:        else
                    364: #endif
                    365:        return 0;
                    366: }
                    367: 
                    368: 
                    369: /**
                    370:  * Disassemble DSP code between given addresses, return next PC address
                    371:  */
                    372: Uint16 DSP_DisasmAddress(FILE *out, Uint16 lowerAdr, Uint16 UpperAdr)
                    373: {
                    374: #if ENABLE_DSP_EMU
                    375:        Uint16 dsp_pc;
                    376: 
                    377:        for (dsp_pc=lowerAdr; dsp_pc<=UpperAdr; dsp_pc++) {
                    378:                dsp_pc += dsp56k_execute_one_disasm_instruction(out, dsp_pc);
                    379:        }
                    380:        return dsp_pc;
                    381: #else
                    382:        return 0;
                    383: #endif
                    384: }
                    385: 
                    386: 
                    387: /**
                    388:  * Get the value from the given (16-bit) DSP memory address / space
                    389:  * exactly the same way as in dsp_cpu.c::read_memory() (except for
                    390:  * the host/transmit peripheral register values which access has
                    391:  * side-effects). Set the mem_str to suitable string for that
                    392:  * address / space.
                    393:  * Return the value at given address. For valid values AND the return
                    394:  * value with BITMASK(24).
                    395:  */
                    396: Uint32 DSP_ReadMemory(Uint16 address, char space_id, const char **mem_str)
                    397: {
                    398: #if ENABLE_DSP_EMU
                    399:        static const char *spaces[3][4] = {
                    400:                { "X ram", "X rom", "X", "X periph" },
                    401:                { "Y ram", "Y rom", "Y", "Y periph" },
                    402:                { "P ram", "P ram", "P ext memory", "P ext memory" }
                    403:        };
                    404:        int idx, space;
                    405: 
                    406:        switch (space_id) {
                    407:        case 'X':
                    408:                space = DSP_SPACE_X;
                    409:                idx = 0;
                    410:                break;
                    411:        case 'Y':
                    412:                space = DSP_SPACE_Y;
                    413:                idx = 1;
                    414:                break;
                    415:        case 'P':
                    416:                space = DSP_SPACE_P;
                    417:                idx = 2;
                    418:                break;
                    419:        default:
                    420:                space = DSP_SPACE_X;
                    421:                idx = 0;
                    422:        }
                    423:        address &= 0xFFFF;
                    424: 
                    425:        /* Internal RAM ? */
                    426:        if (address < 0x100) {
                    427:                *mem_str = spaces[idx][0];
                    428:                return dsp_core.ramint[space][address];
                    429:        }
                    430: 
                    431:        if (space == DSP_SPACE_P) {
                    432:                /* Internal RAM ? */
                    433:                if (address < 0x200) {
                    434:                        *mem_str = spaces[idx][0];
                    435:                        return dsp_core.ramint[DSP_SPACE_P][address];
                    436:                }
                    437:                /* External RAM, mask address to available ram size */
                    438:                *mem_str = spaces[idx][2];
                    439:                return dsp_core.ramext[address & (DSP_RAMSIZE-1)];
                    440:        }
                    441: 
                    442:        /* Internal ROM ? */
                    443:        if (address < 0x200) {
                    444:                if (dsp_core.registers[DSP_REG_OMR] & (1<<DSP_OMR_DE)) {
                    445:                        *mem_str = spaces[idx][1];
                    446:                        return dsp_core.rom[space][address];
                    447:                }
                    448:        }
                    449: 
                    450:        /* Peripheral address ? */
                    451:        if (address >= 0xffc0) {
                    452:                *mem_str = spaces[idx][3];
                    453:                /* reading host/transmit regs has side-effects,
                    454:                 * so just give the memory value.
                    455:                 */
                    456:                return dsp_core.periph[space][address-0xffc0];
                    457:        }
                    458: 
                    459:        /* Falcon: External RAM, map X to upper 16K of matching space in Y,P */
                    460:        address &= (DSP_RAMSIZE>>1) - 1;
                    461:        if (space == DSP_SPACE_X) {
                    462:                address += DSP_RAMSIZE>>1;
                    463:        }
                    464: 
                    465:        /* Falcon: External RAM, finally map X,Y to P */
                    466:        *mem_str = spaces[idx][2];
                    467:        return dsp_core.ramext[address & (DSP_RAMSIZE-1)];
                    468: #endif
                    469:        return 0;
                    470: }
                    471: 
                    472: 
                    473: /**
                    474:  * Output memory values between given addresses in given DSP address space.
                    475:  * Return next DSP address value.
                    476:  */
                    477: Uint16 DSP_DisasmMemory(Uint16 dsp_memdump_addr, Uint16 dsp_memdump_upper, char space)
                    478: {
                    479: #if ENABLE_DSP_EMU
                    480:        Uint32 mem, mem2, value;
                    481:        const char *mem_str;
                    482: 
                    483:        for (mem = dsp_memdump_addr; mem <= dsp_memdump_upper; mem++) {
                    484:                /* special printing of host communication/transmit registers */
                    485:                if (space == 'X' && mem >= 0xffc0) {
                    486:                        if (mem == 0xffeb) {
                    487:                                fprintf(stderr,"X periph:%04x  HTX : %06x   RTX:%06x\n", 
                    488:                                        mem, dsp_core.dsp_host_htx, dsp_core.dsp_host_rtx);
                    489:                        }
                    490:                        else if (mem == 0xffef) {
                    491:                                fprintf(stderr,"X periph:%04x  SSI TX : %06x   SSI RX:%06x\n", 
                    492:                                        mem, dsp_core.ssi.transmit_value, dsp_core.ssi.received_value);
                    493:                        }
                    494:                        else {
                    495:                                value = DSP_ReadMemory(mem, space, &mem_str);
                    496:                                fprintf(stderr,"%s:%04x  %06x\t%s\n", mem_str, mem, value, x_ext_memory_addr_name[mem-0xffc0]);
                    497:                        }
                    498:                        continue;
                    499:                }
                    500:                /* special printing of X & Y external RAM values */
                    501:                if ((space == 'X' || space == 'Y') &&
                    502:                    mem >= 0x200 && mem < 0xffc0) {
                    503:                        mem2 = mem & ((DSP_RAMSIZE>>1)-1);
                    504:                        if (space == 'X') {
                    505:                                mem2 += (DSP_RAMSIZE>>1);
                    506:                        }
                    507:                        fprintf(stderr,"%c:%04x (P:%04x): %06x\n", space,
                    508:                                mem, mem2, dsp_core.ramext[mem2 & (DSP_RAMSIZE-1)]);
                    509:                        continue;
                    510:                }
                    511:                value = DSP_ReadMemory(mem, space, &mem_str);
                    512:                fprintf(stderr,"%s:%04x  %06x\n", mem_str, mem, value);
                    513:        }
                    514: #endif
                    515:        return dsp_memdump_upper+1;
                    516: }
                    517: 
                    518: /**
                    519:  * Show information on DSP core state which isn't
                    520:  * shown by any of the other commands (dd, dm, dr).
                    521:  */
                    522: void DSP_Info(Uint32 dummy)
                    523: {
                    524: #if ENABLE_DSP_EMU
                    525:        int i, j;
                    526:        const char *stackname[] = { "SSH", "SSL" };
                    527: 
                    528:        fputs("DSP core information:\n", stderr);
                    529: 
                    530:        for (i = 0; i < ARRAYSIZE(stackname); i++) {
                    531:                fprintf(stderr, "- %s stack:", stackname[i]);
                    532:                for (j = 0; j < ARRAYSIZE(dsp_core.stack[0]); j++) {
                    533:                        fprintf(stderr, " %04hx", dsp_core.stack[i][j]);
                    534:                }
                    535:                fputs("\n", stderr);
                    536:        }
                    537: 
                    538:        fprintf(stderr, "- Interrupts:\n");
                    539:        for (i = 0; i < 32; i++) {
                    540:                fprintf(stderr, "%s: ", dsp_interrupt_name[i]);
                    541:                if ((1<<i) & dsp_core.interrupt_status & (dsp_core.interrupt_mask|DSP_INTER_NMI_MASK)) {
                    542:                        fprintf(stderr, "Pending ");
                    543:                }
                    544:                if ((1<<i) & DSP_INTER_NMI_MASK) {
                    545:                        fprintf(stderr, "at level 3");
                    546:                } else {
                    547:                        for (j = 2; j>=0; j--) {
                    548:                                if ((1<<i) & dsp_core.interrupt_mask_level[j]) {
                    549:                                        fprintf(stderr, "at level %i", j);
                    550:                                }
                    551:                        }
                    552:                }
                    553:                fputs("\n", stderr);
                    554:        }
                    555:        fprintf(stderr, "- Hostport:");
                    556:        for (i = 0; i < ARRAYSIZE(dsp_core.hostport); i++) {
                    557:                fprintf(stderr, " %02x", dsp_core.hostport[i]);
                    558:        }
                    559:        fputs("\n", stderr);
                    560: #endif
                    561: }
                    562: 
                    563: /**
                    564:  * Show DSP register contents
                    565:  */
                    566: void DSP_DisasmRegisters(void)
                    567: {
                    568: #if ENABLE_DSP_EMU
                    569:        Uint32 i;
                    570: 
                    571:        fprintf(stderr,"A: A2: %02x  A1: %06x  A0: %06x\n",
                    572:                dsp_core.registers[DSP_REG_A2], dsp_core.registers[DSP_REG_A1], dsp_core.registers[DSP_REG_A0]);
                    573:        fprintf(stderr,"B: B2: %02x  B1: %06x  B0: %06x\n",
                    574:                dsp_core.registers[DSP_REG_B2], dsp_core.registers[DSP_REG_B1], dsp_core.registers[DSP_REG_B0]);
                    575:        
                    576:        fprintf(stderr,"X: X1: %06x  X0: %06x\n", dsp_core.registers[DSP_REG_X1], dsp_core.registers[DSP_REG_X0]);
                    577:        fprintf(stderr,"Y: Y1: %06x  Y0: %06x\n", dsp_core.registers[DSP_REG_Y1], dsp_core.registers[DSP_REG_Y0]);
                    578: 
                    579:        for (i=0; i<8; i++) {
                    580:                fprintf(stderr,"R%01x: %04x   N%01x: %04x   M%01x: %04x\n", 
                    581:                        i, dsp_core.registers[DSP_REG_R0+i],
                    582:                        i, dsp_core.registers[DSP_REG_N0+i],
                    583:                        i, dsp_core.registers[DSP_REG_M0+i]);
                    584:        }
                    585: 
                    586:        fprintf(stderr,"LA: %04x   LC: %04x   PC: %04x\n", dsp_core.registers[DSP_REG_LA], dsp_core.registers[DSP_REG_LC], dsp_core.pc);
                    587:        fprintf(stderr,"SR: %04x  OMR: %02x\n", dsp_core.registers[DSP_REG_SR], dsp_core.registers[DSP_REG_OMR]);
                    588:        fprintf(stderr,"SP: %02x    SSH: %04x  SSL: %04x\n", 
                    589:                dsp_core.registers[DSP_REG_SP], dsp_core.registers[DSP_REG_SSH], dsp_core.registers[DSP_REG_SSL]);
                    590: #endif
                    591: }
                    592: 
                    593: 
                    594: /**
                    595:  * Get given DSP register address and required bit mask.
                    596:  * Works for A0-2, B0-2, LA, LC, M0-7, N0-7, R0-7, X0-1, Y0-1, PC, SR, SP,
                    597:  * OMR, SSH & SSL registers, but note that the SP, SSH & SSL registers
                    598:  * need special handling (in DSP*SetRegister()) when they are set.
                    599:  * Return the register width in bits or zero for an error.
                    600:  */
                    601: int DSP_GetRegisterAddress(const char *regname, Uint32 **addr, Uint32 *mask)
                    602: {
                    603: #if ENABLE_DSP_EMU
                    604: #define MAX_REGNAME_LEN 4
                    605:        typedef struct {
                    606:                const char name[MAX_REGNAME_LEN];
                    607:                Uint32 *addr;
                    608:                size_t bits;
                    609:                Uint32 mask;
                    610:        } reg_addr_t;
                    611:        
                    612:        /* sorted by name so that this can be bisected */
                    613:        static const reg_addr_t registers[] = {
                    614: 
                    615:                /* 56-bit A register */
                    616:                { "A0",  &dsp_core.registers[DSP_REG_A0],  32, BITMASK(24) },
                    617:                { "A1",  &dsp_core.registers[DSP_REG_A1],  32, BITMASK(24) },
                    618:                { "A2",  &dsp_core.registers[DSP_REG_A2],  32, BITMASK(8) },
                    619: 
                    620:                /* 56-bit B register */
                    621:                { "B0",  &dsp_core.registers[DSP_REG_B0],  32, BITMASK(24) },
                    622:                { "B1",  &dsp_core.registers[DSP_REG_B1],  32, BITMASK(24) },
                    623:                { "B2",  &dsp_core.registers[DSP_REG_B2],  32, BITMASK(8) },
                    624: 
                    625:                /* 16-bit LA & LC registers */
                    626:                { "LA",  &dsp_core.registers[DSP_REG_LA],  32, BITMASK(16) },
                    627:                { "LC",  &dsp_core.registers[DSP_REG_LC],  32, BITMASK(16) },
                    628: 
                    629:                /* 16-bit M registers */
                    630:                { "M0",  &dsp_core.registers[DSP_REG_M0],  32, BITMASK(16) },
                    631:                { "M1",  &dsp_core.registers[DSP_REG_M1],  32, BITMASK(16) },
                    632:                { "M2",  &dsp_core.registers[DSP_REG_M2],  32, BITMASK(16) },
                    633:                { "M3",  &dsp_core.registers[DSP_REG_M3],  32, BITMASK(16) },
                    634:                { "M4",  &dsp_core.registers[DSP_REG_M4],  32, BITMASK(16) },
                    635:                { "M5",  &dsp_core.registers[DSP_REG_M5],  32, BITMASK(16) },
                    636:                { "M6",  &dsp_core.registers[DSP_REG_M6],  32, BITMASK(16) },
                    637:                { "M7",  &dsp_core.registers[DSP_REG_M7],  32, BITMASK(16) },
                    638: 
                    639:                /* 16-bit N registers */
                    640:                { "N0",  &dsp_core.registers[DSP_REG_N0],  32, BITMASK(16) },
                    641:                { "N1",  &dsp_core.registers[DSP_REG_N1],  32, BITMASK(16) },
                    642:                { "N2",  &dsp_core.registers[DSP_REG_N2],  32, BITMASK(16) },
                    643:                { "N3",  &dsp_core.registers[DSP_REG_N3],  32, BITMASK(16) },
                    644:                { "N4",  &dsp_core.registers[DSP_REG_N4],  32, BITMASK(16) },
                    645:                { "N5",  &dsp_core.registers[DSP_REG_N5],  32, BITMASK(16) },
                    646:                { "N6",  &dsp_core.registers[DSP_REG_N6],  32, BITMASK(16) },
                    647:                { "N7",  &dsp_core.registers[DSP_REG_N7],  32, BITMASK(16) },
                    648: 
                    649:                { "OMR", &dsp_core.registers[DSP_REG_OMR], 32, 0x5f },
                    650: 
                    651:                /* 16-bit program counter */
                    652:                { "PC",  (Uint32*)(&dsp_core.pc),  16, BITMASK(16) },
                    653: 
                    654:                /* 16-bit DSP R (address) registers */
                    655:                { "R0",  &dsp_core.registers[DSP_REG_R0],  32, BITMASK(16) },
                    656:                { "R1",  &dsp_core.registers[DSP_REG_R1],  32, BITMASK(16) },
                    657:                { "R2",  &dsp_core.registers[DSP_REG_R2],  32, BITMASK(16) },
                    658:                { "R3",  &dsp_core.registers[DSP_REG_R3],  32, BITMASK(16) },
                    659:                { "R4",  &dsp_core.registers[DSP_REG_R4],  32, BITMASK(16) },
                    660:                { "R5",  &dsp_core.registers[DSP_REG_R5],  32, BITMASK(16) },
                    661:                { "R6",  &dsp_core.registers[DSP_REG_R6],  32, BITMASK(16) },
                    662:                { "R7",  &dsp_core.registers[DSP_REG_R7],  32, BITMASK(16) },
                    663: 
                    664:                { "SSH", &dsp_core.registers[DSP_REG_SSH], 32, BITMASK(16) },
                    665:                { "SSL", &dsp_core.registers[DSP_REG_SSL], 32, BITMASK(16) },
                    666:                { "SP",  &dsp_core.registers[DSP_REG_SP],  32, BITMASK(6) },
                    667: 
                    668:                /* 16-bit status register */
                    669:                { "SR",  &dsp_core.registers[DSP_REG_SR],  32, 0xefff },
                    670: 
                    671:                /* 48-bit X register */
                    672:                { "X0",  &dsp_core.registers[DSP_REG_X0],  32, BITMASK(24) },
                    673:                { "X1",  &dsp_core.registers[DSP_REG_X1],  32, BITMASK(24) },
                    674: 
                    675:                /* 48-bit Y register */
                    676:                { "Y0",  &dsp_core.registers[DSP_REG_Y0],  32, BITMASK(24) },
                    677:                { "Y1",  &dsp_core.registers[DSP_REG_Y1],  32, BITMASK(24) }
                    678:        };
                    679:        /* left, right, middle, direction */
                    680:        int l, r, m, dir = 0;
                    681:        unsigned int i, len;
                    682:        char reg[MAX_REGNAME_LEN];
                    683: 
                    684:        if (!bDspEnabled) {
                    685:                return 0;
                    686:        }
                    687: 
                    688:        for (i = 0; i < sizeof(reg) && regname[i]; i++) {
                    689:                reg[i] = toupper((unsigned char)regname[i]);
                    690:        }
                    691:        if (i < 2 || regname[i]) {
                    692:                /* too short or longer than any of the names */
                    693:                return 0;
                    694:        }
                    695:        len = i;
                    696:        
                    697:        /* bisect */
                    698:        l = 0;
                    699:        r = ARRAYSIZE(registers) - 1;
                    700:        do {
                    701:                m = (l+r) >> 1;
                    702:                for (i = 0; i < len; i++) {
                    703:                        dir = (int)reg[i] - registers[m].name[i];
                    704:                        if (dir) {
                    705:                                break;
                    706:                        }
                    707:                }
                    708:                if (dir == 0) {
                    709:                        *addr = registers[m].addr;
                    710:                        *mask = registers[m].mask;
                    711:                        return registers[m].bits;
                    712:                }
                    713:                if (dir < 0) {
                    714:                        r = m-1;
                    715:                } else {
                    716:                        l = m+1;
                    717:                }
                    718:        } while (l <= r);
                    719: #undef MAX_REGNAME_LEN
                    720: #endif
                    721:        return 0;
                    722: }
                    723: 
                    724: 
                    725: /**
                    726:  * Set given DSP register value, return false if unknown register given
                    727:  */
                    728: bool DSP_Disasm_SetRegister(const char *arg, Uint32 value)
                    729: {
                    730: #if ENABLE_DSP_EMU
                    731:        Uint32 *addr, mask, sp_value;
                    732:        int bits;
                    733: 
                    734:        /* first check registers needing special handling... */
                    735:        if (arg[0]=='S' || arg[0]=='s') {
                    736:                if (arg[1]=='P' || arg[1]=='p') {
                    737:                        dsp_core.registers[DSP_REG_SP] = value & BITMASK(6);
                    738:                        value &= BITMASK(4); 
                    739:                        dsp_core.registers[DSP_REG_SSH] = dsp_core.stack[0][value];
                    740:                        dsp_core.registers[DSP_REG_SSL] = dsp_core.stack[1][value];
                    741:                        return true;
                    742:                }
                    743:                if (arg[1]=='S' || arg[1]=='s') {
                    744:                        sp_value = dsp_core.registers[DSP_REG_SP] & BITMASK(4);
                    745:                        if (arg[2]=='H' || arg[2]=='h') {
                    746:                                if (sp_value == 0) {
                    747:                                        dsp_core.registers[DSP_REG_SSH] = 0;
                    748:                                        dsp_core.stack[0][sp_value] = 0;
                    749:                                } else {
                    750:                                        dsp_core.registers[DSP_REG_SSH] = value & BITMASK(16);
                    751:                                        dsp_core.stack[0][sp_value] = value & BITMASK(16);
                    752:                                }
                    753:                                return true;
                    754:                        }
                    755:                        if (arg[2]=='L' || arg[2]=='l') {
                    756:                                if (sp_value == 0) {
                    757:                                        dsp_core.registers[DSP_REG_SSL] = 0;
                    758:                                        dsp_core.stack[1][sp_value] = 0;
                    759:                                } else {
                    760:                                        dsp_core.registers[DSP_REG_SSL] = value & BITMASK(16);
                    761:                                        dsp_core.stack[1][sp_value] = value & BITMASK(16);
                    762:                                }
                    763:                                return true;
                    764:                        }
                    765:                }
                    766:        }
                    767: 
                    768:        /* ...then registers where address & mask are enough */
                    769:        bits = DSP_GetRegisterAddress(arg, &addr, &mask);
                    770:        switch (bits) {
                    771:        case 32:
                    772:                *addr = value & mask;
                    773:                return true;
                    774:        case 16:
                    775:                *(Uint16*)addr = value & mask;
                    776:                return true;
                    777:        }
                    778: #endif
                    779:        return false;
                    780: }
                    781: 
                    782: /**
                    783:  * Read SSI transmit value
                    784:  */
                    785: Uint32 DSP_SsiReadTxValue(void)
                    786: {
                    787: #if ENABLE_DSP_EMU
                    788:        return dsp_core.ssi.transmit_value;
                    789: #else
                    790:        return 0;
                    791: #endif
                    792: }
                    793: 
                    794: /**
                    795:  * Write SSI receive value
                    796:  */
                    797: void DSP_SsiWriteRxValue(Uint32 value)
                    798: {
                    799: #if ENABLE_DSP_EMU
                    800:        dsp_core.ssi.received_value = value & 0xffffff;
                    801: #endif
                    802: }
                    803: 
                    804: /**
                    805:  * Signal SSI clock tick to DSP
                    806:  */
                    807: 
                    808: void DSP_SsiReceive_SC0(void)
                    809: {
                    810: #if ENABLE_DSP_EMU
                    811:        dsp_core_ssi_Receive_SC0();
                    812: #endif
                    813: }
                    814: 
                    815: void DSP_SsiTransmit_SC0(void)
                    816: {
                    817: #if ENABLE_DSP_EMU
                    818: #endif
                    819: }
                    820: 
                    821: void DSP_SsiReceive_SC1(Uint32 FrameCounter)
                    822: {
                    823: #if ENABLE_DSP_EMU
                    824:        dsp_core_ssi_Receive_SC1(FrameCounter);
                    825: #endif
                    826: }
                    827: 
                    828: void DSP_SsiTransmit_SC1(void)
                    829: {
                    830: #if ENABLE_DSP_EMU
                    831: //     Crossbar_DmaPlayInHandShakeMode();
                    832: #endif
                    833: }
                    834: 
                    835: void DSP_SsiReceive_SC2(Uint32 FrameCounter)
                    836: {
                    837: #if ENABLE_DSP_EMU
                    838:        dsp_core_ssi_Receive_SC2(FrameCounter);
                    839: #endif
                    840: }
                    841: 
                    842: void DSP_SsiTransmit_SC2(Uint32 frame)
                    843: {
                    844: #if ENABLE_DSP_EMU
                    845: //     Crossbar_DmaRecordInHandShakeMode_Frame(frame);
                    846: #endif
                    847: }
                    848: 
                    849: void DSP_SsiReceive_SCK(void)
                    850: {
                    851: #if ENABLE_DSP_EMU
                    852:        dsp_core_ssi_Receive_SCK();
                    853: #endif
                    854: }
                    855: 
                    856: void DSP_SsiTransmit_SCK(void)
                    857: {
                    858: #if ENABLE_DSP_EMU
                    859: #endif
                    860: }
                    861: 
                    862: /**
                    863:  * Read access wrapper for ioMemTabFalcon (DSP Host port)
                    864:  * DSP Host interface port is accessed by the 68030 in Byte mode.
                    865:  * A move.w value,$ffA206 results in 2 bus access for the 68030.
                    866:  */
                    867: void DSP_HandleReadAccess(void)
                    868: {
                    869:        Uint32 addr;
                    870:        Uint8 value;
                    871:        bool multi_access = false; 
                    872:        
                    873:        for (addr = IoAccessBaseAddress; addr < IoAccessBaseAddress+nIoMemAccessSize; addr++)
                    874:        {
                    875: #if ENABLE_DSP_EMU
                    876:                value = dsp_core_read_host(addr-DSP_HW_OFFSET);
                    877: #else
                    878:                /* this value prevents TOS from hanging in the DSP init code */
                    879:                value = 0xff;
                    880: #endif
                    881:                if (multi_access == true)
                    882:                        M68000_AddCycles(4);
                    883:                multi_access = true;
                    884: 
                    885:                Dprintf(("HWget_b(0x%08x)=0x%02x at 0x%08x\n", addr, value, m68k_getpc()));
                    886:                IoMem_WriteByte(addr, value);
                    887:        }
                    888: }
                    889: 
                    890: /**
                    891:  * Write access wrapper for ioMemTabFalcon (DSP Host port)
                    892:  * DSP Host interface port is accessed by the 68030 in Byte mode.
                    893:  * A move.w value,$ffA206 results in 2 bus access for the 68030.
                    894:  */
                    895: void DSP_HandleWriteAccess(void)
                    896: {
                    897:        Uint32 addr;
                    898:        bool multi_access = false; 
                    899: 
                    900:        for (addr = IoAccessBaseAddress; addr < IoAccessBaseAddress+nIoMemAccessSize; addr++)
                    901:        {
                    902: #if ENABLE_DSP_EMU
                    903:                Uint8 value = IoMem_ReadByte(addr);
                    904:                Dprintf(("HWput_b(0x%08x,0x%02x) at 0x%08x\n", addr, value, m68k_getpc()));
                    905:                dsp_core_write_host(addr-DSP_HW_OFFSET, value);
                    906: #endif
                    907:                if (multi_access == true)
                    908:                        M68000_AddCycles(4);
                    909:                multi_access = true;
                    910:        }
                    911: }
                    912: 
                    913: 
                    914: 
                    915: /* Previous Register Access */
                    916: #define LOG_DSP_REG_LEVEL   LOG_DEBUG
                    917: 
                    918: #define IO_SEG_MASK    0x1FFFF
                    919: 
                    920: /* Register bits */
                    921: 
                    922: #define ICR_INIT    0x80
                    923: #define ICR_HM1     0x40
                    924: #define ICR_HM0     0x20
                    925: #define ICR_HF1     0x10
                    926: #define ICR_HF0     0x08
                    927: #define ICR_TREQ    0x02
                    928: #define ICR_RREQ    0x01
                    929: 
                    930: #define CVR_HC      0x80
                    931: #define CVR_HV      0x1F
                    932: 
                    933: #define ISR_HREQ    0x80
                    934: #define ISR_DMA     0x40
                    935: #define ISR_HF3     0x10
                    936: #define ISR_HF2     0x08
                    937: #define ISR_TRDY    0x04
                    938: #define ISR_TXDE    0x02
                    939: #define ISR_RXDF    0x01
                    940: 
                    941: 
                    942: void DSP_ICR_Read(void) { // 0x02008000
                    943: #if ENABLE_DSP_EMU
                    944:        if (bDspEmulated)
                    945:                IoMem[IoAccessCurrentAddress & IO_SEG_MASK] = dsp_core_read_host(CPU_HOST_ICR);
                    946:        else
                    947:                IoMem[IoAccessCurrentAddress & IO_SEG_MASK] = 0x7F;
                    948: #else
                    949:     IoMem[IoAccessCurrentAddress & IO_SEG_MASK] = 0x7F;
                    950: #endif
                    951:     Log_Printf(LOG_DSP_REG_LEVEL,"[DSP] ICR read at $%08x val=$%02x PC=$%08x\n", IoAccessCurrentAddress, IoMem[IoAccessCurrentAddress & IO_SEG_MASK], m68k_getpc());
                    952: }
                    953: 
                    954: void DSP_ICR_Write(void) {
                    955: #if ENABLE_DSP_EMU
                    956:        if (bDspEmulated)
                    957:                dsp_core_write_host(CPU_HOST_ICR, IoMem[IoAccessCurrentAddress & IO_SEG_MASK]);
                    958: #endif
                    959:     Log_Printf(LOG_DSP_REG_LEVEL,"[DSP] ICR write at $%08x val=$%02x PC=$%08x\n", IoAccessCurrentAddress, IoMem[IoAccessCurrentAddress & IO_SEG_MASK], m68k_getpc());
                    960: }
                    961: 
                    962: void DSP_CVR_Read(void) { // 0x02008001
                    963: #if ENABLE_DSP_EMU
                    964:        if (bDspEmulated)
                    965:                IoMem[IoAccessCurrentAddress & IO_SEG_MASK] = dsp_core_read_host(CPU_HOST_CVR);
                    966:        else
                    967:                IoMem[IoAccessCurrentAddress & IO_SEG_MASK] = 0xFF;
                    968: #else
                    969:     IoMem[IoAccessCurrentAddress & IO_SEG_MASK] = 0xFF;
                    970: #endif
                    971:     Log_Printf(LOG_DSP_REG_LEVEL,"[DSP] CVR read at $%08x val=$%02x PC=$%08x\n", IoAccessCurrentAddress, IoMem[IoAccessCurrentAddress & IO_SEG_MASK], m68k_getpc());
                    972: }
                    973: 
                    974: void DSP_CVR_Write(void) {
                    975: #if ENABLE_DSP_EMU
                    976:        if (bDspEmulated)
                    977:                dsp_core_write_host(CPU_HOST_CVR, IoMem[IoAccessCurrentAddress & IO_SEG_MASK]);
                    978: #endif
                    979:     Log_Printf(LOG_DSP_REG_LEVEL,"[DSP] CVR write at $%08x val=$%02x PC=$%08x\n", IoAccessCurrentAddress, IoMem[IoAccessCurrentAddress & IO_SEG_MASK], m68k_getpc());
                    980: }
                    981: 
                    982: void DSP_ISR_Read(void) { // 0x02008002
                    983: #if ENABLE_DSP_EMU
                    984:        if (bDspEmulated)
                    985:                IoMem[IoAccessCurrentAddress & IO_SEG_MASK] = dsp_core_read_host(CPU_HOST_ISR);
                    986:        else
                    987:                IoMem[IoAccessCurrentAddress & IO_SEG_MASK] = 0xFF;
                    988: #else
                    989:     IoMem[IoAccessCurrentAddress & IO_SEG_MASK] = 0xFF;
                    990: #endif
                    991:     Log_Printf(LOG_DSP_REG_LEVEL,"[DSP] ISR read at $%08x val=$%02x PC=$%08x\n", IoAccessCurrentAddress, IoMem[IoAccessCurrentAddress & IO_SEG_MASK], m68k_getpc());
                    992: }
                    993: 
                    994: void DSP_ISR_Write(void) {
                    995: #if ENABLE_DSP_EMU
                    996:        if (bDspEmulated)
                    997:                dsp_core_write_host(CPU_HOST_ISR, IoMem[IoAccessCurrentAddress & IO_SEG_MASK]);
                    998: #endif
                    999:     Log_Printf(LOG_DSP_REG_LEVEL,"[DSP] ISR write at $%08x val=$%02x PC=$%08x\n", IoAccessCurrentAddress, IoMem[IoAccessCurrentAddress & IO_SEG_MASK], m68k_getpc());
                   1000: }
                   1001: 
                   1002: void DSP_IVR_Read(void) { // 0x02008003
                   1003: #if ENABLE_DSP_EMU
                   1004:        if (bDspEmulated)
                   1005:                IoMem[IoAccessCurrentAddress & IO_SEG_MASK] = dsp_core_read_host(CPU_HOST_IVR);
                   1006:        else
                   1007:                IoMem[IoAccessCurrentAddress & IO_SEG_MASK] = 0xFF;
                   1008: #else
                   1009:     IoMem[IoAccessCurrentAddress & IO_SEG_MASK] = 0xFF;
                   1010: #endif
                   1011:     Log_Printf(LOG_DSP_REG_LEVEL,"[DSP] IVR read at $%08x val=$%02x PC=$%08x\n", IoAccessCurrentAddress, IoMem[IoAccessCurrentAddress & IO_SEG_MASK], m68k_getpc());
                   1012: }
                   1013: 
                   1014: void DSP_IVR_Write(void) {
                   1015: #if ENABLE_DSP_EMU
                   1016:        if (bDspEmulated)
                   1017:                dsp_core_write_host(CPU_HOST_IVR, IoMem[IoAccessCurrentAddress & IO_SEG_MASK]);
                   1018: #endif
                   1019:     Log_Printf(LOG_DSP_REG_LEVEL,"[DSP] IVR write at $%08x val=$%02x PC=$%08x\n", IoAccessCurrentAddress, IoMem[IoAccessCurrentAddress & IO_SEG_MASK], m68k_getpc());
                   1020: }
                   1021: 
                   1022: void DSP_Data0_Read(void) { // 0x02008004
                   1023: #if ENABLE_DSP_EMU
                   1024:        if (bDspEmulated)
                   1025:                IoMem[IoAccessCurrentAddress & IO_SEG_MASK] = dsp_core_read_host(CPU_HOST_TRX0);
                   1026:        else
                   1027:                IoMem[IoAccessCurrentAddress & IO_SEG_MASK] = 0x00;
                   1028: #else
                   1029:     IoMem[IoAccessCurrentAddress & IO_SEG_MASK] = 0x00;
                   1030: #endif
                   1031:     Log_Printf(LOG_DSP_REG_LEVEL,"[DSP] Data0 read at $%08x val=$%02x PC=$%08x\n", IoAccessCurrentAddress, IoMem[IoAccessCurrentAddress & IO_SEG_MASK], m68k_getpc());
                   1032: }
                   1033: 
                   1034: void DSP_Data0_Write(void) {
                   1035: #if ENABLE_DSP_EMU
                   1036:        if (bDspEmulated)
                   1037:                dsp_core_write_host(CPU_HOST_TRX0, IoMem[IoAccessCurrentAddress & IO_SEG_MASK]);
                   1038: #endif
                   1039:     Log_Printf(LOG_DSP_REG_LEVEL,"[DSP] Data0 write at $%08x val=$%02x PC=$%08x\n", IoAccessCurrentAddress, IoMem[IoAccessCurrentAddress & IO_SEG_MASK], m68k_getpc());
                   1040: }
                   1041: 
                   1042: void DSP_Data1_Read(void) { // 0x02008005
                   1043: #if ENABLE_DSP_EMU
                   1044:        if (bDspEmulated)
                   1045:                IoMem[IoAccessCurrentAddress & IO_SEG_MASK] = dsp_core_read_host(CPU_HOST_TRXH);
                   1046:        else
                   1047:                IoMem[IoAccessCurrentAddress & IO_SEG_MASK] = 0x00;
                   1048: #else
                   1049:     IoMem[IoAccessCurrentAddress & IO_SEG_MASK] = 0x00;
                   1050: #endif
                   1051:     Log_Printf(LOG_DSP_REG_LEVEL,"[DSP] Data1 read at $%08x val=$%02x PC=$%08x\n", IoAccessCurrentAddress, IoMem[IoAccessCurrentAddress & IO_SEG_MASK], m68k_getpc());
                   1052: }
                   1053: 
                   1054: void DSP_Data1_Write(void) {
                   1055: #if ENABLE_DSP_EMU
                   1056:        if (bDspEmulated)
                   1057:                dsp_core_write_host(CPU_HOST_TRXH, IoMem[IoAccessCurrentAddress & IO_SEG_MASK]);
                   1058: #endif
                   1059:     Log_Printf(LOG_DSP_REG_LEVEL,"[DSP] Data1 write at $%08x val=$%02x PC=$%08x\n", IoAccessCurrentAddress, IoMem[IoAccessCurrentAddress & IO_SEG_MASK], m68k_getpc());
                   1060: }
                   1061: 
                   1062: void DSP_Data2_Read(void) { // 0x02008006
                   1063: #if ENABLE_DSP_EMU
                   1064:        if (bDspEmulated)
                   1065:                IoMem[IoAccessCurrentAddress & IO_SEG_MASK] = dsp_core_read_host(CPU_HOST_TRXM);
                   1066:        else
                   1067:                IoMem[IoAccessCurrentAddress & IO_SEG_MASK] = 0x00;
                   1068: #else
                   1069:     IoMem[IoAccessCurrentAddress & IO_SEG_MASK] = 0x00;
                   1070: #endif
                   1071:     Log_Printf(LOG_DSP_REG_LEVEL,"[DSP] Data2 read at $%08x val=$%02x PC=$%08x\n", IoAccessCurrentAddress, IoMem[IoAccessCurrentAddress & IO_SEG_MASK], m68k_getpc());
                   1072: }
                   1073: 
                   1074: void DSP_Data2_Write(void) {
                   1075: #if ENABLE_DSP_EMU
                   1076:        if (bDspEmulated)
                   1077:                dsp_core_write_host(CPU_HOST_TRXM, IoMem[IoAccessCurrentAddress & IO_SEG_MASK]);
                   1078: #endif
                   1079:     Log_Printf(LOG_DSP_REG_LEVEL,"[DSP] Data2 write at $%08x val=$%02x PC=$%08x\n", IoAccessCurrentAddress, IoMem[IoAccessCurrentAddress & IO_SEG_MASK], m68k_getpc());
                   1080: }
                   1081: 
                   1082: void DSP_Data3_Read(void) { // 0x02008007
                   1083: #if ENABLE_DSP_EMU
                   1084:        if (bDspEmulated)
                   1085:                IoMem[IoAccessCurrentAddress & IO_SEG_MASK] = dsp_core_read_host(CPU_HOST_TRXL);
                   1086:        else
                   1087:                IoMem[IoAccessCurrentAddress & IO_SEG_MASK] = 0x00;
                   1088: #else
                   1089:     IoMem[IoAccessCurrentAddress & IO_SEG_MASK] = 0x00;
                   1090: #endif
                   1091:     Log_Printf(LOG_DSP_REG_LEVEL,"[DSP] Data3 read at $%08x val=$%02x PC=$%08x\n", IoAccessCurrentAddress, IoMem[IoAccessCurrentAddress & IO_SEG_MASK], m68k_getpc());
                   1092: }
                   1093: 
                   1094: void DSP_Data3_Write(void) {
                   1095: #if ENABLE_DSP_EMU
                   1096:        if (bDspEmulated)
                   1097:                dsp_core_write_host(CPU_HOST_TRXL, IoMem[IoAccessCurrentAddress & IO_SEG_MASK]);
                   1098: #endif
                   1099:     Log_Printf(LOG_DSP_REG_LEVEL,"[DSP] Data3 write at $%08x val=$%02x PC=$%08x\n", IoAccessCurrentAddress, IoMem[IoAccessCurrentAddress & IO_SEG_MASK], m68k_getpc());
                   1100: }

unix.superglobalmegacorp.com

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