Subversion Repositories freemyipod

Rev

Rev 618 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 618 Rev 942
Line 31... Line 31...
31
    {
31
    {
32
        int sector;
32
        int sector;
33
        if (sscanf(line, "%i", &sector) == 1 && sector) mark_bad(bitmap, sector);
33
        if (sscanf(line, "%i", &sector) == 1 && sector) mark_bad(bitmap, sector);
34
    }
34
    }
35
    fclose(in);
35
    fclose(in);
36
    int l0count = (sectors + 0x7ffff) >> 19;
36
    int l0count = (sectors + 0xfffff) >> 19;
37
    int bbtpages = 64 + ((l0count + 0x3f) & ~0x3f);
37
    int bbtpages = 64 + ((l0count + 0x3f) & ~0x3f);
38
    int bbtsize;
38
    int bbtsize;
39
    uint16_t (*bbt)[0x20];
39
    uint16_t (*bbt)[0x20];
40
    bool success = false;
40
    bool success = false;
41
    while (bbtpages <= 32832)
41
    while (bbtpages <= 32832)
42
    {
42
    {
43
        bbtsize = bbtpages << 6;
43
        bbtsize = bbtpages << 6;
44
        l0count = (sectors - bbtsize + 0xfffff) >> 19;
44
        l0count = (sectors - ((bbtsize + 0xfff) >> 12) + 0xfffff) >> 19;
45
        bbt = malloc(bbtsize);
45
        bbt = malloc(bbtsize);
46
        memset(bbt, 0, bbtsize);
46
        memset(bbt, 0, bbtsize);
47
        int logical = 0;
47
        int logical = 0;
48
        int physical = 1;
48
        int physical = 1;
49
        int remapbase;
49
        int remapbase;
Line 62... Line 62...
62
        {
62
        {
63
            if (!(logical & 0x7fff)) level = 0;
63
            if (!(logical & 0x7fff)) level = 0;
64
            else if (!(logical & 0x3ff)) level = 1;
64
            else if (!(logical & 0x3ff)) level = 1;
65
            else if (!(logical & 0x1f)) level = 2;
65
            else if (!(logical & 0x1f)) level = 2;
66
            else level = 3;
66
            else level = 3;
67
            if (!level) remapbase = ((physical - logical) >> 12) << 12;
67
            if (!level) remapbase = (physical - logical) & ~0xfff;
68
            if (physical - logical - remapbase > 0x7fff || remapbase > 0xffff)
68
            if (physical - logical - remapbase > 0x7fff || remapbase > 0xffff)
69
            {
69
            {
70
                printf("Need to remap across too high distance!\n");
70
                printf("Need to remap across too high distance!\n");
71
                return 5;
71
                return 5;
72
            }
72
            }
Line 165... Line 165...
165
            printf("Level 0: %d pages, Level 1: %d pages, Level 2: %d pages, Level 3: %d pages\n",
165
            printf("Level 0: %d pages, Level 1: %d pages, Level 2: %d pages, Level 3: %d pages\n",
166
                   l0count, l1count, l2count, l3count);
166
                   l0count, l1count, l2count, l3count);
167
            printf("User data sectors: %d (%d KiB)\n", logical, logical << 2);
167
            printf("User data sectors: %d (%d KiB)\n", logical, logical << 2);
168
            memcpy(bbt, "emBIbbth", 8);
168
            memcpy(bbt, "emBIbbth", 8);
169
            ((uint32_t*)bbt)[0x1fc] = logical;
169
            ((uint32_t*)bbt)[0x1fc] = logical;
170
            ((uint32_t*)bbt)[0x1ff] = (bbtpages >> 6) - 1;
170
            ((uint32_t*)bbt)[0x1ff] = bbtgood;
171
            break;
171
            break;
172
        }
172
        }
173
        free(bbt);
173
        free(bbt);
174
        bbtpages += 64;
174
        bbtpages += 64;
175
    }
175
    }