-cleanup stuff

-fixed rebooting wiiflow with holding down b and pressing home twice
This commit is contained in:
fix94.1 2012-10-21 15:28:00 +00:00
parent 09e5f05eda
commit 2f4c8fb0fd
10 changed files with 155 additions and 340 deletions

View File

@ -27,10 +27,8 @@ static u8 *appldr = (u8 *)0x81200000;
#define APPLDR_OFFSET 0x910
#define APPLDR_CODE 0x918
/* Variables */
static u32 buffer[0x20] ATTRIBUTE_ALIGN(32);
void maindolpatches(void *dst, int len, u8 vidMode, GXRModeObj *vmode, bool vipatch, bool countryString, u8 patchVidModes, int aspectRatio, u32 returnTo);
void maindolpatches(void *dst, int len, u8 vidMode, GXRModeObj *vmode, bool vipatch,
bool countryString, u8 patchVidModes, int aspectRatio, u32 returnTo);
static void patch_NoDiscinDrive(void *buffer, u32 len);
static void Anti_002_fix(void *Address, int Size);
static bool Remove_001_Protection(void *Address, int Size);
@ -38,7 +36,17 @@ static void PrinceOfPersiaPatch();
static void NewSuperMarioBrosPatch();
bool hookpatched = false;
s32 Apploader_Run(entry_point *entry, u8 vidMode, GXRModeObj *vmode, bool vipatch, bool countryString, u8 patchVidModes, int aspectRatio, u32 returnTo)
/* Thanks Tinyload */
static struct
{
char revision[16];
void *entry;
s32 size;
s32 trailersize;
s32 padding;
} apploader_hdr ATTRIBUTE_ALIGN(32);
u32 Apploader_Run(u8 vidMode, GXRModeObj *vmode, bool vipatch, bool countryString, u8 patchVidModes, int aspectRatio, u32 returnTo)
{
PrinceOfPersiaPatch();
NewSuperMarioBrosPatch();
@ -48,29 +56,31 @@ s32 Apploader_Run(entry_point *entry, u8 vidMode, GXRModeObj *vmode, bool vipatc
int offset = 0;
u32 appldr_len;
s32 ret;
app_entry appldr_entry;
app_init appldr_init;
app_main appldr_main;
app_final appldr_final;
/* Read apploader header */
ret = WDVD_Read(buffer, 0x20, APPLDR_OFFSET);
ret = WDVD_Read(&apploader_hdr, 0x20, APPLDR_OFFSET);
if(ret < 0)
return ret;
return 0;
/* Calculate apploader length */
appldr_len = buffer[5] + buffer[6];
appldr_len = apploader_hdr.size + apploader_hdr.trailersize;
/* Read apploader code */
ret = WDVD_Read(appldr, appldr_len, APPLDR_CODE);
if(ret < 0)
return ret;
return 0;
/* Flush into memory */
DCFlushRange(appldr, appldr_len);
ICInvalidateRange(appldr, appldr_len);
/* Set apploader entry function */
app_entry appldr_entry = (app_entry)buffer[4];
appldr_entry = apploader_hdr.entry;
/* Call apploader entry */
appldr_entry(&appldr_init, &appldr_main, &appldr_final);
@ -88,15 +98,12 @@ s32 Apploader_Run(entry_point *entry, u8 vidMode, GXRModeObj *vmode, bool vipatc
ICInvalidateRange(dst, len);
prog(20);
}
free_wip();
if(hooktype != 0 && hookpatched)
ocarina_do_code();
/* Set entry point from apploader */
*entry = appldr_final();
return 0;
return (u32)appldr_final();
}
void maindolpatches(void *dst, int len, u8 vidMode, GXRModeObj *vmode, bool vipatch, bool countryString, u8 patchVidModes, int aspectRatio, u32 returnTo)
@ -236,4 +243,4 @@ static bool Remove_001_Protection(void *Address, int Size)
}
}
return false;
}
}

