#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[2000];

	 int sectors, i;

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

// Ожидаем ответ оператора и анализируем его

	 i = getch();
	 if((i != 'y') && (i != 'Y')) exit(-1);


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

	 dbp_wr = malloc(sizeof(DPB_FORMAT));

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


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

	 free(dbp_wr);

	 exit(0);
}

