#include <dos.h>
#include <stdio.h>
#include <malloc.h>
#include <errno.h>
#include "sysp.h"

void main(void);
void main(void) {

	 union REGS reg;
	 struct SREGS segreg;
	 DPB_WR _far *dbp_wr;
	 char buf[1000];
	 char buf1[80];

	 int sectors, i;

// Заказываем память для блока параметров устройства,
// который будет использован для чтения/записи

	 dbp_wr = malloc(sizeof(DPB_WR));

	 if(dbp_wr == NULL) {
		printf("\nМало оперативной памяти!");
		exit(-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);
		exit(-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);
		exit(-1);
	 }

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

// Освобождаем буфер

	 free(dbp_wr);

	 exit(0);
}

