Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМКДО_СистПрог_2016.doc
Скачиваний:
8
Добавлен:
01.07.2025
Размер:
2 Мб
Скачать
☆

5.2. Текст программы

/*----------------Лабораторная работа N11-----------------*/

/*--------------"Просмотр списка драйверов."--------------*/

#include <dos.h>

#include <conio.h>

/*-----------------------Константы----------------------- */

#define byte unsigned char

#define word unsigned int

#define ATR(x,z) if(drv->attr&x){cprintf(" %s\n\r",z);y++;}

#define DA(x,y) (struct DR_HEAD *)MK_FP(x,y);

#define VSEG 0xb800 /* Сегментный адрес видеопамяти */

#define byte unsigned char

#define word unsigned int

#define Enter 13

#define rx 50

#define ry 13

int xk,yk;

word cc;

byte bm[rx][ry][2];

8struct DR_HEAD { /* заголовок драйвера */

struct DR_HEAD *next;

word attr, strat_addr, intr_addr;

char name[8];

} *drv; /* адрес текущего драйвера */

struct DR_HEAD *clock, *con; /* Адреса CLOCK$ и CON */

union REGS rr;

struct SREGS sr;

int i, y, y1;

/*---------------------------------------------------*/

void clrbuf(void)

{

while(kbhit()) getch();

}

/*--------------Чтение символа из видеопамяти-------------*/

byte GetSym(x1,y1)

int x1,y1;

{

return(peekb(VSEG,y1*160+x1*2));

}

/*-------------Чтение атрибута из видеопамяти-------------*/

byte GetAtr(x1,y1)

int x1,y1;

{

return(peekb(VSEG,y1*160+x1*2+1));

}

/*-------------Запись символа в видеопамять---------------*/

void PutSym(x1,y1,sym)

int x1,y1;

byte sym;

{

pokeb(VSEG,y1*160+x1*2,sym);

}

/*-------------Запись атрибута в видеопамять--------------*/

void PutAtr(x1,y1,atr)

8int x1,y1;

byte atr;

{

pokeb(VSEG,y1*160+x1*2+1,atr);

}

/*--------------------------------------------------------*/

void MemW(x,y,xr,yr)

int x,y,xr,yr;

{

int i,j;

for (j=y;j<(y+yr);j++)

for (i=x;i<(x+xr);i++)

{

bm[i][j][0]=GetSym(i,j);

bm[i][j][1]=GetAtr(i,j);

}

}

/*--------------------------------------------------------*/

void RmmW(x,y,xr,yr)

int x,y,xr,yr;

{

int i,j;

for (j=y;j<(y+yr);j++)

for (i=x;i<(x+xr);i++)

{

PutSym(i,j,bm[i][j][0]);

PutAtr(i,j,bm[i][j][1]);

}

}

/*--------------------------------------------------------*/

void ClrW(x1,y1,x2,y2,s,a)

int x1,y1,x2,y2;

byte s,a;

{

int i,j;

for (j=y1;j<y2;j++)

for (i=x1;i<x2;i++)

{

if (s!=0) PutSym(i,j,s);

PutAtr(i,j,a);

}

}

/*--------------------------------------------------------*/

void FlDrv(void)

{

int xm,ym;

xm=wherex();

ym=wherey();

MemW(0,1,rx,ry);

ClrW(1,2,rx,ry,0,7);

ClrW(0,1,rx-2,ry-2,32,16);

gotoxy(1,2);

textattr(15+16*3);

cprintf("*** Атрибуты драйвера %5u ***",cc);

gotoxy(1,3);

textattr(15+16);

if (drv==clock) cprintf(" активный CLOCK$");

if (drv==con) cprintf(" активный CON");

gotoxy(1,4);

textattr(14+16);

if (drv->attr&0x8000)

{

ATR(1,"консоль ввода")

ATR(2,"консоль вывода")

ATR(4,"нулевое устройство")

ATR(8,"CLOCK$ (часы)")

ATR(0x2000,"поддерживает OUB")

}

else

{

ATR(2,"32-байтный адрес сектора")

ATR(0x2000,"читает media FAT")

}

ATR(0x40,"поддерживает функции DOS 3.2")

ATR(0x800,"поддерживает Open/Close")

ATR(0x4000,"поддерживает IOCTL")

gotoxy(1,12);

textattr(15+16*3+128);

cprintf("*** Нажмите любую клавишу... ***");

if (getch()==0) getch();

RmmW(0,1,rx,ry);

gotoxy(xm,ym);

}

/*--------------------------------------------------------*/

main() {

int c;

/* получение адреса CVT */

rr.h.ah=0x52; intdosx(&rr,&rr,&sr);

/* адрес драйвера часов */

clock=DA(peek(sr.es,rr.x.bx+10),peek(sr.es,rr.x.bx+8));

/* адрес драйвера консоли */

con=DA(peek(sr.es,rr.x.bx+14),peek(sr.es,rr.x.bx+12));

/* адрес NUL-драйвера */

textattr(10);

clrscr();

cprintf("---------------");

cprintf(" Лабораторная работа N11 ");

cprintf("---------------");

cprintf("---------------");

cprintf(" Просмотр списка драйверов. ");

cprintf("---------------");

drv=DA(sr.es,rr.x.bx+34);

textattr(7);

gotoxy(8,3);

cprintf("Нажимайте <SpaceBar> ,а для рассмотрения атрибутов",

"драйвера <Enter>.");

textattr(12);

gotoxy(28,4);

cc=1;

cprintf("Список драйверов устройств :\n\r");

while(FP_OFF(drv)!=0xffff) {

textattr(15);

cprintf("%5u",cc);

textattr(14);

cprintf(" Адрес - %Fp ",drv);

textattr(11);

cprintf(" атрибуты - %04X ",drv->attr);

textattr(13);

if (drv->attr&0x8000)

for (i=0;i<8; cprintf("%c",drv->name[i++]));

else cprintf("блочный - %d",drv->name[0]);

cprintf("\n\r"); y=0;

while ((c=getch())==Enter)FlDrv();

if (c==0) getch();

drv=drv->next; /* адрес след.драйвера */

cc++;

}

textattr(12+128);

cprintf("Конец списка. Нажмите любую клавишу...\n");

getch();

textattr(7);

}