diff --git a/CHANGES b/CHANGES index 86ea3ef60..006db1256 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,7 @@ Emulation fixes: - ARM: Fix ALU reading PC after shifting - ARM: Fix STR storing PC after address calculation - GB: Partially fix timing for skipped BIOS + - GB Memory: Fix OAM DMA from top 8 kB - GB MBC: Fix MBC1 mode changing behavior - GB MBC: Fix MBC1 RAM enable bit selection - GB MBC: Fix MBC2 bit selection diff --git a/cinema/gb/mooneye-gb/acceptance/oam_dma/sources-GS/baseline_0000.png b/cinema/gb/mooneye-gb/acceptance/oam_dma/sources-GS/baseline_0000.png new file mode 100644 index 000000000..f9e5e47b5 Binary files /dev/null and b/cinema/gb/mooneye-gb/acceptance/oam_dma/sources-GS/baseline_0000.png differ diff --git a/cinema/gb/mooneye-gb/acceptance/oam_dma/sources-GS/config.ini b/cinema/gb/mooneye-gb/acceptance/oam_dma/sources-GS/config.ini deleted file mode 100644 index 7ddee425b..000000000 --- a/cinema/gb/mooneye-gb/acceptance/oam_dma/sources-GS/config.ini +++ /dev/null @@ -1,2 +0,0 @@ -[testinfo] -fail=1 diff --git a/src/gb/io.c b/src/gb/io.c index 134454e12..45b358146 100644 --- a/src/gb/io.c +++ b/src/gb/io.c @@ -193,7 +193,7 @@ void GBIOReset(struct GB* gb) { GBIOWrite(gb, REG_SCY, 0x00); GBIOWrite(gb, REG_SCX, 0x00); GBIOWrite(gb, REG_LYC, 0x00); - GBIOWrite(gb, REG_DMA, 0xFF); + gb->memory.io[REG_DMA] = 0xFF; GBIOWrite(gb, REG_BGP, 0xFC); if (gb->model < GB_MODEL_CGB) { GBIOWrite(gb, REG_OBP0, 0xFF); diff --git a/src/gb/memory.c b/src/gb/memory.c index 36d083df0..b070ff601 100644 --- a/src/gb/memory.c +++ b/src/gb/memory.c @@ -519,8 +519,8 @@ uint8_t GBView8(struct SM83Core* cpu, uint16_t address, int segment) { } void GBMemoryDMA(struct GB* gb, uint16_t base) { - if (base > 0xF100) { - return; + if (base >= 0xE000) { + base &= 0xDFFF; } mTimingDeschedule(&gb->timing, &gb->memory.dmaEvent); mTimingSchedule(&gb->timing, &gb->memory.dmaEvent, 8);