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

View File

@ -1,15 +1,13 @@
#ifndef _APPLOADER_H_ #ifndef _APPLOADER_H_
#define _APPLOADER_H_ #define _APPLOADER_H_
/* Entry point */
typedef void (*entry_point)(void);
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
/* Prototypes */ /* 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 #ifdef __cplusplus
} }

View File

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

View File

@ -1,40 +1,29 @@
#include <gccore.h> #include <gccore.h>
#include <malloc.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <sys/iosupport.h>
#include <stdarg.h> #include <stdarg.h>
#include "gecko.h" #include "gecko.h"
/* init-globals */ /* init-globals */
bool geckoinit = false; 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]; char gprintfBuffer[256];
void gprintf(const char *format, ...) void gprintf(const char *format, ...)
{ {
va_list va; va_list va;
va_start(va, format); if(geckoinit)
int len = vsnprintf(gprintfBuffer, 255, format, va); {
__out_write(NULL, 0, gprintfBuffer, len); va_start(va, format);
va_end(va); 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() bool InitGecko()
{ {
if(geckoinit) memset(gprintfBuffer, 0, 256);
return geckoinit;
u32 geckoattached = usb_isgeckoalive(EXI_CHANNEL_1); u32 geckoattached = usb_isgeckoalive(EXI_CHANNEL_1);
if(geckoattached) if(geckoattached)
{ {

View File

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

View File

@ -1,6 +1,4 @@
#include <stdio.h>
#include <string.h> #include <string.h>
#include <malloc.h>
#include <ogcsys.h> #include <ogcsys.h>
#include "gecko.h" #include "gecko.h"
@ -36,32 +34,26 @@ static s32 di_fd = -1;
s32 WDVD_Init(void) s32 WDVD_Init(void)
{ {
/* Open "/dev/di" */ /* Open "/dev/di" */
if (di_fd < 0) { if(di_fd < 0)
{
di_fd = IOS_Open(di_fs, 0); di_fd = IOS_Open(di_fs, 0);
if (di_fd < 0) if (di_fd < 0)
return di_fd; return di_fd;
} }
return 0; return 0;
} }
s32 WDVD_Close(void) s32 WDVD_Close(void)
{ {
/* Close "/dev/di" */ /* Close "/dev/di" */
if (di_fd >= 0) { if(di_fd >= 0)
{
IOS_Close(di_fd); IOS_Close(di_fd);
di_fd = -1; di_fd = -1;
} }
return 0; return 0;
} }
s32 WDVD_GetHandle(void)
{
/* Return di handle */
return di_fd;
}
s32 WDVD_Reset(void) s32 WDVD_Reset(void)
{ {
memset(inbuf, 0, sizeof(inbuf)); memset(inbuf, 0, sizeof(inbuf));
@ -71,30 +63,11 @@ s32 WDVD_Reset(void)
inbuf[1] = 1; inbuf[1] = 1;
s32 ret = IOS_Ioctl(di_fd, IOCTL_DI_RESET, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf)); 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; 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) s32 WDVD_Seek(u32 offset)
{ {
memset(inbuf, 0, sizeof(inbuf)); memset(inbuf, 0, sizeof(inbuf));
@ -104,16 +77,57 @@ s32 WDVD_Seek(u32 offset)
inbuf[1] = offset; inbuf[1] = offset;
s32 ret = IOS_Ioctl(di_fd, IOCTL_DI_SEEK, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf)); 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; return (ret == 1) ? 0 : -ret;
} }
s32 WDVD_OpenPartition(u32 offset, u32 *IOS) s32 WDVD_OpenPartition(u32 offset, u32 *IOS)
{ {
if (di_fd < 0)
return di_fd;
static u8 Tmd_Buffer[0x4A00] ATTRIBUTE_ALIGN(32); static u8 Tmd_Buffer[0x4A00] ATTRIBUTE_ALIGN(32);
static ioctlv Vectors[5] ATTRIBUTE_ALIGN(32); static ioctlv Vectors[5] ATTRIBUTE_ALIGN(32);
s32 ret; s32 ret;
@ -136,144 +150,37 @@ s32 WDVD_OpenPartition(u32 offset, u32 *IOS)
Vectors[4].len = 0x20; Vectors[4].len = 0x20;
ret = IOS_Ioctlv(di_fd, IOCTL_DI_OPENPART, 3, 2, (ioctlv *)Vectors); 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; return ret;
*IOS = (u32)(Tmd_Buffer[0x18b]);
return (ret == 1) ? 0 : -ret; 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) s32 WDVD_SetUSBMode(u32 mode, const u8 *id, s32 partition)
{ {
gprintf("WDVD_SetUSBMode, Mode: %i, ID: %s, Partition: %i\n", mode, id, partition); if(id)
memset(inbuf, 0, sizeof(inbuf)); gprintf("WDVD_SetUSBMode, Mode: %i, ID: %s, Partition: %i\n", mode, id, partition);
/* 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)
{
memset(inbuf, 0, sizeof(inbuf)); memset(inbuf, 0, sizeof(inbuf));
/* Disc read */ /* Set USB mode */
inbuf[0] = IOCTL_DI_DISC_BCA << 24; inbuf[0] = IOCTL_DI_SETWBFSMODE << 24;
//inbuf[1] = 64; inbuf[1] = mode;
s32 ret = IOS_Ioctl(di_fd, IOCTL_DI_DISC_BCA, inbuf, sizeof(inbuf), buf, 64); /* Copy ID */
if (ret < 0) return ret; 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 // frag
s32 WDVD_SetFragList(int device, void *fraglist, int size) s32 WDVD_SetFragList(int device, void *fraglist, int size)
{ {
gprintf("WDVD_SetFragList, Device: %i, Size: %i\n", device, 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); DCFlushRange(fraglist, size);
s32 ret = IOS_Ioctl(di_fd, IOCTL_DI_SETFRAG, inbuf, sizeof(inbuf), outbuf, sizeof(outbuf)); 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; 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 */ /* Prototypes */
s32 WDVD_Init(void); s32 WDVD_Init(void);
s32 WDVD_Close(void); s32 WDVD_Close(void);
s32 WDVD_GetHandle(void);
s32 WDVD_Reset(void); s32 WDVD_Reset(void);
s32 WDVD_ReadDiskId(void *); s32 WDVD_Seek(u32 offset);
s32 WDVD_Seek(u32);
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_OpenPartition(u32 offset, u32 *IOS);
s32 WDVD_ClosePartition(void);
s32 WDVD_UnencryptedRead(void *, u32, u32); s32 WDVD_SetUSBMode(u32 mode, const u8 *id, s32 partition);
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_SetFragList(int device, void *fraglist, int size); s32 WDVD_SetFragList(int device, void *fraglist, int size);
s32 WDVD_SetStreaming(void);
s32 WDVD_NEEK_LoadDisc(u32 id, u32 magic);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif /* __cplusplus */ #endif /* __cplusplus */
#endif #endif

View File

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

View File

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