Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Лабораторная работа №7. Управление видеоадаптером 1 страница




Цель работы

Изучение особенностей функционирования видеосистемы в текстовом режиме и получение практических навыков работы с видеомонитором в этом режиме.

Постановка задачи

Применяя прямую запись в видеопамять получить на экране оригинальный, желательно динамический видеоэффект. Возможны (но не обязательны) такие варианты видеоэффектов:

«теннисный мячик» — шарик, который летает по экрану и отражается от рамок и границ экраны;

«сухой лист» — опадание букв с экрана;

«жук-пожиратель» — фигурка, которая перемещается по экрану по случайной траектории и «съедает» буквы;

«удав» — то же, что и «жук», но к тому же он увеличивается в размерах, по мере «поедания» букв;

Пример решения задачи

Индивидуальное задание:

весь экран (80х25 символов) условно делится на прямоугольники размером (10х5 символов).

текущий прямоугольник инвертирует экран под собой.

управлять положением текущего прямоугольника на экране можно с помощью клавиш управления курсором.

при нажатии клавиши «пробел» текущий прямоугольник обменивается содержимым с левым верхним прямоугольником.

при нажатии клавиши Enter содержимое прямоугольников экрана начинает перемешивается случайным образом между собой до нажатия любой клавиши.

после этого, используя клавиатуру, можно восстановить начальный экран или выйти из программы (клавиша Esc).

Разработка алгоритма решения

Структура программы

Программа состоит из основной функции main() и семи вспомогательных функций.

byte GetSym(x1,y1) — функция читает символ с заданной позиции экрана дисплея.

byte GetAtr(x1,y1) — функция читает атрибут символа с заданной позиции экрана дисплея.

void PutSym(x1,y1,sym) — функция выводит на экран дисплея символ в заданную позицию (x1,y1).

void PutAtr(x1,y1,atr) — функция меняет на экране дисплея атрибут символа в заданной позиции (x1,y1).

void Invert(x1,y1) — функция инвертирует участок на экране размером (10х5), координаты (x1,y1) задают один из участков на экране.

void Change(x,y) — функция обменивает содержимое текущего участка с содержимым левого верхнего участка на экране. Координаты (x,y) задают положение текущего участка.

void RandText(void) — функция псевдослучайным образом перетасовывает все участки на экране.

Описание переменных

Переменные, глобальные для всей программы:

xk — координата X текущего участка;

yk — координата Y текущего участка;

Координаты участка задаются в пределах: X — [0..7],
Y — [0..4].

 

Описание алгоритма программы

Основная функция main() проверяет, был ли в командной строке дополнительный параметр. Если нет, программа не очищает старый экран. Если какой-нибудь параметр был, то экран очищается и выводится инструкция по управлению программой. Далее в основной программе выполняется бесконечный цикл, в котором обрабатываются коды нажатых клавиш и, в зависимости от них, вызываются вспомогательные функции. Выход из цикла — по клавише Esc.

Функции GetSym(x1,y1), GetAtr(x1,y1) читают непосредственно из видеопамяти дисплея символ и атрибут соответственно.

Функции PutSym(x1,y1,sym), PutAtr(x1,y1,atr) выводят непосредственно в видеопамять дисплея символ и атрибут соответственно.

Во всех этих четырех функциях координаты задаются в квадрате 79х24 символов (нумерация начинается с нуля).

Функция Invert(x1,y1) использует функции GetAtr и PutAtr для инверсии прямоугольника экрана размером 10х5 по маске 0x7f, при этом независимо выполняется инверсия фона и цвета символа.

Функция Change(x,y) обменивает содержимое текущего участка с содержимым левого верхнего участка путем последовательного побайтного обмену атрибутов и символов. Она использует функции GetSym, GetAtr, PutSym, PutAtr.

Функция RandText(void) — псевдослучайным образом перетасовывает все участки на экране, при этом она в цикле увеличивает на единицу локальные в данной функции координаты текущего участка xk, yk и обращается к функции Change. Таким образом достигается эффект перемешивания. Функция работает, пока не будет нажата любая клавиша.

