Системное программное обеспечение персональных ЭВМ

         

union REGS rr; struct SREGS



Пример 15

/*== ПРИМЕР 10.8 ==*/ /*============== Перенаправление вывода =============*/ #include <dos.h> #include <stdio.h> union REGS rr; struct SREGS sr; main() { int userout; int sysout_main=1; int sysout_alt; char *mess[]= { "Перенаправление вывода", "Этот текст направляется, казалось бы, на экран,", "но попадет в файл SYSOUT.ALT", "Переназначение сохранит силу даже", "после закрытия файла SYSOUT.ALT", "Направление восстановлено", "Для вывода на экран можно пользоваться", "альтернативным дескриптором для sysout" }; clrscr(); /* создается новый файл */ userout=creat_file("SYSOUT.ALT"); write_file(sysout_main,mess[0]); /* создается альтернативный дескриптор для sysout */ sysout_alt=dup_handle(sysout_main); /* перенаправление из sysout в userout */ redirect(sysout_main,userout); write_file(sysout_main,mess[1]); write_file(sysout_main,mess[2]); /* этот вывод идет в sysout_alt */ write_file(sysout_alt,mess[6]); write_file(sysout_alt,mess[7]); close_file(userout); write_file(sysout_main,mess[3]); write_file(sysout_main,mess[4]); /* восстановл. дескриптора sysout из альтернативного */ redirect(sysout_main,sysout_alt); write_file(sysout_main,mess[5]); getch(); } /*==== получение альтернативного дескриптора ====*/ int dup_handle(int h) { rr.h.ah=0x45; /* функция DupHandle */ rr.x.bx=h; /* дескриптор */ intdos(&rr,&rr); iferror("дублирования"); return (rr.x.ax); } /*==== переназначение дескрипторов ====*/ redirect(int old, int new) { rr.h.ah=0x46; /* функция ReDir */ rr.x.bx=new; /* дескриптор */ rr.x.cx=old; intdos(&rr,&rr); iferror("перенаправления"); } /*==== индикация ошибки ввода-вывода ====*/ iferror(char *s) { if (rr.x.cflag) { printf("Ошибка %s: %x\n",s,rr.x.ax); exit(); } } /*==== создание ====*/ int creat_file(char *fname) { rr.h.ah=0x3c; rr.x.cx=0; sr.ds=FP_SEG(fname); rr.x.dx=FP_OFF(fname); intdosx(&rr,&rr,&sr); iferror("создания"); return(rr.x.ax); } /*==== закрытие файла ====*/ close_file(int h) { rr.h.ah=0x3e; rr.x.bx=h; intdos(&rr,&rr); iferror("закрытия"); } /*==== запись в файл строки текста с ВК, ПС ====*/ write_file(int h, char *s) { char a[3] = { 13, 10, 0 }; write_filex(h,s); /* запись строки */ write_filex(h,a); /* перевод строки */ } /*==== запись в файл ====*/ write_filex(int h,char *s) { rr.h.ah=0x40; rr.x.bx=h; rr.x.cx=strlen(s); sr.ds=FP_SEG(s); rr.x.dx=FP_OFF(s); intdosx(&rr,&rr,&sr); iferror("записи"); }
Наконец, пример 10.9 иллюстрирует применение дисковых функций DOS при получении информации о дисковом пространстве.



Пример 15

struct BCB { /* Управляющий блок буфера DOS 3.x */ struct BCB *next; /* адрес следующего */ byte drive; /* номер устройства */ byte flag; /* байт состояния буфера */ word sect; /* номер сектора */ byte copies /* число копий */ byte sect_off; /* смещение 2-й копии */ void *dpb; /* адрес DPB устройства */ byte reserved[2]; };
а для DOS 5.0 такая:

Содержание раздела