2020-10-03 17:22:44 +02:00
|
|
|
#include "global.h"
|
|
|
|
#include "vt.h"
|
2020-03-17 00:31:30 -04:00
|
|
|
|
|
|
|
StackEntry sDmaMgrStackInfo;
|
|
|
|
OSMesgQueue sDmaMgrMsgQueue;
|
|
|
|
OSMesg sDmaMgrMsgs[0x20];
|
|
|
|
OSThread sDmaMgrThread;
|
2022-02-06 18:00:01 +00:00
|
|
|
STACK(sDmaMgrStack, 0x500);
|
2020-03-17 00:31:30 -04:00
|
|
|
const char* sDmaMgrCurFileName;
|
|
|
|
s32 sDmaMgrCurFileLine;
|
|
|
|
|
|
|
|
u32 D_80009460 = 0;
|
2020-05-14 18:11:33 -05:00
|
|
|
u32 gDmaMgrDmaBuffSize = 0x2000;
|
2022-01-17 21:30:30 +01:00
|
|
|
u32 sDmaMgrIsRomCompressed = false;
|
2021-02-14 00:49:40 +00:00
|
|
|
|
2021-11-30 23:29:09 +00:00
|
|
|
// dmadata filenames
|
|
|
|
#define DEFINE_DMA_ENTRY(name) #name,
|
|
|
|
|
|
|
|
const char* sDmaMgrFileNames[] = {
|
|
|
|
#include "tables/dmadata_table.h"
|
2020-03-17 00:31:30 -04:00
|
|
|
};
|
|
|
|
|
2021-11-30 23:29:09 +00:00
|
|
|
#undef DEFINE_DMA_ENTRY
|
|
|
|
|
2020-03-22 22:19:43 +01:00
|
|
|
s32 DmaMgr_CompareName(const char* name1, const char* name2) {
|
|
|
|
while (*name1 != 0u) {
|
|
|
|
if (*name1 > *name2) {
|
2020-03-17 00:31:30 -04:00
|
|
|
return 1;
|
2020-03-22 22:19:43 +01:00
|
|
|
}
|
2020-03-17 00:31:30 -04:00
|
|
|
|
2020-03-22 22:19:43 +01:00
|
|
|
if (*name1 < *name2) {
|
2020-03-17 00:31:30 -04:00
|
|
|
return -1;
|
2020-03-22 22:19:43 +01:00
|
|
|
}
|
2020-03-17 00:31:30 -04:00
|
|
|
|
|
|
|
name1++;
|
|
|
|
name2++;
|
|
|
|
}
|
|
|
|
|
2020-03-22 22:19:43 +01:00
|
|
|
if (*name2 > 0) {
|
2020-03-17 00:31:30 -04:00
|
|
|
return -1;
|
2020-03-22 22:19:43 +01:00
|
|
|
}
|
2020-03-17 00:31:30 -04:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2021-11-07 17:58:50 +01:00
|
|
|
s32 DmaMgr_DmaRomToRam(u32 rom, u32 ram, u32 size) {
|
2020-03-17 00:31:30 -04:00
|
|
|
OSIoMesg ioMsg;
|
|
|
|
OSMesgQueue queue;
|
|
|
|
OSMesg msg;
|
|
|
|
s32 ret;
|
2021-02-14 00:49:40 +00:00
|
|
|
u32 buffSize = gDmaMgrDmaBuffSize;
|
2020-07-30 15:50:18 -04:00
|
|
|
s32 pad[2];
|
2020-03-17 00:31:30 -04:00
|
|
|
|
2020-03-22 22:19:43 +01:00
|
|
|
if (buffSize == 0) {
|
2020-03-17 00:31:30 -04:00
|
|
|
buffSize = 0x2000;
|
2020-03-22 22:19:43 +01:00
|
|
|
}
|
2020-03-17 00:31:30 -04:00
|
|
|
|
|
|
|
osInvalICache((void*)ram, size);
|
|
|
|
osInvalDCache((void*)ram, size);
|
|
|
|
osCreateMesgQueue(&queue, &msg, 1);
|
|
|
|
|
2020-03-22 22:19:43 +01:00
|
|
|
while (size > buffSize) {
|
2020-03-17 00:31:30 -04:00
|
|
|
if (1) {} // Necessary to match
|
|
|
|
|
|
|
|
ioMsg.hdr.pri = OS_MESG_PRI_NORMAL;
|
|
|
|
ioMsg.hdr.retQueue = &queue;
|
|
|
|
ioMsg.devAddr = rom;
|
|
|
|
ioMsg.dramAddr = (void*)ram;
|
|
|
|
ioMsg.size = buffSize;
|
|
|
|
|
2020-03-22 22:19:43 +01:00
|
|
|
if (D_80009460 == 10) {
|
|
|
|
osSyncPrintf("%10lld ノーマルDMA %08x %08x %08x (%d)\n", OS_CYCLES_TO_USEC(osGetTime()), ioMsg.dramAddr,
|
|
|
|
ioMsg.devAddr, ioMsg.size, gPiMgrCmdQ.validCount);
|
|
|
|
}
|
2020-03-17 00:31:30 -04:00
|
|
|
|
|
|
|
ret = osEPiStartDma(gCartHandle, &ioMsg, OS_READ);
|
2020-03-22 22:19:43 +01:00
|
|
|
if (ret) {
|
2021-11-07 17:58:50 +01:00
|
|
|
goto end;
|
2020-03-22 22:19:43 +01:00
|
|
|
}
|
2020-03-17 00:31:30 -04:00
|
|
|
|
2020-03-22 22:19:43 +01:00
|
|
|
if (D_80009460 == 10) {
|
|
|
|
osSyncPrintf("%10lld ノーマルDMA START (%d)\n", OS_CYCLES_TO_USEC(osGetTime()), gPiMgrCmdQ.validCount);
|
|
|
|
}
|
2020-03-17 00:31:30 -04:00
|
|
|
|
2021-11-07 17:58:50 +01:00
|
|
|
osRecvMesg(&queue, NULL, OS_MESG_BLOCK);
|
2020-03-22 22:19:43 +01:00
|
|
|
if (D_80009460 == 10) {
|
|
|
|
osSyncPrintf("%10lld ノーマルDMA END (%d)\n", OS_CYCLES_TO_USEC(osGetTime()), gPiMgrCmdQ.validCount);
|
|
|
|
}
|
2020-03-17 00:31:30 -04:00
|
|
|
|
|
|
|
size -= buffSize;
|
|
|
|
rom += buffSize;
|
|
|
|
ram += buffSize;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (1) {} // Also necessary to match
|
|
|
|
|
|
|
|
ioMsg.hdr.pri = OS_MESG_PRI_NORMAL;
|
|
|
|
ioMsg.hdr.retQueue = &queue;
|
|
|
|
ioMsg.devAddr = rom;
|
|
|
|
ioMsg.dramAddr = (void*)ram;
|
|
|
|
ioMsg.size = size;
|
|
|
|
|
2020-03-22 22:19:43 +01:00
|
|
|
if (D_80009460 == 10) {
|
|
|
|
osSyncPrintf("%10lld ノーマルDMA %08x %08x %08x (%d)\n", OS_CYCLES_TO_USEC(osGetTime()), ioMsg.dramAddr,
|
|
|
|
ioMsg.devAddr, ioMsg.size, gPiMgrCmdQ.validCount);
|
|
|
|
}
|
2020-03-17 00:31:30 -04:00
|
|
|
|
|
|
|
ret = osEPiStartDma(gCartHandle, &ioMsg, OS_READ);
|
2020-03-22 22:19:43 +01:00
|
|
|
if (ret) {
|
2021-11-07 17:58:50 +01:00
|
|
|
goto end;
|
2020-03-22 22:19:43 +01:00
|
|
|
}
|
2020-03-17 00:31:30 -04:00
|
|
|
|
2021-11-07 17:58:50 +01:00
|
|
|
osRecvMesg(&queue, NULL, OS_MESG_BLOCK);
|
2020-03-22 22:19:43 +01:00
|
|
|
if (D_80009460 == 10) {
|
|
|
|
osSyncPrintf("%10lld ノーマルDMA END (%d)\n", OS_CYCLES_TO_USEC(osGetTime()), gPiMgrCmdQ.validCount);
|
|
|
|
}
|
2020-03-17 00:31:30 -04:00
|
|
|
|
2021-11-07 17:58:50 +01:00
|
|
|
end:
|
2020-03-17 00:31:30 -04:00
|
|
|
osInvalICache((void*)ram, size);
|
|
|
|
osInvalDCache((void*)ram, size);
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2021-11-07 17:58:50 +01:00
|
|
|
s32 DmaMgr_DmaHandler(OSPiHandle* pihandle, OSIoMesg* mb, s32 direction) {
|
2020-03-17 00:31:30 -04:00
|
|
|
s32 ret;
|
|
|
|
|
2021-04-29 14:39:46 -04:00
|
|
|
ASSERT(pihandle == gCartHandle, "pihandle == carthandle", "../z_std_dma.c", 530);
|
|
|
|
ASSERT(direction == OS_READ, "direction == OS_READ", "../z_std_dma.c", 531);
|
|
|
|
ASSERT(mb != NULL, "mb != NULL", "../z_std_dma.c", 532);
|
2020-03-17 00:31:30 -04:00
|
|
|
|
2020-03-22 22:19:43 +01:00
|
|
|
if (D_80009460 == 10) {
|
|
|
|
osSyncPrintf("%10lld サウンドDMA %08x %08x %08x (%d)\n", OS_CYCLES_TO_USEC(osGetTime()), mb->dramAddr,
|
|
|
|
mb->devAddr, mb->size, gPiMgrCmdQ.validCount);
|
|
|
|
}
|
2020-03-17 00:31:30 -04:00
|
|
|
|
|
|
|
ret = osEPiStartDma(pihandle, mb, direction);
|
2020-03-22 22:19:43 +01:00
|
|
|
if (ret) {
|
2020-03-17 00:31:30 -04:00
|
|
|
osSyncPrintf("OOPS!!\n");
|
2020-03-22 22:19:43 +01:00
|
|
|
}
|
2020-03-17 00:31:30 -04:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2021-11-07 17:58:50 +01:00
|
|
|
void DmaMgr_DmaFromDriveRom(u32 ram, u32 rom, u32 size) {
|
2021-02-14 00:49:40 +00:00
|
|
|
OSPiHandle* handle = osDriveRomInit();
|
2020-03-17 00:31:30 -04:00
|
|
|
OSMesgQueue queue;
|
|
|
|
OSMesg msg;
|
|
|
|
OSIoMesg ioMsg;
|
|
|
|
|
|
|
|
osInvalICache((void*)ram, size);
|
|
|
|
osInvalDCache((void*)ram, size);
|
|
|
|
osCreateMesgQueue(&queue, &msg, 1);
|
|
|
|
|
|
|
|
ioMsg.hdr.retQueue = &queue;
|
|
|
|
ioMsg.hdr.pri = OS_MESG_PRI_NORMAL;
|
|
|
|
ioMsg.devAddr = rom;
|
|
|
|
ioMsg.dramAddr = (void*)ram;
|
|
|
|
ioMsg.size = size;
|
|
|
|
handle->transferInfo.cmdType = 2;
|
|
|
|
|
2021-11-07 17:58:50 +01:00
|
|
|
osEPiStartDma(handle, &ioMsg, OS_READ);
|
2021-02-14 00:49:40 +00:00
|
|
|
osRecvMesg(&queue, NULL, OS_MESG_BLOCK);
|
2020-03-17 00:31:30 -04:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-03-22 22:19:43 +01:00
|
|
|
void DmaMgr_Error(DmaRequest* req, const char* file, const char* errorName, const char* errorDesc) {
|
2021-02-14 00:49:40 +00:00
|
|
|
u32 vrom = req->vromAddr;
|
|
|
|
u32 ram = (u32)req->dramAddr;
|
|
|
|
u32 size = req->size;
|
2020-03-22 22:19:43 +01:00
|
|
|
char buff1[80];
|
|
|
|
char buff2[80];
|
2020-03-17 00:31:30 -04:00
|
|
|
|
|
|
|
osSyncPrintf("%c", 7);
|
|
|
|
osSyncPrintf(VT_FGCOL(RED));
|
|
|
|
osSyncPrintf("DMA致命的エラー(%s)\nROM:%X RAM:%X SIZE:%X %s\n",
|
2021-10-03 05:17:09 +02:00
|
|
|
errorDesc != NULL ? errorDesc : (errorName != NULL ? errorName : "???"), vrom, ram, size,
|
|
|
|
file != NULL ? file : "???");
|
2020-03-17 00:31:30 -04:00
|
|
|
|
2020-03-22 22:19:43 +01:00
|
|
|
if (req->filename) {
|
2020-03-17 00:31:30 -04:00
|
|
|
osSyncPrintf("DMA ERROR: %s %d", req->filename, req->line);
|
2020-03-22 22:19:43 +01:00
|
|
|
} else if (sDmaMgrCurFileName) {
|
2020-03-17 00:31:30 -04:00
|
|
|
osSyncPrintf("DMA ERROR: %s %d", sDmaMgrCurFileName, sDmaMgrCurFileLine);
|
2020-03-22 22:19:43 +01:00
|
|
|
}
|
2020-03-17 00:31:30 -04:00
|
|
|
|
|
|
|
osSyncPrintf(VT_RST);
|
|
|
|
|
2020-03-22 22:19:43 +01:00
|
|
|
if (req->filename) {
|
2020-03-17 00:31:30 -04:00
|
|
|
sprintf(buff1, "DMA ERROR: %s %d", req->filename, req->line);
|
2020-03-22 22:19:43 +01:00
|
|
|
} else if (sDmaMgrCurFileName) {
|
2020-03-17 00:31:30 -04:00
|
|
|
sprintf(buff1, "DMA ERROR: %s %d", sDmaMgrCurFileName, sDmaMgrCurFileLine);
|
2020-03-22 22:19:43 +01:00
|
|
|
} else {
|
2021-10-03 05:17:09 +02:00
|
|
|
sprintf(buff1, "DMA ERROR: %s", errorName != NULL ? errorName : "???");
|
2020-03-22 22:19:43 +01:00
|
|
|
}
|
|
|
|
|
2021-10-03 05:17:09 +02:00
|
|
|
sprintf(buff2, "%07X %08X %X %s", vrom, ram, size, file != NULL ? file : "???");
|
2020-03-17 00:31:30 -04:00
|
|
|
Fault_AddHungupAndCrashImpl(buff1, buff2);
|
|
|
|
}
|
|
|
|
|
2020-03-22 22:19:43 +01:00
|
|
|
const char* DmaMgr_GetFileNameImpl(u32 vrom) {
|
2021-02-14 00:49:40 +00:00
|
|
|
DmaEntry* iter = gDmaDataTable;
|
|
|
|
const char** name = sDmaMgrFileNames;
|
2020-03-17 00:31:30 -04:00
|
|
|
|
2020-03-22 22:19:43 +01:00
|
|
|
while (iter->vromEnd) {
|
|
|
|
if (vrom >= iter->vromStart && vrom < iter->vromEnd) {
|
2020-03-17 00:31:30 -04:00
|
|
|
return *name;
|
2020-03-22 22:19:43 +01:00
|
|
|
}
|
2020-03-17 00:31:30 -04:00
|
|
|
|
|
|
|
iter++;
|
|
|
|
name++;
|
|
|
|
}
|
2021-10-03 05:17:09 +02:00
|
|
|
//! @bug Since there is no return, in case the file isn't found, the return value will be a pointer to the end
|
2020-03-22 22:19:43 +01:00
|
|
|
// of gDmaDataTable
|
2020-03-17 00:31:30 -04:00
|
|
|
}
|
|
|
|
|
2020-03-22 22:19:43 +01:00
|
|
|
const char* DmaMgr_GetFileName(u32 vrom) {
|
2020-03-17 00:31:30 -04:00
|
|
|
const char* ret = DmaMgr_GetFileNameImpl(vrom);
|
2021-02-14 00:49:40 +00:00
|
|
|
|
|
|
|
if (ret == NULL) {
|
2020-03-17 00:31:30 -04:00
|
|
|
return "(unknown)";
|
2020-03-22 22:19:43 +01:00
|
|
|
}
|
2020-03-17 00:31:30 -04:00
|
|
|
|
2020-03-22 22:19:43 +01:00
|
|
|
if (DmaMgr_CompareName(ret, "kanji") == 0 || DmaMgr_CompareName(ret, "link_animetion") == 0) {
|
2020-03-17 00:31:30 -04:00
|
|
|
return NULL;
|
2020-03-22 22:19:43 +01:00
|
|
|
}
|
2020-03-17 00:31:30 -04:00
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2020-03-22 22:19:43 +01:00
|
|
|
void DmaMgr_ProcessMsg(DmaRequest* req) {
|
2021-02-14 00:49:40 +00:00
|
|
|
u32 vrom = req->vromAddr;
|
|
|
|
void* ram = req->dramAddr;
|
|
|
|
u32 size = req->size;
|
2020-03-17 00:31:30 -04:00
|
|
|
u32 romStart;
|
|
|
|
u32 romSize;
|
2021-02-14 00:49:40 +00:00
|
|
|
u8 found = false;
|
2020-03-17 00:31:30 -04:00
|
|
|
DmaEntry* iter;
|
|
|
|
const char* filename;
|
|
|
|
|
2021-02-14 00:49:40 +00:00
|
|
|
if (0) {
|
|
|
|
// the string is defined in .rodata but not used, suggesting
|
|
|
|
// a debug print is here but optimized out in some way
|
|
|
|
osSyncPrintf("DMA ROM:%08X RAM:%08X SIZE:%08X %s\n");
|
|
|
|
// the last arg of this print looks like it may be filename, but
|
|
|
|
// filename above this block does not match
|
|
|
|
}
|
|
|
|
|
2020-03-17 00:31:30 -04:00
|
|
|
filename = DmaMgr_GetFileName(vrom);
|
|
|
|
iter = gDmaDataTable;
|
|
|
|
|
2020-03-22 22:19:43 +01:00
|
|
|
while (iter->vromEnd) {
|
|
|
|
if (vrom >= iter->vromStart && vrom < iter->vromEnd) {
|
2020-03-17 00:31:30 -04:00
|
|
|
if (1) {} // Necessary to match
|
|
|
|
|
2020-03-22 22:19:43 +01:00
|
|
|
if (iter->romEnd == 0) {
|
|
|
|
if (iter->vromEnd < vrom + size) {
|
2020-03-17 00:31:30 -04:00
|
|
|
DmaMgr_Error(req, filename, "Segment Alignment Error",
|
|
|
|
"セグメント境界をまたがってDMA転送することはできません");
|
2020-03-22 22:19:43 +01:00
|
|
|
}
|
2020-03-17 00:31:30 -04:00
|
|
|
|
2021-11-07 17:58:50 +01:00
|
|
|
DmaMgr_DmaRomToRam(iter->romStart + (vrom - iter->vromStart), (u32)ram, size);
|
2020-03-17 00:31:30 -04:00
|
|
|
found = true;
|
|
|
|
|
2021-02-14 00:49:40 +00:00
|
|
|
if (0) {
|
|
|
|
osSyncPrintf("No Press ROM:%08X RAM:%08X SIZE:%08X\n", vrom, ram, size);
|
|
|
|
}
|
2020-03-22 22:19:43 +01:00
|
|
|
} else {
|
2020-03-17 00:31:30 -04:00
|
|
|
romStart = iter->romStart;
|
|
|
|
romSize = iter->romEnd - iter->romStart;
|
|
|
|
|
2020-03-22 22:19:43 +01:00
|
|
|
if (vrom != iter->vromStart) {
|
2020-03-17 00:31:30 -04:00
|
|
|
DmaMgr_Error(req, filename, "Can't Transfer Segment",
|
|
|
|
"圧縮されたセグメントの途中からはDMA転送することはできません");
|
2020-03-22 22:19:43 +01:00
|
|
|
}
|
2020-03-17 00:31:30 -04:00
|
|
|
|
2020-03-22 22:19:43 +01:00
|
|
|
if (size != iter->vromEnd - iter->vromStart) {
|
2020-03-17 00:31:30 -04:00
|
|
|
DmaMgr_Error(req, filename, "Can't Transfer Segment",
|
|
|
|
"圧縮されたセグメントの一部だけをDMA転送することはできません");
|
2020-03-22 22:19:43 +01:00
|
|
|
}
|
2020-03-17 00:31:30 -04:00
|
|
|
|
2020-10-03 17:22:44 +02:00
|
|
|
osSetThreadPri(NULL, Z_PRIORITY_MAIN);
|
2020-03-17 00:31:30 -04:00
|
|
|
Yaz0_Decompress(romStart, ram, romSize);
|
2020-10-03 17:22:44 +02:00
|
|
|
osSetThreadPri(NULL, Z_PRIORITY_DMAMGR);
|
2020-03-17 00:31:30 -04:00
|
|
|
found = true;
|
|
|
|
|
2021-02-14 00:49:40 +00:00
|
|
|
if (0) {
|
|
|
|
osSyncPrintf(" Press ROM:%X RAM:%X SIZE:%X\n", vrom, ram, size);
|
|
|
|
}
|
2020-03-17 00:31:30 -04:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
iter++;
|
|
|
|
}
|
|
|
|
|
2020-03-22 22:19:43 +01:00
|
|
|
if (!found) {
|
2022-01-17 21:30:30 +01:00
|
|
|
if (sDmaMgrIsRomCompressed) {
|
2020-03-17 00:31:30 -04:00
|
|
|
DmaMgr_Error(req, NULL, "DATA DON'T EXIST", "該当するデータが存在しません");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-11-07 17:58:50 +01:00
|
|
|
DmaMgr_DmaRomToRam(vrom, (u32)ram, size);
|
2020-03-17 00:31:30 -04:00
|
|
|
|
2021-02-14 00:49:40 +00:00
|
|
|
if (0) {
|
|
|
|
osSyncPrintf("No Press ROM:%08X RAM:%08X SIZE:%08X (非公式)\n", vrom, ram, size);
|
|
|
|
}
|
2020-03-17 00:31:30 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-22 22:19:43 +01:00
|
|
|
void DmaMgr_ThreadEntry(void* arg0) {
|
2020-03-17 00:31:30 -04:00
|
|
|
OSMesg msg;
|
|
|
|
DmaRequest* req;
|
2020-03-22 22:19:43 +01:00
|
|
|
|
2020-03-17 00:31:30 -04:00
|
|
|
osSyncPrintf("DMAマネージャスレッド実行開始\n");
|
2020-03-22 22:19:43 +01:00
|
|
|
while (true) {
|
2021-11-07 17:58:50 +01:00
|
|
|
osRecvMesg(&sDmaMgrMsgQueue, &msg, OS_MESG_BLOCK);
|
2020-03-17 00:31:30 -04:00
|
|
|
req = (DmaRequest*)msg;
|
2021-02-14 00:49:40 +00:00
|
|
|
if (req == NULL) {
|
2020-03-17 00:31:30 -04:00
|
|
|
break;
|
2020-03-22 22:19:43 +01:00
|
|
|
}
|
|
|
|
|
2021-02-14 00:49:40 +00:00
|
|
|
if (0) {
|
|
|
|
osSyncPrintf("DMA登録受付 dmap=%08x\n", req);
|
|
|
|
}
|
2020-03-17 00:31:30 -04:00
|
|
|
|
|
|
|
DmaMgr_ProcessMsg(req);
|
2020-03-22 22:19:43 +01:00
|
|
|
if (req->notifyQueue) {
|
2021-02-14 00:49:40 +00:00
|
|
|
osSendMesg(req->notifyQueue, req->notifyMsg, OS_MESG_NOBLOCK);
|
|
|
|
if (0) {
|
|
|
|
osSyncPrintf("osSendMesg: dmap=%08x, mq=%08x, m=%08x \n", req, req->notifyQueue, req->notifyMsg);
|
|
|
|
}
|
2020-03-17 00:31:30 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
osSyncPrintf("DMAマネージャスレッド実行終了\n");
|
|
|
|
}
|
|
|
|
|
2020-03-22 22:19:43 +01:00
|
|
|
s32 DmaMgr_SendRequestImpl(DmaRequest* req, u32 ram, u32 vrom, u32 size, u32 unk, OSMesgQueue* queue, OSMesg msg) {
|
2020-03-17 00:31:30 -04:00
|
|
|
static s32 sDmaMgrQueueFullLogged = 0;
|
|
|
|
|
2021-11-07 17:58:50 +01:00
|
|
|
if ((1 && (ram == 0)) || (osMemSize < ram + size + 0x80000000) || (vrom & 1) || (vrom > 0x4000000) || (size == 0) ||
|
|
|
|
(size & 1)) {
|
2022-01-12 21:48:04 +01:00
|
|
|
//! @bug `req` is passed to `DmaMgr_Error` without rom, ram and size being set
|
2020-03-17 00:31:30 -04:00
|
|
|
DmaMgr_Error(req, NULL, "ILLIGAL DMA-FUNCTION CALL", "パラメータ異常です");
|
2020-03-22 22:19:43 +01:00
|
|
|
}
|
2020-03-17 00:31:30 -04:00
|
|
|
|
|
|
|
req->vromAddr = vrom;
|
|
|
|
req->dramAddr = (void*)ram;
|
|
|
|
req->size = size;
|
|
|
|
req->unk_14 = 0;
|
|
|
|
req->notifyQueue = queue;
|
|
|
|
req->notifyMsg = msg;
|
|
|
|
|
2020-03-22 22:19:43 +01:00
|
|
|
if (1) {
|
|
|
|
if ((sDmaMgrQueueFullLogged == 0) && (sDmaMgrMsgQueue.validCount >= sDmaMgrMsgQueue.msgCount)) {
|
2020-03-17 00:31:30 -04:00
|
|
|
sDmaMgrQueueFullLogged++;
|
|
|
|
osSyncPrintf("%c", 7);
|
|
|
|
osSyncPrintf(VT_FGCOL(RED));
|
|
|
|
osSyncPrintf("dmaEntryMsgQが一杯です。キューサイズの再検討をおすすめします。");
|
2020-04-05 12:32:08 +02:00
|
|
|
LOG_NUM("(sizeof(dmaEntryMsgBufs) / sizeof(dmaEntryMsgBufs[0]))", ARRAY_COUNT(sDmaMgrMsgs),
|
|
|
|
"../z_std_dma.c", 952);
|
2020-03-17 00:31:30 -04:00
|
|
|
osSyncPrintf(VT_RST);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-02-14 00:49:40 +00:00
|
|
|
osSendMesg(&sDmaMgrMsgQueue, req, OS_MESG_BLOCK);
|
2020-03-17 00:31:30 -04:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2020-03-22 22:19:43 +01:00
|
|
|
s32 DmaMgr_SendRequest0(u32 ram, u32 vrom, u32 size) {
|
2020-03-17 00:31:30 -04:00
|
|
|
DmaRequest req;
|
|
|
|
OSMesgQueue queue;
|
|
|
|
OSMesg msg;
|
|
|
|
s32 ret;
|
|
|
|
|
|
|
|
osCreateMesgQueue(&queue, &msg, 1);
|
|
|
|
ret = DmaMgr_SendRequestImpl(&req, ram, vrom, size, 0, &queue, NULL);
|
2020-03-22 22:19:43 +01:00
|
|
|
if (ret == -1) {
|
2020-03-17 00:31:30 -04:00
|
|
|
return ret;
|
2020-03-22 22:19:43 +01:00
|
|
|
}
|
|
|
|
|
2021-02-14 00:49:40 +00:00
|
|
|
osRecvMesg(&queue, NULL, OS_MESG_BLOCK);
|
2020-03-17 00:31:30 -04:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2021-02-14 00:49:40 +00:00
|
|
|
void DmaMgr_Init(void) {
|
2020-03-17 00:31:30 -04:00
|
|
|
const char** name;
|
|
|
|
s32 idx;
|
|
|
|
DmaEntry* iter;
|
|
|
|
|
2021-11-07 17:58:50 +01:00
|
|
|
DmaMgr_DmaRomToRam((u32)_dmadataSegmentRomStart, (u32)_dmadataSegmentStart,
|
2021-02-14 00:49:40 +00:00
|
|
|
(u32)(_dmadataSegmentRomEnd - _dmadataSegmentRomStart));
|
2020-03-17 00:31:30 -04:00
|
|
|
osSyncPrintf("dma_rom_ad[]\n");
|
|
|
|
|
2022-01-17 21:30:30 +01:00
|
|
|
sDmaMgrIsRomCompressed = false;
|
2020-03-17 00:31:30 -04:00
|
|
|
name = sDmaMgrFileNames;
|
|
|
|
iter = gDmaDataTable;
|
|
|
|
idx = 0;
|
|
|
|
|
2020-03-22 22:19:43 +01:00
|
|
|
while (iter->vromEnd != 0) {
|
|
|
|
if (iter->romEnd != 0) {
|
2022-01-17 21:30:30 +01:00
|
|
|
sDmaMgrIsRomCompressed = true;
|
2020-03-22 22:19:43 +01:00
|
|
|
}
|
2020-03-17 00:31:30 -04:00
|
|
|
|
2020-03-22 22:19:43 +01:00
|
|
|
osSyncPrintf(
|
|
|
|
"%3d %08x %08x %08x %08x %08x %c %s\n", idx, iter->vromStart, iter->vromEnd, iter->romStart, iter->romEnd,
|
|
|
|
(iter->romEnd != 0) ? iter->romEnd - iter->romStart : iter->vromEnd - iter->vromStart,
|
|
|
|
(((iter->romEnd != 0) ? iter->romEnd - iter->romStart : 0) > 0x10000) ? '*' : ' ', name ? *name : "");
|
2020-03-17 00:31:30 -04:00
|
|
|
|
|
|
|
idx++;
|
|
|
|
iter++;
|
|
|
|
|
2020-03-22 22:19:43 +01:00
|
|
|
if (name) {
|
2020-03-17 00:31:30 -04:00
|
|
|
name++;
|
2020-03-22 22:19:43 +01:00
|
|
|
}
|
2020-03-17 00:31:30 -04:00
|
|
|
}
|
|
|
|
|
2020-03-22 22:19:43 +01:00
|
|
|
if ((u32)_bootSegmentRomStart != gDmaDataTable[0].vromEnd) {
|
|
|
|
osSyncPrintf("_bootSegmentRomStart(%08x) != dma_rom_ad[0].rom_b(%08x)\n", _bootSegmentRomStart,
|
|
|
|
gDmaDataTable[0].vromEnd);
|
2020-03-17 00:31:30 -04:00
|
|
|
Fault_AddHungupAndCrash("../z_std_dma.c", 1055);
|
|
|
|
}
|
|
|
|
|
2021-02-14 00:49:40 +00:00
|
|
|
osCreateMesgQueue(&sDmaMgrMsgQueue, sDmaMgrMsgs, ARRAY_COUNT(sDmaMgrMsgs));
|
2022-02-06 18:00:01 +00:00
|
|
|
StackCheck_Init(&sDmaMgrStackInfo, sDmaMgrStack, STACK_TOP(sDmaMgrStack), 0, 0x100, "dmamgr");
|
|
|
|
osCreateThread(&sDmaMgrThread, 0x12, DmaMgr_ThreadEntry, 0, STACK_TOP(sDmaMgrStack), Z_PRIORITY_DMAMGR);
|
2020-03-17 00:31:30 -04:00
|
|
|
osStartThread(&sDmaMgrThread);
|
|
|
|
}
|
|
|
|
|
2020-03-22 22:19:43 +01:00
|
|
|
s32 DmaMgr_SendRequest2(DmaRequest* req, u32 ram, u32 vrom, u32 size, u32 unk5, OSMesgQueue* queue, OSMesg msg,
|
|
|
|
const char* file, s32 line) {
|
2020-03-17 00:31:30 -04:00
|
|
|
req->filename = file;
|
|
|
|
req->line = line;
|
|
|
|
DmaMgr_SendRequestImpl(req, ram, vrom, size, unk5, queue, msg);
|
|
|
|
}
|
|
|
|
|
2020-03-22 22:19:43 +01:00
|
|
|
s32 DmaMgr_SendRequest1(void* ram0, u32 vrom, u32 size, const char* file, s32 line) {
|
2020-03-17 00:31:30 -04:00
|
|
|
DmaRequest req;
|
|
|
|
s32 ret;
|
|
|
|
OSMesgQueue queue;
|
|
|
|
OSMesg msg;
|
|
|
|
u32 ram = (u32)ram0;
|
|
|
|
|
|
|
|
req.filename = file;
|
|
|
|
req.line = line;
|
|
|
|
osCreateMesgQueue(&queue, &msg, 1);
|
|
|
|
ret = DmaMgr_SendRequestImpl(&req, ram, vrom, size, 0, &queue, 0);
|
2020-03-22 22:19:43 +01:00
|
|
|
if (ret == -1) {
|
2020-03-17 00:31:30 -04:00
|
|
|
return ret;
|
2020-03-22 22:19:43 +01:00
|
|
|
}
|
|
|
|
|
2021-11-07 17:58:50 +01:00
|
|
|
osRecvMesg(&queue, NULL, OS_MESG_BLOCK);
|
2020-03-17 00:31:30 -04:00
|
|
|
return 0;
|
|
|
|
}
|