Difference between revisions of "Ru/api/kernel"

From KolibriOS wiki
Jump to navigation Jump to search
Line 1: Line 1:
''' СИСТЕМНЫЕ ФУНКЦИИ KolibriOS 0.7.7.0 '''
+
СИСТЕМНЫЕ ФУНКЦИИ ОПЕРАЦИОННОЙ СИСТЕМЫ KolibriOS
  
 
Номер функции помещается в регистр eax.
 
Номер функции помещается в регистр eax.
 
Вызов системной функции осуществляется командой "int 0x40".
 
Вызов системной функции осуществляется командой "int 0x40".
Все регистры, кроме явно указанных в возвращаемом значении, включая регистр флагов eflags, сохраняются.
+
Все регистры, кроме явно указанных в возвращаемом значении,  
 +
включая регистр флагов eflags, сохраняются.
  
== Перечень функций ==
 
  
[[SysFn00/ru | Функция 0]] - определить и нарисовать окно.
+
=== Функция 0 - определить и нарисовать окно. ===
 +
Определяет окно приложения. Рисует рамку окна, заголовок и рабочую
 +
область. Для окон со скином определяет стандартные кнопки закрытия и
 +
минимизации.
 +
Параметры:
 +
:* eax = 0 - номер функции
 +
:* ebx = [координата по оси x]*65536 + [размер по оси x]
 +
:* ecx = [координата по оси y]*65536 + [размер по оси y]
 +
:* edx = 0xXYRRGGBB, где:
 +
::* Y = стиль окна:
 +
:::* Y=0 - тип I - окно фиксированных размеров
 +
:::* Y=1 - только определить область окна, ничего не рисовать
 +
:::* Y=2 - тип II - окно изменяемых размеров
 +
:::* Y=3 - окно со скином
 +
:::* Y=4 - окно со скином фиксированных размеров
 +
:::* остальные возможные значения (от 5 до 15) зарезервированы,
 +
::::вызов функции с такими Y игнорируется
 +
::* RR, GG, BB = соответственно красная, зеленая, синяя
 +
:::составляющие цвета рабочей области окна
 +
:::(игнорируется для стиля Y=1)
 +
::* X = DCBA (биты)
 +
:::* A = 1 - у окна есть заголовок; для стилей Y=3,4 адрес строки
 +
:::::::::заголовка задаётся в edi, для прочих стилей
 +
:::::::::используется подфункция 1 функции 71
 +
:::* B = 1 - координаты всех графических примитивов задаются
 +
:::::::::относительно клиентской области окна
 +
:::* C = 1 - не закрашивать рабочую область при отрисовке окна
 +
:::* D = 0 - нормальная заливка рабочей области, 1 - градиентная
 +
::Следующие параметры предназначены для окон типа I и II и
 +
::игнорируются для стилей Y=1,3:
 +
:* esi = 0xXYRRGGBB - цвет заголовка
 +
::* RR, GG, BB определяют сам цвет
 +
::* Y=0 - обычное окно, Y=1 - неперемещаемое окно (работает для всех стилей окон)
 +
::* X определяет градиент заголовка: X=0 - нет градиента,
 +
:::X=8 - обычный градиент,
 +
:::для окон типа II X=4 - негативный градиент
 +
::* прочие значения X и Y зарезервированы
 +
:* edi = 0x00RRGGBB - цвет рамки
 +
Возвращаемое значение:
 +
:* функция не возвращает значения
 +
Замечания:
 +
:* Положение и размеры окна устанавливаются при первом вызове
 +
::этой функции и игнорируются при последующих; для изменения
 +
::положения и/или размеров уже созданного окна используйте
 +
::67-ю функцию.
 +
:* Для окон стилей Y=3,4 с заголовком (A=1) строка заголовка
 +
::устанавливается при первом вызове этой функции и игнорируется при
 +
::последующих (точнее говоря, игнорируется после вызова
 +
::подфункции 2 функции 12 - конца перерисовки);
 +
::для изменения строки заголовка уже созданного окна используйте
 +
::подфункцию 1 функции 71.
 +
:* Если использовать окна соответствующих стилей, то положение
 +
::и/или размеры окна могут меняться пользователем.
 +
::Текущие положение и размеры могут быть получены вызовом функции 9.
 +
:* Окно должно умещаться на экране. Если переданные координаты
 +
::и размеры не удовлетворяют этому условию, то соответствующая
 +
::координата (или, возможно, обе) считается нулем, а если и это
 +
::не помогает, то соответствующий размер (или, возможно, оба)
 +
::устанавливается в размер экрана.
  
[[SysFn01/ru | Функция 1]] - поставить точку в окне.
+
::Далее обозначим xpos,ypos,xsize,ysize - значения, передаваемые
 +
::в ebx,ecx. Координаты приводятся относительно левого верхнего
 +
::угла окна, который, таким образом, задается как (0,0), координаты
 +
::правого нижнего угла суть (xsize,ysize).
 +
:* Размеры окна понимаются в смысле координат правого нижнего угла.
 +
::Это же относится и ко всем остальным функциям.
 +
::Это означает, что реальные размеры на 1 пиксель больше.
 +
:* Вид окна типа I:
 +
::* рисуется внешняя рамка цвета, указанного в edi,
 +
:::шириной 1 пиксель
 +
::* рисуется заголовок - прямоугольник с левым верхним углом (1,1)
 +
:::и правым нижним (xsize-1,min(25,ysize)) цвета, указанного в esi
 +
:::(с учетом градиента)
 +
::* если ysize>=26, то закрашивается рабочая область окна -
 +
:::прямоугольник с левым верхним углом (1,21) и правым нижним
 +
:::(xsize-1,ysize-1) (размерами (xsize-1)*(ysize-21)) - цветом,
 +
:::указанным в edx (с учетом градиента)
 +
::* если A=1 и строка заголовка установлена подфункцией 1
 +
:::функции 71, то она выводится в соответствующем месте заголовка
 +
:* Вид окна стиля Y=1:
 +
::* полностью определяется приложением
 +
:* Вид окна типа II:
 +
::* рисуется внешняя рамка шириной 1 пиксель "затенённого" цвета
 +
:::edi (все составляющие цвета уменьшаются в два раза)
 +
::* рисуется промежуточная рамка шириной 3 пикселя цвета edi
 +
::* рисуется внутренняя рамка шириной 1 пиксель
 +
:::"затенённого" цвета edi
 +
::* рисуется заголовок - прямоугольник с левым верхним углом (4,4)
 +
:::и правым нижним (xsize-4,min(20,ysize)) цвета, указанного в esi
 +
:::(с учетом градиента)
 +
::* если ysize>=26, то закрашивается рабочая область окна -
 +
:::прямоугольник с левым верхним углом (5,20) и правым нижним
 +
:::(xsize-5,ysize-5) - цветом, указанным в edx (с учетом градиента)
 +
::* если A=1 и строка заголовка установлена подфункцией 1
 +
:::функции 71, то она выводится в соответствующем месте заголовка
 +
:* Вид окна со скином:
 +
::* рисуется внешняя рамка шириной 1 пиксель
 +
:::цвета 'outer' из скина
 +
::* рисуется промежуточная рамка шириной 3 пикселя
 +
:::цвета 'frame' из скина
 +
::* рисуется внутренняя рамка шириной 1 пиксель
 +
:::цвета 'inner' из скина
 +
::* рисуется заголовок (по картинкам из скина) в прямоугольнике
 +
:::(0,0) - (xsize,_skinh-1)
 +
::* если ysize>=26, то закрашивается рабочая область окна -
 +
:::прямоугольник с левым верхним углом (5,_skinh) и правым нижним
 +
:::(xsize-5,ysize-5) - цветом, указанным в edx (с учетом градиента)
 +
::* определяются две стандартные кнопки: закрытия и минимизации
 +
:::(смотри функцию 8)
 +
::* если A=1 и в edi (ненулевой) указатель на строку заголовка,
 +
:::то она выводится в заголовке в месте, определяемом скином
 +
::* Значение переменной _skinh доступно как результат вызова
 +
:::подфункции 4 функции 48
  
[[SysFn02/ru | Функция 2]] - получить код нажатой клавиши.
+
=== Функция 1 - поставить точку в окне. ===
 +
Параметры:
 +
:* eax = 1 - номер функции
 +
:* ebx = x-координата (относительно окна)
 +
:* ecx = y-координата (относительно окна)
 +
:* edx = 0x00RRGGBB - цвет точки
 +
::edx = 0x01xxxxxx - инвертировать цвет точки
 +
:::::(младшие 24 бита игнорируются)
 +
Возвращаемое значение:
 +
:* функция не возвращает значения
  
[[SysFn03/ru | Функция 3]] - получить системное время.
+
=== Функция 2 - получить код нажатой клавиши. ===
 +
Забирает код нажатой клавиши из буфера.
 +
Параметры:
 +
:* eax = 2 - номер функции
 +
Возвращаемое значение:
 +
:* если буфер пуст, возвращается eax=1
 +
:* если буфер непуст, то возвращается al=0, ah=код нажатой клавиши,
 +
::старшее слово регистра eax обнулено
 +
:* если есть "горячая клавиша", то возвращается
 +
::al=2, ah=сканкод нажатой клавиши (0 для управляющих клавиш),
 +
::старшее слово регистра eax содержит состояние управляющих клавиш
 +
::в момент нажатия горячей клавиши
 +
Замечания:
 +
:* Существует общесистемный буфер нажатых клавиш размером 120 байт,
 +
::организованный как очередь.
 +
:* Существует ещё один общесистемный буфер на 120 "горячих клавиш".
 +
:* При вызове этой функции приложением с неактивным окном
 +
::считается, что буфер нажатых клавиш пуст.
 +
:* По умолчанию эта функция возвращает ASCII-коды; переключиться на
 +
::режим сканкодов (и назад) можно с использованием функции 66.
 +
::Однако, горячие клавиши всегда возвращаются как сканкоды.
 +
:* Узнать, какие комбинации клавиш соответствуют каким кодам, можно,
 +
::запустив приложения keyascii и scancode.
 +
:* Сканкоды возвращаются непосредственно клавиатурой и фиксированы;
 +
::ASCII-коды получаются с использованием таблиц преобразования,
 +
::которые можно установить подфункцией 2 функции 21 и прочитать
 +
::подфункцией 2 функции 26.
 +
:* Как следствие, ASCII-коды учитывают текущую раскладку клавиатуры
 +
::(rus/en) в отличие от сканкодов.
 +
:* Поступает информация только о тех горячих клавишах, которые были
 +
::определены этим потоком подфункцией 4 функции 66.
  
[[SysFn04/ru | Функция 4]] - вывести строку текста в окно.
 
  
[[SysFn05/ru | Функция 5]] - пауза.
+
=== Функция 3 - получить системное время. ===
  
[[SysFn06/ru | Функция 6]] - прочитать файл с рамдиска.
+
Параметры:
 +
:* eax = 3 - номер функции
 +
Возвращаемое значение:
 +
:* eax = 0x00SSMMHH, где HH:MM:SS = часы:минуты:секунды
 +
:* каждый элемент возвращается как BCD-число, например,
 +
::для времени 23:59:59 результат будет 0x00595923
 +
Замечания:
 +
:* Смотри также подфункцию 9 функции 26 - получение времени
 +
::с момента запуска системы; она во многих случаях удобнее,
 +
::поскольку возвращает просто DWORD-значение счетчика времени.
 +
:* Системное время можно установить функцией 22.
  
[[SysFn07/ru | Функция 7]] - вывести изображение в окно.
 
  
[[SysFn08/ru | Функция 8]] - определить/удалить кнопку.
+
=== Функция 4 - вывести строку текста в окно. ===
  
[[SysFn09/ru | Функция 9]] - информация о потоке выполнения.
+
Параметры:
 +
:* eax = 4 - номер функции
 +
:* ebx = [координата по оси x]*65536 + [координата по оси y]
 +
:* ecx = 0xXYRRGGBB, где
 +
::* RR, GG, BB задают цвет текста
 +
::* X=ABnn (биты):
 +
::::* nn задает используемый шрифт: 0=системный моноширинный,
 +
::::1=системный шрифт переменной ширины
 +
:::* A=0 - выводить esi символов, A=1 - выводить ASCIIZ-строку
 +
:::* B=1 - закрашивать фон цветом edi
 +
::* Y=Cnnn (биты):
 +
:::* C=1 перенаправить вывод в область пользователя, задано в edi
 +
:::* nnn - не используется в текущем виде, должно быть 0 (zero)
 +
:* edx = указатель на начало строки
 +
:* esi = для A=0 длина строки, должна быть не больше 255;
 +
:::::для A=1 игнорируется
 +
:* edi = цвет для закраски фона, если B=1
 +
:* edi = указатель на область пользователя, если C=1
 +
Возвращаемое значение:
 +
:* функция не возвращает значения
 +
Замечания:
 +
:* Первый системный шрифт считывается при загрузке из файла char.mt,
 +
::второй - из char2.mt.
 +
:* Оба шрифта имеют высоту 9 пикселей, ширина моноширинного шрифта
 +
::равна 6 пикселей.
 +
:* C=1, глубина точки = 32 бита, область пользователя выглядит так:
 +
::dword Xsize
 +
::dword Ysize
 +
::остаток области = Xsize * Y size * 4
 +
:* Нельзя одновременно использовать B=1 и C=1, поскольку в обоих
 +
::случаях использован регистр edi для разных целей.
  
[[SysFn10/ru | Функция 10]] - ожидать события.
+
=== Функция 5 - пауза. ===
  
[[SysFn11/ru|Функция 11]] - проверить, есть ли событие, без ожидания.
+
Задерживает выполнение программы на заданное время.
 +
Параметры:
 +
:* eax = 5 - номер функции
 +
:* ebx = время в сотых долях секунды
 +
Возвращаемое значение:
 +
:* функция не возвращает значения
 +
Замечания:
 +
:* Передача ebx=0 не передает управление следующему процессу и
 +
::вообще не производит никаких действий. Если действительно
 +
::требуется передать управление следующему процессу
 +
::(закончить текущий квант времени), используйте подфункцию 1
 +
::функции 68.
  
[[SysFn12/ru|Функция 12]] - начать/закончить перерисовку окна.
 
  
[[SysFn13/ru|Функция 13]] - нарисовать прямоугольник в окне.
+
=== Функция 6 - прочитать файл с рамдиска. ===
  
[[SysFn14/ru|Функция 14]] - получить размеры экрана.
+
Параметры:
 +
:* eax = 6 - номер функции
 +
:* ebx = указатель на имя файла
 +
:* ecx = номер старт