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
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
|
#ifndef M_DO_M_DO_MEMCARD_H
#define M_DO_M_DO_MEMCARD_H
#include <card.h>
#include <os.h>
#include "global.h"
#define SAVEDATA_SIZE 0xA94 // Size of 1 Quest Log
#define SAVEDATA_NUM 3 // Max number of Quest Logs
#define SECTOR_SIZE 0x2000 // MemCard sector size
#define CARD_FILE_SIZE 0x8000 // MemCard file size
#define SAVEDATA_VERSION 6 // Save Data version
#define SAVEFILE_SIZE (SAVEDATA_SIZE * SAVEDATA_NUM)
class mDoMemCd_Ctrl_c {
public:
enum Command_e {
COMM_NONE_e,
COMM_RESTORE_e,
COMM_STORE_e,
COMM_FORMAT_e,
COMM_ATTACH_e,
COMM_DETACH_e,
#if PLATFORM_WII || PLATFORM_SHIELD
COMM_RESTORE_NAND_e,
COMM_STORE_NAND_e,
COMM_STORE_SETUP_NAND_e,
#endif
};
enum CardState_e {
CARD_STATE_NO_CARD_e,
CARD_STATE_READY_e,
CARD_STATE_NO_FILE_e,
CARD_STATE_READ_e,
CARD_STATE_WRITE_e,
CARD_STATE_FORMAT_e,
CARD_STATE_WRONG_ENCODING_e,
CARD_STATE_BROKEN_e,
CARD_STATE_INSSPACE_e,
CARD_STATE_NOENT_e,
CARD_STATE_WRONG_DEVICE_e,
CARD_STATE_WRONG_SECTORSIZE_e,
CARD_STATE_FATAL_ERROR_e,
CARD_STATE_13_e,
};
enum NANDState_e {
NAND_STATE_AUTHENTICATION_e,
NAND_STATE_READY_e,
NAND_STATE_NO_FILE_e,
NAND_STATE_READ_e,
NAND_STATE_WRITE_e,
NAND_STATE_FORMAT_e,
NAND_STATE_BROKEN_e,
NAND_STATE_INSSPACE_e,
NAND_STATE_NOENT_e,
NAND_STATE_FATAL_ERROR_e,
NAND_STATE_10_e,
};
mDoMemCd_Ctrl_c();
void ThdInit();
void main();
void update();
void load();
void restore();
s32 LoadSync(void* i_buffer, u32 i_size, u32 i_position);
void save(void* i_buffer, u32 i_size, u32 i_position);
void store();
s32 SaveSync();
u32 getStatus(u32);
void command_format();
void format();
s32 FormatSync();
void attach();
void command_attach();
void detach();
s32 mount();
s32 loadfile();
s32 checkspace();
void setCardState(s32);
#if PLATFORM_WII || PLATFORM_SHIELD
void loadNAND();
void restoreNAND();
s32 LoadSyncNAND(void* i_buffer, u32 i_size, u32 i_position);
void saveNAND(void* i_buffer, u32 i_size, u32 i_position);
void storeNAND();
s32 SaveSyncNAND();
void storeSetUpNAND();
void setNandState(s32);
u32 getStatusNAND();
s32 chekNANDFile();
s32 checkspaceNAND();
#endif
bool isCardCommNone() { return mCardCommand == COMM_NONE_e; }
u8 getProbeStat() { return mProbeStat; }
void clearProbeStat() { mProbeStat = 2; }
void setCopyToPos(u8 i_pos) { mCopyToPos = i_pos; }
u32 getDataVersion() { return mDataVersion; }
void setDataVersion(u32 version) { mDataVersion = version; }
void getCardStatus(s32 fileNo, CARDStat* stat) { CARDGetStatus(mChannel, fileNo, stat); }
void setCardStatus(s32 fileNo, CARDStat* stat) { CARDSetStatus(mChannel, fileNo, stat); }
void setSerialNo() {
u64 serial_no;
CARDGetSerialNo(mChannel, &serial_no);
mSerialNo = serial_no;
}
/* 0x0000 */ u8 mData[SAVEFILE_SIZE];
/* 0x1FBC */ u8 mChannel;
/* 0x1FBD */ u8 mCopyToPos;
/* 0x1FBE */ u8 mProbeStat;
/* 0x1FC0 */ s32 mCardCommand;
/* 0x1FC4 */ s32 mCardState;
/* 0x1FC8 */ s32 field_0x1fc8;
/* 0x1FCC */ OSMutex mMutex;
/* 0x1FE4 */ OSCond mCond;
/* 0x1FEC */ s32 mNandState;
/* 0x1FF0 */ u64 mSerialNo;
/* 0x1FF8 */ u32 mDataVersion;
}; // Size: 0x2000
STATIC_ASSERT(sizeof(mDoMemCd_Ctrl_c) == 8192);
static int mDoMemCd_main(void*);
extern mDoMemCd_Ctrl_c g_mDoMemCd_control;
inline bool mDoMemCd_isCardCommNone() {
return g_mDoMemCd_control.isCardCommNone();
}
inline void mDoMemCd_ThdInit() {
g_mDoMemCd_control.ThdInit();
}
inline u8 mDoMemCd_getProbeStat() {
return g_mDoMemCd_control.getProbeStat();
}
inline void mDoMemCd_clearProbeStat() {
g_mDoMemCd_control.clearProbeStat();
}
inline void mDoMemCd_save(void* i_data, u32 param_1, u32 param_2) {
g_mDoMemCd_control.save(i_data,param_1,param_2);
}
inline void mDoMemCd_Format() {
g_mDoMemCd_control.command_format();
}
inline s32 mDoMemCd_FormatSync() {
return g_mDoMemCd_control.FormatSync();
}
inline s32 mDoMemCd_SaveSync() {
return g_mDoMemCd_control.SaveSync();
}
inline void mDoMemCd_Load() {
g_mDoMemCd_control.load();
}
inline void mDoMemCd_setCopyToPos(u8 i_pos) {
g_mDoMemCd_control.setCopyToPos(i_pos);
}
inline u32 mDoMemCd_getStatus(u32 param_0) {
return g_mDoMemCd_control.getStatus(param_0);
}
inline u32 mDoMemCd_LoadSync(void* i_buffer, u32 i_size, u32 i_position) {
return g_mDoMemCd_control.LoadSync(i_buffer, i_size, i_position);
}
inline u32 mDoMemCd_getDataVersion() {
return g_mDoMemCd_control.getDataVersion();
}
inline void mDoMemCd_setDataVersion(u32 i_version) {
g_mDoMemCd_control.setDataVersion(i_version);
}
inline void mDoMemCd_setSerialNo() {
g_mDoMemCd_control.setSerialNo();
}
inline void mDoMemCd_getCardStatus(s32 fileNo, CARDStat* stat) {
g_mDoMemCd_control.getCardStatus(fileNo, stat);
}
inline void mDoMemCd_setCardStatus(s32 fileNo, CARDStat* stat) {
g_mDoMemCd_control.setCardStatus(fileNo, stat);
}
inline void mDoMemCd_UpDate() {
g_mDoMemCd_control.update();
}
#if PLATFORM_WII || PLATFORM_SHIELD
inline void mDoMemCd_saveNAND(void* data, u32 length, u32 position) {
g_mDoMemCd_control.saveNAND(data, length, position);
}
inline s32 mDoMemCd_SaveSyncNAND() {
return g_mDoMemCd_control.SaveSyncNAND();
}
inline u32 mDoMemCd_LoadSyncNAND(void* i_buffer, u32 i_size, u32 i_position) {
return g_mDoMemCd_control.LoadSyncNAND(i_buffer, i_size, i_position);
}
inline u32 mDoMemCd_getStatusNAND() {
return g_mDoMemCd_control.getStatusNAND();
}
inline void mDoMemCd_LoadNAND() {
g_mDoMemCd_control.loadNAND();
}
inline s32 mDoMemCd_checkNANDFile() {
return g_mDoMemCd_control.chekNANDFile();
}
#endif
#endif /* M_DO_M_DO_MEMCARD_H */
|