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