Опис алгоритму програми

Алгоритм основної програми може бути розбитий на 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 - молодше число.