--- hatari/src/falcon/dsp.c 2019/04/09 08:49:37 1.1.1.5 +++ hatari/src/falcon/dsp.c 2019/04/09 08:51:17 1.1.1.7 @@ -28,6 +28,7 @@ #include "dsp.h" #include "crossbar.h" #include "configuration.h" +#include "cycInt.h" #if ENABLE_DSP_EMU #include "m68000.h" @@ -54,6 +55,15 @@ static bool bDspDebugging; bool bDspEnabled = false; bool bDspHostInterruptPending = false; +static const char* x_ext_memory_addr_name[] = { + "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", + "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", + "PBC", "PCC", "PBDDR", "PCDDR", "PBD", "PCD", "", "", + "HCR", "HSR", "", "HRX/HTX", "CRA", "CRB", "SSISR/TSR", "RX/TX", + "SCR", "SSR", "SCCR", "STXA", "SRX/STX", "SRX/STX", "SRX/STX", "", + "", "", "", "", "", "", "BCR", "IPR" +}; + /** * Trigger HREQ interrupt at the host CPU. @@ -314,7 +324,7 @@ Uint16 DSP_DisasmMemory(Uint16 dsp_memdu for (mem = dsp_memdump_addr; mem <= dsp_memdump_upper; mem++) { /* special printing of host communication/transmit registers */ - if (space == 'X' && (mem == 0xffeb || mem == 0xffef)) { + if (space == 'X' && mem >= 0xffc0) { if (mem == 0xffeb) { fprintf(stderr,"X periph:%04x HTX : %06x RTX:%06x\n", mem, dsp_core.dsp_host_htx, dsp_core.dsp_host_rtx); @@ -323,6 +333,10 @@ Uint16 DSP_DisasmMemory(Uint16 dsp_memdu fprintf(stderr,"X periph:%04x SSI TX : %06x SSI RX:%06x\n", mem, dsp_core.ssi.transmit_value, dsp_core.ssi.received_value); } + else { + value = DSP_ReadMemory(mem, space, &mem_str); + fprintf(stderr,"%s:%04x %06x\t%s\n", mem_str, mem, value, x_ext_memory_addr_name[mem-0xffc0]); + } continue; } /* special printing of X & Y external RAM values */ @@ -642,15 +656,22 @@ void DSP_SsiTransmit_SCK(void) /** * Read access wrapper for ioMemTabFalcon (DSP Host port) + * DSP Host interface port is accessed by the 68030 in Byte mode. + * A move.w value,$ffA206 results in 2 bus access for the 68030. */ void DSP_HandleReadAccess(void) { Uint32 addr; Uint8 value; + bool multi_access = false; + for (addr = IoAccessBaseAddress; addr < IoAccessBaseAddress+nIoMemAccessSize; addr++) { #if ENABLE_DSP_EMU value = dsp_core_read_host(addr-DSP_HW_OFFSET); + if (multi_access == true) + M68000_AddCycles(4); + multi_access = true; #else /* this value prevents TOS from hanging in the DSP init code */ value = 0xff; @@ -663,17 +684,24 @@ void DSP_HandleReadAccess(void) /** * Write access wrapper for ioMemTabFalcon (DSP Host port) + * DSP Host interface port is accessed by the 68030 in Byte mode. + * A move.w value,$ffA206 results in 2 bus access for the 68030. */ void DSP_HandleWriteAccess(void) { Uint32 addr; Uint8 value; + bool multi_access = false; + for (addr = IoAccessBaseAddress; addr < IoAccessBaseAddress+nIoMemAccessSize; addr++) { value = IoMem_ReadByte(addr); Dprintf(("HWput_b(0x%08x,0x%02x) at 0x%08x\n", addr, value, m68k_getpc())); #if ENABLE_DSP_EMU dsp_core_write_host(addr-DSP_HW_OFFSET, value); + if (multi_access == true) + M68000_AddCycles(4); + multi_access = true; #endif } }