Merge decomp/main into dusk

Merges 44 upstream commits from zeldaret/tp decomp/main.

Conflict resolutions:
- .github/workflows/build.yml: keep deleted (not needed for PC port)
- README.md: keep PC port README
- J3DAnimation.h: keep OFFSET_PTR macro + add upstream forward decl
- J3DModelLoader.h: keep BE(u32) mBlockNum + add field_0x1c
- d_com_inf_game.h: keep PC port inlines + add upstream declarations
- global.h: keep MULTI_CHAR macro + add FABSF macro
- JUTConsole.cpp: keep uintptr_t cast for 64-bit
- JUTDbPrint.cpp: keep PC enter_() helper + add cstring include
- JUTResFont.cpp: take upstream loop/struct improvements with BE types
- JUTCacheFont.cpp: take upstream decomp fix
- float.h: use upstream !PLATFORM_GCN guard
- d_a_npc_bouS/theB.cpp: keep MULTI_CHAR() for PC portability
- d_a_npc_henna.cpp: keep uintptr_t + use upstream var name
- d_demo.cpp: keep near_/far_ field renames for PC
- d_resorce.cpp: keep uintptr_t + fix var name to res
- d_s_room.cpp, m_Do_graphic.cpp: keep dusk includes + add cstring
- m_Do_main.cpp: keep JHIComPortManager + use JAS_GLOBAL_INSTANCE_INIT
- angle_utils.h: remove redundant types.h include
This commit is contained in:
Luke Street
2026-02-28 13:28:42 -07:00
3803 changed files with 240344 additions and 16831 deletions
+47 -49
View File
@@ -1,5 +1,5 @@
#ifndef _REVOLUTION_ARC_H_
#define _REVOLUTION_ARC_H_
#ifndef ARC_H
#define ARC_H
#include <revolution/types.h>
@@ -7,61 +7,59 @@
extern "C" {
#endif
#define ARC_ENTRY_NUM_INVALID (-1)
typedef struct {
unsigned int magic;
int fstStart;
int fstSize;
int fileStart;
int pad[4];
} ARCHeader;
typedef struct {
unsigned int magic;
int fstStart;
int fstSize;
int fileStart;
int pad[4];
} ARCHeader;
typedef struct {
void* archiveStartAddr; // 0x0
void* FSTStart; // 0x4
void* fileStart; // 0x8
u32 entryNum; // 0xC
char* FSTStringStart; // 0x10
u32 FSTLength; // 0x14
u32 currDir; // 0x18
} ARCHandle;
typedef struct {
void* archiveStartAddr; // 0x0
void* FSTStart; // 0x4
void* fileStart; // 0x8
u32 entryNum; // 0xC
char* FSTStringStart; // 0x10
u32 FSTLength; // 0x14
u32 currDir; // 0x18
} ARCHandle;
typedef struct {
ARCHandle* handle;
u32 startOffset;
u32 length;
} ARCFileInfo;
typedef struct {
ARCHandle* handle;
u32 startOffset;
u32 length;
} ARCFileInfo;
typedef struct {
ARCHandle* handle;
u32 entryNum;
u32 location;
u32 next;
} ARCDir;
typedef struct {
ARCHandle* handle;
u32 entryNum;
u32 location;
u32 next;
} ARCDir;
typedef struct {
ARCHandle* handle;
u32 entryNum;
BOOL isDir;
char* name;
} ARCDirEntry;
typedef struct {
ARCHandle* handle;
u32 entryNum;
BOOL isDir;
char* name;
} ARCDirEntry;
BOOL ARCInitHandle(void *, ARCHandle *);
BOOL ARCFastOpen(ARCHandle *, s32, ARCFileInfo *);
s32 ARCConvertPathToEntrynum(ARCHandle *, const char *);
void* ARCGetStartAddrInMem(ARCFileInfo *);
u32 ARCGetLength(ARCFileInfo *);
BOOL ARCClose(ARCFileInfo *);
BOOL ARCChangeDir(ARCHandle *, const char *);
BOOL ARCGetCurrentDir(ARCHandle *, char *, u32);
BOOL ARCInitHandle(void*, ARCHandle*);
BOOL ARCFastOpen(ARCHandle*, s32, ARCFileInfo*);
s32 ARCConvertPathToEntrynum(ARCHandle*, const char*);
void* ARCGetStartAddrInMem(ARCFileInfo*);
u32 ARCGetLength(ARCFileInfo*);
BOOL ARCClose(ARCFileInfo*);
BOOL ARCChangeDir(ARCHandle*, const char*);
BOOL ARCGetCurrentDir(ARCHandle*, char*, u32);
BOOL ARCOpenDir(ARCHandle*, const char*, ARCDir*);
BOOL ARCReadDir(ARCDir*, ARCDirEntry*);
BOOL ARCCloseDir(ARCDir*);
BOOL ARCOpenDir(ARCHandle *, const char *, ARCDir *);
BOOL ARCReadDir(ARCDir *, ARCDirEntry *);
BOOL ARCCloseDir(ARCDir *);
#ifdef __cplusplus
}
#endif
#endif // _REVOLUTION_ARC_H_
#endif // ARC_H
+10
View File
@@ -362,6 +362,16 @@ void AXSetVoiceLpf(AXVPB* p, AXPBLPF* lpf);
void AXSetVoiceLpfCoefs(AXVPB* p, u16 a0, u16 b0);
void AXGetLpfCoefs(u16 freq, u16* a0, u16* b0);
void AXGetAuxACallback(AXAuxCallback* cbOut, void** contextOut);
u16 AXGetAuxAReturnVolume(void);
u16 AXGetAuxBReturnVolume(void);
u16 AXGetAuxCReturnVolume(void);
void AXSetAuxAReturnVolume(u16 volume);
void AXSetAuxBReturnVolume(u16 volume);
void AXSetAuxCReturnVolume(u16 volume);
void AXSetMasterVolume(u16 volume);
u16 AXGetMasterVolume(void);
// DSPCode
extern u16 axDspSlaveLength;
extern u16 axDspSlave[AX_DSP_SLAVE_LENGTH];
+78 -183
View File
@@ -1,214 +1,109 @@
#ifndef _REVOLUTION_AXFX_H_
#define _REVOLUTION_AXFX_H_
#ifndef AXFX_H
#define AXFX_H
#include <revolution/types.h>
#include <revolution/ax.h>
#include <revolution.h>
#include <cstdio>
#ifdef __cplusplus
extern "C" {
#endif
typedef struct AXFX_REVSTD_DELAYLINE {
/* 0x00 */ s32 inPoint;
/* 0x04 */ s32 outPoint;
/* 0x08 */ s32 length;
/* 0x0C */ f32* inputs;
/* 0x10 */ f32 lastOutput;
} AXFX_REVSTD_DELAYLINE;
typedef struct AXFX_BUS {
s32* left;
s32* right;
s32* surround;
typedef struct AXFX_REVSTD_WORK {
/* 0x000 */ AXFX_REVSTD_DELAYLINE AP[6];
/* 0x078 */ AXFX_REVSTD_DELAYLINE C[6];
/* 0x0F0 */ f32 allPassCoeff;
/* 0x0F4 */ f32 combCoef[6];
/* 0x10C */ f32 lpLastout[3];
/* 0x118 */ f32 level;
/* 0x11C */ f32 damping;
/* 0x120 */ s32 preDelayTime;
/* 0x124 */ f32* preDelayLine[3];
/* 0x130 */ f32* preDelayPtr[3];
} AXFX_REVSTD_WORK;
typedef struct AXFX_REVERBSTD {
/* 0x000 */ AXFX_REVSTD_WORK rv;
/* 0x13C */ u8 tempDisableFX;
/* 0x140 */ f32 coloration;
/* 0x144 */ f32 mix;
/* 0x148 */ f32 time;
/* 0x14C */ f32 damping;
/* 0x150 */ f32 preDelay;
} AXFX_REVERBSTD;
} AXFX_BUS;
typedef struct AXFX_BUFFERUPDATE {
/* 0x00 */ s32* left;
/* 0x04 */ s32* right;
/* 0x08 */ s32* surround;
s32* left;
s32* right;
s32* surround;
} AXFX_BUFFERUPDATE;
typedef struct AXFX_BUFFERUPDATE_DPL2 {
/* 0x00 */ s32* L;
/* 0x04 */ s32* R;
/* 0x08 */ s32* Ls;
/* 0x0C */ s32* Rs;
} AXFX_BUFFERUPDATE_DPL2;
typedef struct AXFX_REVERBHI_EXP {
f32* earlyLine[3]; // at 0x0
u32 earlyPos[3]; // at 0xC
u32 earlyLength; // at 0x18
u32 earlyMaxLength; // at 0x1C
f32 earlyCoef[3]; // at 0x20
// REVHI Structs
f32* preDelayLine[3]; // at 0x2C
u32 preDelayPos; // at 0x38
u32 preDelayLength; // at 0x3C
u32 preDelayMaxLength; // at 0x40
typedef struct AXFX_REVHI_DELAYLINE {
/* 0x00 */ s32 inPoint;
/* 0x04 */ s32 outPoint;
/* 0x08 */ s32 length;
/* 0x0C */ f32* inputs;
/* 0x10 */ f32 lastOutput;
} AXFX_REVHI_DELAYLINE;
f32* combLine[3][3]; // at 0x44
u32 combPos[3]; // at 0x68
u32 combLength[3]; // at 0x74
u32 combMaxLength[3]; // at 0x80
f32 combCoef[3]; // at 0x8C
typedef struct AXFX_REVHI_WORK {
/* 0x000 */ AXFX_REVHI_DELAYLINE AP[9];
/* 0x0B4 */ AXFX_REVHI_DELAYLINE C[9];
/* 0x168 */ f32 allPassCoeff;
/* 0x16C */ f32 combCoef[9];
/* 0x190 */ f32 lpLastout[3];
/* 0x19C */ f32 level;
/* 0x1A0 */ f32 damping;
/* 0x1A4 */ s32 preDelayTime;
/* 0x1A8 */ f32 crosstalk;
/* 0x1AC */ f32* preDelayLine[3];
/* 0x1B8 */ f32* preDelayPtr[3];
} AXFX_REVHI_WORK;
f32* allpassLine[3][2]; // at 0x98
u32 allpassPos[2]; // at 0xB0
u32 allpassLength[2]; // at 0xB8
u32 allpassMaxLength[2]; // at 0xC0
typedef struct AXFX_REVHI_WORK_DPL2 {
/* 0x000 */ AXFX_REVHI_DELAYLINE AP[12];
/* 0x0F0 */ AXFX_REVHI_DELAYLINE C[12];
/* 0x1E0 */ f32 allPassCoeff;
/* 0x1E4 */ f32 combCoef[12];
/* 0x214 */ f32 lpLastout[4];
/* 0x224 */ f32 level;
/* 0x228 */ f32 damping;
/* 0x22C */ s32 preDelayTime;
/* 0x230 */ f32 crosstalk;
/* 0x234 */ f32* preDelayLine[4];
/* 0x244 */ f32* preDelayPtr[4];
} AXFX_REVHI_WORK_DPL2;
f32* lastAllpassLine[3]; // at 0xC8
u32 lastAllpassPos[3]; // at 0xD4
u32 lastAllpassLength[3]; // at 0xE0
u32 lastAllpassMaxLength[3]; // at 0xEC
f32 allpassCoef; // at 0xF8
f32 lastLpfOut[3]; // at 0xFC
f32 lpfCoef; // at 0x108
u32 active; // at 0x10C
u32 earlyMode; // at 0x110
f32 preDelayTimeMax; // at 0x114
f32 preDelayTime; // at 0x118
u32 fusedMode; // at 0x11C
f32 fusedTime; // at 0x120
f32 coloration; // at 0x124
f32 damping; // at 0x128
f32 crosstalk; // at 0x12C
f32 earlyGain; // at 0x130
f32 fusedGain; // at 0x134
AXFX_BUS* busIn; // at 0x138
AXFX_BUS* busOut; // at 0x13C
f32 outGain; // at 0x140
f32 sendGain; // at 0x144
} AXFX_REVERBHI_EXP;
typedef struct AXFX_REVERBHI {
/* 0x000 */ AXFX_REVHI_WORK rv;
/* 0x1C4 */ u8 tempDisableFX;
/* 0x1C8 */ f32 coloration;
/* 0x1CC */ f32 mix;
/* 0x1D0 */ f32 time;
/* 0x1D4 */ f32 damping;
/* 0x1D8 */ f32 preDelay;
/* 0x1DC */ f32 crosstalk;
AXFX_REVERBHI_EXP exp; // at 0x0
f32 coloration; // at 0x148
f32 mix; // at 0x14C
f32 time; // at 0x150
f32 damping; // at 0x154
f32 preDelay; // at 0x158
f32 crosstalk; // at 0x15C
} AXFX_REVERBHI;
typedef struct AXFX_REVERBHI_DPL2 {
/* 0x000 */ AXFX_REVHI_WORK_DPL2 rv;
/* 0x254 */ u8 tempDisableFX;
/* 0x258 */ f32 coloration;
/* 0x25C */ f32 mix;
/* 0x260 */ f32 time;
/* 0x264 */ f32 damping;
/* 0x268 */ f32 preDelay;
} AXFX_REVERBHI_DPL2;
typedef void* (*AXFXAllocHook)(size_t size);
typedef void (*AXFXFreeHook)(void* block);
typedef struct AXFX_DELAY {
/* 0x00 */ u32 currentSize[3];
/* 0x0C */ u32 currentPos[3];
/* 0x18 */ u32 currentFeedback[3];
/* 0x24 */ u32 currentOutput[3];
/* 0x30 */ s32* left;
/* 0x34 */ s32* right;
/* 0x38 */ s32* sur;
/* 0x3C */ u32 delay[3];
/* 0x48 */ u32 feedback[3];
/* 0x54 */ u32 output[3];
} AXFX_DELAY;
extern AXFXAllocHook __AXFXAlloc;
extern AXFXFreeHook __AXFXFree;
typedef struct AXFX_CHORUS_SRCINFO {
/* 0x00 */ s32* dest;
/* 0x04 */ s32* smpBase;
/* 0x08 */ s32* old;
/* 0x0C */ u32 posLo;
/* 0x10 */ u32 posHi;
/* 0x14 */ u32 pitchLo;
/* 0x18 */ u32 pitchHi;
/* 0x1C */ u32 trigger;
/* 0x20 */ u32 target;
} AXFX_CHORUS_SRCINFO;
void AXFXSetHooks(AXFXAllocHook alloc, AXFXFreeHook free);
void AXFXGetHooks(AXFXAllocHook* alloc, AXFXFreeHook* free);
typedef struct AXFX_CHORUS_WORK {
/* 0x00 */ s32* lastLeft[3];
/* 0x0C */ s32* lastRight[3];
/* 0x18 */ s32* lastSur[3];
/* 0x24 */ u8 currentLast;
/* 0x28 */ s32 oldLeft[4];
/* 0x38 */ s32 oldRight[4];
/* 0x48 */ s32 oldSur[4];
/* 0x58 */ u32 currentPosLo;
/* 0x5C */ u32 currentPosHi;
/* 0x60 */ s32 pitchOffset;
/* 0x64 */ u32 pitchOffsetPeriodCount;
/* 0x68 */ u32 pitchOffsetPeriod;
/* 0x6C */ AXFX_CHORUS_SRCINFO src;
} AXFX_CHORUS_WORK;
BOOL AXFXReverbHiInit(AXFX_REVERBHI* fx);
BOOL AXFXReverbHiShutdown(AXFX_REVERBHI* fx);
void AXFXReverbHiCallback(void* update, void* fx);
typedef struct AXFX_CHORUS {
/* 0x00 */ AXFX_CHORUS_WORK work;
/* 0x90 */ u32 baseDelay;
/* 0x94 */ u32 variation;
/* 0x98 */ u32 period;
} AXFX_CHORUS;
BOOL AXFXReverbHiExpInit(AXFX_REVERBHI_EXP* fx);
void AXFXReverbHiExpShutdown(AXFX_REVERBHI_EXP* fx);
void AXFXReverbHiExpCallback(AXFX_BUFFERUPDATE* update, AXFX_REVERBHI_EXP* fx);
typedef void* (*AXFXAllocFunc)(u32);
typedef void (*AXFXFreeFunc)(void*);
// chorus
int AXFXChorusInit(AXFX_CHORUS* c);
int AXFXChorusShutdown(AXFX_CHORUS* c);
int AXFXChorusSettings(AXFX_CHORUS* c);
void AXFXChorusCallback(AXFX_BUFFERUPDATE* bufferUpdate, AXFX_CHORUS* chorus);
// delay
void AXFXDelayCallback(AXFX_BUFFERUPDATE* bufferUpdate, AXFX_DELAY* delay);
int AXFXDelaySettings(AXFX_DELAY* delay);
int AXFXDelayInit(AXFX_DELAY* delay);
int AXFXDelayShutdown(AXFX_DELAY* delay);
// reverb_hi
void DoCrossTalk(s32* l, s32* r, f32 cross, f32 invcross);
int AXFXReverbHiInit(AXFX_REVERBHI* rev);
int AXFXReverbHiShutdown(AXFX_REVERBHI* rev);
int AXFXReverbHiSettings(AXFX_REVERBHI* rev);
// reverb_hi_4ch
int AXFXReverbHiInitDpl2(AXFX_REVERBHI_DPL2* reverb);
int AXFXReverbHiShutdownDpl2(AXFX_REVERBHI_DPL2* reverb);
int AXFXReverbHiSettingsDpl2(AXFX_REVERBHI_DPL2* rev);
void AXFXReverbHiCallbackDpl2(AXFX_BUFFERUPDATE_DPL2* bufferUpdate, AXFX_REVERBHI_DPL2* reverb);
// reverb_std
int AXFXReverbStdInit(AXFX_REVERBSTD* rev);
int AXFXReverbStdShutdown(AXFX_REVERBSTD* rev);
int AXFXReverbStdSettings(AXFX_REVERBSTD* rev);
void AXFXReverbStdCallback(AXFX_BUFFERUPDATE* bufferUpdate, AXFX_REVERBSTD* reverb);
void AXFXReverbHiCallback(void *data, void *context);
void AXGetAuxACallback(AXAuxCallback* cbOut, void** contextOut);
void AXFXSetHooks(AXFXAllocFunc alloc, AXFXFreeFunc free);
void AXFXGetHooks(AXFXAllocFunc* allocOut, AXFXFreeFunc* freeOut);
void AXFXSetHooks(AXFXAllocHook alloc, AXFXFreeHook free);
void AXFXGetHooks(AXFXAllocHook* allocOut, AXFXFreeHook* freeOut);
BOOL AXFXReverbHiInit(AXFX_REVERBHI* reverbHi);
BOOL AXFXReverbHiShutdown(AXFX_REVERBHI* reverbHi);
u16 AXGetAuxAReturnVolume(void);
u16 AXGetAuxBReturnVolume(void);
u16 AXGetAuxCReturnVolume(void);
void AXSetAuxAReturnVolume(u16 volume);
void AXSetAuxBReturnVolume(u16 volume);
void AXSetAuxCReturnVolume(u16 volume);
void AXSetMasterVolume(u16 volume);
u16 AXGetMasterVolume(void);
#ifdef __cplusplus
}
#endif
#endif // _REVOLUTION_AXFX_H_
#endif // AXFX_H
+3 -3
View File
@@ -8,7 +8,7 @@ extern "C" {
#endif
typedef void (*DSPCallback)(void* task);
typedef struct STRUCT_DSP_TASK DSPTaskInfo;
struct STRUCT_DSP_TASK;
typedef struct STRUCT_DSP_TASK {
/* 0x00 */ volatile u32 state;
@@ -26,8 +26,8 @@ typedef struct STRUCT_DSP_TASK {
/* 0x2C */ DSPCallback res_cb;
/* 0x30 */ DSPCallback done_cb;
/* 0x34 */ DSPCallback req_cb;
/* 0x38 */ DSPTaskInfo* next;
/* 0x3C */ DSPTaskInfo* prev;
/* 0x38 */ struct STRUCT_DSP_TASK* next;
/* 0x3C */ struct STRUCT_DSP_TASK* prev;
/* 0x40 */ OSTime t_context;
/* 0x48 */ OSTime t_task;
} DSPTaskInfo;
+10
View File
@@ -12,6 +12,7 @@ volatile u32 __DIRegs[] AT_ADDRESS(0xCD006000);
volatile u32 __SIRegs[0x100] AT_ADDRESS(0xCD006400);
volatile u32 __EXIRegs[0x40] AT_ADDRESS(0xCD006800);
volatile u32 __AIRegs[8] AT_ADDRESS(0xCD006C00);
volatile u32 __ACRRegs[89] AT_ADDRESS(0xCD000000);
volatile u32 __IPCRegs[4] AT_ADDRESS(0xCD000000);
#else
#define __VIRegs ((volatile u16 *)0xCC002000)
@@ -22,6 +23,7 @@ volatile u32 __IPCRegs[4] AT_ADDRESS(0xCD000000);
#define __SIRegs ((volatile u32 *)0xCD006400)
#define __EXIRegs ((volatile u32 *)0xCD006800)
#define __AIRegs ((volatile u32 *)0xCD006C00)
#define __ACRRegs ((volatile u32 *)0xCD000000)
#define __IPCRegs ((volatile u32 *)0xCD000000)
#endif
@@ -115,4 +117,12 @@ volatile u32 __IPCRegs[4] AT_ADDRESS(0xCD000000);
#define DSP_DMA_START_FLAG (0x8000) // set to start DSP
inline void ACRWriteReg(u32 offset, u32 val) {
__ACRRegs[offset >> 2] = val;
}
inline u32 ACRReadReg(u32 offset) {
return __ACRRegs[offset >> 2];
}
#endif
+2
View File
@@ -10,7 +10,9 @@ extern "C" {
#endif
void IPCInit(void);
#if SDK_AUG2010
void IPCReInit(void);
#endif
u32 IPCReadReg(u32 regIdx);
void IPCWriteReg(u32 regIdx, u32 data);
void* IPCGetBufferHi(void);
+2
View File
@@ -12,7 +12,9 @@ extern "C" {
typedef IOSError (*IOSIpcCb)(IOSError, void*);
IOSError IPCCltInit(void);
#if SDK_AUG2010
IOSError IPCCltReInit(void);
#endif
IOSError IOS_OpenAsync(const char* pPath, u32 flags, IOSIpcCb cb, void* callback_arg);
IOSError IOS_Open(const char* path, u32 flags);
+123 -4
View File
@@ -3,15 +3,36 @@
#include <revolution/mtx.h>
#include <revolution/wpad.h>
#include "types.h"
#ifdef __cplusplus
extern "C" {
#endif
#define KPAD_BUTTON_MASK 0x0000ffff
#define KPAD_BUTTON_RPT 0x80000000
#define KPAD_BTN_RPT_TIME_MAX 20000
#define KPAD_BTN_NO_RPT_DELAY 40000
#define KPAD_CMOS_RESO_WX 128
#define KPAD_CMOS_RESO_WY 96
#define KPAD_CMOS_RESO_CX (KPAD_CMOS_RESO_WX / 2)
#define KPAD_CMOS_RESO_CY (KPAD_CMOS_RESO_WY / 2)
#define KPAD_DPD_RESO_WX WPAD_DPD_IMG_RESO_WX
#define KPAD_DPD_RESO_WY WPAD_DPD_IMG_RESO_WY
#define KPAD_DPD_RESO_CX (KPAD_DPD_RESO_WX / 2)
#define KPAD_DPD_RESO_CY (KPAD_DPD_RESO_WY / 2)
#define KPAD_USE_OBJECTS 2
typedef struct Vec2 {
f32 x, y;
} Vec2;
typedef enum KPADPlayMode { KPAD_PLAY_MODE_LOOSE = 0, KPAD_PLAY_MODE_TIGHT } KPADPlayMode;
typedef s32 KPADResult;
typedef union KPADEXStatus {
@@ -50,16 +71,114 @@ typedef struct KPADStatus {
/* 0x4C */ f32 dist_vec;
/* 0x50 */ f32 dist_speed;
/* 0x54 */ Vec2 acc_vertical;
#if PLATFORM_SHIELD
/* 0x5C */ u8 dev_type;
/* 0x5D */ s8 wpad_err;
/* 0x5E */ s8 dpd_valid_fg;
/* 0x5F */ u8 data_format;
/* 0x60 */ KPADEXStatus ex_status;
/* 0x84 */ u8 __paddings__[4]; // ??? is this the compiler?
} KPADStatus; // size 0x88
/* 0x84 */ u8 unk_shield_0x86[0xf0 - 0x84];
#else
/* 0x5C */ u32 dev_type;
/* 0x60 */ KPADEXStatus ex_status;
/* 0x84 */ s8 dpd_valid_fg;
/* 0x85 */ s8 wpad_err;
#endif
#if PLATFORM_SHIELD
#endif
} KPADStatus; // size 0x88
void KPADEnableDPD(s32);
void KPADDisableDPD(s32);
typedef struct KPADUnifiedWpadStatus {
union {
WPADStatus core;
WPADFSStatus fs;
WPADCLStatus cl;
} u;
} KPADUnifiedWpadStatus;
typedef struct {
Vec2 center;
s8 error_fg;
s8 state_fg;
s8 _fg_1;
s8 _fg_2;
} KPADObject;
typedef union {
KPADStatus k;
KPADUnifiedWpadStatus w;
} KPADTmpStatus;
typedef void (*KPADControlDpdCallback)(s32 chan, s32 reason);
typedef WPADCallback KPADCallback;
typedef WPADChannel KPADChannel;
typedef struct {
/* 0x000 */ KPADStatus status;
/* 0x088 */ f32 pos_play_radius;
/* 0x08C */ f32 pos_sensitivity;
/* 0x090 */ f32 hori_play_radius;
/* 0x094 */ f32 hori_sensitivity;
/* 0x098 */ f32 dist_play_radius;
/* 0x09C */ f32 dist_sensitivity;
/* 0x0A0 */ f32 acc_play_radius;
/* 0x0A4 */ f32 acc_sensitivity;
/* 0x0A8 */ f32 dist_org;
/* 0x0AC */ Vec2 accXY_nrm_hori;
/* 0x0B4 */ Vec2 sec_nrm_hori;
/* 0x0BC */ Vec2 center_org;
/* 0x0C4 */ f32 dpd2pos_scale;
/* 0x0C8 */ KPADObject kobj_sample[4];
/* 0x0F8 */ KPADObject kobj_regular[2];
/* 0x110 */ s16 valid_objs;
/* 0x112 */ u16 repeat_count;
/* 0x114 */ s16 active_chan;
/* 0x116 */ s16 unk_0x116;
/* 0x118 */ KPADUnifiedWpadStatus uniRingBuf[12];
/* 0x3A0 */ f32 sec_length;
/* 0x3A4 */ Vec2 sec_nrm;
/* 0x3AC */ f32 sec_dist;
/* 0x3B0 */ f32 trust_sec_length;
/* 0x3B4 */ Vec hard_acc;
/* 0x3C0 */ Vec2 obj_horizon;
/* 0x3C8 */ Vec2 acc_horizon;
/* 0x3D0 */ Vec2 ah_circle_pos;
/* 0x3D8 */ u16 ah_circle_ct;
/* 0x3DA */ u8 dpd_valid2_ct;
/* 0x3DC */ u16 btn_repeat_time;
/* 0x3DE */ u16 btn_repeat_next;
/* 0x3E0 */ u16 btn_repeat_delay;
/* 0x3E2 */ u16 btn_repeat_pulse;
/* 0x3E4 */ u16 btn_cl_repeat_time;
/* 0x3E6 */ u16 btn_cl_repeat_next;
/* 0x3E8 */ u16 btn_cl_repeat_delay;
/* 0x3EA */ u16 btn_cl_repeat_pulse;
/* 0x3EC */ BOOL is_dpd_enabled;
/* 0x3F0 */ BOOL unk_0x3f0;
/* 0x3F4 */ BOOL unk_0x3f4;
/* 0x3F8 */ KPADControlDpdCallback dpd_ctrl_callback;
/* 0x3FC */ BOOL unk_0x3fc;
} KPADInsideStatus;
void KPADInit();
void KPADSetFSStickClamp(s8 min, s8 max);
void KPADSetBtnRepeat(s32 chan, f32 delay_sec, f32 pulse_sec);
void KPADSetObjInterval(f32 interval);
void KPADSetPosParam(s32 chan, f32 play_radius, f32 sensitivity);
void KPADSetHoriParam(s32 chan, f32 play_radius, f32 sensitivity);
void KPADSetDistParam(s32 chan, f32 play_radius, f32 sensitivity);
void KPADSetAccParam(s32 chan, f32 play_radius, f32 sensitivity);
void KPADSetSensorHeight(s32 chan, f32 level);
void KPADReset(void);
s32 KPADRead(s32 chan, KPADStatus* sampling_bufs, s32 length);
void KPADEnableDPD(s32 chan);
void KPADDisableDPD(s32 chan);
extern KPADInsideStatus inside_kpads[];
#ifdef __cplusplus
}
+26 -1
View File
@@ -9,7 +9,7 @@ extern "C" {
typedef struct MEMiExpHeapMBlockHead MEMiExpHeapMBlockHead;
struct MEMiExPheapMBlockHead {
struct MEMiExpHeapMBlockHead {
u16 signature;
union {
@@ -27,6 +27,31 @@ struct MEMiExPheapMBlockHead {
MEMiExpHeapMBlockHead* next;
};
typedef struct MEMiExpMBlockList MEMiExpMBlockList;
struct MEMiExpMBlockList {
MEMiExpHeapMBlockHead* head;
MEMiExpHeapMBlockHead* tail;
};
typedef struct MEMiExpHeapHead MEMiExpHeapHead;
struct MEMiExpHeapHead {
MEMiExpMBlockList mbFreeList;
MEMiExpMBlockList mbUsedList;
u16 groupID;
union {
u16 val;
struct {
u16 _reserved : 14;
u16 useMarginOfAlign : 1;
u16 allocMode : 1;
} fields;
} feature;
};
MEMHeapHandle MEMCreateExpHeapEx(void*, u32, u16);
void* MEMDestroyExpHeap(MEMHeapHandle);
void* MEMAllocFromExpHeapEx(MEMHeapHandle, u32, int);
+53
View File
@@ -7,6 +7,7 @@ extern "C" {
#include <revolution/mem/list.h>
#include <revolution/os.h>
#include <cstring>
typedef struct MEMiHeapHead MEMiHeapHead;
@@ -36,6 +37,58 @@ static inline UIntPtr GetUIntPtr(const void* ptr) {
return (UIntPtr)(ptr);
}
static inline u32 GetOffsetFromPtr(const void* start, const void* end) {
return GetUIntPtr(end) - GetUIntPtr(start);
}
static inline void* SubU32ToPtr(void* ptr, u32 val) {
return (void*)(GetUIntPtr(ptr) - val);
}
static inline void* AddU32ToPtr(void* ptr, u32 val) {
return (void*)(GetUIntPtr(ptr) + val);
}
static inline void SetOptForHeap(MEMiHeapHead* pHeapHd, u16 optFlag) {
pHeapHd->attribute.fields.optFlag = (u8)optFlag;
}
static inline u16 GetOptForHeap(const MEMiHeapHead* pHeapHd) {
return (u16)pHeapHd->attribute.fields.optFlag;
}
static inline void FillAllocMemory(MEMiHeapHead* pHeapHd, void* address, u32 size) {
if (GetOptForHeap(pHeapHd) & 1) {
(void)memset(address, 0, size);
}
}
static inline int ComparePtr(const void* a, const void* b) {
const u8* wa = (const u8*)a;
const u8* wb = (const u8*)b;
return wa - wb;
}
static inline void LockHeap(MEMiHeapHead* pHeapHd) {
if (GetOptForHeap(pHeapHd) & 4) {
OSLockMutex(&pHeapHd->mutex);
}
}
static inline void UnlockHeap(MEMiHeapHead* pHeapHd) {
if (GetOptForHeap(pHeapHd) & 4) {
OSUnlockMutex(&pHeapHd->mutex);
}
}
void MEMiInitHeapHead(MEMiHeapHead* pHeapHd, u32 signature, void* heapStart, void* heapEnd, u16 optFlag);
void MEMiFinalizeHeap(MEMiHeapHead* pHeapHd);
void MEMiDumpHeapHead(MEMiHeapHead* pHeapHd);
#ifdef __cplusplus
}
#endif
+2 -1
View File
@@ -21,9 +21,10 @@ typedef struct {
void MEMInitList(MEMList*, u16);
void MEMAppendListObject(MEMList*, void*);
void MEMRemoveListObject(MEMList*, void*);
void* MEMGetNextListObject(MEMList*, void*);
#define MEM_INIT_LIST(list, structName, linkName) MEMInitList(list, offsetof(structName, linkName))
#ifdef __cplusplus
}
#endif
+2
View File
@@ -7,6 +7,8 @@
extern "C" {
#endif
#define MTXRowCol(m, r, c) ((m)[(r)][(c)])
typedef struct Vec {
f32 x, y, z;
} Vec, *VecPtr, Point3d, *Point3dPtr;
+2
View File
@@ -105,10 +105,12 @@ u8 __gUnknown800030E3 AT_ADDRESS(OS_BASE_CACHED | 0x30E3);
#define OSMillisecondsToTicks(msec) ((msec) * (OS_TIMER_CLOCK / 1000))
#define OSNanosecondsToTicks(nsec) (((nsec) * (OS_TIMER_CLOCK / 125000)) / 8000)
#define OSMicrosecondsToTicks(usec) (((usec) * (OS_TIMER_CLOCK / 125000)) / 8)
#define OSTicksDelta(x, y) ((s32)x, (s32)y)
u32 OSGetConsoleType(void);
void OSInit(void);
void OSRegisterVersion(const char* id);
const char* OSGetAppGamename(void);
void* OSGetArenaHi(void);
void* OSGetArenaLo(void);
+68
View File
@@ -3,6 +3,7 @@
#include <revolution/os.h>
#include <revolution/nand.h>
#include <revolution/wpad/bte.h>
#ifdef __cplusplus
extern "C" {
@@ -10,6 +11,13 @@ extern "C" {
typedef u8 SCType;
typedef enum {
SC_STATUS_OK,
SC_STATUS_BUSY,
SC_STATUS_FATAL,
SC_STATUS_PARSE,
} SCStatus;
typedef struct {
u8 mode;
u8 led;
@@ -107,6 +115,57 @@ typedef struct {
u32 flushSize;
} SCControl;
#define SC_MAX_DEV_ENTRY_FOR_STD 10
#define SC_MAX_DEV_ENTRY_FOR_SMP 6
#define SC_MAX_DEV_ENTRY (SC_MAX_DEV_ENTRY_FOR_STD + SC_MAX_DEV_ENTRY_FOR_SMP)
typedef struct {
BD_ADDR bd_addr;
u8 bd_name[64];
u8 link_key[16];
} SCBtCmpDevInfoSingle;
typedef struct {
BD_ADDR bd_addr;
u8 bd_name[64];
} SCBtDeviceInfoSingle;
typedef struct {
u8 num;
SCBtCmpDevInfoSingle info[6];
} SCBtCmpDevInfoArray;
typedef struct SCDevInfo {
char devName[20]; // at 0x0
char at_0x14[1];
char UNK_0x15[0xB];
LINK_KEY linkKey; // at 0x20
char UNK_0x30[0x10];
} SCDevInfo;
typedef struct SCBtDeviceInfo {
BD_ADDR addr; // at 0x0
SCDevInfo info; // at 0x6
} SCBtDeviceInfo;
typedef struct SCBtDeviceInfoArray {
/* 0x000 */ u8 num;
union {
struct {
#if SDK_AUG2010
/* 0x001 */ SCBtDeviceInfo regist[SC_MAX_DEV_ENTRY_FOR_STD];
/* 0x2BD */ SCBtDeviceInfo active[SC_MAX_DEV_ENTRY_FOR_SMP];
#else
/* 0x001 */ SCBtDeviceInfo regist[SC_MAX_DEV_ENTRY];
#endif
};
};
#if SDK_AUG2010
SCBtDeviceInfoSingle info[16];
#endif
} SCBtDeviceInfoArray;
#define SC_LANG_JAPANESE 0u
#define SC_LANG_ENGLISH 1u
#define SC_LANG_GERMAN 2u
@@ -128,6 +187,12 @@ u8 SCGetProgressiveMode(void);
u8 SCGetScreenSaverMode(void);
u8 SCGetSoundMode(void);
u32 SCGetCounterBias(void);
u8 SCGetWpadSensorBarPosition(void);
u8 SCGetWpadMotorMode(void);
u8 SCGetWpadSpeakerVolume(void);
u8 SCGetBtDpdSensibility(void);
BOOL SCSetWpadSpeakerVolume(u8 volume);
BOOL SCSetWpadMotorMode(u8 mode);
// scapi_prdinfo
BOOL SCGetProductAreaString(char* buf, u32 bufSize);
@@ -144,6 +209,9 @@ BOOL SCFindU8Item(u8* data, SCItemID id);
BOOL SCFindS8Item(s8* data, SCItemID id);
BOOL SCFindU32Item(u32* data, SCItemID id);
BOOL SCReplaceU8Item(u8 data, SCItemID id);
void SCFlushAsync(SCFlushCallback callback);
BOOL SCGetBtDeviceInfoArray(SCBtDeviceInfoArray*);
BOOL SCSetBtDeviceInfoArray(const SCBtDeviceInfoArray*);
u32 SCCheckStatus(void);
s32 SCReloadConfFileAsync(u8* bufp, u32 bufSize, SCReloadConfFileCallback callback);
+55
View File
@@ -0,0 +1,55 @@
#ifndef _REVOLUTION_USB_H_
#define _REVOLUTION_USB_H_
#include <revolution.h>
#ifdef __cplusplus
extern "C" {
#endif
#define SWAP32(val) \
((u32)((((u32)(val) & (u32)0x000000ffUL) << 24) | (((u32)(val) & (u32)0x0000ff00UL) << 8) | (((u32)(val) & (u32)0x00ff0000UL) >> 8) | \
(((u32)(val) & (u32)0xff000000UL) >> 24)))
#define SWAP16(val) ((u16)((((u16)(val) & (u16)0x00ffUL) << 8) | (((u16)(val) & (u16)0xff00) >> 8)))
typedef struct {
u8 bLength;
u8 bDescriptorType;
u16 bcdUSB;
u8 bDeviceClass;
u8 bDeviceSubClass;
u8 bDeviceProtocol;
u8 bMaxPacketSize0;
u16 idVendor;
u16 idProduct;
u16 bcdDevice;
u8 iManufacturer;
u8 iProduct;
u8 iSerialNumber;
u8 bNumConfigurations;
} USB_DevDescr;
typedef struct IsoTransfer {
void* buf;
u8 numPackets;
u16* packets;
} IsoTransfer;
typedef void (*USBCallbackFunc)(IOSError err, void* cbArg);
typedef void (*USBIsoCallbackFunc)(IOSError err, IsoTransfer* xfer, void* cbArg);
IOSError IUSB_ReadIntrMsgAsync(IOSFd fd, u32 ep, u32 buflen, char* buf, USBCallbackFunc cb, void* cbArg);
IOSError IUSB_WriteCtrlMsgAsync(IOSFd fd, u8 reqType, u8 request, u16 value, u16 index, u16 buflen, char* buf, USBCallbackFunc cb, void* cbArg);
IOSError IUSB_WriteBlkMsgAsync(IOSFd fd, u32 ep, u32 buflen, char* buf, USBCallbackFunc cb, void* cbArg);
IOSError IUSB_OpenDeviceIds(const char* did, u16 vid, u16 pid, IOSFd* fd);
IOSError IUSB_ReadBlkMsgAsync(IOSFd fd, u32 ep, u32 buflen, char* buf, USBCallbackFunc cb, void* cbArg);
IOSError IUSB_OpenLib(void);
IOSError IUSB_CloseDeviceAsync(IOSFd fd, USBCallbackFunc cb, void* cbArg);
IOSError IUSB_CloseLib(void);
#ifdef __cplusplus
}
#endif
#endif // _REVOLUTION_USB_H_
+3
View File
@@ -35,6 +35,9 @@ void VISetGamma(VIGamma);
void VISetRGBModeImm(void);
BOOL VIEnableDVDStopMotor(BOOL enable);
BOOL VIResetDimmingCount(void);
BOOL VIResetRFIdle(void);
#ifdef __cplusplus
}
#endif
+214 -139
View File
@@ -1,98 +1,58 @@
#ifndef _REVOLUTION_WPAD_H_
#define _REVOLUTION_WPAD_H_
#include <revolution/os.h>
#include <revolution/types.h>
#include <revolution/sc.h>
#include "types.h"
#ifdef __cplusplus
extern "C" {
#endif
#define WPAD_BUTTON_LEFT 0x0001
#define WPAD_BUTTON_RIGHT 0x0002
#define WPAD_BUTTON_DOWN 0x0004
#define WPAD_BUTTON_UP 0x0008
#define WPAD_BUTTON_PLUS 0x0010
#define WPAD_BUTTON_2 0x0100
#define WPAD_BUTTON_1 0x0200
#define WPAD_BUTTON_B 0x0400
#define WPAD_BUTTON_A 0x0800
#define WPAD_BUTTON_MINUS 0x1000
#define WPAD_BUTTON_Z 0x2000
#define WPAD_BUTTON_C 0x4000
#define WPAD_BUTTON_HOME 0x8000
#define WPAD_BUTTON_LEFT (1 << 0)
#define WPAD_BUTTON_RIGHT (1 << 1)
#define WPAD_BUTTON_DOWN (1 << 2)
#define WPAD_BUTTON_UP (1 << 3)
#define WPAD_BUTTON_PLUS (1 << 4)
#define WPAD_BUTTON_2 (1 << 8)
#define WPAD_BUTTON_1 (1 << 9)
#define WPAD_BUTTON_B (1 << 10)
#define WPAD_BUTTON_A (1 << 11)
#define WPAD_BUTTON_MINUS (1 << 12)
#define WPAD_BUTTON_Z (1 << 13)
#define WPAD_BUTTON_C (1 << 14)
#define WPAD_BUTTON_HOME (1 << 15)
#define WPAD_BUTTON_CL_UP (1 << 0)
#define WPAD_BUTTON_CL_LEFT (1 << 1)
#define WPAD_BUTTON_CL_ZR (1 << 2)
#define WPAD_BUTTON_CL_X (1 << 3)
#define WPAD_BUTTON_CL_A (1 << 4)
#define WPAD_BUTTON_CL_Y (1 << 5)
#define WPAD_BUTTON_CL_B (1 << 6)
#define WPAD_BUTTON_CL_ZL (1 << 7)
#define WPAD_BUTTON_CL_FULL_R (1 << 9)
#define WPAD_BUTTON_CL_PLUS (1 << 10)
#define WPAD_BUTTON_CL_HOME (1 << 11)
#define WPAD_BUTTON_CL_MINUS (1 << 12)
#define WPAD_BUTTON_CL_FULL_L (1 << 13)
#define WPAD_BUTTON_CL_DOWN (1 << 14)
#define WPAD_BUTTON_CL_RIGHT (1 << 15)
#define WPAD_CL_BUTTON_UP (1 << 0)
#define WPAD_CL_BUTTON_LEFT (1 << 1)
#define WPAD_CL_TRIGGER_ZR (1 << 2)
#define WPAD_CL_BUTTON_X (1 << 3)
#define WPAD_CL_BUTTON_A (1 << 4)
#define WPAD_CL_BUTTON_Y (1 << 5)
#define WPAD_CL_BUTTON_B (1 << 6)
#define WPAD_CL_TRIGGER_ZL (1 << 7)
#define WPAD_CL_RESERVED (1 << 8)
#define WPAD_CL_TRIGGER_R (1 << 9)
#define WPAD_CL_BUTTON_PLUS (1 << 10)
#define WPAD_CL_BUTTON_HOME (1 << 11)
#define WPAD_CL_BUTTON_MINUS (1 << 12)
#define WPAD_CL_TRIGGER_L (1 << 13)
#define WPAD_CL_BUTTON_DOWN (1 << 14)
#define WPAD_CL_BUTTON_RIGHT (1 << 15)
#define WPAD_MAX_DPD_OBJECTS 4
#define WPAD_CHAN0 0
#define WPAD_CHAN1 1
#define WPAD_CHAN2 2
#define WPAD_CHAN3 3
#define WPAD_CHAN_INVALID -1
#define WPAD_MAX_CONTROLLERS 4
enum WPADResult_et {
WPAD_ERR_OK = 0,
WPAD_ERR_NO_CONTROLLER = -1,
WPAD_ERR_BUSY = -2,
WPAD_ERR_TRANSFER = -3,
WPAD_ERR_INVALID = -4,
WPAD_ERR_5 = -5,
WPAD_ERR_6 = -6,
WPAD_ERR_CORRUPTED = -7,
};
#define WPAD_ESUCCESS WPAD_ERR_OK
#define WPAD_ENODEV WPAD_ERR_NO_CONTROLLER
#define WPAD_EBUSY WPAD_ERR_BUSY
#define WPAD_ETRANSFER WPAD_ERR_TRANSFER // I don't know what the POSIX equivalent is
#define WPAD_EINVAL WPAD_ERR_INVALID
#define WPAD_E5 WPAD_ERR_5
#define WPAD_E6 WPAD_ERR_6
#define WPAD_EBADE WPAD_ERR_CORRUPTED
// apparently enum vs constant is a thing. cool
#define WPAD_CESUCCESS (WPAD_ESUCCESS + 0)
#define WPAD_CENODEV (WPAD_ENODEV + 0)
#define WPAD_CEBUSY (WPAD_EBUSY + 0)
#define WPAD_CETRANSFER (WPAD_ETRANSFER + 0)
#define WPAD_CEINVAL (WPAD_EINVAL + 0)
#define WPAD_CE5 (WPAD_E5 + 0)
#define WPAD_CE6 (WPAD_E6 + 0)
#define WPAD_CEBADE (WPAD_EBADE + 0)
#define WPAD_DEV_CORE 0
#define WPAD_DEV_FS 1
#define WPAD_DEV_CLASSIC 2
#define WPAD_DEV_BALANCE_CHECKER 3
#define WPAD_DEV_VSM 4
#define WPAD_DEV_MOTION_PLUS 5
#define WPAD_DEV_MPLS_PT_FS 6
#define WPAD_DEV_MPLS_PT_CLASSIC 7
#define WPAD_DEV_TRAIN 16
#define WPAD_DEV_GUITAR 17
#define WPAD_DEV_DRUM 18
#define WPAD_DEV_TAIKO 19
#define WPAD_DEV_TURNTABLE 20
#define WPAD_DEV_CORE 0
#define WPAD_DEV_FS 1
#define WPAD_DEV_CLASSIC 2
#define WPAD_DEV_BALANCE_CHECKER 3
#define WPAD_DEV_VSM 4
#define WPAD_DEV_MOTION_PLUS 5
#define WPAD_DEV_MPLS_PT_FS 6
#define WPAD_DEV_MPLS_PT_CLASSIC 7
#define WPAD_DEV_TRAIN 16
#define WPAD_DEV_GUITAR 17
#define WPAD_DEV_DRUM 18
#define WPAD_DEV_TAIKO 19
#define WPAD_DEV_TURNTABLE 20
// seems to be like maybe general purpose non-specific device types
// maybe this was for testing or something? idk
@@ -105,18 +65,114 @@ enum WPADResult_et {
#define WPAD_DEV_BULK_7 27
#define WPAD_DEV_BULK_8 28
#define WPAD_DEV_MPLS_PT_UNKNOWN 250
#define WPAD_DEV_251 251
#define WPAD_DEV_252 252 // invalid device mode?
#define WPAD_DEV_NONE 253 // sort of like WPAD_ENODEV (see __wpadAbortInitExtension in WPADHIDParser.c)
#define WPAD_DEV_INITIALIZING 255 // see __a1_20_status_report
#define WPAD_DEV_MPLS_PT_FUTURE 250
#define WPAD_DEV_FUTURE 251
#define WPAD_DEV_NOT_SUPPORTED 252 // invalid device mode?
#define WPAD_DEV_NONE 253 // sort of like WPAD_ENODEV (see __wpadAbortInitExtension in WPADHIDParser.c)
#define WPAD_DEV_INITIALIZING 255 // see __a1_20_status_report
#define WPAD_SENSOR_BAR_POS_BOTTOM 0
#define WPAD_SENSOR_BAR_POS_TOP 1
enum WPADResult_et {
WPAD_ERR_OK = 0,
WPAD_ERR_NO_CONTROLLER = -1,
WPAD_ERR_BUSY = -2,
WPAD_ERR_TRANSFER = -3,
WPAD_ERR_INVALID = -4,
WPAD_ERR_NOPERM = -5,
WPAD_ERR_BROKEN = -6,
WPAD_ERR_CORRUPTED = -7,
};
#define WPAD_ESUCCESS WPAD_ERR_OK
#define WPAD_ENODEV WPAD_ERR_NO_CONTROLLER
#define WPAD_EBUSY WPAD_ERR_BUSY
#define WPAD_ETRANSFER WPAD_ERR_TRANSFER // I don't know what the POSIX equivalent is
#define WPAD_EINVAL WPAD_ERR_INVALID
#define WPAD_ENOPERM WPAD_ERR_NOPERM
#define WPAD_EBROKEN WPAD_ERR_BROKEN
#define WPAD_EBADE WPAD_ERR_CORRUPTED
// apparently enum vs constant is a thing. cool
#define WPAD_CESUCCESS (WPAD_ESUCCESS + 0)
#define WPAD_CENODEV (WPAD_ENODEV + 0)
#define WPAD_CEBUSY (WPAD_EBUSY + 0)
#define WPAD_CETRANSFER (WPAD_ETRANSFER + 0)
#define WPAD_CEINVAL (WPAD_EINVAL + 0)
#define WPAD_CENOPERM (WPAD_ENOPERM + 0)
#define WPAD_CEBROKEN (WPAD_EBROKEN + 0)
#define WPAD_CEBADE (WPAD_EBADE + 0)
#define WPAD_DPD_MAX_OBJECTS 4
#define WPAD_DPD_IMG_RESO_WX 1024
#define WPAD_DPD_IMG_RESO_WY 768
#define WPAD_STATE_DISABLED 0
#define WPAD_STATE_ENABLING 1
#define WPAD_STATE_ENABLED 2
#define WPAD_STATE_SETUP 3
#define WPAD_STATE_DISABLING 4
#define WPAD_CHAN0 0
#define WPAD_CHAN1 1
#define WPAD_CHAN2 2
#define WPAD_CHAN3 3
#define WPAD_CHAN_INVALID -1
#define WPAD_MAX_CONTROLLERS 4
#define WPAD_HIDREP_BASE 0x10
#define WPAD_HIDREP_VIBRATOR 0x10
#define WPAD_HIDREP_PORT 0x11
#define WPAD_HIDREP_REPTYPE 0x12
#define WPAD_HIDREP_ENDPD 0x13
#define WPAD_HIDREP_ENSPK 0x14
#define WPAD_HIDREP_GETSTAT 0x15
#define WPAD_HIDREP_WRDATA 0x16
#define WPAD_HIDREP_RDDATA 0x17
#define WPAD_HIDREP_STRM 0x18
#define WPAD_HIDREP_MUTE 0x19
#define WPAD_HIDREP_DPDCSB 0x1A
#define WPAD_HIDREP_WAIT 0xFF
#define WPAD_BTN_HCURSOR_MASK (WPAD_BUTTON_LEFT | WPAD_BUTTON_RIGHT)
#define WPAD_BTN_VCURSOR_MASK (WPAD_BUTTON_UP | WPAD_BUTTON_DOWN)
#define WPAD_CLB_HCURSOR_MASK (WPAD_CL_BUTTON_LEFT | WPAD_CL_BUTTON_RIGHT)
#define WPAD_CLB_VCURSOR_MASK (WPAD_CL_BUTTON_UP | WPAD_CL_BUTTON_DOWN)
typedef void (*WPADInitFunc)(void);
typedef void (*WPADCallback)(s32 chan, s32 result);
typedef void (*WPADExtensionCallback)(s32 chan, s32 devType);
typedef void* (*WPADAlloc)(u32 size);
typedef BOOL (*WPADFree)(void* ptr);
typedef void (*WPADSyncDeviceCallback)(s32 result, s32 num);
typedef void (*WPADSamplingCallback)(s32 chan);
typedef void (*WPADConnectCallback)(s32 chan, s32 result);
typedef void (*WPADSimpleSyncCallback)(s32 result, s32 num);
typedef void (*WPADFlushCallback)(u32 result);
typedef u32 WPADDeviceType;
typedef s32 WPADChannel;
typedef struct WPADInfo {
/* 0x00 */ BOOL dpd;
/* 0x04 */ BOOL speaker;
/* 0x08 */ BOOL attach;
/* 0x0C */ BOOL lowBat;
/* 0x10 */ BOOL nearempty;
/* 0x14 */ u8 battery;
/* 0x15 */ u8 led;
/* 0x16 */ u8 protocol;
/* 0x17 */ u8 firmware;
} WPADInfo;
typedef struct WPADAcc {
/* 0x00 */ s16 x;
/* 0x02 */ s16 y;
/* 0x04 */ s16 z;
} WPADAcc;
typedef struct DPDObject {
/* 0x00 */ s16 x;
@@ -130,7 +186,7 @@ typedef struct WPADStatus {
/* 0x02 */ s16 accX;
/* 0x04 */ s16 accY;
/* 0x06 */ s16 accZ;
/* 0x08 */ DPDObject obj[WPAD_MAX_DPD_OBJECTS];
/* 0x08 */ DPDObject obj[WPAD_DPD_MAX_OBJECTS];
/* 0x28 */ u8 dev;
/* 0x29 */ s8 err;
} WPADStatus;
@@ -145,54 +201,37 @@ typedef struct DPDObjEx {
} DPDObjEx;
typedef struct WPADStatusEx {
/* 0x00 */ u16 button;
/* 0x02 */ s16 accX;
/* 0x04 */ s16 accY;
/* 0x06 */ s16 accZ;
/* 0x08 */ DPDObject obj[WPAD_MAX_DPD_OBJECTS];
/* 0x28 */ u8 dev;
/* 0x29 */ s8 err;
/* 0x2a */ DPDObjEx exp[WPAD_MAX_DPD_OBJECTS];
/* 0x00 */ WPADStatus base;
/* 0x2A */ DPDObjEx exp[WPAD_DPD_MAX_OBJECTS];
} WPADStatusEx;
typedef struct WPADFSStatus {
/* 0x00 */ u16 button;
/* 0x02 */ s16 accX;
/* 0x04 */ s16 accY;
/* 0x06 */ s16 accZ;
/* 0x08 */ DPDObject obj[WPAD_MAX_DPD_OBJECTS];
/* 0x28 */ u8 dev;
/* 0x29 */ s8 err;
/* 0x2a */ s16 fsAccX;
/* 0x2c */ s16 fsAccY;
/* 0x2e */ s16 fsAccZ;
/* 0x00 */ WPADStatus base;
/* 0x2A */ s16 fsAccX;
/* 0x2C */ s16 fsAccY;
/* 0x2E */ s16 fsAccZ;
/* 0x30 */ s8 fsStickX;
/* 0x31 */ s8 fsStickY;
} WPADFSStatus;
typedef struct WPADCLStatus {
/* 0x00 */ u16 button;
/* 0x02 */ s16 accX;
/* 0x04 */ s16 accY;
/* 0x06 */ s16 accZ;
/* 0x08 */ DPDObject obj[WPAD_MAX_DPD_OBJECTS];
/* 0x28 */ u8 dev;
/* 0x29 */ s8 err;
/* 0x2a */ u16 clButton;
/* 0x2c */ s16 clLStickX;
/* 0x2e */ s16 clLStickY;
/* 0x00 */ WPADStatus base;
/* 0x2A */ u16 clButton;
/* 0x2C */ s16 clLStickX;
/* 0x2E */ s16 clLStickY;
/* 0x30 */ s16 clRStickX;
/* 0x32 */ s16 clRStickY;
/* 0x34 */ u8 clTriggerL;
/* 0x35 */ u8 clTriggerR;
} WPADCLStatus;
#if SDK_AUG2010
typedef struct WPADBKStatus {
/* 0x00 */ u16 button;
/* 0x02 */ s16 accX;
/* 0x04 */ s16 accY;
/* 0x06 */ s16 accZ;
/* 0x08 */ DPDObject obj[WPAD_MAX_DPD_OBJECTS];
/* 0x08 */ DPDObject obj[WPAD_DPD_MAX_OBJECTS];
/* 0x28 */ u8 dev;
/* 0x29 */ s8 err;
/* 0x2a */ u8 bulk[21];
@@ -204,7 +243,7 @@ typedef struct WPADTRStatus {
/* 0x02 */ s16 accX;
/* 0x04 */ s16 accY;
/* 0x06 */ s16 accZ;
/* 0x08 */ DPDObject obj[WPAD_MAX_DPD_OBJECTS];
/* 0x08 */ DPDObject obj[WPAD_DPD_MAX_OBJECTS];
/* 0x28 */ u8 dev;
/* 0x29 */ s8 err;
/* 0x2a */ u16 trButton;
@@ -217,7 +256,7 @@ typedef struct WPADVSStatus {
/* 0x02 */ s16 accX;
/* 0x04 */ s16 accY;
/* 0x06 */ s16 accZ;
/* 0x08 */ DPDObject obj[WPAD_MAX_DPD_OBJECTS];
/* 0x08 */ DPDObject obj[WPAD_DPD_MAX_OBJECTS];
/* 0x28 */ u8 dev;
/* 0x29 */ s8 err;
/* 0x2a */ u16 at_0x2a[5];
@@ -233,7 +272,7 @@ typedef struct WPADMPStatus {
/* 0x02 */ s16 accX;
/* 0x04 */ s16 accY;
/* 0x06 */ s16 accZ;
/* 0x08 */ DPDObject obj[WPAD_MAX_DPD_OBJECTS];
/* 0x08 */ DPDObject obj[WPAD_DPD_MAX_OBJECTS];
/* 0x28 */ u8 dev;
/* 0x29 */ s8 err;
union {
@@ -255,7 +294,6 @@ typedef struct WPADMPStatus {
} cl;
} ext;
/* 0x36 */ u8 stat;
/* 0x37 */ u8 reserved;
/* 0x38 */ s16 pitch;
/* 0x3a */ s16 yaw;
/* 0x3c */ s16 roll;
@@ -266,25 +304,14 @@ typedef struct WPADBLStatus {
/* 0x02 */ s16 accX;
/* 0x04 */ s16 accY;
/* 0x06 */ s16 accZ;
/* 0x08 */ DPDObject obj[WPAD_MAX_DPD_OBJECTS];
/* 0x08 */ DPDObject obj[WPAD_DPD_MAX_OBJECTS];
/* 0x28 */ u8 dev;
/* 0x29 */ s8 err;
/* 0x2a */ u16 press[4];
/* 0x32 */ s8 temp;
/* 0x33 */ u8 battery;
} WPADBLStatus;
typedef struct WPADInfo {
/* 0x00 */ BOOL dpd;
/* 0x04 */ BOOL speaker;
/* 0x08 */ BOOL attach;
/* 0x0C */ BOOL lowBat;
/* 0x10 */ BOOL nearempty;
/* 0x14 */ u8 battery;
/* 0x15 */ u8 led;
/* 0x16 */ u8 protocol;
/* 0x17 */ u8 firmware;
} WPADInfo;
#endif
#define WPAD_FMT_CORE_BTN 0
#define WPAD_FMT_CORE_BTN_ACC 1
@@ -306,6 +333,7 @@ typedef struct WPADInfo {
#define WPAD_FMT_TAIKO 17
#define WPAD_FMT_TURNTABLE 18
#define WPAD_FMT_BULK 19
#define WPAD_FMT_UNK_20 20
#define WPAD_SPEAKER_DISABLE 0
#define WPAD_SPEAKER_ENABLE 1 // might be ON? see HBMRemoteSpk.cpp
@@ -317,8 +345,21 @@ typedef struct WPADInfo {
#define WPAD_MOTOR_STOP 0
#define WPAD_MOTOR_RUMBLE 1
typedef u32 WPADDpdCommand;
enum WPADDpdCommand_et
{
WPAD_DPD_DISABLE = 0x00,
// the command here is actually the data format
WPAD_DPD_BASIC = 0x01,
WPAD_DPD_STANDARD = 0x03,
WPAD_DPD_EXTENDED = 0x05,
};
s32 WPADProbe(s32 chan, u32* devType);
u8 WPADGetRadioSensitivity(s32 chan);
BOOL WPADSetAcceptConnection(u8 accept);
BOOL WPADGetAcceptConnection(void);
void WPADRead(s32 chan, WPADStatus* status);
BOOL WPADIsSpeakerEnabled(s32 chan);
s32 WPADControlSpeaker(s32 chan, u32 command, WPADCallback cb);
@@ -327,20 +368,54 @@ s32 WPADSendStreamData(s32 chan, void* p_buf, u16 len);
WPADConnectCallback WPADSetConnectCallback(s32 chan, WPADConnectCallback cb);
WPADExtensionCallback WPADSetExtensionCallback(s32 chan, WPADExtensionCallback cb);
WPADSimpleSyncCallback WPADSetSimpleSyncCallback(WPADSimpleSyncCallback cb);
WPADSamplingCallback WPADSetSamplingCallback(s32 chan, WPADSamplingCallback cb);
BOOL WPADIsUsedCallbackByKPAD(void);
void WPADSetCallbackByKPAD(BOOL isKPAD);
s32 WPADGetInfoAsync(s32 chan, WPADInfo* info, WPADCallback cb);
s32 WPADGetInfoAsync(s32 chan, WPADInfo* info, WPADCallback callback);
void WPADControlMotor(s32 chan, u32 command);
BOOL WPADCanSendStreamData(s32 chan);
BOOL WPADStopSimpleSync(void);
void WPADDisconnect(s32 chan);
BOOL WPADStartSimpleSync();
BOOL WPADStartFastSimpleSync(void);
BOOL WPADSaveConfig(SCFlushCallback* cb);
void WPADSetSpeakerVolume(u8 volume);
BOOL WPADSaveConfig(WPADFlushCallback cb);
u8 WPADGetSpeakerVolume(void);
void WPADSetSpeakerVolume(u8 volume);
void WPADEnableMotor(BOOL enabled);
BOOL WPADIsMotorEnabled(void);
BOOL IsBusyStream(s32 chan);
void WPADRegisterAllocator(WPADAlloc alloc, WPADFree free);
u32 WPADGetWorkMemorySize(void);
void WPADGetAccGravityUnit(s32 chan, u32 type, WPADAcc* acc);
BOOL WPADIsDpdEnabled(s32 chan);
s32 WPADControlDpd(s32 chan, u32 command, WPADCallback callback);
u32 WPADGetLatestIndexInBuf(s32 chan);
u32 WPADGetDataFormat(s32 chan);
s32 WPADSetDataFormat(s32 chan, u32 fmt);
void WPADSetAutoSleepTime(u8 minute);
u8 WPADGetSensorBarPosition(void);
s32 WPADGetStatus(void);
void WPADInit(void);
BOOL OnShutdown(BOOL final, u32 event);
u8 WPADGetDpdSensitivity(void);
void __WPADShutdown(void);
void __WPADReconnect(BOOL);
BOOL WPADCancelSyncDevice();
void WPADSetAutoSamplingBuf(s32 chan, void* buf, u32);
s32 WPADControlLed(s32 chan, u8 pattern, WPADCallback callback);
void WPADGetAddress(s32 chan, u8* addr);
#define WPADStartMotor(chan) WPADControlMotor((chan), WPAD_MOTOR_RUMBLE)
#define WPADStopMotor(chan) WPADControlMotor((chan), WPAD_MOTOR_STOP)
#ifdef __cplusplus
}
+14 -21
View File
@@ -2,6 +2,7 @@
#define CONTEXT_BTE_H
#include <stdint.h>
#include "types.h"
// taken from https://github.com/doldecomp/sdk_2009-12-11/blob/main/include/context_bte.h
@@ -595,13 +596,19 @@ typedef union
typedef void (tBTA_DM_SEC_CBACK)(tBTA_DM_SEC_EVT event, tBTA_DM_SEC *p_data);
/* Search callback events */
#define BTA_DM_INQ_RES_EVT 0 /* Inquiry result for a peer device. */
#define BTA_DM_INQ_CMPL_EVT 1 /* Inquiry complete. */
#define BTA_DM_DISC_RES_EVT 2 /* Discovery result for a peer device. */
#define BTA_DM_DISC_BLE_RES_EVT 3 /* Discovery result for BLE GATT based service on a peer device. */
#define BTA_DM_DISC_CMPL_EVT 4 /* Discovery complete. */
#define BTA_DM_DI_DISC_CMPL_EVT 5 /* Discovery complete. */
#define BTA_DM_SEARCH_CANCEL_CMPL_EVT 6 /* Search cancelled */
enum BTA_DM_State_e {
BTA_DM_INQ_RES_EVT, /* Inquiry result for a peer device. */
BTA_DM_INQ_CMPL_EVT, /* Inquiry complete. */
BTA_DM_DISC_RES_EVT, /* Discovery result for a peer device. */
#if SDK_AUG2010
BTA_DM_DISC_BLE_RES_EVT, /* Discovery result for BLE GATT based service on a peer device. */
#endif
BTA_DM_DISC_CMPL_EVT, /* Discovery complete. */
#if SDK_AUG2010
BTA_DM_DI_DISC_CMPL_EVT, /* Discovery complete. */
#endif
BTA_DM_SEARCH_CANCEL_CMPL_EVT, /* Search cancelled */
};
typedef UINT8 tBTA_DM_SEARCH_EVT;
@@ -1027,18 +1034,4 @@ void BTA_HhGetAclQueueInfo(void);
void BTA_Init(void);
void BTA_CleanUp(void (*p_cb)(tBTA_STATUS status)); // probably
// ---
/* muff1n: I wrote this definition myself
* TODO: would this be part of BLE or WUD?
*/
struct small_dev_info
{
char devName[20]; // size 0x14? offset 0x00 // might be 0x13?
char at_0x14[1]; // size 0x??, offset 0x14?
char __pad0[0x20 - (0x14 + 0x01)];
LINK_KEY linkKey; // size 0x10, offset 0x20
char __pad1[0x10];
}; // size 0x40
#endif // CONTEXT_BTE_H
+150
View File
@@ -0,0 +1,150 @@
#ifndef RVL_SDK_WUD_H
#define RVL_SDK_WUD_H
#include <revolution/sc.h>
#include <revolution/wpad/bte.h>
#include "types.h"
#ifdef __cplusplus
extern "C" {
#endif
#define WUD_MAX_DEV_ENTRY_FOR_STD SC_MAX_DEV_ENTRY_FOR_STD
#define WUD_MAX_DEV_ENTRY_FOR_SMP SC_MAX_DEV_ENTRY_FOR_SMP
#define WUD_MAX_DEV_ENTRY SC_MAX_DEV_ENTRY
#define WUD_DEV_HANDLE_INVALID (-1)
#define WUD_ADDR_LEN BD_ADDR_LEN
// Forward declarations
typedef struct WUDDevInfo WUDDevInfo;
typedef enum {
WUD_LIB_STATUS_0,
WUD_LIB_STATUS_1,
WUD_LIB_STATUS_2,
WUD_LIB_STATUS_3,
WUD_LIB_STATUS_4,
WUD_LIB_STATUS_5,
} WUDLibStatus;
typedef enum {
WUD_CHAN0,
WUD_CHAN1,
WUD_CHAN2,
WUD_CHAN3,
WUD_MAX_CHANNELS,
WUD_CHAN_INVALID = -1
} WUDChannel;
typedef enum {
WUD_SYNC_TYPE_STANDARD,
WUD_SYNC_TYPE_SIMPLE,
} WUDSyncType;
typedef enum {
WUD_RESULT_SYNC_BUSY = -1,
WUD_RESULT_SYNC_WAITING,
WUD_RESULT_SYNC_DONE,
} WUDSyncResult;
typedef void* (*WUDAllocFunc)(u32 size);
typedef BOOL (*WUDFreeFunc)(void* pBlock);
typedef void (*WUDSyncDeviceCallback)(s32 result, s32 num);
typedef void (*WUDClearDeviceCallback)(s32 result);
typedef void (*WUDHidConnCallback)(u8, u8);
typedef void (*WUDHidRecvCallback)(UINT8 devHandle, UINT8* pReport, UINT16 len);
typedef struct WUDDevInfo {
SCDevInfo conf; // at 0x0
BD_ADDR devAddr; // at 0x40
LINK_KEY linkKey; // at 0x46
UINT8 devHandle; // at 0x56
UINT8 subclass; // at 0x57
UINT8 appID; // at 0x58
u8 status; // at 0x59
s8 UNK_0x5A; // at 0x5A
u8 sync_type; // at 0x5B
u8 UNK_0x5C; // at 0x5C
u8 UNK_0x5D[1];
tBTA_HH_ATTR_MASK hhAttrMask; // at 0x5E
} WUDDevInfo;
BOOL WUDInit(void);
BOOL WUDIsBusy(void);
void WUDRegisterAllocator(WUDAllocFunc pAllocFunc, WUDFreeFunc pFreeFunc);
u32 WUDGetAllocatedMemSize(void);
void WUDShutdown(void);
WUDLibStatus WUDGetStatus(void);
u8 WUDGetBufferStatus(void);
void WUDSetSniffMode(BD_ADDR addr, s32 interval);
// clang-format off
WUDSyncDeviceCallback
WUDSetSyncSimpleCallback(WUDSyncDeviceCallback pCallback);
WUDClearDeviceCallback
WUDSetClearDeviceCallback(WUDClearDeviceCallback pCallback);
// clang-format on
BOOL WUDStartSyncDevice(void);
BOOL WUDStartFastSyncSimple(void);
BOOL WUDStartSyncSimple(void);
BOOL WUDStopSyncSimple(void);
BOOL WUDCancelSyncDevice(void);
BOOL WUDStartClearDevice(void);
BOOL WUDSetDisableChannel(s8 afhChannel);
WUDHidRecvCallback WUDSetHidRecvCallback(WUDHidRecvCallback pCallback);
WUDHidConnCallback WUDSetHidConnCallback(WUDHidConnCallback pCallback);
void WUDSetVisibility(u8 disc, u8 conn);
u8 WUDGetConnectable(void);
void WUDiGetFirmwareVersion(void);
void WUDiInitSub(void);
void WUDiEnableStack(void);
void WUDiAutoSync(void);
void WUDiDeleteAllLinkKeys(void);
void WUDiRegisterDevice(BD_ADDR addr);
void WUDiRemoveDevice(BD_ADDR addr);
WUDDevInfo* WUDiGetDevInfo(BD_ADDR addr);
WUDDevInfo* WUDiGetDevInfoIndex(int idx);
WUDDevInfo* WUDiGetNewDevInfo(void);
void WUDiRemoveDevInfo(BD_ADDR addr);
void WUDiClearDevice(void);
u8 WUDiGetDevNumber(void);
u8 WUDiGetDevSmpNumber(void);
u8 WUDiGetConnNumber(void);
u8 WUDiGetLinkNum(void);
void WUDiMoveTopSmpDevInfoPtr(WUDDevInfo* pInfo);
void WUDiMoveBottomSmpDevInfoPtr(WUDDevInfo* pInfo);
WUDDevInfo* WUDiGetRemoveSmpDevice(void);
void WUDiMoveTopOfDisconnectedSmpDevice(WUDDevInfo* pInfo);
void WUDiMoveTopStdDevInfoPtr(WUDDevInfo* pInfo);
void WUDiMoveBottomStdDevInfoPtr(WUDDevInfo* pInfo);
WUDDevInfo* WUDiGetRemoveStdDevice(void);
void WUDiMoveTopOfDisconnectedStdDevice(WUDDevInfo* pInfo);
BD_ADDR_PTR _WUDGetDevAddr(UINT8 handle);
u16 _WUDGetQueuedSize(s8 dev_handle);
u16 _WUDGetNotAckedSize(s8 dev_handle);
u8 _WUDGetLinkNumber(void);
#ifdef __cplusplus
}
#endif
#endif