mirror of
https://github.com/DaedalusX64/daedalus.git
synced 2025-04-02 10:21:48 -04:00
122 lines
3.1 KiB
C++
122 lines
3.1 KiB
C++
#define TEST_DISABLE_PI_FUNCS //return PATCH_RET_NOT_PROCESSED;
|
|
|
|
//*****************************************************************************
|
|
//
|
|
//*****************************************************************************
|
|
u32 Patch___osPiCreateAccessQueue()
|
|
{
|
|
TEST_DISABLE_PI_FUNCS
|
|
|
|
#ifdef DAED_OS_MESSAGE_QUEUES
|
|
Write32Bits(VAR_ADDRESS(osPiAccessQueueCreated), 1);
|
|
#ifdef DAEDALUS_DEBUG_CONSOLE
|
|
DBGConsole_Msg(0, "Creating Pi Access Queue");
|
|
#endif
|
|
OS_HLE_osCreateMesgQueue(VAR_ADDRESS(osPiAccessQueue), VAR_ADDRESS(osPiAccessQueueBuffer), 1);
|
|
|
|
//u32 dwQueue = gGPR[REG_a0]._u32_0;
|
|
//u32 dwMsg = gGPR[REG_a1]._u32_0;
|
|
//u32 dwBlockFlag = gGPR[REG_a2]._u32_0;
|
|
|
|
gGPR[REG_a0]._u32_0 = VAR_ADDRESS(osPiAccessQueue);
|
|
gGPR[REG_a1]._u32_0 = 0; // Msg value is unimportant
|
|
gGPR[REG_a2]._u32_0 = OS_MESG_NOBLOCK;
|
|
|
|
return Patch_osSendMesg();
|
|
|
|
//return PATCH_RET_JR_RA;
|
|
|
|
#else
|
|
return PATCH_RET_NOT_PROCESSED;
|
|
#endif
|
|
}
|
|
|
|
//*****************************************************************************
|
|
//
|
|
//*****************************************************************************
|
|
u32 Patch___osPiGetAccess()
|
|
{
|
|
TEST_DISABLE_PI_FUNCS
|
|
u32 created = Read32Bits(VAR_ADDRESS(osPiAccessQueueCreated));
|
|
|
|
if (created == 0)
|
|
{
|
|
Patch___osPiCreateAccessQueue(); // Ignore return
|
|
}
|
|
|
|
gGPR[REG_a0]._u32_0 = VAR_ADDRESS(osPiAccessQueue);
|
|
gGPR[REG_a1]._u32_0 = gGPR[REG_sp]._u32_0 - 4; // Place on stack and ignore
|
|
gGPR[REG_a2]._u32_0 = OS_MESG_BLOCK;
|
|
|
|
return Patch_osRecvMesg();
|
|
}
|
|
|
|
//*****************************************************************************
|
|
//
|
|
//*****************************************************************************
|
|
u32 Patch___osPiRelAccess()
|
|
{
|
|
TEST_DISABLE_PI_FUNCS
|
|
gGPR[REG_a0]._u32_0 = VAR_ADDRESS(osPiAccessQueue);
|
|
gGPR[REG_a1]._u32_0 = 0; // Place on stack and ignore
|
|
gGPR[REG_a2]._u32_0 = OS_MESG_NOBLOCK;
|
|
|
|
return Patch_osSendMesg();
|
|
}
|
|
|
|
//*****************************************************************************
|
|
//
|
|
//*****************************************************************************
|
|
inline bool IsPiDeviceBusy()
|
|
{
|
|
u32 status = Memory_PI_GetRegister( PI_STATUS_REG );
|
|
|
|
if (status & (PI_STATUS_DMA_BUSY | PI_STATUS_IO_BUSY))
|
|
return true;
|
|
else
|
|
return false;
|
|
}
|
|
|
|
//*****************************************************************************
|
|
//
|
|
//*****************************************************************************
|
|
u32 Patch_osPiRawStartDma()
|
|
{
|
|
TEST_DISABLE_PI_FUNCS
|
|
u32 RWflag = gGPR[REG_a0]._u32_0;
|
|
u32 PiAddr = gGPR[REG_a1]._u32_0;
|
|
u32 VAddr = gGPR[REG_a2]._u32_0;
|
|
u32 len = gGPR[REG_a3]._u32_0;
|
|
#ifdef DAEDALUS_ENABLE_ASSERTS
|
|
DAEDALUS_ASSERT( !IsPiDeviceBusy(), "Pi Device is BUSY, Need to handle!");
|
|
#endif
|
|
/*
|
|
if (IsPiDeviceBusy())
|
|
{
|
|
gGPR[REG_v0]._u32_0 = ~0;
|
|
return PATCH_RET_JR_RA;
|
|
}
|
|
*/
|
|
|
|
u32 PAddr = ConvertToPhysical(VAddr);
|
|
|
|
Memory_PI_SetRegister(PI_CART_ADDR_REG, (PiAddr & 0x0fffffff) | 0x10000000);
|
|
Memory_PI_SetRegister(PI_DRAM_ADDR_REG, PAddr);
|
|
|
|
len--;
|
|
|
|
if(RWflag == OS_READ)
|
|
{
|
|
Memory_PI_SetRegister(PI_WR_LEN_REG, len);
|
|
DMA_PI_CopyToRDRAM();
|
|
}
|
|
else
|
|
{
|
|
Memory_PI_SetRegister(PI_RD_LEN_REG, len);
|
|
DMA_PI_CopyFromRDRAM();
|
|
}
|
|
|
|
gGPR[REG_v0]._s64 = 0;
|
|
|
|
return PATCH_RET_JR_RA;
|
|
}
|