mirror of
https://github.com/Fledge68/WiiFlow_Lite.git
synced 2024-11-27 13:44:15 +01:00
-cleanup stuff
-fixed rebooting wiiflow with holding down b and pressing home twice
This commit is contained in:
parent
09e5f05eda
commit
2f4c8fb0fd
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
|
||||||
}
|
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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();
|
||||||
|
Loading…
Reference in New Issue
Block a user