Subversion Repositories Kolibri OS

Rev

Rev 86 | Rev 92 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
77 diamond 1
СИСТЕМНЫЕ ФУНКЦИИ ОПЕРАЦИОННОЙ СИСТЕМЫ Kolibri 0.5.3.1
2
 
3
Номер функции помещается в регистр eax.
4
Вызов системной функции осуществляется командой "int 0x40".
5
Все регистры, кроме явно указанных в возвращаемом значении,
6
    включая регистр флагов eflags, сохраняются.
7
 
8
 
9
======================================================================
10
============== Функция 0 - определить и нарисовать окно. =============
11
======================================================================
12
Определяет окно приложения. Рисует рамку окна, заголовок и рабочую
13
область. Для окон со скином определяет стандартные кнопки закрытия и
14
минимизации.
15
Параметры:
16
  * eax = 0 - номер функции
17
  * ebx = [координата по оси x]*65536 + [размер по оси x]
18
  * ecx = [координата по оси y]*65536 + [размер по оси y]
19
  * edx = 0xXYRRGGBB, где:
20
    * Y = стиль окна:
21
      * Y=0 - тип I - окно фиксированных размеров
22
      * Y=1 - только определить область окна, ничего не рисовать
23
      * Y=2 - тип II - окно изменяемых размеров
24
      * Y=3 - окно со скином
25
      * остальные возможные значения (от 4 до 15) зарезервированы,
26
        вызов функции с такими Y игнорируется
27
    * RR, GG, BB = соответственно красная, зеленая, синяя
28
      составляющие цвета рабочей области окна
29
      (игнорируется для стиля Y=2)
30
    * X=0 - нормальная заливка рабочей области,
31
      X=8 - градиентная заливка,
32
      остальные значения зарезервированы
33
    Следующие параметры предназначены для окон типа I и II и
34
    игнорируются для стилей Y=1,3:
35
  * esi = 0xXYRRGGBB - цвет заголовка
36
    * RR, GG, BB определяют сам цвет
37
    * Y=0 - обычное окно, Y=1 - неперемещаемое окно
38
    * X определяет градиент заголовка: X=0 - нет градиента,
39
      X=8 - обычный градиент,
40
      для окон типа II X=4 - негативный градиент
41
    * прочие значения X и Y зарезервированы
42
  * edi = 0x00RRGGBB - цвет рамки
43
Возвращаемое значение:
44
  * функция не возвращает значения
45
Замечания:
46
  * Положение и размеры окна устанавливаются при первом вызове
47
    этой функции и игнорируются при последующих; для изменения
48
    положения и/или размеров уже созданного окна используйте
49
    67-ю функцию.
50
  * Если использовать окна соответствующих стилей, то положение
51
    и/или размеры окна могут меняться пользователем.
52
    Текущие положение и размеры могут быть получены вызовом функции 9.
53
  * Окно должно умещаться на экране. Если переданные координаты
54
    и размеры не удовлетворяют этому условию, то соответствующая
55
    координата (или, возможно, обе) считается нулем, а если и это
56
    не помогает, то соответствующий размер (или, возможно, оба)
57
    устанавливается в размер экрана.
58
 
59
    Далее обозначим xpos,ypos,xsize,ysize - значения, передаваемые
60
    в ebx,ecx. Координаты приводятся относительно левого верхнего
61
    угла окна, который, таким образом, задается как (0,0), координаты
62
    правого нижнего угла суть (xsize,ysize).
63
  * Размеры окна понимаются в смысле координат правого нижнего угла.
64
    Это же относится и ко всем остальным функциям.
65
    Это означает, что реальные размеры на 1 пиксель больше.
66
  * Вид окна типа I:
67
    * рисуется внешняя рамка цвета, указанного в edi,
68
      шириной 1 пиксель
69
    * рисуется заголовок - прямоугольник с левым верхним углом (1,1)
70
      и правым нижним (xsize-1,min(25,ysize)) цвета, указанного в esi
71
      (с учетом градиента)
72
    * если ysize>=26, то закрашивается рабочая область окна -
73
      прямоугольник с левым верхним углом (1,21) и правым нижним
74
      (xsize-1,ysize-1) (размерами (xsize-1)*(ysize-21)) - цветом,
75
      указанным в edx (с учетом градиента)
76
  * Вид окна стиля Y=1:
77
    * полностью определяется приложением
78
  * Вид окна типа II:
79
    * рисуется внешняя рамка шириной 1 пиксель "затенённого" цвета
80
      edi (все составляющие цвета уменьшаются в два раза)
81
    * рисуется промежуточная рамка шириной 3 пикселя цвета edi
82
    * рисуется внутренняя рамка шириной 1 пиксель
83
      "затенённого" цвета edi
84
    * рисуется заголовок - прямоугольник с левым верхним углом (4,4)
85
      и правым нижним (xsize-4,min(20,ysize)) цвета, указанного в esi
86
      (с учетом градиента)
87
    * если ysize>=26, то закрашивается рабочая область окна -
88
      прямоугольник с левым верхним углом (5,20) и правым нижним
89
      (xsize-5,ysize-5) - цветом, указанным в edx (с учетом градиента)
90
  * Вид окна со скином:
91
    * рисуется внешняя рамка шириной 1 пиксель
92
      цвета 'outer' из скина
93
    * рисуется промежуточная рамка шириной 3 пикселя
94
      цвета 'frame' из скина
95
    * рисуется внутренняя рамка шириной 1 пиксель
96
      цвета 'inner' из скина
97
    * рисуется заголовок (по картинкам из скина) в прямоугольнике
98
      (0,0) - (xsize,_skinh-1)
99
    * если ysize>=26, то закрашивается рабочая область окна -
100
      прямоугольник с левым верхним углом (5,_skinh) и правым нижним
101
      (xsize-5,ysize-5) - цветом, указанным в edx (с учетом градиента)
102
    * определяются две стандартные кнопки: закрытия и минимизации
103
      (смотри функцию 8)
104
    * Значение переменной _skinh доступно как результат вызова
105
      подфункции 4 функции 48
106
 
107
======================================================================
108
================= Функция 1 - поставить точку в окне. ================
109
======================================================================
110
Параметры:
111
  * eax = 1 - номер функции
112
  * ebx = x-координата (относительно окна)
113
  * ecx = y-координата (относительно окна)
114
  * edx = 0x00RRGGBB - цвет точки
115
    edx = 0x01xxxxxx - инвертировать цвет точки
116
          (младшие 24 бита игнорируются)
117
Возвращаемое значение:
118
  * функция не возвращает значения
119
 
120
======================================================================
121
============== Функция 2 - получить код нажатой клавиши. =============
122
======================================================================
123
Забирает код нажатой клавиши из буфера.
124
Параметры:
125
  * eax = 2 - номер функции
126
Возвращаемое значение:
127
  * если буфер пуст, возвращается eax=1
128
  * если буфер непуст, то возвращается al=0, ah=код нажатой клавиши,
129
    старшее слово регистра eax обнулено
130
Замечания:
131
  * Существует общесистемный буфер нажатых клавиш размером 120 байт,
132
    организованный как очередь.
133
  * При вызове этой функции приложением с неактивным окном
134
    возвращается ответ "буфер пуст".
135
  * Эта функция не сообщает о клавишах, нажатых в комбинации с Alt,
136
    для таких случаев есть подфункция 12 функции 18.
137
  * По умолчанию эта функция возвращает ASCII-коды; переключиться на
138
    режим сканкодов (и назад) можно с использованием функции 66.
139
  * Узнать, какие комбинации клавиш соответствуют каким кодам, можно,
140
    запустив приложения keyascii и scancode.
141
  * Сканкоды возвращаются непосредственно клавиатурой и фиксированы;
142
    ASCII-коды получаются с использованием таблиц преобразования,
143
    которые можно установить подфункцией 2 функции 21 и прочитать
144
    подфункцией 2 функции 26.
145
  * Как следствие, ASCII-коды учитывают текущую раскладку клавиатуры
146
    (rus/en) в отличие от сканкодов.
147
 
148
======================================================================
149
================ Функция 3 - получить системное время. ===============
150
======================================================================
151
Параметры:
152
  * eax = 3 - номер функции
153
Возвращаемое значение:
154
  * eax = 0x00SSMMHH, где HH:MM:SS = часы:минуты:секунды
155
  * каждый элемент возвращается как BCD-число, например,
156
    для времени 23:59:59 результат будет 0x00595923
157
Замечания:
158
  * Смотри также подфункцию 9 функции 26 - получение времени
159
    с момента запуска системы; она во многих случаях удобнее,
160
    поскольку возвращает просто DWORD-значение счетчика времени.
161
  * Системное время можно установить функцией 22.
162
 
163
======================================================================
164
================== Функция 4 - вывести текст в окно. =================
165
======================================================================
166
Параметры:
167
  * eax = 4 - номер функции
168
  * ebx = [координата по оси x]*65536 + [координата по оси y]
169
  * ecx = 0xX0RRGGBB, где
170
    * RR, GG, BB задают цвет текста
171
    * X задает используемый шрифт: 0=системный моноширинный,
172
      1=системный шрифт переменной ширины
173
  * edx = указатель на начало строки
174
  * esi = длина строки, должна быть не больше 255
175
Возвращаемое значение:
176
  * функция не возвращает значения
177
Замечания:
178
  * Первый системный шрифт считывается при загрузке из файла char.mt,
179
    второй - из char2.mt.
180
  * Оба шрифта имеют высоту 9 пикселей, ширина моноширинного шрифта
181
    равна 6 пикселей.
182
 
183
======================================================================
184
========================= Функция 5 - пауза. =========================
185
======================================================================
186
Задерживает выполнение программы на заданное время.
187
Параметры:
188
  * eax = 5 - номер функции
189
  * ebx = время в сотых долях секунды
190
Возвращаемое значение:
191
  * функция не возвращает значения
192
Замечания:
193
  * Передача ebx=0 не передает управление следующему процессу и
194
    вообще не производит никаких действий. Если действительно
195
    требуется передать управление следующему процессу
196
    (закончить текущий квант времени), используйте подфункцию 1
197
    функции 68.
198
  * При текущей реализации произойдет немедленный возврат из функции,
199
    если сложение ebx с текущим значением счетчика времени вызовет
200
    32-битное переполнение.
201
 
202
======================================================================
203
=============== Функция 6 - прочитать файл с рамдиска. ===============
204
======================================================================
205
Параметры:
206
  * eax = 6 - номер функции
207
  * ebx = указатель на имя файла
208
  * ecx = номер стартового блока, считая с 1;
209
    ecx=0 - читать с начала файла (то же самое, что и ecx=1)
210
  * edx = число блоков для чтения;
211
    edx=0 - читать один блок (то же самое, что и edx=1)
212
  * esi = указатель на область памяти, куда будут записаны данные
213
Возвращаемое значение:
214
  * eax = длина файла в байтах, если файл успешно прочитан
215
  * eax = -1, если файл не найден
216
Замечания:
217
  * Данная функция является устаревшей; функция 70
218
    позволяет выполнять те же действия с расширенными возможностями.
219
  * Блок = 512 байт.
220
  * Для чтения всего файла можно указать заведомо большое значение
221
    в edx, например, edx = -1; но в этом случае будьте готовы к тому,
222
    что программа "упадет", если файл окажется слишком большим
223
    и "не влезет" в память программы.
224
  * Имя файла должно быть либо в формате 8+3 символов
225
    (первые 8 символов - собственно имя, последние 3 - расширение,
226
    короткие имена и расширения дополняются пробелами),
227
    либо в формате 8.3 символов "FILE.EXT"/"FILE.EX "
228
    (имя не более 8 символов, точка, расширение 3 символа,
229
    дополненное при необходимости пробелами).
230
    Имя файла должно быть записано заглавными буквами.
231
    Завершающий символ с кодом 0 не нужен (не ASCIIZ-строка).
232
  * Текущая реализация рамдиска не поддерживает директории.
233
 
234
======================================================================
235
=============== Функция 7 - вывести изображение в окно. ==============
236
======================================================================
237
Параметры:
238
  * eax = 7 - номер функции
81 diamond 239
  * ebx = указатель на изображение в формате BBGGRRBBGGRR...
77 diamond 240
  * ecx = [размер по оси x]*65536 + [размер по оси y]
241
  * edx = [координата по оси x]*65536 + [координата по оси y]
242
Возвращаемое значение:
243
  * функция не возвращает значения
244
Замечания:
245
  * Координаты изображения - это координаты верхнего левого угла
246
    изображения относительно окна.
247
  * Размер изображения в байтах есть 3*xsize*ysize.
248
 
249
======================================================================
250
=============== Функция 8 - определить/удалить кнопку. ===============
251
======================================================================
252
Параметры для определения кнопки:
253
  * eax = 8 - номер функции
254
  * ebx = [координата по оси x]*65536 + [размер по оси x]
255
  * ecx = [координата по оси y]*65536 + [размер по оси y]
256
  * edx = 0xXYnnnnnn, где:
257
    * nnnnnn = идентификатор кнопки
258
    * старший (31-й) бит edx сброшен
259
    * если 30-й бит edx установлен - не прорисовывать кнопку
260
    * если 29-й бит edx установлен - не рисовать рамку
261
      при нажатии на кнопку
262
  * esi = 0x00RRGGBB - цвет кнопки
263
Параметры для удаления кнопки:
264
  * eax = 8 - номер функции
265
  * edx = 0x80nnnnnn, где nnnnnn - идентификатор кнопки
266
Возвращаемое значение:
267
  * функция не возвращает значения
268
Замечания:
269
  * Размеры кнопки должны быть больше 0 и меньше 0x8000.
270
  * Для окон со скином при определении окна (вызове 0-й функции)
271
    создаются две стандартные кнопки - закрытия окна
272
    с идентификатором 1 и минимизации окна с идентификатором 0xffff.
273
  * Создание двух кнопок с одинаковыми идентификаторами
274
    вполне допустимо.
275
  * Кнопка с идентификатором 0xffff при нажатии интерпретируется
276
    системой как кнопка минимизации, система обрабатывает такое
277
    нажатие самостоятельно, не обращаясь к приложению.
278
    В остальном это обычная кнопка.
279
  * Общее количество кнопок для всех приложений ограничено
280
    числом 4095.
281
 
282
======================================================================
283
============= Функция 9 - информация о потоке выполнения. ============
284
======================================================================
285
Параметры:
286
  * eax = 9 - номер функции
287
  * ebx = указатель на буфер размера 1 Кб
288
  * ecx = номер слота потока
289
    ecx = -1 - получить информацию о текущем потоке
290
Возвращаемое значение:
291
  * eax = максимальный номер слота потока
292
  * буфер, на который указывает ebx, содержит следующую информацию:
293
    * +0: dword: использование процессора (сколько тактов в секунду
294
      уходит на исполнение именно этого потока)
295
    * +4: word: позиция окна потока в оконном стэке
296
    * +6: word: (не имеет отношения к запрошенному потоку)
297
      номер слота потока, окно которого находится в оконном стэке
298
      в позиции ecx
299
    * +8: word: зарезервировано
300
    * +10 = +0xA: 11 байт: имя процесса
301
      (имя соответствующего исполняемого файла в формате 8+3)
302
    * +21 = +0x15: byte: выравнивание, этот байт не изменяется
303
    * +22 = +0x16: dword: адрес процесса в памяти
304
    * +26 = +0x1A: dword: размер используемой памяти - 1
305
    * +30 = +0x1E: dword: идентификатор (PID/TID)
306
    * +34 = +0x22: dword: координата окна потока по оси x
307
    * +38 = +0x26: dword: координата окна потока по оси y
308
    * +42 = +0x2A: dword: размер окна потока по оси x
309
    * +46 = +0x2E: dword: размер окна потока по оси y
310
    * +50 = +0x32: word: состояние слота потока:
311
      * 0 = поток выполняется
312
      * 1 = поток приостановлен
313
      * 2 = поток приостановлен в момент ожидания события
314
      * 3 = поток завершается в результате вызова функции -1 или
315
        насильственно как следствие вызова подфункции 2 функции 18
316
        или завершения работы системы
317
      * 4 = поток завершается в результате исключения
318
      * 5 = поток ожидает события
319
      * 9 = запрошенный слот свободен, вся остальная информация о
320
        слоте не имеет смысла
321
Замечания:
322
  * Слоты нумеруются с 1.
323
  * Возвращаемое значение не есть общее число потоков, поскольку
324
    бывают свободные слоты.
325
  * При создании процесса автоматически создается поток выполнения.
326
  * Функция выдает информацию о потоке. Каждый процесс имеет
327
    хотя бы один поток. Один процесс может создать несколько потоков,
328
    в этом случае каждый поток получает свой слот, причем поля
329
    +10, +22, +26 в этих слотах совпадают.
330
    Для приложений не существует общего способа определить,
331
    принадлежат ли два потока одному процессу.
332
  * Активное окно - окно, находящееся на вершине оконного стэка,
333
    оно получает сообщения о вводе с клавиатуры. Для него позиция в
334
    оконном стэке совпадает с возвращаемым значением.
335
  * Слот 1 соответствует специальному потоку операционной системы,
336
    для которого:
337
    * окно находится внизу оконного стэка, поля +4 и +6 содержат
338
      значение 1
339
    * имя процесса - "OS/IDLE" (дополненное пробелами)
340
    * адрес процесса в памяти равен 0, размер используемой памяти
341
      16 Mb (0x1000000)
342
    * PID=1
343
    * координаты и размеры окна условно полагаются равными 0
344
    * состояние слота - всегда 0 (выполняется)
345
    * время выполнения складывается из времени, уходящего на
346
      собственно работу, и времени простоя в ожидании прерывания
347
      (которое можно получить вызовом подфункции 4 функции 18).
348
  * Начиная со слота 2, размещаются обычные приложения.
349
  * Обычные приложения размещаются в памяти по адресу 0x10000000
350
    (константа ядра std_application_base_address).
351
    Наложения не происходит, поскольку у каждого процесса своя
352
    таблица страниц.
353
  * При создании потока ему назначаются слот в системной таблице и
354
    идентификатор (Process/Thread IDentifier = PID/TID), которые для
355
    заданного потока не изменяются со временем.
356
    После завершения потока его слот может быть заново использован
357
    для другого потока. Идентификатор потока не может быть назначен
358
    другому потоку даже после завершения первого.
359
    Назначаемые новым потокам идентификаторы монотонно растут.
360
  * Если поток еще не определил свое окно вызовом функции 0, то
361
    положение и размеры этого окна полагаются нулями.
362
  * В данный момент используется только часть буфера размером
363
    52 = 0x34 байта. Тем не менее рекомендуется использовать буфер
364
    размером 1 Кб для будущей совместимости, в будущем могут быть
365
    добавлены некоторые поля.
366
 
367
======================================================================
368
==================== Функция 10 - ожидать события. ===================
369
======================================================================
370
Если очередь сообщений пуста, то ждет появления сообщения в очереди.
371
В таком состоянии поток не получает процессорного времени.
372
Затем считывает сообщение из очереди.
373
 
374
Параметры:
375
  * eax = 10 - номер функции
376
Возвращаемое значение:
377
  * eax = событие (смотри список событий)
378
Замечания:
379
  * Учитываются только те события, которые входят в маску,
380
    устанавливаемую функцией 40. По умолчанию это события
381
    перерисовки, нажатия на клавиши и на кнопки.
382
  * Для проверки, есть ли сообщение в очереди, используйте функцию 11.
383
    Чтобы ждать не более определенного времени, используйте
384
    функцию 23.
385
 
386
======================================================================
387
======= Функция 11 - проверить, есть ли событие, без ожидания. =======
388
======================================================================
389
Если в очереди сообщений есть какое-то событие, то считывает и
390
возвращает его. Если очередь пуста, возвращает нуль.
391
Параметры:
392
  * eax = 11 - номер функции
393
Возвращаемое значение:
394
  * eax = 0 - очередь сообщений пуста
395
  * иначе eax = событие (смотри список событий)
396
Замечания:
397
  * Учитываются только те события, которые входят в маску,
398
    устанавливаемую функцией 40. По умолчанию это события
399
    перерисовки, нажатия на клавиши и на кнопки.
400
  * Для ожидания появления события в очереди, используйте функцию 10.
401
    Чтобы ждать не более определенного времени, используйте
402
    функцию 23.
403
 
404
======================================================================
405
=========== Функция 12 - начать/закончить перерисовку окна. ==========
406
======================================================================
407
 
408
-------------- Подфункция 1 - начать перерисовку окна. ---------------
409
Параметры:
410
  * eax = 12 - номер функции
411
  * ebx = 1 - номер подфункции
412
Возвращаемое значение:
413
  * функция не возвращает значения
414
 
415
------------- Подфункция 2 - закончить перерисовку окна. -------------
416
Параметры:
417
  * eax = 12 - номер функции
418
  * ebx = 2 - номер подфункции
419
Возвращаемое значение:
420
  * функция не возвращает значения
421
Замечания:
422
  * Функция начала перерисовки удаляет все определённые
423
    функцией 8 кнопки, их следует определить повторно.
424
 
425
======================================================================
426
============ Функция 13 - нарисовать прямоугольник в окне. ===========
427
======================================================================
428
Параметры:
429
  * eax = 13 - номер функции
430
  * ebx = [координата по оси x]*65536 + [размер по оси x]
431
  * ecx = [координата по оси y]*65536 + [размер по оси y]
432
  * edx = цвет 0xRRGGBB или 0x80RRGGBB для градиентной заливки
433
Возвращаемое значение:
434
  * функция не возвращает значения
435
Замечания:
436
  * Под координатами понимаются координаты левого верхнего угла
437
    прямоугольника относительно окна.
438
 
439
======================================================================
440
================ Функция 14 - получить размеры экрана. ===============
441
======================================================================
442
Параметры:
443
  * eax = 14 - номер функции
444
Возвращаемое значение:
445
  * eax = [xsize]*65536 + [ysize], где
446
  * xsize = x-координата правого нижнего угла экрана =
447
            размер по горизонтали - 1
448
  * ysize = y-координата правого нижнего угла экрана =
449
            размер по вертикали - 1
450
Замечания:
451
  * Смотри также подфункцию 5 функции 48 - получить размеры рабочей
452
    области экрана.
453
 
454
======================================================================
455
= Функция 15, подфункция 1 - установить размер фонового изображения. =
456
======================================================================
457
Параметры:
458
  * eax = 15 - номер функции
459
  * ebx = 1 - номер подфункции
460
  * ecx = ширина изображения
461
  * edx = высота изображения
462
Возвращаемое значение:
463
  * функция не возвращает значения
464
Замечания:
465
  * Проверок на корректность не делается. Установка слишком больших
466
    значений приведёт к тому, что в фон войдут данные за границей
467
    буфера фонового изображения. Размер буфера = 0x160000-0x10, что
468
    соответствует максимальным размерам 800*600. (800*600*3=0x15F900)
469
  * Для обновления экрана (после завершения серии команд, работающих с
470
    фоном) вызывайте подфункцию 3 перерисовки фона.
471
  * Есть парная функция получения размеров фонового изображения -
472
    подфункция 1 функции 39.
473
 
474
======================================================================
475
= Функция 15, подфункция 2 - поставить точку на фоновом изображении. =
476
======================================================================
477
Параметры:
478
  * eax = 15 - номер функции
479
  * ebx = 2 - номер подфункции
480
  * ecx = смещение
481
  * edx = цвет точки 0xRRGGBB
482
Возвращаемое значение:
483
  * функция не возвращает значения
484
Замечания:
485
  * Смещение для точки с координатами (x,y) вычисляется как
486
    (x+y*xsize)*3.
487
  * Если указанное смещение превышает 0x160000-16 =
488
    1.375 Mb - 16 bytes, вызов игнорируется.
489
  * Для обновления экрана (после завершения серии команд, работающих с
490
    фоном) вызывайте подфункцию 3 перерисовки фона.
491
  * Есть парная функция получения точки с фонового изображения -
492
    подфункция 2 функции 39.
493
 
494
======================================================================
495
============ Функция 15, подфункция 3 - перерисовать фон. ============
496
======================================================================
497
Параметры:
498
  * eax = 15 - номер функции
499
  * ebx = 3 - номер подфункции
500
Возвращаемое значение:
501
  * функция не возвращает значения
502
 
503
======================================================================
504
===== Функция 15, подфункция 4 - установить режим отрисовки фона. ====
505
======================================================================
506
Параметры:
507
  * eax = 15 - номер функции
508
  * ebx = 4 - номер подфункции
509
  * ecx = режим отрисовки:
510
    * 1 = замостить
511
    * 2 = растянуть
512
Возвращаемое значение:
513
  * функция не возвращает значения
514
Замечания:
515
  * Для обновления экрана (после завершения серии команд, работающих с
516
    фоном) вызывайте подфункцию 3 перерисовки фона.
517
  * Есть парная команда получения режима отрисовки фона -
518
    подфункция 4 функции 39.
519
 
520
======================================================================
521
===== Функция 15, подфункция 5 - поместить блок пикселей на фон. =====
522
======================================================================
523
Параметры:
524
  * eax = 15 - номер функции
525
  * ebx = 5 - номер подфункции
81 diamond 526
  * ecx = указатель на данные в формате BBGGRRBBGGRR...
77 diamond 527
  * edx = смещение в данных фонового изображения
528
  * esi = размер данных в байтах = 3 * число пикселей
