Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
MorsGames
GitHub Repository: MorsGames/sm64plus
Path: blob/master/lib/src/controller.h
7857 views
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;
26
} __OSContReadFormat;
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;
38
} __OSContRequesFormat;
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;
48
} __OSContRequesFormatShort;
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;
59
} __OSContRamReadFormat;
60
61
typedef union {
62
/* 0x0 */ struct
63
{
64
/* 0x0 */ u8 bank;
65
/* 0x1 */ u8 page;
66
} inode_t;
67
/* 0x0 */ u16 ipage;
68
} __OSInodeUnit;
69
70
typedef struct
71
{
72
/* 0x0 */ u32 game_code;
73
/* 0x4 */ u16 company_code;
74
/* 0x6 */ __OSInodeUnit start_page;
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];
107
} __OSContEepromFormat;
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];
148
} __OSInodeCache;
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);
168
u8 __osContAddressCrc(u16 addr);
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;
179
extern u8 _osContNumControllers;
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;
209
210