Текст программы

/*------Лабораторная работа N7-----------------*/

/*-----Управление видеоадаптером.---------------*/

#include <dos.h>

 

#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <time.h>

/*--------------Константы----------------------- */

#define VSEG 0xb800 /* Сегментный адрес видеопамяти */

#define byte unsigned char

 

#define word unsigned int

#define Esc 27

#define Spase 32

#define Enter 13

#define Up 0x48

#define Down 0x50

#define Left 0x4b

#define Right 0x4d

#define Home 0x47

int xk,yk;

/*----Чтение символа из видеопамяти-------------*/

byte GetSym(x1,y1)

int x1,y1;

{

return(peekb(VSEG,y1*160+x1*2));

}

/*---Чтение атрибута из видеопамяти-------------*/

byte GetAtr(x1,y1)

int x1,y1;

{

return(peekb(VSEG,y1*160+x1*2+1));

}

/*---Запись символа в видеопамять--------------*/

void PutSym(x1,y1,sym)

int x1,y1;

byte sym;

{

pokeb(VSEG,y1*160+x1*2,sym);

}

/*---Запись атрибута в видеопамять--------------*/

void PutAtr(x1,y1,atr)

int x1,y1;

byte atr;

{

pokeb(VSEG,y1*160+x1*2+1,atr);

}

/*--Инверсия квадрата на экране-----------------*/

void Invert(x1,y1)

int x1,y1;

{

byte b;

int i,j;

for (j=0;j<5;j++)

for (i=0;i<10;i++)

{

b=GetAtr(x1*10+i,y1*5+j);

PutAtr(x1*10+i,y1*5+j,(b^0x7f));

}

}

/*--Замена текущего квадрата на левый верхний--*/

void Change(x,y)

byte x,y;

{

int i,j;

byte ba,bs;

if ((x!=0)||(y!=0))

for (j=0;j<5;j++)

for (i=0;i<10;i++)

{

bs=GetSym(x*10+i,y*5+j);

ba=GetAtr(x*10+i,y*5+j);

PutSym(x*10+i,y*5+j,GetSym(i,j));

PutAtr(x*10+i,y*5+j,GetAtr(i,j));

PutSym(i,j,bs);

PutAtr(i,j,ba);

}

}

/*--Перемешивание квадратов до нажатия клавиши-*/

void RandText(void)

{

Invert(xk,yk);

xk=5;

yk=1;

while(!kbhit())

{

Change(xk,yk);

xk++;

if (xk>7) xk=0;

yk++;

if (yk>4) yk=0;

}

Invert(xk,yk);

}

/*-----Начало основной программы---------------*/

main(int argn,char *argc[])

