

// программа определения частоты кадров

#include  <time.h>
#include  <stdio.h>
#include  <bios.h>

#define   NUM  200

void WaitVert(void);


void main() {

     time_t    t_start, t_end;
     int       i;
     float     fr;

// определяем начальное время

     t_start = clock();

// ожидаем исполнения NUM вертикальных разверток

     for(i = 0; i < NUM; i++) WaitVert();

// определяем конечное время

     t_end = clock();

// вычисляем частоту кадров

     fr = NUM/(((float)t_end - t_start) / CLK_TCK);
     printf( "\nЧастота кадров = %4.1f \n", (float)fr );
}


/**
*.Name    WaitVert
*
*.Title   Определение начала обратного вертикального хода луча.
*
*.Descr   Функция ожидает начало обратного вертикального хода луча.
*         Использование функции позволяет синхроннизовать работу
*         программы с периодами работы видеоадаптера.
*
*.Proto   void WaitVert(void)
*
*.Params  Отсутствуют.
*
*.Return  Не используются.
*
*.Sample  get_vert.c
**/
void WaitVert(void) {

     unsigned count;

     _asm {
          mov  ax,0h
          mov  es,ax

; определяем адрес порта индексного регистра контроллера ЭЛТ (3B4h/3D4h)

          mov  dx,es:[463h]

; вычисляем адрес порта регистра состояния 1 (ISR1)

          add  dl,6

; читаем содержимое порта регистра состояния 1

          in   al,dx

; тестируем бит D3 регистра состояния 1
; бит D3 = 1 при обратном вертикальном ходе луча

          test al,8
          jz   wait_on

     wait_off:

          in   al,dx

; тестируем бит D3

          test al,8

; ожидаем конец обратного вертикального хода луча

          jnz  wait_off

     wait_on:

          in   al,dx
          test al,8

; ожидаем начало обратного вертикального хода луча

          jz   wait_on

; +--------------------------------------------------------+
; | здесь могут распологаться операции, которые необходимо |
; | выполнить  во время обратного  вертикального хода луча |
; +--------------------------------------------------------+

     }
}
