PS2SDK
PS2 Homebrew Libraries
Loading...
Searching...
No Matches
mcman-internal.h
1/*
2# _____ ___ ____ ___ ____
3# ____| | ____| | | |____|
4# | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5#-----------------------------------------------------------------------
6# Copyright (c) 2009 jimmikaelkael
7# Licenced under Academic Free License version 2.0
8# Review ps2sdk README & LICENSE files for further details.
9*/
10
11#ifndef __MCMAN_INTERNAL_H__
12#define __MCMAN_INTERNAL_H__
13
14#ifndef MCMAN_ENABLE_EXTENDED_DEV_OPS
15#if defined(BUILDING_VMCMAN)
16#define MCMAN_ENABLE_EXTENDED_DEV_OPS 1
17#else
18#define MCMAN_ENABLE_EXTENDED_DEV_OPS 0
19#endif
20#endif
21
22#include <loadcore.h>
23#include <intrman.h>
24#include <sysclib.h>
25#include <thbase.h>
26#include <thsemap.h>
27#if !defined(BUILDING_XFROMMAN) && !defined(BUILDING_VMCMAN)
28#include <timrman.h>
29#include <modload.h>
30#include <secrman.h>
31#endif
32#if MCMAN_ENABLE_EXTENDED_DEV_OPS
33#include <iomanX.h>
34#else
35#include <ioman.h>
36#endif
37#ifdef _IOP
38#include <cdvdman.h>
39#else
40#include <time.h>
41#endif
42#include <stdio.h>
43#include <errno.h>
44#ifndef BUILDING_VMCMAN
45#ifdef BUILDING_XFROMMAN
46#include <fls.h>
47#else
48#ifdef BUILDING_XMCMAN
49#ifndef SIO2MAN_V2
50#include <xsio2man.h>
51#else
52#include <rsio2man.h>
53#endif
54#else
55#include <sio2man.h>
56#endif
57#endif
58#endif
59
60#if !defined(BUILDING_XFROMMAN) && !defined(BUILDING_VMCMAN)
61#define MODNAME "mcman_cex"
62#elif defined(BUILDING_VMCMAN)
63#define MODNAME "vmcman"
64#elif defined(BUILDING_XFROMMAN)
65#define MODNAME "xfromman"
66#elif defined(BUILDING_DONGLEMAN)
67#define MODNAME "dongleman"
68#endif
69#define MODVER 0x20b
70
71#ifndef MCMAN_ENTRYPOINT
72#ifdef _IOP
73#define MCMAN_ENTRYPOINT _start
74#else
75#define MCMAN_ENTRYPOINT mcman_start
76#endif
77#endif
78
79#ifdef SIO_DEBUG
80 #include <sior.h>
81 #define DEBUG
82 #define DPRINTF(format, args...) \
83 sio_printf(MODNAME ": " format, ##args)
84#else
85 #ifdef DEBUG
86 #define DPRINTF(format, args...) \
87 printf(MODNAME ": " format, ##args)
88 #else
89 #define DPRINTF(format, args...)
90 #endif
91#endif
92
93typedef struct _MCCacheDir {
94 int cluster; // 0
95 int fsindex; // 4
96 int maxent; // 8
97 u32 unused;
99
100// Card Flags
101#define CF_USE_ECC 0x01
102#define CF_BAD_BLOCK 0x08
103#define CF_ERASE_ZEROES 0x10
104
105#ifdef BUILDING_VMCMAN
106#define MCMAN_MAXSLOT 10
107#else
108#define MCMAN_MAXSLOT 4
109#endif
110#define MCMAN_CLUSTERSIZE 1024
111#define MCMAN_CLUSTERFATENTRIES 256
112
113typedef struct _McFatCluster {
114 int entry[MCMAN_CLUSTERFATENTRIES];
116
117#define MAX_CACHEENTRY 0x24
118
119typedef struct {
120 int entry[1 + (MCMAN_CLUSTERFATENTRIES * 2)];
121} McFatCache;
122
123#define MAX_CACHEDIRENTRY 0x3
124
125typedef struct { // size = 48
126 u8 status; // 0
127 u8 wrflag; // 1
128 u8 rdflag; // 2
129 u8 unknown1; // 3
130 u8 drdflag; // 4
131 u8 unknown2; // 5
132 u16 port; // 6
133 u16 slot; // 8
134 u16 unknown3; // 10
135 u32 position; // 12
136 u32 filesize; // 16
137 u32 freeclink; // 20 link to next free cluster
138 u32 clink; // 24 link to next cluster
139 u32 clust_offset;// 28
140 u32 cluster; // 32
141 u32 fsindex; // 36
142 u32 parent_cluster; // 40
143 u32 parent_fsindex; // 44
144} MC_FHANDLE;
145
146#define MAX_FDHANDLES 3
147
148#if MCMAN_ENABLE_EXTENDED_DEV_OPS
149#define MC_IO_DEV_T iomanX_iop_device_t
150#define MC_IO_FIL_T iomanX_iop_file_t
151#define MC_IO_DRE_T iox_dirent_t
152#define MC_IO_STA_T iox_stat_t
153#define MC_IO_OPS_T iomanX_iop_device_ops_t
154
155// FIXME: The r/w/x flag order is opposite from iomanX
156#define MC_IO_S_RD (FIO_S_IRUSR | FIO_S_IRGRP | FIO_S_IROTH)
157#define MC_IO_S_WR (FIO_S_IWUSR | FIO_S_IWGRP | FIO_S_IWOTH)
158#define MC_IO_S_EX (FIO_S_IXUSR | FIO_S_IXGRP | FIO_S_IXOTH)
159#define MC_IO_S_FL FIO_S_IFREG
160#define MC_IO_S_DR FIO_S_IFDIR
161
162#define MC_IO_CST_ATTR FIO_CST_ATTR
163#define MC_IO_CST_MODE FIO_CST_MODE
164#define MC_IO_CST_CT FIO_CST_CT
165#define MC_IO_CST_MT FIO_CST_MT
166#else
167#define MC_IO_DEV_T iop_device_t
168#define MC_IO_FIL_T iop_file_t
169#define MC_IO_DRE_T io_dirent_t
170#define MC_IO_STA_T io_stat_t
171#define MC_IO_OPS_T iop_device_ops_t
172
173#define MC_IO_S_RD SCE_STM_R
174#define MC_IO_S_WR SCE_STM_W
175#define MC_IO_S_EX SCE_STM_X
176#define MC_IO_S_FL SCE_STM_F
177#define MC_IO_S_DR SCE_STM_D
178
179#define MC_IO_CST_ATTR SCE_CST_ATTR
180#define MC_IO_CST_MODE SCE_CST_MODE
181#define MC_IO_CST_CT SCE_CST_CT
182#define MC_IO_CST_MT SCE_CST_MT
183#endif
184
185// internal functions prototypes
186#if !defined(BUILDING_XFROMMAN) && !defined(BUILDING_VMCMAN)
187extern int mcsio2_transfer(int port, int slot, sio2_transfer_data_t *sio2data);
188#endif
189extern void long_multiply(u32 v1, u32 v2, u32 *HI, u32 *LO);
190extern int mcman_chrpos(const char *str, int chr);
191extern void mcman_wmemset(void *buf, int size, int value);
192extern int mcman_calcEDC(void *buf, int size);
193extern int mcman_checkpath(const char *str);
194extern int mcman_checkdirpath(const char *str1, const char *str2);
195extern void mcman_invhandles(int port, int slot);
196extern int McCloseAll(void);
197extern int mcman_detectcard(int port, int slot);
198extern int mcman_dread(int fd, MC_IO_DRE_T *dirent);
199extern int mcman_getstat(int port, int slot, const char *filename, MC_IO_STA_T *stat);
200extern int mcman_getmcrtime(sceMcStDateTime *tm);
201extern void mcman_initPS2com(void);
202extern void mcman_deinitPS2com(void);
203#if !defined(BUILDING_XFROMMAN) && !defined(BUILDING_VMCMAN)
204extern void sio2packet_add(int port, int slot, int cmd, u8 *buf);
205#endif
206extern int mcman_eraseblock(int port, int slot, int block, void **pagebuf, void *eccbuf);
207extern int mcman_readpage(int port, int slot, int page, void *buf, void *eccbuf);
208extern int mcman_cardchanged(int port, int slot);
209extern int mcman_resetauth(int port, int slot);
210extern int mcman_probePS2Card2(int port, int slot);
211extern int mcman_probePS2Card(int port, int slot);
212#if !defined(BUILDING_XFROMMAN) && !defined(BUILDING_VMCMAN)
213extern int secrman_mc_command(int port, int slot, sio2_transfer_data_t *sio2data);
214#endif
215extern int mcman_getcnum (int port, int slot);
216extern int mcman_correctdata(void *buf, void *ecc);
217extern int mcman_sparesize(int port, int slot);
218extern int mcman_setdevspec(int port, int slot);
219extern int mcman_reportBadBlocks(int port, int slot);
220extern int mcman_setdevinfos(int port, int slot);
221extern int mcman_format2(int port, int slot);
222extern int mcman_fatRseek(int fd);
223extern int mcman_fatWseek(int fd);
224extern int mcman_findfree2(int port, int slot, int reserve);
225extern int mcman_dread2(int fd, MC_IO_DRE_T *dirent);
226extern int mcman_getstat2(int port, int slot, const char *filename, MC_IO_STA_T *stat);
227extern int mcman_setinfo2(int port, int slot, const char *filename, sceMcTblGetDir *info, int flags);
228extern int mcman_read2(int fd, void *buffer, int nbyte);
229extern int mcman_write2(int fd, void *buffer, int nbyte);
230extern int mcman_close2(int fd);
231extern int mcman_getentspace(int port, int slot, const char *dirname);
232extern int mcman_cachedirentry(int port, int slot, const char *filename, McCacheDir *pcacheDir, McFsEntry **pfse, int unknown_flag);
233extern int mcman_getdirinfo(int port, int slot, McFsEntry *pfse, const char *filename, McCacheDir *pcd, int unknown_flag);
234extern int mcman_open2(int port, int slot, const char *filename, int flags);
235extern int mcman_chdir(int port, int slot, const char *newdir, char *currentdir);
236extern int mcman_writecluster(int port, int slot, int cluster, int flag);
237extern int mcman_getdir2(int port, int slot, const char *dirname, int flags, int maxent, sceMcTblGetDir *info);
238extern int mcman_delete2(int port, int slot, const char *filename, int flags);
239extern int mcman_checkBackupBlocks(int port, int slot);
240extern int mcman_unformat2(int port, int slot);
241extern void mcman_initPS1PDAcom(void);
242extern void mcman_deinitPS1PDAcom(void);
243extern int mcman_probePS1Card2(int port, int slot);
244extern int mcman_probePS1Card(int port, int slot);
245extern int mcman_probePDACard(int port, int slot);
246extern int mcman_setPS1devinfos(int port, int slot);
247extern int mcman_format1(int port, int slot);
248extern int mcman_open1(int port, int slot, const char *filename, int flags);
249extern int mcman_read1(int fd, void *buffer, int nbyte);
250extern int mcman_write1(int fd, void *buffer, int nbyte);
251extern int mcman_getPS1direntry(int port, int slot, const char *filename, McFsEntryPS1 **pfse, int flag);
252extern int mcman_dread1(int fd, MC_IO_DRE_T *dirent);
253extern int mcman_getstat1(int port, int slot, const char *filename, MC_IO_STA_T *stat);
254extern int mcman_setinfo1(int port, int slot, const char *filename, sceMcTblGetDir *info, int flags);
255extern int mcman_getdir1(int port, int slot, const char *dirname, int flags, int maxent, sceMcTblGetDir *info);
256extern int mcman_clearPS1direntry(int port, int slot, int cluster, int flags);
257extern int mcman_delete1(int port, int slot, const char *filename, int flags);
258extern int mcman_close1(int fd);
259extern int mcman_findfree1(int port, int slot, int reserve);
260extern int mcman_fatRseekPS1(int fd);
261extern int mcman_fatWseekPS1(int fd);
262extern int mcman_FNC8ca4(int port, int slot, MC_FHANDLE *fh);
263extern int mcman_PS1pagetest(int port, int slot, int page);
264extern int mcman_unformat1(int port, int slot);
265extern int mcman_cachePS1dirs(int port, int slot);
266extern int mcman_fillPS1backuparea(int port, int slot, int block);
267extern void mcman_initcache(void);
268extern int mcman_clearcache(int port, int slot);
269extern McCacheEntry *mcman_getcacheentry(int port, int slot, int cluster);
270extern void mcman_freecluster(int port, int slot, int cluster);
271extern int mcman_getFATindex(int port, int slot, int num);
272extern McCacheEntry *mcman_get1stcacheEntp(void);
273extern void mcman_addcacheentry(McCacheEntry *mce);
274extern int mcman_flushcacheentry(McCacheEntry *mce);
275extern int mcman_readdirentryPS1(int port, int slot, int cluster, McFsEntryPS1 **pfse);
276extern int mcman_readclusterPS1(int port, int slot, int cluster, McCacheEntry **pmce);
277extern int mcman_replaceBackupBlock(int port, int slot, int block);
278extern int mcman_fillbackupblock1(int port, int slot, int block, void **pagedata, void *eccdata);
279extern int mcman_clearsuperblock(int port, int slot);
280extern int mcman_ioerrcode(int errcode);
281extern int mcman_modloadcb(const char *filename, int *port, int *slot); // used as callback by modload
282extern void mcman_unit2card(u32 unit);
283extern int mcman_initdev(void);
284extern void mcman_deinitdev(void);
285
286#if defined(BUILDING_VMCMAN)
287extern int mcman_iomanx_backing_mount(int port, int slot, const char *filename);
288extern int mcman_iomanx_backing_umount(int port, int slot);
289extern int mcman_iomanx_backing_getcardspec(int port, int slot, s16 *pagesize, u16 *blocksize, int *cardsize, u8 *flags);
290extern int mcman_iomanx_backing_erase(int port, int slot, int page);
291extern int mcman_iomanx_backing_write(int port, int slot, int page, void *pagebuf, void *eccbuf);
292extern int mcman_iomanx_backing_read(int port, int slot, int page, void *pagebuf, void *eccbuf);
293#endif
294
295typedef struct { // size = 384
296 char magic[28]; // Superblock magic, on PS2 MC : "Sony PS2 Memory Card Format "
297 u8 version[12]; // Version number of the format used, 1.2 indicates full support for bad_block_list
298 s16 pagesize; // size in bytes of a memory card page
299 u16 pages_per_cluster; // number of pages in a cluster
300 u16 blocksize; // number of pages in an erase block
301 u16 unused; // unused
302 u32 clusters_per_card; // total size in clusters of the memory card
303 u32 alloc_offset; // Cluster offset of the first allocatable cluster. Cluster values in the FAT and directory entries are relative to this. This is the cluster immediately after the FAT
304 u32 alloc_end; // The cluster after the highest allocatable cluster. Relative to alloc_offset. Not used
305 u32 rootdir_cluster; // First cluster of the root directory. Relative to alloc_offset. Must be zero
306 u32 backup_block1; // Erase block used as a backup area during programming. Normally the the last block on the card, it may have a different value if that block was found to be bad
307 u32 backup_block2; // This block should be erased to all ones. Normally the the second last block on the card
308 u8 unused2[8];
309 u32 ifc_list[32]; // List of indirect FAT clusters. On a standard 8M card there's only one indirect FAT cluster
310 int bad_block_list[32]; // List of erase blocks that have errors and shouldn't be used
311 u8 cardtype; // Memory card type. Must be 2, indicating that this is a PS2 memory card
312 u8 cardflags; // Physical characteristics of the memory card
313 u16 unused3;
314 u32 cluster_size;
315 u32 FATentries_per_cluster;
316 u32 clusters_per_block;
317 int cardform;
318 u32 rootdir_cluster2;
319 u32 unknown1;
320 u32 unknown2;
321 u32 max_allocatable_clusters;
322 u32 unknown3;
323 u32 unknown4;
324 int unknown5;
325} MCDevInfo;
326
328 u32 word[1056/sizeof(u32)];
329 u8 byte[1056/sizeof(u8)];
330 char magic[1056/sizeof(char)];
331};
332
334 u32 word[128/sizeof(u32)];
335 u16 half[128/sizeof(u16)];
336 u8 byte[128/sizeof(u8)];
337};
338
339// Defined in main.c
340
341extern char SUPERBLOCK_MAGIC[];
342extern char SUPERBLOCK_VERSION[];
343
344extern int mcman_wr_port;
345extern int mcman_wr_slot;
346extern int mcman_wr_block;
347extern int mcman_wr_flag3;
348extern int mcman_curdircluster;
349
350extern union mcman_pagebuf mcman_pagebuf;
352
353#ifndef BUILDING_XFROMMAN
354extern int timer_ID;
355#endif
356extern int PS1CardFlag;
357
358extern McFsEntry mcman_dircache[MAX_CACHEDIRENTRY];
359
360extern MC_FHANDLE mcman_fdhandles[MAX_FDHANDLES];
361extern MCDevInfo mcman_devinfos[4][MCMAN_MAXSLOT];
362
363extern u8 mcman_eccdata[512]; // size for 32 ecc
364
365// Defined in mcsio2.c
366extern u8 mcman_sio2outbufs_PS1PDA[0x90];
367
368#ifdef BUILDING_DONGLEMAN
369extern int sema_hakama_id;
371#define HAKAMA_SIGNALSEMA() //SignalSema(sema_hakama_id)
372#define HAKAMA_WAITSEMA() //WaitSema(sema_hakama_id)
373#else
374#define HAKAMA_SIGNALSEMA() //while(0) {} /* SignalSema wrapper for an additional semaphore used by arcade MCMAN */
375#define HAKAMA_WAITSEMA() //while(0) {} /* WaitSema wrapper for an additional semaphore used by arcade MCMAN */
376#endif
377
378#endif // __MCMAN_INTERNAL_H__
unsigned int version
Definition fileXio.h:3