Subversion Repositories Kolibri OS

Rev

Rev 83 | Rev 86 | 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
======================================================================
584
========= Функция 18, подфункция 2 - завершить процесс/поток. ========
585
======================================================================
586
Параметры:
587
  * eax = 18 - номер функции
588
  * ebx = 2 - номер подфункции
589
  * ecx = номер слота процесса/потока
590
Возвращаемое значение:
591
  * функция не возвращает значения
592
Замечания:
593
  * Нельзя завершить поток операционной системы OS/IDLE (номер слота
594
    1), можно завершить любой обычный поток/процесс.
595
 
596
======================================================================
597
= Функция 18, подфункция 3 - сделать активным окно заданного потока. =
598
======================================================================
599
Параметры:
600
  * eax = 18 - номер функции
601
  * ebx = 3 - номер подфункции
602
  * ecx = номер слота потока
603
Возвращаемое значение:
604
  * функция не возвращает значения
605
Замечания:
606
  * При указании корректного, но несуществующего слота активизируется
607
    какое-то окно.
608
  * Узнать, какое окно является активным, можно вызовом подфункции 7.
609
 
610
======================================================================
611
 Функция 18, подфункция 4 - получить счётчик пустых тактов в секунду.
612
======================================================================
613
Под пустыми тактами понимается время, в которое процессор простаивает
614
в ожидании прерывания (в инструкции hlt).
615
 
616
Параметры:
617
  * eax = 18 - номер функции
618
  * ebx = 4 - номер подфункции
619
Возвращаемое значение:
620
  * eax = значение счётчика пустых тактов в секунду
621
 
622
======================================================================
623
======== Функция 18, подфункция 5 - получить тактовую частоту. =======
624
======================================================================
625
Параметры:
626
  * eax = 18 - номер функции
627
  * ebx = 5 - номер подфункции
628
Возвращаемое значение:
629
  * eax = тактовая частота (по модулю 2^32 тактов = 4ГГц)
630
 
631
======================================================================
632
 Функция 18, подфункция 6 - сохранить рамдиск в файл на жёстком диске.
633
======================================================================
634
Параметры:
635
  * eax = 18 - номер функции
636
  * ebx = 6 - номер подфункции
637
  * ecx определяет путь к файлу:
638
    * 1 = в папке "/KOLIBRI"
639
    * 2 = в корневом каталоге
640
    * 3 = edx указывает на путь (имена папок в формате 8+3,
641
      разделённые '/')
642
Возвращаемое значение:
643
  * eax = 0 - успешно
644
  * иначе eax = код ошибки файловой системы
645
Замечания:
646
  * Имя файла фиксировано, "menuet.img" (глобальная переменная ядра
647
    image_save из preboot.inc)
648
  * На каком разделе какого диска файл будет сохранён, определяется
649
    подфункцией 7 и подфункцией 8 функции 21.
650
  * Ядро предполагает, что во время записи никакая другая программа
651
    не будет обращаться к жёсткому диску.
652
  * Все папки в указанном пути должны существовать, иначе вернётся
653
    значение 5, "файл не найден".
654
 
655
======================================================================
656
====== Функция 18, подфункция 7 - получить номер активного окна. =====
657
======================================================================
658
Параметры:
659
  * eax = 18 - номер функции
660
  * ebx = 7 - номер подфункции
661
Возвращаемое значение:
662
  * eax = номер активного окна (номер слота потока, окно которого
663
    активно)
664
Замечания:
665
  * Активное окно находится вверху оконного стэка и получает
666
    сообщения обо всём вводе с клавиатуры.
667
  * Сделать окно активным можно вызовом подфункции 3.
668
 
669
======================================================================
670
==== Функция 18, подфункция 8 - отключить/разрешить звук спикера. ====
671
======================================================================
672
При отключённом звуке вызовы подфункции 55 функции 55 игнорируются.
673
При включённом - направляются на встроенный спикер.
674
 
675
--------------- Подподфункция 1 - получить состояние. ----------------
676
Параметры:
677
  * eax = 18 - номер функции
678
  * ebx = 8 - номер подфункции
679
  * ecx = 1 - номер подподфункции
680
Возвращаемое значение:
681
  * eax = 0 - звук спикера разрешён; 1 - запрещён
682
 
683
-------------- Подподфункция 2 - переключить состояние. --------------
684
Переключает состояния разрешения/запрещения.
685
Параметры:
686
  * eax = 18 - номер функции
687
  * ebx = 8 - номер подфункции
688
  * ecx = 2 - номер подподфункции
689
Возвращаемое значение:
690
  * функция не возвращает значения
691
 
692
======================================================================
693
= Функция 18, подфункция 9 - завершение работы системы с параметром. =
694
======================================================================
695
Параметры:
696
  * eax = 18 - номер функции
697
  * ebx = 9 - номер подфункции
698
  * ecx = параметр:
699
    * 1 = на последнем шаге завершения работы сохранить рамдиск на
700
      дискету, после чего вывести меню выхода и запросить у
701
      пользователя дальнейшие действия
702
    * 2 = выключить компьютер
703
    * 3 = перезагрузить компьютер
704
    * 4 = перезапустить ядро из файла kernel.mnt на рамдиске
705
Возвращаемое значение:
706
  * при неверном ecx регистры не меняются (т.е. eax=18)
707
  * при правильном вызове всегда возвращается признак успеха eax=0
708
Замечания:
709
  * Не следует полагаться на возвращаемое значение при неверном
710
    вызове, оно может измениться в последующих версиях ядра.
711
  * Можно использовать подфункцию 1, чтобы на последнем шаге
712
    завершения работы пользователь сам решал, что ему нужно.
713
  * Не рекомендуется использовать значение ecx=1 (чтобы не раздражать
714
    пользователя излишними вопросами); сохранить рамдиск на дискету
715
    можно функцией 16 (которая допускает уточнение, на какую именно
716
    дискету писать), а завершить работу с меню выхода можно уже
717
    упомянутой подфункцией 1.
718
 
719
======================================================================
720
======== Функция 18, подфункция 10 - свернуть окно приложения. =======
721
======================================================================
722
Сворачивает собственное окно.
723
Параметры:
724
  * eax = 18 - номер функции
725
  * ebx = 10 - номер подфункции
726
Возвращаемое значение:
727
  * функция не возвращает значения
728
Замечания:
729
  * Минимизированное окно с точки зрения функции 9 сохраняет положение
730
    и размеры.
731
  * Восстановление окна приложения происходит при активизировании
732
    подфункцией 3.
733
  * Обычно нет необходимости явно сворачивать/разворачивать своё окно:
734
    сворачивание окна осуществляется системой при нажатии на кнопку
735
    минимизации (которая для окон со скином определяется автоматически
736
    функцией 0, для окон без скина её можно определить функцией 8),
737
    восстановление - приложением @panel.
738
 
739
======================================================================
740
====================== Функция 18, подфункция 11 =====================
741
============= Получить информацию о дисковой подсистеме. =============
742
======================================================================
743
Параметры:
744
  * eax = 18 - номер функции
745
  * ebx = 11 - номер подфункции
746
  * ecx = тип таблицы:
747
    * 1 = короткая версия, 10 байт
748
    * 2 = полная версия, 65536 байт
749
  * edx = указатель на буфер (в приложении) для таблицы
750
Возвращаемое значение:
751
  * функция не возвращает значения
752
Формат таблицы: короткая версия:
753
  * +0: byte: информация о НГМД (дисководах для дискет), AAAABBBB,
754
    где AAAA задаёт тип первого дисковода, BBBB - второго согласно
755
    следующему списку:
756
    * 0 = нет дисковода
757
    * 1 = 360Kb, 5.25''
758
    * 2 = 1.2Mb, 5.25''
759
    * 3 = 720Kb, 3.5''
760
    * 4 = 1.44Mb, 3.5''
761
    * 5 = 2.88Mb, 3.5'' (такие дискеты сейчас уже не используются)
762
    Например, для стандартной конфигурации из одного 1.44-дисковода
763
    здесь будет 40h, а для случая 1.2Mb на A: и 1.44Mb на B:
764
    значение оказывается 24h.
765
  * +1: byte: информация о жёстких дисках и CD-приводах, AABBCCDD,
766
    где AA соответствует контроллеру IDE0, ..., DD - IDE3:
767
    * 0 = устройство отсутствует
768
    * 1 = жёсткий диск
769
    * 2 = CD-привод
770
    Например, в случае HD на IDE0 и CD на IDE2 здесь будет 48h.
771
  * +2: 4 db: число найденных разделов на жёстких дисках с
772
    соответственно IDE0,...,IDE3.
773
    При отсутствии жёсткого диска на IDEx соответствующий байт
774
    нулевой, при наличии показывает число распознанных разделов,
775
    которых может и не быть (если носитель не отформатирован или
776
    если файловая система не поддерживается). В текущей версии ядра
777
    для жёстких дисков поддерживаются только FAT16 и FAT32.
778
  * +6: 4 db: зарезервировано
779
Формат таблицы: полная версия:
780
  * +0: 10 db: такие же, как и в короткой версии
781
  * +10: 100 db: данные для первого раздела
782
  * +110: 100 db: данные для второго раздела
783
  * ...
784
  * +10+100*(n-1): 100 db: данные для последнего раздела
785
Разделы расположены в следующем порядке: сначала последовательно все
786
распознанные разделы на HD на IDE0 (если есть),
787
затем на HD на IDE1 (если есть) и т.д. до IDE3.
788
Формат информации о разделе (пока поддерживается только FAT):
789
  * +0: dword: начальный физический сектор раздела
790
  * +4: dword: последний физический сектор раздела
791
    (принадлежит разделу)
792
  * +8: dword: секторов в одной копии FAT
793
  * +12 = +0xC: dword: число копий FAT
794
  * +16 = +0x10: dword: число секторов в кластере
795
  * +20 = +0x14: dword: байт в секторе; текущая реализация ожидает,
796
    что здесь 0x200 = 512
797
  * +24 = +0x18: dword: первый кластер корневого каталога в FAT32,
798
 
799
  * +28 = +0x1C: dword: начальный физический сектор FAT
800
  * +32 = +0x20: dword: первый физический сектор корневого каталога
801
    для FAT16, игнорируется для FAT32
802
  * +36 = +0x24: dword: число секторов в корневом каталоге для FAT16,
803
 
804
  * +40 = +0x28: dword: физический сектор начала области данных
805
  * +44 = +0x2C: dword: максимальный номер кластера
806
  * +48 = +0x30: dword: физический сектор информации о
807
    файловой системе для FAT32, игнорируется для FAT16
808
  * +52 = +0x34: dword: значение, используемое как граница
809
    специальных значений в FAT
810
  * +56 = +0x38: dword: значение, используемое для плохих кластеров
811
    в FAT
812
  * +60 = +0x3C: dword: значение, используемое как маркер конца
813
    при записи цепочки в FAT
814
  * +64 = +0x40: dword: маска, накладываемая на элемент FAT
815
  * +68 = +0x44: byte: тип файловой системы: 16 или 32
816
  * +69 = +0x45: 31 db: зарезервировано
817
Замечания:
818
  * Короткая таблица может быть использована для получения информации
819
    об имеющихся устройствах.
820
  * Первые два поля информации о разделе в полной версии таблицы
821
    сообщают параметры раздела, оставшиеся - параметры файловой
822
    системы FAT. Для других файловых систем (когда они будут
823
    поддерживаться) специфическая для файловой системы информация,
824
    естественно, будет другой, но первые два поля
825
    сохранятся неизменными.
826
 
827
======================================================================
828
=== Функция 18, подфункция 12 - получить последнюю нажатую клавишу. ==
829
======================================================================
830
Параметры:
831
  * eax = 18 - номер функции
832
  * ebx = 12 - номер подфункции
833
Возвращаемое значение:
834
  * al = режим ввода с клавиатуры (0=ASCII,1=сканкоды), который
835
    имел место при обработке нажатия последней клавиши на клавиатуре
836
  * ah = код последней нажатой клавиши
837
  * старшее слово регистра eax обнулено
838
Замечания:
839
  * Только эта функция позволяет считывать клавиши, во время
840
    считывания которых из буфера была нажата клавиша Alt, функция 2
841
    в случае, когда при её вызове была нажата Alt, возвращает
842
    "буфер пуст", тем не менее считывая клавишу из очереди в
843
    глобальную системную переменную last_key_press и продвигая очередь
844
    вперёд.
845
  * После считывания код последней нажатой клавиши сбрасывается в 0.
846
    Следовательно, не стоит использовать эту функцию в двух различных
847
    программах (и даже два раза в одной программе).
848
  * Приложение @panel использует эту функцию для реагирования
849
    на Alt+F4, Alt+Win, Alt+Ctrl+F12.
850
  * last_key_press обновляется в точности в следующих случаях:
851
    * Обнуляется при вызове описываемой функции.
852
    * Когда управление получает некоторая процедура
853
      (main_loop_sys_getkey) главного цикла операционной системы:
854
      если буфер непуст, то первая клавиша буфера копируется в
855
      last_key_press (и не забирается из очереди).
856
    * При вызове функции 2: если буфер непуст, то считанная клавиша
857
      копируется в last_key_press (и возвращается приложению,
858
      вызвавшему функцию 2, но только если в момент считывания
859
      не нажата Alt).
860
  * Поскольку при активизации окна сбрасываются очереди клавиш и
861
    кнопок, то в большинстве случаев интерпретация ah соответствует al
862
    (т.е. понятно, что хранится в ah - ASCII-код или сканкод).
863
    Тем не менее возможны неприятные случаи, когда активное окно,
864
    не заботясь об оставшихся в буфере клавишах, вызывает функцию 66,
865
    переключаясь между режимами; если после этого пользователь нажмёт
866
    на клавишу, то значение переменной, соответствующей al, изменится,
867
    а начальные клавиши в буфере останутся в старом режиме.
868
 
869
======================================================================
870
========== Функция 18, подфункция 13 - получить версию ядра. =========
871
======================================================================
872
Параметры:
873
  * eax = 18 - номер функции
874
  * ebx = 13 - номер подфункции
875
  * ecx = указатель на буфер (не менее 16 байт), куда будет помещена
876
    информация
877
Возвращаемое значение:
878
  * функция не возвращает значения
879
Структура буфера:
880
db a,b,c,d для версии a.b.c.d
881
db UID_xxx: одно из UID_NONE=0, UID_MENUET=1, UID_KOLIBRI=2
882
db 'name',0 - ASCIIZ-строка с именем
883
Для ядра Kolibri 0.5.3.1:
884
db 0,5,3,1
885
db 2
886
db 'Kolibri',0
887
 
888
======================================================================
889
====================== Функция 18, подфункция 14 =====================
890
======= Ожидать начала обратного хода луча развёртки монитора. =======
891
======================================================================
892
Параметры:
893
  * eax = 18 - номер функции
894
  * ebx = 14 - номер подфункции
895
Возвращаемое значение:
896
  * eax = 0 как признак успеха
897
Замечания:
898
  * Функция предназначена исключительно для активных
899
    высокопроизводительных графических приложений; используется для
900
    плавного вывода графики.
901
 
902
======================================================================
903
== Функция 18, подфункция 15 - поместить курсор мыши в центр экрана. =
904
======================================================================
905
Параметры:
906
  * eax = 18 - номер функции
907
  * ebx = 15 - номер подфункции
908
Возвращаемое значение:
909
  * eax = 0 как признак успеха
910
 
911
======================================================================
912
====================== Функция 18, подфункция 16 =====================
913
============ Получить размер свободной оперативной памяти. ===========
914
======================================================================
915
Параметры:
916
  * eax = 18 - номер функции
917
  * ebx = 16 - номер подфункции
918
Возвращаемое значение:
919
  * eax = размер свободной памяти в килобайтах
920
 
921
======================================================================
922
====================== Функция 18, подфункция 17 =====================
923
============ Получить размер имеющейся оперативной памяти. ===========
924
======================================================================
925
Параметры:
926
  * eax = 18 - номер функции
927
  * ebx = 17 - номер подфункции
928
Возвращаемое значение:
929
  * eax = общий размер имеющейся памяти в килобайтах
930
 
931
======================================================================
85 halyavin 932
====================== Функция 18б подфункция 18 =====================
933
===================== Завершение процесса по PID'у ===================
934
======================================================================
935
Параметры:
936
  * eax = 18 - номер функции
937
  * ebx = 18 - номер подфункции
938
  * ecx = PID
939
Возращаемое значение:
940
  * eax = 0 - процесс завершен.
941
  * eax = -1 - ошибка. (процесс с таким PID не существует или является
942
    системным)
943
 
944
 
945
======================================================================
77 diamond 946
============ Функция 19 - запустить программу с рамдиска. ============
947
======================================================================
948
Параметры:
949
  * eax = 19 - номер функции
950
  * ebx = указатель на имя программы в формате, аналогичном функции 6
951
  * ecx = 0 или ecx = указатель на параметры командной строки
952
Возвращаемое значение:
953
  * Если eax > 0, то eax содержит PID созданного процесса
954
  * Если eax < 0, то -eax - код ошибки файловой системы
955
Замечания:
956
  * Эта функция устарела; используйте подфункцию 16 функции 58.
957
  * Комадная строка должна заканчиваться символом с кодом 0
958
    (ASCIIZ-строка); учитываются либо все символы до завершающего нуля
959
    включительно, либо первые 256 символов, в зависимости от того,
960
    что меньше.
961
 
962
======================================================================
963
==================== Функция 20 - интерфейс MIDI. ====================
964
======================================================================
965
 
966
------------------------ Подфункция 1 - сброс ------------------------
967
Параметры:
968
  * eax = 20 - номер функции
969
  * ebx = 1 - номер подфункции
970
 
971
-------------------- Подфункция 2 - вывести байт ---------------------
972
Параметры:
973
  * eax = 20 - номер функции
974
  * ebx = 2 - номер подфункции
975
  * cl = байт для вывода
976
Возвращаемое значение (одинаково для обеих подфункций):
977
  * eax = 0 - успешно
978
  * eax = 1 - не определён базовый порт
979
Замечания:
980
  * Предварительно должен быть определён базовый порт вызовом
981
    подфункции 1 функции 21.
982
 
983
======================================================================
984
==== Функция 21, подфункция 1 - установить базовый порт MPU MIDI. ====
985
======================================================================
986
Параметры:
987
  * eax = 21 - номер функции
988
  * ebx = 1 - номер подфункции
989
  * ecx = номер базового порта
990
Возвращаемое значение:
991
  * eax = 0 - успешно
992
  * eax = -1 - ошибочный номер порта
993
Замечания:
994
  * Номер порта должен удовлетворять условиям 0x100<=ecx<=0xFFFF.
995
  * Установка базы нужна для работы функции 20.
996
  * Получить установленный базовый порт можно вызовом
997
    подфункции 1 функции 26.
998
 
999
======================================================================
1000
===== Функция 21, подфункция 2 - установить раскладку клавиатуры. ====
1001
======================================================================
1002
Раскладка клавиатуры используется для преобразования сканкодов,
1003
поступающих от клавиатуры, в ASCII-коды, считываемые функцией 2.
1004
Параметры:
1005
  * eax = 21 - номер функции
1006
  * ebx = 2 - номер подфункции
1007
  * ecx = какую раскладку устанавливать:
1008
    * 1 = нормальную
1009
    * 2 = раскладку при нажатом Shift
1010
    * 3 = раскладку при нажатом Alt
1011
  * edx = указатель на раскладку - таблицу длиной 128 байт
1012
Или:
1013
  * ecx = 9
1014
  * dx = идентификатор страны (1=eng, 2=fi, 3=ger, 4=rus)
1015
Возвращаемое значение:
1016
  * eax = 0 - успешно
1017
  * eax = 1 - параметр задан неверно
1018
Замечания:
1019
  * Если нажат Alt, то используется раскладка с Alt;
1020
    если не нажат Alt, но нажат Shift, то
1021
    используется раскладка с Shift;
1022
    если не нажаты Alt и Shift, но нажат Ctrl, то используется
1023
    нормальная раскладка, после чего из кода вычитается 0x60;
1024
    если не нажата ни одна из управляющих клавиш, то используется
1025
    нормальная раскладка.
1026
  * Ценность установки раскладки с Alt представляется сомнительной,
1027
    поскольку всё равно функция 2 не возвращает клавиши при
1028
    нажатом Alt.
1029
  * Получить раскладки и идентификатор страны можно с помощью
1030
    подфункции 2 функции 26.
1031
  * Идентификатор страны - глобальная системная переменная, которая
1032
    самим ядром не используется; однако приложение @panel отображает
1033
    соответствующую текущей стране иконку.
1034
  * Приложение @panel переключает раскладки по запросу пользователя.
1035
 
1036
======================================================================
1037
=========== Функция 21, подфункция 3 - установить базу CD. ===========
1038
======================================================================
1039
Параметры:
1040
  * eax = 21 - номер функции
1041
  * ebx = 3 - номер подфункции
1042
  * ecx = база CD: 1=IDE0, 2=IDE1, 3=IDE2, 4=IDE3
1043
Возвращаемое значение:
1044
  * eax = 0
1045
Замечания:
1046
  * База CD используется функцией 24.
1047
  * Получить установленную базу CD можно вызовом
1048
    подфункции 3 функции 26.
1049
 
1050
======================================================================
1051
== Функция 21, подфункция 4 - установить базовый порт Sound Blaster. =
1052
======================================================================
1053
Параметры:
1054
  * eax = 21 - номер функции
1055
  * ebx = 4 - номер подфункции
1056
  * ecx = номер базового порта
1057
Возвращаемое значение:
1058
  * eax = 0 - успешно
1059
  * eax = -1 - ошибочный номер порта
1060
Замечания:
1061
  * Номер порта должен удовлетворять условиям 0x100<=ecx<=0xFFFF.
