Страница 1 из 1

Определение типа компьютера и версии BIOS

Добавлено: Пт янв 03, 2025 10:46 pm
push0ret
Hello, world!

Есть два способа определить модель компьютера и получить информацию о конфигурации - прочитать эту информацию из ПЗУ BIOS или вызвать одну из функций прерывания 15h, возвращающую адрес таблицы конфигурации (в статье я буду использовать именно её).

В ПЗУ BIOS по адресу F000h:FFFEh записан байт, значение которого можно использовать для конфигурации типа компьютера:

FF оригинальный IBM PC;
FE XT, Portable PC;
FD PCjr;
FC AT;
FB XT с памятью 640 К на материнской плате;
FA PS/2 модель 25 или 30;
F9 Convertible PC;
F8 PS/2 модели 55SX, 70, 80;
9A Compaq XT, Compaq Plus;
30 Sperry PC;
2D Compaq PC, Compaq Deskpro

Более подробную информацию можно получить, использовав функцию C0h прерывания 15h:

На входе: AH = C0h
На выходе: ES:BX = адрес таблицы конфигурации,
таблица находится в ПЗУ BIOS;
CF = 0 при успешном вызове прерывания;
CF = 1 если данная версия BIOS не поддерживает функцию C0h.

После выполнения прерывания в регистрах ES:BX будет записан адрес области памяти конфигурации компьютера (аппаратно записано в ПЗУ BIOS). Приведу структуру этой области памяти:

(+0) dw размер таблицы в байтах
(+2) db код модели
(+3) db дополнительный код модели
(+4) db версия BIOS revision: 0 для первой реализации; 2 для второй и т.д.
(+5) db байт конфигурации оборудования:
  • бит 7 = канал 3 контроллера прямого доступа к памяти используется дисковой системой базового ввода-вывода (дисковой BIOS)

    бит 6 = установлен второй контроллер прерываний 8259

    бит 5 = установлены часы реального времени

    бит 4 = каждый раз после вызова прерывания от клавиатуры INT 9h вызывается функция 4Fh прерывания INT 15h

    бит 3 = BIOS поддерживает ожидание внешнего события

    бит 2 = используется расширенная область данных BIOS

    бит 1 = если этот бит установлен в 1, то используется шина Micro Channel, в противном случае - ISA

    бит 0 зарезервирован
(+6) dw зарезервировано и равно 0
(+8) dw зарезервировано и равно 0

В следующей таблице приведены коды моделей, версии BIOS, дополнительные коды моделей для некоторых компьютеров:

FFh * * 04/24/81 оригинальная версия
IBM PC

FFh * * 10/19/81 IBM PC, в этой версии
BIOS исправлены некоторые ошибки

FFh * * 10/27/82 IBM PC, используется
накопитель на магнитном диске
(НМД), оперативная память 640 К,
поддерживается адаптер дисплея EGA

FEh * * 08/16/82 IBM PC XT

FEh * * 11/08/82 IBM PC XT, Portable

FDh * * 06/01/83 PCjr

FCh * * 01/10/84 IBM AT, модели 068,
099, частота тактового генератора
6 MHz, емкость НМД - 20MB

FCh 00h 01h 06/10/85 IBM AT, модель 239,
частота тактового генератора
6 MHz, емкость НМД - 30MB

FCh 01h 00h 11/15/85 IBM AT, модели 319,
339, частота тактового генератора
8 MHz, используются расширенная
клавиатура, BIOS может работать с
накопителями на гибких магнитных
дисках формата 3,5 дюйма

FCh 01h - Compaq 286/386

FCh 02h 00h 04/21/86 IBM PC XT-286

FCh 04h 00h 02/13/87 PS/2 модель 50

FCh 04h 03h 04/18/88 PS/2 модель 50Z

FCh 05h 00h 02/13/87 PS/2 модель 60

FCh 06h - 7552 "Gearbox"

FCh 09h 02h 06/28/89 PS/2 модель 30-286

FCh 81h 00h 01/15/88 Phoenix 386 BIOS,
версия 1.10

FBh 00h 01h 01/10/86 IBM PC XT, расширенная
клавиатура, BIOS может работать с
накопителями на гибких магнитных
дисках формата 3,5 дюйма

FBh 00h 02h 05/09/86 IBM PC XT

FAh 00h 00h 09/02/86 PS/2 модель 30

FAh 00h 01h 12/12/86 PS/2 модель 30

FAh 01h 00h - PS/2 модель 25

F9h 00h 00h 09/13/85 PC Convertible

F8h 00h 00h 03/30/87 PS/2 модель 80 16MHz

F8h 01h 00h 10/07/87 PS/2 модель 80 20MHz

F8h 04h 02h 04/11/88 PS/2 модель 70

F8h 04h 03h 03/17/89 PS/2 модель 70

F8h 09h - - PS/2 модель 70

