diff options
Diffstat (limited to 'src/core/loader.cpp')
| -rw-r--r-- | src/core/loader.cpp | 53 |
1 files changed, 50 insertions, 3 deletions
diff --git a/src/core/loader.cpp b/src/core/loader.cpp index 7c1dfef61..8756588ae 100644 --- a/src/core/loader.cpp +++ b/src/core/loader.cpp | |||
| @@ -89,8 +89,8 @@ bool Load_DAT(std::string &filename) { | |||
| 89 | * but for the sake of making it easier... we'll temporarily/hackishly | 89 | * but for the sake of making it easier... we'll temporarily/hackishly |
| 90 | * allow it. No sense in making a proper reader for this. | 90 | * allow it. No sense in making a proper reader for this. |
| 91 | */ | 91 | */ |
| 92 | u32 entrypoint = 0x080c3ee0; // write to same entrypoint as elf | 92 | u32 entrypoint = 0x00100000; // write to same entrypoint as elf |
| 93 | u32 payload_offset = 0x6F4; | 93 | u32 payload_offset = 0xA150; |
| 94 | 94 | ||
| 95 | const u8 *src = &buffer[payload_offset]; | 95 | const u8 *src = &buffer[payload_offset]; |
| 96 | u8 *dst = Memory::GetPointer(entrypoint); | 96 | u8 *dst = Memory::GetPointer(entrypoint); |
| @@ -114,6 +114,47 @@ bool Load_DAT(std::string &filename) { | |||
| 114 | return true; | 114 | return true; |
| 115 | } | 115 | } |
| 116 | 116 | ||
| 117 | |||
| 118 | /// Loads a CTR BIN file extracted from an ExeFS | ||
| 119 | bool Load_BIN(std::string &filename) { | ||
| 120 | std::string full_path = filename; | ||
| 121 | std::string path, file, extension; | ||
| 122 | SplitPath(ReplaceAll(full_path, "\\", "/"), &path, &file, &extension); | ||
| 123 | #if EMU_PLATFORM == PLATFORM_WINDOWS | ||
| 124 | path = ReplaceAll(path, "/", "\\"); | ||
| 125 | #endif | ||
| 126 | File::IOFile f(filename, "rb"); | ||
| 127 | |||
| 128 | if (f.IsOpen()) { | ||
| 129 | u64 size = f.GetSize(); | ||
| 130 | u8* buffer = new u8[size]; | ||
| 131 | |||
| 132 | f.ReadBytes(buffer, size); | ||
| 133 | |||
| 134 | u32 entrypoint = 0x00100000; // Hardcoded, read from exheader | ||
| 135 | |||
| 136 | const u8 *src = buffer; | ||
| 137 | u8 *dst = Memory::GetPointer(entrypoint); | ||
| 138 | u32 srcSize = size; | ||
| 139 | u32 *s = (u32*)src; | ||
| 140 | u32 *d = (u32*)dst; | ||
| 141 | for (int j = 0; j < (int)(srcSize + 3) / 4; j++) | ||
| 142 | { | ||
| 143 | *d++ = (*s++); | ||
| 144 | } | ||
| 145 | |||
| 146 | Core::g_app_core->SetPC(entrypoint); | ||
| 147 | |||
| 148 | delete[] buffer; | ||
| 149 | } | ||
| 150 | else { | ||
| 151 | return false; | ||
| 152 | } | ||
| 153 | f.Close(); | ||
| 154 | |||
| 155 | return true; | ||
| 156 | } | ||
| 157 | |||
| 117 | namespace Loader { | 158 | namespace Loader { |
| 118 | 159 | ||
| 119 | bool IsBootableDirectory() { | 160 | bool IsBootableDirectory() { |
| @@ -145,6 +186,9 @@ FileType IdentifyFile(std::string &filename) { | |||
| 145 | else if (!strcasecmp(extension.c_str(), ".elf")) { | 186 | else if (!strcasecmp(extension.c_str(), ".elf")) { |
| 146 | return FILETYPE_CTR_ELF; // TODO(bunnei): Do some filetype checking :p | 187 | return FILETYPE_CTR_ELF; // TODO(bunnei): Do some filetype checking :p |
| 147 | } | 188 | } |
| 189 | else if (!strcasecmp(extension.c_str(), ".bin")) { | ||
| 190 | return FILETYPE_CTR_BIN; | ||
| 191 | } | ||
| 148 | else if (!strcasecmp(extension.c_str(), ".dat")) { | 192 | else if (!strcasecmp(extension.c_str(), ".dat")) { |
| 149 | return FILETYPE_LAUNCHER_DAT; | 193 | return FILETYPE_LAUNCHER_DAT; |
| 150 | } | 194 | } |
| @@ -178,6 +222,9 @@ bool LoadFile(std::string &filename, std::string *error_string) { | |||
| 178 | case FILETYPE_CTR_ELF: | 222 | case FILETYPE_CTR_ELF: |
| 179 | return Load_ELF(filename); | 223 | return Load_ELF(filename); |
| 180 | 224 | ||
| 225 | case FILETYPE_CTR_BIN: | ||
| 226 | return Load_BIN(filename); | ||
| 227 | |||
| 181 | case FILETYPE_LAUNCHER_DAT: | 228 | case FILETYPE_LAUNCHER_DAT: |
| 182 | return Load_DAT(filename); | 229 | return Load_DAT(filename); |
| 183 | 230 | ||
| @@ -215,7 +262,7 @@ bool LoadFile(std::string &filename, std::string *error_string) { | |||
| 215 | case FILETYPE_UNKNOWN: | 262 | case FILETYPE_UNKNOWN: |
| 216 | default: | 263 | default: |
| 217 | ERROR_LOG(LOADER, "Failed to identify file"); | 264 | ERROR_LOG(LOADER, "Failed to identify file"); |
| 218 | *error_string = "Failed to identify file"; | 265 | *error_string = " Failed to identify file"; |
| 219 | break; | 266 | break; |
| 220 | } | 267 | } |
| 221 | return false; | 268 | return false; |