1062
  * Установка базы нужна для работы функций 25, 28, 55.
1063
  * Получить установленный базовый порт можно вызовом
1064
    подфункции 4 функции 26.
1065
 
1066
======================================================================
1067
========= Функция 21, подфункция 5 - установить язык системы. ========
1068
======================================================================
1069
Параметры:
1070
  * eax = 21 - номер функции
1071
  * ebx = 5 - номер подфункции
1072
  * ecx = язык системы (1=eng, 2=fi, 3=ger, 4=rus)
1073
Возвращаемое значение:
1074
  * eax = 0
1075
Замечания:
1076
  * Язык системы - глобальная системная переменная, никак
1077
    не используемая самим ядром, однако приложение @panel рисует
1078
    соответствующую иконку.
1079
  * Проверок на корректность не делается, поскольку ядро эту
1080
    переменную не использует.
1081
  * Получить язык системы можно вызовом подфункции 5 функции 26.
1082
 
1083
======================================================================
1084
======= Функция 21, подфункция 6 - установить базовый порт WSS. ======
1085
======================================================================
1086
Параметры:
1087
  * eax = 21 - номер функции
1088
  * ebx = 6 - номер подфункции
1089
  * ecx = базовый порт
1090
Возвращаемое значение:
1091
  * eax = 0 - успешно
1092
  * eax = -1 - ошибочный номер порта
1093
Замечания:
1094
  * Номер порта должен удовлетворять условию 0x100<=ecx.
1095
  * База WSS используется функцией 27.
1096
  * Получить установленный базовый порт WSS можно вызовом
1097
    подфункции 6 функции 26.
1098
 
1099
======================================================================
1100
=========== Функция 21, подфункция 7 - установить базу HD. ===========
1101
======================================================================
1102
База HD нужна для определения, на какой жёсткий диск писать, при
1103
использовании устаревших функций работы с файловой системой и функций,
1104
неявно использующих жёсткий диск (типа подфункции 6 функции 18);
1105
при использовании функций 58 и 70 и современного синтаксиса
1106
/HD0,/HD1,/HD2,/HD3 эти функции сами устанавливают базу.
1107
Параметры:
1108
  * eax = 21 - номер функции
1109
  * ebx = 7 - номер подфункции
1110
  * ecx = база HD: 1=IDE0, 2=IDE1, 3=IDE2, 4=IDE3
1111
Возвращаемое значение:
1112
  * eax = 0
1113
Замечания:
1114
  * Любое приложение в любой момент времени может изменить базу.
1115
  * Не следует изменять базу, когда какое-нибудь приложение работает
1116
    с жёстким диском. Если не хотите глюков системы.
1117
  * Получить установленную базу можно вызовом подфункции 7 функции 26.
1118
  * Следует также определить используемый раздел жёсткого диска
1119
    подфункцией 8.
1120
 
1121
======================================================================
1122
========== Функция 21, подфункция 8 - установить раздел HD. ==========
1123
======================================================================
1124
Раздел HD нужен для определения, на какой раздел жёсткого диска
1125
писать, при использовании устаревших функций работы с файловой
1126
системой и функций, неявно использующих жёсткий диск (типа
1127
подфункции 6 функции 18); при использовании функций 58 и 70
1128
и современного синтаксиса /HD0,/HD1,/HD2,/HD3 эти функции сами
1129
устанавливают базу и раздел.
1130
Параметры:
1131
  * eax = 21 - номер функции
1132
  * ebx = 8 - номер подфункции
1133
  * ecx = раздел HD (считая с 1)
1134
Возвращаемое значение:
1135
  * eax = 0
1136
Замечания:
1137
  * Любое приложение в любой момент времени может изменить раздел.
1138
  * Не следует изменять раздел, когда какое-нибудь приложение работает
1139
    с жёстким диском. Если не хотите глюков системы.
1140
  * Получить установленный раздел можно вызовом подфункции 8
1141
    функции 26.
1142
  * Проверок на корректность не делается.
1143
  * Узнать число разделов на жёстком диске можно вызовом
1144
    подфункции 11 функции 18.
1145
  * Следует также определить используемую базу жёсткого диска
1146
    подфункцией 7.
1147
 
1148
======================================================================
1149
===== Функция 21, подфункция 10 - установить канал DMA для звука. ====
1150
======================================================================
1151
Параметры:
1152
  * eax = 21 - номер функции
1153
  * ebx = 10 - номер подфункции
1154
  * ecx = номер канала (от 0 до 3 включительно)
1155
Возвращаемое значение:
1156
  * eax = 0 - успешно
1157
  * eax = -1 - неверный номер канала
1158
Замечания:
1159
  * Номер канала DMA используется в
1160
    подфункции 1 функции 55.
1161
  * Получить канал DMA для звука можно вызовом
1162
    подфункции 10 функции 26.
1163
 
1164
======================================================================
1165
====================== Функция 21, подфункция 11 =====================
1166
=========== Разрешить/запретить низкоуровневый доступ к HD. ==========
1167
======================================================================
1168
Параметры:
1169
  * eax = 21 - номер функции
1170
  * ebx = 11 - номер подфункции
1171
  * ecx = 0/1 - запретить/разрешить
1172
Возвращаемое значение:
1173
  * eax = 0
1174
Замечания:
1175
  * Используется при LBA-чтении (подфункция 8 функции 58).
1176
  * Текущая реализация использует только младший бит ecx.
1177
  * Получить текущее состояние можно вызовом подфункции 11 функции 26.
1178
 
1179
======================================================================
1180
====================== Функция 21, подфункция 12 =====================
1181
========== Разрешить/запретить низкоуровневый доступ к PCI. ==========
1182
======================================================================
1183
Параметры:
1184
  * eax = 21 - номер функции
1185
  * ebx = 12 - номер подфункции
1186
  * ecx = 0/1 - запретить/разрешить
1187
Возвращаемое значение:
1188
  * eax = 0
1189
Замечания:
1190
  * Используется при работе с шиной PCI (функция 62).
1191
  * Текущая реализация использует только младший бит ecx.
1192
  * Получить текущее состояние можно вызовом подфункции 12 функции 26.
1193
 
1194
======================================================================
1195
============= Функция 21, подфункция 13, подподфункция 1 =============
1196
==== Инициализировать + получить информацию о драйвере vmode.mdr. ====
1197
======================================================================
1198
Параметры:
1199
  * eax = 21 - номер функции
1200
  * ebx = 13 - номер подфункции
1201
  * ecx = 1 - номер функции драйвера
1202
  * edx = указатель на буфер размера 512 байт
1203
Возвращаемое значение:
1204
  * если драйвер не загружен (никогда не бывает в текущей реализации):
1205
    * eax = -1
1206
    * ebx, ecx разрушаются
1207
  * если драйвер загружен:
1208
    * eax = 'MDAZ' (в стиле fasm'а, т.е. 'M' - младший байт,
1209
      'Z' - старший) - сигнатура
1210
    * ebx = текущая частота развёртки (в Гц)
1211
    * ecx разрушается
1212
    * буфер, на который указывает edx, заполнен
1213
Формат буфера:
1214
  * +0: 32*byte: имя драйвера, "Trans VideoDriver" (без кавычек,
1215
    дополнено пробелами)
1216
  * +32 = +0x20: dword: версия драйвера (версия x.y кодируется как
1217
    y*65536+x), для текущей реализации 1 (1.0)
1218
  * +36 = +0x24: 7*dword: зарезервировано (0 в текущей реализации)
1219
  * +64 = +0x40: 32*word: список поддерживаемых видеорежимов (каждое
1220
    слово - номер видеорежима, после собственно списка идут нули)
1221
  * +128 = +0x80: 32*(5*word): список поддерживаемых частот развёрток
1222
    для видеорежимов: для каждого видеорежима, указанного в предыдущем
1223
    поле, указано до 5 поддерживаемых частот
1224
    (в неиспользуемых позициях записаны нули)
1225
Замечания:
1226
  * Функция инициализирует драйвер (если он ещё не инициализирован)
1227
    и должна вызываться первой, перед остальными (иначе они будут
1228
    возвращать -1, ничего не делая).
1229
  * В текущей реализации поддерживается только одна частота развёртки
1230
    на видеорежим.
1231
 
1232
======================================================================
1233
============= Функция 21, подфункция 13, подподфункция 2 =============
1234
============= Получить информацию о текущем видеорежиме. =============
1235
======================================================================
1236
Параметры:
1237
  * eax = 21 - номер функции
1238
  * ebx = 13 - номер подфункции
1239
  * ecx = 2 - номер функции драйвера
1240
Возвращаемое значение:
1241
  * eax = -1 - драйвер не загружен или не инициализирован;
1242
    ebx,ecx разрушаются
1243
  * eax = [ширина]*65536 + [высота]
1244
  * ebx = частота вертикальной развёртки (в Гц)
1245
  * ecx = номер текущего видеорежима
1246
Замечания:
1247
  * Драйвер предварительно должен быть инициализирован вызовом
1248
    функции драйвера 1.
1249
  * Если нужны только размеры экрана, целесообразней использовать
1250
    функцию 14 с учётом того, что она возвращает размеры на 1 меньше.
1251
 
1252
======================================================================
1253
= Функция 21, подфункция 13, подподфункция 3 - установить видеорежим.
1254
======================================================================
1255
Параметры:
1256
  * eax = 21 - номер функции
1257
  * ebx = 13 - номер подфункции
1258
  * ecx = 3 - номер функции драйвера
1259
  * edx = [частота развёртки]*65536 + [номер видеорежима]
1260
Возвращаемое значение:
1261
  * eax = -1 - драйвер не загружен, не инициализирован или
1262
    произошла ошибка
1263
  * eax = 0 - успешно
1264
  * ebx, ecx разрушаются
1265
Замечания:
1266
  * Драйвер предварительно должен быть инициализирован вызовом
1267
    функции драйвера 1.
1268
  * Номер видеорежима и частота должны быть в таблице, возвращаемой
1269
    функцией драйвера 1.
1270
 
1271
======================================================================
1272
============= Функция 21, подфункция 13, подподфункция 4 =============
1273
================= Вернуться к начальному видеорежиму. ================
1274
======================================================================
1275
Возвращает экран в видеорежим, установленный при загрузке системы.
1276
Параметры:
1277
  * eax = 21 - номер функции
1278
  * ebx = 13 - номер подфункции
1279
  * ecx = 4 - номер функции драйвера
1280
Возвращаемое значение:
1281
  * eax = -1 - драйвер не загружен или не инициализирован
1282
  * eax = 0 - успешно
1283
  * ebx, ecx разрушаются
1284
Замечания:
1285
  * Драйвер предварительно должен быть инициализирован вызовом
1286
    функции драйвера 1.
1287
 
1288
======================================================================
1289
============= Функция 21, подфункция 13, подподфункция 5 =============
1290
======== Увеличить/уменьшить размер видимой области монитора. ========
1291
======================================================================
1292
Параметры:
1293
  * eax = 21 - номер функции
1294
  * ebx = 13 - номер подфункции
1295
  * ecx = 5 - номер функции драйвера
1296
  * edx = 0/1 - уменьшить/увеличить размер по горизонтали
1297
    на одну позицию
1298
  * edx = 2/3 - в текущей реализации не поддерживается; планируется
1299
    как уменьшение/увеличение размера по вертикали на одну позицию
1300
Возвращаемое значение:
1301
  * eax = -1 - драйвер не загружен или не инициализирован
1302
  * eax = 0 - успешно
1303
  * ebx, ecx разрушаются
1304
Замечания:
1305
  * Драйвер предварительно должен быть инициализирован вызовом
1306
    функции драйвера 1.
1307
  * Функция влияет только на физический размер изображения
1308
    на мониторе; логический размер (число пикселей) не меняется.
1309
 
1310
======================================================================
1311
============ Функция 22 - установить системную дату/время. ===========
1312
======================================================================
1313
Параметры:
1314
  * eax = 22 - номер функции
1315
  * ebx = 0 - установить время
1316
    * ecx = 0x00SSMMHH - время в двоично-десятичном коде (BCD):
1317
    * HH=час 00..23
1318
    * MM=минута 00..59
1319
    * SS=секунда 00..59
1320
  * ebx = 1 - установить дату
1321
    * ecx = 0x00DDMMYY - дата в двоично-десятичном коде (BCD):
1322
    * DD=день 01..31
1323
    * MM=месяц 01..12
1324
    * YY=год 00..99
1325
  * ebx = 2 - установить день недели
1326
    * ecx = 1 для воскресенья, ..., 7 для субботы
1327
  * ebx = 3 - установить будильник
1328
    * ecx = 0x00SSMMHH
1329
Возвращаемое значение:
1330
  * eax = 0 - успешно
1331
  * eax = 1 - параметр задан неверно
1332
  * eax = 2 - CMOS-батарейки разрядились
1333
Замечания:
1334
  * Ценность установки дня недели представляется сомнительной,
1335
    поскольку он мало где используется
1336
    (день недели можно рассчитать по дате).
1337
  * Будильник можно установить на срабатывание в заданное время
1338
    каждые сутки. При этом отключить его существующими системными
1339
    функциями нельзя.
1340
  * Срабатывание будильника заключается в генерации IRQ8.
1341
  * Вообще-то CMOS поддерживает для будильника установку значения
1342
    0xFF в качестве одного из параметров и означает это, что
1343
    соответствующий параметр игнорируется. Но в текущей реализации
1344
    это не пройдёт (вернётся значение 1).
1345
  * Будильник - глобальный системный ресурс; установка будильника
1346
    автоматически отменяет предыдущую установку. Впрочем, на данный
1347
    момент ни одна программа его не использует.
1348
 
1349
======================================================================
1350
============== Функция 23 - ожидать события с таймаутом. =============
1351
======================================================================
1352
Если очередь сообщений пуста, ждёт появления сообщения в очереди,
1353
но не более указанного времени. Затем считывает сообщение из очереди.
1354
 
1355
Параметры:
1356
  * eax = 23 - номер функции
1357
  * ebx = таймаут (в сотых долях секунды)
1358
Возвращаемое значение:
1359
  * eax = 0 - очередь сообщений пуста
1360
  * иначе eax = событие (смотри список событий)
1361
Замечания:
1362
  * Учитываются только те события, которые входят в маску,
1363
    устанавливаемую функцией 40. По умолчанию это события
1364
    перерисовки, нажатия на клавиши и на кнопки.
1365
  * Для проверки, есть ли сообщение в очереди, используйте функцию 11.
1366
    Чтобы ждать сколь угодно долго, используйте функцию 10.
1367
  * Передача ebx=0 приводит к моментальному возвращению eax=0.
1368
  * При текущей реализации произойдёт немедленный возврат из функции
1369
    с eax=0, если сложение ebx с текущим значением счётчика времени
1370
    вызовет 32-битное переполнение.
1371
 
1372
======================================================================
1373
======= Функция 24, подфункция 1 - начать проигрывать CD-audio. ======
1374
======================================================================
1375
Параметры:
1376
  * eax = 24 - номер функции
1377
  * ebx = 1 - номер подфункции
1378
  * ecx = 0x00FRSSMM, где
1379
    * MM = начальная минута
1380
    * SS = начальная секунда
1381
    * FR = начальный фрейм
1382
Возвращаемое значение:
1383
  * eax = 0 - успешно
1384
  * eax = 1 - не определена база CD
1385
Замечания:
1386
  * Предварительно нужно определить базовый порт CD вызовом
1387
    подфункции 3 функции 21.
1388
  * В секунде 75 фреймов, в минуте 60 секунд.
1389
  * Функция асинхронна (возвращает управление, когда началось
1390
    проигрывание).
1391
 
1392
======================================================================
1393
===== Функция 24, подфункция 2 - получить информацию о дорожках. =====
1394
======================================================================
1395
Параметры:
1396
  * eax = 24 - номер функции
1397
  * ebx = 2 - номер подфункции
1398
  * ecx = указатель на буфер для таблицы
1399
    (максимум 8*64h+4 байт=100 дорожек)
1400
Возвращаемое значение:
1401
  * eax = 0 - успешно
1402
  * eax = 1 - не определена база CD
1403
Замечания:
1404
  * Формат таблицы с информацией о дорожках такой же, как и для
1405
    ATAPI-CD команды 43h (READ TOC), обычной таблицы (подкоманда 00h).
1406
    Адреса возвращаются в формате MSF.
1407
  * Предварительно нужно определить базовый порт CD вызовом
1408
    подфункции 3 функции 21.
1409
  * Функция возвращает информацию только о не более чем 100
1410
    первых дорожках. В большинстве случаев этого достаточно.
1411
 
1412
======================================================================
1413
==== Функция 24, подфункция 3 - остановить проигрываемое CD-audio. ===
1414
======================================================================
1415
Параметры:
1416
  * eax = 24 - номер функции
1417
  * ebx = 1 - номер подфункции
1418
Возвращаемое значение:
1419
  * eax = 0 - успешно
1420
  * eax = 1 - не определена база CD
1421
Замечания:
1422
  * Предварительно нужно определить базовый порт CD вызовом
1423
    подфункции 3 функции 21.
1424
 
1425
======================================================================
1426
============== Функция 25 - установить громкость SBPro. ==============
1427
======================================================================
1428
Параметры:
1429
  * eax = 25 - номер функции
1430
  * ebx = что устанавливать:
1431
    * 1 - установить общую громкость
1432
    * 2 - установить громкость CD-audio
1433
  * cl = уровень громкости: старшие 4 бита для левой колонки,
1434
    младшие 4 - для правой
1435
Возвращаемое значение:
1436
  * eax = 0 - успешно
1437
  * eax = 1 - не определена база SB
1438
  * eax = 2 - неверная подфункция
1439
Замечания:
1440
  * Предварительно нужно определить базовый порт SB вызовом
1441
    подфункции 4 функции 21.
1442
  * Смотри также функцию 28
1443
    установки звука для более позднего стандарта SB16.
1444
 
1445
======================================================================
1446
===== Функция 26, подфункция 1 - получить базовый порт MPU MIDI. =====
1447
======================================================================
1448
Параметры:
1449
  * eax = 26 - номер функции
1450
  * ebx = 1 - номер подфункции
1451
Возвращаемое значение:
1452
  * eax = номер порта
1453
Замечания:
1454
  * Установить базовый порт можно вызовом
1455
    подфункции 1 функции 21.
1456
 
1457
======================================================================
1458
====== Функция 26, подфункция 2 - получить раскладку клавиатуры. =====
1459
======================================================================
1460
Раскладка клавиатуры используется для преобразования сканкодов,
1461
поступающих от клавиатуры, в ASCII-коды, считываемые функцией 2.
1462
Параметры:
1463
  * eax = 26 - номер функции
1464
  * ebx = 2 - номер подфункции
1465
  * ecx = какую раскладку получать:
1466
    * 1 = нормальную
1467
    * 2 = раскладку при нажатом Shift
1468
    * 3 = раскладку при нажатом Alt
1469
  * edx = указатель на буфер длиной 128 байт, куда будет скопирована
1470
    раскладка
1471
Возвращаемое значение:
1472
  * функция не возвращает значения
1473
Или:
1474
  * eax = 26 - номер функции
1475
  * ebx = 2 - номер подфункции
1476
  * ecx = 9
1477
Возвращаемое значение:
1478
  * eax = идентификатор страны (1=eng, 2=fi, 3=ger, 4=rus)
1479
Замечания:
1480
  * Если нажат Alt, то используется раскладка с Alt;
1481
    если не нажат Alt, но нажат Shift, то используется
1482
    раскладка с Shift;
1483
    если не нажаты Alt и Shift, но нажат Ctrl, то используется
1484
    нормальная раскладка, после чего из кода вычитается 0x60;
1485
    если не нажата ни одна из управляющих клавиш, то используется
1486
    нормальная раскладка.
1487
  * Установить раскладки и идентификатор страны можно с помощью
1488
    подфункции 2 функции 21.
1489
  * Идентификатор страны - глобальная системная переменная, которая
1490
    самим ядром не используется; однако приложение @panel отображает
1491
    соответствующую текущей стране иконку
1492
    (используя описываемую функцию).
1493
  * Приложение @panel переключает раскладки по запросу пользователя.
1494
 
1495
======================================================================
1496
============ Функция 26, подфункция 3 - получить базу CD. ============
1497
======================================================================
1498
Параметры:
1499
  * eax = 26 - номер функции
1500
  * ebx = 3 - номер подфункции
1501
Возвращаемое значение:
1502
  * eax = база CD: 1=IDE0, 2=IDE1, 3=IDE2, 4=IDE3
1503
Замечания:
1504
  * База CD используется функцией 24.
1505
  * Установлить базу CD можно вызовом подфункции 3 функции 21.
1506
 
1507
======================================================================
1508
=== Функция 26, подфункция 4 - получить базовый порт Sound Blaster. ==
1509
======================================================================
1510
Параметры:
1511
  * eax = 26 - номер функции
1512
  * ebx = 4 - номер подфункции
1513
Возвращаемое значение:
1514
  * eax = номер базового порта
1515
Замечания:
1516
  * Установка базы нужна для работы функций 25, 55.
1517
  * Установить базовый порт можно вызовом подфункции 4 функции 21.
1518
 
1519
======================================================================
1520
========== Функция 26, подфункция 5 - получить язык системы. =========
1521
======================================================================
1522
Параметры:
1523
  * eax = 26 - номер функции
1524
  * ebx = 5 - номер подфункции
1525
Возвращаемое значение:
1526
  * eax = язык системы (1=eng, 2=fi, 3=ger, 4=rus)
1527
Замечания:
1528
  * Язык системы - глобальная системная переменная, никак
1529
    не используемая самим ядром, однако приложение @panel рисует
1530
    соответствующую иконку (используя описываемую функцию).
1531
  * Установить язык системы можно вызовом подфункции 5 функции 21.
