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

typedef struct _DPB_WR_
{
  char spec;
  unsigned head;
  unsigned track;
  unsigned sector;
  unsigned sectcnt;
  void _far *buffer;
} DPB_WR;

char buf[2000];

int main(void)
{
  union REGS reg;
  struct SREGS segreg;
  DPB_WR far *dbp_wr;
  int sectors, i;

  printf("\nПрограмма уничтожит содержимое"
    "\n20-й дорожки диска А:."
    "\nЖелаете продолжить? (Y,N)\n");

  // Ожидаем ответ и анализируем его
  i = getch();
  if((i != 'y') && (i != 'Y'))
    return(-1);

  // Заказываем память для блока параметров
  // устройства, который будет
  // использован для чтения и записи
  dbp_wr = (DPB_WR far*)farmalloc(sizeof(DPB_WR));

  if(dbp_wr == NULL)
  {
    printf("\nМало памяти");
    return(-1);
  }

  // Заполняем блок параметров для выполнения
  // операции чтения.
  // Мы будем читать первые два сектора
  // на нулевой дорожке, головка 0
  dbp_wr->spec = 0;
  dbp_wr->head = 0;
  dbp_wr->track = 0;
  dbp_wr->sector = 0;
  dbp_wr->sectcnt = 2;
  dbp_wr->buffer = buf;

  // Выполняем операцию чтения дорожки
  reg.x.ax = 0x440d;
  reg.h.bl = 1;
  reg.x.cx = 0x0861;
  reg.x.dx =  FP_OFF(dbp_wr);
  segreg.ds = FP_SEG(dbp_wr);
  intdosx(&reg, &reg, &segreg);

  // Проверяем результат выполнения операции
  if(reg.x.cflag != 0)
  {
    printf("\nОшибка: %d", reg.x.ax);
    return(-1);
  }

  // Заполняем блок параметров для выполнения
  // операции записи.
  // Только что прочитанные два сектора нулевой
  // дорожки будут записаны на 20-ю дорожку
  dbp_wr->spec = 0;
  dbp_wr->head = 0;
  dbp_wr->track = 20;
  dbp_wr->sector = 0;
  dbp_wr->sectcnt = 2;
  dbp_wr->buffer = buf;

  // Выполняем операцию записи
  reg.x.ax = 0x440d;
  reg.h.bl = 1;
  reg.x.cx = 0x0841;
  reg.x.dx =  FP_OFF(dbp_wr);
  segreg.ds = FP_SEG(dbp_wr);
  intdosx(&reg, &reg, &segreg);

  // Проверяем результат выполнения операции
  if(reg.x.cflag != 0)
  {
    printf("\nОшибка: %d", reg.x.ax);
    return(-1);
  }

  // Освобождаем память
  farfree(dbp_wr);

  return(0);
}

