Subversion Repositories Kolibri OS

Rev

Rev 5813 | Rev 5848 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5813 Rev 5836
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2004-2012. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2012. All rights reserved. ;;
4
;; Distributed under terms of the GNU General Public License    ;;
4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
7
 
8
СИСТЕМНЫЕ ФУНКЦИИ ОПЕРАЦИОННОЙ СИСТЕМЫ Kolibri 0.7.7.0
8
СИСТЕМНЫЕ ФУНКЦИИ ОПЕРАЦИОННОЙ СИСТЕМЫ Kolibri 0.7.7.0
9
 
9
 
10
Номер функции помещается в регистр eax.
10
Номер функции помещается в регистр eax.
11
Вызов системной функции осуществляется командой "int 0x40".
11
Вызов системной функции осуществляется командой "int 0x40".
12
Все регистры, кроме явно указанных в возвращаемом значении,
12
Все регистры, кроме явно указанных в возвращаемом значении,
13
    включая регистр флагов eflags, сохраняются.
13
    включая регистр флагов eflags, сохраняются.
14
 
14
 
15
 
15
 
16
======================================================================
16
======================================================================
17
============== Функция 0 - определить и нарисовать окно. =============
17
============== Функция 0 - определить и нарисовать окно. =============
18
======================================================================
18
======================================================================
19
Определяет окно приложения. Рисует рамку окна, заголовок и рабочую
19
Определяет окно приложения. Рисует рамку окна, заголовок и рабочую
20
область. Для окон со скином определяет стандартные кнопки закрытия и
20
область. Для окон со скином определяет стандартные кнопки закрытия и
21
минимизации.
21
минимизации.
22
Параметры:
22
Параметры:
23
  * eax = 0 - номер функции
23
  * eax = 0 - номер функции
24
  * ebx = [координата по оси x]*65536 + [размер по оси x]
24
  * ebx = [координата по оси x]*65536 + [размер по оси x]
25
  * ecx = [координата по оси y]*65536 + [размер по оси y]
25
  * ecx = [координата по оси y]*65536 + [размер по оси y]
26
  * edx = 0xXYRRGGBB, где:
26
  * edx = 0xXYRRGGBB, где:
27
    * Y = стиль окна:
27
    * Y = стиль окна:
28
      * Y=0 - тип I - окно фиксированных размеров
28
      * Y=0 - тип I - окно фиксированных размеров
29
      * Y=1 - только определить область окна, ничего не рисовать
29
      * Y=1 - только определить область окна, ничего не рисовать
30
      * Y=2 - тип II - окно изменяемых размеров
30
      * Y=2 - тип II - окно изменяемых размеров
31
      * Y=3 - окно со скином
31
      * Y=3 - окно со скином
32
      * Y=4 - окно со скином фиксированных размеров
32
      * Y=4 - окно со скином фиксированных размеров
33
      * остальные возможные значения (от 5 до 15) зарезервированы,
33
      * остальные возможные значения (от 5 до 15) зарезервированы,
34
        вызов функции с такими Y игнорируется
34
        вызов функции с такими Y игнорируется
35
    * RR, GG, BB = соответственно красная, зеленая, синяя
35
    * RR, GG, BB = соответственно красная, зеленая, синяя
36
      составляющие цвета рабочей области окна
36
      составляющие цвета рабочей области окна
37
      (игнорируется для стиля Y=1)
37
      (игнорируется для стиля Y=1)
38
    * X = DCBA (биты)
38
    * X = DCBA (биты)
39
      * A = 1 - у окна есть заголовок; для стилей Y=3,4 адрес строки
39
      * A = 1 - у окна есть заголовок; для стилей Y=3,4 адрес строки
40
                  заголовка задаётся в edi, для прочих стилей
40
                  заголовка задаётся в edi, для прочих стилей
41
                  используется подфункция 1 функции 71
41
                  используется подфункция 1 функции 71
42
      * B = 1 - координаты всех графических примитивов задаются
42
      * B = 1 - координаты всех графических примитивов задаются
43
                  относительно клиентской области окна
43
                  относительно клиентской области окна
44
      * C = 1 - не закрашивать рабочую область при отрисовке окна
44
      * C = 1 - не закрашивать рабочую область при отрисовке окна
45
      * D = 0 - нормальная заливка рабочей области, 1 - градиентная
45
      * D = 0 - нормальная заливка рабочей области, 1 - градиентная
46
    Следующие параметры предназначены для окон типа I и II и
46
    Следующие параметры предназначены для окон типа I и II и
47
    игнорируются для стилей Y=1,3:
47
    игнорируются для стилей Y=1,3:
48
  * esi = 0xXYRRGGBB - цвет заголовка
48
  * esi = 0xXYRRGGBB - цвет заголовка
49
    * RR, GG, BB определяют сам цвет
49
    * RR, GG, BB определяют сам цвет
50
    * Y=0 - обычное окно, Y=1 - неперемещаемое окно (работает для всех стилей окон)
50
    * Y=0 - обычное окно, Y=1 - неперемещаемое окно (работает для всех стилей окон)
51
    * X определяет градиент заголовка: X=0 - нет градиента,
51
    * X определяет градиент заголовка: X=0 - нет градиента,
52
      X=8 - обычный градиент,
52
      X=8 - обычный градиент,
53
      для окон типа II X=4 - негативный градиент
53
      для окон типа II X=4 - негативный градиент
54
    * прочие значения X и Y зарезервированы
54
    * прочие значения X и Y зарезервированы
55
  * edi = 0x00RRGGBB - цвет рамки
55
  * edi = 0x00RRGGBB - цвет рамки
56
Возвращаемое значение:
56
Возвращаемое значение:
57
  * функция не возвращает значения
57
  * функция не возвращает значения
58
Замечания:
58
Замечания:
59
  * Положение и размеры окна устанавливаются при первом вызове
59
  * Положение и размеры окна устанавливаются при первом вызове
60
    этой функции и игнорируются при последующих; для изменения
60
    этой функции и игнорируются при последующих; для изменения
61
    положения и/или размеров уже созданного окна используйте
61
    положения и/или размеров уже созданного окна используйте
62
    67-ю функцию.
62
    67-ю функцию.
63
  * Для окон стилей Y=3,4 с заголовком (A=1) строка заголовка
63
  * Для окон стилей Y=3,4 с заголовком (A=1) строка заголовка
64
    устанавливается при первом вызове этой функции и игнорируется при
64
    устанавливается при первом вызове этой функции и игнорируется при
65
    последующих (точнее говоря, игнорируется после вызова
65
    последующих (точнее говоря, игнорируется после вызова
66
    подфункции 2 функции 12 - конца перерисовки);
66
    подфункции 2 функции 12 - конца перерисовки);
67
    для изменения строки заголовка уже созданного окна используйте
67
    для изменения строки заголовка уже созданного окна используйте
68
    подфункцию 1 функции 71.
68
    подфункцию 1 функции 71.
69
  * Если использовать окна соответствующих стилей, то положение
69
  * Если использовать окна соответствующих стилей, то положение
70
    и/или размеры окна могут меняться пользователем.
70
    и/или размеры окна могут меняться пользователем.
71
    Текущие положение и размеры могут быть получены вызовом функции 9.
71
    Текущие положение и размеры могут быть получены вызовом функции 9.
72
  * Окно должно умещаться на экране. Если переданные координаты
72
  * Окно должно умещаться на экране. Если переданные координаты
73
    и размеры не удовлетворяют этому условию, то соответствующая
73
    и размеры не удовлетворяют этому условию, то соответствующая
74
    координата (или, возможно, обе) считается нулем, а если и это
74
    координата (или, возможно, обе) считается нулем, а если и это
75
    не помогает, то соответствующий размер (или, возможно, оба)
75
    не помогает, то соответствующий размер (или, возможно, оба)
76
    устанавливается в размер экрана.
76
    устанавливается в размер экрана.
77
 
77
 
78
    Далее обозначим xpos,ypos,xsize,ysize - значения, передаваемые
78
    Далее обозначим xpos,ypos,xsize,ysize - значения, передаваемые
79
    в ebx,ecx. Координаты приводятся относительно левого верхнего
79
    в ebx,ecx. Координаты приводятся относительно левого верхнего
80
    угла окна, который, таким образом, задается как (0,0), координаты
80
    угла окна, который, таким образом, задается как (0,0), координаты
81
    правого нижнего угла суть (xsize,ysize).
81
    правого нижнего угла суть (xsize,ysize).
82
  * Размеры окна понимаются в смысле координат правого нижнего угла.
82
  * Размеры окна понимаются в смысле координат правого нижнего угла.
83
    Это же относится и ко всем остальным функциям.
83
    Это же относится и ко всем остальным функциям.
84
    Это означает, что реальные размеры на 1 пиксель больше.
84
    Это означает, что реальные размеры на 1 пиксель больше.
85
  * Вид окна типа I:
85
  * Вид окна типа I:
86
    * рисуется внешняя рамка цвета, указанного в edi,
86
    * рисуется внешняя рамка цвета, указанного в edi,
87
      шириной 1 пиксель
87
      шириной 1 пиксель
88
    * рисуется заголовок - прямоугольник с левым верхним углом (1,1)
88
    * рисуется заголовок - прямоугольник с левым верхним углом (1,1)
89
      и правым нижним (xsize-1,min(20,ysize-1)) цвета, указанного в esi
89
      и правым нижним (xsize-1,min(20,ysize-1)) цвета, указанного в esi
90
      (с учетом градиента)
90
      (с учетом градиента)
91
    * если ysize>21, то закрашивается рабочая область окна -
91
    * если ysize>21, то закрашивается рабочая область окна -
92
      прямоугольник с левым верхним углом (1,21) и правым нижним
92
      прямоугольник с левым верхним углом (1,21) и правым нижним
93
      (xsize-1,ysize-1) (размерами (xsize-1)*(ysize-21)) - цветом,
93
      (xsize-1,ysize-1) (размерами (xsize-1)*(ysize-21)) - цветом,
94
      указанным в edx (с учетом градиента)
94
      указанным в edx (с учетом градиента)
95
    * если A=1 и строка заголовка установлена подфункцией 1
95
    * если A=1 и строка заголовка установлена подфункцией 1
96
      функции 71, то она выводится в соответствующем месте заголовка
96
      функции 71, то она выводится в соответствующем месте заголовка
97
  * Вид окна стиля Y=1:
97
  * Вид окна стиля Y=1:
98
    * полностью определяется приложением
98
    * полностью определяется приложением
99
  * Вид окна типа II:
99
  * Вид окна типа II:
100
    * рисуется внешняя рамка шириной 1 пиксель "затенённого" цвета
100
    * рисуется внешняя рамка шириной 1 пиксель "затенённого" цвета
101
      edi (все составляющие цвета уменьшаются в два раза)
101
      edi (все составляющие цвета уменьшаются в два раза)
102
    * рисуется промежуточная рамка шириной 3 пикселя цвета edi
102
    * рисуется промежуточная рамка шириной 3 пикселя цвета edi
103
    * рисуется внутренняя рамка шириной 1 пиксель
103
    * рисуется внутренняя рамка шириной 1 пиксель
104
      "затенённого" цвета edi
104
      "затенённого" цвета edi
105
    * рисуется заголовок - прямоугольник с левым верхним углом (4,4)
105
    * рисуется заголовок - прямоугольник с левым верхним углом (4,4)
106
      и правым нижним (xsize-4,min(20,ysize)) цвета, указанного в esi
106
      и правым нижним (xsize-4,min(20,ysize)) цвета, указанного в esi
107
      (с учетом градиента)
107
      (с учетом градиента)
108
    * если ysize>=26, то закрашивается рабочая область окна -
108
    * если ysize>=26, то закрашивается рабочая область окна -
109
      прямоугольник с левым верхним углом (5,20) и правым нижним
109
      прямоугольник с левым верхним углом (5,20) и правым нижним
110
      (xsize-5,ysize-5) - цветом, указанным в edx (с учетом градиента)
110
      (xsize-5,ysize-5) - цветом, указанным в edx (с учетом градиента)
111
    * если A=1 и строка заголовка установлена подфункцией 1
111
    * если A=1 и строка заголовка установлена подфункцией 1
112
      функции 71, то она выводится в соответствующем месте заголовка
112
      функции 71, то она выводится в соответствующем месте заголовка
113
  * Вид окна со скином:
113
  * Вид окна со скином:
114
    * рисуется внешняя рамка шириной 1 пиксель
114
    * рисуется внешняя рамка шириной 1 пиксель
115
      цвета 'outer' из скина
115
      цвета 'outer' из скина
116
    * рисуется промежуточная рамка шириной 3 пикселя
116
    * рисуется промежуточная рамка шириной 3 пикселя
117
      цвета 'frame' из скина
117
      цвета 'frame' из скина
118
    * рисуется внутренняя рамка шириной 1 пиксель
118
    * рисуется внутренняя рамка шириной 1 пиксель
119
      цвета 'inner' из скина
119
      цвета 'inner' из скина
120
    * рисуется заголовок (по картинкам из скина) в прямоугольнике
120
    * рисуется заголовок (по картинкам из скина) в прямоугольнике
121
      (0,0) - (xsize,_skinh-1)
121
      (0,0) - (xsize,_skinh-1)
122
    * если ysize>=26, то закрашивается рабочая область окна -
122
    * если ysize>=26, то закрашивается рабочая область окна -
123
      прямоугольник с левым верхним углом (5,_skinh) и правым нижним
123
      прямоугольник с левым верхним углом (5,_skinh) и правым нижним
124
      (xsize-5,ysize-5) - цветом, указанным в edx (с учетом градиента)
124
      (xsize-5,ysize-5) - цветом, указанным в edx (с учетом градиента)
125
    * определяются две стандартные кнопки: закрытия и минимизации
125
    * определяются две стандартные кнопки: закрытия и минимизации
126
      (смотри функцию 8)
126
      (смотри функцию 8)
127
    * если A=1 и в edi (ненулевой) указатель на строку заголовка,
127
    * если A=1 и в edi (ненулевой) указатель на строку заголовка,
128
      то она выводится в заголовке в месте, определяемом скином
128
      то она выводится в заголовке в месте, определяемом скином
129
    * Значение переменной _skinh доступно как результат вызова
129
    * Значение переменной _skinh доступно как результат вызова
130
      подфункции 4 функции 48
130
      подфункции 4 функции 48
131
 
131
 
132
======================================================================
132
======================================================================
133
================= Функция 1 - поставить точку в окне. ================
133
================= Функция 1 - поставить точку в окне. ================
134
======================================================================
134
======================================================================
135
Параметры:
135
Параметры:
136
  * eax = 1 - номер функции
136
  * eax = 1 - номер функции
137
  * ebx = x-координата (относительно окна)
137
  * ebx = x-координата (относительно окна)
138
  * ecx = y-координата (относительно окна)
138
  * ecx = y-координата (относительно окна)
139
  * edx = 0x00RRGGBB - цвет точки
139
  * edx = 0x00RRGGBB - цвет точки
140
    edx = 0x01xxxxxx - инвертировать цвет точки
140
    edx = 0x01xxxxxx - инвертировать цвет точки
141
          (младшие 24 бита игнорируются)
141
          (младшие 24 бита игнорируются)
142
Возвращаемое значение:
142
Возвращаемое значение:
143
  * функция не возвращает значения
143
  * функция не возвращает значения
144
 
144
 
145
======================================================================
145
======================================================================
146
============== Функция 2 - получить код нажатой клавиши. =============
146
============== Функция 2 - получить код нажатой клавиши. =============
147
======================================================================
147
======================================================================
148
Забирает код нажатой клавиши из буфера.
148
Забирает код нажатой клавиши из буфера.
149
Параметры:
149
Параметры:
150
  * eax = 2 - номер функции
150
  * eax = 2 - номер функции
151
Возвращаемое значение:
151
Возвращаемое значение:
152
  * если буфер пуст, возвращается eax=1
152
  * если буфер пуст, возвращается eax=1
153
  * если буфер непуст, то возвращается al=0, ah=код нажатой клавиши,
153
  * если буфер непуст, то возвращается al=0, ah=код нажатой клавиши,
154
    биты 16-23 содержат сканкод нажатой клавиши в режиме ASCII,
154
    биты 16-23 содержат сканкод нажатой клавиши в режиме ASCII,
155
               в режме сканкодов биты обнулены.
155
               в режме сканкодов биты обнулены.
156
    биты 23-31 обнулены
156
    биты 23-31 обнулены
157
  * если есть "горячая клавиша", то возвращается
157
  * если есть "горячая клавиша", то возвращается
158
    al=2, ah=сканкод нажатой клавиши (0 для управляющих клавиш),
158
    al=2, ah=сканкод нажатой клавиши (0 для управляющих клавиш),
159
    старшее слово регистра eax содержит состояние управляющих клавиш
159
    старшее слово регистра eax содержит состояние управляющих клавиш
160
    в момент нажатия горячей клавиши
160
    в момент нажатия горячей клавиши
161
Замечания:
161
Замечания:
162
  * Существует общесистемный буфер нажатых клавиш размером 120 байт,
162
  * Существует общесистемный буфер нажатых клавиш размером 120 байт,
163
    организованный как очередь.
163
    организованный как очередь.
164
  * Существует ещё один общесистемный буфер на 120 "горячих клавиш".
164
  * Существует ещё один общесистемный буфер на 120 "горячих клавиш".
165
  * При вызове этой функции приложением с неактивным окном
165
  * При вызове этой функции приложением с неактивным окном
166
    считается, что буфер нажатых клавиш пуст.
166
    считается, что буфер нажатых клавиш пуст.
167
  * По умолчанию эта функция возвращает ASCII-коды; переключиться на
167
  * По умолчанию эта функция возвращает ASCII-коды; переключиться на
168
    режим сканкодов (и назад) можно с использованием функции 66.
168
    режим сканкодов (и назад) можно с использованием функции 66.
169
    Однако, горячие клавиши всегда возвращаются как сканкоды.
169
    Однако, горячие клавиши всегда возвращаются как сканкоды.
170
  * Узнать, какие комбинации клавиш соответствуют каким кодам, можно,
170
  * Узнать, какие комбинации клавиш соответствуют каким кодам, можно,
171
    запустив приложения keyascii и scancode.
171
    запустив приложения keyascii и scancode.
172
  * Сканкоды возвращаются непосредственно клавиатурой и фиксированы;
172
  * Сканкоды возвращаются непосредственно клавиатурой и фиксированы;
173
    ASCII-коды получаются с использованием таблиц преобразования,
173
    ASCII-коды получаются с использованием таблиц преобразования,
174
    которые можно установить подфункцией 2 функции 21 и прочитать
174
    которые можно установить подфункцией 2 функции 21 и прочитать
175
    подфункцией 2 функции 26.
175
    подфункцией 2 функции 26.
176
  * Как следствие, ASCII-коды учитывают текущую раскладку клавиатуры
176
  * Как следствие, ASCII-коды учитывают текущую раскладку клавиатуры
177
    (rus/en) в отличие от сканкодов.
177
    (rus/en) в отличие от сканкодов.
178
  * Поступает информация только о тех горячих клавишах, которые были
178
  * Поступает информация только о тех горячих клавишах, которые были
179
    определены этим потоком подфункцией 4 функции 66.
179
    определены этим потоком подфункцией 4 функции 66.
180
 
180
 
181
======================================================================
181
======================================================================
182
================ Функция 3 - получить системное время. ===============
182
================ Функция 3 - получить системное время. ===============
183
======================================================================
183
======================================================================
184
Параметры:
184
Параметры:
185
  * eax = 3 - номер функции
185
  * eax = 3 - номер функции
186
Возвращаемое значение:
186
Возвращаемое значение:
187
  * eax = 0x00SSMMHH, где HH:MM:SS = часы:минуты:секунды
187
  * eax = 0x00SSMMHH, где HH:MM:SS = часы:минуты:секунды
188
  * каждый элемент возвращается как BCD-число, например,
188
  * каждый элемент возвращается как BCD-число, например,
189
    для времени 23:59:59 результат будет 0x00595923
189
    для времени 23:59:59 результат будет 0x00595923
190
Замечания:
190
Замечания:
191
  * Смотри также подфункцию 9 функции 26 - получение времени
191
  * Смотри также подфункцию 9 функции 26 - получение времени
192
    с момента запуска системы; она во многих случаях удобнее,
192
    с момента запуска системы; она во многих случаях удобнее,
193
    поскольку возвращает просто DWORD-значение счетчика времени.
193
    поскольку возвращает просто DWORD-значение счетчика времени.
194
  * Системное время можно установить функцией 22.
194
  * Системное время можно установить функцией 22.
195
 
195
 
196
======================================================================
196
======================================================================
197
============== Функция 4 - вывести строку текста в окно. =============
197
============== Функция 4 - вывести строку текста в окно. =============
198
======================================================================
198
======================================================================
199
Параметры:
199
Параметры:
200
  * eax = 4 - номер функции
200
  * eax = 4 - номер функции
201
  * ebx = [координата по оси x]*65536 + [координата по оси y]
201
  * ebx = [координата по оси x]*65536 + [координата по оси y]
202
  * ecx = 0xXYRRGGBB, где
202
  * ecx = 0xXYRRGGBB, где
203
    * RR, GG, BB задают цвет текста
203
    * RR, GG, BB задают цвет текста
204
    * X=ABFF (биты):
204
    * X=ABFF (биты):
205
      * A=1 - выводить ASCIIZ-строку
205
      * A=1 - выводить ASCIIZ-строку
206
      * B=1 - закрашивать фон цветом edi
206
      * B=1 - закрашивать фон цветом edi
207
      * FF задает шрифт и кодировку:
207
      * FF задает шрифт и кодировку:
208
        0 = 6x9  cp866
208
        0 = 6x9  cp866
209
        2 = 8x16 UTF-16LE
209
        2 = 8x16 UTF-16LE
210
        3 = 8x16 UTF-8
210
        3 = 8x16 UTF-8
211
    * Y=CDDD (биты):
211
    * Y=CDDD (биты):
212
      * C=1 перенаправить вывод в область пользователя, задано в edi
212
      * C=1 перенаправить вывод в область пользователя, задано в edi
213
      * DDD = (множитель размера)-1, то-есть 0 = x1, 7 = x8
213
      * DDD = (множитель размера)-1, то-есть 0 = x1, 7 = x8
214
  * edx = указатель на начало строки
214
  * edx = указатель на начало строки
215
  * esi = для A=0 длина строки, для A=1 игнорируется
215
  * esi = для A=0 длина строки, для A=1 игнорируется
216
  * edi = если B=1, цвет для закраски фона,
216
  * edi = если B=1, цвет для закраски фона,
217
          если C=1, указатель на область пользователя
217
          если C=1, указатель на область пользователя
218
 
218
 
219
Возвращаемое значение:
219
Возвращаемое значение:
220
  * функция не возвращает значения
220
  * функция не возвращает значения
221
Замечания:
221
Замечания:
222
  * C=1, цвет = 32 бита, область пользователя выглядит так:
222
  * C=1, цвет = 32 бита, область пользователя выглядит так:
223
    Xsize = dword
223
    Xsize = dword
224
    Ysize = dword
224
    Ysize = dword
225
    остаток области = Xsize*Ysize*4
225
    остаток области = Xsize*Ysize*4
226
  * Нельзя одновременно использовать B=1 и C=1,
226
  * Нельзя одновременно использовать B=1 и C=1,
227
    поскольку в обоих случаях используется регистр edi.
227
    поскольку в обоих случаях используется регистр edi.
228
 
228
 
229
======================================================================
229
======================================================================
230
========================= Функция 5 - пауза. =========================
230
========================= Функция 5 - пауза. =========================
231
======================================================================
231
======================================================================
232
Задерживает выполнение программы на заданное время.
232
Задерживает выполнение программы на заданное время.
233
Параметры:
233
Параметры:
234
  * eax = 5 - номер функции
234
  * eax = 5 - номер функции
235
  * ebx = время в сотых долях секунды
235
  * ebx = время в сотых долях секунды
236
Возвращаемое значение:
236
Возвращаемое значение:
237
  * функция не возвращает значения
237
  * функция не возвращает значения
238
Замечания:
238
Замечания:
239
  * Передача ebx=0 не передает управление следующему процессу и
239
  * Передача ebx=0 не передает управление следующему процессу и
240
    вообще не производит никаких действий. Если действительно
240
    вообще не производит никаких действий. Если действительно
241
    требуется передать управление следующему процессу
241
    требуется передать управление следующему процессу
242
    (закончить текущий квант времени), используйте подфункцию 1
242
    (закончить текущий квант времени), используйте подфункцию 1
243
    функции 68.
243
    функции 68.
244
 
244
 
245
======================================================================
245
======================================================================
246
=============== Функция 6 - прочитать файл с рамдиска. ===============
246
=============== Функция 6 - прочитать файл с рамдиска. ===============
247
======================================================================
247
======================================================================
248
Параметры:
248
Параметры:
249
  * eax = 6 - номер функции
249
  * eax = 6 - номер функции
250
  * ebx = указатель на имя файла
250
  * ebx = указатель на имя файла
251
  * ecx = номер стартового блока, считая с 1;
251
  * ecx = номер стартового блока, считая с 1;
252
    ecx=0 - читать с начала файла (то же самое, что и ecx=1)
252
    ecx=0 - читать с начала файла (то же самое, что и ecx=1)
253
  * edx = число блоков для чтения;
253
  * edx = число блоков для чтения;
254
    edx=0 - читать один блок (то же самое, что и edx=1)
254
    edx=0 - читать один блок (то же самое, что и edx=1)
255
  * esi = указатель на область памяти, куда будут записаны данные
255
  * esi = указатель на область памяти, куда будут записаны данные
256
Возвращаемое значение:
256
Возвращаемое значение:
257
  * eax = длина файла в байтах, если файл успешно прочитан
257
  * eax = длина файла в байтах, если файл успешно прочитан
258
  * eax = -1, если файл не найден
258
  * eax = -1, если файл не найден
259
Замечания:
259
Замечания:
260
  * Данная функция является устаревшей; функция 70
260
  * Данная функция является устаревшей; функция 70
261
    позволяет выполнять те же действия с расширенными возможностями.
261
    позволяет выполнять те же действия с расширенными возможностями.
262
  * Блок = 512 байт.
262
  * Блок = 512 байт.
263
  * Для чтения всего файла можно указать заведомо большое значение
263
  * Для чтения всего файла можно указать заведомо большое значение
264
    в edx, например, edx = -1; но в этом случае будьте готовы к тому,
264
    в edx, например, edx = -1; но в этом случае будьте готовы к тому,
265
    что программа "упадет", если файл окажется слишком большим
265
    что программа "упадет", если файл окажется слишком большим
266
    и "не влезет" в память программы.
266
    и "не влезет" в память программы.
267
  * Имя файла должно быть либо в формате 8+3 символов
267
  * Имя файла должно быть либо в формате 8+3 символов
268
    (первые 8 символов - собственно имя, последние 3 - расширение,
268
    (первые 8 символов - собственно имя, последние 3 - расширение,
269
    короткие имена и расширения дополняются пробелами),
269
    короткие имена и расширения дополняются пробелами),
270
    либо в формате 8.3 символов "FILE.EXT"/"FILE.EX "
270
    либо в формате 8.3 символов "FILE.EXT"/"FILE.EX "
271
    (имя не более 8 символов, точка, расширение 3 символа,
271
    (имя не более 8 символов, точка, расширение 3 символа,
272
    дополненное при необходимости пробелами).
272
    дополненное при необходимости пробелами).
273
    Имя файла должно быть записано заглавными буквами.
273
    Имя файла должно быть записано заглавными буквами.
274
    Завершающий символ с кодом 0 не нужен (не ASCIIZ-строка).
274
    Завершающий символ с кодом 0 не нужен (не ASCIIZ-строка).
275
  * Эта функция не поддерживает папки на рамдиске.
275
  * Эта функция не поддерживает папки на рамдиске.
276
 
276
 
277
======================================================================
277
======================================================================
278
=============== Функция 7 - вывести изображение в окно. ==============
278
=============== Функция 7 - вывести изображение в окно. ==============
279
======================================================================
279
======================================================================
280
Параметры:
280
Параметры:
281
  * eax = 7 - номер функции
281
  * eax = 7 - номер функции
282
  * ebx = указатель на изображение в формате BBGGRRBBGGRR...
282
  * ebx = указатель на изображение в формате BBGGRRBBGGRR...
283
  * ecx = [размер по оси x]*65536 + [размер по оси y]
283
  * ecx = [размер по оси x]*65536 + [размер по оси y]
284
  * edx = [координата по оси x]*65536 + [координата по оси y]
284
  * edx = [координата по оси x]*65536 + [координата по оси y]
285
Возвращаемое значение:
285
Возвращаемое значение:
286
  * функция не возвращает значения
286
  * функция не возвращает значения
287
Замечания:
287
Замечания:
288
  * Координаты изображения - это координаты верхнего левого угла
288
  * Координаты изображения - это координаты верхнего левого угла
289
    изображения относительно окна.
289
    изображения относительно окна.
290
  * Размер изображения в байтах есть 3*xsize*ysize.
290
  * Размер изображения в байтах есть 3*xsize*ysize.
291
 
291
 
292
======================================================================
292
======================================================================
293
=============== Функция 8 - определить/удалить кнопку. ===============
293
=============== Функция 8 - определить/удалить кнопку. ===============
294
======================================================================
294
======================================================================
295
Параметры для определения кнопки:
295
Параметры для определения кнопки:
296
  * eax = 8 - номер функции
296
  * eax = 8 - номер функции
297
  * ebx = [координата по оси x]*65536 + [размер по оси x]
297
  * ebx = [координата по оси x]*65536 + [размер по оси x]
298
  * ecx = [координата по оси y]*65536 + [размер по оси y]
298
  * ecx = [координата по оси y]*65536 + [размер по оси y]
299
  * edx = 0xXYnnnnnn, где:
299
  * edx = 0xXYnnnnnn, где:
300
    * nnnnnn = идентификатор кнопки
300
    * nnnnnn = идентификатор кнопки
301
    * старший (31-й) бит edx сброшен
301
    * старший (31-й) бит edx сброшен
302
    * если 30-й бит edx установлен - не прорисовывать кнопку
302
    * если 30-й бит edx установлен - не прорисовывать кнопку
303
    * если 29-й бит edx установлен - не рисовать рамку
303
    * если 29-й бит edx установлен - не рисовать рамку
304
      при нажатии на кнопку
304
      при нажатии на кнопку
305
  * esi = 0x00RRGGBB - цвет кнопки
305
  * esi = 0x00RRGGBB - цвет кнопки
306
Параметры для удаления кнопки:
306
Параметры для удаления кнопки:
307
  * eax = 8 - номер функции
307
  * eax = 8 - номер функции
308
  * edx = 0x80nnnnnn, где nnnnnn - идентификатор кнопки
308
  * edx = 0x80nnnnnn, где nnnnnn - идентификатор кнопки
309
Возвращаемое значение:
309
Возвращаемое значение:
310
  * функция не возвращает значения
310
  * функция не возвращает значения
311
Замечания:
311
Замечания:
312
  * Размеры кнопки должны быть больше 0 и меньше 0x8000.
312
  * Размеры кнопки должны быть больше 0 и меньше 0x8000.
313
  * Для окон со скином при определении окна (вызове 0-й функции)
313
  * Для окон со скином при определении окна (вызове 0-й функции)
314
    создаются две стандартные кнопки - закрытия окна
314
    создаются две стандартные кнопки - закрытия окна
315
    с идентификатором 1 и минимизации окна с идентификатором 0xffff.
315
    с идентификатором 1 и минимизации окна с идентификатором 0xffff.
316
  * Создание двух кнопок с одинаковыми идентификаторами
316
  * Создание двух кнопок с одинаковыми идентификаторами
317
    вполне допустимо.
317
    вполне допустимо.
318
  * Кнопка с идентификатором 0xffff при нажатии интерпретируется
318
  * Кнопка с идентификатором 0xffff при нажатии интерпретируется
319
    системой как кнопка минимизации, система обрабатывает такое
319
    системой как кнопка минимизации, система обрабатывает такое
320
    нажатие самостоятельно, не обращаясь к приложению.
320
    нажатие самостоятельно, не обращаясь к приложению.
321
    В остальном это обычная кнопка.
321
    В остальном это обычная кнопка.
322
  * Общее количество кнопок для всех приложений ограничено
322
  * Общее количество кнопок для всех приложений ограничено
323
    числом 4095.
323
    числом 4095.
324
 
324
 
325
======================================================================
325
======================================================================
326
============= Функция 9 - информация о потоке выполнения. ============
326
============= Функция 9 - информация о потоке выполнения. ============
327
======================================================================
327
======================================================================
328
Параметры:
328
Параметры:
329
  * eax = 9 - номер функции
329
  * eax = 9 - номер функции
330
  * ebx = указатель на буфер размера 1 Кб
330
  * ebx = указатель на буфер размера 1 Кб
331
  * ecx = номер слота потока
331
  * ecx = номер слота потока
332
    ecx = -1 - получить информацию о текущем потоке
332
    ecx = -1 - получить информацию о текущем потоке
333
Возвращаемое значение:
333
Возвращаемое значение:
334
  * eax = максимальный номер слота потока
334
  * eax = максимальный номер слота потока
335
  * буфер, на который указывает ebx, содержит следующую информацию:
335
  * буфер, на который указывает ebx, содержит следующую информацию:
336
    * +0: dword: использование процессора (сколько тактов в секунду
336
    * +0: dword: использование процессора (сколько тактов в секунду
337
      уходит на исполнение именно этого потока)
337
      уходит на исполнение именно этого потока)
338
    * +4: word: позиция окна потока в оконном стэке
338
    * +4: word: позиция окна потока в оконном стэке
339
    * +6: word: (не имеет отношения к запрошенному потоку)
339
    * +6: word: (не имеет отношения к запрошенному потоку)
340
      номер слота потока, окно которого находится в оконном стэке
340
      номер слота потока, окно которого находится в оконном стэке
341
      в позиции ecx
341
      в позиции ecx
342
    * +8: word: зарезервировано
342
    * +8: word: зарезервировано
343
    * +10 = +0xA: 11 байт: имя процесса
343
    * +10 = +0xA: 11 байт: имя процесса
344
      (имя запущенного файла - исполняемый файл без расширения)
344
      (имя запущенного файла - исполняемый файл без расширения)
345
    * +21 = +0x15: byte: зарезервировано, этот байт не изменяется
345
    * +21 = +0x15: byte: зарезервировано, этот байт не изменяется
346
    * +22 = +0x16: dword: адрес процесса в памяти
346
    * +22 = +0x16: dword: адрес процесса в памяти
347
    * +26 = +0x1A: dword: размер используемой памяти - 1
347
    * +26 = +0x1A: dword: размер используемой памяти - 1
348
    * +30 = +0x1E: dword: идентификатор (PID/TID)
348
    * +30 = +0x1E: dword: идентификатор (PID/TID)
349
    * +34 = +0x22: dword: координата окна потока по оси x
349
    * +34 = +0x22: dword: координата окна потока по оси x
350
    * +38 = +0x26: dword: координата окна потока по оси y
350
    * +38 = +0x26: dword: координата окна потока по оси y
351
    * +42 = +0x2A: dword: размер окна потока по оси x
351
    * +42 = +0x2A: dword: размер окна потока по оси x
352
    * +46 = +0x2E: dword: размер окна потока по оси y
352
    * +46 = +0x2E: dword: размер окна потока по оси y
353
    * +50 = +0x32: word: состояние слота потока:
353
    * +50 = +0x32: word: состояние слота потока:
354
      * 0 = поток выполняется
354
      * 0 = поток выполняется
355
      * 1 = поток приостановлен
355
      * 1 = поток приостановлен
356
      * 2 = поток приостановлен в момент ожидания события
356
      * 2 = поток приостановлен в момент ожидания события
357
      * 3 = поток завершается в результате вызова функции -1 или
357
      * 3 = поток завершается в результате вызова функции -1 или
