From 112be4b57e979f3575bb450292c254c98f8378b4 Mon Sep 17 00:00:00 2001 From: "Joseph C. Osborn" Date: Wed, 6 Nov 2019 16:02:50 -0800 Subject: [PATCH 1/2] Memory map some PPU buffers with 1 << 31 mask Except 4 PPU register bytes starting at $2000 --- src/drivers/libretro/libretro.c | 82 +++++++++++++++++++++++++++------ 1 file changed, 67 insertions(+), 15 deletions(-) diff --git a/src/drivers/libretro/libretro.c b/src/drivers/libretro/libretro.c index 342902a..3f335c7 100644 --- a/src/drivers/libretro/libretro.c +++ b/src/drivers/libretro/libretro.c @@ -85,6 +85,10 @@ static unsigned show_advance_sound_options; /* emulator-specific variables */ +const size_t PPU_BIT = 1ULL << 31ULL; + +extern uint8 NTARAM[0x800], PALRAM[0x20], SPRAM[0x100], PPU[4]; + /* overclock the console by adding dummy scanlines to PPU loop * disables DMC DMA and WaveHi filling for these dummies * doesn't work with new PPU */ @@ -2090,8 +2094,9 @@ bool retro_load_game(const struct retro_game_info *game) { 0 }, }; - - struct retro_memory_descriptor descs[64]; + size_t desc_base = 64; + size_t desc_count = desc_base+4; + struct retro_memory_descriptor descs[desc_count]; struct retro_memory_map mmaps; if (!game) @@ -2188,18 +2193,66 @@ bool retro_load_game(const struct retro_game_info *game) memset(descs, 0, sizeof(descs)); i = 0; - for (j = 0; j < 64; j++) - { - if (MMapPtrs[j] != NULL) - { - descs[i].ptr = MMapPtrs[j]; - descs[i].start = j * 1024; - descs[i].len = 1024; - descs[i].select = 0; - i++; - } - } - + for (j = 0; j < desc_base; j++) + { + if (MMapPtrs[j] != NULL) + { + descs[i].ptr = MMapPtrs[j]; + descs[i].start = j * 1024; + descs[i].len = 1024; + descs[i].select = 0; + i++; + } + } + // This doesn't map in 2004--2007 but those aren't really + // worthwhile to read from on a vblank anyway + descs[i].flags = 0; + descs[i].ptr = PPU; + descs[i].offset = 0; + descs[i].start = 0x2000; + descs[i].select = 0; + descs[i].disconnect = 0; + descs[i].len = 4; + descs[i].addrspace="PPUREG"; + i++; + // In the future, it would be good to map pattern tables 1 and 2, + // but these must be remapped often + /* descs[i] = (struct retro_memory_descriptor){0, ????, 0, 0x0000 | PPU_BIT, PPU_BIT, PPU_BIT, 0x1000, "PAT0"}; */ + /* i++; */ + /* descs[i] = (struct retro_memory_descriptor){0, ????, 0, 0x1000 | PPU_BIT, PPU_BIT, PPU_BIT, 0x1000, "PAT1"}; */ + /* i++; */ + // Likewise it would be better to use "vnapage" for this but + // RetroArch API is inconvenient for handles like that, so we'll + // just blithely assume the client will handle mapping and that + // we'll ignore those carts that have extra NTARAM. + descs[i].flags = 0; + descs[i].ptr = NTARAM; + descs[i].offset = 0; + descs[i].start = PPU_BIT | 0x2000; + descs[i].select = PPU_BIT; + descs[i].disconnect = PPU_BIT; + descs[i].len = 0x0800; + descs[i].addrspace="NTARAM"; + i++; + descs[i].flags = 0; + descs[i].ptr = PALRAM; + descs[i].offset = 0; + descs[i].start = PPU_BIT | 0x3000; + descs[i].select = PPU_BIT; + descs[i].disconnect = PPU_BIT; + descs[i].len = 0x020; + descs[i].addrspace="PALRAM"; + i++; + // OAM doesn't really live anywhere in address space so I'll put it at 0x4000. + descs[i].flags = 0; + descs[i].ptr = SPRAM; + descs[i].offset = 0; + descs[i].start = PPU_BIT | 0x4000; + descs[i].select = PPU_BIT; + descs[i].disconnect = PPU_BIT; + descs[i].len = 0x100; + descs[i].addrspace="OAM"; + i++; mmaps.descriptors = descs; mmaps.num_descriptors = i; environ_cb(RETRO_ENVIRONMENT_SET_MEMORY_MAPS, &mmaps); @@ -2289,4 +2342,3 @@ size_t retro_get_memory_size(unsigned type) return size; } - From dbcfcc574a96c51d643818078745bc7e3722540a Mon Sep 17 00:00:00 2001 From: "Joseph C. Osborn" Date: Wed, 6 Nov 2019 16:06:09 -0800 Subject: [PATCH 2/2] Put back some formatting --- src/drivers/libretro/libretro.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/drivers/libretro/libretro.c b/src/drivers/libretro/libretro.c index 3f335c7..1966ba9 100644 --- a/src/drivers/libretro/libretro.c +++ b/src/drivers/libretro/libretro.c @@ -2194,16 +2194,16 @@ bool retro_load_game(const struct retro_game_info *game) i = 0; for (j = 0; j < desc_base; j++) - { + { if (MMapPtrs[j] != NULL) - { - descs[i].ptr = MMapPtrs[j]; - descs[i].start = j * 1024; - descs[i].len = 1024; - descs[i].select = 0; - i++; - } - } + { + descs[i].ptr = MMapPtrs[j]; + descs[i].start = j * 1024; + descs[i].len = 1024; + descs[i].select = 0; + i++; + } + } // This doesn't map in 2004--2007 but those aren't really // worthwhile to read from on a vblank anyway descs[i].flags = 0;