Для записи и последующего чтения информации на дополнительную дорожку, созданную предыдущей программой, можно использовать программу RW81TRK (листинг 5.3).
Листинг 5.3. Файл fmt81trk\fmt81trk.cpp
#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(®, ®, &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(®, ®, &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); }