F8h 09h 02h 04/11/88 PS/2 модель 70

F8h 09h 03h 03/17/89 PS/2 модель 70

F8h 0Ch 00h 11/02/88 PS/2 модель 55SX

F8h 1Bh 00h 10/02/89 PS/2 модель 70-486

9Ah * * - Compaq XT или
Compaq Plus

30h - - - Sperry PC

2Dh * * - Compaq PC или
Compaq Deskpro

Замечу, что функция C0h прерывания 15h поддерживается не всеми версиями BIOS, а лишь теми, что были выпущены после 10 января 1986 года.

Приведу текст программы, которая выводит на экран конфигурацию компьютера, используя данные полученные из ПЗУ BIOS с помощью функции C0h прерывания 15h:

Код: Выделить всё

.286
.model	tiny
code	segment
org	100h

start:

mov ah, 0C0h
int 15h

mov cx, word ptr es:[bx]

mov ax, es
push ds
pop es

mov ds, ax
mov di, offset bios.size_table
mov si, bx

rep movsb

push es
pop ds

;write model code

mov al, bios.model_code
mov di, offset model+14
call hex_ascii
mov model, 1d

;write additional code of model

mov al, bios.add_code
mov di, offset ex_code+12
call hex_ascii
mov ex_code, 1d

;write version of modification BIOS

mov al, bios.bios_ver
mov di, offset bios_v+16
call hex_ascii
mov bios_v, 1d

;Configuration byte

mov al, bios.hrdwr_cfg

;test system bus

test al, 2d
jnz mcc

mov bus2, 1d

jmp bios_a

;used microchannel 

mcc:

mov bus1, 1d

bios_a:

test al, 4d
jz bios_b

mov bios1, 1d

bios_b:

test al, 8d
jz ints

mov bios2, 1d

ints:

test al, 16d
jz r_t_c

mov _int9, 1d

r_t_c:

test al, 32d
jz ctrl_ints

mov rtc, 1d

ctrl_ints:

test al, 64d
jz ch_dma

mov ctrl_int, 1d

ch_dma:

test al, 128d
jz dsp_out

mov dma, 1d

dsp_out:

mov bx, offset model

lp:

cmp byte ptr[bx], 0FFh
jz exit

call display
add bx, 53d

jmp lp

exit:

mov ax, 4c00h
int 21h

display		proc	uses bx

mov si, bx
cmp byte ptr[si], 1d
jz displ

jmp exitp

displ:

inc bx
mov dx, bx
mov ah, 9d
int 21h

exitp:

ret

display		endp



hex_ascii	proc	uses di cx bx 

mov cx, 2d

trans:

mov bl, al
and bl, 0Fh
cmp bl, 9d
ja letter

add bl, 30h
mov byte ptr[di], bl
dec di
shr al, 4d
loop trans
jmp exp

letter:

add bl, 37h
mov byte ptr[di], bl
dec di
shr al, 4d
loop trans

exp:

ret

hex_ascii	endp

biosinfo	struc

size_table	dw	?
model_code	db	?
add_code	db	?
bios_ver	db	?
hrdwr_cfg	db	?
reserved	dd	?

biosinfo	ends

model		db	0,'Model code:', 9d,  2d dup(0), 0Ah, 0Dh, 24h, 35d dup(0)
ex_code		db	0,'Add code:', 9d, 2d dup(0), 0Ah, 0Dh, 24h, 37d dup(0)
bios_v		db	0,'Bios version:', 9d, 2d dup(0), 0Ah, 0Dh, 24h, 33d dup(0)
bus1		db	0,'Used MicroChannel', 0Ah, 0Dh, 24h, 32d dup(0)
bus2		db	0,'Used ISA', 0Ah, 0Dh, 24h, 41d dup(0)
bios1		db	0,'Used extended memory area', 0Ah, 0Dh, 24h, 24d dup(0)
bios2		db	0,'BIOS have a function of waiting external event', 0Ah, 0Dh, 24h, 3d dup(0)
_int9		db	0,'After calling INT 9h, called function 4Fh int 15h', 0Ah, 0Dh, 24h
rtc		db	0,'Real time clock installed', 0Ah, 0Dh, 24h, 24d dup(0)
ctrl_int	db	0,'Second 8259 interrupt controller installed', 0Ah, 0Dh, 24h, 7d dup(0)
dma		db	0,'DMA channel 3 used by BIOS to work with disk', 0Ah, 0Dh, 24h, 5d dup(0)
eos		db	0FFh

bios		biosinfo	<>

code	ends
end	start
Результат работы программы:
biosinfo.PNG
biosinfo.PNG (61.91 КБ) 36 просмотров
Программа была запущена в виртуальной ОС MS DOS 6.22 под управлением VMWare.
Использована версия компилятора MASM 6.11 в контексте операционной системы MS DOS 6.22!

Спасибо за внимание!
С уважением, push0ret!