Определение системных ресурсов ПЭВМ

Цель работы: изучение и использование функций BIOS и DOS, системных данных и таблиц для решения задачи определения состава, типов и параметров присоединенного оборудования и некоторых других системных ресурсов и данных ПЭВМ:

1. типа персонального компьютера;

2. размера основной и дополнительной памяти;

3. даты изготовления базовой системы ввода/вывода;

4. числа и типов накопителей на магнитных дисках;

5. типа и параметров видеосистемы;

6. типов и числа других периферийных устройств;

7. номера версии установленной операционной системы.

Краткие теоретические сведения:

Для решения указанных задач предлагается составить программу на языке Turbo Pascal с использованием его расширенных возможностей, таких как : размещение переменных по абсолютным адресам памяти, непосредственный доступ к ячейкам памяти и портам, организация программных прерываний и системных вызовов, программирование на низком уровне. Кратко рассмотрим эти возможности Turbo Pascal. В Turbo Pascal имеются средства размещения переменных по конкретным адресам оперативной памяти. Такие переменные называются абсолютными. Для описания абсолютных переменных предназначено зарезервированное слово Absolute. Формат описания переменных этого типа выглядит так :

Var <идентификатор> : <тип> Absolute BA:BS;

Здесь BA:BS - абсолютный адрес ячейки оперативной памяти (байта памяти), начиная с которой отводится место для хранения значения переменной <идентификатор> указанного типа <тип>;

BA - базовый адрес сегмента; BS - смещение внутри этого сегмента.

Для работы с абсолютными переменными (определения абсолютных адресов переменных, записи и считывания информации из конкретных ячеек памяти) в Turbo Pascal имеется ряд стандартных подпрограмм : Addr, CSeg, DSeg, Ofs, Ptr, Seg, SSeg.

В Turbo Pascal определены пять предварительно объявленных массивов : Mem, MemW, MemL, Port и PortW. Первые три массива обеспечивают непосредственный доступ (запись и чтение) к любому участку памяти по абсолютному адресу, два других массива - доступ к портам ввода/вывода.

Для осуществления работы с регистрами процессора ПЭВМ, организации программных прерываний, использования большинства возможностей операционной системы MS-DOS предназначен системный модуль DOS Turbo Pascal.

Реализация всех этих возможностей практически всегда предполагает обращение к регистрам центрального процессора.

Для этих целей в модуле DOS определен специальный тип данных Registers :

Type Registers = Record

Case Integer of 0 : (AX,BX,CX,DX,BP,SI,DI,DS,ES,Flags : Word);

1 : (AL, AH, BL, BH, CL, CH, DL, DH : Byte)

End;

Этот тип имитирует набор регистров центрального процессора и предоставляет возможность обращаться к ним как к переменным типа Word, а для первых четырех регистров разрешено работать с их младшими и старшими байтами независимо, как с байтовыми переменными.

Для организации программных прерываний и выполнения системных функций MS-DOS в модуле DOS Turbo Pascal имеются две стандартные процедуры Intr и MsDos.

Первая процедура Intr инициирует программное прерывание с требуемым номером:

Intr(Num_Int : Byte; var Regs : Registers);

Здесь : Num_Int - номер программного прерывания, которое не обходимо вызвать (0..255);

Regs - запись, в которой процедуре обработки прерывания с номером Num_Int передаётся содержимое регистров и в ней же возвращается выходная информация.

Язык Turbo Pascal допускает три основные возможности для использования средств программирования на низком уровне (язык машинных команд и фрагменты на языке Ассемблера) :

1. Можно написать одну или несколько процедур на языке Ассемблера (вне среды Turbo Pascal), оттранслировать их, получив объектные модули этих процедур, и затем подключить эти модули к Pascal-программе. Для этого в Turbo Pascal существует служебное слово External, указываемое в заголовке процедуры, и директива компилятора $L.

2. Turbo Pascal позволяет непосредственно включать в текст программы фрагменты, написанные на машинном коде. Это достигается использованием inline-операторов и inline-процедур.

3. Начиная с шестой версии Turbo Pascal появилась возможность включения в текст Pascal-программы фрагментов на языке Ассемблера. Средства, поддерживающие эту возможность, называют "встроенный Ассемблер".

ТЕКСТ ПРОГРАММЫ:

program xyz;

uses crt,dos,art,PRINTER;

type zapis=record

OS_Pam,DOP_PAm,Video_Pam:word;

Tip_Kompa,data_biosa:string[20];

