?считать таблицу Fat12 и считать по ней какой-нибудь файл
-
сабж
Microsoft Extensible Firmware Initiative FAT32 File System Specification
/kernel/trunk/fs/fat12.inc Diamond'а в заголовок забыли написать...
/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
выводит таблицу 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
Если я правильно понял, то ты пытаешся осуществить низкоуровневый доступ. Причем используя не совсем надежные методы. Может стоит попробовать такой вариант - работаем с файлом образа (например kolibri.img) загруженный в память, чтобы исключить всякие технически накладки. А уже затем можно прикручивать работу с железом. Т.е. поделить код на драйвер железки и драйвер файловой системы, и сначала отладить драйвер файловой системы.Gargo wrote:И там и там использую Vfdwin, т.к. привода нету.
Вообще, это касается не только колибри и выбирать можно только язык программирования. Работать с образом дискеты - уже не то, попробую еще тогда написать на чистом асме
Mario wrote:например kolibri.img
Слово например написал не просто так. Я понял что к Колибри отношения не имеет (еще со второго поста в теме), однако если так принципиально, то возьми образ загрузочной дискеты MS-DOS, спасательной дискеты Win98. В общем не принципиально какой образ.Gargo wrote:Вообще, это касается не только колибри
Почему? ИМХО логично отладить код обрабатывающие данные, а потом уже отлаживать ту часть, которая отвечает за работу с оборудованием. Все же отладить две вещи последовательно проще, чем отладить две вещи параллельно.Gargo wrote:Работать с образом дискеты - уже не то
это ты скажи тому, кто выдавал заданиеMario wrote:Почему? ИМХО логично отладить код обрабатывающие данные, а потом уже отлаживать ту часть, которая отвечает за работу с оборудованием. Все же отладить две вещи последовательно проще, чем отладить две вещи параллельно.Gargo wrote:Работать с образом дискеты - уже не то
Who is online
Users browsing this forum: No registered users and 1 guest