11#define SIO2MAN_EXPORTS_IMPLEMENTATION
13#include "mcman-internal.h"
20IRX_ID(MODNAME, 2, 11);
22char SUPERBLOCK_MAGIC[] =
"Sony PS2 Memory Card Format ";
23char SUPERBLOCK_VERSION[] =
"1.2.0.0";
25int mcman_wr_port = -1;
26int mcman_wr_slot = -1;
27int mcman_wr_block = -1;
28int mcman_wr_flag3 = -10;
29int mcman_curdircluster = -1;
31#if !defined(BUILDING_XFROMMAN) && !defined(BUILDING_VMCMAN)
39#if !defined(BUILDING_XFROMMAN) && !defined(BUILDING_VMCMAN)
41#elif defined(BUILDING_XFROMMAN)
45static u8 mcman_cachebuf[MAX_CACHEENTRY * MCMAN_CLUSTERSIZE];
52static void *mcman_pagedata[32];
53static u8 mcman_backupbuf[16384];
55static int mcman_badblock_port;
56static int mcman_badblock_slot;
57static int mcman_badblock;
58static int mcman_replacementcluster[16];
60static McFatCache mcman_fatcache[2][MCMAN_MAXSLOT];
61McFsEntry mcman_dircache[MAX_CACHEDIRENTRY];
64MCDevInfo mcman_devinfos[4][MCMAN_MAXSLOT];
70static const u8 mcman_xortable[256] = {
71 0x00, 0x87, 0x96, 0x11, 0xA5, 0x22, 0x33, 0xB4,
72 0xB4, 0x33, 0x22, 0xA5, 0x11, 0x96, 0x87, 0x00,
73 0xC3, 0x44, 0x55, 0xD2, 0x66, 0xE1, 0xF0, 0x77,
74 0x77, 0xF0, 0xE1, 0x66, 0xD2, 0x55, 0x44, 0xC3,
75 0xD2, 0x55, 0x44, 0xC3, 0x77, 0xF0, 0xE1, 0x66,
76 0x66, 0xE1, 0xF0, 0x77, 0xC3, 0x44, 0x55, 0xD2,
77 0x11, 0x96, 0x87, 0x00, 0xB4, 0x33, 0x22, 0xA5,
78 0xA5, 0x22, 0x33, 0xB4, 0x00, 0x87, 0x96, 0x11,
79 0xE1, 0x66, 0x77, 0xF0, 0x44, 0xC3, 0xD2, 0x55,
80 0x55, 0xD2, 0xC3, 0x44, 0xF0, 0x77, 0x66, 0xE1,
81 0x22, 0xA5, 0xB4, 0x33, 0x87, 0x00, 0x11, 0x96,
82 0x96, 0x11, 0x00, 0x87, 0x33, 0xB4, 0xA5, 0x22,
83 0x33, 0xB4, 0xA5, 0x22, 0x96, 0x11, 0x00, 0x87,
84 0x87, 0x00, 0x11, 0x96, 0x22, 0xA5, 0xB4, 0x33,
85 0xF0, 0x77, 0x66, 0xE1, 0x55, 0xD2, 0xC3, 0x44,
86 0x44, 0xC3, 0xD2, 0x55, 0xE1, 0x66, 0x77, 0xF0,
87 0xF0, 0x77, 0x66, 0xE1, 0x55, 0xD2, 0xC3, 0x44,
88 0x44, 0xC3, 0xD2, 0x55, 0xE1, 0x66, 0x77, 0xF0,
89 0x33, 0xB4, 0xA5, 0x22, 0x96, 0x11, 0x00, 0x87,
90 0x87, 0x00, 0x11, 0x96, 0x22, 0xA5, 0xB4, 0x33,
91 0x22, 0xA5, 0xB4, 0x33, 0x87, 0x00, 0x11, 0x96,
92 0x96, 0x11, 0x00, 0x87, 0x33, 0xB4, 0xA5, 0x22,
93 0xE1, 0x66, 0x77, 0xF0, 0x44, 0xC3, 0xD2, 0x55,
94 0x55, 0xD2, 0xC3, 0x44, 0xF0, 0x77, 0x66, 0xE1,
95 0x11, 0x96, 0x87, 0x00, 0xB4, 0x33, 0x22, 0xA5,
96 0xA5, 0x22, 0x33, 0xB4, 0x00, 0x87, 0x96, 0x11,
97 0xD2, 0x55, 0x44, 0xC3, 0x77, 0xF0, 0xE1, 0x66,
98 0x66, 0xE1, 0xF0, 0x77, 0xC3, 0x44, 0x55, 0xD2,
99 0xC3, 0x44, 0x55, 0xD2, 0x66, 0xE1, 0xF0, 0x77,
100 0x77, 0xF0, 0xE1, 0x66, 0xD2, 0x55, 0x44, 0xC3,
101 0x00, 0x87, 0x96, 0x11, 0xA5, 0x22, 0x33, 0xB4,
102 0xB4, 0x33, 0x22, 0xA5, 0x11, 0x96, 0x87, 0x00
106#ifdef BUILDING_DONGLEMAN
107int sema_hakama_id = 0;
111void long_multiply(u32 v1, u32 v2, u32 *HI, u32 *LO)
113 register long a, b, c, d;
116 a = (v1 >> 16) & 0xffff;
118 c = (v2 >> 16) & 0xffff;
123 y = ((*LO >> 16) & 0xffff) + x;
125 *LO = (*LO & 0xffff) | ((y & 0xffff) << 16);
126 *HI = (y >> 16) & 0xffff;
132int mcman_chrpos(
const char *str,
int chr)
139 if (*p == (chr & 0xff))
144 if (*p != (chr & 0xff))
151int MCMAN_ENTRYPOINT(
int argc,
char *argv[],
void *startaddr,
ModuleInfo_t *mi)
153int MCMAN_ENTRYPOINT(
int argc,
char *argv[])
161 sio_init(38400, 0, 0, 0, 0);
163 DPRINTF(
"_start...\n");
165#if !defined(BUILDING_XFROMMAN) && !defined(BUILDING_VMCMAN)
166 export_tbl = &_exp_mcman;
167#elif defined(BUILDING_XFROMMAN)
168 export_tbl = &_exp_xfromman;
181 if (export_tbl != NULL)
184 release_res = ReleaseLibraryEntries(export_tbl);
187 if (release_res == 0 || release_res == -213)
191 mcman_deinitPS2com();
192 mcman_deinitPS1PDAcom();
193 return MODULE_NO_RESIDENT_END;
195 return MODULE_REMOVABLE_END;
199 DPRINTF(
"registering exports...\n");
201 if (export_tbl != NULL)
203 if (RegisterLibraryEntries(export_tbl) != 0)
204 return MODULE_NO_RESIDENT_END;
211 DPRINTF(
"initPS2com...\n");
214 DPRINTF(
"initPS1PDAcom...\n");
215 mcman_initPS1PDAcom();
217 DPRINTF(
"initcache...\n");
220 DPRINTF(
"initdev...\n");
223#if !defined(BUILDING_XFROMMAN) && !defined(BUILDING_VMCMAN)
224 timer_ID = ReferHardTimer(1, 32, 0, 0x6309);
226 if (timer_ID != -150)
227 return MODULE_RESIDENT_END;
229 timer_ID = AllocHardTimer(1, 32, 1);
232 SetTimerMode(timer_ID, 0);
235 DPRINTF(
"_start returns MODULE_RESIDENT_END...\n");
238 if (mi && ((mi->
newflags & 2) != 0))
241 return MODULE_RESIDENT_END;
245int McGetFormat(
int port,
int slot)
247 DPRINTF(
"McGetFormat port%d slot%d\n", port, slot);
248 return mcman_devinfos[port][slot].cardform;
252int McGetMcType(
int port,
int slot)
254 DPRINTF(
"McGetMcType port%d slot%d\n", port, slot);
255 return mcman_devinfos[port][slot].cardtype;
260struct irx_id *McGetModuleInfo(
void)
262 DPRINTF(
"McGetModuleInfo\n");
268void McSetPS1CardFlag(
int flag)
270 DPRINTF(
"McSetPS1CardFlag flag %x\n", flag);
275int McGetFreeClusters(
int port,
int slot)
277 register int r, mcfree;
278 register MCDevInfo *mcdi = &mcman_devinfos[port][slot];
280 DPRINTF(
"McGetFreeClusters port%d slot%d\n", port, slot);
283 if (mcdi->cardform > 0) {
284 switch (mcdi->cardtype) {
286 mcfree = mcman_findfree2(port, slot, 0);
290 mcfree = mcman_findfree1(port, slot, 0);
292 case sceMcTypeNoCard:
296 if (mcfree == sceMcResFullDevice)
308void mcman_wmemset(
void *buf,
int size,
int value)
311 size = (size >> 2) - 1;
316 }
while (--size > -1);
321int mcman_calcEDC(
void *buf,
int size)
323 register u32 checksum;
333 while (size-- != -1) {
338 return checksum & 0xff;
342int mcman_checkpath(
const char *str)
349 if (((p[i] & 0xff) ==
'?') || ((p[i] & 0xff) ==
'*'))
351 if ((p[i] & 0xff) < 32)
359int mcman_checkdirpath(
const char *str1,
const char *str2)
362 const char *p1 = str1;
363 const char *p2 = str2;
366 register int pos1, pos2;
367 pos1 = mcman_chrpos(p2,
'?');
368 pos2 = mcman_chrpos(p2,
'*');
370 if ((pos1 < 0) && (pos2 < 0)) {
385 if (strncmp(p2, p1, pos) != 0)
391 while (p2[0] ==
'?') {
397 }
while (p2[0] !=
'*');
399 while((p2[0] ==
'*') || (p2[0] ==
'?'))
405 pos = mcman_chrpos(p1, (u8)p2[0]);
409 r = mcman_checkdirpath(p1, p2);
417void mcman_invhandles(
int port,
int slot)
423 if ((fh->port == port) && (fh->slot == slot))
426 }
while (++i < MAX_FDHANDLES);
432 register int fd = 0, rv = 0;
435 if (mcman_fdhandles[fd].status) {
444 }
while (fd < MAX_FDHANDLES);
450int McDetectCard(
int port,
int slot)
452#ifdef BUILDING_XMCMAN
453 return mcman_detectcard(port, slot);
455 return McDetectCard2(port, slot);
460int mcman_detectcard(
int port,
int slot)
465 DPRINTF(
"mcman_detectcard port%d slot%d\n", port, slot);
466 mcdi = (
MCDevInfo *)&mcman_devinfos[port][slot];
468#if !defined(BUILDING_XFROMMAN) && !defined(BUILDING_VMCMAN)
469 if ((mcdi->cardtype == sceMcTypeNoCard) || (mcdi->cardtype == sceMcTypePS2)) {
470 r = mcman_probePS2Card2(port, slot);
472 r = mcman_probePS1Card2(port, slot);
474 if (mcman_probePDACard(port, slot)) {
475 mcdi->cardtype = sceMcTypePS1;
476 return (!PS1CardFlag) ? sceMcResDeniedPS1Permit : r;
479 mcdi->cardtype = sceMcTypePDA;
485 mcdi->cardtype = sceMcTypePS2;
490 r = mcman_probePS1Card2(port, slot);
492 if ((r < -9) || (r >= 0)) {
493 r = mcman_probePS2Card2(port, slot);
495 mcdi->cardtype = sceMcTypePS2;
500 if (mcman_probePDACard(port, slot)) {
501 mcdi->cardtype = sceMcTypePS1;
502 return (!PS1CardFlag) ? sceMcResDeniedPS1Permit : r;
505 mcdi->cardtype = sceMcTypePDA;
512 return sceMcResSucceed;
513 if (mcdi->cardtype == sceMcTypePS1)
514 return sceMcResDeniedPS1Permit;
515 return sceMcResSucceed;
519 r = mcman_probePS2Card2(port, slot);
521 mcdi->cardtype = sceMcTypePS2;
528 mcman_invhandles(port, slot);
529 mcman_clearcache(port, slot);
535int McDetectCard2(
int port,
int slot)
540 DPRINTF(
"McDetectCard2 port%d slot%d\n", port, slot);
542 mcdi = (
MCDevInfo *)&mcman_devinfos[port][slot];
544#if !defined(BUILDING_XFROMMAN) && !defined(BUILDING_VMCMAN)
545 if ((mcdi->cardtype == sceMcTypeNoCard) || (mcdi->cardtype == sceMcTypePS2)) {
546 r = mcman_probePS2Card(port, slot);
548 r = mcman_probePS1Card(port, slot);
550 if (mcman_probePDACard(port, slot)) {
551 mcdi->cardtype = sceMcTypePS1;
552 return (!PS1CardFlag) ? sceMcResDeniedPS1Permit : r;
555 mcdi->cardtype = sceMcTypePDA;
561 mcdi->cardtype = sceMcTypePS2;
566 r = mcman_probePS1Card(port, slot);
568 if ((r < -9) || (r >= 0)) {
569 r = mcman_probePS2Card(port, slot);
571 mcdi->cardtype = sceMcTypePS2;
576 if (mcman_probePDACard(port, slot)) {
577 mcdi->cardtype = sceMcTypePS1;
578 return (!PS1CardFlag) ? sceMcResDeniedPS1Permit : r;
581 mcdi->cardtype = sceMcTypePDA;
588 return sceMcResSucceed;
589 if (mcdi->cardtype == sceMcTypePS1)
590 return sceMcResDeniedPS1Permit;
591 return sceMcResSucceed;
595 r = mcman_probePS2Card(port, slot);
597 mcdi->cardtype = sceMcTypePS2;
604 mcman_invhandles(port, slot);
605 mcman_clearcache(port, slot);
611int McOpen(
int port,
int slot,
const char *filename,
int flag)
615 r = McDetectCard(port, slot);
616 if (r != sceMcResSucceed)
622 if (mcman_devinfos[port][slot].cardtype == sceMcTypePS2)
623 r = mcman_open2(port, slot, filename, flag);
625 r = mcman_open1(port, slot, filename, flag);
628 mcman_invhandles(port, slot);
629 mcman_clearcache(port, slot);
641 if (!((u32)fd < MAX_FDHANDLES))
642 return sceMcResDeniedPermit;
646 return sceMcResDeniedPermit;
649 r = McDetectCard(fh->port, fh->slot);
650 if (r != sceMcResSucceed)
653 r = McFlushCache(fh->port, fh->slot);
655 mcman_invhandles(fh->port, fh->slot);
656 mcman_clearcache(fh->port, fh->slot);
659 if (r != sceMcResSucceed)
662 if (fh->unknown2 != 0) {
666 mcdi = (
MCDevInfo *)&mcman_devinfos[fh->port][fh->slot];
667 if (mcdi->cardtype == sceMcTypePS2)
668 r = mcman_close2(fd);
670 r = mcman_close1(fd);
673 mcman_invhandles(fh->port, fh->slot);
674 mcman_clearcache(fh->port, fh->slot);
677 if (r != sceMcResSucceed)
681 r = McFlushCache(fh->port, fh->slot);
683 mcman_invhandles(fh->port, fh->slot);
684 mcman_clearcache(fh->port, fh->slot);
696 if (!((u32)fd < MAX_FDHANDLES))
697 return sceMcResDeniedPermit;
701 return sceMcResDeniedPermit;
703 r = McDetectCard(fh->port, fh->slot);
704 if (r != sceMcResSucceed)
707 r = McFlushCache(fh->port, fh->slot);
709 mcman_invhandles(fh->port, fh->slot);
710 mcman_clearcache(fh->port, fh->slot);
713 if (r != sceMcResSucceed) {
718 if (fh->unknown2 != 0) {
722 mcdi = (
MCDevInfo *)&mcman_devinfos[fh->port][fh->slot];
723 if (mcdi->cardtype == sceMcTypePS2)
724 r = mcman_close2(fd);
726 r = mcman_close1(fd);
729 mcman_invhandles(fh->port, fh->slot);
730 mcman_clearcache(fh->port, fh->slot);
733 if (r != sceMcResSucceed) {
739 r = McFlushCache(fh->port, fh->slot);
744 mcman_invhandles(fh->port, fh->slot);
745 mcman_clearcache(fh->port, fh->slot);
752int McSeek(
int fd,
int offset,
int origin)
757 DPRINTF(
"McSeek fd %d offset %d origin %d\n", fd, offset, origin);
759 if (!((u32)fd < MAX_FDHANDLES))
760 return sceMcResDeniedPermit;
764 return sceMcResDeniedPermit;
766 r = McDetectCard(fh->port, fh->slot);
767 if (r != sceMcResSucceed)
773 r = fh->position + offset;
779 r = fh->filesize + offset;
783 return fh->position = (r < 0) ? 0 : r;
787int McRead(
int fd,
void *buf,
int length)
792 if (!((u32)fd < MAX_FDHANDLES))
793 return sceMcResDeniedPermit;
797 return sceMcResDeniedPermit;
800 return sceMcResDeniedPermit;
802 r = McDetectCard(fh->port, fh->slot);
803 if (r != sceMcResSucceed)
806 if (mcman_devinfos[fh->port][fh->slot].cardtype == sceMcTypePS2)
807 r = mcman_read2(fd, buf, length);
809 r = mcman_read1(fd, buf, length);
815 mcman_invhandles(fh->port, fh->slot);
816 mcman_clearcache(fh->port, fh->slot);
823int McWrite(
int fd,
void *buf,
int length)
828 if (!((u32)fd < MAX_FDHANDLES))
829 return sceMcResDeniedPermit;
833 return sceMcResDeniedPermit;
836 return sceMcResDeniedPermit;
838 r = McDetectCard(fh->port, fh->slot);
839 if (r != sceMcResSucceed)
842 if (mcman_devinfos[fh->port][fh->slot].cardtype == sceMcTypePS2)
843 r = mcman_write2(fd, buf, length);
845 r = mcman_write1(fd, buf, length);
851 mcman_invhandles(fh->port, fh->slot);
852 mcman_clearcache(fh->port, fh->slot);
859int McGetEntSpace(
int port,
int slot,
const char *dirname)
863 r = McDetectCard(port, slot);
864 if (r != sceMcResSucceed)
867 if (mcman_devinfos[port][slot].cardtype == sceMcTypePS2) {
868 r = mcman_getentspace(port, slot, dirname);
872 mcman_invhandles(port, slot);
873 mcman_clearcache(port, slot);
880int McGetDir(
int port,
int slot,
const char *dirname,
int flags,
int maxent,
sceMcTblGetDir *
info)
884 r = McDetectCard(port, slot);
885 if (r != sceMcResSucceed)
888 if (mcman_devinfos[port][slot].cardtype == sceMcTypePS2)
889 r = mcman_getdir2(port, slot, dirname, flags & 0xFFFF, maxent,
info);
891 r = mcman_getdir1(port, slot, dirname, flags & 0xFFFF, maxent,
info);
894 mcman_invhandles(port, slot);
895 mcman_clearcache(port, slot);
902int mcman_dread(
int fd, MC_IO_DRE_T *dirent)
907 if (!((u32)fd < MAX_FDHANDLES))
908 return sceMcResDeniedPermit;
912 return sceMcResDeniedPermit;
915 return sceMcResDeniedPermit;
917 r = McDetectCard(fh->port, fh->slot);
918 if (r != sceMcResSucceed)
921 if (mcman_devinfos[fh->port][fh->slot].cardtype == sceMcTypePS2)
922 r = mcman_dread2(fd, dirent);
924 r = mcman_dread1(fd, dirent);
930 mcman_invhandles(fh->port, fh->slot);
931 mcman_clearcache(fh->port, fh->slot);
938int mcman_getstat(
int port,
int slot,
const char *filename, MC_IO_STA_T *stat)
942 r = McDetectCard(port, slot);
943 if (r != sceMcResSucceed)
946 if (mcman_devinfos[port][slot].cardtype == sceMcTypePS2)
947 r = mcman_getstat2(port, slot, filename, stat);
949 r = mcman_getstat1(port, slot, filename, stat);
952 mcman_invhandles(port, slot);
953 mcman_clearcache(port, slot);
960int McSetFileInfo(
int port,
int slot,
const char *filename,
sceMcTblGetDir *
info,
int flags)
964 r = McDetectCard(port, slot);
965 if (r != sceMcResSucceed)
968 if (mcman_devinfos[port][slot].cardtype == sceMcTypePS2)
969 r = mcman_setinfo2(port, slot, filename,
info, flags);
971 r = mcman_setinfo1(port, slot, filename,
info, flags);
974 mcman_invhandles(port, slot);
975 mcman_clearcache(port, slot);
978 if (r == sceMcResSucceed) {
979 r = McFlushCache(port, slot);
981 mcman_invhandles(port, slot);
982 mcman_clearcache(port, slot);
990int McChDir(
int port,
int slot,
const char *newdir,
char *currentdir)
994 r = McDetectCard(port, slot);
995 if (r != sceMcResSucceed)
998 if (mcman_devinfos[port][slot].cardtype == sceMcTypePS2)
999 r = mcman_chdir(port, slot, newdir, currentdir);
1002 r = sceMcResSucceed;
1006 mcman_invhandles(port, slot);
1007 mcman_clearcache(port, slot);
1014int McDelete(
int port,
int slot,
const char *filename,
int flags)
1018 r = McDetectCard(port, slot);
1019 if (r != sceMcResSucceed)
1022 if (mcman_devinfos[port][slot].cardtype == sceMcTypePS2)
1023 r = mcman_delete2(port, slot, filename, flags);
1025 r = mcman_delete1(port, slot, filename, flags);
1028 mcman_invhandles(port, slot);
1029 mcman_clearcache(port, slot);
1036int McFormat(
int port,
int slot)
1040 mcman_invhandles(port, slot);
1042 r = McDetectCard(port, slot);
1046 mcman_clearcache(port, slot);
1048 if (mcman_devinfos[port][slot].cardtype == sceMcTypePS2)
1049 r = mcman_format2(port, slot);
1051 r = mcman_format1(port, slot);
1054 mcman_invhandles(port, slot);
1055 mcman_clearcache(port, slot);
1062int McUnformat(
int port,
int slot)
1066 mcman_invhandles(port, slot);
1068 r = McDetectCard(port, slot);
1072 mcman_clearcache(port, slot);
1074 if (mcman_devinfos[port][slot].cardtype == sceMcTypePS2)
1075 r = mcman_unformat2(port, slot);
1077 r = mcman_unformat1(port, slot);
1079 mcman_devinfos[port][slot].cardform = 0;
1082 mcman_invhandles(port, slot);
1083 mcman_clearcache(port, slot);
1093 register int retries;
1099 if (sceCdRC(&cdtime))
1101 }
while (--retries > 0);
1103 if (cdtime.
stat & 0x80) {
1114 tm->Sec = btoi(cdtime.
second);
1115 tm->Min = btoi(cdtime.
minute);
1116 tm->Hour = btoi(cdtime.
hour);
1117 tm->Day = btoi(cdtime.
day);
1119 if ((cdtime.
month & 0x10) != 0)
1120 tm->Month = (cdtime.
month & 0xf) + 0xa;
1122 tm->Month = cdtime.
month & 0xf;
1124 tm->Year = btoi(cdtime.
year) + 2000;
1131 rawtime += (-9 * 60 * 60);
1133 gmtime_s(&timeinfo, &rawtime);
1135 gmtime_r(&rawtime, &timeinfo);
1138 tm->Sec = timeinfo.tm_sec;
1139 tm->Min = timeinfo.tm_min;
1140 tm->Hour = timeinfo.tm_hour;
1141 tm->Day = timeinfo.tm_mday;
1142 tm->Month = timeinfo.tm_mon + 1;
1143 tm->Year = timeinfo.tm_year + 1900;
1150int McEraseBlock(
int port,
int block,
void **pagebuf,
void *eccbuf)
1152 return mcman_eraseblock(port, 0, block, (
void **)pagebuf, eccbuf);
1156int McEraseBlock2(
int port,
int slot,
int block,
void **pagebuf,
void *eccbuf)
1158 return mcman_eraseblock(port, slot, block, (
void **)pagebuf, eccbuf);
1162int McReadPage(
int port,
int slot,
int page,
void *buf)
1164 register int r, index, ecres, retries,
count, erase_byte;
1165 register MCDevInfo *mcdi = &mcman_devinfos[port][slot];
1171 count = (mcdi->pagesize + 127) >> 7;
1172 erase_byte = (mcdi->cardflags & CF_ERASE_ZEROES) ? 0x0 : 0xFF;
1175 ecres = sceMcResSucceed;
1177 if (!mcman_readpage(port, slot, page, buf, eccbuf)) {
1178 if (mcdi->cardflags & CF_USE_ECC) {
1180 if (eccbuf[mcman_sparesize(port, slot) - 1] == erase_byte)
1186 peccb = (u8 *)eccbuf;
1190 r = mcman_correctdata(pdata, peccb);
1196 }
while (++index <
count);
1199 if (ecres == sceMcResSucceed)
1202 if ((retries == 4) && (!(ecres < sceMcResNoFormat)))
1210 }
while (++retries < 5);
1212 HAKAMA_SIGNALSEMA();
1215 return sceMcResSucceed;
1217 return (ecres != sceMcResSucceed) ? sceMcResNoFormat : sceMcResChangedCard;
1221void McDataChecksum(
void *buf,
void *ecc)
1223 register u8 *p, *p_ecc;
1224 register int i, a2, a3, t0;
1235 v = mcman_xortable[*p++];
1241 }
while (++i < 0x80);
1244 p_ecc[0] = ~a2 & 0x77;
1245 p_ecc[1] = ~a3 & 0x7F;
1246 p_ecc[2] = ~t0 & 0x7F;
1250int mcman_getcnum(
int port,
int slot)
1253#if !defined(BUILDING_DONGLEMAN)
1254 ((port & 1) << 3) + slot;
1266int mcman_correctdata(
void *buf,
void *ecc)
1268 register int xor0, xor1, xor2, xor3, xor4;
1272 McDataChecksum(buf, eccbuf);
1274 xor0 = p[0] ^ eccbuf[0];
1275 xor1 = p[1] ^ eccbuf[1];
1276 xor2 = p[2] ^ eccbuf[2];
1279 xor4 = (xor0 & 0xf) ^ (xor0 >> 4);
1281 if (!xor0 && !xor1 && !xor2)
1284 if ((xor3 == 0x7f) && (xor4 == 0x7)) {
1285 p[xor2] ^= 1 << (xor0 >> 4);
1296 }
while (xor2 >= 0);
1304 }
while (xor2 >= 0);
1313int mcman_sparesize(
int port,
int slot)
1315 return (mcman_devinfos[port][slot].pagesize + 0x1F) >> 5;
1319int mcman_setdevspec(
int port,
int slot)
1322 register MCDevInfo *mcdi = &mcman_devinfos[port][slot];
1324 DPRINTF(
"mcman_setdevspec port%d, slot%d\n", port, slot);
1326 if (McGetCardSpec(port, slot, &mcdi->pagesize, &mcdi->blocksize, &cardsize, &mcdi->cardflags) != sceMcResSucceed)
1327 return sceMcResFullDevice;
1329 mcdi->pages_per_cluster = MCMAN_CLUSTERSIZE / mcdi->pagesize;
1330 mcdi->cluster_size = MCMAN_CLUSTERSIZE;
1333 mcdi->unused = 0xff00;
1334 mcdi->FATentries_per_cluster = MCMAN_CLUSTERFATENTRIES;
1335 mcdi->unknown5 = -1;
1336 mcdi->rootdir_cluster2 = mcdi->rootdir_cluster;
1337 mcdi->clusters_per_block = mcdi->blocksize / mcdi->pages_per_cluster;
1338 mcdi->clusters_per_card = (cardsize / mcdi->blocksize) * (mcdi->blocksize / mcdi->pages_per_cluster);
1340 return sceMcResSucceed;
1344int mcman_setdevinfos(
int port,
int slot)
1346 register int r, allocatable_clusters_per_card, iscluster_valid, current_allocatable_cluster, cluster_cnt;
1347 register MCDevInfo *mcdi = &mcman_devinfos[port][slot];
1350 DPRINTF(
"mcman_setdevinfos port%d slot%d\n", port, slot);
1352 mcman_wmemset((
void *)mcdi,
sizeof(
MCDevInfo), 0);
1356 r = mcman_setdevspec(port, slot);
1357 if (r != sceMcResSucceed)
1360 mcdi->cardform = -1;
1363 if (r == sceMcResNoFormat)
1364 return sceMcResNoFormat;
1365 if (r != sceMcResSucceed)
1368 if (strncmp(SUPERBLOCK_MAGIC,
mcman_pagebuf.magic, 28) != 0) {
1369 DPRINTF(
"mcman_setdevinfos No card format !!!\n");
1370 return sceMcResNoFormat;
1374 return sceMcResNoFormat;
1377 for (r=0; r<0x150; r++)
1380 mcdi->cardtype = sceMcTypePS2;
1382 r = mcman_checkBackupBlocks(port, slot);
1383 if (r != sceMcResSucceed)
1386 r = McReadDirEntry(port, slot, 0, 0, &pfse);
1387 if (r != sceMcResSucceed)
1388 return sceMcResNoFormat;
1390 if (strcmp(pfse->name,
".") != 0)
1391 return sceMcResNoFormat;
1393 if (McReadDirEntry(port, slot, 0, 1, &pfse) != sceMcResSucceed)
1396 if (strcmp(pfse->name,
"..") != 0)
1397 return sceMcResNoFormat;
1403 if ((mcdi->clusters_per_block * mcdi->backup_block2) == mcdi->alloc_end)
1404 mcdi->alloc_end = (mcdi->clusters_per_block * mcdi->backup_block2) - mcdi->alloc_offset;
1409 long_multiply(mcdi->clusters_per_card, 0x10624dd3, &hi, &lo);
1410 temp = (hi >> 6) - (mcdi->clusters_per_card >> 31);
1411 allocatable_clusters_per_card = (((((temp << 5) - temp) << 2) + temp) << 3) + 1;
1412 iscluster_valid = 0;
1414 current_allocatable_cluster = mcdi->alloc_offset;
1416 while (cluster_cnt < allocatable_clusters_per_card) {
1417 if ((u32)current_allocatable_cluster >= mcdi->clusters_per_card)
1420 if (((current_allocatable_cluster % mcdi->clusters_per_block) == 0) \
1421 || (mcdi->alloc_offset == (u32)current_allocatable_cluster)) {
1422 iscluster_valid = 1;
1423 for (r=0; r<16; r++) {
1424 if (current_allocatable_cluster / mcdi->clusters_per_block == (u32)(mcdi->bad_block_list[r]))
1425 iscluster_valid = 0;
1428 if (iscluster_valid == 1)
1430 current_allocatable_cluster++;
1433 mcdi->max_allocatable_clusters = current_allocatable_cluster - mcdi->alloc_offset;
1435 return sceMcResSucceed;
1439int mcman_reportBadBlocks(
int port,
int slot)
1441 register int bad_blocks, erase_byte, err_limit;
1442 register MCDevInfo *mcdi = &mcman_devinfos[port][slot];
1444 DPRINTF(
"mcman_reportBadBlocks port%d, slot%d\n", port, slot);
1446 mcman_wmemset((
void *)mcdi->bad_block_list, 128, -1);
1448 if ((mcdi->cardflags & CF_BAD_BLOCK) == 0)
1449 return sceMcResSucceed;
1451 err_limit = ((mcdi->pagesize & 0xffff) + (mcdi->pagesize & 0x1)) >> 1;
1454 if ((mcdi->cardflags & CF_ERASE_ZEROES) != 0)
1459 if ((mcdi->clusters_per_card / mcdi->clusters_per_block) > 0) {
1465 register int page, err_cnt;
1467 if (bad_blocks >= 16)
1475 r = McReadPage(port, slot, (block * mcdi->blocksize) + page, &
mcman_pagebuf);
1476 if (r == sceMcResNoFormat) {
1477 mcdi->bad_block_list[bad_blocks] = block;
1481 if (r != sceMcResSucceed)
1484 if ((mcdi->cardflags & CF_USE_ECC) == 0) {
1489 for (i = 0; i < mcdi->pagesize; i++) {
1491 if (*p++ != erase_byte)
1494 if (err_cnt >= err_limit) {
1495 mcdi->bad_block_list[bad_blocks] = block;
1501 }
while (++page < 2);
1503 }
while ((u32)(++block) < (mcdi->clusters_per_card / mcdi->clusters_per_block));
1506 return sceMcResSucceed;
1510int McCreateDirentry(
int port,
int slot,
int parent_cluster,
int num_entries,
int cluster,
const sceMcStDateTime *ctime)
1514 register MCDevInfo *mcdi = &mcman_devinfos[port][slot];
1517 DPRINTF(
"McCreateDirentry port%d slot%d parent_cluster %x num_entries %d cluster %x\n", port, slot, parent_cluster, num_entries, cluster);
1519 r = McReadCluster(port, slot, mcdi->alloc_offset + cluster, &mce);
1520 if (r != sceMcResSucceed)
1523 mcman_wmemset(mce->cl_data, MCMAN_CLUSTERSIZE, 0);
1528 mfe->mode = sceMcFileAttrReadable | sceMcFileAttrWriteable | sceMcFileAttrExecutable \
1529 | sceMcFileAttrSubdir | sceMcFile0400 | sceMcFileAttrExists;
1532 mcman_getmcrtime(&mfe->created);
1534 mfe->created = *ctime;
1536 mfe->modified = mfe->created;
1539 mfe->dir_entry = num_entries;
1540 mfe->cluster = parent_cluster;
1542 mfe->name[1] =
'\0';
1544 if ((parent_cluster == 0) && (num_entries == 0)) {
1546 mfe_next->created = mfe->created;
1550 mfe->mode = sceMcFileAttrWriteable | sceMcFileAttrExecutable | sceMcFileAttrSubdir \
1551 | sceMcFile0400 | sceMcFileAttrExists | sceMcFileAttrHidden;
1557 McReadDirEntry(port, slot, parent_cluster, 0, &pfse);
1559 mfe_next->created = pfse->created;
1562 mfe->mode = sceMcFileAttrReadable | sceMcFileAttrWriteable | sceMcFileAttrExecutable \
1563 | sceMcFileAttrSubdir | sceMcFile0400 | sceMcFileAttrExists;
1564 mfe->dir_entry = pfse->dir_entry;
1566 mfe->cluster = pfse->cluster;
1569 mfe->modified = mfe->created;
1574 mfe->name[2] =
'\0';
1578 return sceMcResSucceed;
1582int mcman_fatRseek(
int fd)
1584 register int entries_to_read, fat_index;
1586 register MCDevInfo *mcdi = &mcman_devinfos[fh->port][fh->slot];
1589 entries_to_read = fh->position / mcdi->cluster_size;
1593 if ((u32)entries_to_read < fh->clust_offset)
1594 fat_index = fh->freeclink;
1596 fat_index = fh->clink;
1597 entries_to_read -= fh->clust_offset;
1600 if (entries_to_read == 0) {
1602 return fat_index + mcdi->alloc_offset;
1604 return sceMcResFullDevice;
1610 r = McGetFATentry(fh->port, fh->slot, fat_index, &fat_entry);
1611 if (r != sceMcResSucceed)
1614 fat_index = fat_entry;
1616 if (fat_index >= -1)
1617 return sceMcResFullDevice;
1621 fat_index &= ~0x80000000;
1622 fh->clink = fat_index;
1623 fh->clust_offset = (fh->position / mcdi->cluster_size) - entries_to_read;
1625 }
while (entries_to_read > 0);
1627 return fat_index + mcdi->alloc_offset;
1631int mcman_fatWseek(
int fd)
1633 register int r, entries_to_write, fat_index;
1635 register MCDevInfo *mcdi = &mcman_devinfos[fh->port][fh->slot];
1639 entries_to_write = fh->position / mcdi->cluster_size;
1641 if ((fh->clust_offset == 0) || ((u32)entries_to_write < fh->clust_offset)) {
1642 fat_index = fh->freeclink;
1644 if (fat_index < 0) {
1645 fat_index = mcman_findfree2(fh->port, fh->slot, 1);
1648 return sceMcResFullDevice;
1651 fh->freeclink = fat_index;
1653 r = mcman_close2(fd);
1654 if (r != sceMcResSucceed)
1657 mcman_addcacheentry(mce);
1658 McFlushCache(fh->port, fh->slot);
1662 fat_index = fh->clink;
1663 entries_to_write -= fh->clust_offset;
1666 if (entries_to_write != 0) {
1668 r = McGetFATentry(fh->port, fh->slot, fat_index, &fat_entry);
1669 if (r != sceMcResSucceed)
1672 if ((
unsigned int)fat_entry >= 0xffffffff) {
1673 r = mcman_findfree2(fh->port, fh->slot, 1);
1677 fat_entry |= 0x80000000;
1681 r = McSetFATentry(fh->port, fh->slot, fat_index, fat_entry);
1682 if (r != sceMcResSucceed)
1685 mcman_addcacheentry(mce);
1689 fat_index = fat_entry & ~0x80000000;
1690 }
while (entries_to_write > 0);
1693 fh->clink = fat_index;
1694 fh->clust_offset = fh->position / mcdi->cluster_size;
1696 return sceMcResSucceed;
1700int mcman_findfree2(
int port,
int slot,
int reserve)
1702 register int r, rfree, ifc_index, indirect_offset, fat_index, block;
1703 register MCDevInfo *mcdi = &mcman_devinfos[port][slot];
1706 DPRINTF(
"mcman_findfree2 port%d slot%d reserve%d\n", port, slot, reserve);
1710 for (fat_index = mcdi->unknown2; (u32)fat_index < mcdi->max_allocatable_clusters; fat_index++) {
1711 register int indirect_index, fat_offset;
1713 indirect_index = fat_index / mcdi->FATentries_per_cluster;
1714 fat_offset = fat_index % mcdi->FATentries_per_cluster;
1716 if ((fat_offset == 0) || ((u32)fat_index == mcdi->unknown2)) {
1718 ifc_index = indirect_index / mcdi->FATentries_per_cluster;
1719 r = McReadCluster(port, slot, mcdi->ifc_list[ifc_index], &mce1);
1720 if (r != sceMcResSucceed)
1724 indirect_offset = indirect_index % mcdi->FATentries_per_cluster;
1726 r = McReadCluster(port, slot, fc->entry[indirect_offset], &mce2);
1727 if (r != sceMcResSucceed)
1733 if (fc->entry[fat_offset] >= 0) {
1734 block = (mcdi->alloc_offset + fat_offset) / mcdi->clusters_per_block;
1735 if (block != mcman_badblock) {
1737 fc->entry[fat_offset] = 0xffffffff;
1739 mcdi->unknown2 = fat_index;
1748 return sceMcResFullDevice;
1750 return (rfree) ? rfree : sceMcResFullDevice;
1754int mcman_getentspace(
int port,
int slot,
const char *dirname)
1756 register int r, i, entspace;
1760 u8 *pfsentry, *pmfe, *pfseend;
1762 DPRINTF(
"mcman_getentspace port%d slot%d dirname %s\n", port, slot, dirname);
1764 r = mcman_cachedirentry(port, slot, dirname, &cacheDir, &fse, 1);
1766 return sceMcResNoEntry;
1770 pfsentry = (u8 *)fse;
1772 pfseend = (u8 *)(pfsentry +
sizeof (
McFsEntry));
1775 *((u32 *)pmfe ) = *((u32 *)pfsentry );
1776 *((u32 *)pmfe+1) = *((u32 *)pfsentry+1);
1777 *((u32 *)pmfe+2) = *((u32 *)pfsentry+2);
1778 *((u32 *)pmfe+3) = *((u32 *)pfsentry+3);
1781 }
while (pfsentry < pfseend);
1783 entspace = mfe.length & 1;
1785 for (i = 0; (u32)i < mfe.length; i++) {
1787 r = McReadDirEntry(port, slot, mfe.cluster, i, &fse);
1788 if (r != sceMcResSucceed)
1790 if ((fse->mode & sceMcFileAttrExists) == 0)
1798int mcman_cachedirentry(
int port,
int slot,
const char *filename,
McCacheDir *pcacheDir,
McFsEntry **pfse,
int unknown_flag)
1800 register int r, fsindex, cluster, fmode;
1801 register MCDevInfo *mcdi = &mcman_devinfos[port][slot];
1804 u8 *pfsentry, *pcache, *pfseend;
1807 DPRINTF(
"mcman_cachedirentry port%d slot%d name %s\n", port, slot, filename);
1809 if (pcacheDir == NULL) {
1810 pcacheDir = &cacheDir;
1811 pcacheDir->maxent = -1;
1821 cluster = mcdi->rootdir_cluster2;
1822 fsindex = mcdi->unknown1;
1825 r = McReadDirEntry(port, slot, cluster, fsindex, &fse);
1826 if (r != sceMcResSucceed)
1830 if (!(fse->mode & sceMcFileAttrExists))
1833 if (pcacheDir == NULL) {
1835 return sceMcResSucceed;
1838 pfsentry = (u8 *)fse;
1839 pcache = (u8 *)&mcman_dircache[0];
1840 pfseend = (u8 *)(pfsentry +
sizeof (
McFsEntry));
1843 *((u32 *)pcache ) = *((u32 *)pfsentry );
1844 *((u32 *)pcache+1) = *((u32 *)pfsentry+1);
1845 *((u32 *)pcache+2) = *((u32 *)pfsentry+2);
1846 *((u32 *)pcache+3) = *((u32 *)pfsentry+3);
1849 }
while (pfsentry < pfseend);
1851 r = mcman_getdirinfo(port, slot, (
McFsEntry *)&mcman_dircache[0],
".", pcacheDir, unknown_flag);
1853 McReadDirEntry(port, slot, pcacheDir->cluster, pcacheDir->fsindex, pfse);
1863 fmode = sceMcFileAttrReadable | sceMcFileAttrExecutable;
1864 if ((fse->mode & fmode) != fmode)
1865 return sceMcResDeniedPermit;
1867 pfsentry = (u8 *)fse;
1868 pcache = (u8 *)&mcman_dircache[0];
1869 pfseend = (u8 *)(pfsentry +
sizeof(
McFsEntry));
1872 *((u32 *)pcache ) = *((u32 *)pfsentry );
1873 *((u32 *)pcache+1) = *((u32 *)pfsentry+1);
1874 *((u32 *)pcache+2) = *((u32 *)pfsentry+2);
1875 *((u32 *)pcache+3) = *((u32 *)pfsentry+3);
1878 }
while (pfsentry < pfseend);
1880 r = mcman_getdirinfo(port, slot, (
McFsEntry *)&mcman_dircache[0], p, pcacheDir, unknown_flag);
1883 if (mcman_chrpos(p,
'/') >= 0)
1886 pcacheDir->cluster = cluster;
1887 pcacheDir->fsindex = fsindex;
1892 r = mcman_chrpos(p,
'/');
1893 if ((r >= 0) && (p[r + 1] != 0)) {
1894 p += mcman_chrpos(p,
'/') + 1;
1895 cluster = pcacheDir->cluster;
1896 fsindex = pcacheDir->fsindex;
1898 McReadDirEntry(port, slot, cluster, fsindex, &fse);
1901 McReadDirEntry(port, slot, pcacheDir->cluster, pcacheDir->fsindex, pfse);
1903 return sceMcResSucceed;
1907 return sceMcResSucceed;
1911int mcman_getdirinfo(
int port,
int slot,
McFsEntry *pfse,
const char *filename,
McCacheDir *pcd,
int unknown_flag)
1913 register int i, r, ret, len, pos;
1915 u8 *pfsentry, *pfsee, *pfseend;
1917 DPRINTF(
"mcman_getdirinfo port%d slot%d name %s\n", port, slot, filename);
1919 pos = mcman_chrpos(filename,
'/');
1921 pos = strlen(filename);
1924 if ((pos == 2) && (!strncmp(filename,
"..", 2))) {
1926 r = McReadDirEntry(port, slot, pfse->cluster, 0, &fse);
1927 if (r != sceMcResSucceed)
1930 r = McReadDirEntry(port, slot, fse->cluster, 0, &fse);
1931 if (r != sceMcResSucceed)
1935 pcd->cluster = fse->cluster;
1936 pcd->fsindex = fse->dir_entry;
1939 r = McReadDirEntry(port, slot, fse->cluster, fse->dir_entry, &fse);
1940 if (r != sceMcResSucceed)
1943 pfsentry = (u8 *)fse;
1945 pfseend = (u8 *)(pfsentry +
sizeof(
McFsEntry));
1948 *((u32 *)pfsee ) = *((u32 *)pfsentry );
1949 *((u32 *)pfsee+1) = *((u32 *)pfsentry+1);
1950 *((u32 *)pfsee+2) = *((u32 *)pfsentry+2);
1951 *((u32 *)pfsee+3) = *((u32 *)pfsentry+3);
1954 }
while (pfsentry < pfseend);
1956 if ((fse->mode & sceMcFileAttrHidden) != 0) {
1960 if ((pcd == NULL) || (pcd->maxent < 0))
1965 if ((pcd == NULL) || (pcd->maxent < 0))
1966 return sceMcResSucceed;
1969 if ((pos == 1) && (!strncmp(filename,
".", 1))) {
1971 r = McReadDirEntry(port, slot, pfse->cluster, 0, &fse);
1972 if (r != sceMcResSucceed)
1976 pcd->cluster = fse->cluster;
1977 pcd->fsindex = fse->dir_entry;
1980 if ((fse->mode & sceMcFileAttrHidden) != 0) {
1984 if ((pcd == NULL) || (pcd->maxent < 0))
1988 if ((pcd == NULL) || (pcd->maxent < 0))
1989 return sceMcResSucceed;
1994 if ((pcd == NULL) || (pcd->maxent < 0))
1995 return sceMcResSucceed;
2000 if ((pcd) && (pcd->maxent >= 0))
2001 pcd->maxent = pfse->length;
2003 if (pfse->length > 0) {
2007 r = McReadDirEntry(port, slot, pfse->cluster, i, &fse);
2008 if (r != sceMcResSucceed)
2011 if (((fse->mode & sceMcFileAttrExists) == 0) && (pcd) && (i < pcd->maxent))
2015 if ((fse->mode & sceMcFileAttrExists) == 0)
2019 if ((fse->mode & sceMcFileAttrExists) != 0)
2026 if ((pos >= 11) && (!strncmp(&filename[10], &fse->name[10], pos-10))) {
2028 if (strlen(fse->name) >= (
unsigned int)pos)
2029 len = strlen(fse->name);
2031 if (!strncmp(filename, fse->name, len))
2032 goto continue_check;
2035 if (strlen(fse->name) >= (
unsigned int)pos)
2036 len = strlen(fse->name);
2040 if (strncmp(filename, fse->name, len))
2046 if ((fse->mode & sceMcFileAttrHidden) != 0) {
2055 pcd->cluster = pfse->cluster;
2057 if (pcd->maxent < 0)
2060 }
while ((u32)(++i) < pfse->length);
2066 return ((ret < 1) ? 1 : 0);
2070int mcman_writecluster(
int port,
int slot,
int cluster,
int flag)
2072 register int i, block;
2073 register u32 erase_value;
2074 register MCDevInfo *mcdi = &mcman_devinfos[port][slot];
2076 block = cluster / mcdi->clusters_per_block;
2078 if ((mcman_wr_port == port) && (mcman_wr_slot == slot) && (mcman_wr_block == block))
2079 return mcman_wr_flag3;
2081 mcman_wr_port = port;
2082 mcman_wr_slot = slot;
2083 mcman_wr_block = block;
2084 mcman_wr_flag3 = -9;
2086 for (i = 0; i < 16; i++) {
2087 if (mcdi->bad_block_list[i] < 0)
2089 if (mcdi->bad_block_list[i] == block) {
2091 return sceMcResSucceed;
2096 register int r, j, page, pageword_cnt;
2098 for (i = 1; i < mcdi->blocksize; i++)
2099 mcman_pagedata[i] = 0;
2103 pageword_cnt = mcdi->pagesize >> 2;
2104 page = block * mcdi->blocksize;
2106 if (mcdi->cardflags & CF_ERASE_ZEROES)
2107 erase_value = 0xffffffff;
2109 erase_value = 0x00000000;
2111 for (i = 0; i < pageword_cnt; i++)
2114 r = mcman_eraseblock(port, slot, block, (
void **)mcman_pagedata, (
void *)mcman_eccdata);
2115 if (r == sceMcResFailReplace)
2116 return sceMcResSucceed;
2117 if (r != sceMcResSucceed)
2118 return sceMcResChangedCard;
2120 for (i = 1; i < mcdi->blocksize; i++) {
2121 r = McWritePage(port, slot, page + i, &
mcman_pagebuf, mcman_eccdata);
2122 if (r == sceMcResFailReplace)
2123 return sceMcResSucceed;
2124 if (r != sceMcResSucceed)
2125 return sceMcResNoFormat;
2128 for (i = 1; i < mcdi->blocksize; i++) {
2130 if (r == sceMcResNoFormat)
2131 return sceMcResSucceed;
2132 if (r != sceMcResSucceed)
2133 return sceMcResFullDevice;
2135 for (j = 0; j < pageword_cnt; j++) {
2138 return sceMcResSucceed;
2143 r = mcman_eraseblock(port, slot, block, NULL, NULL);
2144 if (r != sceMcResSucceed)
2145 return sceMcResChangedCard;
2147 r = McWritePage(port, slot, page, &
mcman_pagebuf, mcman_eccdata);
2148 if (r == sceMcResFailReplace)
2149 return sceMcResSucceed;
2150 if (r != sceMcResSucceed)
2151 return sceMcResNoFormat;
2154 if (r == sceMcResNoFormat)
2155 return sceMcResSucceed;
2156 if (r != sceMcResSucceed)
2157 return sceMcResFullDevice;
2159 for (j = 0; j < pageword_cnt; j++) {
2162 return sceMcResSucceed;
2166 r = mcman_eraseblock(port, slot, block, NULL, NULL);
2167 if (r == sceMcResFailReplace)
2168 return sceMcResSucceed;
2169 if (r != sceMcResSucceed)
2170 return sceMcResFullDevice;
2172 erase_value = ~erase_value;
2174 for (i = 0; i < mcdi->blocksize; i++) {
2176 if (r != sceMcResSucceed)
2177 return sceMcResDeniedPermit;
2179 for (j = 0; j < pageword_cnt; j++) {
2182 return sceMcResSucceed;
2189 return mcman_wr_flag3;
2193int McSetDirEntryState(
int port,
int slot,
int cluster,
int fsindex,
int flags)
2195 register int r, i, fat_index;
2196 register MCDevInfo *mcdi = &mcman_devinfos[port][slot];
2200 r = McReadDirEntry(port, slot, cluster, fsindex, &fse);
2201 if (r != sceMcResSucceed)
2204 if (fse->name[0] ==
'.') {
2205 if ((fse->name[1] == 0) || (fse->name[1] ==
'.'))
2206 return sceMcResNoEntry;
2211 if (mcman_fdhandles[i].status == 0)
2214 if ((mcman_fdhandles[i].port != port) || (mcman_fdhandles[i].slot != slot))
2217 if (mcman_fdhandles[i].cluster != (u32)cluster)
2220 if (mcman_fdhandles[i].fsindex == (u32)fsindex)
2221 return sceMcResDeniedPermit;
2223 }
while (++i < MAX_FDHANDLES);
2226 fse->mode = fse->mode & (sceMcFileAttrExists - 1);
2228 fse->mode = fse->mode | sceMcFileAttrExists;
2230 Mc1stCacheEntSetWrFlagOff();
2232 fat_index = fse->cluster;
2234 if (fat_index >= 0) {
2235 if ((u32)fat_index < mcdi->unknown2)
2236 mcdi->unknown2 = fat_index;
2237 mcdi->unknown5 = -1;
2240 r = McGetFATentry(port, slot, fat_index, &fat_entry);
2241 if (r != sceMcResSucceed)
2245 fat_entry &= ~0x80000000;
2246 if ((u32)fat_index < mcdi->unknown2)
2247 mcdi->unknown2 = fat_entry;
2250 fat_entry |= 0x80000000;
2252 r = McSetFATentry(port, slot, fat_index, fat_entry);
2253 if (r != sceMcResSucceed)
2256 fat_index = fat_entry & ~0x80000000;
2258 }
while (fat_index != ~0x80000000);
2261 return sceMcResSucceed;
2265int mcman_checkBackupBlocks(
int port,
int slot)
2267 register int r1, r2, r, eccsize;
2268 register MCDevInfo *mcdi = &mcman_devinfos[port][slot];
2274 r1 = McReadPage(port, slot, mcdi->backup_block2 * mcdi->blocksize, &
mcman_pagebuf);
2277 if (((mcdi->cardflags & CF_ERASE_ZEROES) != 0) && (value1 == 0))
2278 value1 = 0xffffffff;
2279 if (value1 != 0xffffffff)
2280 value1 = value1 & ~0x80000000;
2282 r2 = McReadPage(port, slot, (mcdi->backup_block2 * mcdi->blocksize) + 1, &
mcman_pagebuf);
2285 if (((mcdi->cardflags & CF_ERASE_ZEROES) != 0) && (value2 == 0))
2286 value2 = 0xffffffff;
2287 if (value2 != 0xffffffff)
2288 value2 = value2 & ~0x80000000;
2290 if ((value1 != 0xffffffff) && (value2 == 0xffffffff))
2292 if ((r1 < 0) || (r2 < 0))
2295 if ((value1 == 0xffffffff) && (value1 == value2))
2296 return sceMcResSucceed;
2300 for (r1 = 0; (u32)r1 < mcdi->clusters_per_block; r1++) {
2302 McReadCluster(port, slot, (mcdi->backup_block1 * mcdi->clusters_per_block) + r1, &mce);
2305 for (r2 = 0; r2 < mcdi->pages_per_cluster; r2++) {
2306 mcman_pagedata[(r1 * ((mcdi->pages_per_cluster << 16) >> 16)) + r2] = \
2307 (
void *)(mce->cl_data + (r2 * mcdi->pagesize));
2312 r = mcman_eraseblock(port, slot, value1, (
void **)mcman_pagedata, (
void *)mcman_eccdata);
2313 if (r != sceMcResSucceed)
2317 for (r1 = 0; r1 < mcdi->blocksize; r1++) {
2319 eccsize = mcdi->pagesize;
2322 eccsize = eccsize >> 5;
2324 r = McWritePage(port, slot, (value1 * ((mcdi->blocksize << 16) >> 16)) + r1, \
2325 mcman_pagedata[r1], (
void *)(mcman_eccdata + (eccsize * r1)));
2327 if (r != sceMcResSucceed)
2331 for (r1 = 0; (u32)r1 < mcdi->clusters_per_block; r1++)
2332 mcman_freecluster(port, slot, (mcdi->backup_block1 * mcdi->clusters_per_block) + r1);
2336 return mcman_eraseblock(port, slot, mcdi->backup_block2, NULL, NULL);
2340int McCheckBlock(
int port,
int slot,
int block)
2342 register int r, i, j, page, ecc_count, pageword_cnt, flag, erase_value;
2343 register MCDevInfo *mcdi = &mcman_devinfos[port][slot];
2346 DPRINTF(
"McCheckBlock port%d slot%d block 0x%x\n", port, slot, block);
2349 page = block * mcdi->blocksize;
2350 pageword_cnt = mcdi->pagesize >> 2;
2352 ecc_count = mcdi->pagesize;
2353 if (mcdi->pagesize < 0)
2355 ecc_count = ecc_count >> 7;
2359 if (mcdi->cardform > 0) {
2360 for (i = 0; i < 16; i++) {
2361 if (mcdi->bad_block_list[i] <= 0)
2363 if (mcdi->bad_block_list[i] == block)
2370 for (i = 0; i < mcdi->blocksize; i++) {
2371 r = mcman_readpage(port, slot, page + i, &
mcman_pagebuf, mcman_eccdata);
2372 if (r != sceMcResSucceed)
2375 if ((mcdi->cardflags & CF_USE_ECC) != 0) {
2376 if (mcman_eccdata[mcman_sparesize(port, slot) - 1] != 0xff) {
2378 p_ecc = (
void *)mcman_eccdata;
2380 for (j = 0; j < ecc_count; j++) {
2381 r = mcman_correctdata(p_page, p_ecc);
2382 if (r != sceMcResSucceed) {
2386 p_ecc = (
void *)((u8 *)p_ecc + 3);
2387 p_page = (
void *)((u8 *)p_page + 128);
2393 for (j = 0; j < pageword_cnt; j++)
2396 for (j = 0; j < 128; j++)
2397 *((u32 *)&mcman_eccdata + j) = 0x5a5aa5a5;
2399 r = mcman_eraseblock(port, slot, block, NULL, NULL);
2400 if (r != sceMcResSucceed) {
2401 r = mcman_probePS2Card2(port, slot);
2402 if (r != sceMcResSucceed)
2408 for (i = 0; i < mcdi->blocksize; i++) {
2409 r = McWritePage(port, slot, page + i, &
mcman_pagebuf, mcman_eccdata);
2410 if (r != sceMcResSucceed) {
2411 r = mcman_probePS2Card2(port, slot);
2412 if (r != sceMcResSucceed)
2419 for (i = 0; i < mcdi->blocksize; i++) {
2420 r = mcman_readpage(port, slot, page + i, &
mcman_pagebuf, mcman_eccdata);
2421 if (r != sceMcResSucceed)
2424 for (j = 0; j < pageword_cnt; j++) {
2431 for (j = 0; j < 128; j++) {
2432 if (*((u32 *)&mcman_eccdata + j) != 0x5a5aa5a5) {
2439 for (j = 0; j < pageword_cnt; j++)
2442 for (j = 0; j < 128; j++)
2443 *((u32 *)&mcman_eccdata + j) = 0x05a55a5a;
2445 r = mcman_eraseblock(port, slot, block, NULL, NULL);
2446 if (r != sceMcResSucceed) {
2447 r = mcman_probePS2Card2(port, slot);
2448 if (r != sceMcResSucceed)
2454 for (i = 0; i < mcdi->blocksize; i++) {
2455 r = McWritePage(port, slot, page + i, &
mcman_pagebuf, mcman_eccdata);
2456 if (r != sceMcResSucceed) {
2457 r = mcman_probePS2Card2(port, slot);
2458 if (r != sceMcResSucceed)
2465 for (i = 0; i < mcdi->blocksize; i++) {
2466 r = mcman_readpage(port, slot, page + i, &
mcman_pagebuf, mcman_eccdata);
2467 if (r != sceMcResSucceed)
2470 for (j = 0; j < pageword_cnt; j++) {
2477 for (j = 0; j < 128; j++) {
2478 if (*((u32 *)&mcman_eccdata + j) != 0x05a55a5a) {
2487 mcman_eraseblock(port, slot, block, NULL, NULL);
2488 return sceMcResSucceed;
2491 erase_value = 0x00000000;
2492 if ((mcdi->cardflags & CF_ERASE_ZEROES) != 0)
2493 erase_value = 0xffffffff;
2495 for (j = 0; j < pageword_cnt; j++)
2498 for (j = 0; j < 128; j++)
2499 *((u32 *)&mcman_eccdata + j) = erase_value;
2501 for (i = 0; i < mcdi->blocksize; i++) {
2502 r = McWritePage(port, slot, page + i, &
mcman_pagebuf, mcman_eccdata);
2503 if (r != sceMcResSucceed) {
2504 r = mcman_probePS2Card2(port, slot);
2505 if (r != sceMcResSucceed)
2514int mcman_setPS1devinfos(
int port,
int slot)
2517 MCDevInfo *mcdi = &mcman_devinfos[port][slot];
2519 DPRINTF(
"mcman_setPS1devinfos port%d slot%d\n", port, slot);
2521 memset((
void *)mcdi, 0,
sizeof (
MCDevInfo));
2522 memset((
void *)&mcdi->bad_block_list[0], -1, 128);
2524 mcdi->pagesize = 128;
2525 mcdi->blocksize = 128;
2526 mcdi->pages_per_cluster = 64;
2527 mcdi->unused = 0xff00;
2528 mcdi->cluster_size = 8192;
2529 mcdi->FATentries_per_cluster = 2048;
2530 mcdi->clusters_per_card = 16;
2531 mcdi->clusters_per_block = 0;
2539#if !defined(BUILDING_XFROMMAN) && !defined(BUILDING_VMCMAN)
2540 if (mcman_sio2outbufs_PS1PDA[1] != 0)
2544 mcdi->cardform = -1;
2547 return sceMcResNoFormat;
2550 return sceMcResNoFormat;
2552 for (i = 0; i < 20; i++) {
2554 if (r != sceMcResSucceed)
2562 r = mcman_cachePS1dirs(port, slot);
2564 if (r != sceMcResSucceed)
2569 return sceMcResSucceed;
2573int mcman_getPS1direntry(
int port,
int slot,
const char *filename,
McFsEntryPS1 **pfse,
int flag)
2576 const char *p = filename;
2578 DPRINTF(
"mcman_getPS1direntry port%d slot%d file %s flag %x\n", port, slot, filename, flag);
2587 r = mcman_readdirentryPS1(port, slot, i, pfse);
2588 if (r != sceMcResSucceed)
2592 if (pfse[0]->mode != 0x51)
2596 if (pfse[0]->mode != 0xa1)
2600 if (!strcmp(p, pfse[0]->name))
2605 return sceMcResNoEntry;
2609int mcman_clearPS1direntry(
int port,
int slot,
int cluster,
int flags)
2611 register int r, i, temp;
2616 DPRINTF(
"mcman_clearPS1direntry port%d slot%d cluster %x flags %x\n", port, slot, cluster, flags);
2618 r = mcman_readdirentryPS1(port, slot, cluster, &fse);
2619 if (r != sceMcResSucceed)
2624 for (i = 0; i < MAX_FDHANDLES; i++) {
2625 if ((fh->status != 0) && (fh->port == port) && (fh->slot == slot)) {
2626 if (fh->freeclink == (u32)cluster)
2627 return sceMcResDeniedPermit;
2634 if (fse->mode != 0x51)
2635 return sceMcResNoEntry;
2638 if (fse->mode != 0xa1)
2639 return sceMcResNoEntry;
2644 mce = mcman_get1stcacheEntp();
2646 if (cluster + 1 < 0)
2651 temp &= ~0x00000007;
2652 temp = (cluster + 1) - temp;
2656 mce->wr_flag |= 1 << temp;
2659 temp = (fse->mode & 0xf) | 0xa0;
2661 temp = (fse->mode & 0xf) | 0x50;
2664 fse->edc = mcman_calcEDC((
void *)fse, 127);
2667 if (fse->linked_block < 0 || fse->linked_block >= 15) {
2672 cluster = fse->linked_block;
2674 r = mcman_readdirentryPS1(port, slot, cluster, &fse);
2675 if (r != sceMcResSucceed)
2679 if ((fse->mode & 0xf0) != 0x50)
2684 }
while ((fse->mode & 0xf0) == 0xa0);
2686 r = McFlushCache(port, slot);
2687 if (r != sceMcResSucceed)
2690 return sceMcResNoEntry;
2693 r = McFlushCache(port, slot);
2694 if (r != sceMcResSucceed)
2697 return sceMcResSucceed;
2701int mcman_findfree1(
int port,
int slot,
int reserve)
2703 register int i, free;
2706 DPRINTF(
"mcman_findfree1 port%d slot%d reserve %d\n", port, slot, reserve);
2714 r = mcman_readdirentryPS1(port, slot, i, &fse);
2715 if (r != sceMcResSucceed)
2718 if ((fse->mode & 0xf0) == 0xa0) {
2726 return sceMcResFullDevice;
2731 return sceMcResFullDevice;
2735int mcman_fatRseekPS1(
int fd)
2737 register int rpos, numclust, clust;
2739 MCDevInfo *mcdi = &mcman_devinfos[fh->port][fh->slot];
2742 numclust = fh->position / mcdi->cluster_size;
2744 clust = fh->freeclink;
2746 if (numclust > -1) {
2751 return sceMcResFullDevice;
2753 r = mcman_readdirentryPS1(fh->port, fh->slot, clust, &fse);
2754 if (r != sceMcResSucceed)
2756 clust = fse->linked_block;
2758 }
while (--numclust > -1);
2762 return sceMcResFullDevice;
2764 rpos = fh->position % mcdi->cluster_size;
2769 return ((clust + 1) << 6) + ((rpos >> 10) * (1024 / mcdi->pagesize));
2773int mcman_fatWseekPS1(
int fd)
2775 register int r, numclust;
2777 MCDevInfo *mcdi = &mcman_devinfos[fh->port][fh->slot];
2780 numclust = fh->position / mcdi->cluster_size;
2785 clust = fh->freeclink;
2787 r = mcman_readdirentryPS1(fh->port, fh->slot, clust, &fse);
2788 if (r != sceMcResSucceed)
2791 clust = fse->linked_block;
2794 r = mcman_FNC8ca4(fh->port, fh->slot, (
MC_FHANDLE *)fh);
2799 }
while (--numclust);
2801 r = McFlushCache(fh->port, fh->slot);
2807int mcman_FNC8ca4(
int port,
int slot,
MC_FHANDLE *fh)
2809 register int r, i, j, mcfree, cluster_size, pages_per_FATclust;
2811 MCDevInfo *mcdi = &mcman_devinfos[fh->port][fh->slot];
2815 DPRINTF(
"mcman_FNC8ca4 port%d slot%d\n", port, slot);
2817 if ((
int)(mcdi->cluster_size) < 0)
2818 cluster_size = mcdi->cluster_size + 1023;
2820 cluster_size = mcdi->cluster_size;
2822 cluster_size = cluster_size >> 10;
2824 pages_per_FATclust = 1024 / mcdi->pagesize;
2826 r = mcman_findfree1(port, slot, 1);
2836 while (i >= 0 && i < 15) {
2838 u8 *pfsentry, *pfsee, *pfseend;
2840 if (cluster_size > 0) {
2844 mcman_freecluster(port, slot, ((mcfree * cluster_size) + i) * pages_per_FATclust);
2846 r = mcman_readclusterPS1(port, slot, ((i * cluster_size) + i) * pages_per_FATclust, &mce);
2847 if (r != sceMcResSucceed)
2851 mce->cluster -= (i - mcfree) * cluster_size;
2853 }
while (++i < cluster_size);
2856 r = mcman_readdirentryPS1(port, slot, i, &fse1);
2857 if (r != sceMcResSucceed)
2860 r = mcman_readdirentryPS1(port, slot, mcfree, &fse2);
2861 if (r != sceMcResSucceed)
2864 mce = mcman_get1stcacheEntp();
2871 temp &= ~0x00000007;
2872 temp = (mcfree + 1) - temp;
2876 mce->wr_flag |= 1 << temp;
2878 pfsentry = (u8 *)fse1;
2883 *((u32 *)pfsee ) = *((u32 *)pfsentry );
2884 *((u32 *)pfsee+1) = *((u32 *)pfsentry+1);
2885 *((u32 *)pfsee+2) = *((u32 *)pfsentry+2);
2886 *((u32 *)pfsee+3) = *((u32 *)pfsentry+3);
2889 }
while (pfsentry < pfseend);
2892 r = mcman_readdirentryPS1(port, slot, j, &fse3);
2893 if (r != sceMcResSucceed)
2896 mce = mcman_get1stcacheEntp();
2910 temp &= ~0x00000007;
2911 temp = (j + 1) - temp;
2915 mce->wr_flag |= 1 << temp;
2916 fse3->linked_block = mcfree;
2917 fse3->edc = mcman_calcEDC((
void *)fse3, 127);
2920 fh->freeclink = mcfree;
2928 r = mcman_readdirentryPS1(port, slot, j, &fse1);
2929 if (r != sceMcResSucceed)
2932 i = fse1->linked_block;
2936 r = mcman_readdirentryPS1(port, slot, mcfree, &fse2);
2937 if (r != sceMcResSucceed)
2940 mce = mcman_get1stcacheEntp();
2947 temp &= ~0x00000007;
2948 temp = (mcfree + 1) - temp;
2952 mce->wr_flag |= 1 << temp;
2957 fse2->linked_block = -1;
2958 fse2->edc = mcman_calcEDC((
void *)fse2, 127);
2960 r = mcman_readdirentryPS1(port, slot, j, &fse3);
2961 if (r != sceMcResSucceed)
2964 mce = mcman_get1stcacheEntp();
2971 temp &= ~0x00000007;
2972 temp = (j + 1) - temp;
2976 mce->wr_flag |= 1 << temp;
2978 if (fse3->mode == 0x53)
2981 fse3->linked_block = mcfree;
2982 fse3->edc = mcman_calcEDC((
void *)fse3, 127);
2988int mcman_PS1pagetest(
int port,
int slot,
int page)
2992 for (i = 0; i < 32; i++)
2996 if (r != sceMcResSucceed)
2997 return sceMcResDeniedPermit;
3000 if (r != sceMcResSucceed)
3001 return sceMcResNotEmpty;
3003 for (i = 0; i < 32; i++) {
3009 for (i = 0; i < 32; i++)
3013 if (r != sceMcResSucceed)
3014 return sceMcResDeniedPermit;
3017 if (r != sceMcResSucceed)
3018 return sceMcResNotEmpty;
3020 for (i = 0; i < 32; i++) {
3030int mcman_cachePS1dirs(
int port,
int slot)
3032 register int i, j, temp1, temp2, index, linked_block;
3037 DPRINTF(
"mcman_cachePS1dirs port%d slot%d\n", port, slot);
3043 r = mcman_readdirentryPS1(port, slot, i, &fs_t[i]);
3044 if (r != sceMcResSucceed)
3047 fs_t[i]->field_38 = fs_t[i]->length;
3050 mce[0] = mcman_get1stcacheEntp();
3054 mce[1] = mcman_get1stcacheEntp();
3058 memset((
void *)cluster_t, -1,
sizeof(cluster_t));
3062 temp1 = fs_t[i]->mode & 0xf0;
3064 if ((fs_t[i]->mode & 0xf) != 1)
3069 linked_block = fs_t[i]->linked_block;
3071 while (linked_block >= 0 && linked_block < 15) {
3072 if ((fs_t[linked_block]->mode & 0xf0) != temp1)
3075 if (fs_t[linked_block]->mode == 0xa0)
3078 if (cluster_t[linked_block] != -1)
3081 cluster_t[linked_block] = i;
3082 linked_block = fs_t[linked_block]->linked_block;
3085 if ((linked_block < 0 || linked_block >= 15) && (temp1 != 0))
3090 if (cluster_t[j] != i)
3095 fs_t[j]->mode = 0xa0;
3096 fs_t[j]->linked_block = -1;
3097 fs_t[j]->edc = mcman_calcEDC((
void *)fs_t[j], 127);
3111 temp1 &= ~0x00000007;
3112 temp1 = temp2 - temp1;
3116 mce[index]->wr_flag |= 1 << temp1;
3124 if ((cluster_t[i] != -1) || (fs_t[i]->mode == 0xa0))
3129 fs_t[i]->mode = 0xa0;
3130 fs_t[i]->linked_block = cluster_t[i];
3131 fs_t[i]->edc = mcman_calcEDC((
void *)fs_t[i], 127);
3145 temp1 &= ~0x00000007;
3146 temp1 = temp2 - temp1;
3150 mce[index]->wr_flag |= 1 << temp1;
3154 return sceMcResSucceed;
3158int mcman_fillPS1backuparea(
int port,
int slot,
int block)
3160 register int r, i, curpage;
3161 register MCDevInfo *mcdi = &mcman_devinfos[port][slot];
3168 if (mcdi->bad_block_list[i] == block) {
3169 mcdi->bad_block_list[i] = block | 0x01000000;
3173 if (r != sceMcResSucceed)
3177 if (mcdi->bad_block_list[i] < 0) {
3181 if (r != sceMcResSucceed)
3183 mcdi->bad_block_list[i] = block;
3190 return sceMcResSucceed;
3194void mcman_initcache(
void)
3199 DPRINTF(
"mcman_initcache\n");
3201 j = MAX_CACHEENTRY - 1;
3202 p = (u8 *)mcman_cachebuf;
3204 for (i = 0; i < MAX_CACHEENTRY; i++) {
3205 mcman_entrycache[i].cl_data = (u8 *)p;
3206 mcman_mccache[i] = (
McCacheEntry *)&mcman_entrycache[j - i];
3207 mcman_entrycache[i].cluster = -1;
3208 p += MCMAN_CLUSTERSIZE;
3214 for (i = 0; i < MCMAN_MAXSLOT; i++) {
3215 mcman_devinfos[0][i].unknown3 = -1;
3216 mcman_devinfos[0][i].unknown4 = -1;
3217 mcman_devinfos[0][i].unknown5 = -1;
3218 mcman_devinfos[1][i].unknown3 = -1;
3219 mcman_devinfos[1][i].unknown4 = -1;
3220 mcman_devinfos[1][i].unknown5 = -1;
3223 memset((
void *)mcman_fatcache, -1,
sizeof (mcman_fatcache));
3225 for (i = 0; i < MCMAN_MAXSLOT; i++) {
3226 mcman_fatcache[0][i].entry[0] = 0;
3227 mcman_fatcache[1][i].entry[0] = 0;
3232int McRetOnly(
int fd)
3236 DPRINTF(
"McRetOnly param %x\n", fd);
3237 return sceMcResSucceed;
3241int mcman_clearcache(
int port,
int slot)
3247 DPRINTF(
"mcman_clearcache port%d, slot%d\n", port, slot);
3249 for (i = MAX_CACHEENTRY - 1; i >= 0; i--) {
3251 if ((mce->mc_port == port) && (mce->mc_slot == slot) && (mce->cluster >= 0)) {
3259 for (i = 0; i < (MAX_CACHEENTRY - 1); i++) {
3264 if (mce->cluster < 0) {
3265 for (j = i+1; j < MAX_CACHEENTRY; j++) {
3267 if (mce->cluster >= 0)
3270 if (j == MAX_CACHEENTRY)
3278 memset((
void *)&mcman_fatcache[port][slot], -1,
sizeof (
McFatCache));
3280 mcman_fatcache[port][slot].entry[0] = 0;
3282 return sceMcResSucceed;
3286McCacheEntry *mcman_getcacheentry(
int port,
int slot,
int cluster)
3293 for (i = 0; i < MAX_CACHEENTRY; i++) {
3294 if ((mce->mc_port == port) && (mce->mc_slot == slot) && (mce->cluster == cluster))
3303void mcman_freecluster(
int port,
int slot,
int cluster)
3308 for (i = 0; i < MAX_CACHEENTRY; i++) {
3309 if ((mce->mc_port == port) && (mce->mc_slot == slot) && (mce->cluster == cluster)) {
3318int mcman_getFATindex(
int port,
int slot,
int num)
3320 return mcman_fatcache[port][slot].entry[num];
3324void Mc1stCacheEntSetWrFlagOff(
void)
3334 return *pmcman_mccache;
3343 i = MAX_CACHEENTRY - 1;
3362 pmce[i] = pmce[i-1];
3370int McFlushCache(
int port,
int slot)
3375 DPRINTF(
"McFlushCache port%d slot%d\n", port, slot);
3377 i = MAX_CACHEENTRY - 1;
3384 if ((mce->mc_port == port) && (mce->mc_slot == slot) && (mce->wr_flag != 0)) {
3388 if (r != sceMcResSucceed)
3395 return sceMcResSucceed;
3401 register int r, i, j, ecc_count;
3402 register int temp1, temp2, offset, pageindex;
3403 static int clusters_per_block, blocksize, cardtype, pagesize, sparesize, flag, cluster, block, pages_per_fatclust;
3407 static u8 eccbuf[32];
3408 void *p_page, *p_ecc;
3410 DPRINTF(
"mcman_flushcacheentry mce %x cluster %x\n", (
int)mce, (
int)mce->cluster);
3412 if (mce->wr_flag == 0)
3413 return sceMcResSucceed;
3415 mcdi = (
MCDevInfo *)&mcman_devinfos[mce->mc_port][mce->mc_slot];
3418 pagesize = mcdi->pagesize;
3419 cardtype = mcdi->cardtype;
3421 if (cardtype == 0) {
3423 return sceMcResSucceed;
3426 if ((cardtype == sceMcTypePS1) || (cardtype == sceMcTypePDA)) {
3427 pages_per_fatclust = MCMAN_CLUSTERSIZE / pagesize;
3432 if (pages_per_fatclust > 0) {
3436 if (((mce->wr_flag >> j) & 1) != 0) {
3438 r = McWritePS1PDACard(mce->mc_port, mce->mc_slot, i, (
void *)(mce->cl_data + (pagesize * j)));
3439 if (r == sceMcResFailReplace)
3441 if (r != sceMcResSucceed)
3446 }
while (++j < pages_per_fatclust);
3449 if (j == pages_per_fatclust) {
3450 r = mcman_probePS1Card2(mce->mc_port, mce->mc_slot);
3452 r = sceMcResFailReplace;
3454 if (cardtype != sceMcTypePS1) {
3455 if (r == sceMcResFailReplace)
3459 return sceMcResSucceed;
3463 return sceMcResSucceed;
3466 if ((mce->wr_flag & ~(((u32)(-1)) << j)) == 0) {
3468 return sceMcResSucceed;
3473 return sceMcResSucceed;
3479 if (((mce->wr_flag >> j) & 1) != 0) {
3480 r = mcman_fillPS1backuparea(mce->mc_port, mce->mc_slot, i);
3481 if (r != sceMcResSucceed)
3482 return sceMcResFailReplace;
3489 return sceMcResSucceed;
3492 clusters_per_block = mcdi->clusters_per_block;
3493 block = mce->cluster / mcdi->clusters_per_block;
3494 blocksize = mcdi->blocksize;
3495 sparesize = mcman_sparesize(mce->mc_port, mce->mc_slot);
3498 memset((
void *)pmce, 0, 64);
3501 if (MAX_CACHEENTRY > 0) {
3504 if ((mcee->mc_slot == mce->mc_slot) && (mcee->mc_port == mce->mc_port)) {
3505 temp1 = mcee->cluster / clusters_per_block;
3506 temp2 = mcee->cluster % clusters_per_block;
3508 if (temp1 == block) {
3510 if (mcee->rd_flag == 0)
3515 }
while (++i < MAX_CACHEENTRY);
3518 if (clusters_per_block > 0) {
3521 cluster = block * clusters_per_block;
3527 for (j = 0; j < mcdi->pages_per_cluster; j++) {
3528 mcman_pagedata[pageindex + j] = (
void *)(pmce[i]->cl_data + offset);
3537 offset = (pageindex + j) * pagesize;
3538 mcman_pagedata[pageindex + j] = (
void *)(mcman_backupbuf + offset);
3540 r = McReadPage(mce->mc_port, mce->mc_slot, \
3541 ((cluster + i) * mcdi->pages_per_cluster) + j, \
3542 mcman_backupbuf + offset);
3543 if (r != sceMcResSucceed)
3546 }
while (++j < mcdi->pages_per_cluster);
3549 pageindex += mcdi->pages_per_cluster;
3550 }
while (++i < clusters_per_block);
3554 if ((flag != 0) && (mcman_badblock <= 0)) {
3555 r = mcman_eraseblock(mce->mc_port, mce->mc_slot, mcdi->backup_block1, (
void**)mcman_pagedata, mcman_eccdata);
3556 if (r == sceMcResFailReplace) {
3558 r = mcman_replaceBackupBlock(mce->mc_port, mce->mc_slot, mcdi->backup_block1);
3559 mcdi->backup_block1 = r;
3562 if (r != sceMcResSucceed)
3567 p_ecc = (
void *)eccbuf;
3572 ecc_count = (pagesize + 0x7f) >> 7;
3574 ecc_count = pagesize >> 7;
3579 McDataChecksum(p_page, p_ecc);
3581 p_ecc = (
void *)((u8 *)p_ecc + 3);
3582 p_page = (
void *)((u8 *)p_page + 128);
3587 r = McWritePage(mce->mc_port, mce->mc_slot, mcdi->backup_block2 * blocksize, &
mcman_pagebuf, eccbuf);
3588 if (r == sceMcResFailReplace)
3590 if (r != sceMcResSucceed)
3593 if (r < mcdi->blocksize) {
3595 p_ecc = (
void *)mcman_eccdata;
3598 r = McWritePage(mce->mc_port, mce->mc_slot, (mcdi->backup_block1 * blocksize) + i, mcman_pagedata[i], p_ecc);
3599 if (r == sceMcResFailReplace)
3601 if (r != sceMcResSucceed)
3603 p_ecc = (
void *)((u8 *)p_ecc + sparesize);
3604 }
while (++i < mcdi->blocksize);
3607 r = McWritePage(mce->mc_port, mce->mc_slot, (mcdi->backup_block2 * blocksize) + 1, &
mcman_pagebuf, eccbuf);
3608 if (r == sceMcResFailReplace)
3610 if (r != sceMcResSucceed)
3614 r = mcman_eraseblock(mce->mc_port, mce->mc_slot, block, (
void**)mcman_pagedata, mcman_eccdata);
3617 if (r == sceMcResFailReplace) {
3618 r = mcman_fillbackupblock1(mce->mc_port, mce->mc_slot, block, (
void**)mcman_pagedata, mcman_eccdata);
3619 for (i = 0; i < clusters_per_block; i++) {
3621 pmce[i]->wr_flag = 0;
3623 if (r == sceMcResFailReplace)
3627 if (r != sceMcResSucceed)
3630 if (mcdi->blocksize > 0) {
3632 p_ecc = (
void *)mcman_eccdata;
3635 if (pmce[i / mcdi->pages_per_cluster] == 0) {
3636 r = McWritePage(mce->mc_port, mce->mc_slot, (block * blocksize) + i, mcman_pagedata[i], p_ecc);
3637 if (r == sceMcResFailReplace) {
3638 r = mcman_fillbackupblock1(mce->mc_port, mce->mc_slot, block, (
void**)mcman_pagedata, mcman_eccdata);
3639 for (i = 0; i < clusters_per_block; i++) {
3641 pmce[i]->wr_flag = 0;
3643 if (r == sceMcResFailReplace)
3647 if (r != sceMcResSucceed)
3650 p_ecc = (
void *)((u8 *)p_ecc + sparesize);
3651 }
while (++i < mcdi->blocksize);
3654 if (mcdi->blocksize > 0) {
3656 p_ecc = (
void *)mcman_eccdata;
3659 if (pmce[i / mcdi->pages_per_cluster] != 0) {
3660 r = McWritePage(mce->mc_port, mce->mc_slot, (block * blocksize) + i, mcman_pagedata[i], p_ecc);
3661 if (r == sceMcResFailReplace) {
3662 r = mcman_fillbackupblock1(mce->mc_port, mce->mc_slot, block, (
void**)mcman_pagedata, mcman_eccdata);
3663 for (i = 0; i < clusters_per_block; i++) {
3665 pmce[i]->wr_flag = 0;
3667 if (r == sceMcResFailReplace)
3671 if (r != sceMcResSucceed)
3674 p_ecc = (
void *)((u8 *)p_ecc + sparesize);
3675 }
while (++i < mcdi->blocksize);
3678 if (clusters_per_block > 0) {
3682 pmce[i]->wr_flag = 0;
3683 }
while (++i < clusters_per_block);
3686 if ((flag != 0) && (mcman_badblock <= 0)) {
3687 r = mcman_eraseblock(mce->mc_port, mce->mc_slot, mcdi->backup_block2, NULL, NULL);
3688 if (r == sceMcResFailReplace) {
3691 if (r != sceMcResSucceed)
3697 r = mcman_replaceBackupBlock(mce->mc_port, mce->mc_slot, mcdi->backup_block2);
3698 mcdi->backup_block2 = r;
3702 return sceMcResSucceed;
3706int McReadCluster(
int port,
int slot,
int cluster,
McCacheEntry **pmce)
3709 register MCDevInfo *mcdi = &mcman_devinfos[port][slot];
3712 if (mcman_badblock > 0) {
3713 register int block, block_offset;
3715 block = cluster / mcdi->clusters_per_block;
3716 block_offset = cluster % mcdi->clusters_per_block;
3718 if ((block == mcman_badblock) && (mcman_badblock_port == port) && (mcman_badblock_slot == slot)) {
3719 cluster = (mcdi->backup_block1 * mcdi->clusters_per_block) + block_offset;
3723 for (i = 0; (u32)i < mcdi->clusters_per_block; i++) {
3724 if ((mcman_replacementcluster[i] != 0) && (mcman_replacementcluster[i] == cluster)) {
3725 block_offset = i % mcdi->clusters_per_block;
3726 cluster = (mcdi->backup_block1 * mcdi->clusters_per_block) + block_offset;
3733 mce = mcman_getcacheentry(port, slot, cluster);
3737 mce = pmcman_mccache[MAX_CACHEENTRY - 1];
3739 if (mce->wr_flag != 0) {
3741 if (r != sceMcResSucceed)
3745 mce->mc_port = port;
3746 mce->mc_slot = slot;
3747 mce->cluster = cluster;
3751 for (i = 0; i < mcdi->pages_per_cluster; i++) {
3752 r = McReadPage(port, slot, (cluster * mcdi->pages_per_cluster) + i, \
3753 (
void *)(mce->cl_data + (i * mcdi->pagesize)));
3754 if (r != sceMcResSucceed)
3759 mcman_addcacheentry(mce);
3762 return sceMcResSucceed;
3766int McReadDirEntry(
int port,
int slot,
int cluster,
int fsindex,
McFsEntry **pfse)
3769 static int maxent, index, clust;
3770 register MCDevInfo *mcdi = &mcman_devinfos[port][slot];
3771 register McFatCache *fci = &mcman_fatcache[port][slot];
3774 DPRINTF(
"McReadDirEntry port%d slot%d cluster %d fsindex %d\n", port, slot, cluster, fsindex);
3776 maxent = 0x402 / (mcdi->cluster_size >> 9);
3777 index = fsindex / (mcdi->cluster_size >> 9);
3781 if ((cluster == 0) && (index != 0)) {
3782 if (index < maxent) {
3783 if ((fci->entry[index]) >= 0 )
3784 clust = fci->entry[index];
3790 if (fci->entry[i] < 0)
3792 clust = fci->entry[i];
3793 }
while (++i < index);
3800 r = McGetFATentry(port, slot, clust, &clust);
3801 if (r != sceMcResSucceed)
3804 if ((
unsigned int)clust == 0xffffffff)
3805 return sceMcResNoEntry;
3806 clust &= ~0x80000000;
3811 fci->entry[i] = clust;
3813 }
while (i < index);
3816 r = McReadCluster(port ,slot, mcdi->alloc_offset + clust, &mce);
3817 if (r != sceMcResSucceed)
3820 *pfse = (
McFsEntry *)(mce->cl_data + ((fsindex % (mcdi->cluster_size >> 9)) << 9));
3822 return sceMcResSucceed;
3826int mcman_readdirentryPS1(
int port,
int slot,
int cluster,
McFsEntryPS1 **pfse)
3828 register int r, offset, index, pages_per_fatclust;
3830 register MCDevInfo *mcdi = &mcman_devinfos[port][slot];
3833 if (cluster < 0 || cluster >= 15)
3836 pages_per_fatclust = MCMAN_CLUSTERSIZE / mcdi->pagesize;
3839 index = cluster / pages_per_fatclust;
3840 offset = cluster % pages_per_fatclust;
3842 r = mcman_readclusterPS1(port, slot, index * pages_per_fatclust, &mce);
3843 if (r != sceMcResSucceed)
3846 *pfse = (
void *)&mce->cl_data[offset << 7];
3848#ifdef BUILDING_XMCMAN
3853 return sceMcResSucceed;
3857int McSetFATentry(
int port,
int slot,
int fat_index,
int fat_entry)
3859 register int r, ifc_index, indirect_index, indirect_offset, fat_offset;
3861 register MCDevInfo *mcdi = &mcman_devinfos[port][slot];
3865 indirect_index = fat_index / mcdi->FATentries_per_cluster;
3866 fat_offset = fat_index % mcdi->FATentries_per_cluster;
3868 ifc_index = indirect_index / mcdi->FATentries_per_cluster;
3869 indirect_offset = indirect_index % mcdi->FATentries_per_cluster;
3871 r = McReadCluster(port, slot, mcdi->ifc_list[ifc_index], &mce);
3872 if (r != sceMcResSucceed)
3877 r = McReadCluster(port, slot, fc->entry[indirect_offset], &mce);
3878 if (r != sceMcResSucceed)
3883 fc->entry[fat_offset] = fat_entry;
3886 return sceMcResSucceed;
3890int McGetFATentry(
int port,
int slot,
int fat_index,
int *fat_entry)
3892 register int r, ifc_index, indirect_index, indirect_offset, fat_offset;
3894 register MCDevInfo *mcdi = &mcman_devinfos[port][slot];
3896 indirect_index = fat_index / mcdi->FATentries_per_cluster;
3897 fat_offset = fat_index % mcdi->FATentries_per_cluster;
3899 ifc_index = indirect_index / mcdi->FATentries_per_cluster;
3900 indirect_offset = indirect_index % mcdi->FATentries_per_cluster;
3902 r = McReadCluster(port, slot, mcdi->ifc_list[ifc_index], &mce);
3903 if (r != sceMcResSucceed)
3908 r = McReadCluster(port, slot, fc->entry[indirect_offset], &mce);
3909 if (r != sceMcResSucceed)
3914 *fat_entry = fc->entry[fat_offset];
3916 return sceMcResSucceed;
3920int mcman_readclusterPS1(
int port,
int slot,
int cluster,
McCacheEntry **pmce)
3922 register MCDevInfo *mcdi = &mcman_devinfos[port][slot];
3925 mce = mcman_getcacheentry(port, slot, cluster);
3927 register int r, i, pages_per_fatclust;
3929 mce = pmcman_mccache[MAX_CACHEENTRY - 1];
3931 if (mce->wr_flag != 0) {
3933 if (r != sceMcResSucceed)
3937 mce->mc_port = port;
3938 mce->mc_slot = slot;
3939 mce->cluster = cluster;
3941 pages_per_fatclust = MCMAN_CLUSTERSIZE / mcdi->pagesize;
3943 for (i = 0; i < pages_per_fatclust; i++) {
3944 r = McReadPS1PDACard(port, slot, cluster + i, (
void *)(mce->cl_data + (i * mcdi->pagesize)));
3945 if (r != sceMcResSucceed)
3950 mcman_addcacheentry(mce);
3953 return sceMcResSucceed;
3957int mcman_replaceBackupBlock(
int port,
int slot,
int block)
3960 register MCDevInfo *mcdi = &mcman_devinfos[port][slot];
3962 if (mcman_badblock > 0)
3963 return sceMcResFailReplace;
3965 for (i = 0; i < 16; i++) {
3966 if (mcdi->bad_block_list[i] == -1)
3971 if ((mcdi->alloc_end - mcdi->max_allocatable_clusters) < 8)
3972 return sceMcResFullDevice;
3974 mcdi->alloc_end -= 8;
3975 mcdi->bad_block_list[i] = block;
3976 mcman_badblock_port = port;
3977 mcman_badblock_slot = slot;
3978 mcman_badblock = -1;
3980 return (mcdi->alloc_offset + mcdi->alloc_end) / mcdi->clusters_per_block;
3983 return sceMcResFullDevice;
3987int mcman_fillbackupblock1(
int port,
int slot,
int block,
void **pagedata,
void *eccdata)
3989 register int r, i, sparesize, page_offset;
3990 register MCDevInfo *mcdi = &mcman_devinfos[port][slot];
3993 DPRINTF(
"mcman_fillbackupblock1 port%d slot%d block %x mcman_badblock %x\n", port, slot, block, mcman_badblock);
3995 sparesize = mcman_sparesize(port, slot);
3997 if (mcman_badblock != 0) {
3998 if ((mcman_badblock != block) || (mcman_badblock_port != port) || (mcman_badblock_slot != slot))
3999 return sceMcResFailReplace;
4002 if ((mcdi->alloc_offset / mcdi->clusters_per_block) == (u32)block)
4003 return sceMcResFailReplace;
4005 r = mcman_eraseblock(port, slot, mcdi->backup_block2, NULL, NULL);
4006 if (r != sceMcResSucceed)
4009 r = mcman_eraseblock(port, slot, mcdi->backup_block1, NULL, NULL);
4010 if (r != sceMcResSucceed)
4013 for (i = 0; i < 16; i++) {
4014 if (mcdi->bad_block_list[i] == -1)
4019 return sceMcResFailReplace;
4021 page_offset = mcdi->backup_block1 * mcdi->blocksize;
4022 p_ecc = (u8 *)eccdata;
4024 for (i = 0; i < mcdi->blocksize; i++) {
4025 r = McWritePage(port, slot, page_offset + i, pagedata[i], p_ecc);
4026 if (r != sceMcResSucceed)
4031 mcman_badblock_port = port;
4032 mcman_badblock_slot = slot;
4033 mcman_badblock = block;
4037 mcman_replacementcluster[i] = 0;
4040 return sceMcResSucceed;
4044int McReplaceBadBlock(
void)
4046 register int r, i, curentry, clust, index, offset, numifc, fat_length, temp, length;
4047 register int value, value2, cluster, index2, offset2, s3;
4048 register MCDevInfo *mcdi = &mcman_devinfos[mcman_badblock_port][mcman_badblock_slot];
4054 DPRINTF(
"McReplaceBadBlock mcman_badblock_port%d mcman_badblock_slot%d mcman_badblock %x\n", mcman_badblock_port, mcman_badblock_slot, mcman_badblock);
4056 if (mcman_badblock == 0)
4057 return sceMcResSucceed;
4059 if (mcman_badblock >= 0) {
4060 McFlushCache(mcman_badblock_port, mcman_badblock_slot);
4061 mcman_clearcache(mcman_badblock_port, mcman_badblock_slot);
4063 for (i = 0; i <16; i++) {
4064 if (mcdi->bad_block_list[i] == -1)
4070 if (mcdi->alloc_end >= (mcdi->max_allocatable_clusters + 8)) {
4071 mcdi->max_allocatable_clusters += 8;
4072 mcdi->bad_block_list[i] = mcman_badblock;
4075 fat_length = (((mcdi->clusters_per_card << 2) - 1) / mcdi->cluster_size) + 1;
4076 numifc = (((fat_length << 2) - 1) / mcdi->cluster_size) + 1;
4080 fat_length = mcdi->FATentries_per_cluster << 5;
4084 value = ~(((u32)(-1)) << mcdi->clusters_per_block);
4086 clust = (mcman_badblock * mcdi->clusters_per_block) + i;
4087 if ((u32)clust < mcdi->alloc_offset) {
4091 r = McGetFATentry(mcman_badblock_port, mcman_badblock_slot, clust - mcdi->alloc_offset, &fat_entry[i]);
4092 if (r != sceMcResSucceed)
4095 if (((fat_entry[i] & 0x80000000) == 0) || ((fat_entry[i] < -1) && (fat_entry[i] >= -9)))
4098 }
while ((u32)(++i) < mcdi->clusters_per_block);
4100 if (mcdi->clusters_per_block > 0) {
4103 if ((value & (1 << i)) != 0) {
4104 r = mcman_findfree2(mcman_badblock_port, mcman_badblock_slot, 1);
4106 mcman_replacementcluster[i] = r;
4109 r += mcdi->alloc_offset;
4110 mcman_replacementcluster[i] = r;
4112 }
while ((u32)(++i) < mcdi->clusters_per_block);
4115 if (mcdi->clusters_per_block > 0) {
4118 if ((value & (1 << i)) != 0) {
4119 if (fat_entry[i] != 0) {
4120 index = ((fat_entry[i] & ~0x80000000) + mcdi->alloc_offset) / mcdi->clusters_per_block;
4121 offset = ((fat_entry[i] & ~0x80000000) + mcdi->alloc_offset) % mcdi->clusters_per_block;
4122 if (index == mcman_badblock) {
4123 fat_entry[i] = (mcman_replacementcluster[offset] - mcdi->alloc_offset) | 0x80000000;
4127 }
while ((u32)(++i) < mcdi->clusters_per_block);
4130 if (mcdi->clusters_per_block > 0) {
4133 if ((mcman_replacementcluster[i] != 0) && (fat_entry[i] != 0)) {
4134 r = McSetFATentry(mcman_badblock_port, mcman_badblock_slot, mcman_replacementcluster[i] + mcdi->alloc_offset, fat_entry[i]);
4135 if (r != sceMcResSucceed)
4138 }
while ((u32)(++i) < mcdi->clusters_per_block);
4141 for (i = 0; i < numifc; i++) {
4142 index = mcdi->ifc_list[i] / mcdi->clusters_per_block;
4143 offset = mcdi->ifc_list[i] % mcdi->clusters_per_block;
4145 if (index == mcman_badblock) {
4146 value &= ~(1 << offset);
4147 mcdi->ifc_list[i] = mcman_replacementcluster[i];
4154 for (i = 0; i < fat_length; i++) {
4155 index = i / mcdi->FATentries_per_cluster;
4156 offset = i % mcdi->FATentries_per_cluster;
4159 r = McReadCluster(mcman_badblock_port, mcman_badblock_slot, mcdi->ifc_list[index], &mce);
4160 if (r != sceMcResSucceed)
4163 offset = i % mcdi->FATentries_per_cluster;
4164 index2 = *((u32 *)&mce->cl_data[offset]) / mcdi->clusters_per_block;
4165 offset2 = *((u32 *)&mce->cl_data[offset]) % mcdi->clusters_per_block;
4167 if (index2 == mcman_badblock) {
4168 value &= ~(1 << offset2);
4169 *((u32 *)&mce->cl_data[offset]) = mcman_replacementcluster[offset2];
4174 McFlushCache(mcman_badblock_port, mcman_badblock_slot);
4175 mcman_clearcache(mcman_badblock_port, mcman_badblock_slot);
4182 for (i = 0; (u32)i < mcdi->alloc_end; i++) {
4183 r = McGetFATentry(mcman_badblock_port, mcman_badblock_slot, i, &fat_entry2);
4184 if (r != sceMcResSucceed)
4187 index = (u32)(((fat_entry2 & ~0x80000000) + mcdi->alloc_offset) / mcdi->clusters_per_block);
4188 offset = (u32)(((fat_entry2 & ~0x80000000) + mcdi->alloc_offset) % mcdi->clusters_per_block);
4190 if (index == mcman_badblock) {
4191 value &= ~(1 << offset);
4192 r = McSetFATentry(mcman_badblock_port, mcman_badblock_slot, i, (mcman_replacementcluster[offset] - mcdi->alloc_offset) | 0x80000000);
4193 if (r != sceMcResSucceed)
4198 if (value2 != value)
4199 McFlushCache(mcman_badblock_port, mcman_badblock_slot);
4201 r = McReadDirEntry(mcman_badblock_port, mcman_badblock_slot, 0, 0, &fse);
4202 if (r != sceMcResSucceed)
4207 length = fse->length;
4210 if (curentry >= length)
4213 r = McReadDirEntry(mcman_badblock_port, mcman_badblock_slot, s3, curentry, &fse);
4214 if (r != sceMcResSucceed)
4217 cluster = fse->cluster;
4218 index = (fse->cluster + mcdi->alloc_offset) / mcdi->clusters_per_block;
4219 offset = (fse->cluster + mcdi->alloc_offset) % mcdi->clusters_per_block;
4223 if (index == mcman_badblock) {
4224 fse->cluster = mcman_replacementcluster[offset] - mcdi->alloc_offset;
4225 Mc1stCacheEntSetWrFlagOff();
4228 if ((fse->mode & sceMcFileAttrSubdir) == 0) {
4233 r = McReadDirEntry(mcman_badblock_port, mcman_badblock_slot, cluster, 0, &fse);
4234 if (r != sceMcResSucceed)
4237 if ((fse->mode & sceMcFileAttrSubdir) == 0) {
4242 if (fse->cluster != 0) {
4247 if ((
int)(fse->dir_entry) != curentry) {
4254 if (strcmp(fse->name,
"."))
4263 r = McReadDirEntry(mcman_badblock_port, mcman_badblock_slot, s3, 1, &fse);
4264 if (r != sceMcResSucceed)
4267 index = (fse->cluster + mcdi->alloc_offset) / mcdi->clusters_per_block;
4268 offset = (fse->cluster + mcdi->alloc_offset) % mcdi->clusters_per_block;
4270 if (index == mcman_badblock) {
4271 fse->cluster = mcman_replacementcluster[offset] - mcdi->alloc_offset;
4272 Mc1stCacheEntSetWrFlagOff();
4275 r = McReadDirEntry(mcman_badblock_port, mcman_badblock_slot, fse->cluster, fse->dir_entry, &fse);
4276 if (r != sceMcResSucceed)
4279 length = fse->length;
4281 r = McReadDirEntry(mcman_badblock_port, mcman_badblock_slot, s3, 0, &fse);
4282 if (r != sceMcResSucceed)
4286 index = (fse->cluster + mcdi->alloc_offset) / mcdi->clusters_per_block;
4287 offset = (fse->cluster + mcdi->alloc_offset) % mcdi->clusters_per_block;
4288 curentry = fse->dir_entry + 1;
4290 if (index == mcman_badblock) {
4291 fse->cluster = mcman_replacementcluster[offset] - mcdi->alloc_offset;
4292 Mc1stCacheEntSetWrFlagOff();
4302 if (mcdi->clusters_per_block > 0) {
4305 clust = (mcman_badblock * mcdi->clusters_per_block) + i;
4306 if ((u32)clust >= mcdi->alloc_offset) {
4307 r = McSetFATentry(mcman_badblock_port, mcman_badblock_slot, clust - mcdi->alloc_offset, 0xfffffffd);
4308 if (r != sceMcResSucceed)
4311 }
while ((u32)(++i) < mcdi->clusters_per_block);
4314 McFlushCache(mcman_badblock_port, mcman_badblock_slot);
4315 mcman_clearcache(mcman_badblock_port, mcman_badblock_slot);
4319 if (mcdi->clusters_per_block > 0) {
4322 if (mcman_replacementcluster[i] != 0) {
4323 r = McReadCluster(mcman_badblock_port, mcman_badblock_slot, (mcdi->backup_block1 * mcdi->clusters_per_block) + i, &mce);
4324 if (r != sceMcResSucceed)
4327 mce->cluster = mcman_replacementcluster[i];
4330 }
while ((u32)(++i) < mcdi->clusters_per_block);
4333 McFlushCache(mcman_badblock_port, mcman_badblock_slot);
4339 r = mcman_clearsuperblock(mcman_badblock_port, mcman_badblock_slot);
4344 return sceMcResFailReplace;
4348int mcman_clearsuperblock(
int port,
int slot)
4351 register MCDevInfo *mcdi = &mcman_devinfos[port][slot];
4355 memset((
void *)mcdi->magic, 0, sizeof (mcdi->magic) + sizeof (mcdi->version));
4356 strcpy(mcdi->magic, SUPERBLOCK_MAGIC);
4357 strcat(mcdi->magic, SUPERBLOCK_VERSION);
4359 for (i = 0; (u32)((
unsigned int)i <
sizeof(
MCDevInfo)); i += 1024) {
4360 register int size, temp;
4365 r = McReadCluster(port, slot, temp >> 10, &mce);
4366 if (r != sceMcResSucceed)
4375 memcpy((
void *)mce->cl_data, (
void *)mcdi, size);
4378 r = McFlushCache(port, slot);
int CpuResumeIntr(int state)
int CpuSuspendIntr(int *state)
u32 count
start sector of fragmented bd/file