{

int i;

 

xk=0;

yk=0;

if (argn>1){}

else /* Если параметров нет, вывод инструкции */

{

textattr(10);

clrscr();

cprintf("---------------");

cprintf(" Лабораторная работа N7 ");

cprintf("---------------");

cprintf("---------------");

cprintf(" Управление видеоадаптером. ");

cprintf("---------------");

textattr(15);

gotoxy(23,4);cprintf("Демонстрация работы с видеопамятью.");

textattr(12);

gotoxy(30,6);cprintf("<< М О З А И К А >>");

textattr(14);

gotoxy(30,8);cprintf("Клавиши управления:");

gotoxy(7,10);cprintf("< Left, Right, Up, Down> — ");

cprintf("управление выделенним квадратом.");

gotoxy(7,11);cprintf("<Spase Bar> — Обмен содержимым ");

cprintf("между выделенным квадратом");

gotoxy(7,12);cprintf(" и левым верхним");

cprintf(" квадратом.");

gotoxy(7,13);cprintf("<Enter> — перемешивание квадратов");

cprintf(" до нажатия любой клавиши.");

gotoxy(7,14);cprintf("<Esc> — вихiд.");

textattr(11);

gotoxy(28,16);cprintf("З А Д А Ч А И Г Р Ы:");

gotoxy(14,17);cprintf("Собрать при помощи клавиш ");

cprintf("управления начальный экран.");

textattr(12);

gotoxy(27,19);cprintf("Ж е л а е м у с п е х а!");

textattr(7);

gotoxy(1,21);cprintf("Примечание: При запуске с ");

cprintf("параметром <->");

gotoxy(13,22);cprintf("начальным экраном для игры ");

cprintf("является текущий.");

}

Invert(xk,yk);

for(i=0;i==0;)

switch(getch())

{ /* Обработка нажатых клавиш */

case Esc: i++; break;

case Enter:RandText();break;

case Spase:Invert(xk,yk);

 

Change(xk,yk);

Invert(xk,yk);

break;

case 0:

switch (getch()) {

case Left:Invert(xk,yk);

xk--;

if(xk<0) xk=7;

Invert(xk,yk);

break;

case Right:Invert(xk,yk);

xk++;

if(xk>7) xk=0;

Invert(xk,yk);

break;

case Up:Invert(xk,yk);

yk--;

if(yk<0) yk=4;

Invert(xk,yk);

break;

case Down:Invert(xk,yk);

yk++;

if(yk>4) yk=0;

Invert(xk,yk);

break;

}

}

Invert(xk,yk);

}

Результаты работы программы

Результаты работы программы выводятся на экран терминала и меняются интерактивно.


 

Лабораторная работа №8.
Главная загрузочная запись

Цель работы

Получение практических навыков в работе с Главной Загрузочной Записью жесткого диска.

Постановка задачи

Прочитать и выполнить форматный вывод на экран Главной Загрузочной Записи жесткого диска на своем рабочем месте.

Порядок выполнения

Порядок выполнения работы и содержание отчета определены в общих указаниях.

Пример решения задачи

Разработка алгоритма решения

Программа состоит из основной программы main(), которая реализует все действия для чтения Главной Загрузочной Записи.

Описание переменных

Переменные в основной программе:

x, y — экpанные кооpдинаты;

head — номеp головки (0);

Sect_Trk — номеp доpожки и сектоpа (0,1);

ndrive=0 — номеp логического диска;

EndList — указатель на подпись.

Кроме того, в программе есть такие структуры:

Структура элемента раздела:

struct Part {

byte ActFlag; /* признак активного раздела */

/* физический адрес начала раздела */

byte Begin_Hd; /* # головки */

word Begin_SecTrk; /* # сектора та дорожки */

byte SysCode; /* код системы */

/* физический адрес конца раздела */

byte End_Hd; /* # головки */

word End_SecTrk; /* # сектора и дорожки */

dword RelSec; /* # сектора початку */

dword Size; /* количество секторов */

};

Стpуктуpа главной загрузочной записи.

struct MBR {

char LoadCode[0x1be]; /* пpогpамма загрузки */

struct Part rt[4]; /* 4 элемента pазделов */

word EndFlag; /* подпись MBR */

};

Описание алгоритма программы

Эта программа демонстрирует разделение логического диска.

Начальный адрес для чтения задается: 0,0,1. При помощи прерывания 0x13 программа считывает сектор по заданному адресу, далее происходит поэлементный анализ таблицы разделов — пока не встретится признак конца таблицы или раздел нулевого размера. Значения полей элемента таблицы выводятся на экран. Манипуляции, которые описываются макросами TRK и SECT, обеспечивают распаковку номера дорожки и сектора. Если в поле SysCode содержится признак расширенного раздела, то устанавливается новый дисковый адрес, считывается новый сектор и анализируется новая таблица.

Текст программы

/*-------Лабораторная работа N8----------------*/

/*---"Главная загрузочная запись"--------------*/

/* Стандартные заголовки */

#include <dos.h>

#include <conio.h>

 

/* Типы данных */

 

#define byte unsigned char

#define word unsigned int

#define dword unsigned long