529
Возвращаемое значение:
530
  * функция не возвращает значения
531
Замечания:
532
  * Если блок вылезает за границу 0x160000-16 = 1.375 Mb - 16 bytes,
533
    то вызов игнорируется.
81 diamond 534
  * Цвет каждого пикселя хранится как 3-байтная величина BBGGRR.
77 diamond 535
  * Пиксели фонового изображения записываются последовательно
536
    слева направо, сверху вниз.
537
  * Смещение пикселя с координатами (x,y) есть (x+y*xsize)*3.
538
  * Для обновления экрана (после завершения серии команд, работающих с
539
    фоном) вызывайте подфункцию 3 перерисовки фона.
540
 
541
======================================================================
542
============= Функция 16 - сохранить рамдиск на дискету. =============
543
======================================================================
544
Параметры:
545
  * eax = 16 - номер функции
546
  * ebx = 1 или ebx = 2 - на какую дискету сохранять
547
Возвращаемое значение:
548
  * eax = 0 - успешно
549
  * eax = 1 - ошибка
550
 
551
======================================================================
552
============== Функция 17 - получить код нажатой кнопки. =============
553
======================================================================
554
Забирает код нажатой кнопки из буфера.
555
Параметры:
556
  * eax = 17 - номер функции
557
Возвращаемое значение:
558
  * если буфер пуст, возвращается eax=1
559
  * если буфер непуст, то возвращается al=0, старшие 24 бита eax
560
    содержат идентификатор кнопки (в частности, в ah оказывается
561
    младший байт идентификатора; если все кнопки имеют идентификатор,
562
    меньший 256, то для различения достаточно ah)
563
Замечания:
564
  * "Буфер" хранит только одну кнопку, при нажатии новой кнопки
565
    информация о старой теряется.
566
  * При вызове этой функции приложением с неактивным окном
567
    возвращается ответ "буфер пуст".
568
 
569
======================================================================
570
======== Функция 18, подфункция 1 - завершить работу системы. ========
571
======================================================================
572
Параметры:
573
  * eax = 18 - номер функции
574
  * ebx = 1 - номер подфункции
575
Возвращаемое значение:
576
  * всегда возвращается eax = 0 как признак успеха
577
Замечания:
578
  * На последнем шаге появляется меню выхода из системы, ожидающее
579
    реакции пользователя.
580
  * Смотри также подфункцию 9, завершение работы системы с параметром,
581
    чтобы форсировать выбор в меню выхода.
582
 
583
======================================================================
91 diamond 584
==== Функция 18, подфункция 2 - завершить процесс/поток по слоту. ====
77 diamond 585
======================================================================
586
Параметры:
587
  * eax = 18 - номер функции
588
  * ebx = 2 - номер подфункции
589
  * ecx = номер слота процесса/потока
590
Возвращаемое значение:
591
  * функция не возвращает значения
592
Замечания:
593
  * Нельзя завершить поток операционной системы OS/IDLE (номер слота
594
    1), можно завершить любой обычный поток/процесс.
91 diamond 595
  * Смотри также подфункцию 18 - завершение
596
    процесса/потока с заданным идентификатором.
77 diamond 597
 
598
======================================================================
599
= Функция 18, подфункция 3 - сделать активным окно заданного потока. =
600
======================================================================
601
Параметры:
602
  * eax = 18 - номер функции
603
  * ebx = 3 - номер подфункции
604
  * ecx = номер слота потока
605
Возвращаемое значение:
606
  * функция не возвращает значения
607
Замечания:
608
  * При указании корректного, но несуществующего слота активизируется
609
    какое-то окно.
610
  * Узнать, какое окно является активным, можно вызовом подфункции 7.
611
 
612
======================================================================
613
 Функция 18, подфункция 4 - получить счётчик пустых тактов в секунду.
614
======================================================================
615
Под пустыми тактами понимается время, в которое процессор простаивает
616
в ожидании прерывания (в инструкции hlt).
617
 
618
Параметры:
619
  * eax = 18 - номер функции
620
  * ebx = 4 - номер подфункции
621
Возвращаемое значение:
622
  * eax = значение счётчика пустых тактов в секунду
623
 
624
======================================================================
625
======== Функция 18, подфункция 5 - получить тактовую частоту. =======
626
======================================================================
627
Параметры:
628
  * eax = 18 - номер функции
629
  * ebx = 5 - номер подфункции
630
Возвращаемое значение:
631
  * eax = тактовая частота (по модулю 2^32 тактов = 4ГГц)
632
 
633
======================================================================
634
 Функция 18, подфункция 6 - сохранить рамдиск в файл на жёстком диске.
635
======================================================================
636
Параметры:
637
  * eax = 18 - номер функции
638
  * ebx = 6 - номер подфункции
639
  * ecx определяет путь к файлу:
640
    * 1 = в папке "/KOLIBRI"
641
    * 2 = в корневом каталоге
642
    * 3 = edx указывает на путь (имена папок в формате 8+3,
643
      разделённые '/')
644
Возвращаемое значение:
645
  * eax = 0 - успешно
646
  * иначе eax = код ошибки файловой системы
647
Замечания:
648
  * Имя файла фиксировано, "menuet.img" (глобальная переменная ядра
649
    image_save из preboot.inc)
650
  * На каком разделе какого диска файл будет сохранён, определяется
651
    подфункцией 7 и подфункцией 8 функции 21.
652
  * Ядро предполагает, что во время записи никакая другая программа
653
    не будет обращаться к жёсткому диску.
654
  * Все папки в указанном пути должны существовать, иначе вернётся
655
    значение 5, "файл не найден".
656
 
657
======================================================================
658
====== Функция 18, подфункция 7 - получить номер активного окна. =====
659
======================================================================
660
Параметры:
661
  * eax = 18 - номер функции
662
  * ebx = 7 - номер подфункции
663
Возвращаемое значение:
664
  * eax = номер активного окна (номер слота потока, окно которого
665
    активно)
666
Замечания:
667
  * Активное окно находится вверху оконного стэка и получает
668
    сообщения обо всём вводе с клавиатуры.
669
  * Сделать окно активным можно вызовом подфункции 3.
670
 
671
======================================================================
672
==== Функция 18, подфункция 8 - отключить/разрешить звук спикера. ====
673
======================================================================
674
При отключённом звуке вызовы подфункции 55 функции 55 игнорируются.
675
При включённом - направляются на встроенный спикер.
676
 
677
--------------- Подподфункция 1 - получить состояние. ----------------
678
Параметры:
679
  * eax = 18 - номер функции
680
  * ebx = 8 - номер подфункции
681
  * ecx = 1 - номер подподфункции
682
Возвращаемое значение:
683
  * eax = 0 - звук спикера разрешён; 1 - запрещён
684
 
685
-------------- Подподфункция 2 - переключить состояние. --------------
686
Переключает состояния разрешения/запрещения.
687
Параметры:
688
  * eax = 18 - номер функции
689
  * ebx = 8 - номер подфункции
690
  * ecx = 2 - номер подподфункции
691
Возвращаемое значение:
692
  * функция не возвращает значения
693
 
694
======================================================================
695
= Функция 18, подфункция 9 - завершение работы системы с параметром. =
696
======================================================================
697
Параметры:
698
  * eax = 18 - номер функции
699
  * ebx = 9 - номер подфункции
700
  * ecx = параметр:
701
    * 1 = на последнем шаге завершения работы сохранить рамдиск на
702
      дискету, после чего вывести меню выхода и запросить у
703
      пользователя дальнейшие действия
704
    * 2 = выключить компьютер
705
    * 3 = перезагрузить компьютер
706
    * 4 = перезапустить ядро из файла kernel.mnt на рамдиске
707
Возвращаемое значение:
708
  * при неверном ecx регистры не меняются (т.е. eax=18)
709
  * при правильном вызове всегда возвращается признак успеха eax=0
710
Замечания:
711
  * Не следует полагаться на возвращаемое значение при неверном
712
    вызове, оно может измениться в последующих версиях ядра.
713
  * Можно использовать подфункцию 1, чтобы на последнем шаге
714
    завершения работы пользователь сам решал, что ему нужно.
715
  * Не рекомендуется использовать значение ecx=1 (чтобы не раздражать
716
    пользователя излишними вопросами); сохранить рамдиск на дискету
717
    можно функцией 16 (которая допускает уточнение, на какую именно
718
    дискету писать), а завершить работу с меню выхода можно уже
719
    упомянутой подфункцией 1.
720
 
721
======================================================================
722
======== Функция 18, подфункция 10 - свернуть окно приложения. =======
723
======================================================================
724
Сворачивает собственное окно.
725
Параметры:
726
  * eax = 18 - номер функции
727
  * ebx = 10 - номер подфункции
728
Возвращаемое значение:
729
  * функция не возвращает значения
730
Замечания:
731
  * Минимизированное окно с точки зрения функции 9 сохраняет положение
732
    и размеры.
733
  * Восстановление окна приложения происходит при активизировании
734
    подфункцией 3.
735
  * Обычно нет необходимости явно сворачивать/разворачивать своё окно:
736
    сворачивание окна осуществляется системой при нажатии на кнопку
737
    минимизации (которая для окон со скином определяется автоматически
738
    функцией 0, для окон без скина её можно определить функцией 8),
739
    восстановление - приложением @panel.
740
 
741
======================================================================
742
====================== Функция 18, подфункция 11 =====================
743
============= Получить информацию о дисковой подсистеме. =============
744
======================================================================
745
Параметры:
746
  * eax = 18 - номер функции
747
  * ebx = 11 - номер подфункции
748
  * ecx = тип таблицы:
749
    * 1 = короткая версия, 10 байт
750
    * 2 = полная версия, 65536 байт
751
  * edx = указатель на буфер (в приложении) для таблицы
752
Возвращаемое значение:
753
  * функция не возвращает значения
754
Формат таблицы: короткая версия:
755
  * +0: byte: информация о НГМД (дисководах для дискет), AAAABBBB,
756
    где AAAA задаёт тип первого дисковода, BBBB - второго согласно
757
    следующему списку:
758
    * 0 = нет дисковода
759
    * 1 = 360Kb, 5.25''
760
    * 2 = 1.2Mb, 5.25''
761
    * 3 = 720Kb, 3.5''
762
    * 4 = 1.44Mb, 3.5''
763
    * 5 = 2.88Mb, 3.5'' (такие дискеты сейчас уже не используются)
764
    Например, для стандартной конфигурации из одного 1.44-дисковода
765
    здесь будет 40h, а для случая 1.2Mb на A: и 1.44Mb на B:
766
    значение оказывается 24h.
767
  * +1: byte: информация о жёстких дисках и CD-приводах, AABBCCDD,
768
    где AA соответствует контроллеру IDE0, ..., DD - IDE3:
769
    * 0 = устройство отсутствует
770
    * 1 = жёсткий диск
771
    * 2 = CD-привод
772
    Например, в случае HD на IDE0 и CD на IDE2 здесь будет 48h.
773
  * +2: 4 db: число найденных разделов на жёстких дисках с
774
    соответственно IDE0,...,IDE3.
775
    При отсутствии жёсткого диска на IDEx соответствующий байт
776
    нулевой, при наличии показывает число распознанных разделов,
777
    которых может и не быть (если носитель не отформатирован или
778
    если файловая система не поддерживается). В текущей версии ядра
779
    для жёстких дисков поддерживаются только FAT16 и FAT32.
780
  * +6: 4 db: зарезервировано
781
Формат таблицы: полная версия:
782
  * +0: 10 db: такие же, как и в короткой версии
783
  * +10: 100 db: данные для первого раздела
784
  * +110: 100 db: данные для второго раздела
785
  * ...
786
  * +10+100*(n-1): 100 db: данные для последнего раздела
787
Разделы расположены в следующем порядке: сначала последовательно все
788
распознанные разделы на HD на IDE0 (если есть),
789
затем на HD на IDE1 (если есть) и т.д. до IDE3.
790
Формат информации о разделе (пока поддерживается только FAT):
791
  * +0: dword: начальный физический сектор раздела
792
  * +4: dword: последний физический сектор раздела
793
    (принадлежит разделу)
794
  * +8: dword: секторов в одной копии FAT
795
  * +12 = +0xC: dword: число копий FAT
796
  * +16 = +0x10: dword: число секторов в кластере
797
  * +20 = +0x14: dword: байт в секторе; текущая реализация ожидает,
798
    что здесь 0x200 = 512
799
  * +24 = +0x18: dword: первый кластер корневого каталога в FAT32,
800
 
801
  * +28 = +0x1C: dword: начальный физический сектор FAT
802
  * +32 = +0x20: dword: первый физический сектор корневого каталога
803
    для FAT16, игнорируется для FAT32
804
  * +36 = +0x24: dword: число секторов в корневом каталоге для FAT16,
805
 
806
  * +40 = +0x28: dword: физический сектор начала области данных
807
  * +44 = +0x2C: dword: максимальный номер кластера
808
  * +48 = +0x30: dword: физический сектор информации о
809
    файловой системе для FAT32, игнорируется для FAT16
810
  * +52 = +0x34: dword: значение, используемое как граница
811
    специальных значений в FAT
812
  * +56 = +0x38: dword: значение, используемое для плохих кластеров
813
    в FAT
814
  * +60 = +0x3C: dword: значение, используемое как маркер конца
815
    при записи цепочки в FAT
816
  * +64 = +0x40: dword: маска, накладываемая на элемент FAT
817
  * +68 = +0x44: byte: тип файловой системы: 16 или 32
818
  * +69 = +0x45: 31 db: зарезервировано
819
Замечания:
820
  * Короткая таблица может быть использована для получения информации
821
    об имеющихся устройствах.
822
  * Первые два поля информации о разделе в полной версии таблицы
823
    сообщают параметры раздела, оставшиеся - параметры файловой
824
    системы FAT. Для других файловых систем (когда они будут
825
    поддерживаться) специфическая для файловой системы информация,
826
    естественно, будет другой, но первые два поля
827
    сохранятся неизменными.
828
 
829
======================================================================
830
=== Функция 18, подфункция 12 - получить последнюю нажатую клавишу. ==
831
======================================================================
832
Параметры:
833
  * eax = 18 - номер функции
834
  * ebx = 12 - номер подфункции
835
Возвращаемое значение:
836
  * al = режим ввода с клавиатуры (0=ASCII,1=сканкоды), который
837
    имел место при обработке нажатия последней клавиши на клавиатуре
838
  * ah = код последней нажатой клавиши
839
  * старшее слово регистра eax обнулено
840
Замечания:
841
  * Только эта функция позволяет считывать клавиши, во время
842
    считывания которых из буфера была нажата клавиша Alt, функция 2
843
    в случае, когда при её вызове была нажата Alt, возвращает
844
    "буфер пуст", тем не менее считывая клавишу из очереди в
845
    глобальную системную переменную last_key_press и продвигая очередь
846
    вперёд.
847
  * После считывания код последней нажатой клавиши сбрасывается в 0.
848
    Следовательно, не стоит использовать эту функцию в двух различных
849
    программах (и даже два раза в одной программе).
850
  * Приложение @panel использует эту функцию для реагирования
851
    на Alt+F4, Alt+Win, Alt+Ctrl+F12.
852
  * last_key_press обновляется в точности в следующих случаях:
853
    * Обнуляется при вызове описываемой функции.
854
    * Когда управление получает некоторая процедура
855
      (main_loop_sys_getkey) главного цикла операционной системы:
856
      если буфер непуст, то первая клавиша буфера копируется в
857
      last_key_press (и не забирается из очереди).
858
    * При вызове функции 2: если буфер непуст, то считанная клавиша
859
      копируется в last_key_press (и возвращается приложению,
860
      вызвавшему функцию 2, но только если в момент считывания
861
      не нажата Alt).
862
  * Поскольку при активизации окна сбрасываются очереди клавиш и
863
    кнопок, то в большинстве случаев интерпретация ah соответствует al
864
    (т.е. понятно, что хранится в ah - ASCII-код или сканкод).
865
    Тем не менее возможны неприятные случаи, когда активное окно,
866
    не заботясь об оставшихся в буфере клавишах, вызывает функцию 66,
867
    переключаясь между режимами; если после этого пользователь нажмёт
868
    на клавишу, то значение переменной, соответствующей al, изменится,
869
    а начальные клавиши в буфере останутся в старом режиме.
870
 
871
======================================================================
872
========== Функция 18, подфункция 13 - получить версию ядра. =========
873
======================================================================
874
Параметры:
875
  * eax = 18 - номер функции
876
  * ebx = 13 - номер подфункции
877
  * ecx = указатель на буфер (не менее 16 байт), куда будет помещена
878
    информация
879
Возвращаемое значение:
880
  * функция не возвращает значения
881
Структура буфера:
882
db a,b,c,d для версии a.b.c.d
883
db UID_xxx: одно из UID_NONE=0, UID_MENUET=1, UID_KOLIBRI=2
884
db 'name',0 - ASCIIZ-строка с именем
885
Для ядра Kolibri 0.5.3.1:
886
db 0,5,3,1
887
db 2
888
db 'Kolibri',0
889
 
890
======================================================================
891
====================== Функция 18, подфункция 14 =====================
892
======= Ожидать начала обратного хода луча развёртки монитора. =======
893
======================================================================
894
Параметры:
895
  * eax = 18 - номер функции
896
  * ebx = 14 - номер подфункции
897
Возвращаемое значение:
898
  * eax = 0 как признак успеха
899
Замечания:
900
  * Функция предназначена исключительно для активных
901
    высокопроизводительных графических приложений; используется для
902
    плавного вывода графики.
903
 
904
======================================================================
905
== Функция 18, подфункция 15 - поместить курсор мыши в центр экрана. =
906
======================================================================
907
Параметры:
908
  * eax = 18 - номер функции
909
  * ebx = 15 - номер подфункции
910
Возвращаемое значение:
911
  * eax = 0 как признак успеха
912
 
913
======================================================================
914
====================== Функция 18, подфункция 16 =====================
915
============ Получить размер свободной оперативной памяти. ===========
916
======================================================================
917
Параметры:
918
  * eax = 18 - номер функции
919
  * ebx = 16 - номер подфункции
920
Возвращаемое значение:
921
  * eax = размер свободной памяти в килобайтах
922
 
923
======================================================================
924
====================== Функция 18, подфункция 17 =====================
925
============ Получить размер имеющейся оперативной памяти. ===========
926
======================================================================
927
Параметры:
928
  * eax = 18 - номер функции
929
  * ebx = 17 - номер подфункции
930
Возвращаемое значение:
931
  * eax = общий размер имеющейся памяти в килобайтах
932
 
933
======================================================================
91 diamond 934
====================== Функция 18, подфункция 18 =====================
935
============= Завершить процесс/поток по идентификатору. =============
85 halyavin 936
======================================================================
937
Параметры:
938
  * eax = 18 - номер функции
939
  * ebx = 18 - номер подфункции
91 diamond 940
  * ecx = идентификатор процесса/потока (PID/TID)
941
Возвращаемое значение:
942
  * eax = 0 - успешно
943
  * eax = -1 - ошибка (процесс не найден или является системным)
944
Замечания:
945
  * Нельзя завершить поток операционной системы OS/IDLE (номер слота
946
    1), можно завершить любой обычный поток/процесс.
947
  * Смотри также подфункцию 2 - завершение
948
    процесса/потока по заданному слоту.
85 halyavin 949
 
950
======================================================================
77 diamond 951
============ Функция 19 - запустить программу с рамдиска. ============
952
======================================================================
953
Параметры:
954
  * eax = 19 - номер функции
955
  * ebx = указатель на имя программы в формате, аналогичном функции 6
956
  * ecx = 0 или ecx = указатель на параметры командной строки
957
Возвращаемое значение:
958
  * Если eax > 0, то eax содержит PID созданного процесса
959
  * Если eax < 0, то -eax - код ошибки файловой системы
960
Замечания:
91 diamond 961
  * Эта функция устарела; используйте подфункцию 7 функции 70.
77 diamond 962
  * Комадная строка должна заканчиваться символом с кодом 0
963
    (ASCIIZ-строка); учитываются либо все символы до завершающего нуля
964
    включительно, либо первые 256 символов, в зависимости от того,
965
    что меньше.
966
 
967
======================================================================
968
==================== Функция 20 - интерфейс MIDI. ====================
969
======================================================================
970
 
971
------------------------ Подфункция 1 - сброс ------------------------
972
Параметры:
973
  * eax = 20 - номер функции
974
  * ebx = 1 - номер подфункции
975
 
976
-------------------- Подфункция 2 - вывести байт ---------------------
977
Параметры:
978
  * eax = 20 - номер функции
979
  * ebx = 2 - номер подфункции
980
  * cl = байт для вывода
981
Возвращаемое значение (одинаково для обеих подфункций):
982
  * eax = 0 - успешно
983
  * eax = 1 - не определён базовый порт
984
Замечания:
985
  * Предварительно должен быть определён базовый порт вызовом
986
    подфункции 1 функции 21.
987
 
988
======================================================================
989
==== Функция 21, подфункция 1 - установить базовый порт MPU MIDI. ====
990
======================================================================
991
Параметры:
992
  * eax = 21 - номер функции
993
  * ebx = 1 - номер подфункции
994
  * ecx = номер базового порта
995
Возвращаемое значение:
996
  * eax = 0 - успешно
997
  * eax = -1 - ошибочный номер порта
998
Замечания:
999
  * Номер порта должен удовлетворять условиям 0x100<=ecx<=0xFFFF.
1000
  * Установка базы нужна для работы функции 20.
1001
  * Получить установленный базовый порт можно вызовом
1002
    подфункции 1 функции 26.
1003
 
1004
======================================================================
1005
===== Функция 21, подфункция 2 - установить раскладку клавиатуры. ====
1006
======================================================================
1007
Раскладка клавиатуры используется для преобразования сканкодов,
1008
поступающих от клавиатуры, в ASCII-коды, считываемые функцией 2.
1009
Параметры:
1010
  * eax = 21 - номер функции
1011
  * ebx = 2 - номер подфункции
1012
  * ecx = какую раскладку устанавливать:
1013
    * 1 = нормальную
1014
    * 2 = раскладку при нажатом Shift
1015
    * 3 = раскладку при нажатом Alt
1016
  * edx = указатель на раскладку - таблицу длиной 128 байт
1017
Или:
1018
  * ecx = 9
1019
  * dx = идентификатор страны (1=eng, 2=fi, 3=ger, 4=rus)
1020
Возвращаемое значение:
1021
  * eax = 0 - успешно
1022
  * eax = 1 - параметр задан неверно
1023
Замечания:
1024
  * Если нажат Alt, то используется раскладка с Alt;
1025
    если не нажат Alt, но нажат Shift, то
1026
    используется раскладка с Shift;
1027
    если не нажаты Alt и Shift, но нажат Ctrl, то используется
1028
    нормальная раскладка, после чего из кода вычитается 0x60;
1029
    если не нажата ни одна из управляющих клавиш, то используется
1030
    нормальная раскладка.
1031
  * Ценность установки раскладки с Alt представляется сомнительной,
1032
    поскольку всё равно функция 2 не возвращает клавиши при
1033
    нажатом Alt.
1034
  * Получить раскладки и идентификатор страны можно с помощью
1035
    подфункции 2 функции 26.
1036
  * Идентификатор страны - глобальная системная переменная, которая
1037
    самим ядром не используется; однако приложение @panel отображает
1038
    соответствующую текущей стране иконку.
1039
  * Приложение @panel переключает раскладки по запросу пользователя.
1040
 
1041
======================================================================
1042
=========== Функция 21, подфункция 3 - установить базу CD. ===========
1043
======================================================================
1044
Параметры:
1045
  * eax = 21 - номер функции
1046
  * ebx = 3 - номер подфункции
1047
  * ecx = база CD: 1=IDE0, 2=IDE1, 3=IDE2, 4=IDE3
1048
Возвращаемое значение:
1049
  * eax = 0
1050
Замечания:
1051
  * База CD используется функцией 24.
1052
  * Получить установленную базу CD можно вызовом
1053
    подфункции 3 функции 26.
1054
 
1055
======================================================================
1056
== Функция 21, подфункция 4 - установить базовый порт Sound Blaster. =
1057
======================================================================
1058
Параметры:
1059
  * eax = 21 - номер функции
1060
  * ebx = 4 - номер подфункции
1061
  * ecx = номер базового порта
1062
Возвращаемое значение:
1063
  * eax = 0 - успешно
1064
  * eax = -1 - ошибочный номер порта
1065
Замечания:
1066
  * Номер порта должен удовлетворять условиям 0x100<=ecx<=0xFFFF.
1067
  * Установка базы нужна для работы функций 25, 28, 55.
1068
  * Получить установленный базовый порт можно вызовом
1069
    подфункции 4 функции 26.
1070
 
1071
======================================================================
1072
========= Функция 21, подфункция 5 - установить язык системы. ========
1073
======================================================================
1074
Параметры:
1075
  * eax = 21 - номер функции
1076
  * ebx = 5 - номер подфункции
1077
  * ecx = язык системы (1=eng, 2=fi, 3=ger, 4=rus)
1078
Возвращаемое значение:
1079
  * eax = 0
1080
Замечания:
1081
  * Язык системы - глобальная системная переменная, никак
1082
    не используемая самим ядром, однако приложение @panel рисует
1083
    соответствующую иконку.
1084
  * Проверок на корректность не делается, поскольку ядро эту
1085
    переменную не использует.
