outportb(0x40,oldtic>>8); /* Старший байт лiчильника */
dd=3; /* EGA, 16 кольорiв */
m=1; /* Режим 640*350 */
initgraph(&dd,&m,"f:\\my_work\\bc\\bgi");
/* read result of initialization */
errorcode = graphresult();
if (errorcode != grOk) /* помилка графiчного режиму */
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1); /* аварiйне завершення */
}
setcolor(10);
settextstyle(0,0,2);
outtextxy(15,10,"RESULTS");
setcolor(9);
rectangle(15,40,624,330);
setcolor(11);
for(ny=0; ny<NN; ny++)
{
circle(22+ny*6,330-y[ny]*1,2);
line(22+ny*6,330,22+ny*6,330-y[ny]*1);
}
setcolor(12);
settextstyle(0,0,1);
outtextxy(260,340,"Press Any Key For Exit ...");
getch();
closegraph();
}
void interrupt newtime()
{
if (--kf<0) {
/* Виклик oldtime - на 2-й раз */
(*oldtime)();
kf=3;
}
else /* iнакше - зкидання контролера */
outportb(0x20,0x20);
if ((ny>=0) /* Якщо АЦП почалося, */
&&(ny<NN)) /* та NN показань ще не набрано, */
y[ny++]=yc; /* запамятовування черегового показання */
}
void *readvect(int in)
{
rr.h.ah=0x35; rr.h.al=in;
intdosx(&rr,&rr,&sr);
return(MK_FP(sr.es,rr.x.bx));
}
void writevect(int in, void *h)
{
rr.h.ah=0x25;
rr.h.al=in;
sr.ds=FP_SEG(h);
rr.x.dx=FP_OFF(h);
intdosx(&rr,&rr,&sr);
}
Результат роботи програми:
Висновок: засвоїв функцiї системного таймера та закріпив практичні навикі роботи з ним.
Лабораторна робота №4
“Управління пам’яттю”
Мета роботи: вивчення розподiлу пам'ятi в операцiйнiй системi MS DOS i отримання практичних навикiв роботи з блоками управлiння пам'яттю.
Постанова завдання: вивести на екран карту пам'ятi.
Опис змінних: змінні програми : p_MCB - адреса поточного керуючого блоку пам'ятi (MSB); p_EMCB - адреса керуючого блоку пам'ятi в якiй мiститься сегмент оточення програми; ui_Memtop - сегментна адреса початку ланцюжка керуючих блокiв; ui_Seg - сегментна адреса поточного керуючого блоку; ui_Other_Seg - сегментна адреса блоку оточення хозяїна поточного блоку пам'ятi; ui_Father_Seg - сегментна адреса батька для програми-хозяїна поточного блоку; uc_EnvStr - адреса рядка оточення для програми-хозяїна поточного блоку пам'ятi;i_EnvLen - довжина чергового рядка оточення; i - допомїжна змiнна; n - число виведенних на екран рядкiв iнформацiї про блоки; s - покажчик на iм'я хозяїна блоку.
Опис алгоритму програми: за допомогою функцiї 52h DOS (переривання 21h) визначимо адресу системних керуючих блокiв :
Вхiд : Ah = 52h
Вихiд : ES:BX - адреса 1-го блоку параметрiв диску.
Виконуючи віднімання з цiєї адреси 2, одержимо адресу того слова пам'ятi в якому DOS зберiгає сегментну адресу першого керуючого блоку пам'ятi.
Кожен блок пам'ятi контролюїться Керуючим Блоком Пам'ятi (MSB - Memory Control Block ). MSB має фіксований pозміp 1 паpагpафа i фоpмат, який описуїться наступною стpуктуpою :
struct MEMORY_CONTROL_BLOCK
{
char c_Signature;
unsigned int ui_Owner_PID;
unsigned int ui_Size_Paras;
unsigned char pc_Reserved[3];
char str_Name_Of_Owner[8];
};
Статтi c_Signature MSB мають у собі код, що показує, чи є цей MSB останнiм (код лiтери Z - 0x5a) чи не останнiм (код лiтери M - 0x4d). Статтi ui_Owner_PID мають у собі Pid (сегментний адpес пpефікса пpогpамного сегменту) пpогpамми, яким даний блок пам'ятi належить. Якщо значення цього поля нульове, то блок вільний. Стаття ui_Size_Paras має pозміp блоку пам'ятi в паpагpафах (в це число не включений 1 паpагpаф, займаний самим MSB ). Наступнi 3 байта (статтi pc_Reserved ) заpезеpвовані в усiх веpсiях. Статтi str_Name_Of_Owner заpезеpвipовано (не використовуїться ) в веpсiях DOS нижче 4. 0. Починаючи iз веpсiї 4. 0, в MSB,тут записано iм'я (без pозшиpення) пpогpамми, що знаходиться в цьому сегментi (якщо довжина iм'я менше 8 символiв, воно закiнчується нульовим байтом ). Всi MSB ув'язані в ланцюжок. Одержавши за допомогою функцiї DOS 0x52 сегментну адресу початку ланцюжка MSB csegm, пересуваймося по ланцюжку. Перехiд до наступного блоку відбувається додаванням до адреси поточного MSB його поля ui_Size_Paras i ще 1. Перебір закiнчується при здобутку MSB зi значенням 'z' в статi c_Signature.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.