abort("]\n Failed to load NATIVE_FIRM.\n");
}
find_proc9(firm_loc, &firm_proc9, &firm_p9_exefs);
+ fprintf(stderr, "]\n");
+ fprintf(stderr, "Ver: %x, %u\n", get_firm_info(firm_loc)->version, get_firm_info(firm_loc)->console );
- fprintf(BOTTOM_SCREEN, "]\nTWL_FIRM\n [");
+ fprintf(BOTTOM_SCREEN, "TWL_FIRM\n [");
if (load_firm(twl_firm_loc, PATH_TWL_F, PATH_TWL_FIRMKEY, PATH_TWL_CETK, &twl_firm_size, TWL_FIRM_TITLEID) != 0) {
fprintf(BOTTOM_SCREEN, "]\n TWL_FIRM failed to load.\n");
state = 1;
} else {
find_proc9(twl_firm_loc, &twl_firm_proc9, &twl_firm_p9_exefs);
fprintf(stderr, "]\n");
+ fprintf(stderr, "Ver: %x, %u\n", get_firm_info(twl_firm_loc)->version, get_firm_info(twl_firm_loc)->console );
}
fprintf(BOTTOM_SCREEN, "AGB_FIRM\n [");
} else {
find_proc9(agb_firm_loc, &agb_firm_proc9, &agb_firm_p9_exefs);
fprintf(stderr, "]\n");
+ fprintf(stderr, "Ver: %x, %u\n", get_firm_info(agb_firm_loc)->version, get_firm_info(agb_firm_loc)->console );
}
firm_loaded = 1; // Loaded.
while (code < end && code >= bytecode) {
switch (*code) {
case OP_NOP:
- if (debug)
+ if (debug) {
log("nop\n");
+ }
code++;
break;
case OP_REL: // Change relativity.
- if (debug)
+ if (debug) {
+#ifdef LOADER
log("rel\n");
+#else
+ fprintf(stderr, "rel %u\n", *(code+1));
+#endif
+ }
code++;
current_mode = &modes[*code];
set_mode = *code;
code++;
break;
case OP_FIND: // Find pattern.
- if (debug)
+ if (debug) {
+#ifdef LOADER
log("find\n");
+#else
+ fprintf(stderr, "find %u ...\n", *(code+1));
+#endif
+ }
code += 2;
found = 0;
new_offset = (uint32_t)memfind(current_mode->memory + offset, current_mode->size - offset, code, *(code - 1));
code += *(code - 1);
break;
case OP_BACK:
- if (debug)
+ if (debug) {
+#ifdef LOADER
log("back\n");
+#else
+ fprintf(stderr, "back %u\n", *(code+1));
+#endif
+ }
code++;
offset -= *code;
code++;
break;
case OP_FWD:
- if (debug)
+ if (debug) {
+#ifdef LOADER
log("fwd\n");
+#else
+ fprintf(stderr, "fwd %u\n", *(code+1));
+#endif
+ }
code++;
offset += *code;
- if (offset >= current_mode->size) {
- // Went out of bounds. Error.
- abort("Fwd overflowed.\n");
- }
code++;
break;
case OP_SET: // Set data.
- if (debug)
+ if (debug) {
+#ifdef LOADER
log("set\n");
+#else
+ fprintf(stderr, "set %u, ...\n", *(code+1));
+#endif
+ }
code += 2;
memcpy(current_mode->memory + offset, code, *(code - 1));
offset += *(code - 1);
code += *(code - 1);
break;
case OP_TEST: // Test data.
- if (debug)
+ if (debug) {
+#ifdef LOADER
log("test\n");
+#else
+ fprintf(stderr, "test %u, ...\n", *(code+1));
+#endif
+ }
code += 2;
eq = memcmp(current_mode->memory + offset, code, *(code - 1));
if (eq < 0)
code += *(code - 1);
break;
case OP_JMP: // Jump to offset.
- if (debug)
- log("jmp\n");
code++;
code = bytecode + (code[0] + (code[1] << 8));
+ if (debug) {
+#ifdef LOADER
+ log("jmp\n");
+#else
+ fprintf(stderr, "jmp %u\n", code - bytecode);
+#endif
+ }
break;
case OP_JMPEQ: // Jump to offset if equal
- if (debug)
- log("jmpeq\n");
code++;
if (eq)
code = bytecode + (code[0] + (code[1] << 8));
else
code += 2;
+ if (debug) {
+#ifdef LOADER
+ log("jmpeq\n");
+#else
+ fprintf(stderr, "jmpeq %u\n", code - bytecode);
+#endif
+ }
break;
case OP_JMPNE: // Jump to offset if not equal
- if (debug)
- log("jmpne\n");
code++;
if (!eq)
code = bytecode + (code[0] + (code[1] << 8));
else
code += 2;
+ if (debug) {
+#ifdef LOADER
+ log("jmpne\n");
+#else
+ fprintf(stderr, "jmpeq %u\n", code - bytecode);
+#endif
+ }
break;
case OP_JMPLT: // Jump to offset if less than
- if (debug)
- log("jmplt\n");
code++;
if (lt)
code = bytecode + (code[0] + (code[1] << 8));
else
code += 2;
+ if (debug) {
+#ifdef LOADER
+ log("jmplt\n");
+#else
+ fprintf(stderr, "jmplt %u\n", code - bytecode);
+#endif
+ }
break;
case OP_JMPGT: // Jump to offset if greater than
- if (debug)
- log("jmpgt\n");
code++;
if (gt)
code = bytecode + (code[0] + (code[1] << 8));
else
code += 2;
+ if (debug) {
+#ifdef LOADER
+ log("jmplt\n");
+#else
+ fprintf(stderr, "jmplt %u\n", code - bytecode);
+#endif
+ }
break;
case OP_JMPLE: // Jump to offset if less than or equal
- if (debug)
- log("jmple\n");
code++;
if (lt || eq)
code = bytecode + (code[0] + (code[1] << 8));
else
code += 2;
+ if (debug) {
+#ifdef LOADER
+ log("jmplt\n");
+#else
+ fprintf(stderr, "jmplt %u\n", code - bytecode);
+#endif
+ }
break;
case OP_JMPF: // Jump to offset if pattern found
- if (debug)
- log("jmpf\n");
code++;
if (found)
code = bytecode + (code[0] + (code[1] << 8));
else
code += 2;
+ if (debug) {
+#ifdef LOADER
+ log("jmplt\n");
+#else
+ fprintf(stderr, "jmplt %u\n", code - bytecode);
+#endif
+ }
break;
case OP_JMPNF: // Jump to offset if pattern NOT found
- if (debug)
- log("jmpnf\n");
code++;
if (!found)
code = bytecode + (code[0] + (code[1] << 8));
else
code += 2;
+ if (debug) {
+#ifdef LOADER
+ log("jmplt\n");
+#else
+ fprintf(stderr, "jmplt %u\n", code - bytecode);
+#endif
+ }
break;
case OP_CLF: // Clear flags.
- if (debug)
+ if (debug) {
log("clf\n");
+ }
code++;
found = gt = lt = eq = 0;
break;
offset = 0;
break;
case OP_AND:
- if (debug)
+ if (debug) {
log("and\n");
+ }
code += 2;
for (i = 0; i < *(code - 1); i++) {
*(current_mode->memory + offset) &= code[i];
code += *(code - 1);
break;
case OP_OR:
- if (debug)
+ if (debug) {
log("or\n");
+ }
code += 2;
for (i = 0; i < *(code - 1); i++) {
*(current_mode->memory + offset) |= code[i];
code += *(code - 1);
break;
case OP_XOR:
- if (debug)
+ if (debug) {
log("xor\n");
+ }
code += 2;
for (i = 0; i < *(code - 1); i++) {
*(current_mode->memory + offset) ^= code[i];
code += *(code - 1);
break;
case OP_NOT:
- if (debug)
+ if (debug) {
log("not\n");
+ }
for (i = 0; i < *(code + 1); i++) {
*(current_mode->memory + offset) = ~*(current_mode->memory + offset);
}
code += 2;
break;
case OP_VER:
- if (debug)
+ if (debug) {
log("ver\n");
+ }
code++;
eq = memcmp(&ver, code, 2);
if (eq < 0)
code += 2;
break;
case OP_N3DS:
- if (debug)
+ if (debug) {
log("n3ds\n");
+ }
code++;
eq = is_n3ds;
break;
case OP_SEEK: // Jump to offset if greater than or equal
- if (debug)
- log("seek\n");
code++;
offset = code[0] + (code[1] << 8) + (code[2] << 16) + (code[3] << 24);
-
+ if (debug) {
+#ifdef LOADER
+ log("seek\n");
+#else
+ fprintf(stderr, "seek %u\n", offset);
+#endif
+ }
code += 4;
break;
case OP_NEXT:
- if (debug)
+ if (debug) {
log("next\n");
+ }
found = gt = lt = eq = 0;
bytecode = code + 1;
}
#ifndef LOADER
- if (debug)
+ if (debug) {
+ fprintf(stderr, " l:%u, g:%u, e:%u, f:%u", lt, gt, eq, found);
wait();
+ }
#endif
}
// We should generate a cache for loader in a file intended for titleid.
uint8_t *title_buf = (uint8_t *)patch + sizeof(struct system_patch);
- fprintf(stderr, "patch: %s\n", patch->name);
+ fprintf(stderr, "patch: %s\n", patch->name);
+ fprintf(stderr, "version: %u\n", patch->version);
for (uint32_t i = 0; i < patch->titles; i++) {
char cache_path[] = PATH_LOADER_CACHE "/0000000000000000";