Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
457 trolly 1
SYSTEM FUNCTIONS of OS Kolibri 0.6.5.0
2
 
3
Number of the function is located in the register eax.
4
The call of the system function is executed by "int 0x40" command.
5
All registers except explicitly declared in the returned value,
6
    including eflags, are preserved.
7
 
8
 
9
======================================================================
10
============== Function 0 - define and draw the window. ==============
11
======================================================================
12
Defines an application window. Draws a frame of the window, header and
13
working area. For skinned windows defines standard close and minimize
14
buttons.
15
Parameters:
16
  * eax = 0 - function number
17
  * ebx = [coordinate on axis x]*65536 + [size on axis x]
18
  * ecx = [coordinate on axis y]*65536 + [size on axis y]
19
  * edx = 0xXYRRGGBB, where:
20
    * Y = style of the window:
21
      * Y=0 - type I - fixed-size window
22
      * Y=1 - only define window area, draw nothing
23
      * Y=2 - type II - variable-size window
24
      * Y=3 - skinned window
25
      * other possible values (from 4 up to 15) are reserved,
26
        function call with such Y is ignored
27
    * RR, GG, BB = accordingly red, green, blue components of a color
28
      of the working area of the window (are ignored for style Y=2)
29
    * X = DCBA (bits)
30
      * A = 1 - window has caption; for style Y=3 caption string
31
                  must be passed in edi, for other styles use
32
                  subfunction 1 of function 71
33
      * B = 1 - coordinates of all graphics primitives are relative to
34
                  window client area
35
      * C = 1 - don't fill working area on window draw
36
      * D = 0 - normal filling of the working area, 1 - gradient
37
    The following parameters are intended for windows
38
    of a type I and II, and ignored for styles Y=1,3:
39
  * esi = 0xXYRRGGBB - color of the header
40
    * RR, GG, BB define color
41
    * Y=0 - usual window, Y=1 - unmovable window
42
    * X defines a gradient of header: X=0 - no gradient,
43
      X=8 - usual gradient,
44
      for windows of a type II X=4 - negative gradient
45
    * other values of X and Y are reserved
46
  * edi = 0x00RRGGBB - color of the frame
47
Returned value:
48
  * function does not return value
49
Remarks:
50
  * Position and sizes of the window are installed by the first
51
    call of this function and are ignored at subsequent; to change
52
    position and/or sizes of already created window use function 67.
53
  * For windows with style Y=3 and caption (A=1) caption string is set
54
    by the first call of this function and is ignored at subsequent
55
    (strictly speaking, is ignored after a call to subfunction 2
56
    of function 12 - end redraw); to change caption of already created
57
    window use subfunction 1 of function 71.
58
  * If the window has appropriate styles, position and/or sizes can be
59
    changed by user. Current position and sizes can be obtained
60
    by function 9.
61
  * The window must fit on the screen. If the transferred
62
    coordinates and sizes do not satisfy to this condition,
63
    appropriate coordinate (or, probably, both) is considered as zero,
64
    and if it does not help too, the appropriate size
65
    (or, probably, both) is installed in a size of the screen.
66
 
67
    Further let us designate xpos,ypos,xsize,ysize - values passed
68
    in ebx,ecx. The coordinates are resulted concerning
69
    the left upper corner of the window, which, thus, is set as (0,0),
70
    coordinates of the right lower corner essence (xsize,ysize).
71
  * The sizes of the window are understood in sence of coordinates
72
    of the right lower corner. This concerns all other functions too.
73
    It means, that the real sizes are on 1 pixel more.
74
  * The window of type I looks as follows:
75
    * draw external frame of color indicated in edi, 1 pixel in width
76
    * draw header - rectangle with the left upper corner (1,1) and
77
      right lower (xsize-1,min(25,ysize)) color indicated in esi
78
      (taking a gradient into account)
79
    * if ysize>=26, fill the working area of the window -
80
      rectangle with the left upper corner (1,21) and right lower
81
      (xsize-1,ysize-1) (sizes (xsize-1)*(ysize-21)) with color
82
      indicated in edx (taking a gradient into account)
83
    * if A=1 and caption has been already set by subfunction 1
84
      of function 71, it is drawn in the corresponding place of header
85
  * The window of style Y=1 looks as follows:
86
    * completely defined by the application
87
  * The window of type II looks as follows:
88
    * draw external frame of width 1 pixel with the "shaded" color
89
      edi (all components of the color decrease twice)
90
    * draw intermediate frame of width 3 pixels with color edi
91
    * draw internal frame of width 1 pixel with the "shaded" color edi
92
    * draw header - rectangle with the left upper corner (4,4)
93
      and right lower (xsize-4,min(20,ysize)) color, indicated in esi
94
      (taking a gradient into account)
95
    * if ysize>=26, fill the working area of the window -
96
      rectangle with the left upper corner (5,20) and right lower
97
      (xsize-5,ysize-5) with color indicated in edx
98
      (taking a gradient into account)
99
    * if A=1 and caption has been already set by subfunction 1
100
      of function 71, it is drawn in the corresponding place of header
101
  * The skinned window looks as follows:
102
    * draw external frame of width 1 pixel
103
      with color 'outer' from the skin
104
    * draw intermediate frame of width 3 pixel
105
      with color 'frame' from the skin
106
    * draw internal frame of width 1 pixel
107
      with color 'inner' from the skin
108
    * draw header (on bitmaps from the skin) in a rectangle
109
      (0,0) - (xsize,_skinh-1)
110
    * if ysize>=26, fill the working area of the window -
111
      rectangle with the left upper corner (5,_skinh) and right lower
112
      (xsize-5,ysize-5) with color indicated in edx
113
      (taking a gradient into account)
114
    * define two standard buttons: close and minimize
115
      (see function 8)
116
    * if A=1 and edi contains (nonzero) pointer to caption string,
117
      it is drawn in place in header defined in the skin
118
    * value _skinh is accessible as the result of call
119
      subfunction 4 of function 48
120
 
121
======================================================================
122
================ Function 1 - put pixel in the window. ===============
123
======================================================================
124
Parameters:
125
  * eax = 1 - function number
126
  * ebx = x-coordinate (relative to the window)
127
  * ecx = y-coordinate (relative to the window)
128
  * edx = 0x00RRGGBB - color of a pixel
129
    edx = 0x01xxxxxx - invert color of a pixel
130
          (low 24 bits are ignored)
131
Returned value:
132
  * function does not return value
133
 
134
======================================================================
135
============ Function 2 - get the code of the pressed key. ===========
136
======================================================================
137
Takes away the code of the pressed key from the buffer.
138
Parameters:
139
  * eax = 2 - function number
140
Returned value:
141
  * if the buffer is empty, function returns eax=1
142
  * if the buffer is not empty, function returns al=0,
143
    ah=code of the pressed key, high word of eax is zero
144
  * if there is "hotkey", function returns al=2,
145
    ah=scancode of the pressed key (0 for control keys),
146
    high word of eax contains a status of control keys at the moment
147
    of pressing a hotkey
148
Remarks:
149
  * There is a common system buffer of the pressed keys
150
    by a size of 120 bytes, organized as queue.
151
  * There is one more common system buffer on 120 "hotkeys".
152
  * If the application with the inactive window calls this function,
153
    the buffer of the pressed keys is considered to be empty.
154
  * By default this function returns ASCII-codes; to switch
155
    to the scancodes mode (and back) use function 66.
156
    However, hotkeys are always notificated as scancodes.
157
  * To find out, what keys correspond to what codes, start
158
    the application keyascii and scancode.
159
  * Scancodes come directly from keyboard and are fixed;
160
    ASCII-codes turn out with usage of the conversion tables,
161
    which can be set by subfunction 2 of function 21
162
    and get by subfunction 2 of function 26.
163
  * As a consequence, ASCII-codes take into account current
164
    keyboard layout (rus/en) as opposed to scancodes.
165
  * This function notifies only about those hotkeys, which were
166
    defined by this thread by subfunction 4 of function 66.
167
 
168
======================================================================
169
==================== Function 3 - get system time. ===================
170
======================================================================
171
Parameters:
172
  * eax = 3 - function number
173
Returned value:
174
  * eax = 0x00SSMMHH, where HH:MM:SS = Hours:Minutes:Seconds
175
  * each item is BCD-number, for example,
176
    for time 23:59:59 function returns 0x00595923
177
Remarks:
178
  * See also subfunction 9 of function 26 - get time from
179
    the moment of start of the system; it is more convenient, because
180
    returns simply DWORD-value of the time counter.
181
  * System time can be set by function 22.
182
 
183
======================================================================
184
============ Function 4 - draw text string in the window. ============
185
======================================================================
186
Parameters:
187
  * eax = 4 - function number
188
  * ebx = [coordinate on axis x]*65536 + [coordinate on axis y]
189
  * ecx = 0xX0RRGGBB, where
190
    * RR, GG, BB specify text color
191
    * X=ABnn (bits):
192
    * nn specifies the used font: 0=system monospaced,
193
      1=system font of variable width
194
    * A=0 - output esi characters, A=1 - output ASCIIZ-string
195
    * B=1 - fill background with the color edi
196
  * edx = pointer to the beginning of the string
197
  * esi = for A=0 length of the string, must not exceed 255;
198
          for A=1 is ignored
199
Returned value:
200
  * function does not return value
201
Remarks:
202
  * First system font is read out at loading from the file char.mt,
203
    second - from char2.mt.
204
  * Both fonts have height 9 pixels, width of the monospaced font
205
    is equal to 6 pixels.
206
 
207
======================================================================
208
========================= Function 5 - delay. ========================
209
======================================================================
210
Delays execution of the program on the given time.
211
Parameters:
212
  * eax = 5 - function number
213
  * ebx = time in the 1/100 of second
214
Returned value:
215
  * function does not return value
216
Remarks:
217
  * Passing ebx=0 does not transfer control to the next process
218
    and does not make any operations at all. If it is really required
219
    to transfer control to the next process (to complete a current
220
    time slice), use subfunction 1 of function 68.
221
  * At current implementation there will be an immediate return from
222
    the function, if the addition of ebx with current value of
223
    time counter will call 32-bit overflow.
224
 
225
======================================================================
226
============== Function 6 - read the file from ramdisk. ==============
227
======================================================================
228
Parameters:
229
  * eax = 6 - function number
230
  * ebx = pointer to the filename
231
  * ecx = number of start block, beginning from 1;
232
    ecx=0 - read from the beginning of the file (same as ecx=1)
233
  * edx = number of blocks to read;
234
    edx=0 - read one block (same as edx=1)
235
  * esi = pointer to memory area for the data
236
Returned value:
237
  * eax = file size in bytes, if the file was successfully read
238
  * eax = -1, if the file was not found
239
Remarks:
240
  * This function is out-of-date; function 70 allows
241
    to fulfil the same operations with the extended possibilities.
242
  * Block = 512 bytes.
243
  * For reading all file you can specify the certainly large value
244
    in edx, for example, edx = -1; but in this case be ready that
245
    the program will "fall", if the file will appear too large and can
246
    not be placed in the program memory.
247
  * The filename must be either in the format 8+3 characters
248
    (first 8 characters - name itself, last 3 - extension,
249
    the short names and extensions are supplemented with spaces),
250
    or in the format 8.3 characters "FILE.EXT"/"FILE.EX "
251
    (name no more than 8 characters, dot, extension 3 characters
252
    supplemented if necessary by spaces).
253
    The filename must be written with capital letters. The terminating
254
    character with code 0 is not necessary (not ASCIIZ-string).
255
  * This function does not support folders on the ramdisk.
256
 
257
======================================================================
258
=============== Function 7 - draw image in the window. ===============
259
======================================================================
260
Paramters:
261
  * eax = 7 - function number
262
  * ebx = pointer to the image in the format BBGGRRBBGGRR...
263
  * ecx = [size on axis x]*65536 + [size on axis y]
264
  * edx = [coordinate on axis x]*65536 + [coordinate on axis y]
265
Returned value:
266
  * function does not return value
267
Remarks:
268
  * Coordinates of the image are coordinates of the upper left corner
269
    of the image relative to the window.
270
  * Size of the image in bytes is 3*xsize*ysize.
271
 
272
======================================================================
273
=============== Function 8 - define/delete the button. ===============
274
======================================================================
275
Parameters for button definition:
276
  * eax = 8 - function number
277
  * ebx = [coordinate on axis x]*65536 + [size on axis x]
278
  * ecx = [coordinate on axis y]*65536 + [size on axis y]
279
  * edx = 0xXYnnnnnn, where:
280
    * nnnnnn = identifier of the button
281
    * high (31st) bit of edx is cleared
282
    * if 30th bit of edx is set - do not draw the button
283
    * if 29th bit of edx is set - do not draw a frame
284
      at pressing the button
285
  * esi = 0x00RRGGBB - color of the button
286
Parameters for button deleting:
287
  * eax = 8 - function number
288
  * edx = 0x80nnnnnn, where nnnnnn - identifier of the button
289
Returned value:
290
  * function does not return value
291
Remarks:
292
  * Sizes of the button must be more than 0 and less than 0x8000.
293
  * For skinned windows definition of the window
294
    (call of 0th function) creates two standard buttons -
295
    for close of the window with identifier 1 and
296
    for minimize of the window with identifier 0xffff.
297
  * The creation of two buttons with same identifiers is admitted.
298
  * The button with the identifier 0xffff at pressing is interpreted
299
    by the system as the button of minimization, the system handles
300
    such pressing independently, not accessing to the application.
301
    In rest it is usual button.
302
  * Total number of buttons for all applications is limited to 4095.
303
 
304
======================================================================
305
============ Function 9 - information on execution thread. ===========
306
======================================================================
307
Parameters:
308
  * eax = 9 - function number
309
  * ebx = pointer to 1-Kb buffer
310
  * ecx = number of the slot of the thread
311
    ecx = -1 - get information on the current thread
312
Returned value:
313
  * eax = maximum number of the slot of a thread
314
  * buffer pointed to by ebx contains the following information:
315
    * +0: dword: usage of the processor (how many time units
316
      per second leaves on execution of this thread)
317
    * +4: word: position of the window of thread in the window stack
318
    * +6: word: (has no relation to the specified thread)
319
      number of the thread slot, which window has in the window stack
320
      position ecx
321
    * +8: word: reserved
322
    * +10 = +0xA: 11 bytes: name of the process
323
      (name of corresponding executable file in the format 8+3)
324
    * +21 = +0x15: byte: reserved, this byte is not changed
325
    * +22 = +0x16: dword: address of the process in memory
326
    * +26 = +0x1A: dword: size of used memory - 1
327
    * +30 = +0x1E: dword: identifier (PID/TID)
328
    * +34 = +0x22: dword: coordinate of the thread window on axis x
329
    * +38 = +0x26: dword: coordinate of the thread window on axis y
330
    * +42 = +0x2A: dword: size of the thread window on axis x
331
    * +46 = +0x2E: dword: size of the thread window on axis y
332
    * +50 = +0x32: word: status of the thread slot:
333
      * 0 = thread is running
334
      * 1 = thread is suspended
335
      * 2 = thread is suspended while waiting for event
336
      * 3 = thread is terminating as a result of call to function -1
337
        or under duress as a result of call to subfunction 2
338
        of function 18 or termination of the system
339
      * 4 = thread is terminating as a result of exception
340
      * 5 = thread waits for event
341
      * 9 = requested slot is free, all other information on the slot
342
        is not meaningful
343
    * +52 = +0x34: word: reserved, this word is not changed
344
    * +54 = +0x36: dword: coordinate of the client area on axis x
345
    * +58 = +0x3A: dword: coordinate of the client area on axis y
346
    * +62 = +0x3E: dword: width of the client area
347
    * +66 = +0x42: dword: height of the client area
348
    * +70 = +0x46: byte: state of the window - bitfield
349
      * bit 0 (mask 1): window is maximized
350
      * bit 1 (mask 2): window is minimized to panel
351
      * bit 2 (mask 4): window is rolled up
352
Remarks:
353
  * Slots are numbered starting from 1.
354
  * Returned value is not a total number of threads, because there
355
    can be free slots.
356
  * When process is starting, system automatically creates
357
    execution thread.
358
  * Function gives information on the thread. Each process has
359
    at least one thread. One process can create many threads,
360
    in this case each thread has its own slot and the fields
361
    +10, +22, +26 in these slots coincide.
362
    Applications have no common way to define whether two threads
363
    belong to one process.
364
  * The active window - window on top of the window stack -
365
    receives the messages on a keyboard input. For such window
366
    the position in the window stack coincides with returned value.
367
  * Slot 1 corresponds to special system thread, for which:
368
    * the window is in the bottom of the window stack, the fields
369
      +4 and +6 contain value 1
370
    * name of the process - "OS/IDLE" (supplemented by spaces)
371
    * address of the process in memory is 0, size of used memory is
372
      16 Mb (0x1000000)
373
    * PID=1
374
    * coordinates and sizes of the window and the client area are by
375
      convention set to 0
376
    * status of the slot is always 0 (running)
377
    * the execution time adds of time leaving on operations itself
378
      and idle time in waiting for interrupt (which can be got by call
379
      to subfunction 4 of function 18).
380
  * Beginning from slot 2, the normal applications are placed.
381
  * The normal applications are placed in memory at the address
382
    0x60400000 (kernel constant 'std_application_base_address').
383
    There is no intersection, as each process has its own page table.
384
  * At creation of the thread it is assigned the slot
385
    in the system table and identifier (Process/Thread IDentifier =
386
    PID/TID), which do not vary with time for given thread.
387
    After completion of the thread its slot can be anew used
388
    for another thread. The thread identifier can not be assigned
389
    to other thread even after completion of this thread.
390
    Identifiers, assigned to new threads, grow monotonously.
391
  * If the thread has not yet defined the window by call to
392
    function 0, the position and the sizes
393
    of its window are considered to be zero.
394
  * Coordinates of the client area are relative to the window.
395
  * At the moment only the part of the buffer by a size
396
    71 = 0x37 bytes is used. Nevertheless it is recommended to use
397
    1-Kb buffer for the future compatibility, in the future
398
    some fields can be added.
399
 
400
======================================================================
401
==================== Function 10 - wait for event. ===================
402
======================================================================
403
If the message queue is empty, waits for appearance of the message
404
in queue. In this state thread does not consume CPU time.
405
Then reads out the message from queue.
406
 
407
Parameters:
408
  * eax = 10 - function number
409
Returned value:
410
  * eax = event (see the list of events)
411
Remarks:
412
  * Those events are taken into account only which enter into
413
    a mask set by function 40. By default it is
414
    redraw, key and button events.
415
  * To check, whether there is a message in queue, use function 11.
416
    To wait for no more than given time, use function 23.
417
 
418
======================================================================
419
=============== Function 11 - check for event, no wait. ==============
420
======================================================================
421
If the message queue contains event, function reads out
422
and return it. If the queue is empty, function returns 0.
423
Parameters:
424
  * eax = 11 - function number
425
Returned value:
426
  * eax = 0 - message queue is empty
427
  * else eax = event (see the list of events)
428
Remarks:
429
  * Those events are taken into account only, which enter into
430
    a mask set by function 40. By default it is
431
    redraw, key and button events.
432
  * To wait for event, use function 10.
433
    To wait for no more than given time, use function 23.
434
 
435
======================================================================
436
=============== Function 12 - begin/end window redraw. ===============
437
======================================================================
438
 
439
---------------- Subfunction 1 - begin window redraw. ----------------
440
Parameters:
441
  * eax = 12 - function number
442
  * ebx = 1 - subfunction number
443
Returned value:
444
  * function does not return value
445
 
446
----------------- Subfunction 2 - end window redraw. -----------------
447
Parameters:
448
  * eax = 12 - function number
449
  * ebx = 2 - subfunction number
450
Returned value:
451
  * function does not return value
452
Remarks:
453
  * Subfunction 1 deletes all buttons defined with
454
    function 8, they must be defined again.
455
 
456
======================================================================
457
============ Function 13 - draw a rectangle in the window. ===========
458
======================================================================
459
Parameters:
460
  * eax = 13 - function number
461
  * ebx = [coordinate on axis x]*65536 + [size on axis x]
462
  * ecx = [coordinate on axis y]*65536 + [size on axis y]
463
  * edx = color 0xRRGGBB or 0x80RRGGBB for gradient fill
464
Returned value:
465
  * function does not return value
466
Remarks:
467
  * Coordinates are understood as coordinates of the left upper corner
468
    of a rectangle relative to the window.
469
 
470
======================================================================
471
=================== Function 14 - get screen size. ===================
472
======================================================================
473
Parameters:
474
  * eax = 14 - function number
475
Returned value:
476
  * eax = [xsize]*65536 + [ysize], where
477
  * xsize = x-coordinate of the right lower corner of the screen =
478
            horizontal size - 1
479
  * ysize = y-coordinate of the right lower corner of the screen =
480
            vertical size - 1
481
Remarks:
482
  * See also subfunction 5 of function 48 - get sizes of
483
    working area of the screen.
484
 
485
======================================================================
486
== Function 15, subfunction 1 - set a size of the background image. ==
487
======================================================================
488
Parameters:
489
  * eax = 15 - function number
490
  * ebx = 1 - subfunction number
491
  * ecx = width of the image
492
  * edx = height of the image
493
Returned value:
494
  * function does not return value
495
Remarks:
496
  * There is no checks for correctness. The setting of too large
497
    values will result that the background will contain data abroad
498
    of buffer for the background image. Buffer size = 0x160000-0x10,
499
    that corresponds to maximum size 800*600. (800*600*3=0x15F900)
500
  * For update of the screen (after completion of a series of commands
501
    working with a background) call subfunction 3.
502
  * There is a pair function for get size of the background image -
503
    subfunction 1 of function 39.
504
 
505
======================================================================
506
=== Function 15, subfunction 2 - put pixel on the background image. ==
507
======================================================================
508
Parameters:
509
  * eax = 15 - function number
510
  * ebx = 2 - subfunction number
511
  * ecx = offset
512
  * edx = color of a pixel 0xRRGGBB
513
Returned value:
514
  * function does not return value
515
Remarks:
516
  * Offset for a pixel with coordinates (x,y) is calculated as
517
    (x+y*xsize)*3.
518
  * If the given offset exceeds 0x160000-16 = 1.375 Mb - 16 bytes,
519
    the call is ignored.
520
  * For update of the screen (after completion of a series of commands
521
    working with a background) call subfunction 3.
522
  * There is a pair function for get pixel on the background image -
523
    subfunction 2 of function 39.
524
 
525
======================================================================
526
=========== Function 15, subfunction 3 - redraw background. ==========
527
======================================================================
528
Parameters:
529
  * eax = 15 - function number
530
  * ebx = 3 - subfunction number
531
Returned value:
532
  * function does not return value
533
 
534
======================================================================
535
== Function 15, subfunction 4 - set drawing mode for the background. =
536
======================================================================
537
Parameters:
538
  * eax = 15 - function number
539
  * ebx = 4 - subfunction number
540
  * ecx = drawing mode:
541
    * 1 = tile
542
    * 2 = stretch
543
Returned value:
544
  * function does not return value
