Mario Kart 64
controller.h
Go to the documentation of this file.
1 #ifndef _CONTROLLER_H
2 #define _CONTROLLER_H
3 #include "PR/os_internal.h"
4 #include "PR/os.h"
5 #include "PR/rcp.h"
6 
7 //should go somewhere else but
8 #define ARRLEN(x) ((s32)(sizeof(x) / sizeof(x[0])))
9 #define CHNL_ERR(format) ((format.rxsize & CHNL_ERR_MASK) >> 4)
10 
11 typedef struct
12 {
13  /* 0x0 */ u32 ramarray[15];
14  /* 0x3C */ u32 pifstatus;
15 } OSPifRam;
16 
17 typedef struct
18 {
19  /* 0x0 */ u8 dummy;
20  /* 0x1 */ u8 txsize;
21  /* 0x2 */ u8 rxsize;
22  /* 0x3 */ u8 cmd;
23  /* 0x4 */ u16 button;
24  /* 0x6 */ s8 stick_x;
25  /* 0x7 */ s8 stick_y;
27 
28 typedef struct
29 {
30  /* 0x0 */ u8 dummy;
31  /* 0x1 */ u8 txsize;
32  /* 0x2 */ u8 rxsize;
33  /* 0x3 */ u8 cmd;
34  /* 0x4 */ u8 typeh;
35  /* 0x5 */ u8 typel;
36  /* 0x6 */ u8 status;
37  /* 0x7 */ u8 dummy1;
39 
40 typedef struct
41 {
42  /* 0x0 */ u8 txsize;
43  /* 0x1 */ u8 rxsize;
44  /* 0x2 */ u8 cmd;
45  /* 0x3 */ u8 typeh;
46  /* 0x4 */ u8 typel;
47  /* 0x5 */ u8 status;
49 
50 typedef struct
51 {
52  /* 0x0 */ u8 dummy;
53  /* 0x1 */ u8 txsize;
54  /* 0x2 */ u8 rxsize;
55  /* 0x3 */ u8 cmd;
56  /* 0x4 */ u16 address;
57  /* 0x6 */ u8 data[BLOCKSIZE];
58  /* 0x26 */ u8 datacrc;
60 
61 typedef union {
62  /* 0x0 */ struct
63  {
64  /* 0x0 */ u8 bank;
65  /* 0x1 */ u8 page;
66  } inode_t;
67  /* 0x0 */ u16 ipage;
69 
70 typedef struct
71 {
72  /* 0x0 */ u32 game_code;
73  /* 0x4 */ u16 company_code;
75  /* 0x8 */ u8 status;
76  /* 0x9 */ s8 reserved;
77  /* 0xA */ u16 data_sum;
78  /* 0xC */ u8 ext_name[PFS_FILE_EXT_LEN];
79  /* 0x10 */ u8 game_name[PFS_FILE_NAME_LEN];
80 } __OSDir;
81 
82 typedef struct
83 {
84  /* 0x0 */ __OSInodeUnit inode_page[128];
85 } __OSInode;
86 
87 typedef struct
88 {
89  /* 0x0 */ u32 repaired;
90  /* 0x4 */ u32 random;
91  /* 0x8 */ u64 serial_mid;
92  /* 0x10 */ u64 serial_low;
93  /* 0x18 */ u16 deviceid;
94  /* 0x1A */ u8 banks;
95  /* 0x1B */ u8 version;
96  /* 0x1C */ u16 checksum;
97  /* 0x1E */ u16 inverted_checksum;
98 } __OSPackId;
99 
100 typedef struct
101 {
102  /* 0x0 */ u8 txsize;
103  /* 0x1 */ u8 rxsize;
104  /* 0x2 */ u8 cmd;
105  /* 0x3 */ u8 address;
106  /* 0x4 */ u8 data[EEPROM_BLOCK_SIZE];
108 
109 //from: http://en64.shoutwiki.com/wiki/SI_Registers_Detailed#CONT_CMD_Usage
110 #define CONT_CMD_REQUEST_STATUS 0
111 #define CONT_CMD_READ_BUTTON 1
112 #define CONT_CMD_READ_MEMPACK 2
113 #define CONT_CMD_WRITE_MEMPACK 3
114 #define CONT_CMD_READ_EEPROM 4
115 #define CONT_CMD_WRITE_EEPROM 5
116 #define CONT_CMD_RESET 0xff
117 
118 #define CONT_CMD_REQUEST_STATUS_TX 1
119 #define CONT_CMD_READ_BUTTON_TX 1
120 #define CONT_CMD_READ_MEMPACK_TX 3
121 #define CONT_CMD_WRITE_MEMPACK_TX 35
122 #define CONT_CMD_READ_EEPROM_TX 2
123 #define CONT_CMD_WRITE_EEPROM_TX 10
124 #define CONT_CMD_RESET_TX 1
125 
126 #define CONT_CMD_REQUEST_STATUS_RX 3
127 #define CONT_CMD_READ_BUTTON_RX 4
128 #define CONT_CMD_READ_MEMPACK_RX 33
129 #define CONT_CMD_WRITE_MEMPACK_RX 1
130 #define CONT_CMD_READ_EEPROM_RX 8
131 #define CONT_CMD_WRITE_EEPROM_RX 1
132 #define CONT_CMD_RESET_RX 3
133 
134 #define CONT_CMD_NOP 0xff
135 #define CONT_CMD_END 0xfe //indicates end of a command
136 #define CONT_CMD_EXE 1 //set pif ram status byte to this to do a command
137 
138 #define DIR_STATUS_EMPTY 0
139 #define DIR_STATUS_UNKNOWN 1
140 #define DIR_STATUS_OCCUPIED 2
141 
142 
143 typedef struct
144 {
145  /* 0x0 */ __OSInode inode;
146  /* 0x100 */ u8 bank;
147  /* 0x101 */ u8 map[256];
149 
150 extern s32 __osEepStatus(OSMesgQueue *, OSContStatus *);
151 u16 __osSumcalc(u8 *ptr, int length);
152 s32 __osIdCheckSum(u16 *ptr, u16 *csum, u16 *icsum);
153 s32 __osRepairPackId(OSPfs *pfs, __OSPackId *badid, __OSPackId *newid);
154 s32 __osCheckPackId(OSPfs *pfs, __OSPackId *temp);
155 s32 __osGetId(OSPfs *pfs);
156 s32 __osCheckId(OSPfs *pfs);
157 s32 __osPfsRWInode(OSPfs *pfs, __OSInode *inode, u8 flag, u8 bank);
158 s32 __osPfsSelectBank(OSPfs *pfs);
159 s32 __osPfsDeclearPage(OSPfs *pfs, __OSInode *inode, int file_size_in_pages, int *first_page, u8 bank, int *decleared, int *last_page);
160 s32 __osPfsReleasePages(OSPfs *pfs, __OSInode *inode, u8 start_page, u16 *sum, u8 bank, __OSInodeUnit *last_page, int flag);
161 s32 __osBlockSum(OSPfs *pfs, u8 page_no, u16 *sum, u8 bank);
162 s32 __osContRamRead(OSMesgQueue *mq, int channel, u16 address, u8 *buffer);
163 s32 __osContRamWrite(OSMesgQueue *mq, int channel, u16 address, u8 *buffer, int force);
164 void __osContGetInitData(u8 *pattern, OSContStatus *data);
165 void __osPackRequestData(u8 cmd);
166 void __osPfsRequestData(u8 cmd);
167 void __osPfsGetInitData(u8* pattern, OSContStatus* data);
169 u8 __osContDataCrc(u8 *data);
170 s32 __osPfsGetStatus(OSMesgQueue *queue, int channel);
171 
172 extern u8 _osLastSentSiCmd;
173 extern OSTimer __osEepromTimer;
174 extern OSMesg __osEepromTimerMsg;
175 extern OSMesgQueue __osEepromTimerQ;
176 extern OSPifRam __osEepPifRam;
177 extern OSPifRam __osContPifRam;
178 extern OSPifRam __osPfsPifRam;
180 
181 //some version of this almost certainly existed since there's plenty of times where it's used right before a return 0
182 #define ERRCK(fn) \
183  ret = fn; \
184  if (ret != 0) \
185  return ret;
186 
187 #define SET_ACTIVEBANK_TO_ZERO \
188  if (pfs->activebank != 0) \
189  { \
190  pfs->activebank = 0; \
191  ERRCK(__osPfsSelectBank(pfs)) \
192  }
193 
194 #define PFS_CHECK_ID \
195  if (__osCheckId(pfs) == PFS_ERR_NEW_PACK) \
196  return PFS_ERR_NEW_PACK;
197 #endif
198 
199 #define PFS_CHECK_STATUS \
200  if ((pfs->status & PFS_INITIALIZED) == 0) \
201  return PFS_ERR_INVALID;
202 
203 #define PFS_GET_STATUS \
204  __osSiGetAccess(); \
205  ret = __osPfsGetStatus(queue, channel); \
206  __osSiRelAccess(); \
207  if (ret != 0) \
208  return ret;
void __osPackRequestData(u8 cmd)
Definition: osContInit.c:66
s32 __osIdCheckSum(u16 *ptr, u16 *csum, u16 *icsum)
Definition: contpfs.c:19
OSPifRam __osPfsPifRam
Definition: osPfsIsPlug.c:6
OSMesgQueue __osEepromTimerQ
s32 __osPfsDeclearPage(OSPfs *pfs, __OSInode *inode, int file_size_in_pages, int *first_page, u8 bank, int *decleared, int *last_page)
Definition: osPfsAllocateFile.c:108
void __osContGetInitData(u8 *pattern, OSContStatus *data)
Definition: osContInit.c:46
u8 __osContDataCrc(u8 *data)
Definition: crc.c:23
s32 __osPfsGetStatus(OSMesgQueue *queue, int channel)
Definition: osPfsInit.c:27
s32 __osPfsSelectBank(OSPfs *pfs)
Definition: contpfs.c:286
s32 __osContRamRead(OSMesgQueue *mq, int channel, u16 address, u8 *buffer)
Definition: contramread.c:8
u8 __osContAddressCrc(u16 addr)
Definition: crc.c:3
OSPifRam __osContPifRam
OSTimer __osEepromTimer
u16 __osSumcalc(u8 *ptr, int length)
Definition: contpfs.c:4
s32 __osCheckId(OSPfs *pfs)
Definition: contpfs.c:198
s32 __osCheckPackId(OSPfs *pfs, __OSPackId *temp)
Definition: contpfs.c:114
s32 __osEepStatus(OSMesgQueue *, OSContStatus *)
s32 __osPfsReleasePages(OSPfs *pfs, __OSInode *inode, u8 start_page, u16 *sum, u8 bank, __OSInodeUnit *last_page, int flag)
Definition: osPfsDeleteFile.c:62
OSPifRam __osEepPifRam
Definition: osEepromWrite.c:4
void __osPfsRequestData(u8 cmd)
Definition: osPfsIsPlug.c:49
s32 __osPfsRWInode(OSPfs *pfs, __OSInode *inode, u8 flag, u8 bank)
Definition: contpfs.c:223
s32 __osGetId(OSPfs *pfs)
Definition: contpfs.c:149
void __osPfsGetInitData(u8 *pattern, OSContStatus *data)
Definition: osPfsIsPlug.c:78
u8 _osContNumControllers
Definition: osContInit.c:13
s32 __osContRamWrite(OSMesgQueue *mq, int channel, u16 address, u8 *buffer, int force)
Definition: contramwrite.c:8
s32 __osBlockSum(OSPfs *pfs, u8 page_no, u16 *sum, u8 bank)
Definition: osPfsDeleteFile.c:108
OSMesg __osEepromTimerMsg
s32 __osRepairPackId(OSPfs *pfs, __OSPackId *badid, __OSPackId *newid)
Definition: contpfs.c:37
u8 _osLastSentSiCmd
Definition: osContInit.c:12
unsigned long long int u64
Definition: llconv.c:2
#define PFS_FILE_EXT_LEN
Definition: os.h:415
#define EEPROM_BLOCK_SIZE
Definition: os.h:449
#define PFS_FILE_NAME_LEN
Definition: os.h:414
#define BLOCKSIZE
Definition: os.h:416
Definition: controller.h:12
u32 pifstatus
Definition: controller.h:14
Definition: os_time.h:10
Definition: controller.h:101
u8 address
Definition: controller.h:105
u8 txsize
Definition: controller.h:102
u8 cmd
Definition: controller.h:104
u8 rxsize
Definition: controller.h:103
Definition: controller.h:51
u8 txsize
Definition: controller.h:53
u8 dummy
Definition: controller.h:52
u8 rxsize
Definition: controller.h:54
u8 cmd
Definition: controller.h:55
u8 datacrc
Definition: controller.h:58
u16 address
Definition: controller.h:56
Definition: controller.h:18
u8 cmd
Definition: controller.h:22
u8 dummy
Definition: controller.h:19
u8 rxsize
Definition: controller.h:21
s8 stick_y
Definition: controller.h:25
s8 stick_x
Definition: controller.h:24
u16 button
Definition: controller.h:23
u8 txsize
Definition: controller.h:20
Definition: controller.h:41
u8 typel
Definition: controller.h:46
u8 status
Definition: controller.h:47
u8 typeh
Definition: controller.h:45
u8 txsize
Definition: controller.h:42
u8 rxsize
Definition: controller.h:43
u8 cmd
Definition: controller.h:44
Definition: controller.h:29
u8 txsize
Definition: controller.h:31
u8 cmd
Definition: controller.h:33
u8 typeh
Definition: controller.h:34
u8 status
Definition: controller.h:36
u8 dummy
Definition: controller.h:30
u8 rxsize
Definition: controller.h:32
u8 typel
Definition: controller.h:35
u8 dummy1
Definition: controller.h:37
Definition: controller.h:71
u8 status
Definition: controller.h:75
__OSInodeUnit start_page
Definition: controller.h:74
u16 company_code
Definition: controller.h:73
u16 data_sum
Definition: controller.h:77
u32 game_code
Definition: controller.h:72
s8 reserved
Definition: controller.h:76
Definition: controller.h:144
u8 bank
Definition: controller.h:146
__OSInode inode
Definition: controller.h:145
Definition: controller.h:83
Definition: controller.h:88
u8 banks
Definition: controller.h:94
u32 random
Definition: controller.h:90
u16 checksum
Definition: controller.h:96
u16 deviceid
Definition: controller.h:93
u8 version
Definition: controller.h:95
u32 repaired
Definition: controller.h:89
u16 inverted_checksum
Definition: controller.h:97
u64 serial_low
Definition: controller.h:92
u64 serial_mid
Definition: controller.h:91
signed int s32
Definition: ultratypes.h:15
unsigned int u32
Definition: ultratypes.h:16
signed char s8
Definition: ultratypes.h:11
unsigned short int u16
Definition: ultratypes.h:14
unsigned char u8
Definition: ultratypes.h:12
Definition: controller.h:61
u8 bank
Definition: controller.h:64
u8 page
Definition: controller.h:65
u16 ipage
Definition: controller.h:67