SysFn61/ru: Difference between revisions
Punk Joker (talk | contribs) |
No edit summary |
||
(3 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
'''Функция 61 - получить параметры для прямого доступа к графике. | '''Функция 61''' - получить параметры для прямого доступа к графике. | ||
Программе доступны данные графического экрана (область памяти, которая | Программе доступны данные графического экрана (область памяти, которая | ||
Line 20: | Line 20: | ||
''Замечания:'' | ''Замечания:'' | ||
* Параметры графики очень редко меняются при работе системы | * Параметры графики очень редко меняются при работе системы. | ||
* При изменении видеорежима система перерисовывает все окна (событие с кодом 1) и перерисовывает фон (событие 5). Эти же события происходят и в других случаях, которые встречаются значительно чаще, чем изменение видеорежима. | * При изменении видеорежима система перерисовывает все окна (событие с кодом 1) и перерисовывает фон (событие 5). Эти же события происходят и в других случаях, которые встречаются значительно чаще, чем изменение видеорежима. | ||
* При работе в видеорежимах с LFB селектор gs указывает на собственно LFB, так что чтение/запись по gs приводят непосредственно к изменению содержимого экрана. При работе в видеорежимах без LFB gs указывает на некоторую область данных ядра, причём все функции вывода на экран добросовестно выполняют двойную работу по записи непосредственно на экран и по записи в этот буфер. В результате при чтении содержимого этого буфера результаты соответствуют содержимому экрана (с, вообще говоря, большим цветовым разрешением), а запись игнорируется. Исключением является режим 320*200, для которого в главном цикле системного потока выполняется обновление экрана в соответствии с движениями курсора мыши. | * При работе в видеорежимах с LFB селектор gs указывает на собственно LFB, так что чтение/запись по gs приводят непосредственно к изменению содержимого экрана. При работе в видеорежимах без LFB gs указывает на некоторую область данных ядра, причём все функции вывода на экран добросовестно выполняют двойную работу по записи непосредственно на экран и по записи в этот буфер. В результате при чтении содержимого этого буфера результаты соответствуют содержимому экрана (с, вообще говоря, большим цветовым разрешением), а запись игнорируется. Исключением является режим 320*200, для которого в главном цикле системного потока выполняется обновление экрана в соответствии с движениями курсора мыши. | ||
Line 29: | Line 27: | ||
''Параметры:'' | ''Параметры:'' | ||
:* eax = 61 - номер функции | |||
* eax = 61 - номер функции | :* ebx = 1 - номер подфункции | ||
* ebx = 1 - номер подфункции | |||
''Возвращаемое значение:'' | ''Возвращаемое значение:'' | ||
:* eax = [разрешение по оси x]*65536 + [разрешение по оси y] | |||
* eax = [разрешение по оси x]*65536 + [разрешение по оси y] | |||
''Замечания:'' | ''Замечания:'' | ||
:* Можно использовать функцию 14 с учётом того, что она возвращает размеры на 1 меньше. Это полностью эквивалентный способ. | |||
'''Константы для регистров:''' | |||
::eax - SF_GET_GRAPHICAL_PARAMS (61) | |||
::ebx - SSF_SCREEN_SIZE (1) | |||
=== | === Подфункция 2 - число бит на пиксель === | ||
''Параметры:'' | ''Параметры:'' | ||
:* eax = 61 - номер функции | |||
:* ebx = 2 - номер подфункции | |||
* eax = | ''Возвращаемое значение:'' | ||
:* eax = число бит на пиксель (24 или 32) | |||
'' | '''Константы для регистров:''' | ||
::eax - SF_GET_GRAPHICAL_PARAMS (61) | |||
::ebx - SSF_BITS_PER_PIXEL (2) | |||
=== Подфункция 3 - число байт на строку === | |||
''Параметры:'' | ''Параметры:'' | ||
:* eax = 61 - номер функции | |||
* eax = 61 - номер функции | :* ebx = 3 - номер подфункции | ||
* ebx = 3 - номер подфункции | |||
''Возвращаемое значение:'' | ''Возвращаемое значение:'' | ||
:* eax = число байт, которое занимает одна строка развёртки (горизонтальная линия на экране) | |||
'''Константы для регистров:''' | |||
::eax - SF_GET_GRAPHICAL_PARAMS (61) | |||
::ebx - SSF_BYTES_PER_LINE (3) | |||
{{System_functions}} | {{System_functions}} | ||
[[Category: SysCalls]] | [[Category: SysCalls]] |
Latest revision as of 06:42, 28 April 2021
Функция 61 - получить параметры для прямого доступа к графике.
Программе доступны данные графического экрана (область памяти, которая собственно и отображает содержимое экрана) напрямую без вызовов системных функций через селектор gs:
mov eax, [gs:0]
поместит в eax первый dword буфера, содержащий информацию о цвете левой верхней точки (и, возможно, цвета нескольких следующих).
mov [gs:0], eax
при работе в режимах VESA c LFB установит цвет левой верхней точки (и возможно, цвета нескольких следующих). Для интерпретации данных графического экрана требуется знание некоторых параметров, которые возвращаются этой функцией.
Замечания:
- Параметры графики очень редко меняются при работе системы.
- При изменении видеорежима система перерисовывает все окна (событие с кодом 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)
|