1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
#include "PRinternal/macros.h"
#include "PR/os_internal.h"
#include "PRinternal/controller.h"
#include "os_version.h"
s32 osGbpakReadId(OSPfs* pfs, OSGbpakId* id, u8* status) {
s32 i;
s32 ret;
u8 isum;
u8 buf[96];
#if BUILD_VERSION >= VERSION_K
u8 temp[32];
#endif
static u8 nintendo[] = { 0xCE, 0xED, 0x66, 0x66, 0xCC, 0x0D, 0x00, 0x0B, 0x03, 0x73, 0x00, 0x83,
0x00, 0x0C, 0x00, 0x0D, 0x00, 0x08, 0x11, 0x1F, 0x88, 0x89, 0x00, 0x0E,
0xDC, 0xCC, 0x6E, 0xE6, 0xDD, 0xDD, 0xD9, 0x99, 0xBB, 0xBB, 0x67, 0x63,
0x6E, 0x0E, 0xEC, 0xCC, 0xDD, 0xDC, 0x99, 0x9F, 0xBB, 0xB9, 0x33, 0x3E };
static u8 mmc_type[] = { 0x00, 0x01, 0x01, 0x01, 0xFF, 0x02, 0x02, 0xFF, 0x00, 0x00,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x03, 0x03, 0x03, 0x03, 0x03 };
ret = osGbpakGetStatus(pfs, status);
if (ret == PFS_ERR_NEW_GBCART) {
ret = osGbpakGetStatus(pfs, status);
}
if (ret == PFS_ERR_NEW_GBCART) {
return PFS_ERR_CONTRFAIL;
} else if (ret == 0) {
if (!(*status & OS_GBPAK_POWER)) {
ERRCK(osGbpakPower(pfs, OS_GBPAK_POWER_ON));
}
ERRCK(osGbpakReadWrite(pfs, OS_READ, 0x100U, buf, ARRLEN(buf)));
ret = osGbpakGetStatus(pfs, status);
if (ret == PFS_ERR_NEW_GBCART) {
ret = PFS_ERR_CONTRFAIL;
}
if (ret != 0) {
return ret;
}
if (!(*status & OS_GBPAK_RSTB_STATUS)) {
return PFS_ERR_CONTRFAIL;
}
#if BUILD_VERSION >= VERSION_K
if (bcmp(nintendo, buf + 4, ARRLEN(nintendo))) {
for (i = 0; i < ARRLEN(temp); temp[i++] = 0) {
;
}
ERRCK(osGbpakReadWrite(pfs, OS_WRITE, 0x6000U, temp, ARRLEN(temp)));
ret = osGbpakReadWrite(pfs, OS_READ, 0x100U, buf, ARRLEN(buf));
ERRCK(osGbpakReadWrite(pfs, OS_READ, 0x100U, buf, ARRLEN(buf)));
ret = osGbpakGetStatus(pfs, status);
if (ret == PFS_ERR_NEW_GBCART) {
ret = PFS_ERR_CONTRFAIL;
}
if (ret != 0) {
return ret;
}
if (bcmp(nintendo, buf + 4, ARRLEN(nintendo))) {
return 4;
}
}
#else
if (bcmp(nintendo, buf + 4, ARRLEN(nintendo))) {
return 4;
}
#endif
for (i = 0x34, isum = 0; i < 0x4E; i++) {
isum += buf[i];
}
if ((isum + 0x19) & 0xFF) {
return 4;
}
bcopy(buf, id, 0x50);
if (id->cart_type < 0x14) {
pfs->version = (int)mmc_type[id->cart_type];
}
pfs->dir_size = (int)id->ram_size;
}
return ret;
}
|