Difference between revisions of "SysFn61/ru"

From KolibriOS wiki
Jump to navigation Jump to search
m
(7 intermediate revisions by 3 users not shown)
Line 1: Line 1:
'''Функция 61 - получить параметры для прямого доступа к графике.'''
+
'''Функция 61''' - получить параметры для прямого доступа к графике.
  
 
Программе доступны данные графического экрана (область памяти, которая
 
Программе доступны данные графического экрана (область памяти, которая
Line 20: Line 20:
 
''Замечания:''
 
''Замечания:''
  
* Параметры графики очень редко меняются при работе системы, а именно, только в случаях, когда пользователь работает с программой VRR.
+
* Параметры графики очень редко меняются при работе системы:
 +
** когда пользователь работает с программой VRR,
 +
** или когда разрешение экрана изменяется драйвером ATIKMS.
 
* При изменении видеорежима система перерисовывает все окна (событие с кодом 1) и перерисовывает фон (событие 5). Эти же события происходят и в других случаях, которые встречаются значительно чаще, чем изменение видеорежима.
 
* При изменении видеорежима система перерисовывает все окна (событие с кодом 1) и перерисовывает фон (событие 5). Эти же события происходят и в других случаях, которые встречаются значительно чаще, чем изменение видеорежима.
 
* При работе в видеорежимах с LFB селектор gs указывает на собственно LFB, так что чтение/запись по gs приводят непосредственно к изменению содержимого экрана. При работе в видеорежимах без LFB gs указывает на некоторую область данных ядра, причём все функции вывода на экран добросовестно выполняют двойную работу по записи непосредственно на экран и по записи в этот буфер. В результате при чтении содержимого этого буфера результаты соответствуют содержимому экрана (с, вообще говоря, большим цветовым разрешением), а запись игнорируется. Исключением является режим 320*200, для которого в главном цикле системного потока выполняется обновление экрана в соответствии с движениями курсора мыши.
 
* При работе в видеорежимах с LFB селектор gs указывает на собственно LFB, так что чтение/запись по gs приводят непосредственно к изменению содержимого экрана. При работе в видеорежимах без LFB gs указывает на некоторую область данных ядра, причём все функции вывода на экран добросовестно выполняют двойную работу по записи непосредственно на экран и по записи в этот буфер. В результате при чтении содержимого этого буфера результаты соответствуют содержимому экрана (с, вообще говоря, большим цветовым разрешением), а запись игнорируется. Исключением является режим 320*200, для которого в главном цикле системного потока выполняется обновление экрана в соответствии с движениями курсора мыши.
  
=== Разрешение экрана ===
+
=== Подфункция 1 - разрешение экрана ===
  
 
''Параметры:''
 
''Параметры:''
 +
:* eax = 61 - номер функции
 +
:* ebx = 1 - номер подфункции
  
* eax = 61 - номер функции
+
''Возвращаемое значение:''
* ebx = 1 - номер подфункции
+
:* eax = [разрешение по оси x]*65536 + [разрешение по оси y]
 +
 
 +
''Замечания:''
 +
:* Можно использовать функцию 14 с учётом того, что она возвращает размеры на 1 меньше. Это полностью эквивалентный способ.
 +
 
 +
'''Константы для регистров:'''
 +
::eax - SF_GET_GRAPHICAL_PARAMS (61)
 +
::ebx - SSF_SCREEN_SIZE (1)
 +
 
 +
=== Подфункция 2 - число бит на пиксель ===
 +
 
 +
''Параметры:''
 +
:* eax = 61 - номер функции
 +
:* ebx = 2 - номер подфункции
  
 
''Возвращаемое значение:''
 
''Возвращаемое значение:''
 +
:* eax = число бит на пиксель (24 или 32)
  
* eax = [разрешение по оси x]*65536 + [разрешение по оси y]
+
'''Константы для регистров:'''
 +
::eax - SF_GET_GRAPHICAL_PARAMS (61)
 +
::ebx - SSF_BITS_PER_PIXEL (2)
  
''Замечания:''
+
=== Подфункция 3 - число байт на строку ===
 +
 
 +
''Параметры:''
 +
:* eax = 61 - номер функции
 +
:* ebx = 3 - номер подфункции
  
* Можно использовать функцию 14 с учётом того, что она возвращает размеры на 1 меньше. Это полностью эквивалентный способ.
+
''Возвращаемое значение:''
 +
:* eax = число байт, которое занимает одна строка развёртки (горизонтальная линия на экране)
  
=== Число бит на пиксель ===
+
'''Константы для регистров:'''
Параметры:
+
::eax - SF_GET_GRAPHICAL_PARAMS (61)
  * eax = 61 - номер функции
+
::ebx - SSF_BYTES_PER_LINE (3)
  * ebx = 2 - номер подфункции
 
Возвращаемое значение:
 
  * eax = число бит на пиксель (24 или 32)
 
  
=== Число байт на строку ===
+
{{System_functions}}
Параметры:
+
[[Category: SysCalls]]
  * eax = 61 - номер функции
 
  * ebx = 3 - номер подфункции
 
Возвращаемое значение:
 
  * eax = число байт, которое занимает одна строка развёртки
 
    (горизонтальная линия на экране)
 

Revision as of 12:45, 18 January 2016

Функция 61 - получить параметры для прямого доступа к графике.

Программе доступны данные графического экрана (область памяти, которая собственно и отображает содержимое экрана) напрямую без вызовов системных функций через селектор gs:

mov eax, [gs:0]

поместит в eax первый dword буфера, содержащий информацию о цвете левой верхней точки (и, возможно, цвета нескольких следующих).

mov [gs:0], eax

при работе в режимах VESA c LFB установит цвет левой верхней точки (и возможно, цвета нескольких следующих). Для интерпретации данных графического экрана требуется знание некоторых параметров, которые возвращаются этой функцией.

Замечания:

  • Параметры графики очень редко меняются при работе системы:
    • когда пользователь работает с программой VRR,
    • или когда разрешение экрана изменяется драйвером ATIKMS.
  • При изменении видеорежима система перерисовывает все окна (событие с кодом 1) и перерисовывает фон (событие 5). Эти же события происходят и в других случаях, которые встречаются значительно чаще, чем изменение видеорежима.
  • При работе в видеорежимах с LFB селектор gs указывает на собственно LFB, так что чтение/запись по gs приводят непосредственно к изменению содержимого экрана. При работе в видеорежимах без LFB gs указывает на некоторую область данных ядра, причём все функции вывода на экран добросовестно выполняют двойную работу по записи непосредственно на экран и по записи в этот буфер. В результате при чтении содержимого этого буфера результаты соответствуют содержимому экрана (с, вообще говоря, большим цветовым разрешением), а запись игнорируется. Исключением является режим 320*200, для которого в главном цикле системного потока выполняется обновление экрана в соответствии с движениями курсора мыши.

Подфункция 1 - разрешение экрана

Параметры:

  • eax = 61 - номер функции
  • ebx = 1 - номер подфункции

Возвращаемое значение:

  • eax = [разрешение по оси x]*65536 + [разрешение по оси y]

Замечания:

  • Можно использовать функцию 14 с учётом того, что она возвращает размеры на 1 меньше. Это полностью эквивалентный способ.

Константы для регистров:

eax - SF_GET_GRAPHICAL_PARAMS (61)
ebx - SSF_SCREEN_SIZE (1)

Подфункция 2 - число бит на пиксель

Параметры:

  • eax = 61 - номер функции
  • ebx = 2 - номер подфункции

Возвращаемое значение:

  • eax = число бит на пиксель (24 или 32)

Константы для регистров:

eax - SF_GET_GRAPHICAL_PARAMS (61)
ebx - SSF_BITS_PER_PIXEL (2)

Подфункция 3 - число байт на строку

Параметры:

  • eax = 61 - номер функции
  • ebx = 3 - номер подфункции

Возвращаемое значение:

  • eax = число байт, которое занимает одна строка развёртки (горизонтальная линия на экране)

Константы для регистров:

eax - SF_GET_GRAPHICAL_PARAMS (61)
ebx - SSF_BYTES_PER_LINE (3)