e_hb equivalent / some pal work (#2577)

* some pal work

* e_hb equivalent

* update config
This commit is contained in:
TakaRikka
2025-08-10 09:27:45 -07:00
committed by GitHub
parent 2ec9bd75a7
commit ed04f85412
30 changed files with 2249 additions and 1398 deletions
+150 -137
View File
@@ -3,19 +3,25 @@
* Memory Card Control
*/
#include <dolphin/card.h>
#include "m_Do/m_Do_MemCard.h"
#include "JSystem/JKernel/JKRAssertHeap.h"
#include "dolphin/card.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[4096];
static u8 MemCardStack[0x1000];
/* 803E0C20-803E0F40 00D940 0318+08 1/1 0/0 0/0 .bss MemCardThread */
static OSThread MemCardThread;
@@ -25,9 +31,9 @@ void mDoMemCd_Ctrl_c::ThdInit() {
CARDInit();
mCopyToPos = 0;
mProbeStat = 2;
mCardState = 0;
mCardCommand = CARD_NO_COMMAND;
mChannel = 0;
mCardState = CARD_STATE_NO_CARD_e;
mCardCommand = COMM_NONE_e;
mChannel = SLOT_A;
OSInitMutex(&mMutex);
OSInitCond(&mCond);
@@ -36,37 +42,40 @@ void mDoMemCd_Ctrl_c::ThdInit() {
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 == CARD_NO_COMMAND) {
while (mCardCommand == COMM_NONE_e) {
OSWaitCond(&mCond, &mMutex);
}
OSUnlockMutex(&mMutex);
switch (mCardCommand) {
case CARD_RESTORE:
case COMM_RESTORE_e:
restore();
break;
case CARD_STORE:
case COMM_STORE_e:
store();
break;
case CARD_FORMAT:
case COMM_FORMAT_e:
format();
break;
case CARD_ATTACH:
case COMM_ATTACH_e:
attach();
break;
case CARD_DETACH:
case COMM_DETACH_e:
detach();
break;
}
OSLockMutex(&mMutex);
mCardCommand = CARD_NO_COMMAND;
mCardCommand = COMM_NONE_e;
OSUnlockMutex(&mMutex);
} while (true);
}
@@ -75,23 +84,23 @@ void mDoMemCd_Ctrl_c::main() {
void mDoMemCd_Ctrl_c::update() {
if (mDoRst::isReset()) {
OSLockMutex(&mMutex);
mCardCommand = CARD_DETACH;
mCardCommand = COMM_DETACH_e;
mProbeStat = 3;
OSUnlockMutex(&mMutex);
OSSignalCond(&mCond);
} else if (getStatus(0) != 14) {
if (CARDProbe(0) && getStatus(0) == 0) {
if (CARDProbe(SLOT_A) && getStatus(0) == 0) {
OSLockMutex(&mMutex);
mProbeStat = 0;
mCardState = 13;
mCardCommand = CARD_ATTACH;
mCardState = CARD_STATE_13_e;
mCardCommand = COMM_ATTACH_e;
OSUnlockMutex(&mMutex);
OSSignalCond(&mCond);
} else if (!CARDProbe(0) && getStatus(0) != 0) {
} else if (!CARDProbe(SLOT_A) && getStatus(0) != 0) {
OSLockMutex(&mMutex);
mProbeStat = 1;
mCardState = 13;
mCardCommand = CARD_DETACH;
mCardState = CARD_STATE_13_e;
mCardCommand = COMM_DETACH_e;
OSUnlockMutex(&mMutex);
OSSignalCond(&mCond);
}
@@ -102,7 +111,7 @@ void mDoMemCd_Ctrl_c::update() {
void mDoMemCd_Ctrl_c::load() {
if (OSTryLockMutex(&mMutex)) {
field_0x1fc8 = 0;
mCardCommand = CARD_RESTORE;
mCardCommand = COMM_RESTORE_e;
OSUnlockMutex(&mMutex);
OSSignalCond(&mCond);
}
@@ -113,16 +122,19 @@ void mDoMemCd_Ctrl_c::restore() {
CARDFileInfo file;
field_0x1fc8 = 0;
s32 card_state = CARDOpen(mChannel, "gczelda2", &file);
if (card_state == CARD_RESULT_READY) {
if (!mDoMemCdRWm_Restore(&file, this, sizeof(mData))) {
mCardState = 3;
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(card_state);
setCardState(ret);
}
CARDClose(&file);
} else {
setCardState(card_state);
setCardState(ret);
}
field_0x1fc8 = 1;
@@ -130,7 +142,7 @@ void mDoMemCd_Ctrl_c::restore() {
/* 80016AB0-80016B58 0113F0 00A8+00 0/0 2/2 0/0 .text LoadSync__15mDoMemCd_Ctrl_cFPvUlUl
*/
s32 mDoMemCd_Ctrl_c::LoadSync(void* buffer, u32 size, u32 index) {
s32 mDoMemCd_Ctrl_c::LoadSync(void* i_buffer, u32 i_size, u32 i_position) {
int ret = 0;
if (field_0x1fc8 == 0) {
@@ -138,12 +150,12 @@ s32 mDoMemCd_Ctrl_c::LoadSync(void* buffer, u32 size, u32 index) {
}
if (OSTryLockMutex(&mMutex)) {
if (mCardState == 3) {
memcpy(buffer, &mData[index], size);
mCardState = 1;
if (mCardState == CARD_STATE_READ_e) {
memcpy(i_buffer, &mData[i_position], i_size);
mCardState = CARD_STATE_READY_e;
ret = 1;
} else {
mCardState = 2;
mCardState = CARD_STATE_NO_FILE_e;
ret = 2;
}
OSUnlockMutex(&mMutex);
@@ -153,11 +165,11 @@ s32 mDoMemCd_Ctrl_c::LoadSync(void* buffer, u32 size, u32 index) {
}
/* 80016B58-80016BD4 011498 007C+00 0/0 2/2 0/0 .text save__15mDoMemCd_Ctrl_cFPvUlUl */
void mDoMemCd_Ctrl_c::save(void* buffer, u32 size, u32 index) {
void mDoMemCd_Ctrl_c::save(void* i_buffer, u32 i_size, u32 i_position) {
if (OSTryLockMutex(&mMutex)) {
memcpy(&mData[index], buffer, size);
memcpy(&mData[i_position], i_buffer, i_size);
field_0x1fc8 = 0;
mCardCommand = CARD_STORE;
mCardCommand = COMM_STORE_e;
OSUnlockMutex(&mMutex);
OSSignalCond(&mCond);
}
@@ -166,33 +178,35 @@ void mDoMemCd_Ctrl_c::save(void* buffer, u32 size, u32 index) {
/* 80016BD4-80016CE0 011514 010C+00 1/1 0/0 0/0 .text store__15mDoMemCd_Ctrl_cFv */
void mDoMemCd_Ctrl_c::store() {
CARDFileInfo file;
s32 card_state;
s32 ret;
field_0x1fc8 = 0;
if (mCardState == 2) {
card_state = CARDCreate(mChannel, "gczelda2", 0x8000, &file);
if (card_state == CARD_RESULT_READY || card_state == CARD_RESULT_EXIST) {
mCardState = 1;
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(card_state);
setCardState(ret);
}
}
if (mCardState == 1) {
card_state = CARDOpen(mChannel, "gczelda2", &file);
if (card_state == CARD_RESULT_READY) {
card_state = mDoMemCdRWm_Store(&file, this, sizeof(mData));
if (card_state != CARD_RESULT_READY) {
setCardState(card_state);
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 = 4;
mCardState = CARD_STATE_WRITE_e;
OS_REPORT("CARD Write OK ret:%d stat:%d\n", ret, mCardState);
}
CARDClose(&file);
} else {
setCardState(card_state);
setCardState(ret);
}
} else {
setCardState(card_state);
setCardState(ret);
}
field_0x1fc8 = 1;
@@ -207,14 +221,16 @@ s32 mDoMemCd_Ctrl_c::SaveSync() {
}
if (OSTryLockMutex(&mMutex)) {
if (mCardState == 4) {
mCardState = 1;
if (mCardState == CARD_STATE_WRITE_e) {
mCardState = CARD_STATE_READY_e;
ret = 1;
} else if (mCardState == 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);
}
@@ -226,46 +242,46 @@ u32 mDoMemCd_Ctrl_c::getStatus(u32) {
u32 status;
if (OSTryLockMutex(&mMutex)) {
switch (mCardState) {
case 1:
case CARD_STATE_READY_e:
status = 2;
break;
case 2:
case CARD_STATE_NO_FILE_e:
status = 1;
break;
case 3:
case CARD_STATE_READ_e:
status = 3;
break;
case 4:
case CARD_STATE_WRITE_e:
status = 4;
break;
case 5:
case CARD_STATE_FORMAT_e:
status = 5;
break;
case 0:
case CARD_STATE_NO_CARD_e:
status = 0;
break;
case 6:
case CARD_STATE_WRONG_ENCODING_e:
status = 7;
break;
case 7:
case CARD_STATE_BROKEN_e:
status = 6;
break;
case 8:
case CARD_STATE_INSSPACE_e:
status = 11;
break;
case 9:
case CARD_STATE_NOENT_e:
status = 12;
break;
case 10:
case CARD_STATE_WRONG_DEVICE_e:
status = 9;
break;
case 11:
case CARD_STATE_WRONG_SECTORSIZE_e:
status = 10;
break;
case 12:
case CARD_STATE_FATAL_ERROR_e:
status = 8;
break;
case 13:
case CARD_STATE_13_e:
status = 14;
break;
}
@@ -281,7 +297,7 @@ u32 mDoMemCd_Ctrl_c::getStatus(u32) {
*/
void mDoMemCd_Ctrl_c::command_format() {
if (OSTryLockMutex(&mMutex)) {
mCardCommand = CARD_FORMAT;
mCardCommand = COMM_FORMAT_e;
OSUnlockMutex(&mMutex);
OSSignalCond(&mCond);
}
@@ -291,12 +307,12 @@ void mDoMemCd_Ctrl_c::command_format() {
void mDoMemCd_Ctrl_c::format() {
field_0x1fc8 = 0;
s32 card_state = CARDFormat(mChannel);
s32 ret = CARDFormat(mChannel);
if (OSTryLockMutex(&mMutex)) {
if (card_state == CARD_RESULT_READY) {
mCardState = 5;
if (ret == CARD_RESULT_READY) {
mCardState = CARD_STATE_FORMAT_e;
} else {
setCardState(card_state);
setCardState(ret);
}
field_0x1fc8 = 1;
@@ -313,9 +329,9 @@ s32 mDoMemCd_Ctrl_c::FormatSync() {
}
if (OSTryLockMutex(&mMutex)) {
if (mCardState != 13) {
if (mCardState == 5) {
mCardState = 2;
if (mCardState != CARD_STATE_13_e) {
if (mCardState == CARD_STATE_FORMAT_e) {
mCardState = CARD_STATE_NO_FILE_e;
ret = 1;
} else {
ret = 2;
@@ -330,33 +346,33 @@ s32 mDoMemCd_Ctrl_c::FormatSync() {
/* 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 sect_size;
s32 sector_size;
s32 card_state = CARDProbeEx(mChannel, &mem_size, &sect_size);
if (card_state == CARD_RESULT_NOCARD) {
mCardState = 0;
} else if (card_state == CARD_RESULT_FATAL_ERROR) {
mCardState = 12;
} else if (card_state == CARD_RESULT_WRONGDEVICE) {
mCardState = 10;
} else if (sect_size != 0x2000) {
mCardState = 11;
s32 ret = CARDProbeEx(mChannel, &mem_size, &sector_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 = 1;
mCardState = CARD_STATE_READY_e;
} else {
switch (checkspace()) {
case 0:
mCardState = 2;
case CHECKSPACE_RESULT_READY:
mCardState = CARD_STATE_NO_FILE_e;
break;
case 1:
mCardState = 8;
case CHECKSPACE_RESULT_INSSPACE:
mCardState = CARD_STATE_INSSPACE_e;
break;
case 2:
mCardState = 9;
case CHECKSPACE_RESULT_NOENT:
mCardState = CARD_STATE_NOENT_e;
break;
case 3:
case CHECKSPACE_RESULT_ERROR:
break;
}
}
@@ -368,8 +384,8 @@ void mDoMemCd_Ctrl_c::attach() {
*/
void mDoMemCd_Ctrl_c::command_attach() {
if (OSTryLockMutex(&mMutex)) {
mCardState = 13;
mCardCommand = CARD_ATTACH;
mCardState = CARD_STATE_13_e;
mCardCommand = COMM_ATTACH_e;
OSUnlockMutex(&mMutex);
OSSignalCond(&mCond);
}
@@ -378,64 +394,62 @@ void mDoMemCd_Ctrl_c::command_attach() {
/* 80017110-80017148 011A50 0038+00 1/1 0/0 0/0 .text detach__15mDoMemCd_Ctrl_cFv */
void mDoMemCd_Ctrl_c::detach() {
CARDUnmount(mChannel);
mCardState = 0;
mCardState = CARD_STATE_NO_CARD_e;
}
/* ############################################################################################## */
/* 803E0F40-803EAF40 00DC60 A000+00 1/1 0/0 0/0 .bss MemCardWorkArea0 */
static u8 MemCardWorkArea0[5 * 8 * 1024] ALIGN_DECL(32);
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, 0);
s32 result = CARDMount(mChannel, MemCardWorkArea0, NULL);
switch (result) {
case CARD_RESULT_IOERROR:
case CARD_RESULT_FATAL_ERROR:
mCardState = 12;
return 0;
mCardState = CARD_STATE_FATAL_ERROR_e;
return FALSE;
case CARD_RESULT_NOCARD:
mCardState = 0;
return 0;
mCardState = CARD_STATE_NO_CARD_e;
return FALSE;
case CARD_RESULT_BROKEN:
case CARD_RESULT_READY:
switch (CARDCheck(mChannel)) {
case CARD_RESULT_READY:
return 1;
return TRUE;
case CARD_RESULT_BROKEN:
mCardState = 7;
return 0;
mCardState = CARD_STATE_BROKEN_e;
return FALSE;
case CARD_RESULT_IOERROR:
mCardState = 12;
return 0;
mCardState = CARD_STATE_FATAL_ERROR_e;
return FALSE;
case CARD_RESULT_NOCARD:
mCardState = 0;
return 0;
mCardState = CARD_STATE_NO_CARD_e;
return FALSE;
case CARD_RESULT_ENCODING:
mCardState = 6;
return 0;
mCardState = CARD_STATE_WRONG_ENCODING_e;
return FALSE;
}
break;
case CARD_RESULT_ENCODING:
mCardState = 6;
return 0;
mCardState = CARD_STATE_WRONG_ENCODING_e;
return FALSE;
}
return 0;
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 card_state = CARDOpen(mChannel, "gczelda2", &file);
if (card_state == CARD_RESULT_READY) {
s32 ret = CARDOpen(mChannel, "gczelda2", &file);
if (ret == CARD_RESULT_READY) {
CARDClose(&file);
return CARD_RESULT_UNLOCKED;
return TRUE;
} else {
setCardState(card_state);
return CARD_RESULT_READY;
setCardState(ret);
return FALSE;
}
}
@@ -443,51 +457,50 @@ s32 mDoMemCd_Ctrl_c::loadfile() {
//
s32 mDoMemCd_Ctrl_c::checkspace() {
s32 bytesNotUsed, filesNotUsed;
s32 result = CARDFreeBlocks(mChannel,&bytesNotUsed,&filesNotUsed);
s32 result = CARDFreeBlocks(mChannel, &bytesNotUsed, &filesNotUsed);
if (result != 0) {
if (result != CARD_RESULT_READY) {
setCardState(result);
return 3;
return CHECKSPACE_RESULT_ERROR;
}
if (bytesNotUsed < 0x8000) {
return 1;
if (bytesNotUsed < SAVEDATA_FILE_SIZE) {
return CHECKSPACE_RESULT_INSSPACE;
}
if (filesNotUsed < 1) {
return 2;
return CHECKSPACE_RESULT_NOENT;
}
return 0;
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 param_0) {
switch (param_0) {
void mDoMemCd_Ctrl_c::setCardState(s32 i_result) {
switch (i_result) {
case CARD_RESULT_IOERROR:
case CARD_RESULT_FATAL_ERROR:
mCardState = 12;
mCardState = CARD_STATE_FATAL_ERROR_e;
break;
case CARD_RESULT_NOCARD:
mCardState = 0;
mCardState = CARD_STATE_NO_CARD_e;
break;
case CARD_RESULT_BROKEN:
case CARD_RESULT_READY:
if (CARDCheck(mChannel) != 0) {
mCardState = 7;
if (CARDCheck(mChannel) != CARD_RESULT_READY) {
mCardState = CARD_STATE_BROKEN_e;
}
break;
case CARD_RESULT_ENCODING:
mCardState = 6;
mCardState = CARD_STATE_WRONG_ENCODING_e;
break;
case CARD_RESULT_NOFILE:
mCardState = 2;
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;