home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
rtsi.com
/
2014.01.www.rtsi.com.tar
/
www.rtsi.com
/
OS9
/
OSK
/
SRC
/
msdos_diskaccess.lzh
/
MS_DISK_ACCESS
/
getfat.c
< prev
next >
Wrap
Text File
|
1990-05-10
|
1KB
|
50 lines
/*
* Get and decode a FAT (file allocation table) entry. The FAT entries
* are 1.5 bytes long and switch nibbles (.5 byte) according to whether
* or not the entry starts on a byte boundary. Returns the cluster
* number on success or -1 on failure.
*/
#include "msdos.h"
extern int fat_len;
extern unsigned char *fatbuf;
int
getfat(num)
int num;
{
/*
* | byte n | byte n+1 | byte n+2 |
* |0|1|2|3|4|5|6|7|0|1|2|3|4|5|6|7|0|1|2|3|4|5|6|7|
* | | | | | | | | | | | | | | | | | | | | | | | | |
* | n.0 | n.5 | n+1.0 | n+1.5 | n+2.0 | n+2.5 |
* \_____ \____ \______/________/_____ /
* ____\______\________/ _____/ ____\_/
* / \ \ / / \
* | n+1.5 | n.0 | n.5 | n+2.0 | n+2.5 | n+1.0 |
* | FAT entry k | FAT entry k+1 |
*/
unsigned int fat_hi, fat_low, byte_1, byte_2;
int start, fat;
/* which bytes contain the entry */
start = num * 3 / 2;
if (start < 0 || start+1 > (fat_len * MSECSIZ))
return(-1);
byte_1 = *(fatbuf + start);
byte_2 = *(fatbuf + start + 1);
/* (odd) not on byte boundary */
if (num % 2) {
fat_hi = (byte_2 & 0xff) << 4;
fat_low = (byte_1 & 0xf0) >> 4;
}
/* (even) on byte boundary */
else {
fat_hi = (byte_2 & 0xf) << 8;
fat_low = byte_1 & 0xff;
}
fat = (fat_hi + fat_low) & 0xfff;
return(fat);
}