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


в порт испольэуются функции:



Пример 11

int inport(int port); unsigned char inportb(int port);
Для записи данных в порт испольэуются функции:



Пример 11

/*== ПРИМЕР 9.9 ==*/ /*================ Графические режимы EGA ================*/ #include <dos.h>
#include <math.h>
#define byte unsigned char #define word unsigned int /* коды режимов и размеры экранов */ byte graph_modes[]={ 13,14,16 }; word x_modes[]={ 320,640,640 }; word y_modes[]={ 200,200,350 }; int n; /* номер режима */ int x,y; /* текущие координаты */ byte xc, yc; /* координаты курсора */ char str[40], *s; char any[] = "Нажмите любую клавишу..."; byte k, c; int yy; union REGS rr; main() { for (n=0; n10) { c=4; k=1; } for(x=0; x<x_modes[n]; x++) point(x,y,c,0); c=0x0f; } /* рисование вертикальных линий на 0-й странице */ for(c=0x0f,k=x=0; x<x_modes[n]; x+=10) { if (++k>10) { c=4; k=1; } for (y=0; y<y_modes[n]; y++) /* чтобы не перечеркивать горизонталь */ if (getpoint(x,y)!=4) point(x,y,c,0); c=0x0f; } sprintf(str,"Графический режим %02Xh %dx%d", graph_modes[n],x_modes[n],y_modes[n]); /* вывод текста поверх сетки */ for (xc=5,yc=3,s=str; *s; s++) putca(xc++,yc,*s,0x02); /* вывод текста с совмещением цветов */ for (xc=5,yc=12,s=str; *s; s++) putca(xc++,yc,*s,0x82); /* рисование и закрашивание окружности на 1 странице */ for (x=-40; x
Для читателя имеет смысл здесь веpнуться к pассмотpению пpогpаммы пpимеpа 7.10, в котоpой более сложное гpафическое изобpажение (символ дpевнекитайской натуpфилософии) фоpмиpовалось теми же сpедствами (функция getpoint оттуда пеpенесена в пpимеp 9.9 без изменений, в функции point добавлен паpаметp - номеp стpаницы).
Выполнив пpогpаммы этих пpимеpов, читатель может убедиться в невысоком быстpодействии описанных гpафических сpедств. К сожалению, ничего более эффективного сpедствами BIOS осуществить нельзя.



Пример 11

struct Ext_FCB { byte flag; /* Признак. Его значение 0xFF говорит о том, что представлен расширенный FCB */ char reserved2[5]; byte attr; /* Атрибуты файла в каталоге */ struct FCB fcb; /* Стандартный FCB */ };
На первый взгляд может показаться, что обрабатываемый файл должен состоять из записей фиксированной длины, но на самом деле это не так. Поле recsize после открытия файла имеет значение 128, но оно доступно программисту и может быть изменено в любой момент, что позволяет работать с записями переменной, в том числе и динамически изменяющейся длины.

Метод FCB использует так называемую Дисковую Передаточную Область (DTA - Disk Transfer Area). При загрузке программы эта область выделяется программе системой, но программист может организовать собственную DTA и сообщить системе ее адрес. Весь обмен с дисками ведется только через DTA - назначенную системой или установленную программистом. Это, однако, не требует обязательной пересылки данных между DTA и рабочими областями программы, так как программист может в любой момент переназначить адрес DTA на свою рабочую область.
10.4.2. Функции ввода-вывода

Оба метода предоставляют программисту полный набор функций DOS для ввода-вывода. Поскольку эти средства подробно описаны в справочной литературе, мы здесь ограничимся далеко не исчерпывающим их обзором.

При использовании метода дескрипторов адрес ASCIIZ-строки, содержащей полный путь и имя файла, передается функциям DOS, выполняющим создание/открытие файла, в регистрах DS:DX, а в AL - код режима разделения. Эти функции возвращают дескриптор открытого файла в регистре AX. Тем функциям, которые работают с уже открытым файлом, файловый дескриптор передается в регистре BX. Для функций, выполняющих обмен с диском, адрес буфера в памяти задается в DS:DX, а в CX - счетчик байт для обмена, эти функции возвращают в AX число действительно переданных байт. Для всех функций флаг CY служит индикатором ошибки, если он взведен, то AX содержит код ошибки. В операциях чтения/записи обмен начинается с того байта файла, на который указывает текущее значение указателя чтения/записи (при открытии файла это значение устанавливается в 0), после каждой операции значение указателя увеличивается на число прочитанных/записанных байт.



Пример 11

struct SFT { struct SFT *next; /* адрес заголовка следующей таблицы */ word n_files; /* число элементов в этой таблице */ };
Через поле next таблицы SFT увязываются в список.
Сразу вслед за заголовком таблицы в памяти следует массив элементов таблицы, которыми являются Блоки Управления Файлами DOS (DFCB - DOS File Control Block, не путать с FCB!). Формат и размер блока DFCB различен для разных версий DOS. Для версии 3.x DFCB имеет размер 53 байта, формат следующий:

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