#include <dos.h>
#include <stdio.h>
#include <string.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[1000];
char buf1[80];

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

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

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

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

  gets(buf1);
  strcpy(buf,buf1);

  // Заполняем блок параметров для выполнения
  // операции записи
  dbp_wr->spec    = 0;
  dbp_wr->head    = 0;
  dbp_wr->track   = 81;
  dbp_wr->sector  = 0;
  dbp_wr->sectcnt = 1;
  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);
  }

  // Заполняем блок параметров для выполнения
  // операции чтения
  dbp_wr->spec = 0;
  dbp_wr->head = 0;
  dbp_wr->track = 81;
  dbp_wr->sector = 0;
  dbp_wr->sectcnt = 1;
  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);
  }

  printf("\nПрочитано из нестандартного "
    "сектора:\n%s\n", buf);

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

  return(0);
}

