make dma honour banking

I was sure I had it done before, turns out not.
This commit is contained in:
notaz 2017-09-22 02:16:15 +03:00
parent 6a47c2d4fb
commit 7feeb88062
2 changed files with 14 additions and 2 deletions

View file

@ -133,6 +133,17 @@ void name(u32 a, u32 d) \
} \ } \
} }
static __inline void *m68k_dma_source(u32 a)
{
uptr v;
a &= 0x00fffffe;
v = m68k_read16_map[a >> M68K_MEM_SHIFT];
if (map_flag_set(v))
return NULL;
else
return (void *)((v << 1) + a);
}
// 32x // 32x
typedef struct { typedef struct {
uptr addr; // stores (membase >> 1) or ((handler >> 1) | (1<<31)) uptr addr; // stores (membase >> 1) or ((handler >> 1) | (1<<31))

View file

@ -8,6 +8,7 @@
*/ */
#include "pico_int.h" #include "pico_int.h"
#include "memory.h"
int line_base_cycles; int line_base_cycles;
extern const unsigned char hcounts_32[]; extern const unsigned char hcounts_32[];
@ -134,10 +135,10 @@ static void DmaSlow(int len)
// if we have DmaHook, let it handle ROM because of possible DMA delay // if we have DmaHook, let it handle ROM because of possible DMA delay
if (PicoDmaHook && PicoDmaHook(source, len, &pd, &pdend)); if (PicoDmaHook && PicoDmaHook(source, len, &pd, &pdend));
else if (source<Pico.romsize) { // Rom else if (source<Pico.romsize) { // Rom
pd=(u16 *)(Pico.rom+(source&~1)); pd=m68k_dma_source(source);
pdend=(u16 *)(Pico.rom+Pico.romsize); pdend=(u16 *)(Pico.rom+Pico.romsize);
} }
else { if (!pd) {
elprintf(EL_VDPDMA|EL_ANOMALY, "DmaSlow[%i] %06x->%04x: invalid src", Pico.video.type, source, a); elprintf(EL_VDPDMA|EL_ANOMALY, "DmaSlow[%i] %06x->%04x: invalid src", Pico.video.type, source, a);
return; return;
} }