Системное программное обеспечение персональных ЭВМ

         

и inportb возвращают прочитанное из



Пример 12

void outport(int port, int val); void outportb(int port, unsigned char val);
Аргумент этих функций port - номер порта ввода-вывода. Функции inport и inportb возвращают прочитанное из порта значение, а в функциях outport и outportb записываемое в порт значение задается аргументом val. Функции inportb и outportb работают с однобайтными, а inport и outport - с двухбайтными портами.

Программист должен точно знать, работает он с одно- или с двухбайтным портом. Применение функций inport, outport к однобайтным портам может привести к весьма неожиданным результатам. Так, например, оператор программы:



Пример 12

struct FIND { byte reserved[21]; byte attr; /* атрибут */ word ftime; /* время */ word fdate; /* дата */ dword fsize; /* размер */ char fname[13]; /* имя.расширение, ASCIIZ-строка */ };
Функция 0x4E ищет первое подходящее имя (параметры передаются только ей), все последующие обращения к 0x4F (без параметров) выдают следующие подходящие имена; 0x5C- блокировать (AL=0) / разблокировать (AL=1) доступ к области, начинающейся со смещения (двойное слово в CX:DX) размером (двойное слово в SI:DI) файла, дескриптор которого задан в BX; 0x47- получить текущий каталог на диске, заданном в DL, DS:SI указывают на буфер, в котором формируется ASCIIZ-строка текущего пути; 0x3b- изменить текущий каталог, DS:DX указывают на строку, содержащую имя подкаталога; 0x39- создать новый подкаталог, DS:DX указывают на строку, содержащую имя подкаталога; 0x3a- удалить подкаталог, DS:DX указывают на строку, содержащую имя подкаталога;
10.4.4. Функции работы с дисками

Следующие функции оперируют с логическими дисками.


0x1B- информация о FAT текущего диска, на выходе DS:BX указывают на первый байт FAT, DX - число кластеров, AL - число секторов в кластере, CX - размер сектора;
0x1C- то же, но в DL задается логический номер требуемого диска;
0x32- получить информацию о диске (диск задается в DL), на выходе DS:BX содержат адрес Блока Параметров Драйвера (DPB), который будет рассмотрен позже;
0x36- получить информацию о дисковом пространстве (DL - номер диска), на выходе: AX - число секторов в кластере, BX - число доступных кластеров, CX - размер сектора, DX - общее число кластеров;
0x19- получить номер текущего диска (в регистре AL);
0x0E- задать номер текущего диска (в регистре DL).

10.4.5. Программные иллюстрации

Вместо того, чтобы приводить маленькие примеры, каждый из которых иллюстрирует применение какой-то одной функции, приведем "программное изделие" солидного размера, которое включает в себя почти все описанные нами функции метода дескрипторов - как ввода-вывода, так и работы с файлами и каталогами.



Пример 12

struct DFCB { word n_handles; /* число дескрипторов */ byte open_mode; /* режим открытия */ byte reserv1; byte attr; /* атрибуты файла */ word info; /* состояние устройства */ void *drv_ptr; /* адрес драйвера/DPB */ word First_clust; /* номер начального кластера */ word F_time, F_date; /* время и дата */ dword F_size; /* размер файла */ dword F_seek; /* текущее смещение в файле */ word lst_cl_n; /* относит.номер текущ.кластера */ word lst_clust; /* абс.номер текущ.кластера */ word dir_sect; /* номер сектора каталога */ byte dir_num; /* номер элемента в секторе */ char fname[11]; /* имя и расширение */ byte reserved2[6]; word owner; /* PID хозяина */ byte reserved4[2]; };
Для версии 4.x размер DFCB - 59 байт и формат следующий:

Содержание раздела