void read_MBR(void); /* Чтение MBR */

/* Получение из упакованного SecTrk # сектора */

#define SECT(x) x&0x3f

/* Получение из упакованного SecTrk # дорожки */

#define TRK(x) (x>>8)|((x<<2)&0x300)

 

/* структура элемента раздела */

struct Part {

byte ActFlag; /* признак активного раздела */

/* физический адрес начала раздела */

byte Begin_Hd; /* # головки */

word Begin_SecTrk; /* # сектора и дорожки */

byte SysCode; /* код системы */

/* физический адрес конца раздела */

byte End_Hd; /* # головки */

word End_SecTrk; /* # сектора и дорожки */

dword RelSec; /* # сектора початку */

dword Size; /* количество секторов */

};

/* стpуктуpа главной загрузочной записи */

struct MBR {

char LoadCode[0x1be]; /* пpогpамма загрузки */

struct Part rt[4]; /* 4 эл-та pазделов */

word EndFlag; /* подпись MBR */

} mbr;

/* дополнительные переменные */

int x=10,y; /* экpанные кооpдинаты */

byte head=0; /* номеp головки (0) */

word Sect_Trk=1; /* номеp доpожки и сектоpа (0,1) */

int ndrive=0; /* номеp логического диска */

word *EndList; /* указатель на подпись */

union REGS rr;

struct SREGS sr;

word i;

/*-----------------------------------------------*/

main()

{

textbackground(0);

clrscr();

textattr(0x0a);

cprintf(" Лабораторная работа N8");

gotoxy(1,2);

cprintf(" Главная загрузочная запись");

textattr(12);

gotoxy(30,4);

cprintf("Разделы жесткого диска:\n");

gotoxy(1,6);

textattr(11);

cprintf("Лог.диск -----> \n\r");

cprintf("Признак ------> \n\r");

cprintf("Код системы --> \n\r");

cprintf("Начало: гол.--> \n\r");

cprintf(" дор.--> \n\r");

cprintf(" сект.-> \n\r");

cprintf("Конец: гол.--> \n\r");

cprintf(" дор. -> \n\r");

cprintf(" сект.-> \n\r");

cprintf("Нач.сектор ---> \n\r");

cprintf("Размер -------> \n\r");

textcolor(11);

NEXT:

read_MBR();

for (EndList=(word *)&mbr.rt[(i=0)];

(*EndList!=0xaa55)&&(mbr.rt[i].Size>0L);

EndList=(word *)&mbr.rt[++i])

{

/* кооpдинаты куpсоpа */

y=6;

x+=7;

gotoxy(x,y++);

if (mbr.rt[i].SysCode==5)

{textattr(13);

cprintf("Ext ");

 

}

else

textattr(12);

cprintf("%-7c",'C'+ndrive++);

 

gotoxy(x,y++); textattr(14);

cprintf("%02xH ",mbr.rt[i].ActFlag);

gotoxy(x,y++); textattr(15);

cprintf("%-7d",mbr.rt[i].SysCode);

gotoxy(x,y++); textattr(14);

cprintf("%-7d",mbr.rt[i].Begin_Hd);

gotoxy(x,y++); textattr(15);

cprintf("%-7u",TRK(mbr.rt[i].Begin_SecTrk));

gotoxy(x,y++); textattr(14);

cprintf("%-7u",SECT(mbr.rt[i].Begin_SecTrk));

gotoxy(x,y++); textattr(15);

cprintf("%-7d",mbr.rt[i].End_Hd);

gotoxy(x,y++); textattr(14);

cprintf("%-7u",TRK(mbr.rt[i].End_SecTrk));

gotoxy(x,y++); textattr(15);

cprintf("%-7u",SECT(mbr.rt[i].End_SecTrk));

gotoxy(x,y++); textattr(14);

cprintf("%-7lu",mbr.rt[i].RelSec);

gotoxy(x,y++); textattr(15);

cprintf("%-7lu",mbr.rt[i].Size);

if (mbr.rt[i].SysCode==5)

{

/* если код системы 5, pаздел содержит свою таблицу pазделов; определяется ее дисковый адpес, и новая таблица считывается в память */

head=mbr.rt[i].Begin_Hd;

Sect_Trk=mbr.rt[i].Begin_SecTrk;

goto NEXT;

}

}

gotoxy(x,y++);

textattr(10+128);

gotoxy(29,18);

 

cprintf("Нажмите любую клавишу...");

getch();

}

 

