Subversion Repositories Kolibri OS

Rev

Rev 85 | Rev 91 | 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
Замечания:
86 diamond 3134
  * Эта функция устарела, используйте подфункцию 5 функции 70.
77 diamond 3135
  * Функция не поддерживается для дискет.
3136
  * Текущая реализация позволяет также определять размер папки
3137
    (по цепочке кластеров в FAT), но не следует на это полагаться.
3138
 
3139
======================================================================
3140
===== Функция 58, подфункция 13 - получить атрибуты файла/папки. =====
3141
======================================================================
3142
Параметры:
3143
  * eax = 58 - номер функции
3144
  * ebx = указатель на информационную структуру
3145
Формат информационной структуры:
3146
  * +0: dword: 13 = номер функции
3147
  * +4: dword: игнорируется
3148
  * +8: dword: игнорируется
3149
  * +12 = +0xC: dword: игнорируется
3150
  * +16 = +0x10: dword: указатель на буфер для работы системы
3151
    (4096 байт)
3152
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
3153
    общем описании
3154
Возвращаемое значение:
3155
  * eax = 0 - успешно, иначе код ошибки файловой системы
3156
  * ebx = байт FAT-атрибута (дополненный нулями до dword)
3157
    или 0 для HD, -1 для RD, если файл не найден
3158
Значения для битов FAT-атрибутов:
3159
  * бит 0: файл только для чтения
3160
  * бит 1: файл является скрытым
3161
  * бит 2: файл является системным
3162
  * бит 3: это не файл, а метка тома (может встречаться только
3163
    один раз на диске, в корневом каталоге)
3164
  * бит 4: это папка
3165
  * бит 5: файл не архивировался - многие программы архивации имеют
3166
    опцию, по которой архивируются только файлы с установленным этим
3167
    битом, после чего этот бит сбрасывается - это может быть полезно
3168
    для автоматического создания backup-архивов, ибо при записи
3169
    бит обычно устанавливается (не в Kolibri, правда)
3170
Замечания:
86 diamond 3171
  * Эта функция устарела, используйте подфункцию 5 функции 70.
77 diamond 3172
  * Функция не поддерживается для дискет.
3173
 
3174
======================================================================
3175
====================== Функция 58, подфункция 14 =====================
3176
======= Получить дату/время последней модификации файла/папки. =======
3177
======================================================================
3178
Параметры:
3179
  * eax = 58 - номер функции
3180
  * ebx = указатель на информационную структуру
3181
Формат информационной структуры:
3182
  * +0: dword: 14 = номер функции
3183
  * +4: dword: игнорируется
3184
  * +8: dword: игнорируется
3185
  * +12 = +0xC: dword: игнорируется
3186
  * +16 = +0x10: dword: указатель на буфер для работы системы
3187
    (4096 байт)
3188
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
3189
    общем описании
3190
Возвращаемое значение:
3191
  * eax = 0 - успешно, иначе код ошибки файловой системы
3192
  * ebx = дата/время в формате FAT или 0 для HD, -1 для RD,
3193
    если файл не найден
3194
  * младшее слово = время последней модификации, hhhhhmmmmmmsssss:
3195
    * младшие 5 бит = число двухсекундных интервалов, 0<=s<=29
3196
    * следующие 6 бит = минуты, 0<=m<=59
3197
    * старшие 5 бит = часы, 0<=h<=23
3198
  * старшее слово = дата последней модификации, yyyyyyymmmmddddd:
3199
    * младшие 5 бит = день, 1<=d<=31
3200
    * следующие 4 бита = месяц, 1<=m<=12
3201
    * старшие 7 бит = год относительно 1980
3202
Замечания:
86 diamond 3203
  * Эта функция устарела, используйте подфункцию 5 функции 70.
77 diamond 3204
  * Функция не поддерживается для дискет.
3205
  * Создание файла/папки считается модификацией.
3206
 
3207
======================================================================
3208
= Функция 58, подфункция 15 - получить информацию о файловой системе.
3209
======================================================================
3210
Параметры:
3211
  * eax = 58 - номер функции
3212
  * ebx = указатель на информационную структуру
3213
Формат информационной структуры:
3214
  * +0: dword: 15 = номер функции
3215
  * +4: dword: игнорируется
3216
  * +8: dword: игнорируется
3217
  * +12 = +0xC: dword: игнорируется
3218
  * +16 = +0x10: dword: игнорируется
3219
  * +20 = +0x14: (проверяется только второй символ, сразу после слэша)
3220
    /rd=/RAMDISK или /hd=/HARDDISK
3221
Возвращаемое значение:
3222
  * если второй символ не принадлежит множеству {'r','R','h','H'}:
3223
    * eax = 3
3224
    * ebx = ecx = dword [fileinfo] = 0
3225
  * для рамдиска:
3226
    * eax = 0 (успех)
3227
    * ebx = общее число кластеров = 2847
3228
    * ecx = число свободных кластеров
3229
    * dword [fileinfo] = размер кластера = 512
3230
  * для жёсткого диска: база и раздел определяются подфункциями 7 и 8
3231
    функции 21:
3232
    * eax = 0 (успех)
3233
    * ebx = общее число кластеров
3234
    * ecx = число свободных кластеров
3235
    * dword [fileinfo] = размер кластера (в байтах)
3236
Замечания:
3237
  * Не удивляйтесь странному расположению 4-го возвращаемого
3238
    параметра - когда писался этот код, при системных вызовах
3239
    приложению возвращались только регистры eax,ebx,ecx (из
3240
    pushad-структуры, передающейся как аргумент системной функции).
3241
    Теперь это исправлено, так что, возможно, имеет смысл возвращать
3242
    размер кластера в edx, пока эту функцию не начали использовать.
3243
  * Вообще-то ещё существует подфункция 11 функции 18, возвращающая
3244
    информацию о файловой системе. По расширенной таблице дисковой
3245
    подсистемы можно определить размер кластера (там он хранится
3246
    в секторах) и общее число кластеров для жёстких дисков.
3247
 
3248
======================================================================
3249
========== Функция 58, подфункция 16 - запустить программу. ==========
3250
======================================================================
3251
Параметры:
3252
  * eax = 58 - номер функции
3253
  * ebx = указатель на информационную структуру
3254
Формат информационной структуры:
3255
  * +0: dword: 16 = номер подфункции
3256
  * +4: dword: поле флагов:
3257
    * бит 0: запустить процесс как отлаживаемый
3258
    * остальные биты зарезервированы и должны быть установлены в 0
3259
  * +8: dword: 0 или указатель на ASCIIZ-строку с параметрами
3260
  * +12 = +0xC: dword: игнорируется
3261
  * +16 = +0x10: dword: указатель на буфер для работы системы
3262
    (4096 байт)
3263
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
3264
    общем описании
3265
Возвращаемое значение:
3266
  * eax > 0 - программа загружена, eax содержит PID
3267
  * eax < 0 - произошла ошибка, -eax содержит
3268
    код ошибки файловой системы
3269
Замечания:
3270
  * Комадная строка должна заканчиваться символом с кодом 0
3271
    (ASCIIZ-строка); учитываются либо все символы до завершающего нуля
3272
    включительно, либо первые 256 символов, в зависимости от того,
3273
    что меньше.
3274
  * Если процесс запускается как отлаживаемый, он создаётся
3275
    в замороженном состоянии; для запуска используйте
3276
    подфункцию 5 функции 69.
3277
 
3278
======================================================================
3279
=========== Функция 60 - Inter Process Communication (IPC). ==========
3280
======================================================================
3281
IPC применяется для посылок сообщений от одного процесса/потока
3282
другому. При этом следует предварительно договориться о том, как
3283
интерпретировать конкретное сообщение.
3284
 