358
        насильственно как следствие вызова подфункции 2 функции 18
358
        насильственно как следствие вызова подфункции 2 функции 18
359
        или завершения работы системы
359
        или завершения работы системы
360
      * 4 = поток завершается в результате исключения
360
      * 4 = поток завершается в результате исключения
361
      * 5 = поток ожидает события
361
      * 5 = поток ожидает события
362
      * 9 = запрошенный слот свободен, вся остальная информация о
362
      * 9 = запрошенный слот свободен, вся остальная информация о
363
        слоте не имеет смысла
363
        слоте не имеет смысла
364
    * +52 = +0x34: word: зарезервировано, это слово не изменяется
364
    * +52 = +0x34: word: зарезервировано, это слово не изменяется
365
    * +54 = +0x36: dword: координата начала клиентской области
365
    * +54 = +0x36: dword: координата начала клиентской области
366
                          по оси x
366
                          по оси x
367
    * +58 = +0x3A: dword: координата начала клиентской области
367
    * +58 = +0x3A: dword: координата начала клиентской области
368
                          по оси y
368
                          по оси y
369
    * +62 = +0x3E: dword: ширина клиентской области
369
    * +62 = +0x3E: dword: ширина клиентской области
370
    * +66 = +0x42: dword: высота клиентской области
370
    * +66 = +0x42: dword: высота клиентской области
371
    * +70 = +0x46: byte: состояние окна - битовое поле
371
    * +70 = +0x46: byte: состояние окна - битовое поле
372
      * бит 0 (маска 1): окно максимизировано
372
      * бит 0 (маска 1): окно максимизировано
373
      * бит 1 (маска 2): окно минимизировано в панель задач
373
      * бит 1 (маска 2): окно минимизировано в панель задач
374
      * бит 2 (маска 4): окно свёрнуто в заголовок
374
      * бит 2 (маска 4): окно свёрнуто в заголовок
375
    * +71 = +0x47: dword: маска событий
375
    * +71 = +0x47: dword: маска событий
376
    * +75 = +0x4B: byte: режим ввода с клавиатуры(ASCII = 0; SCAN = 1)
376
    * +75 = +0x4B: byte: режим ввода с клавиатуры(ASCII = 0; SCAN = 1)
377
Замечания:
377
Замечания:
378
  * Слоты нумеруются с 1.
378
  * Слоты нумеруются с 1.
379
  * Возвращаемое значение не есть общее число потоков, поскольку
379
  * Возвращаемое значение не есть общее число потоков, поскольку
380
    бывают свободные слоты.
380
    бывают свободные слоты.
381
  * При создании процесса автоматически создается поток выполнения.
381
  * При создании процесса автоматически создается поток выполнения.
382
  * Функция выдает информацию о потоке. Каждый процесс имеет
382
  * Функция выдает информацию о потоке. Каждый процесс имеет
383
    хотя бы один поток. Один процесс может создать несколько потоков,
383
    хотя бы один поток. Один процесс может создать несколько потоков,
384
    в этом случае каждый поток получает свой слот, причем поля
384
    в этом случае каждый поток получает свой слот, причем поля
385
    +10, +22, +26 в этих слотах совпадают.
385
    +10, +22, +26 в этих слотах совпадают.
386
    Для приложений не существует общего способа определить,
386
    Для приложений не существует общего способа определить,
387
    принадлежат ли два потока одному процессу.
387
    принадлежат ли два потока одному процессу.
388
  * Активное окно - окно, находящееся на вершине оконного стэка,
388
  * Активное окно - окно, находящееся на вершине оконного стэка,
389
    оно получает сообщения о вводе с клавиатуры. Для него позиция в
389
    оно получает сообщения о вводе с клавиатуры. Для него позиция в
390
    оконном стэке совпадает с возвращаемым значением.
390
    оконном стэке совпадает с возвращаемым значением.
391
  * Слот 1 соответствует специальному потоку операционной системы,
391
  * Слот 1 соответствует специальному потоку операционной системы,
392
    для которого:
392
    для которого:
393
    * окно находится внизу оконного стэка, поля +4 и +6 содержат
393
    * окно находится внизу оконного стэка, поля +4 и +6 содержат
394
      значение 1
394
      значение 1
395
    * имя процесса - "OS/IDLE" (дополненное пробелами)
395
    * имя процесса - "OS/IDLE" (дополненное пробелами)
396
    * адрес процесса в памяти равен 0, размер используемой памяти
396
    * адрес процесса в памяти равен 0, размер используемой памяти
397
      16 Mb (0x1000000)
397
      16 Mb (0x1000000)
398
    * PID=1
398
    * PID=1
399
    * координаты и размеры окна, равно как и клиентской области,
399
    * координаты и размеры окна, равно как и клиентской области,
400
      условно полагаются равными 0
400
      условно полагаются равными 0
401
    * состояние слота - всегда 0 (выполняется)
401
    * состояние слота - всегда 0 (выполняется)
402
    * время выполнения складывается из времени, уходящего на
402
    * время выполнения складывается из времени, уходящего на
403
      собственно работу, и времени простоя в ожидании прерывания
403
      собственно работу, и времени простоя в ожидании прерывания
404
      (которое можно получить вызовом подфункции 4 функции 18).
404
      (которое можно получить вызовом подфункции 4 функции 18).
405
  * Начиная со слота 2, размещаются обычные приложения.
405
  * Начиная со слота 2, размещаются обычные приложения.
406
  * Обычные приложения размещаются в памяти по адресу 0
406
  * Обычные приложения размещаются в памяти по адресу 0
407
    (константа ядра std_application_base_address).
407
    (константа ядра std_application_base_address).
408
    Наложения не происходит, поскольку у каждого процесса своя
408
    Наложения не происходит, поскольку у каждого процесса своя
409
    таблица страниц.
409
    таблица страниц.
410
  * При создании потока ему назначаются слот в системной таблице и
410
  * При создании потока ему назначаются слот в системной таблице и
411
    идентификатор (Process/Thread IDentifier = PID/TID), которые для
411
    идентификатор (Process/Thread IDentifier = PID/TID), которые для
412
    заданного потока не изменяются со временем.
412
    заданного потока не изменяются со временем.
413
    После завершения потока его слот может быть заново использован
413
    После завершения потока его слот может быть заново использован
414
    для другого потока. Идентификатор потока не может быть назначен
414
    для другого потока. Идентификатор потока не может быть назначен
415
    другому потоку даже после завершения первого.
415
    другому потоку даже после завершения первого.
416
    Назначаемые новым потокам идентификаторы монотонно растут.
416
    Назначаемые новым потокам идентификаторы монотонно растут.
417
  * Если поток еще не определил свое окно вызовом функции 0, то
417
  * Если поток еще не определил свое окно вызовом функции 0, то
418
    положение и размеры этого окна полагаются нулями.
418
    положение и размеры этого окна полагаются нулями.
419
  * Координаты клиентской области окна берутся относительно окна.
419
  * Координаты клиентской области окна берутся относительно окна.
420
  * В данный момент используется только часть буфера размером
420
  * В данный момент используется только часть буфера размером
421
    76 = 0x4C байта. Тем не менее рекомендуется использовать буфер
421
    76 = 0x4C байта. Тем не менее рекомендуется использовать буфер
422
    размером 1 Кб для будущей совместимости, в будущем могут быть
422
    размером 1 Кб для будущей совместимости, в будущем могут быть
423
    добавлены некоторые поля.
423
    добавлены некоторые поля.
424
 
424
 
425
======================================================================
425
======================================================================
426
==================== Функция 10 - ожидать события. ===================
426
==================== Функция 10 - ожидать события. ===================
427
======================================================================
427
======================================================================
428
Если очередь сообщений пуста, то ждет появления сообщения в очереди.
428
Если очередь сообщений пуста, то ждет появления сообщения в очереди.
429
В таком состоянии поток не получает процессорного времени.
429
В таком состоянии поток не получает процессорного времени.
430
Затем считывает сообщение из очереди.
430
Затем считывает сообщение из очереди.
431
 
431
 
432
Параметры:
432
Параметры:
433
  * eax = 10 - номер функции
433
  * eax = 10 - номер функции
434
Возвращаемое значение:
434
Возвращаемое значение:
435
  * eax = событие (смотри список событий)
435
  * eax = событие (смотри список событий)
436
Замечания:
436
Замечания:
437
  * Учитываются только те события, которые входят в маску,
437
  * Учитываются только те события, которые входят в маску,
438
    устанавливаемую функцией 40. По умолчанию это события
438
    устанавливаемую функцией 40. По умолчанию это события
439
    перерисовки, нажатия на клавиши и на кнопки.
439
    перерисовки, нажатия на клавиши и на кнопки.
440
  * Для проверки, есть ли сообщение в очереди, используйте функцию 11.
440
  * Для проверки, есть ли сообщение в очереди, используйте функцию 11.
441
    Чтобы ждать не более определенного времени, используйте
441
    Чтобы ждать не более определенного времени, используйте
442
    функцию 23.
442
    функцию 23.
443
 
443
 
444
======================================================================
444
======================================================================
445
======= Функция 11 - проверить, есть ли событие, без ожидания. =======
445
======= Функция 11 - проверить, есть ли событие, без ожидания. =======
446
======================================================================
446
======================================================================
447
Если в очереди сообщений есть какое-то событие, то считывает и
447
Если в очереди сообщений есть какое-то событие, то считывает и
448
возвращает его. Если очередь пуста, возвращает нуль.
448
возвращает его. Если очередь пуста, возвращает нуль.
449
Параметры:
449
Параметры:
450
  * eax = 11 - номер функции
450
  * eax = 11 - номер функции
451
Возвращаемое значение:
451
Возвращаемое значение:
452
  * eax = 0 - очередь сообщений пуста
452
  * eax = 0 - очередь сообщений пуста
453
  * иначе eax = событие (смотри список событий)
453
  * иначе eax = событие (смотри список событий)
454
Замечания:
454
Замечания:
455
  * Учитываются только те события, которые входят в маску,
455
  * Учитываются только те события, которые входят в маску,
456
    устанавливаемую функцией 40. По умолчанию это события
456
    устанавливаемую функцией 40. По умолчанию это события
457
    перерисовки, нажатия на клавиши и на кнопки.
457
    перерисовки, нажатия на клавиши и на кнопки.
458
  * Для ожидания появления события в очереди, используйте функцию 10.
458
  * Для ожидания появления события в очереди, используйте функцию 10.
459
    Чтобы ждать не более определенного времени, используйте
459
    Чтобы ждать не более определенного времени, используйте
460
    функцию 23.
460
    функцию 23.
461
 
461
 
462
======================================================================
462
======================================================================
463
=========== Функция 12 - начать/закончить перерисовку окна. ==========
463
=========== Функция 12 - начать/закончить перерисовку окна. ==========
464
======================================================================
464
======================================================================
465
 
465
 
466
-------------- Подфункция 1 - начать перерисовку окна. ---------------
466
-------------- Подфункция 1 - начать перерисовку окна. ---------------
467
Параметры:
467
Параметры:
468
  * eax = 12 - номер функции
468
  * eax = 12 - номер функции
469
  * ebx = 1 - номер подфункции
469
  * ebx = 1 - номер подфункции
470
Возвращаемое значение:
470
Возвращаемое значение:
471
  * функция не возвращает значения
471
  * функция не возвращает значения
472
 
472
 
473
------------- Подфункция 2 - закончить перерисовку окна. -------------
473
------------- Подфункция 2 - закончить перерисовку окна. -------------
474
Параметры:
474
Параметры:
475
  * eax = 12 - номер функции
475
  * eax = 12 - номер функции
476
  * ebx = 2 - номер подфункции
476
  * ebx = 2 - номер подфункции
477
Возвращаемое значение:
477
Возвращаемое значение:
478
  * функция не возвращает значения
478
  * функция не возвращает значения
479
Замечания:
479
Замечания:
480
  * Функция начала перерисовки удаляет все определённые
480
  * Функция начала перерисовки удаляет все определённые
481
    функцией 8 кнопки, их следует определить повторно.
481
    функцией 8 кнопки, их следует определить повторно.
482
 
482
 
483
======================================================================
483
======================================================================
484
============ Функция 13 - нарисовать прямоугольник в окне. ===========
484
============ Функция 13 - нарисовать прямоугольник в окне. ===========
485
======================================================================
485
======================================================================
486
Параметры:
486
Параметры:
487
  * eax = 13 - номер функции
487
  * eax = 13 - номер функции
488
  * ebx = [координата по оси x]*65536 + [размер по оси x]
488
  * ebx = [координата по оси x]*65536 + [размер по оси x]
489
  * ecx = [координата по оси y]*65536 + [размер по оси y]
489
  * ecx = [координата по оси y]*65536 + [размер по оси y]
490
  * edx = цвет 0xRRGGBB или 0x80RRGGBB для градиентной заливки
490
  * edx = цвет 0xRRGGBB или 0x80RRGGBB для градиентной заливки
491
Возвращаемое значение:
491
Возвращаемое значение:
492
  * функция не возвращает значения
492
  * функция не возвращает значения
493
Замечания:
493
Замечания:
494
  * Под координатами понимаются координаты левого верхнего угла
494
  * Под координатами понимаются координаты левого верхнего угла
495
    прямоугольника относительно окна.
495
    прямоугольника относительно окна.
496
 
496
 
497
======================================================================
497
======================================================================
498
================ Функция 14 - получить размеры экрана. ===============
498
================ Функция 14 - получить размеры экрана. ===============
499
======================================================================
499
======================================================================
500
Параметры:
500
Параметры:
501
  * eax = 14 - номер функции
501
  * eax = 14 - номер функции
502
Возвращаемое значение:
502
Возвращаемое значение:
503
  * eax = [xsize]*65536 + [ysize], где
503
  * eax = [xsize]*65536 + [ysize], где
504
  * xsize = x-координата правого нижнего угла экрана =
504
  * xsize = x-координата правого нижнего угла экрана =
505
            размер по горизонтали - 1
505
            размер по горизонтали - 1
506
  * ysize = y-координата правого нижнего угла экрана =
506
  * ysize = y-координата правого нижнего угла экрана =
507
            размер по вертикали - 1
507
            размер по вертикали - 1
508
Замечания:
508
Замечания:
509
  * Смотри также подфункцию 5 функции 48 - получить размеры рабочей
509
  * Смотри также подфункцию 5 функции 48 - получить размеры рабочей
510
    области экрана.
510
    области экрана.
511
 
511
 
512
======================================================================
512
======================================================================
513
= Функция 15, подфункция 1 - установить размер фонового изображения. =
513
= Функция 15, подфункция 1 - установить размер фонового изображения. =
514
======================================================================
514
======================================================================
515
Параметры:
515
Параметры:
516
  * eax = 15 - номер функции
516
  * eax = 15 - номер функции
517
  * ebx = 1 - номер подфункции
517
  * ebx = 1 - номер подфункции
518
  * ecx = ширина изображения
518
  * ecx = ширина изображения
519
  * edx = высота изображения
519
  * edx = высота изображения
520
Возвращаемое значение:
520
Возвращаемое значение:
521
  * функция не возвращает значения
521
  * функция не возвращает значения
522
Замечания:
522
Замечания:
523
  * Вызов функции обязателен перед вызовом подфункций 2 и 5.
523
  * Вызов функции обязателен перед вызовом подфункций 2 и 5.
524
  * Для обновления экрана (после завершения серии команд, работающих с
524
  * Для обновления экрана (после завершения серии команд, работающих с
525
    фоном) вызывайте подфункцию 3 перерисовки фона.
525
    фоном) вызывайте подфункцию 3 перерисовки фона.
526
  * Есть парная функция получения размеров фонового изображения -
526
  * Есть парная функция получения размеров фонового изображения -
527
    подфункция 1 функции 39.
527
    подфункция 1 функции 39.
528
 
528
 
529
======================================================================
529
======================================================================
530
= Функция 15, подфункция 2 - поставить точку на фоновом изображении. =
530
= Функция 15, подфункция 2 - поставить точку на фоновом изображении. =
531
======================================================================
531
======================================================================
532
Параметры:
532
Параметры:
533
  * eax = 15 - номер функции
533
  * eax = 15 - номер функции
534
  * ebx = 2 - номер подфункции
534
  * ebx = 2 - номер подфункции
535
  * ecx = смещение
535
  * ecx = смещение
536
  * edx = цвет точки 0xRRGGBB
536
  * edx = цвет точки 0xRRGGBB
537
Возвращаемое значение:
537
Возвращаемое значение:
538
  * функция не возвращает значения
538
  * функция не возвращает значения
539
Замечания:
539
Замечания:
540
  * Смещение для точки с координатами (x,y) вычисляется как
540
  * Смещение для точки с координатами (x,y) вычисляется как
541
    (x+y*xsize)*3.
541
    (x+y*xsize)*3.
542
  * Если указанное смещение превышает установленный подфункцией 1
542
  * Если указанное смещение превышает установленный подфункцией 1
543
    размер, вызов игнорируется.
543
    размер, вызов игнорируется.
544
  * Для обновления экрана (после завершения серии команд, работающих с
544
  * Для обновления экрана (после завершения серии команд, работающих с
545
    фоном) вызывайте подфункцию 3 перерисовки фона.
545
    фоном) вызывайте подфункцию 3 перерисовки фона.
546
  * Есть парная функция получения точки с фонового изображения -
546
  * Есть парная функция получения точки с фонового изображения -
547
    подфункция 2 функции 39.
547
    подфункция 2 функции 39.
548
 
548
 
549
======================================================================
549
======================================================================
550
============ Функция 15, подфункция 3 - перерисовать фон. ============
550
============ Функция 15, подфункция 3 - перерисовать фон. ============
551
======================================================================
551
======================================================================
552
Параметры:
552
Параметры:
553
  * eax = 15 - номер функции
553
  * eax = 15 - номер функции
554
  * ebx = 3 - номер подфункции
554
  * ebx = 3 - номер подфункции
555
Возвращаемое значение:
555
Возвращаемое значение:
556
  * функция не возвращает значения
556
  * функция не возвращает значения
557
 
557
 
558
======================================================================
558
======================================================================
559
===== Функция 15, подфункция 4 - установить режим отрисовки фона. ====
559
===== Функция 15, подфункция 4 - установить режим отрисовки фона. ====
560
======================================================================
560
======================================================================
561
Параметры:
561
Параметры:
562
  * eax = 15 - номер функции
562
  * eax = 15 - номер функции
563
  * ebx = 4 - номер подфункции
563
  * ebx = 4 - номер подфункции
564
  * ecx = режим отрисовки:
564
  * ecx = режим отрисовки:
565
    * 1 = замостить
565
    * 1 = замостить
566
    * 2 = растянуть
566
    * 2 = растянуть
567
Возвращаемое значение:
567
Возвращаемое значение:
568
  * функция не возвращает значения
568
  * функция не возвращает значения
569
Замечания:
569
Замечания:
570
  * Для обновления экрана (после завершения серии команд, работающих с
570
  * Для обновления экрана (после завершения серии команд, работающих с
571
    фоном) вызывайте подфункцию 3 перерисовки фона.
571
    фоном) вызывайте подфункцию 3 перерисовки фона.
572
  * Есть парная команда получения режима отрисовки фона -
572
  * Есть парная команда получения режима отрисовки фона -
573
    подфункция 4 функции 39.
573
    подфункция 4 функции 39.
574
 
574
 
575
======================================================================
575
======================================================================
576
===== Функция 15, подфункция 5 - поместить блок пикселей на фон. =====
576
===== Функция 15, подфункция 5 - поместить блок пикселей на фон. =====
577
======================================================================
577
======================================================================
578
Параметры:
578
Параметры:
579
  * eax = 15 - номер функции
579
  * eax = 15 - номер функции
580
  * ebx = 5 - номер подфункции
580
  * ebx = 5 - номер подфункции
581
  * ecx = указатель на данные в формате BBGGRRBBGGRR...
581
  * ecx = указатель на данные в формате BBGGRRBBGGRR...
582
  * edx = смещение в данных фонового изображения
582
  * edx = смещение в данных фонового изображения
583
  * esi = размер данных в байтах = 3 * число пикселей
583
  * esi = размер данных в байтах = 3 * число пикселей
584
Возвращаемое значение:
584
Возвращаемое значение:
585
  * функция не возвращает значения
585
  * функция не возвращает значения
586
Замечания:
586
Замечания:
587
  * Проверки корректности смещения и размера не производится.
587
  * Проверки корректности смещения и размера не производится.
588
  * Цвет каждого пикселя хранится как 3-байтная величина BBGGRR.
588
  * Цвет каждого пикселя хранится как 3-байтная величина BBGGRR.
589
  * Пиксели фонового изображения записываются последовательно
589
  * Пиксели фонового изображения записываются последовательно
590
    слева направо, сверху вниз.
590
    слева направо, сверху вниз.
591
  * Смещение пикселя с координатами (x,y) есть (x+y*xsize)*3.
591
  * Смещение пикселя с координатами (x,y) есть (x+y*xsize)*3.
592
  * Для обновления экрана (после завершения серии команд, работающих с
592
  * Для обновления экрана (после завершения серии команд, работающих с
593
    фоном) вызывайте подфункцию 3 перерисовки фона.
593
    фоном) вызывайте подфункцию 3 перерисовки фона.
594
 
594
 
595
======================================================================
595
======================================================================
596
====================== Функция 15, подфункция 6 ======================
596
====================== Функция 15, подфункция 6 ======================
597
==== Спроецировать данные фона на адресное пространство процесса. ====
597
==== Спроецировать данные фона на адресное пространство процесса. ====
598
======================================================================
598
======================================================================
599
Параметры:
599
Параметры:
600
  * eax = 15 - номер функции
600
  * eax = 15 - номер функции
601
  * ebx = 6 - номер подфункции
601
  * ebx = 6 - номер подфункции
602
Возвращаемое значение:
602
Возвращаемое значение:
603
  * eax = указатель на данные фона, 0 при ошибке
603
  * eax = указатель на данные фона, 0 при ошибке
604
Замечания:
604
Замечания:
605
  * Спроецированные данные доступны на чтение и запись.
605
  * Спроецированные данные доступны на чтение и запись.
606
  * Размер данных фона равен 3*xsize*ysize. Изменение размеров фона
606
  * Размер данных фона равен 3*xsize*ysize. Изменение размеров фона
607
    блокируется на время работы с спроецированными данными.
607
    блокируется на время работы с спроецированными данными.
608
  * Цвет каждого пикселя хранится как 3-байтовая величина BBGGRR.
608
  * Цвет каждого пикселя хранится как 3-байтовая величина BBGGRR.
609
  * Пиксели фонового изображения записываются последовательно
609
  * Пиксели фонового изображения записываются последовательно
610
    слева направо, сверху вниз.
610
    слева направо, сверху вниз.
611
 
611
 
612
======================================================================
612
======================================================================
613
====================== Функция 15, подфункция 7 ======================
613
====================== Функция 15, подфункция 7 ======================
614
=== Закрыть проекцию данных фона на адресное пространство процесса. ==
614
=== Закрыть проекцию данных фона на адресное пространство процесса. ==
615
======================================================================
615
======================================================================
616
Параметры:
616
Параметры:
617
  * eax = 15 - номер функции
617
  * eax = 15 - номер функции
618
  * ebx = 7 - номер подфункции
618
  * ebx = 7 - номер подфункции
619
  * ecx = указатель на данные фона
619
  * ecx = указатель на данные фона
620
Возвращаемое значение:
620
Возвращаемое значение:
621
  * eax = 1 при успехе, 0 при ошибке
621
  * eax = 1 при успехе, 0 при ошибке
622
 
622
 
623
======================================================================
623
======================================================================
624
====================== Функция 15, подфункция 8 ======================
624
====================== Функция 15, подфункция 8 ======================
625
=========== Получить координаты последней отрисовки фона. ============
625
=========== Получить координаты последней отрисовки фона. ============
626
======================================================================
626
======================================================================
627
Параметры:
627
Параметры:
628
  * eax = 15 - номер функции
628
  * eax = 15 - номер функции
629
  * ebx = 8 - номер подфункции
629
  * ebx = 8 - номер подфункции
630
Возвращаемое значение:
630
Возвращаемое значение:
631
  * eax = [left]*65536 + [right]
631
  * eax = [left]*65536 + [right]
632
  * ebx = [top]*65536 + [bottom]
632
  * ebx = [top]*65536 + [bottom]
633
Замечания:
633
Замечания:
634
  * (left,top) - координаты левого верхнего угла,
634
  * (left,top) - координаты левого верхнего угла,
635
    (right,bottom) - координаты правого нижнего.
635
    (right,bottom) - координаты правого нижнего.
636
  * Для получения более достоверных сведений, необходимо вызвать
636
  * Для получения более достоверных сведений, необходимо вызвать
637
    функцию сразу после получения события:
637
    функцию сразу после получения события:
638
             5 = завершилась перерисовка фона рабочего стола
638
             5 = завершилась перерисовка фона рабочего стола
639
 
639
 
640
======================================================================
640
======================================================================
641
====================== Функция 15, подфункция 9 ======================
641
====================== Функция 15, подфункция 9 ======================
642
=============== Перерисовать прямоугольную часть фона. ===============
642
=============== Перерисовать прямоугольную часть фона. ===============
643
======================================================================
643
======================================================================
644
Параметры:
644
Параметры:
645
  * eax = 15 - номер функции
645
  * eax = 15 - номер функции
646
  * ebx = 9 - номер подфункции
646
  * ebx = 9 - номер подфункции
647
  * ecx = [left]*65536 + [right]
647
  * ecx = [left]*65536 + [right]
648
  * edx = [top]*65536 + [bottom]
648
  * edx = [top]*65536 + [bottom]
649
Возвращаемое значение:
649
Возвращаемое значение:
650
  * функция не возвращает значения
650
  * функция не возвращает значения
651
Замечания:
651
Замечания:
652
  * (left,top) - координаты левого верхнего угла,
652
  * (left,top) - координаты левого верхнего угла,
653
    (right,bottom) - координаты правого нижнего.
653
    (right,bottom) - координаты правого нижнего.
654
  * Если параметры установлены некорректно - фон не перерисовывается.
654
  * Если параметры установлены некорректно - фон не перерисовывается.
655
 
655
 
656
======================================================================
656
======================================================================
657
============= Функция 16 - сохранить рамдиск на дискету. =============
657
============= Функция 16 - сохранить рамдиск на дискету. =============
658
======================================================================
658
======================================================================
659
Параметры:
659
Параметры:
660
  * eax = 16 - номер функции
660
  * eax = 16 - номер функции
661
  * ebx = 1 или ebx = 2 - на какую дискету сохранять
661
  * ebx = 1 или ebx = 2 - на какую дискету сохранять
662
Возвращаемое значение:
662
Возвращаемое значение:
663
  * eax = 0 - успешно
663
  * eax = 0 - успешно
664
  * eax = 1 - ошибка
664
  * eax = 1 - ошибка
665
 
665
 
666
======================================================================
666
======================================================================
667
============== Функция 17 - получить код нажатой кнопки. =============
667
============== Функция 17 - получить код нажатой кнопки. =============
668
======================================================================
668
======================================================================
669
Забирает код нажатой кнопки из буфера.
669
Забирает код нажатой кнопки из буфера.
670
Параметры:
670
Параметры:
671
  * eax = 17 - номер функции
671
  * eax = 17 - номер функции
672
Возвращаемое значение:
672
Возвращаемое значение:
673
  * если буфер пуст, возвращается eax=1
673
  * если буфер пуст, возвращается eax=1
674
  * если буфер непуст:
674
  * если буфер непуст:
675
    * старшие 24 бита eax содержат идентификатор кнопки
675
    * старшие 24 бита eax содержат идентификатор кнопки
676
      (в частности, в ah оказывается младший байт идентификатора;
676
      (в частности, в ah оказывается младший байт идентификатора;
677
      если все кнопки имеют идентификатор, меньший 256,
677
      если все кнопки имеют идентификатор, меньший 256,
678
      то для различения достаточно ah)
678
      то для различения достаточно ah)
679
    * al = 0 - кнопка была нажата левой кнопкой мыши
679
    * al = 0 - кнопка была нажата левой кнопкой мыши
680
    * al = бит, соответствующий нажавшей кнопке мыши, если не левой
680
    * al = бит, соответствующий нажавшей кнопке мыши, если не левой
681
Замечания:
681
Замечания:
682
  * "Буфер" хранит только одну кнопку, при нажатии новой кнопки
682
  * "Буфер" хранит только одну кнопку, при нажатии новой кнопки
683
    информация о старой теряется.
683
    информация о старой теряется.
684
  * При вызове этой функции приложением с неактивным окном
684
  * При вызове этой функции приложением с неактивным окном
685
    возвращается ответ "буфер пуст".
685
    возвращается ответ "буфер пуст".
686
  * Возвращаемое значение al соответствует состоянию кнопок мыши
686
  * Возвращаемое значение al соответствует состоянию кнопок мыши
687
    в формате подфункции 2 функции 37 в момент начала нажатия
687
    в формате подфункции 2 функции 37 в момент начала нажатия
688
    на кнопку, за исключением младшего бита (соответствующего левой
688
    на кнопку, за исключением младшего бита (соответствующего левой
689
    кнопке мыши), который сбрасывается.
689
    кнопке мыши), который сбрасывается.
690
======================================================================
690
======================================================================
691
= Функция 18, подфункция 1 - сделать самым нижним окно потока. =======
691
= Функция 18, подфункция 1 - сделать самым нижним окно потока. =======
692
======================================================================
692
======================================================================
693
Параметры:
693
Параметры:
694
  * eax = 18 - номер функции
694
  * eax = 18 - номер функции
695
  * ebx = 1 - номер подфункции
695
  * ebx = 1 - номер подфункции
696
  * ecx = номер слота потока
696
  * ecx = номер слота потока
697
Возвращаемое значение:
697
Возвращаемое значение:
698
  * функция не возвращает значения
698
  * функция не возвращает значения
699
 
699
 
700
======================================================================
700
======================================================================
701
==== Функция 18, подфункция 2 - завершить процесс/поток по слоту. ====
701
==== Функция 18, подфункция 2 - завершить процесс/поток по слоту. ====
702
======================================================================
702
======================================================================
703
Параметры:
703
Параметры:
704
  * eax = 18 - номер функции
704
  * eax = 18 - номер функции
705
  * ebx = 2 - номер подфункции
705
  * ebx = 2 - номер подфункции
706
  * ecx = номер слота процесса/потока
706
  * ecx = номер слота процесса/потока
707
Возвращаемое значение:
707
Возвращаемое значение:
708
  * функция не возвращает значения
708
  * функция не возвращает значения
709
Замечания:
709
Замечания:
710
  * Нельзя завершить поток операционной системы OS/IDLE (номер слота
710
  * Нельзя завершить поток операционной системы OS/IDLE (номер слота
711
    1), можно завершить любой обычный поток/процесс.
711
    1), можно завершить любой обычный поток/процесс.
712
  * Смотри также подфункцию 18 - завершение
712
  * Смотри также подфункцию 18 - завершение
713
    процесса/потока с заданным идентификатором.
713
    процесса/потока с заданным идентификатором.
714
 
714
 
715
======================================================================
715
======================================================================
716
= Функция 18, подфункция 3 - сделать активным окно заданного потока. =
716
= Функция 18, подфункция 3 - сделать активным окно заданного потока. =
717
======================================================================
717
======================================================================
718
Параметры:
718
Параметры:
719
  * eax = 18 - номер функции
719
  * eax = 18 - номер функции
720
  * ebx = 3 - номер подфункции
720
  * ebx = 3 - номер подфункции
721
  * ecx = номер слота потока
721
  * ecx = номер слота потока
722
Возвращаемое значение:
722
Возвращаемое значение:
723
  * функция не возвращает значения
723
  * функция не возвращает значения
724
Замечания:
724
Замечания:
725
  * При указании корректного, но несуществующего слота активизируется
725
  * При указании корректного, но несуществующего слота активизируется
726
    какое-то окно.
726
    какое-то окно.
727
  * Узнать, какое окно является активным, можно вызовом подфункции 7.
727
  * Узнать, какое окно является активным, можно вызовом подфункции 7.
728
 
728
 
729
======================================================================
729
======================================================================
730
 Функция 18, подфункция 4 - получить счётчик пустых тактов в секунду.
730
 Функция 18, подфункция 4 - получить счётчик пустых тактов в секунду.
731
======================================================================
731
======================================================================
732
Под пустыми тактами понимается время, в которое процессор простаивает
732
Под пустыми тактами понимается время, в которое процессор простаивает
733
в ожидании прерывания (в инструкции hlt).
733
в ожидании прерывания (в инструкции hlt).
734
 
734
 
735
Параметры:
735
Параметры:
736
  * eax = 18 - номер функции
736
  * eax = 18 - номер функции
737
  * ebx = 4 - номер подфункции
737
  * ebx = 4 - номер подфункции
738
Возвращаемое значение:
738
Возвращаемое значение:
739
  * eax = значение счётчика пустых тактов в секунду
739
  * eax = значение счётчика пустых тактов в секунду
740
 
740
 
741
======================================================================
741
======================================================================
742
======== Функция 18, подфункция 5 - получить тактовую частоту. =======
742
======== Функция 18, подфункция 5 - получить тактовую частоту. =======
743
======================================================================
743
======================================================================
744
Параметры:
744
Параметры:
745
  * eax = 18 - номер функции
745
  * eax = 18 - номер функции
746
  * ebx = 5 - номер подфункции
746
  * ebx = 5 - номер подфункции
747
Возвращаемое значение:
747
Возвращаемое значение:
748
  * eax = тактовая частота (по модулю 2^32 тактов = 4ГГц)
748
  * eax = тактовая частота (по модулю 2^32 тактов = 4ГГц)
749
 
749
 
750
======================================================================
750
======================================================================
751
 Функция 18, подфункция 6 - сохранить рамдиск в файл на жёстком диске.
751
 Функция 18, подфункция 6 - сохранить рамдиск в файл на жёстком диске.
752
======================================================================
752
======================================================================
753
Параметры:
753
Параметры:
754
  * eax = 18 - номер функции
754
  * eax = 18 - номер функции
755
  * ebx = 6 - номер подфункции
755
  * ebx = 6 - номер подфункции
756
  * ecx = указатель на строку с полным именем файла
756
  * ecx = указатель на строку с полным именем файла
757
    (например, "/hd0/1/kolibri/kolibri.img")
757
    (например, "/hd0/1/kolibri/kolibri.img")
758
Возвращаемое значение:
758
Возвращаемое значение:
759
  * eax = 0 - успешно
759
  * eax = 0 - успешно
760
  * иначе eax = код ошибки файловой системы
760
  * иначе eax = код ошибки файловой системы
761
Замечания:
761
Замечания:
762
  * Все папки в указанном пути должны существовать, иначе вернётся
762
  * Все папки в указанном пути должны существовать, иначе вернётся
763
    значение 5, "файл не найден".
763
    значение 5, "файл не найден".
764
 
764
 
765
======================================================================
765
======================================================================
766
====== Функция 18, подфункция 7 - получить номер активного окна. =====
766
====== Функция 18, подфункция 7 - получить номер активного окна. =====
767
======================================================================
767
======================================================================
768
Параметры:
768
Параметры:
769
  * eax = 18 - номер функции
769
  * eax = 18 - номер функции
770
  * ebx = 7 - номер подфункции
770
  * ebx = 7 - номер подфункции
771
Возвращаемое значение:
771
Возвращаемое значение:
772
  * eax = номер активного окна (номер слота потока, окно которого
772
  * eax = номер активного окна (номер слота потока, окно которого
773
    активно)
773
    активно)
774
Замечания:
774
Замечания:
775
  * Активное окно находится вверху оконного стэка и получает
775
  * Активное окно находится вверху оконного стэка и получает
776
    сообщения обо всём вводе с клавиатуры.
776
    сообщения обо всём вводе с клавиатуры.
777
  * Сделать окно активным можно вызовом подфункции 3.
777
  * Сделать окно активным можно вызовом подфункции 3.
