Libretro: Add memory descriptors for GB/GBC
This commit is contained in:
parent
bb64e8d8d6
commit
6ef938fc52
|
@ -226,24 +226,48 @@ static size_t rtcdata_size(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void* wram_ptr(void)
|
||||||
|
{
|
||||||
|
if (type == IMAGE_GBA)
|
||||||
|
return workRAM;
|
||||||
|
if (type == IMAGE_GB) {
|
||||||
|
// this does not work with retro_get_memory_data/size
|
||||||
|
// with its current memory mapping
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static size_t wram_size(void)
|
||||||
|
{
|
||||||
|
if (type == IMAGE_GBA)
|
||||||
|
return 0x40000;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void* vram_ptr(void)
|
||||||
|
{
|
||||||
|
if (type == IMAGE_GBA)
|
||||||
|
return vram;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static size_t vram_size(void)
|
||||||
|
{
|
||||||
|
if (type == IMAGE_GBA)
|
||||||
|
return 0x20000;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void* retro_get_memory_data(unsigned id)
|
void* retro_get_memory_data(unsigned id)
|
||||||
{
|
{
|
||||||
if (id == RETRO_MEMORY_SAVE_RAM)
|
if (id == RETRO_MEMORY_SAVE_RAM)
|
||||||
return savedata_ptr();
|
return savedata_ptr();
|
||||||
if (id == RETRO_MEMORY_RTC)
|
if (id == RETRO_MEMORY_RTC)
|
||||||
return rtcdata_ptr();
|
return rtcdata_ptr();
|
||||||
if (id == RETRO_MEMORY_SYSTEM_RAM) {
|
if (id == RETRO_MEMORY_SYSTEM_RAM)
|
||||||
if (type == IMAGE_GBA)
|
return wram_ptr();
|
||||||
return workRAM;
|
if (id == RETRO_MEMORY_VIDEO_RAM)
|
||||||
if (type == IMAGE_GB) {
|
return vram_ptr();
|
||||||
}
|
|
||||||
}
|
|
||||||
if (id == RETRO_MEMORY_VIDEO_RAM) {
|
|
||||||
if (type == IMAGE_GBA)
|
|
||||||
return vram;
|
|
||||||
if (type == IMAGE_GB) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -253,18 +277,10 @@ size_t retro_get_memory_size(unsigned id)
|
||||||
return savedata_size();
|
return savedata_size();
|
||||||
if (id == RETRO_MEMORY_RTC)
|
if (id == RETRO_MEMORY_RTC)
|
||||||
return rtcdata_size();
|
return rtcdata_size();
|
||||||
if (id == RETRO_MEMORY_SYSTEM_RAM) {
|
if (id == RETRO_MEMORY_SYSTEM_RAM)
|
||||||
if (type == IMAGE_GBA)
|
return wram_size();
|
||||||
return 0x40000;
|
if (id == RETRO_MEMORY_VIDEO_RAM)
|
||||||
if (type == IMAGE_GB) {
|
return vram_size();
|
||||||
}
|
|
||||||
}
|
|
||||||
if (id == RETRO_MEMORY_VIDEO_RAM) {
|
|
||||||
if (type == IMAGE_GBA)
|
|
||||||
return 0x20000;
|
|
||||||
if (type == IMAGE_GB) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -540,8 +556,6 @@ static void gba_init(void)
|
||||||
{
|
{
|
||||||
log("Loading VBA-M Core (GBA)...\n");
|
log("Loading VBA-M Core (GBA)...\n");
|
||||||
|
|
||||||
update_colormaps();
|
|
||||||
|
|
||||||
load_image_preferences();
|
load_image_preferences();
|
||||||
|
|
||||||
saveType = cpuSaveType;
|
saveType = cpuSaveType;
|
||||||
|
@ -553,8 +567,6 @@ static void gba_init(void)
|
||||||
rtcEnableRumble(!rtcEnabled);
|
rtcEnableRumble(!rtcEnabled);
|
||||||
|
|
||||||
doMirroring(mirroringEnable);
|
doMirroring(mirroringEnable);
|
||||||
|
|
||||||
soundInit();
|
|
||||||
soundSetSampleRate(SampleRate);
|
soundSetSampleRate(SampleRate);
|
||||||
|
|
||||||
if (usebios) {
|
if (usebios) {
|
||||||
|
@ -563,16 +575,14 @@ static void gba_init(void)
|
||||||
}
|
}
|
||||||
CPUInit(biosfile, usebios);
|
CPUInit(biosfile, usebios);
|
||||||
|
|
||||||
|
width = GBAWidth;
|
||||||
|
height = GBAHeight;
|
||||||
|
|
||||||
// CPUReset() will reset eepromSize to 512.
|
// CPUReset() will reset eepromSize to 512.
|
||||||
// Save current eepromSize override then restore after CPUReset()
|
// Save current eepromSize override then restore after CPUReset()
|
||||||
int tmp = eepromSize;
|
int tmp = eepromSize;
|
||||||
CPUReset();
|
CPUReset();
|
||||||
eepromSize = tmp;
|
eepromSize = tmp;
|
||||||
|
|
||||||
core = &GBASystem;
|
|
||||||
|
|
||||||
width = GBAWidth;
|
|
||||||
height = GBAHeight;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gb_init(void)
|
static void gb_init(void)
|
||||||
|
@ -581,11 +591,6 @@ static void gb_init(void)
|
||||||
|
|
||||||
log("Loading VBA-M Core (GB/GBC)...\n");
|
log("Loading VBA-M Core (GB/GBC)...\n");
|
||||||
|
|
||||||
update_colormaps();
|
|
||||||
|
|
||||||
soundInit();
|
|
||||||
gbSoundSetSampleRate(SampleRate);
|
|
||||||
|
|
||||||
gbGetHardwareType();
|
gbGetHardwareType();
|
||||||
|
|
||||||
if (usebios) {
|
if (usebios) {
|
||||||
|
@ -595,7 +600,6 @@ static void gb_init(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
gbCPUInit(biosfile, usebios);
|
gbCPUInit(biosfile, usebios);
|
||||||
gbReset();
|
|
||||||
|
|
||||||
if (gbBorderOn) {
|
if (gbBorderOn) {
|
||||||
width = gbBorderLineSkip = SGBWidth;
|
width = gbBorderLineSkip = SGBWidth;
|
||||||
|
@ -608,7 +612,10 @@ static void gb_init(void)
|
||||||
gbBorderColumnSkip = gbBorderRowSkip = 0;
|
gbBorderColumnSkip = gbBorderRowSkip = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
core = &GBSystem;
|
gbSoundSetSampleRate(SampleRate);
|
||||||
|
gbSoundSetDeclicking(1);
|
||||||
|
|
||||||
|
gbReset(); // also resets sound;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gba_soundchanged(void)
|
static void gba_soundchanged(void)
|
||||||
|
@ -1035,17 +1042,22 @@ bool retro_load_game(const struct retro_game_info *game)
|
||||||
|
|
||||||
type = utilFindType((const char *)game->path);
|
type = utilFindType((const char *)game->path);
|
||||||
|
|
||||||
switch (type) {
|
if (type == IMAGE_UNKNOWN) {
|
||||||
case IMAGE_UNKNOWN:
|
|
||||||
log("Unsupported image %s!\n", game->path);
|
log("Unsupported image %s!\n", game->path);
|
||||||
return 0;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
case IMAGE_GBA: {
|
update_colormaps();
|
||||||
|
soundInit();
|
||||||
|
|
||||||
|
if (type == IMAGE_GBA) {
|
||||||
romSize = CPULoadRomData((const char*)game->data, game->size);
|
romSize = CPULoadRomData((const char*)game->data, game->size);
|
||||||
|
|
||||||
if (!romSize)
|
if (!romSize)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
core = &GBASystem;
|
||||||
|
|
||||||
gba_init();
|
gba_init();
|
||||||
|
|
||||||
struct retro_memory_descriptor desc[11];
|
struct retro_memory_descriptor desc[11];
|
||||||
|
@ -1067,23 +1079,85 @@ bool retro_load_game(const struct retro_game_info *game)
|
||||||
desc[8].start=0x05000000; desc[8].select=0xFF000000; desc[8].len=0x400; desc[8].ptr=paletteRAM;//palettes
|
desc[8].start=0x05000000; desc[8].select=0xFF000000; desc[8].len=0x400; desc[8].ptr=paletteRAM;//palettes
|
||||||
desc[9].start=0x07000000; desc[9].select=0xFF000000; desc[9].len=0x400; desc[9].ptr=oam;//OAM
|
desc[9].start=0x07000000; desc[9].select=0xFF000000; desc[9].len=0x400; desc[9].ptr=oam;//OAM
|
||||||
desc[10].start=0x04000000;desc[10].select=0; desc[10].len=0x400; desc[10].ptr=ioMem;//bunch of registers
|
desc[10].start=0x04000000;desc[10].select=0; desc[10].len=0x400; desc[10].ptr=ioMem;//bunch of registers
|
||||||
struct retro_memory_map retromap={ desc, sizeof(desc)/sizeof(*desc) };
|
|
||||||
|
struct retro_memory_map retromap = {
|
||||||
|
desc,
|
||||||
|
sizeof(desc)/sizeof(desc[0])
|
||||||
|
};
|
||||||
|
|
||||||
environ_cb(RETRO_ENVIRONMENT_SET_MEMORY_MAPS, &retromap);
|
environ_cb(RETRO_ENVIRONMENT_SET_MEMORY_MAPS, &retromap);
|
||||||
|
}
|
||||||
|
|
||||||
bool yes = true;
|
else if (type == IMAGE_GB) {
|
||||||
environ_cb(RETRO_ENVIRONMENT_SET_SUPPORT_ACHIEVEMENTS, &yes);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case IMAGE_GB:
|
|
||||||
if (!gbLoadRomData((const char *)game->data, game->size))
|
if (!gbLoadRomData((const char *)game->data, game->size))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
core = &GBSystem;
|
||||||
|
|
||||||
gb_init();
|
gb_init();
|
||||||
|
|
||||||
break;
|
struct retro_memory_descriptor desc[8];
|
||||||
|
memset(desc, 0, sizeof(desc));
|
||||||
|
|
||||||
|
// workram bank 0 0xc000-0xcfff / bank 1-7 0xd000-0xdfff
|
||||||
|
desc[0].ptr = &gbMemory[0xc000];
|
||||||
|
desc[0].start = 0xc000;
|
||||||
|
desc[0].len = 0x1000;
|
||||||
|
|
||||||
|
// workram bank 1-7 switchable (switchable-CGB only)
|
||||||
|
desc[1].ptr = gbCgbMode ? &gbWram[0x1000] : &gbMemory[0xd000];
|
||||||
|
desc[1].start = 0xd000;
|
||||||
|
desc[1].len = 0x1000;
|
||||||
|
|
||||||
|
// high ram area
|
||||||
|
desc[2].ptr = &gbMemory[0xff80];
|
||||||
|
desc[2].start = 0xff80;
|
||||||
|
desc[2].len = 0x0080;
|
||||||
|
|
||||||
|
// save ram or cartridge ram area
|
||||||
|
desc[3].ptr = gbRamSize ? &gbRam[0] : 0;
|
||||||
|
desc[3].start = 0xa000;
|
||||||
|
desc[3].len = gbRamSize ? gbRamSize : 0;
|
||||||
|
|
||||||
|
// vram (chr ram, gb map data 1 - 2)
|
||||||
|
desc[4].ptr = gbCgbMode ? &gbVram[0] : &gbMemory[0x8000];
|
||||||
|
desc[4].start = 0x8000;
|
||||||
|
desc[4].len = 0x2000;
|
||||||
|
|
||||||
|
// oam
|
||||||
|
desc[5].ptr = &gbMemory[0xfe00];
|
||||||
|
desc[5].start = 0xfe00;
|
||||||
|
desc[5].len = 0x00a0;
|
||||||
|
|
||||||
|
// http://gameboy.mongenel.com/dmg/asmmemmap.html
|
||||||
|
// $4000-$7FFF Cartridge ROM - Switchable Banks 1-xx
|
||||||
|
// $0150-$3FFF Cartridge ROM - Bank 0 (fixed)
|
||||||
|
// $0100-$014F Cartridge Header Area
|
||||||
|
// $0000-$00FF Restart and Interrupt Vectors
|
||||||
|
desc[6].ptr = gbMemoryMap[0x00];
|
||||||
|
desc[6].start = 0x0000;
|
||||||
|
desc[6].len = 0x4000;
|
||||||
|
desc[6].flags = RETRO_MEMDESC_CONST;
|
||||||
|
|
||||||
|
desc[7].ptr = gbMemoryMap[0x04];
|
||||||
|
desc[7].start = 0x4000;
|
||||||
|
desc[7].len = 0x4000;
|
||||||
|
desc[7].flags = RETRO_MEMDESC_CONST;
|
||||||
|
|
||||||
|
struct retro_memory_map retromap = {
|
||||||
|
desc,
|
||||||
|
sizeof(desc) / sizeof(desc[0])
|
||||||
|
};
|
||||||
|
|
||||||
|
environ_cb(RETRO_ENVIRONMENT_SET_MEMORY_MAPS, &retromap);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!core)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
bool yes = true;
|
||||||
|
environ_cb(RETRO_ENVIRONMENT_SET_SUPPORT_ACHIEVEMENTS, &yes);
|
||||||
|
|
||||||
uint8_t* state_buf = (uint8_t*)malloc(2000000);
|
uint8_t* state_buf = (uint8_t*)malloc(2000000);
|
||||||
serialize_size = core->emuWriteState(state_buf, 2000000);
|
serialize_size = core->emuWriteState(state_buf, 2000000);
|
||||||
free(state_buf);
|
free(state_buf);
|
||||||
|
|
Loading…
Reference in New Issue