mirror of
https://github.com/zeldaret/tp
synced 2026-05-24 07:11:06 -04:00
8785882261
* some pal work * e_hb equivalent * update config
516 lines
14 KiB
C++
516 lines
14 KiB
C++
/**
|
|
* m_Do_MemCard.cpp
|
|
* Memory Card Control
|
|
*/
|
|
|
|
#include <dolphin/card.h>
|
|
#include "m_Do/m_Do_MemCard.h"
|
|
#include "JSystem/JKernel/JKRAssertHeap.h"
|
|
#include "m_Do/m_Do_ext.h"
|
|
#include "m_Do/m_Do_MemCardRWmng.h"
|
|
#include "m_Do/m_Do_Reset.h"
|
|
|
|
#define SLOT_A 0
|
|
|
|
#define CHECKSPACE_RESULT_READY 0
|
|
#define CHECKSPACE_RESULT_INSSPACE 1
|
|
#define CHECKSPACE_RESULT_NOENT 2
|
|
#define CHECKSPACE_RESULT_ERROR 3
|
|
|
|
/* 8001672C-80016730 01106C 0004+00 1/1 0/0 0/0 .text __ct__15mDoMemCd_Ctrl_cFv */
|
|
mDoMemCd_Ctrl_c::mDoMemCd_Ctrl_c() {}
|
|
|
|
/* 803DFC20-803E0C20 00C940 1000+00 1/1 0/0 0/0 .bss MemCardStack */
|
|
static u8 MemCardStack[0x1000];
|
|
|
|
/* 803E0C20-803E0F40 00D940 0318+08 1/1 0/0 0/0 .bss MemCardThread */
|
|
static OSThread MemCardThread;
|
|
|
|
/* 80016730-800167D0 011070 00A0+00 0/0 1/1 0/0 .text ThdInit__15mDoMemCd_Ctrl_cFv */
|
|
void mDoMemCd_Ctrl_c::ThdInit() {
|
|
CARDInit();
|
|
mCopyToPos = 0;
|
|
mProbeStat = 2;
|
|
mCardState = CARD_STATE_NO_CARD_e;
|
|
mCardCommand = COMM_NONE_e;
|
|
mChannel = SLOT_A;
|
|
|
|
OSInitMutex(&mMutex);
|
|
OSInitCond(&mCond);
|
|
|
|
int priority = OSGetThreadPriority(OSGetCurrentThread());
|
|
OSCreateThread(&MemCardThread, (void*(*)(void*))mDoMemCd_main, NULL, MemCardStack + sizeof(MemCardStack),
|
|
sizeof(MemCardStack), priority + 1, 1);
|
|
OSResumeThread(&MemCardThread);
|
|
|
|
// "Memory Card Thread Init\n"
|
|
OS_REPORT("メモリーカードスレッド起動\n");
|
|
}
|
|
|
|
/* 800167D0-80016894 011110 00C4+00 1/1 0/0 0/0 .text main__15mDoMemCd_Ctrl_cFv */
|
|
void mDoMemCd_Ctrl_c::main() {
|
|
do {
|
|
OSLockMutex(&mMutex);
|
|
while (mCardCommand == COMM_NONE_e) {
|
|
OSWaitCond(&mCond, &mMutex);
|
|
}
|
|
OSUnlockMutex(&mMutex);
|
|
|
|
switch (mCardCommand) {
|
|
case COMM_RESTORE_e:
|
|
restore();
|
|
break;
|
|
case COMM_STORE_e:
|
|
store();
|
|
break;
|
|
case COMM_FORMAT_e:
|
|
format();
|
|
break;
|
|
case COMM_ATTACH_e:
|
|
attach();
|
|
break;
|
|
case COMM_DETACH_e:
|
|
detach();
|
|
break;
|
|
}
|
|
|
|
OSLockMutex(&mMutex);
|
|
mCardCommand = COMM_NONE_e;
|
|
OSUnlockMutex(&mMutex);
|
|
} while (true);
|
|
}
|
|
|
|
/* 80016894-800169B4 0111D4 0120+00 0/0 1/1 0/0 .text update__15mDoMemCd_Ctrl_cFv */
|
|
void mDoMemCd_Ctrl_c::update() {
|
|
if (mDoRst::isReset()) {
|
|
OSLockMutex(&mMutex);
|
|
mCardCommand = COMM_DETACH_e;
|
|
mProbeStat = 3;
|
|
OSUnlockMutex(&mMutex);
|
|
OSSignalCond(&mCond);
|
|
} else if (getStatus(0) != 14) {
|
|
if (CARDProbe(SLOT_A) && getStatus(0) == 0) {
|
|
OSLockMutex(&mMutex);
|
|
mProbeStat = 0;
|
|
mCardState = CARD_STATE_13_e;
|
|
mCardCommand = COMM_ATTACH_e;
|
|
OSUnlockMutex(&mMutex);
|
|
OSSignalCond(&mCond);
|
|
} else if (!CARDProbe(SLOT_A) && getStatus(0) != 0) {
|
|
OSLockMutex(&mMutex);
|
|
mProbeStat = 1;
|
|
mCardState = CARD_STATE_13_e;
|
|
mCardCommand = COMM_DETACH_e;
|
|
OSUnlockMutex(&mMutex);
|
|
OSSignalCond(&mCond);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 800169B4-80016A0C 0112F4 0058+00 0/0 2/2 0/0 .text load__15mDoMemCd_Ctrl_cFv */
|
|
void mDoMemCd_Ctrl_c::load() {
|
|
if (OSTryLockMutex(&mMutex)) {
|
|
field_0x1fc8 = 0;
|
|
mCardCommand = COMM_RESTORE_e;
|
|
OSUnlockMutex(&mMutex);
|
|
OSSignalCond(&mCond);
|
|
}
|
|
}
|
|
|
|
/* 80016A0C-80016AB0 01134C 00A4+00 1/1 0/0 0/0 .text restore__15mDoMemCd_Ctrl_cFv */
|
|
void mDoMemCd_Ctrl_c::restore() {
|
|
CARDFileInfo file;
|
|
field_0x1fc8 = 0;
|
|
|
|
s32 ret = CARDOpen(mChannel, "gczelda2", &file);
|
|
OS_REPORT("\x1b[43;30mCret=%d\n\x1b[m", ret);
|
|
if (ret == CARD_RESULT_READY) {
|
|
s32 ret2 = mDoMemCdRWm_Restore(&file, this, sizeof(mData));
|
|
OS_REPORT("\x1b[43;30mret2=%d\n\x1b[m", ret2);
|
|
if (ret2 == CARD_RESULT_READY) {
|
|
mCardState = CARD_STATE_READ_e;
|
|
} else {
|
|
setCardState(ret);
|
|
}
|
|
CARDClose(&file);
|
|
} else {
|
|
setCardState(ret);
|
|
}
|
|
|
|
field_0x1fc8 = 1;
|
|
}
|
|
|
|
/* 80016AB0-80016B58 0113F0 00A8+00 0/0 2/2 0/0 .text LoadSync__15mDoMemCd_Ctrl_cFPvUlUl
|
|
*/
|
|
s32 mDoMemCd_Ctrl_c::LoadSync(void* i_buffer, u32 i_size, u32 i_position) {
|
|
int ret = 0;
|
|
|
|
if (field_0x1fc8 == 0) {
|
|
return 0;
|
|
}
|
|
|
|
if (OSTryLockMutex(&mMutex)) {
|
|
if (mCardState == CARD_STATE_READ_e) {
|
|
memcpy(i_buffer, &mData[i_position], i_size);
|
|
mCardState = CARD_STATE_READY_e;
|
|
ret = 1;
|
|
} else {
|
|
mCardState = CARD_STATE_NO_FILE_e;
|
|
ret = 2;
|
|
}
|
|
OSUnlockMutex(&mMutex);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
/* 80016B58-80016BD4 011498 007C+00 0/0 2/2 0/0 .text save__15mDoMemCd_Ctrl_cFPvUlUl */
|
|
void mDoMemCd_Ctrl_c::save(void* i_buffer, u32 i_size, u32 i_position) {
|
|
if (OSTryLockMutex(&mMutex)) {
|
|
memcpy(&mData[i_position], i_buffer, i_size);
|
|
field_0x1fc8 = 0;
|
|
mCardCommand = COMM_STORE_e;
|
|
OSUnlockMutex(&mMutex);
|
|
OSSignalCond(&mCond);
|
|
}
|
|
}
|
|
|
|
/* 80016BD4-80016CE0 011514 010C+00 1/1 0/0 0/0 .text store__15mDoMemCd_Ctrl_cFv */
|
|
void mDoMemCd_Ctrl_c::store() {
|
|
CARDFileInfo file;
|
|
s32 ret;
|
|
field_0x1fc8 = 0;
|
|
|
|
if (mCardState == CARD_STATE_NO_FILE_e) {
|
|
ret = CARDCreate(mChannel, "gczelda2", SAVEDATA_FILE_SIZE, &file);
|
|
if (ret == CARD_RESULT_READY || ret == CARD_RESULT_EXIST) {
|
|
mCardState = CARD_STATE_READY_e;
|
|
} else {
|
|
setCardState(ret);
|
|
}
|
|
}
|
|
|
|
if (mCardState == CARD_STATE_READY_e) {
|
|
ret = CARDOpen(mChannel, "gczelda2", &file);
|
|
if (ret == CARD_RESULT_READY) {
|
|
ret = mDoMemCdRWm_Store(&file, this, sizeof(mData));
|
|
if (ret != CARD_RESULT_READY) {
|
|
setCardState(ret);
|
|
OS_REPORT("CARD Write ERR ret:%d\n", ret);
|
|
} else {
|
|
mCardState = CARD_STATE_WRITE_e;
|
|
OS_REPORT("CARD Write OK ret:%d stat:%d\n", ret, mCardState);
|
|
}
|
|
CARDClose(&file);
|
|
} else {
|
|
setCardState(ret);
|
|
}
|
|
} else {
|
|
setCardState(ret);
|
|
}
|
|
|
|
field_0x1fc8 = 1;
|
|
}
|
|
|
|
/* 80016CE0-80016D74 011620 0094+00 0/0 6/6 0/0 .text SaveSync__15mDoMemCd_Ctrl_cFv */
|
|
s32 mDoMemCd_Ctrl_c::SaveSync() {
|
|
int ret = 0;
|
|
|
|
if (field_0x1fc8 == 0) {
|
|
return 0;
|
|
}
|
|
|
|
if (OSTryLockMutex(&mMutex)) {
|
|
if (mCardState == CARD_STATE_WRITE_e) {
|
|
mCardState = CARD_STATE_READY_e;
|
|
ret = 1;
|
|
} else if (mCardState == CARD_STATE_READY_e) {
|
|
ret = 0;
|
|
} else {
|
|
ret = 2;
|
|
}
|
|
|
|
OS_REPORT("CARD Save Sync ret:%d stat:%d\n", ret, mCardState);
|
|
OSUnlockMutex(&mMutex);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
/* 80016D74-80016E58 0116B4 00E4+00 2/1 2/2 0/0 .text getStatus__15mDoMemCd_Ctrl_cFUl */
|
|
u32 mDoMemCd_Ctrl_c::getStatus(u32) {
|
|
u32 status;
|
|
if (OSTryLockMutex(&mMutex)) {
|
|
switch (mCardState) {
|
|
case CARD_STATE_READY_e:
|
|
status = 2;
|
|
break;
|
|
case CARD_STATE_NO_FILE_e:
|
|
status = 1;
|
|
break;
|
|
case CARD_STATE_READ_e:
|
|
status = 3;
|
|
break;
|
|
case CARD_STATE_WRITE_e:
|
|
status = 4;
|
|
break;
|
|
case CARD_STATE_FORMAT_e:
|
|
status = 5;
|
|
break;
|
|
case CARD_STATE_NO_CARD_e:
|
|
status = 0;
|
|
break;
|
|
case CARD_STATE_WRONG_ENCODING_e:
|
|
status = 7;
|
|
break;
|
|
case CARD_STATE_BROKEN_e:
|
|
status = 6;
|
|
break;
|
|
case CARD_STATE_INSSPACE_e:
|
|
status = 11;
|
|
break;
|
|
case CARD_STATE_NOENT_e:
|
|
status = 12;
|
|
break;
|
|
case CARD_STATE_WRONG_DEVICE_e:
|
|
status = 9;
|
|
break;
|
|
case CARD_STATE_WRONG_SECTORSIZE_e:
|
|
status = 10;
|
|
break;
|
|
case CARD_STATE_FATAL_ERROR_e:
|
|
status = 8;
|
|
break;
|
|
case CARD_STATE_13_e:
|
|
status = 14;
|
|
break;
|
|
}
|
|
|
|
OSUnlockMutex(&mMutex);
|
|
return status;
|
|
}
|
|
|
|
return 14;
|
|
}
|
|
|
|
/* 80016E58-80016EA8 011798 0050+00 0/0 2/2 0/0 .text command_format__15mDoMemCd_Ctrl_cFv
|
|
*/
|
|
void mDoMemCd_Ctrl_c::command_format() {
|
|
if (OSTryLockMutex(&mMutex)) {
|
|
mCardCommand = COMM_FORMAT_e;
|
|
OSUnlockMutex(&mMutex);
|
|
OSSignalCond(&mCond);
|
|
}
|
|
}
|
|
|
|
/* 80016EA8-80016F2C 0117E8 0084+00 1/1 0/0 0/0 .text format__15mDoMemCd_Ctrl_cFv */
|
|
void mDoMemCd_Ctrl_c::format() {
|
|
field_0x1fc8 = 0;
|
|
|
|
s32 ret = CARDFormat(mChannel);
|
|
if (OSTryLockMutex(&mMutex)) {
|
|
if (ret == CARD_RESULT_READY) {
|
|
mCardState = CARD_STATE_FORMAT_e;
|
|
} else {
|
|
setCardState(ret);
|
|
}
|
|
|
|
field_0x1fc8 = 1;
|
|
OSUnlockMutex(&mMutex);
|
|
}
|
|
}
|
|
|
|
/* 80016F2C-80016FB8 01186C 008C+00 0/0 2/2 0/0 .text FormatSync__15mDoMemCd_Ctrl_cFv */
|
|
s32 mDoMemCd_Ctrl_c::FormatSync() {
|
|
int ret = 0;
|
|
|
|
if (field_0x1fc8 == 0) {
|
|
return 0;
|
|
}
|
|
|
|
if (OSTryLockMutex(&mMutex)) {
|
|
if (mCardState != CARD_STATE_13_e) {
|
|
if (mCardState == CARD_STATE_FORMAT_e) {
|
|
mCardState = CARD_STATE_NO_FILE_e;
|
|
ret = 1;
|
|
} else {
|
|
ret = 2;
|
|
}
|
|
}
|
|
OSUnlockMutex(&mMutex);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
/* 80016FB8-800170B8 0118F8 0100+00 1/1 0/0 0/0 .text attach__15mDoMemCd_Ctrl_cFv */
|
|
void mDoMemCd_Ctrl_c::attach() {
|
|
s32 mem_size;
|
|
s32 sector_size;
|
|
|
|
s32 ret = CARDProbeEx(mChannel, &mem_size, §or_size);
|
|
if (ret == CARD_RESULT_NOCARD) {
|
|
mCardState = CARD_STATE_NO_CARD_e;
|
|
} else if (ret == CARD_RESULT_FATAL_ERROR) {
|
|
mCardState = CARD_STATE_FATAL_ERROR_e;
|
|
} else if (ret == CARD_RESULT_WRONGDEVICE) {
|
|
mCardState = CARD_STATE_WRONG_DEVICE_e;
|
|
} else if (sector_size != SECTOR_SIZE) {
|
|
mCardState = CARD_STATE_WRONG_SECTORSIZE_e;
|
|
} else {
|
|
if (mount()) {
|
|
if (loadfile()) {
|
|
mCardState = CARD_STATE_READY_e;
|
|
} else {
|
|
switch (checkspace()) {
|
|
case CHECKSPACE_RESULT_READY:
|
|
mCardState = CARD_STATE_NO_FILE_e;
|
|
break;
|
|
case CHECKSPACE_RESULT_INSSPACE:
|
|
mCardState = CARD_STATE_INSSPACE_e;
|
|
break;
|
|
case CHECKSPACE_RESULT_NOENT:
|
|
mCardState = CARD_STATE_NOENT_e;
|
|
break;
|
|
case CHECKSPACE_RESULT_ERROR:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* 800170B8-80017110 0119F8 0058+00 0/0 1/1 0/0 .text command_attach__15mDoMemCd_Ctrl_cFv
|
|
*/
|
|
void mDoMemCd_Ctrl_c::command_attach() {
|
|
if (OSTryLockMutex(&mMutex)) {
|
|
mCardState = CARD_STATE_13_e;
|
|
mCardCommand = COMM_ATTACH_e;
|
|
OSUnlockMutex(&mMutex);
|
|
OSSignalCond(&mCond);
|
|
}
|
|
}
|
|
|
|
/* 80017110-80017148 011A50 0038+00 1/1 0/0 0/0 .text detach__15mDoMemCd_Ctrl_cFv */
|
|
void mDoMemCd_Ctrl_c::detach() {
|
|
CARDUnmount(mChannel);
|
|
mCardState = CARD_STATE_NO_CARD_e;
|
|
}
|
|
|
|
/* 803E0F40-803EAF40 00DC60 A000+00 1/1 0/0 0/0 .bss MemCardWorkArea0 */
|
|
static u8 MemCardWorkArea0[CARD_WORKAREA_SIZE] ALIGN_DECL(32);
|
|
|
|
/* 80017148-80017274 011A88 012C+00 2/1 0/0 0/0 .text mount__15mDoMemCd_Ctrl_cFv */
|
|
s32 mDoMemCd_Ctrl_c::mount() {
|
|
s32 result = CARDMount(mChannel, MemCardWorkArea0, NULL);
|
|
|
|
switch (result) {
|
|
case CARD_RESULT_IOERROR:
|
|
case CARD_RESULT_FATAL_ERROR:
|
|
mCardState = CARD_STATE_FATAL_ERROR_e;
|
|
return FALSE;
|
|
case CARD_RESULT_NOCARD:
|
|
mCardState = CARD_STATE_NO_CARD_e;
|
|
return FALSE;
|
|
case CARD_RESULT_BROKEN:
|
|
case CARD_RESULT_READY:
|
|
switch (CARDCheck(mChannel)) {
|
|
case CARD_RESULT_READY:
|
|
return TRUE;
|
|
case CARD_RESULT_BROKEN:
|
|
mCardState = CARD_STATE_BROKEN_e;
|
|
return FALSE;
|
|
case CARD_RESULT_IOERROR:
|
|
mCardState = CARD_STATE_FATAL_ERROR_e;
|
|
return FALSE;
|
|
case CARD_RESULT_NOCARD:
|
|
mCardState = CARD_STATE_NO_CARD_e;
|
|
return FALSE;
|
|
case CARD_RESULT_ENCODING:
|
|
mCardState = CARD_STATE_WRONG_ENCODING_e;
|
|
return FALSE;
|
|
}
|
|
break;
|
|
case CARD_RESULT_ENCODING:
|
|
mCardState = CARD_STATE_WRONG_ENCODING_e;
|
|
return FALSE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
/* 80017274-800172D4 011BB4 0060+00 1/1 0/0 0/0 .text loadfile__15mDoMemCd_Ctrl_cFv */
|
|
s32 mDoMemCd_Ctrl_c::loadfile() {
|
|
CARDFileInfo file;
|
|
|
|
s32 ret = CARDOpen(mChannel, "gczelda2", &file);
|
|
if (ret == CARD_RESULT_READY) {
|
|
CARDClose(&file);
|
|
return TRUE;
|
|
} else {
|
|
setCardState(ret);
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
/* 800172D4-80017360 011C14 008C+00 1/1 0/0 0/0 .text checkspace__15mDoMemCd_Ctrl_cFv */
|
|
//
|
|
s32 mDoMemCd_Ctrl_c::checkspace() {
|
|
s32 bytesNotUsed, filesNotUsed;
|
|
s32 result = CARDFreeBlocks(mChannel, &bytesNotUsed, &filesNotUsed);
|
|
|
|
if (result != CARD_RESULT_READY) {
|
|
setCardState(result);
|
|
return CHECKSPACE_RESULT_ERROR;
|
|
}
|
|
|
|
if (bytesNotUsed < SAVEDATA_FILE_SIZE) {
|
|
return CHECKSPACE_RESULT_INSSPACE;
|
|
}
|
|
|
|
if (filesNotUsed < 1) {
|
|
return CHECKSPACE_RESULT_NOENT;
|
|
}
|
|
|
|
return CHECKSPACE_RESULT_READY;
|
|
}
|
|
|
|
/* 80017360-8001741C 011CA0 00BC+00 5/5 0/0 0/0 .text setCardState__15mDoMemCd_Ctrl_cFl
|
|
*/
|
|
void mDoMemCd_Ctrl_c::setCardState(s32 i_result) {
|
|
switch (i_result) {
|
|
case CARD_RESULT_IOERROR:
|
|
case CARD_RESULT_FATAL_ERROR:
|
|
mCardState = CARD_STATE_FATAL_ERROR_e;
|
|
break;
|
|
case CARD_RESULT_NOCARD:
|
|
mCardState = CARD_STATE_NO_CARD_e;
|
|
break;
|
|
case CARD_RESULT_BROKEN:
|
|
case CARD_RESULT_READY:
|
|
if (CARDCheck(mChannel) != CARD_RESULT_READY) {
|
|
mCardState = CARD_STATE_BROKEN_e;
|
|
}
|
|
break;
|
|
case CARD_RESULT_ENCODING:
|
|
mCardState = CARD_STATE_WRONG_ENCODING_e;
|
|
break;
|
|
case CARD_RESULT_NOFILE:
|
|
mCardState = CARD_STATE_NO_FILE_e;
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* 803EAF40-803ECF40 017C60 2000+00 2/2 27/27 0/0 .bss g_mDoMemCd_control */
|
|
mDoMemCd_Ctrl_c g_mDoMemCd_control;
|
|
|
|
/* 8001741C-80017470 011D5C 0054+00 1/1 0/0 0/0 .text mDoMemCd_main__FPv */
|
|
static int mDoMemCd_main(void*) {
|
|
{ JKRThread thread(OSGetCurrentThread(), 0); }
|
|
|
|
mDoExt_getAssertHeap()->becomeCurrentHeap();
|
|
|
|
g_mDoMemCd_control.main();
|
|
return 0;
|
|
}
|