Initial commit
Some checks failed
TegraExplorer builder / build (push) Has been cancelled

This commit is contained in:
2025-11-23 00:09:05 +01:00
parent eea3728127
commit 61671f2ec1
8 changed files with 107 additions and 105 deletions

View File

@@ -52,6 +52,7 @@ CUSTOMDEFINES += -DGFX_INC=$(GFX_INC) -DFFCFG_INC=$(FFCFG_INC)
ARCH := -march=armv4t -mtune=arm7tdmi -mthumb -mthumb-interwork
CFLAGS = $(ARCH) -Os -nostdlib -ffunction-sections -fdata-sections -fomit-frame-pointer -fno-inline -std=gnu11 -Wall -Wno-missing-braces $(CUSTOMDEFINES)
LDFLAGS = $(ARCH) -nostartfiles -lgcc -Wl,--nmagic,--gc-sections -Xlinker --defsym=IPL_LOAD_ADDR=$(IPL_LOAD_ADDR)
SCRIPT_SRCS := $(shell find scripts -name '*.te')
################################################################################
@@ -109,13 +110,13 @@ $(BUILDDIR)/$(TARGET)/script/builtin.o: $(BUILDDIR)/$(TARGET)/script/builtin.c
@mkdir -p "$(@D)"
$(CC) $(CFLAGS) $(BDKINC) -c $< -o $@
$(BUILDDIR)/$(TARGET)/script/builtin.c: scripts/*.te
$(BUILDDIR)/$(TARGET)/script/builtin.c: $(SCRIPT_SRCS)
@mkdir -p "$(@D)"
@mkdir -p "$(BUILDDIR)/$(TARGET)/scripts"
ifeq ($(OS),Windows_NT)
@py ts-minifier.py --such-meme -d "$(BUILDDIR)/$(TARGET)/scripts" $(wildcard scripts/*.te)
@py ts-minifier.py --such-meme -d "$(BUILDDIR)/$(TARGET)/scripts" $(SCRIPT_SRCS)
@py te2c.py "$(BUILDDIR)/$(TARGET)/script/builtin" "$(BUILDDIR)/$(TARGET)/scripts"
else
@python3 ts-minifier.py --such-meme -d "$(BUILDDIR)/$(TARGET)/scripts" $(wildcard scripts/*.te)
@python3 ts-minifier.py --such-meme -d "$(BUILDDIR)/$(TARGET)/scripts" $(SCRIPT_SRCS)
@python3 te2c.py "$(BUILDDIR)/$(TARGET)/script/builtin" "$(BUILDDIR)/$(TARGET)/scripts"
endif

2
scripts/HelloWorld.te Normal file
View File

@@ -0,0 +1,2 @@
println("Hello world from TegraScript!")
pause()

View File

@@ -0,0 +1,7 @@
println("Joy-Con Kalibrierungshinweis")
println("Dieser Hinweis beschreibt die manuelle Neukalibrierung der Joy-Cons.")
println("")
println("1. Gehe im Hauptmenü auf \"Rekalibrieren\" oder halte L3+R3 gedrückt.")
println("2. Bewege beide Sticks in alle Richtungen und lasse sie in Mittelstellung los.")
println("3. Drücke beliebige Taste, um zurückzukehren.")
pause()

View File

@@ -0,0 +1,6 @@
println("SD-Karten Schnelltest")
println("1. Entferne die SD-Karte sicher vom Switch.")
println("2. Setze die SD-Karte erneut ein und warte einige Sekunden.")
println("3. Wähle im Hauptmenü \"Mount SD\" oder starte TegraExplorer neu.")
println("Drücke den Power- oder B-Button, um fortzufahren.")
pause()

View File

@@ -0,0 +1,5 @@
println("USB-Reconnect Assistent")
println("1. Ziehe das USB-Kabel kurz ab und stecke es wieder ein.")
println("2. Drücke bei Bedarf den Power-Button, um den Bildschirm zu aktivieren.")
println("3. Wenn TegraExplorer wieder reagiert, wähle mit B diese Hilfe ab.")
pause()

View File

@@ -27,22 +27,92 @@
#ifdef INCLUDE_BUILTIN_SCRIPTS
#include "../../build/TegraExplorer/script/builtin.h"
#define MAX_BUILTIN_MENU_ENTRIES (EMBEDDED_SCRIPTS_LEN * 2)
typedef struct {
char name[64];
int scriptIndices[EMBEDDED_SCRIPTS_LEN];
int scriptCount;
} EmbeddedScriptFolder_t;
static void GetScriptDisplayName(const char *fullName, char *out, size_t outSize) {
if (!out || outSize == 0) {
return;
}
const char *start = strrchr(fullName, '/');
start = (start) ? start + 1 : fullName;
size_t len = 0;
while (start[len] && len < outSize - 1) {
len++;
}
if (len >= 3 && start[len - 3] == '.' && start[len - 2] == 't' && start[len - 1] == 'e') {
len -= 3;
}
if (len >= outSize) {
len = outSize - 1;
}
memcpy(out, start, len);
out[len] = '\0';
}
static void RunEmbeddedScriptIndex(int index) {
if (index < 0 || index >= EMBEDDED_SCRIPTS_LEN) {
return;
}
RunScriptString((char*)embedded_scripts_g[index].script, (u32)strlen(embedded_scripts_g[index].script));
}
static void ShowEmbeddedFolder(const EmbeddedScriptFolder_t *folder) {
if (!folder || folder->scriptCount <= 0) {
return;
}
Vector_t ent = newVec(sizeof(MenuEntry_t), folder->scriptCount + 1);
MenuEntry_t backEntry = {.optionUnion = COLORTORGB(COLOR_WHITE), .name = "<- Zurück"};
vecAdd(&ent, backEntry);
char displayNames[EMBEDDED_SCRIPTS_LEN][64] = {{0}};
for (int i = 0; i < folder->scriptCount; i++) {
int scriptIndex = folder->scriptIndices[i];
if (scriptIndex < 0 || scriptIndex >= EMBEDDED_SCRIPTS_LEN) {
continue;
}
GetScriptDisplayName(embedded_scripts_g[scriptIndex].name, displayNames[i], sizeof(displayNames[i]));
MenuEntry_t entry = {.optionUnion = COLORTORGB(COLOR_BLUE), .name = displayNames[i], .icon = 128};
vecAdd(&ent, entry);
}
int selected = (ent.count > 1) ? 1 : 0;
while (1) {
gfx_clearscreen();
gfx_printf("%s\n\n", folder->name);
int res = newMenu(&ent, selected, 79, 28, ALWAYSREDRAW | ENABLEPAGECOUNT, ent.count - 1);
if (res <= 0) {
break;
}
selected = res;
int scriptIndex = folder->scriptIndices[res - 1];
RunEmbeddedScriptIndex(scriptIndex);
}
free(ent.data);
}
#endif
extern hekate_config h_cfg;
enum {
#ifndef SCRIPT_ONLY
MainExplore = 0,
MainBrowseSd,
MainMountSd,
MainBrowseEmmc,
MainBrowseEmummc,
MainTools,
MainPartitionSd,
MainViewKeys,
MainViewCredits,
MainExit,
MainExit = 0,
#else
MainExit = 0,
#endif
@@ -56,18 +126,9 @@ enum {
MenuEntry_t mainMenuEntries[] = {
#ifndef SCRIPT_ONLY
[MainExplore] = {.optionUnion = COLORTORGB(COLOR_WHITE) | SKIPBIT, .name = "-- Explore --"},
[MainBrowseSd] = {.optionUnion = COLORTORGB(COLOR_GREEN), .name = "Browse SD"},
[MainMountSd] = {.optionUnion = COLORTORGB(COLOR_YELLOW)}, // To mount/unmount the SD
[MainBrowseEmmc] = {.optionUnion = COLORTORGB(COLOR_BLUE), .name = "Browse EMMC"},
[MainBrowseEmummc] = {.optionUnion = COLORTORGB(COLOR_BLUE), .name = "Browse EMUMMC"},
[MainTools] = {.optionUnion = COLORTORGB(COLOR_WHITE) | SKIPBIT, .name = "\n-- Tools --"},
[MainPartitionSd] = {.optionUnion = COLORTORGB(COLOR_ORANGE), .name = "Partition the sd"},
[MainViewKeys] = {.optionUnion = COLORTORGB(COLOR_YELLOW), .name = "View dumped keys"},
[MainViewCredits] = {.optionUnion = COLORTORGB(COLOR_YELLOW), .name = "Credits"},
[MainExit] = {.optionUnion = COLORTORGB(COLOR_WHITE) | SKIPBIT, .name = "\n-- Exit --"},
[MainExit] = {.optionUnion = COLORTORGB(COLOR_WHITE) | SKIPBIT, .name = "-- Exit --"},
#else
[MainExit] = {.optionUnion = COLORTORGB(COLOR_WHITE), .name = "\n-- Exit --"},
[MainExit] = {.optionUnion = COLORTORGB(COLOR_WHITE), .name = "-- Exit --"},
#endif
[MainPowerOff] = {.optionUnion = COLORTORGB(COLOR_VIOLET), .name = "Power off"},
[MainRebootRCM] = {.optionUnion = COLORTORGB(COLOR_VIOLET), .name = "Reboot to RCM"},
@@ -77,62 +138,7 @@ MenuEntry_t mainMenuEntries[] = {
[MainScripts] = {.optionUnion = COLORTORGB(COLOR_WHITE) | SKIPBIT, .name = "\n-- Scripts --"}
};
void HandleSD(){
gfx_clearscreen();
TConf.curExplorerLoc = LOC_SD;
if (!sd_mount() || sd_get_card_removed()){
gfx_printf("Sd is not mounted!");
hidWait();
}
else
FileExplorer("sd:/");
}
void HandleEMMC(){
GptMenu(MMC_CONN_EMMC);
}
void HandleEMUMMC(){
GptMenu(MMC_CONN_EMUMMC);
}
void ViewKeys(){
gfx_clearscreen();
for (int i = 0; i < 3; i++){
gfx_printf("\nBis key 0%d: ", i);
PrintKey(dumpedKeys.bis_key[i], AES_128_KEY_SIZE * 2);
}
gfx_printf("\nMaster key 0: ");
PrintKey(dumpedKeys.master_key, AES_128_KEY_SIZE);
gfx_printf("\nHeader key: ");
PrintKey(dumpedKeys.header_key, AES_128_KEY_SIZE * 2);
gfx_printf("\nSave mac key: ");
PrintKey(dumpedKeys.save_mac_key, AES_128_KEY_SIZE);
u8 fuseCount = 0;
for (u32 i = 0; i < 32; i++){
if ((fuse_read_odm(7) >> i) & 1)
fuseCount++;
}
gfx_printf("\n\nPkg1 ID: '%s'\nFuse count: %d", TConf.pkg1ID, fuseCount);
hidWait();
}
void ViewCredits(){
gfx_clearscreen();
gfx_printf("\nTegraexplorer v%d.%d.%d\nBy SuchMemeManySkill\n\nBased on Lockpick_RCM & Hekate, from shchmue & CTCaer\n\n\n", LP_VER_MJ, LP_VER_MN, LP_VER_BF);
if (hidRead()->r)
gfx_printf("%k\"I'm not even sure if it works\" - meme", COLOR_ORANGE);
hidWait();
}
extern bool sd_mounted;
extern bool is_sd_inited;
extern int launch_payload(char *path);
void RebootToAMS(){
@@ -143,26 +149,11 @@ void RebootToHekate(){
launch_payload("sd:/bootloader/update.bin");
}
void MountOrUnmountSD(){
gfx_clearscreen();
if (sd_mounted)
sd_unmount();
else if (!sd_mount())
hidWait();
}
menuPaths mainMenuPaths[] = {
#ifndef SCRIPT_ONLY
[MainBrowseSd] = HandleSD,
[MainMountSd] = MountOrUnmountSD,
[MainBrowseEmmc] = HandleEMMC,
[MainBrowseEmummc] = HandleEMUMMC,
[MainPartitionSd] = FormatSD,
[MainViewKeys] = ViewKeys,
[MainViewCredits] = ViewCredits,
#endif
[MainRebootAMS] = RebootToAMS,
[MainRebootHekate] = RebootToHekate,
#endif
[MainRebootRCM] = reboot_rcm,
[MainPowerOff] = power_off,
[MainRebootNormal] = reboot_normal,
@@ -175,16 +166,6 @@ void EnterMainMenu(){
sd_unmount();
#ifndef SCRIPT_ONLY
// -- Explore --
mainMenuEntries[MainBrowseSd].hide = !sd_mounted;
mainMenuEntries[MainMountSd].name = (sd_mounted) ? "Unmount SD" : "Mount SD";
mainMenuEntries[MainBrowseEmummc].hide = (!emu_cfg.enabled || !sd_mounted);
// -- Tools --
mainMenuEntries[MainPartitionSd].hide = (!is_sd_inited || sd_get_card_removed());
mainMenuEntries[MainViewKeys].hide = !TConf.keysDumped;
// -- Exit --
mainMenuEntries[MainRebootAMS].hide = (!sd_mounted || !FileExists("sd:/atmosphere/reboot_payload.bin"));
mainMenuEntries[MainRebootHekate].hide = (!sd_mounted || !FileExists("sd:/bootloader/update.bin"));
mainMenuEntries[MainRebootRCM].hide = h_cfg.t210b01;

BIN
tools/bin2c/bin2c Executable file

Binary file not shown.

BIN
tools/lz/lz77 Executable file

Binary file not shown.