This repository has been archived on 2022-05-31. You can view files and clone it, but cannot push or open issues or pull requests.
Luma3DS-3GX/source/emunand.c

73 lines
2.2 KiB
C
Raw Normal View History

2015-08-05 03:57:37 +02:00
/*
* emunand.c
* by Reisyukaku
2015-08-15 04:28:26 +02:00
* Copyright (c) 2015 All Rights Reserved
2015-08-05 03:57:37 +02:00
*/
#include "emunand.h"
#include "memory.h"
2015-08-05 03:57:37 +02:00
#include "fatfs/sdmmc/sdmmc.h"
void getEmunandSect(u32 *off, u32 *head, u32 emuNAND){
2016-03-10 14:58:11 +01:00
u8 *const temp = (u8 *)0x24300000;
u32 nandSize = getMMCDevice(0)->total_size;
u32 nandOffset = emuNAND == 1 ? 0 :
(nandSize > 0x200000 ? 0x400000 : 0x200000);
if(sdmmc_sdcard_readsectors(nandOffset + nandSize, 1, temp) == 0){
if(*(u32 *)(temp + 0x100) == NCSD_MAGIC){
*off = nandOffset;
*head = nandOffset + nandSize;
2015-08-05 03:57:37 +02:00
}
//Fallback to the first emuNAND if there's no second one
else if(emuNAND == 2) getEmunandSect(off, head, 1);
//Check if a RedNAND is present
else if(sdmmc_sdcard_readsectors(1, 1, temp) == 0){
if(*(u32 *)(temp + 0x100) != NCSD_MAGIC)
*head = 0;
}
2015-08-05 03:57:37 +02:00
}
}
void getSDMMC(void *pos, u32 *off, u32 size){
//Look for struct code
const unsigned char pattern[] = {0x21, 0x20, 0x18, 0x20};
*off = (u32)memsearch(pos, pattern, size, 4) - 1;
//Get DCD values
u8 buf[4];
u32 addr = 0,
additive = 0,
p;
2016-03-06 16:24:42 +01:00
memcpy(buf, (void *)(*off+0x0A), 4);
for (p = 0; p < 4; p++) addr |= ((u32) buf[p]) << (8 * p);
2016-03-06 16:24:42 +01:00
memcpy(buf, (void *)(*off+0x0E), 4);
for (p = 0; p < 4; p++) additive |= ((u32) buf[p]) << (8 * p);
//Return result
2016-03-06 16:24:42 +01:00
*off = addr + additive;
}
void getEmuRW(void *pos, u32 size, u32 *readOff, u32 *writeOff){
//Look for read/write code
const unsigned char pattern[] = {0x1E, 0x00, 0xC8, 0x05};
2016-02-08 03:37:03 +01:00
*writeOff = (u32)memsearch(pos, pattern, size, 4) - 6;
*readOff = (u32)memsearch((void *)(*writeOff - 0x1000), pattern, 0x1000, 4) - 6;
2016-02-08 03:37:03 +01:00
}
void getMPU(void *pos, u32 *off, u32 size){
//Look for MPU pattern
const unsigned char pattern[] = {0x03, 0x00, 0x24, 0x00};
2016-02-08 03:37:03 +01:00
*off = (u32)memsearch(pos, pattern, size, 4);
}
void getEmuCode(void *pos, u32 *off, u32 size){
u8 *proc9 = (u8 *)memsearch(pos, "ess9", size, 4);
const unsigned char pattern[] = {0x00, 0xFF, 0xFF, 0xFF};
//Looking for the last spot before Process9
*off = (u32)memsearch(pos, pattern, size - (size - (u32)(proc9 - (u8 *)pos)), 4) + 0xD;
2015-08-05 03:57:37 +02:00
}