1532
 
1533
======================================================================
1534
======== Функция 26, подфункция 6 - получить базовый порт WSS. =======
1535
======================================================================
1536
Параметры:
1537
  * eax = 26 - номер функции
1538
  * ebx = 6 - номер подфункции
1539
Возвращаемое значение:
1540
  * eax = базовый порт
1541
Замечания:
1542
  * База WSS используется функцией 27.
1543
  * Установить базовый порт WSS можно вызовом подфункции 6 функции 21.
1544
 
1545
======================================================================
1546
============ Функция 26, подфункция 7 - получить базу HD. ============
1547
======================================================================
1548
База HD нужна для определения, на какой жёсткий диск писать, при
1549
использовании устаревших функций работы с файловой системой и функций,
1550
неявно использующих жёсткий диск (типа подфункции 6 функции 18);
1551
при использовании функций 58 и 70 и современного синтаксиса
1552
/HD0,/HD1,/HD2,/HD3 эти функции сами устанавливают базу.
1553
Параметры:
1554
  * eax = 26 - номер функции
1555
  * ebx = 7 - номер подфункции
1556
Возвращаемое значение:
1557
  * eax = база HD: 1=IDE0, 2=IDE1, 3=IDE2, 4=IDE3
1558
Замечания:
1559
  * Любое приложение в любой момент времени может изменить базу.
1560
  * Установить базу можно вызовом подфункции 7 функции 21.
1561
  * Получить используемый раздел жёсткого диска можно подфункцией 8.
1562
 
1563
======================================================================
1564
=========== Функция 26, подфункция 8 - получить раздел HD. ===========
1565
======================================================================
1566
Раздел HD нужен для определения, на какой раздел жёсткого диска
1567
писать, при использовании устаревших функций работы с файловой
1568
системой и функций, неявно использующих жёсткий диск (типа
1569
подфункции 6 функции 18); при использовании функций 58 и 70 и
1570
современного синтаксиса /HD0,/HD1,/HD2,/HD3 эти функции сами
1571
устанавливают базу и раздел.
1572
Параметры:
1573
  * eax = 26 - номер функции
1574
  * ebx = 8 - номер подфункции
1575
Возвращаемое значение:
1576
  * eax = раздел HD (считая с 1)
1577
Замечания:
1578
  * Любое приложение в любой момент времени может изменить раздел.
1579
  * Установить раздел можно вызовом подфункции 8 функции 21.
1580
  * Узнать число разделов на жёстком диске можно вызовом
1581
    подфункции 11 функции 18.
1582
  * Получить используемую базу жёсткого диска можно подфункцией 7.
1583
 
1584
======================================================================
1585
=== Функция 26, подфункция 9 - получить значение счётчика времени. ===
1586
======================================================================
1587
Параметры:
1588
  * eax = 26 - номер функции
1589
  * ebx = 9 - номер подфункции
1590
Возвращаемое значение:
1591
  * eax = число сотых долей секунды, прошедших с момента
1592
    запуска системы
1593
Замечания:
1594
  * Счётчик берётся по модулю 2^32, что соответствует немногим более
1595
    497 суток.
1596
  * Системное время можно получить функцией 3.
1597
 
1598
======================================================================
1599
====== Функция 26, подфункция 10 - получить канал DMA для звука. =====
1600
======================================================================
1601
Параметры:
1602
  * eax = 26 - номер функции
1603
  * ebx = 10 - номер подфункции
1604
Возвращаемое значение:
1605
  * eax = номер канала (от 0 до 3 включительно)
1606
Замечания:
1607
  * Номер канала DMA используется в подфункции 1 функции 55.
1608
  * Установить канал DMA для звука можно вызовом
1609
    подфункции 10 функции 21.
1610
 
1611
======================================================================
1612
====================== Функция 26, подфункция 11 =====================
1613
=========== Узнать, разрешён ли низкоуровневый доступ к HD. ==========
1614
======================================================================
1615
Параметры:
1616
  * eax = 26 - номер функции
1617
  * ebx = 11 - номер подфункции
1618
Возвращаемое значение:
1619
  * eax = 0/1 - запрещён/разрешён
1620
Замечания:
1621
  * Используется при LBA-чтении (подфункция 8 функции 58).
1622
  * Установить текущее состояние можно вызовом
1623
    подфункции 11 функции 21.
1624
 
1625
======================================================================
1626
====================== Функция 26, подфункция 12 =====================
1627
========== Узнать, разрешён ли низкоуровневый доступ к PCI. ==========
1628
======================================================================
1629
Параметры:
1630
  * eax = 26 - номер функции
1631
  * ebx = 12 - номер подфункции
1632
Возвращаемое значение:
1633
  * eax = 0/1 - запрещён/разрешён
1634
Замечания:
1635
  * Используется при работе с шиной PCI (функция 62).
1636
  * Текущая реализация использует только младший бит ecx.
1637
  * Установить текущее состояние можно вызовом
1638
    подфункции 12 функции 21.
1639
 
1640
======================================================================
1641
==== Функция 27 - установить громкость Windows Sound System (WSS). ===
1642
======================================================================
1643
Параметры:
1644
  * eax = 27 - номер функции
1645
  * ebx = что устанавливать:
1646
    * 1 - установить общую громкость
1647
    * 2 - установить громкость Line In
1648
  * cl = уровень громкости (0x0=самый высокий, 0x1F=самый низкий,
1649
    установленный бит 0x80=отключить)
1650
Возвращаемое значение:
1651
  * eax = 0 - успешно
1652
  * eax = 1 - не определена база WSS
1653
  * eax = 2 - неверная подфункция
1654
Замечания:
1655
  * Предварительно нужно определить базовый порт WSS вызовом
1656
    подфункции 6 функции 21.
1657
  * Установка общей громкости фактически игнорируется
1658
    (возвращается eax=0).
1659
  * В старой документации и в исходниках ядра подфункция 2
1660
    ошибочно названа громкостью CD-audio.
1661
 
1662
======================================================================
1663
=============== Функция 28 - установить громкость SB16. ==============
1664
======================================================================
1665
Параметры:
1666
  * eax = 28 - номер функции
1667
  * ebx = что устанавливать:
1668
    * 1 - установить общую громкость
1669
    * 2 - установить громкость CD-audio
1670
  * cl = уровень громкости (0=off, 0xFF=max)
1671
Возвращаемое значение:
1672
  * eax = 0 - успешно
1673
  * eax = 1 - не определена база SB
1674
  * eax = 2 - неверная подфункция
1675
Замечания:
1676
  * Предварительно нужно определить базовый порт SB вызовом
1677
    подфункции 4 функции 21.
1678
  * Эта функция предоставляет больше вариантов для громкости,
1679
    чем функция 25.
1680
 
1681
======================================================================
1682
================ Функция 29 - получить системную дату. ===============
1683
======================================================================
1684
Параметры:
1685
  * eax = 29 - номер функции
1686
Возвращаемое значение:
1687
  * eax = 0x00DDMMYY, где
1688
    (используется двоично-десятичное кодирование, BCD)
1689
  * YY = две младшие цифры года (00..99)
1690
  * MM = месяц (01..12)
1691
  * DD = день (01..31)
1692
Замечания:
1693
  * Системную дату можно установить функцией 22.
1694
 
1695
======================================================================
1696
================ Функция 32 - удалить файл с рамдиска. ===============
1697
======================================================================
1698
Параметры:
1699
  * eax = 32 - номер функции
1700
  * ebx = указатель на имя файла
1701
Возвращаемое значение:
1702
  * eax = 0 - успешно; иначе код ошибки файловой системы
1703
Замечания:
1704
  * Эта функция устарела; функция 58 позволяет выполнять
1705
    те же действия с расширенными возможностями.
1706
  * Текущая реализация возвращает только значения 0(успех) и
1707
    5(файл не найден).
1708
  * Имя файла должно быть либо в формате 8+3 символов (первые
1709
    8 символов - собственно имя, последние 3 - расширение,
1710
    короткие имена и расширения дополняются пробелами),
1711
    либо в формате 8.3 символов "FILE.EXT"/"FILE.EX "
1712
    (имя не более 8 символов, точка, расширение 3 символа,
1713
    дополненное при необходимости пробелами).
1714
    Имя файла должно быть записано заглавными буквами.
1715
    Завершающий символ с кодом 0 не нужен (не ASCIIZ-строка).
1716
 
1717
======================================================================
1718
=============== Функция 33 - записать файл на рамдиск. ===============
1719
======================================================================
1720
Параметры:
1721
  * eax = 33 - номер функции
1722
  * ebx = указатель на имя файла
1723
  * ecx = указатель на данные для записи
1724
  * edx = число байт для записи
1725
  * следует устанавливать esi=0
1726
Возвращаемое значение:
1727
  * eax = 0 - успешно, иначе код ошибки файловой системы
1728
Замечания:
1729
  * Эта функция устарела; функция 58 позволяет выполнять
1730
    те же действия с расширенными возможностями.
1731
  * Если указать ненулевое значение в esi и на рамдиске уже есть
1732
    указанный файл, то будет создан ещё один файл с тем же именем.
1733
  * В противном случае файл перезаписывается.
1734
  * Имя файла должно быть либо в формате 8+3 символов
1735
    (первые 8 символов - собственно имя, последние 3 - расширение,
1736
    короткие имена и расширения дополняются пробелами),
1737
    либо в формате 8.3 символов "FILE.EXT"/"FILE.EX "
1738
    (имя не более 8 символов, точка, расширение 3 символа,
1739
    дополненное при необходимости пробелами).
1740
    Имя файла должно быть записано заглавными буквами.
1741
    Завершающий символ с кодом 0 не нужен (не ASCIIZ-строка).
1742
 
1743
======================================================================
1744
============ Функция 35 - прочитать цвет точки на экране. ============
1745
======================================================================
1746
Параметры:
1747
  * eax = 35
1748
  * ebx = y*xsize+x, где
1749
  * (x,y) = координаты точки (считая от 0)
1750
  * xsize = размер экрана по горизонтали
1751
Возвращаемое значение:
1752
  * eax = цвет 0x00RRGGBB
1753
Замечания:
1754
  * Узнать размеры экрана можно вызовом функции 14. Обратите внимание,
1755
    что она вычитает 1 из обоих размеров.
1756
  * К видеопамяти есть также прямой доступ (без вызовов системных
1757
    функций) через селектор gs. Параметры текущего видеорежима
1758
    можно получить функцией 61.
1759
 
1760
======================================================================
1761
========== Функция 37 - получить координаты/состояние мыши. ==========
1762
======================================================================
1763
 
1764
-------------- Подфункция 0 - экранные координаты мыши ---------------
1765
Параметры:
1766
  * eax = 37 - номер функции
1767
  * ebx = 0 - номер подфункции
1768
Возвращаемое значение:
1769
  * eax = x*65536 + y, (x,y)=координаты курсора мыши (считая от 0)
1770
 
1771
---------- Подфункция 1 - координаты мыши относительно окна ----------
1772
Параметры:
1773
  * eax = 37 - номер функции
1774
  * ebx = 1 - номер подфункции
1775
Возвращаемое значение:
1776
  * eax = x*65536 + y, (x,y)=координаты курсора мыши относительно
1777
    окна приложения (считая от 0)
1778
Замечания:
1779
  * Значение вычисляется по формуле (x-xwnd)*65536 + (y-ywnd).
1780
    Если y>=ywnd, то младшее слово неотрицательно и содержит
1781
    относительную y-координату, а старшее - относительную x-координату
1782
    (правильного знака). В противном случае младшее слово отрицательно
1783
    и всё равно содержит относительную y-координату,
1784
    а к старшему слову следует прибавить 1.
1785
 
1786
----------------- Подфункция 2 - нажатые кнопки мыши -----------------
1787
Параметры:
1788
  * eax = 37 - номер функции
1789
  * ebx = 2 - номер подфункции
1790
Возвращаемое значение:
1791
  * eax содержит информацию о нажатых кнопках мыши:
1792
  * бит 0 установлен = левая кнопка нажата
1793
  * бит 1 установлен = правая кнопка нажата
1794
  * прочие биты сброшены
1795
 
1796
======================================================================
1797
================== Функция 38 - нарисовать отрезок. ==================
1798
======================================================================
1799
Параметры:
1800
  * eax = 38 - номер функции
1801
  * ebx = [координата начала по оси x]*65536 +
1802
              [координата конца по оси x]
1803
  * ecx = [координата начала по оси y]*65536 +
1804
              [координата конца по оси y]
1805
  * edx = 0x00RRGGBB - цвет
1806
Возвращаемое значение:
1807
  * функция не возвращает значения
1808
Замечания:
1809
  * Координаты берутся относительно окна.
1810
  * Конечная точка также рисуется.
1811
 
1812
======================================================================
1813
== Функция 39, подфункция 1 - получить размер фонового изображения. ==
1814
======================================================================
1815
Параметры:
1816
  * eax = 39 - номер функции
1817
  * ebx = 1 - номер подфункции
1818
Возвращаемое значение:
1819
  * eax = [ширина]*65536 + [высота]
1820
Замечания:
1821
  * Есть парная команда установки размеров фонового изображения -
1822
    подфункция 1 функции 15. После которой, разумеется, следует
1823
    заново определить само изображение.
1824
 
1825
======================================================================
1826
= Функция 39, подфункция 2 - прочитать точку с фонового изображения. =
1827
======================================================================
1828
Параметры:
1829
  * eax = 39 - номер функции
1830
  * ebx = 2 - номер подфункции
1831
  * ecx = смещение
1832
Возвращаемое значение:
1833
  * eax = 0x00RRGGBB - цвет точки, если смещение допустимо
1834
    (меньше 0x160000-16)
1835
  * eax = 2 - иначе
1836
Замечания:
1837
  * Не следует полагаться на возвращаемое значение в случае неверного
1838
    смещения, оно может измениться в следующих версиях ядра.
1839
  * Смещение точки с координатами (x,y) вычисляется как (x+y*xsize)*3.
1840
  * Есть парная функция установки точки на фоновом изображении -
1841
    подфункция 2 функции 15.
1842
 
1843
======================================================================
1844
====== Функция 39, подфункция 4 - получить режим отрисовки фона. =====
1845
======================================================================
1846
Параметры:
1847
  * eax = 39 - номер функции
1848
  * ebx = 4 - номер подфункции
1849
Возвращаемое значение:
1850
  * eax = 1 - замостить
1851
  * eax = 2 - растянуть
1852
Замечания:
1853
  * Есть парная функция установки режима отрисовки фона -
1854
    подфункция 4 функции 15.
1855
 
1856
======================================================================
1857
======== Функция 40 - установить маску для ожидаемых событий. ========
1858
======================================================================
1859
Маска для ожидаемых событий влияет на функции работы с событиями 10,
1860
11, 23 - они сообщают только о событиях, разрешённых этой маской.
1861
Параметры:
1862
  * eax = 40 - номер функции
1863
  * ebx = маска: бит i соответствует событию i+1 (см. список событий)
1864
    (установленный бит разрешает извещение о событии)
1865
Возвращаемое значение:
1866
  * функция не возвращает значения
1867
Замечания:
1868
  * Маска по умолчанию (7=111b) разрешает извещения о перерисовке
1869
    и нажатиях клавиш и кнопок.
1870
    Этого достаточно для большинства приложений.
1871
  * События, запрещённые в маске, всё равно сохраняются, если
1872
    приходят; о них просто не извещают функции работы с событиями.
1873
  * Функции работы с событиями учитывают маску на момент
1874
    вызова функции, а не на момент поступления сообщения.
1875
 
1876
======================================================================
1877
================= Функция 41 - узнать владельца IRQ. =================
1878
======================================================================
1879
Параметры:
1880
  * eax = 41 - номер функции
1881
  * ebx = номер IRQ, 0..15
1882
Возвращаемое значение:
1883
  * eax = PID владельца
1884
  * eax = 0, если владельца нет
1885
  * eax = -1 для некорректного ebx
1886
 
1887
======================================================================
1888
========== Функция 42 - прочитать данные, полученные по IRQ. =========
1889
======================================================================
1890
При возникновении IRQ система может считывать данные из указанных
1891
ранее функцией 44 портов и записывать эти данные в буфер.
1892
Описываемая функция считывает побайтно данные из этого буфера.
1893
Параметры:
1894
  * eax = 42 - номер функции
1895
  * ebx = номер IRQ, 0..15
1896
Возвращаемое значение: (ситуацию можно различить по значению ecx)
1897
  * если поток не является владельцем IRQ
1898
    (или номер IRQ задан неверно):
1899
    * ecx = 2
1900
  * если данных нет:
1901
    * eax = 0
1902
    * ecx = 1
1903
    * ebx разрушается
1904
  * если всё в порядке и данные были:
1905
    * eax = размер данных, ещё не прочитанных из буфера (в байтах)
1906
    * ecx = 0
1907
    * ebx = очередной байт
1908
Замечания:
1909
  * Предварительно поток должен зарезервировать для себя указанный IRQ
1910
    функцией 45.
1911
  * Размер буфера для данных - 4000 байт, при переполнении
1912
    "свежие" данные перестают записываться в буфер.
1913
 
1914
======================================================================
1915
=================== Функция 43 - ввод/вывод в порт. ==================
1916
======================================================================
1917
 
1918
------------------------ Вывод данных в порт -------------------------
1919
Параметры:
1920
  * eax = 43 - номер функции
1921
  * bl = байт для вывода
1922
  * ecx = номер порта 0xnnnn (от 0 до 0xFFFF)
1923
Возвращаемое значение:
1924
  * eax = 0 - успешно
1925
  * eax = 1 - поток не зарезервировал указанный порт
1926
 
1927
------------------------ Ввод данных из порта ------------------------
1928
Параметры:
1929
  * eax = 43 - номер функции
1930
  * ebx игнорируется
1931
  * ecx = 0x8000nnnn, где nnnn = номер порта (от 0 до 0xFFFF)
1932
Возвращаемое значение:
1933
  * eax = 0 - успешно, при этом ebx = введённый байт
1934
  * eax = 1 - поток не зарезервировал данный порт
1935
Замечания:
1936
  * Предварительно поток должен зарезервировать за собой
1937
    указанный порт функцией 46.
1938
  * Для зарезервированных портов вместо вызова этих функций
1939
    лучше использовать команды процессора in/out - это значительно
1940
    быстрее и несколько короче и проще. Из незарезервированных
1941
    портов читать всё равно нельзя.
1942
 
1943
======================================================================
1944
======== Функция 44 - определить действия при поступлении IRQ. =======
1945
======================================================================
1946
При возникновении IRQ система может считывать данные из указанных этой
1947
функцией портов и записывать эти данные в буфер, откуда их можно
1948
прочитать функцией 42.
1949
Параметры:
1950
  * eax = 44 - номер функции
1951
  * ebx = указатель на массив структур, описывающих по одному порту:
1952
    * +0: word: 0 означает конец массива, иначе номер порта
1953
    * +2: byte: зарезервировано (игнорируется)
1954
    * +3: byte: 1=считывать байт из этого порта, 2=считывать слово
1955
  * ecx = номер IRQ, 0..15
1956
Возвращаемое значение:
1957
  * eax = 0 - успешно
1958
  * eax = 1 - поток не является владельцем указанного IRQ
1959
Замечания:
1960
  * Предварительно поток должен зарезервировать за собой
1961
    указываемый IRQ функцией 45.
1962
  * Принимаются во внимание только первые 16 портов.
1963
  * Текущая реализация рассматривает неправильное значение поля +3
1964
    как сигнал прекращения обработки IRQ.
1965
 
1966
======================================================================
1967
============ Функция 45 - зарезервировать/освободить IRQ. ============
1968
======================================================================
1969
Параметры:
1970
  * eax = 45 - номер функции
1971
  * ebx = 0 - зарезервировать, 1 = освободить
1972
  * ecx = номер IRQ, 0..15
1973
Возвращаемое значение:
1974
  * eax = 0 - успешно
1975
  * eax = 1 - ошибка (неверный номер IRQ или
1976
    попытка зарезервировать несвободный IRQ или освободить IRQ, не
1977
    зарезервированный текущим потоком)
1978
Замечания:
1979
  * Резервирование IRQ нужно для работы функций 42 и 44.
1980
  * Только один поток может зарезервировать конкретный IRQ.
1981
  * IRQ, обрабатываемые системой самостоятельно, резервируются
1982
    системой (потоком 1) при загрузке.
1983
  * При завершении потока автоматически освобождаются
1984
    все зарезервированные им IRQ.
1985
 
1986
======================================================================
1987
= Функция 46 - зарезервировать/освободить группу портов ввода/вывода.
1988
======================================================================
1989
К зарезервированным портам можно обращаться напрямую из приложения
1990
командами in/out (рекомендуемый способ) и вызовом функции 43
1991
(нерекомендуемый способ).
1992
Параметры:
1993
  * eax = 46 - номер функции
1994
  * ebx = 0 - зарезервировать, 1 - освободить
1995
  * ecx = номер начала диапазона портов
1996
  * edx = номер конца диапазона портов (включительно)
1997
Возвращаемое значение:
1998
  * eax = 0 - успешно
1999
  * eax = 1 - ошибка
2000
Замечания:
2001
  * В случае резервирования портов ошибкой считается выполнение
2002
    одного из условий:
2003
    * начальный адрес больше конечного;
2004
    * указанный диапазон содержит некорректный номер порта
2005
      (корректные - от 0 до 0xFFFF);
2006
    * превышено ограничение на общее число зарезервированных областей
2007
      - допускается максимум 255;
2008
    * указанный диапазон пересекается с одним из
2009
      ранее зарезервированных
2010
  * В случае освобождения портов ошибкой считается попытка
2011
    освобождения диапазона, который ранее не был целиком
2012
    зарезервирован этой же функцией (с такими же значениями ecx,edx).
