summaryrefslogtreecommitdiff
path: root/src/core/loader.cpp
diff options
context:
space:
mode:
authorGravatar bunnei2014-05-08 17:16:35 -0400
committerGravatar bunnei2014-05-08 17:16:35 -0400
commitbdc54d0d4897841a4d24aee80311bfb1f0eba884 (patch)
tree558d87c83fe8f7e8e3e57644407c872244ee5a3a /src/core/loader.cpp
parentMerge pull request #16 from Sethpaien/master (diff)
parentremoved unknown fields from GX_CmdBufferHeader (diff)
downloadyuzu-bdc54d0d4897841a4d24aee80311bfb1f0eba884.tar.gz
yuzu-bdc54d0d4897841a4d24aee80311bfb1f0eba884.tar.xz
yuzu-bdc54d0d4897841a4d24aee80311bfb1f0eba884.zip
Merge pull request #15 from bunnei/hle-services
Various fixes/improvements to HLE of 3DS services, mostly cleans up GSP call decoding
Diffstat (limited to 'src/core/loader.cpp')
-rw-r--r--src/core/loader.cpp53
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
119bool 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
117namespace Loader { 158namespace Loader {
118 159
119bool IsBootableDirectory() { 160bool 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;