/*-----------Читання MBR------------------------*/

void read_MBR(void)

{

rr.h.ah=2; /* Чтение */

rr.h.al=1; /* Секторов 1 */

rr.h.dl=0x80; /* Жесткий диск */

rr.h.dh=head; /* Головка */

rr.x.cx=Sect_Trk; /* Дорожка, сектор */

sr.es=FP_SEG(&mbr); /* Адрес буфера в ОП */

rr.x.bx=FP_OFF(&mbr);

int86x(0x13,&rr,&rr,&sr);

/* Проверка ошибок чтения */

if (rr.x.cflag)

{

printf("Ошибка чтения: %x. ",rr.h.ah);

printf("Нажмите любую клавишу...\n\7");

getch();

exit();

}

}

Результаты работы программы

В процессе работы программы на экран выводится информация такого вида:

Лабораторная работа N8

Главная загрузочная запись

Разделы жесткого диска:

 

Лог.диск -----> C Ext E Ext G

Признак ------> 80H 00H 00H 00H 00H

Код системы --> 1 5 4 5 0

Начало: гол.--> 1 0 1 0 1

дор.--> 0 121 121 724 724

сект.-> 1 1 1 1 1

Конец: гол.--> 4 4 4 4 4

дор. -> 120 975 723 975 975

сект.-> 17 17 17 17 17

Нач.сектор ---> 17 10285 17 51255 17

Размер -------> 10268 72675 51238 21420 21403

 

Нажмите любую клавишу...

:

Лабораторная работа №9.
Дисковые структуры данных DOS

Цель работы

Получение практических навыков в работе с Таблицей Размещения Файлов.

Постановка задачи

Определить номера всех кластеров диска, которые занимает заданный преподавателем файл в текущем каталоге.

Пример решения задачи

Разработка алгоритма решения

Программа состоит из главной функции main() и одиннадцати вспомогательных функций.

void Read_Mbr(void) — функция чтения MBR и поиска требуемого раздела.

void Read_Boot(void) — функция чтения boot-сектора.

void Get_First(void) — функция определения абсолютного номера сектора начала логического диска.

void Read_Fat(void) — функция чтения FAT.

void Read_13(void *mem) — функция чтения сектора с помощью прерывания 13.

void Sect_to_Daddr(dword sect) — функция формирования физического дискового адреса из номера сектора.

dword Clust_to_Sect(word clust) — функция определения номера сектора по номеру кластера.

word Next_Clust(word clust) — функция выборки следующего кластера из FAT.

char *Get_Name(char *s, char *d) — функция выделения следующего элемента из строки-задания.

int Find_Name() — функция поиска имени в каталоге.

void End_of_Job(int n) — функция выдачи сообщений или аварийного завершения.

Описание переменных

В программе описаны структуры такого вида:

Физический дисковый адрес:

struct DADDR {

byte h; /* головка */

word s, /* сектор */

t, /* дорожка */

ts; /* сектор, дорожка упакованные */

};

Структура элемента раздела;

struct PART {

byte Boot, /* признак активного */

/* физический адрес начала раздела */

Begin_Hd; /* # головки */

word Begin_SecTrk; /* # сектора и дорожки */

byte SysCode, /* код системы */

/* физический адрес конца раздела */

End_Hd; /* # головки */

word End_SecTrk; /* # сектора и дорожки */

dword RelSec, /* # сектора початку */

Size; /* количество секторов */

};

Стpуктуpа Главной Загрузочной Записи:

