Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions src/rcheevos/consoleinfo.c
Original file line number Diff line number Diff line change
Expand Up @@ -759,6 +759,29 @@ static const rc_memory_region_t _rc_memory_regions_nintendo_dsi[] = {
};
static const rc_memory_regions_t rc_memory_regions_nintendo_dsi = { _rc_memory_regions_nintendo_dsi, 2 };

/* ===== Nintendo 3DS ===== */
/* https://www.3dbrew.org/wiki/Memory_layout#ARM11_User-land_memory_regions */
static const rc_memory_region_t _rc_memory_regions_nintendo_3ds[] = {
{ 0x00000000U, 0x000FFFFFU, 0x00000000U, RC_MEMORY_TYPE_UNUSED, "" },
{ 0x00100000U, 0x03FFFFFFU, 0x00100000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Code Binary" }, /* Usual place where ExeFS .code is loaded */
{ 0x04000000U, 0x07FFFFFFU, 0x04000000U, RC_MEMORY_TYPE_HARDWARE_CONTROLLER, "IPC Buffers" },
{ 0x08000000U, 0x0FFFFFFFU, 0x08000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Regular Heap and Stack" },
{ 0x10000000U, 0x13FFFFFFU, 0x10000000U, RC_MEMORY_TYPE_HARDWARE_CONTROLLER, "Shared Memory" },
{ 0x14000000U, 0x1BFFFFFFU, 0x14000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Linear Heap" }, /* Sometimes ExeFS .code is actually loaded here */
{ 0x1C000000U, 0x1E7FFFFFU, 0x1C000000U, RC_MEMORY_TYPE_UNUSED, "" },
{ 0x1E800000U, 0x1EBFFFFFU, 0x1E800000U, RC_MEMORY_TYPE_SYSTEM_RAM, "New 3DS Memory" },
{ 0x1EC00000U, 0x1EFFFFFFU, 0x1EC00000U, RC_MEMORY_TYPE_HARDWARE_CONTROLLER, "I/O Registers" },
{ 0x1F000000U, 0x1F5FFFFFU, 0x1F000000U, RC_MEMORY_TYPE_VIDEO_RAM, "VRAM" },
{ 0x1F600000U, 0x1FEFFFFFU, 0x1F600000U, RC_MEMORY_TYPE_UNUSED, "" },
{ 0x1FF00000U, 0x1FF7FFFFU, 0x1FF00000U, RC_MEMORY_TYPE_HARDWARE_CONTROLLER, "DSP Memory" },
{ 0x1FF80000U, 0x1FF81FFFU, 0x1FF80000U, RC_MEMORY_TYPE_READONLY, "Configuration Memory" },
{ 0x1FF82000U, 0x1FFFFFFFU, 0x1FF82000U, RC_MEMORY_TYPE_SYSTEM_RAM, "Thread Local Storage" }, /* Most of this is actually unused in practice */
{ 0x20000000U, 0x2FFFFFFFU, 0x20000000U, RC_MEMORY_TYPE_UNUSED, "" },
{ 0x30000000U, 0x37FFFFFFU, 0x30000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "New Linear Heap" }, /* Newer games use this as the linear heap base instead */
{ 0x38000000U, 0x3FFFFFFFU, 0x38000000U, RC_MEMORY_TYPE_SYSTEM_RAM, "New Linear Heap (New 3DS Exclusive)" } /* New 3DS exclusive space for the newer linear heap */
};
static const rc_memory_regions_t rc_memory_regions_nintendo_3ds = { _rc_memory_regions_nintendo_3ds, 17 };

/* ===== Oric ===== */
static const rc_memory_region_t _rc_memory_regions_oric[] = {
/* actual size depends on machine type - up to 64KB */
Expand Down Expand Up @@ -1133,6 +1156,9 @@ const rc_memory_regions_t* rc_console_memory_regions(uint32_t console_id)
case RC_CONSOLE_NINTENDO_DSI:
return &rc_memory_regions_nintendo_dsi;

case RC_CONSOLE_NINTENDO_3DS:
return &rc_memory_regions_nintendo_3ds;

case RC_CONSOLE_ORIC:
return &rc_memory_regions_oric;

Expand Down
1 change: 1 addition & 0 deletions test/rcheevos/test_consoleinfo.c
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,7 @@ void test_consoleinfo(void) {
TEST_PARAMS2(test_memory, RC_CONSOLE_NEO_GEO_CD, 0x010000);
TEST_PARAMS2(test_memory, RC_CONSOLE_NINTENDO, 0x010000);
TEST_PARAMS2(test_memory, RC_CONSOLE_NINTENDO_64, 0x800000);
TEST_PARAMS2(test_memory, RC_CONSOLE_NINTENDO_3DS, 0x40000000);
TEST_PARAMS2(test_memory, RC_CONSOLE_NINTENDO_DS, 0x1004000);
TEST_PARAMS2(test_memory, RC_CONSOLE_NINTENDO_DSI, 0x1004000);
TEST_PARAMS2(test_memory, RC_CONSOLE_ORIC, 0x010000);
Expand Down
Loading