Скачиваний:
28
Добавлен:
15.09.2014
Размер:
11.21 Кб
Скачать
<!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>
Соседние файлы в папке Учебник