545
Remarks:
546
  * For update of the screen (after completion of a series of commands
547
    working with a background) call subfunction 3.
548
  * There is a pair function for get drawing mode of the background -
549
    subfunction 4 of function 39.
550
 
551
======================================================================
552
===================== Function 15, subfunction 5 =====================
553
============ Put block of pixels on the background image. ============
554
======================================================================
555
Parameters:
556
  * eax = 15 - function number
557
  * ebx = 5 - subfunction number
558
  * ecx = pointer to the data in the format BBGGRRBBGGRR...
559
  * edx = offset in data of the background image
560
  * esi = size of data in bytes = 3 * number of pixels
561
Returned value:
562
  * function does not return value
563
Remarks:
564
  * If the block gets out abroad 0x160000-16 = 1.375 Mb - 16 bytes,
565
    the call is ignored.
566
  * Color of each pixel is stored as 3-bytes value BBGGRR.
567
  * Pixels of the background image are written sequentially
568
    from left to right, from up to down.
569
  * Offset of pixel with coordinates (x,y) is (x+y*xsize)*3.
570
  * For update of the screen (after completion of a series of commands
571
    working with a background) call subfunction 3.
572
 
573
======================================================================
574
=============== Function 16 - save ramdisk on a floppy. ==============
575
======================================================================
576
Parameters:
577
  * eax = 16 - function number
578
  * ebx = 1 or ebx = 2 - on which floppy save
579
Returned value:
580
  * eax = 0 - success
581
  * eax = 1 - error
582
 
583
======================================================================
584
======= Function 17 - get the identifier of the pressed button. ======
585
======================================================================
586
Takes away the code of the pressed button from the buffer.
587
Parameters:
588
  * eax = 17 - function number
589
Returned value:
590
  * if the buffer is empty, function returns eax=1
591
  * if the buffer is not empty, function returns al=0,
592
    high 24 bits of eax contain button identifier (in particular, ah
593
    contains low byte of the identifier; if all buttons have
594
    the identifier less than 256, ah is enough to distinguish).
595
Remarks:
596
  * "Buffer" keeps only one button, at pressing the new button the
597
    information about old is lost.
598
  * The call of this function by an application with inactive window
599
    will return answer "buffer is empty".
600
 
601
======================================================================
602
============ Function 18, subfunction 1 - system shutdown. ===========
603
======================================================================
604
Parameters:
605
  * eax = 18 - function number
606
  * ebx = 1 - subfunction number
607
Returned value:
608
  * function always return eax = 0 as tag of success
609
Remarks:
610
  * On the last step menu of exit from the system appears and waits
611
    response of the user.
612
  * See also subfunction 9, system shutdown with
613
    the parameter to force the choice in the exit menu.
614
 
615
======================================================================
616
= Function 18, subfunction 2 - terminate process/thread by the slot. =
617
======================================================================
618
Parameters:
619
  * eax = 18 - function number
620
  * ebx = 2 - subfunction number
621
  * ecx = number of the slot of process/thread
622
Returned value:
623
  * function does not return value
624
Remarks:
625
  * It is impossible to terminate system thread OS/IDLE (with
626
    number of the slot 1),
627
    it is possible to terminate any normal process/thread.
628
  * See also subfunction 18 - terminate
629
    process/thread by the identifier.
630
 
631
======================================================================
632
===================== Function 18, subfunction 3 =====================
633
============= Make active the window of the given thread. ============
634
======================================================================
635
Parameters:
636
  * eax = 18 - function number
637
  * ebx = 3 - subfunction number
638
  * ecx = number of the thread slot
639
Returned value:
640
  * function does not return value
641
Remarks:
642
  * If correct, but nonexistent slot is given,
643
    some window is made active.
644
  * To find out, which window is active, use subfunction 7.
645
 
646
======================================================================
647
===================== Function 18, subfunction 4 =====================
648
=========== Get counter of idle time units per one second. ===========
649
======================================================================
650
Idle time units are units, in which the processor stands idle
651
in waiting for interrupt (in the command 'hlt').
652
 
653
Parameters:
654
  * eax = 18 - function number
655
  * ebx = 4 - subfunction number
656
Returned value:
657
  * eax = value of the counter of idle time units per one second
658
 
659
======================================================================
660
========== Function 18, subfunction 5 - get CPU clock rate. ==========
661
======================================================================
662
Parameters:
663
  * eax = 18 - function number
664
  * ebx = 5 - subfunction number
665
Returned value:
666
  * eax = clock rate (modulo 2^32 clock ticks = 4GHz)
667
 
668
======================================================================
669
 Function 18, subfunction 6 - save ramdisk to the file on hard drive.
670
======================================================================
671
Parameters:
672
  * eax = 18 - function number
673
  * ebx = 6 - subfunction number
674
  * ecx = pointer to the full path to file
675
    (for example, "/hd0/1/kolibri/kolibri.img")
676
Returned value:
677
  * eax = 0 - success
678
  * else eax = error code of the file system
679
Замечания:
680
  * All folders in the given path must exist, otherwise function
681
    returns value 5, "file not found".
682
 
683
======================================================================
684
=========== Function 18, subfunction 7 - get active window. ==========
685
======================================================================
686
Parameters:
687
  * eax = 18 - function number
688
  * ebx = 7 - subfunction number
689
Returned value:
690
  * eax = number of the active window
691
    (number of the slot of the thread with active window)
692
Remarks:
693
  * Active window is at the top of the window stack and receives
694
    messages on all keyboard input.
695
  * To make a window active, use subfunction 3.
696
 
697
======================================================================
698
== Function 18, subfunction 8 - disable/enable the internal speaker. =
699
======================================================================
700
If speaker sound is disabled, all calls to subfunction 55 of
701
function 55 are ignored. If speaker sound is enabled,
702
they are routed on builtin speaker.
703
 
704
------------------- Subsubfunction 1 - get status. -------------------
705
Parameters:
706
  * eax = 18 - function number
707
  * ebx = 8 - subfunction number
708
  * ecx = 1 - number of the subsubfunction
709
Returned value:
710
  * eax = 0 - speaker sound is enabled; 1 - disabled
711
 
712
----------------- Subsubfunction 2 - toggle status. ------------------
713
Toggles states of disable/enable.
714
Parameters:
715
  * eax = 18 - function number
716
  * ebx = 8 - subfunction number
717
  * ecx = 2 - number of the subsubfunction
718
Returned value:
719
  * function does not return value
720
 
721
======================================================================
722
== Function 18, subfunction 9 - system shutdown with the parameter. ==
723
======================================================================
724
Parameters:
725
  * eax = 18 - function number
726
  * ebx = 9 - subfunction number
727
  * ecx = parameter:
728
    * 1 = on the last step of shutdown save ramdisk on a floppy and
729
      then show the exit menu and request further operations
730
      from the user
731
    * 2 = turn off computer
732
    * 3 = reboot computer
733
    * 4 = restart the kernel from the file 'kernel.mnt' on ramdisk
734
Returned value:
735
  * at incorrect ecx the registers do not change (i.e. eax=18)
736
  * by correct call function always returns eax=0
737
    as the tag of success
738
Remarks:
739
  * Do not rely on returned value by incorrect call, it can be
740
    changed in future versions of the kernel.
741
  * It is possible to use subfunction 1, that on the last step
742
    the user makes choice himself.
743
  * It is not recommended to use value ecx=1 (to not irritate the user
744
    with excessive questions); to save ramdisk on a floppy use
745
    function 16 (which admits specification, on which floppy to
746
    write), and to shutdown with the exit menu use already mentioned
747
    subfunction 1.
748
 
749
======================================================================
750
===== Function 18, subfunction 10 - minimize application window. =====
751
======================================================================
752
Minimizes the own window.
753
Parameters:
754
  * eax = 18 - function number
755
  * ebx = 10 - subfunction number
756
Returned value:
757
  * function does not return value
758
Remarks:
759
  * The minimized window from the point of view of function 9
760
    keeps position and sizes.
761
  * Restoring of an application window occurs at its activation by
762
    subfunction 3.
763
  * Usually there is no necessity to minimize/restire a window
764
    obviously: minimization of a window is carried out by the system
765
    at pressing the minimization button (for skinned windows
766
    it is defined automatically by function 0,
767
    for other windows it can be defined manually by function 8),
768
    restore of a window is done by the application '@panel'.
769
 
770
======================================================================
771
 Function 18, subfunction 11 - get information on the disk subsystem.
772
======================================================================
773
Parameters:
774
  * eax = 18 - function number
775
  * ebx = 11 - subfunction number
776
  * ecx = type of the table:
777
    * 1 = short version, 10 bytes
778
    * 2 = full version, 65536 bytes
779
  * edx = pointer to the buffer (in the application) for the table
780
Returned value:
781
  * function does not return value
782
Format of the table: short version:
783
  * +0: byte: information about FDD's (drives for floppies),
784
    AAAABBBB, where AAAA gives type of the first drive, BBBB -
785
    of the second regarding to the following list:
786
    * 0 = there is no drive
787
    * 1 = 360Kb, 5.25''
788
    * 2 = 1.2Mb, 5.25''
789
    * 3 = 720Kb, 3.5''
790
    * 4 = 1.44Mb, 3.5''
791
    * 5 = 2.88Mb, 3.5'' (such drives are not used anymore)
792
    For example, for the standard configuration from one 1.44-drive
793
    here will be 40h, and for the case 1.2Mb on A: and 1.44Mb on B:
794
    the value is 24h.
795
  * +1: byte: information about hard disks and CD-drives, AABBCCDD,
796
    where AA corresponds to the controller IDE0, ..., DD - IDE3:
797
    * 0 = device is absent
798
    * 1 = hard drive
799
    * 2 = CD-drive
800
    For example, in the case HD on IDE0 and CD on IDE2
801
    this field contains 48h.
802
  * +2: 4 db: number of the retrieved partitions on hard disks
803
    at accordingly IDE0,...,IDE3.
804
    If the hard disk on IDEx is absent, appropriate byte is zero,
805
    otherwise it shows number of the recognized partitions, which
806
    can be not presented (if the drive is not formatted or if
807
    the file system is not supported). Current version of the kernel
808
    supports only FAT16, FAT32 and NTFS for hard disks.
809
  * +6: 4 db: reserved
810
Format of the table: full version:
811
  * +0: 10 db: same as for the short version
812
  * +10: 100 db: data for the first partition
813
  * +110: 100 db: data for the second partition
814
  * ...
815
  * +10+100*(n-1): 100 db: data for the last partition
816
The partitions are located as follows: at first sequentially all
817
recoginzed partitions on HD on IDE0 (if present),
818
then on HD on IDE1 (if present) and so on up to IDE3.
819
Format of the information about partition
820
(at moment only FAT is supported):
821
  * +0: dword: first physical sector of the partition
822
  * +4: dword: last physical sector of the partition
823
    (belongs to the partition)
824
  * +8: byte: file system type:
825
    16=FAT16, 32=FAT32, 1=NTFS
826
  * other data are dependent on file system, are modified with
827
    kernel modifications and therefore are not described
828
Remarks:
829
  * The short table can be used for obtaining the information about
830
    available devices.
831
 
832
======================================================================
833
========== Function 18, subfunction 13 - get kernel version. =========
834
======================================================================
835
Parameters:
836
  * eax = 18 - function number
837
  * ebx = 13 - subfunction number
838
  * ecx = pointer to the buffer (not less than 16 bytes), where
839
    the information will be placed
840
Returned value:
841
  * function does not return value
842
Structure of the buffer:
843
db a,b,c,d for version a.b.c.d
844
db UID_xxx: one of UID_NONE=0, UID_MENUET=1, UID_KOLIBRI=2
845
db 'name',0 - ASCIIZ-string with the name
846
For Kolibri 0.6.5.0 kernel:
847
db 0,6,5,0
848
db 2
849
db 'Kolibri',0
850
 
851
======================================================================
852
======= Function 18, subfunction 14 - wait for screen retrace. =======
853
======================================================================
854
Waits for the beginning of retrace of the scanning ray of the screen
855
monitor.
856
Parameters:
857
  * eax = 18 - function number
858
  * ebx = 14 - subfunction number
859
Returned value:
860
  * eax = 0 as the tag of success
861
Remarks:
862
  * Function is intended only for active high-efficiency graphics
863
    applications; is used for smooth output of a graphics.
864
 
865
======================================================================
866
== Function 18, subfunction 15 - center mouse cursor on the screen. ==
867
======================================================================
868
Parameters:
869
  * eax = 18 - function number
870
  * ebx = 15 - subfunction number
871
Returned value:
872
  * eax = 0 as the tag of success
873
 
874
======================================================================
875
========= Function 18, subfunction 16 - get size of free RAM. ========
876
======================================================================
877
Parameters:
878
  * eax = 18 - function number
879
  * ebx = 16 - subfunction number
880
Returned value:
881
  * eax = size of free memory in kilobytes
882
 
883
======================================================================
884
======== Function 18, subfunction 17 - get full amount of RAM. =======
885
======================================================================
886
Parameters:
887
  * eax = 18 - function number
888
  * ebx = 17 - subfunction number
889
Returned value:
890
  * eax = total size of existing memory in kilobytes
891
 
892
======================================================================
893
===================== Function 18, subfunction 18 ====================
894
============= Terminate process/thread by the identifier. ============
895
======================================================================
896
Parameters:
897
  * eax = 18 - function number
898
  * ebx = 18 - subfunction number
899
  * ecx = identifer of process/thread (PID/TID)
900
Returned value:
901
  * eax = 0 - success
902
  * eax = -1 - error (process is not found or is system)
903
Remarks:
904
  * It is impossible to terminate system thread OS/IDLE (identifier
905
    1), it is possible to terminate any normal process/thread.
906
  * See also subfunction 2 - terminate
907
    process/thread by given slot.
908
 
909
======================================================================
910
======== Function 18, subfunction 19 - get/set mouse features. =======
911
======================================================================
912
 
913
---------------- Subsubfunction 0 - get mouse speed. -----------------
914
Parameters:
915
  * eax = 18 - function number
916
  * ebx = 19 - subfunction number
917
  * ecx = 0 - subsubfunction number
918
Returned value:
919
  * eax = current mouse speed
920
 
921
---------------- Subsubfunction 1 - set mouse speed. -----------------
922
Parameters:
923
  * eax = 18 - function number
924
  * ebx = 19 - subfunction number
925
  * ecx = 1 - subsubfunction number
926
  * edx = new value for speed
927
Returned value:
928
  * function does not return value
929
 
930
---------------- Subsubfunction 2 - get mouse delay. -----------------
931
Parameters:
932
  * eax = 18 - function number
933
  * ebx = 19 - subfunction number
934
  * ecx = 2 - subsubfunction number
935
Returned value:
936
  * eax = current mouse delay
937
 
938
---------------- Subsubfunction 3 - set mouse delay. -----------------
939
Parameters:
940
  * eax = 18 - function number
941
  * ebx = 19 - subfunction number
942
  * ecx = 3 - subsubfunction number
943
  * edx = new value for mouse delay
944
Returned value:
945
  * function does not return value
946
 
947
----------- Subsubfunction 4 - set mouse pointer position. -----------
948
Parameters:
949
  * eax = 18 - function number
950
  * ebx = 19 - subfunction number
951
  * ecx = 4 - subsubfunction number
952
  * edx = [coordinate on axis x]*65536 + [coordinate on axis y]
953
Returned value:
954
  * function does not return value
955
Remarks:
956
  * It is recommended to set speed of the mouse (in subsubfunction 1)
957
    from 1 up to 9. The installed value is not inspected by the kernel
958
    code, so set it carefully, at incorrect value the cursor
959
    can "freeze". Speed of the mouse can be regulated through the
960
    application SETUP.
961
  * Recommended delay of the mouse (in subsubfunction 3) = 10. Lower
962
    value is not handled by COM mice. At the very large values the
963
    movement of the mouse on 1 pixel is impossible and the cursor will
964
    jump on the value of installed speed (subsubfunction 1). The
965
    installed value is not inspected by the kernel code.
966
    Mouse delay can be regulated through the application SETUP.
967
  * The subsubfunction 4 does not check the passed value. Before
968
    its call find out current screen resolution (with function 14)
969
    and check that the value of position is inside the limits of the
970
    screen.
971
 
972
======================================================================
973
======== Function 18, subfunction 20 - get information on RAM. =======
974
======================================================================
975
Parameters:
976
  * eax = 18 - function number
977
  * ebx = 20 - subfunction number
978
  * ecx = pointer to the buffer for information (36 bytes)
979
Returned value:
980
  * eax = total size of existing RAM in pages
981
    or -1 if error has occured
982
  * buffer pointed to by ecx contains the following information:
983
    * +0:  dword: total size of existing RAM in pages
984
    * +4:  dword: size of free RAM in pages
