Добавил:
Mymnan
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:АВМиС - бывшее АПЭВМ / Учебник / sysex
.htm<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title> ОБЩАЯ АРХИТЕКТУРА </title>
<META content="text/html; charset=windows-1251" http-equiv=Content-Type>
<META content="Demon" name=Author>
<BASE TARGET="main">
</head>
<body bgcolor="#50BECD" link="#0000fc" vlink="#ffff00" text="#000000">
<p>
<h1 align="center">
<a name="пример"><strong>Примеры программ
</strong></big></big></a></p>
</h1>
<h3 align="justify">
Данная программа выдает информацию о типе ЭВМ, размере оперативной памяти
(используемой DOS) и дисках, входящих в конфигурацию ПЭВМ, а также
делит экран на 4 части и, в зависимости от полученных данных,
закрашивает каждую четверть экрана определенным цветом.
</h3>
<p ALIGN="JUSTIFY">
<strong>
Левая верхняя четверть экрана заливается цветом,
номер которого определяется как код типа ПЭВМ (FF, FC, FD,FE).<BR>
Цвет правой верхней четверти зависит от размера оперативной
памяти и вычисляется по формуле: код цвета =((размер ОП)/80)-2.<br>
Цвет заливки левой нижней части экрана определяется:
код цвета = 8 - (количество НГМД).<br>
Цвет правой нижней части экрана определяется последней цифрой суммы
объемов жестких дисков ПЭВМ (если эта цифра не больше 8)
или последней цифрой суммы объемов жестких дисков ПЭВМ минус 2
(если эта цифра больше 8).<br>
Текст системной информации выводится в левой верхней части экрана.<p>
<p ALIGN="JUSTIFY">
Особый случай представляет собой CD-ROM - устройство для чтения компакт-дисков,
который определяется BIOS как жесткий диск и в перечне дисков всегда располагается последним.
Для диска CD-ROM объем свободного места на диске будет равен нулю.
Однако в случае отсутствия диска в дисководе на экран выводится стандартное
сообщение ОС "Устройство не готово... Отмена, Повтор?",
и далее, если в устройстве диск не установлен, в данных об этом диске будет
отображена старая информация о диске или случайное значение.
</strong>
</p>
<div align="center">
<form>
<textarea name=Proga rows=22 cols=72>
// Автор программы Петрович О.В.
#include<stdio.h>
#include<bios.h>
#include<dos.h>
#include<conio.h>
#include<dir.h>
void main(void)
{
int curr,next,win1,win2,win3,win_y;
unsigned long int d_size;
char dir_n[64]={"\\"};
struct dfree val;
void sector(int,int,int,int);
clrscr();
curr=0xFFFF-(peekb(0xFFFF,0x000E)); // получение типа ЭВМ
sector(1,1,12,curr);
textcolor(7-curr);
gotoxy(1,2);
switch(curr)
{
case 0: { cputs(" Тип ЭВМ - IBM PC" ); break; }
case 1: { cputs(" Тип ЭВМ - IBM PC/XT"); break; }
case 2: { cputs(" Тип ЭВМ - IBM PCjr" ); break; }
case 3: { cputs(" Тип ЭВМ - IBM PC/AT"); break; }
}
gotoxy(1,4);
curr=biosmemory(); // получение размера оперативной памяти
cprintf(" Размер оперативной памяти: %d K",curr);
win1=(curr/80)-2; // вычисление цвета части экрана
curr=peek(0x0,0x0410); // получение количества НГМД
gotoxy(1,6);
if(curr & 1)
{
curr=((curr & 0xc0)>>6)+1;
cprintf(" Гибкие диски : %d",curr);
win2=8-curr; // вычисление цвета части экрана
}
else
{
cprintf(" Гибкие диски : Нет");
win2=8; // вычисление цвета части экрана
}
curr=getdisk(); // сохранение кода текущего диска
next=3;
win3=0;
while(!(getcurdir(next,dir_n))) // перебор дисков
{
setdisk(next);
getdfree(next,&val); // получение данных о размере диска
d_size=val.df_bsec*val.df_sclus/1024;
win3+=val.df_total; // вычисление цвета части экрана
gotoxy(1,((next-3)*2)+8);
cprintf(" Жесткий диск %c : %lu K"
,next+'A'-1,val.df_total*d_size);
gotoxy(11,((next-3)*2)+9);
cprintf("свободно : %lu K",val.df_avail*d_size);
next++;
if(next<4) win_y=14; // позиция раздела частей экрана
else
{
win_y=10+(next-4)*2; // позиция раздела частей экрана
gotoxy(1,win_y+2);
cputs(" ");
gotoxy(1,win_y+1);
cputs(" ");
}
}
if( ((win3=win3%10)+1)>7) win3-=2; // вычисление цвета части экрана
sector(41,1,win_y,win1); // заливка части экрана 1
sector(1,win_y,25,win2); // заливка части экрана 2
sector(41,win_y,25,win3); // заливка части экрана 3
setdisk(curr);
textattr(0);
getch();
clrscr();
} /////END/////
void sector(int x,int y1,int y2,int c) // функция для заливки
{ // части экрана
int i; // х - начальная позиция
textbackground(c); // у1 - начальная позиция
for(i=y1;i<y2;i++) // у2 - конечная позиция
{ // с - цвет фона
gotoxy(x,i);
cputs(" ");
}
}
</TEXTAREA>
</FORM>
<form action="apevm1.exe">
<input type=submit name=SubButton value="запустить">
</form>
<p>
<hr size=3 noshade>
<p>
<H3 ALIGN="CENTER">
<P><P>
Полный листинг программы
использования счетчика тактов для определения
внутренней тактовой частоты процессора.
</H3>
<P>
<form>
<textarea name=Proga1 rows=22 cols=72>
; Автор текста программы Кулаков Владимир Геннадьевич.
IDEAL
P386
LOCALS
MODEL MEDIUM
; Подключить файл мнемонических обозначений
; кодов управляющих клавиш
include "lst_1_03.inc"
; Подключить файл мнемонических обозначений цветов
include "lst_1_05.inc"
SEGMENT sseg para stack 'STACK'
DB 400h DUP(?)
ENDS
DATASEG
; Массив для сохранения значений отсчетов счетчика
; тактов в моменты срабатывания системного таймера
TimeCounter DD 17 DUP(?)
; Разность между соседними замерами
DeltaT DD 16 DUP(?)
; Среднее значение длительности интервала
AverageTime DD ?
; Предыдущее значение системного таймера
Time DD ?
; Текстовые сообщения
Text1 DB LIGHTGREEN,0,20
DB "Определение тактовой частоты процессора",0
DB LIGHTGREEN,1,28,"при помощи команды RDTSC",0
DB YELLOW,3,0,"Длительность интервала (тактов):",0
DB YELLOW,20,0,"Средняя длительность интервала:",0
DB YELLOW,22,0
DB "Тактовая частота процессора (МГц):",0
DB LIGHTRED,24,37,"Ждите",0
Text2 DB LIGHTGREEN,24,29,"Нажмите любую клавишу",0
ENDS
CODESEG
;*****************************
;* Основной модуль программы *
;*****************************
PROC ProcFrequency
mov AX,DGROUP
mov DS,AX
; Установить текстовый режим и очистить экран
mov AX,3
int 10h
; Скрыть курсор - убрать за нижнюю границу экрана
mov [ScreenString],25
mov [ScreenColumn],0
call SetCursorPosition
; Вывести текстовые сообщения на экран
mov CX,6
mov SI,offset Text1
@@NextString:
call ShowColorString
loop @@NextString
; Использовать для вывода чисел белый цвет, черный фон
mov [TextColorAndBackground],WHITE
; Настроить сегментный регистр ES на область данных BIOS
mov AX,0
mov ES,AX
; Инициализировать переменные
mov EAX,[ES:046Ch]
mov [Time],EAX
call WaitTimerStateChange
; Замерить начальные моменты для 17 интервалов
mov BX,17
mov DI,offset TimeCounter
@@t0: call WaitTimerStateChange
;Команда RDTSC
DB 0Fh,31h
mov [DI],EAX
add DI,4
dec BX
jnz @@t0
; Вычислить длительность 16 интервалов в тактах
mov BX,16
mov DI,offset TimeCounter
mov SI,offset DeltaT
mov EDX,0
; Из значения счетчика в момент t+1
; вычитаем значение в момент t
@@t1: mov EAX,[DI+4]
sub EAX,[DI]
mov [SI],EAX
add EDX,EAX ;накопление суммы значений
add DI,4
add SI,4
dec BX
jnz @@t1
; Вычислить среднюю длительность интервала
shr EDX,4 ;деление на 16
mov [AverageTime],EDX
; Отобразить длительность 16 интервалов в тактах
mov BX,16
mov SI,offset DeltaT
mov [ScreenString],4
@@t2: mov [ScreenColumn],0
mov EAX,[SI]
mov [Data_Int32],EAX
call Int32_to_String
call ShowDataString
inc [ScreenString]
add SI,4
dec BX
jnz @@t2
; Отобразить среднюю длительность интервала
mov [ScreenString],20
mov [ScreenColumn],35
mov EAX,[AverageTime]
mov [Data_Int32],EAX
call Int32_to_String
call ShowDataString
; Отобразить тактовую частоту процессора
; Умножить среднее значение на частоту
; генератора системного таймера
mov EAX,[AverageTime]
mov EDX,1193180
mul EDX
; Разделить результат на коэффициент
; пересчета системного таймера (65536)
shrd EAX,EDX,16
; Вычислить частоту в МГц (разделить на 1000000)
xor EDX,EDX
mov EBX,1000000
div EBX
; Вывести результат в десятичном коде
mov [Data_Int32],EAX
mov [ScreenString],22
mov [ScreenColumn],35
call Int32_to_String
call ShowDataString
; Ожидать нажатия любой клавиши
mov SI,offset Text2
call ShowColorString
call GetChar
; Переустановить текстовый режим и очистить экран
mov AX,3
int 10h
; Выход в DOS
mov AH,4Ch
int 21h
ENDP ProcFrequency
;**************************************************
;* ОЖИДАНИЕ ОЧЕРЕДНОГО ИЗМЕНЕНИЯ ЗНАЧЕНИЯ ТАЙМЕРА *
;**************************************************
PROC WaitTimerStateChange near
mov EAX,[Time]
@@T: cmp EAX,[ES:046Ch]
je @@T
mov EAX,[ES:046Ch]
mov [Time],EAX
ret
ENDP WaitTimerStateChange
ENDS
; Подключить процедуры вывода данных на экран
include "lst_1_02.inc"
; Подключить процедуры перевода чисел
include "lst_2_05.inc"
END
</TEXTAREA>
</FORM>
</div>
<h4>Данная программа подключает несколько внешних файлов:</h4>
<p align="left">
<dl align="left">
<dt>Файл <a href="lst1.htm#12">lst_1_02.inc.</a>
<dd>Файл, содержащий процедуры ввода/вывода общего назначения
для работы в цветном текстовом режиме.
<dt>Файл <a href="lst1.htm#13">lst_1_03.inc.</a>
<dd>Файл мнемонических обозначений кодов управляющих клавиш.
<dt>Файл <a href="lst1.htm#15">lst_1_05.inc.</a>
<dd>Файл мнемонических обозначений цветов.
<dt>Файл <a href="lst2.htm#25">lst_2_05.inc.</a>
<dd>Файл, содержащий набор подпрограмм, предназначенных для
перевода целых и вещественных чисел из двоичной
системы счисления в десятичную и наоборот.
</dl>
</p>
<div align="center">
<form action="lst_2_07.exe">
<input type=submit name=SubButton value="запустить">
</form>
</div>
</body>
</html>
Соседние файлы в папке Учебник