Rev 346 | Rev 486 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
346 | diamond | 1 | СИСТЕМНЫЕ ФУНКЦИИ ОПЕРАЦИОННОЙ СИСТЕМЫ Kolibri 0.6.5.0 |
77 | diamond | 2 | |
3 | Номер функции помещается в регистр eax. |
||
4 | Вызов системной функции осуществляется командой "int 0x40". |
||
5 | Все регистры, кроме явно указанных в возвращаемом значении, |
||
6 | включая регистр флагов eflags, сохраняются. |
||
7 | |||
8 | |||
9 | ====================================================================== |
||
10 | ============== Функция 0 - определить и нарисовать окно. ============= |
||
11 | ====================================================================== |
||
12 | Определяет окно приложения. Рисует рамку окна, заголовок и рабочую |
||
13 | область. Для окон со скином определяет стандартные кнопки закрытия и |
||
14 | минимизации. |
||
15 | Параметры: |
||
16 | * eax = 0 - номер функции |
||
17 | * ebx = [координата по оси x]*65536 + [размер по оси x] |
||
18 | * ecx = [координата по оси y]*65536 + [размер по оси y] |
||
19 | * edx = 0xXYRRGGBB, где: |
||
20 | * Y = стиль окна: |
||
21 | * Y=0 - тип I - окно фиксированных размеров |
||
22 | * Y=1 - только определить область окна, ничего не рисовать |
||
23 | * Y=2 - тип II - окно изменяемых размеров |
||
24 | * Y=3 - окно со скином |
||
25 | * остальные возможные значения (от 4 до 15) зарезервированы, |
||
26 | вызов функции с такими Y игнорируется |
||
27 | * RR, GG, BB = соответственно красная, зеленая, синяя |
||
28 | составляющие цвета рабочей области окна |
||
29 | (игнорируется для стиля Y=2) |
||
114 | mikedld | 30 | * X = DCBA (биты) |
118 | diamond | 31 | * A = 1 - у окна есть заголовок; для стиля Y=3 адрес строки |
131 | diamond | 32 | заголовка задаётся в edi, для прочих стилей |
118 | diamond | 33 | используется подфункция 1 функции 71 |
34 | * B = 1 - координаты всех графических примитивов задаются |
||
35 | относительно клиентской области окна |
||
303 | mikedld | 36 | * C = 1 - не закрашивать рабочую область при отрисовке окна |
118 | diamond | 37 | * D = 0 - нормальная заливка рабочей области, 1 - градиентная |
77 | diamond | 38 | Следующие параметры предназначены для окон типа I и II и |
39 | игнорируются для стилей Y=1,3: |
||
40 | * esi = 0xXYRRGGBB - цвет заголовка |
||
41 | * RR, GG, BB определяют сам цвет |
||
42 | * Y=0 - обычное окно, Y=1 - неперемещаемое окно |
||
43 | * X определяет градиент заголовка: X=0 - нет градиента, |
||
44 | X=8 - обычный градиент, |
||
45 | для окон типа II X=4 - негативный градиент |
||
46 | * прочие значения X и Y зарезервированы |
||
47 | * edi = 0x00RRGGBB - цвет рамки |
||
48 | Возвращаемое значение: |
||
49 | * функция не возвращает значения |
||
50 | Замечания: |
||
51 | * Положение и размеры окна устанавливаются при первом вызове |
||
52 | этой функции и игнорируются при последующих; для изменения |
||
53 | положения и/или размеров уже созданного окна используйте |
||
54 | 67-ю функцию. |
||
118 | diamond | 55 | * Для окон стиля Y=3 с заголовком (A=1) строка заголовка |
56 | устанавливается при первом вызове этой функции и игнорируется при |
||
57 | последующих (точнее говоря, игнорируется после вызова |
||
58 | подфункции 2 функции 12 - конца перерисовки); |
||
59 | для изменения строки заголовка уже созданного окна используйте |
||
60 | подфункцию 1 функции 71. |
||
77 | diamond | 61 | * Если использовать окна соответствующих стилей, то положение |
62 | и/или размеры окна могут меняться пользователем. |
||
63 | Текущие положение и размеры могут быть получены вызовом функции 9. |
||
64 | * Окно должно умещаться на экране. Если переданные координаты |
||
65 | и размеры не удовлетворяют этому условию, то соответствующая |
||
66 | координата (или, возможно, обе) считается нулем, а если и это |
||
67 | не помогает, то соответствующий размер (или, возможно, оба) |
||
68 | устанавливается в размер экрана. |
||
69 | |||
70 | Далее обозначим xpos,ypos,xsize,ysize - значения, передаваемые |
||
71 | в ebx,ecx. Координаты приводятся относительно левого верхнего |
||
72 | угла окна, который, таким образом, задается как (0,0), координаты |
||
73 | правого нижнего угла суть (xsize,ysize). |
||
74 | * Размеры окна понимаются в смысле координат правого нижнего угла. |
||
75 | Это же относится и ко всем остальным функциям. |
||
76 | Это означает, что реальные размеры на 1 пиксель больше. |
||
77 | * Вид окна типа I: |
||
78 | * рисуется внешняя рамка цвета, указанного в edi, |
||
79 | шириной 1 пиксель |
||
80 | * рисуется заголовок - прямоугольник с левым верхним углом (1,1) |
||
81 | и правым нижним (xsize-1,min(25,ysize)) цвета, указанного в esi |
||
82 | (с учетом градиента) |
||
83 | * если ysize>=26, то закрашивается рабочая область окна - |
||
84 | прямоугольник с левым верхним углом (1,21) и правым нижним |
||
85 | (xsize-1,ysize-1) (размерами (xsize-1)*(ysize-21)) - цветом, |
||
86 | указанным в edx (с учетом градиента) |
||
118 | diamond | 87 | * если A=1 и строка заголовка установлена подфункцией 1 |
88 | функции 71, то она выводится в соответствующем месте заголовка |
||
77 | diamond | 89 | * Вид окна стиля Y=1: |
90 | * полностью определяется приложением |
||
91 | * Вид окна типа II: |
||
131 | diamond | 92 | * рисуется внешняя рамка шириной 1 пиксель "затенённого" цвета |
77 | diamond | 93 | edi (все составляющие цвета уменьшаются в два раза) |
94 | * рисуется промежуточная рамка шириной 3 пикселя цвета edi |
||
95 | * рисуется внутренняя рамка шириной 1 пиксель |
||
131 | diamond | 96 | "затенённого" цвета edi |
77 | diamond | 97 | * рисуется заголовок - прямоугольник с левым верхним углом (4,4) |
98 | и правым нижним (xsize-4,min(20,ysize)) цвета, указанного в esi |
||
99 | (с учетом градиента) |
||
100 | * если ysize>=26, то закрашивается рабочая область окна - |
||
101 | прямоугольник с левым верхним углом (5,20) и правым нижним |
||
102 | (xsize-5,ysize-5) - цветом, указанным в edx (с учетом градиента) |
||
118 | diamond | 103 | * если A=1 и строка заголовка установлена подфункцией 1 |
104 | функции 71, то она выводится в соответствующем месте заголовка |
||
77 | diamond | 105 | * Вид окна со скином: |
106 | * рисуется внешняя рамка шириной 1 пиксель |
||
107 | цвета 'outer' из скина |
||
108 | * рисуется промежуточная рамка шириной 3 пикселя |
||
109 | цвета 'frame' из скина |
||
110 | * рисуется внутренняя рамка шириной 1 пиксель |
||
111 | цвета 'inner' из скина |
||
112 | * рисуется заголовок (по картинкам из скина) в прямоугольнике |
||
113 | (0,0) - (xsize,_skinh-1) |
||
114 | * если ysize>=26, то закрашивается рабочая область окна - |
||
115 | прямоугольник с левым верхним углом (5,_skinh) и правым нижним |
||
116 | (xsize-5,ysize-5) - цветом, указанным в edx (с учетом градиента) |
||
117 | * определяются две стандартные кнопки: закрытия и минимизации |
||
118 | (смотри функцию 8) |
||
118 | diamond | 119 | * если A=1 и в edi (ненулевой) указатель на строку заголовка, |
120 | то она выводится в заголовке в месте, определяемом скином |
||
77 | diamond | 121 | * Значение переменной _skinh доступно как результат вызова |
122 | подфункции 4 функции 48 |
||
123 | |||
124 | ====================================================================== |
||
125 | ================= Функция 1 - поставить точку в окне. ================ |
||
126 | ====================================================================== |
||
127 | Параметры: |
||
128 | * eax = 1 - номер функции |
||
129 | * ebx = x-координата (относительно окна) |
||
130 | * ecx = y-координата (относительно окна) |
||
131 | * edx = 0x00RRGGBB - цвет точки |
||
132 | edx = 0x01xxxxxx - инвертировать цвет точки |
||
133 | (младшие 24 бита игнорируются) |
||
134 | Возвращаемое значение: |
||
135 | * функция не возвращает значения |
||
136 | |||
137 | ====================================================================== |
||
138 | ============== Функция 2 - получить код нажатой клавиши. ============= |
||
139 | ====================================================================== |
||
140 | Забирает код нажатой клавиши из буфера. |
||
141 | Параметры: |
||
142 | * eax = 2 - номер функции |
||
143 | Возвращаемое значение: |
||
144 | * если буфер пуст, возвращается eax=1 |
||
145 | * если буфер непуст, то возвращается al=0, ah=код нажатой клавиши, |
||
146 | старшее слово регистра eax обнулено |
||
92 | diamond | 147 | * если есть "горячая клавиша", то возвращается |
148 | al=2, ah=сканкод нажатой клавиши (0 для управляющих клавиш), |
||
149 | старшее слово регистра eax содержит состояние управляющих клавиш |
||
150 | в момент нажатия горячей клавиши |
||
77 | diamond | 151 | Замечания: |
152 | * Существует общесистемный буфер нажатых клавиш размером 120 байт, |
||
153 | организованный как очередь. |
||
131 | diamond | 154 | * Существует ещё один общесистемный буфер на 120 "горячих клавиш". |
77 | diamond | 155 | * При вызове этой функции приложением с неактивным окном |
92 | diamond | 156 | считается, что буфер нажатых клавиш пуст. |
77 | diamond | 157 | * По умолчанию эта функция возвращает ASCII-коды; переключиться на |
158 | режим сканкодов (и назад) можно с использованием функции 66. |
||
92 | diamond | 159 | Однако, горячие клавиши всегда возвращаются как сканкоды. |
77 | diamond | 160 | * Узнать, какие комбинации клавиш соответствуют каким кодам, можно, |
161 | запустив приложения keyascii и scancode. |
||
162 | * Сканкоды возвращаются непосредственно клавиатурой и фиксированы; |
||
163 | ASCII-коды получаются с использованием таблиц преобразования, |
||
164 | которые можно установить подфункцией 2 функции 21 и прочитать |
||
165 | подфункцией 2 функции 26. |
||
166 | * Как следствие, ASCII-коды учитывают текущую раскладку клавиатуры |
||
167 | (rus/en) в отличие от сканкодов. |
||
92 | diamond | 168 | * Поступает информация только о тех горячих клавишах, которые были |
169 | определены этим потоком подфункцией 4 функции 66. |
||
77 | diamond | 170 | |
171 | ====================================================================== |
||
172 | ================ Функция 3 - получить системное время. =============== |
||
173 | ====================================================================== |
||
174 | Параметры: |
||
175 | * eax = 3 - номер функции |
||
176 | Возвращаемое значение: |
||
177 | * eax = 0x00SSMMHH, где HH:MM:SS = часы:минуты:секунды |
||
178 | * каждый элемент возвращается как BCD-число, например, |
||
179 | для времени 23:59:59 результат будет 0x00595923 |
||
180 | Замечания: |
||
181 | * Смотри также подфункцию 9 функции 26 - получение времени |
||
182 | с момента запуска системы; она во многих случаях удобнее, |
||
183 | поскольку возвращает просто DWORD-значение счетчика времени. |
||
184 | * Системное время можно установить функцией 22. |
||
185 | |||
186 | ====================================================================== |
||
118 | diamond | 187 | ============== Функция 4 - вывести строку текста в окно. ============= |
77 | diamond | 188 | ====================================================================== |
189 | Параметры: |
||
190 | * eax = 4 - номер функции |
||
191 | * ebx = [координата по оси x]*65536 + [координата по оси y] |
||
192 | * ecx = 0xX0RRGGBB, где |
||
193 | * RR, GG, BB задают цвет текста |
||
142 | diamond | 194 | * X=ABnn (биты): |
185 | heavyiron | 195 | * nn задает используемый шрифт: 0=системный моноширинный, |
196 | 1=системный шрифт переменной ширины |
||
142 | diamond | 197 | * A=0 - выводить esi символов, A=1 - выводить ASCIIZ-строку |
198 | * B=1 - закрашивать фон цветом edi |
||
77 | diamond | 199 | * edx = указатель на начало строки |
142 | diamond | 200 | * esi = для A=0 длина строки, должна быть не больше 255; |
201 | для A=1 игнорируется |
||
77 | diamond | 202 | Возвращаемое значение: |
203 | * функция не возвращает значения |
||
204 | Замечания: |
||
205 | * Первый системный шрифт считывается при загрузке из файла char.mt, |
||
206 | второй - из char2.mt. |
||
207 | * Оба шрифта имеют высоту 9 пикселей, ширина моноширинного шрифта |
||
208 | равна 6 пикселей. |
||
209 | |||
210 | ====================================================================== |
||
211 | ========================= Функция 5 - пауза. ========================= |
||
212 | ====================================================================== |
||
213 | Задерживает выполнение программы на заданное время. |
||
214 | Параметры: |
||
215 | * eax = 5 - номер функции |
||
216 | * ebx = время в сотых долях секунды |
||
217 | Возвращаемое значение: |
||
218 | * функция не возвращает значения |
||
219 | Замечания: |
||
220 | * Передача ebx=0 не передает управление следующему процессу и |
||