X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=libpcsxcore%2Fpsxhw.c;fp=libpcsxcore%2Fpsxhw.c;h=b96db97adb72da2d0c7ec5a5b2028b7227c0a0df;hp=678811243e40d28db1e6b4906900997fdd1ac115;hb=0e067f5504ef81074ecc435b3493e8190c84c0ea;hpb=8295d332b43963ebba54f3ad74388aaaeb11a789 diff --git a/libpcsxcore/psxhw.c b/libpcsxcore/psxhw.c index 67881124..b96db97a 100644 --- a/libpcsxcore/psxhw.c +++ b/libpcsxcore/psxhw.c @@ -60,22 +60,31 @@ void psxHwWriteImask(u32 value) psxRegs.CP0.n.Cause |= 0x400; } -#define make_dma_func(n) \ +#define make_dma_func(n, abort_func) \ void psxHwWriteChcr##n(u32 value) \ { \ - if (value & SWAPu32(HW_DMA##n##_CHCR) & 0x01000000) \ - log_unhandled("dma" #n " %08x -> %08x\n", HW_DMA##n##_CHCR, value); \ + u32 old = SWAPu32(HW_DMA##n##_CHCR); \ + if (n == 6) { value &= 0x51000002; value |= 2; } \ + else { value &= 0x71770703; } \ + if (value == old) \ + return; \ + if (old & 0x01000000) \ + log_unhandled("%u dma" #n " %08x -> %08x\n", psxRegs.cycle, old, value); \ HW_DMA##n##_CHCR = SWAPu32(value); \ - if (value & 0x01000000 && SWAPu32(HW_DMA_PCR) & (8u << (n * 4))) \ - psxDma##n(SWAPu32(HW_DMA##n##_MADR), SWAPu32(HW_DMA##n##_BCR), value); \ + if ((value ^ old) & 0x01000000) { \ + if (!(value & 0x01000000)) \ + abort_func; \ + else if (SWAPu32(HW_DMA_PCR) & (8u << (n * 4))) \ + psxDma##n(SWAPu32(HW_DMA##n##_MADR), SWAPu32(HW_DMA##n##_BCR), value); \ + } \ } -make_dma_func(0) -make_dma_func(1) -make_dma_func(2) -make_dma_func(3) -make_dma_func(4) -make_dma_func(6) +make_dma_func(0,) +make_dma_func(1,) +make_dma_func(2, psxAbortDma2()) +make_dma_func(3,) +make_dma_func(4,) +make_dma_func(6,) void psxHwWriteDmaIcr32(u32 value) {