Списки в оперативній пам'яті, операції над списками. Керування програмами. Керування таймером. Системні керуючі блоки. Управління пам’яттю: таблиця векторів переривань, страница 18

         jobptr - поточний покажчик у job;

         cname[12] - поточне iм`я для пошуку;

         sect - поточний  номер сектора;

         cl - поточний  номер кластера;

         fat16 - ознака формату FAT;

         fsize - розмiр файла;

         dirnum - номер елемента у змiстi;

         FirstSect - абсолютний номер сектора початку;

         rootdir=1 - ознака корiнного каталога або пiдкаталога (1/0);

         fatalloc=0 - ознака видiлення пам`ятi.

         sys=0 -ознака,що логiчний диск  < 32 Mбайт.

Опис алгоритму програми:

Функції:

         main - запитує iм`я файла,  потiм оброблює його i, якщо все нормально,  то запускає допомiжнi функцi∙ необхiднi для перегляду FAT заданого файла.

        Read_Mbr - виконує вибiрку  елемента  таблицi  роздiлiв для заданого диску.

        Read_Boot - зчитує boot-сектор логiчного диска, причому для логiчного диску адреса цього сектора назначається - 0, 0, 1.

        Read_Fat - зчитує у пам`ять FAT цiлком,  адреса початку FAT на диску  та  її  розмiр  визначаються  з  ранiш  прочитаного Boot-сектора.

        Read_13 - читає один  сектор  за  допомогою  преривання BIOS.

        Read_25 - читає size  секторiв  за  допомогою преривання 25  починаючи з sect сектора у область пам`ятi mem .

        Clust_to_Sect - перетворює номер кластера у номер  сектора.

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

        Get_Name -  призначена для лексичного розбору завдання, вона видiляє з завдання чергове слово  та  переназначає  jobptr. Пусте  (NULL) значення jobptr - свiдотство про вичерпання завдання.

        Find_Name - здiйснює пошук iмени у каталозi.  Тут cname - потрiбне iм`я,  функцiя повертає iндекс знайденого  елемента  у масивi dir або (-1).

        End_of_Job - здiйснює видачу на екран  рiзних  повiдомлень при помилках або при завершеннi програми.

Текст програми:

#include <dos.h>

#include <string.h>

#include <stdlib.h>

#include <stdio.h>

#include <mem.h>

#include <conio.h>

#include <ctype.h>

#include <iostream.h>

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

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

#define byte unsigned char

#define word unsigned int

#define dword unsigned long

#define daddr struct DADDR

dword ssss;

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

       byte h;

        word s, t, ts;

       };

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

        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

  { /* структура елемента змiсту */

   char fname[11];

   byte attr;

   char reserved[10];

   word time, date, cl;

  dword size;

 };

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

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

void  Read_Mbr(void);             /* Читание MBR та пошук потрiб-

                                     ного роздiлу              */

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

void  Get_First(void);            /* Визначення абсолютного номе-

                                     ра сектора початку логiчного

                               диска                     */

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

void  Read_13(void *mem);         /* Читання сектора за допомогою