2013
  * При обнаружении ошибки (в обоих случаях) никаких действий
2014
    не производится.
2015
  * При загрузке система резервирует за собой порты 0..0xff, а при
2016
    обнаружении COM-мыши - дополнительно диапазон COM-портов
2017
    0x3f0..0x3ff и/или 0x2f0..0x2ff.
2018
  * При завершении потока автоматически освобождаются все
2019
    зарезервированные им порты.
2020
 
2021
======================================================================
2022
================= Функция 47 - вывести число в окно. =================
2023
======================================================================
2024
Параметры:
2025
  * eax = 47 - номер функции
2026
  * ebx = параметры преобразования числа в текст:
2027
    * bl = 0 - ecx содержит число
2028
    * bl = 1 - ecx содержит указатель на dword-число
2029
    * bh = 0 - отображать в десятичной системе счисления
2030
    * bh = 1 - отображать в шестнадцатеричной системе
2031
    * bh = 2 - отображать в двоичной системе
2032
    * биты 16-21 = сколько цифр отображать
2033
    * биты 22-31 зарезервированы и должны быть установлены в 0
2034
  * ecx = число (при bl=0) или указатель (при bl=1)
2035
  * edx = [координата по оси x]*65536 + [координата по оси y]
2036
  * esi = 0xN0RRGGBB, RRGGBB=цвет, N=шрифт (0/1)
2037
Возвращаемое значение:
2038
  * функция не возвращает значения
2039
Замечания:
2040
  * Указанная длина не должна превосходить 60.
2041
  * Выводится ровно указанное количество цифр. Если число мало и
2042
    может быть записано меньшим количеством цифр, оно дополняется
2043
    ведущими нулями; если число велико и не может быть записано
2044
    таким количеством цифр, "лишние" ведущие цифры обрезаются.
2045
  * Параметры шрифтов указаны в описании функции 4 (вывода текста).
2046
 
2047
======================================================================
2048
======= Функция 48, подфункция 0 - применить настройки экрана. =======
2049
======================================================================
2050
Параметры:
2051
  * eax = 48 - номер функции
2052
  * ebx = 0 - номер подфункции
2053
  * ecx = 0 - зарезервировано
2054
Возвращаемое значение:
2055
  * функция не возвращает значения
2056
Замечания:
2057
  * Функция перерисовывает экран после изменения параметров
2058
    подфункциями 1 и 2.
2059
  * Вызов функции без предшествующих вызовов указанных подфункций
2060
    игнорируется.
2061
  * Вызов функции с ненулевым ecx игнорируется.
2062
 
2063
======================================================================
2064
========= Функция 48, подфункция 1 - установить стиль кнопок. ========
2065
======================================================================
2066
Параметры:
2067
  * eax = 48 - номер функции
2068
  * ebx = 1 - номер подфункции
2069
  * ecx = тип кнопок:
2070
    * 0 = плоские
2071
    * 1 = объёмные
2072
Возвращаемое значение:
2073
  * функция не возвращает значения
2074
Замечания:
2075
  * После вызова описываемой функции следует перерисовать экран
2076
    подфункцией 0.
2077
  * Тип кнопок влияет только на их прорисовку функцией 8.
2078
 
2079
======================================================================
2080
==== Функция 48, подфункция 2 - установить стандартные цвета окон. ===
2081
======================================================================
2082
Параметры:
2083
  * eax = 48 - номер функции
2084
  * ebx = 2 - номер подфункции
2085
  * ecx = указатель на таблицу цветов
2086
  * edx = размер таблицы цветов
2087
    (должен быть 40 байт для будущей совместимости)
2088
Формат таблицы цветов указан в описании подфункции 3.
2089
Возвращаемое значение:
2090
  * функция не возвращает значения
2091
Замечания:
2092
  * После вызова описываемой функции следует перерисовать экран
2093
    подфункцией 0.
2094
  * Таблица стандартных цветов влияет только на приложения,
2095
    которые эту таблицу явным образом получают (подфункцией 3) и
2096
    используют (указывая цвета из неё при вызовах функций рисования).
2097
  * Таблица стандартных цветов входит в скин и устанавливается заново
2098
    при установке скина (подфункции 8).
2099
  * Таблицу цветов можно просматривать/изменять интерактивно с помощью
2100
    приложения desktop.
2101
 
2102
======================================================================
2103
===== Функция 48, подфункция 3 - получить стандартные цвета окон. ====
2104
======================================================================
2105
Параметры:
2106
  * eax = 48 - номер функции
2107
  * ebx = 3 - номер подфункции
2108
  * ecx = указатель на буфер размером edx байт,
2109
    куда будет записана таблица
2110
  * edx = размер таблицы цветов
2111
    (должен быть 40 байт для будущей совместимости)
2112
Возвращаемое значение:
2113
  * функция не возвращает значения
2114
Формат таблицы цветов: каждый элемент -
2115
dword-значение цвета 0x00RRGGBB
2116
  * +0: dword: frames - цвет рамки
2117
  * +4: dword: grab - цвет заголовка
2118
  * +8: dword: grab_button - цвет кнопки на полосе заголовка
2119
  * +12 = +0xC: dword: grab_button_text - цвет текста на кнопке
2120
    на полосе заголовка
2121
  * +16 = +0x10: dword: grab_text - цвет текста на заголовке
2122
  * +20 = +0x14: dword: work - цвет рабочей области
2123
  * +24 = +0x18: dword: work_button - цвет кнопки в рабочей области
2124
  * +28 = +0x1C: dword: work_button_text - цвет текста на кнопке
2125
    в рабочей области
2126
  * +32 = +0x20: dword: work_text - цвет текста в рабочей области
2127
  * +36 = +0x24: dword: work_graph - цвет графики в рабочей области
2128
Замечания:
2129
  * Структура таблицы цветов описана в стандартном включаемом файле
2130
    macros.inc под названием system_colors; например, можно писать:
2131
    	sc	system_colors		; объявление переменной
2132
    	...				; где-то надо вызвать
2133
    					; описываемую функцию с ecx=sc
2134
    	mov	ecx, [sc.work_button_text]	; читаем цвет текста
2135
    					; на кнопке в рабочей области
2136
  * Использование/неиспользование этих цветов - дело исключительно
2137
    самой программы. Для использования нужно просто при вызове функций
2138
    рисования указывать цвет, взятый из этой таблицы.
2139
  * При изменении таблицы стандартных цветов (подфункцией 2 с
2140
    последующим применением изменений подфункцией 0 или
2141
    при установке скина подфункцией 8) всем окнам посылается сообщение
2142
    о необходимости перерисовки (событие с кодом 1).
2143
  * Стандартные цвета можно просматривать/изменять интерактивно
2144
    с помощью приложения desktop.
2145
 
2146
======================================================================
2147
========== Функция 48, подфункция 4 - получить высоту скина. =========
2148
======================================================================
2149
Параметры:
2150
  * eax = 48 - номер функции
2151
  * ebx = 4 - номер подфункции
2152
Возвращаемое значение:
2153
  * eax = высота скина
2154
Замечания:
2155
  * Высотой скина по определению считается высота заголовка окон,
2156
    использующих скин.
2157
  * Смотри также общую структуру окна в описании функции 0.
2158
 
2159
======================================================================
2160
===== Функция 48, подфункция 5 - получить рабочую область экрана. ====
2161
======================================================================
2162
Параметры:
2163
  * eax = 48 - номер функции
2164
  * ebx = 5 - номер подфункции
2165
Возвращаемое значение:
2166
  * eax = [left]*65536 + [right]
2167
  * ebx = [top]*65536 + [bottom]
2168
Замечания:
2169
  * Рабочая область экрана определяет положение и координаты
2170
    максимизированного окна.
2171
  * Рабочая область экрана при нормальной работе есть весь экран
2172
    за вычетом панели (@panel).
2173
  * (left,top) - координаты левого верхнего угла,
2174
    (right,bottom) - координаты правого нижнего.
2175
    Таким образом, размер рабочей области по оси x определяется
2176
    формулой right-left+1, по оси y - формулой bottom-right+1.
2177
  * Смотри также функцию 14,
2178
    позволяющую определить размеры всего экрана.
2179
  * Есть парная функция установки рабочей области - подфункция 6.
2180
 
2181
======================================================================
2182
==== Функция 48, подфункция 6 - установить рабочую область экрана. ===
2183
======================================================================
2184
Параметры:
2185
  * eax = 48 - номер функции
2186
  * ebx = 6 - номер подфункции
2187
  * ecx = [left]*65536 + [right]
2188
  * edx = [top]*65536 + [bottom]
2189
Возвращаемое значение:
2190
  * функция не возвращает значения
2191
Замечания:
2192
  * Рабочая область экрана определяет положение и координаты
2193
    максимизированного окна.
2194
  * Эта функция используется только приложением @panel,
2195
    устанавливающим рабочей областью весь экран за вычетом панели.
2196
  * (left,top) - координаты левого верхнего угла,
2197
    (right,bottom) - координаты правого нижнего.
2198
    Таким образом, размер рабочей области по оси x определяется
2199
    формулой right-left+1, по оси y - формулой bottom-right+1.
2200
  * Если left>=right, то x-координаты рабочей области не изменяются.
2201
    Если left<0, то left не устанавливается. Если right больше
2202
    или равно ширины экрана, то right не устанавливается.
2203
    Аналогично по оси y.
2204
  * Смотри также функцию 14,
2205
    позволяющую определить размеры всего экрана.
2206
  * Есть парная функция получения рабочей области -
2207
    подфункция 5.
2208
  * Эта функция автоматически перерисовывает экран, по ходу дела
2209
    обновляет координаты и положение максимизированных окон.
2210
    Все окна извещаются о необходимости перерисовки (событие 1).
2211
 
2212
======================================================================
2213
====================== Функция 48, подфункция 7 ======================
2214
============ Получить область скина для текста заголовка. ============
2215
======================================================================
2216
Возвращает область заголовка окна со скином, предназначенную
2217
для вывода текста заголовка.
2218
Параметры:
2219
  * eax = 48 - номер функции
2220
  * ebx = 7 - номер подфункции
2221
Возвращаемое значение:
2222
  * eax = [left]*65536 + [right]
2223
  * ebx = [top]*65536 + [bottom]
2224
Замечания:
2225
  * Использование/неиспользование этой функции -
2226
    личное дело приложения.
2227
  * Рекомендуется учитывать значения, возвращаемые этой функцией,
2228
    при выборе места для рисования текста заголовка (функцией 4) или
2229
    какого-нибудь заменителя текста заголовка
2230
    (по усмотрению приложения).
2231
 
2232
======================================================================
2233
==== Функция 48, подфункция 8 - установить используемый скин окон. ===
2234
======================================================================
2235
Параметры:
2236
  * eax = 48 - номер функции
2237
  * ebx = 8 - номер подфункции
2238
  * ecx = указатель на блок для функции 58, в котором установлено
2239
    поле промежуточного буфера и указано имя файла
2240
Возвращаемое значение:
2241
  * eax = 0 - успешно
2242
  * иначе eax = код ошибки файловой системы; если файл не задаёт скин,
2243
    то возвращается ошибка 3 (неизвестная файловая система).
2244
Замечания:
2245
  * При успешной загрузке скина все окна извещаются о необходимости
2246
    перерисовки (событие 1).
2247
  * При загрузке система считывает скин из файла default.skn
2248
    на рамдиске.
2249
  * Пользователь может изменять скин статически, создав свой
2250
    default.skn, или динамически с помощью приложения desktop.
2251
 
2252
======================================================================
78 diamond 2253
============ Функция 49 - Advanced Power Management (APM). ===========
2254
======================================================================
2255
Параметры:
2256
  * eax = 49 - номер функции
2257
  * dx = номер функции APM (аналог ax в спецификации)
2258
  * bx, cx = параметры функции APM
2259
Возвращаемое значение:
2260
  * 16-битные регистры ax, bx, cx, dx, si, di и флаг CF
2261
    установлены в соответствии со спецификацией APM
2262
  * старшие половины 32-битных регистров eax, ebx, ecx,
2263
    edx, esi, edi разрушаются
2264
Замечания:
2265
  * Спецификация APM 1.2 описывается в документе
2266
    "Advanced Power Management (APM) BIOS Specification"
2267
    (Revision 1.2), доступном на
2268
    http://www.microsoft.com/whdc/archive/amp_12.mspx;
2269
    кроме того, она включена в известный Interrupt List by Ralf Brown