1086
  * Получить язык системы можно вызовом подфункции 5 функции 26.
1087
 
1088
======================================================================
1089
======= Функция 21, подфункция 6 - установить базовый порт WSS. ======
1090
======================================================================
1091
Параметры:
1092
  * eax = 21 - номер функции
1093
  * ebx = 6 - номер подфункции
1094
  * ecx = базовый порт
1095
Возвращаемое значение:
1096
  * eax = 0 - успешно
1097
  * eax = -1 - ошибочный номер порта
1098
Замечания:
1099
  * Номер порта должен удовлетворять условию 0x100<=ecx.
1100
  * База WSS используется функцией 27.
1101
  * Получить установленный базовый порт WSS можно вызовом
1102
    подфункции 6 функции 26.
1103
 
1104
======================================================================
1105
=========== Функция 21, подфункция 7 - установить базу HD. ===========
1106
======================================================================
1107
База HD нужна для определения, на какой жёсткий диск писать, при
1108
использовании устаревших функций работы с файловой системой и функций,
1109
неявно использующих жёсткий диск (типа подфункции 6 функции 18);
1110
при использовании функций 58 и 70 и современного синтаксиса
1111
/HD0,/HD1,/HD2,/HD3 эти функции сами устанавливают базу.
1112
Параметры:
1113
  * eax = 21 - номер функции
1114
  * ebx = 7 - номер подфункции
1115
  * ecx = база HD: 1=IDE0, 2=IDE1, 3=IDE2, 4=IDE3
1116
Возвращаемое значение:
1117
  * eax = 0
1118
Замечания:
1119
  * Любое приложение в любой момент времени может изменить базу.
1120
  * Не следует изменять базу, когда какое-нибудь приложение работает
1121
    с жёстким диском. Если не хотите глюков системы.
1122
  * Получить установленную базу можно вызовом подфункции 7 функции 26.
1123
  * Следует также определить используемый раздел жёсткого диска
1124
    подфункцией 8.
1125
 
1126
======================================================================
1127
========== Функция 21, подфункция 8 - установить раздел HD. ==========
1128
======================================================================
1129
Раздел HD нужен для определения, на какой раздел жёсткого диска
1130
писать, при использовании устаревших функций работы с файловой
1131
системой и функций, неявно использующих жёсткий диск (типа
1132
подфункции 6 функции 18); при использовании функций 58 и 70
1133
и современного синтаксиса /HD0,/HD1,/HD2,/HD3 эти функции сами
1134
устанавливают базу и раздел.
1135
Параметры:
1136
  * eax = 21 - номер функции
1137
  * ebx = 8 - номер подфункции
1138
  * ecx = раздел HD (считая с 1)
1139
Возвращаемое значение:
1140
  * eax = 0
1141
Замечания:
1142
  * Любое приложение в любой момент времени может изменить раздел.
1143
  * Не следует изменять раздел, когда какое-нибудь приложение работает
1144
    с жёстким диском. Если не хотите глюков системы.
1145
  * Получить установленный раздел можно вызовом подфункции 8
1146
    функции 26.
1147
  * Проверок на корректность не делается.
1148
  * Узнать число разделов на жёстком диске можно вызовом
1149
    подфункции 11 функции 18.
1150
  * Следует также определить используемую базу жёсткого диска
1151
    подфункцией 7.
1152
 
1153
======================================================================
1154
===== Функция 21, подфункция 10 - установить канал DMA для звука. ====
1155
======================================================================
1156
Параметры:
1157
  * eax = 21 - номер функции
1158
  * ebx = 10 - номер подфункции
1159
  * ecx = номер канала (от 0 до 3 включительно)
1160
Возвращаемое значение:
1161
  * eax = 0 - успешно
1162
  * eax = -1 - неверный номер канала
1163
Замечания:
1164
  * Номер канала DMA используется в
1165
    подфункции 1 функции 55.
1166
  * Получить канал DMA для звука можно вызовом
1167
    подфункции 10 функции 26.
1168
 
1169
======================================================================
1170
====================== Функция 21, подфункция 11 =====================
1171
=========== Разрешить/запретить низкоуровневый доступ к HD. ==========
1172
======================================================================
1173
Параметры:
1174
  * eax = 21 - номер функции
1175
  * ebx = 11 - номер подфункции
1176
  * ecx = 0/1 - запретить/разрешить
1177
Возвращаемое значение:
1178
  * eax = 0
1179
Замечания:
1180
  * Используется при LBA-чтении (подфункция 8 функции 58).
1181
  * Текущая реализация использует только младший бит ecx.
1182
  * Получить текущее состояние можно вызовом подфункции 11 функции 26.
1183
 
1184
======================================================================
1185
====================== Функция 21, подфункция 12 =====================
1186
========== Разрешить/запретить низкоуровневый доступ к PCI. ==========
1187
======================================================================
1188
Параметры:
1189
  * eax = 21 - номер функции
1190
  * ebx = 12 - номер подфункции
1191
  * ecx = 0/1 - запретить/разрешить
1192
Возвращаемое значение:
1193
  * eax = 0
1194
Замечания:
1195
  * Используется при работе с шиной PCI (функция 62).
1196
  * Текущая реализация использует только младший бит ecx.
1197
  * Получить текущее состояние можно вызовом подфункции 12 функции 26.
1198
 
1199
======================================================================
1200
============= Функция 21, подфункция 13, подподфункция 1 =============
1201
==== Инициализировать + получить информацию о драйвере vmode.mdr. ====
1202
======================================================================
1203
Параметры:
1204
  * eax = 21 - номер функции
1205
  * ebx = 13 - номер подфункции
1206
  * ecx = 1 - номер функции драйвера
1207
  * edx = указатель на буфер размера 512 байт
1208
Возвращаемое значение:
1209
  * если драйвер не загружен (никогда не бывает в текущей реализации):
1210
    * eax = -1
1211
    * ebx, ecx разрушаются
1212
  * если драйвер загружен:
1213
    * eax = 'MDAZ' (в стиле fasm'а, т.е. 'M' - младший байт,
1214
      'Z' - старший) - сигнатура
1215
    * ebx = текущая частота развёртки (в Гц)
1216
    * ecx разрушается
1217
    * буфер, на который указывает edx, заполнен
1218
Формат буфера:
1219
  * +0: 32*byte: имя драйвера, "Trans VideoDriver" (без кавычек,
1220
    дополнено пробелами)
1221
  * +32 = +0x20: dword: версия драйвера (версия x.y кодируется как
1222
    y*65536+x), для текущей реализации 1 (1.0)
1223
  * +36 = +0x24: 7*dword: зарезервировано (0 в текущей реализации)
1224
  * +64 = +0x40: 32*word: список поддерживаемых видеорежимов (каждое
1225
    слово - номер видеорежима, после собственно списка идут нули)
1226
  * +128 = +0x80: 32*(5*word): список поддерживаемых частот развёрток
1227
    для видеорежимов: для каждого видеорежима, указанного в предыдущем
1228
    поле, указано до 5 поддерживаемых частот
1229
    (в неиспользуемых позициях записаны нули)
1230
Замечания:
1231
  * Функция инициализирует драйвер (если он ещё не инициализирован)
1232
    и должна вызываться первой, перед остальными (иначе они будут
1233
    возвращать -1, ничего не делая).
1234
  * В текущей реализации поддерживается только одна частота развёртки
1235
    на видеорежим.
1236
 
1237
======================================================================
1238
============= Функция 21, подфункция 13, подподфункция 2 =============
1239
============= Получить информацию о текущем видеорежиме. =============
1240
======================================================================
1241
Параметры:
1242
  * eax = 21 - номер функции
1243
  * ebx = 13 - номер подфункции
1244
  * ecx = 2 - номер функции драйвера
1245
Возвращаемое значение:
1246
  * eax = -1 - драйвер не загружен или не инициализирован;
1247
    ebx,ecx разрушаются
1248
  * eax = [ширина]*65536 + [высота]
1249
  * ebx = частота вертикальной развёртки (в Гц)
1250
  * ecx = номер текущего видеорежима
1251
Замечания:
1252
  * Драйвер предварительно должен быть инициализирован вызовом
1253
    функции драйвера 1.
1254
  * Если нужны только размеры экрана, целесообразней использовать
1255
    функцию 14 с учётом того, что она возвращает размеры на 1 меньше.
1256
 
1257
======================================================================
1258
= Функция 21, подфункция 13, подподфункция 3 - установить видеорежим.
1259
======================================================================
1260
Параметры:
1261
  * eax = 21 - номер функции
1262
  * ebx = 13 - номер подфункции
1263
  * ecx = 3 - номер функции драйвера
1264
  * edx = [частота развёртки]*65536 + [номер видеорежима]
1265
Возвращаемое значение:
1266
  * eax = -1 - драйвер не загружен, не инициализирован или
1267
    произошла ошибка
1268
  * eax = 0 - успешно
1269
  * ebx, ecx разрушаются
1270
Замечания:
1271
  * Драйвер предварительно должен быть инициализирован вызовом
1272
    функции драйвера 1.
1273
  * Номер видеорежима и частота должны быть в таблице, возвращаемой
1274
    функцией драйвера 1.
1275
 
1276
======================================================================
1277
============= Функция 21, подфункция 13, подподфункция 4 =============
1278
================= Вернуться к начальному видеорежиму. ================
1279
======================================================================
1280
Возвращает экран в видеорежим, установленный при загрузке системы.
1281
Параметры:
1282
  * eax = 21 - номер функции
1283
  * ebx = 13 - номер подфункции
1284
  * ecx = 4 - номер функции драйвера
1285
Возвращаемое значение:
1286
  * eax = -1 - драйвер не загружен или не инициализирован
1287
  * eax = 0 - успешно
1288
  * ebx, ecx разрушаются
1289
Замечания:
1290
  * Драйвер предварительно должен быть инициализирован вызовом
1291
    функции драйвера 1.
1292
 
1293
======================================================================
1294
============= Функция 21, подфункция 13, подподфункция 5 =============
1295
======== Увеличить/уменьшить размер видимой области монитора. ========
1296
======================================================================
1297
Параметры:
1298
  * eax = 21 - номер функции
1299
  * ebx = 13 - номер подфункции
1300
  * ecx = 5 - номер функции драйвера
1301
  * edx = 0/1 - уменьшить/увеличить размер по горизонтали
1302
    на одну позицию
1303
  * edx = 2/3 - в текущей реализации не поддерживается; планируется
1304
    как уменьшение/увеличение размера по вертикали на одну позицию
1305
Возвращаемое значение:
1306
  * eax = -1 - драйвер не загружен или не инициализирован
1307
  * eax = 0 - успешно
1308
  * ebx, ecx разрушаются
1309
Замечания:
1310
  * Драйвер предварительно должен быть инициализирован вызовом
1311
    функции драйвера 1.
1312
  * Функция влияет только на физический размер изображения
1313
    на мониторе; логический размер (число пикселей) не меняется.
1314
 
1315
======================================================================
1316
============ Функция 22 - установить системную дату/время. ===========
1317
======================================================================
1318
Параметры:
1319
  * eax = 22 - номер функции
1320
  * ebx = 0 - установить время
1321
    * ecx = 0x00SSMMHH - время в двоично-десятичном коде (BCD):
1322
    * HH=час 00..23
1323
    * MM=минута 00..59
1324
    * SS=секунда 00..59
1325
  * ebx = 1 - установить дату
1326
    * ecx = 0x00DDMMYY - дата в двоично-десятичном коде (BCD):
1327
    * DD=день 01..31
1328
    * MM=месяц 01..12
1329
    * YY=год 00..99
1330
  * ebx = 2 - установить день недели
1331
    * ecx = 1 для воскресенья, ..., 7 для субботы
1332
  * ebx = 3 - установить будильник
1333
    * ecx = 0x00SSMMHH
1334
Возвращаемое значение:
1335
  * eax = 0 - успешно
1336
  * eax = 1 - параметр задан неверно
1337
  * eax = 2 - CMOS-батарейки разрядились
1338
Замечания:
1339
  * Ценность установки дня недели представляется сомнительной,
1340
    поскольку он мало где используется
1341
    (день недели можно рассчитать по дате).
1342
  * Будильник можно установить на срабатывание в заданное время
1343
    каждые сутки. При этом отключить его существующими системными
1344
    функциями нельзя.
1345
  * Срабатывание будильника заключается в генерации IRQ8.
1346
  * Вообще-то CMOS поддерживает для будильника установку значения
1347
    0xFF в качестве одного из параметров и означает это, что
1348
    соответствующий параметр игнорируется. Но в текущей реализации
1349
    это не пройдёт (вернётся значение 1).
1350
  * Будильник - глобальный системный ресурс; установка будильника
1351
    автоматически отменяет предыдущую установку. Впрочем, на данный
1352
    момент ни одна программа его не использует.
1353
 
1354
======================================================================
1355
============== Функция 23 - ожидать события с таймаутом. =============
1356
======================================================================
1357
Если очередь сообщений пуста, ждёт появления сообщения в очереди,
1358
но не более указанного времени. Затем считывает сообщение из очереди.
1359
 
1360
Параметры:
1361
  * eax = 23 - номер функции
1362
  * ebx = таймаут (в сотых долях секунды)
1363
Возвращаемое значение:
1364
  * eax = 0 - очередь сообщений пуста
1365
  * иначе eax = событие (смотри список событий)
1366
Замечания:
1367
  * Учитываются только те события, которые входят в маску,
1368
    устанавливаемую функцией 40. По умолчанию это события
1369
    перерисовки, нажатия на клавиши и на кнопки.
1370
  * Для проверки, есть ли сообщение в очереди, используйте функцию 11.
1371
    Чтобы ждать сколь угодно долго, используйте функцию 10.
1372
  * Передача ebx=0 приводит к моментальному возвращению eax=0.
1373
  * При текущей реализации произойдёт немедленный возврат из функции
1374
    с eax=0, если сложение ebx с текущим значением счётчика времени
1375
    вызовет 32-битное переполнение.
1376
 
1377
======================================================================
1378
======= Функция 24, подфункция 1 - начать проигрывать CD-audio. ======
1379
======================================================================
1380
Параметры:
1381
  * eax = 24 - номер функции
1382
  * ebx = 1 - номер подфункции
1383
  * ecx = 0x00FRSSMM, где
1384
    * MM = начальная минута
1385
    * SS = начальная секунда
1386
    * FR = начальный фрейм
1387
Возвращаемое значение:
1388
  * eax = 0 - успешно
1389
  * eax = 1 - не определена база CD
1390
Замечания:
1391
  * Предварительно нужно определить базовый порт CD вызовом
1392
    подфункции 3 функции 21.
1393
  * В секунде 75 фреймов, в минуте 60 секунд.
1394
  * Функция асинхронна (возвращает управление, когда началось
1395
    проигрывание).
1396
 
1397
======================================================================
1398
===== Функция 24, подфункция 2 - получить информацию о дорожках. =====
1399
======================================================================
1400
Параметры:
1401
  * eax = 24 - номер функции
1402
  * ebx = 2 - номер подфункции
1403
  * ecx = указатель на буфер для таблицы
1404
    (максимум 8*64h+4 байт=100 дорожек)
1405
Возвращаемое значение:
1406
  * eax = 0 - успешно
1407
  * eax = 1 - не определена база CD
1408
Замечания:
1409
  * Формат таблицы с информацией о дорожках такой же, как и для
1410
    ATAPI-CD команды 43h (READ TOC), обычной таблицы (подкоманда 00h).
1411
    Адреса возвращаются в формате MSF.
1412
  * Предварительно нужно определить базовый порт CD вызовом
1413
    подфункции 3 функции 21.
1414
  * Функция возвращает информацию только о не более чем 100
1415
    первых дорожках. В большинстве случаев этого достаточно.
1416
 
1417
======================================================================
1418
==== Функция 24, подфункция 3 - остановить проигрываемое CD-audio. ===
1419
======================================================================
1420
Параметры:
1421
  * eax = 24 - номер функции
1422
  * ebx = 1 - номер подфункции
1423
Возвращаемое значение:
1424
  * eax = 0 - успешно
1425
  * eax = 1 - не определена база CD
1426
Замечания:
1427
  * Предварительно нужно определить базовый порт CD вызовом
1428
    подфункции 3 функции 21.
1429
 
1430
======================================================================
1431
============== Функция 25 - установить громкость SBPro. ==============
1432
======================================================================
1433
Параметры:
1434
  * eax = 25 - номер функции
1435
  * ebx = что устанавливать:
1436
    * 1 - установить общую громкость
1437
    * 2 - установить громкость CD-audio
1438
  * cl = уровень громкости: старшие 4 бита для левой колонки,
1439
    младшие 4 - для правой
1440
Возвращаемое значение:
1441
  * eax = 0 - успешно
1442
  * eax = 1 - не определена база SB
1443
  * eax = 2 - неверная подфункция
1444
Замечания:
1445
  * Предварительно нужно определить базовый порт SB вызовом
1446
    подфункции 4 функции 21.
1447
  * Смотри также функцию 28
1448
    установки звука для более позднего стандарта SB16.
1449
 
1450
======================================================================
1451
===== Функция 26, подфункция 1 - получить базовый порт MPU MIDI. =====
1452
======================================================================
1453
Параметры:
1454
  * eax = 26 - номер функции
1455
  * ebx = 1 - номер подфункции
1456
Возвращаемое значение:
1457
  * eax = номер порта
1458
Замечания:
1459
  * Установить базовый порт можно вызовом
1460
    подфункции 1 функции 21.
1461
 
1462
======================================================================
1463
====== Функция 26, подфункция 2 - получить раскладку клавиатуры. =====
1464
======================================================================
1465
Раскладка клавиатуры используется для преобразования сканкодов,
1466
поступающих от клавиатуры, в ASCII-коды, считываемые функцией 2.
1467
Параметры:
1468
  * eax = 26 - номер функции
1469
  * ebx = 2 - номер подфункции
1470
  * ecx = какую раскладку получать:
1471
    * 1 = нормальную
1472
    * 2 = раскладку при нажатом Shift
1473
    * 3 = раскладку при нажатом Alt
1474
  * edx = указатель на буфер длиной 128 байт, куда будет скопирована
1475
    раскладка
1476
Возвращаемое значение:
1477
  * функция не возвращает значения
1478
Или:
1479
  * eax = 26 - номер функции
1480
  * ebx = 2 - номер подфункции
1481
  * ecx = 9
1482
Возвращаемое значение:
1483
  * eax = идентификатор страны (1=eng, 2=fi, 3=ger, 4=rus)
1484
Замечания:
1485
  * Если нажат Alt, то используется раскладка с Alt;
1486
    если не нажат Alt, но нажат Shift, то используется
1487
    раскладка с Shift;
1488
    если не нажаты Alt и Shift, но нажат Ctrl, то используется
1489
    нормальная раскладка, после чего из кода вычитается 0x60;
1490
    если не нажата ни одна из управляющих клавиш, то используется
1491
    нормальная раскладка.
1492
  * Установить раскладки и идентификатор страны можно с помощью
1493
    подфункции 2 функции 21.
1494
  * Идентификатор страны - глобальная системная переменная, которая
1495
    самим ядром не используется; однако приложение @panel отображает
1496
    соответствующую текущей стране иконку
1497
    (используя описываемую функцию).
1498
  * Приложение @panel переключает раскладки по запросу пользователя.
1499
 
1500
======================================================================
1501
============ Функция 26, подфункция 3 - получить базу CD. ============
1502
======================================================================
1503
Параметры:
1504
  * eax = 26 - номер функции
1505
  * ebx = 3 - номер подфункции
1506
Возвращаемое значение:
1507
  * eax = база CD: 1=IDE0, 2=IDE1, 3=IDE2, 4=IDE3
1508
Замечания:
1509
  * База CD используется функцией 24.
1510
  * Установлить базу CD можно вызовом подфункции 3 функции 21.
1511
 
1512
======================================================================
1513
=== Функция 26, подфункция 4 - получить базовый порт Sound Blaster. ==
1514
======================================================================
1515
Параметры:
1516
  * eax = 26 - номер функции
1517
  * ebx = 4 - номер подфункции
1518
Возвращаемое значение:
1519
  * eax = номер базового порта
1520
Замечания:
1521
  * Установка базы нужна для работы функций 25, 55.
1522
  * Установить базовый порт можно вызовом подфункции 4 функции 21.
1523
 
1524
======================================================================
1525
========== Функция 26, подфункция 5 - получить язык системы. =========
1526
======================================================================
1527
Параметры:
1528
  * eax = 26 - номер функции
1529
  * ebx = 5 - номер подфункции
1530
Возвращаемое значение:
1531
  * eax = язык системы (1=eng, 2=fi, 3=ger, 4=rus)
1532
Замечания:
1533
  * Язык системы - глобальная системная переменная, никак
1534
    не используемая самим ядром, однако приложение @panel рисует
1535
    соответствующую иконку (используя описываемую функцию).
1536
  * Установить язык системы можно вызовом подфункции 5 функции 21.
1537
 
1538
======================================================================
1539
======== Функция 26, подфункция 6 - получить базовый порт WSS. =======
1540
======================================================================
1541
Параметры:
1542
  * eax = 26 - номер функции
1543
  * ebx = 6 - номер подфункции
1544
Возвращаемое значение:
1545
  * eax = базовый порт
1546
Замечания:
1547
  * База WSS используется функцией 27.
1548
  * Установить базовый порт WSS можно вызовом подфункции 6 функции 21.
1549
 
1550
======================================================================
1551
============ Функция 26, подфункция 7 - получить базу HD. ============
1552
======================================================================
1553
База HD нужна для определения, на какой жёсткий диск писать, при
1554
использовании устаревших функций работы с файловой системой и функций,
1555
неявно использующих жёсткий диск (типа подфункции 6 функции 18);
1556
при использовании функций 58 и 70 и современного синтаксиса
1557
/HD0,/HD1,/HD2,/HD3 эти функции сами устанавливают базу.
1558
Параметры:
1559
  * eax = 26 - номер функции
1560
  * ebx = 7 - номер подфункции
1561
Возвращаемое значение:
1562
  * eax = база HD: 1=IDE0, 2=IDE1, 3=IDE2, 4=IDE3
1563
Замечания:
1564
  * Любое приложение в любой момент времени может изменить базу.
1565
  * Установить базу можно вызовом подфункции 7 функции 21.
1566
  * Получить используемый раздел жёсткого диска можно подфункцией 8.
1567
 
1568
======================================================================
1569
=========== Функция 26, подфункция 8 - получить раздел HD. ===========
1570
======================================================================
1571
Раздел HD нужен для определения, на какой раздел жёсткого диска
1572
писать, при использовании устаревших функций работы с файловой
1573
системой и функций, неявно использующих жёсткий диск (типа
1574
подфункции 6 функции 18); при использовании функций 58 и 70 и
1575
современного синтаксиса /HD0,/HD1,/HD2,/HD3 эти функции сами
1576
устанавливают базу и раздел.
1577
Параметры:
1578
  * eax = 26 - номер функции
1579
  * ebx = 8 - номер подфункции
1580
Возвращаемое значение:
1581
  * eax = раздел HD (считая с 1)
1582
Замечания:
1583
  * Любое приложение в любой момент времени может изменить раздел.
1584
  * Установить раздел можно вызовом подфункции 8 функции 21.
1585
  * Узнать число разделов на жёстком диске можно вызовом
1586
    подфункции 11 функции 18.
1587
  * Получить используемую базу жёсткого диска можно подфункцией 7.
1588
 
1589
======================================================================
1590
=== Функция 26, подфункция 9 - получить значение счётчика времени. ===
1591
======================================================================
1592
Параметры:
1593
  * eax = 26 - номер функции
1594
  * ebx = 9 - номер подфункции
1595
Возвращаемое значение:
1596
  * eax = число сотых долей секунды, прошедших с момента
1597
    запуска системы
1598
Замечания:
1599
  * Счётчик берётся по модулю 2^32, что соответствует немногим более
1600
    497 суток.
1601
  * Системное время можно получить функцией 3.
1602
 
1603
======================================================================
1604
====== Функция 26, подфункция 10 - получить канал DMA для звука. =====
1605
======================================================================
1606
Параметры:
1607
  * eax = 26 - номер функции
1608
  * ebx = 10 - номер подфункции
1609
Возвращаемое значение:
1610
  * eax = номер канала (от 0 до 3 включительно)
1611
Замечания:
1612
  * Номер канала DMA используется в подфункции 1 функции 55.
1613
  * Установить канал DMA для звука можно вызовом
1614
    подфункции 10 функции 21.
1615
 
1616
======================================================================
1617
====================== Функция 26, подфункция 11 =====================
1618
=========== Узнать, разрешён ли низкоуровневый доступ к HD. ==========
1619
======================================================================
1620
Параметры:
1621
  * eax = 26 - номер функции
1622
  * ebx = 11 - номер подфункции
1623
Возвращаемое значение:
1624
  * eax = 0/1 - запрещён/разрешён
1625
Замечания:
1626
  * Используется при LBA-чтении (подфункция 8 функции 58).
1627
  * Установить текущее состояние можно вызовом
1628
    подфункции 11 функции 21.
1629
 
1630
======================================================================
1631
====================== Функция 26, подфункция 12 =====================
1632
========== Узнать, разрешён ли низкоуровневый доступ к PCI. ==========
1633
======================================================================
1634
Параметры:
1635
  * eax = 26 - номер функции
1636
  * ebx = 12 - номер подфункции
