diff --git a/Makefile b/Makefile index e72adf2..e4da449 100644 --- a/Makefile +++ b/Makefile @@ -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 diff --git a/scripts/HelloWorld.te b/scripts/HelloWorld.te new file mode 100644 index 0000000..4f0bec7 --- /dev/null +++ b/scripts/HelloWorld.te @@ -0,0 +1,2 @@ +println("Hello world from TegraScript!") +pause() diff --git a/scripts/Problembehandlung/ResetCalibration.te b/scripts/Problembehandlung/ResetCalibration.te new file mode 100644 index 0000000..bfe8189 --- /dev/null +++ b/scripts/Problembehandlung/ResetCalibration.te @@ -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() diff --git a/scripts/Problembehandlung/SDCardCheck.te b/scripts/Problembehandlung/SDCardCheck.te new file mode 100644 index 0000000..aef2548 --- /dev/null +++ b/scripts/Problembehandlung/SDCardCheck.te @@ -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() diff --git a/scripts/Problembehandlung/USBReconnect.te b/scripts/Problembehandlung/USBReconnect.te new file mode 100644 index 0000000..e163680 --- /dev/null +++ b/scripts/Problembehandlung/USBReconnect.te @@ -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() diff --git a/source/tegraexplorer/mainmenu.c b/source/tegraexplorer/mainmenu.c index 0b4be86..eb1c6e9 100644 --- a/source/tegraexplorer/mainmenu.c +++ b/source/tegraexplorer/mainmenu.c @@ -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; diff --git a/tools/bin2c/bin2c b/tools/bin2c/bin2c new file mode 100755 index 0000000..9d930eb Binary files /dev/null and b/tools/bin2c/bin2c differ diff --git a/tools/lz/lz77 b/tools/lz/lz77 new file mode 100755 index 0000000..e3481a1 Binary files /dev/null and b/tools/lz/lz77 differ