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

union REGS inregs, outregs;
struct SREGS segregs;
void main(void);

void main(void)
{
  char far *dir_name = "DIR";

  // Стираем каталог с именем DIR. Для этого вызываем
  // функцию 0x3A прерывания INT 21h.
  inregs.h.ah = 0x3a;
  segregs.ds  = FP_SEG(dir_name);
  inregs.x.dx = FP_OFF(dir_name);
  intdosx(&inregs, &outregs, &segregs);

  // Если после выполнения прерывания установлен
  // флаг переноса, выводим сообщение об ошибке.
  if(outregs.x.cflag != 0)
  {
    printf("\n\nОшибка при удалении каталога:\t%d",
      outregs.x.ax);

    // Получаем расширенную информацию об ошибке
    // с помощью функции 0x59 прерывания INT 21h.
    inregs.h.ah = 0x59;
    inregs.x.bx = 0;

    // Сохраняем регистры в стеке, так как их содержимое
    // изменится
    asm push ds
    asm push es
    asm push si
    asm push di

    // Вызываем прерывание
    intdosx(&inregs, &outregs, &segregs);

    // Восстанавливаем содержимое регистров
    asm pop di
    asm pop si
    asm pop es
    asm pop ds

    // Выводим расширенную информацию об ошибке
    printf("\nРасширенный код ошибки: \t%d"
           "\nКласс ошибки:           \t%d"
           "\nПредполагаемые действия:\t%d"
           "\nЛокализация ошибки:     \t%d",
           outregs.x.ax, outregs.h.bh,
           outregs.h.bl, outregs.h.ch);
	}
   printf("\n\nНажмите любую клавишу...");
   getch();
}