778
 
778
 
779
======================================================================
779
======================================================================
780
==== Функция 18, подфункция 8 - отключить/разрешить звук спикера. ====
780
==== Функция 18, подфункция 8 - отключить/разрешить звук спикера. ====
781
======================================================================
781
======================================================================
782
При отключённом звуке вызовы подфункции 55 функции 55 игнорируются.
782
При отключённом звуке вызовы подфункции 55 функции 55 игнорируются.
783
При включённом - направляются на встроенный спикер.
783
При включённом - направляются на встроенный спикер.
784
 
784
 
785
--------------- Подподфункция 1 - получить состояние. ----------------
785
--------------- Подподфункция 1 - получить состояние. ----------------
786
Параметры:
786
Параметры:
787
  * eax = 18 - номер функции
787
  * eax = 18 - номер функции
788
  * ebx = 8 - номер подфункции
788
  * ebx = 8 - номер подфункции
789
  * ecx = 1 - номер подподфункции
789
  * ecx = 1 - номер подподфункции
790
Возвращаемое значение:
790
Возвращаемое значение:
791
  * eax = 0 - звук спикера разрешён; 1 - запрещён
791
  * eax = 0 - звук спикера разрешён; 1 - запрещён
792
 
792
 
793
-------------- Подподфункция 2 - переключить состояние. --------------
793
-------------- Подподфункция 2 - переключить состояние. --------------
794
Переключает состояния разрешения/запрещения.
794
Переключает состояния разрешения/запрещения.
795
Параметры:
795
Параметры:
796
  * eax = 18 - номер функции
796
  * eax = 18 - номер функции
797
  * ebx = 8 - номер подфункции
797
  * ebx = 8 - номер подфункции
798
  * ecx = 2 - номер подподфункции
798
  * ecx = 2 - номер подподфункции
799
Возвращаемое значение:
799
Возвращаемое значение:
800
  * функция не возвращает значения
800
  * функция не возвращает значения
801
 
801
 
802
======================================================================
802
======================================================================
803
= Функция 18, подфункция 9 - завершение работы системы с параметром. =
803
= Функция 18, подфункция 9 - завершение работы системы с параметром. =
804
======================================================================
804
======================================================================
805
Параметры:
805
Параметры:
806
  * eax = 18 - номер функции
806
  * eax = 18 - номер функции
807
  * ebx = 9 - номер подфункции
807
  * ebx = 9 - номер подфункции
808
  * ecx = параметр:
808
  * ecx = параметр:
809
    * 2 = выключить компьютер
809
    * 2 = выключить компьютер
810
    * 3 = перезагрузить компьютер
810
    * 3 = перезагрузить компьютер
811
    * 4 = перезапустить ядро из файла kernel.mnt на рамдиске
811
    * 4 = перезапустить ядро из файла kernel.mnt на рамдиске
812
Возвращаемое значение:
812
Возвращаемое значение:
813
  * при неверном ecx регистры не меняются (т.е. eax=18)
813
  * при неверном ecx регистры не меняются (т.е. eax=18)
814
  * при правильном вызове всегда возвращается признак успеха eax=0
814
  * при правильном вызове всегда возвращается признак успеха eax=0
815
Замечания:
815
Замечания:
816
  * Не следует полагаться на возвращаемое значение при неверном
816
  * Не следует полагаться на возвращаемое значение при неверном
817
    вызове, оно может измениться в последующих версиях ядра.
817
    вызове, оно может измениться в последующих версиях ядра.
818
 
818
 
819
======================================================================
819
======================================================================
820
========= Функция 18, подфункция 10 - свернуть активное окно. ========
820
========= Функция 18, подфункция 10 - свернуть активное окно. ========
821
======================================================================
821
======================================================================
822
Сворачивает активное окно.
822
Сворачивает активное окно.
823
Параметры:
823
Параметры:
824
  * eax = 18 - номер функции
824
  * eax = 18 - номер функции
825
  * ebx = 10 - номер подфункции
825
  * ebx = 10 - номер подфункции
826
Возвращаемое значение:
826
Возвращаемое значение:
827
  * функция не возвращает значения
827
  * функция не возвращает значения
828
Замечания:
828
Замечания:
829
  * Минимизированное окно с точки зрения функции 9 сохраняет положение
829
  * Минимизированное окно с точки зрения функции 9 сохраняет положение
830
    и размеры.
830
    и размеры.
831
  * Восстановление окна приложения происходит при активизировании
831
  * Восстановление окна приложения происходит при активизировании
832
    подфункцией 3.
832
    подфункцией 3.
833
  * Обычно нет необходимости явно сворачивать/разворачивать своё окно:
833
  * Обычно нет необходимости явно сворачивать/разворачивать своё окно:
834
    сворачивание окна осуществляется системой при нажатии на кнопку
834
    сворачивание окна осуществляется системой при нажатии на кнопку
835
    минимизации (которая для окон со скином определяется автоматически
835
    минимизации (которая для окон со скином определяется автоматически
836
    функцией 0, для окон без скина её можно определить функцией 8),
836
    функцией 0, для окон без скина её можно определить функцией 8),
837
    восстановление - приложением @taskbar.
837
    восстановление - приложением @taskbar.
838
 
838
 
839
======================================================================
839
======================================================================
840
====================== Функция 18, подфункция 11 =====================
840
====================== Функция 18, подфункция 11 =====================
841
============= Получить информацию о дисковой подсистеме. =============
841
============= Получить информацию о дисковой подсистеме. =============
842
======================================================================
842
======================================================================
843
Параметры:
843
Параметры:
844
  * eax = 18 - номер функции
844
  * eax = 18 - номер функции
845
  * ebx = 11 - номер подфункции
845
  * ebx = 11 - номер подфункции
846
  * ecx = тип таблицы:
846
  * ecx = тип таблицы:
847
    * 1 = короткая версия, 16 байт
847
    * 1 = короткая версия, 16 байт
848
  * edx = указатель на буфер (в приложении) для таблицы
848
  * edx = указатель на буфер (в приложении) для таблицы
849
Возвращаемое значение:
849
Возвращаемое значение:
850
  * функция не возвращает значения
850
  * функция не возвращает значения
851
Формат таблицы: короткая версия:
851
Формат таблицы: короткая версия:
852
  * +0: byte: информация о НГМД (дисководах для дискет), AAAABBBB,
852
  * +0: byte: информация о НГМД (дисководах для дискет), AAAABBBB,
853
    где AAAA задаёт тип первого дисковода, BBBB - второго согласно
853
    где AAAA задаёт тип первого дисковода, BBBB - второго согласно
854
    следующему списку:
854
    следующему списку:
855
    * 0 = нет дисковода
855
    * 0 = нет дисковода
856
    * 1 = 360Kb, 5.25''
856
    * 1 = 360Kb, 5.25''
857
    * 2 = 1.2Mb, 5.25''
857
    * 2 = 1.2Mb, 5.25''
858
    * 3 = 720Kb, 3.5''
858
    * 3 = 720Kb, 3.5''
859
    * 4 = 1.44Mb, 3.5''
859
    * 4 = 1.44Mb, 3.5''
860
    * 5 = 2.88Mb, 3.5'' (такие дискеты сейчас уже не используются)
860
    * 5 = 2.88Mb, 3.5'' (такие дискеты сейчас уже не используются)
861
    Например, для стандартной конфигурации из одного 1.44-дисковода
861
    Например, для стандартной конфигурации из одного 1.44-дисковода
862
    здесь будет 40h, а для случая 1.2Mb на A: и 1.44Mb на B:
862
    здесь будет 40h, а для случая 1.2Mb на A: и 1.44Mb на B:
863
    значение оказывается 24h.
863
    значение оказывается 24h.
864
 
864
 
865
  Первый контроллер IDE:
865
  Первый контроллер IDE:
866
  * +1: byte: информация о жёстких дисках и CD-приводах, AABBCCDD,
866
  * +1: byte: информация о жёстких дисках и CD-приводах, AABBCCDD,
867
    где AA соответствует контроллеру IDE0, ..., DD - IDE3:
867
    где AA соответствует контроллеру IDE0, ..., DD - IDE3:
868
    * 0 = устройство отсутствует
868
    * 0 = устройство отсутствует
869
    * 1 = жёсткий диск
869
    * 1 = жёсткий диск
870
    * 2 = CD-привод
870
    * 2 = CD-привод
871
    Например, в случае HD на IDE0 и CD на IDE2 здесь будет 48h.
871
    Например, в случае HD на IDE0 и CD на IDE2 здесь будет 48h.
872
  * +2: 4 db: число найденных разделов на жёстких дисках с
872
  * +2: 4 db: число найденных разделов на жёстких дисках с
873
    соответственно IDE0,...,IDE3.
873
    соответственно IDE0,...,IDE3.
874
 
874
 
875
  Второй контроллер IDE:
875
  Второй контроллер IDE:
876
  * +6: byte: информация о жёстких дисках и CD-приводах, AABBCCDD
876
  * +6: byte: информация о жёстких дисках и CD-приводах, AABBCCDD
877
    где AA соответствует контроллеру IDE4, ..., DD - IDE7:
877
    где AA соответствует контроллеру IDE4, ..., DD - IDE7:
878
    * 0 = устройство отсутствует
878
    * 0 = устройство отсутствует
879
    * 1 = жёсткий диск
879
    * 1 = жёсткий диск
880
    * 2 = CD-привод
880
    * 2 = CD-привод
881
    Например, в случае HD на IDE4 и CD на IDE6 здесь будет 48h.
881
    Например, в случае HD на IDE4 и CD на IDE6 здесь будет 48h.
882
  * +7: 4 db: число найденных разделов на жёстких дисках с
882
  * +7: 4 db: число найденных разделов на жёстких дисках с
883
    соответственно IDE4,...,IDE7.
883
    соответственно IDE4,...,IDE7.
884
 
884
 
885
  Третий контроллер IDE:
885
  Третий контроллер IDE:
886
  * +11: byte: информация о жёстких дисках и CD-приводах, AABBCCDD
886
  * +11: byte: информация о жёстких дисках и CD-приводах, AABBCCDD
887
    где AA соответствует контроллеру IDE8, ..., DD - IDE11:
887
    где AA соответствует контроллеру IDE8, ..., DD - IDE11:
888
    * 0 = устройство отсутствует
888
    * 0 = устройство отсутствует
889
    * 1 = жёсткий диск
889
    * 1 = жёсткий диск
890
    * 2 = CD-привод
890
    * 2 = CD-привод
891
    Например, в случае HD на IDE8 и CD на IDE10 здесь будет 48h.
891
    Например, в случае HD на IDE8 и CD на IDE10 здесь будет 48h.
892
  * +12: 4 db: число найденных разделов на жёстких дисках с
892
  * +12: 4 db: число найденных разделов на жёстких дисках с
893
    соответственно IDE8,...,IDE11.
893
    соответственно IDE8,...,IDE11.
894
 
894
 
895
    При отсутствии жёсткого диска на IDEx соответствующий байт
895
    При отсутствии жёсткого диска на IDEx соответствующий байт
896
    нулевой, при наличии показывает число распознанных разделов,
896
    нулевой, при наличии показывает число распознанных разделов,
897
    которых может и не быть (если носитель не отформатирован или
897
    которых может и не быть (если носитель не отформатирован или
898
    если файловая система не поддерживается). В текущей версии ядра
898
    если файловая система не поддерживается). В текущей версии ядра
899
    для жёстких дисков поддерживаются только FAT12/16/32, NTFS,
899
    для жёстких дисков поддерживаются только FAT12/16/32, NTFS,
900
    ext2/3/4 и XFS.
900
    ext2/3/4 и XFS.
901
 
901
 
902
Замечания:
902
Замечания:
903
  * Таблица может быть использована для получения информации
903
  * Таблица может быть использована для получения информации
904
    об имеющихся устройствах.
904
    об имеющихся устройствах.
905
 
905
 
906
======================================================================
906
======================================================================
907
========== Функция 18, подфункция 13 - получить версию ядра. =========
907
========== Функция 18, подфункция 13 - получить версию ядра. =========
908
======================================================================
908
======================================================================
909
Параметры:
909
Параметры:
910
  * eax = 18 - номер функции
910
  * eax = 18 - номер функции
911
  * ebx = 13 - номер подфункции
911
  * ebx = 13 - номер подфункции
912
  * ecx = указатель на буфер (не менее 16 байт), куда будет помещена
912
  * ecx = указатель на буфер (не менее 16 байт), куда будет помещена
913
    информация
913
    информация
914
Возвращаемое значение:
914
Возвращаемое значение:
915
  * функция не возвращает значения
915
  * функция не возвращает значения
916
Структура буфера:
916
Структура буфера:
917
db a,b,c,d для версии a.b.c.d
917
db a,b,c,d для версии a.b.c.d
918
db 0: зарезервировано
918
db 0: зарезервировано
919
dd REV - номер svn-ревизии ядра
919
dd REV - номер svn-ревизии ядра
920
Для ядра Kolibri 0.7.7.0+:
920
Для ядра Kolibri 0.7.7.0+:
921
db 0,7,7,0
921
db 0,7,7,0
922
db 0
922
db 0
923
dd 1675
923
dd 1675
924
 
924
 
925
======================================================================
925
======================================================================
926
====================== Функция 18, подфункция 14 =====================
926
====================== Функция 18, подфункция 14 =====================
927
======= Ожидать начала обратного хода луча развёртки монитора. =======
927
======= Ожидать начала обратного хода луча развёртки монитора. =======
928
======================================================================
928
======================================================================
929
Параметры:
929
Параметры:
930
  * eax = 18 - номер функции
930
  * eax = 18 - номер функции
931
  * ebx = 14 - номер подфункции
931
  * ebx = 14 - номер подфункции
932
Возвращаемое значение:
932
Возвращаемое значение:
933
  * eax = 0 как признак успеха
933
  * eax = 0 как признак успеха
934
Замечания:
934
Замечания:
935
  * Функция предназначена исключительно для активных
935
  * Функция предназначена исключительно для активных
936
    высокопроизводительных графических приложений; используется для
936
    высокопроизводительных графических приложений; используется для
937
    плавного вывода графики.
937
    плавного вывода графики.
938
 
938
 
939
======================================================================
939
======================================================================
940
== Функция 18, подфункция 15 - поместить курсор мыши в центр экрана. =
940
== Функция 18, подфункция 15 - поместить курсор мыши в центр экрана. =
941
======================================================================
941
======================================================================
942
Параметры:
942
Параметры:
943
  * eax = 18 - номер функции
943
  * eax = 18 - номер функции
944
  * ebx = 15 - номер подфункции
944
  * ebx = 15 - номер подфункции
945
Возвращаемое значение:
945
Возвращаемое значение:
946
  * eax = 0 как признак успеха
946
  * eax = 0 как признак успеха
947
 
947
 
948
======================================================================
948
======================================================================
949
====================== Функция 18, подфункция 16 =====================
949
====================== Функция 18, подфункция 16 =====================
950
============ Получить размер свободной оперативной памяти. ===========
950
============ Получить размер свободной оперативной памяти. ===========
951
======================================================================
951
======================================================================
952
Параметры:
952
Параметры:
953
  * eax = 18 - номер функции
953
  * eax = 18 - номер функции
954
  * ebx = 16 - номер подфункции
954
  * ebx = 16 - номер подфункции
955
Возвращаемое значение:
955
Возвращаемое значение:
956
  * eax = размер свободной памяти в килобайтах
956
  * eax = размер свободной памяти в килобайтах
957
 
957
 
958
======================================================================
958
======================================================================
959
====================== Функция 18, подфункция 17 =====================
959
====================== Функция 18, подфункция 17 =====================
960
============ Получить размер имеющейся оперативной памяти. ===========
960
============ Получить размер имеющейся оперативной памяти. ===========
961
======================================================================
961
======================================================================
962
Параметры:
962
Параметры:
963
  * eax = 18 - номер функции
963
  * eax = 18 - номер функции
964
  * ebx = 17 - номер подфункции
964
  * ebx = 17 - номер подфункции
965
Возвращаемое значение:
965
Возвращаемое значение:
966
  * eax = общий размер имеющейся памяти в килобайтах
966
  * eax = общий размер имеющейся памяти в килобайтах
967
 
967
 
968
======================================================================
968
======================================================================
969
====================== Функция 18, подфункция 18 =====================
969
====================== Функция 18, подфункция 18 =====================
970
============= Завершить процесс/поток по идентификатору. =============
970
============= Завершить процесс/поток по идентификатору. =============
971
======================================================================
971
======================================================================
972
Параметры:
972
Параметры:
973
  * eax = 18 - номер функции
973
  * eax = 18 - номер функции
974
  * ebx = 18 - номер подфункции
974
  * ebx = 18 - номер подфункции
975
  * ecx = идентификатор процесса/потока (PID/TID)
975
  * ecx = идентификатор процесса/потока (PID/TID)
976
Возвращаемое значение:
976
Возвращаемое значение:
977
  * eax = 0 - успешно
977
  * eax = 0 - успешно
978
  * eax = -1 - ошибка (процесс не найден или является системным)
978
  * eax = -1 - ошибка (процесс не найден или является системным)
979
Замечания:
979
Замечания:
980
  * Нельзя завершить поток операционной системы OS/IDLE (номер слота
980
  * Нельзя завершить поток операционной системы OS/IDLE (номер слота
981
    1), можно завершить любой обычный поток/процесс.
981
    1), можно завершить любой обычный поток/процесс.
982
  * Смотри также подфункцию 2 - завершение
982
  * Смотри также подфункцию 2 - завершение
983
    процесса/потока по заданному слоту.
983
    процесса/потока по заданному слоту.
984
 
984
 
985
======================================================================
985
======================================================================
986
=== Функция 18, подфункция 19 - получить/установить настройки мыши. ==
986
=== Функция 18, подфункция 19 - получить/установить настройки мыши. ==
987
======================================================================
987
======================================================================
988
 
988
 
989
------------- Подподфункция 0 - получить скорость мыши. --------------
989
------------- Подподфункция 0 - получить скорость мыши. --------------
990
Параметры:
990
Параметры:
991
  * eax = 18 - номер функции
991
  * eax = 18 - номер функции
992
  * ebx = 19 - номер подфункции
992
  * ebx = 19 - номер подфункции
993
  * ecx = 0 - номер подподфункции
993
  * ecx = 0 - номер подподфункции
994
Возвращаемое значение:
994
Возвращаемое значение:
995
  * eax = текущая скорость мыши
995
  * eax = текущая скорость мыши
996
 
996
 
997
------------ Подподфункция 1 - установить скорость мыши. -------------
997
------------ Подподфункция 1 - установить скорость мыши. -------------
998
Параметры:
998
Параметры:
999
  * eax = 18 - номер функции
999
  * eax = 18 - номер функции
1000
  * ebx = 19 - номер подфункции
1000
  * ebx = 19 - номер подфункции
1001
  * ecx = 1 - номер подподфункции
1001
  * ecx = 1 - номер подподфункции
1002
  * edx = новое значение скорости
1002
  * edx = новое значение скорости
1003
Возвращаемое значение:
1003
Возвращаемое значение:
1004
  * функция не возвращает значения
1004
  * функция не возвращает значения
1005
 
1005
 
1006
------------- Подподфункция 2 - получить задержку мыши. --------------
1006
------------- Подподфункция 2 - получить задержку мыши. --------------
1007
Параметры:
1007
Параметры:
1008
  * eax = 18 - номер функции
1008
  * eax = 18 - номер функции
1009
  * ebx = 19 - номер подфункции
1009
  * ebx = 19 - номер подфункции
1010
  * ecx = 2 - номер подподфункции
1010
  * ecx = 2 - номер подподфункции
1011
Возвращаемое значение:
1011
Возвращаемое значение:
1012
  * eax = текущая задержка мыши
1012
  * eax = текущая задержка мыши
1013
 
1013
 
1014
------------ Подподфункция 3 - установить задержку мыши. -------------
1014
------------ Подподфункция 3 - установить задержку мыши. -------------
1015
Параметры:
1015
Параметры:
1016
  * eax = 18 - номер функции
1016
  * eax = 18 - номер функции
1017
  * ebx = 19 - номер подфункции
1017
  * ebx = 19 - номер подфункции
1018
  * ecx = 3 - номер подподфункции
1018
  * ecx = 3 - номер подподфункции
1019
  * edx = новое значение задержки мыши
1019
  * edx = новое значение задержки мыши
1020
Возвращаемое значение:
1020
Возвращаемое значение:
1021
  * функция не возвращает значения
1021
  * функция не возвращает значения
1022
 
1022
 
1023
-------- Подподфункция 4 - установить положение курсора мыши. --------
1023
-------- Подподфункция 4 - установить положение курсора мыши. --------
1024
Параметры:
1024
Параметры:
1025
  * eax = 18 - номер функции
1025
  * eax = 18 - номер функции
1026
  * ebx = 19 - номер подфункции
1026
  * ebx = 19 - номер подфункции
1027
  * ecx = 4 - номер подподфункции
1027
  * ecx = 4 - номер подподфункции
1028
  * edx = [координата по оси x]*65536 + [координата по оси y]
1028
  * edx = [координата по оси x]*65536 + [координата по оси y]
1029
Возвращаемое значение:
1029
Возвращаемое значение:
1030
  * функция не возвращает значения
1030
  * функция не возвращает значения
1031
 
1031
 
1032
------- Подподфункция 5 - симулировать состояние клавиш мыши. --------
1032
------- Подподфункция 5 - симулировать состояние клавиш мыши. --------
1033
Параметры:
1033
Параметры:
1034
  * eax = 18 - номер функции
1034
  * eax = 18 - номер функции
1035
  * ebx = 19 - номер подфункции
1035
  * ebx = 19 - номер подфункции
1036
  * ecx = 5 - номер подподфункции
1036
  * ecx = 5 - номер подподфункции
1037
  * edx = информация о эмулируемом состоянии кнопок мыши:
1037
  * edx = информация о эмулируемом состоянии кнопок мыши:
1038
    (соответствует возвращаемому значению подфункции 2 функции 37)
1038
    (соответствует возвращаемому значению подфункции 2 функции 37)
1039
    * бит 0 установлен = левая кнопка нажата
1039
    * бит 0 установлен = левая кнопка нажата
1040
    * бит 1 установлен = правая кнопка нажата
1040
    * бит 1 установлен = правая кнопка нажата
1041
    * бит 2 установлен = средняя кнопка нажата
1041
    * бит 2 установлен = средняя кнопка нажата
1042
    * бит 3 установлен = 4-я кнопка нажата
1042
    * бит 3 установлен = 4-я кнопка нажата
1043
    * бит 4 установлен = 5-я кнопка нажата
1043
    * бит 4 установлен = 5-я кнопка нажата
1044
Возвращаемое значение:
1044
Возвращаемое значение:
1045
  * функция не возвращает значения
1045
  * функция не возвращает значения
1046
Замечания:
1046
Замечания:
1047
  * Рекомендуемая скорость мыши (в подподфункции 1) от 1 до 9.
1047
  * Рекомендуемая скорость мыши (в подподфункции 1) от 1 до 9.
1048
    Устанавливаемая величина не проверяется кодом ядра, поэтому
1048
    Устанавливаемая величина не проверяется кодом ядра, поэтому
1049
    используйте осторожно, при некорректном значении курсор может
1049
    используйте осторожно, при некорректном значении курсор может
1050
    "замёрзнуть". Скорость мыши можно регулировать в приложении SETUP.
1050
    "замёрзнуть". Скорость мыши можно регулировать в приложении SETUP.
1051
  * Рекомендуемая величина задержки (в подподфункции 3) = 10.
1051
  * Рекомендуемая величина задержки (в подподфункции 3) = 10.
1052
    Меньшие значения не обрабатываются COM-мышами. При очень больших
1052
    Меньшие значения не обрабатываются COM-мышами. При очень больших
1053
    значениях невозможно передвижение мыши на 1 пиксель и курсор будет
1053
    значениях невозможно передвижение мыши на 1 пиксель и курсор будет
1054
    прыгать на величину установленной скорости (подподфункция 1).
1054
    прыгать на величину установленной скорости (подподфункция 1).
1055
    Устанавливаемая величина не проверяется кодом ядра.
1055
    Устанавливаемая величина не проверяется кодом ядра.
1056
    Величину задержки можно менять в приложении SETUP.
1056
    Величину задержки можно менять в приложении SETUP.
1057
  * Подподфункция 4 не проверяет переданное значение. Перед вызовом
1057
  * Подподфункция 4 не проверяет переданное значение. Перед вызовом
1058
    необходимо узнать текущее разрешение экрана (подфункцией 14)
1058
    необходимо узнать текущее разрешение экрана (подфункцией 14)
1059
    и проверить, что устанавливаемое положение не выходит за пределы
1059
    и проверить, что устанавливаемое положение не выходит за пределы
1060
    экрана.
1060
    экрана.
1061
 
1061
 
1062
======================================================================
1062
======================================================================
1063
====================== Функция 18, подфункция 20 =====================
1063
====================== Функция 18, подфункция 20 =====================
1064
============= Получить информацию об оперативной памяти. =============
1064
============= Получить информацию об оперативной памяти. =============
1065
======================================================================
1065
======================================================================
1066
Параметры:
1066
Параметры:
1067
  * eax = 18 - номер функции
1067
  * eax = 18 - номер функции
1068
  * ebx = 20 - номер подфункции
1068
  * ebx = 20 - номер подфункции
1069
  * ecx = указатель на буфер для информации (36 байт)
1069
  * ecx = указатель на буфер для информации (36 байт)
1070
Возвращаемое значение:
1070
Возвращаемое значение:
1071
  * eax = общий размер имеющейся оперативной памяти в байтах
1071
  * eax = общий размер имеющейся оперативной памяти в байтах
1072
    или -1 в случае ошибки
1072
    или -1 в случае ошибки
1073
  * буфер, на который указывает ecx, содержит следующую информацию:
1073
  * буфер, на который указывает ecx, содержит следующую информацию:
1074
    * +0: dword: общий размер имеющейся оперативной памяти в страницах
1074
    * +0: dword: общий размер имеющейся оперативной памяти в страницах
1075
    * +4:  dword: размер свободной оперативной памяти в страницах
1075
    * +4:  dword: размер свободной оперативной памяти в страницах
