sdk-world
v2026.11.05
PS2 SDK - world tier (copyleft-allowed, non-essential packages)
Toggle main menu visibility
Loading...
Searching...
No Matches
mmceman.c
1
#include <intrman.h>
2
#include <stdio.h>
3
#include <string.h>
4
#include <sysclib.h>
5
6
#include "
ioplib.h
"
7
#include "irx_imports.h"
8
9
#include "
sio2man_hook.h
"
10
#include "
mmce_sio2.h
"
11
#include "
mmce_cmds.h
"
12
#include "
mmce_fs.h
"
13
14
#include "
module_debug.h
"
15
16
#define MAJOR 2
17
#define MINOR 1
18
19
const
char
*mmce_product_ids[] = {
"Unknown"
,
"SD2PSX"
,
"MemCard PRO2"
,
"PicoMemcard+"
,
"PicoMemcardZero"
};
20
21
IRX_ID(
"mmceman"
, MAJOR, MINOR);
22
23
static
void
mmce_init(
int
port)
24
{
25
int
res = -1;
26
int
id
= 0;
27
28
mmce_sio2_set_port(port);
29
30
for
(
int
i = 0; i < 6; i++) {
31
res = mmce_cmd_ping();
32
if
(res != -1) {
33
DPRINTF(
"Found card in port %i\n"
, port);
34
35
id
= (res & 0xFF00) >> 8;
36
if
(
id
< 5) {
37
DPRINTF(
"Product ID: %i (%s)\n"
,
id
, mmce_product_ids[
id
]);
38
}
else
{
39
DPRINTF(
"Unknown Product ID: %i\n"
,
id
);
40
}
41
42
DPRINTF(
"Revision ID: %i\n"
, (res & 0xFF));
43
DPRINTF(
"Protocol Version: %i\n"
, (res & 0xFF0000) >> 16);
44
45
DPRINTF(
"Resetting MMCE FS..."
);
46
res = mmce_cmd_reset();
47
if
(res != 0)
48
DPRINTF(
"Failed: %i\n"
, res);
49
else
50
DPRINTF(
"Okay\n"
);
51
52
break
;
53
}
54
}
55
}
56
57
int
__start(
int
argc,
char
*argv[])
58
{
59
int
rv;
60
61
printf(
"Multipurpose Memory Card Emulator Manager (MMCEMAN) v%d.%d by the MMCE team\n"
, MAJOR, MINOR);
62
63
//Install hooks
64
rv = mmce_sio2_init();
65
if
(rv != 0) {
66
DPRINTF(
"%s: mmce_sio2_init failed, rv %i\n"
, __func__, rv);
67
return
MODULE_NO_RESIDENT_END;
68
}
69
70
//Try to init MMCE's on both ports
71
mmce_init(2);
72
mmce_init(3);
73
74
//Attach filesystem to iomanX
75
mmce_fs_register();
76
77
iop_library_t * lib_modload =
ioplib_getByName
(
"modload"
);
78
if
(lib_modload != NULL) {
79
DPRINTF(
"modload 0x%x detected\n"
, lib_modload->version);
80
if
(lib_modload->version > 0x102)
//IOP is running a MODLOAD version which supports unloading IRX Modules
81
return
MODULE_REMOVABLE_END;
// and we do support getting unloaded...
82
}
else
{
83
DPRINTF(
"modload not detected! this is serious!\n"
);
84
}
85
86
return
MODULE_RESIDENT_END;
87
}
88
89
int
__stop(
int
argc,
char
*argv[])
90
{
91
DPRINTF(
"Unloading module\n"
);
92
93
mmce_fs_unregister();
94
mmce_sio2_deinit();
95
96
return
MODULE_NO_RESIDENT_END;
97
}
98
99
int
_start(
int
argc,
char
*argv[])
100
{
101
if
(argc >= 0)
102
return
__start(argc, argv);
103
else
104
return
__stop(-argc, argv);
105
}
ioplib.h
ioplib_getByName
iop_library_t * ioplib_getByName(const char *name)
get library object of any IRX Module
Definition
ioplib.c:17
mmce_cmds.h
mmce_fs.h
mmce_sio2.h
module_debug.h
sio2man_hook.h
mmceman
src
mmceman.c
Generated by
1.18.0