Skip to content

Commit

Permalink
Merge pull request #50 from leiradel/master
Browse files Browse the repository at this point in the history
Added cheevos via the mmaps interface
  • Loading branch information
inactive123 committed May 12, 2016
2 parents 4ad3a4d + 8702ffd commit 755883d
Show file tree
Hide file tree
Showing 7 changed files with 79 additions and 27 deletions.
8 changes: 8 additions & 0 deletions libgambatte/include/gambatte.h
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,14 @@ class GB {
void setGameShark(const std::string &codes);

void clearCheats();

#ifdef __LIBRETRO__
void *vram_ptr() const;
void *rambank0_ptr() const;
void *rambank1_ptr() const;
void *rombank0_ptr() const;
void *rombank1_ptr() const;
#endif

private:
struct Priv;
Expand Down
45 changes: 22 additions & 23 deletions libgambatte/libretro/libretro.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -508,29 +508,28 @@ bool retro_load_game(const struct retro_game_info *info)
check_variables();

//Ugly hack alert: This entire thing depends upon cartridge.cpp and memptrs.cpp not changing in weird ways.
unsigned sramsize = gb.savedata_size();
if (sramsize)
unsigned sramlen = gb.savedata_size();

struct retro_memory_descriptor descs[] =
{
unsigned romsize = pow2ceil(info->size) & ~0x4000;
unsigned ramsize = (gb.isCgb() ? 8 : 2) * 0x1000ul;
char * sramdata = (char*)gb.savedata_ptr();
char * romdata = sramdata - romsize;
char * ramdata = sramdata + sramsize;
struct retro_memory_descriptor descs[3];
memset(descs, 0, sizeof(descs));
descs[0].ptr=ramdata;
descs[0].len=ramsize;
descs[0].addrspace="";
descs[1].ptr=sramdata;
descs[1].len=sramsize;
descs[1].addrspace="S";
descs[2].ptr=romdata;
descs[2].len=romsize;
descs[2].addrspace="R";
descs[2].flags=RETRO_MEMDESC_CONST;
struct retro_memory_map maps={descs, 3};
environ_cb(RETRO_ENVIRONMENT_SET_MEMORY_MAPS, &maps);
}
{ 0, gb.rambank0_ptr(), 0, 0xC000, 0, 0, 0x1000, NULL },
{ 0, gb.rambank1_ptr(), 0, 0xD000, 0, 0, 0x1000, NULL },
{ 0, gb.vram_ptr(), 0, 0x8000, 0, 0, 0x2000, NULL },
{ RETRO_MEMDESC_CONST, gb.rombank0_ptr(), 0, 0x0000, 0, 0, 0x4000, NULL },
{ RETRO_MEMDESC_CONST, gb.rombank1_ptr(), 0, 0x4000, 0, 0, 0x4000, NULL },
{ 0, gb.savedata_ptr(), 0, 0xA000, 0, 0, sramlen, NULL },
};

struct retro_memory_map mmaps =
{
descs,
sizeof(descs) / sizeof(descs[0]) - (sramlen == 0)
};

environ_cb(RETRO_ENVIRONMENT_SET_MEMORY_MAPS, &mmaps);

bool yes = true;
environ_cb(RETRO_ENVIRONMENT_SET_SUPPORT_ACHIEVEMENTS, &yes);

return true;
}
Expand All @@ -556,7 +555,7 @@ void *retro_get_memory_data(unsigned id)
* libgambatte/src/memory/memptrs.cpp MemPtrs::reset not
* realizing that that memchunk hack is ugly, or
* otherwise getting rearranged. */
return (char*)gb.savedata_ptr() + gb.savedata_size();
return gb.rambank0_ptr();
}

return 0;
Expand Down
19 changes: 16 additions & 3 deletions libgambatte/libretro/libretro.h
Original file line number Diff line number Diff line change
Expand Up @@ -946,6 +946,15 @@ struct retro_hw_render_interface
* the contents of the HW_RENDER_INTERFACE are invalidated.
*/

