1
0
Fork 0
mirror of https://github.com/suchmememanyskill/TegraExplorer.git synced 2024-11-29 15:22:09 +00:00

Start gfx rewrite & reorganize TE

This commit is contained in:
Such Meme, Many Skill 2020-03-18 00:41:09 +01:00
parent 761ceb7dbe
commit 6aed4ad7b3
16 changed files with 570 additions and 62 deletions

View file

@ -0,0 +1,58 @@
#pragma once
#include "types.h"
extern const char *gfx_file_size_names[];
extern const char *menu_sd_states[];
extern const char *emmc_fs_entries[];
enum mainmenu_main_return {
MAIN_SDCARD = 0,
MAIN_EMMC_SAF,
MAIN_EMMC_SYS,
MAIN_EMMC_USR,
MAIN_EMUMMC_SAF,
MAIN_EMUMMC_SYS,
MAIN_EMUMMC_USR,
MAIN_MOUNT_SD,
MAIN_TOOLS,
MAIN_SD_FORMAT,
MAIN_CREDITS,
MAIN_EXIT
};
extern menu_entry mainmenu_main[];
enum mainmenu_shutdown_return {
SHUTDOWN_REBOOT_RCM = 1,
SHUTDOWN_REBOOT_NORMAL,
SHUTDOWN_POWER_OFF,
SHUTDOWN_HEKATE,
SHUTDOWN_AMS
};
extern menu_entry mainmenu_shutdown[];
enum mainmenu_tools_return {
TOOLS_DISPLAY_INFO = 1,
TOOLS_DISPLAY_GPIO,
TOOLS_DUMPFIRMWARE,
TOOLS_DUMPUSERSAVE,
TOOLS_DUMP_BOOT,
TOOLS_RESTORE_BOOT
};
extern menu_entry mainmenu_tools[];
enum mainmenu_format_return {
FORMAT_EMUMMC = 1,
FORMAT_ALL_FAT32
};
extern menu_entry mainmenu_format[];
enum mmc_types {
SYSMMC = 1,
EMUMMC
};
extern menu_entry utils_mmcChoice[];

View file

@ -0,0 +1,19 @@
#include "common.h"
const char *gfx_file_size_names[] = {
"B ",
"KB",
"MB",
"GB"
};
const char *menu_sd_states[] = {
"\nUnmount SD",
"\nMount SD"
};
const char *emmc_fs_entries[] = {
"SYSTEM",
"USER",
"SAFE"
};

View file

@ -0,0 +1,48 @@
#include "common.h"
#include "types.h"
menu_entry mainmenu_main[] = {
{"[SD:/] SD CARD\n", COLOR_GREEN, ISMENU},
{"[SYSTEM:/] EMMC", COLOR_ORANGE, ISMENU},
{"[USER:/] EMMC", COLOR_ORANGE, ISMENU},
{"[SAFE:/] EMMC", COLOR_ORANGE, ISMENU},
{"\n[SYSTEM:/] EMUMMC", COLOR_BLUE, ISMENU},
{"[USER:/] EMUMMC", COLOR_BLUE, ISMENU},
{"[SAFE:/] EMUMMC", COLOR_BLUE, ISMENU},
{"\nMount/Unmount SD", COLOR_WHITE, ISMENU},
{"Tools", COLOR_VIOLET, ISMENU},
{"SD format", COLOR_VIOLET, ISMENU},
{"\nCredits", COLOR_WHITE, ISMENU},
{"Exit", COLOR_WHITE, ISMENU}
};
menu_entry mainmenu_shutdown[] = {
{"Back", COLOR_WHITE, ISMENU},
{"\nReboot to RCM", COLOR_VIOLET, ISMENU},
{"Reboot normally", COLOR_ORANGE, ISMENU},
{"Power off\n", COLOR_BLUE, ISMENU},
{"Reboot to Hekate", COLOR_GREEN, ISMENU},
{"Reboot to Atmosphere", COLOR_GREEN, ISMENU}
};
menu_entry mainmenu_tools[] = {
{"Back", COLOR_WHITE, ISMENU},
{"\nDisplay Console Info", COLOR_GREEN, ISMENU},
{"Display GPIO pins", COLOR_VIOLET, ISMENU},
{"Dump Firmware", COLOR_BLUE, ISMENU},
{"Dump User Saves", COLOR_YELLOW, ISMENU},
{"[DEBUG] Dump bis", COLOR_RED, ISMENU},
{"[DEBUG] Restore bis", COLOR_RED, ISMENU}
};
menu_entry mainmenu_format[] = {
{"Back\n", COLOR_WHITE, ISMENU},
{"Format entire SD to FAT32", COLOR_RED, ISMENU},
{"Format for EmuMMC setup (FAT32/RAW)", COLOR_RED, ISMENU}
};
menu_entry utils_mmcChoice[] = {
{"Back\n", COLOR_WHITE, ISMENU},
{"SysMMC", COLOR_ORANGE, ISMENU},
{"EmuMMC", COLOR_BLUE, ISMENU}
};

