mirror of
https://github.com/izzy2lost/Diddy-Kong-Racing.git
synced 2026-06-19 01:16:26 -07:00
140 lines
3.5 KiB
C
140 lines
3.5 KiB
C
#ifndef _CONTROLLER_H
|
|
#define _CONTROLLER_H
|
|
#include "libultra_internal.h"
|
|
//#include <rcp.h>
|
|
|
|
//should go somewhere else but
|
|
#define ARRLEN(x) ((s32)(sizeof(x) / sizeof(x[0])))
|
|
#define CHNL_ERR(format) ((format.rxsize & 0xC0) >> 4)
|
|
|
|
typedef struct
|
|
{
|
|
/* 0x0 */ u32 ramarray[15];
|
|
/* 0x3C */ u32 pifstatus;
|
|
} OSPifRam;
|
|
|
|
typedef struct
|
|
{
|
|
/* 0x0 */ u8 dummy;
|
|
/* 0x1 */ u8 txsize;
|
|
/* 0x2 */ u8 rxsize;
|
|
/* 0x3 */ u8 cmd;
|
|
/* 0x4 */ u16 button;
|
|
/* 0x6 */ s8 stick_x;
|
|
/* 0x7 */ s8 stick_y;
|
|
} __OSContReadFormat;
|
|
|
|
typedef struct
|
|
{
|
|
/* 0x0 */ u8 dummy;
|
|
/* 0x1 */ u8 txsize;
|
|
/* 0x2 */ u8 rxsize;
|
|
/* 0x3 */ u8 cmd;
|
|
/* 0x4 */ u8 typeh;
|
|
/* 0x5 */ u8 typel;
|
|
/* 0x6 */ u8 status;
|
|
/* 0x7 */ u8 dummy1;
|
|
} __OSContRequesFormat;
|
|
|
|
typedef struct
|
|
{
|
|
/* 0x0 */ u8 txsize;
|
|
/* 0x1 */ u8 rxsize;
|
|
/* 0x2 */ u8 cmd;
|
|
/* 0x3 */ u8 typeh;
|
|
/* 0x4 */ u8 typel;
|
|
/* 0x5 */ u8 status;
|
|
} __OSContRequesFormatShort;
|
|
|
|
typedef struct
|
|
{
|
|
/* 0x0 */ u8 dummy;
|
|
/* 0x1 */ u8 txsize;
|
|
/* 0x2 */ u8 rxsize;
|
|
/* 0x3 */ u8 cmd;
|
|
/* 0x4 */ u16 address;
|
|
/* 0x6 */ u8 data[32];
|
|
/* 0x26 */ u8 datacrc;
|
|
} __OSContRamReadFormat;
|
|
|
|
|
|
typedef struct
|
|
{
|
|
/* 0x0 */ u8 txsize;
|
|
/* 0x1 */ u8 rxsize;
|
|
/* 0x2 */ u8 cmd;
|
|
/* 0x3 */ u8 address;
|
|
/* 0x4 */ u8 data[EEPROM_BLOCK_SIZE];
|
|
} __OSContEepromFormat;
|
|
|
|
//from: http://en64.shoutwiki.com/wiki/SI_Registers_Detailed#CONT_CMD_Usage
|
|
#define CONT_CMD_REQUEST_STATUS 0
|
|
#define CONT_CMD_READ_BUTTON 1
|
|
#define CONT_CMD_READ_MEMPACK 2
|
|
#define CONT_CMD_WRITE_MEMPACK 3
|
|
#define CONT_CMD_READ_EEPROM 4
|
|
#define CONT_CMD_WRITE_EEPROM 5
|
|
#define CONT_CMD_RESET 0xff
|
|
|
|
#define CONT_CMD_REQUEST_STATUS_TX 1
|
|
#define CONT_CMD_READ_BUTTON_TX 1
|
|
#define CONT_CMD_READ_MEMPACK_TX 3
|
|
#define CONT_CMD_WRITE_MEMPACK_TX 35
|
|
#define CONT_CMD_READ_EEPROM_TX 2
|
|
#define CONT_CMD_WRITE_EEPROM_TX 10
|
|
#define CONT_CMD_RESET_TX 1
|
|
|
|
#define CONT_CMD_REQUEST_STATUS_RX 3
|
|
#define CONT_CMD_READ_BUTTON_RX 4
|
|
#define CONT_CMD_READ_MEMPACK_RX 33
|
|
#define CONT_CMD_WRITE_MEMPACK_RX 1
|
|
#define CONT_CMD_READ_EEPROM_RX 8
|
|
#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 DIR_STATUS_EMPTY 0
|
|
#define DIR_STATUS_UNKNOWN 1
|
|
#define DIR_STATUS_OCCUPIED 2
|
|
|
|
extern u8 __osContLastCmd;
|
|
extern OSTimer __osEepromTimer;
|
|
extern OSMesg __osEepromTimerMsg;
|
|
extern OSMesgQueue __osEepromTimerQ;
|
|
extern OSPifRam __osEepPifRam;
|
|
extern OSPifRam __osContPifRam;
|
|
extern OSPifRam __osPfsPifRam;
|
|
extern u8 __osMaxControllers;
|
|
|
|
//some version of this almost certainly existed since there's plenty of times where it's used right before a return 0
|
|
#define ERRCK(fn) \
|
|
ret = fn; \
|
|
if (ret != 0) \
|
|
return ret;
|
|
|
|
#define SET_ACTIVEBANK_TO_ZERO \
|
|
if (pfs->activebank != 0) \
|
|
{ \
|
|
pfs->activebank = 0; \
|
|
ERRCK(__osPfsSelectBank(pfs)) \
|
|
}
|
|
|
|
#define PFS_CHECK_ID \
|
|
if (__osCheckId(pfs) == PFS_ERR_NEW_PACK) \
|
|
return PFS_ERR_NEW_PACK;
|
|
#endif
|
|
|
|
#define PFS_CHECK_STATUS \
|
|
if ((pfs->status & PFS_INITIALIZED) == 0) \
|
|
return PFS_ERR_INVALID;
|
|
|
|
#define PFS_GET_STATUS \
|
|
__osSiGetAccess(); \
|
|
ret = __osPfsGetStatus(queue, channel); \
|
|
__osSiRelAccess(); \
|
|
if (ret != 0) \
|
|
return ret;
|