NZMD,GMDA,GMDB,Displai,so_proch,igr,_print,MSDOS:string;

posled_port,paral_port:integer;

end;

var st:array [1..4] of string;

ch:integer;

My:zapis;

function type_Pc:string;

var s:byte absolute $F000:$FFFE;

begin

case s of

$FF:type_Pc:='Тип компьютера IBM PC';

$FD:type_Pc:=' Тип компьютера IBM PCjr';

$FE:type_Pc:= Тип компьютера IBM PC/XT';

$FC:type_Pc:=' Тип компьютера IBM PC/AT';

end;

end;

function MS_DOS:string;

var Regs:Registers;

s1,s2:string;

begin

Regs.AH:=$30;

MsDos(Regs);

str(Regs.AL,s1);str(Regs.AH,s2);

MS_DOS:='Версия MS-DOS '+s1+'.'+s2;

end;

procedure SIZE_MEM(var os:word;var dp:word;var video:word);

var Regs:Registers;

begin

os:=memw[$0000:$0413];

Intr($15,Regs);

dp:=Regs.AX;

video:=memw[$40:$4C];

end;

function Date_Bios:string;

var i:integer;

stroka:string;

W:byte;

begin

stroka:='';

write('Дата создания биоса ');w:=$0004;

for i:=1 to 8 do

begin

w:=w+1;

stroka:=stroka+chr(mem[$ffff:w]);

end;

Date_Bios:=stroka;

end;

function video_sys:string;

var regs:Registers;

begin

Regs.AH:=$1A;Regs.AL:=$00;

intr($10,regs);

case Regs.BL of

$00:video_sys:='Монохромный дисплей';

$01:video_sys:='Монохромний адаптер - Монохромный дисплей';

$02:video_sys:='Адаптер CGA-цветной дисплей';

$04:video_sys:='Адаптер EGA-цветной дисплей';

$05:video_sys:='Адаптер EGA-монохромный дисплей';

$07:video_sys:='Адаптер VGA-монохромный аналоговый дисплей';

$08:video_sys:='Адаптер VGA- цветной аналоговый дисплей';

$0A:video_sys:='Адаптер VGA- цветной цифровой дисплей';

end;

end;

function Kol_GMD(var s:string):string;

var i:integer;

k:byte;

begin

for i:=1 to 2 do

begin

port[$70]:=$10;

k:=port[$71];

if i=1 then k:=k shr 4 else k:=k shl 4;

case k of

0:s:='Дисковода нет или его тип не известен';

1:s:=' на 360 Kb, для дискет диаметром 5.25';

2:s:=' на 1.2 Mb, для дискет диаметром 5.25';

3:s:=' на 720 Kb, для дискет диаметром 3.5';

4:s:=' на 1.44 Mb, для дискет диаметром 3.5';

5:s:=' на 2.88 Mb, для дискет диаметром 3.5';

6:s:=' не установлен’;

end;

if i=1 then Kol_GMD:=s;

end;

end;

function kol_ZMD:string;

var k:byte;

s:string;

begin

k:=mem[$45:$75];

str(k,s);

kol_ZMD:='Колличество жеских магнитных дисков-'+s;

end;

function soproch:string;

var k:word;

begin

k:=memw[$40:$10] and 2;

k:=k shr 1;

if k=1 then soproch:='есть математический сопроцессор'

else soproch:=' математический сопроцессор отсутсвует';

end;

function igr_adap:string;

var k:word;

begin

k:=memw[$40:$10] and 4096;

k:=k shr 13;

if k=1 then igr_adap:='есть игровой адаптер '

else igr_adap:='игровой адаптер отсутсвует';

end;

function Kol_posled_port:integer;

var k:word;

begin

k:=memw[$40:$10];

k:=k shl 4;k:=k shr 13;

Kol_posled_port:=k;

end;

function Kol_paral_port:integer;

var k:word;

begin

k:=memw[$40:$10];

k:=k shr 14;

Kol_paral_port:=k;

end;

function print:string;

var k:word;

begin

k:=memw[$40:$10] and 4096;

k:=k shr 14;

if k=1 then print:='установлен последовательный принтер'

else print:=' последовательный принтер не установлен’;

end;

procedure zopolnenie;

begin

with my do

begin

tip_kompa:=type_pc;

size_mem(os_pam,dop_pam,video_pam);

data_biosa:=Date_Bios;

GMDA:=Kol_GMD(GMDB);