3285
-------- Подфункция 1 - установить область для получения IPC ---------
3286
Вызывается процессом-приёмником.
3287
Параметры:
3288
  * eax = 60 - номер функции
3289
  * ebx = 1 - номер подфункции
3290
  * ecx = указатель на буфер
3291
  * edx = размер буфера
3292
Возвращаемое значение:
3293
  * eax = 0 - всегда успешно
3294
Формат IPC-буфера:
3295
  * +0: dword: если здесь не 0, то буфер считается заблокированным;
3296
    блокируйте/разблокируйте буфер, когда вы с ним активно работаете
3297
    и вам надо, чтобы извне не изменялись данные буфера
3298
    (не поступали новые сообщения)
3299
  * +4: dword: занято места в буфере (в байтах)
3300
  * +8: первое сообщение
3301
  * +8+n: второе сообщение
3302
  * ...
3303
Формат сообщения:
3304
  * +0: dword: PID процесса/потока, пославшего сообщение
3305
  * +4: dword: длина сообщения (не считая этот заголовок)
3306
  * +8: n*byte: данные сообщения
3307
 
3308
--------------- Подфункция 2 - послать сообщение IPC. ----------------
3309
Вызывается процессом-инициатором.
3310
Параметры:
3311
  * eax = 60 - номер функции
3312
  * ebx = 2 - номер подфункции
3313
  * ecx = PID приёмника
3314
  * edx = указатель на данные сообщения
3315
  * esi = длина сообщения (в байтах)
3316
Возвращаемое значение:
3317
  * eax = 0 - успешно
3318
  * eax = 1 - приёмник не определил буфер для IPC-сообщений
3319
    (может быть, ещё не успел, а может быть, это не тот поток,
3320
    который нужен)
3321
  * eax = 2 - приёмник заблокировал IPC-буфер;
3322
    попробуйте немного подождать
3323
  * eax = 3 - переполнение IPC-буфера приёмника
3324
  * eax = 4 - процесса/потока с таким PID не существует
3325
Замечания:
3326
  * Система сразу после записи IPC-сообщения в буфер посылает
3327
    потоку-приёмнику событие с кодом 7 (см. коды событий).
3328
 
3329
======================================================================
3330
=== Функция 61 - получить параметры для прямого доступа к графике. ===
3331
======================================================================
3332
Программе доступны данные графического экрана (область памяти, которая
3333
собственно и отображает содержимое экрана) напрямую без вызовов
3334
системных функций через селектор gs:
3335
	mov	eax, [gs:0]
3336
поместит в eax первый dword буфера, содержащий информацию о цвете
3337
левой верхней точки (и, возможно, цвета нескольких следующих).
3338
	mov	[gs:0], eax
3339
при работе в режимах VESA c LFB
3340
установит цвет левой верхней точки
3341
(и возможно, цвета нескольких следующих).
3342
Для интерпретации данных графического экрана требуется знание
3343
некоторых параметров, которые возвращаются этой функцией.
3344
Замечания:
3345
  * Параметры графики очень редко меняются при работе системы,
3346
    а именно, только в случаях, когда пользователь работает
3347
    с программой VRR.
3348
  * При изменении видеорежима система перерисовывает все окна
3349
    (событие с кодом 1) и перерисовывает фон (событие 5).
3350
    Эти же события происходят и в других случаях,
3351
    которые встречаются значительно чаще, чем изменение видеорежима.
3352
  * При работе в видеорежимах с LFB селектор gs указывает на
3353
    собственно LFB, так что чтение/запись по gs приводят
3354
    непосредственно к изменению содержимого экрана. При работе в
3355
    видеорежимах без LFB gs указывает на некоторую область данных
3356
    ядра, причём все функции вывода на экран добросовестно выполняют
3357
    двойную работу по записи непосредственно на экран и по записи
3358
    в этот буфер. В результате при чтении содержимого этого буфера
3359
    результаты соответствуют содержимому экрана
3360
    (с, вообще говоря, большим цветовым разрешением),
3361
    а запись игнорируется.
3362
    Исключением является режим 320*200, для которого в главном цикле
3363
    системного потока выполняется обновление экрана в соответствии
3364
    с движениями курсора мыши.
3365
 
3366
------------------------- Разрешение экрана --------------------------
3367
Параметры:
3368
  * eax = 61 - номер функции
3369
  * ebx = 1 - номер подфункции
3370
Возвращаемое значение:
3371
  * eax = [разрешение по оси x]*65536 + [разрешение по оси y]
3372
Замечания:
3373
  * Можно использовать функцию 14 с учётом того, что она возвращает
3374
    размеры на 1 меньше. Это полностью эквивалентный способ.
3375
 
3376
------------------------ Число бит на пиксель ------------------------
3377
Параметры:
3378
  * eax = 61 - номер функции
3379
  * ebx = 2 - номер подфункции
3380
Возвращаемое значение:
3381
  * eax = число бит на пиксель (24 или 32)
3382
 
3383
------------------------ Число байт на строку ------------------------
3384
Параметры:
3385
  * eax = 61 - номер функции
3386
  * ebx = 3 - номер подфункции
3387
Возвращаемое значение:
3388
  * eax = число байт, которое занимает одна строка развёртки
3389
    (горизонтальная линия на экране)
3390
 
3391
======================================================================
3392
===== Функция 62, подфункция 0 - получить версию PCI-интерфейса. =====
3393
======================================================================
3394
Параметры:
3395
  * eax = 62 - номер функции
3396
  * bl = 0 - номер подфункции
3397
Возвращаемое значение:
3398
  * eax = -1 - доступ к PCI запрещён; иначе
3399
  * ah.al = версия PCI-интерфейса (ah=версия, al=подверсия)
3400
  * старшее слово eax обнулено
3401
Замечания:
3402
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
3403
    для приложений подфункцией 12 функции 21.
3404
  * Если PCI BIOS не поддерживается, то значение ax неопределено.
3405
 
3406
======================================================================
3407
==== Функция 62, подфункция 1 - получить номер последней PCI-шины. ===
3408
======================================================================
3409
Параметры:
3410
  * eax = 62 - номер функции
3411
  * bl = 1 - номер подфункции
3412
Возвращаемое значение:
3413
  * eax = -1 - доступ к PCI запрещён; иначе
3414
  * al = номер последней PCI-шины; оставшиеся байты eax разрушаются
3415
Замечания:
3416
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
3417
    для приложений подфункцией 12 функции 21.
3418
  * Если PCI BIOS не поддерживается, то значение al неопределено.
3419
 
3420
======================================================================
3421
====================== Функция 62, подфункция 2 ======================
3422
== Получить механизм обращения к конфигурационному пространству PCI. =
3423
======================================================================
3424
Параметры:
3425
  * eax = 62 - номер функции
3426
  * bl = 2 - номер подфункции
3427
Возвращаемое значение:
3428
  * eax = -1 - доступ к PCI запрещён; иначе
3429
  * al = механизм (1 или 2); прочие байты eax разрушаются
3430
Замечания:
3431
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
3432
    для приложений подфункцией 12 функции 21.
3433
  * Механизм обращения выбирается в соответствии
3434
    с характеристиками оборудования.
3435
  * Подфункции чтения и записи автоматически работают
3436
    с выбранным механизмом.
3437
 
3438
======================================================================
3439
======== Функция 62, подфункции 4,5,6 - прочитать PCI-регистр. =======
3440
======================================================================
3441
Параметры:
3442
  * eax = 62 - номер функции
3443
  * bl = 4 - читать байт