1637
Возвращаемое значение:
1638
  * eax = 0/1 - запрещён/разрешён
1639
Замечания:
1640
  * Используется при работе с шиной PCI (функция 62).
1641
  * Текущая реализация использует только младший бит ecx.
1642
  * Установить текущее состояние можно вызовом
1643
    подфункции 12 функции 21.
1644
 
1645
======================================================================
1646
==== Функция 27 - установить громкость Windows Sound System (WSS). ===
1647
======================================================================
1648
Параметры:
1649
  * eax = 27 - номер функции
1650
  * ebx = что устанавливать:
1651
    * 1 - установить общую громкость
1652
    * 2 - установить громкость Line In
1653
  * cl = уровень громкости (0x0=самый высокий, 0x1F=самый низкий,
1654
    установленный бит 0x80=отключить)
1655
Возвращаемое значение:
1656
  * eax = 0 - успешно
1657
  * eax = 1 - не определена база WSS
1658
  * eax = 2 - неверная подфункция
1659
Замечания:
1660
  * Предварительно нужно определить базовый порт WSS вызовом
1661
    подфункции 6 функции 21.
1662
  * Установка общей громкости фактически игнорируется
1663
    (возвращается eax=0).
1664
  * В старой документации и в исходниках ядра подфункция 2
1665
    ошибочно названа громкостью CD-audio.
1666
 
1667
======================================================================
1668
=============== Функция 28 - установить громкость SB16. ==============
1669
======================================================================
1670
Параметры:
1671
  * eax = 28 - номер функции
1672
  * ebx = что устанавливать:
1673
    * 1 - установить общую громкость
1674
    * 2 - установить громкость CD-audio
1675
  * cl = уровень громкости (0=off, 0xFF=max)
1676
Возвращаемое значение:
1677
  * eax = 0 - успешно
1678
  * eax = 1 - не определена база SB
1679
  * eax = 2 - неверная подфункция
1680
Замечания:
1681
  * Предварительно нужно определить базовый порт SB вызовом
1682
    подфункции 4 функции 21.
1683
  * Эта функция предоставляет больше вариантов для громкости,
1684
    чем функция 25.
1685
 
1686
======================================================================
1687
================ Функция 29 - получить системную дату. ===============
1688
======================================================================
1689
Параметры:
1690
  * eax = 29 - номер функции
1691
Возвращаемое значение:
1692
  * eax = 0x00DDMMYY, где
1693
    (используется двоично-десятичное кодирование, BCD)
1694
  * YY = две младшие цифры года (00..99)
1695
  * MM = месяц (01..12)
1696
  * DD = день (01..31)
1697
Замечания:
1698
  * Системную дату можно установить функцией 22.
1699
 
1700
======================================================================
1701
================ Функция 32 - удалить файл с рамдиска. ===============
1702
======================================================================
1703
Параметры:
1704
  * eax = 32 - номер функции
1705
  * ebx = указатель на имя файла
1706
Возвращаемое значение:
1707
  * eax = 0 - успешно; иначе код ошибки файловой системы
1708
Замечания:
1709
  * Эта функция устарела; функция 58 позволяет выполнять
1710
    те же действия с расширенными возможностями.
1711
  * Текущая реализация возвращает только значения 0(успех) и
1712
    5(файл не найден).
1713
  * Имя файла должно быть либо в формате 8+3 символов (первые
1714
    8 символов - собственно имя, последние 3 - расширение,
1715
    короткие имена и расширения дополняются пробелами),
1716
    либо в формате 8.3 символов "FILE.EXT"/"FILE.EX "
1717
    (имя не более 8 символов, точка, расширение 3 символа,
1718
    дополненное при необходимости пробелами).
1719
    Имя файла должно быть записано заглавными буквами.
1720
    Завершающий символ с кодом 0 не нужен (не ASCIIZ-строка).
1721
 
1722
======================================================================
1723
=============== Функция 33 - записать файл на рамдиск. ===============
1724
======================================================================
1725
Параметры:
1726
  * eax = 33 - номер функции
1727
  * ebx = указатель на имя файла
1728
  * ecx = указатель на данные для записи
1729
  * edx = число байт для записи
1730
  * следует устанавливать esi=0
1731
Возвращаемое значение:
1732
  * eax = 0 - успешно, иначе код ошибки файловой системы
1733
Замечания:
1734
  * Эта функция устарела; функция 58 позволяет выполнять
1735
    те же действия с расширенными возможностями.
1736
  * Если указать ненулевое значение в esi и на рамдиске уже есть
1737
    указанный файл, то будет создан ещё один файл с тем же именем.
1738
  * В противном случае файл перезаписывается.
1739
  * Имя файла должно быть либо в формате 8+3 символов
1740
    (первые 8 символов - собственно имя, последние 3 - расширение,
1741
    короткие имена и расширения дополняются пробелами),
1742
    либо в формате 8.3 символов "FILE.EXT"/"FILE.EX "
1743
    (имя не более 8 символов, точка, расширение 3 символа,
1744
    дополненное при необходимости пробелами).
1745
    Имя файла должно быть записано заглавными буквами.
1746
    Завершающий символ с кодом 0 не нужен (не ASCIIZ-строка).
1747
 
1748
======================================================================
1749
============ Функция 35 - прочитать цвет точки на экране. ============
1750
======================================================================
1751
Параметры:
1752
  * eax = 35
1753
  * ebx = y*xsize+x, где
1754
  * (x,y) = координаты точки (считая от 0)
1755
  * xsize = размер экрана по горизонтали
1756
Возвращаемое значение:
1757
  * eax = цвет 0x00RRGGBB
1758
Замечания:
1759
  * Узнать размеры экрана можно вызовом функции 14. Обратите внимание,
1760
    что она вычитает 1 из обоих размеров.
1761
  * К видеопамяти есть также прямой доступ (без вызовов системных
1762
    функций) через селектор gs. Параметры текущего видеорежима
1763
    можно получить функцией 61.
1764
 
1765
======================================================================
1766
========== Функция 37 - получить координаты/состояние мыши. ==========
1767
======================================================================
1768
 
1769
-------------- Подфункция 0 - экранные координаты мыши ---------------
1770
Параметры:
1771
  * eax = 37 - номер функции
1772
  * ebx = 0 - номер подфункции
1773
Возвращаемое значение:
1774
  * eax = x*65536 + y, (x,y)=координаты курсора мыши (считая от 0)
1775
 
1776
---------- Подфункция 1 - координаты мыши относительно окна ----------
1777
Параметры:
1778
  * eax = 37 - номер функции
1779
  * ebx = 1 - номер подфункции
1780
Возвращаемое значение:
1781
  * eax = x*65536 + y, (x,y)=координаты курсора мыши относительно
1782
    окна приложения (считая от 0)
1783
Замечания:
1784
  * Значение вычисляется по формуле (x-xwnd)*65536 + (y-ywnd).
1785
    Если y>=ywnd, то младшее слово неотрицательно и содержит
1786
    относительную y-координату, а старшее - относительную x-координату
1787
    (правильного знака). В противном случае младшее слово отрицательно
1788
    и всё равно содержит относительную y-координату,
1789
    а к старшему слову следует прибавить 1.
1790
 
1791
----------------- Подфункция 2 - нажатые кнопки мыши -----------------
1792
Параметры:
1793
  * eax = 37 - номер функции
1794
  * ebx = 2 - номер подфункции
1795
Возвращаемое значение:
1796
  * eax содержит информацию о нажатых кнопках мыши:
1797
  * бит 0 установлен = левая кнопка нажата
1798
  * бит 1 установлен = правая кнопка нажата
1799
  * прочие биты сброшены
1800
 
1801
======================================================================
1802
================== Функция 38 - нарисовать отрезок. ==================
1803
======================================================================
1804
Параметры:
1805
  * eax = 38 - номер функции
1806
  * ebx = [координата начала по оси x]*65536 +
1807
              [координата конца по оси x]
1808
  * ecx = [координата начала по оси y]*65536 +
1809
              [координата конца по оси y]
1810
  * edx = 0x00RRGGBB - цвет
1811
Возвращаемое значение:
1812
  * функция не возвращает значения
1813
Замечания:
1814
  * Координаты берутся относительно окна.
1815
  * Конечная точка также рисуется.
1816
 
1817
======================================================================
1818
== Функция 39, подфункция 1 - получить размер фонового изображения. ==
1819
======================================================================
1820
Параметры:
1821
  * eax = 39 - номер функции
1822
  * ebx = 1 - номер подфункции
1823
Возвращаемое значение:
1824
  * eax = [ширина]*65536 + [высота]
1825
Замечания:
1826
  * Есть парная команда установки размеров фонового изображения -
1827
    подфункция 1 функции 15. После которой, разумеется, следует
1828
    заново определить само изображение.
1829
 
1830
======================================================================
1831
= Функция 39, подфункция 2 - прочитать точку с фонового изображения. =
1832
======================================================================
1833
Параметры:
1834
  * eax = 39 - номер функции
1835
  * ebx = 2 - номер подфункции
1836
  * ecx = смещение
1837
Возвращаемое значение:
1838
  * eax = 0x00RRGGBB - цвет точки, если смещение допустимо
1839
    (меньше 0x160000-16)
1840
  * eax = 2 - иначе
1841
Замечания:
1842
  * Не следует полагаться на возвращаемое значение в случае неверного
1843
    смещения, оно может измениться в следующих версиях ядра.
1844
  * Смещение точки с координатами (x,y) вычисляется как (x+y*xsize)*3.
1845
  * Есть парная функция установки точки на фоновом изображении -
1846
    подфункция 2 функции 15.
1847
 
1848
======================================================================
1849
====== Функция 39, подфункция 4 - получить режим отрисовки фона. =====
1850
======================================================================
1851
Параметры:
1852
  * eax = 39 - номер функции
1853
  * ebx = 4 - номер подфункции
1854
Возвращаемое значение:
1855
  * eax = 1 - замостить
1856
  * eax = 2 - растянуть
1857
Замечания:
1858
  * Есть парная функция установки режима отрисовки фона -
1859
    подфункция 4 функции 15.
1860
 
1861
======================================================================
1862
======== Функция 40 - установить маску для ожидаемых событий. ========
1863
======================================================================
1864
Маска для ожидаемых событий влияет на функции работы с событиями 10,
1865
11, 23 - они сообщают только о событиях, разрешённых этой маской.
1866
Параметры:
1867
  * eax = 40 - номер функции
1868
  * ebx = маска: бит i соответствует событию i+1 (см. список событий)
1869
    (установленный бит разрешает извещение о событии)
1870
Возвращаемое значение:
1871
  * функция не возвращает значения
1872
Замечания:
1873
  * Маска по умолчанию (7=111b) разрешает извещения о перерисовке
1874
    и нажатиях клавиш и кнопок.
1875
    Этого достаточно для большинства приложений.
1876
  * События, запрещённые в маске, всё равно сохраняются, если
1877
    приходят; о них просто не извещают функции работы с событиями.
1878
  * Функции работы с событиями учитывают маску на момент
1879
    вызова функции, а не на момент поступления сообщения.
1880
 
1881
======================================================================
1882
================= Функция 41 - узнать владельца IRQ. =================
1883
======================================================================
1884
Параметры:
1885
  * eax = 41 - номер функции
1886
  * ebx = номер IRQ, 0..15
1887
Возвращаемое значение:
1888
  * eax = PID владельца
1889
  * eax = 0, если владельца нет
1890
  * eax = -1 для некорректного ebx
1891
 
1892
======================================================================
1893
========== Функция 42 - прочитать данные, полученные по IRQ. =========
1894
======================================================================
1895
При возникновении IRQ система может считывать данные из указанных
1896
ранее функцией 44 портов и записывать эти данные в буфер.
1897
Описываемая функция считывает побайтно данные из этого буфера.
1898
Параметры:
1899
  * eax = 42 - номер функции
1900
  * ebx = номер IRQ, 0..15
1901
Возвращаемое значение: (ситуацию можно различить по значению ecx)
1902
  * если поток не является владельцем IRQ
1903
    (или номер IRQ задан неверно):
1904
    * ecx = 2
1905
  * если данных нет:
1906
    * eax = 0
1907
    * ecx = 1
1908
    * ebx разрушается
1909
  * если всё в порядке и данные были:
1910
    * eax = размер данных, ещё не прочитанных из буфера (в байтах)
1911
    * ecx = 0
1912
    * ebx = очередной байт
1913
Замечания:
1914
  * Предварительно поток должен зарезервировать для себя указанный IRQ
1915
    функцией 45.
1916
  * Размер буфера для данных - 4000 байт, при переполнении
1917
    "свежие" данные перестают записываться в буфер.
1918
 
1919
======================================================================
1920
=================== Функция 43 - ввод/вывод в порт. ==================
1921
======================================================================
1922
 
1923
------------------------ Вывод данных в порт -------------------------
1924
Параметры:
1925
  * eax = 43 - номер функции
1926
  * bl = байт для вывода
1927
  * ecx = номер порта 0xnnnn (от 0 до 0xFFFF)
1928
Возвращаемое значение:
1929
  * eax = 0 - успешно
1930
  * eax = 1 - поток не зарезервировал указанный порт
1931
 
1932
------------------------ Ввод данных из порта ------------------------
1933
Параметры:
1934
  * eax = 43 - номер функции
1935
  * ebx игнорируется
1936
  * ecx = 0x8000nnnn, где nnnn = номер порта (от 0 до 0xFFFF)
1937
Возвращаемое значение:
1938
  * eax = 0 - успешно, при этом ebx = введённый байт
1939
  * eax = 1 - поток не зарезервировал данный порт
1940
Замечания:
1941
  * Предварительно поток должен зарезервировать за собой
1942
    указанный порт функцией 46.
1943
  * Для зарезервированных портов вместо вызова этих функций
1944
    лучше использовать команды процессора in/out - это значительно
1945
    быстрее и несколько короче и проще. Из незарезервированных
1946
    портов читать всё равно нельзя.
1947
 
1948
======================================================================
1949
======== Функция 44 - определить действия при поступлении IRQ. =======
1950
======================================================================
1951
При возникновении IRQ система может считывать данные из указанных этой
1952
функцией портов и записывать эти данные в буфер, откуда их можно
1953
прочитать функцией 42.
1954
Параметры:
1955
  * eax = 44 - номер функции
1956
  * ebx = указатель на массив структур, описывающих по одному порту:
1957
    * +0: word: 0 означает конец массива, иначе номер порта
1958
    * +2: byte: зарезервировано (игнорируется)
1959
    * +3: byte: 1=считывать байт из этого порта, 2=считывать слово
1960
  * ecx = номер IRQ, 0..15
1961
Возвращаемое значение:
1962
  * eax = 0 - успешно
1963
  * eax = 1 - поток не является владельцем указанного IRQ
1964
Замечания:
1965
  * Предварительно поток должен зарезервировать за собой
1966
    указываемый IRQ функцией 45.
1967
  * Принимаются во внимание только первые 16 портов.
1968
  * Текущая реализация рассматривает неправильное значение поля +3
1969
    как сигнал прекращения обработки IRQ.
1970
 
1971
======================================================================
1972
============ Функция 45 - зарезервировать/освободить IRQ. ============
1973
======================================================================
1974
Параметры:
1975
  * eax = 45 - номер функции
1976
  * ebx = 0 - зарезервировать, 1 = освободить
1977
  * ecx = номер IRQ, 0..15
1978
Возвращаемое значение:
1979
  * eax = 0 - успешно
1980
  * eax = 1 - ошибка (неверный номер IRQ или
1981
    попытка зарезервировать несвободный IRQ или освободить IRQ, не
1982
    зарезервированный текущим потоком)
1983
Замечания:
1984
  * Резервирование IRQ нужно для работы функций 42 и 44.
1985
  * Только один поток может зарезервировать конкретный IRQ.
1986
  * IRQ, обрабатываемые системой самостоятельно, резервируются
1987
    системой (потоком 1) при загрузке.
1988
  * При завершении потока автоматически освобождаются
1989
    все зарезервированные им IRQ.
1990
 
1991
======================================================================
1992
= Функция 46 - зарезервировать/освободить группу портов ввода/вывода.
1993
======================================================================
1994
К зарезервированным портам можно обращаться напрямую из приложения
1995
командами in/out (рекомендуемый способ) и вызовом функции 43
1996
(нерекомендуемый способ).
1997
Параметры:
1998
  * eax = 46 - номер функции
1999
  * ebx = 0 - зарезервировать, 1 - освободить
2000
  * ecx = номер начала диапазона портов
2001
  * edx = номер конца диапазона портов (включительно)
2002
Возвращаемое значение:
2003
  * eax = 0 - успешно
2004
  * eax = 1 - ошибка
2005
Замечания:
2006
  * В случае резервирования портов ошибкой считается выполнение
2007
    одного из условий:
2008
    * начальный адрес больше конечного;
2009
    * указанный диапазон содержит некорректный номер порта
2010
      (корректные - от 0 до 0xFFFF);
2011
    * превышено ограничение на общее число зарезервированных областей
2012
      - допускается максимум 255;
2013
    * указанный диапазон пересекается с одним из
2014
      ранее зарезервированных
2015
  * В случае освобождения портов ошибкой считается попытка
2016
    освобождения диапазона, который ранее не был целиком
2017
    зарезервирован этой же функцией (с такими же значениями ecx,edx).
2018
  * При обнаружении ошибки (в обоих случаях) никаких действий
2019
    не производится.
2020
  * При загрузке система резервирует за собой порты 0..0xff, а при
2021
    обнаружении COM-мыши - дополнительно диапазон COM-портов
2022
    0x3f0..0x3ff и/или 0x2f0..0x2ff.
2023
  * При завершении потока автоматически освобождаются все
2024
    зарезервированные им порты.
2025
 
2026
======================================================================
2027
================= Функция 47 - вывести число в окно. =================
2028
======================================================================
2029
Параметры:
2030
  * eax = 47 - номер функции
2031
  * ebx = параметры преобразования числа в текст:
2032
    * bl = 0 - ecx содержит число
2033
    * bl = 1 - ecx содержит указатель на dword-число
2034
    * bh = 0 - отображать в десятичной системе счисления
2035
    * bh = 1 - отображать в шестнадцатеричной системе
2036
    * bh = 2 - отображать в двоичной системе
2037
    * биты 16-21 = сколько цифр отображать
2038
    * биты 22-31 зарезервированы и должны быть установлены в 0
2039
  * ecx = число (при bl=0) или указатель (при bl=1)
2040
  * edx = [координата по оси x]*65536 + [координата по оси y]
2041
  * esi = 0xN0RRGGBB, RRGGBB=цвет, N=шрифт (0/1)
2042
Возвращаемое значение:
2043
  * функция не возвращает значения
2044
Замечания:
2045
  * Указанная длина не должна превосходить 60.
2046
  * Выводится ровно указанное количество цифр. Если число мало и
2047
    может быть записано меньшим количеством цифр, оно дополняется
2048
    ведущими нулями; если число велико и не может быть записано
2049
    таким количеством цифр, "лишние" ведущие цифры обрезаются.
2050
  * Параметры шрифтов указаны в описании функции 4 (вывода текста).
2051
 
2052
======================================================================
2053
======= Функция 48, подфункция 0 - применить настройки экрана. =======
2054
======================================================================
2055
Параметры:
2056
  * eax = 48 - номер функции
2057
  * ebx = 0 - номер подфункции
2058
  * ecx = 0 - зарезервировано
2059
Возвращаемое значение:
2060
  * функция не возвращает значения
2061
Замечания:
2062
  * Функция перерисовывает экран после изменения параметров
2063
    подфункциями 1 и 2.
2064
  * Вызов функции без предшествующих вызовов указанных подфункций
2065
    игнорируется.
2066
  * Вызов функции с ненулевым ecx игнорируется.
2067
 
2068
======================================================================
2069
========= Функция 48, подфункция 1 - установить стиль кнопок. ========
2070
======================================================================
2071
Параметры:
2072
  * eax = 48 - номер функции
2073
  * ebx = 1 - номер подфункции
2074
  * ecx = тип кнопок:
2075
    * 0 = плоские
2076
    * 1 = объёмные
2077
Возвращаемое значение:
2078
  * функция не возвращает значения
2079
Замечания:
2080
  * После вызова описываемой функции следует перерисовать экран
2081
    подфункцией 0.
2082
  * Тип кнопок влияет только на их прорисовку функцией 8.
2083
 
2084
======================================================================
2085
==== Функция 48, подфункция 2 - установить стандартные цвета окон. ===
2086
======================================================================
2087
Параметры:
2088
  * eax = 48 - номер функции
2089
  * ebx = 2 - номер подфункции
2090
  * ecx = указатель на таблицу цветов
2091
  * edx = размер таблицы цветов
2092
    (должен быть 40 байт для будущей совместимости)
2093
Формат таблицы цветов указан в описании подфункции 3.
2094
Возвращаемое значение:
2095
  * функция не возвращает значения
2096
Замечания:
2097
  * После вызова описываемой функции следует перерисовать экран
2098
    подфункцией 0.
2099
  * Таблица стандартных цветов влияет только на приложения,
2100
    которые эту таблицу явным образом получают (подфункцией 3) и
2101
    используют (указывая цвета из неё при вызовах функций рисования).
2102
  * Таблица стандартных цветов входит в скин и устанавливается заново
2103
    при установке скина (подфункции 8).
2104
  * Таблицу цветов можно просматривать/изменять интерактивно с помощью
2105
    приложения desktop.
2106
 
2107
======================================================================
2108
===== Функция 48, подфункция 3 - получить стандартные цвета окон. ====
2109
======================================================================
2110
Параметры:
2111
  * eax = 48 - номер функции
2112
  * ebx = 3 - номер подфункции
2113
  * ecx = указатель на буфер размером edx байт,
2114
    куда будет записана таблица
2115
  * edx = размер таблицы цветов
2116
    (должен быть 40 байт для будущей совместимости)
2117
Возвращаемое значение:
2118
  * функция не возвращает значения
2119
Формат таблицы цветов: каждый элемент -
2120
dword-значение цвета 0x00RRGGBB
2121
  * +0: dword: frames - цвет рамки
2122
  * +4: dword: grab - цвет заголовка
2123
  * +8: dword: grab_button - цвет кнопки на полосе заголовка
2124
  * +12 = +0xC: dword: grab_button_text - цвет текста на кнопке
2125
    на полосе заголовка
2126
  * +16 = +0x10: dword: grab_text - цвет текста на заголовке
2127
  * +20 = +0x14: dword: work - цвет рабочей области
2128
  * +24 = +0x18: dword: work_button - цвет кнопки в рабочей области
2129
  * +28 = +0x1C: dword: work_button_text - цвет текста на кнопке
2130
    в рабочей области
2131
  * +32 = +0x20: dword: work_text - цвет текста в рабочей области
2132
  * +36 = +0x24: dword: work_graph - цвет графики в рабочей области
2133
Замечания:
2134
  * Структура таблицы цветов описана в стандартном включаемом файле
2135
    macros.inc под названием system_colors; например, можно писать:
2136
    	sc	system_colors		; объявление переменной
2137
    	...				; где-то надо вызвать
2138
    					; описываемую функцию с ecx=sc
2139
    	mov	ecx, [sc.work_button_text]	; читаем цвет текста
2140
    					; на кнопке в рабочей области
2141
  * Использование/неиспользование этих цветов - дело исключительно
2142
    самой программы. Для использования нужно просто при вызове функций
2143
    рисования указывать цвет, взятый из этой таблицы.
2144
  * При изменении таблицы стандартных цветов (подфункцией 2 с
2145
    последующим применением изменений подфункцией 0 или
2146
    при установке скина подфункцией 8) всем окнам посылается сообщение
2147
    о необходимости перерисовки (событие с кодом 1).
2148
  * Стандартные цвета можно просматривать/изменять интерактивно
2149
    с помощью приложения desktop.
2150
 
2151
======================================================================
2152
========== Функция 48, подфункция 4 - получить высоту скина. =========
2153
======================================================================
2154
Параметры:
2155
  * eax = 48 - номер функции
2156
  * ebx = 4 - номер подфункции
2157
Возвращаемое значение:
2158
  * eax = высота скина
2159
Замечания:
2160
  * Высотой скина по определению считается высота заголовка окон,
2161
    использующих скин.
2162
  * Смотри также общую структуру окна в описании функции 0.
2163
 
2164
======================================================================
2165
===== Функция 48, подфункция 5 - получить рабочую область экрана. ====
2166
======================================================================
2167
Параметры:
2168
  * eax = 48 - номер функции
2169
  * ebx = 5 - номер подфункции
2170
Возвращаемое значение:
2171
  * eax = [left]*65536 + [right]
2172
  * ebx = [top]*65536 + [bottom]
2173
Замечания:
2174
  * Рабочая область экрана определяет положение и координаты
2175
    максимизированного окна.
2176
  * Рабочая область экрана при нормальной работе есть весь экран
2177
    за вычетом панели (@panel).
2178
  * (left,top) - координаты левого верхнего угла,
2179
    (right,bottom) - координаты правого нижнего.
2180
    Таким образом, размер рабочей области по оси x определяется
2181
    формулой right-left+1, по оси y - формулой bottom-right+1.
2182
  * Смотри также функцию 14,
2183
    позволяющую определить размеры всего экрана.
2184
  * Есть парная функция установки рабочей области - подфункция 6.
2185
 
