#ifndef GUARD_LIBRFU_H #define GUARD_LIBRFU_H #include "main.h" /* TODOs: * - documentation * - check if any field needs to be volatile * - decompile librfu_intr.s once arm support is back again */ enum { RFU_RESET = 0x10, RFU_LINK_STATUS, RFU_VERSION_STATUS, RFU_SYSTEM_STATUS, RFU_SLOT_STATUS, RFU_CONFIG_STATUS, RFU_GAME_CONFIG, RFU_SYSTEM_CONFIG, RFU_UNK18, RFU_SC_START, RFU_SC_POLLING, RFU_SC_END, RFU_SP_START, RFU_SP_POLLING, RFU_SP_END, RFU_CP_START, RFU_CP_POLLING, RFU_CP_END, RFU_UNK22, RFU_UNK23, RFU_DATA_TX, RFU_DATA_TX_AND_CHANGE, RFU_DATA_RX, RFU_MS_CHANGE, RFU_DATA_READY_AND_CHANGE, RFU_DISCONNECTED_AND_CHANGE, RFU_UNK2A, RFU_UNK2B, RFU_UNK2C, RFU_UNK2D, RFU_UNK2E, RFU_UNK2F, RFU_DISCONNECT, RFU_TEST_MODE, RFU_CPR_START, RFU_CPR_POLLING, RFU_CPR_END, RFU_UNK35, RFU_UNK36, RFU_RESUME_RETRANSMIT_AND_CHANGE, RFU_UNK38, RFU_UNK39, RFU_UNK3A, RFU_UNK3B, RFU_UNK3C, RFU_STOP_MODE, //3D }; struct RfuPacket8 { u8 data[0x74]; }; struct RfuPacket32 { u32 command; u32 data[0x1C]; }; union RfuPacket { struct RfuPacket32 rfuPacket32; struct RfuPacket8 rfuPacket8; }; struct UnkLinkRfuStruct_02022B14Substruct { u16 unk_00_0:4; u16 unk_00_4:1; u16 unk_00_5:1; u16 unk_00_6:1; u16 isChampion:1; u16 hasNationalDex:1; u16 gameClear:1; u16 unk_01_2:4; u16 unk_01_6:2; u8 playerTrainerId[2]; }; struct __attribute__((packed, aligned(2))) UnkLinkRfuStruct_02022B14 { struct UnkLinkRfuStruct_02022B14Substruct unk_00; u8 unk_04[4]; u16 species:10; u16 type:6; u8 unk_0a_0:7; u8 unk_0a_7:1; u8 playerGender:1; u8 level:7; u8 unk_0c; }; struct RfuStruct { vs32 state; u8 reqLength; u8 reqNext; u8 reqActiveCommand; u8 ackLength; u8 ackNext; u8 ackActiveCommand; u8 timerSelect; u8 unk_b; u32 timerState; // this field is s32 in emerald vu8 timerActive; u8 unk_11; vu16 error; vu8 msMode; u8 recoveryCount; u8 unk_16; u8 unk_17; void (*callbackM)(); void (*callbackS)(u16); u32 callbackId; union RfuPacket *txPacket; union RfuPacket *rxPacket; vu8 unk_2c; }; struct RfuIntrStruct { union RfuPacket rxPacketAlloc; union RfuPacket txPacketAlloc; u8 block1[0x960]; // size of librfu_intr.s binary struct RfuStruct block2; }; struct RfuSlotStatusUNI { struct { struct UNISend { u16 state; u8 dataReadyFlag; u8 bmSlot; u16 payloadSize; const void *src; } send; struct UNIRecv { u16 state; u16 errorCode; u16 dataSize; u8 newDataFlag; u8 dataBlockFlag; } recv; } sub; void *recvBuffer; u32 recvBufferSize; }; struct NIComm { u16 state; u16 failCounter; const u8 *nowP[4]; u32 remainSize; u16 errorCode; u8 bmSlot; u8 recvAckFlag[4]; u8 ack; u8 phase; u8 n[4]; const void *src; u8 bmSlotOrg; u8 dataType; u16 payloadSize; u32 dataSize; }; struct RfuSlotStatusNI { struct { struct NIComm send; struct NIComm recv; } sub; void *recvBuffer; u32 recvBufferSize; }; struct RfuFixed { void (*reqCallback)(u16, u16); void (*fastCopyPtr)(const u8 **, u8 **, s32); u16 fastCopyBuffer[24]; u32 fastCopyBuffer2[12]; u32 LLFBuffer[29]; struct RfuIntrStruct *STWIBuffer; }; struct RfuStatic { u8 flags; u8 NIEndRecvFlag; u8 recvRenewalFlag; u8 commExistFlag; u8 recvErrorFlag; u8 recoveryBmSlot; u8 nowWatchInterval; u8 nullFrameCount; u8 emberCount; u8 SCStartFlag; u8 linkEmergencyFlag[4]; u8 lsFixedCount[4]; u16 cidBak[4]; u16 unk_1a; u16 reqResult; u16 tryPid; u16 watchdogTimer; u32 totalPacketSize; }; struct RfuTgtData { u16 id; u8 slot; u8 multibootFlag; u16 serialNum; u8 gname[15]; u8 uname[9]; }; struct RfuLinkStatus { u8 connMode; u8 connCount; u8 connSlotFlag; u8 linkLossSlotFlag; u8 sendSlotNIFlag; u8 recvSlotNIFlag; u8 sendSlotUNIFlag; u8 getNameFlag; u8 findParentCount; u8 watchInterval; u8 strength[4]; vu8 LLFReadyFlag; u8 remainLLFrameSizeParent; u8 remainLLFrameSizeChild[4]; struct RfuTgtData partner[4]; struct RfuTgtData my; }; struct Unk_3007470 { u8 unk0; u8 unk1; u16 unk2; u16 unk4; u8 fill6[4]; u16 unkA; }; struct Unk_3001190 { struct RfuLinkStatus linkStatus; struct RfuStatic static_; struct RfuFixed fixed; struct RfuSlotStatusNI NI[4]; struct RfuSlotStatusUNI UNI[4]; struct RfuIntrStruct intr; }; extern struct RfuStruct *gRfuState; extern struct RfuLinkStatus *gRfuLinkStatus; extern struct RfuStatic *gRfuStatic; extern struct RfuFixed *gRfuFixed; extern struct RfuSlotStatusNI *gRfuSlotStatusNI[4]; extern struct RfuSlotStatusUNI *gRfuSlotStatusUNI[4]; extern struct Unk_3007470 gUnknown_3007470; // librfu_rfu void rfu_REQ_stopMode(void); u16 rfu_waitREQComplete(void); s32 rfu_REQBN_softReset_and_checkID(void); void rfu_REQ_sendData(u8); void rfu_setMSCCallback(void (*func)(u16)); void rfu_setREQCallback(void (*func)(u16, u16)); bool8 rfu_getMasterSlave(void); s32 rfu_REQBN_watchLink(u16 a0, u8 *a1, u8 *a2, u8 *a3); u16 rfu_syncVBlank(void); void rfu_REQ_reset(void); void rfu_REQ_configSystem(u16, u8, u8); void rfu_REQ_configGameData(u8 r6, u16 r2, const u8 *r4, const u8 *r7); void rfu_REQ_startSearchChild(void); void rfu_REQ_pollSearchChild(void); void rfu_REQ_endSearchChild(void); void rfu_REQ_startSearchParent(void); void rfu_REQ_pollSearchParent(void); void rfu_REQ_endSearchParent(void); void rfu_REQ_startConnectParent(u16); void rfu_REQ_pollConnectParent(void); void rfu_REQ_endConnectParent(void); void rfu_REQ_CHILD_startConnectRecovery(u8); void rfu_REQ_CHILD_pollConnectRecovery(void); void rfu_REQ_CHILD_endConnectRecovery(void); void rfu_REQ_changeMasterSlave(void); void rfu_REQ_RFUStatus(void); u32 rfu_getRFUStatus(u8 *status); struct RfuIntrStruct *rfu_getSTWIRecvBuffer(void); s32 rfu_NI_CHILD_setSendGameName(u8 a0, u8 a1); s32 rfu_clearSlot(u8 a0, u8 a1); void rfu_clearAllSlot(void); u16 rfu_CHILD_getConnectRecoveryStatus(u8 *status); u16 rfu_getConnectParentStatus(u8 *status, u8 *a1); bool16 rfu_UNI_PARENT_getDRAC_ACK(u8 *a0); void rfu_REQ_disconnect(u8 who); s32 rfu_changeSendTarget(u8 a0, u8 who, u8 a2); s32 rfu_NI_stopReceivingData(u8 who); u16 rfu_initializeAPI(struct Unk_3001190 *unk0, u16 unk1, IntrFunc *interrupt, bool8 copyInterruptToRam); void rfu_setTimerInterrupt(u8 which, IntrFunc *intr); s32 rfu_setRecvBuffer(u8 a0, u8 a1, void *a2, size_t a3); s32 rfu_UNI_setSendData(u8 flag, const void *ptr, u8 size); void rfu_REQ_recvData(void); void rfu_UNI_readySendData(u8 a0); void rfu_UNI_clearRecvNewDataFlag(u8 a0); void rfu_REQ_PARENT_resumeRetransmitAndChange(void); s32 rfu_NI_setSendData(u8, u8, const void *, u32); // librfu_intr void IntrSIO32(void); // librfu_stwi void STWI_init_all(struct RfuIntrStruct *interruptStruct, IntrFunc *interrupt, bool8 copyInterruptToRam); void STWI_set_MS_mode(u8 mode); void STWI_init_Callback_M(void); void STWI_init_Callback_S(void); void STWI_set_Callback_M(void *callbackM); void STWI_set_Callback_S(void (*callbackS)(u16)); void STWI_init_timer(IntrFunc *interrupt, s32 timerSelect); void AgbRFU_SoftReset(void); void STWI_set_Callback_ID(u32 id); u16 STWI_read_status(u8 index); u16 STWI_poll_CommandEnd(void); void STWI_send_DataRxREQ(void); void STWI_send_MS_ChangeREQ(void); void STWI_send_StopModeREQ(void); void STWI_send_SystemStatusREQ(void); void STWI_send_GameConfigREQ(const u8 *unk1, const u8 *data); void STWI_send_ResetREQ(void); void STWI_send_LinkStatusREQ(void); void STWI_send_VersionStatusREQ(void); void STWI_send_SlotStatusREQ(void); void STWI_send_ConfigStatusREQ(void); void STWI_send_ResumeRetransmitAndChangeREQ(void); void STWI_send_SystemConfigREQ(u16 unk1, u8 unk2, u8 unk3); void STWI_send_SC_StartREQ(void); void STWI_send_SC_PollingREQ(void); void STWI_send_SC_EndREQ(void); void STWI_send_SP_StartREQ(void); void STWI_send_SP_PollingREQ(void); void STWI_send_SP_EndREQ(void); void STWI_send_CP_StartREQ(u16 unk1); void STWI_send_CP_PollingREQ(void); void STWI_send_CP_EndREQ(void); void STWI_send_DataTxREQ(const void *in, u8 size); void STWI_send_DataTxAndChangeREQ(const void *in, u8 size); void STWI_send_DataReadyAndChangeREQ(u8 unk); void STWI_send_DisconnectedAndChangeREQ(u8 unk0, u8 unk1); void STWI_send_DisconnectREQ(u8 unk); void STWI_send_TestModeREQ(u8 unk0, u8 unk1); void STWI_send_CPR_StartREQ(u16 unk0, u16 unk1, u8 unk2); void STWI_send_CPR_PollingREQ(void); void STWI_send_CPR_EndREQ(void); #endif // GUARD_LIBRFU_H