Мысли
о
Паскале
Г
Владислав Д Е М Ь Я Н И Ш И Н
nitrom [email protected] m ail.ru
w w w j.c o m . u a /~ a m o n it
Продолжение, начало см. в МК. № 46, 51-52, 4, 6-7 , 10, 12-13, 16-18, 22, 24, 29, 34, 41, 46, 4, 6, 17, 21, 23, 28,
30, 32, 39, 42, 45, 47, 52, 2, 7, 18-19, 23, 37, 39, 45, 48, 50, 52, 5,8(165, 170-171, 175, 177-178, 181, 183-184, 187-189,
193, 195, 200, 205, 212, 217, 227, 229, 240, 244, 246, 251, 253, 255, 262, 265, 268, 270, 275, 277, 282, 293-294, 298,
312, 314, 320, 323, 325, 327, 332, 335)
Спрашивали? Отвечаю.
..
Работаем с графическим режимом
С
н а ч а л а к р а т к и й к о д п о д п р о г р а м м P u t P i x e l 2 4 B i t s V e s a ,
G e t P ix e l 2 4 B i t s V e s a :
p r o c e d u r e P u t P i x e l 2 4 B i t s V e s a ( X , Y : w o r d ; C o l o r
: T C o lo r ) ; a s s e m b l e r ;
a s m
m o v s i , X ; s h l s i , 2 {24 b i t s / c o l o r } ; m o v b x , Y
i n t lO h
@ a: m o v a x , w o r d p t r C o l o r ; m o v e s : [ d i ] , a x
a d d d i , 2 ; m o v a x , w o r d p t r C o lo r + 2 ; m o v e s : [ d i ] , a x
e n d ;
f u n c t i o n G e t P i x e l 2 4 B i t s V e s a ( X , Y : w o r d ) : T C o lo r ;
a s s e m b l e r ;
a s m
m o v s i , X ; s h l s i , 2 ; m o v b x . Y
i n t lO h
@ a: m o v a x , e s : [ d i ] ; a d d d i , 2 ; m o v d x , e s : [ d i ]
e n d ;
Так как все дальние подпрограммы уже описаны, можно
закрыть блок директивой
Далее переходим к универ-
сальным подпрограммам
P u t P i x e l и G e t P i x e l . О ни обес-
печивают не только вывод и чтение точки, но и проверку вы-
хода ее координат за пределы текущего ограничивающего
окна, что позволит избежать вычисления некорректного ад-
реса точки и обращения по нему.
p r o c e d u r e P u t P i x e l ( X , Y : i n t e g e r ; C o l o r : T C o lo r ) ;
b e g i n
i f (X<0) o r ( X > = W in R e c t . W id t h ) t h e n e x i t ;
i f (Y<0) o r ( Y > = W in R e c t . H e ig h t ) t h e n e x i t ;
X ; = X + W in R e c t . L e f t ;
Y : = Y + W in R e c t . T o p ;
P u t P i x e l P r o c ( X , Y , C o l o r ) ;
e n d ;
f u n c t i o n G e t P i x e l ( X , Y : i n t e g e r ) ; T C o lo r ;
b e g in
G e t P i x e l : = 0 ;
i f (X<0) o r ( X > = W in R e c t . W id t h ) t h e n e x i t ;
i f (Y<0) o r ( Y > = W in R e c t . H e ig h t ) t h e n e x i t ;
X : = X + W in R e c t . L e f t ;
Y : = Y + W in R e c t . T o p ;
G e t P i x e l : = G e t P i x e l P r o c ( X , Y ) ;
e n d ;
А вот и те две пресловутые функции, позволяющие полу-
чить информацию о видеоадаптере и параметрах поддер-
живаемых видеорежимов в глобальные переменные
V E S A In -
f o и M o d e ln f o .
f u n c t i o n G e t V E S A I n f o : b o o le a n ; a s s e m b l e r ;
a s m
m o v a x ,4 f0 0 h ; l e a d i , V E S A I n f o ; i n t lO h
s h r a x , 8 ; s u b a x , 1
e n d ;
Данный код вызывает функцию 4f00h видео BlOS'a, ко-
торая возвращает информацию об адаптере в переменную
типа
T V E S A in f o , адрес которой должен быть в регистровой
паре es : DX. В регистр
А Н при успехе возвращает нуль, ина-
че — единицу. Поэтому это значение приходится командами
s h r а х , 8 ; s u b а х , 1 преобразовать в тип b o o le a n , где зна-
чение
t r u e будет означать успех. Интерфейс вызова сле-
дующей функции BlOS'a аналогичен, но она в переменную
типа
T V E S A M o d e ln fo возвращает информацию о видеоре-
жиме с номером
M o d e .
f u n c t i o n G e tV E S A M o d e ln fо ( M o d e : w o r d ) : b o o le a n ; a s -
s e m b le r ;
a s m
m o v a x , 4 f 0 1 h ; m o v c x , m o d e ; l e a d i . M o d e ln f o
i n t lO h ; s h r a x , 8 ; s u b a x , 1
e n d ;
Процедура инициализации констант базовых цветов:
p r o c e d u r e P r e p a r e C o lo r s ;
b e g i n
c l B l a c k : = R G B T o C o lo r ( 0 , 0 , 0 ) ;
c l B l u e : = R G B T o C o lo r ( 0 , 0 , 2 5 5 ) ;
c lG r e e n : = R G B T o C o lo r ( 0 , 1 2 8 , 0 ) ;
c lR e d : = R G B T o C o lo r ( 2 5 5 , 0 , 0 ) ;
c l Y e l l o w : = R G B T o C o lo r ( 2 5 5 , 2 5 5 , 0 ) ;
c l W h i t e : = R G B T o C o lo r ( 2 5 5 , 2 5 5 , 2 5 5 ) ;
e n d ;
А вот и функция для определения значения параметра
G r a n u l s h i f t , то есть длины битового сдвига, соответствую-
щего гранулярности текущего видеорежима:
f u n c t i o n G e t G r a n u l S h i f t ( W in G r a n u l : w o r d ) : w o r d ;
v a r C o u n t : w o r d ;
b e g i n
C o u n t : = 0 ;
w h i l e W in G r a n u l < > 6 4 d o b e g in
W in G r a n u l ; = W in G r a n u l s h l 1 ;
i n c ( C o u n t ) ;
e n d ;
«.
G e t G r a n u l S h i f t : = C o u n t ;
e n d ;
Тут все просто и сводится к подсчету количества бит, на ко-
торое следует сдвинуть количество 64-Кб страниц, чтобы по-
лучить количество реальных страниц для текущего адаптера.
Очередная функция выполняет подготовку к установке за-
требованного видеорежима VESA по индексу массива режи-
мов. Для этого вызывается функция
G e tV E S A M o d e ln fo для по-
лучения информации о режиме. Если информация получена,
то режим поддерживается. Тогда инициализируется параметр
G r a n u l S h i f t
затем выполняется установка видеорежима
при помощи ассемблерной вставки с вызовом функции
$ 4 F 0 2
BlOS'a, а в переменную
R e s возвращается значение типа
b o o le a n , где t r u e — это успех. Завершает функцию код ини-
циализации структур
S c r e e n и W in R e c t . Функция возвраща-
ет
t r u e в случае успеха.
f u n c t i o n P r e p a r e V e s a M o d e ( I n d e x : w o r d ) : b o o le a n ;
v a r R e s : b o o le a n ;
b e g i n
P r e p a r e V e s a M o d e : = f a l s e ;
i f n o t G e t V E S A M o d e ln f o ( M e t r ic s [ I n d e x ] . m o d e ) t h e n
e x i t ;
G r a n u l S h i f t : = G e t G r a n u l S h i f t ( M o d e l n f o . W i n G r a n u l ) ;
a s m
m o v L a s t P a g e ,$ F F F F , - m o v b x , S c r e e n . M o d e
m o v a x , 4 F 0 2 h ; i n t 1 O h ; s h r a x , 8 ; s u b a x , 1
m o v R e s , a l
14/341
04
апрепя
-11
апреля
2005
предыдущая страница 40 Мой Компьютер 2005 14 читать онлайн следующая страница 42 Мой Компьютер 2005 14 читать онлайн Домой Выключить/включить текст