mirror of https://github.com/mgba-emu/mgba.git
DS DMA: Ignore, not block, ITCM DMAs
This commit is contained in:
parent
2e4597c0e8
commit
12b44599ad
26
src/ds/dma.c
26
src/ds/dma.c
|
@ -37,11 +37,6 @@ void DSDMAReset(struct DSCommon* dscore) {
|
||||||
dscore->memory.activeDMA = -1;
|
dscore->memory.activeDMA = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool _isValidDMADAD(int dma, uint32_t address) {
|
|
||||||
UNUSED(dma);
|
|
||||||
return address >= DS_BASE_RAM;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t DSDMAWriteSAD(struct DSCommon* dscore, int dma, uint32_t address) {
|
uint32_t DSDMAWriteSAD(struct DSCommon* dscore, int dma, uint32_t address) {
|
||||||
address &= 0x0FFFFFFE;
|
address &= 0x0FFFFFFE;
|
||||||
dscore->memory.dma[dma].source = address;
|
dscore->memory.dma[dma].source = address;
|
||||||
|
@ -50,9 +45,7 @@ uint32_t DSDMAWriteSAD(struct DSCommon* dscore, int dma, uint32_t address) {
|
||||||
|
|
||||||
uint32_t DSDMAWriteDAD(struct DSCommon* dscore, int dma, uint32_t address) {
|
uint32_t DSDMAWriteDAD(struct DSCommon* dscore, int dma, uint32_t address) {
|
||||||
address &= 0x0FFFFFFE;
|
address &= 0x0FFFFFFE;
|
||||||
if (_isValidDMADAD(dma, address)) {
|
dscore->memory.dma[dma].dest = address;
|
||||||
dscore->memory.dma[dma].dest = address;
|
|
||||||
}
|
|
||||||
return dscore->memory.dma[dma].dest;
|
return dscore->memory.dma[dma].dest;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -217,6 +210,7 @@ void DSDMAService(struct DSCommon* dscore, int number, struct GBADMA* info) {
|
||||||
int32_t cycles = 2;
|
int32_t cycles = 2;
|
||||||
|
|
||||||
if (info->count == info->nextCount) {
|
if (info->count == info->nextCount) {
|
||||||
|
// TODO: This probably uses bus timings instead of TCM timings for inaccessible TCM
|
||||||
if (width == 4) {
|
if (width == 4) {
|
||||||
cycles += dscore->memory.waitstatesNonseq32[sourceRegion] + dscore->memory.waitstatesNonseq32[destRegion];
|
cycles += dscore->memory.waitstatesNonseq32[sourceRegion] + dscore->memory.waitstatesNonseq32[destRegion];
|
||||||
} else {
|
} else {
|
||||||
|
@ -233,13 +227,15 @@ void DSDMAService(struct DSCommon* dscore, int number, struct GBADMA* info) {
|
||||||
}
|
}
|
||||||
info->when += cycles;
|
info->when += cycles;
|
||||||
|
|
||||||
uint32_t word;
|
if (source >= DS_BASE_RAM) {
|
||||||
if (width == 4) {
|
uint32_t word;
|
||||||
word = cpu->memory.load32(cpu, source, 0);
|
if (width == 4) {
|
||||||
cpu->memory.store32(cpu, dest, word, 0);
|
word = cpu->memory.load32(cpu, source, 0);
|
||||||
} else {
|
cpu->memory.store32(cpu, dest, word, 0);
|
||||||
word = cpu->memory.load16(cpu, source, 0);
|
} else {
|
||||||
cpu->memory.store16(cpu, dest, word, 0);
|
word = cpu->memory.load16(cpu, source, 0);
|
||||||
|
cpu->memory.store16(cpu, dest, word, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
int sourceOffset = DMA_OFFSET[GBADMARegisterGetSrcControl(info->reg)] * width;
|
int sourceOffset = DMA_OFFSET[GBADMARegisterGetSrcControl(info->reg)] * width;
|
||||||
int destOffset = DMA_OFFSET[GBADMARegisterGetDestControl(info->reg)] * width;
|
int destOffset = DMA_OFFSET[GBADMARegisterGetDestControl(info->reg)] * width;
|
||||||
|
|
Loading…
Reference in New Issue