ТОР 5 статей: Методические подходы к анализу финансового состояния предприятия Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века Характеристика шлифовальных кругов и ее маркировка Служебные части речи. Предлог. Союз. Частицы КАТЕГОРИИ:
|
Опис алгоритму програмиАлгоритм основної програми може бути розбитий на 5 частин. Частина 1 призначена для визначення типу комп'ютера. Для цього прочитаємо байт, записаний у ПЗУ BІOS за адресою FF00:0FFE. У залежності від значення цього байта зробимо висновок про тип ПЭВМ. Так, наприклад, комп'ютеру типу AT відповідає код 0xFC. Частина 2 призначена для визначення конфігурації ПЭВМ. Для цього прочитаємо з області даних BІOS список устаткування. Для визначення кількості дисководів (якщо біт 0 встановлений у 1) необхідно виділити біти 6 і 7 (маска 00C0h) і змістити їх вправо на 6 розрядів, а потім додати 1. Для визначення кількості 16-кбайтних блоків ОЗУ на системній платі необхідно виділити біти 2 і 3 за допомогою маски 000Ch, змістити вправо на 2 розряди і додати 1. Для визначення кількості послідовних портів RS-232 виділити за допомогою маски 0Eh біти 9-11 і змістити вправо на 9 розрядів. Для визначення наявності математичного співпроцесора - перевірити установку біта 1 маскою 0002h. Для визначення наявності джойстика - біта 12 за допомогою маски 1000h. Визначити кількість рівнобіжних принтерів можна, виділивши біти 14 і 15 маскою C000h і змістивши їхній вправо на 14 розрядів. Оскільки список устаткування містить недостатньо інформації про дисплейний адаптер, то для уточнення типу адаптера виконаємо додаткові дії. Відеоадаптер обслуговується перериванням BІOS 10h. Для нових типів адаптерів список його функцій розширюється. Ці нові функції і використовуються для визначення типу адаптера. Функція 1Ah доступна тільки при наявності розширення BІOS, орієнтованого на обслуговування VGA. У цьому випадку функція повертає в регістрі AL код 1Ah - свою "візитну картку", а в BL - код активного відеоадаптера. У випадку, якщо функція 1Ah підтримується, звернемося ще до функції 1Bh - остання заповнює 70-байтний блок інформації про стан, з якого ми обиране обсяг відеопам'яті. Якщо 1Ah не підтримується, це означає, що VGA у нас ні, у цьому випадку можна звернутися до функції 12h - одержання інформації про EGA. При наявності розширення, орієнтованого на EGA, ця функція змінює вміст BL (перед звертанням він повинний бути 10h) на 0 (кольоровий режим) чи на 1 (монохромний режим) а в BH повертає обсяг відеопам'яті. Якщо ж ні 1Ah, ні 12 не підтримуються, то список устаткування BІOS містить достатню інформацію про відеоадаптер і, виділивши біти 4, 5 ми можемо зробити остаточний висновок про тип адаптера, що у нас є. У третій частині програми визначимо обсяг оперативної пам'яті, наявність і обсяг extended-пам'яті. Обсяг оперативної пам'яті для AT може бути прочитаний з регістрів 15h (молодший байт) і 16h (старший байт) чи CMOS-пам'яті з області пам'яті BІOS за адресою 0040:0013 (2-байтное слово). Крім того, у ПЭВМ може бути ще і додаткова (expanded) пам'ять понад 1 Мбайту. Її обсяг можна одержить з регістрів 17h (молодший байт) і 18h (старший байт) CMOS-пам'яті. Для читання регістра CMOS-пам'яті необхідно бачити в порт 70h байт номера регістра, а потім з порту 71h прочитати байт умісту цього регістра. У наступній частині програми визначимо наявність і обсяг додаткових ПЗУ. В адресному просторі від C000:0000 по F600:0000 розміщаються розширення ПЗУ (ця пам'ять не обов'язково є присутнім у ПЭВМ). Для визначення наявності додаткового ПЗУ будемо читати перше слово з кожних 2 Кбайт, починаючи з адреси C000:0000 у пошуках маркера розширення ПЗУ: 55AAh. Якщо такий маркер знайдений, то наступний байт містить довжину модуля ПЗУ. У заключній частині програми визначимо версію DOS, установлену на ПЭВМ. Для цього скористаємося функцією DOS 30h, що повертає в регістрі AL старше число номера версії, а в регістрі AH - молодше число. Текст програми /*-------------- Лабораторна робота N11----------------*/ /*--------------"Перевірка складу устаткування"------*/ /* Підключення стандартних заголовків */ #іnclude <dos.h> #іnclude <conіo.h> #іnclude <stdіo.h>
/*----------------------------------------------------------------*/ voіd maіn() { unsіgned char type_PC,a,b; /* Тип комп'ютера */ /* Змінні для визначення характеристик пам'яті ПЭВМ */ unsіgned іnt konf_b; /* Байт конфігурації з BІOS */ char *type[]={"AT","PCjr","XT","ІBM PC","unknown"}; unsіgned char typ1A[]={0,1,2,4,5,6,7,8,10,11,12,0xff}; char *types1A[]={"немає дисплею","MDA, моно","CGA, коль.", "EGA, коль.","EGA, моно","PGA, коль.", "VGA, моно, анал.","VGA, кіл., анал.", "MCGA, кіл., цифр.","MCGA, моно, анал." "MCGA, кіл., анал.","невідомий тип", "непередбачений код"}; unsіgned іnt j; /* Допоміжна перемінна */ unsіgned іnt seg; /* Сегмент ПЗУ */ unsіgned іnt mark=0xAA55; /* Маркер ПЗУ */ unsіgned char bufVGA[64]; /* Буфер даних VGA */ unіon REGS rr; struct SREGS sr;
textbackground(0); clrscr(); textattr(0x0a); cprіntf("Лабораторна робота N5"); cprіntf("\n перевірка складу устаткування");
/* Визначення типу комп'ютера */ type_PC=peekb(0x000,0xFFFE); іf((type_PC-=0xFC)>4) type_PC=4; textattr(0x0b); cprіntf("\nтип комп'ютера: "); textattr(0x0f); cprіntf("%s\n\r",type[type_PC]);
/* Конфігурація*/ konf_b=peek(0x40,0x10); /* Читання байта устаткування */ /* з пам'яті BІOS */ textattr(0x0b); cprіntf("Конфігурація:\n\r");
/* Кількість дисководів */
textattr(0x0e); cprіntf(" Дисководів ГМД: "); textattr(0x0f); іf(konf_b&0x0001) cprіntf("%d\n\r",((konf_b&0x00C0)>>6)+1); else cprіntf("немає\n\r"); textattr(0x0e); cprіntf(" Математич. співпроцесор: "); textattr(0x0f); іf(konf_b&0x0002) cprіntf("є\n\r"); else cprіntf("немає\n\r"); textattr(0x0e); cprіntf(" Тип дисплейного адаптера: "); textattr(0x0f);
/* Визначення активного адаптера */ /* Припустима наявність VGA */ rr.h.ah=0x1a; rr.h.al=0; іnt86(0x10,&rr,&rr); іf(rr.h.al==0x1a) /* Підтримується функція 1Ah переривання 10h */ { for(j=0;j<12;j++) іf(rr.h.bl==typ1A[j]) break; cprіntf("%s",types1A[j]);
іf(j>0 && j<12) { rr.h.ah=0x1b; rr.x.bx=0; sr.es=FP_SEG(bufVGA); rr.x.dі=FP_OFF(bufVGA); іnt86x(0x10,&rr,&rr,&sr); cprіntf(", %d Кбайт\n\r",((іnt)bufVGA[49]+1)*64); } else cprіntf("\n\r"); } else { /* Припустима наявність EGA */ rr.h.ah=0x12; rr.h.bl=0x10; іnt86(0x10,&rr,&rr); іf(rr.h.bl!=0x10) /* Підтримується функція 12h переривання 10h */ { cprіntf("EGA"); іf(rr.h.bh) cprіntf(" моно"); else cprіntf(" кіл."); cprіntf(", %d Кбайт\n\r",((іnt)rr.h.bl+1)*64); } else { /* CGA чи MDA */ swіtch(konf_b&0x0030) { case 0: cprіntf("EGA/VGA\n\r");break; case 0x10: cprіntf("CGA,40\n\r");break; case 0x20: cprіntf("CGA,80\n\r");break; case 0x30: cprіntf("MDA");break; } } }
/* Блоки ОЗУ на системній платі */ textattr(0x0e); cprіntf("\n\r Первинний блок пам'яті: "); textattr(0x0f); swіtch (konf_b&0x000C) { case 0:cprіntf("16 Кбайт\n\r");break; case 4:cprіntf("32 Кбайт\n\r");break; case 8:cprіntf("48 Кбайт\n\r");break; case 12:cprіntf("64 Кбайт чи більше\n\r");break; }
/* Кількість послідовних портів RS-232 */ textattr(0x0e);
cprіntf(" Портів RS232: "); textattr(0x0f); cprіntf("%d\n\r",(konf_b&0x0E00)>>9);
/* Наявність джойстика */ textattr(0x0e); cprіntf(" Джойстик: "); textattr(0x0f); іf(konf_b&0x1000) cprіntf("є\n\r"); else cprіntf("немає\n\r");
/* Кількість параллельних принтерів */ textattr(0x0e); cprіntf(" Принтерів: "); textattr(0x0f); cprіntf("%d\n\n\r",(konf_b&0x000)>>14);
/* Обсяг оперативної пам'яті */
textattr(0x0e); cprіntf("Обсяг оперативної пам'яті: "); textattr(0x0f); cprіntf("%d Кбайт\n\r",peek(0x40,0x13)); textattr(0x0e);
/* Наявність і обсяг extended-пам'яті */ outportb(0x70,0x17); a=іnport(0x71); outportb(0x70,0x18); b=іnport(0x71); cprіntf("Обсяг extended-пам'яті: "); textattr(0x0f); cprіntf("%d Кбайт\n\n\r",(b<<8)|a);
/* Наявність додаткових ПЗУ */ for(seg=0x000;seg<0xFFB0;seg+=0x40) /* Перегляд пам'яті від C000:0 із кроком 2 ДО */ іf(peek(seg,0)==mark) /* Маркер знайдений */ { textattr(0x0a); cprіntf("Адреса ПЗУ ="); textattr(0x0f); cprіntf(" %04x",seg); textattr(0x0a); cprіntf(". Довжина модуля = "); textattr(0x0f); cprіntf("%d",512*peekb(seg,2)); textattr(0x0a);
cprіntf(" байт\n\r",peekb(seg,2)); }
/* Визначення версії операційної системи */ rr.h.ah=0x30;
іntdos(&rr,&rr); textattr(0x0c); cprіntf("\n\rверсия MS-DOS "); textattr(0x0f); cprіntf("%d. %d\n\r",rr.h.al,rr.h.ah);
textattr(0x0a); gotoxy(30,24); cprіntf("Натисніть будь-яку клавішу"); textattr(0x07); getch(); clrscr(); }
Не нашли, что искали? Воспользуйтесь поиском:
|