-
Notifications
You must be signed in to change notification settings - Fork 58
/
sys.c
186 lines (160 loc) · 3.9 KB
/
sys.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
#include <ogc/lwp_threads.h>
#include <ogc/pad.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "fs.h"
#include "mload.h"
#include "sys.h"
#include "channel/channel_launcher.h"
#include "loader/nk.h"
#include "gecko/gecko.hpp"
#include "memory/mem2.hpp"
#include "memory/memory.h"
#include "sicksaxis-wrapper/sicksaxis-wrapper.h"
#include "wiiuse/wpad.h"
#include "wupc/wupc.h"
/* Variables */
bool reset = false;
bool shutdown = false;
volatile u8 ExitOption = 0;
const char *NeekPath = NULL;
char wii_games_dir[64];
char gc_games_dir[64];
void __Wpad_PowerCallback()
{
shutdown = 1;
}
void Open_Inputs(void)
{
/* Initialize controllers - wiiu drc is inited only once in main.cpp */
PAD_Init();
WUPC_Init();
WPAD_Init();
DS3_Init();
/* Set wiimote power button callback */
WPAD_SetPowerButtonCallback(__Wpad_PowerCallback);
WPAD_SetDataFormat(WPAD_CHAN_ALL, WPAD_FMT_BTNS_ACC_IR);
WPAD_SetIdleTimeout(60 * 2); // idle after 2 minutes
}
void Close_Inputs(void)
{
WUPC_Shutdown();
/* Disconnect Wiimotes */
for(u32 cnt = 0; cnt < 4; cnt++)
WPAD_Disconnect(cnt);
/* Shutdown Wiimote subsystem */
WPAD_Shutdown();
DS3_Cleanup();
}
bool Sys_Exiting(void)
{
if(!isWiiVC)
DCFlushRange(&reset, 32);
DCFlushRange(&shutdown, 32);
return reset || shutdown;
}
int Sys_GetExitTo(void)
{
return ExitOption;
}
void Sys_ExitTo(int option)
{
ExitOption = option;
//magic word to force wii menu in priiloader.
if(ExitOption == EXIT_TO_MENU)
{
*Priiloader_CFG1 = 0x50756E65;// Pune
*Priiloader_CFG2 = 0x50756E65;
}
else if(ExitOption == EXIT_TO_PRIILOADER)
{
*Priiloader_CFG1 = 0x4461636F;// Daco
*Priiloader_CFG2 = 0x4461636F;
}
else // PRIILOADER_DEF
{
*Priiloader_CFG1 = 0xFFFFFFFF;
*Priiloader_CFG2 = 0xFFFFFFFF;
}
DCFlushRange((void*)Priiloader_CFG1, 4);
DCFlushRange((void*)Priiloader_CFG2, 4);
}
void Sys_Exit(void)
{
/* Shutdown Inputs */
Close_Inputs();
/* shutdown console without wc24*/
if(ExitOption == SHUTDOWN_STANDBY)
SYS_ResetSystem(SYS_POWEROFF_STANDBY, 0, 0);
/* shutdown console with wc24 (riiconnect24) */
if(ExitOption == SHUTDOWN_IDLE)
SYS_ResetSystem(SYS_POWEROFF_IDLE, 0, 0);
if(!isWiiVC)
{
/* We wanna to boot something */
WII_Initialize();
/* if in neek2o mode Launch_nk will just return to neek2o system menu and not launch anything */
if(ExitOption == EXIT_TO_WFNK2O)
Launch_nk(0x1000157464C41LL, NeekPath, 0);// 57464C41 = WFLA : 44574641 = DWFA
else if(ExitOption == EXIT_TO_SMNK2O)
Launch_nk(0, NeekPath, 0);
else if(ExitOption == EXIT_TO_BOOTMII)
IOS_ReloadIOS(0xfe);// IOS254 Bootmii IOS
else if(ExitOption == EXIT_TO_HBC)
{
WII_LaunchTitle(HBC_OHBC);
WII_LaunchTitle(HBC_LULZ);
WII_LaunchTitle(HBC_108);
WII_LaunchTitle(HBC_JODI);
WII_LaunchTitle(HBC_HAXX);
}
else if(ExitOption == EXIT_TO_WIIU)
WII_LaunchTitle(WIIU_CHANNEL);
/* else Return to System Menu */
SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0);
}
exit(0);
}
void __Sys_ResetCallback(u32 irq, void *ctx)
{
(void)irq;// to remove unused parameter warning
(void)ctx;
reset = true;
}
void __Sys_PowerCallback(void)
{
shutdown = true;
}
void Sys_Init(void)
{
/* Set RESET/POWER button callback */
if(!isWiiVC)
SYS_SetResetCallback(__Sys_ResetCallback);
SYS_SetPowerCallback(__Sys_PowerCallback);
}
bool AHBPROT_Patched(void)
{
return (*HW_AHBPROT == 0xFFFFFFFF);
}
/* WiiU Check by crediar, thanks */
bool IsOnWiiU(void)
{
return ((*HW_PROCESSOR >> 16 ) == 0xCAFE);
}
void Sys_SetNeekPath(const char *Path)
{
NeekPath = Path;
}
bool hw_checked = false;
bool on_hw = false;
bool Sys_HW_Access(void)
{
if(hw_checked == true)
return on_hw;
on_hw = AHBPROT_Patched();
hw_checked = true;
return on_hw;
}
/* KILL IT */
s32 __IOS_LoadStartupIOS() { return 0; }