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 >
Text File  |  1990-05-10  |  1KB  |  50 lines

  1. /*
  2.  * Get and decode a FAT (file allocation table) entry.  The FAT entries
  3.  * are 1.5 bytes long and switch nibbles (.5 byte) according to whether
  4.  * or not the entry starts on a byte boundary.  Returns the cluster 
  5.  * number on success or -1 on failure.
  6.  */
  7.  
  8. #include "msdos.h"
  9.  
  10. extern int fat_len;
  11. extern unsigned char *fatbuf;
  12.  
  13. int
  14. getfat(num)
  15. int num;
  16. {
  17. /*
  18.  *    |    byte n     |   byte n+1    |   byte n+2    |
  19.  *    |0|1|2|3|4|5|6|7|0|1|2|3|4|5|6|7|0|1|2|3|4|5|6|7|
  20.  *    | | | | | | | | | | | | | | | | | | | | | | | | |
  21.  *    |  n.0  |  n.5  | n+1.0 | n+1.5 | n+2.0 | n+2.5 |
  22.  *        \_____  \____   \______/________/_____   /
  23.  *          ____\______\________/   _____/  ____\_/
  24.  *         /     \      \          /       /     \
  25.  *    | n+1.5 |  n.0  |  n.5  | n+2.0 | n+2.5 | n+1.0 |
  26.  *    |      FAT entry k      |    FAT entry k+1      |
  27.  */
  28.     unsigned int fat_hi, fat_low, byte_1, byte_2;
  29.     int start, fat;
  30.                     /* which bytes contain the entry */
  31.     start = num * 3 / 2;
  32.     if (start < 0 || start+1 > (fat_len * MSECSIZ))
  33.         return(-1);
  34.  
  35.     byte_1 = *(fatbuf + start);
  36.     byte_2 = *(fatbuf + start + 1);
  37.                     /* (odd) not on byte boundary */
  38.     if (num % 2) {
  39.         fat_hi = (byte_2 & 0xff) << 4;
  40.         fat_low  = (byte_1 & 0xf0) >> 4;
  41.     }
  42.                     /* (even) on byte boundary */
  43.     else {
  44.         fat_hi = (byte_2 & 0xf) << 8;
  45.         fat_low  = byte_1 & 0xff;
  46.     }
  47.     fat = (fat_hi + fat_low) & 0xfff;
  48.     return(fat);
  49. }
  50.