View File

@ -1,15 +1,13 @@
#ifndef _APPLOADER_H_
#define _APPLOADER_H_
/* Entry point */
typedef void (*entry_point)(void);
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/* Prototypes */
s32 Apploader_Run(entry_point *entry,u8 vidMode, GXRModeObj *vmode, bool vipatch, bool countryString, u8 patchVidModes, int aspectRatio, u32 returnTo);
u32 Apploader_Run(u8 vidMode, GXRModeObj *vmode, bool vipatch, bool countryString,
u8 patchVidModes, int aspectRatio, u32 returnTo);
#ifdef __cplusplus
}

View File

@ -11,6 +11,7 @@
#include "cios.h"
#include "types.h"
#include "wdvd.h"
#include "video_tinyload.h"
/* Constants */
#define PART_INFO_OFFSET 0x10000
@ -103,7 +104,10 @@ s32 Disc_FindPartition(u32 *outbuf)
{
/* Game partition */
if(partition_table[cnt].type == 0)
{
offset = partition_table[cnt].offset;
break;
}
}
/* No game partition found */
@ -210,6 +214,9 @@ GXRModeObj *Disc_SelectVMode(u8 videoselected, u32 *rmode_reg)
void Disc_SetVMode(GXRModeObj *rmode, u32 rmode_reg)
{
/* Remove Load Bar */
video_clear();
/* Set video mode register */
*Video_Mode = rmode_reg;
DCFlushRange((void*)Video_Mode, 4);

View File

@ -1,40 +1,29 @@
#include <gccore.h>
#include <malloc.h>
#include <stdio.h>
#include <string.h>
#include <sys/iosupport.h>
#include <stdarg.h>
#include "gecko.h"
/* init-globals */
bool geckoinit = false;
static ssize_t __out_write(struct _reent *r __attribute__((unused)), int fd __attribute__((unused)), const char *ptr, size_t len)
{
if(geckoinit && ptr)
{
u32 level;
level = IRQ_Disable();
usb_sendbuffer_safe(1, ptr, len);
IRQ_Restore(level);
}
return len;
}
char gprintfBuffer[256];
void gprintf(const char *format, ...)
{
va_list va;
va_start(va, format);
int len = vsnprintf(gprintfBuffer, 255, format, va);
__out_write(NULL, 0, gprintfBuffer, len);
va_end(va);
if(geckoinit)
{
va_start(va, format);
int len = vsnprintf(gprintfBuffer, 255, format, va);
u32 level = IRQ_Disable();
usb_sendbuffer_safe(1, gprintfBuffer, len);
IRQ_Restore(level);
va_end(va);
}
}
bool InitGecko()
{
if(geckoinit)
return geckoinit;
memset(gprintfBuffer, 0, 256);
u32 geckoattached = usb_isgeckoalive(EXI_CHANNEL_1);
if(geckoattached)
{

View File

@ -39,10 +39,9 @@ IOS_Info CurrentIOS;
/* Boot Variables */
u32 GameIOS = 0;
u32 vmode_reg = 0;
entry_point p_entry;
GXRModeObj *vmode = NULL;
u32 AppEntrypoint;
u32 AppEntrypoint = 0;
extern "C" {
extern void __exception_closeall();
@ -72,11 +71,6 @@ int main()
frag_list = normalCFG.fragments;
wbfsDev = normalCFG.wbfsDevice;
wbfs_part_idx = normalCFG.wbfsPart;
if(CurrentIOS.Type == IOS_TYPE_D2X)
{
s32 ret = BlockIOSReload();
gprintf("Block IOS Reload using d2x %s.\n", ret < 0 ? "failed" : "succeeded");
}
prog10();
/* Setup Low Memory */
@ -85,6 +79,11 @@ int main()
if(normalCFG.BootType == TYPE_WII_GAME)
{
WDVD_Init();
if(CurrentIOS.Type == IOS_TYPE_D2X)
{
s32 ret = BlockIOSReload();
gprintf("Block IOS Reload using d2x %s.\n", ret < 0 ? "failed" : "succeeded");
}
if(normalCFG.GameBootType == TYPE_WII_DISC)
{
Disc_SetUSB(NULL, false);
@ -103,17 +102,16 @@ int main()
Disc_FindPartition(&offset);
WDVD_OpenPartition(offset, &GameIOS);
vmode = Disc_SelectVMode(normalCFG.vidMode, &vmode_reg);
Apploader_Run(&p_entry, normalCFG.vidMode, vmode, normalCFG.vipatch, normalCFG.countryString, normalCFG.patchVidMode,
normalCFG.aspectRatio, normalCFG.returnTo);
AppEntrypoint = (u32)p_entry;
AppEntrypoint = Apploader_Run(normalCFG.vidMode, vmode, normalCFG.vipatch, normalCFG.countryString,
normalCFG.patchVidMode, normalCFG.aspectRatio, normalCFG.returnTo);
WDVD_Close();
}
else if(normalCFG.BootType == TYPE_CHANNEL)
{
ISFS_Initialize();
*Disc_ID = TITLE_LOWER(normalCFG.title);
AppEntrypoint = LoadChannel(normalCFG.title, &GameIOS);
vmode = Disc_SelectVMode(normalCFG.vidMode, &vmode_reg);
AppEntrypoint = LoadChannel(normalCFG.title, &GameIOS);
PatchChannel(normalCFG.vidMode, vmode, normalCFG.vipatch, normalCFG.countryString,
normalCFG.patchVidMode, normalCFG.aspectRatio);
ISFS_Deinitialize();
@ -128,7 +126,6 @@ int main()
Disc_SetTime();
/* Set an appropriate video mode */
video_clear();
Disc_SetVMode(vmode, vmode_reg);
/* Shutdown IOS subsystems */
@ -180,31 +177,30 @@ int main()
);
}
}
else if (hooktype)
else if(hooktype)
{
asm volatile (
"lis %r3, AppEntrypoint@h\n"
"ori %r3, %r3, AppEntrypoint@l\n"
"lwz %r3, 0(%r3)\n"
"mtlr %r3\n"
"lis %r3, 0x8000\n"
"ori %r3, %r3, 0x18A8\n"
"nop\n"
"mtctr %r3\n"
"bctr\n"
"lis %r3, AppEntrypoint@h\n"
"ori %r3, %r3, AppEntrypoint@l\n"
"lwz %r3, 0(%r3)\n"
"mtlr %r3\n"
"lis %r3, 0x8000\n"
"ori %r3, %r3, 0x18A8\n"
"nop\n"
"mtctr %r3\n"
"bctr\n"
);
}
else
{
asm volatile (
"lis %r3, AppEntrypoint@h\n"
"ori %r3, %r3, AppEntrypoint@l\n"
"lwz %r3, 0(%r3)\n"
"mtlr %r3\n"
"blr\n"
"lis %r3, AppEntrypoint@h\n"
"ori %r3, %r3, AppEntrypoint@l\n"
"lwz %r3, 0(%r3)\n"
"mtlr %r3\n"
"blr\n"
);
}
IRQ_Restore(level);
return 0;

View File

@ -1,6 +1,4 @@
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <ogcsys.h>
#include "gecko.h"
@ -36,32 +34,26 @@ static s32 di_fd = -1;
s32 WDVD_Init(void)
{
/* Open "/dev/di" */
if (di_fd < 0) {
if(di_fd < 0)
{
di_fd = IOS_Open(di_fs, 0);
if (di_fd < 0)
return di_fd;
}
return 0;
}
s32 WDVD_Close(void)
{
/* Close "/dev/di" */
if (di_fd >= 0) {
if(di_fd >= 0)
{
IOS_Close(di_fd);
di_fd = -1;
}
return 0;
}
s32 WDVD_GetHandle(void)
{
/* Return di handle */
return di_fd;
}
s32 WDVD_Reset(void)
{
memset(inbuf, 0, sizeof(inbuf));
@ -71,30 +63,11 @@ s32 WDVD_Reset(void)
inbuf[1] = 1;
s32 ret = IOS_Ioctl(di_fd, IOCTL_DI_RESET, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf));
if (ret < 0) return ret;
if(ret < 0)
return ret;
return (ret == 1) ? 0 : -ret;
}
s32 WDVD_ReadDiskId(void *id)
{
memset(inbuf, 0, sizeof(inbuf));
/* Read disc ID */
inbuf[0] = IOCTL_DI_READID << 24;
s32 ret = IOS_Ioctl(di_fd, IOCTL_DI_READID, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf));
if (ret < 0) return ret;
if (ret == 1)
{
memcpy(id, outbuf, sizeof(dvddiskid));
return 0;
}
return -ret;
}
s32 WDVD_Seek(u32 offset)
{
memset(inbuf, 0, sizeof(inbuf));
@ -104,16 +77,57 @@ s32 WDVD_Seek(u32 offset)
inbuf[1] = offset;
s32 ret = IOS_Ioctl(di_fd, IOCTL_DI_SEEK, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf));
if (ret < 0) return ret;
if(ret < 0)
return ret;
return (ret == 1) ? 0 : -ret;
}
s32 WDVD_ReadDiskId(void *id)
{
memset(inbuf, 0, sizeof(inbuf));
/* Read disc ID */
inbuf[0] = IOCTL_DI_READID << 24;
s32 ret = IOS_Ioctl(di_fd, IOCTL_DI_READID, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf));
if(ret < 0)
return ret;
memcpy(id, outbuf, sizeof(dvddiskid));
return (ret == 1) ? 0 : -ret;
}
s32 WDVD_Read(void *buf, u32 len, u32 offset)
{
memset(inbuf, 0, sizeof(inbuf));
/* Disc read */
inbuf[0] = IOCTL_DI_READ << 24;
inbuf[1] = len;
inbuf[2] = offset;
s32 ret = IOS_Ioctl(di_fd, IOCTL_DI_READ, inbuf, sizeof(inbuf), buf, len);
if(ret < 0)
return ret;
return (ret == 1) ? 0 : -ret;
}
s32 WDVD_UnencryptedRead(void *buf, u32 len, u32 offset)
{
memset(inbuf, 0, sizeof(inbuf));
/* Unencrypted read */
inbuf[0] = IOCTL_DI_UNENCREAD << 24;
inbuf[1] = len;
inbuf[2] = offset;
s32 ret = IOS_Ioctl(di_fd, IOCTL_DI_UNENCREAD, inbuf, sizeof(inbuf), buf, len);
if(ret < 0)
return ret;
return (ret == 1) ? 0 : -ret;
}
s32 WDVD_OpenPartition(u32 offset, u32 *IOS)
{
if (di_fd < 0)
return di_fd;
static u8 Tmd_Buffer[0x4A00] ATTRIBUTE_ALIGN(32);
static ioctlv Vectors[5] ATTRIBUTE_ALIGN(32);
s32 ret;
@ -136,144 +150,37 @@ s32 WDVD_OpenPartition(u32 offset, u32 *IOS)
Vectors[4].len = 0x20;
ret = IOS_Ioctlv(di_fd, IOCTL_DI_OPENPART, 3, 2, (ioctlv *)Vectors);
*IOS = (u32)(Tmd_Buffer[0x18b]);
if (ret < 0)
if(ret < 0)
return ret;
*IOS = (u32)(Tmd_Buffer[0x18b]);
return (ret == 1) ? 0 : -ret;
}
s32 WDVD_ClosePartition(void)
{
memset(inbuf, 0, sizeof(inbuf));
/* Close partition */
inbuf[0] = IOCTL_DI_CLOSEPART << 24;
s32 ret = IOS_Ioctl(di_fd, IOCTL_DI_CLOSEPART, inbuf, sizeof(inbuf), NULL, 0);
if (ret < 0) return ret;
return (ret == 1) ? 0 : -ret;
}
s32 WDVD_UnencryptedRead(void *buf, u32 len, u32 offset)
{
memset(inbuf, 0, sizeof(inbuf));
/* Unencrypted read */
inbuf[0] = IOCTL_DI_UNENCREAD << 24;
inbuf[1] = len;
inbuf[2] = offset;
s32 ret = IOS_Ioctl(di_fd, IOCTL_DI_UNENCREAD, inbuf, sizeof(inbuf), buf, len);
if (ret < 0) return ret;
return (ret == 1) ? 0 : -ret;
}
s32 WDVD_Read(void *buf, u32 len, u32 offset)
{
memset(inbuf, 0, sizeof(inbuf));
/* Disc read */
inbuf[0] = IOCTL_DI_READ << 24;
inbuf[1] = len;
inbuf[2] = offset;
s32 ret = IOS_Ioctl(di_fd, IOCTL_DI_READ, inbuf, sizeof(inbuf), buf, len);
if (ret < 0) return ret;
return (ret == 1) ? 0 : -ret;
}
s32 WDVD_LowRequestError(u32 *error)
{
memset(inbuf, 0, sizeof(inbuf));
inbuf[0] = IOCTL_DI_REQUESTERROR << 24;
s32 ret = IOS_Ioctl(di_fd, IOCTL_DI_REQUESTERROR, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf));
if (ret < 0) return ret;
if (ret == 1)
memcpy(error, outbuf, sizeof(u32));
return (ret == 1) ? 0 : -ret;
}
s32 WDVD_WaitForDisc(void)
{
memset(inbuf, 0, sizeof(inbuf));
/* Wait for disc */
inbuf[0] = IOCTL_DI_WAITCVRCLOSE << 24;
s32 ret = IOS_Ioctl(di_fd, IOCTL_DI_WAITCVRCLOSE, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf));
if (ret < 0) return ret;
return (ret == 1) ? 0 : -ret;
}
s32 WDVD_GetCoverStatus(u32 *status)
{
memset(inbuf, 0, sizeof(inbuf));
/* Get cover status */
inbuf[0] = IOCTL_DI_GETCOVER << 24;
s32 ret = IOS_Ioctl(di_fd, IOCTL_DI_GETCOVER, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf));
if (ret < 0) return ret;
if (ret == 1) {
/* Copy cover status */
memcpy(status, outbuf, sizeof(u32));
return 0;
}
return -ret;
}
s32 WDVD_SetUSBMode(u32 mode, const u8 *id, s32 partition)
{
gprintf("WDVD_SetUSBMode, Mode: %i, ID: %s, Partition: %i\n", mode, id, partition);
memset(inbuf, 0, sizeof(inbuf));
/* Set USB mode */
inbuf[0] = IOCTL_DI_SETWBFSMODE << 24;
inbuf[1] = mode;
/* Copy ID */
if(id)
{
memcpy(&inbuf[2], id, 6);
if(partition >= 0)
inbuf[5] = partition;
}
s32 ret = IOS_Ioctl(di_fd, IOCTL_DI_SETWBFSMODE, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf));
if(ret < 0)
return ret;
return(ret == 1) ? 0 : -ret;
}
s32 WDVD_Read_Disc_BCA(void *buf)
{
if(id)
gprintf("WDVD_SetUSBMode, Mode: %i, ID: %s, Partition: %i\n", mode, id, partition);
memset(inbuf, 0, sizeof(inbuf));
/* Disc read */
inbuf[0] = IOCTL_DI_DISC_BCA << 24;
//inbuf[1] = 64;
/* Set USB mode */
inbuf[0] = IOCTL_DI_SETWBFSMODE << 24;
inbuf[1] = mode;
s32 ret = IOS_Ioctl(di_fd, IOCTL_DI_DISC_BCA, inbuf, sizeof(inbuf), buf, 64);
if (ret < 0) return ret;
/* Copy ID */
if(id)
{
memcpy(&inbuf[2], id, 6);
if(partition >= 0)
inbuf[5] = partition;
}
return (ret == 1) ? 0 : -ret;
s32 ret = IOS_Ioctl(di_fd, IOCTL_DI_SETWBFSMODE, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf));
if(ret < 0)
return ret;
return(ret == 1) ? 0 : -ret;
}
// frag
s32 WDVD_SetFragList(int device, void *fraglist, int size)
{
gprintf("WDVD_SetFragList, Device: %i, Size: %i\n", device, size);
@ -288,63 +195,7 @@ s32 WDVD_SetFragList(int device, void *fraglist, int size)
DCFlushRange(fraglist, size);
s32 ret = IOS_Ioctl(di_fd, IOCTL_DI_SETFRAG, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf));
if (ret < 0) return ret;
if(ret < 0)
return ret;
return (ret == 1) ? 0 : -ret;
}
s32 WDVD_hello(u32 *status)
{
memset(inbuf, 0, sizeof(inbuf));
inbuf[0] = IOCTL_DI_HELLO << 24;
s32 ret = IOS_Ioctl(di_fd, IOCTL_DI_HELLO, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf));
if (ret < 0) return ret;
if (ret == 1)
{
if (status) memcpy(status, outbuf, sizeof(u32));
return 0;
}
return -ret;
}
s32 WDVD_SetStreaming(void)
{
memset(inbuf, 0, sizeof(inbuf));
inbuf[0] = IOCTL_DI_DVDAUDIOBUFFERCFG << 24;
if ((*(u32*)0x80000008)>>24)
{
inbuf[1] = 1;
if(((*(u32*)0x80000008)>>16) & 0xFF)
inbuf[2] = 10;
else
inbuf[2] = 0;
}
else
{
inbuf[1] = 0;
inbuf[2] = 0;
}
s32 ret = IOS_Ioctl(di_fd, IOCTL_DI_DVDAUDIOBUFFERCFG, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf));
if (ret < 0) return ret;
return (ret == 1) ? 0 : -ret;
}
s32 WDVD_NEEK_LoadDisc(u32 id, u32 magic)
{
u32 *vec = (u32*)memalign(32, sizeof(u32) * 2);
vec[0] = id;
vec[1] = magic;
s32 ret = IOS_Ioctl(di_fd, 0x25, vec, sizeof(u32) * 2, NULL, 0);
free(vec);
return ret;
}

