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