MS-DOS для программиста

Программа FDCHANGE


Следующая программа, которая называется FDCHANGE - пример использования аппаратуры проверки замены дискеты. Текст программы приведен в листинге 1.5.

Сначала программа устанавливает тип дискеты. Это нужно для правильного выбора скорости передачи данных контроллером НГМД. При установке типа дискеты сбрасывается флаг замены дискеты.

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

Попробуйте запустить эту программу без дискеты, обратите внимание на состояние порта 0x3F7.

Главное, что вы можете взять из приведенной ниже программы - это техника работы с флагом замены дискеты. Используя аппаратуру проверки замены дискеты, ваша программа сможет более полно контролировать действия пользователя при установке и замене дискет.

Листинг 1.5. Файл fdchange\ fdchange.cpp

#include <stdio.h> #include <conio.h> #include <dos.h> #include <stdlib.h>

union REGS inregs, outregs;

void main(void) { // Устанавливаем тип диска и сбрасываем // флаг замены дискеты inregs.h.ah = 0x17; inregs.h.al = 3; inregs.h.dl = 0; int86(0x13, &inregs, &outregs);

// Определяем тип диска и наличие аппаратной // поддержки проверки замены дискеты inregs.h.ah = 0x15; inregs.h.dl = 0; int86(0x13, &inregs, &outregs); printf("\nТип диска А: %d", outregs.h.ah);

// Определяем состояние флага замены дискеты inregs.h.ah = 0x16; inregs.h.dl = 0; int86(0x13, &inregs, &outregs); printf("\nСостояние флага замены дискеты:" " %d",outregs.h.ah);

// Выводим состояние порта 0x3F7. // Бит 7 этого порта отображает состояние // флага замены дискеты printf("\nПорт 0x3F7: %02.2x",inp(0x3f7));

// Сбрасываем контроллер НГМД inregs.h.ah = 0; inregs.h.dl = 0; int86(0x13, &inregs, &outregs);

// Делаем паузу, во время которой можно // заменить дискету. // Попробуйте во время ожидания нажатия на клавишу // открыть и затем закрыть дверцу дисковода - это // приведет к установке флага замена дискеты printf("\nЗамените дискету и нажмите на любую клавишу"); getch();

// Определяем состояние флага замены дискеты inregs.h.ah = 0x16; inregs.h.dl = 0; int86(0x13, &inregs, &outregs); printf("\nСостояние флага замены дискеты: %d", outregs.h.ah);

// Выводим состояние порта 0x3F7. printf("\nПорт 0x3F7: %02.2x", inp(0x3f7)); }

Еще один пример использования прерывания INT 13h (нестандартное форматирование дорожки дискеты) мы приведем в следующем разделе.



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