View file

@ -0,0 +1,31 @@
#pragma once
#include "../../utils/types.h"
#define ISDIR (1 << 0)
#define ISARC (1 << 1)
#define ISHIDE (1 << 8)
#define ISMENU (1 << 9)
#define ISSKIP (1 << 10)
#define ISGB (1 << 7)
#define ISMB (1 << 6)
#define ISKB (1 << 5)
#define ISB (1 << 4)
#define SETBIT(object, shift, value) ((value) ? (object |= shift) : (object &= ~shift))
/* Bit table for property as a file:
0000 0001: Directory bit
0000 0010: Archive bit (or hideme)
0001 0000: Size component is a Byte
0010 0000: Size component is a KiloByte
0100 0000: Size component is a MegaByte
1000 0000: Size component is a GigaByte : note that this won't surpass gigabytes, but i don't expect people to have a single file that's a terrabyte big
*/
typedef struct {
char *name;
u32 storage;
u16 property;
} menu_entry;

View file

@ -22,6 +22,7 @@
#include "../mem/sdram.h"
#include "../storage/emummc.h"
#include "../config/config.h"
#include "common/common.h"
sdmmc_storage_t storage;
emmc_part_t *system_part;

View file

@ -50,7 +50,9 @@ static const u8 bis_key_source[3][0x20] = {
0x4D, 0x12, 0xE1, 0x4B, 0x2A, 0x47, 0x4C, 0x1C, 0x09, 0xCB, 0x03, 0x59, 0xF0, 0x15, 0xF4, 0xE4}
};
/*
enum mmc_types {
SYSMMC = 0,
EMUMMC
};
*/

View file