View File

@ -8,26 +8,19 @@ extern "C" {
/* Prototypes */
s32 WDVD_Init(void);
s32 WDVD_Close(void);
s32 WDVD_GetHandle(void);
s32 WDVD_Reset(void);
s32 WDVD_ReadDiskId(void *);
s32 WDVD_Seek(u32);
s32 WDVD_Seek(u32 offset);
s32 WDVD_ReadDiskId(void *id);
s32 WDVD_Read(void *buf, u32 len, u32 offset);
s32 WDVD_UnencryptedRead(void *buf, u32 len, u32 offset);
s32 WDVD_OpenPartition(u32 offset, u32 *IOS);
s32 WDVD_ClosePartition(void);
s32 WDVD_UnencryptedRead(void *, u32, u32);
s32 WDVD_Read(void *, u32, u32);
s32 WDVD_LowRequestError(u32 *error);
s32 WDVD_WaitForDisc(void);
s32 WDVD_GetCoverStatus(u32 *);
s32 WDVD_SetUSBMode(u32, const u8 *, s32);
s32 WDVD_Read_Disc_BCA(void *);
s32 WDVD_SetUSBMode(u32 mode, const u8 *id, s32 partition);
s32 WDVD_SetFragList(int device, void *fraglist, int size);
s32 WDVD_SetStreaming(void);
s32 WDVD_NEEK_LoadDisc(u32 id, u32 magic);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif

View File

@ -152,8 +152,9 @@ static void Create_Plugin_List(char *FullPath)
strncpy(ListElement.path, FullPath, sizeof(ListElement.path) - 1);
strncpy(ListElement.id, "PLUGIN", 6);
*strrchr(FullPath, '.') = '\0';
FolderTitle = strrchr(FullPath, '/') + 1;
*strrchr(FolderTitle, '.') = '\0';
mbstowcs(ListElement.title, FolderTitle, 63);
Asciify(ListElement.title);

View File

@ -2109,7 +2109,6 @@ bool CMenu::_loadChannelList(void)
int emuPartition = -1;
bool disable_emu = (m_cfg.getBool("NAND", "disable", true) || neek2o());
static bool last_emu_state = disable_emu;
if(!disable_emu)
{
@ -2125,59 +2124,32 @@ bool CMenu::_loadChannelList(void)
currentPartition = emuPartition;
}
static u8 lastPartition = currentPartition;
static bool first = true;
bool changed = lastPartition != currentPartition || last_emu_state != disable_emu || first;
if(changed)
UpdateCache(COVERFLOW_CHANNEL);
if(first && !disable_emu)
if(!disable_emu)
{
char basepath[64];
snprintf(basepath, sizeof(basepath), "%s:%s", DeviceName[currentPartition], emuPath.c_str());
NandHandle.PreNandCfg(basepath, m_cfg.getBool("NAND", "real_nand_miis", false), m_cfg.getBool("NAND", "real_nand_config", false));
first = false;
}
string nandpath = sfmt("%s:%s/", DeviceName[currentPartition], emuPath.empty() ? "" : emuPath.c_str());
NandHandle.Disable_Emu();
if(!disable_emu)
{
MusicPlayer.Stop();
_TempLoadIOS();
if(!DeviceHandle.IsInserted(lastPartition))
DeviceHandle.Mount(lastPartition);
DeviceHandle.UnMount(currentPartition);
NandHandle.SetPaths(emuPath.c_str(), currentPartition, disable_emu);
if(NandHandle.Enable_Emu() < 0)
NandHandle.Disable_Emu();
gprintf("Using path: \"%s\" for NAND emulation\n", nandpath.c_str());
}
if(!DeviceHandle.IsInserted(currentPartition))
DeviceHandle.Mount(currentPartition);
if(NandHandle.EmulationEnabled() || disable_emu)
{
string cacheDir;
if(!disable_emu)
cacheDir = fmt("%s/%s_channels.db", m_listCacheDir.c_str(), DeviceName[currentPartition]);
bool updateCache = m_cfg.getBool(_domainFromView(), "update_cache");
vector<string> NullVector;
m_gameList.CreateList(m_current_view, currentPartition, std::string(),
NullVector, cacheDir, updateCache);
}
lastPartition = currentPartition;
last_emu_state = disable_emu;
string cacheDir;
if(!disable_emu)
cacheDir = fmt("%s/%s_channels.db", m_listCacheDir.c_str(), DeviceName[currentPartition]);
bool updateCache = m_cfg.getBool(_domainFromView(), "update_cache");
vector<string> NullVector;
m_gameList.CreateList(m_current_view, currentPartition, std::string(),
NullVector, cacheDir, updateCache);
return m_gameList.size() > 0 ? true : false;
}

View File

@ -815,7 +815,8 @@ int CMenu::main(void)
m_cf.mouse(m_vid, chan, -1, -1);
}
}
if(m_reload)
ScanInput();
if(m_reload || BTN_B_HELD)
{
m_cf.clear();
_showWaitMessage();