mirror of
https://github.com/suchmememanyskill/TegraExplorer.git
synced 2024-11-26 05:42:07 +00:00
Add exceptions, start file menu
This commit is contained in:
parent
1a931b0256
commit
9588ffb89a
13 changed files with 215 additions and 46 deletions
20
source/err.c
20
source/err.c
|
@ -3,7 +3,7 @@
|
||||||
#include "hid/hid.h"
|
#include "hid/hid.h"
|
||||||
#include "gfx/gfxutils.h"
|
#include "gfx/gfxutils.h"
|
||||||
|
|
||||||
const char *fatfsErrors[] = {
|
const char *TEErrors[] = {
|
||||||
"I/O ERROR",
|
"I/O ERROR",
|
||||||
"NO DISK",
|
"NO DISK",
|
||||||
"NOT READY",
|
"NOT READY",
|
||||||
|
@ -17,20 +17,18 @@ const char *fatfsErrors[] = {
|
||||||
"INVALID DRIVE",
|
"INVALID DRIVE",
|
||||||
"NO MEM",
|
"NO MEM",
|
||||||
"NO FAT",
|
"NO FAT",
|
||||||
"MKFS ABORT"
|
"MKFS ABORT",
|
||||||
};
|
[TE_ERR_UNIMPLEMENTED - 1] = "Unimplemented",
|
||||||
|
[TE_EXCEPTION_RESET - 1] = "E Reset",
|
||||||
const char *TEErrors[] = {
|
[TE_EXCEPTION_UNDEFINED - 1] = "E Undefined",
|
||||||
"Unimplemented"
|
[TE_EXCEPTION_PREF_ABORT - 1] = "E Pref abort",
|
||||||
|
[TE_EXCEPTION_DATA_ABORT - 1] = "E Data abort",
|
||||||
};
|
};
|
||||||
|
|
||||||
const char *GetErrStr(u32 err){
|
const char *GetErrStr(u32 err){
|
||||||
--err; // obv error codes cannot be 0
|
--err; // obv error codes cannot be 0
|
||||||
if (err >= 0 && err < ARRAY_SIZE(fatfsErrors))
|
if (err >= 0 && err < ARRAY_SIZE(TEErrors))
|
||||||
return fatfsErrors[err];
|
return TEErrors[err];
|
||||||
|
|
||||||
if (err >= 20 && err < ARRAY_SIZE(TEErrors) + 20)
|
|
||||||
return TEErrors[err - 20];
|
|
||||||
|
|
||||||
return "(Unknown)";
|
return "(Unknown)";
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,11 @@ typedef struct {
|
||||||
} ErrCode_t;
|
} ErrCode_t;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
TE_ERR_UNIMPLEMENTED = 21,
|
TE_ERR_UNIMPLEMENTED = 15,
|
||||||
|
TE_EXCEPTION_RESET,
|
||||||
|
TE_EXCEPTION_UNDEFINED,
|
||||||
|
TE_EXCEPTION_PREF_ABORT,
|
||||||
|
TE_EXCEPTION_DATA_ABORT
|
||||||
};
|
};
|
||||||
|
|
||||||
#define newErrCode(err) (ErrCode_t) {err, __LINE__, __FILE__}
|
#define newErrCode(err) (ErrCode_t) {err, __LINE__, __FILE__}
|
||||||
|
|
|
@ -34,7 +34,7 @@ void clearFileVector(Vector_t *v){
|
||||||
}
|
}
|
||||||
|
|
||||||
void FileExplorer(char *path){
|
void FileExplorer(char *path){
|
||||||
char *storedPath = path;
|
char *storedPath = CpyStr(path);
|
||||||
int res = 0;
|
int res = 0;
|
||||||
|
|
||||||
while (1){
|
while (1){
|
||||||
|
@ -54,7 +54,7 @@ void FileExplorer(char *path){
|
||||||
vecAddElem(&entries, a);
|
vecAddElem(&entries, a);
|
||||||
}
|
}
|
||||||
|
|
||||||
gfx_con_setpos(144, 16);
|
gfx_con_setpos(144, 24);
|
||||||
gfx_boxGrey(0, 16, 160, 31, 0x1B);
|
gfx_boxGrey(0, 16, 160, 31, 0x1B);
|
||||||
|
|
||||||
if (res >= fileVec.count + ARR_LEN(topEntries))
|
if (res >= fileVec.count + ARR_LEN(topEntries))
|
||||||
|
@ -62,25 +62,25 @@ void FileExplorer(char *path){
|
||||||
|
|
||||||
res = newMenu(&entries, res, 60, 42, ENABLEB | ENABLEPAGECOUNT, (int)fileVec.count);
|
res = newMenu(&entries, res, 60, 42, ENABLEB | ENABLEPAGECOUNT, (int)fileVec.count);
|
||||||
|
|
||||||
|
char *oldPath = storedPath;
|
||||||
|
|
||||||
if (res < ARR_LEN(topEntries)) {
|
if (res < ARR_LEN(topEntries)) {
|
||||||
if (!strcmp(storedPath, path)){
|
if (!strcmp(storedPath, path)){
|
||||||
clearFileVector(&fileVec);
|
clearFileVector(&fileVec);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *copy = CpyStr(storedPath);
|
storedPath = EscapeFolder(oldPath);
|
||||||
storedPath = EscapeFolder(copy);
|
free(oldPath);
|
||||||
free(copy);
|
|
||||||
res = 0;
|
res = 0;
|
||||||
}
|
}
|
||||||
else if (fsEntries[res - ARR_LEN(topEntries)].isDir) {
|
else if (fsEntries[res - ARR_LEN(topEntries)].isDir) {
|
||||||
char *copy = CpyStr(storedPath);
|
storedPath = CombinePaths(storedPath, fsEntries[res - ARR_LEN(topEntries)].name);
|
||||||
storedPath = CombinePaths(copy, fsEntries[res - ARR_LEN(topEntries)].name);
|
free(oldPath);
|
||||||
free(copy);
|
|
||||||
res = 0;
|
res = 0;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
FileMenu(fsEntries[res - ARR_LEN(topEntries)]);
|
FileMenu(storedPath, fsEntries[res - ARR_LEN(topEntries)]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,67 @@
|
||||||
#include "filemenu.h"
|
#include "filemenu.h"
|
||||||
#include "../../err.h"
|
#include "../../err.h"
|
||||||
#include "../../gfx/menu.h"
|
#include "../../gfx/menu.h"
|
||||||
|
#include "../../gfx/gfxutils.h"
|
||||||
|
#include "../fsutils.h"
|
||||||
|
#include <mem/heap.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <utils/sprintf.h>
|
||||||
|
#include "../../tegraexplorer/tconf.h"
|
||||||
|
#include "../../hid/hid.h"
|
||||||
|
|
||||||
MenuEntry_t FileMenuEntries[] = {
|
MenuEntry_t FileMenuEntries[] = {
|
||||||
// Still have to think up the options
|
// Still have to think up the options
|
||||||
|
{.optionUnion = COLORTORGB(COLOR_WHITE) | SKIPBIT, .name = "-- File menu --"},
|
||||||
|
{.optionUnion = COLORTORGB(COLOR_GREEN) | SKIPBIT}, // For the file name and size
|
||||||
|
{.optionUnion = COLORTORGB(COLOR_VIOLET) | SKIPBIT}, // For the file Attribs
|
||||||
|
{.optionUnion = HIDEBIT},
|
||||||
|
{.optionUnion = COLORTORGB(COLOR_WHITE), .name = "<- Back"},
|
||||||
|
{.optionUnion = COLORTORGB(COLOR_BLUE), .name = "Copy to clipboard"},
|
||||||
|
{.optionUnion = COLORTORGB(COLOR_BLUE), .name = "Move to clipboard"},
|
||||||
|
{.optionUnion = COLORTORGB(COLOR_BLUE), .name = "Rename file"},
|
||||||
|
{.optionUnion = COLORTORGB(COLOR_RED), .name = "Delete file"},
|
||||||
|
{.optionUnion = COLORTORGB(COLOR_GREEN), .name = "View hex"},
|
||||||
|
{.optionUnion = COLORTORGB(COLOR_ORANGE), .name = "Launch Payload"},
|
||||||
|
{.optionUnion = COLORTORGB(COLOR_YELLOW), .name = "Launch Script"},
|
||||||
};
|
};
|
||||||
|
|
||||||
void FileMenu(FSEntry_t entry){
|
|
||||||
|
void UnimplementedException(char *path, FSEntry_t entry){
|
||||||
DrawError(newErrCode(TE_ERR_UNIMPLEMENTED));
|
DrawError(newErrCode(TE_ERR_UNIMPLEMENTED));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern int launch_payload(char *path);
|
||||||
|
|
||||||
|
void LaunchPayload(char *path, FSEntry_t entry){
|
||||||
|
launch_payload(CombinePaths(path, entry.name));
|
||||||
|
}
|
||||||
|
|
||||||
|
menuPaths FileMenuPaths[] = {
|
||||||
|
UnimplementedException,
|
||||||
|
UnimplementedException,
|
||||||
|
UnimplementedException,
|
||||||
|
UnimplementedException,
|
||||||
|
UnimplementedException,
|
||||||
|
LaunchPayload,
|
||||||
|
UnimplementedException
|
||||||
|
};
|
||||||
|
|
||||||
|
void FileMenu(char *path, FSEntry_t entry){
|
||||||
|
FileMenuEntries[1].name = entry.name;
|
||||||
|
FileMenuEntries[1].sizeUnion = entry.sizeUnion;
|
||||||
|
char attribs[15];
|
||||||
|
char *attribList = GetFileAttribs(entry);
|
||||||
|
sprintf(attribs, "Attribs:%s", attribList);
|
||||||
|
free(attribList);
|
||||||
|
FileMenuEntries[2].name = attribs;
|
||||||
|
|
||||||
|
Vector_t ent = vecFromArray(FileMenuEntries, ARR_LEN(FileMenuEntries), sizeof(MenuEntry_t));
|
||||||
|
gfx_boxGrey(384, 200, 384 + 512, 200 + 320, 0x33);
|
||||||
|
gfx_con_setpos(384 + 16, 200 + 16);
|
||||||
|
int res = newMenu(&ent, 0, 30, 19, ENABLEB | ALWAYSREDRAW | USELIGHTGREY, ent.count);
|
||||||
|
|
||||||
|
if (res <= 4)
|
||||||
|
return;
|
||||||
|
|
||||||
|
FileMenuPaths[res - 5](path, entry);
|
||||||
|
}
|
|
@ -1,4 +1,6 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "../fstypes.h"
|
#include "../fstypes.h"
|
||||||
|
|
||||||
void FileMenu(FSEntry_t entry);
|
typedef void (*fileMenuPath)(char *path, FSEntry_t entry);
|
||||||
|
|
||||||
|
void FileMenu(char *path, FSEntry_t entry);
|
|
@ -5,6 +5,8 @@
|
||||||
#include "../hid/hid.h"
|
#include "../hid/hid.h"
|
||||||
#include <utils/util.h>
|
#include <utils/util.h>
|
||||||
#include <utils/btn.h>
|
#include <utils/btn.h>
|
||||||
|
#include <utils/sprintf.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
const char *sizeDefs[] = {
|
const char *sizeDefs[] = {
|
||||||
"B ",
|
"B ",
|
||||||
|
@ -13,11 +15,11 @@ const char *sizeDefs[] = {
|
||||||
"GB"
|
"GB"
|
||||||
};
|
};
|
||||||
|
|
||||||
void _printEntry(MenuEntry_t entry, u32 maxLen, u8 highlighted){
|
void _printEntry(MenuEntry_t entry, u32 maxLen, u8 highlighted, u32 bg){
|
||||||
if (entry.hide)
|
if (entry.hide)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
(highlighted) ? SETCOLOR(COLOR_DEFAULT, FromRGBtoU32(entry.R, entry.G, entry.B)) : SETCOLOR(FromRGBtoU32(entry.R, entry.G, entry.B), COLOR_DEFAULT);
|
(highlighted) ? SETCOLOR(bg, FromRGBtoU32(entry.R, entry.G, entry.B)) : SETCOLOR(FromRGBtoU32(entry.R, entry.G, entry.B), bg);
|
||||||
|
|
||||||
if (entry.icon){
|
if (entry.icon){
|
||||||
gfx_putc(entry.icon);
|
gfx_putc(entry.icon);
|
||||||
|
@ -29,7 +31,7 @@ void _printEntry(MenuEntry_t entry, u32 maxLen, u8 highlighted){
|
||||||
gfx_con_getpos(&curX, &curY);
|
gfx_con_getpos(&curX, &curY);
|
||||||
gfx_puts_limit(entry.name, maxLen - ((entry.showSize) ? 8 : 0));
|
gfx_puts_limit(entry.name, maxLen - ((entry.showSize) ? 8 : 0));
|
||||||
if (entry.showSize){
|
if (entry.showSize){
|
||||||
(highlighted) ? SETCOLOR(COLOR_DEFAULT, COLOR_BLUE) : SETCOLOR(COLOR_BLUE, COLOR_DEFAULT);
|
(highlighted) ? SETCOLOR(bg, COLOR_BLUE) : SETCOLOR(COLOR_BLUE, bg);
|
||||||
gfx_con_setpos(curX + (maxLen - 6) * 16, curY);
|
gfx_con_setpos(curX + (maxLen - 6) * 16, curY);
|
||||||
gfx_printf("%4d", entry.size);
|
gfx_printf("%4d", entry.size);
|
||||||
gfx_puts_small(sizeDefs[entry.sizeDef]);
|
gfx_puts_small(sizeDefs[entry.sizeDef]);
|
||||||
|
@ -58,10 +60,14 @@ int newMenu(Vector_t* vec, int startIndex, int screenLenX, int screenLenY, u8 op
|
||||||
u32 startX = 0, startY = 0;
|
u32 startX = 0, startY = 0;
|
||||||
gfx_con_getpos(&startX, &startY);
|
gfx_con_getpos(&startX, &startY);
|
||||||
|
|
||||||
|
u32 bgColor = (options & USELIGHTGREY) ? COLOR_DARKGREY : COLOR_DEFAULT;
|
||||||
|
|
||||||
|
/*
|
||||||
if (options & ENABLEPAGECOUNT){
|
if (options & ENABLEPAGECOUNT){
|
||||||
screenLenY -= 2;
|
screenLenY -= 2;
|
||||||
startY += 32;
|
startY += 32;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
bool redrawScreen = true;
|
bool redrawScreen = true;
|
||||||
Input_t *input = hidRead();
|
Input_t *input = hidRead();
|
||||||
|
@ -75,20 +81,22 @@ int newMenu(Vector_t* vec, int startIndex, int screenLenX, int screenLenY, u8 op
|
||||||
u32 lastDraw = get_tmr_ms();
|
u32 lastDraw = get_tmr_ms();
|
||||||
if (redrawScreen || options & ALWAYSREDRAW){
|
if (redrawScreen || options & ALWAYSREDRAW){
|
||||||
if (options & ENABLEPAGECOUNT){
|
if (options & ENABLEPAGECOUNT){
|
||||||
gfx_con_setpos(startX, startY - 32);
|
SETCOLOR(COLOR_DEFAULT, COLOR_WHITE);
|
||||||
RESETCOLOR;
|
char temp[40] = "";
|
||||||
gfx_printf("Page %d / %d | Total %d entries ", (selected / screenLenY) + 1, (vec->count / screenLenY) + 1, entryCount);
|
sprintf(temp, " Page %d / %d | Total %d entries", (selected / screenLenY) + 1, (vec->count / screenLenY) + 1, entryCount);
|
||||||
|
gfx_con_setpos(YLEFT - strlen(temp) * 18, 0);
|
||||||
|
gfx_printf(temp);
|
||||||
}
|
}
|
||||||
|
|
||||||
gfx_con_setpos(startX, startY);
|
gfx_con_setpos(startX, startY);
|
||||||
|
|
||||||
if (redrawScreen)
|
if (redrawScreen)
|
||||||
gfx_boxGrey(startX, startY, startX + screenLenX * 16, startY + screenLenY * 16, 0x1B);
|
gfx_boxGrey(startX, startY, startX + screenLenX * 16, startY + screenLenY * 16, (options & USELIGHTGREY) ? 0x33 : 0x1B);
|
||||||
|
|
||||||
int start = selected / screenLenY * screenLenY;
|
int start = selected / screenLenY * screenLenY;
|
||||||
for (int i = start; i < MIN(vec->count, start + screenLenY); i++){
|
for (int i = start; i < MIN(vec->count, start + screenLenY); i++){
|
||||||
gfx_con_setpos(startX, startY + ((i % screenLenY) * 16));
|
gfx_con_setpos(startX, startY + ((i % screenLenY) * 16));
|
||||||
_printEntry(entries[i], screenLenX, (i == selected));
|
_printEntry(entries[i], screenLenX, (i == selected), bgColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -96,9 +104,9 @@ int newMenu(Vector_t* vec, int startIndex, int screenLenX, int screenLenY, u8 op
|
||||||
u32 minLastCur = MIN(lastIndex, selected);
|
u32 minLastCur = MIN(lastIndex, selected);
|
||||||
u32 maxLastCur = MAX(lastIndex, selected);
|
u32 maxLastCur = MAX(lastIndex, selected);
|
||||||
gfx_con_setpos(startX, startY + ((minLastCur % screenLenY) * 16));
|
gfx_con_setpos(startX, startY + ((minLastCur % screenLenY) * 16));
|
||||||
_printEntry(entries[minLastCur], screenLenX, (minLastCur == selected));
|
_printEntry(entries[minLastCur], screenLenX, (minLastCur == selected), bgColor);
|
||||||
gfx_con_setpos(startX, startY + ((maxLastCur % screenLenY) * 16));
|
gfx_con_setpos(startX, startY + ((maxLastCur % screenLenY) * 16));
|
||||||
_printEntry(entries[maxLastCur], screenLenX, (minLastCur != selected));
|
_printEntry(entries[maxLastCur], screenLenX, (minLastCur != selected), bgColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
lastIndex = selected;
|
lastIndex = selected;
|
||||||
|
|
|
@ -37,6 +37,10 @@ typedef struct _menuEntry {
|
||||||
#define ENABLEB BIT(0)
|
#define ENABLEB BIT(0)
|
||||||
#define ENABLEPAGECOUNT BIT(1)
|
#define ENABLEPAGECOUNT BIT(1)
|
||||||
#define ALWAYSREDRAW BIT(2)
|
#define ALWAYSREDRAW BIT(2)
|
||||||
|
#define USELIGHTGREY BIT(3)
|
||||||
|
|
||||||
|
#define ScreenDefaultLenX 79
|
||||||
|
#define ScreenDefaultLenY 30
|
||||||
|
|
||||||
#define ARR_LEN(x) (sizeof(x) / sizeof(*x))
|
#define ARR_LEN(x) (sizeof(x) / sizeof(*x))
|
||||||
|
|
||||||
|
|
|
@ -48,6 +48,7 @@
|
||||||
#include "tegraexplorer/mainmenu.h"
|
#include "tegraexplorer/mainmenu.h"
|
||||||
#include "tegraexplorer/tconf.h"
|
#include "tegraexplorer/tconf.h"
|
||||||
#include "err.h"
|
#include "err.h"
|
||||||
|
#include <soc/pmc.h>
|
||||||
|
|
||||||
|
|
||||||
hekate_config h_cfg;
|
hekate_config h_cfg;
|
||||||
|
@ -154,6 +155,70 @@ int launch_payload(char *path)
|
||||||
|
|
||||||
extern void pivot_stack(u32 stack_top);
|
extern void pivot_stack(u32 stack_top);
|
||||||
|
|
||||||
|
#define EXCP_EN_ADDR 0x4003FFFC
|
||||||
|
#define EXCP_MAGIC 0x30505645 // EVP0
|
||||||
|
#define EXCP_TYPE_ADDR 0x4003FFF8
|
||||||
|
#define EXCP_TYPE_RESET 0x545352 // RST
|
||||||
|
#define EXCP_TYPE_UNDEF 0x464455 // UDF
|
||||||
|
#define EXCP_TYPE_PABRT 0x54424150 // PABT
|
||||||
|
#define EXCP_TYPE_DABRT 0x54424144 // DABT
|
||||||
|
#define EXCP_LR_ADDR 0x4003FFF4
|
||||||
|
|
||||||
|
static inline void _show_errors()
|
||||||
|
{
|
||||||
|
u32 *excp_enabled = (u32 *)EXCP_EN_ADDR;
|
||||||
|
u32 *excp_type = (u32 *)EXCP_TYPE_ADDR;
|
||||||
|
u32 *excp_lr = (u32 *)EXCP_LR_ADDR;
|
||||||
|
|
||||||
|
if (*excp_enabled == EXCP_MAGIC)
|
||||||
|
h_cfg.errors |= ERR_EXCEPTION;
|
||||||
|
|
||||||
|
if (h_cfg.errors)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
if (h_cfg.errors & ERR_SD_BOOT_EN)
|
||||||
|
WPRINTF("Failed to mount SD!\n");
|
||||||
|
|
||||||
|
if (h_cfg.errors & ERR_LIBSYS_LP0)
|
||||||
|
WPRINTF("Missing LP0 (sleep mode) lib!\n");
|
||||||
|
if (h_cfg.errors & ERR_LIBSYS_MTC)
|
||||||
|
WPRINTF("Missing or old Minerva lib!\n");
|
||||||
|
|
||||||
|
if (h_cfg.errors & (ERR_LIBSYS_LP0 | ERR_LIBSYS_MTC))
|
||||||
|
WPRINTF("\nUpdate bootloader folder!\n\n");
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (h_cfg.errors & ERR_EXCEPTION)
|
||||||
|
{
|
||||||
|
gfx_clearscreen();
|
||||||
|
WPRINTFARGS("LR %08X", *excp_lr);
|
||||||
|
u16 exception = TE_EXCEPTION_RESET;
|
||||||
|
/*
|
||||||
|
switch (*excp_type)
|
||||||
|
{
|
||||||
|
case EXCP_TYPE_RESET:
|
||||||
|
exception = TE_EXCEPTION_RESET;
|
||||||
|
break;
|
||||||
|
case EXCP_TYPE_UNDEF:
|
||||||
|
exception = TE_EXCEPTION_UNDEFINED;
|
||||||
|
break;
|
||||||
|
case EXCP_TYPE_PABRT:
|
||||||
|
exception = TE_EXCEPTION_PREF_ABORT;
|
||||||
|
break;
|
||||||
|
case EXCP_TYPE_DABRT:
|
||||||
|
exception = TE_EXCEPTION_DATA_ABORT;
|
||||||
|
break;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
// Clear the exception.
|
||||||
|
*excp_enabled = 0;
|
||||||
|
DrawError(newErrCode(exception));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ipl_main()
|
void ipl_main()
|
||||||
{
|
{
|
||||||
// Do initial HW configuration. This is compatible with consecutive reruns without a reset.
|
// Do initial HW configuration. This is compatible with consecutive reruns without a reset.
|
||||||
|
@ -212,6 +277,10 @@ void ipl_main()
|
||||||
//gfx_clearscreen();
|
//gfx_clearscreen();
|
||||||
//DrawError(newErrCode(1));
|
//DrawError(newErrCode(1));
|
||||||
|
|
||||||
|
// TODO: Write exceptions in err.c and check them here
|
||||||
|
|
||||||
|
_show_errors();
|
||||||
|
|
||||||
EnterMainMenu();
|
EnterMainMenu();
|
||||||
|
|
||||||
// Halt BPMP if we managed to get out of execution.
|
// Halt BPMP if we managed to get out of execution.
|
||||||
|
|
|
@ -23,8 +23,8 @@
|
||||||
.extern memset
|
.extern memset
|
||||||
.type memset, %function
|
.type memset, %function
|
||||||
|
|
||||||
.extern ipl_main
|
.extern _irq_setup
|
||||||
.type ipl_main, %function
|
.type _irq_setup, %function
|
||||||
|
|
||||||
.globl _start
|
.globl _start
|
||||||
.type _start, %function
|
.type _start, %function
|
||||||
|
@ -67,7 +67,7 @@ _real_start:
|
||||||
LDR R2, =__bss_end
|
LDR R2, =__bss_end
|
||||||
SUB R2, R2, R0
|
SUB R2, R2, R0
|
||||||
BL memset
|
BL memset
|
||||||
BL ipl_main
|
BL _irq_setup
|
||||||
B .
|
B .
|
||||||
|
|
||||||
.globl pivot_stack
|
.globl pivot_stack
|
||||||
|
|
|
@ -7,16 +7,19 @@
|
||||||
#include "../fs/menus/explorer.h"
|
#include "../fs/menus/explorer.h"
|
||||||
#include <utils/btn.h>
|
#include <utils/btn.h>
|
||||||
#include <storage/nx_sd.h>
|
#include <storage/nx_sd.h>
|
||||||
|
#include "tconf.h"
|
||||||
|
|
||||||
MenuEntry_t mainMenuEntries[] = {
|
MenuEntry_t mainMenuEntries[] = {
|
||||||
{.R = 255, .G = 255, .B = 255, .skip = 1, .name = "-- Main Menu --"},
|
{.R = 255, .G = 255, .B = 255, .skip = 1, .name = "-- Main Menu --"},
|
||||||
{.G = 255, .name = "SD:/"},
|
{.G = 255, .name = "SD:/"},
|
||||||
{.B = 255, .G = 255, .name = "Test Controllers"},
|
{.B = 255, .G = 255, .name = "Test Controllers"},
|
||||||
|
{.R = 255, .name = "Cause an exception"},
|
||||||
{.R = 255, .name = "Reboot to payload"}
|
{.R = 255, .name = "Reboot to payload"}
|
||||||
};
|
};
|
||||||
|
|
||||||
void HandleSD(){
|
void HandleSD(){
|
||||||
gfx_clearscreen();
|
gfx_clearscreen();
|
||||||
|
TConf.curExplorerLoc = LOC_SD;
|
||||||
if (!sd_mount()){
|
if (!sd_mount()){
|
||||||
gfx_printf("Sd is not mounted!");
|
gfx_printf("Sd is not mounted!");
|
||||||
hidWait();
|
hidWait();
|
||||||
|
@ -25,16 +28,21 @@ void HandleSD(){
|
||||||
FileExplorer("sd:/");
|
FileExplorer("sd:/");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CrashTE(){
|
||||||
|
gfx_printf("%d", *((int*)0));
|
||||||
|
}
|
||||||
|
|
||||||
menuPaths mainMenuPaths[] = {
|
menuPaths mainMenuPaths[] = {
|
||||||
NULL,
|
NULL,
|
||||||
HandleSD,
|
HandleSD,
|
||||||
TestControllers,
|
TestControllers,
|
||||||
|
CrashTE,
|
||||||
RebootToPayload
|
RebootToPayload
|
||||||
};
|
};
|
||||||
|
|
||||||
void EnterMainMenu(){
|
void EnterMainMenu(){
|
||||||
while (1){
|
while (1){
|
||||||
FunctionMenuHandler(mainMenuEntries, 4, mainMenuPaths, 0);
|
FunctionMenuHandler(mainMenuEntries, ARR_LEN(mainMenuEntries), mainMenuPaths, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,2 +1,17 @@
|
||||||
#include "tconf.h"
|
#include "tconf.h"
|
||||||
|
#include <mem/heap.h>
|
||||||
TConf_t TConf = {0};
|
TConf_t TConf = {0};
|
||||||
|
|
||||||
|
void ResetCopyParams(){
|
||||||
|
TConf.heldExplorerCopyLoc = LOC_None;
|
||||||
|
if (TConf.srcCopy != NULL)
|
||||||
|
free(TConf.srcCopy);
|
||||||
|
TConf.explorerCopyMode = CMODE_None;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetCopyParams(char *path, u8 mode){
|
||||||
|
ResetCopyParams();
|
||||||
|
TConf.heldExplorerCopyLoc = TConf.curExplorerLoc;
|
||||||
|
TConf.explorerCopyMode = mode;
|
||||||
|
TConf.srcCopy = path;
|
||||||
|
}
|
|
@ -2,7 +2,8 @@
|
||||||
#include <utils/types.h>
|
#include <utils/types.h>
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
LOC_SD = 0,
|
LOC_None = 0,
|
||||||
|
LOC_SD,
|
||||||
LOC_EMMC,
|
LOC_EMMC,
|
||||||
LOC_EMUMMC
|
LOC_EMUMMC
|
||||||
};
|
};
|
||||||
|
@ -24,14 +25,18 @@ typedef struct {
|
||||||
char *srcCopy;
|
char *srcCopy;
|
||||||
union {
|
union {
|
||||||
struct {
|
struct {
|
||||||
u8 minervaEnabled:1;
|
u16 minervaEnabled:1;
|
||||||
u8 lastExplorerLoc:2;
|
u16 curExplorerLoc:2;
|
||||||
u8 explorerCopyMode:2;
|
u16 heldExplorerCopyLoc:2;
|
||||||
u8 currentlyMounted:2;
|
u16 explorerCopyMode:2;
|
||||||
|
u16 currentMMCMounted:2;
|
||||||
};
|
};
|
||||||
u8 optionUnion;
|
u16 optionUnion;
|
||||||
};
|
};
|
||||||
// Add keys here
|
// Add keys here
|
||||||
} TConf_t;
|
} TConf_t;
|
||||||
|
|
||||||
extern TConf_t TConf;
|
extern TConf_t TConf;
|
||||||
|
|
||||||
|
void ResetCopyParams();
|
||||||
|
void SetCopyParams(char *path, u8 mode);
|
|
@ -14,7 +14,7 @@ char *CpyStr(const char* in){
|
||||||
void MaskIn(char *mod, u32 bitstream, char mask){
|
void MaskIn(char *mod, u32 bitstream, char mask){
|
||||||
u32 len = strlen(mod);
|
u32 len = strlen(mod);
|
||||||
for (int i = 0; i < len; i++){
|
for (int i = 0; i < len; i++){
|
||||||
if (bitstream & 1)
|
if (!(bitstream & 1))
|
||||||
*mod = mask;
|
*mod = mask;
|
||||||
|
|
||||||
bitstream >>= 1;
|
bitstream >>= 1;
|
||||||
|
|
Loading…
Reference in a new issue