displai:=video_sys;

NZMD:=kol_ZMD;

so_proch:=soproch;

igr:=igr_adap;

_print:=print;

posled_port:=Kol_posled_port;

paral_port:=Kol_paral_port;

MSDOS:=MS_DOS;

end;

end;

procedure vivod_disp;

begin

clrscr;

with my do

begin

textcolor(2);writeln(' ОБЩИЕ СВЕДЕНИЯ'); textcolor(7);

writeln(tip_kompa);writeln(MSDOS);

writeln('Дата создания BIOSa-',data_biosa);

textcolor(2);Writeln(' ПАМЯТЬ ');textcolor(7);

writeln('Колличество основной памяти (Kб)-',os_pam);

writeln('Колличество дополнительной памяти(Kб)-',dop_pam);

writeln('Память видео страницы(байт)-',video_pam);

textcolor(2);writeln(' ДИСКИ');textcolor(7);

writeln('Дисковод A:',GMDA);

writeln('Дисковод B:',GMDB);

writeln(NZMD);

textcolor(2);writeln(' ВИДЕО');textcolor(7);

writeln(displai);

textcolor(2);writeln(' ДОПОЛНИТЕЛЬНЫЕ СВЕДЕНИЯ');textcolor(7);

writeln(so_proch);

writeln(igr);

writeln(_print);

writeln('Колличество последовательных портов -',posled_port);

writeln(' Колличество паралельных портов -',paral_port);

end;

end;

procedure vivod_fail;

var f:text;

s:string;

begin

clrscr;

write('Введите путь к файлу -');readln(s);

assign(f,s);rewrite(f);

with my do

begin

writeln(f,' ОБЩИЕ СВЕДЕНИЯ');

writeln(f,tip_kompa);writeln(f,MSDOS);

writeln(f,'Дата создания BIOSa-',data_biosa);

Writeln(f,' ПАМЯТЬ');

writeln(f,'Колличество основной памяти (Kб)-',os_pam);

writeln(f,'Колличество дополнительной памяти (Kб)-',dop_pam);

writeln(f,'Память видео страницы (байт)-',video_pam);

writeln(f,' ДИСКИ');

writeln(f,'Дисковод A:',GMDA);

writeln(f,'Дисковод B:',GMDB);

writeln(f,NZMD);

writeln(f,' ВИДЕО');

writeln(f,displai);

writeln(f,' ДОПОЛНИТЕЛЬНЫЕ СВЕДЕНИЯ ');

writeln(f,so_proch);

writeln(f,igr);

writeln(f,_print);

writeln(f,'Колличество последовательных портов -',posled_port);

writeln(f,' Колличество паралельных портов -',paral_port);

end;

close(f);

end;

procedure vivod_print;

var Lst:text;

s:string;

begin

clrscr;

write('Введите путь к файлу -');readln(s);

assign(Lst,s);reset(lst);

while not eof(Lst) do

begin

readln(Lst,s);

writeln(Lst,s);

end;

close(Lst);

end;

BEGIN

clrscr;

st[1]:='Вивод информации на дисплей';st[2]:='Вывод информации в файл';

st[3]:='Вывод информации на принтер';st[4]:='Выход';

zopolnenie;

repeat

ch:=menu_s(st,4,0,0);

case ch of

1:begin vivod_disp;readln;end;

2:vivod_fail;

3:vivod_print;

end;

until ch=4 ;

END.

РЕЗУЛЬТАТЫ РАБОТЫ ПРОГРАММЫ:

OBCHIE SVEDENIYA

Tip kompa IBM PC/AT

Versiya MSDOS 5.0

data sozdaniya BIOSa-03/28/02

PAMYAT'

kollicestvo osnovnoi pamyati(Kb)-640

kollicestvo dopolnitel'noi pamyati(Kb)-34336

Pamyat' video stranichi(bait)-4096

DISKI

Diskovod A: na 1.44 Mb, dlya disket diametrom 3.5

Diskovod B:Diskovoda net ili ego tip neizvesten

Kolichestvo zhestkih magnitnih diskov-0

VIDEO

Adapter VGA-chvetnoi analogovii displai

DOPOLNITEL'NIE SVEDENIYA

est' matematicheskii soprochessor

igrovoi adapter otsytstvyet

posledovatel'nii printer ne ystanovlen

kolichestvo poslrdovatel'nih portov-4

kolichestvo paralel'nih portov-3

Предлагаю ознакомиться с аналогичными статьями: