Difference between revisions of "Ru/api/kernel"
Jump to navigation
Jump to search
Punk Joker (talk | contribs) |
|||
Line 1: | Line 1: | ||
− | + | СИСТЕМНЫЕ ФУНКЦИИ ОПЕРАЦИОННОЙ СИСТЕМЫ KolibriOS | |
Номер функции помещается в регистр eax. | Номер функции помещается в регистр eax. | ||
Вызов системной функции осуществляется командой "int 0x40". | Вызов системной функции осуществляется командой "int 0x40". | ||
− | Все регистры, кроме явно указанных в возвращаемом значении, включая регистр флагов eflags, сохраняются. | + | Все регистры, кроме явно указанных в возвращаемом значении, |
+ | включая регистр флагов eflags, сохраняются. | ||
− | |||
− | [[ | + | === Функция 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. | ||
+ | :* Окно должно умещаться на экране. Если переданные координаты | ||
+ | ::и размеры не удовлетворяют этому условию, то соответствующая | ||
+ | ::координата (или, возможно, обе) считается нулем, а если и это | ||
+ | ::не помогает, то соответствующий размер (или, возможно, оба) | ||
+ | ::устанавливается в размер экрана. | ||
− | + | ::Далее обозначим 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 | ||
− | + | === Функция 1 - поставить точку в окне. === | |
+ | Параметры: | ||
+ | :* eax = 1 - номер функции | ||
+ | :* ebx = x-координата (относительно окна) | ||
+ | :* ecx = y-координата (относительно окна) | ||
+ | :* edx = 0x00RRGGBB - цвет точки | ||
+ | ::edx = 0x01xxxxxx - инвертировать цвет точки | ||
+ | :::::(младшие 24 бита игнорируются) | ||
+ | Возвращаемое значение: | ||
+ | :* функция не возвращает значения | ||
− | + | === Функция 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. | ||
− | |||
− | + | === Функция 3 - получить системное время. === | |
− | + | Параметры: | |
+ | :* eax = 3 - номер функции | ||
+ | Возвращаемое значение: | ||
+ | :* eax = 0x00SSMMHH, где HH:MM:SS = часы:минуты:секунды | ||
+ | :* каждый элемент возвращается как BCD-число, например, | ||
+ | ::для времени 23:59:59 результат будет 0x00595923 | ||
+ | Замечания: | ||
+ | :* Смотри также подфункцию 9 функции 26 - получение времени | ||
+ | ::с момента запуска системы; она во многих случаях удобнее, | ||
+ | ::поскольку возвращает просто DWORD-значение счетчика времени. | ||
+ | :* Системное время можно установить функцией 22. | ||
− | |||
− | + | === Функция 4 - вывести строку текста в окно. === | |
− | [[ | + | Параметры: |
+ | :* 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 для разных целей. | ||
− | + | === Функция 5 - пауза. === | |
− | + | Задерживает выполнение программы на заданное время. | |
+ | Параметры: | ||
+ | :* eax = 5 - номер функции | ||
+ | :* ebx = время в сотых долях секунды | ||
+ | Возвращаемое значение: | ||
+ | :* функция не возвращает значения | ||
+ | Замечания: | ||
+ | :* Передача ebx=0 не передает управление следующему процессу и | ||
+ | ::вообще не производит никаких действий. Если действительно | ||
+ | ::требуется передать управление следующему процессу | ||
+ | ::(закончить текущий квант времени), используйте подфункцию 1 | ||
+ | ::функции 68. | ||
− | |||
− | + | === Функция 6 - прочитать файл с рамдиска. === | |
− | + | Параметры: | |
+ | :* eax = 6 - номер функции | ||
+ | :* ebx = указатель на имя файла | ||
+ | :* ecx = номер старт |