2186
======================================================================
2187
==== Функция 48, подфункция 6 - установить рабочую область экрана. ===
2188
======================================================================
2189
Параметры:
2190
  * eax = 48 - номер функции
2191
  * ebx = 6 - номер подфункции
2192
  * ecx = [left]*65536 + [right]
2193
  * edx = [top]*65536 + [bottom]
2194
Возвращаемое значение:
2195
  * функция не возвращает значения
2196
Замечания:
2197
  * Рабочая область экрана определяет положение и координаты
2198
    максимизированного окна.
2199
  * Эта функция используется только приложением @panel,
2200
    устанавливающим рабочей областью весь экран за вычетом панели.
2201
  * (left,top) - координаты левого верхнего угла,
2202
    (right,bottom) - координаты правого нижнего.
2203
    Таким образом, размер рабочей области по оси x определяется
2204
    формулой right-left+1, по оси y - формулой bottom-right+1.
2205
  * Если left>=right, то x-координаты рабочей области не изменяются.
2206
    Если left<0, то left не устанавливается. Если right больше
2207
    или равно ширины экрана, то right не устанавливается.
2208
    Аналогично по оси y.
2209
  * Смотри также функцию 14,
2210
    позволяющую определить размеры всего экрана.
2211
  * Есть парная функция получения рабочей области -
2212
    подфункция 5.
2213
  * Эта функция автоматически перерисовывает экран, по ходу дела
2214
    обновляет координаты и положение максимизированных окон.
2215
    Все окна извещаются о необходимости перерисовки (событие 1).
2216
 
2217
======================================================================
2218
====================== Функция 48, подфункция 7 ======================
2219
============ Получить область скина для текста заголовка. ============
2220
======================================================================
2221
Возвращает область заголовка окна со скином, предназначенную
2222
для вывода текста заголовка.
2223
Параметры:
2224
  * eax = 48 - номер функции
2225
  * ebx = 7 - номер подфункции
2226
Возвращаемое значение:
2227
  * eax = [left]*65536 + [right]
2228
  * ebx = [top]*65536 + [bottom]
2229
Замечания:
2230
  * Использование/неиспользование этой функции -
2231
    личное дело приложения.
2232
  * Рекомендуется учитывать значения, возвращаемые этой функцией,
2233
    при выборе места для рисования текста заголовка (функцией 4) или
2234
    какого-нибудь заменителя текста заголовка
2235
    (по усмотрению приложения).
2236
 
2237
======================================================================
2238
==== Функция 48, подфункция 8 - установить используемый скин окон. ===
2239
======================================================================
2240
Параметры:
2241
  * eax = 48 - номер функции
2242
  * ebx = 8 - номер подфункции
2243
  * ecx = указатель на блок для функции 58, в котором установлено
2244
    поле промежуточного буфера и указано имя файла
2245
Возвращаемое значение:
2246
  * eax = 0 - успешно
2247
  * иначе eax = код ошибки файловой системы; если файл не задаёт скин,
2248
    то возвращается ошибка 3 (неизвестная файловая система).
2249
Замечания:
2250
  * При успешной загрузке скина все окна извещаются о необходимости
2251
    перерисовки (событие 1).
2252
  * При загрузке система считывает скин из файла default.skn
2253
    на рамдиске.
2254
  * Пользователь может изменять скин статически, создав свой
2255
    default.skn, или динамически с помощью приложения desktop.
2256
 
2257
======================================================================
78 diamond 2258
============ Функция 49 - Advanced Power Management (APM). ===========
2259
======================================================================
2260
Параметры:
2261
  * eax = 49 - номер функции
2262
  * dx = номер функции APM (аналог ax в спецификации)
2263
  * bx, cx = параметры функции APM
2264
Возвращаемое значение:
2265
  * 16-битные регистры ax, bx, cx, dx, si, di и флаг CF
2266
    установлены в соответствии со спецификацией APM
2267
  * старшие половины 32-битных регистров eax, ebx, ecx,
2268
    edx, esi, edi разрушаются
2269
Замечания:
2270
  * Спецификация APM 1.2 описывается в документе
2271
    "Advanced Power Management (APM) BIOS Specification"
2272
    (Revision 1.2), доступном на
2273
    http://www.microsoft.com/whdc/archive/amp_12.mspx;
2274
    кроме того, она включена в известный Interrupt List by Ralf Brown
