X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=pico%2F32x%2Fsh2soc.c;h=2d5a6dce3221292295499e8ee0f293c6c0a67fe1;hb=7eaa381224c5b50b90f39938be2e298a322b6f9f;hp=8b97153520a7d25c05bbcf3a80d8a579c7217bda;hpb=cd0ace2832b2088e5a973a50ebbab6e57c56b91f;p=picodrive.git diff --git a/pico/32x/sh2soc.c b/pico/32x/sh2soc.c index 8b97153..2d5a6dc 100644 --- a/pico/32x/sh2soc.c +++ b/pico/32x/sh2soc.c @@ -360,13 +360,13 @@ void sh2_peripheral_write32(u32 a, u32 d, SH2 *sh2) /* 32X specific */ static void dreq0_do(SH2 *sh2, struct dma_chan *chan) { - unsigned short *dreqlen = &Pico32x.regs[0x10 / 2]; + unsigned short dreqlen = Pico32x.regs[0x10 / 2]; int i; // debug/sanity checks - if (chan->tcr != *dreqlen) - elprintf(EL_32XP|EL_ANOMALY, "dreq0: tcr0 and len differ: %d != %d", - chan->tcr, *dreqlen); + if (chan->tcr < dreqlen || chan->tcr > dreqlen + 4) + elprintf(EL_32XP|EL_ANOMALY, "dreq0: tcr0/len inconsistent: %d/%d", + chan->tcr, dreqlen); // note: DACK is not connected, single addr mode should not be used if ((chan->chcr & 0x3f08) != 0x0400) elprintf(EL_32XP|EL_ANOMALY, "dreq0: bad control: %04x", chan->chcr); @@ -377,12 +377,11 @@ static void dreq0_do(SH2 *sh2, struct dma_chan *chan) sh2->state |= SH2_STATE_SLEEP; for (i = 0; i < Pico32x.dmac0_fifo_ptr && chan->tcr > 0; i++) { - elprintf(EL_32XP, "dmaw [%08x] %04x, left %d", - chan->dar, Pico32x.dmac_fifo[i], *dreqlen); + elprintf(EL_32XP, "dreq0 [%08x] %04x, dreq_len %d", + chan->dar, Pico32x.dmac_fifo[i], dreqlen); p32x_sh2_write16(chan->dar, Pico32x.dmac_fifo[i], sh2); chan->dar += 2; chan->tcr--; - (*dreqlen)--; } if (Pico32x.dmac0_fifo_ptr != i) @@ -391,8 +390,6 @@ static void dreq0_do(SH2 *sh2, struct dma_chan *chan) Pico32x.dmac0_fifo_ptr -= i; Pico32x.regs[6 / 2] &= ~P32XS_FULL; - if (*dreqlen == 0) - Pico32x.regs[6 / 2] &= ~P32XS_68S; // transfer complete if (chan->tcr == 0) dmac_transfer_complete(sh2, chan); else