Цель работы: изучение и использование функций 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
0 коммент.:
Отправить комментарий