struct MBR

{

char LoadCode[0x1be]; /* программа загрузки */

struct PART rt[4]; /* 4 элемента разделов */

word EndFlag; /* подпись MBR */

};

Структура загрузочной записи логического диска:

struct BootRec {

byte jmp[3], ident[8];

word SectSize;

byte ClustSize;

word ResSect;

byte FatCnt;

word RootSize, TotSecs;

byte Media;

word FatSize, TrkSecs, HeadCnt;

word HidnSecL, HidnSecH;

dword LongTotSecs;

byte Drive, reserved1, DOS4_flag;

dword VolNum; char VolLabel[11], FatForm[8];

};

Структура элемента каталога:

struct Dir_Item {

char fname[11]; /* имя файла */

byte attr; /* атрибут */

byte reserved[10];

word time; /* время */

word date; /* дата */

word cl; /* номер 1-го кластера */

dword size; /* размер файла */

};

Переменные, глобальные для всей программы:

part — текущий элемент раздела;

buff1[512] — буфер MBR и boot;

*mbr — указатель на таблицу разделов;

*boot — указатель на корневую запись;

buff2[512] — буфер каталога и текста;

*dir — указатель на часть каталога;

*text — указатель на текстовый буфер;

*fat — указатель на FAT;

job[81] — строка-задание;

jobptr — текущий указатель в job;

cname[12] — текущее имя для поиска;

Fdisk — физический номер диска;

caddr — текущий дисковый адрес;

sect — текущий номер сектора;

clust — текущий номер кластера;

fat16 — признак формата FAT;

fsize — размер файла;

dirnum — номер элемента в каталоге;

FirstSect — абсолютный номер сектора начала;

rootdir=1 — признак корневого каталога или подкаталога (1/0);

lastsect — последний сектор при чтении;

fatalloc=0 — признак выделения памяти.

Описание алгоритм программы

Функция main запрашивает имя файла, потом обрабатывает его и, если все нормально, то запускает вспомогательные функции необходимые для просмотра FAT заданного файла.

Функция Read_Mbr выполняет выборку элемента таблицы разделов для заданного диска.

Функция Read_Boot считывает boot-сектор логического диска, причем для гибкого диска адрес этого сектора назначается — 0, 0, 1, а для жесткого — выбирается из part.

Функция Get_First определяет абсолютный номер начального сектора логического диска и сохраняет его переменной First_Sect. Это значение вычисляется из физического адреса начала, который берется из полей Begin_Hd, Begin_SecTrk элемента таблицы разделов.

Функция Read_Fat считывает в память FAT целиком, адрес начала FAT на диске и ее размер определяются из ранее прочитанного boot-сектора.

Функция Read_13 читает один сектор с помощью прерывания BIOS.

Функция Sect_to_Daddr преобразует номер логического сектора в физический адрес.

Функция Clust_to_Sect преобразует номер кластера в номер сектора.

Функция Next_Clust определяет номер следующего кластера, анализируя FAT. Для последнего кластера (и для корневого каталога) эта функция возвращает нулевое значение.

Функция Get_Name предназначена для лексического разбора задания, она выделяет из задания очередное слово и переназначает jobptr. Пустое (NULL) значение jobptr — свидетельство об исчерпании задания.

Функция Find_Name выполняет поиск имени в каталоге. Здесь cname — требуемое имя, функция возвращает индекс найденного элемента в массиве dir или (-1).

Функция End_of_Job выполняет выдачу на экран различных сообщений при ошибках или при завершении программы.

 

 

Текст программы

/*-------Лабораторная работа N9----------------*/

/*-----"Дисковые структуры данных DOS."--------*/

/* Подключение стандартных заголовков */

#include <dos.h>

#include <string.h>

#include <stdlib.h>

#include <stdio.h>

#include <conio.h>

#include <ctype.h>

/*------------------------------------------------*/

/* Типи и структуры данных */

#define byte unsigned char

#define word unsigned int

#define dword unsigned long

#define daddr struct DADDR

struct DADDR { /* физический дисковый адрес */

byte h;

word s, t, ts;

};

struct PART { /* структура элемента раздела */

byte Boot, Begin_Hd;

word Begin_SecTrk;

byte SysCode, End_Hd;

word End_SecTrk;

dword RelSec, Size;

};

struct MBR

{ /* стpуктуpа Главной Загрузочной Записи */

char LoadCode[0x1be];

struct PART rt[4];

word EndFlag;

};

struct BootRec

{ /* структура корневой записи */

byte jmp[3], ident[8];

word SectSize;

byte ClustSize;

word ResSect;

byte FatCnt;

word RootSize, TotSecs;

byte Media;

word FatSize, TrkSecs, HeadCnt;

word HidnSecL, HidnSecH;

dword LongTotSecs;

byte Drive, reserved1, DOS4_flag;

dword VolNum;

char VolLabel[11], FatForm[8];

};

struct Dir_Item

{ /* структура элемента директории */

char fname[11];

byte attr;

char reserved[10];

word time, date, cl;

dword size;

};

/*-----------------------------------------------*/

 

/* Описания функций */

void Read_Mbr(void);

/* Чтение MBR и поиск требуемого раздела */

void Read_Boot(void); /* Чтение boot-сектора */

void Get_First(void); /* Определение абсолютного номера сектора начала логического диска */

void Read_Fat(void); /* Чтение FAT */

void Read_13(void *mem);

/* Чтение сектора с омогощью прерывания 13 */

void Sect_to_Daddr(dword sect);

/* Формирование физического дискового адреса из # сектора */

dword Clust_to_Sect(word clust);

/* Вычисление номера сектора из номера кластера */

word Next_Clust(word clust);

/* Выборка следующего кластера из FAT */

char *Get_Name(char *s, char *d);

/* Выделение следующего элемента из строки-задания */

int Find_Name(); /* Поиск имени в каталоге */

void End_of_Job(int n); /* Завершение (при n=0-5 — аварийное) */

/*------------------------------------------------*/

/* Переменнi */

struct PART part; /* текущий элемент раздела */

byte buff1[512]; /* буфер MBR и boot */

struct MBR *mbr; /* указатель на таблицу разделов */

struct BootRec *boot; /* указатель на корневую запись */

byte buff2[512]; /* буфер каталога и текста */

struct Dir_Item *dir; /* указатель на часть каталога */

char *text; /* указатель на текстовий буфер */

byte *fat; /* указатель на FAT */

char job[81]; /* строка-задание */

char *jobptr; /* текущий указатель в job */

char cname[12]; /* текущее имя для поиска */

byte Fdisk; /* физический номер диска */

daddr caddr; /* текущий дисковый адрес */

dword sect; /* текущий номер сектора */

word clust; /* текущий номер кластера */

byte fat16; /* признак формату FAT */

dword fsize; /* размер файла */

int dirnum; /* номер элемента в каталоге */

dword FirstSect; /* абс.сектор начала */

byte rootdir=1; /* признак корневого каталога

или подкаталога (1/0) */

word lastsect; /* последний сектор при чтении /

byte fatalloc=0; /* признак выделения памяти */

/*-----------------------------------------------*/

main() {

int n,i;

textattr(14);

clrscr();

/* ввод имени файла */

cprintf(" Просмотр таблицы FAT. ");

cprintf("Укажите полное имя файла -->");

scanf("%s",job);

/* перевод в верхний регистр */

strupr(job);

/* проверка правильности идентификатора диска */

if ((!isalpha(job[0]))||(job[1]!=':')||(job[2]!='\\')) {

printf("%c%c%c -",job[0],job[1],job[2]);

End_of_Job(0);

}

textattr(10);

clrscr();

printf(" Лабораторная работа N9");

printf(" Дисковые структуры данных DOS.");




Поделиться с друзьями:


Дата добавления: 2017-02-01; Просмотров: 328; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.352 сек.