2270
    (http://www.pobox.com/~ralf/files.html,
2271
    ftp://ftp.cs.cmu.edu/afs/cs/user/ralf/pub/).
2272
 
2273
======================================================================
77 diamond 2274
================= Функция 50 - установка формы окна. =================
2275
======================================================================
2276
Обычные окна представляют собой прямоугольники. С помощью этой функции
2277
окну можно придать произвольную форму. Форма задаётся набором точек
2278
внутри обрамляющего прямоугольника, принадлежащих окну. Положение и
2279
размеры обрамляющего прямоугольника задаются функцией 0 и изменяются
2280
функцией 67.
2281
 
2282
--------------- Установка данных с информацией о форме ---------------
2283
Параметры:
2284
  * eax = 50 - номер функции
2285
  * ebx = 0 - номер подфункции
2286
  * ecx = указатель на данные формы (массив байт 0/1)
2287
Возвращаемое значение:
2288
  * функция не возвращает значения
2289
 
2290
------------------ Установка масштаба данных формы -------------------
2291
Параметры:
2292
  * eax = 50 - номер функции
2293
  * ebx = 1 - номер подфункции
2294
  * ecx задаёт масштаб: каждый байт данных определяет
2295
    (2^scale)*(2^scale) пикселей
2296
Возвращаемое значение:
2297
  * функция не возвращает значения
2298
Замечания:
2299
  * Масштаб по умолчанию равен 0 (масштабирующий множитель 1). Если в
2300
    данных формы один байт соответствует одному пикселю, то масштаб
2301
    можно не устанавливать.
2302
  * Обозначим xsize = ширина окна (в пикселях), ysize = высота;
2303
    обратите внимание, что они на единицу больше, чем устанавливаемые
2304
    функциями 0, 67.
2305
  * По определению масштаба xsize и ysize должны делиться на 2^scale.
2306
  * Байт данных по смещению a должен быть 0/1 и
2307
    определяет принадлежность окну квадрата со стороной 2^scale
2308
    (при scale=0 получаем пиксель) и координатами левого верхнего угла
2309
    (a mod (xsize shr scale), a div (xsize shr scale))
2310
  * Размер данных: (xsize shr scale)*(ysize shr scale).
2311
  * Данные должны присутствовать в памяти и не меняться
2312
    после установки формы.
2313
  * Система просматривает данные о форме при каждой перерисовке окна
2314
    функцией 0.
2315
  * Вызов подфункции 0 с нулевым указателем приводит к возврату
2316
    к прямоугольной форме.
2317
 
2318
======================================================================
2319
===================== Функция 51 - создать поток. ====================
2320
======================================================================
2321
Параметры:
2322
  * eax = 51 - номер функции
2323
  * ebx = 1 - единственная подфункция
2324
  * ecx = адрес точки входа потока (начальный eip)
2325
  * edx = указатель стэка потока (начальный esp)
2326
Возвращаемое значение:
2327
  * eax = -1 - ошибка (в системе слишком много потоков)
2328
  * иначе eax = TID - идентификатор потока
2329
 
2330
======================================================================
2331
= Функция 52, подфункция 0 - получить конфигурацию сетевого драйвера.
2332
======================================================================
2333
Параметры:
2334
  * eax = 52 - номер функции
2335
  * ebx = 0 - номер подфункции
2336
Возвращаемое значение:
2337
  * eax = двойное слово конфигурации
2338
Замечания:
2339
  * Слово конфигурации можно установить подфункцией 2.
2340
  * Ядро не использует соответствующую переменную.
2341
    Ценность этой переменной и работающих с ней подфункций 0 и 2
2342
    представляется сомнительной.
2343
 
2344
======================================================================
2345
======= Функция 52, подфункция 1 - получить локальный IP-адрес. ======
2346
======================================================================
2347
Параметры:
2348
  * eax = 52 - номер функции
2349
  * ebx = 1 - номер подфункции
2350
Возвращаемое значение:
2351
  * eax = IP-адрес (4 байта)
2352
Замечания:
2353
  * Локальный IP-адрес устанавливается подфункцией 3.
2354
 
2355
======================================================================
2356
 Функция 52, подфункция 2 - установить конфигурацию сетевого драйвера.
2357
======================================================================
2358
Параметры:
2359
  * eax = 52 - номер функции
2360
  * ebx = 2 - номер подфункции
2361
  * ecx = двойное слово конфигурации; если младшие 7 бит образуют
2362
    число 3, это воспринимается как запрос на [пере-]инициализацию
2363
    Ethernet-карты, в противном случае Ethernet выключается
2364
Возвращаемое значение:
2365
  * если не запрошен Ethernet-интерфейс, то возвращается eax=2,
2366
    но это может измениться в будущих версиях ядра
2367
  * если запрошен Ethernet-интерфейс, то eax=0 означает ошибку
2368
    (отсутствие Ethernet-карты), а ненулевое значение - успех
2369
Замечания:
2370
  * Слово конфигурации можно прочитать подфункцией 0.
2371
  * Ядро не использует соответствующую переменную.
2372
    Ценность этой переменной, подфункции 0 и части подфункции 2,
2373
    устанавливающей эту переменную, представляется сомнительной.
2374
 
2375
======================================================================
2376
====== Функция 52, подфункция 3 - установить локальный IP-адрес. =====
2377
======================================================================
2378
Параметры:
2379
  * eax = 52 - номер функции
2380
  * ebx = 3 - номер подфункции
2381
  * ecx = IP-адрес (4 байта)
2382
Возвращаемое значение:
2383
  * текущая реализация возвращает eax=3, но это может быть изменено
2384
    в будущих версиях
2385
Замечания:
2386
  * Локальный IP-адрес можно получить подфункцией 1.
2387
 
2388
======================================================================
2389
= Функция 52, подфункция 6 - добавить данные в стек входной очереди. =
2390
======================================================================
2391
Параметры:
2392
  * eax = 52 - номер функции
2393
  * ebx = 6 - номер подфункции
2394
  * edx = размер данных
2395
  * esi = указатель на данные
2396
Возвращаемое значение:
2397
  * eax = -1 - ошибка
2398
  * eax = 0 - успешно
2399
Замечания:
2400
  * Эта функция предназначена только для медленных сетевых драйверов
2401
    (PPP, SLIP).
2402
  * Размер данных не должен превосходить 1500 байт,
2403
    хотя проверок корректности не делается.
2404
 
2405
======================================================================
2406
====================== Функция 52, подфункция 8 ======================
2407
============= Прочитать данные из сетевой очереди вывода. ============
2408
======================================================================
2409
Параметры:
2410
  * eax = 52 - номер функции
2411
  * ebx = 8 - номер подфункции
2412
  * esi = указатель на буфер размером 1500 байт
2413
Возвращаемое значение:
2414
  * eax = число прочитанных байт (в текущей реализации
2415
    либо 0 = нет данных, либо 1500)
2416
  * данные скопированы в буфер
2417
Замечания:
2418
  * Эта функция предназначена только для медленных сетевых драйверов
2419
    (PPP, SLIP).
2420
 
2421
======================================================================
2422
=========== Функция 52, подфункция 9 - получить gateway IP. ==========
2423
======================================================================
2424
Параметры:
2425
  * eax = 52 - номер функции
2426
  * ebx = 9 - номер подфункции
2427
Возвращаемое значение:
2428
  * eax = gateway IP (4 байта)
2429
 
2430
======================================================================
2431
========= Функция 52, подфункция 10 - получить маску подсети. ========
2432
======================================================================
2433
Параметры:
2434
  * eax = 52 - номер функции
2435
  * ebx = 10 - номер подфункции
2436
Возвращаемое значение:
2437
  * eax = маска подсети
2438
 
2439
======================================================================
2440
========= Функция 52, подфункция 11 - установить gateway IP. =========
2441
======================================================================
2442
Параметры:
2443
  * eax = 52 - номер функции
2444
  * ebx = 11 - номер подфункции
2445
  * ecx = gateway IP (4 байта)
2446
Возвращаемое значение:
2447
  * текущая реализация возвращает eax=11, но это может быть изменено
2448
    в будущих реализациях
2449
 
2450
======================================================================
2451
======== Функция 52, подфункция 12 - установить маску подсети. =======
2452
======================================================================
2453
Параметры:
2454
  * eax = 52 - номер функции
2455
  * ebx = 12 - номер подфункции
2456
  * ecx = маска подсети
2457
Возвращаемое значение:
2458
  * текущая реализация возвращает eax=12, но это может быть изменено
2459
    в будущих версиях
2460
 
2461
======================================================================
2462
============ Функция 52, подфункция 13 - получить DNS IP. ============
2463
======================================================================
2464
Параметры:
2465
  * eax = 52 - номер функции
2466
  * ebx = 13 - номер подфункции
2467
Возвращаемое значение:
2468
  * eax = DNS IP (4 байта)
2469
 
2470
======================================================================
2471
=========== Функция 52, подфункция 14 - установить DNS IP. ===========
2472
======================================================================
2473
Параметры:
2474
  * eax = 52 - номер функции
2475
  * ebx = 14 - номер подфункции
2476
  * ecx = DNS IP (4 байта)
2477
Возвращаемое значение:
2478
  * текущая реализация возвращает eax=14, но это может быть изменено
2479
    в следующих версиях
2480
 
2481
======================================================================
2482
============ Функция 53, подфункция 0 - открыть UDP-сокет. ===========
2483
======================================================================
2484
Параметры:
2485
  * eax = 53 - номер функции
2486
  * ebx = 0 - номер подфункции
2487
  * ecx = локальный порт (учитывается только младшее слово)
2488
  * edx = удалённый порт (учитывается только младшее слово)
2489
  * esi = удалённый IP
2490
Возвращаемое значение:
2491
  * eax = -1 = 0xFFFFFFFF - ошибка; ebx разрушается
2492
  * eax = хэндл сокета (некоторое число, однозначно идентифицирующее
2493
    сокет и имеющее смысл только для системы) - успешно;
2494
    ebx разрушается
2495
 
2496
======================================================================
2497
============ Функция 53, подфункция 1 - закрыть UDP-сокет. ===========
2498
======================================================================
2499
Параметры:
2500
  * eax = 53 - номер функции
2501
  * ebx = 1 - номер подфункции
2502
  * ecx = хэндл сокета
2503
Возвращаемое значение:
2504
  * eax = -1 - неверный хэндл
2505
  * eax = 0 - успешно
2506
  * ebx разрушается
2507
Замечания:
2508
  * Текущая реализация не закрывает автоматически все сокеты потока
2509
    при его завершении. В частности, не следует прибивать поток
2510
    с кучей открытых сокетов - будет утечка ресурсов.
2511
  * Текущая реализация не делает проверок на корректность
2512
    (единственное, на что возвращается ошибка, - попытка закрыть
2513
    неоткрытый сокет с корректным хэндлом).
2514
 
2515
======================================================================
2516
============== Функция 53, подфункция 2 - опрос сокета. ==============
2517
======================================================================
2518
Параметры:
2519
  * eax = 53 - номер функции
2520
  * ebx = 2 - номер подфункции
2521
  * ecx = хэндл сокета
2522
Возвращаемое значение:
2523
  * eax = число полученных байт
2524
  * ebx разрушается
2525
Замечания:
2526
  * Проверки корректности не делается.
2527
 
2528
======================================================================
2529
======== Функция 53, подфункция 3 - прочитать байт из сокета. ========
2530
======================================================================
2531
Параметры:
2532
  * eax = 53 - номер функции
2533
  * ebx = 3 - номер подфункции
2534
  * ecx = хэндл сокета
2535
Возвращаемое значение:
2536
  * если нет принятых данных: eax=0, bl=0,
2537
    прочие байты ebx разрушаются
2538
  * если были принятые данные: eax=число оставшихся байт
2539
    (возможно, 0), bl=прочитанный байт, прочие байты ebx разрушаются
2540
Замечания:
2541
  * Проверки корректности не производится.
2542
 
2543
======================================================================
2544
========== Функция 53, подфункция 4 - записать в UDP-сокет. ==========
2545
======================================================================
2546
Параметры:
2547
  * eax = 53 - номер функции
2548
  * ebx = 4 - номер подфункции
2549
  * ecx = хэндл сокета
2550
  * edx = число байт для записи
2551
  * esi = указатель на данные для записи
2552
Возвращаемое значение:
2553
  * eax = 0xffffffff - неверный хэндл
2554
  * eax = 0xffff - недостаточно памяти
2555
  * eax = 0 - успешно
2556
  * ebx разрушается
2557
Замечания:
2558
  * Проверка на валидность хэндла минимальна - исключаются только
2559
    не очень неправильные неоткрытые хэндлы.
2560
  * Число байт для записи не может превышать 1500-28, хотя
2561
    соответствующей проверки не делается.
2562
 
2563
======================================================================
2564
============ Функция 53, подфункция 5 - открыть TCP-сокет. ===========
2565
======================================================================
2566
Параметры:
2567
  * eax = 53 - номер функции
2568
  * ebx = 5 - номер подфункции
2569
  * ecx = локальный порт (учитывается только младшее слово)
2570
  * edx = удалённый порт (учитывается только младшее слово)
2571
  * esi = удалённый IP
2572
  * edi = режим открытия: SOCKET_PASSIVE=0 или SOCKET_ACTIVE=1
2573
Возвращаемое значение:
2574
  * eax = -1 = 0xFFFFFFFF - ошибка; ebx разрушается
2575
  * eax = хэндл сокета (некоторое число, однозначно идентифицирующее
2576
    сокет и имеющее смысл только для системы) - успешно;
2577
    ebx разрушается
2578
 
2579
======================================================================
2580
====== Функция 53, подфункция 6 - получить состояние TCP-сокета. =====
2581
======================================================================
2582
Параметры:
2583
  * eax = 53 - номер функции
2584
  * ebx = 6 - номер подфункции
2585
  * ecx = хэндл сокета
2586
Возвращаемое значение:
2587
  * eax = статус сокета: одно из
2588
  * TCB_LISTEN = 1
2589
  * TCB_SYN_SENT = 2
2590
  * TCB_SYN_RECEIVED = 3
2591
  * TCB_ESTABLISHED = 4
2592
  * TCB_FIN_WAIT_1 = 5
2593
  * TCB_FIN_WAIT_2 = 6
2594
  * TCB_CLOSE_WAIT = 7
2595
  * TCB_CLOSING = 8
2596
  * TCB_LAST_ASK = 9
2597
  * TCB_TIME_WAIT = 10
2598
  * TCB_CLOSED = 11
2599
  * ebx разрушается
2600
Замечания:
2601
  * Проверок корректности не производится.
2602
 
2603
======================================================================
2604
========== Функция 53, подфункция 7 - записать в TCP-сокет. ==========
2605
======================================================================
2606
Параметры:
2607
  * eax = 53 - номер функции
2608
  * ebx = 7 - номер подфункции
2609
  * ecx = хэндл сокета
2610
  * edx = число байт для записи
2611
  * esi = указатель на данные для записи
2612
Возвращаемое значение:
2613
  * eax = 0xffffffff - ошибка
2614
  * eax = 0xffff - недостаточно памяти
2615
  * eax = 0 - успешно
2616
  * ebx разрушается
2617
Замечания:
2618
  * Проверка на валидность хэндла минимальна - исключаются только
2619
    не очень неправильные неоткрытые хэндлы.
2620
  * Число байт для записи не может превышать 1500-40,
2621
    хотя соответствующей проверки не делается.
2622
 
2623
======================================================================
2624
============ Функция 53, подфункция 8 - закрыть TCP-сокет. ===========
2625
======================================================================
2626
Параметры:
2627
  * eax = 53 - номер функции
2628
  * ebx = 8 - номер подфункции
2629
  * ecx = хэндл сокета
2630
Возвращаемое значение:
2631
  * eax = -1 - неверный хэндл
2632
  * eax = 0xffff - недостаточно памяти для пакета закрытия сокета
2633
  * eax = 0 - успешно
2634
  * во многих случаях eax разрушается (возвращается результат функции
2635
    queue) - видимо, это баг, который будет исправлен
2636
  * ebx разрушается
2637
Замечания:
2638
  * Текущая реализация не закрывает автоматически все сокеты потока
2639
    при его завершении. В частности, не следует прибивать поток
2640
    с кучей открытых сокетов - будет утечка ресурсов.
2641
  * Текущая реализация не делает проверок на корректность
2642
    (единственное, на что возвращается ошибка, - попытка закрыть
2643
    неоткрытый сокет с корректным хэндлом).
2644
 
2645
======================================================================
2646
== Функция 53, подфункция 9 - проверить, свободен ли локальный порт. =
2647
======================================================================
2648
Параметры:
2649
  * eax = 53 - номер функции
2650
  * ebx = 9 - номер подфункции
2651
  * ecx = номер локального порта (используются только младшие 16 бит)
2652
Возвращаемое значение:
2653
  * eax = 0 - порт используется
2654
  * eax = 1 - порт свободен
2655
  * ebx разрушается
2656
 
2657
======================================================================
2658
 Функция 53, подфункция 255 - отладочная информация сетевого драйвера.
2659
======================================================================
2660
Параметры:
2661
  * eax = 53 - номер функции
2662
  * ebx = 255 - номер подфункции
2663
  * ecx = тип запрашиваемой информации (смотри ниже)
2664
Возвращаемое значение:
2665
  * eax = запрошенная информация
2666
  * ebx разрушается
2667
Возможные значения ecx:
2668
  * 100: длина очереди 0 (empty queue)
2669
  * 101: длина очереди 1 (ip-out queue)
2670
  * 102: длина очереди 2 (ip-in queue)
2671
  * 103: длина очереди 3 (net1out queue)
2672
  * 200: число элементов в таблице ARP
2673
  * 201: размер таблицы ARP (в элементах) (20 в текущей версии)
2674
  * 202: прочитать элемент edx таблицы ARP во временный буфер, откуда
2675
    берут информацию 5 последующих типов;
2676
    в этом случае eax неопределён
2677
  * 203: IP-адрес, запомненный типом 202
2678
  * 204: старшее dword MAC-адреса, запомненного типом 202
2679
  * 205: младшее word MAC-адреса, запомненного типом 202
2680
  * 206: слово статуса, запомненное типом 202
2681
  * 207: слово ttl, запомненное типом 202
2682
  * 2: общее число полученных IP-пакетов
2683
  * 3: общее число переданных IP-пакетов
2684
  * 4: общее число сдампленных полученных пакетов
2685
  * 5: общее число полученных ARP-пакетов
2686
  * 6: статус драйвера пакетов, 0=неактивен,
2687
    ненулевое значение=активен
2688
 
2689
======================================================================
2690
======== Функция 55, подфункция 0 - загрузить данные для SB16. =======
2691
======================================================================
2692
Параметры:
2693
  * eax = 55 - номер функции
2694
  * ebx = 0 - номер подфункции
2695
  * ecx = указатель на данные (копируется 64 килобайта, используется
2696
    столько, сколько установлено подфункцией 2)
2697
Возвращаемое значение:
2698
  * функция не возвращает значения
2699
Замечания:
2700
  * Формат и размер данных устанавливаются подфункцией 2.
2701
 
2702
======================================================================
2703
==== Функция 55, подфункция 1 - начать проигрывать данные на SB16. ===
2704
======================================================================
2705
Параметры:
2706
  * eax = 55 - номер функции
2707
  * ebx = 1 - номер подфункции
2708
Возвращаемое значение:
2709
  * функция не возвращает значения
2710
Замечания:
2711
  * Предварительно данные должны быть загружены подфункцией 0 и
2712
    определён их формат подфункцией 2.
2713
  * Функция возвращает управление, когда началось проигрывание данных;
2714
    после этого проигрывание идёт независимо от приложения (и вообще
2715
    не требует загрузки процессора).
2716
  * Предварительно должны быть определены базовый порт SB16
2717
    (подфункцией 4 функции 21) и канал DMA
2718
    (подфункцией 10 функции 21).
2719
 
2720
======================================================================
2721
====== Функция 55, подфункция 2 - установить формат данных SB16. =====
2722
======================================================================
2723
Параметры:
2724
  * eax = 55 - номер функции
2725
  * ebx = 2 - номер подфункции
2726
  * ecx = 0 - установить разрядность
2727
    * edx = 1 - 8бит моно
2728
    * edx = 2 - 8бит стерео
2729
  * ecx = 1 - установить размер данных
2730
    * edx = размер в байтах
2731
  * ecx = 2 - установить частоту проигрывания
2732
    * edx = частота
2733
Возвращаемое значение:
2734
  * функция не возвращает значения
2735
Замечания:
2736
  * При загрузке системы устанавливаются следующие параметры
2737
    по умолчанию: разрядность - 8 бит моно, размер - 64 Кб,
2738
    частота 44100 Гц. Тем не менее рекомендуется явно устанавливать
2739
    необходимые значения, поскольку они могли быть переустановлены
2740
    какой-нибудь программой.
2741
 
2742
======================================================================
2743
====================== Функция 55, подфункция 55 =====================
2744
========== Начать проигрывать данные на встроенном спикере. ==========
2745
======================================================================
2746
Параметры:
2747
  * eax = 55 - номер функции
2748
  * ebx = 55 - номер подфункции
2749
  * esi = указатель на данные
2750
Возвращаемое значение:
2751
  * eax = 0 - успешно
2752
  * eax = 55 - ошибка (спикер отключён или занят)
2753
Данные - это массив элементов переменной длины.
2754
Формат каждого элемента определяется первым байтом:
2755
  * 0 = конец данных
2756
  * 1..0x80 = задаёт длительность звучания в сотых долях секунды
2757
    ноты, определяемой непосредственным значением частоты
2758
    * следующее слово (2 байта) содержит делитель частоты;
2759
      частота определяется как 1193180/divider
2760
  * 0x81 = invalid
2761
  * 0x82..0xFF = нота, определяемая октавой и номером:
2762
    * длительность в сотых долях секунды = (первый байт)-0x81
2763
    * присутствует ещё один байт;
2764
    * (второй байт)=0xFF - пауза
2765
    * иначе он имеет вид a*0x10+b, где b=номер ноты в октаве от 1
2766
      до 12, a=номер октавы (считая с 0)
2767
Замечания:
2768
  * Пищание спикером может быть запрещено/разрешено подфункцией 8
2769
    функции 18.
2770
  * Функция возвращает управление, сообщив куда следует информацию
2771
    о запросе. Само проигрывание идёт независимо от программы.
2772
  * Данные должны сохраняться в памяти по крайней мере
2773
    до конца проигрывания.
2774
 
2775
======================================================================
2776
============= Функция 56 - записать файл на жёсткий диск. ============
2777
======================================================================
2778
Параметры:
2779
  * eax = 56 - номер функции
2780
  * ebx = указатель на имя файла
2781
  * ecx = размер данных для записи (в байтах)
2782
  * edx = указатель на данные для записи
2783
  * esi = указатель на путь (ASCIIZ-строку)
2784
Возвращаемое значение:
2785
  * eax = 0 - успешно, иначе код ошибки файловой системы
2786
Замечания:
83 diamond 2787
  * Эта функция устарела; функция 70 позволяет выполнять
77 diamond 2788
    те же действия с расширенными возможностями.
2789
  * Данная функция предполагает, что во время её вызова одним
2790
    приложением никакое другое приложение не работает
2791
    с жёстким диском.
2792
  * Путь к файлу - ASCIIZ-строка, которая может быть пустой
2793
    (если файл создаётся в корневом каталоге) или иметь формат
2794
    /d1/d2/.../dn, где все имена папок должны иметь формат 8+3, т.е.
2795
    8 символов имени и 3 символа расширения без разделителя,
2796
    при необходимости дополненные пробелами;
2797
    все буквы должны быть заглавные.
2798
  * Имя к файлу также должно иметь формат 8+3.
2799
 
2800
======================================================================
2801
============== Функция 58 - работа с файловой системой. ==============
2802
======================================================================
2803
Параметры:
2804
  * eax = 58
2805
  * ebx = указатель на информационную структуру
2806
Возвращаемое значение:
2807
  * eax = 0 - успешно; иначе код ошибки файловой системы
2808
  * в зависимости от подфункции может возвращаться значение и
2809
    в других регистрах
2810
Общий формат информационной структуры:
2811
  * +0: dword: номер подфункции
2812
  * +4: dword: номер блока
2813
  * +8: dword: размер
2814
  * +12 = +0xC: dword: указатель на данные
2815
  * +16 = +0x10: dword: указатель на память для работы системы
2816
    (4096 байт)
2817
  * +20 = +0x14: n db: ASCIIZ-строка с именем файла
2818
Уточнения - в документации на соответствующую подфункцию.
2819
Имя файла нечувствительно к регистру латинских букв,
2820
русские буквы должны быть заглавными.
2821
Формат имени файла:
2822
/base/number/dir1/dir2/.../dirn/file,
2823
где /base/number идентифицирует устройство, на котором ищется файл:
2824
одно из
2825
  * /RD/1 = /RAMDISK/1 для доступа к рамдиску
2826
  * /FD/1 = /FLOPPYDISK/1 для доступа к первому флоппи-дисководу,
2827
    /FD/2 = /FLOPPYDISK/2 для второго флоппи-дисковода
2828
  * /HD/x = /HARDDISK/x - устаревший вариант доступа к жёсткому диску
2829
    (в этом случае база определяется подфункцией 7 функции 21),
2830
    x - номер раздела (считая с 1)
2831
  * /HD0/x, /HD1/x, /HD2/x, /HD3/x для доступа соответственно
2832
    к устройствам IDE0 (Primary Master), IDE1 (Primary Slave),
2833
    IDE2 (Secondary Master), IDE3 (Secondary Slave);
2834
    x - номер раздела на выбранном винчестере, изменяется от 1 до 255
2835
    (на каждом из винчестеров нумерация начинается с 1)
2836
Замечания:
2837
  * В первых двух случаях допускается использование FIRST вместо 1,
2838
    SECOND вместо 2, но использовать эту возможность
2839
    не рекомендуется для удобства перехода на будущие расширения.
2840
  * Накладывается ограничение n<=39.
2841
  * Имена папок и файла dir1,...,dirn,file должны быть в формате 8.3:
2842
    имя не более 8 символов, точка, расширение не более 3 символов.
2843
    Хвостовые пробелы игнорируются. Других пробелов быть не должно.
2844
    Если имя занимает ровно 8 символов, точку можно опустить
2845
    (хотя пользоваться этим не рекомендуется для удобства перехода
2846
    на будущие расширения).
2847
Примеры:
2848
  * '/RAMDISK/FIRST/KERNEL.ASM',0
2849
    '/rd/1/kernel.asm',0
2850
  * '/HD0/1/kernel.asm',0
2851
  * '/hd0/1/menuet/pics/tanzania.bmp',0
2852
Доступные подфункции:
2853
  * подфункция 0 - чтение файла/папки
2854
  * подфункция 1 - перезапись файла
2855
  * подфункция 2 - удаление файла/папки
2856
  * подфункция 3 - запись данных в существующий файл
2857
  * подфункция 4 - создание папки
2858
  * подфункция 5 - переименование/перемещение файла/папки
2859
  * подфункция 8 - LBA-чтение с устройства
2860
  * подфункция 12 - определение размера файла
2861
  * подфункция 13 - определение атрибутов файла/папки
2862
  * подфункция 14 - определение даты/времени файла/папки
2863
  * подфункция 15 - получение информации о файловой системе
2864
  * подфункция 16 - запуск приложения
2865
 
2866
======================================================================
2867
========== Функция 58, подфункция 0 - прочитать файл/папку. ==========
2868
======================================================================
2869
Параметры:
2870
  * eax = 58
2871
  * ebx = указатель на информационную структуру
2872
Формат информационной структуры:
2873
  * +0: dword: 0 = номер подфункции
2874
  * +4: dword: номер блока для чтения (считая с 0)
2875
  * +8: dword: число блоков для чтения
2876
  * +12 = +0xC: dword: указатель на буфер, куда будут записаны данные
2877
  * +16 = +0x10: dword: указатель на буфер для работы системы
2878
    (4096 байт)
83 diamond 2879
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
77 diamond 2880
    общем описании
2881
Возвращаемое значение:
2882
  * eax = 0 - успешно, иначе код ошибки файловой системы
2883
  * ebx = размер файла (в байтах) или
2884
    -1=0xffffffff, если файл не найден
2885
Замечания:
2886
  * Размер блока - 512 байт.
2887
  * Эта функция устарела, для чтения файлов используйте подфункцию 0
2888
    функции 70, для чтения папок - подфункцию 1 функции 70.
2889
  * Функция позволяет читать содержимое папки. Из файловых систем
2890
    поддерживается только FAT. Формат FAT-папки описан в любой
2891
    документации по FAT.
2892
  * Размер папки определяется по размеру цепочки кластеров в FAT.
2893
  * Если файл кончился раньше, чем был прочитан последний запрошенный
2894
    блок, то функция прочитает, сколько сможет, после чего вернёт
2895
    eax=6 (EOF).
2896
  * Функция позволяет читать корневые папки /rd/1,/fd/x,/hd[n]/x, но
2897
    в первых двух случаях текущая реализация не следует
2898
    установленным правилам:
2899
    для /rd/1:
2900
    * если указано 0 блоков для чтения, считается,
2901
      что запрашивается 1;
2902
    * если запрашивается больше 14 блоков или начальный блок
2903
      не меньше 14-го, то возвращается eax=5 (not found) и ebx=-1;
2904
    * размер корневого каталога рамдиска = 14 блоков,
2905
      0x1C00=7168 байт; но возвращается ebx=0
2906
      (за исключением случая предыдущего пункта);
2907
    * как ни странно, можно прочитать 14-й блок (там, вообще говоря,
2908
      мусор - напоминаю, счёт ведётся с 0);
2909
    * если был запрошен хотя бы один блок с номером, не меньшим 14,
2910
      то возвращается eax=6(EOF); иначе eax=0.
2911
    Для /fd/x:
2912
    * если начальный блок не меньше 14-го, то возвращается
2913
      eax=5 (not found) и ebx=0;
2914
    * кстати говоря, формат FAT12 допускает дискеты с размером
2915
      корневого каталога меньше или больше 14 блоков;
2916
    * проверки длины не делается;
2917
    * если удалось прочитать данные с дискеты, возвращается
2918
      eax=0,ebx=0; в противном случае eax=10 (access denied), ebx=-1.
2919
  * Функция обрабатывает чтение специальных папок /,/rd,/fd,/hd[n];
2920
    но результат не соответствует ожидаемому
2921
    (по работе с обычными файлами/папками), не следует установленным
2922
    правилам, может измениться в следующих версиях ядра и потому
2923
    не описывается. Для получения информации об оборудовании
2924
    используйте подфункцию 11 функции 18 или
2925
    читайте соответствующие папки подфункцией 1 функции 70.
2926
 
2927
======================================================================
2928
============ Функция 58, подфункция 1 - перезаписать файл. ===========
2929
======================================================================
2930
Если файл не существует, он создаётся.
2931
Если файл существует, он перезаписывается.
2932
Параметры:
2933
  * eax = 58 - номер функции
2934
  * ebx = указатель на информационную структуру
2935
Формат информационной структуры:
2936
  * +0: dword: 1 = номер подфункции
2937
  * +4: dword: игнорируется (устанавливайте в 0)
2938
  * +8: dword: число байт для записи
2939
  * +12 = +0xC: dword: указатель на данные для записи
2940
  * +16 = +0x10: dword: указатель на буфер для работы системы
2941
    (4096 байт)
83 diamond 2942
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
77 diamond 2943
    общем описании
2944
Возвращаемое значение:
2945
  * eax = 0 - успешно, иначе код ошибки файловой системы
2946
  * ebx разрушается
83 diamond 2947
Замечания:
2948
  * Эта функция устарела, используйте подфункцию 2 функции 70.
77 diamond 2949
 
2950
======================================================================
2951
=========== Функция 58, подфункция 2 - удалить файл/папку. ===========
2952
======================================================================
2953
Параметры:
2954
  * eax = 58 - номер функции
2955
  * ebx = указатель на информационную структуру
2956
Формат информационной структуры:
2957
  * +0: dword: 2 = номер подфункции
2958
  * +4: dword: игнорируется
2959
  * +8: dword: игнорируется
2960
  * +12 = +0xC: dword: игнорируется
2961
  * +16 = +0x10: dword: указатель на буфер для работы системы
2962
    (4096 байт)
2963
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
2964
    общем описании
2965
Возвращаемое значение:
2966
  * eax = 0 - успешно, иначе код ошибки файловой системы
2967
  * ebx разрушается
2968
Замечания:
2969
  * При работе с дискетой не следует удалять непустую папку.
2970
    Код работы с жёстким диском непустые папки удаляет корректно
2971
    (т.е. рекурсивно со всеми файлами и вложенными папками).
2972
    Рамдиск папок не поддерживает.
2973
 
2974
======================================================================
2975
==== Функция 58, подфункция 3 - запись данных в существующий файл. ===
2976
======================================================================
2977
Параметры:
2978
  * eax = 58 - номер функции
2979
  * ebx = указатель на информационную структуру
2980
Формат информационной структуры:
2981
  * +0: dword: 3 = номер подфункции
2982
  * +4: dword: начальная позиция в файле; -1 = дописывать в конец
2983
  * +8: dword: число байт для записи
2984
  * +12 = +0xC: dword: указатель на данные для записи
2985
  * +16 = +0x10: dword: указатель на буфер для работы системы
2986
    (4096 байт)
2987
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
2988
    общем описании
2989
Возвращаемое значение:
2990
  * eax = 0 - успешно, иначе код ошибки файловой системы
2991
  * ebx разрушается
2992
Замечания:
2993
  * Рамдиск и дискеты не поддерживают эту функцию, она только для
2994
    жёстких дисков.
2995
  * Файл должен уже существовать (иначе возвращается 5, not found).
2996
    Для создания файлов используйте подфункцию 1.
2997
  * Если начальная позиция больше размера файла, возвращается
2998
    eax=6(EOF). Если конечная позиция больше размера файла,
2999
    файл расширяется.
3000
  * Код обработки записи данных для жёсткого диска интерпретирует
3001
    нулевое значение поля +8 как указание усечения файла до размера,
3002
    указанного в поле +4. Однако код обработки 58-й функции блокирует
3003
    эту возможность для приложений, сразу возвращая управление
3004
    (с eax=0) в случае нулевого размера.
3005
 
3006
======================================================================
3007
============== Функция 58, подфункция 4 - создать папку. =============
3008
======================================================================
3009
Параметры:
3010
  * eax = 58 - номер функции
3011
  * ebx = указатель на информационную структуру
3012
Формат информационной структуры:
3013
  * +0: dword: 4 = номер подфункции
3014
  * +4: dword: игнорируется
3015
  * +8: dword: игнорируется
3016
  * +12 = +0xC: dword: игнорируется
3017
  * +16 = +0x10: dword: указатель на буфер для работы системы
3018
    (4096 байт)
3019
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
3020
    общем описании
3021
Возвращаемое значение:
3022
  * eax = 0 - успешно, иначе код ошибки файловой системы
3023
  * ebx разрушается
3024
Замечания:
3025
  * Рамдиск и дискеты не поддерживают эту функцию,
3026
    она только для жёстких дисков.
3027
 
3028
======================================================================
3029
== Функция 58, подфункция 5 - переименовать/переместить файл/папку. ==
3030
======================================================================
3031
Параметры:
3032
  * eax = 58 - номер функции
3033
  * ebx = указатель на информационную структуру
3034
Формат информационной структуры:
3035
  * +0: dword: 5 = номер подфункции
3036
  * +4: dword: игнорируется
3037
  * +8: dword: игнорируется
3038
  * +12 = +0xC: dword: игнорируется
3039
  * +16 = +0x10: dword: указатель на буфер для работы системы
3040
    (4096 байт)
3041
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
3042
    общем описании
3043
  * +20+n: (сразу после завершающего нулевого символа) новое
3044
    ASCIIZ-имя, должно начинаться с /hd/1, что интерпретируется как
3045
    жёсткий диск, указанный в первом имени
3046
    (перемещение с одного диска на другой не поддерживается)
3047
Возвращаемое значение:
3048
  * eax = 0 - успешно, иначе код ошибки файловой системы
3049
  * ebx разрушается
3050
Замечания:
3051
  * Рамдиск и дискеты не поддерживают эту функцию,
3052
    она только для жёстких дисков.
3053
  * Если новое ASCIIZ-имя сильно неправильное, т.е. не начинается с
3054
    /hd/1, /hd/first, /harddisk/1, /harddisk/first или после этого
3055
    начала идёт пробел или символ с кодом 0, то функция возвращает,
3056
    как ни странно, код ошибки 4. Это единственная функция, которая
3057
    вообще возвращает этот код.
3058
 
3059
======================================================================
3060
========= Функция 58, подфункция 8 - LBA-чтение с устройства. ========
3061
======================================================================
3062
Параметры:
3063
  * eax = 58 - номер функции
3064
  * ebx = указатель на информационную структуру
3065
Формат информационной структуры:
3066
  * +0: dword: 8 = номер подфункции
3067
  * +4: dword: номер блока для чтения (считая с 0)
3068
  * +8: dword: игнорируется (устанавливайте в 1)
3069
  * +12 = +0xC: dword: указатель на буфер, куда будут записаны данные
3070
    (512 байт)
3071
  * +16 = +0x10: dword: указатель на буфер для работы системы
3072
    (4096 байт)
3073
  * +20 = +0x14: ASCIIZ-имя устройства: нечувствительно к регистру,
3074
    одно из /rd/1 = /RamDisk/1, /hd/n = /HardDisk/n,
3075
    1<=n<=4 - номер устройства: 1=IDE0, ..., 4=IDE3.
3076
    Вместо цифр допускается, хотя и не рекомендуется для удобства
3077
    перехода на будущие расширения,
3078
    использование 'first','second','third','fourth'.
3079
Возвращаемое значение:
3080
  * если указано имя устройства /hd/xxx, где xxx не находится
3081
    в списке выше:
3082
    * eax = ebx = 1
3083
  * если указано неправильное имя устройства
3084
    (за исключением предыдущего случая):
3085
    * eax = 5
3086
    * ebx не меняется
3087
  * если LBA-доступ запрещён подфункцией 11 функции 21:
3088
    * eax = 2
3089
    * ebx разрушается
3090
  * для рамдиска: попытка чтения блока за пределами рамдиска
3091
    (18*2*80 блоков) приводит к
3092
    * eax = 3
3093
    * ebx = 0
3094
  * при успешном чтении:
3095
    * eax = ebx = 0
3096
Замечания:
3097
  * Размер блока - 512 байт; читается один блок.
3098
  * Не следует полагаться на возвращаемое значение,
3099
    оно может измениться в следующих версиях.
3100
  * Требуется, чтобы был разрешён LBA-доступ к устройствам
3101
    подфункцией 11 функции 21. Узнать это можно вызовом
3102
    подфункцией 11 функции 26.
3103
  * LBA-чтение дискеты не поддерживается.
3104
  * Функция считывает данные физического жёсткого диска;
3105
    если по каким-то причинам нужны данные конкретного раздела,
3106
    придётся определять начальный сектор этого раздела
3107
    (либо напрямую через MBR, либо из расширенной структуры,
3108
    возвращаемой той же подфункцией 11 функции 18).
3109
  * Функция не проверяет код ошибки жёсткого диска, так что запрос
3110
    несуществующего сектора всё равно что-то прочитает
3111
    (вероятнее всего, нули, но это определяется устройством) и
3112
    это будет считаться успехом (eax=0).
3113
 
3114
======================================================================
3115
========= Функция 58, подфункция 12 - получить размер файла. =========
3116
======================================================================
3117
Параметры:
3118
  * eax = 58 - номер функции
3119
  * ebx = указатель на информационную структуру
3120
Формат информационной структуры:
3121
  * +0: dword: 12 = номер функции
3122
  * +4: dword: игнорируется
3123
  * +8: dword: игнорируется
3124
  * +12 = +0xC: dword: игнорируется
3125
  * +16 = +0x10: dword: указатель на буфер для работы системы
3126
    (4096 байт)
3127
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
3128
    общем описании
3129
Возвращаемое значение:
3130
  * eax = 0 - успешно, иначе код ошибки файловой системы
3131
  * ebx = размер файла (в байтах) или 0 для HD, -1 для RD,
3132
    если файл не найден
3133
Замечания:
3134
  * Функция не поддерживается для дискет.
3135
  * Текущая реализация позволяет также определять размер папки
3136
    (по цепочке кластеров в FAT), но не следует на это полагаться.
3137
 
3138
======================================================================
3139
===== Функция 58, подфункция 13 - получить атрибуты файла/папки. =====
3140
======================================================================
3141
Параметры:
3142
  * eax = 58 - номер функции
3143
  * ebx = указатель на информационную структуру
3144
Формат информационной структуры:
3145
  * +0: dword: 13 = номер функции
3146
  * +4: dword: игнорируется
3147
  * +8: dword: игнорируется
3148
  * +12 = +0xC: dword: игнорируется
3149
  * +16 = +0x10: dword: указатель на буфер для работы системы
3150
    (4096 байт)
3151
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
3152
    общем описании
3153
Возвращаемое значение:
3154
  * eax = 0 - успешно, иначе код ошибки файловой системы
3155
  * ebx = байт FAT-атрибута (дополненный нулями до dword)
3156
    или 0 для HD, -1 для RD, если файл не найден
3157
Значения для битов FAT-атрибутов:
3158
  * бит 0: файл только для чтения
3159
  * бит 1: файл является скрытым
3160
  * бит 2: файл является системным
3161
  * бит 3: это не файл, а метка тома (может встречаться только
3162
    один раз на диске, в корневом каталоге)
3163
  * бит 4: это папка
3164
  * бит 5: файл не архивировался - многие программы архивации имеют
3165
    опцию, по которой архивируются только файлы с установленным этим
3166
    битом, после чего этот бит сбрасывается - это может быть полезно
3167
    для автоматического создания backup-архивов, ибо при записи
3168
    бит обычно устанавливается (не в Kolibri, правда)
3169
Замечания:
3170
  * Функция не поддерживается для дискет.
3171
 
3172
======================================================================
3173
====================== Функция 58, подфункция 14 =====================
3174
======= Получить дату/время последней модификации файла/папки. =======
3175
======================================================================
3176
Параметры:
3177
  * eax = 58 - номер функции
3178
  * ebx = указатель на информационную структуру
3179
Формат информационной структуры:
3180
  * +0: dword: 14 = номер функции
3181
  * +4: dword: игнорируется
3182
  * +8: dword: игнорируется
3183
  * +12 = +0xC: dword: игнорируется
3184
  * +16 = +0x10: dword: указатель на буфер для работы системы
3185
    (4096 байт)
3186
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
3187
    общем описании
3188
Возвращаемое значение:
3189
  * eax = 0 - успешно, иначе код ошибки файловой системы
3190
  * ebx = дата/время в формате FAT или 0 для HD, -1 для RD,
3191
    если файл не найден
3192
  * младшее слово = время последней модификации, hhhhhmmmmmmsssss:
3193
    * младшие 5 бит = число двухсекундных интервалов, 0<=s<=29
3194
    * следующие 6 бит = минуты, 0<=m<=59
3195
    * старшие 5 бит = часы, 0<=h<=23
3196
  * старшее слово = дата последней модификации, yyyyyyymmmmddddd:
3197
    * младшие 5 бит = день, 1<=d<=31
3198
    * следующие 4 бита = месяц, 1<=m<=12
3199
    * старшие 7 бит = год относительно 1980
3200
Замечания:
3201
  * Функция не поддерживается для дискет.
3202
  * Создание файла/папки считается модификацией.
3203
 
3204
======================================================================
3205
= Функция 58, подфункция 15 - получить информацию о файловой системе.
3206
======================================================================
3207
Параметры:
3208
  * eax = 58 - номер функции
3209
  * ebx = указатель на информационную структуру
3210
Формат информационной структуры:
3211
  * +0: dword: 15 = номер функции
3212
  * +4: dword: игнорируется
3213
  * +8: dword: игнорируется
3214
  * +12 = +0xC: dword: игнорируется
3215
  * +16 = +0x10: dword: игнорируется
3216
  * +20 = +0x14: (проверяется только второй символ, сразу после слэша)
3217
    /rd=/RAMDISK или /hd=/HARDDISK
3218
Возвращаемое значение:
3219
  * если второй символ не принадлежит множеству {'r','R','h','H'}:
3220
    * eax = 3
3221
    * ebx = ecx = dword [fileinfo] = 0
3222
  * для рамдиска:
3223
    * eax = 0 (успех)
3224
    * ebx = общее число кластеров = 2847
3225
    * ecx = число свободных кластеров
3226
    * dword [fileinfo] = размер кластера = 512
3227
  * для жёсткого диска: база и раздел определяются подфункциями 7 и 8
3228
    функции 21:
3229
    * eax = 0 (успех)
3230
    * ebx = общее число кластеров
3231
    * ecx = число свободных кластеров
3232
    * dword [fileinfo] = размер кластера (в байтах)
3233
Замечания:
3234
  * Не удивляйтесь странному расположению 4-го возвращаемого
3235
    параметра - когда писался этот код, при системных вызовах
3236
    приложению возвращались только регистры eax,ebx,ecx (из
3237
    pushad-структуры, передающейся как аргумент системной функции).
3238
    Теперь это исправлено, так что, возможно, имеет смысл возвращать
3239
    размер кластера в edx, пока эту функцию не начали использовать.
3240
  * Вообще-то ещё существует подфункция 11 функции 18, возвращающая
3241
    информацию о файловой системе. По расширенной таблице дисковой
3242
    подсистемы можно определить размер кластера (там он хранится
3243
    в секторах) и общее число кластеров для жёстких дисков.
3244
 
3245
======================================================================
3246
========== Функция 58, подфункция 16 - запустить программу. ==========
3247
======================================================================
3248
Параметры:
3249
  * eax = 58 - номер функции
3250
  * ebx = указатель на информационную структуру
3251
Формат информационной структуры:
3252
  * +0: dword: 16 = номер подфункции
3253
  * +4: dword: поле флагов:
3254
    * бит 0: запустить процесс как отлаживаемый
3255
    * остальные биты зарезервированы и должны быть установлены в 0
3256
  * +8: dword: 0 или указатель на ASCIIZ-строку с параметрами
3257
  * +12 = +0xC: dword: игнорируется
3258
  * +16 = +0x10: dword: указатель на буфер для работы системы
3259
    (4096 байт)
3260
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
3261
    общем описании
3262
Возвращаемое значение:
3263
  * eax > 0 - программа загружена, eax содержит PID
3264
  * eax < 0 - произошла ошибка, -eax содержит
3265
    код ошибки файловой системы
3266
Замечания:
3267
  * Комадная строка должна заканчиваться символом с кодом 0
3268
    (ASCIIZ-строка); учитываются либо все символы до завершающего нуля
3269
    включительно, либо первые 256 символов, в зависимости от того,
3270
    что меньше.
3271
  * Если процесс запускается как отлаживаемый, он создаётся
3272
    в замороженном состоянии; для запуска используйте
3273
    подфункцию 5 функции 69.
3274
 
3275
======================================================================
3276
=========== Функция 60 - Inter Process Communication (IPC). ==========
3277
======================================================================
3278
IPC применяется для посылок сообщений от одного процесса/потока
3279
другому. При этом следует предварительно договориться о том, как
3280
интерпретировать конкретное сообщение.
3281
 
3282
-------- Подфункция 1 - установить область для получения IPC ---------
3283
Вызывается процессом-приёмником.
3284
Параметры:
3285
  * eax = 60 - номер функции
3286
  * ebx = 1 - номер подфункции
3287
  * ecx = указатель на буфер
3288
  * edx = размер буфера
3289
Возвращаемое значение:
3290
  * eax = 0 - всегда успешно
3291
Формат IPC-буфера:
3292
  * +0: dword: если здесь не 0, то буфер считается заблокированным;
3293
    блокируйте/разблокируйте буфер, когда вы с ним активно работаете
3294
    и вам надо, чтобы извне не изменялись данные буфера
3295
    (не поступали новые сообщения)
3296
  * +4: dword: занято места в буфере (в байтах)
3297
  * +8: первое сообщение
3298
  * +8+n: второе сообщение
3299
  * ...
3300
Формат сообщения:
3301
  * +0: dword: PID процесса/потока, пославшего сообщение
3302
  * +4: dword: длина сообщения (не считая этот заголовок)
3303
  * +8: n*byte: данные сообщения
3304
 
3305
--------------- Подфункция 2 - послать сообщение IPC. ----------------
3306
Вызывается процессом-инициатором.
3307
Параметры:
3308
  * eax = 60 - номер функции
3309
  * ebx = 2 - номер подфункции
3310
  * ecx = PID приёмника
3311
  * edx = указатель на данные сообщения
3312
  * esi = длина сообщения (в байтах)
3313
Возвращаемое значение:
3314
  * eax = 0 - успешно
3315
  * eax = 1 - приёмник не определил буфер для IPC-сообщений
3316
    (может быть, ещё не успел, а может быть, это не тот поток,
3317
    который нужен)
3318
  * eax = 2 - приёмник заблокировал IPC-буфер;
3319
    попробуйте немного подождать
3320
  * eax = 3 - переполнение IPC-буфера приёмника
3321
  * eax = 4 - процесса/потока с таким PID не существует
3322
Замечания:
3323
  * Система сразу после записи IPC-сообщения в буфер посылает
3324
    потоку-приёмнику событие с кодом 7 (см. коды событий).
3325
 
3326
======================================================================
3327
=== Функция 61 - получить параметры для прямого доступа к графике. ===
3328
======================================================================
3329
Программе доступны данные графического экрана (область памяти, которая
3330
собственно и отображает содержимое экрана) напрямую без вызовов
3331
системных функций через селектор gs:
3332
	mov	eax, [gs:0]
3333
поместит в eax первый dword буфера, содержащий информацию о цвете
3334
левой верхней точки (и, возможно, цвета нескольких следующих).
3335
	mov	[gs:0], eax
3336
при работе в режимах VESA c LFB
3337
установит цвет левой верхней точки
3338
(и возможно, цвета нескольких следующих).
3339
Для интерпретации данных графического экрана требуется знание
3340
некоторых параметров, которые возвращаются этой функцией.
3341
Замечания:
3342
  * Параметры графики очень редко меняются при работе системы,
3343
    а именно, только в случаях, когда пользователь работает
3344
    с программой VRR.
3345
  * При изменении видеорежима система перерисовывает все окна
3346
    (событие с кодом 1) и перерисовывает фон (событие 5).
3347
    Эти же события происходят и в других случаях,
3348
    которые встречаются значительно чаще, чем изменение видеорежима.
3349
  * При работе в видеорежимах с LFB селектор gs указывает на
3350
    собственно LFB, так что чтение/запись по gs приводят
3351
    непосредственно к изменению содержимого экрана. При работе в
3352
    видеорежимах без LFB gs указывает на некоторую область данных
3353
    ядра, причём все функции вывода на экран добросовестно выполняют
3354
    двойную работу по записи непосредственно на экран и по записи
3355
    в этот буфер. В результате при чтении содержимого этого буфера
3356
    результаты соответствуют содержимому экрана
3357
    (с, вообще говоря, большим цветовым разрешением),
3358
    а запись игнорируется.
3359
    Исключением является режим 320*200, для которого в главном цикле
3360
    системного потока выполняется обновление экрана в соответствии
3361
    с движениями курсора мыши.
3362
 
3363
------------------------- Разрешение экрана --------------------------
3364
Параметры:
3365
  * eax = 61 - номер функции
3366
  * ebx = 1 - номер подфункции
3367
Возвращаемое значение:
3368
  * eax = [разрешение по оси x]*65536 + [разрешение по оси y]
3369
Замечания:
3370
  * Можно использовать функцию 14 с учётом того, что она возвращает
3371
    размеры на 1 меньше. Это полностью эквивалентный способ.
3372
 
3373
------------------------ Число бит на пиксель ------------------------
3374
Параметры:
3375
  * eax = 61 - номер функции
3376
  * ebx = 2 - номер подфункции
3377
Возвращаемое значение:
3378
  * eax = число бит на пиксель (24 или 32)
3379
 
3380
------------------------ Число байт на строку ------------------------
3381
Параметры:
3382
  * eax = 61 - номер функции
3383
  * ebx = 3 - номер подфункции
3384
Возвращаемое значение:
3385
  * eax = число байт, которое занимает одна строка развёртки
3386
    (горизонтальная линия на экране)
3387
 
3388
======================================================================
3389
===== Функция 62, подфункция 0 - получить версию PCI-интерфейса. =====
3390
======================================================================
3391
Параметры:
3392
  * eax = 62 - номер функции
3393
  * bl = 0 - номер подфункции
3394
Возвращаемое значение:
3395
  * eax = -1 - доступ к PCI запрещён; иначе
3396
  * ah.al = версия PCI-интерфейса (ah=версия, al=подверсия)
3397
  * старшее слово eax обнулено
3398
Замечания:
3399
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
3400
    для приложений подфункцией 12 функции 21.
3401
  * Если PCI BIOS не поддерживается, то значение ax неопределено.
3402
 
3403
======================================================================
3404
==== Функция 62, подфункция 1 - получить номер последней PCI-шины. ===
3405
======================================================================
3406
Параметры:
3407
  * eax = 62 - номер функции
3408
  * bl = 1 - номер подфункции
3409
Возвращаемое значение:
3410
  * eax = -1 - доступ к PCI запрещён; иначе
3411
  * al = номер последней PCI-шины; оставшиеся байты eax разрушаются
3412
Замечания:
3413
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
3414
    для приложений подфункцией 12 функции 21.
3415
  * Если PCI BIOS не поддерживается, то значение al неопределено.
3416
 
3417
======================================================================
3418
====================== Функция 62, подфункция 2 ======================
3419
== Получить механизм обращения к конфигурационному пространству PCI. =
3420
======================================================================
3421
Параметры:
3422
  * eax = 62 - номер функции
3423
  * bl = 2 - номер подфункции
3424
Возвращаемое значение:
3425
  * eax = -1 - доступ к PCI запрещён; иначе
3426
  * al = механизм (1 или 2); прочие байты eax разрушаются
3427
Замечания:
3428
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
3429
    для приложений подфункцией 12 функции 21.
3430
  * Механизм обращения выбирается в соответствии
3431
    с характеристиками оборудования.
3432
  * Подфункции чтения и записи автоматически работают
3433
    с выбранным механизмом.
3434
 
3435
======================================================================
3436
======== Функция 62, подфункции 4,5,6 - прочитать PCI-регистр. =======
3437
======================================================================
3438
Параметры:
3439
  * eax = 62 - номер функции
3440
  * bl = 4 - читать байт
3441
  * bl = 5 - читать слово
3442
  * bl = 6 - читать двойное слово
3443
  * bh = номер PCI-шины
3444
  * ch = dddddfff, где ddddd = номер устройства на шине,
3445
    fff = номер функции устройства
3446
  * cl = номер регистра (должен быть чётным для bl=5,
3447
    делиться на 4 для bl=6)
3448
Возвращаемое значение:
3449
  * eax = -1 - ошибка (запрещён доступ к PCI или
3450
    неподдерживаемые параметры); иначе
3451
  * al/ax/eax (в зависимости от запрошенного размера) содержит данные;
3452
    оставшаяся часть регистра eax разрушается
3453
Замечания:
3454
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
3455
    для приложений подфункцией 12 функции 21.
3456
  * Механизм доступа 2 поддерживает только 16 устройств на шине и
3457
    игнорирует номер функции. Получить механизм доступа можно вызовом
3458
    подфункции 2.
3459
  * Некоторые регистры стандартны и существуют для всех устройств,
3460
    некоторые определяются конкретным устройством. Список первых
3461
    входит, например, в известный Interrupt List by Ralf Brown
3462
    (http://www.pobox.com/~ralf/files.html,
3463
    ftp://ftp.cs.cmu.edu/afs/cs/user/ralf/pub/);
3464
    список вторых должен быть указан в документации по устройству.
3465
 
3466
======================================================================
3467
======= Функция 62, подфункции 8,9,10 - записать в PCI-регистр. ======
3468
======================================================================
3469
Параметры:
3470
  * eax = 62 - номер функции
3471
  * bl = 8 - писать байт
3472
  * bl = 9 - писать слово
3473
  * bl = 10 - писать двойное слово
3474
  * bh = номер PCI-шины
3475
  * ch = dddddfff, где ddddd = номер устройства на шине,
3476
    fff = номер функции устройства
3477
  * cl = номер регистра (должен быть чётным для bl=9,
3478
    делиться на 4 для bl=10)
3479
Возвращаемое значение:
3480
  * eax = -1 - ошибка (запрещён доступ к PCI или
3481
    неподдерживаемые параметры)
3482
  * eax = 0 - успешно
3483
Замечания:
3484
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
3485
    для приложений подфункцией 12 функции 21.
3486
  * Механизм доступа 2 поддерживает только 16 устройств на шине и
3487
    игнорирует номер функции. Получить механизм доступа можно вызовом
3488
    подфункции 2.
3489
  * Некоторые регистры стандартны и существуют для всех устройств,
3490
    некоторые определяются конкретным устройством. Список первых
3491
    входит, например, в известный Interrupt List by Ralf Brown;
3492
    список вторых должен быть указан в документации по устройству.
3493
 
3494
======================================================================
3495
================ Функция 63 - работа с доской отладки. ===============
3496
======================================================================
3497
Доска отладки представляет собой системный буфер (на 512 байт),
3498
в который любая программа может записать (вообще говоря, произвольные)
3499
данные и из которого другая программа может эти данные прочитать.
3500
Есть соглашение, в соответствии с которым записываемые данные -
3501
текстовые строки, интерпретируемые как отладочные сообщения о ходе
3502
выполнения программы. Ядро в определённых ситуациях также записывает
3503
на доску отладки сведения о выполнении некоторых функций;
3504
по соглашению сообщения ядра начинаются с префикса "K : ".
3505
Для просмотра доски отладки создано приложение board,
3506
которое считывает данные из буфера и отображает их в своём окне. board
3507
понимает последовательность кодов 13,10 как переход на новую строку.
3508
Символ с нулевым кодом в конце строки не обязателен, но и не мешает.
3509
В связи с появлением отладчика ценность доски отладки несколько
3510
снизилась, поскольку отладчик позволяет полностью контролировать ход
3511
выполнения программы, причём для этого не требуется никаких усилий
3512
со стороны самой программы. Тем не менее во многих случаях
3513
доска отладки продолжает оставаться полезной.
3514
 
3515
---------------------------- Запись байта ----------------------------
3516
Параметры:
3517
  * eax = 63 - номер функции
3518
  * ebx = 1 - номер подфункции
3519
  * cl = байт данных
3520
Возвращаемое значение:
3521
  * функция не возвращает значения
3522
Замечания:
3523
  * Байт записывается в буфер. Длина буфера - 512 байт.
3524
    При переполнении буфера все полученные данные теряются
3525
    и заполнение начинается снова с нуля.
3526
  * Для вывода на доску отладки более сложных объектов (строк, чисел)
3527
    достаточно этой функции, вызываемой в цикле. Можно не писать
3528
    вручную соответствующий код, а воспользоваться файлом debug.inc,
3529
    входящим в дистрибутив.
3530
 
3531
---------------------------- Чтение байта ----------------------------
3532
Забирает байт из буфера.
3533
Параметры:
3534
  * eax = 63 - номер функции
3535
  * ebx = 2 - номер подфункции
3536
Возвращаемое значение:
3537
  * eax = ebx = 0 - буфер пуст
3538
  * eax = байт, ebx = 1 - байт успешно прочитан
3539
 
3540
======================================================================
3541
========== Функция 64 - перераспределить память приложения. ==========
3542
======================================================================
3543
Параметры:
3544
  * eax = 64 - номер функции
3545
  * ebx = 1 - единственная подфункция
3546
  * ecx = новый размер памяти
3547
Возвращаемое значение:
3548
  * eax = 0 - успешно
3549
  * eax = 1 - недостаточно памяти
3550
Замечания:
3551
  * На данный момент эта функция является единственным средством для
3552
    динамического выделения/освобождения памяти приложения.
3553
 
3554
======================================================================
3555
=========== Функция 66 - режим получения данных клавиатуры. ==========
3556
======================================================================
3557
Режим ввода влияет на результаты чтения клавиш функцией 2
3558
и получения последней нажатой клавиши подфункцией 12 функции 18.
3559
При загрузке программы для неё устанавливается ASCII-режим ввода.
3560
 
3561
------------------ Подфункция 1 - установить режим. ------------------
3562
Параметры:
3563
  * eax = 66 - номер функции
3564
  * ebx = 1 - номер подфункции
3565
  * ecx = режим:
3566
    * 0 = обычный (ASCII-символы)
3567
    * 1 = сканкоды
3568
Возвращаемое значение:
3569
  * функция не возвращает значения
3570
 
3571
------------------- Подфункция 2 - получить режим. -------------------
3572
Параметры:
3573
  * eax = 66 - номер функции
3574
  * ebx = 2 - номер подфункции
3575
Возвращаемое значение:
3576
  * eax = текущий режим
3577
 
3578
------- Подфункция 3 - получить состояние управляющих клавиш. --------
3579
Параметры:
3580
  * eax = 66 - номер функции
3581
  * ebx = 3 - номер подфункции
3582
Возвращаемое значение:
3583
  * eax = битовая маска:
3584
  * бит 0 (маска 1): левый Shift нажат
3585
  * бит 1 (маска 2): правый Shift нажат
3586
  * бит 2 (маска 4): левый Ctrl нажат
3587
  * бит 3 (маска 8): правый Ctrl нажат
3588
  * бит 4 (маска 0x10): левый Alt нажат
3589
  * бит 5 (маска 0x20): правый Alt нажат
3590
  * бит 6 (маска 0x40): CapsLock включён
3591
  * бит 7 (маска 0x80): NumLock включён
3592
  * бит 8 (маска 0x100): ScrollLock включён
3593
  * прочие биты сброшены
3594
 
3595
======================================================================
3596
============ Функция 67 - изменить положение/размеры окна. ===========
3597
======================================================================
3598
Параметры:
3599
  * eax = 67 - номер функции
3600
  * ebx = новая x-координата окна
3601
  * ecx = новая y-координата окна
3602
  * edx = новый x-размер окна
3603
  * esi = новый y-размер окна
3604
Возвращаемое значение:
3605
  * функция не возвращает значения
3606
Замечания:
3607
  * Значение -1 для параметра означает "не изменять"; например, для
3608
    перемещения окна без изменения размеров можно указать edx=esi=-1.
3609
  * Предварительно окно должно быть определено функцией 0.
3610
    Она же задаёт начальные координаты и размеры окна.
3611
  * Размеры окна понимаются в смысле функции 0, т.е.
3612
    на один пиксель меньше, чем реальные размеры.
3613
  * Вызов функции для максимизированных окон просто игнорируется.
3614
  * Для окон соответствующих стилей положение и/или размеры могут быть
3615
    изменены пользователем; текущие положение и размеры могут быть
3616
    получены вызовом функции 9.
3617
  * Функция посылает окну событие перерисовки (с кодом 1).
3618
 
3619
======================================================================
3620
=== Функция 68, подфункция 0 - получить счётчик переключений задач. ==
3621
======================================================================
3622
Параметры:
3623
  * eax = 68 - номер функции
3624
  * ebx = 0 - номер подфункции
3625
Возвращаемое значение:
3626
  * eax = число переключений задач с момента загрузки системы
3627
    (по модулю 2^32)
3628
 
3629
======================================================================
3630
====================== Функция 68, подфункция 1 ======================
3631
============ Переключиться на следующий поток выполнения. ============
3632
======================================================================
3633
Функция завершает текущий квант времени, выделенный потоку,
3634
и переключается на следующий.
3635
(Какой поток какого процесса будет следующим, предсказать нельзя).
3636
Позднее, когда до текущего потока дойдёт очередь,
3637
выполнение возобновится.
3638
Параметры:
3639
  * eax = 68 - номер функции
3640
  * ebx = 1 - номер подфункции
3641
Возвращаемое значение:
3642
  * функция не возвращает значения
3643
 
3644
======================================================================
3645
=============== Функция 68, подфункция 2 - кэш + rdpmc. ==============
3646
======================================================================
3647
Параметры:
3648
  * eax = 68 - номер функции
3649
  * ebx = 2 - номер подфункции
3650
  * ecx = требуемое действие:
3651
    * ecx = 0 - разрешить выполнение инструкции rdpmc
3652
      (ReaD Performance-Monitoring Counters)
3653
    * ecx = 1 - узнать, включён/выключен кэш
3654
    * ecx = 2 - включить кэш
3655
    * ecx = 3 - выключить кэш
3656
Возвращаемое значение:
3657
  * для ecx=0:
3658
    * eax = значение cr4
3659
  * для ecx=1:
3660
    * eax = (cr0 and 0x60000000):
3661
    * eax = 0 - кэш включён
3662
    * eax <> 0 - кэш выключен
3663
  * для ecx=2 и ecx=3:
3664
    * функция не возвращает значения
3665
 
3666
======================================================================
3667
========== Функция 68, подфункция 3 - прочитать MSR-регистр. =========
3668
======================================================================
3669
MSR = Model Specific Register; полный список MSR-регистров процессора
3670
содержится в документации по процессору (например, IA-32 Intel
3671
Architecture Software Developer's Manual, Volume 3, Appendix B);
3672
каждое семейство процессоров имеет своё подмножество MSR-регистров.
3673
Параметры:
3674
  * eax = 68 - номер функции
3675
  * ebx = 3 - номер подфункции
3676
  * ecx игнорируется
3677
  * edx = адрес MSR
3678
Возвращаемое значение:
3679
  * ebx:eax = старший:младший dword результата
3680
Замечания:
3681
  * Указание в ecx несуществующего или нереализованного для данного
3682
    процессора MSR повлечёт исключение в ядре, которое прибьёт поток.
3683
  * Предварительно следует определить, поддерживаются ли MSR в целом,
3684
    командой cpuid. Иначе возникнет уже другое исключение в ядре,
3685
    которое всё равно прибьёт поток.
3686
 
3687
======================================================================
3688
========= Функция 68, подфункция 4 - записать в MSR-регистр. =========
3689
======================================================================
3690
MSR = Model Specific Register; полный список MSR-регистров процессора
3691
содержится в документации по процессору (например, IA-32 Intel
3692
Architecture Software Developer's Manual, Volume 3, Appendix B);
3693
каждое семейство процессоров имеет своё подмножество MSR-регистров.
3694
Параметры:
3695
  * eax = 68 - номер функции
3696
  * ebx = 4 - номер подфункции
3697
  * ecx игнорируется
3698
  * edx = адрес MSR
3699
  * esi:edi = старший:младший dword
3700
Возвращаемое значение:
3701
  * ebx:eax = копия esi:edi
3702
Замечания:
3703
  * Указание в ecx несуществующего или нереализованного для данного
3704
    процессора MSR повлечёт исключение в ядре, которое прибьёт поток.
3705
  * Предварительно следует определить, поддерживаются ли MSR в целом,
3706
    командой cpuid. Иначе возникнет уже другое исключение в ядре,
3707
    которое всё равно прибьёт поток.
3708
 
3709
======================================================================
3710
======= Функция 68, подфункция 5 - выделить физическую память. =======
3711
======================================================================
3712
Параметры:
3713
  * eax = 68 - номер функции
3714
  * ebx = 5 - номер подфункции
3715
  * ecx = размер (в байтах)
3716
Возвращаемое значение:
3717
  * eax = физический адрес выделенной памяти
3718
Замечания:
3719
  * Обычные приложения не должны использовать эту функцию, она
3720
    предназначена для случая, когда при работе с каким-либо
3721
    устройством требуется разместить данные по известному физическому
3722
    адресу. (В сущности, эта функция разрабатывалась для AC97WAV.)
3723
  * Число блоков физической памяти ограничено (константой 24,
3724
    причём эта константа включает и несколько блоков памяти
3725
    для надобностей ядра).
3726
  * Освободить выделенную таким образом память можно
3727
    подфункцией 6, копированием данных туда/обратно
3728
    занимаются подфункции 7 и 8.
3729
 
3730
======================================================================
3731
====== Функция 68, подфункция 6 - освободить физическую память. ======
3732
======================================================================
3733
Параметры:
3734
  * eax = 68 - номер функции
3735
  * ebx = 6 - номер подфункции
3736
  * ecx = физический адрес памяти
3737
Возвращаемое значение:
3738
  * функция не возвращает значения
3739
Замечания:
3740
  * Обычные приложения не должны использовать эту функцию, она
3741
    предназначена для случая, когда при работе с каким-либо
3742
    устройством требуется разместить данные по известному физическому
3743
    адресу. (В сущности, эта функция разрабатывалась для AC97WAV.)
3744
  * Память должна быть ранее выделена подфункцией 5.
3745
 
3746
======================================================================
3747
=== Функция 68, подфункция 7 - записать данные в физическую память. ==
3748
======================================================================
3749
Параметры:
3750
  * eax = 68 - номер функции
3751
  * ebx = 7 - номер подфункции
3752
  * ecx = физический адрес
3753
  * edx = указатель на данные (в приложении)
3754
  * esi = размер данных (в байтах)
3755
Возвращаемое значение:
3756
  * функция не возвращает значения
3757
Замечания:
3758
  * Обычные приложения не должны использовать эту функцию, она
3759
    предназначена для случая, когда при работе с каким-либо
3760
    устройством требуется разместить данные по известному физическому
3761
    адресу. (В сущности, эта функция разрабатывалась для AC97WAV.)
3762
  * Диапазон физических адресов должен лежать внутри ранее выделенного
3763
    подфункцией 5 блока физической памяти.
3764
  * Проверок корректности не производится.
3765
 
3766
======================================================================
3767
== Функция 68, подфункция 8 - прочитать данные из физической памяти. =
3768
======================================================================
3769
Параметры:
3770
  * eax = 68 - номер функции
3771
  * ebx = 8 - номер подфункции
3772
  * ecx = физический адрес
3773
  * edx = указатель на буфер для данных (в приложении)
3774
  * esi = размер данных (в байтах)
3775
Возвращаемое значение:
3776
  * функция не возвращает значения
3777
Замечания:
3778
  * Обычные приложения не должны использовать эту функцию, она
3779
    предназначена для случая, когда при работе с каким-либо
3780
    устройством требуется разместить данные по известному физическому
3781
    адресу. (В сущности, эта функция разрабатывалась для AC97WAV.)
3782
  * Диапазон физических адресов должен лежать внутри ранее выделенного
3783
    подфункцией 5 блока физической памяти.
3784
  * Проверок корректности не производится.
3785
 
3786
======================================================================
3787
======================== Функция 69 - отладка. =======================
3788
======================================================================
3789
Процесс может загрузить другой процесс как отлаживаемый установкой
3790
соответствующего бита при вызове подфункции 16 функции 58.
3791
У процесса может быть только один отладчик; один процесс может
3792
отлаживать несколько разных. Система уведомляет отладчик о событиях,
3793
происходящих с отлаживаемым процессом. Сообщения записываются в буфер,
3794
определённый подфункцией 0.
3795
Формат сообщения:
3796
  * +0: dword: код сообщения
3797
  * +4: dword: PID отлаживаемого процесса
3798
  * +8: могут присутствовать дополнительные данные,
3799
    определяемые кодом сообщения
3800
Коды сообщений:
3801
  * 1 = исключение
3802
    * дополнительно передаётся dword-номер исключения
3803
    * процесс приостановлен
3804
  * 2 = процесс завершился
3805
    * приходит при любом завершении: как через системную функцию -1,
3806
      так и при "убийстве" любым другим процессом
3807
      (в том числе самим отладчиком)
3808
  * 3 = отладочное исключение int 1 = #DB
3809
    * дополнительно передаётся dword-образ регистра DR6:
3810
      * биты 0-3: выполнено условие соответствующей точки останова
3811
        (установленной подфункцией 9)
3812
      * бит 14: исключение произошло из-за режима
3813
        пошаговой трассировки (установлен флаг TF)
3814
    * процесс приостановлен
3815
При завершении отладчика прибиваются все отлаживаемые процессы.
3816
Если отладчик этого не хочет, он должен предварительно отключиться
3817
подфункцией 3.
3818
 
3819
Все подфункции применимы только к процессам/потокам, запущенным
3820
из текущего функцией 58 с установленным флагом отладки.
3821
Отладка многопоточных программ пока не поддерживается.
3822
Полный список подфункций:
3823
  * подфункция 0 - определить область данных для отладочных сообщений
3824
  * подфункция 1 - получить состояние регистров отлаживаемого потока
3825
  * подфункция 2 - установить состояние регистров отлаживаемого потока
3826
  * подфункция 3 - отключиться от отлаживаемого процесса
3827
  * подфункция 4 - приостановить отлаживаемый поток
3828
  * подфункция 5 - возобновить выполнение отлаживаемого потока
3829
  * подфункция 6 - прочитать из памяти отлаживаемого процесса
3830
  * подфункция 7 - записать в память отлаживаемого процесса
3831
  * подфункция 8 - завершить отлаживаемый поток
3832
  * подфункция 9 - установить/снять аппаратную точку останова
3833
 
3834
======================================================================
3835
====================== Функция 69, подфункция 0 ======================
3836
========= Определить область данных для отладочных сообщений. ========
3837
======================================================================
3838
Параметры:
3839
  * eax = 69 - номер функции
3840
  * ebx = 0 - номер подфункции
3841
  * ecx = указатель
3842
Формат области данных:
3843
  * +0: dword: N = размер буфера (не считая этого заголовка)
3844
  * +4: dword: занято в буфере
3845
  * +8: N*byte: буфер
3846
Возвращаемое значение:
3847
  * функция не возвращает значения
3848
Замечания:
3849
  * Если поле размера отрицательно, буфер считается заблокированным
3850
    и при поступлении нового сообщения система будет ждать.
3851
    Для синхронизации обрамляйте всю работу с буфером операциями
3852
    блокировки/разблокировки
3853
    	neg	[bufsize]
3854
  * Данные в буфере трактуются как массив элементов переменной длины -
3855
    сообщений. Формат сообщения указан в общем описании.
3856
 
3857
======================================================================
3858
====================== Функция 69, подфункция 1 ======================
3859
========= Получить состояние регистров отлаживаемого потока. =========
3860
======================================================================
3861
Параметры:
3862
  * eax = 69 - номер функции
3863
  * ebx = 1 - номер подфункции
3864
  * ecx = идентификатор потока
3865
  * edx = длина структуры контекста, должно быть 0x28=40 байт
3866
Возвращаемое значение:
3867
  * функция не возвращает значения
3868
Формат структуры контекста: (FPU пока не поддерживается)
3869
  * +0: dword: eip
3870
  * +4: dword: eflags
3871
  * +8: dword: eax
3872
  * +12 = +0xC: dword: ecx
3873
  * +16 = +0x10: dword: edx
3874
  * +20 = +0x14: dword: ebx
3875
  * +24 = +0x18: dword: esp
3876
  * +28 = +0x1C: dword: ebp
3877
  * +32 = +0x20: dword: esi
3878
  * +36 = +0x24: dword: edi
3879
Замечания:
3880
  * Если поток выполняет код 0-кольца, возвращается
3881
    состояние регистров 3-кольца.
3882
  * Процесс должен быть загружен для отладки (как указано в
3883
    общем описании).
3884
 
3885
======================================================================
3886
====================== Функция 69, подфункция 2 ======================
3887
======== Установить состояние регистров отлаживаемого потока. ========
3888
======================================================================
3889
Параметры:
3890
  * eax = 69 - номер функции
3891
  * ebx = 2 - номер подфункции
3892
  * ecx = идентификатор потока
3893
  * edx = длина структуры контекста, должно быть 0x28=40 байт
3894
Возвращаемое значение:
3895
  * функция не возвращает значения
3896
Формат структуры контекста указан в описании подфункции 1.
3897
Замечания:
3898
  * Если поток выполняет код 0-кольца, устанавливается
3899
    состояние регистров 3-кольца.
3900
  * Процесс должен быть загружен для отладки (как указано в
3901
    общем описании).
3902
 
3903
======================================================================
3904
== Функция 69, подфункция 3 - отключиться от отлаживаемого процесса. =
3905
======================================================================
3906
Параметры:
3907
  * eax = 69 - номер функции
3908
  * ebx = 3 - номер подфункции
3909
  * ecx = идентификатор
3910
Возвращаемое значение:
3911
  * функция не возвращает значения
3912
Замечания:
3913
  * Если процесс был приостановлен, он возобновляет выполнение.
3914
 
3915
======================================================================
3916
==== Функция 69, подфункция 4 - приостановить отлаживаемый поток. ====
3917
======================================================================
3918
Параметры:
3919
  * eax = 69 - номер процесса
3920
  * ebx = 4 - номер подфункции
3921
  * ecx = идентификатор
3922
Возвращаемое значение:
3923
  * функция не возвращает значения
3924
Замечания:
3925
  * Процесс должен быть загружен для отладки (как указано в
3926
    общем описании).
3927
 
3928
======================================================================
3929
====================== Функция 69, подфункция 5 ======================
3930
============ Возобновить выполнение отлаживаемого потока. ============
3931
======================================================================
3932
Параметры:
3933
  * eax = 69 - номер функции
3934
  * ebx = 5 - номер подфункции
3935
  * ecx = идентификатор
3936
Возвращаемое значение:
3937
  * функция не возвращает значения
3938
Замечания:
3939
  * Процесс должен быть загружен для отладки (как указано в
3940
    общем описании).
3941
 
3942
======================================================================
3943
====================== Функция 69, подфункция 6 ======================
3944
============= Прочитать из памяти отлаживаемого процесса. ============
3945
======================================================================
3946
Параметры:
3947
  * eax = 69 - номер функции
3948
  * ebx = 6 - номер подфункции
3949
  * ecx = идентификатор
3950
  * edx = сколько байт читать
3951
  * esi = адрес памяти отлаживаемого процесса
3952
  * edi = указатель на буфер для данных
3953
Возвращаемое значение:
3954
  * eax = -1 при ошибке (неверный PID или буфер)
3955
  * иначе eax = число прочитанных байт (возможно, 0,
3956
    если в esi слишком большое значение)
3957
Замечания:
3958
  * Процесс должен быть загружен для отладки (как указано в
3959
    общем описании).
3960
 
3961
======================================================================
3962
 Функция 69, подфункция 7 - записать в память отлаживаемого процесса.
3963
======================================================================
3964
Параметры:
3965
  * eax = 69 - номер функции
3966
  * ebx = 7 - номер подфункции
3967
  * ecx = идентификатор
3968
  * edx = сколько байт писать
3969
  * esi = адрес памяти в отлаживаемом процессе
3970
  * edi = указатель на данные
3971
Возвращаемое значение:
3972
  * eax = -1 при ошибке (неверный PID или буфер)
3973
  * иначе eax = число записанных байт (возможно, 0,
3974
    если в esi слишком большое значение)
3975
Замечания:
3976
  * Процесс должен быть загружен для отладки (как указано в
3977
    общем описании).
3978
 
3979
======================================================================
3980
====== Функция 69, подфункция 8 - завершить отлаживаемый поток. ======
3981
======================================================================
3982
Параметры:
3983
  * eax = 69 - номер функции
3984
  * ebx = 8 - номер подфункции
3985
  * ecx = идентификатор
3986
Возвращаемое значение:
3987
  * функция не возвращает значения
3988
Замечания:
3989
  * Процесс должен быть загружен для отладки (как указано в
3990
    общем описании).
3991
  * Функция аналогична подфункции 2 функции 18 с двумя отличиями:
3992
    требуется выполнение первого замечания и принимается PID,
3993
    а не номер слота.
3994
 
3995
======================================================================
3996
====================== Функция 69, подфункция 9 ======================
3997
============= Установить/снять аппаратную точку останова. ============
3998
======================================================================
3999
Параметры:
4000
  * eax = 69 - номер функции
4001
  * ebx = 9 - номер подфункции
4002
  * ecx = идентификатор потока
4003
  * dl = индекс точки останова, от 0 до 3 включительно
4004
  * dh = флаги:
4005
    * если старший бит сброшен - установить точку останова:
4006
      * биты 0-1 - условие:
4007
        * 00 = точка останова на выполнение
4008
        * 01 = точка останова на запись
4009
        * 11 = точка останова на чтение/запись
4010
      * биты 2-3 - длина; для точек останова на исполнение должно быть
4011
        00, в противном случае одно из
4012
        * 00 = байт
4013
        * 01 = слово
4014
        * 11 = двойное слово
4015
      * esi = адрес точки останова; должен быть выровнен
4016
        соответственно длине (т.е. должен быть чётным для
4017
        точек останова на слово, кратен 4 для двойного слова)
4018
    * если старший бит установлен - сбросить точку останова
4019
Возвращаемое значение:
4020
  * eax = 0 - успешно
4021
  * eax = 1 - ошибка во входных данных
4022
  * eax = 2 - (зарезервировано, никогда не возвращается
4023
    в текущей реализации) с этим индексом уже установлена
4024
    глобальная точка останова
4025
Замечания:
4026
  * Процесс должен быть загружен для отладки (как указано в
4027
    общем описании).
4028
  * Аппаратные точки останова реализуются через DRx-регистры
4029
    процессора, отсюда все ограничения.
4030
  * Функция может переустановить ранее установленную ей же
4031
    точку останова (никак не сообщая об этом).
4032
    Ведите список установленных точек останова в отладчике.
4033
  * Срабатывание точки останова заключается в генерировании
4034
    отладочного исключения #DB, о котором система сообщает отладчику.
4035
  * Точка останова на запись и чтение/запись срабатывает после
4036
    выполнения вызвавшей её инструкции.
4037
 
4038
======================================================================
4039
= Функция 70 - работа с файловой системой с поддержкой длинных имён. =
4040
======================================================================
4041
Параметры:
4042
  * eax = 70
4043
  * ebx = указатель на информационную структуру
4044
Возвращаемое значение:
4045
  * eax = 0 - успешно; иначе код ошибки файловой системы
4046
  * в зависимости от подфункции может возвращаться значение и
4047
    в других регистрах
4048
Общий формат информационной структуры:
4049
  * +0: dword: номер подфункции
4050
  * +4: dword: смещение в файле
4051
  * +8: dword: старший dword смещения (должен быть 0)
4052
  * +12 = +0xC: dword: размер
4053
  * +16 = +0x10: dword: указатель на данные
4054
  * +20 = +0x14: n db: ASCIIZ-строка с именем файла
4055
Уточнения - в документации на соответствующую подфункцию.
4056
Имя файла нечувствительно к регистру букв. Русские буквы должны быть
4057
записаны в кодировке cp866 (DOS).
4058
Формат имени файла:
4059
/base/number/dir1/dir2/.../dirn/file,
4060
где /base/number идентифицирует устройство, на котором ищется файл:
4061
одно из
4062
  * /RD/1 = /RAMDISK/1 для доступа к рамдиску
4063
  * /FD/1 = /FLOPPYDISK/1 для доступа к первому флоппи-дисководу,
4064
    /FD/2 = /FLOPPYDISK/2 для второго флоппи-дисковода
4065
  * /HD0/x, /HD1/x, /HD2/x, /HD3/x для доступа соответственно
4066
    к устройствам IDE0 (Primary Master), IDE1 (Primary Slave),
4067
    IDE2 (Secondary Master), IDE3 (Secondary Slave);
4068
    x - номер раздела на выбранном винчестере, изменяется от 1 до 255
4069
    (на каждом из винчестеров нумерация начинается с 1)
4070
Примеры:
83 diamond 4071
  * '/rd/1/kernel.asm',0
77 diamond 4072
  * '/HD0/1/kernel.asm',0
4073
  * '/hd0/2/menuet/pics/tanzania.bmp',0
4074
  * '/hd0/1/Program files/NameOfProgram/SomeFile.SomeExtension',0
4075
Доступные подфункции:
4076
  * подфункция 0 - чтение файла
4077
  * подфункция 1 - чтение папки
83 diamond 4078
  * подфункция 2 - создание/перезапись файла
77 diamond 4079
 
4080
======================================================================
4081
= Функция 70, подфункция 0 - чтение файла с поддержкой длинных имён. =
4082
======================================================================
4083
Параметры:
4084
  * eax = 70 - номер функции
4085
  * ebx = указатель на информационную структуру
4086
Формат информационной структуры:
4087
  * +0: dword: 0 = номер подфункции
4088
  * +4: dword: позиция в файле (в байтах)
4089
  * +8: dword: 0 (зарезервировано под старший dword позиции)
4090
  * +12 = +0xC: dword: сколько байт читать
4091
  * +16 = +0x10: dword: указатель на буфер, куда будут записаны данные
4092
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
4093
    общем описании
4094
Возвращаемое значение:
4095
  * eax = 0 - успешно, иначе код ошибки файловой системы
4096
  * ebx = число прочитанных байт или
4097
    -1=0xffffffff, если файл не найден
4098
Замечания:
4099
  * Если файл кончился раньше, чем был прочитан последний запрошенный
4100
    блок, то функция прочитает, сколько сможет, после чего вернёт
4101
    eax=6 (EOF).
4102
  * Функция не позволяет читать папки
4103
    (вернётся eax=10, access denied).
4104
 
4105
======================================================================
4106
= Функция 70, подфункция 1 - чтение папки с поддержкой длинных имён. =
4107
======================================================================
4108
Параметры:
4109
  * eax = 70 - номер функции
4110
  * ebx = указатель на информационную структуру
4111
Формат информационной структуры:
4112
  * +0: dword: 1 = номер подфункции
4113
  * +4: dword: индекс начального блока (считая с 0)
78 diamond 4114
  * +8: dword: поле флагов:
4115
    * бит 0 (маска 1): в каком формате возвращать имена,
4116
      0=ANSI, 1=UNICODE
4117
    * прочие биты зарезервированы и должны быть установлены в 0
4118
      для будущей совместимости
77 diamond 4119
  * +12 = +0xC: dword: сколько блоков читать
4120
  * +16 = +0x10: dword: указатель на буфер, куда будут записаны
4121
    данные, размер буфера должен быть не меньше 32 + [+12]*560 байт
4122
  * +20 = +0x14: ASCIIZ-имя папки, правила формирования имён указаны в
4123
    общем описании
4124
Возвращаемое значение:
4125
  * eax = 0 - успешно, иначе код ошибки файловой системы
4126
  * ebx = число файлов, информация о которых была записана в буфер,
4127
    или -1=0xffffffff, если папка не найдена
4128
Структура буфера:
4129
  * +0: 32*byte: заголовок
4130
  * +32 = +0x20: n1*byte: блок с информацией о файле 1
4131
  * +32+n1: n2*byte: блок с информацией о файле 2
4132
  * ...
4133
Структура заголовка:
4134
  * +0: dword: версия структуры (текущая версия = 1)
4135
  * +4: dword: количество размещённых блоков; не больше, чем запрошено
4136
    в поле +12 информационной структуры; может быть меньше,
4137
    если в папке кончились файлы (то же самое, что и в ebx)
4138
  * +8: dword: общее число файлов в папке
4139
  * +12 = +0xC: 20*byte: зарезервировано (нули)
4140
Структура блока данных входа каталога (БДВК):
4141
  * +0: dword: атрибуты файла:
4142
    * бит 0 (маска 1): файл только для чтения
4143
    * бит 1 (маска 2): файл является скрытым
4144
    * бит 2 (маска 4): файл является системным
4145
    * бит 3 (маска 8): это не файл, а метка тома
4146
      (на заданном разделе встречается не более одного раза и
4147
      только в корневой папке)
4148
    * бит 4 (маска 0x10): это папка
4149
    * бит 5 (маска 0x20): файл не архивировался - многие программы
4150
      архивации имеют опцию, по которой архивируются только файлы
4151
      с установленным этим битом, после чего этот бит сбрасывается -
4152
      это может быть полезно для автоматического создания
4153
      backup-архивов, ибо при записи бит обычно устанавливается
4154
      (не в Kolibri, правда)
78 diamond 4155
  * +4: byte: тип данных имени:
4156
    (совпадает с битом 0 флагов информационной структуры)
77 diamond 4157
    * 0 = ASCII = 1-байтное представление каждого символа
4158
    * 1 = UNICODE = 2-байтное представление каждого символа
4159
  * +5: 3*byte: зарезервировано (нули)
4160
  * +8: 4*byte: время создания файла
4161
  * +12 = +0xC: 4*byte: дата создания файла
4162
  * +16 = +0x10: 4*byte: время последнего доступа (чтение или запись)
4163
  * +20 = +0x14: 4*byte: дата последнего доступа
4164
  * +24 = +0x18: 4*byte: время последней модификации
4165
  * +28 = +0x1C: 4*byte: дата последней модификации
4166
  * +32 = +0x20: qword: размер файла в байтах (до 16777216 Тб)
4167
  * +40 = +0x28: имя
4168
    * для формата ASCII: максимальная длина имени 263 символа
4169
      (263 байта), байт после имени имеет значение 0
4170
    * для формата UNICODE: максимальная длина имени 259 символов
4171
      (518 байт), два байта после имени имеют значение 0
4172
Формат времени:
4173
  * +0: byte: секунды
4174
  * +1: byte: минуты
4175
  * +2: byte: часы
4176
  * +3: byte: зарезервировано (0)
4177
  * например, 23.59.59 записывается как (в hex) 3B 3B 17 00
4178
Формат даты:
4179
  * +0: byte: день
4180
  * +1: byte: месяц
4181
  * +2: word: год
4182
  * например, 25.11.1979 записывается как (в hex) 19 0B BB 07
4183
Замечания:
4184
  * Если в БДВК присутствует имя в ASCII, то длина БДВК составляет
4185
    304 байта, если в UNICODE - 560 байт. Значение длины выравнено
4186
    на целое кратное 16 байт
4187
    (для ускорения обработки в кэш-памяти CPU).
78 diamond 4188
  * Первый символ после имени нулевой (ASCIIZ-строка). Дальнейшие
4189
    данные содержат мусор.
77 diamond 4190
  * Если файлы в папке кончились раньше, чем было прочитано
4191
    запрошенное количество, то функция прочитает, сколько сможет,
4192
    после чего вернёт eax=6 (EOF).
4193
  * Любая папка на диске, кроме корневой, содержит два специальных
4194
    входа "." и "..", идентифицирующих соответственно саму папку и
4195
    родительскую папку.
4196
  * Функция позволяет также читать виртуальные папки "/", "/rd",
4197
    "/fd", "/hd[n]", при этом атрибуты подпапок полагаются равными
4198
    0x10, а времена и даты обнулены. Альтернативный способ получения
4199
    информации об оборудовании - подфункция 11 функции 18.
4200
 
4201
======================================================================
83 diamond 4202
====================== Функция 70, подфункция 2 ======================
4203
======== Создание/перезапись файла с поддержкой длинных имён. ========
4204
======================================================================
4205
Параметры:
4206
  * eax = 70 - номер функции
4207
  * ebx = указатель на информационную структуру
4208
Формат информационной структуры:
4209
  * +0: dword: 2 = номер подфункции
4210
  * +4: dword: 0 (зарезервировано)
4211
  * +8: dword: 0 (зарезервировано)
4212
  * +12 = +0xC: dword: сколько байт писать
4213
  * +16 = +0x10: dword: указатель на данные
4214
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
4215
    общем описании
4216
Возвращаемое значение:
4217
  * eax = 0 - успешно, иначе код ошибки файловой системы
4218
  * ebx = число записанных байт (возможно, 0)
4219
Замечания:
4220
  * Если файл с таким именем не существовал, он создаётся; если
4221
    существовал, то перезаписывается.
4222
  * Если свободного места на диске недостаточно, то функция запишет,
4223
    сколько сможет, после чего вернёт код ошибки 8.
4224
 
4225
======================================================================
77 diamond 4226
========== Функция -1 - завершить выполнение потока/процесса =========
4227
======================================================================
4228
Параметры:
4229
  * eax = -1 - номер функции
4230
Возвращаемое значение:
4231
  * функция не возвращает ни значения, ни управления
4232
Замечания:
4233
  * Если процесс явно не создавал потоков, то у него есть только
4234
    один поток, завершение которого приводит к завершению процесса.
4235
  * Если текущий поток - последний в процессе, то его завершение
4236
    также приводит к завершению процесса.
4237
  * Эта функция завершает текущий поток. Другой поток можно прибить
4238
    вызовом подфункции 2 функции 18.
4239
 
4240
======================================================================
4241
=========================== Список событий ===========================
4242
======================================================================
4243
Очередное событие можно получить вызовом одной из функций 10
4244
(ожидать события), 11 (проверить без ожидания), 23
4245
(ожидать в течение заданного времени).
4246
Эти функции возвращают только те события, которые входят в маску,
4247
устанавливаемую функцией 40. По умолчанию это первые три, чего
4248
вполне достаточно для многих приложений.
4249
Коды событий:
4250
  * 1 = сообщение о перерисовке (сбрасывается при вызове функции 0)
4251
  * 2 = нажата клавиша на клавиатуре (поступает, только когда окно
4252
    активно; сбрасывается, когда все клавиши из буфера
4253
    считаны функцией 2)
4254
  * 3 = нажата кнопка, определённая ранее функцией 8 (или кнопка
4255
    закрытия, созданная неявно функцией 0; кнопка минимизации
4256
    обрабатывается системой и о ней сообщения не приходит;
4257
    поступает, только когда окно активно; сбрасывается, когда все
4258
    кнопки из буфера считаны функцией 17)
4259
  * 4 = зарезервировано (в текущей реализации никогда не приходит даже
4260
    при размаскировке функцией 40)
4261
  * 5 = перерисовывается фон рабочего стола (сбрасывается
4262
    автоматически после перерисовки, так что если во время перерисовки
4263
    фона программа не ждёт и не проверяет события, то этого события
4264
    она не заметит)
4265
  * 6 = событие от мыши (что-то случилось - нажатие на кнопку мыши
4266
    или перемещение; сбрасывается при прочтении)
4267
  * 7 = произошло событие IPC (смотри функцию 60 - Inter Process
4268
    Communication; сбрасывается при прочтении)
4269
  * 8 = произошло сетевое событие (сбрасывается при прочтении;
4270
    смотри работу с сетью)
4271
  * 9 = произошло отладочное событие (сбрасывается при прочтении;
4272
    смотри отладочную подсистему)
4273
  * 16..31 = произошло событие с соответствующим IRQ
4274
    (16=IRQ0, 31=IRQ15) (сбрасывается при считывании всех данных IRQ)
4275
 
4276
======================================================================
4277
==================== Коды ошибок файловой системы ====================
4278
======================================================================
4279
  * 0 = успешно
4280
  * 1 = не определена база и/или раздел жёсткого диска (подфункциями
4281
    7, 8 функции 21)
4282
  * 2 = функция не поддерживается для данной файловой системы
4283
    (возвращается в случае попытки LBA-чтения при запрещённом LBA)
4284
  * 3 = неизвестная файловая система
4285
  * 4 = возвращается только функцией rename при передаче сильно
4286
    неверного параметра и никак не соответствует описанию
4287
    в исходниках ядра "partition not defined at hd"
4288
  * 5 = файл не найден
4289
  * 6 = файл закончился
4290
  * 7 = указатель вне памяти приложения
4291
  * 8 = диск заполнен
4292
  * 9 = таблица FAT разрушена
4293
  * 10 = доступ запрещён
83 diamond 4294
  * 11 = ошибка устройства
77 diamond 4295
При запуске программы возможны также следующие коды ошибок:
4296
  * 30 = 0x1E = недостаточно памяти
4297
  * 31 = 0x1F = файл не является исполнимым
4298
  * 32 = 0x20 = слишком много процессов