2275
    (http://www.pobox.com/~ralf/files.html,
2276
    ftp://ftp.cs.cmu.edu/afs/cs/user/ralf/pub/).
2277
 
2278
======================================================================
77 diamond 2279
================= Функция 50 - установка формы окна. =================
2280
======================================================================
2281
Обычные окна представляют собой прямоугольники. С помощью этой функции
2282
окну можно придать произвольную форму. Форма задаётся набором точек
2283
внутри обрамляющего прямоугольника, принадлежащих окну. Положение и
2284
размеры обрамляющего прямоугольника задаются функцией 0 и изменяются
2285
функцией 67.
2286
 
2287
--------------- Установка данных с информацией о форме ---------------
2288
Параметры:
2289
  * eax = 50 - номер функции
2290
  * ebx = 0 - номер подфункции
2291
  * ecx = указатель на данные формы (массив байт 0/1)
2292
Возвращаемое значение:
2293
  * функция не возвращает значения
2294
 
2295
------------------ Установка масштаба данных формы -------------------
2296
Параметры:
2297
  * eax = 50 - номер функции
2298
  * ebx = 1 - номер подфункции
2299
  * ecx задаёт масштаб: каждый байт данных определяет
2300
    (2^scale)*(2^scale) пикселей
2301
Возвращаемое значение:
2302
  * функция не возвращает значения
2303
Замечания:
2304
  * Масштаб по умолчанию равен 0 (масштабирующий множитель 1). Если в
2305
    данных формы один байт соответствует одному пикселю, то масштаб
2306
    можно не устанавливать.
2307
  * Обозначим xsize = ширина окна (в пикселях), ysize = высота;
2308
    обратите внимание, что они на единицу больше, чем устанавливаемые
2309
    функциями 0, 67.
2310
  * По определению масштаба xsize и ysize должны делиться на 2^scale.
2311
  * Байт данных по смещению a должен быть 0/1 и
2312
    определяет принадлежность окну квадрата со стороной 2^scale
2313
    (при scale=0 получаем пиксель) и координатами левого верхнего угла
2314
    (a mod (xsize shr scale), a div (xsize shr scale))
2315
  * Размер данных: (xsize shr scale)*(ysize shr scale).
2316
  * Данные должны присутствовать в памяти и не меняться
2317
    после установки формы.
2318
  * Система просматривает данные о форме при каждой перерисовке окна
2319
    функцией 0.
2320
  * Вызов подфункции 0 с нулевым указателем приводит к возврату
2321
    к прямоугольной форме.
2322
 
2323
======================================================================
2324
===================== Функция 51 - создать поток. ====================
2325
======================================================================
2326
Параметры:
2327
  * eax = 51 - номер функции
2328
  * ebx = 1 - единственная подфункция
2329
  * ecx = адрес точки входа потока (начальный eip)
2330
  * edx = указатель стэка потока (начальный esp)
2331
Возвращаемое значение:
2332
  * eax = -1 - ошибка (в системе слишком много потоков)
2333
  * иначе eax = TID - идентификатор потока
2334
 
2335
======================================================================
2336
= Функция 52, подфункция 0 - получить конфигурацию сетевого драйвера.
2337
======================================================================
2338
Параметры:
2339
  * eax = 52 - номер функции
2340
  * ebx = 0 - номер подфункции
2341
Возвращаемое значение:
2342
  * eax = двойное слово конфигурации
2343
Замечания:
2344
  * Слово конфигурации можно установить подфункцией 2.
2345
  * Ядро не использует соответствующую переменную.
2346
    Ценность этой переменной и работающих с ней подфункций 0 и 2
2347
    представляется сомнительной.
2348
 
2349
======================================================================
2350
======= Функция 52, подфункция 1 - получить локальный IP-адрес. ======
2351
======================================================================
2352
Параметры:
2353
  * eax = 52 - номер функции
2354
  * ebx = 1 - номер подфункции
2355
Возвращаемое значение:
2356
  * eax = IP-адрес (4 байта)
2357
Замечания:
2358
  * Локальный IP-адрес устанавливается подфункцией 3.
2359
 
2360
======================================================================
2361
 Функция 52, подфункция 2 - установить конфигурацию сетевого драйвера.
2362
======================================================================
2363
Параметры:
2364
  * eax = 52 - номер функции
2365
  * ebx = 2 - номер подфункции
2366
  * ecx = двойное слово конфигурации; если младшие 7 бит образуют
2367
    число 3, это воспринимается как запрос на [пере-]инициализацию
2368
    Ethernet-карты, в противном случае Ethernet выключается
2369
Возвращаемое значение:
2370
  * если не запрошен Ethernet-интерфейс, то возвращается eax=2,
2371
    но это может измениться в будущих версиях ядра
2372
  * если запрошен Ethernet-интерфейс, то eax=0 означает ошибку
2373
    (отсутствие Ethernet-карты), а ненулевое значение - успех
2374
Замечания:
2375
  * Слово конфигурации можно прочитать подфункцией 0.
2376
  * Ядро не использует соответствующую переменную.
2377
    Ценность этой переменной, подфункции 0 и части подфункции 2,
2378
    устанавливающей эту переменную, представляется сомнительной.
2379
 
2380
======================================================================
2381
====== Функция 52, подфункция 3 - установить локальный IP-адрес. =====
2382
======================================================================
2383
Параметры:
2384
  * eax = 52 - номер функции
2385
  * ebx = 3 - номер подфункции
2386
  * ecx = IP-адрес (4 байта)
2387
Возвращаемое значение:
2388
  * текущая реализация возвращает eax=3, но это может быть изменено
2389
    в будущих версиях
2390
Замечания:
2391
  * Локальный IP-адрес можно получить подфункцией 1.
2392
 
2393
======================================================================
2394
= Функция 52, подфункция 6 - добавить данные в стек входной очереди. =
2395
======================================================================
2396
Параметры:
2397
  * eax = 52 - номер функции
2398
  * ebx = 6 - номер подфункции
2399
  * edx = размер данных
2400
  * esi = указатель на данные
2401
Возвращаемое значение:
2402
  * eax = -1 - ошибка
2403
  * eax = 0 - успешно
2404
Замечания:
2405
  * Эта функция предназначена только для медленных сетевых драйверов
2406
    (PPP, SLIP).
2407
  * Размер данных не должен превосходить 1500 байт,
2408
    хотя проверок корректности не делается.
2409
 
2410
======================================================================
2411
====================== Функция 52, подфункция 8 ======================
2412
============= Прочитать данные из сетевой очереди вывода. ============
2413
======================================================================
2414
Параметры:
2415
  * eax = 52 - номер функции
2416
  * ebx = 8 - номер подфункции
2417
  * esi = указатель на буфер размером 1500 байт
2418
Возвращаемое значение:
2419
  * eax = число прочитанных байт (в текущей реализации
2420
    либо 0 = нет данных, либо 1500)
2421
  * данные скопированы в буфер
2422
Замечания:
2423
  * Эта функция предназначена только для медленных сетевых драйверов
2424
    (PPP, SLIP).
2425
 
2426
======================================================================
2427
=========== Функция 52, подфункция 9 - получить gateway IP. ==========
2428
======================================================================
2429
Параметры:
2430
  * eax = 52 - номер функции
2431
  * ebx = 9 - номер подфункции
2432
Возвращаемое значение:
2433
  * eax = gateway IP (4 байта)
2434
 
2435
======================================================================
2436
========= Функция 52, подфункция 10 - получить маску подсети. ========
2437
======================================================================
2438
Параметры:
2439
  * eax = 52 - номер функции
2440
  * ebx = 10 - номер подфункции
2441
Возвращаемое значение:
2442
  * eax = маска подсети
2443
 
2444
======================================================================
2445
========= Функция 52, подфункция 11 - установить gateway IP. =========
2446
======================================================================
2447
Параметры:
2448
  * eax = 52 - номер функции
2449
  * ebx = 11 - номер подфункции
2450
  * ecx = gateway IP (4 байта)
2451
Возвращаемое значение:
2452
  * текущая реализация возвращает eax=11, но это может быть изменено
2453
    в будущих реализациях
2454
 
2455
======================================================================
2456
======== Функция 52, подфункция 12 - установить маску подсети. =======
2457
======================================================================
2458
Параметры:
2459
  * eax = 52 - номер функции
2460
  * ebx = 12 - номер подфункции
2461
  * ecx = маска подсети
2462
Возвращаемое значение:
2463
  * текущая реализация возвращает eax=12, но это может быть изменено
2464
    в будущих версиях
2465
 
2466
======================================================================
2467
============ Функция 52, подфункция 13 - получить DNS IP. ============
2468
======================================================================
2469
Параметры:
2470
  * eax = 52 - номер функции
2471
  * ebx = 13 - номер подфункции
2472
Возвращаемое значение:
2473
  * eax = DNS IP (4 байта)
2474
 
2475
======================================================================
2476
=========== Функция 52, подфункция 14 - установить DNS IP. ===========
2477
======================================================================
2478
Параметры:
2479
  * eax = 52 - номер функции
2480
  * ebx = 14 - номер подфункции
2481
  * ecx = DNS IP (4 байта)
2482
Возвращаемое значение:
2483
  * текущая реализация возвращает eax=14, но это может быть изменено
2484
    в следующих версиях
2485
 
2486
======================================================================
2487
============ Функция 53, подфункция 0 - открыть UDP-сокет. ===========
2488
======================================================================
2489
Параметры:
2490
  * eax = 53 - номер функции
2491
  * ebx = 0 - номер подфункции
2492
  * ecx = локальный порт (учитывается только младшее слово)
2493
  * edx = удалённый порт (учитывается только младшее слово)
2494
  * esi = удалённый IP
2495
Возвращаемое значение:
2496
  * eax = -1 = 0xFFFFFFFF - ошибка; ebx разрушается
2497
  * eax = хэндл сокета (некоторое число, однозначно идентифицирующее
2498
    сокет и имеющее смысл только для системы) - успешно;
2499
    ebx разрушается
2500
 
2501
======================================================================
2502
============ Функция 53, подфункция 1 - закрыть UDP-сокет. ===========
2503
======================================================================
2504
Параметры:
2505
  * eax = 53 - номер функции
2506
  * ebx = 1 - номер подфункции
2507
  * ecx = хэндл сокета
2508
Возвращаемое значение:
2509
  * eax = -1 - неверный хэндл
2510
  * eax = 0 - успешно
2511
  * ebx разрушается
2512
Замечания:
2513
  * Текущая реализация не закрывает автоматически все сокеты потока
2514
    при его завершении. В частности, не следует прибивать поток
2515
    с кучей открытых сокетов - будет утечка ресурсов.
2516
  * Текущая реализация не делает проверок на корректность
2517
    (единственное, на что возвращается ошибка, - попытка закрыть
2518
    неоткрытый сокет с корректным хэндлом).
2519
 
2520
======================================================================
2521
============== Функция 53, подфункция 2 - опрос сокета. ==============
2522
======================================================================
2523
Параметры:
2524
  * eax = 53 - номер функции
2525
  * ebx = 2 - номер подфункции
2526
  * ecx = хэндл сокета
2527
Возвращаемое значение:
2528
  * eax = число полученных байт
2529
  * ebx разрушается
2530
Замечания:
2531
  * Проверки корректности не делается.
2532
 
2533
======================================================================
2534
======== Функция 53, подфункция 3 - прочитать байт из сокета. ========
2535
======================================================================
2536
Параметры:
2537
  * eax = 53 - номер функции
2538
  * ebx = 3 - номер подфункции
2539
  * ecx = хэндл сокета
2540
Возвращаемое значение:
2541
  * если нет принятых данных: eax=0, bl=0,
2542
    прочие байты ebx разрушаются
2543
  * если были принятые данные: eax=число оставшихся байт
2544
    (возможно, 0), bl=прочитанный байт, прочие байты ebx разрушаются
2545
Замечания:
2546
  * Проверки корректности не производится.
2547
 
2548
======================================================================
2549
========== Функция 53, подфункция 4 - записать в UDP-сокет. ==========
2550
======================================================================
2551
Параметры:
2552
  * eax = 53 - номер функции
2553
  * ebx = 4 - номер подфункции
2554
  * ecx = хэндл сокета
2555
  * edx = число байт для записи
2556
  * esi = указатель на данные для записи
2557
Возвращаемое значение:
2558
  * eax = 0xffffffff - неверный хэндл
2559
  * eax = 0xffff - недостаточно памяти
2560
  * eax = 0 - успешно
2561
  * ebx разрушается
2562
Замечания:
2563
  * Проверка на валидность хэндла минимальна - исключаются только
2564
    не очень неправильные неоткрытые хэндлы.
2565
  * Число байт для записи не может превышать 1500-28, хотя
2566
    соответствующей проверки не делается.
2567
 
2568
======================================================================
2569
============ Функция 53, подфункция 5 - открыть TCP-сокет. ===========
2570
======================================================================
2571
Параметры:
2572
  * eax = 53 - номер функции
2573
  * ebx = 5 - номер подфункции
2574
  * ecx = локальный порт (учитывается только младшее слово)
2575
  * edx = удалённый порт (учитывается только младшее слово)
2576
  * esi = удалённый IP
2577
  * edi = режим открытия: SOCKET_PASSIVE=0 или SOCKET_ACTIVE=1
2578
Возвращаемое значение:
2579
  * eax = -1 = 0xFFFFFFFF - ошибка; ebx разрушается
2580
  * eax = хэндл сокета (некоторое число, однозначно идентифицирующее
2581
    сокет и имеющее смысл только для системы) - успешно;
2582
    ebx разрушается
2583
 
2584
======================================================================
2585
====== Функция 53, подфункция 6 - получить состояние TCP-сокета. =====
2586
======================================================================
2587
Параметры:
2588
  * eax = 53 - номер функции
2589
  * ebx = 6 - номер подфункции
2590
  * ecx = хэндл сокета
2591
Возвращаемое значение:
2592
  * eax = статус сокета: одно из
2593
  * TCB_LISTEN = 1
2594
  * TCB_SYN_SENT = 2
2595
  * TCB_SYN_RECEIVED = 3
2596
  * TCB_ESTABLISHED = 4
2597
  * TCB_FIN_WAIT_1 = 5
2598
  * TCB_FIN_WAIT_2 = 6
2599
  * TCB_CLOSE_WAIT = 7
2600
  * TCB_CLOSING = 8
2601
  * TCB_LAST_ASK = 9
2602
  * TCB_TIME_WAIT = 10
2603
  * TCB_CLOSED = 11
2604
  * ebx разрушается
2605
Замечания:
2606
  * Проверок корректности не производится.
2607
 
2608
======================================================================
2609
========== Функция 53, подфункция 7 - записать в TCP-сокет. ==========
2610
======================================================================
2611
Параметры:
2612
  * eax = 53 - номер функции
2613
  * ebx = 7 - номер подфункции
2614
  * ecx = хэндл сокета
2615
  * edx = число байт для записи
2616
  * esi = указатель на данные для записи
2617
Возвращаемое значение:
2618
  * eax = 0xffffffff - ошибка
2619
  * eax = 0xffff - недостаточно памяти
2620
  * eax = 0 - успешно
2621
  * ebx разрушается
2622
Замечания:
2623
  * Проверка на валидность хэндла минимальна - исключаются только
2624
    не очень неправильные неоткрытые хэндлы.
2625
  * Число байт для записи не может превышать 1500-40,
2626
    хотя соответствующей проверки не делается.
2627
 
2628
======================================================================
2629
============ Функция 53, подфункция 8 - закрыть TCP-сокет. ===========
2630
======================================================================
2631
Параметры:
2632
  * eax = 53 - номер функции
2633
  * ebx = 8 - номер подфункции
2634
  * ecx = хэндл сокета
2635
Возвращаемое значение:
2636
  * eax = -1 - неверный хэндл
2637
  * eax = 0xffff - недостаточно памяти для пакета закрытия сокета
2638
  * eax = 0 - успешно
2639
  * во многих случаях eax разрушается (возвращается результат функции
2640
    queue) - видимо, это баг, который будет исправлен
2641
  * ebx разрушается
2642
Замечания:
2643
  * Текущая реализация не закрывает автоматически все сокеты потока
2644
    при его завершении. В частности, не следует прибивать поток
2645
    с кучей открытых сокетов - будет утечка ресурсов.
2646
  * Текущая реализация не делает проверок на корректность
2647
    (единственное, на что возвращается ошибка, - попытка закрыть
2648
    неоткрытый сокет с корректным хэндлом).
2649
 
2650
======================================================================
2651
== Функция 53, подфункция 9 - проверить, свободен ли локальный порт. =
2652
======================================================================
2653
Параметры:
2654
  * eax = 53 - номер функции
2655
  * ebx = 9 - номер подфункции
2656
  * ecx = номер локального порта (используются только младшие 16 бит)
2657
Возвращаемое значение:
2658
  * eax = 0 - порт используется
2659
  * eax = 1 - порт свободен
2660
  * ebx разрушается
2661
 
2662
======================================================================
2663
 Функция 53, подфункция 255 - отладочная информация сетевого драйвера.
2664
======================================================================
2665
Параметры:
2666
  * eax = 53 - номер функции
2667
  * ebx = 255 - номер подфункции
2668
  * ecx = тип запрашиваемой информации (смотри ниже)
2669
Возвращаемое значение:
2670
  * eax = запрошенная информация
2671
  * ebx разрушается
2672
Возможные значения ecx:
2673
  * 100: длина очереди 0 (empty queue)
2674
  * 101: длина очереди 1 (ip-out queue)
2675
  * 102: длина очереди 2 (ip-in queue)
2676
  * 103: длина очереди 3 (net1out queue)
2677
  * 200: число элементов в таблице ARP
2678
  * 201: размер таблицы ARP (в элементах) (20 в текущей версии)
2679
  * 202: прочитать элемент edx таблицы ARP во временный буфер, откуда
2680
    берут информацию 5 последующих типов;
2681
    в этом случае eax неопределён
2682
  * 203: IP-адрес, запомненный типом 202
2683
  * 204: старшее dword MAC-адреса, запомненного типом 202
2684
  * 205: младшее word MAC-адреса, запомненного типом 202
2685
  * 206: слово статуса, запомненное типом 202
2686
  * 207: слово ttl, запомненное типом 202
2687
  * 2: общее число полученных IP-пакетов
2688
  * 3: общее число переданных IP-пакетов
2689
  * 4: общее число сдампленных полученных пакетов
2690
  * 5: общее число полученных ARP-пакетов
2691
  * 6: статус драйвера пакетов, 0=неактивен,
2692
    ненулевое значение=активен
2693
 
2694
======================================================================
2695
======== Функция 55, подфункция 0 - загрузить данные для SB16. =======
2696
======================================================================
2697
Параметры:
2698
  * eax = 55 - номер функции
2699
  * ebx = 0 - номер подфункции
2700
  * ecx = указатель на данные (копируется 64 килобайта, используется
2701
    столько, сколько установлено подфункцией 2)
2702
Возвращаемое значение:
2703
  * функция не возвращает значения
2704
Замечания:
2705
  * Формат и размер данных устанавливаются подфункцией 2.
2706
 
2707
======================================================================
2708
==== Функция 55, подфункция 1 - начать проигрывать данные на SB16. ===
2709
======================================================================
2710
Параметры:
2711
  * eax = 55 - номер функции
2712
  * ebx = 1 - номер подфункции
2713
Возвращаемое значение:
2714
  * функция не возвращает значения
2715
Замечания:
2716
  * Предварительно данные должны быть загружены подфункцией 0 и
2717
    определён их формат подфункцией 2.
2718
  * Функция возвращает управление, когда началось проигрывание данных;
2719
    после этого проигрывание идёт независимо от приложения (и вообще
2720
    не требует загрузки процессора).
2721
  * Предварительно должны быть определены базовый порт SB16
2722
    (подфункцией 4 функции 21) и канал DMA
2723
    (подфункцией 10 функции 21).
2724
 
2725
======================================================================
2726
====== Функция 55, подфункция 2 - установить формат данных SB16. =====
2727
======================================================================
2728
Параметры:
2729
  * eax = 55 - номер функции
2730
  * ebx = 2 - номер подфункции
2731
  * ecx = 0 - установить разрядность
2732
    * edx = 1 - 8бит моно
2733
    * edx = 2 - 8бит стерео
2734
  * ecx = 1 - установить размер данных
2735
    * edx = размер в байтах
2736
  * ecx = 2 - установить частоту проигрывания
2737
    * edx = частота
2738
Возвращаемое значение:
2739
  * функция не возвращает значения
2740
Замечания:
2741
  * При загрузке системы устанавливаются следующие параметры
2742
    по умолчанию: разрядность - 8 бит моно, размер - 64 Кб,
2743
    частота 44100 Гц. Тем не менее рекомендуется явно устанавливать
2744
    необходимые значения, поскольку они могли быть переустановлены
2745
    какой-нибудь программой.
2746
 
2747
======================================================================
2748
====================== Функция 55, подфункция 55 =====================
2749
========== Начать проигрывать данные на встроенном спикере. ==========
2750
======================================================================
2751
Параметры:
2752
  * eax = 55 - номер функции
2753
  * ebx = 55 - номер подфункции
2754
  * esi = указатель на данные
2755
Возвращаемое значение:
2756
  * eax = 0 - успешно
2757
  * eax = 55 - ошибка (спикер отключён или занят)
2758
Данные - это массив элементов переменной длины.
2759
Формат каждого элемента определяется первым байтом:
2760
  * 0 = конец данных
2761
  * 1..0x80 = задаёт длительность звучания в сотых долях секунды
2762
    ноты, определяемой непосредственным значением частоты
2763
    * следующее слово (2 байта) содержит делитель частоты;
2764
      частота определяется как 1193180/divider
2765
  * 0x81 = invalid
2766
  * 0x82..0xFF = нота, определяемая октавой и номером:
2767
    * длительность в сотых долях секунды = (первый байт)-0x81
2768
    * присутствует ещё один байт;
2769
    * (второй байт)=0xFF - пауза
2770
    * иначе он имеет вид a*0x10+b, где b=номер ноты в октаве от 1
2771
      до 12, a=номер октавы (считая с 0)
2772
Замечания:
2773
  * Пищание спикером может быть запрещено/разрешено подфункцией 8
2774
    функции 18.
2775
  * Функция возвращает управление, сообщив куда следует информацию
2776
    о запросе. Само проигрывание идёт независимо от программы.
2777
  * Данные должны сохраняться в памяти по крайней мере
2778
    до конца проигрывания.
2779
 
2780
======================================================================
2781
============= Функция 56 - записать файл на жёсткий диск. ============
2782
======================================================================
2783
Параметры:
2784
  * eax = 56 - номер функции
2785
  * ebx = указатель на имя файла
2786
  * ecx = размер данных для записи (в байтах)
2787
  * edx = указатель на данные для записи
2788
  * esi = указатель на путь (ASCIIZ-строку)
2789
Возвращаемое значение:
2790
  * eax = 0 - успешно, иначе код ошибки файловой системы
2791
Замечания:
83 diamond 2792
  * Эта функция устарела; функция 70 позволяет выполнять
77 diamond 2793
    те же действия с расширенными возможностями.
2794
  * Данная функция предполагает, что во время её вызова одним
2795
    приложением никакое другое приложение не работает
2796
    с жёстким диском.
2797
  * Путь к файлу - ASCIIZ-строка, которая может быть пустой
2798
    (если файл создаётся в корневом каталоге) или иметь формат
2799
    /d1/d2/.../dn, где все имена папок должны иметь формат 8+3, т.е.
2800
    8 символов имени и 3 символа расширения без разделителя,
2801
    при необходимости дополненные пробелами;
2802
    все буквы должны быть заглавные.
2803
  * Имя к файлу также должно иметь формат 8+3.
2804
 
2805
======================================================================
2806
============== Функция 58 - работа с файловой системой. ==============
2807
======================================================================
2808
Параметры:
2809
  * eax = 58
2810
  * ebx = указатель на информационную структуру
2811
Возвращаемое значение:
2812
  * eax = 0 - успешно; иначе код ошибки файловой системы
2813
  * в зависимости от подфункции может возвращаться значение и
2814
    в других регистрах
2815
Общий формат информационной структуры:
2816
  * +0: dword: номер подфункции
2817
  * +4: dword: номер блока
2818
  * +8: dword: размер
2819
  * +12 = +0xC: dword: указатель на данные
2820
  * +16 = +0x10: dword: указатель на память для работы системы
2821
    (4096 байт)
2822
  * +20 = +0x14: n db: ASCIIZ-строка с именем файла
2823
Уточнения - в документации на соответствующую подфункцию.
2824
Имя файла нечувствительно к регистру латинских букв,
2825
русские буквы должны быть заглавными.
2826
Формат имени файла:
2827
/base/number/dir1/dir2/.../dirn/file,
2828
где /base/number идентифицирует устройство, на котором ищется файл:
2829
одно из
2830
  * /RD/1 = /RAMDISK/1 для доступа к рамдиску
2831
  * /FD/1 = /FLOPPYDISK/1 для доступа к первому флоппи-дисководу,
2832
    /FD/2 = /FLOPPYDISK/2 для второго флоппи-дисковода
2833
  * /HD/x = /HARDDISK/x - устаревший вариант доступа к жёсткому диску
2834
    (в этом случае база определяется подфункцией 7 функции 21),
2835
    x - номер раздела (считая с 1)
2836
  * /HD0/x, /HD1/x, /HD2/x, /HD3/x для доступа соответственно
2837
    к устройствам IDE0 (Primary Master), IDE1 (Primary Slave),
2838
    IDE2 (Secondary Master), IDE3 (Secondary Slave);
2839
    x - номер раздела на выбранном винчестере, изменяется от 1 до 255
2840
    (на каждом из винчестеров нумерация начинается с 1)
2841
Замечания:
2842
  * В первых двух случаях допускается использование FIRST вместо 1,
2843
    SECOND вместо 2, но использовать эту возможность
2844
    не рекомендуется для удобства перехода на будущие расширения.
2845
  * Накладывается ограничение n<=39.
2846
  * Имена папок и файла dir1,...,dirn,file должны быть в формате 8.3:
2847
    имя не более 8 символов, точка, расширение не более 3 символов.
2848
    Хвостовые пробелы игнорируются. Других пробелов быть не должно.
2849
    Если имя занимает ровно 8 символов, точку можно опустить
2850
    (хотя пользоваться этим не рекомендуется для удобства перехода
2851
    на будущие расширения).
2852
Примеры:
2853
  * '/RAMDISK/FIRST/KERNEL.ASM',0
2854
    '/rd/1/kernel.asm',0
2855
  * '/HD0/1/kernel.asm',0
2856
  * '/hd0/1/menuet/pics/tanzania.bmp',0
2857
Доступные подфункции:
2858
  * подфункция 0 - чтение файла/папки
2859
  * подфункция 1 - перезапись файла
2860
  * подфункция 2 - удаление файла/папки
2861
  * подфункция 3 - запись данных в существующий файл
2862
  * подфункция 4 - создание папки
2863
  * подфункция 5 - переименование/перемещение файла/папки
2864
  * подфункция 8 - LBA-чтение с устройства
2865
  * подфункция 12 - определение размера файла
2866
  * подфункция 13 - определение атрибутов файла/папки
2867
  * подфункция 14 - определение даты/времени файла/папки
2868
  * подфункция 15 - получение информации о файловой системе
2869
  * подфункция 16 - запуск приложения
2870
 
2871
======================================================================
2872
========== Функция 58, подфункция 0 - прочитать файл/папку. ==========
2873
======================================================================
2874
Параметры:
2875
  * eax = 58
2876
  * ebx = указатель на информационную структуру
2877
Формат информационной структуры:
2878
  * +0: dword: 0 = номер подфункции
2879
  * +4: dword: номер блока для чтения (считая с 0)
2880
  * +8: dword: число блоков для чтения
2881
  * +12 = +0xC: dword: указатель на буфер, куда будут записаны данные
2882
  * +16 = +0x10: dword: указатель на буфер для работы системы
2883
    (4096 байт)
83 diamond 2884
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
77 diamond 2885
    общем описании
2886
Возвращаемое значение:
2887
  * eax = 0 - успешно, иначе код ошибки файловой системы
2888
  * ebx = размер файла (в байтах) или
2889
    -1=0xffffffff, если файл не найден
2890
Замечания:
2891
  * Размер блока - 512 байт.
2892
  * Эта функция устарела, для чтения файлов используйте подфункцию 0
2893
    функции 70, для чтения папок - подфункцию 1 функции 70.
2894
  * Функция позволяет читать содержимое папки. Из файловых систем
2895
    поддерживается только FAT. Формат FAT-папки описан в любой
2896
    документации по FAT.
2897
  * Размер папки определяется по размеру цепочки кластеров в FAT.
2898
  * Если файл кончился раньше, чем был прочитан последний запрошенный
2899
    блок, то функция прочитает, сколько сможет, после чего вернёт
2900
    eax=6 (EOF).
2901
  * Функция позволяет читать корневые папки /rd/1,/fd/x,/hd[n]/x, но
2902
    в первых двух случаях текущая реализация не следует
2903
    установленным правилам:
2904
    для /rd/1:
2905
    * если указано 0 блоков для чтения, считается,
2906
      что запрашивается 1;
2907
    * если запрашивается больше 14 блоков или начальный блок
2908
      не меньше 14-го, то возвращается eax=5 (not found) и ebx=-1;
2909
    * размер корневого каталога рамдиска = 14 блоков,
2910
      0x1C00=7168 байт; но возвращается ebx=0
2911
      (за исключением случая предыдущего пункта);
2912
    * как ни странно, можно прочитать 14-й блок (там, вообще говоря,
2913
      мусор - напоминаю, счёт ведётся с 0);
2914
    * если был запрошен хотя бы один блок с номером, не меньшим 14,
2915
      то возвращается eax=6(EOF); иначе eax=0.
2916
    Для /fd/x:
2917
    * если начальный блок не меньше 14-го, то возвращается
2918
      eax=5 (not found) и ebx=0;
2919
    * кстати говоря, формат FAT12 допускает дискеты с размером
2920
      корневого каталога меньше или больше 14 блоков;
2921
    * проверки длины не делается;
2922
    * если удалось прочитать данные с дискеты, возвращается
2923
      eax=0,ebx=0; в противном случае eax=10 (access denied), ebx=-1.
2924
  * Функция обрабатывает чтение специальных папок /,/rd,/fd,/hd[n];
2925
    но результат не соответствует ожидаемому
2926
    (по работе с обычными файлами/папками), не следует установленным
2927
    правилам, может измениться в следующих версиях ядра и потому
2928
    не описывается. Для получения информации об оборудовании
2929
    используйте подфункцию 11 функции 18 или
2930
    читайте соответствующие папки подфункцией 1 функции 70.
2931
 
2932
======================================================================
2933
============ Функция 58, подфункция 1 - перезаписать файл. ===========
2934
======================================================================
2935
Если файл не существует, он создаётся.
2936
Если файл существует, он перезаписывается.
2937
Параметры:
2938
  * eax = 58 - номер функции
2939
  * ebx = указатель на информационную структуру
2940
Формат информационной структуры:
2941
  * +0: dword: 1 = номер подфункции
2942
  * +4: dword: игнорируется (устанавливайте в 0)
2943
  * +8: dword: число байт для записи
2944
  * +12 = +0xC: dword: указатель на данные для записи
2945
  * +16 = +0x10: dword: указатель на буфер для работы системы
2946
    (4096 байт)
83 diamond 2947
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
77 diamond 2948
    общем описании
2949
Возвращаемое значение:
2950
  * eax = 0 - успешно, иначе код ошибки файловой системы
2951
  * ebx разрушается
83 diamond 2952
Замечания:
2953
  * Эта функция устарела, используйте подфункцию 2 функции 70.
77 diamond 2954
 
2955
======================================================================
2956
=========== Функция 58, подфункция 2 - удалить файл/папку. ===========
2957
======================================================================
2958
Параметры:
2959
  * eax = 58 - номер функции
2960
  * ebx = указатель на информационную структуру
2961
Формат информационной структуры:
2962
  * +0: dword: 2 = номер подфункции
2963
  * +4: dword: игнорируется
2964
  * +8: dword: игнорируется
2965
  * +12 = +0xC: dword: игнорируется
2966
  * +16 = +0x10: dword: указатель на буфер для работы системы
2967
    (4096 байт)
2968
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
2969
    общем описании
2970
Возвращаемое значение:
2971
  * eax = 0 - успешно, иначе код ошибки файловой системы
2972
  * ebx разрушается
2973
Замечания:
2974
  * При работе с дискетой не следует удалять непустую папку.
2975
    Код работы с жёстким диском непустые папки удаляет корректно
2976
    (т.е. рекурсивно со всеми файлами и вложенными папками).
2977
    Рамдиск папок не поддерживает.
2978
 
2979
======================================================================
2980
==== Функция 58, подфункция 3 - запись данных в существующий файл. ===
2981
======================================================================
2982
Параметры:
2983
  * eax = 58 - номер функции
2984
  * ebx = указатель на информационную структуру
2985
Формат информационной структуры:
2986
  * +0: dword: 3 = номер подфункции
2987
  * +4: dword: начальная позиция в файле; -1 = дописывать в конец
2988
  * +8: dword: число байт для записи
2989
  * +12 = +0xC: dword: указатель на данные для записи
2990
  * +16 = +0x10: dword: указатель на буфер для работы системы
2991
    (4096 байт)
2992
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
2993
    общем описании
2994
Возвращаемое значение:
2995
  * eax = 0 - успешно, иначе код ошибки файловой системы
2996
  * ebx разрушается
2997
Замечания:
2998
  * Рамдиск и дискеты не поддерживают эту функцию, она только для
2999
    жёстких дисков.
3000
  * Файл должен уже существовать (иначе возвращается 5, not found).
3001
    Для создания файлов используйте подфункцию 1.
3002
  * Если начальная позиция больше размера файла, возвращается
3003
    eax=6(EOF). Если конечная позиция больше размера файла,
3004
    файл расширяется.
3005
  * Код обработки записи данных для жёсткого диска интерпретирует
3006
    нулевое значение поля +8 как указание усечения файла до размера,
3007
    указанного в поле +4. Однако код обработки 58-й функции блокирует
3008
    эту возможность для приложений, сразу возвращая управление
3009
    (с eax=0) в случае нулевого размера.
3010
 
3011
======================================================================
3012
============== Функция 58, подфункция 4 - создать папку. =============
3013
======================================================================
3014
Параметры:
3015
  * eax = 58 - номер функции
3016
  * ebx = указатель на информационную структуру
3017
Формат информационной структуры:
3018
  * +0: dword: 4 = номер подфункции
3019
  * +4: dword: игнорируется
3020
  * +8: dword: игнорируется
3021
  * +12 = +0xC: dword: игнорируется
3022
  * +16 = +0x10: dword: указатель на буфер для работы системы
3023
    (4096 байт)
3024
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
3025
    общем описании
3026
Возвращаемое значение:
3027
  * eax = 0 - успешно, иначе код ошибки файловой системы
3028
  * ebx разрушается
3029
Замечания:
3030
  * Рамдиск и дискеты не поддерживают эту функцию,
3031
    она только для жёстких дисков.
3032
 
3033
======================================================================
3034
== Функция 58, подфункция 5 - переименовать/переместить файл/папку. ==
3035
======================================================================
3036
Параметры:
3037
  * eax = 58 - номер функции
3038
  * ebx = указатель на информационную структуру
3039
Формат информационной структуры:
3040
  * +0: dword: 5 = номер подфункции
3041
  * +4: dword: игнорируется
3042
  * +8: dword: игнорируется
3043
  * +12 = +0xC: dword: игнорируется
3044
  * +16 = +0x10: dword: указатель на буфер для работы системы
3045
    (4096 байт)
3046
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
3047
    общем описании
3048
  * +20+n: (сразу после завершающего нулевого символа) новое
3049
    ASCIIZ-имя, должно начинаться с /hd/1, что интерпретируется как
3050
    жёсткий диск, указанный в первом имени
3051
    (перемещение с одного диска на другой не поддерживается)
3052
Возвращаемое значение:
3053
  * eax = 0 - успешно, иначе код ошибки файловой системы
3054
  * ebx разрушается
3055
Замечания:
3056
  * Рамдиск и дискеты не поддерживают эту функцию,
3057
    она только для жёстких дисков.
3058
  * Если новое ASCIIZ-имя сильно неправильное, т.е. не начинается с
3059
    /hd/1, /hd/first, /harddisk/1, /harddisk/first или после этого
3060
    начала идёт пробел или символ с кодом 0, то функция возвращает,
3061
    как ни странно, код ошибки 4. Это единственная функция, которая
3062
    вообще возвращает этот код.
3063
 
3064
======================================================================
3065
========= Функция 58, подфункция 8 - LBA-чтение с устройства. ========
3066
======================================================================
3067
Параметры:
3068
  * eax = 58 - номер функции
3069
  * ebx = указатель на информационную структуру
3070
Формат информационной структуры:
3071
  * +0: dword: 8 = номер подфункции
3072
  * +4: dword: номер блока для чтения (считая с 0)
3073
  * +8: dword: игнорируется (устанавливайте в 1)
3074
  * +12 = +0xC: dword: указатель на буфер, куда будут записаны данные
3075
    (512 байт)
3076
  * +16 = +0x10: dword: указатель на буфер для работы системы
3077
    (4096 байт)
3078
  * +20 = +0x14: ASCIIZ-имя устройства: нечувствительно к регистру,
3079
    одно из /rd/1 = /RamDisk/1, /hd/n = /HardDisk/n,
3080
    1<=n<=4 - номер устройства: 1=IDE0, ..., 4=IDE3.
3081
    Вместо цифр допускается, хотя и не рекомендуется для удобства
3082
    перехода на будущие расширения,
3083
    использование 'first','second','third','fourth'.
3084
Возвращаемое значение:
3085
  * если указано имя устройства /hd/xxx, где xxx не находится
3086
    в списке выше:
3087
    * eax = ebx = 1
3088
  * если указано неправильное имя устройства
3089
    (за исключением предыдущего случая):
3090
    * eax = 5
3091
    * ebx не меняется
3092
  * если LBA-доступ запрещён подфункцией 11 функции 21:
3093
    * eax = 2
3094
    * ebx разрушается
3095
  * для рамдиска: попытка чтения блока за пределами рамдиска
3096
    (18*2*80 блоков) приводит к
3097
    * eax = 3
3098
    * ebx = 0
3099
  * при успешном чтении:
3100
    * eax = ebx = 0
3101
Замечания:
3102
  * Размер блока - 512 байт; читается один блок.
3103
  * Не следует полагаться на возвращаемое значение,
3104
    оно может измениться в следующих версиях.
3105
  * Требуется, чтобы был разрешён LBA-доступ к устройствам
3106
    подфункцией 11 функции 21. Узнать это можно вызовом
3107
    подфункцией 11 функции 26.
3108
  * LBA-чтение дискеты не поддерживается.
3109
  * Функция считывает данные физического жёсткого диска;
3110
    если по каким-то причинам нужны данные конкретного раздела,
3111
    придётся определять начальный сектор этого раздела
3112
    (либо напрямую через MBR, либо из расширенной структуры,
3113
    возвращаемой той же подфункцией 11 функции 18).
3114
  * Функция не проверяет код ошибки жёсткого диска, так что запрос
3115
    несуществующего сектора всё равно что-то прочитает
3116
    (вероятнее всего, нули, но это определяется устройством) и
3117
    это будет считаться успехом (eax=0).
3118
 
3119
======================================================================
3120
= Функция 58, подфункция 15 - получить информацию о файловой системе.
3121
======================================================================
3122
Параметры:
3123
  * eax = 58 - номер функции
3124
  * ebx = указатель на информационную структуру
3125
Формат информационной структуры:
3126
  * +0: dword: 15 = номер функции
3127
  * +4: dword: игнорируется
3128
  * +8: dword: игнорируется
3129
  * +12 = +0xC: dword: игнорируется
3130
  * +16 = +0x10: dword: игнорируется
3131
  * +20 = +0x14: (проверяется только второй символ, сразу после слэша)
3132
    /rd=/RAMDISK или /hd=/HARDDISK
3133
Возвращаемое значение:
3134
  * если второй символ не принадлежит множеству {'r','R','h','H'}:
3135
    * eax = 3
3136
    * ebx = ecx = dword [fileinfo] = 0
3137
  * для рамдиска:
3138
    * eax = 0 (успех)
3139
    * ebx = общее число кластеров = 2847
3140
    * ecx = число свободных кластеров
3141
    * dword [fileinfo] = размер кластера = 512
3142
  * для жёсткого диска: база и раздел определяются подфункциями 7 и 8
3143
    функции 21:
3144
    * eax = 0 (успех)
3145
    * ebx = общее число кластеров
3146
    * ecx = число свободных кластеров
3147
    * dword [fileinfo] = размер кластера (в байтах)
3148
Замечания:
3149
  * Не удивляйтесь странному расположению 4-го возвращаемого
3150
    параметра - когда писался этот код, при системных вызовах
3151
    приложению возвращались только регистры eax,ebx,ecx (из
3152
    pushad-структуры, передающейся как аргумент системной функции).
3153
    Теперь это исправлено, так что, возможно, имеет смысл возвращать
3154
    размер кластера в edx, пока эту функцию не начали использовать.
3155
  * Вообще-то ещё существует подфункция 11 функции 18, возвращающая
3156
    информацию о файловой системе. По расширенной таблице дисковой
3157
    подсистемы можно определить размер кластера (там он хранится
3158
    в секторах) и общее число кластеров для жёстких дисков.
3159
 
3160
======================================================================
3161
========== Функция 58, подфункция 16 - запустить программу. ==========
3162
======================================================================
3163
Параметры:
3164
  * eax = 58 - номер функции
3165
  * ebx = указатель на информационную структуру
3166
Формат информационной структуры:
3167
  * +0: dword: 16 = номер подфункции
3168
  * +4: dword: поле флагов:
3169
    * бит 0: запустить процесс как отлаживаемый
3170
    * остальные биты зарезервированы и должны быть установлены в 0
3171
  * +8: dword: 0 или указатель на ASCIIZ-строку с параметрами
3172
  * +12 = +0xC: dword: игнорируется
3173
  * +16 = +0x10: dword: указатель на буфер для работы системы
3174
    (4096 байт)
3175
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
3176
    общем описании
3177
Возвращаемое значение:
3178
  * eax > 0 - программа загружена, eax содержит PID
3179
  * eax < 0 - произошла ошибка, -eax содержит
3180
    код ошибки файловой системы
3181
Замечания:
91 diamond 3182
  * Эта функция устарела, используйте подфункцию 7 функции 70.
77 diamond 3183
  * Комадная строка должна заканчиваться символом с кодом 0
3184
    (ASCIIZ-строка); учитываются либо все символы до завершающего нуля
3185
    включительно, либо первые 256 символов, в зависимости от того,
3186
    что меньше.
3187
  * Если процесс запускается как отлаживаемый, он создаётся
3188
    в замороженном состоянии; для запуска используйте
3189
    подфункцию 5 функции 69.
3190
 
3191
======================================================================
3192
=========== Функция 60 - Inter Process Communication (IPC). ==========
3193
======================================================================
3194
IPC применяется для посылок сообщений от одного процесса/потока
3195
другому. При этом следует предварительно договориться о том, как
3196
интерпретировать конкретное сообщение.
3197
 
3198
-------- Подфункция 1 - установить область для получения IPC ---------
3199
Вызывается процессом-приёмником.
3200
Параметры:
3201
  * eax = 60 - номер функции
3202
  * ebx = 1 - номер подфункции
3203
  * ecx = указатель на буфер
3204
  * edx = размер буфера
3205
Возвращаемое значение:
3206
  * eax = 0 - всегда успешно
3207
Формат IPC-буфера:
3208
  * +0: dword: если здесь не 0, то буфер считается заблокированным;
3209
    блокируйте/разблокируйте буфер, когда вы с ним активно работаете
3210
    и вам надо, чтобы извне не изменялись данные буфера
3211
    (не поступали новые сообщения)
3212
  * +4: dword: занято места в буфере (в байтах)
3213
  * +8: первое сообщение
3214
  * +8+n: второе сообщение
3215
  * ...
3216
Формат сообщения:
3217
  * +0: dword: PID процесса/потока, пославшего сообщение
3218
  * +4: dword: длина сообщения (не считая этот заголовок)
3219
  * +8: n*byte: данные сообщения
3220
 
3221
--------------- Подфункция 2 - послать сообщение IPC. ----------------
3222
Вызывается процессом-инициатором.
3223
Параметры:
3224
  * eax = 60 - номер функции
3225
  * ebx = 2 - номер подфункции
3226
  * ecx = PID приёмника
3227
  * edx = указатель на данные сообщения
3228
  * esi = длина сообщения (в байтах)
3229
Возвращаемое значение:
3230
  * eax = 0 - успешно
3231
  * eax = 1 - приёмник не определил буфер для IPC-сообщений
3232
    (может быть, ещё не успел, а может быть, это не тот поток,
3233
    который нужен)
3234
  * eax = 2 - приёмник заблокировал IPC-буфер;
3235
    попробуйте немного подождать
3236
  * eax = 3 - переполнение IPC-буфера приёмника
3237
  * eax = 4 - процесса/потока с таким PID не существует
3238
Замечания:
3239
  * Система сразу после записи IPC-сообщения в буфер посылает
3240
    потоку-приёмнику событие с кодом 7 (см. коды событий).
3241
 
3242
======================================================================
3243
=== Функция 61 - получить параметры для прямого доступа к графике. ===
3244
======================================================================
3245
Программе доступны данные графического экрана (область памяти, которая
3246
собственно и отображает содержимое экрана) напрямую без вызовов
3247
системных функций через селектор gs:
3248
	mov	eax, [gs:0]
3249
поместит в eax первый dword буфера, содержащий информацию о цвете
3250
левой верхней точки (и, возможно, цвета нескольких следующих).
3251
	mov	[gs:0], eax
3252
при работе в режимах VESA c LFB
3253
установит цвет левой верхней точки
3254
(и возможно, цвета нескольких следующих).
3255
Для интерпретации данных графического экрана требуется знание
3256
некоторых параметров, которые возвращаются этой функцией.
3257
Замечания:
3258
  * Параметры графики очень редко меняются при работе системы,
3259
    а именно, только в случаях, когда пользователь работает
3260
    с программой VRR.
3261
  * При изменении видеорежима система перерисовывает все окна
3262
    (событие с кодом 1) и перерисовывает фон (событие 5).
3263
    Эти же события происходят и в других случаях,
3264
    которые встречаются значительно чаще, чем изменение видеорежима.
3265
  * При работе в видеорежимах с LFB селектор gs указывает на
3266
    собственно LFB, так что чтение/запись по gs приводят
3267
    непосредственно к изменению содержимого экрана. При работе в
3268
    видеорежимах без LFB gs указывает на некоторую область данных
3269
    ядра, причём все функции вывода на экран добросовестно выполняют
3270
    двойную работу по записи непосредственно на экран и по записи
3271
    в этот буфер. В результате при чтении содержимого этого буфера
3272
    результаты соответствуют содержимому экрана
3273
    (с, вообще говоря, большим цветовым разрешением),
3274
    а запись игнорируется.
3275
    Исключением является режим 320*200, для которого в главном цикле
3276
    системного потока выполняется обновление экрана в соответствии
3277
    с движениями курсора мыши.
3278
 
3279
------------------------- Разрешение экрана --------------------------
3280
Параметры:
3281
  * eax = 61 - номер функции
3282
  * ebx = 1 - номер подфункции
3283
Возвращаемое значение:
3284
  * eax = [разрешение по оси x]*65536 + [разрешение по оси y]
3285
Замечания:
3286
  * Можно использовать функцию 14 с учётом того, что она возвращает
3287
    размеры на 1 меньше. Это полностью эквивалентный способ.
3288
 
3289
------------------------ Число бит на пиксель ------------------------
3290
Параметры:
3291
  * eax = 61 - номер функции
3292
  * ebx = 2 - номер подфункции
3293
Возвращаемое значение:
3294
  * eax = число бит на пиксель (24 или 32)
3295
 
3296
------------------------ Число байт на строку ------------------------
3297
Параметры:
3298
  * eax = 61 - номер функции
3299
  * ebx = 3 - номер подфункции
3300
Возвращаемое значение:
3301
  * eax = число байт, которое занимает одна строка развёртки
3302
    (горизонтальная линия на экране)
3303
 
3304
======================================================================
3305
===== Функция 62, подфункция 0 - получить версию PCI-интерфейса. =====
3306
======================================================================
3307
Параметры:
3308
  * eax = 62 - номер функции
3309
  * bl = 0 - номер подфункции
3310
Возвращаемое значение:
3311
  * eax = -1 - доступ к PCI запрещён; иначе
3312
  * ah.al = версия PCI-интерфейса (ah=версия, al=подверсия)
3313
  * старшее слово eax обнулено
3314
Замечания:
3315
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
3316
    для приложений подфункцией 12 функции 21.
3317
  * Если PCI BIOS не поддерживается, то значение ax неопределено.
3318
 
3319
======================================================================
3320
==== Функция 62, подфункция 1 - получить номер последней PCI-шины. ===
3321
======================================================================
3322
Параметры:
3323
  * eax = 62 - номер функции
3324
  * bl = 1 - номер подфункции
3325
Возвращаемое значение:
3326
  * eax = -1 - доступ к PCI запрещён; иначе
3327
  * al = номер последней PCI-шины; оставшиеся байты eax разрушаются
3328
Замечания:
3329
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
3330
    для приложений подфункцией 12 функции 21.
3331
  * Если PCI BIOS не поддерживается, то значение al неопределено.
3332
 
3333
======================================================================
3334
====================== Функция 62, подфункция 2 ======================
3335
== Получить механизм обращения к конфигурационному пространству PCI. =
3336
======================================================================
3337
Параметры:
3338
  * eax = 62 - номер функции
3339
  * bl = 2 - номер подфункции
3340
Возвращаемое значение:
3341
  * eax = -1 - доступ к PCI запрещён; иначе
3342
  * al = механизм (1 или 2); прочие байты eax разрушаются
3343
Замечания:
3344
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
3345
    для приложений подфункцией 12 функции 21.
3346
  * Механизм обращения выбирается в соответствии
3347
    с характеристиками оборудования.
3348
  * Подфункции чтения и записи автоматически работают
3349
    с выбранным механизмом.
3350
 
3351
======================================================================
3352
======== Функция 62, подфункции 4,5,6 - прочитать PCI-регистр. =======
3353
======================================================================
3354
Параметры:
3355
  * eax = 62 - номер функции
3356
  * bl = 4 - читать байт
3357
  * bl = 5 - читать слово
3358
  * bl = 6 - читать двойное слово
3359
  * bh = номер PCI-шины
3360
  * ch = dddddfff, где ddddd = номер устройства на шине,
3361
    fff = номер функции устройства
3362
  * cl = номер регистра (должен быть чётным для bl=5,
3363
    делиться на 4 для bl=6)
3364
Возвращаемое значение:
3365
  * eax = -1 - ошибка (запрещён доступ к PCI или
3366
    неподдерживаемые параметры); иначе
3367
  * al/ax/eax (в зависимости от запрошенного размера) содержит данные;
3368
    оставшаяся часть регистра eax разрушается
3369
Замечания:
3370
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
3371
    для приложений подфункцией 12 функции 21.
3372
  * Механизм доступа 2 поддерживает только 16 устройств на шине и
3373
    игнорирует номер функции. Получить механизм доступа можно вызовом
3374
    подфункции 2.
3375
  * Некоторые регистры стандартны и существуют для всех устройств,
3376
    некоторые определяются конкретным устройством. Список первых
3377
    входит, например, в известный Interrupt List by Ralf Brown
3378
    (http://www.pobox.com/~ralf/files.html,
3379
    ftp://ftp.cs.cmu.edu/afs/cs/user/ralf/pub/);
3380
    список вторых должен быть указан в документации по устройству.
3381
 
3382
======================================================================
3383
======= Функция 62, подфункции 8,9,10 - записать в PCI-регистр. ======
3384
======================================================================
3385
Параметры:
3386
  * eax = 62 - номер функции
3387
  * bl = 8 - писать байт
3388
  * bl = 9 - писать слово
3389
  * bl = 10 - писать двойное слово
3390
  * bh = номер PCI-шины
3391
  * ch = dddddfff, где ddddd = номер устройства на шине,
3392
    fff = номер функции устройства
3393
  * cl = номер регистра (должен быть чётным для bl=9,
3394
    делиться на 4 для bl=10)
3395
Возвращаемое значение:
3396
  * eax = -1 - ошибка (запрещён доступ к PCI или
3397
    неподдерживаемые параметры)
3398
  * eax = 0 - успешно
3399
Замечания:
3400
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
3401
    для приложений подфункцией 12 функции 21.
3402
  * Механизм доступа 2 поддерживает только 16 устройств на шине и
3403
    игнорирует номер функции. Получить механизм доступа можно вызовом
3404
    подфункции 2.
3405
  * Некоторые регистры стандартны и существуют для всех устройств,
3406
    некоторые определяются конкретным устройством. Список первых
3407
    входит, например, в известный Interrupt List by Ralf Brown;
3408
    список вторых должен быть указан в документации по устройству.
3409
 
3410
======================================================================
3411
================ Функция 63 - работа с доской отладки. ===============
3412
======================================================================
3413
Доска отладки представляет собой системный буфер (на 512 байт),
3414
в который любая программа может записать (вообще говоря, произвольные)
3415
данные и из которого другая программа может эти данные прочитать.
3416
Есть соглашение, в соответствии с которым записываемые данные -
3417
текстовые строки, интерпретируемые как отладочные сообщения о ходе
3418
выполнения программы. Ядро в определённых ситуациях также записывает
3419
на доску отладки сведения о выполнении некоторых функций;
3420
по соглашению сообщения ядра начинаются с префикса "K : ".
3421
Для просмотра доски отладки создано приложение board,
3422
которое считывает данные из буфера и отображает их в своём окне. board
3423
понимает последовательность кодов 13,10 как переход на новую строку.
3424
Символ с нулевым кодом в конце строки не обязателен, но и не мешает.
3425
В связи с появлением отладчика ценность доски отладки несколько
3426
снизилась, поскольку отладчик позволяет полностью контролировать ход
3427
выполнения программы, причём для этого не требуется никаких усилий
3428
со стороны самой программы. Тем не менее во многих случаях
3429
доска отладки продолжает оставаться полезной.
3430
 
3431
---------------------------- Запись байта ----------------------------
3432
Параметры:
3433
  * eax = 63 - номер функции
3434
  * ebx = 1 - номер подфункции
3435
  * cl = байт данных
3436
Возвращаемое значение:
3437
  * функция не возвращает значения
3438
Замечания:
3439
  * Байт записывается в буфер. Длина буфера - 512 байт.
3440
    При переполнении буфера все полученные данные теряются
3441
    и заполнение начинается снова с нуля.
3442
  * Для вывода на доску отладки более сложных объектов (строк, чисел)
3443
    достаточно этой функции, вызываемой в цикле. Можно не писать
3444
    вручную соответствующий код, а воспользоваться файлом debug.inc,
3445
    входящим в дистрибутив.
3446
 
3447
---------------------------- Чтение байта ----------------------------
3448
Забирает байт из буфера.
3449
Параметры:
3450
  * eax = 63 - номер функции
3451
  * ebx = 2 - номер подфункции
3452
Возвращаемое значение:
3453
  * eax = ebx = 0 - буфер пуст
3454
  * eax = байт, ebx = 1 - байт успешно прочитан
3455
 
3456
======================================================================
3457
========== Функция 64 - перераспределить память приложения. ==========
3458
======================================================================
3459
Параметры:
3460
  * eax = 64 - номер функции
3461
  * ebx = 1 - единственная подфункция
3462
  * ecx = новый размер памяти
3463
Возвращаемое значение:
3464
  * eax = 0 - успешно
3465
  * eax = 1 - недостаточно памяти
3466
Замечания:
3467
  * На данный момент эта функция является единственным средством для
3468
    динамического выделения/освобождения памяти приложения.
3469
 
3470
======================================================================
3471
=========== Функция 66 - режим получения данных клавиатуры. ==========
3472
======================================================================
3473
Режим ввода влияет на результаты чтения клавиш функцией 2
3474
и получения последней нажатой клавиши подфункцией 12 функции 18.
3475
При загрузке программы для неё устанавливается ASCII-режим ввода.
3476
 
3477
------------------ Подфункция 1 - установить режим. ------------------
3478
Параметры:
3479
  * eax = 66 - номер функции
3480
  * ebx = 1 - номер подфункции
3481
  * ecx = режим:
3482
    * 0 = обычный (ASCII-символы)
3483
    * 1 = сканкоды
3484
Возвращаемое значение:
3485
  * функция не возвращает значения
3486
 
3487
------------------- Подфункция 2 - получить режим. -------------------
3488
Параметры:
3489
  * eax = 66 - номер функции
3490
  * ebx = 2 - номер подфункции
3491
Возвращаемое значение:
3492
  * eax = текущий режим
3493
 
3494
------- Подфункция 3 - получить состояние управляющих клавиш. --------
3495
Параметры:
3496
  * eax = 66 - номер функции
3497
  * ebx = 3 - номер подфункции
3498
Возвращаемое значение:
3499
  * eax = битовая маска:
3500
  * бит 0 (маска 1): левый Shift нажат
3501
  * бит 1 (маска 2): правый Shift нажат
3502
  * бит 2 (маска 4): левый Ctrl нажат
3503
  * бит 3 (маска 8): правый Ctrl нажат
3504
  * бит 4 (маска 0x10): левый Alt нажат
3505
  * бит 5 (маска 0x20): правый Alt нажат
3506
  * бит 6 (маска 0x40): CapsLock включён
3507
  * бит 7 (маска 0x80): NumLock включён
3508
  * бит 8 (маска 0x100): ScrollLock включён
3509
  * прочие биты сброшены
3510
 
3511
======================================================================
3512
============ Функция 67 - изменить положение/размеры окна. ===========
3513
======================================================================
3514
Параметры:
3515
  * eax = 67 - номер функции
3516
  * ebx = новая x-координата окна
3517
  * ecx = новая y-координата окна
3518
  * edx = новый x-размер окна
3519
  * esi = новый y-размер окна
3520
Возвращаемое значение:
3521
  * функция не возвращает значения
3522
Замечания:
3523
  * Значение -1 для параметра означает "не изменять"; например, для
3524
    перемещения окна без изменения размеров можно указать edx=esi=-1.
3525
  * Предварительно окно должно быть определено функцией 0.
3526
    Она же задаёт начальные координаты и размеры окна.
3527
  * Размеры окна понимаются в смысле функции 0, т.е.
3528
    на один пиксель меньше, чем реальные размеры.
3529
  * Вызов функции для максимизированных окон просто игнорируется.
3530
  * Для окон соответствующих стилей положение и/или размеры могут быть
3531
    изменены пользователем; текущие положение и размеры могут быть
3532
    получены вызовом функции 9.
3533
  * Функция посылает окну событие перерисовки (с кодом 1).
3534
 
3535
======================================================================
3536
=== Функция 68, подфункция 0 - получить счётчик переключений задач. ==
3537
======================================================================
3538
Параметры:
3539
  * eax = 68 - номер функции
3540
  * ebx = 0 - номер подфункции
3541
Возвращаемое значение:
3542
  * eax = число переключений задач с момента загрузки системы
3543
    (по модулю 2^32)
3544
 
3545
======================================================================
3546
====================== Функция 68, подфункция 1 ======================
3547
============ Переключиться на следующий поток выполнения. ============
3548
======================================================================
3549
Функция завершает текущий квант времени, выделенный потоку,
3550
и переключается на следующий.
3551
(Какой поток какого процесса будет следующим, предсказать нельзя).
3552
Позднее, когда до текущего потока дойдёт очередь,
3553
выполнение возобновится.
3554
Параметры:
3555
  * eax = 68 - номер функции
3556
  * ebx = 1 - номер подфункции
3557
Возвращаемое значение:
3558
  * функция не возвращает значения
3559
 
3560
======================================================================
3561
=============== Функция 68, подфункция 2 - кэш + rdpmc. ==============
3562
======================================================================
3563
Параметры:
3564
  * eax = 68 - номер функции
3565
  * ebx = 2 - номер подфункции
3566
  * ecx = требуемое действие:
3567
    * ecx = 0 - разрешить выполнение инструкции rdpmc
3568
      (ReaD Performance-Monitoring Counters)
3569
    * ecx = 1 - узнать, включён/выключен кэш
3570
    * ecx = 2 - включить кэш
3571
    * ecx = 3 - выключить кэш
3572
Возвращаемое значение:
3573
  * для ecx=0:
3574
    * eax = значение cr4
3575
  * для ecx=1:
3576
    * eax = (cr0 and 0x60000000):
3577
    * eax = 0 - кэш включён
3578
    * eax <> 0 - кэш выключен
3579
  * для ecx=2 и ecx=3:
3580
    * функция не возвращает значения
3581
 
3582
======================================================================
3583
========== Функция 68, подфункция 3 - прочитать MSR-регистр. =========
3584
======================================================================
3585
MSR = Model Specific Register; полный список MSR-регистров процессора
3586
содержится в документации по процессору (например, IA-32 Intel
3587
Architecture Software Developer's Manual, Volume 3, Appendix B);
3588
каждое семейство процессоров имеет своё подмножество MSR-регистров.
3589
Параметры:
3590
  * eax = 68 - номер функции
3591
  * ebx = 3 - номер подфункции
3592
  * ecx игнорируется
3593
  * edx = адрес MSR
3594
Возвращаемое значение:
3595
  * ebx:eax = старший:младший dword результата
3596
Замечания:
3597
  * Указание в ecx несуществующего или нереализованного для данного
3598
    процессора MSR повлечёт исключение в ядре, которое прибьёт поток.
3599
  * Предварительно следует определить, поддерживаются ли MSR в целом,
3600
    командой cpuid. Иначе возникнет уже другое исключение в ядре,
3601
    которое всё равно прибьёт поток.
3602
 
3603
======================================================================
3604
========= Функция 68, подфункция 4 - записать в MSR-регистр. =========
3605
======================================================================
3606
MSR = Model Specific Register; полный список MSR-регистров процессора
3607
содержится в документации по процессору (например, IA-32 Intel
3608
Architecture Software Developer's Manual, Volume 3, Appendix B);
3609
каждое семейство процессоров имеет своё подмножество MSR-регистров.
3610
Параметры:
3611
  * eax = 68 - номер функции
3612
  * ebx = 4 - номер подфункции
3613
  * ecx игнорируется
3614
  * edx = адрес MSR
3615
  * esi:edi = старший:младший dword
3616
Возвращаемое значение:
3617
  * ebx:eax = копия esi:edi
3618
Замечания:
3619
  * Указание в ecx несуществующего или нереализованного для данного
3620
    процессора MSR повлечёт исключение в ядре, которое прибьёт поток.
3621
  * Предварительно следует определить, поддерживаются ли MSR в целом,
3622
    командой cpuid. Иначе возникнет уже другое исключение в ядре,
3623
    которое всё равно прибьёт поток.
3624
 
3625
======================================================================
3626
======= Функция 68, подфункция 5 - выделить физическую память. =======
3627
======================================================================
3628
Параметры:
3629
  * eax = 68 - номер функции
3630
  * ebx = 5 - номер подфункции
3631
  * ecx = размер (в байтах)
3632
Возвращаемое значение:
3633
  * eax = физический адрес выделенной памяти
3634
Замечания:
3635
  * Обычные приложения не должны использовать эту функцию, она
3636
    предназначена для случая, когда при работе с каким-либо
3637
    устройством требуется разместить данные по известному физическому
3638
    адресу. (В сущности, эта функция разрабатывалась для AC97WAV.)
3639
  * Число блоков физической памяти ограничено (константой 24,
3640
    причём эта константа включает и несколько блоков памяти
3641
    для надобностей ядра).
3642
  * Освободить выделенную таким образом память можно
3643
    подфункцией 6, копированием данных туда/обратно
3644
    занимаются подфункции 7 и 8.
3645
 
3646
======================================================================
3647
====== Функция 68, подфункция 6 - освободить физическую память. ======
3648
======================================================================
3649
Параметры:
3650
  * eax = 68 - номер функции
3651
  * ebx = 6 - номер подфункции
3652
  * ecx = физический адрес памяти
3653
Возвращаемое значение:
3654
  * функция не возвращает значения
3655
Замечания:
3656
  * Обычные приложения не должны использовать эту функцию, она
3657
    предназначена для случая, когда при работе с каким-либо
3658
    устройством требуется разместить данные по известному физическому
3659
    адресу. (В сущности, эта функция разрабатывалась для AC97WAV.)
3660
  * Память должна быть ранее выделена подфункцией 5.
3661
 
3662
======================================================================
3663
=== Функция 68, подфункция 7 - записать данные в физическую память. ==
3664
======================================================================
3665
Параметры:
3666
  * eax = 68 - номер функции
3667
  * ebx = 7 - номер подфункции
3668
  * ecx = физический адрес
3669
  * edx = указатель на данные (в приложении)
3670
  * esi = размер данных (в байтах)
3671
Возвращаемое значение:
3672
  * функция не возвращает значения
3673
Замечания:
3674
  * Обычные приложения не должны использовать эту функцию, она
3675
    предназначена для случая, когда при работе с каким-либо
3676
    устройством требуется разместить данные по известному физическому
3677
    адресу. (В сущности, эта функция разрабатывалась для AC97WAV.)
3678
  * Диапазон физических адресов должен лежать внутри ранее выделенного
3679
    подфункцией 5 блока физической памяти.
3680
  * Проверок корректности не производится.
3681
 
3682
======================================================================
3683
== Функция 68, подфункция 8 - прочитать данные из физической памяти. =
3684
======================================================================
3685
Параметры:
3686
  * eax = 68 - номер функции
3687
  * ebx = 8 - номер подфункции
3688
  * ecx = физический адрес
3689
  * edx = указатель на буфер для данных (в приложении)
3690
  * esi = размер данных (в байтах)
3691
Возвращаемое значение:
3692
  * функция не возвращает значения
3693
Замечания:
3694
  * Обычные приложения не должны использовать эту функцию, она
3695
    предназначена для случая, когда при работе с каким-либо
3696
    устройством требуется разместить данные по известному физическому
3697
    адресу. (В сущности, эта функция разрабатывалась для AC97WAV.)
3698
  * Диапазон физических адресов должен лежать внутри ранее выделенного
3699
    подфункцией 5 блока физической памяти.
3700
  * Проверок корректности не производится.
3701
 
3702
======================================================================
3703
======================== Функция 69 - отладка. =======================
3704
======================================================================
3705
Процесс может загрузить другой процесс как отлаживаемый установкой
3706
соответствующего бита при вызове подфункции 16 функции 58.
3707
У процесса может быть только один отладчик; один процесс может
3708
отлаживать несколько разных. Система уведомляет отладчик о событиях,
3709
происходящих с отлаживаемым процессом. Сообщения записываются в буфер,
3710
определённый подфункцией 0.
3711
Формат сообщения:
3712
  * +0: dword: код сообщения
3713
  * +4: dword: PID отлаживаемого процесса
3714
  * +8: могут присутствовать дополнительные данные,
3715
    определяемые кодом сообщения
3716
Коды сообщений:
3717
  * 1 = исключение
3718
    * дополнительно передаётся dword-номер исключения
3719
    * процесс приостановлен
3720
  * 2 = процесс завершился
3721
    * приходит при любом завершении: как через системную функцию -1,
3722
      так и при "убийстве" любым другим процессом
3723
      (в том числе самим отладчиком)
3724
  * 3 = отладочное исключение int 1 = #DB
3725
    * дополнительно передаётся dword-образ регистра DR6:
3726
      * биты 0-3: выполнено условие соответствующей точки останова
3727
        (установленной подфункцией 9)
3728
      * бит 14: исключение произошло из-за режима
3729
        пошаговой трассировки (установлен флаг TF)
3730
    * процесс приостановлен
3731
При завершении отладчика прибиваются все отлаживаемые процессы.
3732
Если отладчик этого не хочет, он должен предварительно отключиться
3733
подфункцией 3.
3734
 
3735
Все подфункции применимы только к процессам/потокам, запущенным
3736
из текущего функцией 58 с установленным флагом отладки.
3737
Отладка многопоточных программ пока не поддерживается.
3738
Полный список подфункций:
3739
  * подфункция 0 - определить область данных для отладочных сообщений
3740
  * подфункция 1 - получить состояние регистров отлаживаемого потока
3741
  * подфункция 2 - установить состояние регистров отлаживаемого потока
3742
  * подфункция 3 - отключиться от отлаживаемого процесса
3743
  * подфункция 4 - приостановить отлаживаемый поток
3744
  * подфункция 5 - возобновить выполнение отлаживаемого потока
3745
  * подфункция 6 - прочитать из памяти отлаживаемого процесса
3746
  * подфункция 7 - записать в память отлаживаемого процесса
3747
  * подфункция 8 - завершить отлаживаемый поток
3748
  * подфункция 9 - установить/снять аппаратную точку останова
3749
 
3750
======================================================================
3751
====================== Функция 69, подфункция 0 ======================
3752
========= Определить область данных для отладочных сообщений. ========
3753
======================================================================
3754
Параметры:
3755
  * eax = 69 - номер функции
3756
  * ebx = 0 - номер подфункции
3757
  * ecx = указатель
3758
Формат области данных:
3759
  * +0: dword: N = размер буфера (не считая этого заголовка)
3760
  * +4: dword: занято в буфере
3761
  * +8: N*byte: буфер
3762
Возвращаемое значение:
3763
  * функция не возвращает значения
3764
Замечания:
3765
  * Если поле размера отрицательно, буфер считается заблокированным
3766
    и при поступлении нового сообщения система будет ждать.
3767
    Для синхронизации обрамляйте всю работу с буфером операциями
3768
    блокировки/разблокировки
3769
    	neg	[bufsize]
3770
  * Данные в буфере трактуются как массив элементов переменной длины -
3771
    сообщений. Формат сообщения указан в общем описании.
3772
 
3773
======================================================================
3774
====================== Функция 69, подфункция 1 ======================
3775
========= Получить состояние регистров отлаживаемого потока. =========
3776
======================================================================
3777
Параметры:
3778
  * eax = 69 - номер функции
3779
  * ebx = 1 - номер подфункции
3780
  * ecx = идентификатор потока
3781
  * edx = длина структуры контекста, должно быть 0x28=40 байт
3782
Возвращаемое значение:
3783
  * функция не возвращает значения
3784
Формат структуры контекста: (FPU пока не поддерживается)
3785
  * +0: dword: eip
3786
  * +4: dword: eflags
3787
  * +8: dword: eax
3788
  * +12 = +0xC: dword: ecx
3789
  * +16 = +0x10: dword: edx
3790
  * +20 = +0x14: dword: ebx
3791
  * +24 = +0x18: dword: esp
3792
  * +28 = +0x1C: dword: ebp
3793
  * +32 = +0x20: dword: esi
3794
  * +36 = +0x24: dword: edi
3795
Замечания:
3796
  * Если поток выполняет код 0-кольца, возвращается
3797
    состояние регистров 3-кольца.
3798
  * Процесс должен быть загружен для отладки (как указано в
3799
    общем описании).
3800
 
3801
======================================================================
3802
====================== Функция 69, подфункция 2 ======================
3803
======== Установить состояние регистров отлаживаемого потока. ========
3804
======================================================================
3805
Параметры:
3806
  * eax = 69 - номер функции
3807
  * ebx = 2 - номер подфункции
3808
  * ecx = идентификатор потока
3809
  * edx = длина структуры контекста, должно быть 0x28=40 байт
3810
Возвращаемое значение:
3811
  * функция не возвращает значения
3812
Формат структуры контекста указан в описании подфункции 1.
3813
Замечания:
3814
  * Если поток выполняет код 0-кольца, устанавливается
3815
    состояние регистров 3-кольца.
3816
  * Процесс должен быть загружен для отладки (как указано в
3817
    общем описании).
3818
 
3819
======================================================================
3820
== Функция 69, подфункция 3 - отключиться от отлаживаемого процесса. =
3821
======================================================================
3822
Параметры:
3823
  * eax = 69 - номер функции
3824
  * ebx = 3 - номер подфункции
3825
  * ecx = идентификатор
3826
Возвращаемое значение:
3827
  * функция не возвращает значения
3828
Замечания:
3829
  * Если процесс был приостановлен, он возобновляет выполнение.
3830
 
3831
======================================================================
3832
==== Функция 69, подфункция 4 - приостановить отлаживаемый поток. ====
3833
======================================================================
3834
Параметры:
3835
  * eax = 69 - номер процесса
3836
  * ebx = 4 - номер подфункции
3837
  * ecx = идентификатор
3838
Возвращаемое значение:
3839
  * функция не возвращает значения
3840
Замечания:
3841
  * Процесс должен быть загружен для отладки (как указано в
3842
    общем описании).
3843
 
3844
======================================================================
3845
====================== Функция 69, подфункция 5 ======================
3846
============ Возобновить выполнение отлаживаемого потока. ============
3847
======================================================================
3848
Параметры:
3849
  * eax = 69 - номер функции
3850
  * ebx = 5 - номер подфункции
3851
  * ecx = идентификатор
3852
Возвращаемое значение:
3853
  * функция не возвращает значения
3854
Замечания:
3855
  * Процесс должен быть загружен для отладки (как указано в
3856
    общем описании).
3857
 
3858
======================================================================
3859
====================== Функция 69, подфункция 6 ======================
3860
============= Прочитать из памяти отлаживаемого процесса. ============
3861
======================================================================
3862
Параметры:
3863
  * eax = 69 - номер функции
3864
  * ebx = 6 - номер подфункции
3865
  * ecx = идентификатор
3866
  * edx = сколько байт читать
3867
  * esi = адрес памяти отлаживаемого процесса
3868
  * edi = указатель на буфер для данных
3869
Возвращаемое значение:
3870
  * eax = -1 при ошибке (неверный PID или буфер)
3871
  * иначе eax = число прочитанных байт (возможно, 0,
3872
    если в esi слишком большое значение)
3873
Замечания:
3874
  * Процесс должен быть загружен для отладки (как указано в
3875
    общем описании).
3876
 
3877
======================================================================
3878
 Функция 69, подфункция 7 - записать в память отлаживаемого процесса.
3879
======================================================================
3880
Параметры:
3881
  * eax = 69 - номер функции
3882
  * ebx = 7 - номер подфункции
3883
  * ecx = идентификатор
3884
  * edx = сколько байт писать
3885
  * esi = адрес памяти в отлаживаемом процессе
3886
  * edi = указатель на данные
3887
Возвращаемое значение:
3888
  * eax = -1 при ошибке (неверный PID или буфер)
3889
  * иначе eax = число записанных байт (возможно, 0,
3890
    если в esi слишком большое значение)
3891
Замечания:
3892
  * Процесс должен быть загружен для отладки (как указано в
3893
    общем описании).
3894
 
3895
======================================================================
3896
====== Функция 69, подфункция 8 - завершить отлаживаемый поток. ======
3897
======================================================================
3898
Параметры:
3899
  * eax = 69 - номер функции
3900
  * ebx = 8 - номер подфункции
3901
  * ecx = идентификатор
3902
Возвращаемое значение:
3903
  * функция не возвращает значения
3904
Замечания:
3905
  * Процесс должен быть загружен для отладки (как указано в
3906
    общем описании).
3907
  * Функция аналогична подфункции 2 функции 18 с двумя отличиями:
3908
    требуется выполнение первого замечания и принимается PID,
3909
    а не номер слота.
3910
 
3911
======================================================================
3912
====================== Функция 69, подфункция 9 ======================
3913
============= Установить/снять аппаратную точку останова. ============
3914
======================================================================
3915
Параметры:
3916
  * eax = 69 - номер функции
3917
  * ebx = 9 - номер подфункции
3918
  * ecx = идентификатор потока
3919
  * dl = индекс точки останова, от 0 до 3 включительно
3920
  * dh = флаги:
3921
    * если старший бит сброшен - установить точку останова:
3922
      * биты 0-1 - условие:
3923
        * 00 = точка останова на выполнение
3924
        * 01 = точка останова на запись
3925
        * 11 = точка останова на чтение/запись
3926
      * биты 2-3 - длина; для точек останова на исполнение должно быть
3927
        00, в противном случае одно из
3928
        * 00 = байт
3929
        * 01 = слово
3930
        * 11 = двойное слово
3931
      * esi = адрес точки останова; должен быть выровнен
3932
        соответственно длине (т.е. должен быть чётным для
3933
        точек останова на слово, кратен 4 для двойного слова)
3934
    * если старший бит установлен - сбросить точку останова
3935
Возвращаемое значение:
3936
  * eax = 0 - успешно
3937
  * eax = 1 - ошибка во входных данных
3938
  * eax = 2 - (зарезервировано, никогда не возвращается
3939
    в текущей реализации) с этим индексом уже установлена
3940
    глобальная точка останова
3941
Замечания:
3942
  * Процесс должен быть загружен для отладки (как указано в
3943
    общем описании).
3944
  * Аппаратные точки останова реализуются через DRx-регистры
3945
    процессора, отсюда все ограничения.
3946
  * Функция может переустановить ранее установленную ей же
3947
    точку останова (никак не сообщая об этом).
3948
    Ведите список установленных точек останова в отладчике.
3949
  * Срабатывание точки останова заключается в генерировании
3950
    отладочного исключения #DB, о котором система сообщает отладчику.
3951
  * Точка останова на запись и чтение/запись срабатывает после
3952
    выполнения вызвавшей её инструкции.
3953
 
3954
======================================================================
3955
= Функция 70 - работа с файловой системой с поддержкой длинных имён. =
3956
======================================================================
3957
Параметры:
3958
  * eax = 70
3959
  * ebx = указатель на информационную структуру
3960
Возвращаемое значение:
3961
  * eax = 0 - успешно; иначе код ошибки файловой системы
3962
  * в зависимости от подфункции может возвращаться значение и
3963
    в других регистрах
3964
Общий формат информационной структуры:
3965
  * +0: dword: номер подфункции
3966
  * +4: dword: смещение в файле
91 diamond 3967
  * +8: dword: старший dword смещения (должен быть 0) или поле флагов
77 diamond 3968
  * +12 = +0xC: dword: размер
3969
  * +16 = +0x10: dword: указатель на данные
3970
  * +20 = +0x14: n db: ASCIIZ-строка с именем файла
86 diamond 3971
    или
3972
  * +20 = +0x14: db 0
3973
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
77 diamond 3974
Уточнения - в документации на соответствующую подфункцию.
3975
Имя файла нечувствительно к регистру букв. Русские буквы должны быть
3976
записаны в кодировке cp866 (DOS).
3977
Формат имени файла:
3978
/base/number/dir1/dir2/.../dirn/file,
3979
где /base/number идентифицирует устройство, на котором ищется файл:
3980
одно из
3981
  * /RD/1 = /RAMDISK/1 для доступа к рамдиску
3982
  * /FD/1 = /FLOPPYDISK/1 для доступа к первому флоппи-дисководу,
3983
    /FD/2 = /FLOPPYDISK/2 для второго флоппи-дисковода
3984
  * /HD0/x, /HD1/x, /HD2/x, /HD3/x для доступа соответственно
91 diamond 3985
    к жёстким дискам на IDE0 (Primary Master), IDE1 (Primary Slave),
77 diamond 3986
    IDE2 (Secondary Master), IDE3 (Secondary Slave);
3987
    x - номер раздела на выбранном винчестере, изменяется от 1 до 255
3988
    (на каждом из винчестеров нумерация начинается с 1)
91 diamond 3989
  * /CD0/1, /CD1/1, /CD2/1, /CD3/1 для доступа соответственно
3990
    к CD на IDE0 (Primary Master), IDE1 (Primary Slave),
3991
    IDE2 (Secondary Master), IDE3 (Secondary Slace)
77 diamond 3992
Примеры:
83 diamond 3993
  * '/rd/1/kernel.asm',0
77 diamond 3994
  * '/HD0/1/kernel.asm',0
3995
  * '/hd0/2/menuet/pics/tanzania.bmp',0
3996
  * '/hd0/1/Program files/NameOfProgram/SomeFile.SomeExtension',0
3997
Доступные подфункции:
3998
  * подфункция 0 - чтение файла
3999
  * подфункция 1 - чтение папки
83 diamond 4000
  * подфункция 2 - создание/перезапись файла
86 diamond 4001
  * подфункция 5 - получение атрибутов файла/папки
4002
  * подфункция 6 - установка атрибутов файла/папки
91 diamond 4003
  * подфункция 7 - запуск программы
77 diamond 4004
 
4005
======================================================================
4006
= Функция 70, подфункция 0 - чтение файла с поддержкой длинных имён. =
4007
======================================================================
4008
Параметры:
4009
  * eax = 70 - номер функции
4010
  * ebx = указатель на информационную структуру
4011
Формат информационной структуры:
4012
  * +0: dword: 0 = номер подфункции
4013
  * +4: dword: позиция в файле (в байтах)
4014
  * +8: dword: 0 (зарезервировано под старший dword позиции)
4015
  * +12 = +0xC: dword: сколько байт читать
4016
  * +16 = +0x10: dword: указатель на буфер, куда будут записаны данные
4017
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
4018
    общем описании
86 diamond 4019
    или
4020
  * +20 = +0x14: db 0
4021
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
77 diamond 4022
Возвращаемое значение:
4023
  * eax = 0 - успешно, иначе код ошибки файловой системы
4024
  * ebx = число прочитанных байт или
4025
    -1=0xffffffff, если файл не найден
4026
Замечания:
4027
  * Если файл кончился раньше, чем был прочитан последний запрошенный
4028
    блок, то функция прочитает, сколько сможет, после чего вернёт
4029
    eax=6 (EOF).
4030
  * Функция не позволяет читать папки
4031
    (вернётся eax=10, access denied).
4032
 
4033
======================================================================
4034
= Функция 70, подфункция 1 - чтение папки с поддержкой длинных имён. =
4035
======================================================================
4036
Параметры:
4037
  * eax = 70 - номер функции
4038
  * ebx = указатель на информационную структуру
4039
Формат информационной структуры:
4040
  * +0: dword: 1 = номер подфункции
4041
  * +4: dword: индекс начального блока (считая с 0)
78 diamond 4042
  * +8: dword: поле флагов:
4043
    * бит 0 (маска 1): в каком формате возвращать имена,
4044
      0=ANSI, 1=UNICODE
4045
    * прочие биты зарезервированы и должны быть установлены в 0
4046
      для будущей совместимости
77 diamond 4047
  * +12 = +0xC: dword: сколько блоков читать
4048
  * +16 = +0x10: dword: указатель на буфер, куда будут записаны
4049
    данные, размер буфера должен быть не меньше 32 + [+12]*560 байт
4050
  * +20 = +0x14: ASCIIZ-имя папки, правила формирования имён указаны в
4051
    общем описании
86 diamond 4052
    или
4053
  * +20 = +0x14: db 0
4054
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
77 diamond 4055
Возвращаемое значение:
4056
  * eax = 0 - успешно, иначе код ошибки файловой системы
4057
  * ebx = число файлов, информация о которых была записана в буфер,
4058
    или -1=0xffffffff, если папка не найдена
4059
Структура буфера:
4060
  * +0: 32*byte: заголовок
4061
  * +32 = +0x20: n1*byte: блок с информацией о файле 1
4062
  * +32+n1: n2*byte: блок с информацией о файле 2
4063
  * ...
4064
Структура заголовка:
4065
  * +0: dword: версия структуры (текущая версия = 1)
4066
  * +4: dword: количество размещённых блоков; не больше, чем запрошено
4067
    в поле +12 информационной структуры; может быть меньше,
4068
    если в папке кончились файлы (то же самое, что и в ebx)
4069
  * +8: dword: общее число файлов в папке
4070
  * +12 = +0xC: 20*byte: зарезервировано (нули)
4071
Структура блока данных входа каталога (БДВК):
4072
  * +0: dword: атрибуты файла:
4073
    * бит 0 (маска 1): файл только для чтения
4074
    * бит 1 (маска 2): файл является скрытым
4075
    * бит 2 (маска 4): файл является системным
4076
    * бит 3 (маска 8): это не файл, а метка тома
4077
      (на заданном разделе встречается не более одного раза и
4078
      только в корневой папке)
4079
    * бит 4 (маска 0x10): это папка
4080
    * бит 5 (маска 0x20): файл не архивировался - многие программы
4081
      архивации имеют опцию, по которой архивируются только файлы
4082
      с установленным этим битом, после чего этот бит сбрасывается -
4083
      это может быть полезно для автоматического создания
4084
      backup-архивов, ибо при записи бит обычно устанавливается
4085
      (не в Kolibri, правда)
78 diamond 4086
  * +4: byte: тип данных имени:
4087
    (совпадает с битом 0 флагов информационной структуры)
77 diamond 4088
    * 0 = ASCII = 1-байтное представление каждого символа
4089
    * 1 = UNICODE = 2-байтное представление каждого символа
4090
  * +5: 3*byte: зарезервировано (нули)
4091
  * +8: 4*byte: время создания файла
4092
  * +12 = +0xC: 4*byte: дата создания файла
4093
  * +16 = +0x10: 4*byte: время последнего доступа (чтение или запись)
4094
  * +20 = +0x14: 4*byte: дата последнего доступа
4095
  * +24 = +0x18: 4*byte: время последней модификации
4096
  * +28 = +0x1C: 4*byte: дата последней модификации
4097
  * +32 = +0x20: qword: размер файла в байтах (до 16777216 Тб)
4098
  * +40 = +0x28: имя
4099
    * для формата ASCII: максимальная длина имени 263 символа
4100
      (263 байта), байт после имени имеет значение 0
4101
    * для формата UNICODE: максимальная длина имени 259 символов
4102
      (518 байт), два байта после имени имеют значение 0
4103
Формат времени:
4104
  * +0: byte: секунды
4105
  * +1: byte: минуты
4106
  * +2: byte: часы
4107
  * +3: byte: зарезервировано (0)
4108
  * например, 23.59.59 записывается как (в hex) 3B 3B 17 00
4109
Формат даты:
4110
  * +0: byte: день
4111
  * +1: byte: месяц
4112
  * +2: word: год
4113
  * например, 25.11.1979 записывается как (в hex) 19 0B BB 07
4114
Замечания:
4115
  * Если в БДВК присутствует имя в ASCII, то длина БДВК составляет
4116
    304 байта, если в UNICODE - 560 байт. Значение длины выравнено
4117
    на целое кратное 16 байт
4118
    (для ускорения обработки в кэш-памяти CPU).
78 diamond 4119
  * Первый символ после имени нулевой (ASCIIZ-строка). Дальнейшие
4120
    данные содержат мусор.
77 diamond 4121
  * Если файлы в папке кончились раньше, чем было прочитано
4122
    запрошенное количество, то функция прочитает, сколько сможет,
4123
    после чего вернёт eax=6 (EOF).
4124
  * Любая папка на диске, кроме корневой, содержит два специальных
4125
    входа "." и "..", идентифицирующих соответственно саму папку и
4126
    родительскую папку.
4127
  * Функция позволяет также читать виртуальные папки "/", "/rd",
4128
    "/fd", "/hd[n]", при этом атрибуты подпапок полагаются равными
4129
    0x10, а времена и даты обнулены. Альтернативный способ получения
4130
    информации об оборудовании - подфункция 11 функции 18.
4131
 
4132
======================================================================
83 diamond 4133
====================== Функция 70, подфункция 2 ======================
4134
======== Создание/перезапись файла с поддержкой длинных имён. ========
4135
======================================================================
4136
Параметры:
4137
  * eax = 70 - номер функции
4138
  * ebx = указатель на информационную структуру
4139
Формат информационной структуры:
4140
  * +0: dword: 2 = номер подфункции
4141
  * +4: dword: 0 (зарезервировано)
4142
  * +8: dword: 0 (зарезервировано)
4143
  * +12 = +0xC: dword: сколько байт писать
4144
  * +16 = +0x10: dword: указатель на данные
4145
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
4146
    общем описании
86 diamond 4147
    или
4148
  * +20 = +0x14: db 0
4149
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
83 diamond 4150
Возвращаемое значение:
4151
  * eax = 0 - успешно, иначе код ошибки файловой системы
4152
  * ebx = число записанных байт (возможно, 0)
4153
Замечания:
4154
  * Если файл с таким именем не существовал, он создаётся; если
4155
    существовал, то перезаписывается.
4156
  * Если свободного места на диске недостаточно, то функция запишет,
4157
    сколько сможет, после чего вернёт код ошибки 8.
4158
 
4159
======================================================================
86 diamond 4160
=== Функция 70, подфункция 5 - получение информации о файле/папке. ===
4161
======================================================================
4162
Параметры:
4163
  * eax = 70 - номер функции
4164
  * ebx = указатель на информационную структуру
4165
Формат информационной структуры:
4166
  * +0: dword: 5 = номер подфункции
4167
  * +4: dword: 0 (зарезервировано)
4168
  * +8: dword: 0 (зарезервировано)
4169
  * +12 = +0xC: dword: 0 (зарезервировано)
4170
  * +16 = +0x10: dword: указатель на буфер, куда будут записаны данные
4171
                        (40 байт)
4172
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
4173
    общем описании
4174
    или
4175
  * +20 = +0x14: db 0
4176
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
4177
Возвращаемое значение:
4178
  * eax = 0 - успешно, иначе код ошибки файловой системы
4179
  * ebx разрушается
4180
Информация о файле возвращается в формате БДВК
4181
(блока данных входа каталога), указанном в описании
4182
подфункции 1, но без имени файла
4183
(то есть первые 40 = 0x28 байт).
4184
Замечания:
4185
  * Функция не поддерживает виртуальные папки типа /, /rd и
4186
    корневые папки типа /rd/1.
4187
 
4188
======================================================================
4189
===== Функция 70, подфункция 6 - установка атрибутов файла/папки. ====
4190
======================================================================
4191
Параметры:
4192
  * eax = 70 - номер функции
4193
  * ebx = указатель на информационную структуру
4194
Формат информационной структуры:
4195
  * +0: dword: 6 = номер подфункции
4196
  * +4: dword: 0 (зарезервировано)
4197
  * +8: dword: 0 (зарезервировано)
4198
  * +12 = +0xC: dword: 0 (зарезервировано)
4199
  * +16 = +0x10: dword: указатель на буфер с атрибутами (32 байта)
4200
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
4201
    общем описании
4202
    или
4203
  * +20 = +0x14: db 0
4204
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
4205
Возвращаемое значение:
4206
  * eax = 0 - успешно, иначе код ошибки файловой системы
4207
  * ebx разрушается
4208
Атрибуты файла - первые 32 байта в БДВК (блоке данных входа каталога),
4209
формат которого указан в описании подфункции 1
4210
(то есть без имени и размера файла). Атрибут файл/папка/метка тома
4211
(биты 3,4 в dword'е +0) не меняется.
4212
Байт +4 (формат имени) игнорируется.
4213
Замечания:
4214
  * Функция не поддерживает виртуальные папки типа /, /rd и
4215
    корневые папки типа /rd/1.
4216
 
4217
======================================================================
91 diamond 4218
============ Функция 70, подфункция 7 - запуск программы. ============
4219
======================================================================
4220
Параметры:
4221
  * eax = 70 - номер функции
4222
  * ebx = указатель на информационную структуру
4223
Формат информационной структуры:
4224
  * +0: dword: 7 = номер подфункции
4225
  * +4: dword: поле флагов:
4226
    * бит 0: запустить процесс как отлаживаемый
4227
    * остальные биты зарезервированы и должны быть установлены в 0
4228
  * +8: dword: 0 или указатель на ASCIIZ-строку с параметрами
4229
  * +12 = +0xC: dword: 0 (зарезервировано)
4230
  * +16 = +0x10: dword: 0 (зарезервировано)
4231
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
4232
    общем описании
4233
    или
4234
  * +20 = +0x14: db 0
4235
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
4236
Возвращаемое значение:
4237
  * eax > 0 - программа загружена, eax содержит PID
4238
  * eax < 0 - произошла ошибка, -eax содержит
4239
    код ошибки файловой системы
4240
  * ebx разрушается
4241
Замечания:
4242
  * Командная строка должна заканчиваться символом с кодом 0
4243
    (ASCIIZ-строка); учитываются либо все символы до завершающего нуля
4244
    включительно, либо первые 256 символов, в зависимости от того,
4245
    что меньше.
4246
  * Если процесс запускается как отлаживаемый, он создаётся
4247
    в замороженном состоянии; для запуска используйте
4248
    подфункцию 5 функции 69.
4249
 
4250
======================================================================
77 diamond 4251
========== Функция -1 - завершить выполнение потока/процесса =========
4252
======================================================================
4253
Параметры:
4254
  * eax = -1 - номер функции
4255
Возвращаемое значение:
4256
  * функция не возвращает ни значения, ни управления
4257
Замечания:
4258
  * Если процесс явно не создавал потоков, то у него есть только
4259
    один поток, завершение которого приводит к завершению процесса.
4260
  * Если текущий поток - последний в процессе, то его завершение
4261
    также приводит к завершению процесса.
4262
  * Эта функция завершает текущий поток. Другой поток можно прибить
4263
    вызовом подфункции 2 функции 18.
4264
 
4265
======================================================================
4266
=========================== Список событий ===========================
4267
======================================================================
4268
Очередное событие можно получить вызовом одной из функций 10
4269
(ожидать события), 11 (проверить без ожидания), 23
4270
(ожидать в течение заданного времени).
4271
Эти функции возвращают только те события, которые входят в маску,
4272
устанавливаемую функцией 40. По умолчанию это первые три, чего
4273
вполне достаточно для многих приложений.
4274
Коды событий:
4275
  * 1 = сообщение о перерисовке (сбрасывается при вызове функции 0)
4276
  * 2 = нажата клавиша на клавиатуре (поступает, только когда окно
4277
    активно; сбрасывается, когда все клавиши из буфера
4278
    считаны функцией 2)
4279
  * 3 = нажата кнопка, определённая ранее функцией 8 (или кнопка
4280
    закрытия, созданная неявно функцией 0; кнопка минимизации
4281
    обрабатывается системой и о ней сообщения не приходит;
4282
    поступает, только когда окно активно; сбрасывается, когда все
4283
    кнопки из буфера считаны функцией 17)
4284
  * 4 = зарезервировано (в текущей реализации никогда не приходит даже
4285
    при размаскировке функцией 40)
4286
  * 5 = перерисовывается фон рабочего стола (сбрасывается
4287
    автоматически после перерисовки, так что если во время перерисовки
4288
    фона программа не ждёт и не проверяет события, то этого события
4289
    она не заметит)
4290
  * 6 = событие от мыши (что-то случилось - нажатие на кнопку мыши
4291
    или перемещение; сбрасывается при прочтении)
4292
  * 7 = произошло событие IPC (смотри функцию 60 - Inter Process
4293
    Communication; сбрасывается при прочтении)
4294
  * 8 = произошло сетевое событие (сбрасывается при прочтении;
4295
    смотри работу с сетью)
4296
  * 9 = произошло отладочное событие (сбрасывается при прочтении;
4297
    смотри отладочную подсистему)
4298
  * 16..31 = произошло событие с соответствующим IRQ
4299
    (16=IRQ0, 31=IRQ15) (сбрасывается при считывании всех данных IRQ)
4300
 
4301
======================================================================
4302
==================== Коды ошибок файловой системы ====================
4303
======================================================================
4304
  * 0 = успешно
4305
  * 1 = не определена база и/или раздел жёсткого диска (подфункциями
4306
    7, 8 функции 21)
4307
  * 2 = функция не поддерживается для данной файловой системы
4308
    (возвращается в случае попытки LBA-чтения при запрещённом LBA)
4309
  * 3 = неизвестная файловая система
4310
  * 4 = возвращается только функцией rename при передаче сильно
4311
    неверного параметра и никак не соответствует описанию
4312
    в исходниках ядра "partition not defined at hd"
4313
  * 5 = файл не найден
4314
  * 6 = файл закончился
4315
  * 7 = указатель вне памяти приложения
4316
  * 8 = диск заполнен
4317
  * 9 = таблица FAT разрушена
4318
  * 10 = доступ запрещён
83 diamond 4319
  * 11 = ошибка устройства
77 diamond 4320
При запуске программы возможны также следующие коды ошибок:
4321
  * 30 = 0x1E = недостаточно памяти
4322
  * 31 = 0x1F = файл не является исполнимым
4323
  * 32 = 0x20 = слишком много процессов