?считать таблицу Fat12 и считать по ней какой-нибудь файл

Applications development, KoOS API questions
  • Microsoft Extensible Firmware Initiative FAT32 File System Specification
    /kernel/trunk/fs/fat12.inc Diamond'а в заголовок забыли написать...
  • пасиб конечно, но первый документ у меня уже есть, а второй - я повешусь разбирать 2700 строк, а тем более когда Tasm там показывает кучу ошибок
  • Тогда ищи где-нибудь книгу Кулаков В. "Программирование дисковых подсистем", хотя я заказал по почте в свое время.
  • вечером если не забуду - вышлю, курсовик такой по управлению ресурсов делали.
  • Подскажите плиз, что не так в программе. Fat считывается, но если записать на чистый диск файл, то видны лишние FF вначале, а в дальнейшем вообще неправильные числа отображает

    Code: Select all

    #include <stdio.h>
    #include <conio.h>
    #include <malloc.h>
    #include <dos.h>
    //#include "sysp.h"
    
    char *buf, *fat;
    
    int getN(char *buf, unsigned byte1, unsigned size)
    {
      int r = 0;
      for(int i = byte1 + size - 1; i >= byte1; i--)
      {
        r *=256;
        r += buf[i];
      }
      return r;
    }
    
    void readSect(char *buf, unsigned sect1, unsigned num)
    {
      REGS rs;
      SREGS ss;
      rs.x.dx = sect1;
      rs.x.cx = num;
      rs.x.bx = FP_OFF(buf);
      rs.x.ax &= 0;//Number of drive
      ss.ds = FP_SEG(buf);
      int86x(0x25, &rs, &rs, &ss);
    }
    
      unsigned int wSectSize, wResSects, fatSect, wFatSects, bFatCnt, RootSect,
      wRootEntries, bClustSects, DataSect;
    
    unsigned int nextCluster(int k)
    {
      unsigned int start = k * 3 / 2, r = 0;
      r = fat[start];
      start++;
      r += (unsigned int)fat[start] * 256;
      if(k % 2 == 0)
        return (r & 0xFFF);
      else
        return (r >> 4);
    }
    
    int main()
    {
      char c;
      clrscr();
      buf = (char *)calloc(512, 1);
      readSect(buf, 0, 1);
    
      wSectSize = getN(buf, 0xB, 2);
      fatSect = wResSects = getN(buf, 0xE, 2);
      wFatSects = getN(buf, 0x16, 2);
      bFatCnt = getN(buf, 0x10, 1);
      RootSect = fatSect + wFatSects * bFatCnt;
      wRootEntries = getN(buf, 0x11, 2);
      bClustSects = getN(buf, 0xD, 1);
      DataSect = RootSect + wRootEntries * 32 / wSectSize;
    
      printf("wFatSects = %d\n", wFatSects);
      printf("Reserved = %d\nFAT begin = %d\nFATSize = %d\nFATCount = %d\n",
      wResSects, fatSect, wFatSects, bFatCnt);
      printf("RootSector = %d\nRootSize = %d\nSector Size = %d\n",
      RootSect, wRootEntries, wSectSize);
      free(buf);
      fat = (char *)calloc(sizeof(char), wFatSects * wSectSize);
      readSect(fat, fatSect, wFatSects * bClustSects);
    
      for(unsigned int i = 0; i < wFatSects * wSectSize * 2 / 3; i++)
      {
        unsigned int r = nextCluster(i);
        if(i % 20 == 0)
        {
          clrscr();
          printf("Cluster   | Value \n");
        }
        printf("%-9X        %-9X\n", i, r);
        if(i % 20 == 19)
        {
          c = getch();
          if(c == 'q')
            return 0;
        }
      }/**/
      free(fat);
      scanf("%c", c);
      return 0;
    }
  • В FAT кластеры нумеруются, начиная с 2.
    Ушёл к умным, знающим и культурным людям.
  • не догоняю, может дело в железе, потому что одна и та же программа на домашнем пк выдает нормальные цифры, на ноутах глюки... И там и там использую Vfdwin, т.к. привода нету.
    выводит таблицу FAT: EF0, FEF, 3, 4, 5, 6, 7, FF8, 9, FFA, B, FFC, D, FFE, F, 10, 11, 12, 13, 14, 15, 16, 17, 8, 19, A, 1B, C, 1D, E, 1F
  • Gargo wrote:И там и там использую Vfdwin, т.к. привода нету.
    Если я правильно понял, то ты пытаешся осуществить низкоуровневый доступ. Причем используя не совсем надежные методы. Может стоит попробовать такой вариант - работаем с файлом образа (например kolibri.img) загруженный в память, чтобы исключить всякие технически накладки. А уже затем можно прикручивать работу с железом. Т.е. поделить код на драйвер железки и драйвер файловой системы, и сначала отладить драйвер файловой системы.
  • Вообще, это касается не только колибри и выбирать можно только язык программирования. Работать с образом дискеты - уже не то, попробую еще тогда написать на чистом асме
  • Mario wrote:например kolibri.img
    Gargo wrote:Вообще, это касается не только колибри
    Слово например написал не просто так. Я понял что к Колибри отношения не имеет (еще со второго поста в теме), однако если так принципиально, то возьми образ загрузочной дискеты MS-DOS, спасательной дискеты Win98. В общем не принципиально какой образ.
    Gargo wrote:Работать с образом дискеты - уже не то
    Почему? ИМХО логично отладить код обрабатывающие данные, а потом уже отлаживать ту часть, которая отвечает за работу с оборудованием. Все же отладить две вещи последовательно проще, чем отладить две вещи параллельно.
  • Mario wrote:
    Gargo wrote:Работать с образом дискеты - уже не то
    Почему? ИМХО логично отладить код обрабатывающие данные, а потом уже отлаживать ту часть, которая отвечает за работу с оборудованием. Все же отладить две вещи последовательно проще, чем отладить две вещи параллельно.
    это ты скажи тому, кто выдавал задание
  • Who is online

    Users browsing this forum: No registered users and 13 guests