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

Третій етап включає в себе приклад роботи з 50 файлами одночасно. Для цього організуємо 3 цикли. В першому відкриваµмо 50 файлів, формуючи їх імена. В другому циклі записуємо в кожен файл рядок. У третьому закриваємо відкриті файли.

В кінці програми відбудовуємо сегментную таблицю файлів та звільняємо пам'ять, використану пам'ять допомогою функції DOS 49h.

Версія ДОС зберігається у глобальній змінній модуля <DOS.H> _osmjor.

Функція inc_jft ( ) поширюµ таблицю файл·в завдання в префіксі програмного сегменту програми. При цьому використовуємо функцію DOS 67h :

Вхід :   Ah   =   67h

Bx   = новий   максимум числа файл·в

Вихід : Ax = код помилки (якщо встановлений бiт Cf) Функція get_sft ( ) повертає адресу 1-ї системної таблиці файлів.

Для цього за допомогою функції 52h DOS (переривання 21h) визначимо адресу системних керуючих блоків :

Вхід  :   Ah   = 52h

Вихід :   ES : BX - адреса 1-го блоку параметр·в диску.

Додавши 4 до отриманої адреси ми одержимо адресу того слова пам'яті, в якій   DOS зберігає зміщення адреси 1-ї системної таблиці файлів, а додавши 6, знайдемо адресу, по якій зберігається її  сегментна адреса. Після цього з сегментної адреси та зміщення  сформуємо покажчик на першу системну таблицю файлів.

Текст Програми.

#include <string.h>

#include <stdlib.h>

#include <iostream.h>

#include <conio.h>

#include <stdio.h>

#include <DOS.h>

#include <io.h>

#include <fcntl.h>

#include <stat.h>

#include <errno.h>

int inc_JFT(int num);    

void get_SFT(void);     

void ViewJFT ();

struct   psp

       {

         char    buf [24];

         char    JFT  [ 20 ];

         char    buf1[6];

         word    JFT_size;

         char    *JFT_ptr;

}far *p_psp;

struct SFT

{

         struct SFT *next; /* Адреса заголовка наступно• сторiнки */

         word n_files;     /* Число элементiв в цiй таблицi     */

} *sft, *sftx;

struct DFCB

{

         word  n_handles;        /* Число дескрiпторiв */

         byte  open_mode,        /* Режим вiдкриття     */

               reserv1,

               attr;             /* Атрибути файлу               */

         word  info;             /* Стан   прилада         */

         char  *drv_ptr;         /* Адреса драйвера/DPB           */

         word  First_clust,      /* Номер початкового кластера    */

               F_time,           /* час створення файла         */

               F_date;           /* Дата створення файла          */

         dword F_size,           /* Розмiр файла                 */

               F_seek;           /* поточне змiщення в файлi     */

         word lst_cl_n;          /* вiдносн. номер поточн. кластера */

         union VAR {

                          struct {   /* для DOS 3.x */

                                    word  lst_clust,    /* Абс. номер поточн. кластера     */

                                    dir_sect;     /* Номер сектора каталога       */

                                    byte  dir_num;      /* Номер елемента у секторi     */

                                    char  fname[11];    /* Им`я та розширення             */

                                    byte  reserved2[6];

                                    word  owner;        /* PID хозя•на                  */

                                    byte  reserved4[2];

                                  } DOS3;

                          struct { /* для DOS 4.0 i вище */

                                    word  dir_sect;     /* Номер сектора каталога       */

                                    byte  reserved2[2],

                                         dir_num;      /* Номер елемента у секторi     */

                                    char  fname[11];    /* Им`я та розширення             */

                                    byte  reserved3[6];

                                    word  owner,        /* PID хозя•на                  */

                                         lst_clust;    /* Абс. номер поточного кластера */

                                    byte  reserved4[6];