#define RETRO_ENVIRONMENT_SET_SUPPORT_ACHIEVEMENTS (42 | RETRO_ENVIRONMENT_EXPERIMENTAL)
/* const bool * --
* If true, the libretro implementation supports achievements
* either via memory descriptors set with RETRO_ENVIRONMENT_SET_MEMORY_MAPS
* or via retro_get_memory_data/retro_get_memory_size.
*
* This must be called before the first call to retro_run.
*/

#define RETRO_MEMDESC_CONST (1 << 0) /* The frontend will never change this memory area once retro_load_game has returned. */
#define RETRO_MEMDESC_BIGENDIAN (1 << 1) /* The memory area contains big endian data. Default is little endian. */
#define RETRO_MEMDESC_ALIGN_2 (1 << 16) /* All memory access in this area is aligned to their own size, or 2, whichever is smaller. */
Expand Down Expand Up @@ -1396,13 +1405,17 @@ struct retro_camera_callback
*/
uint64_t caps;

unsigned width; /* Desired resolution for camera. Is only used as a hint. */
/* Desired resolution for camera. Is only used as a hint. */
unsigned width;
unsigned height;
retro_camera_start_t start; /* Set by frontend. */
retro_camera_stop_t stop; /* Set by frontend. */

/* Set by frontend. */
retro_camera_start_t start;
retro_camera_stop_t stop;

/* Set by libretro core if raw framebuffer callbacks will be used. */
retro_camera_frame_raw_framebuffer_t frame_raw_framebuffer;

/* Set by libretro core if OpenGL texture callbacks will be used. */
retro_camera_frame_opengl_texture_t frame_opengl_texture;

Expand Down
5 changes: 5 additions & 0 deletions libgambatte/src/cpu.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,11 @@ class CPU {
void *rtcdata_ptr() { return mem_.rtcdata_ptr(); }
unsigned rtcdata_size() { return mem_.rtcdata_size(); }
void clearCheats() { mem_.clearCheats(); }
void *vram_ptr() const { return mem_.vram_ptr(); }
void *rambank0_ptr() const { return mem_.rambank0_ptr(); }
void *rambank1_ptr() const { return mem_.rambank1_ptr(); }
void *rombank0_ptr() const { return mem_.rombank0_ptr(); }
void *rombank1_ptr() const { return mem_.rombank1_ptr(); }
#endif

void setVideoBuffer(video_pixel_t *videoBuf, std::ptrdiff_t pitch) {
Expand Down
5 changes: 5 additions & 0 deletions libgambatte/src/gambatte-memory.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,11 @@ class Memory {
void display_setColorCorrection(bool enable) { lcd_.setColorCorrection(enable); }
video_pixel_t display_gbcToRgb32(const unsigned bgr15) { return lcd_.gbcToRgb32(bgr15); }
void clearCheats() { cart_.clearCheats(); }
void *vram_ptr() const { return cart_.vramdata(); }
void *rambank0_ptr() const { return cart_.wramdata(0); }
void *rambank1_ptr() const { return cart_.wramdata(0) + 0x1000; }
void *rombank0_ptr() const { return cart_.romdata(0); }
void *rombank1_ptr() const { return cart_.romdata(0) + 0x4000; }
#else
void loadSavedata() { cart_.loadSavedata(); }
void saveSavedata() { cart_.saveSavedata(); }
Expand Down
22 changes: 22 additions & 0 deletions libgambatte/src/gambatte.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -142,5 +142,27 @@ void GB::clearCheats() {
p_->cpu.clearCheats();
}

#ifdef __LIBRETRO__
void *GB::vram_ptr() const {
return p_->cpu.vram_ptr();
}

void *GB::rambank0_ptr() const {
return p_->cpu.rambank0_ptr();
}

void *GB::rambank1_ptr() const {
return p_->cpu.rambank1_ptr();
}

void *GB::rombank0_ptr() const {
return p_->cpu.rombank0_ptr();
}

void *GB::rombank1_ptr() const {
return p_->cpu.rombank1_ptr();
}
#endif

}

2 changes: 1 addition & 1 deletion libgambatte/src/mem/cartridge.h
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ namespace gambatte
{
return *rtc_.getActive();
}

const std::string saveBasePath() const;
void setSaveDir(const std::string &dir);
int loadROM(const void *romdata, unsigned romsize, bool forceDmg, bool multicartCompat);
Expand Down

0 comments on commit 755883d

Please sign in to comment.