Skip to content

Commit

Permalink
Decompile padmgr.c (#1246)
Browse files Browse the repository at this point in the history
* Decompile padmgr.c

* Format

* Enum names

* Update namefixer

* Suggested changes

Co-authored-by: Anghelo Carvajal <[email protected]>

* Suggested changes, improve motor.c

Co-authored-by: Derek Hensley <[email protected]>

* Further suggested changes

* Format

* Fix `controller.h` comment

Co-authored-by: engineer124 <[email protected]>

---------

Co-authored-by: Anghelo Carvajal <[email protected]>
Co-authored-by: Derek Hensley <[email protected]>
Co-authored-by: engineer124 <[email protected]>
  • Loading branch information
4 people authored May 26, 2023
1 parent 22af2bb commit 6d20839
Show file tree
Hide file tree
Showing 24 changed files with 1,103 additions and 236 deletions.
32 changes: 2 additions & 30 deletions include/functions.h
Original file line number Diff line number Diff line change
Expand Up @@ -328,7 +328,7 @@ OSTime osGetTime(void);
void guRotateF(float m[4][4], f32 a, f32 x, f32 y, f32 z);
void guRotate(Mtx* m, f32 a, f32 x, f32 y, f32 z);
void __osSetGlobalIntMask(u32 mask);
// void osVoiceInit(void);
s32 osVoiceInit(OSMesgQueue* mq, OSVoiceHandle* handle, s32 channel);
s32 __osContChannelReset(OSMesgQueue* mq, s32 channel);
// void __osVoiceSetADConverter(void);
s32 osAiSetFrequency(u32 frequency);
Expand Down Expand Up @@ -2098,34 +2098,6 @@ ListAlloc* ListAlloc_Init(ListAlloc* this);
// void ListAlloc_Free(void);
void ListAlloc_FreeAll(ListAlloc* this);
void Main(void* arg);
u32 Padmgr_GetControllerBitmask(void);
void func_80174F24(void (*arg0)(void*), void* arg1);
void func_80174F44(void (*arg0)(void*), void* arg1);
void func_80174F7C(void (*arg0)(s32), void* arg1);
void func_80174F9C(void (*arg0)(s32), void* arg1);
// OSMesgQueue* Padmgr_GetEventCallback(void);
// void func_80175008(void);
void Padmgr_SetEventCallback(OSMesg pvParm1);
// void func_8017506C(void);
// void Padmgr_Lock(void);
// void Padmgr_Unlock(void);
// void func_801750FC(void);
// void func_80175364(void);
void func_80175434(void);
void func_8017544C(s32 port, s32 rumbleOn);
void PadMgr_RumbleSet(u8 rumbleEnabled[MAXCONTROLLERS]);
s32 PadMgr_ControllerHasRumblePak(s32 port);
void Padmgr_CalcStickEdges(Input* input);
// void Padmgr_ParseState(void);
// void func_801759BC(void);
// void func_80175AE0(void);
// void Padmgr_Update(void);
// void Padmgr_Stop(void);
void func_80175E68(Input* input, s32 param_2);
void Padmgr_GetInput(Input* input, s32 param_2);
void Padmgr_GetInput2(Input* input, s32 param_2);
void Padmgr_ThreadEntry(PadMgr* padmgr);
void PadMgr_Init(OSMesgQueue* siEventCallbackQueue, IrqMgr* irqmgr, OSId threadId, OSPri threadPri, void* stack);
void Sched_SwapFramebuffer(CfbInfo* cfbInfo);
void Sched_RetraceUpdateFramebuffer(SchedContext* sched, CfbInfo* cfbInfo);
void Sched_HandleReset(SchedContext* sched);
Expand Down Expand Up @@ -2614,7 +2586,7 @@ void Audio_ResetForAudioHeapStep3(void);
void Audio_ResetForAudioHeapStep2(void);
void Audio_ResetForAudioHeapStep1(s32 specId);

// void func_801A4EB0(void);
void func_801A4EB0(void);
// void func_801A4EB8(void);
void func_801A4FD8(void);
void func_801A5080(u16 arg0);
Expand Down
80 changes: 69 additions & 11 deletions include/io/controller.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,6 @@
#define CONT_CMD_WRITE_EEPROM_RX 1
#define CONT_CMD_RESET_RX 3

#define CONT_CMD_NOP 0xFF
#define CONT_CMD_END 0xFE // Indicates end of a command
#define CONT_CMD_EXE 1 // Set pif ram status byte to this to do a command

#define CONT_ERR_NO_CONTROLLER PFS_ERR_NOPACK /* 1 */
#define CONT_ERR_CONTRFAIL CONT_OVERRUN_ERROR /* 4 */
#define CONT_ERR_INVALID PFS_ERR_INVALID /* 5 */
Expand All @@ -48,6 +44,52 @@
#define CONT_ERR_VOICE_WORD 14
#define CONT_ERR_VOICE_NO_RESPONSE 15

// Joybus commands
#define CONT_CMD_REQUEST_STATUS 0
#define CONT_CMD_READ_BUTTON 1
#define CONT_CMD_READ_PAK 2
#define CONT_CMD_WRITE_PAK 3
#define CONT_CMD_READ_EEPROM 4
#define CONT_CMD_WRITE_EEPROM 5
#define CONT_CMD_READ36_VOICE 9
#define CONT_CMD_WRITE20_VOICE 10
#define CONT_CMD_READ2_VOICE 11
#define CONT_CMD_WRITE4_VOICE 12
#define CONT_CMD_SWRITE_VOICE 13
#define CONT_CMD_CHANNEL_RESET 0xFD
#define CONT_CMD_RESET 0xFF

// Bytes transmitted for each joybus command
#define CONT_CMD_REQUEST_STATUS_TX 1
#define CONT_CMD_READ_BUTTON_TX 1
#define CONT_CMD_READ_PAK_TX 3
#define CONT_CMD_WRITE_PAK_TX 35
#define CONT_CMD_READ_EEPROM_TX 2
#define CONT_CMD_WRITE_EEPROM_TX 10
#define CONT_CMD_READ36_VOICE_TX 3
#define CONT_CMD_WRITE20_VOICE_TX 23
#define CONT_CMD_READ2_VOICE_TX 3
#define CONT_CMD_WRITE4_VOICE_TX 7
#define CONT_CMD_SWRITE_VOICE_TX 3
#define CONT_CMD_RESET_TX 1

// Bytes received for each joybus command
#define CONT_CMD_REQUEST_STATUS_RX 3
#define CONT_CMD_READ_BUTTON_RX 4
#define CONT_CMD_READ_PAK_RX 33
#define CONT_CMD_WRITE_PAK_RX 1
#define CONT_CMD_READ_EEPROM_RX 8
#define CONT_CMD_WRITE_EEPROM_RX 1
#define CONT_CMD_READ36_VOICE_RX 37
#define CONT_CMD_WRITE20_VOICE_RX 1
#define CONT_CMD_READ2_VOICE_RX 3
#define CONT_CMD_WRITE4_VOICE_RX 1
#define CONT_CMD_SWRITE_VOICE_RX 1
#define CONT_CMD_RESET_RX 3

#define CONT_CMD_NOP 0xFF
#define CONT_CMD_END 0xFE // Indicates end of a command
#define CONT_CMD_EXE 1 // Set pif ram status byte to this to do a command

#define DIR_STATUS_EMPTY 0
#define DIR_STATUS_UNKNOWN 1
Expand Down Expand Up @@ -81,13 +123,34 @@
#define CONT_ADDR_CRC_ER 0x04
#define CONT_EEPROM_BUSY 0x80

// Accessory detection
#define CONT_ADDR_DETECT 0x8000
// Rumble
#define CONT_ADDR_RUMBLE 0xC000
// Controller Pak
// Transfer Pak
#define CONT_ADDR_GB_POWER 0x8000 // Same as the detection address, but semantically different
#define CONT_ADDR_GB_BANK 0xA000
#define CONT_ADDR_GB_STATUS 0xB000

// Addresses sent to controller accessories are in blocks, not bytes
#define CONT_BLOCKS(x) ((x) / BLOCKSIZE)

// Block addresses of the above
#define CONT_BLOCK_DETECT CONT_BLOCKS(CONT_ADDR_DETECT)
#define CONT_BLOCK_RUMBLE CONT_BLOCKS(CONT_ADDR_RUMBLE)
#define CONT_BLOCK_GB_POWER CONT_BLOCKS(CONT_ADDR_GB_POWER)
#define CONT_BLOCK_GB_BANK CONT_BLOCKS(CONT_ADDR_GB_BANK)
#define CONT_BLOCK_GB_STATUS CONT_BLOCKS(CONT_ADDR_GB_STATUS)

/* Buttons */
#define BTN_CRIGHT 0x0001
#define BTN_CLEFT 0x0002
#define BTN_CDOWN 0x0004
#define BTN_CUP 0x0008
#define BTN_R 0x0010
#define BTN_L 0x0020
#define BTN_RESET 0x0080
#define BTN_DRIGHT 0x0100
#define BTN_DLEFT 0x0200
#define BTN_DDOWN 0x0400
Expand Down Expand Up @@ -146,18 +209,13 @@ typedef struct {
/* 0x26 */ u8 datacrc;
} __OSContRamReadFormat;

#define READFORMAT(ptr) ((__OSContRamReadFormat*)(ptr))

extern OSPifRam __osContPifRam;
// extern UNK_TYPE1 D_8009CF0C;
extern u8 __osContLastPoll;
extern u8 __osMaxControllers;
// extern OSMesgQueue D_8009CF38;
// extern OSMesg D_8009CF50;

typedef struct {
/* 0x00 */ OSContPad cur;
/* 0x06 */ OSContPad prev;
/* 0x0C */ OSContPad press; // X/Y store delta from last frame
/* 0x12 */ OSContPad rel; // X/Y store adjusted
} Input; // size = 0x18

#endif
9 changes: 7 additions & 2 deletions include/irqmgr.h
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
#ifndef IRQMGR_H
#define IRQMGR_H

#include "PR/ultratypes.h"
#include "PR/sched.h"
#include "ultra64/message.h"
#include "os.h"
#include "ultra64.h"

#define OS_SC_RETRACE_MSG 1
#define OS_SC_DONE_MSG 2
#define OS_SC_NMI_MSG 3 // name is made up, 3 is OS_SC_RDP_DONE_MSG in the original sched.c
#define OS_SC_PRE_NMI_MSG 4

typedef struct IrqMgrClient {
/* 0x0 */ struct IrqMgrClient* next;
Expand Down
97 changes: 97 additions & 0 deletions include/padmgr.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
#ifndef PADMGR_H
#define PADMGR_H

#include "libc/stdbool.h"
#include "io/controller.h"
#include "irqmgr.h"

typedef struct {
/* 0x00 */ OSContPad cur;
/* 0x06 */ OSContPad prev;
/* 0x0C */ OSContPad press; // X/Y store delta from last frame
/* 0x12 */ OSContPad rel; // X/Y store adjusted
} Input; // size = 0x18

typedef enum {
/* 0 */ PADMGR_CONT_NONE,
/* 1 */ PADMGR_CONT_NORMAL,
/* 3 */ PADMGR_CONT_MOUSE = 3,
/* 4 */ PADMGR_CONT_VOICE_PLUGGED, // VRU plugged but not initialized
/* 5 */ PADMGR_CONT_VOICE,
/* -1 */ PADMGR_CONT_UNK = 0xFF
} ControllerDeviceType;

typedef enum {
/* 0 */ CONT_PAK_NONE,
/* 1 */ CONT_PAK_RUMBLE,
/* 2 */ CONT_PAK_OTHER
} ControllerPakType;

typedef struct {
/* 0x000 */ u8 validCtrlrsMask;
/* 0x004 */ void (*rumbleRetraceCallback)(void*);
/* 0x008 */ void* rumbleRetraceArg;
/* 0x00C */ void (*inputRetraceCallback)(void*);
/* 0x010 */ void* inputRetraceArg;
/* 0x014 */ OSContStatus padStatus[MAXCONTROLLERS];
/* 0x024 */ OSMesg serialMsg;
/* 0x028 */ OSMesg lockMsg;
/* 0x02C */ OSMesg interruptMsgBuf[8];
/* 0x04C */ OSMesgQueue serialLockQueue;
/* 0x064 */ OSMesgQueue lockQueue;
/* 0x07C */ OSMesgQueue interruptQueue;
/* 0x094 */ IrqMgrClient irqClient;
/* 0x09C */ IrqMgr* irqMgr;
/* 0x0A0 */ OSThread thread;
/* 0x250 */ Input inputs[MAXCONTROLLERS];
/* 0x2B0 */ OSContPad pads[MAXCONTROLLERS];
/* 0x2C8 */ u8 nControllers;
/* 0x2C9 */ u8 ctrlrType[MAXCONTROLLERS]; // type of controller currently connected to each port
/* 0x2CD */ u8 pakType[MAXCONTROLLERS]; // type of controller pak for each port (if applicable)
/* 0x2D1 */ u8 rumbleEnable[MAXCONTROLLERS]; // whether rumble is active for each port
/* 0x2D5 */ u8 rumbleTimer[MAXCONTROLLERS];
/* 0x2DC */ OSPfs rumblePfs[MAXCONTROLLERS];
/* 0x47C */ vu8 rumbleOffTimer; // amount of VI retraces to not rumble for, takes priority over rumbleOnTimer
/* 0x47D */ vu8 rumbleOnTimer; // amount of VI retraces to rumble for
/* 0x47E */ u8 isResetting;
} PadMgr; // size = 0x480

extern PadMgr gPadMgr;

// Initialization

s32 PadSetup_Init(OSMesgQueue* mq, u8* outMask, OSContStatus* status);
void PadMgr_Init(OSMesgQueue* siEvtQ, IrqMgr* irqMgr, OSId threadId, OSPri pri, void* stack);

// Fetching inputs

void PadMgr_GetInputNoLock(Input* inputs, s32 gameRequest);
void PadMgr_GetInput(Input* inputs, s32 gameRequest);
void PadMgr_GetInput2(Input* inputs, s32 gameRequest);

// Callbacks

void PadMgr_SetRumbleRetraceCallback(void (*callback)(void*), void* arg);
void PadMgr_UnsetRumbleRetraceCallback(void (*callback)(void*), void* arg);

void PadMgr_SetInputRetraceCallback(void (*callback)(void*), void* arg);
void PadMgr_UnsetInputRetraceCallback(void (*callback)(void*), void* arg);

// Valid controllers

u8 PadMgr_GetValidControllersMask(void);

// Voice queue

OSMesgQueue* PadMgr_VoiceAcquireSerialEventQueue(void);
void PadMgr_VoiceReleaseSerialEventQueue(OSMesgQueue* serialEventQueue);

// Rumble

void PadMgr_RumbleStop(void);
void PadMgr_RumblePause(void);
void PadMgr_RumbleSetSingle(s32 port, s32 enable);
void PadMgr_RumbleSet(u8 enable[MAXCONTROLLERS]);
s32 PadMgr_ControllerHasRumblePak(s32 port);

#endif
13 changes: 7 additions & 6 deletions include/ultra64/motor.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,14 @@
#include "PR/pfs.h"
#include "ultra64/message.h"

#define MOTOR_START 1
#define MOTOR_STOP 0
#define MOTOR_START 1
#define MOTOR_STOP 0

#define osMotorStart(x) __osMotorAccess((x), MOTOR_START)
#define osMotorStop(x) __osMotorAccess((x), MOTOR_STOP)
#define osMotorStart(x) __osMotorAccess((x), MOTOR_START)
#define osMotorStop(x) __osMotorAccess((x), MOTOR_STOP)

s32 __osMotorAccess(OSPfs* pfs, u32 vibrate);
s32 osMotorInit(OSMesgQueue* ctrlrqueue, OSPfs* pfs, s32 channel);
s32 __osMotorAccess(OSPfs* pfs, s32 flag);

s32 osMotorInit(OSMesgQueue* mq, OSPfs* pfs, s32 channel);

#endif
8 changes: 8 additions & 0 deletions include/ultra64/rcp.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,12 @@
#define DEVICE_TYPE_SRAM 3 /* SRAM */
#define DEVICE_TYPE_INIT 7 /* initial value */


#define CHNL_ERR_NORESP 0x80 /* Bit 7 (Rx): No response error */
#define CHNL_ERR_OVERRUN 0x40 /* Bit 6 (Rx): Overrun error */
#define CHNL_ERR_FRAME 0x80 /* Bit 7 (Tx): Frame error */
#define CHNL_ERR_COLLISION 0x40 /* Bit 6 (Tx): Collision error */

#define CHNL_ERR_MASK 0xC0 /* Bit 6-7: channel errors */

#endif
6 changes: 1 addition & 5 deletions include/variables.h
Original file line number Diff line number Diff line change
Expand Up @@ -795,9 +795,6 @@ extern u32 cfbIdx[3];
extern s32 gScreenWidth;
extern s32 gScreenHeight;
extern u32 startHeapSize;
extern PadMgr* padmgrContext;
// extern UNK_TYPE4 controllerInputsCaptured;
// extern UNK_TYPE4 D_801D1538;
extern UNK_PTR D_801D1540;
// extern f32 sFactorialTbl[13];
extern Vec3f gZeroVec3f;
Expand Down Expand Up @@ -2410,7 +2407,6 @@ extern u32 gSegments[NUM_SEGMENTS];
extern SchedContext gSchedContext;

extern OSThread gGraphThread;
extern PadMgr gPadMgr;

extern FaultClient sSchedFaultClient;
extern OSTime sRSPGFXStartTime;
Expand Down Expand Up @@ -2616,7 +2612,7 @@ extern s32 D_801FD120;
// extern UNK_TYPE1 D_801FD598;
// extern UNK_TYPE1 D_801FD5A0;
// extern UNK_TYPE1 D_801FD5A4;
// extern UNK_TYPE1 D_801FD5B8;
extern OSVoiceHandle gVoiceHandle;
// extern UNK_TYPE1 D_801FD5C4;
// extern UNK_TYPE1 D_801FD5C8;
// extern UNK_TYPE1 D_801FD5E8;
Expand Down
Loading

0 comments on commit 6d20839

Please sign in to comment.