1076
    * +8:  dword: число страничных ошибок (исключений #PF)
1076
    * +8:  dword: число страничных ошибок (исключений #PF)
1077
                 в приложениях
1077
                 в приложениях
1078
    * +12: dword: размер кучи ядра в байтах
1078
    * +12: dword: размер кучи ядра в байтах
1079
    * +16: dword: размер свободной памяти в куче ядра в байтах
1079
    * +16: dword: размер свободной памяти в куче ядра в байтах
1080
    * +20: dword: общее количество блоков памяти в куче ядра
1080
    * +20: dword: общее количество блоков памяти в куче ядра
1081
    * +24: dword: количество свободных блоков памяти в куче ядра
1081
    * +24: dword: количество свободных блоков памяти в куче ядра
1082
    * +28: dword: размер наибольшего свободного блока в куче ядра
1082
    * +28: dword: размер наибольшего свободного блока в куче ядра
1083
                 (зарезервировано)
1083
                 (зарезервировано)
1084
    * +32: dword: размер наибольшего выделенного блока в куче ядра
1084
    * +32: dword: размер наибольшего выделенного блока в куче ядра
1085
                 (зарезервировано)
1085
                 (зарезервировано)
1086
 
1086
 
1087
======================================================================
1087
======================================================================
1088
====================== Функция 18, подфункция 21 =====================
1088
====================== Функция 18, подфункция 21 =====================
1089
======= Получить номер слота процесса/потока по идентификатору. ======
1089
======= Получить номер слота процесса/потока по идентификатору. ======
1090
======================================================================
1090
======================================================================
1091
Параметры:
1091
Параметры:
1092
  * eax = 18 - номер функции
1092
  * eax = 18 - номер функции
1093
  * ebx = 21 - номер подфункции
1093
  * ebx = 21 - номер подфункции
1094
  * ecx = идентификатор процесса/потока (PID/TID)
1094
  * ecx = идентификатор процесса/потока (PID/TID)
1095
Возвращаемое значение:
1095
Возвращаемое значение:
1096
  * eax = 0 - ошибка (неверный идентификатор)
1096
  * eax = 0 - ошибка (неверный идентификатор)
1097
  * иначе eax = номер слота
1097
  * иначе eax = номер слота
1098
 
1098
 
1099
======================================================================
1099
======================================================================
1100
 Функция 18, подфункция 22 - операции с окном другого процесса/потока.
1100
 Функция 18, подфункция 22 - операции с окном другого процесса/потока.
1101
======================================================================
1101
======================================================================
1102
Параметры:
1102
Параметры:
1103
  * eax = 18 - номер функции
1103
  * eax = 18 - номер функции
1104
  * ebx = 22 - номер подфункции
1104
  * ebx = 22 - номер подфункции
1105
  * ecx = тип операции:
1105
  * ecx = тип операции:
1106
    * 0 = минимизация окна, поток задан номером слота
1106
    * 0 = минимизация окна, поток задан номером слота
1107
    * 1 = минимизация окна, поток задан идентификатором
1107
    * 1 = минимизация окна, поток задан идентификатором
1108
    * 2 = восстановление окна, поток задан номером слота
1108
    * 2 = восстановление окна, поток задан номером слота
1109
    * 3 = восстановление окна, поток задан идентификатором
1109
    * 3 = восстановление окна, поток задан идентификатором
1110
  * edx = параметр операции (номер слота или PID/TID)
1110
  * edx = параметр операции (номер слота или PID/TID)
1111
Возвращаемое значение:
1111
Возвращаемое значение:
1112
  * eax = 0 - успешно
1112
  * eax = 0 - успешно
1113
  * eax = -1 - ошибка (неправильный параметр)
1113
  * eax = -1 - ошибка (неправильный параметр)
1114
Замечания:
1114
Замечания:
1115
  * Поток может свернуть своё окно вызовом подфункции 10.
1115
  * Поток может свернуть своё окно вызовом подфункции 10.
1116
  * Восстановление окна с одновременной активизацией осуществляется
1116
  * Восстановление окна с одновременной активизацией осуществляется
1117
    подфункции 3 (принимающей номер слота).
1117
    подфункции 3 (принимающей номер слота).
1118
 
1118
 
1119
======================================================================
1119
======================================================================
1120
======= Функция 18, подфункция 23 - минимизировать все окна. =========
1120
======= Функция 18, подфункция 23 - минимизировать все окна. =========
1121
======================================================================
1121
======================================================================
1122
Параметры:
1122
Параметры:
1123
  * eax = 18 - номер функции
1123
  * eax = 18 - номер функции
1124
  * ebx = 23 - номер подфункции
1124
  * ebx = 23 - номер подфункции
1125
Возвращаемое значение:
1125
Возвращаемое значение:
1126
  * eax = 0 - все окна были минимизированы до вызова функции
1126
  * eax = 0 - все окна были минимизированы до вызова функции
1127
  * eax = N - количество окон свернутых функцией
1127
  * eax = N - количество окон свернутых функцией
1128
Замечания:
1128
Замечания:
1129
  * Окна спец. потоков (имя начинается с символа @) не сворачиваются.
1129
  * Окна спец. потоков (имя начинается с символа @) не сворачиваются.
1130
 
1130
 
1131
======================================================================
1131
======================================================================
1132
===== Функция 18, подфункция 24 - установить пределы отрисовки. ======
1132
===== Функция 18, подфункция 24 - установить пределы отрисовки. ======
1133
======================================================================
1133
======================================================================
1134
Параметры:
1134
Параметры:
1135
  * eax = 18 - номер функции
1135
  * eax = 18 - номер функции
1136
  * ebx = 24 - номер подфункции
1136
  * ebx = 24 - номер подфункции
1137
  * ecx = новый размер по X
1137
  * ecx = новый размер по X
1138
  * edx = новый размер по Y
1138
  * edx = новый размер по Y
1139
Возвращаемое значение:
1139
Возвращаемое значение:
1140
  * функция не возвращает значения
1140
  * функция не возвращает значения
1141
Замечания:
1141
Замечания:
1142
  * Функция не меняет физический размер видеорежима. Она предназначена
1142
  * Функция не меняет физический размер видеорежима. Она предназначена
1143
    для нестандартных дисплеев, отображающих изображение частично.
1143
    для нестандартных дисплеев, отображающих изображение частично.
1144
  * Размеры указываемые в функции не должны превышать размеры текущего
1144
  * Размеры указываемые в функции не должны превышать размеры текущего
1145
    видеорежима, иначе функция ничего не изменит.
1145
    видеорежима, иначе функция ничего не изменит.
1146
 
1146
 
1147
======================================================================
1147
======================================================================
-
 
1148
===================== Функция 18, подфункция 25 ======================
-
 
1149
======== Управление положением окна относительно других окон. ========
-
 
1150
======================================================================
-
 
1151
 
-
 
1152
------------- Подподфункция 1 - получить положение  ------------------
-
 
1153
Параметры:
-
 
1154
  * eax = 18 - номер функции
-
 
1155
  * ebx = 25 - номер подфункции
-
 
1156
  * ecx = 1 - номер подподфункции
-
 
1157
  * edx = -1(для текущего окна) или PID приложения
-
 
1158
Возвращаемое значение:
-
 
1159
  * eax = одна из констант положения окна
-
 
1160
 
-
 
1161
------------- Подподфункция 2 - установить положение  ----------------
-
 
1162
Параметры:
-
 
1163
  * eax = 18 - номер функции
-
 
1164
  * ebx = 25 - номер подфункции
-
 
1165
  * ecx = 2 - номер подподфункции
-
 
1166
  * edx = -1(для текущего окна) или PID приложения
-
 
1167
  * esi = новое положение окна (одна из констант ниже)
-
 
1168
Возвращаемое значение:
-
 
1169
  * eax = 0 - неудача
-
 
1170
  * eax = 1 - успех
-
 
1171
 
-
 
1172
Константы положения окна относительно других окон:
-
 
1173
 ZPOS_NORMAL      = 0 - обычное
-
 
1174
 ZPOS_ALWAYS_BACK = 1 - позади всех окон
-
 
1175
 ZPOS_DESKTOP     = 2 - на самом заднем плане
-
 
1176
 ZPOS_ALWAYS_TOP  = 3 - поверх всех окон
-
 
1177
 
-
 
1178
======================================================================
1148
==================== Функция 20 - интерфейс MIDI. ====================
1179
==================== Функция 20 - интерфейс MIDI. ====================
1149
======================================================================
1180
======================================================================
1150
 
1181
 
1151
------------------------ Подфункция 1 - сброс ------------------------
1182
------------------------ Подфункция 1 - сброс ------------------------
1152
Параметры:
1183
Параметры:
1153
  * eax = 20 - номер функции
1184
  * eax = 20 - номер функции
1154
  * ebx = 1 - номер подфункции
1185
  * ebx = 1 - номер подфункции
1155
 
1186
 
1156
-------------------- Подфункция 2 - вывести байт ---------------------
1187
-------------------- Подфункция 2 - вывести байт ---------------------
1157
Параметры:
1188
Параметры:
1158
  * eax = 20 - номер функции
1189
  * eax = 20 - номер функции
1159
  * ebx = 2 - номер подфункции
1190
  * ebx = 2 - номер подфункции
1160
  * cl = байт для вывода
1191
  * cl = байт для вывода
1161
Возвращаемое значение (одинаково для обеих подфункций):
1192
Возвращаемое значение (одинаково для обеих подфункций):
1162
  * eax = 0 - успешно
1193
  * eax = 0 - успешно
1163
  * eax = 1 - не определён базовый порт
1194
  * eax = 1 - не определён базовый порт
1164
Замечания:
1195
Замечания:
1165
  * Предварительно должен быть определён базовый порт вызовом
1196
  * Предварительно должен быть определён базовый порт вызовом
1166
    подфункции 1 функции 21.
1197
    подфункции 1 функции 21.
1167
 
1198
 
1168
======================================================================
1199
======================================================================
1169
==== Функция 21, подфункция 1 - установить базовый порт MPU MIDI. ====
1200
==== Функция 21, подфункция 1 - установить базовый порт MPU MIDI. ====
1170
======================================================================
1201
======================================================================
1171
Параметры:
1202
Параметры:
1172
  * eax = 21 - номер функции
1203
  * eax = 21 - номер функции
1173
  * ebx = 1 - номер подфункции
1204
  * ebx = 1 - номер подфункции
1174
  * ecx = номер базового порта
1205
  * ecx = номер базового порта
1175
Возвращаемое значение:
1206
Возвращаемое значение:
1176
  * eax = 0 - успешно
1207
  * eax = 0 - успешно
1177
  * eax = -1 - ошибочный номер порта
1208
  * eax = -1 - ошибочный номер порта
1178
Замечания:
1209
Замечания:
1179
  * Номер порта должен удовлетворять условиям 0x100<=ecx<=0xFFFF.
1210
  * Номер порта должен удовлетворять условиям 0x100<=ecx<=0xFFFF.
1180
  * Установка базы нужна для работы функции 20.
1211
  * Установка базы нужна для работы функции 20.
1181
  * Получить установленный базовый порт можно вызовом
1212
  * Получить установленный базовый порт можно вызовом
1182
    подфункции 1 функции 26.
1213
    подфункции 1 функции 26.
1183
 
1214
 
1184
======================================================================
1215
======================================================================
1185
===== Функция 21, подфункция 2 - установить раскладку клавиатуры. ====
1216
===== Функция 21, подфункция 2 - установить раскладку клавиатуры. ====
1186
======================================================================
1217
======================================================================
1187
Раскладка клавиатуры используется для преобразования сканкодов,
1218
Раскладка клавиатуры используется для преобразования сканкодов,
1188
поступающих от клавиатуры, в ASCII-коды, считываемые функцией 2.
1219
поступающих от клавиатуры, в ASCII-коды, считываемые функцией 2.
1189
Параметры:
1220
Параметры:
1190
  * eax = 21 - номер функции
1221
  * eax = 21 - номер функции
1191
  * ebx = 2 - номер подфункции
1222
  * ebx = 2 - номер подфункции
1192
  * ecx = какую раскладку устанавливать:
1223
  * ecx = какую раскладку устанавливать:
1193
    * 1 = нормальную
1224
    * 1 = нормальную
1194
    * 2 = раскладку при нажатом Shift
1225
    * 2 = раскладку при нажатом Shift
1195
    * 3 = раскладку при нажатом Alt
1226
    * 3 = раскладку при нажатом Alt
1196
  * edx = указатель на раскладку - таблицу длиной 128 байт
1227
  * edx = указатель на раскладку - таблицу длиной 128 байт
1197
Или:
1228
Или:
1198
  * ecx = 9
1229
  * ecx = 9
1199
  * dx = идентификатор страны (1=eng, 2=fi, 3=ger, 4=rus)
1230
  * dx = идентификатор страны (1=eng, 2=fi, 3=ger, 4=rus)
1200
Возвращаемое значение:
1231
Возвращаемое значение:
1201
  * eax = 0 - успешно
1232
  * eax = 0 - успешно
1202
  * eax = 1 - параметр задан неверно
1233
  * eax = 1 - параметр задан неверно
1203
Замечания:
1234
Замечания:
1204
  * Если нажат Alt, то используется раскладка с Alt;
1235
  * Если нажат Alt, то используется раскладка с Alt;
1205
    если не нажат Alt, но нажат Shift, то
1236
    если не нажат Alt, но нажат Shift, то
1206
    используется раскладка с Shift;
1237
    используется раскладка с Shift;
1207
    если не нажаты Alt и Shift, но нажат Ctrl, то используется
1238
    если не нажаты Alt и Shift, но нажат Ctrl, то используется
1208
    нормальная раскладка, после чего из кода вычитается 0x60;
1239
    нормальная раскладка, после чего из кода вычитается 0x60;
1209
    если не нажата ни одна из управляющих клавиш, то используется
1240
    если не нажата ни одна из управляющих клавиш, то используется
1210
    нормальная раскладка.
1241
    нормальная раскладка.
1211
  * Получить раскладки и идентификатор страны можно с помощью
1242
  * Получить раскладки и идентификатор страны можно с помощью
1212
    подфункции 2 функции 26.
1243
    подфункции 2 функции 26.
1213
  * Идентификатор страны - глобальная системная переменная, которая
1244
  * Идентификатор страны - глобальная системная переменная, которая
1214
    самим ядром не используется; однако приложение @taskbar отображает
1245
    самим ядром не используется; однако приложение @taskbar отображает
1215
    соответствующую текущей стране иконку.
1246
    соответствующую текущей стране иконку.
1216
  * Приложение @taskbar переключает раскладки по запросу пользователя.
1247
  * Приложение @taskbar переключает раскладки по запросу пользователя.
1217
 
1248
 
1218
======================================================================
1249
======================================================================
1219
========= Функция 21, подфункция 5 - установить язык системы. ========
1250
========= Функция 21, подфункция 5 - установить язык системы. ========
1220
======================================================================
1251
======================================================================
1221
Параметры:
1252
Параметры:
1222
  * eax = 21 - номер функции
1253
  * eax = 21 - номер функции
1223
  * ebx = 5 - номер подфункции
1254
  * ebx = 5 - номер подфункции
1224
  * ecx = язык системы (1=eng, 2=fi, 3=ger, 4=rus)
1255
  * ecx = язык системы (1=eng, 2=fi, 3=ger, 4=rus)
1225
Возвращаемое значение:
1256
Возвращаемое значение:
1226
  * eax = 0
1257
  * eax = 0
1227
Замечания:
1258
Замечания:
1228
  * Язык системы - глобальная системная переменная, никак
1259
  * Язык системы - глобальная системная переменная, никак
1229
    не используемая самим ядром, однако приложение @taskbar рисует
1260
    не используемая самим ядром, однако приложение @taskbar рисует
1230
    соответствующую иконку.
1261
    соответствующую иконку.
1231
  * Проверок на корректность не делается, поскольку ядро эту
1262
  * Проверок на корректность не делается, поскольку ядро эту
1232
    переменную не использует.
1263
    переменную не использует.
1233
  * Получить язык системы можно вызовом подфункции 5 функции 26.
1264
  * Получить язык системы можно вызовом подфункции 5 функции 26.
1234
 
1265
 
1235
======================================================================
1266
======================================================================
1236
====================== Функция 21, подфункция 11 =====================
1267
====================== Функция 21, подфункция 11 =====================
1237
=========== Разрешить/запретить низкоуровневый доступ к HD. ==========
1268
=========== Разрешить/запретить низкоуровневый доступ к HD. ==========
1238
======================================================================
1269
======================================================================
1239
Параметры:
1270
Параметры:
1240
  * eax = 21 - номер функции
1271
  * eax = 21 - номер функции
1241
  * ebx = 11 - номер подфункции
1272
  * ebx = 11 - номер подфункции
1242
  * ecx = 0/1 - запретить/разрешить
1273
  * ecx = 0/1 - запретить/разрешить
1243
Возвращаемое значение:
1274
Возвращаемое значение:
1244
  * eax = 0
1275
  * eax = 0
1245
Замечания:
1276
Замечания:
1246
  * Используется при LBA-чтении (подфункция 8 функции 58).
1277
  * Используется при LBA-чтении (подфункция 8 функции 58).
1247
  * Текущая реализация использует только младший бит ecx.
1278
  * Текущая реализация использует только младший бит ecx.
1248
  * Получить текущее состояние можно вызовом подфункции 11 функции 26.
1279
  * Получить текущее состояние можно вызовом подфункции 11 функции 26.
1249
 
1280
 
1250
======================================================================
1281
======================================================================
1251
====================== Функция 21, подфункция 12 =====================
1282
====================== Функция 21, подфункция 12 =====================
1252
========== Разрешить/запретить низкоуровневый доступ к PCI. ==========
1283
========== Разрешить/запретить низкоуровневый доступ к PCI. ==========
1253
======================================================================
1284
======================================================================
1254
Параметры:
1285
Параметры:
1255
  * eax = 21 - номер функции
1286
  * eax = 21 - номер функции
1256
  * ebx = 12 - номер подфункции
1287
  * ebx = 12 - номер подфункции
1257
  * ecx = 0/1 - запретить/разрешить
1288
  * ecx = 0/1 - запретить/разрешить
1258
Возвращаемое значение:
1289
Возвращаемое значение:
1259
  * eax = 0
1290
  * eax = 0
1260
Замечания:
1291
Замечания:
1261
  * Используется при работе с шиной PCI (функция 62).
1292
  * Используется при работе с шиной PCI (функция 62).
1262
  * Текущая реализация использует только младший бит ecx.
1293
  * Текущая реализация использует только младший бит ecx.
1263
  * Получить текущее состояние можно вызовом подфункции 12 функции 26.
1294
  * Получить текущее состояние можно вызовом подфункции 12 функции 26.
1264
 
1295
 
1265
======================================================================
1296
======================================================================
1266
============ Функция 22 - установить системную дату/время. ===========
1297
============ Функция 22 - установить системную дату/время. ===========
1267
======================================================================
1298
======================================================================
1268
Параметры:
1299
Параметры:
1269
  * eax = 22 - номер функции
1300
  * eax = 22 - номер функции
1270
  * ebx = 0 - установить время
1301
  * ebx = 0 - установить время
1271
    * ecx = 0x00SSMMHH - время в двоично-десятичном коде (BCD):
1302
    * ecx = 0x00SSMMHH - время в двоично-десятичном коде (BCD):
1272
    * HH=час 00..23
1303
    * HH=час 00..23
1273
    * MM=минута 00..59
1304
    * MM=минута 00..59
1274
    * SS=секунда 00..59
1305
    * SS=секунда 00..59
1275
  * ebx = 1 - установить дату
1306
  * ebx = 1 - установить дату
1276
    * ecx = 0x00DDMMYY - дата в двоично-десятичном коде (BCD):
1307
    * ecx = 0x00DDMMYY - дата в двоично-десятичном коде (BCD):
1277
    * DD=день 01..31
1308
    * DD=день 01..31
1278
    * MM=месяц 01..12
1309
    * MM=месяц 01..12
1279
    * YY=год 00..99
1310
    * YY=год 00..99
1280
  * ebx = 2 - установить день недели
1311
  * ebx = 2 - установить день недели
1281
    * ecx = 1 для воскресенья, ..., 7 для субботы
1312
    * ecx = 1 для воскресенья, ..., 7 для субботы
1282
  * ebx = 3 - установить будильник
1313
  * ebx = 3 - установить будильник
1283
    * ecx = 0x00SSMMHH
1314
    * ecx = 0x00SSMMHH
1284
Возвращаемое значение:
1315
Возвращаемое значение:
1285
  * eax = 0 - успешно
1316
  * eax = 0 - успешно
1286
  * eax = 1 - параметр задан неверно
1317
  * eax = 1 - параметр задан неверно
1287
  * eax = 2 - CMOS-батарейки разрядились
1318
  * eax = 2 - CMOS-батарейки разрядились
1288
Замечания:
1319
Замечания:
1289
  * Ценность установки дня недели представляется сомнительной,
1320
  * Ценность установки дня недели представляется сомнительной,
1290
    поскольку он мало где используется
1321
    поскольку он мало где используется
1291
    (день недели можно рассчитать по дате).
1322
    (день недели можно рассчитать по дате).
1292
  * Будильник можно установить на срабатывание в заданное время
1323
  * Будильник можно установить на срабатывание в заданное время
1293
    каждые сутки. При этом отключить его существующими системными
1324
    каждые сутки. При этом отключить его существующими системными
1294
    функциями нельзя.
1325
    функциями нельзя.
1295
  * Срабатывание будильника заключается в генерации IRQ8.
1326
  * Срабатывание будильника заключается в генерации IRQ8.
1296
  * Вообще-то CMOS поддерживает для будильника установку значения
1327
  * Вообще-то CMOS поддерживает для будильника установку значения
1297
    0xFF в качестве одного из параметров и означает это, что
1328
    0xFF в качестве одного из параметров и означает это, что
1298
    соответствующий параметр игнорируется. Но в текущей реализации
1329
    соответствующий параметр игнорируется. Но в текущей реализации
1299
    это не пройдёт (вернётся значение 1).
1330
    это не пройдёт (вернётся значение 1).
1300
  * Будильник - глобальный системный ресурс; установка будильника
1331
  * Будильник - глобальный системный ресурс; установка будильника
1301
    автоматически отменяет предыдущую установку. Впрочем, на данный
1332
    автоматически отменяет предыдущую установку. Впрочем, на данный
1302
    момент ни одна программа его не использует.
1333
    момент ни одна программа его не использует.
1303
 
1334
 
1304
======================================================================
1335
======================================================================
1305
============== Функция 23 - ожидать события с таймаутом. =============
1336
============== Функция 23 - ожидать события с таймаутом. =============
1306
======================================================================
1337
======================================================================
1307
Если очередь сообщений пуста, ждёт появления сообщения в очереди,
1338
Если очередь сообщений пуста, ждёт появления сообщения в очереди,
1308
но не более указанного времени. Затем считывает сообщение из очереди.
1339
но не более указанного времени. Затем считывает сообщение из очереди.
1309
 
1340
 
1310
Параметры:
1341
Параметры:
1311
  * eax = 23 - номер функции
1342
  * eax = 23 - номер функции
1312
  * ebx = таймаут (в сотых долях секунды)
1343
  * ebx = таймаут (в сотых долях секунды)
1313
Возвращаемое значение:
1344
Возвращаемое значение:
1314
  * eax = 0 - очередь сообщений пуста
1345
  * eax = 0 - очередь сообщений пуста
1315
  * иначе eax = событие (смотри список событий)
1346
  * иначе eax = событие (смотри список событий)
1316
Замечания:
1347
Замечания:
1317
  * Учитываются только те события, которые входят в маску,
1348
  * Учитываются только те события, которые входят в маску,
1318
    устанавливаемую функцией 40. По умолчанию это события
1349
    устанавливаемую функцией 40. По умолчанию это события
1319
    перерисовки, нажатия на клавиши и на кнопки.
1350
    перерисовки, нажатия на клавиши и на кнопки.
1320
  * Для проверки, есть ли сообщение в очереди, используйте функцию 11.
1351
  * Для проверки, есть ли сообщение в очереди, используйте функцию 11.
1321
    Чтобы ждать сколь угодно долго, используйте функцию 10.
1352
    Чтобы ждать сколь угодно долго, используйте функцию 10.
1322
  * Передача ebx=0 приводит к моментальному возвращению eax=0.
1353
  * Передача ebx=0 приводит к моментальному возвращению eax=0.
1323
  * При текущей реализации произойдёт немедленный возврат из функции
1354
  * При текущей реализации произойдёт немедленный возврат из функции
1324
    с eax=0, если сложение ebx с текущим значением счётчика времени
1355
    с eax=0, если сложение ebx с текущим значением счётчика времени
1325
    вызовет 32-битное переполнение.
1356
    вызовет 32-битное переполнение.
1326
 
1357
 
1327
======================================================================
1358
======================================================================
1328
======= Функция 24, подфункция 4 - извлечь лоток привода диска. ======
1359
======= Функция 24, подфункция 4 - извлечь лоток привода диска. ======
1329
======================================================================
1360
======================================================================
1330
Параметры:
1361
Параметры:
1331
  * eax = 24 - номер функции
1362
  * eax = 24 - номер функции
1332
  * ebx = 4 - номер подфункции
1363
  * ebx = 4 - номер подфункции
1333
  * ecx = номер CD/DVD-диска
1364
  * ecx = номер CD/DVD-диска
1334
    от 0=Primary Master до 3=Secondary Slave для первого IDE контр.
1365
    от 0=Primary Master до 3=Secondary Slave для первого IDE контр.
1335
    от 4=Primary Master до 7=Secondary Slave для второго IDE контр.
1366
    от 4=Primary Master до 7=Secondary Slave для второго IDE контр.
1336
    от 8=Primary Master до 11=Secondary Slave для третьего IDE контр.
1367
    от 8=Primary Master до 11=Secondary Slave для третьего IDE контр.
1337
Возвращаемое значение:
1368
Возвращаемое значение:
1338
  * функция не возвращает значения
1369
  * функция не возвращает значения
1339
Замечания:
1370
Замечания:
1340
  * Функция поддерживается только для ATAPI-устройств (CD и DVD).
1371
  * Функция поддерживается только для ATAPI-устройств (CD и DVD).
1341
  * При извлечении лотка производится разблокировка ручного управления
1372
  * При извлечении лотка производится разблокировка ручного управления
1342
    механизмом лотка.
1373
    механизмом лотка.
1343
  * При извлечении лотка код производит очистку кэша соответствующего
1374
  * При извлечении лотка код производит очистку кэша соответствующего
1344
    устройства.
1375
    устройства.
1345
  * Примером использования функции является приложение CD_tray.
1376
  * Примером использования функции является приложение CD_tray.
1346
 
1377
 
1347
======================================================================
1378
======================================================================
1348
====== Функция 24, подфункция 5 - загрузить лоток привода диска. =====
1379
====== Функция 24, подфункция 5 - загрузить лоток привода диска. =====
1349
======================================================================
1380
======================================================================
1350
Параметры:
1381
Параметры:
1351
  * eax = 24 - номер функции
1382
  * eax = 24 - номер функции
1352
  * ebx = 5 - номер подфункции
1383
  * ebx = 5 - номер подфункции
1353
  * ecx = номер CD/DVD-диска
1384
  * ecx = номер CD/DVD-диска
1354
    от 0=Primary Master до 3=Secondary Slave для первого IDE контр.
1385
    от 0=Primary Master до 3=Secondary Slave для первого IDE контр.
1355
    от 4=Primary Master до 7=Secondary Slave для второго IDE контр.
1386
    от 4=Primary Master до 7=Secondary Slave для второго IDE контр.
1356
    от 8=Primary Master до 11=Secondary Slave для третьего IDE контр.
1387
    от 8=Primary Master до 11=Secondary Slave для третьего IDE контр.
1357
Возвращаемое значение:
1388
Возвращаемое значение:
1358
  * функция не возвращает значения
1389
  * функция не возвращает значения
1359
Замечания:
1390
Замечания:
1360
  * Функция поддерживается только для ATAPI-устройств (CD и DVD).
1391
  * Функция поддерживается только для ATAPI-устройств (CD и DVD).
1361
  * Примером использования функции является приложение CD_tray.
1392
  * Примером использования функции является приложение CD_tray.
1362
 
1393
 
1363
======================================================================
1394
======================================================================
1364
========== Функция 25 - записать область на слой фона. ===============
1395
========== Функция 25 - записать область на слой фона. ===============
1365
======================================================================
1396
======================================================================
1366
Параметры:
1397
Параметры:
1367
  * eax = 25 - номер функции
1398
  * eax = 25 - номер функции
1368
  * ebx = указатель на предварительно выделенную область памяти,
1399
  * ebx = указатель на предварительно выделенную область памяти,
1369
      где размещено исходное изображение в формате BBGGRRTTBBGGRRTT...
1400
      где размещено исходное изображение в формате BBGGRRTTBBGGRRTT...
1370
  * ecx = [размер по оси x]*65536 + [размер по оси y]
1401
  * ecx = [размер по оси x]*65536 + [размер по оси y]
1371
  * edx = [координата по оси x]*65536 + [координата по оси y]
1402
  * edx = [координата по оси x]*65536 + [координата по оси y]
1372
Возвращаемое значение:
1403
Возвращаемое значение:
1373
  * функция не возвращает значения
1404
  * функция не возвращает значения
1374
Замечания:
1405
Замечания:
1375
  * Координаты области - это координаты верхнего левого угла
1406
  * Координаты области - это координаты верхнего левого угла
1376
    области относительно экрана.
1407
    области относительно экрана.
1377
  * Размер изображения в байтах есть 4*xsize*ysize.
1408
  * Размер изображения в байтах есть 4*xsize*ysize.
1378
  * TT - байт указатель прозрачности, в настоящее время:
1409
  * TT - байт указатель прозрачности, в настоящее время:
1379
         от 1 до FF - непрозрачно, от 0 - прозрачно.
1410
         от 1 до FF - непрозрачно, от 0 - прозрачно.
1380
  * Функция размещает изображение не на фоновое изображение (ф.15),
1411
  * Функция размещает изображение не на фоновое изображение (ф.15),
1381
    а напрямую в LFB. Опции ф.15 для ф. 25 не имеют смысла.
1412
    а напрямую в LFB. Опции ф.15 для ф. 25 не имеют смысла.
1382
 
1413
 
1383
======================================================================
1414
======================================================================
1384
===== Функция 26, подфункция 1 - получить базовый порт MPU MIDI. =====
1415
===== Функция 26, подфункция 1 - получить базовый порт MPU MIDI. =====
1385
======================================================================
1416
======================================================================
1386
Параметры:
1417
Параметры:
1387
  * eax = 26 - номер функции
1418
  * eax = 26 - номер функции
1388
  * ebx = 1 - номер подфункции
1419
  * ebx = 1 - номер подфункции
1389
Возвращаемое значение:
1420
Возвращаемое значение:
1390
  * eax = номер порта
1421
  * eax = номер порта
1391
Замечания:
1422
Замечания:
1392
  * Установить базовый порт можно вызовом
1423
  * Установить базовый порт можно вызовом
1393
    подфункции 1 функции 21.
1424
    подфункции 1 функции 21.
1394
 
1425
 
1395
======================================================================
1426
======================================================================
1396
====== Функция 26, подфункция 2 - получить раскладку клавиатуры. =====
1427
====== Функция 26, подфункция 2 - получить раскладку клавиатуры. =====
1397
======================================================================
1428
======================================================================
1398
Раскладка клавиатуры используется для преобразования сканкодов,
1429
Раскладка клавиатуры используется для преобразования сканкодов,
1399
поступающих от клавиатуры, в ASCII-коды, считываемые функцией 2.
1430
поступающих от клавиатуры, в ASCII-коды, считываемые функцией 2.
1400
Параметры:
1431
Параметры:
1401
  * eax = 26 - номер функции
1432
  * eax = 26 - номер функции
1402
  * ebx = 2 - номер подфункции
1433
  * ebx = 2 - номер подфункции
1403
  * ecx = какую раскладку получать:
1434
  * ecx = какую раскладку получать:
1404
    * 1 = нормальную
1435
    * 1 = нормальную
1405
    * 2 = раскладку при нажатом Shift
1436
    * 2 = раскладку при нажатом Shift
1406
    * 3 = раскладку при нажатом Alt
1437
    * 3 = раскладку при нажатом Alt
1407
  * edx = указатель на буфер длиной 128 байт, куда будет скопирована
1438
  * edx = указатель на буфер длиной 128 байт, куда будет скопирована
1408
    раскладка
1439
    раскладка
1409
Возвращаемое значение:
1440
Возвращаемое значение:
1410
  * функция не возвращает значения
1441
  * функция не возвращает значения
1411
Или:
1442
Или:
1412
  * eax = 26 - номер функции
1443
  * eax = 26 - номер функции
1413
  * ebx = 2 - номер подфункции
1444
  * ebx = 2 - номер подфункции
1414
  * ecx = 9
1445
  * ecx = 9
1415
Возвращаемое значение:
1446
Возвращаемое значение:
1416
  * eax = идентификатор страны (1=eng, 2=fi, 3=ger, 4=rus)
1447
  * eax = идентификатор страны (1=eng, 2=fi, 3=ger, 4=rus)
1417
Замечания:
1448
Замечания:
1418
  * Если нажат Alt, то используется раскладка с Alt;
1449
  * Если нажат Alt, то используется раскладка с Alt;
1419
    если не нажат Alt, но нажат Shift, то используется
1450
    если не нажат Alt, но нажат Shift, то используется
1420
    раскладка с Shift;
1451
    раскладка с Shift;
1421
    если не нажаты Alt и Shift, но нажат Ctrl, то используется
1452
    если не нажаты Alt и Shift, но нажат Ctrl, то используется
1422
    нормальная раскладка, после чего из кода вычитается 0x60;
1453
    нормальная раскладка, после чего из кода вычитается 0x60;
1423
    если не нажата ни одна из управляющих клавиш, то используется
1454
    если не нажата ни одна из управляющих клавиш, то используется
1424
    нормальная раскладка.
1455
    нормальная раскладка.
1425
  * Установить раскладки и идентификатор страны можно с помощью
1456
  * Установить раскладки и идентификатор страны можно с помощью
1426
    подфункции 2 функции 21.
1457
    подфункции 2 функции 21.
1427
  * Идентификатор страны - глобальная системная переменная, которая
1458
  * Идентификатор страны - глобальная системная переменная, которая
1428
    самим ядром не используется; однако приложение @taskbar отображает
1459
    самим ядром не используется; однако приложение @taskbar отображает
1429
    соответствующую текущей стране иконку
1460
    соответствующую текущей стране иконку
1430
    (используя описываемую функцию).
1461
    (используя описываемую функцию).
1431
  * Приложение @taskbar переключает раскладки по запросу пользователя.
1462
  * Приложение @taskbar переключает раскладки по запросу пользователя.
1432
 
1463
 
1433
======================================================================
1464
======================================================================
1434
========== Функция 26, подфункция 5 - получить язык системы. =========
1465
========== Функция 26, подфункция 5 - получить язык системы. =========
1435
======================================================================
1466
======================================================================
1436
Параметры:
1467
Параметры:
1437
  * eax = 26 - номер функции
1468
  * eax = 26 - номер функции
1438
  * ebx = 5 - номер подфункции
1469
  * ebx = 5 - номер подфункции
1439
Возвращаемое значение:
1470
Возвращаемое значение:
1440
  * eax = язык системы (1=eng, 2=fi, 3=ger, 4=rus)
1471
  * eax = язык системы (1=eng, 2=fi, 3=ger, 4=rus)
1441
Замечания:
1472
Замечания:
1442
  * Язык системы - глобальная системная переменная, никак
1473
  * Язык системы - глобальная системная переменная, никак
1443
    не используемая самим ядром, однако приложение @taskbar рисует
1474
    не используемая самим ядром, однако приложение @taskbar рисует
1444
    соответствующую иконку (используя описываемую функцию).
1475
    соответствующую иконку (используя описываемую функцию).
1445
  * Установить язык системы можно вызовом подфункции 5 функции 21.
1476
  * Установить язык системы можно вызовом подфункции 5 функции 21.
1446
 
1477
 
1447
======================================================================
1478
======================================================================
1448
=== Функция 26, подфункция 9 - получить значение счётчика времени. ===
1479
=== Функция 26, подфункция 9 - получить значение счётчика времени. ===
1449
======================================================================
1480
======================================================================
1450
Параметры:
1481
Параметры:
1451
  * eax = 26 - номер функции
1482
  * eax = 26 - номер функции
1452
  * ebx = 9 - номер подфункции
1483
  * ebx = 9 - номер подфункции
1453
Возвращаемое значение:
1484
Возвращаемое значение:
1454
  * eax = число сотых долей секунды, прошедших с момента
1485
  * eax = число сотых долей секунды, прошедших с момента
1455
    запуска системы
1486
    запуска системы
1456
Замечания:
1487
Замечания:
1457
  * Счётчик берётся по модулю 2^32, что соответствует немногим более
1488
  * Счётчик берётся по модулю 2^32, что соответствует немногим более
1458
    497 суток.
1489
    497 суток.
1459
  * Системное время можно получить функцией 3.
1490
  * Системное время можно получить функцией 3.
1460
 
1491
 
1461
======================================================================
1492
======================================================================
1462
===================== Функция 26, подфункция 10 ======================
1493
===================== Функция 26, подфункция 10 ======================
1463
========== Получить значение высокоточного счётчика времени. =========
1494
========== Получить значение высокоточного счётчика времени. =========
1464
======================================================================
1495
======================================================================
1465
Parameters:
1496
Parameters:
1466
  * eax = 26 - номер функции
1497
  * eax = 26 - номер функции
1467
  * ebx = 10 - номер подфункции
1498
  * ebx = 10 - номер подфункции
1468
Returned value:
1499
Returned value:
1469
  * edx:eax = число наносекунд с момента загрузки ядра
1500
  * edx:eax = число наносекунд с момента загрузки ядра
1470
  * eax = младшее двойное слово
1501
  * eax = младшее двойное слово
1471
  * edx = старшее двойное слово  
1502
  * edx = старшее двойное слово  
1472
Remarks:
1503
Remarks:
1473
  * функция использует счётчик HPET, если HPET не доступен используется
1504
  * функция использует счётчик HPET, если HPET не доступен используется
1474
    счётчик PIT. В этом случае точность будет уменьшена до 10 000 000
1505
    счётчик PIT. В этом случае точность будет уменьшена до 10 000 000
1475
    наносекунд.
1506
    наносекунд.
1476
 
1507
 
1477
======================================================================
1508
======================================================================
1478
====================== Функция 26, подфункция 11 =====================
1509
====================== Функция 26, подфункция 11 =====================
1479
=========== Узнать, разрешён ли низкоуровневый доступ к HD. ==========
1510
=========== Узнать, разрешён ли низкоуровневый доступ к HD. ==========
1480
======================================================================
1511
======================================================================
1481
Параметры:
1512
Параметры:
1482
  * eax = 26 - номер функции
1513
  * eax = 26 - номер функции
1483
  * ebx = 11 - номер подфункции
1514
  * ebx = 11 - номер подфункции
1484
Возвращаемое значение:
1515
Возвращаемое значение:
1485
  * eax = 0/1 - запрещён/разрешён
1516
  * eax = 0/1 - запрещён/разрешён
1486
Замечания:
1517
Замечания:
1487
  * Используется при LBA-чтении (подфункция 8 функции 58).
1518
  * Используется при LBA-чтении (подфункция 8 функции 58).
1488
  * Установить текущее состояние можно вызовом
1519
  * Установить текущее состояние можно вызовом
1489
    подфункции 11 функции 21.
1520
    подфункции 11 функции 21.
1490
 
1521
 
1491
======================================================================
1522
======================================================================
1492
====================== Функция 26, подфункция 12 =====================
1523
====================== Функция 26, подфункция 12 =====================
1493
========== Узнать, разрешён ли низкоуровневый доступ к PCI. ==========
1524
========== Узнать, разрешён ли низкоуровневый доступ к PCI. ==========
1494
======================================================================
1525
======================================================================
1495
Параметры:
1526
Параметры:
1496
  * eax = 26 - номер функции
1527
  * eax = 26 - номер функции
1497
  * ebx = 12 - номер подфункции
1528
  * ebx = 12 - номер подфункции
1498
Возвращаемое значение:
1529
Возвращаемое значение:
1499
  * eax = 0/1 - запрещён/разрешён
1530
  * eax = 0/1 - запрещён/разрешён
1500
Замечания:
1531
Замечания:
1501
  * Используется при работе с шиной PCI (функция 62).
1532
  * Используется при работе с шиной PCI (функция 62).
1502
  * Текущая реализация использует только младший бит ecx.
1533
  * Текущая реализация использует только младший бит ecx.
1503
  * Установить текущее состояние можно вызовом
1534
  * Установить текущее состояние можно вызовом
1504
    подфункции 12 функции 21.
1535
    подфункции 12 функции 21.
1505
 
1536
 
1506
======================================================================
1537
======================================================================
1507
================ Функция 29 - получить системную дату. ===============
1538
================ Функция 29 - получить системную дату. ===============
1508
======================================================================
1539
======================================================================
1509
Параметры:
1540
Параметры:
1510
  * eax = 29 - номер функции
1541
  * eax = 29 - номер функции
1511
Возвращаемое значение:
1542
Возвращаемое значение:
1512
  * eax = 0x00DDMMYY, где
1543
  * eax = 0x00DDMMYY, где
1513
    (используется двоично-десятичное кодирование, BCD)
1544
    (используется двоично-десятичное кодирование, BCD)
1514
  * YY = две младшие цифры года (00..99)
1545
  * YY = две младшие цифры года (00..99)
1515
  * MM = месяц (01..12)
1546
  * MM = месяц (01..12)
1516
  * DD = день (01..31)
1547
  * DD = день (01..31)
1517
Замечания:
1548
Замечания:
1518
  * Системную дату можно установить функцией 22.
1549
  * Системную дату можно установить функцией 22.
1519
 
1550
 
1520
======================================================================
1551
======================================================================
1521
================ Функция 30 - работа с текущей папкой. ===============
1552
================ Функция 30 - работа с текущей папкой. ===============
1522
======================================================================
1553
======================================================================
1523
 
1554
 
1524
-------- Подфункция 1 - установить текущую папку для потока. ---------
1555
-------- Подфункция 1 - установить текущую папку для потока. ---------
1525
Параметры:
1556
Параметры:
1526
  * eax = 30 - номер функции
1557
  * eax = 30 - номер функции
1527
  * ebx = 1 - номер подфункции
1558
  * ebx = 1 - номер подфункции
1528
  * ecx = указатель на ASCIIZ-строку с путём к новой текущей папке
1559
  * ecx = указатель на ASCIIZ-строку с путём к новой текущей папке
1529
Возвращаемое значение:
1560
Возвращаемое значение:
1530
  * функция не возвращает значения
1561
  * функция не возвращает значения
1531
 
1562
 
1532
--------- Подфункция 2 - получить текущую папку для потока. ----------
1563
--------- Подфункция 2 - получить текущую папку для потока. ----------
1533
Параметры:
1564
Параметры:
1534
  * eax = 30 - номер функции
1565
  * eax = 30 - номер функции
1535
  * ebx = 2 - номер подфункции
1566
  * ebx = 2 - номер подфункции
1536
  * ecx = указатель на буфер
1567
  * ecx = указатель на буфер
1537
  * edx = размер буфера
1568
  * edx = размер буфера
1538
Возвращаемое значение:
1569
Возвращаемое значение:
1539
  * eax = длина имени текущей папки (включая завершающий 0)
1570
  * eax = длина имени текущей папки (включая завершающий 0)
1540
Замечания:
1571
Замечания:
1541
  * Если размера буфера недостаточно для копирования всего имени,
1572
  * Если размера буфера недостаточно для копирования всего имени,
1542
    копируются только первые (edx-1) байт и в конце ставится
1573
    копируются только первые (edx-1) байт и в конце ставится
1543
    завершающий 0.
1574
    завершающий 0.
1544
  * По умолчанию, текущая папка для потока - "/rd/1".
1575
  * По умолчанию, текущая папка для потока - "/rd/1".
1545
  * При создании процесса/потока текущая папка наследуется от
1576
  * При создании процесса/потока текущая папка наследуется от
1546
    родителя.
1577
    родителя.
1547
 
1578
 
1548
---- Подфункция 3 - установить доп. системную директорию для ядра ----
1579
---- Подфункция 3 - установить доп. системную директорию для ядра ----
1549
Параметры:
1580
Параметры:
1550
  * eax = 30 - номер функции
1581
  * eax = 30 - номер функции
1551
  * ebx = 3 - номер подфункции
1582
  * ebx = 3 - номер подфункции
1552
  * ecx = указатель на блок данных:
1583
  * ecx = указатель на блок данных:
1553
          sysdir_name     rb 64
1584
          sysdir_name     rb 64
1554
          sysdir_path     rb 64
1585
          sysdir_path     rb 64
1555
Пример:
1586
Пример:
1556
dir_name1       db 'KolibriOS',0
1587
dir_name1       db 'KolibriOS',0
1557
                rb 64-10
1588
                rb 64-10
1558
dir_path1       db 'HD0/1',0
1589
dir_path1       db 'HD0/1',0
1559
                rb 64-6
1590
                rb 64-6
1560
Возвращаемое значение:
1591
Возвращаемое значение:
1561
  * функция не возвращает значения
1592
  * функция не возвращает значения
1562
Замечания:
1593
Замечания:
1563
  * Функция может быть вызвана только 1 раз за 1 сессию работы ОС.
1594
  * Функция может быть вызвана только 1 раз за 1 сессию работы ОС.
1564
 
1595
 
1565
======================================================================
1596
======================================================================
1566
========= Функция 34 - узнать кому принадлежит точка экрана. =========
1597
========= Функция 34 - узнать кому принадлежит точка экрана. =========
1567
======================================================================
1598
======================================================================
1568
Параметры:
1599
Параметры:
1569
  * eax = 34 - номер функции
1600
  * eax = 34 - номер функции
1570
  * ebx = x-координата (относительно экрана)
1601
  * ebx = x-координата (относительно экрана)
1571
  * ecx = y-координата (относительно экрана)
1602
  * ecx = y-координата (относительно экрана)
1572
 
1603
 
1573
Возвращаемое значение:
1604
Возвращаемое значение:
1574
  * eax = 0x000000XX - точка принадлежит слоту окна N
1605
  * eax = 0x000000XX - точка принадлежит слоту окна N
1575
    При некорректных значениях ebx и ecx функция возвращает 0
1606
    При некорректных значениях ebx и ecx функция возвращает 0
1576
  * Функция берет значения из области [_WinMapAddress]
1607
  * Функция берет значения из области [_WinMapAddress]
1577
 
1608
 
1578
======================================================================
1609
======================================================================
1579
============ Функция 35 - прочитать цвет точки на экране. ============
1610
============ Функция 35 - прочитать цвет точки на экране. ============
1580
======================================================================
1611
======================================================================
1581
Параметры:
1612
Параметры:
1582
  * eax = 35
1613
  * eax = 35
1583
  * ebx = y*xsize+x, где
1614
  * ebx = y*xsize+x, где
1584
  * (x,y) = координаты точки (считая от 0)
1615
  * (x,y) = координаты точки (считая от 0)
1585
  * xsize = размер экрана по горизонтали
1616
  * xsize = размер экрана по горизонтали
1586
Возвращаемое значение:
1617
Возвращаемое значение:
1587
  * eax = цвет 0x00RRGGBB
1618
  * eax = цвет 0x00RRGGBB
1588
Замечания:
1619
Замечания:
1589
  * Узнать размеры экрана можно вызовом функции 14. Обратите внимание,
1620
  * Узнать размеры экрана можно вызовом функции 14. Обратите внимание,
1590
    что она вычитает 1 из обоих размеров.
1621
    что она вычитает 1 из обоих размеров.
1591
  * К видеопамяти есть также прямой доступ (без вызовов системных
1622
  * К видеопамяти есть также прямой доступ (без вызовов системных
1592
    функций) через селектор gs. Параметры текущего видеорежима
1623
    функций) через селектор gs. Параметры текущего видеорежима
1593
    можно получить функцией 61.
1624
    можно получить функцией 61.
1594
 
1625
 
1595
======================================================================
1626
======================================================================
1596
=============== Функция 36 - прочитать область экрана. ===============
1627
=============== Функция 36 - прочитать область экрана. ===============
1597
======================================================================
1628
======================================================================
1598
Параметры:
1629
Параметры:
1599
  * eax = 36 - номер функции
1630
  * eax = 36 - номер функции
1600
  * ebx = указатель на предварительно выделенную область памяти,
1631
  * ebx = указатель на предварительно выделенную область памяти,
1601
            куда будет помещено изображение в формате BBGGRRBBGGRR...
1632
            куда будет помещено изображение в формате BBGGRRBBGGRR...
1602
  * ecx = [размер по оси x]*65536 + [размер по оси y]
1633
  * ecx = [размер по оси x]*65536 + [размер по оси y]
1603
  * edx = [координата по оси x]*65536 + [координата по оси y]
1634
  * edx = [координата по оси x]*65536 + [координата по оси y]
1604
Возвращаемое значение:
1635
Возвращаемое значение:
1605
  * функция не возвращает значения
1636
  * функция не возвращает значения
1606
Замечания:
1637
Замечания:
1607
  * Координаты области - это координаты верхнего левого угла
1638
  * Координаты области - это координаты верхнего левого угла
1608
    области относительно экрана.
1639
    области относительно экрана.
1609
  * Размер изображения в байтах есть 3*xsize*ysize.
1640
  * Размер изображения в байтах есть 3*xsize*ysize.
1610
 
1641
 
1611
======================================================================
1642
======================================================================
1612
==================== Функция 37 - работа с мышью. ====================
1643
==================== Функция 37 - работа с мышью. ====================
1613
======================================================================
1644
======================================================================
1614
 
1645
 
1615
-------------- Подфункция 0 - экранные координаты мыши ---------------
1646
-------------- Подфункция 0 - экранные координаты мыши ---------------
1616
Параметры:
1647
Параметры:
1617
  * eax = 37 - номер функции
1648
  * eax = 37 - номер функции
1618
  * ebx = 0 - номер подфункции
1649
  * ebx = 0 - номер подфункции
1619
Возвращаемое значение:
1650
Возвращаемое значение:
1620
  * eax = x*65536 + y, (x,y)=координаты курсора мыши (считая от 0)
1651
  * eax = x*65536 + y, (x,y)=координаты курсора мыши (считая от 0)
1621
 
1652
 
1622
---------- Подфункция 1 - координаты мыши относительно окна ----------
1653
---------- Подфункция 1 - координаты мыши относительно окна ----------
1623
Параметры:
1654
Параметры:
1624
  * eax = 37 - номер функции
1655
  * eax = 37 - номер функции
1625
  * ebx = 1 - номер подфункции
1656
  * ebx = 1 - номер подфункции
1626
Возвращаемое значение:
1657
Возвращаемое значение:
1627
  * eax = x*65536 + y, (x,y)=координаты курсора мыши относительно
1658
  * eax = x*65536 + y, (x,y)=координаты курсора мыши относительно
1628
    окна приложения (считая от 0)
1659
    окна приложения (считая от 0)
1629
Замечания:
1660
Замечания:
1630
  * Значение вычисляется по формуле (x-xwnd)*65536 + (y-ywnd).
1661
  * Значение вычисляется по формуле (x-xwnd)*65536 + (y-ywnd).
1631
    Если y>=ywnd, то младшее слово неотрицательно и содержит
1662
    Если y>=ywnd, то младшее слово неотрицательно и содержит
1632
    относительную y-координату, а старшее - относительную x-координату
1663
    относительную y-координату, а старшее - относительную x-координату
1633
    (правильного знака). В противном случае младшее слово отрицательно
1664
    (правильного знака). В противном случае младшее слово отрицательно
1634
    и всё равно содержит относительную y-координату,
1665
    и всё равно содержит относительную y-координату,
1635
    а к старшему слову следует прибавить 1.
1666
    а к старшему слову следует прибавить 1.
1636
 
1667
 
1637
----------------- Подфункция 2 - нажатые кнопки мыши -----------------
1668
----------------- Подфункция 2 - нажатые кнопки мыши -----------------
1638
Параметры:
1669
Параметры:
1639
  * eax = 37 - номер функции
1670
  * eax = 37 - номер функции
1640
  * ebx = 2 - номер подфункции
1671
  * ebx = 2 - номер подфункции
1641
Возвращаемое значение:
1672
Возвращаемое значение:
1642
  * eax содержит информацию о нажатых кнопках мыши:
1673
  * eax содержит информацию о нажатых кнопках мыши:
1643
  * бит 0 установлен = левая кнопка нажата
1674
  * бит 0 установлен = левая кнопка нажата
1644
  * бит 1 установлен = правая кнопка нажата
1675
  * бит 1 установлен = правая кнопка нажата
1645
  * бит 2 установлен = средняя кнопка нажата
1676
  * бит 2 установлен = средняя кнопка нажата
1646
  * бит 3 установлен = 4-я кнопка нажата
1677
  * бит 3 установлен = 4-я кнопка нажата
1647
  * бит 4 установлен = 5-я кнопка нажата
1678
  * бит 4 установлен = 5-я кнопка нажата
1648
  * прочие биты сброшены
1679
  * прочие биты сброшены
1649
 
1680
 
1650
------------------ Подфункция 4 - загрузить курсор -------------------
1681
------------------ Подфункция 4 - загрузить курсор -------------------
1651
Параметры:
1682
Параметры:
1652
  * eax = 37 - номер функции
1683
  * eax = 37 - номер функции
1653
  * ebx = 4 - номер подфункции
1684
  * ebx = 4 - номер подфункции
1654
  * dx = источник данных:
1685
  * dx = источник данных:
1655
  * dx = LOAD_FROM_FILE = 0 - данные в файле
1686
  * dx = LOAD_FROM_FILE = 0 - данные в файле
1656
    * ecx = указатель на полный путь к файлу курсора
1687
    * ecx = указатель на полный путь к файлу курсора
1657
    * файл курсора должен быть в формате .cur, стандартном для
1688
    * файл курсора должен быть в формате .cur, стандартном для
1658
      MS Windows, причём размером 32*32 пикселя
1689
      MS Windows, причём размером 32*32 пикселя
1659
  * dx = LOAD_FROM_MEM = 1 - данные файла уже загружены в память
1690
  * dx = LOAD_FROM_MEM = 1 - данные файла уже загружены в память
1660
    * ecx = указатель на данные файла курсора
1691
    * ecx = указатель на данные файла курсора
1661
    * формат данных такой же, как и в предыдущем случае
1692
    * формат данных такой же, как и в предыдущем случае
1662
  * dx = LOAD_INDIRECT = 2 - данные в памяти
1693
  * dx = LOAD_INDIRECT = 2 - данные в памяти
1663
    * ecx = указатель на образ курсора в формате ARGB 32*32 пикселя
1694
    * ecx = указатель на образ курсора в формате ARGB 32*32 пикселя
1664
    * edx = 0xXXYY0002, где
1695
    * edx = 0xXXYY0002, где
1665
      * XX = x-координата "горячей точки" курсора
1696
      * XX = x-координата "горячей точки" курсора
1666
      * YY = y-координата
1697
      * YY = y-координата
1667
      * 0 <= XX, YY <= 31
1698
      * 0 <= XX, YY <= 31
1668
Возвращаемое значение:
1699
Возвращаемое значение:
1669
  * eax = 0 - неудача
1700
  * eax = 0 - неудача
1670
  * иначе eax = хэндл курсора
1701
  * иначе eax = хэндл курсора
1671
 
1702
 
1672
------------------ Подфункция 5 - установить курсор ------------------
1703
------------------ Подфункция 5 - установить курсор ------------------
1673
Устанавливает новый курсор для окна текущего потока.
1704
Устанавливает новый курсор для окна текущего потока.
1674
Параметры:
1705
Параметры:
1675
  * eax = 37 - номер функции
1706
  * eax = 37 - номер функции
1676
  * ebx = 5 - номер подфункции
1707
  * ebx = 5 - номер подфункции
1677
  * ecx = хэндл курсора
1708
  * ecx = хэндл курсора
1678
Возвращаемое значение:
1709
Возвращаемое значение:
1679
  * eax = хэндл предыдущего установленного курсора
1710
  * eax = хэндл предыдущего установленного курсора
1680
Замечания:
1711
Замечания:
1681
  * Если передан некорректный хэндл, то функция восстановит курсор
1712
  * Если передан некорректный хэндл, то функция восстановит курсор
1682
    по умолчанию (стандартную стрелку). В частности, к восстановлению
1713
    по умолчанию (стандартную стрелку). В частности, к восстановлению
1683
    курсора по умолчанию приводит передача ecx=0.
1714
    курсора по умолчанию приводит передача ecx=0.
1684
 
1715
 
1685
------------------- Подфункция 6 - удалить курсор --------------------
1716
------------------- Подфункция 6 - удалить курсор --------------------
1686
Параметры:
1717
Параметры:
1687
  * eax = 37 - номер функции
1718
  * eax = 37 - номер функции
1688
  * ebx = 6 - номер подфункции
1719
  * ebx = 6 - номер подфункции
1689
  * ecx = хэндл курсора
1720
  * ecx = хэндл курсора
1690
Возвращаемое значение:
1721
Возвращаемое значение:
1691
  * eax разрушается
1722
  * eax разрушается
1692
Замечания:
1723
Замечания:
1693
  * Курсор должен был быть ранее загружен текущим потоком
1724
  * Курсор должен был быть ранее загружен текущим потоком
1694
    (вызовом подфункции 4). Функция не удаляет системные курсоры и
1725
    (вызовом подфункции 4). Функция не удаляет системные курсоры и
1695
    курсоры, загруженные другими приложениями.
1726
    курсоры, загруженные другими приложениями.
1696
  * Если удаляется активный (установленный подфункцией 5) курсор, то
1727
  * Если удаляется активный (установленный подфункцией 5) курсор, то
1697
    восстанавливается курсор по умолчанию (стандартная стрелка).
1728
    восстанавливается курсор по умолчанию (стандартная стрелка).
1698
 
1729
 
1699
------------------ Подфункция 7 - данные прокрутки -------------------
1730
------------------ Подфункция 7 - данные прокрутки -------------------
1700
Параметры:
1731
Параметры:
1701
  * eax = 37 - номер функции
1732
  * eax = 37 - номер функции
1702
  * ebx = 7 - номер подфункции
1733
  * ebx = 7 - номер подфункции
1703
Возвращаемое значение:
1734
Возвращаемое значение:
1704
  * eax = [horizontal offset]*65536 + [vertical offset]
1735
  * eax = [horizontal offset]*65536 + [vertical offset]
1705
Замечания:
1736
Замечания:
1706
  * Данные доступны только активному окну.
1737
  * Данные доступны только активному окну.
1707
  * После прочтения значения обнуляются.
1738
  * После прочтения значения обнуляются.
1708
  * Данные имеют знаковые значения.
1739
  * Данные имеют знаковые значения.
1709
 
1740
 
1710
======================================================================
1741
======================================================================
1711
================== Функция 38 - нарисовать отрезок. ==================
1742
================== Функция 38 - нарисовать отрезок. ==================
1712
======================================================================
1743
======================================================================
1713
Параметры:
1744
Параметры:
1714
  * eax = 38 - номер функции
1745
  * eax = 38 - номер функции
1715
  * ebx = [координата начала по оси x]*65536 +
1746
  * ebx = [координата начала по оси x]*65536 +
1716
              [координата конца по оси x]
1747
              [координата конца по оси x]
1717
  * ecx = [координата начала по оси y]*65536 +
1748
  * ecx = [координата начала по оси y]*65536 +
1718
              [координата конца по оси y]
1749
              [координата конца по оси y]
1719
  * edx = 0x00RRGGBB - цвет
1750
  * edx = 0x00RRGGBB - цвет
1720
    edx = 0x01xxxxxx - рисовать инверсный отрезок
1751
    edx = 0x01xxxxxx - рисовать инверсный отрезок
1721
          (младшие 24 бита игнорируются)
1752
          (младшие 24 бита игнорируются)
1722
Возвращаемое значение:
1753
Возвращаемое значение:
1723
  * функция не возвращает значения
1754
  * функция не возвращает значения
1724
Замечания:
1755
Замечания:
1725
  * Координаты берутся относительно окна.
1756
  * Координаты берутся относительно окна.
1726
  * Конечная точка также рисуется.
1757
  * Конечная точка также рисуется.
1727
 
1758
 
1728
======================================================================
1759
======================================================================
1729
== Функция 39, подфункция 1 - получить размер фонового изображения. ==
1760
== Функция 39, подфункция 1 - получить размер фонового изображения. ==
1730
======================================================================
1761
======================================================================
1731
Параметры:
1762
Параметры:
1732
  * eax = 39 - номер функции
1763
  * eax = 39 - номер функции
1733
  * ebx = 1 - номер подфункции
1764
  * ebx = 1 - номер подфункции
1734
Возвращаемое значение:
1765
Возвращаемое значение:
1735
  * eax = [ширина]*65536 + [высота]
1766
  * eax = [ширина]*65536 + [высота]
1736
Замечания:
1767
Замечания:
1737
  * Есть парная команда установки размеров фонового изображения -
1768
  * Есть парная команда установки размеров фонового изображения -
1738
    подфункция 1 функции 15. После которой, разумеется, следует
1769
    подфункция 1 функции 15. После которой, разумеется, следует
1739
    заново определить само изображение.
1770
    заново определить само изображение.
1740
 
1771
 
1741
======================================================================
1772
======================================================================
1742
= Функция 39, подфункция 2 - прочитать точку с фонового изображения. =
1773
= Функция 39, подфункция 2 - прочитать точку с фонового изображения. =
1743
======================================================================
1774
======================================================================
1744
Параметры:
1775
Параметры:
1745
  * eax = 39 - номер функции
1776
  * eax = 39 - номер функции
1746
  * ebx = 2 - номер подфункции
1777
  * ebx = 2 - номер подфункции
1747
  * ecx = смещение
1778
  * ecx = смещение
1748
Возвращаемое значение:
1779
Возвращаемое значение:
1749
  * eax = 0x00RRGGBB - цвет точки, если смещение допустимо
1780
  * eax = 0x00RRGGBB - цвет точки, если смещение допустимо
1750
    (меньше 0x160000-16)
1781
    (меньше 0x160000-16)
1751
  * eax = 2 - иначе
1782
  * eax = 2 - иначе
1752
Замечания:
1783
Замечания:
1753
  * Не следует полагаться на возвращаемое значение в случае неверного
1784
  * Не следует полагаться на возвращаемое значение в случае неверного
1754
    смещения, оно может измениться в следующих версиях ядра.
1785
    смещения, оно может измениться в следующих версиях ядра.
1755
  * Смещение точки с координатами (x,y) вычисляется как (x+y*xsize)*3.
1786
  * Смещение точки с координатами (x,y) вычисляется как (x+y*xsize)*3.
1756
  * Есть парная функция установки точки на фоновом изображении -
1787
  * Есть парная функция установки точки на фоновом изображении -
1757
    подфункция 2 функции 15.
1788
    подфункция 2 функции 15.
1758
 
1789
 
1759
======================================================================
1790
======================================================================
1760
====== Функция 39, подфункция 4 - получить режим отрисовки фона. =====
1791
====== Функция 39, подфункция 4 - получить режим отрисовки фона. =====
1761
======================================================================
1792
======================================================================
1762
Параметры:
1793
Параметры:
1763
  * eax = 39 - номер функции
1794
  * eax = 39 - номер функции
1764
  * ebx = 4 - номер подфункции
1795
  * ebx = 4 - номер подфункции
1765
Возвращаемое значение:
1796
Возвращаемое значение:
1766
  * eax = 1 - замостить
1797
  * eax = 1 - замостить
1767
  * eax = 2 - растянуть
1798
  * eax = 2 - растянуть
1768
Замечания:
1799
Замечания:
1769
  * Есть парная функция установки режима отрисовки фона -
1800
  * Есть парная функция установки режима отрисовки фона -
1770
    подфункция 4 функции 15.
1801
    подфункция 4 функции 15.
1771
 
1802
 
1772
======================================================================
1803
======================================================================
1773
======== Функция 40 - установить маску для ожидаемых событий. ========
1804
======== Функция 40 - установить маску для ожидаемых событий. ========
1774
======================================================================
1805
======================================================================
1775
Маска для ожидаемых событий влияет на функции работы с событиями 10,
1806
Маска для ожидаемых событий влияет на функции работы с событиями 10,
1776
11, 23 - они сообщают только о событиях, разрешённых этой маской.
1807
11, 23 - они сообщают только о событиях, разрешённых этой маской.
1777
Параметры:
1808
Параметры:
1778
  * eax = 40 - номер функции
1809
  * eax = 40 - номер функции
1779
  * ebx = маска: бит i соответствует событию i+1 (см. список событий)
1810
  * ebx = маска: бит i соответствует событию i+1 (см. список событий)
1780
    (установленный бит разрешает извещение о событии)
1811
    (установленный бит разрешает извещение о событии)
1781
    bit 31: фильтр активности событий мыши
1812
    bit 31: фильтр активности событий мыши
1782
    bit 31 = 0 - неактивное окно всегда получает события от мыши
1813
    bit 31 = 0 - неактивное окно всегда получает события от мыши
1783
    bit 31 = 1 - неактивное окно не получает события от мыши
1814
    bit 31 = 1 - неактивное окно не получает события от мыши
1784
    bit 30: фильтр позиции курсора
1815
    bit 30: фильтр позиции курсора
1785
    bit 30 = 0 - окно принимает события мыши, если курсор
1816
    bit 30 = 0 - окно принимает события мыши, если курсор
1786
                 за пределами окна
1817
                 за пределами окна
1787
    bit 30 = 1 - окно не принимает события мыши, если курсор
1818
    bit 30 = 1 - окно не принимает события мыши, если курсор
1788
                 за пределами окна
1819
                 за пределами окна
1789
Возвращаемое значение:
1820
Возвращаемое значение:
1790
  * eax = предыдущее значение маски
1821
  * eax = предыдущее значение маски
1791
Замечания:
1822
Замечания:
1792
  * Маска по умолчанию (7=111b) разрешает извещения о перерисовке
1823
  * Маска по умолчанию (7=111b) разрешает извещения о перерисовке
1793
    и нажатиях клавиш и кнопок.
1824
    и нажатиях клавиш и кнопок.
1794
    Этого достаточно для большинства приложений.
1825
    Этого достаточно для большинства приложений.
1795
  * События, запрещённые в маске, всё равно сохраняются, если
1826
  * События, запрещённые в маске, всё равно сохраняются, если
1796
    приходят; о них просто не извещают функции работы с событиями.
1827
    приходят; о них просто не извещают функции работы с событиями.
1797
  * Функции работы с событиями учитывают маску на момент
1828
  * Функции работы с событиями учитывают маску на момент
1798
    вызова функции, а не на момент поступления сообщения.
1829
    вызова функции, а не на момент поступления сообщения.
1799
 
1830
 
1800
 
1831
 
1801
======================================================================
1832
======================================================================
1802
=================== Функция 43 - ввод/вывод в порт. ==================
1833
=================== Функция 43 - ввод/вывод в порт. ==================
1803
======================================================================
1834
======================================================================
1804
 
1835
 
1805
------------------------ Вывод данных в порт -------------------------
1836
------------------------ Вывод данных в порт -------------------------
1806
Параметры:
1837
Параметры:
1807
  * eax = 43 - номер функции
1838
  * eax = 43 - номер функции
1808
  * bl = байт для вывода
1839
  * bl = байт для вывода
1809
  * ecx = номер порта 0xnnnn (от 0 до 0xFFFF)
1840
  * ecx = номер порта 0xnnnn (от 0 до 0xFFFF)
1810
Возвращаемое значение:
1841
Возвращаемое значение:
1811
  * eax = 0 - успешно
1842
  * eax = 0 - успешно
1812
  * eax = 1 - поток не зарезервировал указанный порт
1843
  * eax = 1 - поток не зарезервировал указанный порт
1813
 
1844
 
1814
------------------------ Ввод данных из порта ------------------------
1845
------------------------ Ввод данных из порта ------------------------
1815
Параметры:
1846
Параметры:
1816
  * eax = 43 - номер функции
1847
  * eax = 43 - номер функции
1817
  * ebx игнорируется
1848
  * ebx игнорируется
1818
  * ecx = 0x8000nnnn, где nnnn = номер порта (от 0 до 0xFFFF)
1849
  * ecx = 0x8000nnnn, где nnnn = номер порта (от 0 до 0xFFFF)
1819
Возвращаемое значение:
1850
Возвращаемое значение:
1820
  * eax = 0 - успешно, при этом ebx = введённый байт
1851
  * eax = 0 - успешно, при этом ebx = введённый байт
1821
  * eax = 1 - поток не зарезервировал данный порт
1852
  * eax = 1 - поток не зарезервировал данный порт
1822
Замечания:
1853
Замечания:
1823
  * Предварительно поток должен зарезервировать за собой
1854
  * Предварительно поток должен зарезервировать за собой
1824
    указанный порт функцией 46.
1855
    указанный порт функцией 46.
1825
  * Для зарезервированных портов вместо вызова этих функций
1856
  * Для зарезервированных портов вместо вызова этих функций
1826
    лучше использовать команды процессора in/out - это значительно
1857
    лучше использовать команды процессора in/out - это значительно
1827
    быстрее и несколько короче и проще. Из незарезервированных
1858
    быстрее и несколько короче и проще. Из незарезервированных
1828
    портов читать всё равно нельзя.
1859
    портов читать всё равно нельзя.
1829
 
1860
 
1830
 
1861
 
1831
======================================================================
1862
======================================================================
1832
= Функция 46 - зарезервировать/освободить группу портов ввода/вывода.
1863
= Функция 46 - зарезервировать/освободить группу портов ввода/вывода.
1833
======================================================================
1864
======================================================================
1834
К зарезервированным портам можно обращаться напрямую из приложения
1865
К зарезервированным портам можно обращаться напрямую из приложения
1835
командами in/out (рекомендуемый способ) и вызовом функции 43
1866
командами in/out (рекомендуемый способ) и вызовом функции 43
1836
(нерекомендуемый способ).
1867
(нерекомендуемый способ).
1837
Параметры:
1868
Параметры:
1838
  * eax = 46 - номер функции
1869
  * eax = 46 - номер функции
1839
  * ebx = 0 - зарезервировать, 1 - освободить
1870
  * ebx = 0 - зарезервировать, 1 - освободить
1840
  * ecx = номер начала диапазона портов
1871
  * ecx = номер начала диапазона портов
1841
  * edx = номер конца диапазона портов (включительно)
1872
  * edx = номер конца диапазона портов (включительно)
1842
Возвращаемое значение:
1873
Возвращаемое значение:
1843
  * eax = 0 - успешно
1874
  * eax = 0 - успешно
1844
  * eax = 1 - ошибка
1875
  * eax = 1 - ошибка
1845
Замечания:
1876
Замечания:
1846
  * В случае резервирования портов ошибкой считается выполнение
1877
  * В случае резервирования портов ошибкой считается выполнение
1847
    одного из условий:
1878
    одного из условий:
1848
    * начальный адрес больше конечного;
1879
    * начальный адрес больше конечного;
1849
    * указанный диапазон содержит некорректный номер порта
1880
    * указанный диапазон содержит некорректный номер порта
1850
      (корректные - от 0 до 0xFFFF);
1881
      (корректные - от 0 до 0xFFFF);
1851
    * превышено ограничение на общее число зарезервированных областей
1882
    * превышено ограничение на общее число зарезервированных областей
1852
      - допускается максимум 255;
1883
      - допускается максимум 255;
1853
    * указанный диапазон пересекается с одним из
1884
    * указанный диапазон пересекается с одним из
1854
      ранее зарезервированных
1885
      ранее зарезервированных
1855
  * В случае освобождения портов ошибкой считается попытка
1886
  * В случае освобождения портов ошибкой считается попытка
1856
    освобождения диапазона, который ранее не был целиком
1887
    освобождения диапазона, который ранее не был целиком
1857
    зарезервирован этой же функцией (с такими же значениями ecx,edx).
1888
    зарезервирован этой же функцией (с такими же значениями ecx,edx).
1858
  * При обнаружении ошибки (в обоих случаях) никаких действий
1889
  * При обнаружении ошибки (в обоих случаях) никаких действий
1859
    не производится.
1890
    не производится.
1860
  * При загрузке система резервирует за собой порты
1891
  * При загрузке система резервирует за собой порты
1861
    0..0x2d, 0x30..0x4d, 0x50..0xdf, 0xe5..0xff (включительно).
1892
    0..0x2d, 0x30..0x4d, 0x50..0xdf, 0xe5..0xff (включительно).
1862
  * При завершении потока автоматически освобождаются все
1893
  * При завершении потока автоматически освобождаются все
1863
    зарезервированные им порты.
1894
    зарезервированные им порты.
1864
 
1895
 
1865
======================================================================
1896
======================================================================
1866
================= Функция 47 - вывести число в окно. =================
1897
================= Функция 47 - вывести число в окно. =================
1867
======================================================================
1898
======================================================================
1868
Параметры:
1899
Параметры:
1869
  * eax = 47 - номер функции
1900
  * eax = 47 - номер функции
1870
  * ebx = параметры преобразования числа в текст:
1901
  * ebx = параметры преобразования числа в текст:
1871
    * bl = 0 - ecx содержит число
1902
    * bl = 0 - ecx содержит число
1872
    * bl = 1 - ecx содержит указатель на dword/qword-число
1903
    * bl = 1 - ecx содержит указатель на dword/qword-число
1873
    * bh = 0 - отображать в десятичной системе счисления
1904
    * bh = 0 - отображать в десятичной системе счисления
1874
    * bh = 1 - отображать в шестнадцатеричной системе
1905
    * bh = 1 - отображать в шестнадцатеричной системе
1875
    * bh = 2 - отображать в двоичной системе
1906
    * bh = 2 - отображать в двоичной системе
1876
    * биты 16-21 = сколько цифр отображать
1907
    * биты 16-21 = сколько цифр отображать
1877
    * биты 22-29 зарезервированы и должны быть установлены в 0
1908
    * биты 22-29 зарезервированы и должны быть установлены в 0
1878
    * бит 30 установлен = выводить qword (64-битное число);
1909
    * бит 30 установлен = выводить qword (64-битное число);
1879
                              при этом должно быть bl = 1
1910
                              при этом должно быть bl = 1
1880
    * бит 31 установлен = не выводить ведущие нули числа
1911
    * бит 31 установлен = не выводить ведущие нули числа
1881
  * ecx = число (при bl=0) или указатель (при bl=1)
1912
  * ecx = число (при bl=0) или указатель (при bl=1)
1882
  * edx = [координата по оси x]*65536 + [координата по оси y]
1913
  * edx = [координата по оси x]*65536 + [координата по оси y]
1883
  * esi = 0xX0RRGGBB:
1914
  * esi = 0xX0RRGGBB:
1884
    * RR, GG, BB задают цвет
1915
    * RR, GG, BB задают цвет
1885
    * X = ABnn (биты)
1916
    * X = ABnn (биты)
1886
    * nn = шрифт (0/1)
1917
    * nn = шрифт (0/1)
1887
    * A игнорируется
1918
    * A игнорируется
1888
    * B=1 - закрашивать фон цветом edi
1919
    * B=1 - закрашивать фон цветом edi
1889
Возвращаемое значение:
1920
Возвращаемое значение:
1890
  * функция не возвращает значения
1921
  * функция не возвращает значения
1891
Замечания:
1922
Замечания:
1892
  * Указанная длина не должна превосходить 60.
1923
  * Указанная длина не должна превосходить 60.
1893
  * Выводится ровно указанное количество цифр. Если число мало и
1924
  * Выводится ровно указанное количество цифр. Если число мало и
1894
    может быть записано меньшим количеством цифр, оно дополняется
1925
    может быть записано меньшим количеством цифр, оно дополняется
1895
    ведущими нулями; если число велико и не может быть записано
1926
    ведущими нулями; если число велико и не может быть записано
1896
    таким количеством цифр, "лишние" ведущие цифры обрезаются.
1927
    таким количеством цифр, "лишние" ведущие цифры обрезаются.
1897
  * Параметры шрифтов указаны в описании функции 4 (вывода текста).
1928
  * Параметры шрифтов указаны в описании функции 4 (вывода текста).
1898
 
1929
 
1899
======================================================================
1930
======================================================================
1900
======= Функция 48, подфункция 0 - применить настройки экрана. =======
1931
======= Функция 48, подфункция 0 - применить настройки экрана. =======
1901
======================================================================
1932
======================================================================
1902
Параметры:
1933
Параметры:
1903
  * eax = 48 - номер функции
1934
  * eax = 48 - номер функции
1904
  * ebx = 0 - номер подфункции
1935
  * ebx = 0 - номер подфункции
1905
  * ecx = 0 - зарезервировано
1936
  * ecx = 0 - зарезервировано
1906
Возвращаемое значение:
1937
Возвращаемое значение:
1907
  * функция не возвращает значения
1938
  * функция не возвращает значения
1908
Замечания:
1939
Замечания:
1909
  * Функция перерисовывает экран после изменения параметров
1940
  * Функция перерисовывает экран после изменения параметров
1910
    подфункциями 1 и 2.
1941
    подфункциями 1 и 2.
1911
  * Вызов функции без предшествующих вызовов указанных подфункций
1942
  * Вызов функции без предшествующих вызовов указанных подфункций
1912
    игнорируется.
1943
    игнорируется.
1913
  * Вызов функции с ненулевым ecx игнорируется.
1944
  * Вызов функции с ненулевым ecx игнорируется.
1914
 
1945
 
1915
======================================================================
1946
======================================================================
1916
========= Функция 48, подфункция 1 - установить стиль кнопок. ========
1947
========= Функция 48, подфункция 1 - установить стиль кнопок. ========
1917
======================================================================
1948
======================================================================
1918
Параметры:
1949
Параметры:
1919
  * eax = 48 - номер функции
1950
  * eax = 48 - номер функции
1920
  * ebx = 1 - номер подфункции
1951
  * ebx = 1 - номер подфункции
1921
  * ecx = тип кнопок:
1952
  * ecx = тип кнопок:
1922
    * 0 = плоские
1953
    * 0 = плоские
1923
    * 1 = объёмные
1954
    * 1 = объёмные
1924
Возвращаемое значение:
1955
Возвращаемое значение:
1925
  * функция не возвращает значения
1956
  * функция не возвращает значения
1926
Замечания:
1957
Замечания:
1927
  * После вызова описываемой функции следует перерисовать экран
1958
  * После вызова описываемой функции следует перерисовать экран
1928
    подфункцией 0.
1959
    подфункцией 0.
1929
  * Тип кнопок влияет только на их прорисовку функцией 8.
1960
  * Тип кнопок влияет только на их прорисовку функцией 8.
1930
 
1961
 
1931
======================================================================
1962
======================================================================
1932
==== Функция 48, подфункция 2 - установить стандартные цвета окон. ===
1963
==== Функция 48, подфункция 2 - установить стандартные цвета окон. ===
1933
======================================================================
1964
======================================================================
1934
Параметры:
1965
Параметры:
1935
  * eax = 48 - номер функции
1966
  * eax = 48 - номер функции
1936
  * ebx = 2 - номер подфункции
1967
  * ebx = 2 - номер подфункции
1937
  * ecx = указатель на таблицу цветов
1968
  * ecx = указатель на таблицу цветов
1938
  * edx = размер таблицы цветов
1969
  * edx = размер таблицы цветов
1939
    (должен быть 40 байт для будущей совместимости)
1970
    (должен быть 40 байт для будущей совместимости)
1940
Формат таблицы цветов указан в описании подфункции 3.
1971
Формат таблицы цветов указан в описании подфункции 3.
1941
Возвращаемое значение:
1972
Возвращаемое значение:
1942
  * функция не возвращает значения
1973
  * функция не возвращает значения
1943
Замечания:
1974
Замечания:
1944
  * После вызова описываемой функции следует перерисовать экран
1975
  * После вызова описываемой функции следует перерисовать экран
1945
    подфункцией 0.
1976
    подфункцией 0.
1946
  * Таблица стандартных цветов влияет только на приложения,
1977
  * Таблица стандартных цветов влияет только на приложения,
1947
    которые эту таблицу явным образом получают (подфункцией 3) и
1978
    которые эту таблицу явным образом получают (подфункцией 3) и
1948
    используют (указывая цвета из неё при вызовах функций рисования).
1979
    используют (указывая цвета из неё при вызовах функций рисования).
1949
  * Таблица стандартных цветов входит в скин и устанавливается заново
1980
  * Таблица стандартных цветов входит в скин и устанавливается заново
1950
    при установке скина (подфункции 8).
1981
    при установке скина (подфункции 8).
1951
  * Таблицу цветов можно просматривать/изменять интерактивно с помощью
1982
  * Таблицу цветов можно просматривать/изменять интерактивно с помощью
1952
    приложения desktop.
1983
    приложения desktop.
1953
 
1984
 
1954
======================================================================
1985
======================================================================
1955
===== Функция 48, подфункция 3 - получить стандартные цвета окон. ====
1986
===== Функция 48, подфункция 3 - получить стандартные цвета окон. ====
1956
======================================================================
1987
======================================================================
1957
Параметры:
1988
Параметры:
1958
  * eax = 48 - номер функции
1989
  * eax = 48 - номер функции
1959
  * ebx = 3 - номер подфункции
1990
  * ebx = 3 - номер подфункции
1960
  * ecx = указатель на буфер размером edx байт,
1991
  * ecx = указатель на буфер размером edx байт,
1961
    куда будет записана таблица
1992
    куда будет записана таблица
1962
  * edx = размер таблицы цветов
1993
  * edx = размер таблицы цветов
1963
    (должен быть 40 байт для будущей совместимости)
1994
    (должен быть 40 байт для будущей совместимости)
1964
Возвращаемое значение:
1995
Возвращаемое значение:
1965
  * функция не возвращает значения
1996
  * функция не возвращает значения
1966
Формат таблицы цветов: каждый элемент -
1997
Формат таблицы цветов: каждый элемент -
1967
dword-значение цвета 0x00RRGGBB
1998
dword-значение цвета 0x00RRGGBB
1968
  * +0: dword: frames - цвет рамки
1999
  * +0: dword: frames - цвет рамки
1969
  * +4: dword: grab - цвет заголовка
2000
  * +4: dword: grab - цвет заголовка
1970
  * +8: dword: grab_button - цвет кнопки на полосе заголовка
2001
  * +8: dword: grab_button - цвет кнопки на полосе заголовка
1971
  * +12 = +0xC: dword: grab_button_text - цвет текста на кнопке
2002
  * +12 = +0xC: dword: grab_button_text - цвет текста на кнопке
1972
    на полосе заголовка
2003
    на полосе заголовка
1973
  * +16 = +0x10: dword: grab_text - цвет текста на заголовке
2004
  * +16 = +0x10: dword: grab_text - цвет текста на заголовке
1974
  * +20 = +0x14: dword: work - цвет рабочей области
2005
  * +20 = +0x14: dword: work - цвет рабочей области
1975
  * +24 = +0x18: dword: work_button - цвет кнопки в рабочей области
2006
  * +24 = +0x18: dword: work_button - цвет кнопки в рабочей области
1976
  * +28 = +0x1C: dword: work_button_text - цвет текста на кнопке
2007
  * +28 = +0x1C: dword: work_button_text - цвет текста на кнопке
1977
    в рабочей области
2008
    в рабочей области
1978
  * +32 = +0x20: dword: work_text - цвет текста в рабочей области
2009
  * +32 = +0x20: dword: work_text - цвет текста в рабочей области
1979
  * +36 = +0x24: dword: work_graph - цвет графики в рабочей области
2010
  * +36 = +0x24: dword: work_graph - цвет графики в рабочей области
1980
Замечания:
2011
Замечания:
1981
  * Структура таблицы цветов описана в стандартном включаемом файле
2012
  * Структура таблицы цветов описана в стандартном включаемом файле
1982
    macros.inc под названием system_colors; например, можно писать:
2013
    macros.inc под названием system_colors; например, можно писать:
1983
    	sc	system_colors		; объявление переменной
2014
    	sc	system_colors		; объявление переменной
1984
    	...				; где-то надо вызвать
2015
    	...				; где-то надо вызвать
1985
    					; описываемую функцию с ecx=sc
2016
    					; описываемую функцию с ecx=sc
1986
    	mov	ecx, [sc.work_button_text]	; читаем цвет текста
2017
    	mov	ecx, [sc.work_button_text]	; читаем цвет текста
1987
    					; на кнопке в рабочей области
2018
    					; на кнопке в рабочей области
1988
  * Использование/неиспользование этих цветов - дело исключительно
2019
  * Использование/неиспользование этих цветов - дело исключительно
1989
    самой программы. Для использования нужно просто при вызове функций
2020
    самой программы. Для использования нужно просто при вызове функций
1990
    рисования указывать цвет, взятый из этой таблицы.
2021
    рисования указывать цвет, взятый из этой таблицы.
1991
  * При изменении таблицы стандартных цветов (подфункцией 2 с
2022
  * При изменении таблицы стандартных цветов (подфункцией 2 с
1992
    последующим применением изменений подфункцией 0 или
2023
    последующим применением изменений подфункцией 0 или
1993
    при установке скина подфункцией 8) всем окнам посылается сообщение
2024
    при установке скина подфункцией 8) всем окнам посылается сообщение
1994
    о необходимости перерисовки (событие с кодом 1).
2025
    о необходимости перерисовки (событие с кодом 1).
1995
  * Стандартные цвета можно просматривать/изменять интерактивно
2026
  * Стандартные цвета можно просматривать/изменять интерактивно
1996
    с помощью приложения desktop.
2027
    с помощью приложения desktop.
1997
 
2028
 
1998
======================================================================
2029
======================================================================
1999
========== Функция 48, подфункция 4 - получить высоту скина. =========
2030
========== Функция 48, подфункция 4 - получить высоту скина. =========
2000
======================================================================
2031
======================================================================
2001
Параметры:
2032
Параметры:
2002
  * eax = 48 - номер функции
2033
  * eax = 48 - номер функции
2003
  * ebx = 4 - номер подфункции
2034
  * ebx = 4 - номер подфункции
2004
Возвращаемое значение:
2035
Возвращаемое значение:
2005
  * eax = высота скина
2036
  * eax = высота скина
2006
Замечания:
2037
Замечания:
2007
  * Высотой скина по определению считается высота заголовка окон,
2038
  * Высотой скина по определению считается высота заголовка окон,
2008
    использующих скин.
2039
    использующих скин.
2009
  * Смотри также общую структуру окна в описании функции 0.
2040
  * Смотри также общую структуру окна в описании функции 0.
2010
 
2041
 
2011
======================================================================
2042
======================================================================
2012
===== Функция 48, подфункция 5 - получить рабочую область экрана. ====
2043
===== Функция 48, подфункция 5 - получить рабочую область экрана. ====
2013
======================================================================
2044
======================================================================
2014
Параметры:
2045
Параметры:
2015
  * eax = 48 - номер функции
2046
  * eax = 48 - номер функции
2016
  * ebx = 5 - номер подфункции
2047
  * ebx = 5 - номер подфункции
2017
Возвращаемое значение:
2048
Возвращаемое значение:
2018
  * eax = [left]*65536 + [right]
2049
  * eax = [left]*65536 + [right]
2019
  * ebx = [top]*65536 + [bottom]
2050
  * ebx = [top]*65536 + [bottom]
2020
Замечания:
2051
Замечания:
2021
  * Рабочая область экрана определяет положение и координаты
2052
  * Рабочая область экрана определяет положение и координаты
2022
    максимизированного окна.
2053
    максимизированного окна.
2023
  * Рабочая область экрана при нормальной работе есть весь экран
2054
  * Рабочая область экрана при нормальной работе есть весь экран
2024
    за вычетом панели (@taskbar).
2055
    за вычетом панели (@taskbar).
2025
  * (left,top) - координаты левого верхнего угла,
2056
  * (left,top) - координаты левого верхнего угла,
2026
    (right,bottom) - координаты правого нижнего.
2057
    (right,bottom) - координаты правого нижнего.
2027
    Таким образом, размер рабочей области по оси x определяется
2058
    Таким образом, размер рабочей области по оси x определяется
2028
    формулой right-left+1, по оси y - формулой bottom-right+1.
2059
    формулой right-left+1, по оси y - формулой bottom-right+1.
2029
  * Смотри также функцию 14,
2060
  * Смотри также функцию 14,
2030
    позволяющую определить размеры всего экрана.
2061
    позволяющую определить размеры всего экрана.
2031
  * Есть парная функция установки рабочей области - подфункция 6.
2062
  * Есть парная функция установки рабочей области - подфункция 6.
2032
 
2063
 
2033
======================================================================
2064
======================================================================
2034
==== Функция 48, подфункция 6 - установить рабочую область экрана. ===
2065
==== Функция 48, подфункция 6 - установить рабочую область экрана. ===
2035
======================================================================
2066
======================================================================
2036
Параметры:
2067
Параметры:
2037
  * eax = 48 - номер функции
2068
  * eax = 48 - номер функции
2038
  * ebx = 6 - номер подфункции
2069
  * ebx = 6 - номер подфункции
2039
  * ecx = [left]*65536 + [right]
2070
  * ecx = [left]*65536 + [right]
2040
  * edx = [top]*65536 + [bottom]
2071
  * edx = [top]*65536 + [bottom]
2041
Возвращаемое значение:
2072
Возвращаемое значение:
2042
  * функция не возвращает значения
2073
  * функция не возвращает значения
2043
Замечания:
2074
Замечания:
2044
  * Рабочая область экрана определяет положение и координаты
2075
  * Рабочая область экрана определяет положение и координаты
2045
    максимизированного окна.
2076
    максимизированного окна.
2046
  * Эта функция используется только приложением @taskbar,
2077
  * Эта функция используется только приложением @taskbar,
2047
    устанавливающим рабочей областью весь экран за вычетом панели.
2078
    устанавливающим рабочей областью весь экран за вычетом панели.
2048
  * (left,top) - координаты левого верхнего угла,
2079
  * (left,top) - координаты левого верхнего угла,
2049
    (right,bottom) - координаты правого нижнего.
2080
    (right,bottom) - координаты правого нижнего.
2050
    Таким образом, размер рабочей области по оси x определяется
2081
    Таким образом, размер рабочей области по оси x определяется
2051
    формулой right-left+1, по оси y - формулой bottom-right+1.
2082
    формулой right-left+1, по оси y - формулой bottom-right+1.
2052
  * Если left>=right, то x-координаты рабочей области не изменяются.
2083
  * Если left>=right, то x-координаты рабочей области не изменяются.
2053
    Если left<0, то left не устанавливается. Если right больше
2084
    Если left<0, то left не устанавливается. Если right больше
2054
    или равно ширины экрана, то right не устанавливается.
2085
    или равно ширины экрана, то right не устанавливается.
2055
    Аналогично по оси y.
2086
    Аналогично по оси y.
2056
  * Смотри также функцию 14,
2087
  * Смотри также функцию 14,
2057
    позволяющую определить размеры всего экрана.
2088
    позволяющую определить размеры всего экрана.
2058
  * Есть парная функция получения рабочей области -
2089
  * Есть парная функция получения рабочей области -
2059
    подфункция 5.
2090
    подфункция 5.
2060
  * Эта функция автоматически перерисовывает экран, по ходу дела
2091
  * Эта функция автоматически перерисовывает экран, по ходу дела
2061
    обновляет координаты и размеры максимизированных окон.
2092
    обновляет координаты и размеры максимизированных окон.
2062
    Все окна извещаются о необходимости перерисовки (событие 1).
2093
    Все окна извещаются о необходимости перерисовки (событие 1).
2063
 
2094
 
2064
======================================================================
2095
======================================================================
2065
====================== Функция 48, подфункция 7 ======================
2096
====================== Функция 48, подфункция 7 ======================
2066
============ Получить область скина для текста заголовка. ============
2097
============ Получить область скина для текста заголовка. ============
2067
======================================================================
2098
======================================================================
2068
Возвращает область заголовка окна со скином, предназначенную
2099
Возвращает область заголовка окна со скином, предназначенную
2069
для вывода текста заголовка.
2100
для вывода текста заголовка.
2070
Параметры:
2101
Параметры:
2071
  * eax = 48 - номер функции
2102
  * eax = 48 - номер функции
2072
  * ebx = 7 - номер подфункции
2103
  * ebx = 7 - номер подфункции
2073
Возвращаемое значение:
2104
Возвращаемое значение:
2074
  * eax = [left]*65536 + [right]
2105
  * eax = [left]*65536 + [right]
2075
  * ebx = [top]*65536 + [bottom]
2106
  * ebx = [top]*65536 + [bottom]
2076
Замечания:
2107
Замечания:
2077
  * Использование/неиспользование этой функции -
2108
  * Использование/неиспользование этой функции -
2078
    личное дело приложения.
2109
    личное дело приложения.
2079
  * Рекомендуется учитывать значения, возвращаемые этой функцией,
2110
  * Рекомендуется учитывать значения, возвращаемые этой функцией,
2080
    при выборе места для рисования текста заголовка (функцией 4) или
2111
    при выборе места для рисования текста заголовка (функцией 4) или
2081
    какого-нибудь заменителя текста заголовка
2112
    какого-нибудь заменителя текста заголовка
2082
    (по усмотрению приложения).
2113
    (по усмотрению приложения).
2083
 
2114
 
2084
======================================================================
2115
======================================================================
2085
==== Функция 48, подфункция 8 - установить используемый скин окон. ===
2116
==== Функция 48, подфункция 8 - установить используемый скин окон. ===
2086
======================================================================
2117
======================================================================
2087
Параметры:
2118
Параметры:
2088
  * eax = 48 - номер функции
2119
  * eax = 48 - номер функции
2089
  * ebx = 8 - номер подфункции
2120
  * ebx = 8 - номер подфункции
2090
  * ecx = указатель на имя файла скина
2121
  * ecx = указатель на имя файла скина
2091
Возвращаемое значение:
2122
Возвращаемое значение:
2092
  * eax = 0 - успешно
2123
  * eax = 0 - успешно
2093
  * eax = 1 - не удалось загрузить файл
2124
  * eax = 1 - не удалось загрузить файл
2094
  * eax = 2 - файл не является файлом скина
2125
  * eax = 2 - файл не является файлом скина
2095
Замечания:
2126
Замечания:
2096
  * При успешной загрузке скина все окна извещаются о необходимости
2127
  * При успешной загрузке скина все окна извещаются о необходимости
2097
    перерисовки (событие 1).
2128
    перерисовки (событие 1).
2098
  * При загрузке система считывает скин из файла default.skn
2129
  * При загрузке система считывает скин из файла default.skn
2099
    на рамдиске.
2130
    на рамдиске.
2100
  * Пользователь может изменять скин статически, создав свой
2131
  * Пользователь может изменять скин статически, создав свой
2101
    default.skn, или динамически с помощью приложения desktop.
2132
    default.skn, или динамически с помощью приложения desktop.
2102
 
2133
 
2103
======================================================================
2134
======================================================================
2104
====== Функция 48, подфункция 9 - настройка сглаживания шрифтов. =====
2135
====== Функция 48, подфункция 9 - настройка сглаживания шрифтов. =====
2105
======================================================================
2136
======================================================================
2106
Параметры:
2137
Параметры:
2107
  * eax = 48 - номер функции
2138
  * eax = 48 - номер функции
2108
  * ebx = 9 - номер подфункции
2139
  * ebx = 9 - номер подфункции
2109
  * cl=0 - выключить сглаживание, иначе включить сглаживание
2140
  * cl=0 - выключить сглаживание, иначе включить сглаживание
2110
 
2141
 
2111
======================================================================
2142
======================================================================
2112
============ Функция 49 - Advanced Power Management (APM). ===========
2143
============ Функция 49 - Advanced Power Management (APM). ===========
2113
======================================================================
2144
======================================================================
2114
Параметры:
2145
Параметры:
2115
  * eax = 49 - номер функции
2146
  * eax = 49 - номер функции
2116
  * dx = номер функции APM (аналог ax в спецификации)
2147
  * dx = номер функции APM (аналог ax в спецификации)
2117
  * bx, cx = параметры функции APM
2148
  * bx, cx = параметры функции APM
2118
Возвращаемое значение:
2149
Возвращаемое значение:
2119
  * 16-битные регистры ax, bx, cx, dx, si, di и флаг CF
2150
  * 16-битные регистры ax, bx, cx, dx, si, di и флаг CF
2120
    установлены в соответствии со спецификацией APM
2151
    установлены в соответствии со спецификацией APM
2121
  * старшие половины 32-битных регистров eax, ebx, ecx,
2152
  * старшие половины 32-битных регистров eax, ebx, ecx,
2122
    edx, esi, edi разрушаются
2153
    edx, esi, edi разрушаются
2123
Замечания:
2154
Замечания:
2124
  * Спецификация APM 1.2 описывается в документе
2155
  * Спецификация APM 1.2 описывается в документе
2125
    "Advanced Power Management (APM) BIOS Specification"
2156
    "Advanced Power Management (APM) BIOS Specification"
2126
    (Revision 1.2), доступном на
2157
    (Revision 1.2), доступном на
2127
    http://www.microsoft.com/whdc/archive/amp_12.mspx;
2158
    http://www.microsoft.com/whdc/archive/amp_12.mspx;
2128
    кроме того, она включена в известный Interrupt List by Ralf Brown
2159
    кроме того, она включена в известный Interrupt List by Ralf Brown
2129
    (http://www.pobox.com/~ralf/files.html,
2160
    (http://www.pobox.com/~ralf/files.html,
2130
    ftp://ftp.cs.cmu.edu/afs/cs/user/ralf/pub/).
2161
    ftp://ftp.cs.cmu.edu/afs/cs/user/ralf/pub/).
2131
 
2162
 
2132
======================================================================
2163
======================================================================
2133
================= Функция 50 - установка формы окна. =================
2164
================= Функция 50 - установка формы окна. =================
2134
======================================================================
2165
======================================================================
2135
Обычные окна представляют собой прямоугольники. С помощью этой функции
2166
Обычные окна представляют собой прямоугольники. С помощью этой функции
2136
окну можно придать произвольную форму. Форма задаётся набором точек
2167
окну можно придать произвольную форму. Форма задаётся набором точек
2137
внутри обрамляющего прямоугольника, принадлежащих окну. Положение и
2168
внутри обрамляющего прямоугольника, принадлежащих окну. Положение и
2138
размеры обрамляющего прямоугольника задаются функцией 0 и изменяются
2169
размеры обрамляющего прямоугольника задаются функцией 0 и изменяются
2139
функцией 67.
2170
функцией 67.
2140
 
2171
 
2141
--------------- Установка данных с информацией о форме ---------------
2172
--------------- Установка данных с информацией о форме ---------------
2142
Параметры:
2173
Параметры:
2143
  * eax = 50 - номер функции
2174
  * eax = 50 - номер функции
2144
  * ebx = 0 - номер подфункции
2175
  * ebx = 0 - номер подфункции
2145
  * ecx = указатель на данные формы (массив байт 0/1)
2176
  * ecx = указатель на данные формы (массив байт 0/1)
2146
Возвращаемое значение:
2177
Возвращаемое значение:
2147
  * функция не возвращает значения
2178
  * функция не возвращает значения
2148
 
2179
 
2149
------------------ Установка масштаба данных формы -------------------
2180
------------------ Установка масштаба данных формы -------------------
2150
Параметры:
2181
Параметры:
2151
  * eax = 50 - номер функции
2182
  * eax = 50 - номер функции
2152
  * ebx = 1 - номер подфункции
2183
  * ebx = 1 - номер подфункции
2153
  * ecx задаёт масштаб: каждый байт данных определяет
2184
  * ecx задаёт масштаб: каждый байт данных определяет
2154
    (2^scale)*(2^scale) пикселей
2185
    (2^scale)*(2^scale) пикселей
2155
Возвращаемое значение:
2186
Возвращаемое значение:
2156
  * функция не возвращает значения
2187
  * функция не возвращает значения
2157
Замечания:
2188
Замечания:
2158
  * Масштаб по умолчанию равен 0 (масштабирующий множитель 1). Если в
2189
  * Масштаб по умолчанию равен 0 (масштабирующий множитель 1). Если в
2159
    данных формы один байт соответствует одному пикселю, то масштаб
2190
    данных формы один байт соответствует одному пикселю, то масштаб
2160
    можно не устанавливать.
2191
    можно не устанавливать.
2161
  * Обозначим xsize = ширина окна (в пикселях), ysize = высота;
2192
  * Обозначим xsize = ширина окна (в пикселях), ysize = высота;
2162
    обратите внимание, что они на единицу больше, чем устанавливаемые
2193
    обратите внимание, что они на единицу больше, чем устанавливаемые
2163
    функциями 0, 67.
2194
    функциями 0, 67.
2164
  * По определению масштаба xsize и ysize должны делиться на 2^scale.
2195
  * По определению масштаба xsize и ysize должны делиться на 2^scale.
2165
  * Байт данных по смещению a должен быть 0/1 и
2196
  * Байт данных по смещению a должен быть 0/1 и
2166
    определяет принадлежность окну квадрата со стороной 2^scale
2197
    определяет принадлежность окну квадрата со стороной 2^scale
2167
    (при scale=0 получаем пиксель) и координатами левого верхнего угла
2198
    (при scale=0 получаем пиксель) и координатами левого верхнего угла
2168
    (a mod (xsize shr scale), a div (xsize shr scale))
2199
    (a mod (xsize shr scale), a div (xsize shr scale))
2169
  * Размер данных: (xsize shr scale)*(ysize shr scale).
2200
  * Размер данных: (xsize shr scale)*(ysize shr scale).
2170
  * Данные должны присутствовать в памяти и не меняться
2201
  * Данные должны присутствовать в памяти и не меняться
2171
    после установки формы.
2202
    после установки формы.
2172
  * Система просматривает данные о форме при каждой перерисовке окна
2203
  * Система просматривает данные о форме при каждой перерисовке окна
2173
    функцией 0.
2204
    функцией 0.
2174
  * Вызов подфункции 0 с нулевым указателем приводит к возврату
2205
  * Вызов подфункции 0 с нулевым указателем приводит к возврату
2175
    к прямоугольной форме.
2206
    к прямоугольной форме.
2176
 
2207
 
2177
======================================================================
2208
======================================================================
2178
===================== Функция 51 - создать поток. ====================
2209
===================== Функция 51 - создать поток. ====================
2179
======================================================================
2210
======================================================================
2180
Параметры:
2211
Параметры:
2181
  * eax = 51 - номер функции
2212
  * eax = 51 - номер функции
2182
  * ebx = 1 - единственная подфункция
2213
  * ebx = 1 - единственная подфункция
2183
  * ecx = адрес точки входа потока (начальный eip)
2214
  * ecx = адрес точки входа потока (начальный eip)
2184
  * edx = указатель стэка потока (начальный esp)
2215
  * edx = указатель стэка потока (начальный esp)
2185
Возвращаемое значение:
2216
Возвращаемое значение:
2186
  * eax = -1 - ошибка (в системе слишком много потоков)
2217
  * eax = -1 - ошибка (в системе слишком много потоков)
2187
  * иначе eax = TID - идентификатор потока
2218
  * иначе eax = TID - идентификатор потока
2188
 
2219
 
2189
======================================================================
2220
======================================================================
2190
====================== Функция 54, подфункция 0 ======================
2221
====================== Функция 54, подфункция 0 ======================
2191
============== Узнать количество слотов в буфере обмена. =============
2222
============== Узнать количество слотов в буфере обмена. =============
2192
======================================================================
2223
======================================================================
2193
Параметры:
2224
Параметры:
2194
  * eax = 54 - номер функции
2225
  * eax = 54 - номер функции
2195
  * ebx = 0 - номер подфункции
2226
  * ebx = 0 - номер подфункции
2196
Возвращаемое значение:
2227
Возвращаемое значение:
2197
  * eax = количество слотов в буфере 
2228
  * eax = количество слотов в буфере 
2198
  * eax = -1 - отсутствует область главного списка
2229
  * eax = -1 - отсутствует область главного списка
2199
 
2230
 
2200
======================================================================
2231
======================================================================
2201
====================== Функция 54, подфункция 1 ======================
2232
====================== Функция 54, подфункция 1 ======================
2202
================== Считать данные из буфера обмена. ==================
2233
================== Считать данные из буфера обмена. ==================
2203
======================================================================
2234
======================================================================
2204
Параметры:
2235
Параметры:
2205
  * eax = 54 - номер функции
2236
  * eax = 54 - номер функции
2206
  * ebx = 1 - номер подфункции
2237
  * ebx = 1 - номер подфункции
2207
  * eсx = номер слота
2238
  * eсx = номер слота
2208
Возвращаемое значение:
2239
Возвращаемое значение:
2209
  * eax = если успешно - указатель на область памяти с данными
2240
  * eax = если успешно - указатель на область памяти с данными
2210
  * eax = 1 - ошибка
2241
  * eax = 1 - ошибка
2211
  * eax = -1 - отсутствует область главного списка
2242
  * eax = -1 - отсутствует область главного списка
2212
 
2243
 
2213
======================================================================
2244
======================================================================
2214
====================== Функция 54, подфункция 2 ======================
2245
====================== Функция 54, подфункция 2 ======================
2215
================== Записать данные в буфер обмена. ===================
2246
================== Записать данные в буфер обмена. ===================
2216
======================================================================
2247
======================================================================
2217
Параметры:
2248
Параметры:
2218
  * eax = 54 - номер функции
2249
  * eax = 54 - номер функции
2219
  * ebx = 2 - номер подфункции
2250
  * ebx = 2 - номер подфункции
2220
  * eсx = количество копируемых байт
2251
  * eсx = количество копируемых байт
2221
  * edx = указатель на буфер под копируемые данные
2252
  * edx = указатель на буфер под копируемые данные
2222
Возвращаемое значение:
2253
Возвращаемое значение:
2223
  * eax = 0 - успешно
2254
  * eax = 0 - успешно
2224
  * eax = 1 - ошибка
2255
  * eax = 1 - ошибка
2225
  * eax = -1 - отсутствует область главного списка
2256
  * eax = -1 - отсутствует область главного списка
2226
 
2257
 
2227
======================================================================
2258
======================================================================
2228
====================== Функция 54, подфункция 3 ======================
2259
====================== Функция 54, подфункция 3 ======================
2229
========= Удалить последний слот с данными в буфере обмена ===========
2260
========= Удалить последний слот с данными в буфере обмена ===========
2230
======================================================================
2261
======================================================================
2231
Параметры:
2262
Параметры:
2232
  * eax = 54 - номер функции
2263
  * eax = 54 - номер функции
2233
  * ebx = 3 - номер подфункции
2264
  * ebx = 3 - номер подфункции
2234
Возвращаемое значение:
2265
Возвращаемое значение:
2235
  * eax = 0 - успешно
2266
  * eax = 0 - успешно
2236
  * eax = 1 - ошибка
2267
  * eax = 1 - ошибка
2237
  * eax = -1 - отсутствует область главного списка
2268
  * eax = -1 - отсутствует область главного списка
2238
 
2269
 
2239
======================================================================
2270
======================================================================
2240
====================== Функция 54, подфункция 4 ======================
2271
====================== Функция 54, подфункция 4 ======================
2241
=================== Аварийный сброс блокировки буфера ================
2272
=================== Аварийный сброс блокировки буфера ================
2242
======================================================================
2273
======================================================================
2243
Параметры:
2274
Параметры:
2244
  * eax = 54 - номер функции
2275
  * eax = 54 - номер функции
2245
  * ebx = 4 - номер подфункции
2276
  * ebx = 4 - номер подфункции
2246
Возвращаемое значение:
2277
Возвращаемое значение:
2247
  * eax = 0 - успешно
2278
  * eax = 0 - успешно
2248
  * eax = -1 - отсутствует область главного списка или нет блокировки
2279
  * eax = -1 - отсутствует область главного списка или нет блокировки
2249
Замечания:
2280
Замечания:
2250
  * Используется в исключительных случаях, когда зависшее или убитое
2281
  * Используется в исключительных случаях, когда зависшее или убитое
2251
    приложение заблокировало работу с буфером обмена.
2282
    приложение заблокировало работу с буфером обмена.
2252
 
2283
 
2253
======================================================================
2284
======================================================================
2254
====================== Функция 55, подфункция 55 =====================
2285
====================== Функция 55, подфункция 55 =====================
2255
========== Начать проигрывать данные на встроенном спикере. ==========
2286
========== Начать проигрывать данные на встроенном спикере. ==========
2256
======================================================================
2287
======================================================================
2257
Параметры:
2288
Параметры:
2258
  * eax = 55 - номер функции
2289
  * eax = 55 - номер функции
2259
  * ebx = 55 - номер подфункции
2290
  * ebx = 55 - номер подфункции
2260
  * esi = указатель на данные
2291
  * esi = указатель на данные
2261
Возвращаемое значение:
2292
Возвращаемое значение:
2262
  * eax = 0 - успешно
2293
  * eax = 0 - успешно
2263
  * eax = 55 - ошибка (спикер отключён или занят)
2294
  * eax = 55 - ошибка (спикер отключён или занят)
2264
Данные - это массив элементов переменной длины.
2295
Данные - это массив элементов переменной длины.
2265
Формат каждого элемента определяется первым байтом:
2296
Формат каждого элемента определяется первым байтом:
2266
  * 0 = конец данных
2297
  * 0 = конец данных
2267
  * 1..0x80 = задаёт длительность звучания в сотых долях секунды
2298
  * 1..0x80 = задаёт длительность звучания в сотых долях секунды
2268
    ноты, определяемой непосредственным значением частоты
2299
    ноты, определяемой непосредственным значением частоты
2269
    * следующее слово (2 байта) содержит делитель частоты;
2300
    * следующее слово (2 байта) содержит делитель частоты;
2270
      частота определяется как 1193180/divider
2301
      частота определяется как 1193180/divider
2271
  * 0x81 = invalid
2302
  * 0x81 = invalid
2272
  * 0x82..0xFF = нота, определяемая октавой и номером:
2303
  * 0x82..0xFF = нота, определяемая октавой и номером:
2273
    * длительность в сотых долях секунды = (первый байт)-0x81
2304
    * длительность в сотых долях секунды = (первый байт)-0x81
2274
    * присутствует ещё один байт;
2305
    * присутствует ещё один байт;
2275
    * (второй байт)=0xFF - пауза
2306
    * (второй байт)=0xFF - пауза
2276
    * иначе он имеет вид a*0x10+b, где b=номер ноты в октаве от 1
2307
    * иначе он имеет вид a*0x10+b, где b=номер ноты в октаве от 1
2277
      до 12, a=номер октавы (считая с 0)
2308
      до 12, a=номер октавы (считая с 0)
2278
Замечания:
2309
Замечания:
2279
  * Пищание спикером может быть запрещено/разрешено подфункцией 8
2310
  * Пищание спикером может быть запрещено/разрешено подфункцией 8
2280
    функции 18.
2311
    функции 18.
2281
  * Функция возвращает управление, сообщив куда следует информацию
2312
  * Функция возвращает управление, сообщив куда следует информацию
2282
    о запросе. Само проигрывание идёт независимо от программы.
2313
    о запросе. Само проигрывание идёт независимо от программы.
2283
  * Данные должны сохраняться в памяти по крайней мере
2314
  * Данные должны сохраняться в памяти по крайней мере
2284
    до конца проигрывания.
2315
    до конца проигрывания.
2285
 
2316
 
2286
======================================================================
2317
======================================================================
2287
======================= Функция 57 - PCI BIOS. =======================
2318
======================= Функция 57 - PCI BIOS. =======================
2288
======================================================================
2319
======================================================================
2289
Параметры:
2320
Параметры:
2290
  * eax = 57 - номер функции
2321
  * eax = 57 - номер функции
2291
  * ebp соответствует регистру al в спецификации PCI BIOS
2322
  * ebp соответствует регистру al в спецификации PCI BIOS
2292
  * остальные регистры - по спецификации PCI BIOS
2323
  * остальные регистры - по спецификации PCI BIOS
2293
Возвращаемое значение:
2324
Возвращаемое значение:
2294
  * CF не определён
2325
  * CF не определён
2295
  * остальные регистры - по спецификации PCI BIOS
2326
  * остальные регистры - по спецификации PCI BIOS
2296
Замечания:
2327
Замечания:
2297
  * Многих результатов этой функции можно также добиться вызовом
2328
  * Многих результатов этой функции можно также добиться вызовом
2298
    соответствующих подфункций функции 62.
2329
    соответствующих подфункций функции 62.
2299
  * Функция вызывает расширение PCI32 BIOS, документированное,
2330
  * Функция вызывает расширение PCI32 BIOS, документированное,
2300
    например, в http://alpha1.dyns.net/files/PCI/bios21.pdf.
2331
    например, в http://alpha1.dyns.net/files/PCI/bios21.pdf.
2301
  * Если BIOS не поддерживает это расширение, поведение функции
2332
  * Если BIOS не поддерживает это расширение, поведение функции
2302
    эмулируется (через аналоги подфункций функции 62 режима ядра).
2333
    эмулируется (через аналоги подфункций функции 62 режима ядра).
2303
 
2334
 
2304
======================================================================
2335
======================================================================
2305
=========== Функция 60 - Inter Process Communication (IPC). ==========
2336
=========== Функция 60 - Inter Process Communication (IPC). ==========
2306
======================================================================
2337
======================================================================
2307
IPC применяется для посылок сообщений от одного процесса/потока
2338
IPC применяется для посылок сообщений от одного процесса/потока
2308
другому. При этом следует предварительно договориться о том, как
2339
другому. При этом следует предварительно договориться о том, как
2309
интерпретировать конкретное сообщение.
2340
интерпретировать конкретное сообщение.
2310
 
2341
 
2311
-------- Подфункция 1 - установить область для получения IPC ---------
2342
-------- Подфункция 1 - установить область для получения IPC ---------
2312
Вызывается процессом-приёмником.
2343
Вызывается процессом-приёмником.
2313
Параметры:
2344
Параметры:
2314
  * eax = 60 - номер функции
2345
  * eax = 60 - номер функции
2315
  * ebx = 1 - номер подфункции
2346
  * ebx = 1 - номер подфункции
2316
  * ecx = указатель на буфер
2347
  * ecx = указатель на буфер
2317
  * edx = размер буфера
2348
  * edx = размер буфера
2318
Возвращаемое значение:
2349
Возвращаемое значение:
2319
  * eax = 0 - всегда успешно
2350
  * eax = 0 - всегда успешно
2320
Формат IPC-буфера:
2351
Формат IPC-буфера:
2321
  * +0: dword: если здесь не 0, то буфер считается заблокированным;
2352
  * +0: dword: если здесь не 0, то буфер считается заблокированным;
2322
    блокируйте/разблокируйте буфер, когда вы с ним активно работаете
2353
    блокируйте/разблокируйте буфер, когда вы с ним активно работаете
2323
    и вам надо, чтобы извне не изменялись данные буфера
2354
    и вам надо, чтобы извне не изменялись данные буфера
2324
    (не поступали новые сообщения)
2355
    (не поступали новые сообщения)
2325
  * +4: dword: занято места в буфере (в байтах)
2356
  * +4: dword: занято места в буфере (в байтах)
2326
  * +8: первое сообщение
2357
  * +8: первое сообщение
2327
  * +8+n: второе сообщение
2358
  * +8+n: второе сообщение
2328
  * ...
2359
  * ...
2329
Формат сообщения:
2360
Формат сообщения:
2330
  * +0: dword: PID процесса/потока, пославшего сообщение
2361
  * +0: dword: PID процесса/потока, пославшего сообщение
2331
  * +4: dword: длина сообщения (не считая этот заголовок)
2362
  * +4: dword: длина сообщения (не считая этот заголовок)
2332
  * +8: n*byte: данные сообщения
2363
  * +8: n*byte: данные сообщения
2333
 
2364
 
2334
--------------- Подфункция 2 - послать сообщение IPC. ----------------
2365
--------------- Подфункция 2 - послать сообщение IPC. ----------------
2335
Вызывается процессом-инициатором.
2366
Вызывается процессом-инициатором.
2336
Параметры:
2367
Параметры:
2337
  * eax = 60 - номер функции
2368
  * eax = 60 - номер функции
2338
  * ebx = 2 - номер подфункции
2369
  * ebx = 2 - номер подфункции
2339
  * ecx = PID приёмника
2370
  * ecx = PID приёмника
2340
  * edx = указатель на данные сообщения
2371
  * edx = указатель на данные сообщения
2341
  * esi = длина сообщения (в байтах)
2372
  * esi = длина сообщения (в байтах)
2342
Возвращаемое значение:
2373
Возвращаемое значение:
2343
  * eax = 0 - успешно
2374
  * eax = 0 - успешно
2344
  * eax = 1 - приёмник не определил буфер для IPC-сообщений
2375
  * eax = 1 - приёмник не определил буфер для IPC-сообщений
2345
    (может быть, ещё не успел, а может быть, это не тот поток,
2376
    (может быть, ещё не успел, а может быть, это не тот поток,
2346
    который нужен)
2377
    который нужен)
2347
  * eax = 2 - приёмник заблокировал IPC-буфер;
2378
  * eax = 2 - приёмник заблокировал IPC-буфер;
2348
    попробуйте немного подождать
2379
    попробуйте немного подождать
2349
  * eax = 3 - переполнение IPC-буфера приёмника
2380
  * eax = 3 - переполнение IPC-буфера приёмника
2350
  * eax = 4 - процесса/потока с таким PID не существует
2381
  * eax = 4 - процесса/потока с таким PID не существует
2351
Замечания:
2382
Замечания:
2352
  * Система сразу после записи IPC-сообщения в буфер посылает
2383
  * Система сразу после записи IPC-сообщения в буфер посылает
2353
    потоку-приёмнику событие с кодом 7 (см. коды событий).
2384
    потоку-приёмнику событие с кодом 7 (см. коды событий).
2354
 
2385
 
2355
======================================================================
2386
======================================================================
2356
=== Функция 61 - получить параметры для прямого доступа к графике. ===
2387
=== Функция 61 - получить параметры для прямого доступа к графике. ===
2357
======================================================================
2388
======================================================================
2358
Программе доступны данные графического экрана (область памяти, которая
2389
Программе доступны данные графического экрана (область памяти, которая
2359
собственно и отображает содержимое экрана) напрямую без вызовов
2390
собственно и отображает содержимое экрана) напрямую без вызовов
2360
системных функций через селектор gs:
2391
системных функций через селектор gs:
2361
	mov	eax, [gs:0]
2392
	mov	eax, [gs:0]
2362
поместит в eax первый dword буфера, содержащий информацию о цвете
2393
поместит в eax первый dword буфера, содержащий информацию о цвете
2363
левой верхней точки (и, возможно, цвета нескольких следующих).
2394
левой верхней точки (и, возможно, цвета нескольких следующих).
2364
	mov	[gs:0], eax
2395
	mov	[gs:0], eax
2365
при работе в режимах VESA c LFB
2396
при работе в режимах VESA c LFB
2366
установит цвет левой верхней точки
2397
установит цвет левой верхней точки
2367
(и возможно, цвета нескольких следующих).
2398
(и возможно, цвета нескольких следующих).
2368
Для интерпретации данных графического экрана требуется знание
2399
Для интерпретации данных графического экрана требуется знание
2369
некоторых параметров, которые возвращаются этой функцией.
2400
некоторых параметров, которые возвращаются этой функцией.
2370
Замечания:
2401
Замечания:
2371
  * Параметры графики очень редко меняются при работе системы,
2402
  * Параметры графики очень редко меняются при работе системы,
2372
    а именно, только в случаях, когда пользователь работает
2403
    а именно, только в случаях, когда пользователь работает
2373
    с программой VRR.
2404
    с программой VRR.
2374
  * При изменении видеорежима система перерисовывает все окна
2405
  * При изменении видеорежима система перерисовывает все окна
2375
    (событие с кодом 1) и перерисовывает фон (событие 5).
2406
    (событие с кодом 1) и перерисовывает фон (событие 5).
2376
    Эти же события происходят и в других случаях,
2407
    Эти же события происходят и в других случаях,
2377
    которые встречаются значительно чаще, чем изменение видеорежима.
2408
    которые встречаются значительно чаще, чем изменение видеорежима.
2378
  * При работе в видеорежимах с LFB селектор gs указывает на
2409
  * При работе в видеорежимах с LFB селектор gs указывает на
2379
    собственно LFB, так что чтение/запись по gs приводят
2410
    собственно LFB, так что чтение/запись по gs приводят
2380
    непосредственно к изменению содержимого экрана. При работе в
2411
    непосредственно к изменению содержимого экрана. При работе в
2381
    видеорежимах без LFB gs указывает на некоторую область данных
2412
    видеорежимах без LFB gs указывает на некоторую область данных
2382
    ядра, причём все функции вывода на экран добросовестно выполняют
2413
    ядра, причём все функции вывода на экран добросовестно выполняют
2383
    двойную работу по записи непосредственно на экран и по записи
2414
    двойную работу по записи непосредственно на экран и по записи
2384
    в этот буфер. В результате при чтении содержимого этого буфера
2415
    в этот буфер. В результате при чтении содержимого этого буфера
2385
    результаты соответствуют содержимому экрана
2416
    результаты соответствуют содержимому экрана
2386
    (с, вообще говоря, большим цветовым разрешением),
2417
    (с, вообще говоря, большим цветовым разрешением),
2387
    а запись игнорируется.
2418
    а запись игнорируется.
2388
    Исключением является режим 320*200, для которого в главном цикле
2419
    Исключением является режим 320*200, для которого в главном цикле
2389
    системного потока выполняется обновление экрана в соответствии
2420
    системного потока выполняется обновление экрана в соответствии
2390
    с движениями курсора мыши.
2421
    с движениями курсора мыши.
2391
 
2422
 
2392
------------------------- Разрешение экрана --------------------------
2423
------------------------- Разрешение экрана --------------------------
2393
Параметры:
2424
Параметры:
2394
  * eax = 61 - номер функции
2425
  * eax = 61 - номер функции
2395
  * ebx = 1 - номер подфункции
2426
  * ebx = 1 - номер подфункции
2396
Возвращаемое значение:
2427
Возвращаемое значение:
2397
  * eax = [разрешение по оси x]*65536 + [разрешение по оси y]
2428
  * eax = [разрешение по оси x]*65536 + [разрешение по оси y]
2398
Замечания:
2429
Замечания:
2399
  * Можно использовать функцию 14 с учётом того, что она возвращает
2430
  * Можно использовать функцию 14 с учётом того, что она возвращает
2400
    размеры на 1 меньше. Это полностью эквивалентный способ.
2431
    размеры на 1 меньше. Это полностью эквивалентный способ.
2401
 
2432
 
2402
------------------------ Число бит на пиксель ------------------------
2433
------------------------ Число бит на пиксель ------------------------
2403
Параметры:
2434
Параметры:
2404
  * eax = 61 - номер функции
2435
  * eax = 61 - номер функции
2405
  * ebx = 2 - номер подфункции
2436
  * ebx = 2 - номер подфункции
2406
Возвращаемое значение:
2437
Возвращаемое значение:
2407
  * eax = число бит на пиксель (24 или 32)
2438
  * eax = число бит на пиксель (24 или 32)
2408
 
2439
 
2409
------------------------ Число байт на строку ------------------------
2440
------------------------ Число байт на строку ------------------------
2410
Параметры:
2441
Параметры:
2411
  * eax = 61 - номер функции
2442
  * eax = 61 - номер функции
2412
  * ebx = 3 - номер подфункции
2443
  * ebx = 3 - номер подфункции
2413
Возвращаемое значение:
2444
Возвращаемое значение:
2414
  * eax = число байт, которое занимает одна строка развёртки
2445
  * eax = число байт, которое занимает одна строка развёртки
2415
    (горизонтальная линия на экране)
2446
    (горизонтальная линия на экране)
2416
 
2447
 
2417
======================================================================
2448
======================================================================
2418
===== Функция 62, подфункция 0 - получить версию PCI-интерфейса. =====
2449
===== Функция 62, подфункция 0 - получить версию PCI-интерфейса. =====
2419
======================================================================
2450
======================================================================
2420
Параметры:
2451
Параметры:
2421
  * eax = 62 - номер функции
2452
  * eax = 62 - номер функции
2422
  * bl = 0 - номер подфункции
2453
  * bl = 0 - номер подфункции
2423
Возвращаемое значение:
2454
Возвращаемое значение:
2424
  * eax = -1 - доступ к PCI запрещён; иначе
2455
  * eax = -1 - доступ к PCI запрещён; иначе
2425
  * ah.al = версия PCI-интерфейса (ah=версия, al=подверсия)
2456
  * ah.al = версия PCI-интерфейса (ah=версия, al=подверсия)
2426
  * старшее слово eax обнулено
2457
  * старшее слово eax обнулено
2427
Замечания:
2458
Замечания:
2428
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2459
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2429
    для приложений подфункцией 12 функции 21.
2460
    для приложений подфункцией 12 функции 21.
2430
  * Если PCI BIOS не поддерживается, то значение ax неопределено.
2461
  * Если PCI BIOS не поддерживается, то значение ax неопределено.
2431
 
2462
 
2432
======================================================================
2463
======================================================================
2433
==== Функция 62, подфункция 1 - получить номер последней PCI-шины. ===
2464
==== Функция 62, подфункция 1 - получить номер последней PCI-шины. ===
2434
======================================================================
2465
======================================================================
2435
Параметры:
2466
Параметры:
2436
  * eax = 62 - номер функции
2467
  * eax = 62 - номер функции
2437
  * bl = 1 - номер подфункции
2468
  * bl = 1 - номер подфункции
2438
Возвращаемое значение:
2469
Возвращаемое значение:
2439
  * eax = -1 - доступ к PCI запрещён; иначе
2470
  * eax = -1 - доступ к PCI запрещён; иначе
2440
  * al = номер последней PCI-шины; оставшиеся байты eax разрушаются
2471
  * al = номер последней PCI-шины; оставшиеся байты eax разрушаются
2441
Замечания:
2472
Замечания:
2442
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2473
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2443
    для приложений подфункцией 12 функции 21.
2474
    для приложений подфункцией 12 функции 21.
2444
  * Если PCI BIOS не поддерживается, то значение al неопределено.
2475
  * Если PCI BIOS не поддерживается, то значение al неопределено.
2445
 
2476
 
2446
======================================================================
2477
======================================================================
2447
====================== Функция 62, подфункция 2 ======================
2478
====================== Функция 62, подфункция 2 ======================
2448
== Получить механизм обращения к конфигурационному пространству PCI. =
2479
== Получить механизм обращения к конфигурационному пространству PCI. =
2449
======================================================================
2480
======================================================================
2450
Параметры:
2481
Параметры:
2451
  * eax = 62 - номер функции
2482
  * eax = 62 - номер функции
2452
  * bl = 2 - номер подфункции
2483
  * bl = 2 - номер подфункции
2453
Возвращаемое значение:
2484
Возвращаемое значение:
2454
  * eax = -1 - доступ к PCI запрещён; иначе
2485
  * eax = -1 - доступ к PCI запрещён; иначе
2455
  * al = механизм (1 или 2); прочие байты eax разрушаются
2486
  * al = механизм (1 или 2); прочие байты eax разрушаются
2456
Замечания:
2487
Замечания:
2457
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2488
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2458
    для приложений подфункцией 12 функции 21.
2489
    для приложений подфункцией 12 функции 21.
2459
  * Механизм обращения выбирается в соответствии
2490
  * Механизм обращения выбирается в соответствии
2460
    с характеристиками оборудования.
2491
    с характеристиками оборудования.
2461
  * Подфункции чтения и записи автоматически работают
2492
  * Подфункции чтения и записи автоматически работают
2462
    с выбранным механизмом.
2493
    с выбранным механизмом.
2463
 
2494
 
2464
======================================================================
2495
======================================================================
2465
======== Функция 62, подфункции 4,5,6 - прочитать PCI-регистр. =======
2496
======== Функция 62, подфункции 4,5,6 - прочитать PCI-регистр. =======
2466
======================================================================
2497
======================================================================
2467
Параметры:
2498
Параметры:
2468
  * eax = 62 - номер функции
2499
  * eax = 62 - номер функции
2469
  * bl = 4 - читать байт
2500
  * bl = 4 - читать байт
2470
  * bl = 5 - читать слово
2501
  * bl = 5 - читать слово
2471
  * bl = 6 - читать двойное слово
2502
  * bl = 6 - читать двойное слово
2472
  * bh = номер PCI-шины
2503
  * bh = номер PCI-шины
2473
  * ch = dddddfff, где ddddd = номер устройства на шине,
2504
  * ch = dddddfff, где ddddd = номер устройства на шине,
2474
    fff = номер функции устройства
2505
    fff = номер функции устройства
2475
  * cl = номер регистра (должен быть чётным для bl=5,
2506
  * cl = номер регистра (должен быть чётным для bl=5,
2476
    делиться на 4 для bl=6)
2507
    делиться на 4 для bl=6)
2477
Возвращаемое значение:
2508
Возвращаемое значение:
2478
  * eax = -1 - ошибка (запрещён доступ к PCI или
2509
  * eax = -1 - ошибка (запрещён доступ к PCI или
2479
    неподдерживаемые параметры); иначе
2510
    неподдерживаемые параметры); иначе
2480
  * al/ax/eax (в зависимости от запрошенного размера) содержит данные;
2511
  * al/ax/eax (в зависимости от запрошенного размера) содержит данные;
2481
    оставшаяся часть регистра eax разрушается
2512
    оставшаяся часть регистра eax разрушается
2482
Замечания:
2513
Замечания:
2483
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2514
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2484
    для приложений подфункцией 12 функции 21.
2515
    для приложений подфункцией 12 функции 21.
2485
  * Механизм доступа 2 поддерживает только 16 устройств на шине и
2516
  * Механизм доступа 2 поддерживает только 16 устройств на шине и
2486
    игнорирует номер функции. Получить механизм доступа можно вызовом
2517
    игнорирует номер функции. Получить механизм доступа можно вызовом
2487
    подфункции 2.
2518
    подфункции 2.
2488
  * Некоторые регистры стандартны и существуют для всех устройств,
2519
  * Некоторые регистры стандартны и существуют для всех устройств,
2489
    некоторые определяются конкретным устройством. Список первых
2520
    некоторые определяются конкретным устройством. Список первых
2490
    входит, например, в известный Interrupt List by Ralf Brown
2521
    входит, например, в известный Interrupt List by Ralf Brown
2491
    (http://www.pobox.com/~ralf/files.html,
2522
    (http://www.pobox.com/~ralf/files.html,
2492
    ftp://ftp.cs.cmu.edu/afs/cs/user/ralf/pub/);
2523
    ftp://ftp.cs.cmu.edu/afs/cs/user/ralf/pub/);
2493
    список вторых должен быть указан в документации по устройству.
2524
    список вторых должен быть указан в документации по устройству.
2494
 
2525
 
2495
======================================================================
2526
======================================================================
2496
======= Функция 62, подфункции 8,9,10 - записать в PCI-регистр. ======
2527
======= Функция 62, подфункции 8,9,10 - записать в PCI-регистр. ======
2497
======================================================================
2528
======================================================================
2498
Параметры:
2529
Параметры:
2499
  * eax = 62 - номер функции
2530
  * eax = 62 - номер функции
2500
  * bl = 8 - писать байт
2531
  * bl = 8 - писать байт
2501
  * bl = 9 - писать слово
2532
  * bl = 9 - писать слово
2502
  * bl = 10 - писать двойное слово
2533
  * bl = 10 - писать двойное слово
2503
  * bh = номер PCI-шины
2534
  * bh = номер PCI-шины
2504
  * ch = dddddfff, где ddddd = номер устройства на шине,
2535
  * ch = dddddfff, где ddddd = номер устройства на шине,
2505
    fff = номер функции устройства
2536
    fff = номер функции устройства
2506
  * cl = номер регистра (должен быть чётным для bl=9,
2537
  * cl = номер регистра (должен быть чётным для bl=9,
2507
    делиться на 4 для bl=10)
2538
    делиться на 4 для bl=10)
2508
  * dl/dx/edx (в зависимости от запрошенного размера) содержит
2539
  * dl/dx/edx (в зависимости от запрошенного размера) содержит
2509
    данные для записи
2540
    данные для записи
2510
Возвращаемое значение:
2541
Возвращаемое значение:
2511
  * eax = -1 - ошибка (запрещён доступ к PCI или
2542
  * eax = -1 - ошибка (запрещён доступ к PCI или
2512
    неподдерживаемые параметры)
2543
    неподдерживаемые параметры)
2513
  * eax = 0 - успешно
2544
  * eax = 0 - успешно
2514
Замечания:
2545
Замечания:
2515
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2546
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
2516
    для приложений подфункцией 12 функции 21.
2547
    для приложений подфункцией 12 функции 21.
2517
  * Механизм доступа 2 поддерживает только 16 устройств на шине и
2548
  * Механизм доступа 2 поддерживает только 16 устройств на шине и
2518
    игнорирует номер функции. Получить механизм доступа можно вызовом
2549
    игнорирует номер функции. Получить механизм доступа можно вызовом
2519
    подфункции 2.
2550
    подфункции 2.
2520
  * Некоторые регистры стандартны и существуют для всех устройств,
2551
  * Некоторые регистры стандартны и существуют для всех устройств,
2521
    некоторые определяются конкретным устройством. Список первых
2552
    некоторые определяются конкретным устройством. Список первых
2522
    входит, например, в известный Interrupt List by Ralf Brown;
2553
    входит, например, в известный Interrupt List by Ralf Brown;
2523
    список вторых должен быть указан в документации по устройству.
2554
    список вторых должен быть указан в документации по устройству.
2524
 
2555
 
2525
======================================================================
2556
======================================================================
2526
================ Функция 63 - работа с доской отладки. ===============
2557
================ Функция 63 - работа с доской отладки. ===============
2527
======================================================================
2558
======================================================================
2528
Доска отладки представляет собой системный буфер (на 4096 байт),
2559
Доска отладки представляет собой системный буфер (на 4096 байт),
2529
в который любая программа может записать (вообще говоря, произвольные)
2560
в который любая программа может записать (вообще говоря, произвольные)
2530
данные и из которого другая программа может эти данные прочитать.
2561
данные и из которого другая программа может эти данные прочитать.
2531
Есть соглашение, в соответствии с которым записываемые данные -
2562
Есть соглашение, в соответствии с которым записываемые данные -
2532
текстовые строки, интерпретируемые как отладочные сообщения о ходе
2563
текстовые строки, интерпретируемые как отладочные сообщения о ходе
2533
выполнения программы. Ядро в определённых ситуациях также записывает
2564
выполнения программы. Ядро в определённых ситуациях также записывает
2534
на доску отладки сведения о выполнении некоторых функций;
2565
на доску отладки сведения о выполнении некоторых функций;
2535
по соглашению сообщения ядра начинаются с префикса "K : ".
2566
по соглашению сообщения ядра начинаются с префикса "K : ".
2536
Для просмотра доски отладки создано приложение board,
2567
Для просмотра доски отладки создано приложение board,
2537
которое считывает данные из буфера и отображает их в своём окне. board
2568
которое считывает данные из буфера и отображает их в своём окне. board
2538
понимает последовательность кодов 13,10 как переход на новую строку.
2569
понимает последовательность кодов 13,10 как переход на новую строку.
2539
Символ с нулевым кодом в конце строки не обязателен, но и не мешает.
2570
Символ с нулевым кодом в конце строки не обязателен, но и не мешает.
2540
В связи с появлением отладчика ценность доски отладки несколько
2571
В связи с появлением отладчика ценность доски отладки несколько
2541
снизилась, поскольку отладчик позволяет полностью контролировать ход
2572
снизилась, поскольку отладчик позволяет полностью контролировать ход
2542
выполнения программы, причём для этого не требуется никаких усилий
2573
выполнения программы, причём для этого не требуется никаких усилий
2543
со стороны самой программы. Тем не менее во многих случаях
2574
со стороны самой программы. Тем не менее во многих случаях
2544
доска отладки продолжает оставаться полезной.
2575
доска отладки продолжает оставаться полезной.
2545
 
2576
 
2546
---------------------------- Запись байта ----------------------------
2577
---------------------------- Запись байта ----------------------------
2547
Параметры:
2578
Параметры:
2548
  * eax = 63 - номер функции
2579
  * eax = 63 - номер функции
2549
  * ebx = 1 - номер подфункции
2580
  * ebx = 1 - номер подфункции
2550
  * cl = байт данных
2581
  * cl = байт данных
2551
Возвращаемое значение:
2582
Возвращаемое значение:
2552
  * функция не возвращает значения
2583
  * функция не возвращает значения
2553
Замечания:
2584
Замечания:
2554
  * Байт записывается в буфер. Длина буфера - 512 байт.
2585
  * Байт записывается в буфер. Длина буфера - 512 байт.
2555
    При переполнении буфера все полученные данные теряются
2586
    При переполнении буфера все полученные данные теряются
2556
    и заполнение начинается снова с нуля.
2587
    и заполнение начинается снова с нуля.
2557
  * Для вывода на доску отладки более сложных объектов (строк, чисел)
2588
  * Для вывода на доску отладки более сложных объектов (строк, чисел)
2558
    достаточно этой функции, вызываемой в цикле. Можно не писать
2589
    достаточно этой функции, вызываемой в цикле. Можно не писать
2559
    вручную соответствующий код, а воспользоваться файлом debug.inc,
2590
    вручную соответствующий код, а воспользоваться файлом debug.inc,
2560
    входящим в дистрибутив.
2591
    входящим в дистрибутив.
2561
 
2592
 
2562
---------------------------- Чтение байта ----------------------------
2593
---------------------------- Чтение байта ----------------------------
2563
Забирает байт из буфера.
2594
Забирает байт из буфера.
2564
Параметры:
2595
Параметры:
2565
  * eax = 63 - номер функции
2596
  * eax = 63 - номер функции
2566
  * ebx = 2 - номер подфункции
2597
  * ebx = 2 - номер подфункции
2567
Возвращаемое значение:
2598
Возвращаемое значение:
2568
  * eax = ebx = 0 - буфер пуст
2599
  * eax = ebx = 0 - буфер пуст
2569
  * eax = байт, ebx = 1 - байт успешно прочитан
2600
  * eax = байт, ebx = 1 - байт успешно прочитан
2570
 
2601
 
2571
======================================================================
2602
======================================================================
2572
========== Функция 64 - перераспределить память приложения. ==========
2603
========== Функция 64 - перераспределить память приложения. ==========
2573
======================================================================
2604
======================================================================
2574
Параметры:
2605
Параметры:
2575
  * eax = 64 - номер функции
2606
  * eax = 64 - номер функции
2576
  * ebx = 1 - единственная подфункция
2607
  * ebx = 1 - единственная подфункция
2577
  * ecx = новый размер памяти
2608
  * ecx = новый размер памяти
2578
Возвращаемое значение:
2609
Возвращаемое значение:
2579
  * eax = 0 - успешно
2610
  * eax = 0 - успешно
2580
  * eax = 1 - недостаточно памяти
2611
  * eax = 1 - недостаточно памяти
2581
Замечания:
2612
Замечания:
2582
  * Есть другой способ выделения/освобождения динамической памяти -
2613
  * Есть другой способ выделения/освобождения динамической памяти -
2583
    подфункции 11, 12, 13 функции 68.
2614
    подфункции 11, 12, 13 функции 68.
2584
  * Функция не может использоваться совместно с 68.11, 68.12, 68.13.
2615
  * Функция не может использоваться совместно с 68.11, 68.12, 68.13.
2585
    Вызов функции будет игнорироваться, если приложение создаст
2616
    Вызов функции будет игнорироваться, если приложение создаст
2586
    локальную кучу вызовом 68.11.
2617
    локальную кучу вызовом 68.11.
2587
 
2618
 
2588
======================================================================
2619
======================================================================
2589
========= Функция 65 - вывести изображение с палитрой в окно. ========
2620
========= Функция 65 - вывести изображение с палитрой в окно. ========
2590
======================================================================
2621
======================================================================
2591
Параметры:
2622
Параметры:
2592
  * eax = 65 - номер функции
2623
  * eax = 65 - номер функции
2593
  * ebx = указатель на изображение
2624
  * ebx = указатель на изображение
2594
  * ecx = [размер по оси x]*65536 + [размер по оси y]
2625
  * ecx = [размер по оси x]*65536 + [размер по оси y]
2595
  * edx = [координата по оси x]*65536 + [координата по оси y]
2626
  * edx = [координата по оси x]*65536 + [координата по оси y]
2596
  * esi = число бит на пиксель, должно быть 1,2,4,8,9,15,16,24 или 32
2627
  * esi = число бит на пиксель, должно быть 1,2,4,8,9,15,16,24 или 32
2597
  * edi = указатель на палитру (2 в степени esi цветов 0x00RRGGBB);
2628
  * edi = указатель на палитру (2 в степени esi цветов 0x00RRGGBB);
2598
          игнорируется при esi > 8
2629
          игнорируется при esi > 8
2599
  * ebp = смещение данных каждой следующей строки изображения
2630
  * ebp = смещение данных каждой следующей строки изображения
2600
          относительно предыдущей
2631
          относительно предыдущей
2601
Возвращаемое значение:
2632
Возвращаемое значение:
2602
  * функция не возвращает значения
2633
  * функция не возвращает значения
2603
Замечания:
2634
Замечания:
2604
  * Координаты изображения - это координаты верхнего левого угла
2635
  * Координаты изображения - это координаты верхнего левого угла
2605
    изображения относительно окна.
2636
    изображения относительно окна.
2606
  * Формат изображения с 1 битом на пиксель: каждый байт изображения,
2637
  * Формат изображения с 1 битом на пиксель: каждый байт изображения,
2607
    за исключением, быть может, последних байтов строк, содержит
2638
    за исключением, быть может, последних байтов строк, содержит
2608
    информацию о цвете 8 пикселей, старший бит соответствует первому
2639
    информацию о цвете 8 пикселей, старший бит соответствует первому
2609
    пикселю.
2640
    пикселю.
2610
  * Формат изображения с 2 битами на пиксель: каждый байт изображения,
2641
  * Формат изображения с 2 битами на пиксель: каждый байт изображения,
2611
    за исключением, быть может, последних байтов строк, содержит
2642
    за исключением, быть может, последних байтов строк, содержит
2612
    информацию о цвете 4 пикселей, старшие два бита соответствуют
2643
    информацию о цвете 4 пикселей, старшие два бита соответствуют
2613
    первому пикселю.
2644
    первому пикселю.
2614
  * Формат изображения с 4 битами на пиксель: каждый байт изображения,
2645
  * Формат изображения с 4 битами на пиксель: каждый байт изображения,
2615
    за исключением последних байтов строк (если ширина изображения
2646
    за исключением последних байтов строк (если ширина изображения
2616
    нечётна), содержит информацию о цвете 2 пикселей, старшая тетрада
2647
    нечётна), содержит информацию о цвете 2 пикселей, старшая тетрада
2617
    соответствует первому пикселю.
2648
    соответствует первому пикселю.
2618
  * Формат изображения с 8 битами на пиксель: каждый байт изображения
2649
  * Формат изображения с 8 битами на пиксель: каждый байт изображения
2619
    рассматривается как индекс в палитре.
2650
    рассматривается как индекс в палитре.
2620
  * Формат изображения с 9 битами на пиксель: каждый байт изображения
2651
  * Формат изображения с 9 битами на пиксель: каждый байт изображения
2621
    (8 бит) обозначает интенсивность серого для одного пикселя, т.о.
2652
    (8 бит) обозначает интенсивность серого для одного пикселя, т.о.
2622
    этот тип изображения идентичен 8 бит на пиксель без палитры.
2653
    этот тип изображения идентичен 8 бит на пиксель без палитры.
2623
  * Формат изображения с 15 битами на пиксель: цвет каждого пикселя
2654
  * Формат изображения с 15 битами на пиксель: цвет каждого пикселя
2624
    кодируется как (в битовом представлении) 0RRRRRGGGGGBBBBB -
2655
    кодируется как (в битовом представлении) 0RRRRRGGGGGBBBBB -
2625
    по 5 пикселей на каждый цвет.
2656
    по 5 пикселей на каждый цвет.
2626
  * Формат изображения с 16 битами на пиксель: цвет каждого пикселя
2657
  * Формат изображения с 16 битами на пиксель: цвет каждого пикселя
2627
    кодируется как RRRRRGGGGGGBBBBB (схема 5+6+5).
2658
    кодируется как RRRRRGGGGGGBBBBB (схема 5+6+5).
2628
  * Формат изображения с 24 битами на пиксель: цвет каждого пикселя
2659
  * Формат изображения с 24 битами на пиксель: цвет каждого пикселя
2629
    кодируется тремя байтами - последовательно синяя, зелёная, красная
2660
    кодируется тремя байтами - последовательно синяя, зелёная, красная
2630
    составляющие цвета.
2661
    составляющие цвета.
2631
  * Формат изображения с 32 битами на пиксель: аналогично 24, только
2662
  * Формат изображения с 32 битами на пиксель: аналогично 24, только
2632
    есть ещё игнорируемый четвёртый байт.
2663
    есть ещё игнорируемый четвёртый байт.
2633
  * Вызов функции 7 эквивалентен вызову этой функции с параметрами
2664
  * Вызов функции 7 эквивалентен вызову этой функции с параметрами
2634
    esi=24, ebp=0.
2665
    esi=24, ebp=0.
2635
 
2666
 
2636
======================================================================
2667
======================================================================
2637
================= Функция 66 - работа с клавиатурой. =================
2668
================= Функция 66 - работа с клавиатурой. =================
2638
======================================================================
2669
======================================================================
2639
Режим ввода влияет на результаты чтения клавиш функцией 2.
2670
Режим ввода влияет на результаты чтения клавиш функцией 2.
2640
При загрузке программы для неё устанавливается ASCII-режим ввода.
2671
При загрузке программы для неё устанавливается ASCII-режим ввода.
2641
 
2672
 
2642
-------- Подфункция 1 - установить режим ввода с клавиатуры. ---------
2673
-------- Подфункция 1 - установить режим ввода с клавиатуры. ---------
2643
Параметры:
2674
Параметры:
2644
  * eax = 66 - номер функции
2675
  * eax = 66 - номер функции
2645
  * ebx = 1 - номер подфункции
2676
  * ebx = 1 - номер подфункции
2646
  * ecx = режим:
2677
  * ecx = режим:
2647
    * 0 = обычный (ASCII-символы)
2678
    * 0 = обычный (ASCII-символы)
2648
    * 1 = сканкоды
2679
    * 1 = сканкоды
2649
Возвращаемое значение:
2680
Возвращаемое значение:
2650
  * функция не возвращает значения
2681
  * функция не возвращает значения
2651
 
2682
 
2652
--------- Подфункция 2 - получить режим ввода с клавиатуры. ----------
2683
--------- Подфункция 2 - получить режим ввода с клавиатуры. ----------
2653
Параметры:
2684
Параметры:
2654
  * eax = 66 - номер функции
2685
  * eax = 66 - номер функции
2655
  * ebx = 2 - номер подфункции
2686
  * ebx = 2 - номер подфункции
2656
Возвращаемое значение:
2687
Возвращаемое значение:
2657
  * eax = текущий режим
2688
  * eax = текущий режим
2658
 
2689
 
2659
------- Подфункция 3 - получить состояние управляющих клавиш. --------
2690
------- Подфункция 3 - получить состояние управляющих клавиш. --------
2660
Параметры:
2691
Параметры:
2661
  * eax = 66 - номер функции
2692
  * eax = 66 - номер функции
2662
  * ebx = 3 - номер подфункции
2693
  * ebx = 3 - номер подфункции
2663
Возвращаемое значение:
2694
Возвращаемое значение:
2664
  * eax = битовая маска:
2695
  * eax = битовая маска:
2665
  * бит 0  (маска 1): левый Shift нажат
2696
  * бит 0  (маска 1): левый Shift нажат
2666
  * бит 1  (маска 2): правый Shift нажат
2697
  * бит 1  (маска 2): правый Shift нажат
2667
  * бит 2  (маска 4): левый Ctrl нажат
2698
  * бит 2  (маска 4): левый Ctrl нажат
2668
  * бит 3  (маска 8): правый Ctrl нажат
2699
  * бит 3  (маска 8): правый Ctrl нажат
2669
  * бит 4  (маска 0x10): левый Alt нажат
2700
  * бит 4  (маска 0x10): левый Alt нажат
2670
  * бит 5  (маска 0x20): правый Alt нажат
2701
  * бит 5  (маска 0x20): правый Alt нажат
2671
  * бит 6  (маска 0x40): CapsLock включён
2702
  * бит 6  (маска 0x40): CapsLock включён
2672
  * бит 7  (маска 0x80): NumLock включён
2703
  * бит 7  (маска 0x80): NumLock включён
2673
  * бит 8  (маска 0x100): ScrollLock включён
2704
  * бит 8  (маска 0x100): ScrollLock включён
2674
  * бит 9  (маска 0x200): левый Win нажат
2705
  * бит 9  (маска 0x200): левый Win нажат
2675
  * бит 10 (маска 0x400): правый Win нажат
2706
  * бит 10 (маска 0x400): правый Win нажат
2676
  * прочие биты сброшены
2707
  * прочие биты сброшены
2677
 
2708
 
2678
----- Подфункция 4 - установить общесистемную "горячую клавишу". -----
2709
----- Подфункция 4 - установить общесистемную "горячую клавишу". -----
2679
О нажатии "горячей клавиши" извещаются только приложения,
2710
О нажатии "горячей клавиши" извещаются только приложения,
2680
установившие её; активное приложение (к которому поступает
2711
установившие её; активное приложение (к которому поступает
2681
весь нормальный ввод) таких клавиш не получает.
2712
весь нормальный ввод) таких клавиш не получает.
2682
Извещение заключается в посылке события с кодом 2.
2713
Извещение заключается в посылке события с кодом 2.
2683
Прочитать "горячую клавишу" можно так же, как и обычную, -
2714
Прочитать "горячую клавишу" можно так же, как и обычную, -
2684
функцией 2.
2715
функцией 2.
2685
Параметры:
2716
Параметры:
2686
  * eax = 66 - номер функции
2717
  * eax = 66 - номер функции
2687
  * ebx = 4 - номер подфункции
2718
  * ebx = 4 - номер подфункции
2688
  * cl задаёт сканкод клавиши;
2719
  * cl задаёт сканкод клавиши;
2689
    используйте cl=0 для задания комбинаций типа Ctrl+Shift
2720
    используйте cl=0 для задания комбинаций типа Ctrl+Shift
2690
  * edx = 0xXYZ задаёт возможные состояния управляющих клавиш:
2721
  * edx = 0xXYZ задаёт возможные состояния управляющих клавиш:
2691
    * Z (младшие 4 бита) задаёт состояние клавиш LShift и RShift:
2722
    * Z (младшие 4 бита) задаёт состояние клавиш LShift и RShift:
2692
      * 0 = ни одна из клавиш не должна быть нажата;
2723
      * 0 = ни одна из клавиш не должна быть нажата;
2693
      * 1 = ровно одна из клавиш должна быть нажата;
2724
      * 1 = ровно одна из клавиш должна быть нажата;
2694
      * 2 = обе клавиши должны быть нажаты;
2725
      * 2 = обе клавиши должны быть нажаты;
2695
      * 3 = должна быть нажата LShift, но не RShift;
2726
      * 3 = должна быть нажата LShift, но не RShift;
2696
      * 4 = должна быть нажата RShift, но не LShift
2727
      * 4 = должна быть нажата RShift, но не LShift
2697
    * Y - аналогично для LCtrl и RCtrl;
2728
    * Y - аналогично для LCtrl и RCtrl;
2698
    * X - аналогично для LAlt и RAlt
2729
    * X - аналогично для LAlt и RAlt
2699
Возвращаемое значение:
2730
Возвращаемое значение:
2700
  * eax=0 - успешно
2731
  * eax=0 - успешно
2701
  * eax=1 - слишком много "горячих клавиш" (допускается максимум 256)
2732
  * eax=1 - слишком много "горячих клавиш" (допускается максимум 256)
2702
Замечания:
2733
Замечания:
2703
  * Горячая клавиша может срабатывать либо при нажатии,
2734
  * Горячая клавиша может срабатывать либо при нажатии,
2704
    либо при отпускании. Сканкод отпускания клавиши на 128 больше,
2735
    либо при отпускании. Сканкод отпускания клавиши на 128 больше,
2705
    чем сканкод нажатия (т.е. установлен старший бит).
2736
    чем сканкод нажатия (т.е. установлен старший бит).
2706
  * Несколько приложений могут установить одну и ту же комбинацию;
2737
  * Несколько приложений могут установить одну и ту же комбинацию;
2707
    о нажатии такой комбинации будут извещаться все такие приложения.
2738
    о нажатии такой комбинации будут извещаться все такие приложения.
2708
 
2739
 
2709
------ Подфункция 5 - удалить установленную "горячую клавишу". -------
2740
------ Подфункция 5 - удалить установленную "горячую клавишу". -------
2710
Параметры:
2741
Параметры:
2711
  * eax = 66 - номер функции
2742
  * eax = 66 - номер функции
2712
  * ebx = 5 - номер подфункции
2743
  * ebx = 5 - номер подфункции
2713
  * cl = сканкод клавиши и edx = 0xXYZ такие же, как и в подфункции 4
2744
  * cl = сканкод клавиши и edx = 0xXYZ такие же, как и в подфункции 4
2714
Возвращаемое значение:
2745
Возвращаемое значение:
2715
  * eax = 0 - успешно
2746
  * eax = 0 - успешно
2716
  * eax = 1 - нет такой горячей клавиши
2747
  * eax = 1 - нет такой горячей клавиши
2717
Замечания:
2748
Замечания:
2718
  * При завершении процесса/потока удаляются все установленные им
2749
  * При завершении процесса/потока удаляются все установленные им
2719
    горячие клавиши.
2750
    горячие клавиши.
2720
  * Вызов функции не влияет на другие приложения.
2751
  * Вызов функции не влияет на другие приложения.
2721
    Если другое приложение определило эту же комбинацию,
2752
    Если другое приложение определило эту же комбинацию,
2722
    оно по-прежнему будет получать уведомления.
2753
    оно по-прежнему будет получать уведомления.
2723
 
2754
 
2724
------------- Подфункция 6 - заблокировать обычный ввод. -------------
2755
------------- Подфункция 6 - заблокировать обычный ввод. -------------
2725
Параметры:
2756
Параметры:
2726
  * eax = 66 - номер функции
2757
  * eax = 66 - номер функции
2727
  * ebx = 6 - номер подфункции
2758
  * ebx = 6 - номер подфункции
2728
Возвращаемое значение:
2759
Возвращаемое значение:
2729
  * функция не возвращает значения
2760
  * функция не возвращает значения
2730
Замечания:
2761
Замечания:
2731
  * Блокируется обычный ввод данных с клавиатуры для установленных
2762
  * Блокируется обычный ввод данных с клавиатуры для установленных
2732
    "горячих" клавиш
2763
    "горячих" клавиш
2733
  * Для эмуляции мыши через клавиатуру, приложение MOUSEMUL
2764
  * Для эмуляции мыши через клавиатуру, приложение MOUSEMUL
2734
 
2765
 
2735
--------- Подфункция 7 - разблокировать обычный ввод. ----------------
2766
--------- Подфункция 7 - разблокировать обычный ввод. ----------------
2736
Параметры:
2767
Параметры:
2737
  * eax = 66 - номер функции
2768
  * eax = 66 - номер функции
2738
  * ebx = 7 - номер подфункции
2769
  * ebx = 7 - номер подфункции
2739
Возвращаемое значение:
2770
Возвращаемое значение:
2740
  * функция не возвращает значения
2771
  * функция не возвращает значения
2741
Замечания:
2772
Замечания:
2742
  * Разблокирование результатов ф. 66.6
2773
  * Разблокирование результатов ф. 66.6
2743
  * Для эмуляции мыши через клавиатуру, приложение MOUSEMUL
2774
  * Для эмуляции мыши через клавиатуру, приложение MOUSEMUL
2744
 
2775
 
2745
======================================================================
2776
======================================================================
2746
============ Функция 67 - изменить положение/размеры окна. ===========
2777
============ Функция 67 - изменить положение/размеры окна. ===========
2747
======================================================================
2778
======================================================================
2748
Параметры:
2779
Параметры:
2749
  * eax = 67 - номер функции
2780
  * eax = 67 - номер функции
2750
  * ebx = новая x-координата окна
2781
  * ebx = новая x-координата окна
2751
  * ecx = новая y-координата окна
2782
  * ecx = новая y-координата окна
2752
  * edx = новый x-размер окна
2783
  * edx = новый x-размер окна
2753
  * esi = новый y-размер окна
2784
  * esi = новый y-размер окна
2754
Возвращаемое значение:
2785
Возвращаемое значение:
2755
  * функция не возвращает значения
2786
  * функция не возвращает значения
2756
Замечания:
2787
Замечания:
2757
  * Значение -1 для параметра означает "не изменять"; например, для
2788
  * Значение -1 для параметра означает "не изменять"; например, для
2758
    перемещения окна без изменения размеров можно указать edx=esi=-1.
2789
    перемещения окна без изменения размеров можно указать edx=esi=-1.
2759
  * Предварительно окно должно быть определено функцией 0.
2790
  * Предварительно окно должно быть определено функцией 0.
2760
    Она же задаёт начальные координаты и размеры окна.
2791
    Она же задаёт начальные координаты и размеры окна.
2761
  * Размеры окна понимаются в смысле функции 0, т.е.
2792
  * Размеры окна понимаются в смысле функции 0, т.е.
2762
    на один пиксель меньше, чем реальные размеры.
2793
    на один пиксель меньше, чем реальные размеры.
2763
  * Вызов функции для максимизированных окон просто игнорируется.
2794
  * Вызов функции для максимизированных окон просто игнорируется.
2764
  * Для окон соответствующих стилей положение и/или размеры могут быть
2795
  * Для окон соответствующих стилей положение и/или размеры могут быть
2765
    изменены пользователем; текущие положение и размеры могут быть
2796
    изменены пользователем; текущие положение и размеры могут быть
2766
    получены вызовом функции 9.
2797
    получены вызовом функции 9.
2767
  * Функция посылает окну событие перерисовки (с кодом 1).
2798
  * Функция посылает окну событие перерисовки (с кодом 1).
2768
 
2799
 
2769
======================================================================
2800
======================================================================
2770
=== Функция 68, подфункция 0 - получить счётчик переключений задач. ==
2801
=== Функция 68, подфункция 0 - получить счётчик переключений задач. ==
2771
======================================================================
2802
======================================================================
2772
Параметры:
2803
Параметры:
2773
  * eax = 68 - номер функции
2804
  * eax = 68 - номер функции
2774
  * ebx = 0 - номер подфункции
2805
  * ebx = 0 - номер подфункции
2775
Возвращаемое значение:
2806
Возвращаемое значение:
2776
  * eax = число переключений задач с момента загрузки системы
2807
  * eax = число переключений задач с момента загрузки системы
2777
    (по модулю 2^32)
2808
    (по модулю 2^32)
2778
 
2809
 
2779
======================================================================
2810
======================================================================
2780
====================== Функция 68, подфункция 1 ======================
2811
====================== Функция 68, подфункция 1 ======================
2781
============ Переключиться на следующий поток выполнения. ============
2812
============ Переключиться на следующий поток выполнения. ============
2782
======================================================================
2813
======================================================================
2783
Функция завершает текущий квант времени, выделенный потоку,
2814
Функция завершает текущий квант времени, выделенный потоку,
2784
и переключается на следующий.
2815
и переключается на следующий.
2785
(Какой поток какого процесса будет следующим, предсказать нельзя).
2816
(Какой поток какого процесса будет следующим, предсказать нельзя).
2786
Позднее, когда до текущего потока дойдёт очередь,
2817
Позднее, когда до текущего потока дойдёт очередь,
2787
выполнение возобновится.
2818
выполнение возобновится.
2788
Параметры:
2819
Параметры:
2789
  * eax = 68 - номер функции
2820
  * eax = 68 - номер функции
2790
  * ebx = 1 - номер подфункции
2821
  * ebx = 1 - номер подфункции
2791
Возвращаемое значение:
2822
Возвращаемое значение:
2792
  * функция не возвращает значения
2823
  * функция не возвращает значения
2793
 
2824
 
2794
======================================================================
2825
======================================================================
2795
=============== Функция 68, подфункция 2 - кэш + rdpmc. ==============
2826
=============== Функция 68, подфункция 2 - кэш + rdpmc. ==============
2796
======================================================================
2827
======================================================================
2797
Параметры:
2828
Параметры:
2798
  * eax = 68 - номер функции
2829
  * eax = 68 - номер функции
2799
  * ebx = 2 - номер подфункции
2830
  * ebx = 2 - номер подфункции
2800
  * ecx = требуемое действие:
2831
  * ecx = требуемое действие:
2801
    * ecx = 0 - разрешить выполнение инструкции rdpmc
2832
    * ecx = 0 - разрешить выполнение инструкции rdpmc
2802
      (ReaD Performance-Monitoring Counters)
2833
      (ReaD Performance-Monitoring Counters)
2803
    * ecx = 1 - узнать, включён/выключен кэш
2834
    * ecx = 1 - узнать, включён/выключен кэш
2804
    * ecx = 2 - включить кэш
2835
    * ecx = 2 - включить кэш
2805
    * ecx = 3 - выключить кэш
2836
    * ecx = 3 - выключить кэш
2806
Возвращаемое значение:
2837
Возвращаемое значение:
2807
  * для ecx=0:
2838
  * для ecx=0:
2808
    * eax = значение cr4
2839
    * eax = значение cr4
2809
  * для ecx=1:
2840
  * для ecx=1:
2810
    * eax = (cr0 and 0x60000000):
2841
    * eax = (cr0 and 0x60000000):
2811
    * eax = 0 - кэш включён
2842
    * eax = 0 - кэш включён
2812
    * eax <> 0 - кэш выключен
2843
    * eax <> 0 - кэш выключен
2813
  * для ecx=2 и ecx=3:
2844
  * для ecx=2 и ecx=3:
2814
    * функция не возвращает значения
2845
    * функция не возвращает значения
2815
 
2846
 
2816
======================================================================
2847
======================================================================
2817
========== Функция 68, подфункция 3 - прочитать MSR-регистр. =========
2848
========== Функция 68, подфункция 3 - прочитать MSR-регистр. =========
2818
======================================================================
2849
======================================================================
2819
MSR = Model Specific Register; полный список MSR-регистров процессора
2850
MSR = Model Specific Register; полный список MSR-регистров процессора
2820
содержится в документации по процессору (например, IA-32 Intel
2851
содержится в документации по процессору (например, IA-32 Intel
2821
Architecture Software Developer's Manual, Volume 3, Appendix B);
2852
Architecture Software Developer's Manual, Volume 3, Appendix B);
2822
каждое семейство процессоров имеет своё подмножество MSR-регистров.
2853
каждое семейство процессоров имеет своё подмножество MSR-регистров.
2823
Параметры:
2854
Параметры:
2824
  * eax = 68 - номер функции
2855
  * eax = 68 - номер функции
2825
  * ebx = 3 - номер подфункции
2856
  * ebx = 3 - номер подфункции
2826
  * ecx игнорируется
2857
  * ecx игнорируется
2827
  * edx = адрес MSR
2858
  * edx = адрес MSR
2828
Возвращаемое значение:
2859
Возвращаемое значение:
2829
  * ebx:eax = старший:младший dword результата
2860
  * ebx:eax = старший:младший dword результата
2830
Замечания:
2861
Замечания:
2831
  * Указание в ecx несуществующего или нереализованного для данного
2862
  * Указание в ecx несуществующего или нереализованного для данного
2832
    процессора MSR повлечёт исключение в ядре, которое прибьёт поток.
2863
    процессора MSR повлечёт исключение в ядре, которое прибьёт поток.
2833
  * Предварительно следует определить, поддерживаются ли MSR в целом,
2864
  * Предварительно следует определить, поддерживаются ли MSR в целом,
2834
    командой cpuid. Иначе возникнет уже другое исключение в ядре,
2865
    командой cpuid. Иначе возникнет уже другое исключение в ядре,
2835
    которое всё равно прибьёт поток.
2866
    которое всё равно прибьёт поток.
2836
 
2867
 
2837
======================================================================
2868
======================================================================
2838
========= Функция 68, подфункция 4 - записать в MSR-регистр. =========
2869
========= Функция 68, подфункция 4 - записать в MSR-регистр. =========
2839
======================================================================
2870
======================================================================
2840
MSR = Model Specific Register; полный список MSR-регистров процессора
2871
MSR = Model Specific Register; полный список MSR-регистров процессора
2841
содержится в документации по процессору (например, IA-32 Intel
2872
содержится в документации по процессору (например, IA-32 Intel
2842
Architecture Software Developer's Manual, Volume 3, Appendix B);
2873
Architecture Software Developer's Manual, Volume 3, Appendix B);
2843
каждое семейство процессоров имеет своё подмножество MSR-регистров.
2874
каждое семейство процессоров имеет своё подмножество MSR-регистров.
2844
Параметры:
2875
Параметры:
2845
  * eax = 68 - номер функции
2876
  * eax = 68 - номер функции
2846
  * ebx = 4 - номер подфункции
2877
  * ebx = 4 - номер подфункции
2847
  * ecx игнорируется
2878
  * ecx игнорируется
2848
  * edx = адрес MSR
2879
  * edx = адрес MSR
2849
  * esi:edi = старший:младший dword
2880
  * esi:edi = старший:младший dword
2850
Возвращаемое значение:
2881
Возвращаемое значение:
2851
  * функция не возвращает значения
2882
  * функция не возвращает значения
2852
Замечания:
2883
Замечания:
2853
  * Указание в ecx несуществующего или нереализованного для данного
2884
  * Указание в ecx несуществующего или нереализованного для данного
2854
    процессора MSR повлечёт исключение в ядре, которое прибьёт поток.
2885
    процессора MSR повлечёт исключение в ядре, которое прибьёт поток.
2855
  * Предварительно следует определить, поддерживаются ли MSR в целом,
2886
  * Предварительно следует определить, поддерживаются ли MSR в целом,
2856
    командой cpuid. Иначе возникнет уже другое исключение в ядре,
2887
    командой cpuid. Иначе возникнет уже другое исключение в ядре,
2857
    которое всё равно прибьёт поток.
2888
    которое всё равно прибьёт поток.
2858
 
2889
 
2859
======================================================================
2890
======================================================================
2860
===== Функция 68, подфункция 11 - инициализировать кучу процесса. ====
2891
===== Функция 68, подфункция 11 - инициализировать кучу процесса. ====
2861
======================================================================
2892
======================================================================
2862
Параметры:
2893
Параметры:
2863
  * eax = 68 - номер функции
2894
  * eax = 68 - номер функции
2864
  * ebx = 11 - номер подфункции
2895
  * ebx = 11 - номер подфункции
2865
Возвращаемое значение:
2896
Возвращаемое значение:
2866
  * eax = 0 - неуспех
2897
  * eax = 0 - неуспех
2867
  * иначе размер созданной кучи
2898
  * иначе размер созданной кучи
2868
Замечания:
2899
Замечания:
2869
  * Вызов функции инициализирует кучу, из которой впоследствии можно
2900
  * Вызов функции инициализирует кучу, из которой впоследствии можно
2870
    выделять и освобождать блоки памяти подфункциями 12 и 13.
2901
    выделять и освобождать блоки памяти подфункциями 12 и 13.
2871
    Размер кучи равен размеру всей свободной памяти приложения.
2902
    Размер кучи равен размеру всей свободной памяти приложения.
2872
  * При повторном вызове функции тем же процессом функция вернёт
2903
  * При повторном вызове функции тем же процессом функция вернёт
2873
    размер существующей кучи.
2904
    размер существующей кучи.
2874
  * После создания кучи вызовы функции 64 игнорируются.
2905
  * После создания кучи вызовы функции 64 игнорируются.
2875
 
2906
 
2876
======================================================================
2907
======================================================================
2877
========== Функция 68, подфункция 12 - выделить блок памяти. =========
2908
========== Функция 68, подфункция 12 - выделить блок памяти. =========
2878
======================================================================
2909
======================================================================
2879
Параметры:
2910
Параметры:
2880
  * eax = 68 - номер функции
2911
  * eax = 68 - номер функции
2881
  * ebx = 12 - номер подфункции
2912
  * ebx = 12 - номер подфункции
2882
  * ecx = требуемый размер в байтах
2913
  * ecx = требуемый размер в байтах
2883
Возвращаемое значение:
2914
Возвращаемое значение:
2884
  * eax = указатель на выделенный блок
2915
  * eax = указатель на выделенный блок
2885
Замечания:
2916
Замечания:
2886
  * Предварительно следует инициализировать кучу процесса вызовом
2917
  * Предварительно следует инициализировать кучу процесса вызовом
2887
    подфункции 11.
2918
    подфункции 11.
2888
  * Функция выделяет целое число страниц (4 Кб) так, что фактический
2919
  * Функция выделяет целое число страниц (4 Кб) так, что фактический
2889
    размер выделенного блока больше или равен запрошенному.
2920
    размер выделенного блока больше или равен запрошенному.
2890
 
2921
 
2891
======================================================================
2922
======================================================================
2892
========= Функция 68, подфункция 13 - освободить блок памяти. ========
2923
========= Функция 68, подфункция 13 - освободить блок памяти. ========
2893
======================================================================
2924
======================================================================
2894
Параметры:
2925
Параметры:
2895
  * eax = 68 - номер функции
2926
  * eax = 68 - номер функции
2896
  * ebx = 13 - номер подфункции
2927
  * ebx = 13 - номер подфункции
2897
  * ecx = указатель на блок памяти
2928
  * ecx = указатель на блок памяти
2898
Возвращаемое значение:
2929
Возвращаемое значение:
2899
  * eax = 1 - успешно
2930
  * eax = 1 - успешно
2900
  * eax = 0 - неудача
2931
  * eax = 0 - неудача
2901
Замечания:
2932
Замечания:
2902
  * Блок памяти должен быть ранее выделен подфункцией 12
2933
  * Блок памяти должен быть ранее выделен подфункцией 12
2903
    или подфункцией 20.
2934
    или подфункцией 20.
2904
 
2935
 
2905
======================================================================
2936
======================================================================
2906
====================== Функция 68, подфункция 14 =====================
2937
====================== Функция 68, подфункция 14 =====================
2907
====== Ожидать получения сигнала от других приложений/драйверов. =====
2938
====== Ожидать получения сигнала от других приложений/драйверов. =====
2908
======================================================================
2939
======================================================================
2909
Параметры:
2940
Параметры:
2910
  * eax = 68 - номер функции
2941
  * eax = 68 - номер функции
2911
  * ebx = 14 - номер подфункции
2942
  * ebx = 14 - номер подфункции
2912
  * ecx = указатель на буфер для информации (24 байта)
2943
  * ecx = указатель на буфер для информации (24 байта)
2913
Возвращаемое значение:
2944
Возвращаемое значение:
2914
  * eax разрушается
2945
  * eax разрушается
2915
  * буфер, на который указывает ecx, содержит следующую информацию:
2946
  * буфер, на который указывает ecx, содержит следующую информацию:
2916
    * +0: dword: идентификатор последующих данных сигнала
2947
    * +0: dword: идентификатор последующих данных сигнала
2917
    * +4: данные принятого сигнала (20 байт), формат которых
2948
    * +4: данные принятого сигнала (20 байт), формат которых
2918
          определяется первым dword-ом
2949
          определяется первым dword-ом
2919
 
2950
 
2920
======================================================================
2951
======================================================================
2921
=========== Функция 68, подфункция 16 - загрузить драйвер. ===========
2952
=========== Функция 68, подфункция 16 - загрузить драйвер. ===========
2922
======================================================================
2953
======================================================================
2923
Параметры:
2954
Параметры:
2924
  * eax = 68 - номер функции
2955
  * eax = 68 - номер функции
2925
  * ebx = 16 - номер подфункции
2956
  * ebx = 16 - номер подфункции
2926
  * ecx = указатель на ASCIIZ-строку с именем драйвера
2957
  * ecx = указатель на ASCIIZ-строку с именем драйвера
2927
Возвращаемое значение:
2958
Возвращаемое значение:
2928
  * eax = 0 - неудача
2959
  * eax = 0 - неудача
2929
  * иначе eax = хэндл драйвера
2960
  * иначе eax = хэндл драйвера
2930
Замечания:
2961
Замечания:
2931
  * Если драйвер ещё не загружен, он загружается;
2962
  * Если драйвер ещё не загружен, он загружается;
2932
    если драйвер уже загружен, ничего не меняется.
2963
    если драйвер уже загружен, ничего не меняется.
2933
  * Имя драйвера чувствительно к регистру символов.
2964
  * Имя драйвера чувствительно к регистру символов.
2934
    Максимальная длина имени - 16 символов, включая завершающий
2965
    Максимальная длина имени - 16 символов, включая завершающий
2935
    нулевой символ, остальные символы игнорируются.
2966
    нулевой символ, остальные символы игнорируются.
2936
  * Драйвер с именем ABC загружается из файла /rd/1/drivers/ABC.obj.
2967
  * Драйвер с именем ABC загружается из файла /rd/1/drivers/ABC.obj.
2937
 
2968
 
2938
======================================================================
2969
======================================================================
2939
========== Функция 68, подфункция 17 - управление драйвером. =========
2970
========== Функция 68, подфункция 17 - управление драйвером. =========
2940
======================================================================
2971
======================================================================
2941
Параметры:
2972
Параметры:
2942
  * eax = 68 - номер функции
2973
  * eax = 68 - номер функции
2943
  * ebx = 17 - номер подфункции
2974
  * ebx = 17 - номер подфункции
2944
  * ecx = указатель на управляющую структуру:
2975
  * ecx = указатель на управляющую структуру:
2945
    * +0: dword: хэндл драйвера
2976
    * +0: dword: хэндл драйвера
2946
    * +4: dword: код функции драйвера
2977
    * +4: dword: код функции драйвера
2947
    * +8: dword: указатель на входные данные
2978
    * +8: dword: указатель на входные данные
2948
    * +12 = +0xC: dword: размер входных данных
2979
    * +12 = +0xC: dword: размер входных данных
2949
    * +16 = +0x10: dword: указатель на выходные данные
2980
    * +16 = +0x10: dword: указатель на выходные данные
2950
    * +20 = +0x14: dword: размер выходных данных
2981
    * +20 = +0x14: dword: размер выходных данных
2951
Возвращаемое значение:
2982
Возвращаемое значение:
2952
  * eax = определяется драйвером
2983
  * eax = определяется драйвером
2953
Замечания:
2984
Замечания:
2954
  * Коды функций и структура входных/выходных данных
2985
  * Коды функций и структура входных/выходных данных
2955
    определяются драйвером.
2986
    определяются драйвером.
2956
  * Предварительно должен быть получен хэндл драйвера подфункцией 16.
2987
  * Предварительно должен быть получен хэндл драйвера подфункцией 16.
2957
 
2988
 
2958
======================================================================
2989
======================================================================
2959
============= Функция 68, подфункция 19 - загрузить DLL. =============
2990
============= Функция 68, подфункция 19 - загрузить DLL. =============
2960
======================================================================
2991
======================================================================
2961
Параметры:
2992
Параметры:
2962
  * eax = 68 - номер функции
2993
  * eax = 68 - номер функции
2963
  * ebx = 19 - номер подфункции
2994
  * ebx = 19 - номер подфункции
2964
  * ecx = указатель на ASCIIZ-строку с полным путём к DLL
2995
  * ecx = указатель на ASCIIZ-строку с полным путём к DLL
2965
Возвращаемое значение:
2996
Возвращаемое значение:
2966
  * eax = 0 - неудача
2997
  * eax = 0 - неудача
2967
  * иначе eax = указатель на таблицу экспорта DLL
2998
  * иначе eax = указатель на таблицу экспорта DLL
2968
Замечания:
2999
Замечания:
2969
  * Таблица экспорта представляет собой массив структур по 2 dword'а,
3000
  * Таблица экспорта представляет собой массив структур по 2 dword'а,
2970
    заканчивающийся нулём. Первый dword в структуре является
3001
    заканчивающийся нулём. Первый dword в структуре является
2971
    указателем на имя функции, второй содержит адрес функции.
3002
    указателем на имя функции, второй содержит адрес функции.
2972
 
3003
 
2973
======================================================================
3004
======================================================================
2974
====== Функция 68, подфункция 20 - перераспределить блок памяти. =====
3005
====== Функция 68, подфункция 20 - перераспределить блок памяти. =====
2975
======================================================================
3006
======================================================================
2976
Параметры:
3007
Параметры:
2977
  * eax = 68 - номер функции
3008
  * eax = 68 - номер функции
2978
  * ebx = 20 - номер подфункции
3009
  * ebx = 20 - номер подфункции
2979
  * ecx = новый размер в байтах
3010
  * ecx = новый размер в байтах
2980
  * edx = указатель на уже выделенный блок памяти
3011
  * edx = указатель на уже выделенный блок памяти
2981
Возвращаемое значение:
3012
Возвращаемое значение:
2982
  * eax = указатель на перераспределённый блок, 0 при ошибке
3013
  * eax = указатель на перераспределённый блок, 0 при ошибке
2983
Замечания:
3014
Замечания:
2984
  * Предварительно следует инициализировать кучу процесса вызовом
3015
  * Предварительно следует инициализировать кучу процесса вызовом
2985
    подфункции 11.
3016
    подфункции 11.
2986
  * Функция выделяет целое число страниц (4 Кб) так, что фактический
3017
  * Функция выделяет целое число страниц (4 Кб) так, что фактический
2987
    размер выделенного блока больше или равен запрошенному.
3018
    размер выделенного блока больше или равен запрошенному.
2988
  * Если edx=0, то вызов функции эквивалентен выделению памяти
3019
  * Если edx=0, то вызов функции эквивалентен выделению памяти
2989
    подфункцией 12. В противном случае блок памяти по адресу edx
3020
    подфункцией 12. В противном случае блок памяти по адресу edx
2990
    должен быть ранее выделен подфункцией 12 или
3021
    должен быть ранее выделен подфункцией 12 или
2991
    описываемой подфункцией.
3022
    описываемой подфункцией.
2992
  * Если ecx=0, то функция освобождает блок памяти по адресу edx и
3023
  * Если ecx=0, то функция освобождает блок памяти по адресу edx и
2993
    возвращает 0.
3024
    возвращает 0.
2994
  * Содержимое памяти вплоть до наименьшего из старого и нового
3025
  * Содержимое памяти вплоть до наименьшего из старого и нового
2995
    размеров сохраняется.
3026
    размеров сохраняется.
2996
 
3027
 
2997
======================================================================
3028
======================================================================
2998
========= Функция 68, подфункция 21 - загрузить драйвер PE. ==========
3029
========= Функция 68, подфункция 21 - загрузить драйвер PE. ==========
2999
======================================================================
3030
======================================================================
3000
Параметры:
3031
Параметры:
3001
  * eax = 68 - номер функции
3032
  * eax = 68 - номер функции
3002
  * ebx = 21 - номер подфункции
3033
  * ebx = 21 - номер подфункции
3003
  * ecx = указатель на ASCIIZ-строку с именем драйвера
3034
  * ecx = указатель на ASCIIZ-строку с именем драйвера
3004
  * edx = указатель на командную строку
3035
  * edx = указатель на командную строку
3005
Возвращаемое значение:
3036
Возвращаемое значение:
3006
  * eax = 0 - неудача
3037
  * eax = 0 - неудача
3007
  * иначе eax = хэндл драйвера
3038
  * иначе eax = хэндл драйвера
3008
Замечания:
3039
Замечания:
3009
  * Если драйвер ещё не загружен, он загружается;
3040
  * Если драйвер ещё не загружен, он загружается;
3010
    если драйвер уже загружен, ничего не меняется.
3041
    если драйвер уже загружен, ничего не меняется.
3011
 
3042
 
3012
======================================================================
3043
======================================================================
3013
=== Функция 68, подфункция 22 - открыть именованную область памяти. ==
3044
=== Функция 68, подфункция 22 - открыть именованную область памяти. ==
3014
======================================================================
3045
======================================================================
3015
Параметры:
3046
Параметры:
3016
  * eax = 68 - номер функции
3047
  * eax = 68 - номер функции
3017
  * ebx = 22 - номер подфункции
3048
  * ebx = 22 - номер подфункции
3018
  * ecx = имя области. Максимум 31 символ, включая завершающий ноль
3049
  * ecx = имя области. Максимум 31 символ, включая завершающий ноль
3019
  * edx = размер области в байтах для SHM_CREATE и SHM_OPEN_ALWAYS
3050
  * edx = размер области в байтах для SHM_CREATE и SHM_OPEN_ALWAYS
3020
  * esi = флаги открытия и доступа:
3051
  * esi = флаги открытия и доступа:
3021
    * SHM_OPEN        = 0x00 - открыть существующую область памяти.
3052
    * SHM_OPEN        = 0x00 - открыть существующую область памяти.
3022
                          Если область с таким именем не существует,
3053
                          Если область с таким именем не существует,
3023
                          функция вернёт код ошибки 5.
3054
                          функция вернёт код ошибки 5.
3024
    * SHM_OPEN_ALWAYS = 0x04 - открыть существующую или создать новую
3055
    * SHM_OPEN_ALWAYS = 0x04 - открыть существующую или создать новую
3025
                          область памяти.
3056
                          область памяти.
3026
    * SHM_CREATE      = 0x08 - создать новую область памяти.
3057
    * SHM_CREATE      = 0x08 - создать новую область памяти.
3027
                          Если область с таким именем уже существует,
3058
                          Если область с таким именем уже существует,
3028
                          функция вернёт код ошибки 10.
3059
                          функция вернёт код ошибки 10.
3029
    * SHM_READ        = 0x00 - доступ только на чтение
3060
    * SHM_READ        = 0x00 - доступ только на чтение
3030
    * SHM_WRITE       = 0x01 - доступ на чтение и запись
3061
    * SHM_WRITE       = 0x01 - доступ на чтение и запись
3031
Возвращаемое значение:
3062
Возвращаемое значение:
3032
  * eax = указатель на область памяти, 0 при ошибке
3063
  * eax = указатель на область памяти, 0 при ошибке
3033
  * при создании новой области (SHM_CREATE или SHM_OPEN_ALWAYS):
3064
  * при создании новой области (SHM_CREATE или SHM_OPEN_ALWAYS):
3034
    edx = 0 - успех, иначе - код ошибки
3065
    edx = 0 - успех, иначе - код ошибки
3035
  * при открытии существующей области (SHM_OPEN или SHM_OPEN_ALWAYS):
3066
  * при открытии существующей области (SHM_OPEN или SHM_OPEN_ALWAYS):
3036
    edx = код ошибки (при eax=0) или размер области в байтах
3067
    edx = код ошибки (при eax=0) или размер области в байтах
3037
Коды ошибок:
3068
Коды ошибок:
3038
  * E_NOTFOUND = 5
3069
  * E_NOTFOUND = 5
3039
  * E_ACCESS = 10
3070
  * E_ACCESS = 10
3040
  * E_NOMEM = 30
3071
  * E_NOMEM = 30
3041
  * E_PARAM = 33
3072
  * E_PARAM = 33
3042
Замечания:
3073
Замечания:
3043
  * Предварительно следует инициализировать кучу процесса вызовом
3074
  * Предварительно следует инициализировать кучу процесса вызовом
3044
    подфункции 11.
3075
    подфункции 11.
3045
  * Если создаётся новая область, то флаги доступа устанавливают
3076
  * Если создаётся новая область, то флаги доступа устанавливают
3046
    максимальные права доступа для остальных процессов. Попытка
3077
    максимальные права доступа для остальных процессов. Попытка
3047
    открытия другим потоком с неразрешёнными правами провалится
3078
    открытия другим потоком с неразрешёнными правами провалится
3048
    с кодом ошибки E_ACCESS.
3079
    с кодом ошибки E_ACCESS.
3049
  * Процесс, создавший область, всегда имеет доступ на запись.
3080
  * Процесс, создавший область, всегда имеет доступ на запись.
3050
 
3081
 
3051
======================================================================
3082
======================================================================
3052
=== Функция 68, подфункция 23 - закрыть именованную область памяти. ==
3083
=== Функция 68, подфункция 23 - закрыть именованную область памяти. ==
3053
======================================================================
3084
======================================================================
3054
Параметры:
3085
Параметры:
3055
  * eax = 68 - номер функции
3086
  * eax = 68 - номер функции
3056
  * ebx = 23 - номер подфункции
3087
  * ebx = 23 - номер подфункции
3057
  * ecx = имя области. Максимум 31 символ, включая завершающий ноль
3088
  * ecx = имя области. Максимум 31 символ, включая завершающий ноль
3058
Возвращаемое значение:
3089
Возвращаемое значение:
3059
  * eax разрушается
3090
  * eax разрушается
3060
Замечания:
3091
Замечания:
3061
  * Область памяти физически освобождается (с забыванием всех данных
3092
  * Область памяти физически освобождается (с забыванием всех данных
3062
    и высвобождением физической памяти), когда её закроют
3093
    и высвобождением физической памяти), когда её закроют
3063
    все открывшие потоки.
3094
    все открывшие потоки.
3064
  * При завершении потока освобождаются все открытые им
3095
  * При завершении потока освобождаются все открытые им
3065
    области памяти.
3096
    области памяти.
3066
 
3097
 
3067
======================================================================
3098
======================================================================
3068
==== Функция 68, подфункция 24 - установить обработчик исключений. ===
3099
==== Функция 68, подфункция 24 - установить обработчик исключений. ===
3069
======================================================================
3100
======================================================================
3070
Параметры:
3101
Параметры:
3071
  * eax = 68 - номер функции
3102
  * eax = 68 - номер функции
3072
  * ebx = 24 - номер подфункции
3103
  * ebx = 24 - номер подфункции
3073
  * ecx = адрес нового обработчика исключений
3104
  * ecx = адрес нового обработчика исключений
3074
  * edx = маска обрабатываемых исключений
3105
  * edx = маска обрабатываемых исключений
3075
Возвращаемое значение:
3106
Возвращаемое значение:
3076
  * eax = адрес старого обработчика исключений (0, если не установлен)
3107
  * eax = адрес старого обработчика исключений (0, если не установлен)
3077
  * ebx = маска старого обработчика исключений
3108
  * ebx = маска старого обработчика исключений
3078
Замечания:
3109
Замечания:
3079
  * Номер бита в маске исключений соответствует номеру исключения по
3110
  * Номер бита в маске исключений соответствует номеру исключения по
3080
    спецификации на процессор (Intel-PC). Так, например, исключения
3111
    спецификации на процессор (Intel-PC). Так, например, исключения
3081
    FPU имеют номер 16 (#MF), а SSE - 19 (#XF).
3112
    FPU имеют номер 16 (#MF), а SSE - 19 (#XF).
3082
  * В данной реализации игнорируется запрос на перехват исключения 7
3113
  * В данной реализации игнорируется запрос на перехват исключения 7
3083
    - система обрабатывает #NM самостоятельно.
3114
    - система обрабатывает #NM самостоятельно.
3084
  * Пользовательский обработчик получает номер исключения параметром
3115
  * Пользовательский обработчик получает номер исключения параметром
3085
    в стеке. Поэтому правильный выход из обработчика: RET 4. Возврат
3116
    в стеке. Поэтому правильный выход из обработчика: RET 4. Возврат
3086
    при этом производится на команду, вызвавшую исключение.
3117
    при этом производится на команду, вызвавшую исключение.
3087
  * При передаче управления обработчику исключений сбрасывается
3118
  * При передаче управления обработчику исключений сбрасывается
3088
    соответствующий бит в маске исключений. Возникновение этого же
3119
    соответствующий бит в маске исключений. Возникновение этого же
3089
    исключения впоследствии приведёт к умолчальной обработке такового.
3120
    исключения впоследствии приведёт к умолчальной обработке такового.
3090
    А именно: к завершению работы приложения в отсутствии отладчика,
3121
    А именно: к завершению работы приложения в отсутствии отладчика,
3091
    приостановка с уведомлением отлаживающего приложения иначе.
3122
    приостановка с уведомлением отлаживающего приложения иначе.
3092
  * После завершения критических действий в обработчике пользов