С для профессиональных программистов



         

Изменение save_video() и restore_video()


Kaк только переменной vid_mem присвоен соответствующий адрес, появляется простой способ использовать ее для чтения и записи символов в видео память. Запомните, видео память требует двух байтов для каждого символа, один для символа, а другой для атрибута. Из-за того, что символьный байт первый, а атрибутный - второй, то каждой строке экрана требуется 160 байт. Для того, чтобы определить адрес отдельного символа вы должны использовать формулу:

адрес = адрес_адаптера + X*160 + Y*2

Функции save_video() и restore_video() при использовании прямого доступа к видео памяти выглядят следующим образом.

void save_video(startx,endx,starty,endy,buf_ptr)

unsigned int *buf_ptr;

void restore_video(startx,endx,starty,endy,buf_ptr)

unsigned int *buf_ptr;

Как вы видете,  символы и атрибуты записываются или читаются

функции,   которые  читают  и  записывают  символы  преобразуются

подобным образом.

Если весь доступ к дисплею делать прямым, требуется одна новая функция (показанная здесь). Функция write_char() записывает один символ в определенную позицию экрана с определенным атрибутом.

/* запись символа с определенным аттрибутом */

int x,y;

int attrib;

Полная версия исчезающих меню с прямым доступом приведена здесь с тем же простым тестовым примером. Введите его в в свой компьютер и сравните по производительности с версией, использующей BIOS. Как вы увидете, разница потрясающая. Кажется, что меню появляются и исчезают мгновенно.

/* Программа исчезающих меню для текстового режима

с использованием прямого доступа к видео памяти */

#include "dos.h"

#include "stdlib.h"

#define ESC 27

void save_video(),restore_video();

void display_menu(),draw_border();

char far *vid_mem;

char *color[]=

"Красный",

"Желтый",

"Оранжевый",

"Зеленый"

char *apple_type[] =

"Красный деликатес",

"Джонатан",

"Белый налив",

"Антоновка"

main()

cls();

for(i=0;i<25;i++)




Содержание  Назад  Вперед