Clear high 4 bits of FAT32 FAT table entries & diagnostics. From FD 1.0

kernel.


git-svn-id: https://svn.code.sf.net/p/freedos/svn/kernel/trunk@1303 6ac86273-5f31-0410-b378-82cca8765d1b
This commit is contained in:
Bart Oldeman 2006-10-31 21:05:09 +00:00
parent 4768a9d2f8
commit c952ceff61

View File

@ -51,8 +51,19 @@ int ISFAT32(struct dpb FAR * dpbp)
} }
#endif #endif
void clusterMessage(const char * msg, CLUSTER clussec)
{
put_string(msg);
#ifdef WITHFAT32
put_unsigned((unsigned)(clussec >> 16), 16, 4);
#endif
put_unsigned((unsigned)(clussec & 0xffffu), 16, 4);
put_console('\n');
}
struct buffer FAR *getFATblock(struct dpb FAR * dpbp, CLUSTER clussec) struct buffer FAR *getFATblock(struct dpb FAR * dpbp, CLUSTER clussec)
{ {
/* *** why dpbp->dpb_unit? only useful to know in context of the dpbp...? *** */
struct buffer FAR *bp = getblock(clussec, dpbp->dpb_unit); struct buffer FAR *bp = getblock(clussec, dpbp->dpb_unit);
if (bp) if (bp)
@ -61,7 +72,7 @@ struct buffer FAR *getFATblock(struct dpb FAR * dpbp, CLUSTER clussec)
bp->b_flag |= BFR_FAT | BFR_VALID; bp->b_flag |= BFR_FAT | BFR_VALID;
bp->b_dpbp = dpbp; bp->b_dpbp = dpbp;
bp->b_copies = dpbp->dpb_fats; bp->b_copies = dpbp->dpb_fats;
bp->b_offset = dpbp->dpb_fatsize; bp->b_offset = dpbp->dpb_fatsize; /* 0 for FAT32 but blockio.c knows that */
#ifdef WITHFAT32 #ifdef WITHFAT32
if (ISFAT32(dpbp)) if (ISFAT32(dpbp))
{ {
@ -69,6 +80,8 @@ struct buffer FAR *getFATblock(struct dpb FAR * dpbp, CLUSTER clussec)
bp->b_copies = 1; bp->b_copies = 1;
} }
#endif #endif
} else {
clusterMessage("getFATblock failed: 0x",clussec);
} }
return bp; return bp;
} }
@ -119,12 +132,16 @@ void write_fsinfo(struct dpb FAR * dpbp)
/* 12 bytes are compressed to 9 bytes */ /* 12 bytes are compressed to 9 bytes */
/* */ /* */
/* either read the value at Cluster1 (if Cluster2 is READ_CLUSTER) */
/* or write the Cluster2 value to the FAT entry at Cluster1 */
/* returns: the cluster number (or 1 on error) for read mode */
/* returns: SUCCESS (or 1 on error) for write mode */
CLUSTER link_fat(struct dpb FAR * dpbp, CLUSTER Cluster1, CLUSTER link_fat(struct dpb FAR * dpbp, CLUSTER Cluster1,
REG CLUSTER Cluster2) REG CLUSTER Cluster2)
{ {
struct buffer FAR *bp; struct buffer FAR *bp;
unsigned idx; unsigned idx;
unsigned secdiv; unsigned secdiv; /* FAT entries per sector; nibbles for FAT12! */
unsigned char wasfree; unsigned char wasfree;
CLUSTER clussec = Cluster1; CLUSTER clussec = Cluster1;
CLUSTER max_cluster = dpbp->dpb_size; CLUSTER max_cluster = dpbp->dpb_size;
@ -136,12 +153,7 @@ CLUSTER link_fat(struct dpb FAR * dpbp, CLUSTER Cluster1,
if (clussec <= 1 || clussec > max_cluster) if (clussec <= 1 || clussec > max_cluster)
{ {
put_string("run CHKDSK: trying to access invalid cluster 0x"); clusterMessage("run CHKDSK: invalid cluster nr. 0x",clussec);
#ifdef WITHFAT32
put_unsigned((unsigned)(clussec >> 16), 16, 4);
#endif
put_unsigned((unsigned)(clussec & 0xffffu), 16, 4);
put_console('\n');
return 1; return 1;
} }
@ -178,8 +190,9 @@ CLUSTER link_fat(struct dpb FAR * dpbp, CLUSTER Cluster1,
/* Get the block that this cluster is in */ /* Get the block that this cluster is in */
bp = getFATblock(dpbp, clussec); bp = getFATblock(dpbp, clussec);
if (bp == NULL) if (bp == NULL) {
return 1; /* the only error code possible here */ return 1; /* the only error code possible here */
}
if (ISFAT12(dpbp)) if (ISFAT12(dpbp))
{ {
@ -285,7 +298,7 @@ CLUSTER link_fat(struct dpb FAR * dpbp, CLUSTER Cluster1,
{ {
/* form an index so that we can read the block as a */ /* form an index so that we can read the block as a */
/* byte array */ /* byte array */
UDWORD res = fgetlong(&bp->b_buffer[idx * 4]); UDWORD res = fgetlong(&bp->b_buffer[idx * 4]) & LONG_LAST_CLUSTER;
if (Cluster2 == READ_CLUSTER) if (Cluster2 == READ_CLUSTER)
{ {
if (res > LONG_BAD) if (res > LONG_BAD)
@ -295,14 +308,16 @@ CLUSTER link_fat(struct dpb FAR * dpbp, CLUSTER Cluster1,
} }
/* Finally, put the word into the buffer and mark the */ /* Finally, put the word into the buffer and mark the */
/* buffer as dirty. */ /* buffer as dirty. */
fputlong(&bp->b_buffer[idx * 4], Cluster2); fputlong(&bp->b_buffer[idx * 4], Cluster2 & LONG_LAST_CLUSTER);
wasfree = 0; wasfree = 0;
if (res == FREE) if (res == FREE)
wasfree = 1; wasfree = 1;
} }
#endif #endif
else else {
put_string("link_fat: unsupported FAT type");
return 1; return 1;
}
/* update the free space count */ /* update the free space count */
bp->b_flag |= BFR_DIRTY | BFR_VALID; bp->b_flag |= BFR_DIRTY | BFR_VALID;