@ -58,6 +58,24 @@ int message(u32 color, const char* message, ...){
return btn_wait();
}
/*
int gfx_errprint(u32 color, int func, int err, int add){
clearscreen();
SWAPCOLOR(COLOR_ORANGE);
gfx_printf("\nAn error occured:\n\n");
gfx_printf("Function: %s\nErrcode: %d\nDesc: %s\n");
if (add)
gfx_printf("Additional info: %d");
gfx_printf("\nPress any button to return");
RESETCOLOR;
return btn_wait();
}
*/
// Change makemenu to combine makefilemenu to save space + make nagivation more consistant
int makemenu(menu_item menu[], int menuamount){
int currentpos = 1, i, res;
clearscreen();
@ -216,7 +234,7 @@ void printfsentry(fs_entry file, bool highlight, bool refresh){
int makefilemenu(fs_entry *files, int amount, char *path){
int currentpos = -2, i, res = 0, offset = 0, quickoffset = 300;
u32 timer;
u32 timer, scrolltimer;
bool refresh = false;
clearscreen();
gfx_con_setpos(544, 0);
@ -237,17 +255,28 @@ int makefilemenu(fs_entry *files, int amount, char *path){
refresh = false;
gfx_printf("\n%k%K %s %s\n\nTime taken for screen draw: %dms ", COLOR_BLUE, COLOR_DEFAULT, (offset + 60 < amount) ? "v" : " ", (offset > 0) ? "^" : " ", get_tmr_ms() - timer);
if (quickoffset == 300)
res = btn_wait();
else {
msleep(quickoffset);
res = btn_read();
}
while (btn_read() & BTN_POWER);
if (res == 0)
quickoffset = 300;
else if (quickoffset > 46)
quickoffset -= 45;
res = 0;
while (!res){
res = btn_read();
if (!res)
quickoffset = 300;
if (quickoffset < 300){
scrolltimer = get_tmr_ms();
while (res){
if (scrolltimer + quickoffset <= get_tmr_ms())
break;
res = btn_read();
}
}
if (quickoffset > 46 && res)
quickoffset -= 45;
}
if ((res & BTN_VOL_UP) && currentpos > -2){
currentpos--;

View file

@ -0,0 +1,112 @@
#include "gfxutils.h"
#include <string.h>
#include <stdarg.h>
#include "menu.h"
#include "../../gfx/gfx.h"
#include "../../power/max17050.h"
#include "../../utils/btn.h"
#include "../../utils/util.h"
#include "../../mem/heap.h"
void gfx_clearscreen(){
int battery = 0;
max17050_get_property(MAX17050_RepSOC, &battery);
gfx_clear_grey(0x1B);
SWAPCOLOR(COLOR_DEFAULT);
SWAPBGCOLOR(COLOR_WHITE);
gfx_box(0, 1263, 719, 1279, COLOR_WHITE);
gfx_con_setpos(0, 1263);
gfx_printf("Move: Vol+/- | Select: Pow | Battery: %3d%%", battery >> 8);
gfx_box(0, 0, 719, 15, COLOR_WHITE);
gfx_con_setpos(0, 0);
gfx_printf("Tegraexplorer v1.3.3\n");
RESETCOLOR;
}
int gfx_message(u32 color, const char* message, ...){
va_list ap;
va_start(ap, message);
gfx_clearscreen();
SWAPCOLOR(color);
gfx_vprintf(message, ap);
va_end(ap);
return btn_wait();
}
int gfx_errprint(u32 color, int func, int err, int add){
gfx_clearscreen();
SWAPCOLOR(COLOR_ORANGE);
gfx_printf("\nAn error occured:\n\n");
gfx_printf("Function: %s\nErrcode: %d\nDesc: %s\n");
if (add)
gfx_printf("Additional info: %d");
gfx_printf("\nPress any button to return");
RESETCOLOR;
return btn_wait();
}
int gfx_makewaitmenu(char *hiddenmessage, int timer){
int res;
u32 start = get_tmr_s();
while (btn_read() != 0);
while(1){
res = btn_read();
if (res & BTN_VOL_DOWN || res & BTN_VOL_UP)
return 0;
if (start + timer > get_tmr_s())
gfx_printf("\r<Wait %d seconds> ", timer + start - get_tmr_s());
else if (res & BTN_POWER)
return 1;
else
gfx_printf("\r%s", hiddenmessage);
}
}
void gfx_printlength(int size, char *toprint){
char *temp;
temp = (char*) malloc (size + 1);
if (strlen(toprint) > size){
strlcpy(temp, toprint, size);
memset(temp + size - 3, '.', 3);
memset(temp + size, '\0', 1);
}
else
strcpy(temp, toprint);
gfx_printf("%s", temp);
free(temp);
}
void gfx_printandclear(char *in, int length){
u32 x, y;
gfx_printlength(length, in);
gfx_con_getpos(&x, &y);
gfx_box(x, y, 719, y + 16, COLOR_DEFAULT);
}
void gfx_printfilesize(int size, char *type){
SWAPCOLOR(COLOR_VIOLET);
gfx_printf("\a%4d\e%s", size, type);
RESETCOLOR;
}

View file

@ -0,0 +1,15 @@
#pragma once
#include "../../gfx/gfx.h"
#include "../../utils/types.h"
#define SWAPCOLOR(color) gfx_printf("%k", color)
#define SWAPBGCOLOR(color) gfx_printf("%K", color)
#define RESETCOLOR gfx_printf("%k%K", COLOR_WHITE, COLOR_DEFAULT)
void gfx_clearscreen();
int gfx_message(u32 color, const char* message, ...);
int gfx_errprint(u32 color, int func, int err, int add);
int gfx_makewaitmenu(char *hiddenmessage, int timer);
void gfx_printlength(int size, char *toprint);
void gfx_printandclear(char *in, int length);
void gfx_printfilesize(int size, char *type);

View file

@ -0,0 +1,123 @@
#include "menu.h"
#include "gfxutils.h"
#include "../common/types.h"
#include "../../utils/btn.h"
#include "../common/common.h"
#include "../../utils/util.h"
#include "../../mem/minerva.h"
void _printentry(menu_entry entry, bool highlighted, bool refresh){
int size;
if (entry.property & ISMENU)
SWAPCOLOR(entry.storage);
else if (entry.property & ISDIR)
SWAPCOLOR(COLOR_WHITE);
else {
SWAPCOLOR(COLOR_VIOLET);
for (size = 4; size < 8; size++)
if ((entry.property & (1 << size)))
break;
}
if (highlighted){
SWAPBGCOLOR(COLOR_WHITE);
if ((entry.property & ISMENU) ? entry.storage == COLOR_WHITE : entry.property & ISDIR)
SWAPCOLOR(COLOR_DEFAULT);
}
else
SWAPBGCOLOR(COLOR_DEFAULT);
if (refresh)
gfx_printandclear(entry.name, 37);
else
gfx_printlength(37, entry.name);
if (entry.property & ISDIR || entry.property & ISMENU)
gfx_printf("\n");
else {
SWAPCOLOR(COLOR_BLUE);
gfx_printf("\a%d\e%s", entry.storage, gfx_file_size_names[size - 4]);
}
}
int menu_make(menu_entry *entries, int amount, char *toptext){
int currentpos = 0, i, res = 0, offset = 0, delay = 300;
u32 scrolltimer, timer;
bool refresh = false;
gfx_clearscreen();
gfx_con_setpos(512, 0);
SWAPCOLOR(COLOR_DEFAULT);
SWAPBGCOLOR(COLOR_WHITE);
gfx_printf("%3d entries\n", amount);
RESETCOLOR;
SWAPCOLOR(COLOR_GREEN);
gfx_printlength(42, toptext);
RESETCOLOR;
while (!(res & BTN_POWER)){
gfx_con_setpos(0, 47);
timer = get_tmr_ms();
if (!currentpos){
while (currentpos < amount && entries[currentpos].property & (ISSKIP | ISHIDE))
currentpos++;
}
if (currentpos == amount - 1){
while (currentpos >= 1 && entries[currentpos].property & (ISSKIP | ISHIDE))
currentpos--;
}
for (int i = 0 + offset; i < amount && i < 60 + offset; i++)
if (!(entries[i].property & ISHIDE))
_printentry(entries[i], (i == currentpos), refresh);
gfx_printf("\n%k%K %s %s\n\nTime taken for screen draw: %dms ", COLOR_BLUE, COLOR_DEFAULT, (offset + 60 < amount) ? "v" : " ", (offset > 0) ? "^" : " ", get_tmr_ms() - timer);
while (btn_read() & BTN_POWER);
res = 0;
while (!res){
res = btn_read();
if (!res)
delay = 300;
if (delay < 300){
scrolltimer = get_tmr_ms();
while (res){
if (scrolltimer + delay <= get_tmr_ms())
break;
res = btn_read();
}
}
if (delay > 46 && res)
delay -= 45;
}
if (res & BTN_VOL_UP && currentpos >= 1){
currentpos--;
while(entries[currentpos].property & (ISSKIP | ISHIDE) && currentpos >= 1)
currentpos--;
}
else if (res & BTN_VOL_DOWN && currentpos < amount - 1){
currentpos++;
while(entries[currentpos].property & (ISSKIP | ISHIDE) && currentpos < amount - 1)
currentpos++;
}
}
minerva_periodic_training();
//return (mode) ? currentpos : entries[currentpos].property;
return currentpos;
}

View file

@ -0,0 +1,4 @@
#pragma once
#include "../common/types.h"
int menu_make(menu_entry *entries, int amount, char *toptext);

View file

@ -11,11 +11,17 @@
#include "../storage/emummc.h"
#include "script.h"
#include "common/common.h"
#include "gfx/menu.h"
#include "utils/utils.h"
extern bool sd_mount();
extern void sd_unmount();
extern bool return_sd_mounted(int value);
extern int launch_payload(char *path);
/*
menu_item mainmenu[MAINMENU_AMOUNT] = {
{"[SD:/] SD CARD\n", COLOR_GREEN, SD_CARD, 1},
{"[SYSTEM:/] EMMC", COLOR_ORANGE, EMMC_SYS, 1},
@ -64,12 +70,9 @@ menu_item mmcChoice[3] = {
{"SysMMC", COLOR_ORANGE, SYSMMC, 1},
{"EmuMMC", COLOR_BLUE, EMUMMC, 1}
};
*/
const char emmc_entries[3][8] = {
"SAFE",
"SYSTEM",
"USER"
};
int res = 0;
@ -81,7 +84,7 @@ void MainMenu_EMMC(){
if (makewaitmenu("You're about to enter EMMC\nModifying anything here\n can result in a BRICK!\n\nPlease only continue\n if you know what you're doing\n\nPress Vol+/- to return\n", "Press Power to enter", 4)){
connect_mmc(SYSMMC);
if (!mount_mmc(emmc_entries[res - 2], res - 1))
if (!mount_mmc(emmc_fs_entries[res - 2], res - 1))
fileexplorer("emmc:/");
else
message(COLOR_RED, "EMMC failed to mount!");
@ -91,7 +94,7 @@ void MainMenu_EMMC(){
void MainMenu_EMUMMC(){
connect_mmc(EMUMMC);
if (!mount_mmc(emmc_entries[res - 5], res - 4))
if (!mount_mmc(emmc_fs_entries[res - 5], res - 4))
fileexplorer("emmc:/");
else
message(COLOR_RED, "EMUMMC failed to mount!");
@ -105,52 +108,46 @@ void MainMenu_MountSD(){
}
void MainMenu_Tools(){
res = makemenu(toolsmenu, 8);
//res = makemenu(toolsmenu, 8);
res = menu_make(mainmenu_tools, 7, "-- Tools Menu --");
switch(res){
case DISPLAY_INFO:
case TOOLS_DISPLAY_INFO:
displayinfo();
break;
case DISPLAY_GPIO:
case TOOLS_DISPLAY_GPIO:
displaygpio();
break;
case DUMPFIRMWARE:
case TOOLS_DUMPFIRMWARE:
dumpfirmware(SYSMMC);
break;
case DUMPUSERSAVE:
if (mainmenu[4].property >= 0){
if ((res = makemenu(mmcChoice, 3)) >= 0)
dumpusersaves(res);
}
else
dumpusersaves(SYSMMC);
case TOOLS_DUMPUSERSAVE:
if ((res = utils_mmcMenu()) > 0)
dumpusersaves(res);
break;
case DUMP_BOOT:
case TOOLS_DUMP_BOOT:
dump_emmc_parts(PART_BOOT | PART_PKG2, SYSMMC);
break;
case RESTORE_BOOT:
case TOOLS_RESTORE_BOOT:
if (makewaitmenu(
"WARNING!\nThis will mess with your switch boot files\nMake a nand backup beforehand!\n\nThis will pull from path:\nsd:/tegraexplorer/boot.bis\n\nVol +/- to cancel\n",
"Power to confirm",
5
))
{
if (emu_cfg.enabled){
if ((res = makemenu(mmcChoice, 3)) >= 0)
restore_bis_using_file("sd:/tegraexplorer/boot.bis", res);
}
else
restore_bis_using_file("sd:/tegraexplorer/boot.bis", SYSMMC);
if ((res = utils_mmcMenu()) > 0)
restore_bis_using_file("sd:/tegraexplorer/boot.bis", res);
}
break;
}
}
void MainMenu_SDFormat(){
res = makemenu(formatmenu, 4);
//res = makemenu(formatmenu, 4);
res = menu_make(mainmenu_format, 3, "-- Format Menu --");
if (res >= 0){
if (res > 0){
if(makewaitmenu("Are you sure you want to format your sd?\nThis will delete everything on your SD card\nThis action is irreversible!\n\nPress Vol+/- to cancel\n", "Press Power to continue", 10)){
if (format(res)){
sd_unmount();
@ -165,30 +162,36 @@ void MainMenu_Credits(){
void MainMenu_Exit(){
if (return_sd_mounted(1)){
/*
shutdownmenu[5].property = (checkfile("/bootloader/update.bin")) ? 1 : -1;
shutdownmenu[6].property = (checkfile("/atmosphere/reboot_payload.bin")) ? 1 : -1;
*/
SETBIT(mainmenu_shutdown[4].property, ISHIDE, !checkfile("/bootloader/update.bin"));
SETBIT(mainmenu_shutdown[5].property, ISHIDE, !checkfile("/atmosphere/reboot_payload.bin"));
}
else {
shutdownmenu[5].property = -1;
shutdownmenu[6].property = -1;
for (int i = 4; i <= 5; i++)
SETBIT(mainmenu_shutdown[i].property, ISHIDE, 1);
}
res = makemenu(shutdownmenu, 7);
//res = makemenu(shutdownmenu, 7);
res = menu_make(mainmenu_shutdown, 6, "-- Shutdown Menu --");
switch(res){
case REBOOT_RCM:
case SHUTDOWN_REBOOT_RCM:
reboot_rcm();
case REBOOT_NORMAL:
case SHUTDOWN_REBOOT_NORMAL:
reboot_normal();
case POWER_OFF:
case SHUTDOWN_POWER_OFF:
power_off();
case HEKATE:
case SHUTDOWN_HEKATE:
launch_payload("/bootloader/update.bin");
case AMS:
case SHUTDOWN_AMS:
launch_payload("/atmosphere/reboot_payload.bin");
} //todo declock bpmp
}
@ -213,6 +216,7 @@ void RunMenuOption(int option){
mainmenu_functions[option - 1]();
}
/*
void fillmainmenu(){
int i;
@ -232,38 +236,81 @@ void fillmainmenu(){
break;
case 8:
if (return_sd_mounted(1)){
mainmenu[i].property = 2;
strcpy(mainmenu[i].name, "\nUnmount SD");
//mainmenu[i].property = 2;
//strcpy(mainmenu[i].name, "\nUnmount SD");
mainmenu_main[7].name = (menu_sd_states[0]);
}
else {
mainmenu[i].property = 1;
strcpy(mainmenu[i].name, "\nMount SD");
//mainmenu[i].property = 1;
//strcpy(mainmenu[i].name, "\nMount SD");
mainmenu_main[7].name = (menu_sd_states[1]);
}
break;
}
}
}
*/
void te_main(){
int setter;
if (dump_biskeys() == -1){
message(COLOR_RED, "Biskeys failed to dump!\nEmmc will not be mounted!");
mainmenu[1].property = -1;
mainmenu[2].property = -1;
mainmenu[3].property = -1;
for (int i = 1; i <= 3; i++)
mainmenu_main[i].property |= ISHIDE;
}
if (emummc_load_cfg()){
mainmenu[4].property = -2;
mainmenu[5].property = -2;
mainmenu[6].property = -2;
for (int i = 4; i <= 6; i++)
mainmenu_main[i].property |= ISHIDE;
}
disconnect_mmc();
while (1){
fillmainmenu();
res = makemenu(mainmenu, MAINMENU_AMOUNT);
//fillmainmenu();
setter = return_sd_mounted(1);
if (emu_cfg.enabled){
for (int i = 4; i <= 6; i++)
SETBIT(mainmenu_main[i].property, ISHIDE, !setter);
}
SETBIT(mainmenu_main[0].property, ISHIDE, !setter);
mainmenu_main[7].name = (menu_sd_states[!setter]);
/*
if (return_sd_mounted(1)){
if (emu_cfg.enabled){
for (int i = 4; i <= 6; i++)
SETBIT(mainmenu_main[i], ISHIDE, 0);
}
SETBIT(mainmenu_main[0], ISHIDE, 0);
mainmenu_main[7].name = (menu_sd_states[0]);
}
else {
if (emu_cfg.enabled){
for (int i = 4; i <= 6; i++)
SETBIT(mainmenu_main[i], ISHIDE, 1);
}
SETBIT(mainmenu_main[0], ISHIDE, 1);
mainmenu_main[7].name = (menu_sd_states[1]);
}
*/
setter = return_sd_mounted(10);
SETBIT(mainmenu_main[9].property, ISHIDE, !setter);
/*
if (return_sd_mounted(10))
SETBIT(mainmenu_main[0], ISHIDE, 0);
else
SETBIT(mainmenu_main[0], ISHIDE, 1);
*/
//res = makemenu(mainmenu, MAINMENU_AMOUNT);
res = menu_make(mainmenu_main, 12, "-- Main Menu --") + 1;
RunMenuOption(res);
}
}

View file

@ -11,6 +11,7 @@ typedef struct _menu_item {
short property;
} menu_item;
/*
enum mainmenu_return {
SD_CARD = 1,
EMMC_SAF,
@ -47,5 +48,6 @@ enum formatmenu_return {
FORMAT_EMUMMC = 0,
FORMAT_ALL_FAT32
};
*/
void te_main();

View file

@ -13,6 +13,7 @@
#include "emmc.h"
#include "fs.h"
#include "io.h"
#include "common/common.h"
extern bool sd_mount();
extern void sd_unmount();
@ -188,7 +189,7 @@ int format(int mode){
timer = get_tmr_s();
totalsectors = sd_storage.csd.capacity;
if (mode == 0){
if (mode == FORMAT_EMUMMC){
if (totalsectors < 83886080){
gfx_printf("%kYou seem to be running this on a <=32GB SD\nNot enough free space for emummc!", COLOR_RED);
fatalerror = true;

View file

@ -0,0 +1,13 @@
#include "utils.h"
#include "../common/common.h"
#include "../gfx/menu.h"
#include "../../storage/emummc.h"
int utils_mmcMenu(){
int res;
if (emu_cfg.enabled)
return menu_make(utils_mmcChoice, 3, "-- Choose MMC --");
else
return SYSMMC;
}

View file

@ -0,0 +1,3 @@
#pragma once
int utils_mmcMenu();