diff --git a/hw/xbox/dsp/dsp_dma.c b/hw/xbox/dsp/dsp_dma.c index 66b9001eac..1ce35be980 100644 --- a/hw/xbox/dsp/dsp_dma.c +++ b/hw/xbox/dsp/dsp_dma.c @@ -54,6 +54,38 @@ # define DPRINTF(s, ...) do { } while (0) #endif +#ifdef DEBUG +const char *buffer_names[] = { + "fifo0", /* 0x0 */ + "fifo1", /* 0x1 */ + "fifo2", /* 0x2 */ + "fifo3", /* 0x3 */ + "", /* 0x4 */ + "", /* 0x5 */ + "", /* 0x6 */ + "", /* 0x7 */ + "", /* 0x8 */ + "", /* 0x9 */ + "", /* 0xA */ + "", /* 0xB */ + "", /* 0xC */ + "", /* 0xD */ + "scratch-circular", /* 0xE */ + "scratch" /* 0xF */ +}; + +const char *format_names[] = { + "8 bit", /* 0x0 */ + "16 bit", /* 0x1 */ + "24 bit msb", /* 0x2 */ + "32 bit", /* 0x3 */ + "", /* 0x4 */ + "", /* 0x5 */ + "24 bit lsb", /* 0x6 */ + "" /* 0x7 */ +}; +#endif + static void dsp_dma_run(DSPDMAState *s) { if (!(s->control & DMA_CONTROL_RUNNING) @@ -92,10 +124,9 @@ static void dsp_dma_run(DSPDMAState *s) assert(unk2 == 0x0); assert(unk13 == false); - DPRINTF("\n\n\nDMA addr %x, control %x, count %x, " - "dsp_offset %x, scratch_offset %x, base %x, size %x\n\n\n", - addr, control, count, dsp_offset, - scratch_offset, scratch_base, scratch_size); + /* Decode count for interleaved mode */ + uint32_t channel_count = (count & 0xF) + 1; + uint32_t block_count = count >> 4; unsigned int item_size; uint32_t item_mask = 0xffffffff; @@ -148,6 +179,48 @@ static void dsp_dma_run(DSPDMAState *s) assert(false); } +#ifdef DEBUG + char dsp_space_name = '?'; + if (mem_space == DSP_SPACE_X) { + dsp_space_name = 'x'; + } else if (mem_space == DSP_SPACE_Y) { + dsp_space_name = 'y'; + } else if (mem_space == DSP_SPACE_P) { + dsp_space_name = 'p'; + } +#endif + + DPRINTF("dsp dma block x:$%x (%s)\n" + " next-block x:$%x%s\n" + " control 0x%06x:\n" + " dsp-interleave %d\n" + " buffer-offset-writeback %d\n" + " buffer 0x%x (%s)\n" + " unk9 %d\n" + " sample-format 0x%x (%s)\n" + " dsp-step 0x%x\n" + " sample-count 0x%x\n" + " block-count 0x%x channel-count %d\n" + " dsp-address 0x%x (%c:$%x)\n" + " buffer-offset 0x%x (+ buffer-base 0x%x = 0x%zx)\n" + " buffer-size 0x%x\n", + addr, direction ? "dsp -> buffer" : "buffer -> dsp", + next_block & NODE_POINTER_VAL, s->eol ? " (eol)" : "", + control, + dsp_interleave, + buffer_offset_writeback, + buf_id, buffer_names[buf_id], + unk9, + format, format_names[format], + dsp_step, + count, + block_count, + channel_count, + dsp_offset, dsp_space_name, mem_address, + scratch_offset, scratch_base, scratch_addr, + scratch_size); + + uint8_t* scratch_buf = calloc(count, item_size); if (direction) {