#ifndef _CONTROLLER_H #define _CONTROLLER_H #include "libultra_internal.h" //#include //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 //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;