#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));
}