985
    * +8:  dword: number of page faults (exceptions #PF)
986
                 in applications
987
    * +12: dword: size of kernel heap in bytes
988
    * +16: dword: free in kernel heap in bytes
989
    * +20: dword: total number of memory blocks in kernel heap
990
    * +24: dword: number of free memory blocks in kernel heap
991
    * +28: dword: size of maximum free block in kernel heap
992
                 (reserved)
993
    * +32: dword: size of maximum allocated block in kernel heap
994
                 (reserved)
995
 
996
======================================================================
997
==================== Function 20 - MIDI interface. ===================
998
======================================================================
999
 
1000
----------------------- Subfunction 1 - reset ------------------------
1001
Parameters:
1002
  * eax = 20 - function number
1003
  * ebx = 1 - subfunction number
1004
 
1005
-------------------- Subfunction 2 - output byte ---------------------
1006
Parameters:
1007
  * eax = 20 - function number
1008
  * ebx = 2 - subfunction number
1009
  * cl = byte for output
1010
Returned value (is the same for both subfunctions):
1011
  * eax = 0 - success
1012
  * eax = 1 - base port is not defined
1013
Remarks:
1014
  * Previously the base port must be defined by
1015
    subfunction 1 of function 21.
1016
 
1017
======================================================================
1018
======== Function 21, subfunction 1 - set MPU MIDI base port. ========
1019
======================================================================
1020
Parameters:
1021
  * eax = 21 - function number
1022
  * ebx = 1 - subfunction number
1023
  * ecx = number of base port
1024
Returned value
1025
  * eax = 0 - success
1026
  * eax = -1 - erratic number of a port
1027
Remarks:
1028
  * Number of a port must satisfy to conditions 0x100<=ecx<=0xFFFF.
1029
  * The installation of base is necessary for function 20.
1030
  * To get base port use subfunction 1 of function 26.
1031
 
1032
======================================================================
1033
========== Function 21, subfunction 2 - set keyboard layout. =========
1034
======================================================================
1035
Keyboard layout is used to convert keyboard scancodes to ASCII-codes,
1036
which will be read by function 2.
1037
Parameters:
1038
  * eax = 21 - function number
1039
  * ebx = 2 - subfunction number
1040
  * ecx = which layout to set:
1041
    * 1 = normal layout
1042
    * 2 = layout at pressed Shift
1043
    * 3 = layout at pressed Alt
1044
  * edx = pointer to layout - table of length 128 bytes
1045
Or:
1046
  * ecx = 9
1047
  * dx = country identifier (1=eng, 2=fi, 3=ger, 4=rus)
1048
Returned value:
1049
  * eax = 0 - success
1050
  * eax = 1 - incorrect parameter
1051
Remarks:
1052
  * If Alt is pressed, the layout with Alt is used;
1053
    if Alt is not pressed, but Shift is pressed,
1054
    the layout with Shift is used;
1055
    if Alt and Shift are not pressed, but Ctrl is pressed, the normal
1056
    layout is used and then from the code is subtracted 0x60;
1057
    if no control key is pressed, the normal layout is used.
1058
  * To get layout and country identifier use
1059
    subfunction 2 of function 26.
1060
  * Country identifier is global system variable, which is not used
1061
    by the kernel itself; however the application '@panel' displays
1062
    the corresponding icon.
1063
  * The application @panel switches layouts on user request.
1064
 
1065
======================================================================
1066
============== Function 21, subfunction 3 - set CD base. =============
1067
======================================================================
1068
Parameters:
1069
  * eax = 21 - function number
1070
  * ebx = 3 - subfunction number
1071
  * ecx = CD base: 1=IDE0, 2=IDE1, 3=IDE2, 4=IDE3
1072
Returned value:
1073
  * eax = 0
1074
Remarks:
1075
  * CD base is used by function 24.
1076
  * To get CD base use subfunction 3 of function 26.
1077
 
1078
======================================================================
1079
====== Function 21, subfunction 4 - set Sound Blaster base port. =====
1080
======================================================================
1081
Parameters:
1082
  * eax = 21 - function number
1083
  * ebx = 4 - subfunction number
1084
  * ecx = number of the base port
1085
Returned value:
1086
  * eax = 0 - success
1087
  * eax = -1 - erratic port number
1088
Remarks:
1089
  * Number of the port must satisfy to conditions 0x100<=ecx<=0xFFFF.
1090
  * The installation of the base is necessary for
1091
    functions 25, 28, 55.
1092
  * To get base port use subfunction 4 of function 26.
1093
 
1094
======================================================================
1095
========== Function 21, subfunction 5 - set system language. =========
1096
======================================================================
1097
Parameters:
1098
  * eax = 21 - function number
1099
  * ebx = 5 - subfunction number
1100
  * ecx = system language (1=eng, 2=fi, 3=ger, 4=rus)
1101
Returned value:
1102
  * eax = 0
1103
Remarks:
1104
  * System language is global system variable and is not used
1105
    by the kernel itself, however application @panel draws the
1106
    appropriate icon.
1107
  * Function does not check for correctness, as the kernel does not
1108
    use this variable.
1109
  * To get system language use subfunction 5 of function 26.
1110
 
1111
======================================================================
1112
============== Function 21, subfunction 7 - set HD base. =============
1113
======================================================================
1114
The HD base defines hard disk to write with usage of obsolete
1115
syntax /HD in obsolete function 58; at usage of modern syntax
1116
/HD0,/HD1,/HD2,/HD3 base is set automatically.
1117
Parameters:
1118
  * eax = 21 - function number
1119
  * ebx = 7 - subfunction number
1120
  * ecx = HD base: 1=IDE0, 2=IDE1, 3=IDE2, 4=IDE3
1121
Returned value:
1122
  * eax = 0
1123
Remarks:
1124
  * Any application at any time can change the base.
1125
  * Do not change base, when any application works with hard disk.
1126
    If you do not want system bugs.
1127
  * To get HD base use subfunction 7 of function 26.
1128
  * It is also necessary to define used partition of hard disk by
1129
    subfunction 8.
1130
 
1131
======================================================================
1132
========= Function 21, subfunction 8 - set used HD partition. ========
1133
======================================================================
1134
The HD partition defines partition of the hard disk to write with
1135
usage of obsolete syntax /HD and obsolete function 58;
1136
at usage of functions 58 and 70 and modern syntax /HD0,/HD1,/HD2,/HD3
1137
base and partition are set automatically.
1138
Parameters:
1139
  * eax = 21 - function number
1140
  * ebx = 8 - subfunction number
1141
  * ecx = HD partition (beginning from 1)
1142
Return value:
1143
  * eax = 0
1144
Remarks:
1145
  * Any application at any time can change partition.
1146
  * Do not change partition when any application works with hard disk.
1147
    If you do not want system bugs.
1148
  * To get used partition use subfunction 8 of function 26.
1149
  * There is no correctness checks.
1150
  * To get the number of partitions of a hard disk use
1151
    subfunction 11 of function 18.
1152
  * It is also necessary to define used HD base by subfunction 7.
1153
 
1154
======================================================================
1155
======== Function 21, subfunction 10 - set sound DMA channel. ========
1156
======================================================================
1157
Parameters:
1158
  * eax = 21 - function number
1159
  * ebx = 10 - subfunction number
1160
  * ecx = number of channel (from 0 up to 3 inclusively)
1161
Returned value:
1162
  * eax = 0 - success
1163
  * eax = -1 - incorrect channel number
1164
Remarks:
1165
  * Number of DMA channel is used in subfunction 1 of function 55.
1166
  * To get sound DMA channel use subfunction 10 of function 26.
1167
 
1168
======================================================================
1169
 Function 21, subfunction 11 - enable/disable low-level access to HD.
1170
======================================================================
1171
Parameters:
1172
  * eax = 21 - function number
1173
  * ebx = 11 - subfunction number
1174
  * ecx = 0/1 - disable/enable
1175
Returned value:
1176
  * eax = 0
1177
Remarks:
1178
  * Is used in LBA-read (subfunction 8 of function 58).
1179
  * The current implementation uses only low bit of ecx.
1180
  * To get current status use subfunction 11 of function 26.
1181
 
1182
======================================================================
1183
 Function 21, subfunction 12 - enable/disable low-level access to PCI.
1184
======================================================================
1185
Parameters:
1186
  * eax = 21 - function number
1187
  * ebx = 12 - subfunction number
1188
  * ecx = 0/1 - disable/enable
1189
Returned value:
1190
  * eax = 0
1191
Remarks:
1192
  * Is used in operations with PCI bus (function 62).
1193
  * The current implementation uses only low bit of ecx.
1194
  * To get current status use subfunction 12 of function 26.
1195
 
1196
======================================================================
1197
============ Function 21, subfunction 13, subsubfunction 1 ===========
1198
======== Initialize + get information on the driver vmode.mdr. =======
1199
======================================================================
1200
Parameters:
1201
  * eax = 21 - function number
1202
  * ebx = 13 - subfunction number
1203
  * ecx = 1 - number of the driver function
1204
  * edx = pointer to 512-bytes buffer
1205
Returned value:
1206
  * if driver is not loaded
1207
    (never happens in the current implementation):
1208
    * eax = -1
1209
    * ebx, ecx destroyed
1210
  * if driver is loaded:
1211
    * eax = 'MDAZ' (in fasm style, that is 'M' - low byte, 'Z' - high)
1212
      - signature
1213
    * ebx = current frequency of the scanning (in Hz)
1214
    * ecx destroyed
1215
    * buffer pointed to by edx is filled
1216
Format of the buffer:
1217
  * +0: 32*byte: driver name, "Trans VideoDriver"
1218
    (without quotes, supplemented by spaces)
1219
  * +32 = +0x20: dword: driver version (version x.y is encoded as
1220
    y*65536+x), for the current implementation is 1 (1.0)
1221
  * +36 = +0x24: 7*dword: reserved (0 in the current implementation)
1222
  * +64 = +0x40: 32*word: list of supported videomodes (each word
1223
    is number of a videomode, after list itself there are zeroes)
1224
  * +128 = +0x80: 32*(5*word): list of supported frequences of the
1225
    scannings for videomodes: for each videomode listed in the
1226
    previous field up to 5 supported frequences are given
1227
    (unused positions contain zeroes)
1228
Remarks:
1229
  * Function initializes the driver (if it is not initialized yet)
1230
    and must be called first, before others (otherwise they will do
1231
    nothing and return -1).
1232
  * The current implementation supports only one frequency
1233
    of the scanning on videomode.
1234
 
1235
======================================================================
1236
============ Function 21, subfunction 13, subsubfunction 2 ===========
1237
================ Get information on current videomode. ===============
1238
======================================================================
1239
Parameters:
1240
  * eax = 21 - function number
1241
  * ebx = 13 - subfunction number
1242
  * ecx = 2 - number of the driver function
1243
Returned value:
1244
  * eax = -1 - driver is not loaded or not initialized;
1245
    ebx,ecx are destroyed
1246
  * eax = [width]*65536 + [height]
1247
  * ebx = frequency of the vertical scanning (in Hz)
1248
  * ecx = number of current videomode
1249
Remarks:
1250
  * Driver must be initialized by call to
1251
    driver function 1.
1252
  * If only screen sizes are required, it is more expedient to use
1253
    function 14 taking into account that it
1254
    returns sizes on 1 less.
1255
 
1256
======================================================================
1257
=== Function 21, subfunction 13, subsubfunction 3 - set videomode. ===
1258
======================================================================
1259
Parameters:
1260
  * eax = 21 - function number
1261
  * ebx = 13 - subfunction number
1262
  * ecx = 3 - number of the driver function
1263
  * edx = [scanning frequency]*65536 + [videomode number]
1264
Returned value:
1265
  * eax = -1 - driver is not loaded, not initialized or
1266
    an error has occured
1267
  * eax = 0 - success
1268
  * ebx, ecx destroyed
1269
Remarks:
1270
  * Driver must be initialized by driver function 1.
1271
  * The videomode number and frequency must be in the table
1272
    returned by driver function 1.
1273
 
1274
======================================================================
1275
============ Function 21, subfunction 13, subsubfunction 4 ===========
1276
================== Return to the initial videomode. ==================
1277
======================================================================
1278
Returns the screen to the videomode set at system boot.
1279
Parameters:
1280
  * eax = 21 - function number
1281
  * ebx = 13 - subfunction number
1282
  * ecx = 4 - number of the driver function
1283
Returned value:
1284
  * eax = -1 - driver is not loaded or not initialized
1285
  * eax = 0 - success
1286
  * ebx, ecx destroyed
1287
Remarks:
1288
  * Driver must be initialized by call to driver function 1.
1289
 
1290
======================================================================
1291
============ Function 21, subfunction 13, subsubfunction 5 ===========
1292
===== Increase/decrease the size of the visible area of monitor. =====
1293
======================================================================
1294
Parameters:
1295
  * eax = 21 - function number
1296
  * ebx = 13 - subfunction number
1297
  * ecx = 5 - number of the driver function
1298
  * edx = 0/1 - decrease/increase horizontal size on 1 position
1299
  * edx = 2/3 - is not supported in the current implementation;
1300
    is planned as decrease/increase vertical size on 1 position
1301
Returned value:
1302
  * eax = -1 - driver is not loaded or not initialized
1303
  * eax = 0 - success
1304
  * ebx, ecx destroyed
1305
Remarks:
1306
  * Driver must be initialized by call to driver function 1.
1307
  * Function influences only the physical size of the screen image;
1308
    the logical size (number of pixels) does not change.
1309
 
1310
======================================================================
1311
================= Function 22 - set system date/time. ================
1312
======================================================================
1313
Parameters:
1314
  * eax = 22 - function number
1315
  * ebx = 0 - set time
1316
    * ecx = 0x00SSMMHH - time in the binary-decimal code (BCD):
1317
    * HH=hour 00..23
1318
    * MM=minute 00..59
1319
    * SS=second 00..59
1320
  * ebx = 1 - set date
1321
    * ecx = 0x00DDMMYY - date in the binary-decimal code (BCD):
1322
    * DD=day 01..31
1323
    * MM=month 01..12
1324
    * YY=year 00..99
1325
  * ebx = 2 - set day of week
1326
    * ecx = 1 for Sunday, ..., 7 for Saturday
1327
  * ebx = 3 - set alarm clock
1328
    * ecx = 0x00SSMMHH
1329
Returned value:
1330
  * eax = 0 - success
1331
  * eax = 1 - incorrect parameter
1332
  * eax = 2 - CMOS-battery was unloaded
1333
Remarks:
1334
  * Value of installation of day of week seems to be doubtful,
1335
    as it a little where is used
1336
    (day of week can be calculated by date).
1337
  * Alarm clock can be set on operation in the given time every day.
1338
    But there is no existing system function to disable it.
1339
  * Operation of alarm clock consists in generation IRQ8.
1340
  * Generally CMOS supports for alarm clock set of value 0xFF
1341
    as one of parameters and it means that the appropriate parameter
1342
    is ignored. But current implementation does not allow this
1343
    (will return 1).
1344
  * Alarm clock is a global system resource; the set of
1345
    an alarm clock cancels automatically the previous set.
1346
    However, at moment no program uses it.
1347
 
1348
======================================================================
1349
============= Function 23 - wait for event with timeout. =============
1350
======================================================================
1351
If the message queue is empty, waits for new message in the queue,
1352
but no more than given time. Then reads out a message from the queue.
1353
 
1354
Parameters:
1355
  * eax = 23 - function number
1356
  * ebx = timeout (in 1/100 of second)
1357
Returned value:
1358
  * eax = 0 - the message queue is empty
1359
  * otherwise eax = event (see the list of events)
1360
Remarks:
1361
  * Only those events are taken into account, which enter into
1362
    the mask set by function 40. By default it is
1363
    redraw, key and button events.
1364
  * To check for presence of a message in the queue use function 11.
1365
    To wait without timeout use function 10.
1366
  * Transmission ebx=0 results in immediate returning eax=0.
1367
  * Current implementation returns immediately with eax=0,
1368
    if the addition of ebx with the current value of time counter
1369
    makes 32-bit overflow.
1370
 
1371
======================================================================
1372
======== Function 24, subfunction 1 - begin to play CD-audio. ========
1373
======================================================================
1374
Parameters:
1375
  * eax = 24 - function number
1376
  * ebx = 1 - subfunction number
1377
  * ecx = 0x00FRSSMM, where
1378
    * MM = starting minute
1379
    * SS = starting second
1380
    * FR = starting frame
1381
Returned value:
1382
  * eax = 0 - success
1383
  * eax = 1 - CD base is not defined
1384
Remarks:
1385
  * Previously CD base must be defined by the call to
1386
    subfunction 3 of function 21.
1387
  * One second includes 75 frames, one minute includes 60 seconds.
1388
  * The function is asynchronous (returns control, when play begins).
1389
 
1390
======================================================================
1391
======= Function 24, subfunction 2 - get information on tracks. ======
1392
======================================================================
1393
Parameters:
1394
  * eax = 24 - function number
1395
  * ebx = 2 - subfunction number
1396
  * ecx = pointer to the buffer for the table
1397
    (maximum 8*64h+4 bytes=100 tracks)
1398
Returned value:
1399
  * eax = 0 - success
1400
  * eax = 1 - CD base is not defined
1401
Remarks:
1402
  * The format of the table with tracks information is the same as
1403
    for ATAPI-CD command 43h (READ TOC), usual table (subcommand 00h).
1404
    Function returns addresses in MSF.
1405
  * Previously CD base port must be set by call to
1406
    subfunction 3 of function 21.
1407
  * Function returns information only about no more than 100
1408
    first tracks. In most cases it is enough.
1409
 
1410
======================================================================
1411
========== Function 24, subfunction 3 - stop play CD-audio. ==========
1412
======================================================================
1413
Parameters:
1414
  * eax = 24 - function number
1415
  * ebx = 1 - subfunction number
1416
Returned value:
1417
  * eax = 0 - success
1418
  * eax = 1 - CD base is not defined
1419
Замечания:
1420
  * Previously CD base port must be defined by call to
1421
    subfunction 3 of function 21.
1422
 
1423
======================================================================
1424
=================== Function 25 - set SBPro volume. ==================
1425
======================================================================
1426
Parameters:
1427
  * eax = 25 - function number
1428
  * ebx = what to set:
1429
    * 1 - set common volume
1430
    * 2 - set CD-audio volume
1431
  * cl = volume level: high 4 bits for the left column,
1432
    low 4 bits for the right one
1433
Returned value:
1434
  * eax = 0 - success
1435
  * eax = 1 - SB base is not defined
1436
  * eax = 2 - incorrect subfunction
1437
Remarks:
1438
  * Previously SB base port must be defined by
1439
    subfunction 4 of function 21.
1440
  * See also function 28 which sets
1441
    volume for the later standard SB16.
1442
 
1443
======================================================================
1444
======== Function 26, subfunction 1 - get MPU MIDI base port. ========
1445
======================================================================
1446
Parameters:
1447
  * eax = 26 - function number
1448
  * ebx = 1 - subfunction number
1449
Returned value:
1450
  * eax = port number
1451
Parameters:
1452
  * To set base port use subfunction 1 of function 21.
1453
 
1454
======================================================================
1455
========== Function 26, subfunction 2 - get keyboard layout. =========
1456
======================================================================
1457
The keyboard layout is used to convert keyboard scancodes to
1458
ASCII-codes for function 2.
1459
Parameters:
1460
  * eax = 26 - function number
1461
  * ebx = 2 - subfunction number
1462
  * ecx = what layout to get:
1463
    * 1 = normal layout
1464
    * 2 = layout with pressed Shift
1465
    * 3 = layout with pressed Alt
1466
  * edx = pointer to the 128-bytes buffer, where the layout will be
1467
    copied
1468
Returned value:
1469
  * function does not return value
1470
Or:
1471
  * eax = 26 - function number
1472
  * ebx = 2 - subfunction number
1473
  * ecx = 9
1474
Returned value:
1475
  * eax = country identifier (1=eng, 2=fi, 3=ger, 4=rus)
1476
Remarks:
1477
  * If Alt is pressed, the layout with Alt is used;
1478
    if Alt is not pressed, but Shift is pressed,
1479
    the layout with Shift is used;
1480
    if Alt and Shift are not pressed, but Ctrl is pressed, the normal
1481
    layout is used and then from the code is subtracted 0x60;
1482
    if no control key is pressed, the normal layout is used.
1483
  * To set layout and country identifier use
1484
    subfunction 2 of function 21.
1485
  * Country identifier is global system variable, which is not used
1486
    by the kernel itself; however the application '@panel' displays
1487
    the corresponding icon (using this function).
1488
  * The application @panel switches layouts on user request.
1489
 
1490
======================================================================
1491
============== Function 26, subfunction 3 - get CD base. =============
1492
======================================================================
1493
Parameters:
1494
  * eax = 26 - function number
1495
  * ebx = 3 - subfunction number
1496
Returned value:
1497
  * eax = CD base: 1=IDE0, 2=IDE1, 3=IDE2, 4=IDE3
1498
Remarks:
1499
  * CD base is used by function 24.
1500
  * To set CD base use subfunction 3 of function 21.
1501
 
1502
======================================================================
1503
====== Function 26, subfunction 4 - get Sound Blaster base port. =====
1504
======================================================================
1505
Parameters:
1506
  * eax = 26 - function number
1507
  * ebx = 4 - subfunction number
1508
Returned value:
1509
  * eax = base port number
1510
Remarks:
1511
  * Bae port is used by functions 25, 55.
1512
  * To set base port use subfunction 4 of function 21.
1513
 
1514
======================================================================
1515
========== Function 26, subfunction 5 - get system language. =========
1516
======================================================================
1517
Parameters:
1518
  * eax = 26 - function number
1519
  * ebx = 5 - subfunction number
1520
Returned value:
1521
  * eax = system language (1=eng, 2=fi, 3=ger, 4=rus)
1522
Remarks:
1523
  * System language is global system variable and is not used
1524
    by the kernel itself, however application @panel draws the
1525
    appropriate icon (using this function).
1526
  * To set system language use subfunction 5 of function 21.
1527
 
1528
======================================================================
1529
============== Function 26, subfunction 7 - get HD base. =============
1530
======================================================================
1531
The HD base defines hard disk to write with usage of obsolete
1532
syntax /HD in obsolete function 58; at usage of modern syntax
1533
/HD0,/HD1,/HD2,/HD3 base is set automatically.
1534
Parameters:
1535
  * eax = 26 - function number
1536
  * ebx = 7 - subfunction number
1537
Returned value:
1538
  * eax = HD base: 1=IDE0, 2=IDE1, 3=IDE2, 4=IDE3
1539
Remarks:
1540
  * Any application in any time can change HD base.
1541
  * To set base use subfunction 7 of function 21.
1542
  * To get used partition of hard disk use subfunction 8.
1543
 
1544
======================================================================
1545
========= Function 26, subfunction 8 - get used HD partition. ========
1546
======================================================================
1547
The HD partition defines partition of the hard disk to write with
1548
usage of obsolete syntax /HD in obsolete function 58;
1549
at usage of functions 58 and 70 and modern syntax /HD0,/HD1,/HD2,/HD3
1550
base and partition are set automatically.
1551
Parameters:
1552
  * eax = 26 - function number
1553
  * ebx = 8 - subfunction number
1554
Returned value:
1555
  * eax = HD partition (beginning from 1)
1556
Remarks:
1557
  * Any application in any time can change partition.
1558
  * To set partition use subfunction 8 of function 21.
1559
  * To get number of partitions on a hard disk use
1560
    subfunction 11 of function 18.
1561
  * To get base of used hard disk, use subfunction 7.
1562
 
1563
======================================================================
1564
=== Function 26, subfunction 9 - get the value of the time counter. ==
1565
======================================================================
1566
Parameters:
1567
  * eax = 26 - function number
1568
  * ebx = 9 - subfunction number
1569
Returned value:
1570
  * eax = number of 1/100s of second, past from the system boot time
1571
Remarks:
1572
  * Counter takes modulo 2^32, that correspond to a little more
1573
    than 497 days.
1574
  * To get system time use function 3.
1575
 
1576
======================================================================
1577
======== Function 26, subfunction 10 - get sound DMA channel. ========
1578
======================================================================
1579
Parameters:
1580
  * eax = 26 - function number
1581
  * ebx = 10 - subfunction number
1582
Returned value:
1583
  * eax = number of the channel (from 0 to 3 inclusive)
1584
Remarks:
1585
  * Number of the DMA channel is used by subfunction 1 of function 55.
1586
  * To set the sound DMA channel use subfunction 10 of function 21.
1587
 
1588
======================================================================
1589
===================== Function 26, subfunction 11 ====================
1590
========== Find out whether low-level HD access is enabled. ==========
1591
======================================================================
1592
Parameters:
1593
  * eax = 26 - function number
1594
  * ebx = 11 - subfunction number
1595
Returned value:
1596
  * eax = 0/1 - disabled/enabled
1597
Remarks:
1598
  * Is used in LBA read (subfunction 8 of function 58).
1599
  * To set current state use subfunction 11 of function 21.
1600
 
1601
======================================================================
1602
===================== Function 26, subfunction 12 ====================
1603
========== Find out whether low-level PCI access is enabled. =========
1604
======================================================================
1605
Parameters:
1606
  * eax = 26 - function number
1607
  * ebx = 12 - subfunction number
1608
Returned value:
1609
  * eax = 0/1 - disabled/enabled
1610
Remarks:
1611
  * Is used by operations with PCI bus (function 62).
1612
  * The current implementation uses only low bit of ecx.
1613
  * To set the current state use subfunction 12 of function 21.
1614
 
1615
======================================================================
1616
=================== Function 28 - set SB16 volume. ===================
1617
======================================================================
1618
Parameters:
1619
  * eax = 28 - function number
1620
  * ebx = what to install:
1621
    * 1 - install common volume
1622
    * 2 - install CD-audio volume
1623
  * cl = volume level (0=off, 0xFF=max)
1624
Returned value:
1625
  * eax = 0 - success
1626
  * eax = 1 - SB base is not defined
1627
  * eax = 2 - incorrect subfunction
1628
Remarks:
1629
  * Previously SB base port must be defined by
1630
    subfunction 4 of function 21.
1631
  * This function gives more variants for volume, that function 25.
1632
 
1633
======================================================================
1634
=================== Function 29 - get system date. ===================
1635
======================================================================
1636
Parameters:
1637
  * eax = 29 - function number
1638
Returned value:
1639
  * eax = 0x00DDMMYY, where
1640
    (binary-decimal coding, BCD, is used)
1641
  * YY = two low digits of year (00..99)
1642
  * MM = month (01..12)
1643
  * DD = day (01..31)
1644
Remarks:
1645
  * To set system date use function 22.
1646
 
1647
======================================================================
1648
=============== Function 32 - delete file from ramdisk. ==============
1649
======================================================================
1650
Parameters:
1651
  * eax = 32 - function number
1652
  * ebx = pointer to the filename
1653
Returned value:
1654
  * eax = 0 - success; otherwise file system error code
1655
Remarks:
1656
  * This function is obsolete; function 58 allows to fulfill
1657
    the same operations with the extended possibilities.
1658
  * The current implementation returns only values 0(success) and
1659
    5(file not found).
1660
  * The filename must be either in the format 8+3 characters
1661
    (first 8 characters - name itself, last 3 - extension,
1662
    the short names and extensions are supplemented with spaces),
1663
    or in the format 8.3 characters "FILE.EXT"/"FILE.EX "
1664
    (name no more than 8 characters, dot, extension 3 characters
1665
    supplemented if necessary by spaces).
1666
    The filename must be written with capital letters. The terminating
1667
    character with code 0 is not necessary (not ASCIIZ-string).
1668
  * This function does not support folders on the ramdisk.
1669
 
1670
======================================================================
1671
================ Function 33 - write file to ramdisk. ================
1672
======================================================================
1673
Parameters:
1674
  * eax = 33 - function number
1675
  * ebx = pointer to the filename
1676
  * ecx = pointer to data for writing
1677
  * edx = number of bytes for writing
1678
  * should be set esi=0
1679
Returned value:
1680
  * eax = 0 - success, otherwise file system error code
1681
Remarks:
1682
  * This function is obsolete; function 70 allows to fulfil
1683
    the same operations with extended possibilities.
1684
  * If esi contains non-zero value and selected file already exists,
1685
    one more file with the same name will be created.
1686
  * Otherwise file will be overwritten.
1687
  * The filename must be either in the format 8+3 characters
1688
    (first 8 characters - name itself, last 3 - extension,
1689
    the short names and extensions are supplemented with spaces),
1690
    or in the format 8.3 characters "FILE.EXT"/"FILE.EX "
1691
    (name no more than 8 characters, dot, extension 3 characters
1692
    supplemented if necessary by spaces).
1693
    The filename must be written with capital letters. The terminating
1694
    character with code 0 is not necessary (not ASCIIZ-string).
1695
  * This function does not support folders on the ramdisk.
1696
 
1697
======================================================================
1698
======= Function 35 - read the color of a pixel on the screen. =======
1699
======================================================================
1700
Parameters:
1701
  * eax = 35
1702
  * ebx = y*xsize+x, where
1703
  * (x,y) = coordinates of a pixel (beginning from 0)
1704
  * xsize = horizontal screen size
1705
Returned value:
1706
  * eax = color 0x00RRGGBB
1707
Remarks:
1708
  * To get screen sizes use function 14. Pay attention,
1709
    that it subtracts 1 from both sizes.
1710
  * There is also direct access (without any system calls)
1711
    to videomemory through the selector gs. To get parameters of
1712
    the current videomode, use function 61.
1713
 
1714
======================================================================
1715
=================== Function 37 - work with mouse. ===================
1716
======================================================================
1717
 
1718
---------- Subfunction 0 - screen coordinates of the mouse -----------
1719
Parameters:
1720
  * eax = 37 - function number
1721
  * ebx = 0 - subfunction number
1722
Returned value:
1723
  * eax = x*65536 + y, (x,y)=coordinates of the mouse pointer
1724
    (beginning from 0)
1725
 
1726
-- Subfunction 1 - coordinates of the mouse relative to the window ---
1727
Parameters:
1728
  * eax = 37 - function number
1729
  * ebx = 1 - subfunction number
1730
Returned value:
1731
  * eax = x*65536 + y, (x,y)=coordinates of the mouse pointer
1732
    relative to the application window (beginning from 0)
1733
Remarks:
1734
  * The value is calculated by formula (x-xwnd)*65536 + (y-ywnd).
1735
    If y>=ywnd, the low word is non-negative and contains
1736
    relative y-coordinate, and the high word - relative x-coordinate
1737
    (with correct sign). Otherwise the low word is negative and still
1738
    contains relative y-coordinate, and to the high word
1739
    1 should be added.
1740
 
1741
------------ Subfunction 2 - pressed buttons of the mouse ------------
1742
Parameters:
1743
  * eax = 37 - function number
1744
  * ebx = 2 - subfunction number
1745
Returned value:
1746
  * eax contains information on the pressed mouse buttons:
1747
  * bit 0 is set = left button is pressed
1748
  * bit 1 is set = right button is pressed
1749
  * other bits are cleared
1750
 
1751
-------------------- Subfunction 4 - load cursor ---------------------
1752
Parameters:
1753
  * eax = 37 - function number
1754
  * ebx = 4 - subfunction number
1755
  * dx = data source:
1756
  * dx = LOAD_FROM_FILE = 0 - data in a file
1757
    * ecx = pointer to full path to the cursor file
1758
    * the file must be in the format .cur, which is standard for
1759
      MS Windows, at that of the size 32*32 pixels
1760
  * dx = LOAD_FROM_MEM = 1 - data of file are already loaded in memory
1761
    * ecx = pointer to data of the cursor file
1762
    * the data format is the same as in the previous case
1763
  * dx = LOAD_INDIRECT = 2 - data in memory
1764
    * ecx = pointer to cursor image in the format ARGB 32*32 pixels
1765
    * edx = 0xXXYY0002, where
1766
      * XX = x-coordinate of cursor hotspot
1767
      * YY = y-coordinate
1768
      * 0 <= XX, YY <= 31
1769
Returned value:
1770
  * eax = 0 - failed
1771
  * otherwise eax = cursor handle
1772
 
1773
--------------------- Subfunction 5 - set cursor ---------------------
1774
Sets new cursor for the window of the current thread.
1775
Parameters:
1776
  * eax = 37 - function number
1777
  * ebx = 5 - subfunction number
1778
  * ecx = cursor handle
1779
Returned value:
1780
  * eax = handle of previous cursor
1781
Remarks:
1782
  * If the handle is incorrect, the function restores the default
1783
    cursor (standard arrow). In particular, ecx=0 restores it.
1784
 
1785
------------------- Subfunction 6 - delete cursor --------------------
1786
Parameters:
1787
  * eax = 37 - function number
1788
  * ebx = 6 - subfunction number
1789
  * ecx = cursor handle
1790
Returned value:
1791
  * eax destroyed
1792
Remarks:
1793
  * The cursor must be loaded previously by the current thread
1794
    (with the call to subfunction 4). The function does not delete
1795
    system cursors and cursors, loaded by another applications.
1796
  * If the active cursor (set by subfunction 5) is deleted,
1797
    the system restores the default cursor (standard arrow).
1798
 
1799
======================================================================
1800
====================== Function 38 - draw line. ======================
1801
======================================================================
1802
Parameters:
1803
  * eax = 38 - function number
1804
  * ebx = [start coordinate on axis x]*65536 +
1805
              [end coordinate on axis x]
1806
  * ecx = [start coordinate on axis y]*65536 +
1807
              [end coordinate on axis y]
1808
  * edx = 0x00RRGGBB - color
1809
    edx = 0x01xxxxxx - draw inversed line
1810
          (low 24 bits are ignored)
1811
Returned value:
1812
  * function does not return value
1813
Remarks:
1814
  * Coordinates are relative to the window.
1815
  * End point is also drawn.
1816
 
1817
======================================================================
1818
== Function 39, subfunction 1 - get a size of the background image. ==
1819
======================================================================
1820
Parameters:
1821
  * eax = 39 - function number
1822
  * ebx = 1 - subfunction number
1823
Returned value:
1824
  * eax = [width]*65536 + [height]
1825
Remarks:
1826
  * There is a pair function to set sizes of background image -
1827
    subfunction 1 of function 15. After which it is necessary,
1828
    of course, anew to define image.
1829
 
1830
======================================================================
1831
== Function 39, subfunction 2 - get pixel from the background image. =
1832
======================================================================
1833
Parameters:
1834
  * eax = 39 - function number
1835
  * ebx = 2 - subfunction number
1836
  * ecx = offset
1837
Returned value:
1838
  * eax = 0x00RRGGBB - pixel color, if offset is valid
1839
    (less than 0x160000-16)
1840
  * eax = 2 otherwise
1841
Remarks:
1842
  * Do not rely on returned value for invalid offsets, it may be
1843
    changed in future kernel versions.
1844
  * Offset for pixel with coordinates (x,y)
1845
    is calculated as (x+y*xsize)*3.
1846
  * There is a pair function to set pixel on the background image -
1847
    subfunction 2 of function 15.
1848
 
1849
======================================================================
1850
== Function 39, subfunction 4 - get drawing mode for the background. =
1851
======================================================================
1852
Parameters:
1853
  * eax = 39 - function number
1854
  * ebx = 4 - subfunction number
1855
Returned value:
1856
  * eax = 1 - tile
1857
  * eax = 2 - stretch
1858
Remarks:
1859
  * There is a pair function to set drawing mode -
1860
    subfunction 4 of function 15.
1861
 
1862
======================================================================
1863
=========== Function 40 - set the mask for expected events. ==========
1864
======================================================================
1865
The mask for expected events affects function working with events
1866
10, 11, 23 - they notify only about events allowed by this mask.
1867
Parameters:
1868
  * eax = 40 - function number
1869
  * ebx = mask: bit i corresponds to event i+1 (see list of events)
1870
    (set bit permits notice on event)
1871
Returned value:
1872
  * function does not return value
1873
Remarks:
1874
  * Default mask (7=111b) enables nofices about redraw,
1875
    keys and buttons. This is enough for many applications.
1876
  * Events prohibited in the mask are saved anyway, when come;
1877
    they are simply not informed with event functions.
1878
  * Event functions take into account the mask on moment of
1879
    function call, not on moment of event arrival.
1880
 
1881
======================================================================
1882
==================== Function 41 - get IRQ owner. ====================
1883
======================================================================
1884
Parameters:
1885
  * eax = 41 - function number
1886
  * ebx = IRQ number, 0..15
1887
Returned value:
1888
  * eax = owner PID
1889
  * eax = 0, if there is no owner
1890
  * eax = -1 for incorrect ebx
1891
 
1892
======================================================================
1893
==================== Function 42 - read IRQ data. ====================
1894
======================================================================
1895
When an IRQ occurs, the system reads data from ports indicated
1896
earlier by function 44 and writes this data to
1897
internal buffer. This function reads out data from that buffer
1898
bytewise.
1899
Parameters:
1900
  * eax = 42 - function number
1901
  * ebx = IRQ number, 0..15
1902
Returned value: (use value of ecx to distinguish)
1903
  * if the thread is not IRQ owner (or IRQ number is incorrect):
1904
    * ecx = 2
1905
  * if there is no data:
1906
    * eax = 0
1907
    * ecx = 1
1908
    * ebx destroyed
1909
  * if all is ok:
1910
    * eax = byte size of data, not yet read from buffer
1911
    * ecx = 0
1912
    * ebx = current byte
1913
Remarks:
1914
  * Previously the thread must reserve indicated IRQ for itself
1915
    by function 45.
1916
  * The size of data buffer is 4000 bytes, on overflow
1917
    "fresh" data cease to be written in the buffer.
1918
 
1919
======================================================================
1920
================ Function 43 - input/output to a port. ===============
1921
======================================================================
1922
 
1923
------------------------ Output data to port -------------------------
1924
Parameters:
1925
  * eax = 43 - function number
1926
  * bl = byte for output
1927
  * ecx = port number 0xnnnn (from 0 to 0xFFFF)
1928
Returned value:
1929
  * eax = 0 - success
1930
  * eax = 1 - the thread has not reserved the selected port
1931
 
1932
------------------------ Input data from port ------------------------
1933
Parameters:
1934
  * eax = 43 - function number
1935
  * ebx is ignored
1936
  * ecx = 0x8000nnnn, where nnnn = port number (from 0 to 0xFFFF)
1937
Returned value:
1938
  * eax = 0 - success, thus ebx = entered byte
1939
  * eax = 1 - the thread has not reserved the selected port
1940
Remarks:
1941
  * Previously the thread must reserve the selected port
1942
    for itself by function 46.
1943
  * Instead of call to this function it is better to use
1944
    processor instructions in/out - this is much
1945
    faster and a bit shorter and easier.
1946
 
1947
======================================================================
1948
=========== Function 44 - define operations at IRQ arrival. ==========
1949
======================================================================
1950
At IRQ arrival the system can read the data from ports defined
1951
by this function and write these data to internal buffer, whence
1952
they can be read by функцией 42.
1953
Parameters:
1954
  * eax = 44 - function number
1955
  * ebx = pointer to the array of structures each describing one port:
1956
    * +0: word: 0 means end of array, otherwise port number
1957
    * +2: byte: reserved (ignored)
1958
    * +3: byte: 1=read byte from this port, 2=read word
1959
  * ecx = IRQ number, 0..15
1960
Returned value:
1961
  * eax = 0 - success
1962
  * eax = 1 - the thread is not owner of selected IRQ
1963
Remarks:
1964
  * Previously the thread must reserve for itself selected IRQ
1965
    by function 45.
1966
  * First 16 ports are considered only.
1967
  * The current implementation considers incorrect value of field +3
1968
    as a signal to terminate IRQ processing.
1969
 
1970
======================================================================
1971
=================== Function 45 - reserve/free IRQ. ==================
1972
======================================================================
1973
Parameters:
1974
  * eax = 45 - function number
1975
  * ebx = 0 - reserve, 1 = free
1976
  * ecx = IRQ number, 0..15
1977
Returned value:
1978
  * eax = 0 - success
1979
  * eax = 1 - error (invalid IRQ number
1980
    or attempt to reserve not free IRQ
1981
    or to free IRQ, not reserved by this thread)
1982
Remarks:
1983
  * IRQ reservation is required for functions 42 and 44.
1984
  * Only one thread can reserve the specific IRQ.
1985
  * IRQs, handled by the system itself, are reserved by the system
1986
    (thread 1) at booting.
1987
  * When a thread terminates, all reserved by it IRQs
1988
    are freed automatically.
1989
 
1990
======================================================================
1991
====== Function 46 - reserve/free a group of input/output ports. =====
1992
======================================================================
1993
To work with reserved ports an application can access directly by
1994
commands in/out (recommended way) and can use function 43
1995
(not recommended way).
1996
Parameters:
1997
  * eax = 46 - function number
1998
  * ebx = 0 - reserve, 1 - free
1999
  * ecx = start port number
2000
  * edx = end port number (inclusive)
2001
Returned value:
2002
  * eax = 0 - success
2003
  * eax = 1 - error
2004
Remarks:
2005
  * For ports reservation: an error occurs if and only if
2006
    one from the following condition satisfies:
2007
    * start port is more than end port;
2008
    * the selected range contains incorrect port number
2009
      (correct are from 0 to 0xFFFF);
2010
    * limit for the total number of reserved areas is exceeded
2011
      (maximum 255 are allowed);
2012
    * the selected range intersects with any of earlier reserved
2013
  * For ports free: an error is an attempt to free range,
2014
    that was not earlier reserved by this function
2015
    (with same ecx,edx).
2016
  * If an error occurs (for both cases) function performs no action.
2017
  * At booting the system reserves for itself ports
2018
    0..0x2d, 0x30..0x4d, 0x50..0xdf, 0xe5..0xff (inclusively).
2019
  * When a thread terminates, all reserved by it ports
2020
    are freed automatically.
2021
 
2022
======================================================================
2023
============= Function 47 - draw a number in the window. =============
2024
======================================================================
2025
Parameters:
2026
  * eax = 47 - function number
2027
  * ebx = parameters of conversion number to text:
2028
    * bl = 0 - ecx contains number
2029
    * bl = 1 - ecx contains pointer to dword-number
2030
    * bh = 0 - display in decimal number system
2031
    * bh = 1 - display in hexadecimal system
2032
    * bh = 2 - display in binary system
2033
    * биты 16-21 = how many digits to display
2034
    * биты 22-31 reserved and must be set to 0
2035
  * ecx = number (if bl=0) or pointer (if bl=1)
2036
  * edx = [coordinate on axis x]*65536 + [coordinate on axis y]
2037
  * esi = 0xX0RRGGBB:
2038
    * RR, GG, BB specify the color
2039
    * X = ABnn (bits)
2040
    * nn = font (0/1)
2041
    * A is ignored
2042
    * B=1 - fill background with the color edi
2043
Returned value:
2044
  * function does not return value
2045
Remarks:
2046
  * The given length must not exceed 60.
2047
  * The exactly given amount of digits is output. If number is small
2048
    and can be written by smaller amount of digits, it is supplemented
2049
    by leading zeroes; if the number is big and can not be written by
2050
    given amount of digits, extra digits are not drawn.
2051
  * Parameters of fonts are shown in the description of function 4
2052
    (text output).
2053
 
2054
======================================================================
2055
========= Function 48, subfunction 0 - apply screen settings. ========
2056
======================================================================
2057
Parameters:
2058
  * eax = 48 - function number
2059
  * ebx = 0 - subfunction number
2060
  * ecx = 0 - reserved
2061
Returned value:
2062
  * function does not return value
2063
Remarks:
2064
  * Function redraws the screen after parameters change by
2065
    subfunctions 1 and 2.
2066
  * Function call without prior call to one of indicated subfunctions
2067
    is ignored.
2068
  * Function call with nonzero ecx is ignored.
2069
 
2070
======================================================================
2071
=========== Function 48, subfunction 1 - set button style. ===========
2072
======================================================================
2073
Parameters:
2074
  * eax = 48 - function number
2075
  * ebx = 1 - subfunction number
2076
  * ecx = button style:
2077
    * 0 = flat
2078
    * 1 = 3d
2079
Returned value:
2080
  * function does not return value
2081
Remarks:
2082
  * After call to this function one should redraw the screen by
2083
    subfunction 0.
2084
  * Button style influences only to their draw of function 8.
2085
 
2086
======================================================================
2087
====== Function 48, subfunction 2 - set standard window colors. ======
2088
======================================================================
2089
Parameters:
2090
  * eax = 48 - function number
2091
  * ebx = 2 - subfunction number
2092
  * ecx = pointer to the color table
2093
  * edx = size of the color table
2094
    (must be 40 bytes for future compatibility)
2095
Format of the color table is shown in description of subfunction 3.
2096
Returned value:
2097
  * function does not return value
2098
Remarks:
2099
  * After call to this function one should redraw the screen by
2100
    subfunction 0.
2101
  * Table of standard colors influences only to applications,
2102
    which receive this table obviously (by subfunction 3)
2103
    and use it (specifying colors from it to drawing functions).
2104
  * Table of standard colors is included in skin and is installed
2105
    anew with skin installation (by subfunction 8).
2106
  * Color table can be viewed/changed interactively with
2107
    the application 'desktop'.
2108
 
2109
======================================================================
2110
====== Function 48, subfunction 3 - get standard window colors. ======
2111
======================================================================
2112
Parameters:
2113
  * eax = 48 - function number
2114
  * ebx = 3 - subfunction number
2115
  * ecx = pointer to the buffer with size edx bytes,
2116
    where table will be written
2117
  * edx = size of color table
2118
    (must be 40 bytes for future compatibility)
2119
Returned value:
2120
  * function does not return value
2121
Format of the color table:
2122
each item is dword-value for color 0x00RRGGBB
2123
  * +0: dword: frames - color of frame
2124
  * +4: dword: grab - color of header
2125
  * +8: dword: grab_button - color of button on header bar
2126
  * +12 = +0xC: dword: grab_button_text - color of text on button
2127
    on header bar
2128
  * +16 = +0x10: dword: grab_text - color of text on header
2129
  * +20 = +0x14: dword: work - color of working area
2130
  * +24 = +0x18: dword: work_button - color of button in working area
2131
  * +28 = +0x1C: dword: work_button_text - color of text on button
2132
    in working area
2133
  * +32 = +0x20: dword: work_text - color of text in working area
2134
  * +36 = +0x24: dword: work_graph - color of graphics in working area
2135
Remarks:
2136
  * Structure of the color table is described in the standard
2137
    include file 'macros.inc' as 'system_colors'; for example,
2138
    it is possible to write:
2139
    	sc	system_colors		; variable declaration
2140
    	...				; somewhere one must call
2141
    					; this function with ecx=sc
2142
    	mov	ecx, [sc.work_button_text]	; read text color on
2143
    					; buttin in working area
2144
  * A program itself desides to use or not to use color table.
2145
    For usage program must simply at calls to drawing functions select
2146
    color taken from the table.
2147
  * At change of the table of standard colors (by subfunction 2 with
2148
    the subsequent application of changes by subfunction 0 or
2149
    at skin set by subfunction 8) the system sends to all windows
2150
    redraw message (the event with code 1).
2151
  * Color table can be viewed/changed interactively with
2152
    the application 'desktop'.
2153
 
2154
======================================================================
2155
============ Function 48, subfunction 4 - get skin height. ===========
2156
======================================================================
2157
Parameters:
2158
  * eax = 48 - function number
2159
  * ebx = 4 - subfunction number
2160
Returned value:
2161
  * eax = skin height
2162
Remarks:
2163
  * Skin height is defined as the height of a header
2164
    of skinned windows.
2165
  * See also general structure of window in the description
2166
    of function 0.
2167
 
2168
======================================================================
2169
======== Function 48, subfunction 5 - get screen working area. =======
2170
======================================================================
2171
Parameters:
2172
  * eax = 48 - function number
2173
  * ebx = 5 - subfunction number
2174
Returned value:
2175
  * eax = [left]*65536 + [right]
2176
  * ebx = [top]*65536 + [bottom]
2177
Remarks:
2178
  * The screen working area defines position and coordinates of
2179
    a maximized window.
2180
  * The screen working area in view of normal work is all screen
2181
    without system panel (the application '@panel').
2182
  * (left,top) are coordinates of the left upper corner,
2183
    (right,bottom) are coordinates of the right lower one.
2184
    Thus the size of working area on x axis can be calculated by
2185
    formula right-left+1, on y axis - by formula bottom-right+1.
2186
  * See also function 14,
2187
    to get sizes of all screen.
2188
  * There is a pair function to set working area - subfunction 6.
2189
 
2190
======================================================================
2191
======== Function 48, subfunction 6 - set screen working area. =======
2192
======================================================================
2193
Parameters:
2194
  * eax = 48 - function number
2195
  * ebx = 6 - subfunction number
2196
  * ecx = [left]*65536 + [right]
2197
  * edx = [top]*65536 + [bottom]
2198
Returned value:
2199
  * function does not return value
2200
Remarks:
2201
  * The screen working area defines position and coordinates of
2202
    a maximized window.
2203
  * This function is used only by the application '@panel',
2204
    which set working area to all screen without system panel.
2205
  * (left,top) are coordinates of the left upper corner,
2206
    (right,bottom) are coordinates of the right lower one.
2207
    Thus the size of working area on x axis can be calculated by
2208
    formula right-left+1, on y axis - by formula bottom-right+1.
2209
  * If 'left'>='right', x-coordinate of working area is not changed.
2210
    If 'left'<0, 'left' will not be set. If 'right' is greater than or
2211
    equal to screen width, 'right' will not be set.
2212
    Similarly on y axis.
2213
  * See also function 14,
2214
    to get sizes of all screen.
2215
  * There is a pair function to get working area - subfunction 5.
2216
  * This function redraws the screen automatically,
2217
    updating coordinates and sizes of maximized windows.
2218
    The system sends to all windows redraw message (the event 1).
2219
 
2220
======================================================================
2221
=========== Function 48, subfunction 7 - get skin margins. ===========
2222
======================================================================
2223
Returns the area of a header of a skinned window, intended for
2224
a text of a header.
2225
Parameters:
2226
  * eax = 48 - function number
2227
  * ebx = 7 - subfunction number
2228
Returned value:
2229
  * eax = [left]*65536 + [right]
2230
  * ebx = [top]*65536 + [bottom]
2231
Remarks:
2232
  * An application decides itself to use or not to use this function.
2233
  * It is recommended to take into account returned value
2234
    of this function for choice of a place for drawing header text
2235
    (by function 4) or a substitute of header text
2236
    (at the discretion of an application).
2237
 
2238
======================================================================
2239
============= Function 48, subfunction 8 - set used skin. ============
2240
======================================================================
2241
Parameters:
2242
  * eax = 48 - function number
2243
  * ebx = 8 - subfunction number
2244
  * ecx = pointer to a block for function 58, in
2245
    which the fields of intermediate buffer and file name are filled
2246
Returned value:
2247
  * eax = 0 - success
2248
  * otherwise eax = file system error code; if file does not
2249
    contain valid skin, function returns error 3
2250
    (unknown file system).
2251
Remarks:
2252
  * After successful skin loading the system sends to all windows
2253
    redraw message (the event 1).
2254
  * At booting the system reads skin from file 'default.skn'
2255
    on ramdisk.
2256
  * User can change the skin statically by creating hisself
2257
    'default.skn' or dynamically with the application 'desktop'.
2258
 
2259
======================================================================
2260
=========== Function 49 - Advanced Power Management (APM). ===========
2261
======================================================================
2262
Parameters:
2263
  * eax = 49 - function number
2264
  * dx = number of the APM function
2265
    (analogue of ax in APM specification)
2266
  * bx, cx = parameters of the APM function
2267
Returned value:
2268
  * 16-bit registers ax, bx, cx, dx, si, di and carry flag CF
2269
    are set according to the APM specification
2270
  * high halves of 32-bit registers eax, ebx, ecx,
2271
    edx, esi, edi are destroyed
2272
Remarks:
2273
  * APM 1.2 specification is described in the document
2274
    "Advanced Power Management (APM) BIOS Specification"
2275
    (Revision 1.2), available at
2276
    http://www.microsoft.com/whdc/archive/amp_12.mspx;
2277
    besides it is included in famous Interrupt List by Ralf Brown
2278
    (http://www.pobox.com/~ralf/files.html,
2279
    ftp://ftp.cs.cmu.edu/afs/cs/user/ralf/pub/).
2280
 
2281
======================================================================
2282
=================== Function 50 - set window shape. ==================
2283
======================================================================
2284
Normal windows have rectangular shape. This function can give to
2285
a window any shape. The shape is given by a set of points inside
2286
the base rectangle belonging to a window. Position and coordinates
2287
of the base rectangle are set by function 0
2288
and changed by function 67.
2289
 
2290
--------------------------- Set shape data ---------------------------
2291
Parameters:
2292
  * eax = 50 - function number
2293
  * ebx = 0 - subfunction number
2294
  * ecx = pointer to shape data (array of bytes 0/1)
2295
Returned value:
2296
  * function does not return value
2297
 
2298
-------------------------- Set shape scale ---------------------------
2299
Parameters:
2300
  * eax = 50 - function number
2301
  * ebx = 1 - subfunction number
2302
  * ecx sets a scale: each byte of data defines
2303
    (2^scale)*(2^scale) pixels
2304
Returned value:
2305
  * function does not return value
2306
Remarks:
2307
  * Default scale is 0 (scale factor is 1). If in the shape data
2308
    one byte corresponds to one pixel, there is no necessity
2309
    to set scale.
2310
  * Let's designate xsize = window width (in pixels), ysize = height;
2311
    pay attention, that they are one pixel more than defined by
2312
    functions 0, 67.
2313
  * On definition of scale xsize and ysize must be divisible
2314
    on 2^scale.
2315
  * Byte of data on offset 'a' must be 0/1 and defines belonging
2316
    to a window of square with the side 2^scale (if scale=0,
2317
    this is one pixel) and coordinates of the left upper corner
2318
    (a mod (xsize shr scale), a div (xsize shr scale))
2319
  * Data size: (xsize shr scale)*(ysize shr scale).
2320
  * Data must be presented in the memory and not change
2321
    after set of shape.
2322
  * The system views the shape data at every window redraw by
2323
    function 0.
2324
  * The call of subfunction 0 with NULL pointer results in return
2325
    to the rectangular shape.
2326
 
2327
======================================================================
2328
==================== Function 51 - create thread. ====================
2329
======================================================================
2330
Parameters:
2331
  * eax = 51 - function number
2332
  * ebx = 1 - unique subfunction
2333
  * ecx = address of thread entry point (starting eip)
2334
  * edx = pointer to thread stack (starting esp)
2335
Returned value:
2336
  * eax = -1 - error (there is too many threads)
2337
  * otherwise eax = TID - thread identifier
2338
    
2339
 
2340
======================================================================
2341
=== Function 52, subfunction 0 - get network driver configuration. ===
2342
======================================================================
2343
Parameters:
2344
  * eax = 52 - function number
2345
  * ebx = 0 - subfunction number
2346
Returned value:
2347
  * eax = configuration dword
2348
Remarks:
2349
  * Configuration dword can be set by subfunction 2.
2350
  * The kernel does not use this variable. The value of this
2351
    variable and working with it subfunctions 0 and 2 is represented
2352
    doubtful.
2353
 
2354
======================================================================
2355
========= Function 52, subfunction 1 - get local IP-address. =========
2356
======================================================================
2357
Parameters:
2358
  * eax = 52 - function number
2359
  * ebx = 1 - subfunction number
2360
Returned value:
2361
  * eax = IP-address (4 bytes)
2362
Remarks:
2363
  * Local IP-address is set by subfunction 3.
2364
 
2365
======================================================================
2366
=== Function 52, subfunction 2 - set network driver configuration. ===
2367
======================================================================
2368
Parameters:
2369
  * eax = 52 - function number
2370
  * ebx = 2 - subfunction number
2371
  * ecx = configuration dword; if low 7 bits derivate the number 3,
2372
    function [re-]initializes Ethernet-card, otherwise
2373
    Ethernet turns off
2374
Returned value:
2375
  * if Ethernet-interface is not requested, function returns eax=2,
2376
    but this can be changed in future kernel versions
2377
  * if Ethernet-interface is requested, eax=0 means error
2378
    (absence of Ethernet-card), and nonzero value - success
2379
Remarks:
2380
  * Configuration dword can be read by subfunction 0.
2381
  * The kernel does not use this variable. The value of this
2382
    variable, subfunction 0 and part of subfunction 2, which set it,
2383
    is represented doubtful.
2384
 
2385
======================================================================
2386
========= Function 52, subfunction 3 - set local IP-address. =========
2387
======================================================================
2388
Parameters:
2389
  * eax = 52 - function number
2390
  * ebx = 3 - subfunction number
2391
  * ecx = IP-address (4 bytes)
2392
Returned value:
2393
  * the current implementation returns eax=3, but this can be changed
2394
    in future versions
2395
Remarks:
2396
  * Local IP-address can be get by subfunction 1.
2397
 
2398
======================================================================
2399
= Function 52, subfunction 6 - add data to the stack of input queue. =
2400
======================================================================
2401
Parameters:
2402
  * eax = 52 - function number
2403
  * ebx = 6 - subfunction number
2404
  * edx = data size
2405
  * esi = data pointer
2406
Returned value:
2407
  * eax = -1 - error
2408
  * eax = 0 - success
2409
Remarks:
2410
  * This function is intended only for slow network drivers
2411
    (PPP, SLIP).
2412
  * Data size must not exceed 1500 bytes, though function
2413
    performs no checks on correctness.
2414
 
2415
======================================================================
2416
 Function 52, subfunction 8 - read data from the network output queue.
2417
======================================================================
2418
Parameters:
2419
  * eax = 52 - function number
2420
  * ebx = 8 - subfunction number
2421
  * esi = pointer to 1500-byte buffer
2422
Returned value:
2423
  * eax = number of read bytes (in the current implementation
2424
    either 0 = no data or 1500)
2425
  * data was copied in buffer
2426
Remarks:
2427
  * This function is intended only for slow network drivers
2428
    (PPP, SLIP).
2429
 
2430
======================================================================
2431
============ Function 52, subfunction 9 - get gateway IP. ============
2432
======================================================================
2433
Parameters:
2434
  * eax = 52 - function number
2435
  * ebx = 9 - subfunction number
2436
Returned value:
2437
  * eax = gateway IP (4 bytes)
2438
 
2439
======================================================================
2440
=========== Function 52, subfunction 10 - get subnet mask. ===========
2441
======================================================================
2442
Parameters:
2443
  * eax = 52 - function number
2444
  * ebx = 10 - subfunction number
2445
Returned value:
2446
  * eax = subnet mask
2447
 
2448
======================================================================
2449
============ Function 52, subfunction 11 - set gateway IP. ===========
2450
======================================================================
2451
Parameters:
2452
  * eax = 52 - function number
2453
  * ebx = 11 - subfunction number
2454
  * ecx = gateway IP (4 bytes)
2455
Returned value:
2456
  * the current implementation returns eax=11, but this can be changed
2457
    in future versions
2458
 
2459
======================================================================
2460
=========== Function 52, subfunction 12 - set subnet mask. ===========
2461
======================================================================
2462
Parameters:
2463
  * eax = 52 - function number
2464
  * ebx = 12 - subfunction number
2465
  * ecx = subnet mask
2466
Returned value:
2467
  * the current implementation returns eax=12, but this can be changed
2468
    in future versions
2469
 
2470
======================================================================
2471
============== Function 52, subfunction 13 - get DNS IP. =============
2472
======================================================================
2473
Parameters:
2474
  * eax = 52 - function number
2475
  * ebx = 13 - subfunction number
2476
Returned value:
2477
  * eax = DNS IP (4 bytes)
2478
 
2479
======================================================================
2480
============== Function 52, subfunction 14 - set DNS IP. =============
2481
======================================================================
2482
Parameters:
2483
  * eax = 52 - function number
2484
  * ebx = 14 - subfunction number
2485
  * ecx = DNS IP (4 bytes)
2486
Returned value:
2487
  * the current implementation returns eax=14, but this can be changed
2488
    in future versions
2489
 
2490
======================================================================
2491
======== Function 52, subfunction 15 - get local MAC address. ========
2492
======================================================================
2493
Parameters:
2494
  * eax = 52 - function number
2495
  * ebx = 15 - subfunction number
2496
  * ecx = 0 - read first 4 bytes,
2497
    ecx = 4 - read last 2 bytes
2498
Returned value:
2499
  * for ecx=0: eax = first 4 bytes of MAC address
2500
  * for ecx=4: ax = last 2 bytes of MAC address,
2501
               high half of eax is destroyed
2502
  * for other ecx: eax = -1 indicates an error
2503
 
2504
======================================================================
2505
============ Function 53, subfunction 0 - open UDP-socket. ===========
2506
======================================================================
2507
Parameters:
2508
  * eax = 53 - function number
2509
  * ebx = 0 - subfunction number
2510
  * ecx = local port (only low word is taken into account)
2511
  * edx = remote port (only low word is taken into account)
2512
  * esi = remote IP
2513
Returned value:
2514
  * eax = -1 = 0xFFFFFFFF - error; ebx destroyed
2515
  * eax = socket handle (some number which unambiguously identifies
2516
    socket and have sense only for the system) - success;
2517
    ebx destroyed
2518
 
2519
======================================================================
2520
=========== Function 53, subfunction 1 - close UDP-socket. ===========
2521
======================================================================
2522
Parameters:
2523
  * eax = 53 - function number
2524
  * ebx = 1 - subfunction number
2525
  * ecx = socket handle
2526
Returned value:
2527
  * eax = -1 - incorrect handle
2528
  * eax = 0 - success
2529
  * ebx destroyed
2530
Remarks:
2531
  * The current implementation does not close automatically all
2532
    sockets of a thread at termination. In particular, one should not
2533
    kill a thread with many opened sockets - there will be an outflow
2534
    of resources.
2535
  * The current implementation does no checks on correctness
2536
    (function returns error only if thread tries to close not opened
2537
    socket with correct handle).
2538
 
2539
======================================================================
2540
============== Function 53, subfunction 2 - poll socket. =============
2541
======================================================================
2542
Parameters:
2543
  * eax = 53 - function number
2544
  * ebx = 2 - subfunction number
2545
  * ecx = socket handle
2546
Returned value:
2547
  * eax = number of read bytes
2548
  * ebx destroyed
2549
Remarks:
2550
  * There is no checks for correctness.
2551
 
2552
======================================================================
2553
========= Function 53, subfunction 3 - read byte from socket. ========
2554
======================================================================
2555
Parameters:
2556
  * eax = 53 - function number
2557
  * ebx = 3 - subfunction number
2558
  * ecx = socket handle
2559
Returned value:
2560
  * if there is no read data: eax=0, bl=0,
2561
    other bytes of ebx are destroyed
2562
  * if there are read data: eax=number of rest bytes
2563
    (possibly 0), bl=read byte, other bytes of ebx are destroyed
2564
Remarks:
2565
  * There is no checks for correctness.
2566
 
2567
======================================================================
2568
========== Function 53, subfunction 4 - write to UDP-socket. =========
2569
======================================================================
2570
Parameters:
2571
  * eax = 53 - function number
2572
  * ebx = 4 - subfunction number
2573
  * ecx = socket handle
2574
  * edx = number of bytes to write
2575
  * esi = pointer to data to write
2576
Returned value:
2577
  * eax = 0xffffffff - invalid handle
2578
  * eax = 0xffff - not enough memory
2579
  * eax = 0 - success
2580
  * ebx destroyed
2581
Remarks:
2582
  * Check on validity of handle is minimal - only not very incorrect
2583
    not opened handles are eliminated.
2584
  * Number of bytes to write must not exceed 1500-28, though
2585
    the appropriate check is not made.
2586
 
2587
======================================================================
2588
============ Function 53, subfunction 5 - open TCP-socket. ===========
2589
======================================================================
2590
Parameters:
2591
  * eax = 53 - function number
2592
  * ebx = 5 - subfunction number
2593
  * ecx = local port (only low word is taken into account)
2594
  * edx = remote port (only low word is taken into account)
2595
  * esi = remote IP
2596
  * edi = open mode: SOCKET_PASSIVE=0 or SOCKET_ACTIVE=1
2597
Returned value:
2598
  * eax = -1 = 0xFFFFFFFF - error; ebx destroys
2599
  * eax = socket handle (some number which unambiguously identifies
2600
    socket and have sense only for the system) - success;
2601
    ebx destroyed
2602
 
2603
======================================================================
2604
========= Function 53, subfunction 6 - get TCP-socket status. ========
2605
======================================================================
2606
Parameters:
2607
  * eax = 53 - function number
2608
  * ebx = 6 - subfunction number
2609
  * ecx = socket handle
2610
Returned value:
2611
  * eax = socket status: one of
2612
  * TCB_LISTEN = 1
2613
  * TCB_SYN_SENT = 2
2614
  * TCB_SYN_RECEIVED = 3
2615
  * TCB_ESTABLISHED = 4
2616
  * TCB_FIN_WAIT_1 = 5
2617
  * TCB_FIN_WAIT_2 = 6
2618
  * TCB_CLOSE_WAIT = 7
2619
  * TCB_CLOSING = 8
2620
  * TCB_LAST_ASK = 9
2621
  * TCB_TIME_WAIT = 10
2622
  * TCB_CLOSED = 11
2623
  * ebx destroys
2624
Remarks:
2625
  * There is no checks for correctness.
2626
 
2627
======================================================================
2628
========== Function 53, subfunction 7 - write to TCP-socket. =========
2629
======================================================================
2630
Parameters:
2631
  * eax = 53 - function number
2632
  * ebx = 7 - subfunction number
2633
  * ecx = socket handle
2634
  * edx = number of bytes to write
2635
  * esi = pointer to data to write
2636
Returned value:
2637
  * eax = 0xffffffff - error
2638
  * eax = 0xffff - not enough memory
2639
  * eax = 0 - success
2640
  * ebx destroyed
2641
Remarks:
2642
  * Check on validity of handle is minimal - only not very incorrect
2643
    not opened handles are eliminated.
2644
  * Number of bytes to write must not exceed 1500-40, though
2645
    the appropriate check is not made.
2646
 
2647
======================================================================
2648
=========== Function 53, subfunction 8 - close TCP-socket. ===========
2649
======================================================================
2650
Parameters:
2651
  * eax = 53 - function number
2652
  * ebx = 8 - subfunction number
2653
  * ecx = socket handle
2654
Returned value:
2655
  * eax = -1 - invalid handle
2656
  * eax = 0xffff - not enough memory for socket close packet
2657
  * eax = 0 - success
2658
  * in many cases eax is destroyed (the result of function 'queue'
2659
    is returned) - probably this is bug, which will be corrected
2660
  * ebx destroyed
2661
Remarks:
2662
  * The current implementation does not close automatically all
2663
    sockets of a thread at termination. In particular, one should not
2664
    kill a thread with many opened sockets - there will be an outflow
2665
    of resources.
2666
  * The current implementation does no checks on correctness
2667
    (function returns error only if thread tries to close not opened
2668
    socket with correct handle).
2669
 
2670
======================================================================
2671
=== Function 53, subfunction 9 - check whether local port is free. ===
2672
======================================================================
2673
Parameters:
2674
  * eax = 53 - function number
2675
  * ebx = 9 - subfunction number
2676
  * ecx = local port number (low 16 bits are used only)
2677
Returned value:
2678
  * eax = 0 - port is used
2679
  * eax = 1 - port is free
2680
  * ebx destroyed
2681
 
2682
======================================================================
2683
===== Function 53, subfunction 10 - query Ethernet cable status. =====
2684
======================================================================
2685
Parameters:
2686
  * eax = 53 - function number
2687
  * ebx = 10 - subfunction number
2688
Returned value:
2689
  * al = -1 - a network driver is not loaded or
2690
              does not support this function
2691
  * al = 0 - Ethernet cable is unplugged
2692
  * al = 1 - Ethernet cable is plugged
2693
  * ebx destroyed
2694
Remarks:
2695
  * The current kernel implementation supports this function
2696
    only for RTL8139 network cards.
2697
 
2698
======================================================================
2699
======= Function 53, subfunction 11 - read network stack data. =======
2700
======================================================================
2701
Paramters:
2702
  * eax = 53 - function number
2703
  * ebx = 11 - subfunction number
2704
  * ecx = socket handle
2705
  * edx = pointer to buffer
2706
  * esi = number of bytes to read;
2707
  * esi = 0 - read all data (maximum 4096 bytes)
2708
Returned value:
2709
  * eax = number of bytes read
2710
  * ebx destroyed
2711
Remakrs:
2712
  * There is no check on handle correctness.
2713
 
2714
======================================================================
2715
= Function 53, subfunction 255 - debug information of network driver.
2716
======================================================================
2717
Parameters:
2718
  * eax = 53 - function number
2719
  * ebx = 255 - subfunction number
2720
  * ecx = type of requested information (see below)
2721
Returned value:
2722
  * eax = requested information
2723
  * ebx destroyed
2724
Possible values for ecx:
2725
  * 100: length of queue 0 (empty queue)
2726
  * 101: length of queue 1 (ip-out queue)
2727
  * 102: length of queue 2 (ip-in queue)
2728
  * 103: length of queue 3 (net1out queue)
2729
  * 200: number of items in the ARP table
2730
  * 201: size of the ARP table (in items) (20 for current version)
2731
  * 202: read item at edx of the ARP table to the temporary buffer,
2732
    whence 5 following types take information;
2733
    in this case eax is not defined
2734
  * 203: IP-address saved by type 202
2735
  * 204: high dword of MAC-address saved by type 202
2736
  * 205: low word of MAC-address saved by type 202
2737
  * 206: status word saved by type 202
2738
  * 207: ttl word saved by type 202
2739
  * 2: total number of received IP-packets
2740
  * 3: total number of transferred IP-packets
2741
  * 4: total number of dumped received packets
2742
  * 5: total number of received ARP-packets
2743
  * 6: status of packet driver, 0=inactive, nonzero=active
2744
 
2745
======================================================================
2746
========== Function 55, subfunction 0 - load data for SB16. ==========
2747
======================================================================
2748
Parameters:
2749
  * eax = 55 - function number
2750
  * ebx = 0 - subfunction number
2751
  * ecx = pointer to data (is copied 64 kilobytes, is used as much as
2752
    set by subfunction 2)
2753
Returned value:
2754
  * function does not return value
2755
Remarks:
2756
  * Format and size of data are set by subfunction 2.
2757
 
2758
======================================================================
2759
======== Function 55, subfunction 1 - begin play data on SB16. =======
2760
======================================================================
2761
Parameters:
2762
  * eax = 55 - function number
2763
  * ebx = 1 - subfunction number
2764
Returned value:
2765
  * function does not return value
2766
Remarks:
2767
  * Previously data must be loaded by subfunction 0 and
2768
    their format must be defined by subfunction 2.
2769
  * Function returns control, when playing of data began; after that
2770
    play goes independently from application (and does not use
2771
    processor time at all).
2772
  * Previously must be defined SB16 base port
2773
    (by subfunction 4 of function 21) and DMA channel
2774
    (by subfunction 10 of function 21).
2775
 
2776
======================================================================
2777
======== Function 55, subfunction 2 - set format of SB16 data. =======
2778
======================================================================
2779
Parameters:
2780
  * eax = 55 - function number
2781
  * ebx = 2 - subfunction number
2782
  * ecx = 0 - set digit capacity
2783
    * edx = 1 - 8bit mono
2784
    * edx = 2 - 8bit stereo
2785
  * ecx = 1 - set data size
2786
    * edx = size in bytes
2787
  * ecx = 2 - set play frequency
2788
    * edx = frequency
2789
Returned value:
2790
  * function does not return value
2791
Remarks:
2792
  * When the system boots, it sets following default parameters:
2793
    digit capacity - 8bit mono, size - 64 Kb, frequency - 44100 Hz.
2794
    Nevertheless it is recommended to set necessary values obviously
2795
    as they could be reset by some application.
2796
 
2797
======================================================================
2798
 Function 55, subfunction 55 - begin to play data on built-in speaker.
2799
======================================================================
2800
Parameters:
2801
  * eax = 55 - function number
2802
  * ebx = 55 - subfunction number
2803
  * esi = pointer to data
2804
Returned value:
2805
  * eax = 0 - success
2806
  * eax = 55 - error (speaker is off or busy)
2807
Data is an array of items with variable length.
2808
Format of each item is defined by first byte:
2809
  * 0 = end of data
2810
  * 1..0x80 = sets sound duration on 1/100 of second; sound note
2811
    is defined by immediate value of frequency
2812
    * following word (2 bytes) contains frequency divider;
2813
      frequency is defined as 1193180/divider
2814
  * 0x81 = invalid
2815
  * 0x82..0xFF = note is defined by octave and number:
2816
    * duration in 1/100 of second = (first byte)-0x81
2817
    * there is one more byte;
2818
    * (second byte)=0xFF - delay
2819
    * otherwise it looks like a*0x10+b, where b=number of the note in
2820
      an octave from 1 to 12, a=number of octave (beginning from 0)
2821
Remarks:
2822
  * Speaker play can be disabled/enabled by
2823
    subfunction 8 of function 18.
2824
  * Function returns control, having informed the system
2825
    an information on request. Play itself goes independently from
2826
    the program.
2827
  * The data must be kept in the memory at least up to the end
2828
    of play.
2829
 
2830
======================================================================
2831
================ Function 58 - work with file system. ================
2832
======================================================================
2833
Parameters:
2834
  * eax = 58
2835
  * ebx = pointer to the information structure
2836
Returned value:
2837
  * eax = 0 - success; otherwise file system error code
2838
  * some subfunctions return value in other registers too
2839
General format of the information structure:
2840
  * +0: dword: subfunction number
2841
  * +4: dword: number of block
2842
  * +8: dword: size
2843
  * +12 = +0xC: dword: pointer to data
2844
  * +16 = +0x10: dword: pointer to a memory for system operations
2845
    (4096 bytes)
2846
  * +20 = +0x14: n db: ASCIIZ-string with the file name
2847
Specifications - in documentation on the appropriate subfunction.
2848
Filename is case-insensitive for latin letters, russian letters
2849
must be capital.
2850
Format of filename:
2851
/base/number/dir1/dir2/.../dirn/file,
2852
where /base/number identifies device, on which file is located:
2853
one of
2854
  * /RD/1 = /RAMDISK/1 to access ramdisk
2855
  * /FD/1 = /FLOPPYDISK/1 to access first floppy drive,
2856
    /FD/2 = /FLOPPYDISK/2 to access second one
2857
  * /HD/x = /HARDDISK/x - obsolete variant of access to hard disk
2858
    (in this case base is defined by subfunction 7 of function 21),
2859
    x - partition number (beginning from 1)
2860
  * /HD0/x, /HD1/x, /HD2/x, /HD3/x to access accordingly to devices
2861
    IDE0 (Primary Master), IDE1 (Primary Slave),
2862
    IDE2 (Secondary Master), IDE3 (Secondary Slave);
2863
    x - partition number on the selected hard drive, varies from 1
2864
    to 255 (on each hard drive the indexing starts from 1)
2865
Remarks:
2866
  * In the first two cases it is also possible to use FIRST
2867
    instead of 1, SECOND instead of 2, but it is not recommended
2868
    for convenience of transition to the future extensions.
2869
  * Limitation n<=39 is imposed.
2870
  * Names of folders and file dir1,...,dirn,file must have the
2871
    format 8.3: name no more than 8 characters, dot, extension no
2872
    more than 3 characters. Trailing spaces are ignored, no other
2873
    spaces is allowed. If name occupies equally 8 characters,
2874
    dot may be omitted (though it is not recommended to use this
2875
    feature for convenience of transition to the future extensions).
2876
  * This function does not support folders on ramdisk.
2877
Examples:
2878
  * '/RAMDISK/FIRST/KERNEL.ASM',0
2879
    '/rd/1/kernel.asm',0
2880
  * '/HD0/1/kernel.asm',0
2881
  * '/hd0/1/menuet/pics/tanzania.bmp',0
2882
Existing subfunctions:
2883
  * subfunction 0 - read file/folder
2884
  * subfunction 1 - rewrite file
2885
  * subfunction 8 - LBA-read from device
2886
  * subfunction 15 - get file system information
2887
 
2888
======================================================================
2889
=========== Function 58, subfunction 0 - read file/folder. ===========
2890
======================================================================
2891
Parameters:
2892
  * eax = 58
2893
  * ebx = pointer to the information structure
2894
Format of the information structure:
2895
  * +0: dword: 0 = subfunction number
2896
  * +4: dword: first block to read (beginning from 0)
2897
  * +8: dword: amount of blocks to read
2898
  * +12 = +0xC: dword: pointer to buffer for data
2899
  * +16 = +0x10: dword: pointer to buffer for system operations
2900
    (4096 bytes)
2901
  * +20 = +0x14: ASCIIZ-name of file, the rules of names forming are
2902
    given in the general description
2903
Returned value:
2904
  * eax = 0 - success, otherwise file system error code
2905
  * ebx = file size (in bytes) or -1=0xffffffff, if file was not found
2906
Remarks:
2907
  * Block size is 512 bytes.
2908
  * This function is obsolete, for reading files use subfunction 0
2909
    of function 70, for reading folders - subfunction 1 of
2910
    function 70.
2911
  * Function can read contents of a folder. Only FAT file system is
2912
    supported. The format of FAT-folder is described
2913
    in any FAT documentation.
2914
  * Size of a folder is determined by size of FAT clusters chain.
2915
  * If file was ended before last requested block was read,
2916
    the function will read as many as it can, and after that return
2917
    eax=6 (EOF).
2918
  * Function can read root folders /rd/1,/fd/x,/hd[n]/x, but
2919
    in the first two cases the current implementation does not follow
2920
    to the declared rules:
2921
    for /rd/1:
2922
    * if one want to read 0 blocks, function considers,
2923
      that he requested 1;
2924
    * if one requests more than 14 blocks or starting block is
2925
      not less than 14, function returns eax=5 (not found) и ebx=-1;
2926
    * size of ramdisk root folder is 14 blocks,
2927
      0x1C00=7168 байт; but function returns ebx=0
2928
      (except of the case of previous item);
2929
    * strangely enough, it is possible to read 14th block (which
2930
      generally contains a garbage - I remind, the indexing begins
2931
      from 0);
2932
    * if some block with the number not less than 14 was requested,
2933
      function returns eax=6(EOF); otherwise eax=0.
2934
    For /fd/x:
2935
    * if the start block is not less than 14, function returns
2936
      eax=5 (not found) and ebx=0;
2937
    * note that format of FAT12 allows floppies with the root size
2938
      more or less than 14 blocks;
2939
    * check for length is not performed;
2940
    * if data was successful read, function returns
2941
      eax=0,ebx=0; otherwise eax=10 (access denied), ebx=-1.
2942
  * The function handles reading of special folders /,/rd,/fd,/hd[n];
2943
    but the result does not correspond to expected (on operations with
2944
    normal files/folders), does not follow the declared rules,
2945
    may be changed in future versions of the kernel and consequently
2946
    is not described. To obtain the information about the equipment
2947
    use subfunction 11 of function 18 or
2948
    read corresponding folder with subfunction 1 of function 70.
2949
 
2950
======================================================================
2951
============= Function 58, subfunction 1 - rewrite file. =============
2952
======================================================================
2953
If the file does not exist, it is created.
2954
If the file exists, it is rewritten.
2955
Parameters:
2956
  * eax = 58 - function number
2957
  * ebx = pointer to the information structure
2958
Format of the information structure:
2959
  * +0: dword: 1 = subfunction number
2960
  * +4: dword: ignored (set to 0)
2961
  * +8: dword: number of bytes to write
2962
  * +12 = +0xC: dword: pointer to data to write
2963
  * +16 = +0x10: dword: pointer to buffer for system operations
2964
    (4096 bytes)
2965
  * +20 = +0x14: ASCIIZ-name of file, the rules of names forming are
2966
    given in the general description
2967
Returned value:
2968
  * eax = 0 - success, otherwise file system error code
2969
  * ebx destroyed
2970
Remarks:
2971
  * This function is obsolete, use subfunction 2 of function 70.
2972
 
2973
======================================================================
2974
========= Function 58, subfunction 8 - LBA-read from device. =========
2975
======================================================================
2976
Parameters:
2977
  * eax = 58 - function number
2978
  * ebx = pointer to the information structure
2979
Format of the information structure:
2980
  * +0: dword: 8 = subfunction number
2981
  * +4: dword: number of block to read (beginning from 0)
2982
  * +8: dword: ignored (set to 1)
2983
  * +12 = +0xC: dword: pointer to buffer for data (512 bytes)
2984
  * +16 = +0x10: dword: pointer to buffer for system operations
2985
    (4096 bytes)
2986
  * +20 = +0x14: ASCIIZ-name of device: case-insensitive, one of
2987
    /rd/1 = /RamDisk/1, /hd/n = /HardDisk/n,
2988
    1<=n<=4 - number of device: 1=IDE0, ..., 4=IDE3.
2989
    Instead of digits it is allowed, though not recommended for
2990
    convenience of transition to future extensions, to use
2991
    'first','second','third','fourth'.
2992
Returned value:
2993
  * for device name /hd/xxx, where xxx is not in the list above:
2994
    * eax = ebx = 1
2995
  * for invalid device name (except for the previous case):
2996
    * eax = 5
2997
    * ebx does not change
2998
  * if LBA-access is disabled by subfunction 11 of function 21:
2999
    * eax = 2
3000
    * ebx destroyed
3001
  * for ramdisk: attempt to read block outside ramdisk
3002
    (18*2*80 blocks) results in
3003
    * eax = 3
3004
    * ebx = 0
3005
  * for successful read:
3006
    * eax = ebx = 0
3007
Remarks:
3008
  * Block size is 512 bytes; function reads one block.
3009
  * Do not depend on returned value, it can be changed
3010
    in future versions.
3011
  * Function requires that LBA-access to devices is enabled by
3012
    subfunction 11 of function 21. To check this one can use
3013
    subfunction 11 of function 26.
3014
  * LBA-read of floppy is not supported.
3015
  * Function reads data on physical hard drive; if for any reason
3016
    data of the concrete partition are required, application must
3017
    define starting sector of this partition (either directly
3018
    through MBR, or from the full structure returned by
3019
    подфункцией 11 функции 18).
3020
  * Function does not check error code of hard disk, so request of
3021
    nonexisting sector reads something (most probably it will be
3022
    zeroes, but this is defined by device) and this is considered
3023
    as success (eax=0).
3024
 
3025
======================================================================
3026
==== Function 58, subfunction 15 - get information on file system. ===
3027
======================================================================
3028
Parameters:
3029
  * eax = 58 - function number
3030
  * ebx = pointer to the information structure
3031
Format of the information structure:
3032
  * +0: dword: 15 = subfunction number
3033
  * +4: dword: ignored
3034
  * +8: dword: ignored
3035
  * +12 = +0xC: dword: ignored
3036
  * +16 = +0x10: dword: ignored
3037
  * +20 = +0x14: (only second character is checked)
3038
    /rd=/RAMDISK or /hd=/HARDDISK
3039
Returned value:
3040
  * if the second character does not belong to set {'r','R','h','H'}:
3041
    * eax = 3
3042
    * ebx = ecx = dword [fileinfo] = 0
3043
  * for ramdisk:
3044
    * eax = 0 (success)
3045
    * ebx = total number of clusters = 2847
3046
    * ecx = number of free clusters
3047
    * dword [fileinfo] = cluster size = 512
3048
  * for hard disk: base and partition are defined by subfunctions
3049
    7 and 8 of function 21:
3050
    * eax = 0 (success)
3051
    * ebx = total number of clusters
3052
    * ecx = number of free clusters
3053
    * dword [fileinfo] = cluster size (in bytes)
3054
Remarks:
3055
  * Be not surprised to strange layout of 4th returned parameter
3056
    - when this code was writing, at system calls application got
3057
    only registers eax,ebx,ecx (from pushad-structure transmitted
3058
    as argument to the system function). Now it is corrected, so,
3059
    probably, it is meaningful to return cluster size in edx, while
3060
    this function is not used yet.
3061
  * There exists also subfunction 11 of function 18,
3062
    which returns information on file system. From the full table
3063
    of disk subsystem it is possible to deduce cluster size (there
3064
    it is stored in sectors) and total number of clusters
3065
    for hard disks.
3066
 
3067
======================================================================
3068
========== Function 60 - Inter Process Communication (IPC). ==========
3069
======================================================================
3070
IPC is used for message dispatching from one process/thread to
3071
another. Previously it is necessary to agree how to interpret
3072
the concrete message.
3073
 
3074
----------- Subfunction 1 - set the area for IPC receiving -----------
3075
Is called by process-receiver.
3076
Parameters:
3077
  * eax = 60 - function number
3078
  * ebx = 1 - subfunction number
3079
  * ecx = pointer to the buffer
3080
  * edx = size of the buffer
3081
Returned value:
3082
  * eax = 0 - always success
3083
Format of IPC-buffer:
3084
  * +0: dword: if nonzero, buffer is considered locked;
3085
    lock/unlock the buffer, when you work with it and need that
3086
    buffer data are not changed from outside (no new messages)
3087
  * +4: dword: occupied place in the buffer (in bytes)
3088
  * +8: first message
3089
  * +8+n: second message
3090
  * ...
3091
Format of a message:
3092
  * +0: dword: PID of sender
3093
  * +4: dword: message length (not including this header)
3094
  * +8: n*byte: message data
3095
 
3096
------------------ Subfunction 2 - send IPC message ------------------
3097
Is called by process-sender.
3098
Parameters:
3099
  * eax = 60 - function number
3100
  * ebx = 2 - subfunction number
3101
  * ecx = PID of receiver
3102
  * edx = pointer to the message data
3103
  * esi = message length (in bytes)
3104
Returned value:
3105
  * eax = 0 - success
3106
  * eax = 1 - the receiver has not defined buffer for IPC messages
3107
    (can be, still have no time,
3108
    and can be, this is not right process)
3109
  * eax = 2 - the receiver has blocked IPC-buffer; try to wait a bit
3110
  * eax = 3 - overflow of IPC-buffer of the receiver
3111
  * eax = 4 - process/thread with such PID does not exist
3112
Remarks:
3113
  * Immediately after writing of IPC-message to the buffer the system
3114
    sends to the receiver the event with code 7 (see event codes).
3115
 
3116
======================================================================
3117
==== Function 61 - get parameters for the direct graphics access. ====
3118
======================================================================
3119
The data of the graphics screen (the memory area which displays
3120
screen contents) are accessible to a program directly, without
3121
any system calls, through the selector gs:
3122
	mov	eax, [gs:0]
3123
places in eax the first dword of the buffer, which contains
3124
information on color of the left upper point (and, possibly, colors
3125
of several following).
3126
	mov	[gs:0], eax
3127
by work in VESA modes with LFB sets color of the left upper point
3128
(and, possibly, colors of several following).
3129
To interpret the data of graphics screen program needs to know
3130
some parameters, returning by this function.
3131
Remarks:
3132
  * Graphics parameters changes very seldom at work,
3133
    namely, only in cases, when user works with the application VRR.
3134
  * At videomode change the system redraws all windows (event
3135
    with code 1) and redraws the background (event 5).
3136
    Same events occur in other cases too, which meet much more often,
3137
    than videomode change.
3138
  * By operation in videomodes with LFB the selector gs points to
3139
    LFB itself, so reading/writing on gs result directly in
3140
    change of screen contents. By operation in videomodes without
3141
    LFB gs points to some data area in the kernel, and all functions
3142
    of screen output fulfil honesty double operation on writing
3143
    directly to the screen and writing to this buffer. In result
3144
    at reading contents of this buffer the results correspond to
3145
    screen contents (with, generally speaking, large color
3146
    resolution), and writing is ignored.
3147
    One exception is the mode 320*200, for which main loop of the
3148
    system thread updates the screen according to mouse movements.
3149
 
3150
------------------------- Screen resolution --------------------------
3151
Parameters:
3152
  * eax = 61 - function number
3153
  * ebx = 1 - subfunction number
3154
Returned value:
3155
  * eax = [resolution on x axis]*65536 + [resolution on y axis]
3156
Remarks:
3157
  * One can use function 14 paying attention that
3158
    it returns sizes on 1 pixel less. It is fully equivalent way.
3159
 
3160
---------------------- Number of bits per pixel ----------------------
3161
Parameters:
3162
  * eax = 61 - function number
3163
  * ebx = 2 - subfunction number
3164
Returned value:
3165
  * eax = number of bits per pixel (24 or 32)
3166
 
3167
-------------------- Number of bytes per scanline --------------------
3168
Parameters:
3169
  * eax = 61 - function number
3170
  * ebx = 3 - subfunction number
3171
Returned value:
3172
  * eax = number of bytes occupied by one scanline
3173
    (horizontal line on the screen)
3174
 
3175
======================================================================
3176
===== Function 62, subfunction 0 - get version of PCI-interface. =====
3177
======================================================================
3178
Parameters:
3179
  * eax = 62 - function number
3180
  * bl = 0 - subfunction number
3181
Returned value:
3182
  * eax = -1 - PCI access is disabled; otherwise
3183
  * ah.al = version of PCI-interface (ah=version, al=subversion)
3184
  * high word of eax is zeroed
3185
Remarks:
3186
  * Previously low-level access to PCI for applications must be
3187
    enabled by subfunction 12 of function 21.
3188
  * If PCI BIOS is not supported, the value of ax is undefined.
3189
 
3190
======================================================================
3191
==== Function 62, subfunction 1 - get number of the last PCI-bus. ====
3192
======================================================================
3193
Parameters:
3194
  * eax = 62 - function number
3195
  * bl = 1 - subfunction number
3196
Returned value:
3197
  * eax = -1 - access to PCI is disabled; otherwise
3198
  * al = number of the last PCI-bus; other bytes of eax are destroyed
3199
Remarks:
3200
  * Previously low-level access to PCI for applications must be
3201
    enabled by subfunction 12 of function 21.
3202
  * If PCI BIOS is not supported, the value of ax is undefined.
3203
 
3204
======================================================================
3205
===================== Function 62, subfunction 2 =====================
3206
===== Get mechanism of addressing to the PCI configuration space. ====
3207
======================================================================
3208
Parameters:
3209
  * eax = 62 - function number
3210
  * bl = 2 - subfunction number
3211
Returned value:
3212
  * eax = -1 - access to PCI is disabled; otherwise
3213
  * al = mechanism (1 or 2); other bytes of eax are destroyed
3214
Remarks:
3215
  * Previously low-level access to PCI for applications must be
3216
    enabled by subfunction 12 of function 21.
3217
  * Addressing mechanism is selected depending on
3218
    equipment characteristics.
3219
  * Subfunctions of read and write work automatically
3220
    with the selected mechanism.
3221
 
3222
======================================================================
3223
======== Function 62, subfunctions 4,5,6 - read PCI-register. ========
3224
======================================================================
3225
Parameters:
3226
  * eax = 62 - function number
3227
  * bl = 4 - read byte
3228
  * bl = 5 - read word
3229
  * bl = 6 - read dword
3230
  * bh = number of PCI-bus
3231
  * ch = dddddfff, where ddddd = number of the device on the bus,
3232
    fff = function number of device
3233
  * cl = number of register (must be even for bl=5,
3234
    divisible by 4 for bl=6)
3235
Returned value:
3236
  * eax = -1 - error (access to PCI is disabled or parameters
3237
    are not supported); otherwise
3238
  * al/ax/eax (depending on requested size) contains the data;
3239
    the other part of register eax is destroyed
3240
Remarks:
3241
  * Previously low-level access to PCI for applications must be
3242
    enabled by subfunction 12 of function 21.
3243
  * Access mechanism 2 supports only 16 devices on a bus and ignores
3244
    function number. To get access mechanism use subfunction 2.
3245
  * Some registers are standard and exist for all devices, some are
3246
    defined by the concrete device. The list of registers of the
3247
    first type can be found e.g. in famous
3248
    Interrupt List by Ralf Brown
3249
    (http://www.pobox.com/~ralf/files.html,
3250
    ftp://ftp.cs.cmu.edu/afs/cs/user/ralf/pub/);
3251
    registers of the second type must be listed
3252
    in the device documentation.
3253
 
3254
======================================================================
3255
====== Function 62, subfunctions 8,9,10 - write to PCI-register. =====
3256
======================================================================
3257
Parameters:
3258
  * eax = 62 - function number
3259
  * bl = 8 - write byte
3260
  * bl = 9 - write word
3261
  * bl = 10 - write dword
3262
  * bh = number of PCI-bus
3263
  * ch = dddddfff, where ddddd = number of the device on the bus,
3264
    fff = function number of device
3265
  * cl = number of register (must be even for bl=9,
3266
    divisible by 4 for bl=10)
3267
  * dl/dx/edx (depending on requested size) contatins
3268
    the data to write
3269
Returned value:
3270
  * eax = -1 - error (access to PCI is disabled or parameters
3271
    are not supported)
3272
  * eax = 0 - success
3273
Remarks:
3274
  * Previously low-level access to PCI for applications must be
3275
    enabled by subfunction 12 of function 21.
3276
  * Access mechanism 2 supports only 16 devices on a bus and ignores
3277
    function number. To get access mechanism use subfunction 2.
3278
  * Some registers are standard and exist for all devices, some are
3279
    defined by the concrete device. The list of registers of the
3280
    first type can be found e.g. in famous Interrupt List by
3281
    Ralf Brown; registers of the second type must be listed
3282
    in the device documentation.
3283
 
3284
======================================================================
3285
============== Function 63 - work with the debug board. ==============
3286
======================================================================
3287
The debug board is the global system buffer (with the size
3288
4096 bytes), to which any program can write (generally speaking,
3289
arbitrary) data and from which other program can read these data.
3290
By the agreement written data are text strings interpreted as
3291
debug messages on a course of program execution. The kernel in
3292
some situations also writes to the debug board information on
3293
execution of some functions; by the agreement kernel messages
3294
begins from the prefix "K : ".
3295
For view of the debug board the application 'board' was created,
3296
which reads data from the buffer and displays them in its window.
3297
'board' interpretes the sequence of codes 13,10 as newline.
3298
A character with null code in an end of line is not necessary,
3299
but also does not prevent.
3300
Because debugger has been written, the value of the debug board
3301
has decreased, as debugger allows to inspect completely a course of
3302
program execution without any efforts from the direction of program
3303
itself. Nevertheless in some cases the debug board is still useful.
3304
 
3305
----------------------------- Write byte -----------------------------
3306
Parameters:
3307
  * eax = 63 - function number
3308
  * ebx = 1 - subfunction number
3309
  * cl = data byte
3310
Returned value:
3311
  * function does not return value
3312
Remarks:
3313
  * Byte is written to the buffer. Buffer size is 512 bytes.
3314
    At buffer overflow all obtained data are lost.
3315
  * For output to the debug board of more complicated objects
3316
    (strings, numbers) it is enough to call this function in cycle.
3317
    It is possible not to write the appropriate code manually and use
3318
    file 'debug.inc', which is included into the distributive.
3319
 
3320
----------------------------- Read byte ------------------------------
3321
Takes away byte from the buffer.
3322
Parameters:
3323
  * eax = 63 - function number
3324
  * ebx = 2 - subfunction number
3325
Returned value:
3326
  * eax = ebx = 0 - the buffer is empty
3327
  * eax = byte, ebx = 1 - byte was successfully read
3328
 
3329
======================================================================
3330
============== Function 64 - resize application memory. ==============
3331
======================================================================
3332
Parameters:
3333
  * eax = 64 - function number
3334
  * ebx = 1 - unique subfunction
3335
  * ecx = new memory size
3336
Returned value:
3337
  * eax = 0 - success
3338
  * eax = 1 - not enough memory
3339
Remarks:
3340
  * There is another way to dynamically allocate/free memory -
3341
    subfunctions 11, 12, 13 of function 68.
3342
  * The function cannot be used together with 68.11, 68.12, 68.13.
3343
    The function call will be ignored after creation of process heap
3344
    with function 68.11.
3345
 
3346
======================================================================
3347
======== Function 65 - draw image with palette in the window. ========
3348
======================================================================
3349
Parameters:
3350
  * eax = 65 - function number
3351
  * ebx = pointer to the image
3352
  * ecx = [size on axis x]*65536 + [size on axis y]
3353
  * edx = [coordinate on axis x]*65536 + [coordinate on axis y]
3354
  * esi = number of bits per pixel, must be 8, 24 or 32
3355
  * edi = pointer to palette (256 colors 0x00RRGGBB);
3356
          ignored when esi = 24 and 32
3357
  * ebp = offset of next row data relative to previous row data
3358
Returned value:
3359
  * function does not return value
3360
Remarks:
3361
  * Coordinates of the image are coordinates of the upper left corner
3362
    of the image relative to the window.
3363
  * Size of the image in bytes is xsize*ysize.
3364
  * Each byte of image is index in the palette.
3365
  * If the image uses less than 256 colors, palette size may be
3366
    less than 256 too.
3367
  * The call to function 7 is equivalent to call to this function
3368
    with esi=24, ebp=0.
3369
 
3370
======================================================================
3371
================== Function 66 - work with keyboard. =================
3372
======================================================================
3373
The input mode influences results of reading keys by function 2.
3374
When a program loads, ASCII input mode is set for it.
3375
 
3376
-------------- Subfunction 1 - set keyboard input mode. --------------
3377
Parameters:
3378
  * eax = 66 - function number
3379
  * ebx = 1 - subfunction number
3380
  * ecx = mode:
3381
    * 0 = normal (ASCII-characters)
3382
    * 1 = scancodes
3383
Returned value:
3384
  * function does not return value
3385
 
3386
-------------- Subfunction 2 - get keyboard input mode. --------------
3387
Parameters:
3388
  * eax = 66 - function number
3389
  * ebx = 2 - subfunction number
3390
Returned value:
3391
  * eax = current mode
3392
 
3393
------------ Subfunction 3 - get status of control keys. -------------
3394
Parameters:
3395
  * eax = 66 - function number
3396
  * ebx = 3 - subfunction number
3397
Returned value:
3398
  * eax = bit mask:
3399
  * bit 0 (mask 1): left Shift is pressed
3400
  * bit 1 (mask 2): right Shift is pressed
3401
  * bit 2 (mask 4): left Ctrl is pressed
3402
  * bit 3 (mask 8): right Ctrl is pressed
3403
  * bit 4 (mask 0x10): left Alt is pressed
3404
  * bit 5 (mask 0x20): right Alt is pressed
3405
  * bit 6 (mask 0x40): CapsLock is on
3406
  * bit 7 (mask 0x80): NumLock is on
3407
  * bit 8 (mask 0x100): ScrollLock is on
3408
  * other bits are cleared
3409
 
3410
-------------- Subfunction 4 - set system-wide hotkey. ---------------
3411
When hotkey is pressed, the system notifies only those applications,
3412
which have installed it; the active application (which receives
3413
all normal input) does not receive such keys.
3414
The notification consists in sending event with the code 2.
3415
Reading hotkey is the same as reading normal key - by function 2.
3416
Parameters:
3417
  * eax = 66 - function number
3418
  * ebx = 4 - subfunction number
3419
  * cl determines key scancode;
3420
    use cl=0 to give combinations such as Ctrl+Shift
3421
  * edx = 0xXYZ determines possible states of control keys:
3422
    * Z (low 4 bits) determines state of LShift and RShift:
3423
      * 0 = no key must be pressed;
3424
      * 1 = exactly one key must be pressed;
3425
      * 2 = both keys must be pressed;
3426
      * 3 = must be pressed LShift, but not RShift;
3427
      * 4 = must be pressed RShift, but not LShift
3428
    * Y - similar for LCtrl and RCtrl;
3429
    * X - similar for LAlt and RAlt
3430
Returned value:
3431
  * eax=0 - success
3432
  * eax=1 - too mant hotkeys (maximum 256 are allowed)
3433
Remarks:
3434
  * Hotkey can work either at pressing or at release. Release
3435
    scancode of a key is more on 128 than pressing scancode
3436
    (i.e. high bit is set).
3437
  * Several applications can set the same combination;
3438
    all such applications will be informed on pressing
3439
    such combination.
3440
 
3441
-------------- Subfunction 5 - delete installed hotkey. --------------
3442
Parameters:
3443
  * eax = 66 - function number
3444
  * ebx = 5 - subfunction number
3445
  * cl = scancode of key and edx = 0xXYZ the same as in subfunction 4
3446
Returned value:
3447
  * eax = 0 - success
3448
  * eax = 1 - there is no such hotkey
3449
Remarks:
3450
  * When a process/thread terminates, all hotkey installed by it are
3451
    deleted.
3452
  * The call to this subfunction does not affect other applications.
3453
    If other application has defined the same combination, it will
3454
    still receive notices.
3455
 
3456
======================================================================
3457
========= Function 67 - change position/sizes of the window. =========
3458
======================================================================
3459
Parameters:
3460
  * eax = 67 - function number
3461
  * ebx = new x-coordinate of the window
3462
  * ecx = new y-coordinate of the window
3463
  * edx = new x-size of the window
3464
  * esi = new y-size of the window
3465
Returned value:
3466
  * function does not return value
3467
Remarks:
3468
  * The value -1 for a parameter means "do not change"; e.g. to move
3469
    the window without resizing it is possible to specify edx=esi=-1.
3470
  * Previously the window must be defined by function 0.
3471
    It sets initial coordinates and sizes of the window.
3472
  * Sizes of the window are understood in sense of function 0,
3473
    that is one pixel less than real sizes.
3474
  * The function call for maximized windows is simply ignored.
3475
  * For windows of appropriate styles position and/or sizes can be
3476
    changed by user; current position and sizes can be obtained by
3477
    call to function 9.
3478
  * The function sends to the window redraw event (with the code 1).
3479
 
3480
======================================================================
3481
====== Function 68, subfunction 0 - get the task switch counter. =====
3482
======================================================================
3483
Parameters:
3484
  * eax = 68 - function number
3485
  * ebx = 0 - subfunction number
3486
Returned value:
3487
  * eax = number of task switches from the system booting
3488
    (modulo 2^32)
3489
 
3490
======================================================================
3491
======= Function 68, subfunction 1 - switch to the next thread. ======
3492
======================================================================
3493
The function completes the current time slice allocated to the
3494
thread and switches to the next. (Which thread in which process
3495
will be next, is unpredictable). Later, when execution queue
3496
will reach the current thread, execution will be continued.
3497
Parameters:
3498
  * eax = 68 - function number
3499
  * ebx = 1 - subfunction number
3500
Returned value:
3501
  * function does not return value
3502
 
3503
======================================================================
3504
============= Function 68, subfunction 2 - cache + rdpmc. ============
3505
======================================================================
3506
Parameters:
3507
  * eax = 68 - function number
3508
  * ebx = 2 - subfunction number
3509
  * ecx = required action:
3510
    * ecx = 0 - enable instruction 'rdpmc'
3511
      (ReaD Performance-Monitoring Counters) for applications
3512
    * ecx = 1 - find out whether cache is disabled/enabled
3513
    * ecx = 2 - enable cache
3514
    * ecx = 3 - disable cache
3515
Returned value:
3516
  * for ecx=0:
3517
    * eax = the value of cr4
3518
  * for ecx=1:
3519
    * eax = (cr0 and 0x60000000):
3520
    * eax = 0 - cache is on
3521
    * eax <> 0 - cache is off
3522
  * for ecx=2 and ecx=3:
3523
    * function does not return value
3524
 
3525
======================================================================
3526
=========== Function 68, subfunction 3 - read MSR-register. ==========
3527
======================================================================
3528
MSR = Model Specific Register; the complete list of MSR-registers
3529
of a processor is included to the documentation on it (for example,
3530
IA-32 Intel Architecture Software Developer's Manual,
3531
Volume 3, Appendix B); each processor family has its own subset
3532
of the MSR-registers.
3533
Parameters:
3534
  * eax = 68 - function number
3535
  * ebx = 3 - subfunction number
3536
  * ecx is ignored
3537
  * edx = MSR address
3538
Returned value:
3539
  * ebx:eax = high:low dword of the result
3540
Remarks:
3541
  * If ecx contains nonexistent or not implemented for this processor
3542
    MSR, processor will generate an exception in the kernel, which
3543
    will kill the thread.
3544
  * Previously it is necessary to check, whether MSRs are supported
3545
    as a whole, with the instruction 'cpuid'. Otherwise processor
3546
    will generate other exception in the kernel, which will anyway
3547
    kill the thread.
3548
 
3549
======================================================================
3550
========= Function 68, subfunction 4 - write to MSR-register. ========
3551
======================================================================
3552
MSR = Model Specific Register; the complete list of MSR-registers
3553
of a processor is included to the documentation on it (for example,
3554
IA-32 Intel Architecture Software Developer's Manual,
3555
Volume 3, Appendix B); each processor family has its own subset
3556
of the MSR-registers.
3557
Parameters:
3558
  * eax = 68 - function number
3559
  * ebx = 4 - subfunction number
3560
  * ecx is ignored
3561
  * edx = MSR address
3562
  * esi:edi = high:low dword
3563
Returned value:
3564
  * ebx:eax = copy of esi:edi
3565
Замечания:
3566
  * If ecx contains nonexistent or not implemented for this processor
3567
    MSR, processor will generate an exception in the kernel, which
3568
    will kill the thread.
3569
  * Previously it is necessary to check, whether MSRs are supported
3570
    as a whole, with the instruction 'cpuid'. Otherwise processor
3571
    will generate other exception in the kernel, which will anyway
3572
    kill the thread.
3573
 
3574
======================================================================
3575
======= Function 68, subfunction 11 - initialize process heap. =======
3576
======================================================================
3577
Parameters:
3578
  * eax = 68 - function number
3579
  * ebx = 11 - subfunction number
3580
Returned value:
3581
  * eax = 0 - failed
3582
  * otherwise size of created heap
3583
Remarks:
3584
  * The function call initializes heap, from which one can in future
3585
    allocate and free memory blocks with subfunctions 12 and 13.
3586
    Heap size is equal to total amount of free application memory.
3587
  * The second function call from the same process results in
3588
    returning the size of the existing heap.
3589
  * After creation of the heap calls to function 64 will be ignored.
3590
 
3591
======================================================================
3592
======== Function 68, subfunction 12 - allocate memory block. ========
3593
======================================================================
3594
Parameters:
3595
  * eax = 68 - function number
3596
  * ebx = 12 - subfunction number
3597
  * ecx = required size in bytes
3598
Returned value:
3599
  * eax = pointer to the allocated block
3600
Remarks:
3601
  * Before this call one must initialize process heap by call to
3602
    subfunction 11.
3603
  * The function allocates an integer number of pages (4 Kb) in such
3604
    way that the real size of allocated block is more than or equal to
3605
    requested size.
3606
 
3607
======================================================================
3608
========== Function 68, subfunction 13 - free memory block. ==========
3609
======================================================================
3610
Parameters:
3611
  * eax = 68 - function number
3612
  * ebx = 13 - subfunction number
3613
  * ecx = pointer to the memory block
3614
Returned value:
3615
  * eax = 1 - success
3616
  * eax = 0 - failed
3617
Remarks:
3618
  * The memory block must have been allocated by subfunction 12
3619
    or subfunction 20.
3620
 
3621
======================================================================
3622
======== Function 68, subfunction 14 - wait for driver notify. =======
3623
======================================================================
3624
Parameters:
3625
  * eax = 68 - function number
3626
  * ebx = 14 - subfunction number
3627
  * ecx = pointer to the buffer for information (8 bytes)
3628
Returned value:
3629
  * buffer pointed to by ecx contains the following information:
3630
    * +0: dword: constant EV_INTR = 1
3631
    * +4: dword: driver data
3632
Remarks:
3633
  * The current implementation at wait time uses "heavy" operations
3634
    of task switch.
3635
 
3636
======================================================================
3637
====== Function 68, subfunction 15 - set FPU exception handler. ======
3638
======================================================================
3639
Parameters:
3640
  * eax = 68 - function number
3641
  * ebx = 15 - subfunction number
3642
  * ecx = address of the new exception handler
3643
Returned value:
3644
  * eax = address of the old exception handler (0, if it was not set)
3645
 
3646
======================================================================
3647
============= Function 68, subfunction 16 - load driver. =============
3648
======================================================================
3649
Parameters:
3650
  * eax = 68 - function number
3651
  * ebx = 16 - subfunction number
3652
  * ecx = pointer to ASCIIZ-string with driver name
3653
Returned value:
3654
  * eax = 0 - failed
3655
  * otherwise eax = driver handle
3656
Remarks:
3657
  * If the driver was not loaded yet, it is loaded;
3658
    if the driver was loaded yet, nothing happens.
3659
  * Driver name is case-sensitive.
3660
    Maximum length of the name is 16 characters, including
3661
    terminating null character, the rest is ignored.
3662
  * Driver ABC is loaded from file /rd/1/drivers/ABC.obj.
3663
 
3664
======================================================================
3665
============ Function 68, subfunction 17 - driver control. ===========
3666
======================================================================
3667
Parameters:
3668
  * eax = 68 - function number
3669
  * ebx = 17 - subfunction number
3670
  * ecx = pointer to the control structure:
3671
    * +0: dword: handle of driver
3672
    * +4: dword: code of driver function
3673
    * +8: dword: pointer to input data
3674
    * +12 = +0xC: dword: size of input data
3675
    * +16 = +0x10: dword: pointer to output data
3676
    * +20 = +0x14: dword: size of output data
3677
Returned value:
3678
  * eax = determined by driver
3679
Remarks:
3680
  * Function codes and the structure of input/output data
3681
    are defined by driver.
3682
  * Previously one must obtain driver handle by subfunction 16.
3683
 
3684
======================================================================
3685
====== Function 68, subfunction 18 - set SSE exception handler. ======
3686
======================================================================
3687
Parameters:
3688
  * eax = 68 - function number
3689
  * ebx = 15 - subfunction number
3690
  * ecx = address of the new exception handler
3691
Returned value:
3692
  * eax = address of the old exception handler (0, if it was not set)
3693
 
3694
======================================================================
3695
=============== Function 68, subfunction 19 - load DLL. ==============
3696
======================================================================
3697
Parameters:
3698
  * eax = 68 - function number
3699
  * ebx = 19 - subfunction number
3700
  * ecx = pointer to ASCIIZ-string with the full path to DLL
3701
Returned value:
3702
  * eax = 0 - failed
3703
  * otherwise eax = pointer to DLL export table
3704
Remarks:
3705
  * Export table is an array of structures of 2 dword's, terminated
3706
    by zero. The first dword in structure points to function name,
3707
    the second dword contains address of function.
3708
 
3709
======================================================================
3710
======= Function 68, subfunction 20 - reallocate memory block. =======
3711
======================================================================
3712
Parameters:
3713
  * eax = 68 - function number
3714
  * ebx = 20 - subfunction number
3715
  * ecx = new size in bytes
3716
  * edx = pointer to already allocated block
3717
Returned value:
3718
  * eax = pointer to the reallocated block, 0 = error
3719
Remarks:
3720
  * Before this call one must initialize process heap by call to
3721
    subfunction 11.
3722
  * The function allocates an integer number of pages (4 Kb) in such
3723
    way that the real size of allocated block is more than or equal to
3724
    requested size.
3725
  * If edx=0, the function call is equivalent to memory allocation
3726
    with subfunction 12. Otherwise the block at edx
3727
    must be allocated earlier with subfunction 12 or this subfunction.
3728
  * If ecx=0, the function frees memory block at edx and returns 0.
3729
  * The contents of the block are unchanged up to the shorter of
3730
    the new and old sizes.
3731
 
3732
======================================================================
3733
====================== Fucntion 69 - debugging. ======================
3734
======================================================================
3735
A process can load other process as debugged by set of corresponding
3736
bit by call to subfunction 7 of function 70.
3737
A process can have only one debugger; one process can debug some
3738
others. The system notifies debugger on events occuring with
3739
debugged process. Messages are written to the buffer defined by
3740
subfunction 0.
3741
Format of a message:
3742
  * +0: dword: message code
3743
  * +4: dword: PID of debugged process
3744
  * +8: there can be additional data depending on message code
3745
Message codes:
3746
  * 1 = exception
3747
    * in addition dword-number of the exception is given
3748
    * process is suspended
3749
  * 2 = process has terminated
3750
    * comes at any termination: both through the system function -1,
3751
      and at "murder" by any other process (including debugger itself)
3752
  * 3 = debug exception int 1 = #DB
3753
    * in addition dword-image of the register DR6 is given:
3754
      * bits 0-3: condition of the corresponding breakpoint (set by
3755
        subfunction 9) is satisfied
3756
      * бит 14: exception has occured because of the trace mode
3757
        (flag TF is set TF)
3758
    * process is suspended
3759
When debugger terminates, all debugged processes are killed.
3760
If debugger does not want this, it must previously detach by
3761
subfunction 3.
3762
 
3763
All subfunctions are applicable only to processes/threads started
3764
from the current by function 58 or 70 with set debugging flag.
3765
Debugging of multithreaded programs is not supported yet.
3766
The full list of subfunctions:
3767
  * subfunction 0 - define data area for debug messages
3768
  * subfunction 1 - get contents of registers of debugged thread
3769
  * subfunction 2 - set contents of registers of debugged thread
3770
  * subfunction 3 - detach from debugged process
3771
  * subfunction 4 - suspend debugged thread
3772
  * subfunction 5 - resume debugged thread
3773
  * subfunction 6 - read from the memory of debugged process
3774
  * subfunction 7 - write to the memory of debugged process
3775
  * subfunction 8 - terminate debugged thread
3776
  * subfunction 9 - set/clear hardware breakpoint
3777
 
3778
======================================================================
3779
= Function 69, subfunction 0 - define data area fror debug messages. =
3780
======================================================================
3781
Parameters:
3782
  * eax = 69 - function number
3783
  * ebx = 0 - subfunction number
3784
  * ecx = pointer
3785
Format of data area:
3786
  * +0: dword: N = buffer size (not including this header)
3787
  * +4: dword: occupied place
3788
  * +8: N*byte: buffer
3789
Returned value:
3790
  * function does not return value
3791
Remarks:
3792
  * If the size field is negative, the buffer is considered locked
3793
    and at arrival of new message the system will wait.
3794
    For synchronization frame all work with the buffer by operations
3795
    lock/unlock
3796
    	neg	[bufsize]
3797
  * Data in the buffer are considered as array of items with variable
3798
    length - messages. Format of a message is explained in
3799
    general description.
3800
 
3801
======================================================================
3802
===================== Function 69, subfunction 1 =====================
3803
============ Get contents of registers of debugged thread. ===========
3804
======================================================================
3805
Parameters:
3806
  * eax = 69 - function number
3807
  * ebx = 1 - subfunction number
3808
  * ecx = thread identifier
3809
  * edx = size of context structure, must be 0x28=40 bytes
3810
  * esi = pointer to context structure
3811
Returned value:
3812
  * function does not return value
3813
Format of context structure: (FPU is not supported yet)
3814
  * +0: dword: eip
3815
  * +4: dword: eflags
3816
  * +8: dword: eax
3817
  * +12 = +0xC: dword: ecx
3818
  * +16 = +0x10: dword: edx
3819
  * +20 = +0x14: dword: ebx
3820
  * +24 = +0x18: dword: esp
3821
  * +28 = +0x1C: dword: ebp
3822
  * +32 = +0x20: dword: esi
3823
  * +36 = +0x24: dword: edi
3824
Remarks:
3825
  * If the thread executes code of ring-0, the function returns
3826
    contents of registers of ring-3.
3827
  * Process must be loaded for debugging (as is shown in
3828
    general description).
3829
 
3830
======================================================================
3831
===================== Function 69, subfunction 2 =====================
3832
============ Set contents of registers of debugged thread. ===========
3833
======================================================================
3834
Parameters:
3835
  * eax = 69 - function number
3836
  * ebx = 2 - subfunction number
3837
  * ecx = thread identifier
3838
  * edx = size of context structure, must be 0x28=40 bytes
3839
Returned value:
3840
  * function does not return value
3841
Format of context structure is shown in the description of
3842
subfunction 1.
3843
Remarks:
3844
  * If the thread executes code of ring-0, the function returns
3845
    contents of registers of ring-3.
3846
  * Process must be loaded for debugging (as is shown in
3847
    general description).
3848
 
3849
======================================================================
3850
===== Function 69, subfunction 3 - detach from debugged process. =====
3851
======================================================================
3852
Parameters:
3853
  * eax = 69 - function number
3854
  * ebx = 3 - subfunction number
3855
  * ecx = identifier
3856
Returned value:
3857
  * function does not return value
3858
Remarks:
3859
  * If the process was suspended, it resumes execution.
3860
 
3861
======================================================================
3862
======== Function 69, subfunction 4 - suspend debugged thread. =======
3863
======================================================================
3864
Parameters:
3865
  * eax = 69 - function number
3866
  * ebx = 4 - subfunction number
3867
  * ecx = thread identifier
3868
Returned value:
3869
  * function does not return value
3870
Remarks:
3871
  * Process must be loaded for debugging (as is shown in
3872
    general description).
3873
 
3874
======================================================================
3875
======== Function 69, subfunction 5 - resume debugged thread. ========
3876
======================================================================
3877
Parameters:
3878
  * eax = 69 - function number
3879
  * ebx = 5 - subfunction number
3880
  * ecx = thread identifier
3881
Returned value:
3882
  * function does not return value
3883
Remarks:
3884
  * Process must be loaded for debugging (as is shown in
3885
    general description).
3886
 
3887
======================================================================
3888
= Fucntion 69, subfunction 6 - read from memory of debugged process. =
3889
======================================================================
3890
Parameters:
3891
  * eax = 69 - function number
3892
  * ebx = 6 - subfunction number
3893
  * ecx = identifier
3894
  * edx = number of bytes to read
3895
  * esi = address in the memory of debugged process
3896
  * edi = pointer to buffer for data
3897
Returned value:
3898
  * eax = -1 at an error (invalid PID or buffer)
3899
  * otherwise eax = number of read bytes (possibly, 0,
3900
    if esi is too large)
3901
Remarks:
3902
  * Process must be loaded for debugging (as is shown in
3903
    general description).
3904
 
3905
======================================================================
3906
== Function 69, subfunction 7 - write to memory of debugged process. =
3907
======================================================================
3908
Parameters:
3909
  * eax = 69 - function number
3910
  * ebx = 7 - subfunction number
3911
  * ecx = identifier
3912
  * edx = number of bytes to write
3913
  * esi = address of memory in debugged process
3914
  * edi = pointer to data
3915
Returned value:
3916
  * eax = -1 at an error (invalid PID or buffer)
3917
  * otherwise eax = number of written bytes (possibly, 0,
3918
    if esi is too large)
3919
Remarks:
3920
  * Process must be loaded for debugging (as is shown in
3921
    general description).
3922
 
3923
======================================================================
3924
======= Function 69, subfunction 8 - terminate debugged thread. ======
3925
======================================================================
3926
Parameters:
3927
  * eax = 69 - function number
3928
  * ebx = 8 - subfunction number
3929
  * ecx = identifier
3930
Returned value:
3931
  * function does not return value
3932
Remarks:
3933
  * Process must be loaded for debugging (as is shown in
3934
    general description).
3935
  * The function is similar to subfunction 2 of function 18
3936
    with two differences: it requires first remark and
3937
    accepts PID rather than slot number.
3938
 
3939
======================================================================
3940
===== Function 69, subfunction 9 - set/clear hardware breakpoint. ====
3941
======================================================================
3942
Parameters:
3943
  * eax = 69 - function number
3944
  * ebx = 9 - subfunction number
3945
  * ecx = thread identifier
3946
  * dl = index of breakpoint, from 0 to 3 inclusively
3947
  * dh = flags:
3948
    * if high bit is cleared - set breakpoint:
3949
      * bits 0-1 - condition:
3950
        * 00 = breakpoint on execution
3951
        * 01 = breakpoint on read
3952
        * 11 = breakpoint on read/write
3953
      * bits 2-3 - length; for breakpoints on exception it must be
3954
        00, otherwise one of
3955
        * 00 = byte
3956
        * 01 = word
3957
        * 11 = dword
3958
      * esi = breakpoint address; must be aligned according to
3959
        the length (i.e. must be even for word breakpoints,
3960
        divisible by 4 for dword)
3961
    * if high bit is set - clear breakpoint
3962
Returned value:
3963
  * eax = 0 - success
3964
  * eax = 1 - error in the input data
3965
  * eax = 2 - (reserved, is never returned in the current
3966
    implementation) a global breakpoint with that index is already set
3967
Remarks:
3968
  * Process must be loaded for debugging (as is shown in
3969
    general description).
3970
  * Hardware breakpoints are implemented through DRx-registers of
3971
    the processor, all limitations results from this.
3972
  * The function can reinstall the breakpoint, previously set
3973
    by it (and it does not inform on this).
3974
    Carry on the list of set breakpoints in the debugger.
3975
  * Breakpoints generate debug exception #DB, on which the system
3976
    notifies debugger.
3977
  * Breakpoints on write and read/write act after
3978
    execution of the caused it instruction.
3979
 
3980
======================================================================
3981
==== Function 70 - work with file system with long names support. ====
3982
======================================================================
3983
Parameters:
3984
  * eax = 70
3985
  * ebx = pointer to the information structure
3986
Returned value:
3987
  * eax = 0 - success; otherwise file system error code
3988
  * some subfunctions return value in other registers too
3989
General format of the information structure:
3990
  * +0: dword: subfunction number
3991
  * +4: dword: file offset
3992
  * +8: dword: high dword of offset (must be 0) or flags field
3993
  * +12 = +0xC: dword: size
3994
  * +16 = +0x10: dword: pointer to data
3995
  * +20 = +0x14: n db: ASCIIZ-string with the filename
3996
    or
3997
  * +20 = +0x14: db 0
3998
  * +21 = +0x15: dd pointer to ASCIIZ-string with the filename
3999
Specifications - in documentation on the appropriate subfunction.
4000
Filename is case-insensitive. Russian letters must be written in
4001
the encoding cp866 (DOS).
4002
Format of filename:
4003
/base/number/dir1/dir2/.../dirn/file,
4004
where /base/number identifies device, on which file is located:
4005
one of
4006
  * /RD/1 = /RAMDISK/1 to access ramdisk
4007
  * /FD/1 = /FLOPPYDISK/1 to access first floppy drive,
4008
    /FD/2 = /FLOPPYDISK/2 to access second one
4009
  * /HD0/x, /HD1/x, /HD2/x, /HD3/x to access accordingly to devices
4010
    IDE0 (Primary Master), IDE1 (Primary Slave),
4011
    IDE2 (Secondary Master), IDE3 (Secondary Slave);
4012
    x - partition number on the selected hard drive, varies from 1
4013
    to 255 (on each hard drive the indexing starts from 1)
4014
  * /CD0/1, /CD1/1, /CD2/1, /CD3/1 to access accordingly to
4015
    CD on IDE0 (Primary Master), IDE1 (Primary Slave),
4016
    IDE2 (Secondary Master), IDE3 (Secondary Slave)
4017
Examples:
4018
  * '/rd/1/kernel.asm',0
4019
  * '/HD0/1/kernel.asm',0
4020
  * '/hd0/2/menuet/pics/tanzania.bmp',0
4021
  * '/hd0/1/Program files/NameOfProgram/SomeFile.SomeExtension',0
4022
Available subfunctions:
4023
  * subfunction 0 - read file
4024
  * subfunction 1 - read folder
4025
  * subfunction 2 - create/rewrite file
4026
  * subfunction 3 - write to existing file
4027
  * subfunction 4 - set file size
4028
  * subfunction 5 - get attributes of file/folder
4029
  * subfunction 6 - set attributes of file/folder
4030
  * subfunction 7 - start application
4031
  * subfunction 8 - delete file/folder
4032
  * subfunction 9 - create folder
4033
For CD-drives due to hardware limitations only subfunctions
4034
0,1,5 and 7 are available, other subfunctions return error
4035
with code 2.
4036
 
4037
======================================================================
4038
=== Function 70, subfunction 0 - read file with long names support. ==
4039
======================================================================
4040
Parameters:
4041
  * eax = 70 - function number
4042
  * ebx = pointer to the information structure
4043
Format of the information structure:
4044
  * +0: dword: 0 = subfunction number
4045
  * +4: dword: file offset (in bytes)
4046
  * +8: dword: 0 (reserved for high dword of offset)
4047
  * +12 = +0xC: dword: number of bytes to read
4048
  * +16 = +0x10: dword: pointer to buffer for data
4049
  * +20 = +0x14: ASCIIZ-name of file, the rules of names forming are
4050
    given in the general description
4051
    or
4052
  * +20 = +0x14: db 0
4053
  * +21 = +0x15: dd pointer to ASCIIZ-string with file name
4054
Returned value:
4055
  * eax = 0 - success, otherwise file system error code
4056
  * ebx = number of read bytes or -1=0xffffffff if file was not found
4057
Remarks:
4058
  * If file was ended before last requested block was read,
4059
    the function will read as many as it can, and after that return
4060
    eax=6 (EOF).
4061
  * The function does not allow to read folder (returns eax=10,
4062
    access denied).
4063
 
4064
======================================================================
4065
== Function 70, subfunction 1 - read folder with long names support. =
4066
======================================================================
4067
Parameters:
4068
  * eax = 70 - function number
4069
  * ebx = pointer to the information structure
4070
Format of the information structure:
4071
  * +0: dword: 1 = subfunction number
4072
  * +4: dword: index of starting block (beginning from 0)
4073
  * +8: dword: flags field:
4074
    * bit 0 (mask 1): in what format to return names,
4075
      0=ANSI, 1=UNICODE
4076
    * other bits are reserved and must be set to 0 for the future
4077
      compatibility
4078
  * +12 = +0xC: dword: number of blocks to read
4079
  * +16 = +0x10: dword: pointer to buffer for data, buffer size
4080
    must be not less than 32 + [+12]*560 bytes
4081
  * +20 = +0x14: ASCIIZ-name of folder, the rules of names forming are
4082
    given in the general description
4083
    or
4084
  * +20 = +0x14: db 0
4085
  * +21 = +0x15: dd pointer to ASCIIZ-string with file name
4086
Returned value:
4087
  * eax = 0 - success, otherwise file system error code
4088
  * ebx = number of files, information on which was written to
4089
    the buffer, or -1=0xffffffff, if folder was not found
4090
Structure of the buffer:
4091
  * +0: 32*byte: header
4092
  * +32 = +0x20: n1*byte: block with information on file 1
4093
  * +32+n1: n2*byte: block with information on file 2
4094
  * ...
4095
Structure of header:
4096
  * +0: dword: version of structure (current is 1)
4097
  * +4: dword: number of placed blocks; is not greater than requested
4098
    in the field +12 of information structure; can be less, if
4099
    there are no more files in folder (the same as in ebx)
4100
  * +8: dword: total number of files in folder
4101
  * +12 = +0xC: 20*byte: reserved (zeroed)
4102
Structure of block of data for folder entry (BDFE):
4103
  * +0: dword: attributes of file:
4104
    * bit 0 (mask 1): file is read-only
4105
    * bit 1 (mask 2): file is hidden
4106
    * bit 2 (mask 4): file is system
4107
    * bit 3 (mask 8): this is not a file but volume label
4108
      (for one partition meets no more than once and
4109
      only in root folder)
4110
    * bit 4 (mask 0x10): this is a folder
4111
    * bit 5 (mask 0x20): file was not archived - many archivation
4112
      programs have an option to archive only files with this bit set,
4113
      and after archiving this bit is cleared - it can be useful
4114
      for automatically creating of backup-archives as at writing
4115
      this bit is usually set
4116
  * +4: byte: type of name data:
4117
    (coincides with bit 0 of flags in the information structure)
4118
    * 0 = ASCII = 1-byte representation of each character
4119
    * 1 = UNICODE = 2-byte representation of each character
4120
  * +5: 3*byte: reserved (zero)
4121
  * +8: 4*byte: time of file creation
4122
  * +12 = +0xC: 4*byte: date of file creation
4123
  * +16 = +0x10: 4*byte: time of last access (read or write)
4124
  * +20 = +0x14: 4*byte: date of last access
4125
  * +24 = +0x18: 4*byte: time of last modification
4126
  * +28 = +0x1C: 4*byte: date of last modification
4127
  * +32 = +0x20: qword: file size in bytes (up to 16777216 Tb)
4128
  * +40 = +0x28: name
4129
    * for ASCII format: maximum length is 263 characters
4130
      (263 bytes), byte after the name has value 0
4131
    * for UNICODE format: maximum length is 259 characters
4132
      (518 bytes), 2 bytes after the name have value 0
4133
Time format:
4134
  * +0: byte: seconds
4135
  * +1: byte: minutes
4136
  * +2: byte: hours
4137
  * +3: byte: reserved (0)
4138
  * for example, 23.59.59 is written as (in hex) 3B 3B 17 00
4139
Date format:
4140
  * +0: byte: day
4141
  * +1: byte: month
4142
  * +2: word: year
4143
  * for example, 25.11.1979 is written as (in hex) 19 0B BB 07
4144
Remarks:
4145
  * If BDFE contains ASCII name, the length of BDFE is 304 bytes,
4146
    if UNICODE name - 560 bytes. Value of length is aligned
4147
    on 16-byte bound (to accelerate processing in CPU cache).
4148
  * First character after a name is zero (ASCIIZ-string). The further
4149
    data contain garbage.
4150
  * If files in folder were ended before requested number was read,
4151
    the function will read as many as it can, and after that return
4152
    eax=6 (EOF).
4153
  * Any folder on the disk, except for root, contains two special
4154
    entries "." and "..", identifying accordingly the folder itself
4155
    and the parent folder.
4156
  * The function allows also to read virtual folders "/", "/rd",
4157
    "/fd", "/hd[n]", thus attributes of subfolders are set to 0x10,
4158
    and times and dates are zeroed. An alternative way to get the
4159
    equipment information - subfunction 11 of function 18.
4160
 
4161
======================================================================
4162
===================== Function 70, subfunction 2 =====================
4163
============ Create/rewrite file with long names support. ============
4164
======================================================================
4165
Parameters:
4166
  * eax = 70 - function number
4167
  * ebx = pointer to the information structure
4168
Format of the information structure:
4169
  * +0: dword: 2 = subfunction number
4170
  * +4: dword: 0 (reserved)
4171
  * +8: dword: 0 (reserved)
4172
  * +12 = +0xC: dword: number of bytes to read
4173
  * +16 = +0x10: dword: pointer to data
4174
  * +20 = +0x14: ASCIIZ-name of file, the rules of names forming are
4175
    given in the general description
4176
    or
4177
  * +20 = +0x14: db 0
4178
  * +21 = +0x15: dd pointer to ASCIIZ-string with file name
4179
Returned value:
4180
  * eax = 0 - success, otherwise file system error code
4181
  * ebx = number of written bytes (possibly 0)
4182
Remarks:
4183
  * If a file with given name did not exist, it is created;
4184
    if it existed, it is rewritten.
4185
  * If there is not enough free space on disk, the function will
4186
    write as many as can and then return error code 8.
4187
  * The function is not supported for CD (returns error code 2).
4188
 
4189
======================================================================
4190
===================== Function 70, subfunction 3 =====================
4191
=========== Write to existing file with long names support. ==========
4192
======================================================================
4193
Parameters:
4194
  * eax = 70 - function number
4195
  * ebx = pointer to the information structure
4196
Format of the information structure:
4197
  * +0: dword: 3 = subfunction number
4198
  * +4: dword: file offset (in bytes)
4199
  * +8: dword: high dword of offset (must be 0 for FAT)
4200
  * +12 = +0xC: dword: number of bytes to write
4201
  * +16 = +0x10: dword: pointer to data
4202
  * +20 = +0x14: ASCIIZ-name of file, the rules of names forming are
4203
    given in the general description
4204
    or
4205
  * +20 = +0x14: db 0
4206
  * +21 = +0x15: dd pointer to ASCIIZ-string with file name
4207
Returned value:
4208
  * eax = 0 - success, otherwise file system error code
4209
  * ebx = number of written bytes (possibly 0)
4210
Remarks:
4211
  * The file must already exist, otherwise function returns eax=5.
4212
  * The only result of write 0 bytes is update in the file attributes
4213
    date/time of modification and access to the current date/time.
4214
  * If beginning and/or ending position is greater than file size
4215
    (except for the previous case), the file is expanded to needed
4216
    size with zero characters.
4217
  * The function is not supported for CD (returns error code 2).
4218
 
4219
======================================================================
4220
============ Function 70, subfunction 4 - set end of file. ===========
4221
======================================================================
4222
Parameters:
4223
  * eax = 70 - function number
4224
  * ebx = pointer to the information structure
4225
Format of the information structure:
4226
  * +0: dword: 4 = subfunction number
4227
  * +4: dword: low dword of new file size
4228
  * +8: dword: high dword of new file size (must be 0 for FAT)
4229
  * +12 = +0xC: dword: 0 (reserved)
4230
  * +16 = +0x10: dword: 0 (reserved)
4231
  * +20 = +0x14: ASCIIZ-name of file, the rules of names forming are
4232
    given in the general description
4233
    or
4234
  * +20 = +0x14: db 0
4235
  * +21 = +0x15: dd pointer to ASCIIZ-string with file name
4236
Returned value:
4237
  * eax = 0 - success, otherwise file system error code
4238
  * ebx destroyed
4239
Remarks:
4240
  * If the new file size is less than old one, file is truncated.
4241
    If the new size is greater than old one, file is expanded with
4242
    characters with code 0. If the new size is equal to old one,
4243
    the only result of call is set date/time of modification and
4244
    access to the current date/time.
4245
  * If there is not enough free space on disk for expansion, the
4246
    function will expand to maximum possible size and then return
4247
    error code 8.
4248
  * The function is not supported for CD (returns error code 2).
4249
 
4250
======================================================================
4251
==== Function 70, subfunction 5 - get information on file/folder. ====
4252
======================================================================
4253
Parameters:
4254
  * eax = 70 - function number
4255
  * ebx = pointer to the information structure
4256
Format of the information structure:
4257
  * +0: dword: 5 = subfunction number
4258
  * +4: dword: 0 (reserved)
4259
  * +8: dword: 0 (reserved)
4260
  * +12 = +0xC: dword: 0 (reserved)
4261
  * +16 = +0x10: dword: pointer to buffer for data (40 bytes)
4262
  * +20 = +0x14: ASCIIZ-name of file, the rules of names forming are
4263
    given in the general description
4264
    or
4265
  * +20 = +0x14: db 0
4266
  * +21 = +0x15: dd pointer to ASCIIZ-string with file name
4267
Returned value:
4268
  * eax = 0 - success, otherwise file system error code
4269
  * ebx destroyed
4270
Information on file is returned in the BDFE format (block of data
4271
for folder entry), explained in the description of
4272
subfunction 1, but without filename
4273
(i.e. only first 40 = 0x28 bytes).
4274
Remarks:
4275
  * The function does not support virtual folders such as /, /rd and
4276
    root folders like /rd/1.
4277
 
4278
======================================================================
4279
===== Function 70, subfunction 6 - set attributes of file/folder. ====
4280
======================================================================
4281
Parameters:
4282
  * eax = 70 - function number
4283
  * ebx = pointer to the information structure
4284
Format of the information structure:
4285
  * +0: dword: 6 = subfunction number
4286
  * +4: dword: 0 (reserved)
4287
  * +8: dword: 0 (reserved)
4288
  * +12 = +0xC: dword: 0 (reserved)
4289
  * +16 = +0x10: dword: pointer to buffer with attributes (32 bytes)
4290
  * +20 = +0x14: ASCIIZ-name of file, the rules of names forming are
4291
    given in the general description
4292
    or
4293
  * +20 = +0x14: db 0
4294
  * +21 = +0x15: dd pointer to ASCIIZ-string with file name
4295
Returned value:
4296
  * eax = 0 - success, otherwise file system error code
4297
  * ebx destroyed
4298
File attributes are first 32 bytes in BDFE (block of data
4299
for folder entry), explained in the description of subfunction 1
4300
(that is, without name and size of file). Attribute
4301
file/folder/volume label (bits 3,4 in dword +0) is not changed.
4302
Byte +4 (name format) is ignored.
4303
Remarks:
4304
  * The function does not support virtual folders such as /, /rd and
4305
    root folders like /rd/1.
4306
  * The function is not supported for CD (returns error code 2).
4307
 
4308
======================================================================
4309
=========== Function 70, subfunction 7 - start application. ==========
4310
======================================================================
4311
Parameters:
4312
  * eax = 70 - function number
4313
  * ebx = pointer to the information structure
4314
Format of the information structure:
4315
  * +0: dword: 7 = subfunction number
4316
  * +4: dword: flags field:
4317
    * бит 0: start process as debugged
4318
    * other bits are reserved and must be set to 0
4319
  * +8: dword: 0 or pointer to ASCIIZ-string with parameters
4320
  * +12 = +0xC: dword: 0 (reserved)
4321
  * +16 = +0x10: dword: 0 (reserved)
4322
  * +20 = +0x14: ASCIIZ-name of file, the rules of names forming are
4323
    given in the general description
4324
    or
4325
  * +20 = +0x14: db 0
4326
  * +21 = +0x15: dd pointer to ASCIIZ-string with file name
4327
Returned value:
4328
  * eax > 0 - program is loaded, eax contains PID
4329
  * eax < 0 - an error has occured, -eax contains
4330
    file system error code
4331
  * ebx destroyed
4332
Remarks:
4333
  * Command line must be terminated by the character with the code 0
4334
    (ASCIIZ-string); function takes into account either all characters
4335
    up to terminating zero inclusively or first 256 character
4336
    regarding what is less.
4337
  * If the process is started as debugged, it is created in
4338
    the suspended state; to run use subfunction 5 of function 69.
4339
 
4340
======================================================================
4341
========== Function 70, subfunction 8 - delete file/folder. ==========
4342
======================================================================
4343
Parameters:
4344
  * eax = 70 - function number
4345
  * ebx = pointer to the information structure
4346
Format of the information structure:
4347
  * +0: dword: 8 = subfunction number
4348
  * +4: dword: 0 (reserved)
4349
  * +8: dword: 0 (reserved)
4350
  * +12 = +0xC: dword: 0 (reserved)
4351
  * +16 = +0x10: dword: 0 (reserved)
4352
  * +20 = +0x14: ASCIIZ-name of file, the rules of names forming are
4353
    given in the general description
4354
    or
4355
  * +20 = +0x14: db 0
4356
  * +21 = +0x15: dd pointer to ASCIIZ-string with file name
4357
Returned value:
4358
  * eax = 0 - success, otherwise file system error code
4359
  * ebx destroyed
4360
Remarks:
4361
  * The function is not supported for CD (returns error code 2).
4362
  * The function can delete only empty folders (attempt to delete
4363
    nonempty folder results in error with code 10, "access denied").
4364
 
4365
======================================================================
4366
============= Function 70, subfunction 9 - create folder. ============
4367
======================================================================
4368
Parameters:
4369
  * eax = 70 - function number
4370
  * ebx = pointer to the information structure
4371
Format of the information structure:
4372
  * +0: dword: 9 = subfunction number
4373
  * +4: dword: 0 (reserved)
4374
  * +8: dword: 0 (reserved)
4375
  * +12 = +0xC: dword: 0 (reserved)
4376
  * +16 = +0x10: dword: 0 (reserved)
4377
  * +20 = +0x14: ASCIIZ-name of folder, the rules of names forming are
4378
    given in the general description
4379
    or
4380
  * +20 = +0x14: db 0
4381
  * +21 = +0x15: dd pointer to ASCIIZ-string with folder name
4382
Returned value:
4383
  * eax = 0 - success, otherwise file system error code
4384
  * ebx destroyed
4385
Remarks:
4386
  * The function is not supported for CD (returns error code 2).
4387
  * The parent folder must already exist.
4388
  * If target folder already exists, function returns success (eax=0).
4389
 
4390
======================================================================
4391
========== Function 71, subfunction 1 - set window caption. ==========
4392
======================================================================
4393
Parameters:
4394
  * eax = 71 - function number
4395
  * ebx = 1 - subfunction number
4396
  * ecx = pointer to caption string
4397
Returned value:
4398
  * function does not return value
4399
Remarks:
4400
  * String must be in the ASCIIZ-format. Disregarding real string
4401
    length, no more than 255 characters are drawn.
4402
  * Pass NULL in ecx to remove caption.
4403
 
4404
======================================================================
4405
=============== Function -1 - terminate thread/process ===============
4406
======================================================================
4407
Parameters:
4408
  * eax = -1 - function number
4409
Returned value:
4410
  * function does not return neither value nor control
4411
Remarks:
4412
  * If the process did not create threads obviously, it has only
4413
    one thread, which termination results in process termination.
4414
  * If the current thread is last in the process, its termination
4415
    also results in process terminates.
4416
  * This function terminates the current thread. Other thread can be
4417
    killed by call to subfunction 2 of function 18.
4418
 
4419
======================================================================
4420
=========================== List of events ===========================
4421
======================================================================
4422
Next event can be retrieved by the call of one from functions 10
4423
(to wait for event), 11 (to check without waiting), 23
4424
(to wait during the given time).
4425
These functions return only those events, which enter into a mask set
4426
by function 40. By default it is first three,
4427
there is enough for most applications.
4428
Codes of events:
4429
  * 1 = redraw event (is reset by call to function 0)
4430
  * 2 = key on keyboard is pressed (acts, only when the window is
4431
    active) or hotkey is pressed; is reset, when all keys from
4432
    the buffer are read out by function 2
4433
  * 3 = button is pressed, defined earlier by function 8
4434
    (or close button, created implicitly by function 0;
4435
    minimize button is handled by the system and sends no message;
4436
    acts, only when the window is active;
4437
    is reset when all buttons from the buffer
4438
    are read out by function 17)
4439
  * 4 = reserved (in current implementation never comes even after
4440
    unmasking by function 40)
4441
  * 5 = the desktop background is redrawed (is reset automatically
4442
    after redraw, so if in redraw time program does not wait and
4443
    does not check events, it will not remark this event)
4444
  * 6 = mouse event (something happened - button pressing or moving;
4445
    is reset at reading)
4446
  * 7 = IPC event (see function 60 -
4447
    Inter Process Communication; is reset at reading)
4448
  * 8 = network event (is reset at reading)
4449
  * 9 = debug event (is reset at reading; see
4450
    debug subsystem)
4451
  * 16..31 = event with appropriate IRQ
4452
    (16=IRQ0, 31=IRQ15) (is reset after reading all IRQ data)
4453
 
4454
======================================================================
4455
=================== Error codes of the file system ===================
4456
======================================================================
4457
  * 0 = success
4458
  * 1 = base and/or partition of a hard disk is not defined
4459
    (by subfunctions 7, 8 of function 21)
4460
  * 2 = function is not supported for the given file system
4461
  * 3 = unknown file system
4462
  * 4 = reserved, is never returned in the current implementation
4463
  * 5 = file not found
4464
  * 6 = end of file, EOF
4465
  * 7 = pointer lies outside of application memory
4466
  * 8 = disk is full
4467
  * 9 = FAT table is destroyed
4468
  * 10 = access denied
4469
  * 11 = device error
4470
Application start functions can return also following errors:
4471
  * 30 = 0x1E = not enough memory
4472
  * 31 = 0x1F = file is not executable
4473
  * 32 = 0x20 = too many processes