mirror of
https://github.com/pret/pokefirered.git
synced 2026-05-14 08:11:03 -05:00
385 lines
8.9 KiB
C
385 lines
8.9 KiB
C
#ifndef GUARD_LIBRFU_H
|
|
#define GUARD_LIBRFU_H
|
|
|
|
#include "main.h"
|
|
|
|
/* TODOs:
|
|
* - decide file boundaries
|
|
* - documentation
|
|
* - check if any field needs to be volatile
|
|
* - check if field names make sense
|
|
* - 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);
|
|
void (*unk_20)(void);
|
|
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];
|
|
s32 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;
|
|
u16 unk6;
|
|
u16 unk8; // unused
|
|
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);
|
|
void rfu_REQ_noise(void);
|
|
|
|
// 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_CallbackUnk(void (*func)(void));
|
|
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
|