diff options
Diffstat (limited to 'src/libultra_code_O2/__osPfsGetStatus.c')
| -rw-r--r-- | src/libultra_code_O2/__osPfsGetStatus.c | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/src/libultra_code_O2/__osPfsGetStatus.c b/src/libultra_code_O2/__osPfsGetStatus.c new file mode 100644 index 000000000..aa2b8a6ff --- /dev/null +++ b/src/libultra_code_O2/__osPfsGetStatus.c @@ -0,0 +1,77 @@ +#include "ultra64.h" +#include "global.h" + +OSPifRam pifMempakBuf; + +s32 __osPfsGetStatus(OSMesgQueue* queue, s32 channel) { + s32 ret = 0; + OSMesg msg; + OSContStatus data; + + __osPfsInodeCacheBank = 250; + + __osPfsRequestOneChannel(channel, CONT_CMD_REQUEST_STATUS); + ret = __osSiRawStartDma(OS_WRITE, &pifMempakBuf); + osRecvMesg(queue, &msg, OS_MESG_BLOCK); + + ret = __osSiRawStartDma(OS_READ, &pifMempakBuf); + osRecvMesg(queue, &msg, OS_MESG_BLOCK); + + __osPfsGetOneChannelData(channel, &data); + if (((data.status & CONT_CARD_ON) != 0) && ((data.status & CONT_CARD_PULL) != 0)) { + return PFS_ERR_NEW_PACK; + } else if (data.errno || ((data.status & CONT_CARD_ON) == 0)) { + return PFS_ERR_NOPACK; + } else if ((data.status & CONT_ADDR_CRC_ER) != 0) { + return PFS_ERR_CONTRFAIL; + } + return ret; +} + +void __osPfsRequestOneChannel(s32 channel, u8 poll) { + u8* bufptr; + __OSContRequestHeaderAligned req; + s32 idx; + + __osContLastPoll = CONT_CMD_END; + + pifMempakBuf.status = CONT_CMD_READ_BUTTON; + + bufptr = &pifMempakBuf; + + req.txsize = 1; + req.rxsize = 3; + req.poll = poll; + req.typeh = 0xFF; + req.typel = 0xFF; + req.status = 0xFF; + + for (idx = 0; idx < channel; idx++) { + *bufptr++ = 0; + } + + *((__OSContRequestHeaderAligned*)bufptr) = req; + bufptr += sizeof(req); + *((u8*)bufptr) = CONT_CMD_END; +} + +void __osPfsGetOneChannelData(s32 channel, OSContStatus* contData) { + u8* bufptr; + __OSContRequestHeaderAligned req; + s32 idx; + + bufptr = &pifMempakBuf; + + for (idx = 0; idx < channel; idx++) { + bufptr++; + } + + req = *((__OSContRequestHeaderAligned*)bufptr); + contData->errno = (req.rxsize & 0xC0) >> 4; + if (contData->errno) { + return; + } + + contData->type = (req.typel << 8) | req.typeh; + contData->status = req.status; +} |