3444
  * bl = 5 - читать слово
3445
  * bl = 6 - читать двойное слово
3446
  * bh = номер PCI-шины
3447
  * ch = dddddfff, где ddddd = номер устройства на шине,
3448
    fff = номер функции устройства
3449
  * cl = номер регистра (должен быть чётным для bl=5,
3450
    делиться на 4 для bl=6)
3451
Возвращаемое значение:
3452
  * eax = -1 - ошибка (запрещён доступ к PCI или
3453
    неподдерживаемые параметры); иначе
3454
  * al/ax/eax (в зависимости от запрошенного размера) содержит данные;
3455
    оставшаяся часть регистра eax разрушается
3456
Замечания:
3457
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
3458
    для приложений подфункцией 12 функции 21.
3459
  * Механизм доступа 2 поддерживает только 16 устройств на шине и
3460
    игнорирует номер функции. Получить механизм доступа можно вызовом
3461
    подфункции 2.
3462
  * Некоторые регистры стандартны и существуют для всех устройств,
3463
    некоторые определяются конкретным устройством. Список первых
3464
    входит, например, в известный Interrupt List by Ralf Brown
3465
    (http://www.pobox.com/~ralf/files.html,
3466
    ftp://ftp.cs.cmu.edu/afs/cs/user/ralf/pub/);
3467
    список вторых должен быть указан в документации по устройству.
3468
 
3469
======================================================================
3470
======= Функция 62, подфункции 8,9,10 - записать в PCI-регистр. ======
3471
======================================================================
3472
Параметры:
3473
  * eax = 62 - номер функции
3474
  * bl = 8 - писать байт
3475
  * bl = 9 - писать слово
3476
  * bl = 10 - писать двойное слово
3477
  * bh = номер PCI-шины
3478
  * ch = dddddfff, где ddddd = номер устройства на шине,
3479
    fff = номер функции устройства
3480
  * cl = номер регистра (должен быть чётным для bl=9,
3481
    делиться на 4 для bl=10)
3482
Возвращаемое значение:
3483
  * eax = -1 - ошибка (запрещён доступ к PCI или
3484
    неподдерживаемые параметры)
3485
  * eax = 0 - успешно
3486
Замечания:
3487
  * Предварительно должен быть разрешён низкоуровневый доступ к PCI
3488
    для приложений подфункцией 12 функции 21.
3489
  * Механизм доступа 2 поддерживает только 16 устройств на шине и
3490
    игнорирует номер функции. Получить механизм доступа можно вызовом
3491
    подфункции 2.
3492
  * Некоторые регистры стандартны и существуют для всех устройств,
3493
    некоторые определяются конкретным устройством. Список первых
3494
    входит, например, в известный Interrupt List by Ralf Brown;
3495
    список вторых должен быть указан в документации по устройству.
3496
 
3497
======================================================================
3498
================ Функция 63 - работа с доской отладки. ===============
3499
======================================================================
3500
Доска отладки представляет собой системный буфер (на 512 байт),
3501
в который любая программа может записать (вообще говоря, произвольные)
3502
данные и из которого другая программа может эти данные прочитать.
3503
Есть соглашение, в соответствии с которым записываемые данные -
3504
текстовые строки, интерпретируемые как отладочные сообщения о ходе
3505
выполнения программы. Ядро в определённых ситуациях также записывает
3506
на доску отладки сведения о выполнении некоторых функций;
3507
по соглашению сообщения ядра начинаются с префикса "K : ".
3508
Для просмотра доски отладки создано приложение board,
3509
которое считывает данные из буфера и отображает их в своём окне. board
3510
понимает последовательность кодов 13,10 как переход на новую строку.
3511
Символ с нулевым кодом в конце строки не обязателен, но и не мешает.
3512
В связи с появлением отладчика ценность доски отладки несколько
3513
снизилась, поскольку отладчик позволяет полностью контролировать ход
3514
выполнения программы, причём для этого не требуется никаких усилий
3515
со стороны самой программы. Тем не менее во многих случаях
3516
доска отладки продолжает оставаться полезной.
3517
 
3518
---------------------------- Запись байта ----------------------------
3519
Параметры:
3520
  * eax = 63 - номер функции
3521
  * ebx = 1 - номер подфункции
3522
  * cl = байт данных
3523
Возвращаемое значение:
3524
  * функция не возвращает значения
3525
Замечания:
3526
  * Байт записывается в буфер. Длина буфера - 512 байт.
3527
    При переполнении буфера все полученные данные теряются
3528
    и заполнение начинается снова с нуля.
3529
  * Для вывода на доску отладки более сложных объектов (строк, чисел)
3530
    достаточно этой функции, вызываемой в цикле. Можно не писать
3531
    вручную соответствующий код, а воспользоваться файлом debug.inc,
3532
    входящим в дистрибутив.
3533
 
3534
---------------------------- Чтение байта ----------------------------
3535
Забирает байт из буфера.
3536
Параметры:
3537
  * eax = 63 - номер функции
3538
  * ebx = 2 - номер подфункции
3539
Возвращаемое значение:
3540
  * eax = ebx = 0 - буфер пуст
3541
  * eax = байт, ebx = 1 - байт успешно прочитан
3542
 
3543
======================================================================
3544
========== Функция 64 - перераспределить память приложения. ==========
3545
======================================================================
3546
Параметры:
3547
  * eax = 64 - номер функции
3548
  * ebx = 1 - единственная подфункция
3549
  * ecx = новый размер памяти
3550
Возвращаемое значение:
3551
  * eax = 0 - успешно
3552
  * eax = 1 - недостаточно памяти
3553
Замечания:
3554
  * На данный момент эта функция является единственным средством для
3555
    динамического выделения/освобождения памяти приложения.
3556
 
3557
======================================================================
3558
=========== Функция 66 - режим получения данных клавиатуры. ==========
3559
======================================================================
3560
Режим ввода влияет на результаты чтения клавиш функцией 2
3561
и получения последней нажатой клавиши подфункцией 12 функции 18.
3562
При загрузке программы для неё устанавливается ASCII-режим ввода.
3563
 
3564
------------------ Подфункция 1 - установить режим. ------------------
3565
Параметры:
3566
  * eax = 66 - номер функции
3567
  * ebx = 1 - номер подфункции
3568
  * ecx = режим:
3569
    * 0 = обычный (ASCII-символы)
3570
    * 1 = сканкоды
3571
Возвращаемое значение:
3572
  * функция не возвращает значения
3573
 
3574
------------------- Подфункция 2 - получить режим. -------------------
3575
Параметры:
3576
  * eax = 66 - номер функции
3577
  * ebx = 2 - номер подфункции
3578
Возвращаемое значение:
3579
  * eax = текущий режим
3580
 
3581
------- Подфункция 3 - получить состояние управляющих клавиш. --------
3582
Параметры:
3583
  * eax = 66 - номер функции
3584
  * ebx = 3 - номер подфункции
3585
Возвращаемое значение:
3586
  * eax = битовая маска:
3587
  * бит 0 (маска 1): левый Shift нажат
3588
  * бит 1 (маска 2): правый Shift нажат
3589
  * бит 2 (маска 4): левый Ctrl нажат
3590
  * бит 3 (маска 8): правый Ctrl нажат
3591
  * бит 4 (маска 0x10): левый Alt нажат
3592
  * бит 5 (маска 0x20): правый Alt нажат
3593
  * бит 6 (маска 0x40): CapsLock включён
3594
  * бит 7 (маска 0x80): NumLock включён
3595
  * бит 8 (маска 0x100): ScrollLock включён
3596
  * прочие биты сброшены
3597
 
3598
======================================================================
3599
============ Функция 67 - изменить положение/размеры окна. ===========
3600
======================================================================
3601
Параметры:
3602
  * eax = 67 - номер функции
3603
  * ebx = новая x-координата окна
3604
  * ecx = новая y-координата окна
3605
  * edx = новый x-размер окна
3606
  * esi = новый y-размер окна
3607
Возвращаемое значение:
3608
  * функция не возвращает значения
3609
Замечания:
3610
  * Значение -1 для параметра означает "не изменять"; например, для
3611
    перемещения окна без изменения размеров можно указать edx=esi=-1.
3612
  * Предварительно окно должно быть определено функцией 0.
3613
    Она же задаёт начальные координаты и размеры окна.
3614
  * Размеры окна понимаются в смысле функции 0, т.е.
3615
    на один пиксель меньше, чем реальные размеры.
3616
  * Вызов функции для максимизированных окон просто игнорируется.
3617
  * Для окон соответствующих стилей положение и/или размеры могут быть
3618
    изменены пользователем; текущие положение и размеры могут быть
3619
    получены вызовом функции 9.
3620
  * Функция посылает окну событие перерисовки (с кодом 1).
3621
 
3622
======================================================================
3623
=== Функция 68, подфункция 0 - получить счётчик переключений задач. ==
3624
======================================================================
3625
Параметры:
3626
  * eax = 68 - номер функции
3627
  * ebx = 0 - номер подфункции
3628
Возвращаемое значение:
3629
  * eax = число переключений задач с момента загрузки системы
3630
    (по модулю 2^32)
3631
 
3632
======================================================================
3633
====================== Функция 68, подфункция 1 ======================
3634
============ Переключиться на следующий поток выполнения. ============
3635
======================================================================
3636
Функция завершает текущий квант времени, выделенный потоку,
3637
и переключается на следующий.
3638
(Какой поток какого процесса будет следующим, предсказать нельзя).
3639
Позднее, когда до текущего потока дойдёт очередь,
3640
выполнение возобновится.
3641
Параметры:
3642
  * eax = 68 - номер функции
3643
  * ebx = 1 - номер подфункции
3644
Возвращаемое значение:
3645
  * функция не возвращает значения
3646
 
3647
======================================================================
3648
=============== Функция 68, подфункция 2 - кэш + rdpmc. ==============
3649
======================================================================
3650
Параметры:
3651
  * eax = 68 - номер функции
3652
  * ebx = 2 - номер подфункции
3653
  * ecx = требуемое действие:
3654
    * ecx = 0 - разрешить выполнение инструкции rdpmc
3655
      (ReaD Performance-Monitoring Counters)
3656
    * ecx = 1 - узнать, включён/выключен кэш
3657
    * ecx = 2 - включить кэш
3658
    * ecx = 3 - выключить кэш
3659
Возвращаемое значение:
3660
  * для ecx=0:
3661
    * eax = значение cr4
3662
  * для ecx=1:
3663
    * eax = (cr0 and 0x60000000):
3664
    * eax = 0 - кэш включён
3665
    * eax <> 0 - кэш выключен
3666
  * для ecx=2 и ecx=3:
3667
    * функция не возвращает значения
3668
 
3669
======================================================================
3670
========== Функция 68, подфункция 3 - прочитать MSR-регистр. =========
3671
======================================================================
3672
MSR = Model Specific Register; полный список MSR-регистров процессора
3673
содержится в документации по процессору (например, IA-32 Intel
3674
Architecture Software Developer's Manual, Volume 3, Appendix B);
3675
каждое семейство процессоров имеет своё подмножество MSR-регистров.
3676
Параметры:
3677
  * eax = 68 - номер функции
3678
  * ebx = 3 - номер подфункции
3679
  * ecx игнорируется
3680
  * edx = адрес MSR
3681
Возвращаемое значение:
3682
  * ebx:eax = старший:младший dword результата
3683
Замечания:
3684
  * Указание в ecx несуществующего или нереализованного для данного
3685
    процессора MSR повлечёт исключение в ядре, которое прибьёт поток.
3686
  * Предварительно следует определить, поддерживаются ли MSR в целом,
3687
    командой cpuid. Иначе возникнет уже другое исключение в ядре,
3688
    которое всё равно прибьёт поток.
3689
 
3690
======================================================================
3691
========= Функция 68, подфункция 4 - записать в MSR-регистр. =========
3692
======================================================================
3693
MSR = Model Specific Register; полный список MSR-регистров процессора
3694
содержится в документации по процессору (например, IA-32 Intel
3695
Architecture Software Developer's Manual, Volume 3, Appendix B);
3696
каждое семейство процессоров имеет своё подмножество MSR-регистров.
3697
Параметры:
3698
  * eax = 68 - номер функции
3699
  * ebx = 4 - номер подфункции
3700
  * ecx игнорируется
3701
  * edx = адрес MSR
3702
  * esi:edi = старший:младший dword
3703
Возвращаемое значение:
3704
  * ebx:eax = копия esi:edi
3705
Замечания:
3706
  * Указание в ecx несуществующего или нереализованного для данного
3707
    процессора MSR повлечёт исключение в ядре, которое прибьёт поток.
3708
  * Предварительно следует определить, поддерживаются ли MSR в целом,
3709
    командой cpuid. Иначе возникнет уже другое исключение в ядре,
3710
    которое всё равно прибьёт поток.
3711
 
3712
======================================================================
3713
======= Функция 68, подфункция 5 - выделить физическую память. =======
3714
======================================================================
3715
Параметры:
3716
  * eax = 68 - номер функции
3717
  * ebx = 5 - номер подфункции
3718
  * ecx = размер (в байтах)
3719
Возвращаемое значение:
3720
  * eax = физический адрес выделенной памяти
3721
Замечания:
3722
  * Обычные приложения не должны использовать эту функцию, она
3723
    предназначена для случая, когда при работе с каким-либо
3724
    устройством требуется разместить данные по известному физическому
3725
    адресу. (В сущности, эта функция разрабатывалась для AC97WAV.)
3726
  * Число блоков физической памяти ограничено (константой 24,
3727
    причём эта константа включает и несколько блоков памяти
3728
    для надобностей ядра).
3729
  * Освободить выделенную таким образом память можно
3730
    подфункцией 6, копированием данных туда/обратно
3731
    занимаются подфункции 7 и 8.
3732
 
3733
======================================================================
3734
====== Функция 68, подфункция 6 - освободить физическую память. ======
3735
======================================================================
3736
Параметры:
3737
  * eax = 68 - номер функции
3738
  * ebx = 6 - номер подфункции
3739
  * ecx = физический адрес памяти
3740
Возвращаемое значение:
3741
  * функция не возвращает значения
3742
Замечания:
3743
  * Обычные приложения не должны использовать эту функцию, она
3744
    предназначена для случая, когда при работе с каким-либо
3745
    устройством требуется разместить данные по известному физическому
3746
    адресу. (В сущности, эта функция разрабатывалась для AC97WAV.)
3747
  * Память должна быть ранее выделена подфункцией 5.
3748
 
3749
======================================================================
3750
=== Функция 68, подфункция 7 - записать данные в физическую память. ==
3751
======================================================================
3752
Параметры:
3753
  * eax = 68 - номер функции
3754
  * ebx = 7 - номер подфункции
3755
  * ecx = физический адрес
3756
  * edx = указатель на данные (в приложении)
3757
  * esi = размер данных (в байтах)
3758
Возвращаемое значение:
3759
  * функция не возвращает значения
3760
Замечания:
3761
  * Обычные приложения не должны использовать эту функцию, она
3762
    предназначена для случая, когда при работе с каким-либо
3763
    устройством требуется разместить данные по известному физическому
3764
    адресу. (В сущности, эта функция разрабатывалась для AC97WAV.)
3765
  * Диапазон физических адресов должен лежать внутри ранее выделенного
3766
    подфункцией 5 блока физической памяти.
3767
  * Проверок корректности не производится.
3768
 
3769
======================================================================
3770
== Функция 68, подфункция 8 - прочитать данные из физической памяти. =
3771
======================================================================
3772
Параметры:
3773
  * eax = 68 - номер функции
3774
  * ebx = 8 - номер подфункции
3775
  * ecx = физический адрес
3776
  * edx = указатель на буфер для данных (в приложении)
3777
  * esi = размер данных (в байтах)
3778
Возвращаемое значение:
3779
  * функция не возвращает значения
3780
Замечания:
3781
  * Обычные приложения не должны использовать эту функцию, она
3782
    предназначена для случая, когда при работе с каким-либо
3783
    устройством требуется разместить данные по известному физическому
3784
    адресу. (В сущности, эта функция разрабатывалась для AC97WAV.)
3785
  * Диапазон физических адресов должен лежать внутри ранее выделенного
3786
    подфункцией 5 блока физической памяти.
3787
  * Проверок корректности не производится.
3788
 
3789
======================================================================
3790
======================== Функция 69 - отладка. =======================
3791
======================================================================
3792
Процесс может загрузить другой процесс как отлаживаемый установкой
3793
соответствующего бита при вызове подфункции 16 функции 58.
3794
У процесса может быть только один отладчик; один процесс может
3795
отлаживать несколько разных. Система уведомляет отладчик о событиях,
3796
происходящих с отлаживаемым процессом. Сообщения записываются в буфер,
3797
определённый подфункцией 0.
3798
Формат сообщения:
3799
  * +0: dword: код сообщения
3800
  * +4: dword: PID отлаживаемого процесса
3801
  * +8: могут присутствовать дополнительные данные,
3802
    определяемые кодом сообщения
3803
Коды сообщений:
3804
  * 1 = исключение
3805
    * дополнительно передаётся dword-номер исключения
3806
    * процесс приостановлен
3807
  * 2 = процесс завершился
3808
    * приходит при любом завершении: как через системную функцию -1,
3809
      так и при "убийстве" любым другим процессом
3810
      (в том числе самим отладчиком)
3811
  * 3 = отладочное исключение int 1 = #DB
3812
    * дополнительно передаётся dword-образ регистра DR6:
3813
      * биты 0-3: выполнено условие соответствующей точки останова
3814
        (установленной подфункцией 9)
3815
      * бит 14: исключение произошло из-за режима
3816
        пошаговой трассировки (установлен флаг TF)
3817
    * процесс приостановлен
3818
При завершении отладчика прибиваются все отлаживаемые процессы.
3819
Если отладчик этого не хочет, он должен предварительно отключиться
3820
подфункцией 3.
3821
 
3822
Все подфункции применимы только к процессам/потокам, запущенным
3823
из текущего функцией 58 с установленным флагом отладки.
3824
Отладка многопоточных программ пока не поддерживается.
3825
Полный список подфункций:
3826
  * подфункция 0 - определить область данных для отладочных сообщений
3827
  * подфункция 1 - получить состояние регистров отлаживаемого потока
3828
  * подфункция 2 - установить состояние регистров отлаживаемого потока
3829
  * подфункция 3 - отключиться от отлаживаемого процесса
3830
  * подфункция 4 - приостановить отлаживаемый поток
3831
  * подфункция 5 - возобновить выполнение отлаживаемого потока
3832
  * подфункция 6 - прочитать из памяти отлаживаемого процесса
3833
  * подфункция 7 - записать в память отлаживаемого процесса
3834
  * подфункция 8 - завершить отлаживаемый поток
3835
  * подфункция 9 - установить/снять аппаратную точку останова
3836
 
3837
======================================================================
3838
====================== Функция 69, подфункция 0 ======================
3839
========= Определить область данных для отладочных сообщений. ========
3840
======================================================================
3841
Параметры:
3842
  * eax = 69 - номер функции
3843
  * ebx = 0 - номер подфункции
3844
  * ecx = указатель
3845
Формат области данных:
3846
  * +0: dword: N = размер буфера (не считая этого заголовка)
3847
  * +4: dword: занято в буфере
3848
  * +8: N*byte: буфер
3849
Возвращаемое значение:
3850
  * функция не возвращает значения
3851
Замечания:
3852
  * Если поле размера отрицательно, буфер считается заблокированным
3853
    и при поступлении нового сообщения система будет ждать.
3854
    Для синхронизации обрамляйте всю работу с буфером операциями
3855
    блокировки/разблокировки
3856
    	neg	[bufsize]
3857
  * Данные в буфере трактуются как массив элементов переменной длины -
3858
    сообщений. Формат сообщения указан в общем описании.
3859
 
3860
======================================================================
3861
====================== Функция 69, подфункция 1 ======================
3862
========= Получить состояние регистров отлаживаемого потока. =========
3863
======================================================================
3864
Параметры:
3865
  * eax = 69 - номер функции
3866
  * ebx = 1 - номер подфункции
3867
  * ecx = идентификатор потока
3868
  * edx = длина структуры контекста, должно быть 0x28=40 байт
3869
Возвращаемое значение:
3870
  * функция не возвращает значения
3871
Формат структуры контекста: (FPU пока не поддерживается)
3872
  * +0: dword: eip
3873
  * +4: dword: eflags
3874
  * +8: dword: eax
3875
  * +12 = +0xC: dword: ecx
3876
  * +16 = +0x10: dword: edx
3877
  * +20 = +0x14: dword: ebx
3878
  * +24 = +0x18: dword: esp
3879
  * +28 = +0x1C: dword: ebp
3880
  * +32 = +0x20: dword: esi
3881
  * +36 = +0x24: dword: edi
3882
Замечания:
3883
  * Если поток выполняет код 0-кольца, возвращается
3884
    состояние регистров 3-кольца.
3885
  * Процесс должен быть загружен для отладки (как указано в
3886
    общем описании).
3887
 
3888
======================================================================
3889
====================== Функция 69, подфункция 2 ======================
3890
======== Установить состояние регистров отлаживаемого потока. ========
3891
======================================================================
3892
Параметры:
3893
  * eax = 69 - номер функции
3894
  * ebx = 2 - номер подфункции
3895
  * ecx = идентификатор потока
3896
  * edx = длина структуры контекста, должно быть 0x28=40 байт
3897
Возвращаемое значение:
3898
  * функция не возвращает значения
3899
Формат структуры контекста указан в описании подфункции 1.
3900
Замечания:
3901
  * Если поток выполняет код 0-кольца, устанавливается
3902
    состояние регистров 3-кольца.
3903
  * Процесс должен быть загружен для отладки (как указано в
3904
    общем описании).
3905
 
3906
======================================================================
3907
== Функция 69, подфункция 3 - отключиться от отлаживаемого процесса. =
3908
======================================================================
3909
Параметры:
3910
  * eax = 69 - номер функции
3911
  * ebx = 3 - номер подфункции
3912
  * ecx = идентификатор
3913
Возвращаемое значение:
3914
  * функция не возвращает значения
3915
Замечания:
3916
  * Если процесс был приостановлен, он возобновляет выполнение.
3917
 
3918
======================================================================
3919
==== Функция 69, подфункция 4 - приостановить отлаживаемый поток. ====
3920
======================================================================
3921
Параметры:
3922
  * eax = 69 - номер процесса
3923
  * ebx = 4 - номер подфункции
3924
  * ecx = идентификатор
3925
Возвращаемое значение:
3926
  * функция не возвращает значения
3927
Замечания:
3928
  * Процесс должен быть загружен для отладки (как указано в
3929
    общем описании).
3930
 
3931
======================================================================
3932
====================== Функция 69, подфункция 5 ======================
3933
============ Возобновить выполнение отлаживаемого потока. ============
3934
======================================================================
3935
Параметры:
3936
  * eax = 69 - номер функции
3937
  * ebx = 5 - номер подфункции
3938
  * ecx = идентификатор
3939
Возвращаемое значение:
3940
  * функция не возвращает значения
3941
Замечания:
3942
  * Процесс должен быть загружен для отладки (как указано в
3943
    общем описании).
3944
 
3945
======================================================================
3946
====================== Функция 69, подфункция 6 ======================
3947
============= Прочитать из памяти отлаживаемого процесса. ============
3948
======================================================================
3949
Параметры:
3950
  * eax = 69 - номер функции
3951
  * ebx = 6 - номер подфункции
3952
  * ecx = идентификатор
3953
  * edx = сколько байт читать
3954
  * esi = адрес памяти отлаживаемого процесса
3955
  * edi = указатель на буфер для данных
3956
Возвращаемое значение:
3957
  * eax = -1 при ошибке (неверный PID или буфер)
3958
  * иначе eax = число прочитанных байт (возможно, 0,
3959
    если в esi слишком большое значение)
3960
Замечания:
3961
  * Процесс должен быть загружен для отладки (как указано в
3962
    общем описании).
3963
 
3964
======================================================================
3965
 Функция 69, подфункция 7 - записать в память отлаживаемого процесса.
3966
======================================================================
3967
Параметры:
3968
  * eax = 69 - номер функции
3969
  * ebx = 7 - номер подфункции
3970
  * ecx = идентификатор
3971
  * edx = сколько байт писать
3972
  * esi = адрес памяти в отлаживаемом процессе
3973
  * edi = указатель на данные
3974
Возвращаемое значение:
3975
  * eax = -1 при ошибке (неверный PID или буфер)
3976
  * иначе eax = число записанных байт (возможно, 0,
3977
    если в esi слишком большое значение)
3978
Замечания:
3979
  * Процесс должен быть загружен для отладки (как указано в
3980
    общем описании).
3981
 
3982
======================================================================
3983
====== Функция 69, подфункция 8 - завершить отлаживаемый поток. ======
3984
======================================================================
3985
Параметры:
3986
  * eax = 69 - номер функции
3987
  * ebx = 8 - номер подфункции
3988
  * ecx = идентификатор
3989
Возвращаемое значение:
3990
  * функция не возвращает значения
3991
Замечания:
3992
  * Процесс должен быть загружен для отладки (как указано в
3993
    общем описании).
3994
  * Функция аналогична подфункции 2 функции 18 с двумя отличиями:
3995
    требуется выполнение первого замечания и принимается PID,
3996
    а не номер слота.
3997
 
3998
======================================================================
3999
====================== Функция 69, подфункция 9 ======================
4000
============= Установить/снять аппаратную точку останова. ============
4001
======================================================================
4002
Параметры:
4003
  * eax = 69 - номер функции
4004
  * ebx = 9 - номер подфункции
4005
  * ecx = идентификатор потока
4006
  * dl = индекс точки останова, от 0 до 3 включительно
4007
  * dh = флаги:
4008
    * если старший бит сброшен - установить точку останова:
4009
      * биты 0-1 - условие:
4010
        * 00 = точка останова на выполнение
4011
        * 01 = точка останова на запись
4012
        * 11 = точка останова на чтение/запись
4013
      * биты 2-3 - длина; для точек останова на исполнение должно быть
4014
        00, в противном случае одно из
4015
        * 00 = байт
4016
        * 01 = слово
4017
        * 11 = двойное слово
4018
      * esi = адрес точки останова; должен быть выровнен
4019
        соответственно длине (т.е. должен быть чётным для
4020
        точек останова на слово, кратен 4 для двойного слова)
4021
    * если старший бит установлен - сбросить точку останова
4022
Возвращаемое значение:
4023
  * eax = 0 - успешно
4024
  * eax = 1 - ошибка во входных данных
4025
  * eax = 2 - (зарезервировано, никогда не возвращается
4026
    в текущей реализации) с этим индексом уже установлена
4027
    глобальная точка останова
4028
Замечания:
4029
  * Процесс должен быть загружен для отладки (как указано в
4030
    общем описании).
4031
  * Аппаратные точки останова реализуются через DRx-регистры
4032
    процессора, отсюда все ограничения.
4033
  * Функция может переустановить ранее установленную ей же
4034
    точку останова (никак не сообщая об этом).
4035
    Ведите список установленных точек останова в отладчике.
4036
  * Срабатывание точки останова заключается в генерировании
4037
    отладочного исключения #DB, о котором система сообщает отладчику.
4038
  * Точка останова на запись и чтение/запись срабатывает после
4039
    выполнения вызвавшей её инструкции.
4040
 
4041
======================================================================
4042
= Функция 70 - работа с файловой системой с поддержкой длинных имён. =
4043
======================================================================
4044
Параметры:
4045
  * eax = 70
4046
  * ebx = указатель на информационную структуру
4047
Возвращаемое значение:
4048
  * eax = 0 - успешно; иначе код ошибки файловой системы
4049
  * в зависимости от подфункции может возвращаться значение и
4050
    в других регистрах
4051
Общий формат информационной структуры:
4052
  * +0: dword: номер подфункции
4053
  * +4: dword: смещение в файле
4054
  * +8: dword: старший dword смещения (должен быть 0)
4055
  * +12 = +0xC: dword: размер
4056
  * +16 = +0x10: dword: указатель на данные
4057
  * +20 = +0x14: n db: ASCIIZ-строка с именем файла
86 diamond 4058
    или
4059
  * +20 = +0x14: db 0
4060
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
77 diamond 4061
Уточнения - в документации на соответствующую подфункцию.
4062
Имя файла нечувствительно к регистру букв. Русские буквы должны быть
4063
записаны в кодировке cp866 (DOS).
4064
Формат имени файла:
4065
/base/number/dir1/dir2/.../dirn/file,
4066
где /base/number идентифицирует устройство, на котором ищется файл:
4067
одно из
4068
  * /RD/1 = /RAMDISK/1 для доступа к рамдиску
4069
  * /FD/1 = /FLOPPYDISK/1 для доступа к первому флоппи-дисководу,
4070
    /FD/2 = /FLOPPYDISK/2 для второго флоппи-дисковода
4071
  * /HD0/x, /HD1/x, /HD2/x, /HD3/x для доступа соответственно
4072
    к устройствам IDE0 (Primary Master), IDE1 (Primary Slave),
4073
    IDE2 (Secondary Master), IDE3 (Secondary Slave);
4074
    x - номер раздела на выбранном винчестере, изменяется от 1 до 255
4075
    (на каждом из винчестеров нумерация начинается с 1)
4076
Примеры:
83 diamond 4077
  * '/rd/1/kernel.asm',0
77 diamond 4078
  * '/HD0/1/kernel.asm',0
4079
  * '/hd0/2/menuet/pics/tanzania.bmp',0
4080
  * '/hd0/1/Program files/NameOfProgram/SomeFile.SomeExtension',0
4081
Доступные подфункции:
4082
  * подфункция 0 - чтение файла
4083
  * подфункция 1 - чтение папки
83 diamond 4084
  * подфункция 2 - создание/перезапись файла
86 diamond 4085
  * подфункция 5 - получение атрибутов файла/папки
4086
  * подфункция 6 - установка атрибутов файла/папки
77 diamond 4087
 
4088
======================================================================
4089
= Функция 70, подфункция 0 - чтение файла с поддержкой длинных имён. =
4090
======================================================================
4091
Параметры:
4092
  * eax = 70 - номер функции
4093
  * ebx = указатель на информационную структуру
4094
Формат информационной структуры:
4095
  * +0: dword: 0 = номер подфункции
4096
  * +4: dword: позиция в файле (в байтах)
4097
  * +8: dword: 0 (зарезервировано под старший dword позиции)
4098
  * +12 = +0xC: dword: сколько байт читать
4099
  * +16 = +0x10: dword: указатель на буфер, куда будут записаны данные
4100
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
4101
    общем описании
86 diamond 4102
    или
4103
  * +20 = +0x14: db 0
4104
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
77 diamond 4105
Возвращаемое значение:
4106
  * eax = 0 - успешно, иначе код ошибки файловой системы
4107
  * ebx = число прочитанных байт или
4108
    -1=0xffffffff, если файл не найден
4109
Замечания:
4110
  * Если файл кончился раньше, чем был прочитан последний запрошенный
4111
    блок, то функция прочитает, сколько сможет, после чего вернёт
4112
    eax=6 (EOF).
4113
  * Функция не позволяет читать папки
4114
    (вернётся eax=10, access denied).
4115
 
4116
======================================================================
4117
= Функция 70, подфункция 1 - чтение папки с поддержкой длинных имён. =
4118
======================================================================
4119
Параметры:
4120
  * eax = 70 - номер функции
4121
  * ebx = указатель на информационную структуру
4122
Формат информационной структуры:
4123
  * +0: dword: 1 = номер подфункции
4124
  * +4: dword: индекс начального блока (считая с 0)
78 diamond 4125
  * +8: dword: поле флагов:
4126
    * бит 0 (маска 1): в каком формате возвращать имена,
4127
      0=ANSI, 1=UNICODE
4128
    * прочие биты зарезервированы и должны быть установлены в 0
4129
      для будущей совместимости
77 diamond 4130
  * +12 = +0xC: dword: сколько блоков читать
4131
  * +16 = +0x10: dword: указатель на буфер, куда будут записаны
4132
    данные, размер буфера должен быть не меньше 32 + [+12]*560 байт
4133
  * +20 = +0x14: ASCIIZ-имя папки, правила формирования имён указаны в
4134
    общем описании
86 diamond 4135
    или
4136
  * +20 = +0x14: db 0
4137
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
77 diamond 4138
Возвращаемое значение:
4139
  * eax = 0 - успешно, иначе код ошибки файловой системы
4140
  * ebx = число файлов, информация о которых была записана в буфер,
4141
    или -1=0xffffffff, если папка не найдена
4142
Структура буфера:
4143
  * +0: 32*byte: заголовок
4144
  * +32 = +0x20: n1*byte: блок с информацией о файле 1
4145
  * +32+n1: n2*byte: блок с информацией о файле 2
4146
  * ...
4147
Структура заголовка:
4148
  * +0: dword: версия структуры (текущая версия = 1)
4149
  * +4: dword: количество размещённых блоков; не больше, чем запрошено
4150
    в поле +12 информационной структуры; может быть меньше,
4151
    если в папке кончились файлы (то же самое, что и в ebx)
4152
  * +8: dword: общее число файлов в папке
4153
  * +12 = +0xC: 20*byte: зарезервировано (нули)
4154
Структура блока данных входа каталога (БДВК):
4155
  * +0: dword: атрибуты файла:
4156
    * бит 0 (маска 1): файл только для чтения
4157
    * бит 1 (маска 2): файл является скрытым
4158
    * бит 2 (маска 4): файл является системным
4159
    * бит 3 (маска 8): это не файл, а метка тома
4160
      (на заданном разделе встречается не более одного раза и
4161
      только в корневой папке)
4162
    * бит 4 (маска 0x10): это папка
4163
    * бит 5 (маска 0x20): файл не архивировался - многие программы
4164
      архивации имеют опцию, по которой архивируются только файлы
4165
      с установленным этим битом, после чего этот бит сбрасывается -
4166
      это может быть полезно для автоматического создания
4167
      backup-архивов, ибо при записи бит обычно устанавливается
4168
      (не в Kolibri, правда)
78 diamond 4169
  * +4: byte: тип данных имени:
4170
    (совпадает с битом 0 флагов информационной структуры)
77 diamond 4171
    * 0 = ASCII = 1-байтное представление каждого символа
4172
    * 1 = UNICODE = 2-байтное представление каждого символа
4173
  * +5: 3*byte: зарезервировано (нули)
4174
  * +8: 4*byte: время создания файла
4175
  * +12 = +0xC: 4*byte: дата создания файла
4176
  * +16 = +0x10: 4*byte: время последнего доступа (чтение или запись)
4177
  * +20 = +0x14: 4*byte: дата последнего доступа
4178
  * +24 = +0x18: 4*byte: время последней модификации
4179
  * +28 = +0x1C: 4*byte: дата последней модификации
4180
  * +32 = +0x20: qword: размер файла в байтах (до 16777216 Тб)
4181
  * +40 = +0x28: имя
4182
    * для формата ASCII: максимальная длина имени 263 символа
4183
      (263 байта), байт после имени имеет значение 0
4184
    * для формата UNICODE: максимальная длина имени 259 символов
4185
      (518 байт), два байта после имени имеют значение 0
4186
Формат времени:
4187
  * +0: byte: секунды
4188
  * +1: byte: минуты
4189
  * +2: byte: часы
4190
  * +3: byte: зарезервировано (0)
4191
  * например, 23.59.59 записывается как (в hex) 3B 3B 17 00
4192
Формат даты:
4193
  * +0: byte: день
4194
  * +1: byte: месяц
4195
  * +2: word: год
4196
  * например, 25.11.1979 записывается как (в hex) 19 0B BB 07
4197
Замечания:
4198
  * Если в БДВК присутствует имя в ASCII, то длина БДВК составляет
4199
    304 байта, если в UNICODE - 560 байт. Значение длины выравнено
4200
    на целое кратное 16 байт
4201
    (для ускорения обработки в кэш-памяти CPU).
78 diamond 4202
  * Первый символ после имени нулевой (ASCIIZ-строка). Дальнейшие
4203
    данные содержат мусор.
77 diamond 4204
  * Если файлы в папке кончились раньше, чем было прочитано
4205
    запрошенное количество, то функция прочитает, сколько сможет,
4206
    после чего вернёт eax=6 (EOF).
4207
  * Любая папка на диске, кроме корневой, содержит два специальных
4208
    входа "." и "..", идентифицирующих соответственно саму папку и
4209
    родительскую папку.
4210
  * Функция позволяет также читать виртуальные папки "/", "/rd",
4211
    "/fd", "/hd[n]", при этом атрибуты подпапок полагаются равными
4212
    0x10, а времена и даты обнулены. Альтернативный способ получения
4213
    информации об оборудовании - подфункция 11 функции 18.
4214
 
4215
======================================================================
83 diamond 4216
====================== Функция 70, подфункция 2 ======================
4217
======== Создание/перезапись файла с поддержкой длинных имён. ========
4218
======================================================================
4219
Параметры:
4220
  * eax = 70 - номер функции
4221
  * ebx = указатель на информационную структуру
4222
Формат информационной структуры:
4223
  * +0: dword: 2 = номер подфункции
4224
  * +4: dword: 0 (зарезервировано)
4225
  * +8: dword: 0 (зарезервировано)
4226
  * +12 = +0xC: dword: сколько байт писать
4227
  * +16 = +0x10: dword: указатель на данные
4228
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
4229
    общем описании
86 diamond 4230
    или
4231
  * +20 = +0x14: db 0
4232
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
83 diamond 4233
Возвращаемое значение:
4234
  * eax = 0 - успешно, иначе код ошибки файловой системы
4235
  * ebx = число записанных байт (возможно, 0)
4236
Замечания:
4237
  * Если файл с таким именем не существовал, он создаётся; если
4238
    существовал, то перезаписывается.
4239
  * Если свободного места на диске недостаточно, то функция запишет,
4240
    сколько сможет, после чего вернёт код ошибки 8.
4241
 
4242
======================================================================
86 diamond 4243
=== Функция 70, подфункция 5 - получение информации о файле/папке. ===
4244
======================================================================
4245
Параметры:
4246
  * eax = 70 - номер функции
4247
  * ebx = указатель на информационную структуру
4248
Формат информационной структуры:
4249
  * +0: dword: 5 = номер подфункции
4250
  * +4: dword: 0 (зарезервировано)
4251
  * +8: dword: 0 (зарезервировано)
4252
  * +12 = +0xC: dword: 0 (зарезервировано)
4253
  * +16 = +0x10: dword: указатель на буфер, куда будут записаны данные
4254
                        (40 байт)
4255
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
4256
    общем описании
4257
    или
4258
  * +20 = +0x14: db 0
4259
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
4260
Возвращаемое значение:
4261
  * eax = 0 - успешно, иначе код ошибки файловой системы
4262
  * ebx разрушается
4263
Информация о файле возвращается в формате БДВК
4264
(блока данных входа каталога), указанном в описании
4265
подфункции 1, но без имени файла
4266
(то есть первые 40 = 0x28 байт).
4267
Замечания:
4268
  * Функция не поддерживает виртуальные папки типа /, /rd и
4269
    корневые папки типа /rd/1.
4270
 
4271
======================================================================
4272
===== Функция 70, подфункция 6 - установка атрибутов файла/папки. ====
4273
======================================================================
4274
Параметры:
4275
  * eax = 70 - номер функции
4276
  * ebx = указатель на информационную структуру
4277
Формат информационной структуры:
4278
  * +0: dword: 6 = номер подфункции
4279
  * +4: dword: 0 (зарезервировано)
4280
  * +8: dword: 0 (зарезервировано)
4281
  * +12 = +0xC: dword: 0 (зарезервировано)
4282
  * +16 = +0x10: dword: указатель на буфер с атрибутами (32 байта)
4283
  * +20 = +0x14: ASCIIZ-имя файла, правила формирования имён указаны в
4284
    общем описании
4285
    или
4286
  * +20 = +0x14: db 0
4287
  * +21 = +0x15: dd указатель на ASCIIZ-строку с именем файла
4288
Возвращаемое значение:
4289
  * eax = 0 - успешно, иначе код ошибки файловой системы
4290
  * ebx разрушается
4291
Атрибуты файла - первые 32 байта в БДВК (блоке данных входа каталога),
4292
формат которого указан в описании подфункции 1
4293
(то есть без имени и размера файла). Атрибут файл/папка/метка тома
4294
(биты 3,4 в dword'е +0) не меняется.
4295
Байт +4 (формат имени) игнорируется.
4296
Замечания:
4297
  * Функция не поддерживает виртуальные папки типа /, /rd и
4298
    корневые папки типа /rd/1.
4299
 
4300
======================================================================
77 diamond 4301
========== Функция -1 - завершить выполнение потока/процесса =========
4302
======================================================================
4303
Параметры:
4304
  * eax = -1 - номер функции
4305
Возвращаемое значение:
4306
  * функция не возвращает ни значения, ни управления
4307
Замечания:
4308
  * Если процесс явно не создавал потоков, то у него есть только
4309
    один поток, завершение которого приводит к завершению процесса.
4310
  * Если текущий поток - последний в процессе, то его завершение
4311
    также приводит к завершению процесса.
4312
  * Эта функция завершает текущий поток. Другой поток можно прибить
4313
    вызовом подфункции 2 функции 18.
4314
 
4315
======================================================================
4316
=========================== Список событий ===========================
4317
======================================================================
4318
Очередное событие можно получить вызовом одной из функций 10
4319
(ожидать события), 11 (проверить без ожидания), 23
4320
(ожидать в течение заданного времени).
4321
Эти функции возвращают только те события, которые входят в маску,
4322
устанавливаемую функцией 40. По умолчанию это первые три, чего
4323
вполне достаточно для многих приложений.
4324
Коды событий:
4325
  * 1 = сообщение о перерисовке (сбрасывается при вызове функции 0)
4326
  * 2 = нажата клавиша на клавиатуре (поступает, только когда окно
4327
    активно; сбрасывается, когда все клавиши из буфера
4328
    считаны функцией 2)
4329
  * 3 = нажата кнопка, определённая ранее функцией 8 (или кнопка
4330
    закрытия, созданная неявно функцией 0; кнопка минимизации
4331
    обрабатывается системой и о ней сообщения не приходит;
4332
    поступает, только когда окно активно; сбрасывается, когда все
4333
    кнопки из буфера считаны функцией 17)
4334
  * 4 = зарезервировано (в текущей реализации никогда не приходит даже
4335
    при размаскировке функцией 40)
4336
  * 5 = перерисовывается фон рабочего стола (сбрасывается
4337
    автоматически после перерисовки, так что если во время перерисовки
4338
    фона программа не ждёт и не проверяет события, то этого события
4339
    она не заметит)
4340
  * 6 = событие от мыши (что-то случилось - нажатие на кнопку мыши
4341
    или перемещение; сбрасывается при прочтении)
4342
  * 7 = произошло событие IPC (смотри функцию 60 - Inter Process
4343
    Communication; сбрасывается при прочтении)
4344
  * 8 = произошло сетевое событие (сбрасывается при прочтении;
4345
    смотри работу с сетью)
4346
  * 9 = произошло отладочное событие (сбрасывается при прочтении;
4347
    смотри отладочную подсистему)
4348
  * 16..31 = произошло событие с соответствующим IRQ
4349
    (16=IRQ0, 31=IRQ15) (сбрасывается при считывании всех данных IRQ)
4350
 
4351
======================================================================
4352
==================== Коды ошибок файловой системы ====================
4353
======================================================================
4354
  * 0 = успешно
4355
  * 1 = не определена база и/или раздел жёсткого диска (подфункциями
4356
    7, 8 функции 21)
4357
  * 2 = функция не поддерживается для данной файловой системы
4358
    (возвращается в случае попытки LBA-чтения при запрещённом LBA)
4359
  * 3 = неизвестная файловая система
4360
  * 4 = возвращается только функцией rename при передаче сильно
4361
    неверного параметра и никак не соответствует описанию
4362
    в исходниках ядра "partition not defined at hd"
4363
  * 5 = файл не найден
4364
  * 6 = файл закончился
4365
  * 7 = указатель вне памяти приложения
4366
  * 8 = диск заполнен
4367
  * 9 = таблица FAT разрушена
4368
  * 10 = доступ запрещён
83 diamond 4369
  * 11 = ошибка устройства
77 diamond 4370
При запуске программы возможны также следующие коды ошибок:
4371
  * 30 = 0x1E = недостаточно памяти
4372
  * 31 = 0x1F = файл не является исполнимым
4373
  * 32 = 0x20 = слишком много процессов