Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
346 diamond 1
SYSTEM FUNCTIONS of OS Kolibri 0.6.5.0
114 mikedld 2
 
3
Number of the function is located in the register eax.
118 diamond 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.
114 mikedld 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
133 diamond 13
working area. For skinned windows defines standard close and minimize
14
buttons.
114 mikedld 15
Parameters:
118 diamond 16
  * eax = 0 - function number
114 mikedld 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:
131 diamond 21
      * Y=0 - type I - fixed-size window
118 diamond 22
      * Y=1 - only define window area, draw nothing
131 diamond 23
      * Y=2 - type II - variable-size window
24
      * Y=3 - skinned window
118 diamond 25
      * other possible values (from 4 up to 15) are reserved,
114 mikedld 26
        function call with such Y is ignored
118 diamond 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)
114 mikedld 29
    * X = DCBA (bits)
118 diamond 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
303 mikedld 35
      * C = 1 - don't fill working area on window draw
118 diamond 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
114 mikedld 41
    * Y=0 - usual window, Y=1 - unmovable window
118 diamond 42
    * X defines a gradient of header: X=0 - no gradient,
114 mikedld 43
      X=8 - usual gradient,
44
      for windows of a type II X=4 - negative gradient
118 diamond 45
    * other values of X and Y are reserved
46
  * edi = 0x00RRGGBB - color of the frame
114 mikedld 47
Returned value:
48
  * function does not return value
49
Remarks:
118 diamond 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,
131 diamond 64
    and if it does not help too, the appropriate size
118 diamond 65
    (or, probably, both) is installed in a size of the screen.
114 mikedld 66
 
131 diamond 67
    Further let us designate xpos,ypos,xsize,ysize - values passed
68
    in ebx,ecx. The coordinates are resulted concerning
118 diamond 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:
114 mikedld 86
    * completely defined by the application
118 diamond 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
114 mikedld 92
    * draw header - rectangle with the left upper corner (4,4)
118 diamond 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 -
114 mikedld 96
      rectangle with the left upper corner (5,20) and right lower
118 diamond 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:
114 mikedld 102
    * draw external frame of width 1 pixel
118 diamond 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
114 mikedld 109
      (0,0) - (xsize,_skinh-1)
118 diamond 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)
133 diamond 114
    * define two standard buttons: close and minimize
114 mikedld 115
      (see function 8)
118 diamond 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
114 mikedld 120
 
121
======================================================================
118 diamond 122
================ Function 1 - put pixel in the window. ===============
114 mikedld 123
======================================================================
124
Parameters:
118 diamond 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)
114 mikedld 131
Returned value:
132
  * function does not return value
133
 
134
======================================================================
118 diamond 135
============ Function 2 - get the code of the pressed key. ===========
114 mikedld 136
======================================================================
137
Takes away the code of the pressed key from the buffer.
138
Parameters:
118 diamond 139
  * eax = 2 - function number
114 mikedld 140
Returned value:
118 diamond 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
114 mikedld 148
Remarks:
118 diamond 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.
114 mikedld 167
 
168
======================================================================
118 diamond 169
==================== Function 3 - get system time. ===================
114 mikedld 170
======================================================================
171
Parameters:
118 diamond 172
  * eax = 3 - function number
114 mikedld 173
Returned value:
174
  * eax = 0x00SSMMHH, where HH:MM:SS = Hours:Minutes:Seconds
118 diamond 175
  * each item is BCD-number, for example,
176
    for time 23:59:59 function returns 0x00595923
114 mikedld 177
Remarks:
118 diamond 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.
114 mikedld 182
 
183
======================================================================
118 diamond 184
============ Function 4 - draw text string in the window. ============
114 mikedld 185
======================================================================
186
Parameters:
118 diamond 187
  * eax = 4 - function number
114 mikedld 188
  * ebx = [coordinate on axis x]*65536 + [coordinate on axis y]
189
  * ecx = 0xX0RRGGBB, where
118 diamond 190
    * RR, GG, BB specify text color
139 diamond 191
    * X=ABnn (bits):
185 heavyiron 192
    * nn specifies the used font: 0=system monospaced,
193
      1=system font of variable width
139 diamond 194
    * A=0 - output esi characters, A=1 - output ASCIIZ-string
195
    * B=1 - fill background with the color edi
118 diamond 196
  * edx = pointer to the beginning of the string
139 diamond 197
  * esi = for A=0 length of the string, must not exceed 255;
198
          for A=1 is ignored
114 mikedld 199
Returned value:
200
  * function does not return value
201
Remarks:
118 diamond 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.
114 mikedld 206
 
207
======================================================================
118 diamond 208
========================= Function 5 - delay. ========================
114 mikedld 209
======================================================================
210
Delays execution of the program on the given time.
211
Parameters:
118 diamond 212
  * eax = 5 - function number
114 mikedld 213
  * ebx = time in the 1/100 of second
214
Returned value:
215
  * function does not return value
216
Remarks:
118 diamond 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.
114 mikedld 224
 
225
======================================================================
118 diamond 226
============== Function 6 - read the file from ramdisk. ==============
114 mikedld 227
======================================================================
228
Parameters:
118 diamond 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
114 mikedld 236
Returned value:
118 diamond 237
  * eax = file size in bytes, if the file was successfully read
238
  * eax = -1, if the file was not found
114 mikedld 239
Remarks:
118 diamond 240
  * This function is out-of-date; function 70 allows
241
    to fulfil the same operations with the extended possibilities.
114 mikedld 242
  * Block = 512 bytes.
118 diamond 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.
114 mikedld 256
 
257
======================================================================
258
=============== Function 7 - draw image in the window. ===============
259
======================================================================
118 diamond 260
Paramters:
261
  * eax = 7 - function number
262
  * ebx = pointer to the image in the format BBGGRRBBGGRR...
114 mikedld 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:
118 diamond 268
  * Coordinates of the image are coordinates of the upper left corner
269
    of the image relative to the window.
114 mikedld 270
  * Size of the image in bytes is 3*xsize*ysize.
271
 
272
======================================================================
273
=============== Function 8 - define/delete the button. ===============
274
======================================================================
118 diamond 275
Parameters for button definition:
276
  * eax = 8 - function number
114 mikedld 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
118 diamond 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
114 mikedld 284
      at pressing the button
118 diamond 285
  * esi = 0x00RRGGBB - color of the button
286
Parameters for button deleting:
287
  * eax = 8 - function number
114 mikedld 288
  * edx = 0x80nnnnnn, where nnnnnn - identifier of the button
289
Returned value:
290
  * function does not return value
291
Remarks:
118 diamond 292
  * Sizes of the button must be more than 0 and less than 0x8000.
131 diamond 293
  * For skinned windows definition of the window
118 diamond 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.
114 mikedld 303
 
304
======================================================================
118 diamond 305
============ Function 9 - information on execution thread. ===========
114 mikedld 306
======================================================================
307
Parameters:
118 diamond 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
114 mikedld 312
Returned value:
118 diamond 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)
114 mikedld 317
    * +4: word: position of the window of thread in the window stack
118 diamond 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
114 mikedld 321
    * +8: word: reserved
322
    * +10 = +0xA: 11 bytes: name of the process
118 diamond 323
      (name of corresponding executable file in the format 8+3)
142 diamond 324
    * +21 = +0x15: byte: reserved, this byte is not changed
114 mikedld 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)
118 diamond 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
142 diamond 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
114 mikedld 352
Remarks:
118 diamond 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
114 mikedld 363
    belong to one process.
118 diamond 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
114 mikedld 372
      16 Mb (0x1000000)
373
    * PID=1
142 diamond 374
    * coordinates and sizes of the window and the client area are by
375
      convention set to 0
118 diamond 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
193 diamond 382
    0x60400000 (kernel constant 'std_application_base_address').
118 diamond 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.
142 diamond 394
  * Coordinates of the client area are relative to the window.
118 diamond 395
  * At the moment only the part of the buffer by a size
142 diamond 396
    71 = 0x37 bytes is used. Nevertheless it is recommended to use
118 diamond 397
    1-Kb buffer for the future compatibility, in the future
398
    some fields can be added.
114 mikedld 399
 
400
======================================================================
118 diamond 401
==================== Function 10 - wait for event. ===================
114 mikedld 402
======================================================================
118 diamond 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.
114 mikedld 405
Then reads out the message from queue.
406
 
407
Parameters:
118 diamond 408
  * eax = 10 - function number
114 mikedld 409
Returned value:
118 diamond 410
  * eax = event (see the list of events)
114 mikedld 411
Remarks:
118 diamond 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.
114 mikedld 417
 
118 diamond 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.
114 mikedld 423
Parameters:
118 diamond 424
  * eax = 11 - function number
114 mikedld 425
Returned value:
426
  * eax = 0 - message queue is empty
118 diamond 427
  * else eax = event (see the list of events)
114 mikedld 428
Remarks:
118 diamond 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.
114 mikedld 434
 
435
======================================================================
118 diamond 436
=============== Function 12 - begin/end window redraw. ===============
114 mikedld 437
======================================================================
438
 
139 diamond 439
---------------- Subfunction 1 - begin window redraw. ----------------
114 mikedld 440
Parameters:
118 diamond 441
  * eax = 12 - function number
442
  * ebx = 1 - subfunction number
114 mikedld 443
Returned value:
444
  * function does not return value
445
 
139 diamond 446
----------------- Subfunction 2 - end window redraw. -----------------
114 mikedld 447
Parameters:
118 diamond 448
  * eax = 12 - function number
449
  * ebx = 2 - subfunction number
114 mikedld 450
Returned value:
451
  * function does not return value
452
Remarks:
118 diamond 453
  * Subfunction 1 deletes all buttons defined with
454
    function 8, they must be defined again.
114 mikedld 455
 
456
======================================================================
457
============ Function 13 - draw a rectangle in the window. ===========
458
======================================================================
459
Parameters:
118 diamond 460
  * eax = 13 - function number
114 mikedld 461
  * ebx = [coordinate on axis x]*65536 + [size on axis x]
462
  * ecx = [coordinate on axis y]*65536 + [size on axis y]
118 diamond 463
  * edx = color 0xRRGGBB or 0x80RRGGBB for gradient fill
114 mikedld 464
Returned value:
465
  * function does not return value
466
Remarks:
467
  * Coordinates are understood as coordinates of the left upper corner
118 diamond 468
    of a rectangle relative to the window.
114 mikedld 469
 
470
======================================================================
118 diamond 471
=================== Function 14 - get screen size. ===================
114 mikedld 472
======================================================================
473
Parameters:
118 diamond 474
  * eax = 14 - function number
114 mikedld 475
Returned value:
476
  * eax = [xsize]*65536 + [ysize], where
477
  * xsize = x-coordinate of the right lower corner of the screen =
118 diamond 478
            horizontal size - 1
114 mikedld 479
  * ysize = y-coordinate of the right lower corner of the screen =
118 diamond 480
            vertical size - 1
114 mikedld 481
Remarks:
118 diamond 482
  * See also subfunction 5 of function 48 - get sizes of
483
    working area of the screen.
114 mikedld 484
 
118 diamond 485
======================================================================
486
== Function 15, subfunction 1 - set a size of the background image. ==
487
======================================================================
114 mikedld 488
Parameters:
118 diamond 489
  * eax = 15 - function number
490
  * ebx = 1 - subfunction number
114 mikedld 491
  * ecx = width of the image
492
  * edx = height of the image
493
Returned value:
494
  * function does not return value
495
Remarks:
118 diamond 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.
114 mikedld 504
 
505
======================================================================
118 diamond 506
=== Function 15, subfunction 2 - put pixel on the background image. ==
114 mikedld 507
======================================================================
508
Parameters:
118 diamond 509
  * eax = 15 - function number
510
  * ebx = 2 - subfunction number
114 mikedld 511
  * ecx = offset
118 diamond 512
  * edx = color of a pixel 0xRRGGBB
114 mikedld 513
Returned value:
514
  * function does not return value
515
Remarks:
118 diamond 516
  * Offset for a pixel with coordinates (x,y) is calculated as
114 mikedld 517
    (x+y*xsize)*3.
118 diamond 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.
114 mikedld 524
 
525
======================================================================
526
=========== Function 15, subfunction 3 - redraw background. ==========
527
======================================================================
528
Parameters:
118 diamond 529
  * eax = 15 - function number
530
  * ebx = 3 - subfunction number
114 mikedld 531
Returned value:
532
  * function does not return value
533
 
118 diamond 534
======================================================================
535
== Function 15, subfunction 4 - set drawing mode for the background. =
536
======================================================================
114 mikedld 537
Parameters:
118 diamond 538
  * eax = 15 - function number
539
  * ebx = 4 - subfunction number
540
  * ecx = drawing mode:
114 mikedld 541
    * 1 = tile
542
    * 2 = stretch
543
Returned value:
544
  * function does not return value
545
Remarks:
118 diamond 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.
114 mikedld 550
 
118 diamond 551
======================================================================
552
===================== Function 15, subfunction 5 =====================
553
============ Put block of pixels on the background image. ============
554
======================================================================
114 mikedld 555
Parameters:
118 diamond 556
  * eax = 15 - function number
557
  * ebx = 5 - subfunction number
558
  * ecx = pointer to the data in the format BBGGRRBBGGRR...
114 mikedld 559
  * edx = offset in data of the background image
118 diamond 560
  * esi = size of data in bytes = 3 * number of pixels
114 mikedld 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.
118 diamond 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.
114 mikedld 572
 
573
======================================================================
118 diamond 574
=============== Function 16 - save ramdisk on a floppy. ==============
114 mikedld 575
======================================================================
576
Parameters:
118 diamond 577
  * eax = 16 - function number
578
  * ebx = 1 or ebx = 2 - on which floppy save
114 mikedld 579
Returned value:
118 diamond 580
  * eax = 0 - success
114 mikedld 581
  * eax = 1 - error
582
 
583
======================================================================
118 diamond 584
======= Function 17 - get the identifier of the pressed button. ======
114 mikedld 585
======================================================================
586
Takes away the code of the pressed button from the buffer.
587
Parameters:
118 diamond 588
  * eax = 17 - function number
114 mikedld 589
Returned value:
118 diamond 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).
114 mikedld 595
Remarks:
118 diamond 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".
114 mikedld 600
 
601
======================================================================
118 diamond 602
============ Function 18, subfunction 1 - system shutdown. ===========
114 mikedld 603
======================================================================
604
Parameters:
118 diamond 605
  * eax = 18 - function number
606
  * ebx = 1 - subfunction number
114 mikedld 607
Returned value:
118 diamond 608
  * function always return eax = 0 as tag of success
114 mikedld 609
Remarks:
118 diamond 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.
114 mikedld 614
 
615
======================================================================
118 diamond 616
= Function 18, subfunction 2 - terminate process/thread by the slot. =
114 mikedld 617
======================================================================
618
Parameters:
118 diamond 619
  * eax = 18 - function number
620
  * ebx = 2 - subfunction number
114 mikedld 621
  * ecx = number of the slot of process/thread
622
Returned value:
623
  * function does not return value
624
Remarks:
118 diamond 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.
114 mikedld 630
 
118 diamond 631
======================================================================
632
===================== Function 18, subfunction 3 =====================
633
============= Make active the window of the given thread. ============
634
======================================================================
114 mikedld 635
Parameters:
118 diamond 636
  * eax = 18 - function number
637
  * ebx = 3 - subfunction number
638
  * ecx = number of the thread slot
114 mikedld 639
Returned value:
640
  * function does not return value
641
Remarks:
118 diamond 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.
114 mikedld 645
 
118 diamond 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').
114 mikedld 652
 
653
Parameters:
118 diamond 654
  * eax = 18 - function number
655
  * ebx = 4 - subfunction number
114 mikedld 656
Returned value:
118 diamond 657
  * eax = value of the counter of idle time units per one second
114 mikedld 658
 
659
======================================================================
118 diamond 660
========== Function 18, subfunction 5 - get CPU clock rate. ==========
114 mikedld 661
======================================================================
662
Parameters:
118 diamond 663
  * eax = 18 - function number
664
  * ebx = 5 - subfunction number
114 mikedld 665
Returned value:
118 diamond 666
  * eax = clock rate (modulo 2^32 clock ticks = 4GHz)
114 mikedld 667
 
118 diamond 668
======================================================================
669
 Function 18, subfunction 6 - save ramdisk to the file on hard drive.
670
======================================================================
114 mikedld 671
Parameters:
118 diamond 672
  * eax = 18 - function number
673
  * ebx = 6 - subfunction number
341 heavyiron 674
  * ecx = pointer to the full path to file
675
    (for example, "/hd0/1/kolibri/kolibri.img")
114 mikedld 676
Returned value:
118 diamond 677
  * eax = 0 - success
678
  * else eax = error code of the file system
346 diamond 679
Замечания:
118 diamond 680
  * All folders in the given path must exist, otherwise function
681
    returns value 5, "file not found".
114 mikedld 682
 
683
======================================================================
118 diamond 684
=========== Function 18, subfunction 7 - get active window. ==========
114 mikedld 685
======================================================================
686
Parameters:
118 diamond 687
  * eax = 18 - function number
688
  * ebx = 7 - subfunction number
114 mikedld 689
Returned value:
118 diamond 690
  * eax = number of the active window
691
    (number of the slot of the thread with active window)
114 mikedld 692
Remarks:
118 diamond 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.
114 mikedld 696
 
118 diamond 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.
114 mikedld 703
 
118 diamond 704
------------------- Subsubfunction 1 - get status. -------------------
114 mikedld 705
Parameters:
118 diamond 706
  * eax = 18 - function number
707
  * ebx = 8 - subfunction number
708
  * ecx = 1 - number of the subsubfunction
114 mikedld 709
Returned value:
118 diamond 710
  * eax = 0 - speaker sound is enabled; 1 - disabled
114 mikedld 711
 
118 diamond 712
----------------- Subsubfunction 2 - toggle status. ------------------
713
Toggles states of disable/enable.
114 mikedld 714
Parameters:
118 diamond 715
  * eax = 18 - function number
716
  * ebx = 8 - subfunction number
717
  * ecx = 2 - number of the subsubfunction
114 mikedld 718
Returned value:
719
  * function does not return value
720
 
118 diamond 721
======================================================================
722
== Function 18, subfunction 9 - system shutdown with the parameter. ==
723
======================================================================
114 mikedld 724
Parameters:
118 diamond 725
  * eax = 18 - function number
726
  * ebx = 9 - subfunction number
114 mikedld 727
  * ecx = parameter:
118 diamond 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
114 mikedld 734
Returned value:
118 diamond 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
114 mikedld 738
Remarks:
118 diamond 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.
114 mikedld 748
 
118 diamond 749
======================================================================
750
===== Function 18, subfunction 10 - minimize application window. =====
751
======================================================================
752
Minimizes the own window.
114 mikedld 753
Parameters:
118 diamond 754
  * eax = 18 - function number
755
  * ebx = 10 - subfunction number
114 mikedld 756
Returned value:
757
  * function does not return value
758
Remarks:
118 diamond 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'.
114 mikedld 769
 
770
======================================================================
118 diamond 771
 Function 18, subfunction 11 - get information on the disk subsystem.
114 mikedld 772
======================================================================
773
Parameters:
118 diamond 774
  * eax = 18 - function number
775
  * ebx = 11 - subfunction number
114 mikedld 776
  * ecx = type of the table:
777
    * 1 = short version, 10 bytes
778
    * 2 = full version, 65536 bytes
118 diamond 779
  * edx = pointer to the buffer (in the application) for the table
114 mikedld 780
Returned value:
781
  * function does not return value
118 diamond 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:
114 mikedld 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''
118 diamond 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,
114 mikedld 796
    where AA corresponds to the controller IDE0, ..., DD - IDE3:
797
    * 0 = device is absent
118 diamond 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
277 diamond 808
    supports only FAT16, FAT32 and NTFS for hard disks.
114 mikedld 809
  * +6: 4 db: reserved
118 diamond 810
Format of the table: full version:
811
  * +0: 10 db: same as for the short version
114 mikedld 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
118 diamond 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):
114 mikedld 821
  * +0: dword: first physical sector of the partition
822
  * +4: dword: last physical sector of the partition
118 diamond 823
    (belongs to the partition)
277 diamond 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
114 mikedld 828
Remarks:
118 diamond 829
  * The short table can be used for obtaining the information about
830
    available devices.
114 mikedld 831
 
832
======================================================================
118 diamond 833
========== Function 18, subfunction 13 - get kernel version. =========
114 mikedld 834
======================================================================
835
Parameters:
118 diamond 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
114 mikedld 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
118 diamond 845
db 'name',0 - ASCIIZ-string with the name
346 diamond 846
For Kolibri 0.6.5.0 kernel:
847
db 0,6,5,0
114 mikedld 848
db 2
849
db 'Kolibri',0
850
 
118 diamond 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.
114 mikedld 856
Parameters:
118 diamond 857
  * eax = 18 - function number
858
  * ebx = 14 - subfunction number
114 mikedld 859
Returned value:
118 diamond 860
  * eax = 0 as the tag of success
114 mikedld 861
Remarks:
118 diamond 862
  * Function is intended only for active high-efficiency graphics
114 mikedld 863
    applications; is used for smooth output of a graphics.
864
 
118 diamond 865
======================================================================
866
== Function 18, subfunction 15 - center mouse cursor on the screen. ==
867
======================================================================
114 mikedld 868
Parameters:
118 diamond 869
  * eax = 18 - function number
870
  * ebx = 15 - subfunction number
114 mikedld 871
Returned value:
118 diamond 872
  * eax = 0 as the tag of success
114 mikedld 873
 
874
======================================================================
118 diamond 875
========= Function 18, subfunction 16 - get size of free RAM. ========
114 mikedld 876
======================================================================
877
Parameters:
118 diamond 878
  * eax = 18 - function number
879
  * ebx = 16 - subfunction number
114 mikedld 880
Returned value:
881
  * eax = size of free memory in kilobytes
882
 
883
======================================================================
118 diamond 884
======== Function 18, subfunction 17 - get full amount of RAM. =======
114 mikedld 885
======================================================================
886
Parameters:
118 diamond 887
  * eax = 18 - function number
888
  * ebx = 17 - subfunction number
114 mikedld 889
Returned value:
118 diamond 890
  * eax = total size of existing memory in kilobytes
114 mikedld 891
 
892
======================================================================
118 diamond 893
===================== Function 18, subfunction 18 ====================
894
============= Terminate process/thread by the identifier. ============
114 mikedld 895
======================================================================
896
Parameters:
118 diamond 897
  * eax = 18 - function number
898
  * ebx = 18 - subfunction number
899
  * ecx = identifer of process/thread (PID/TID)
114 mikedld 900
Returned value:
118 diamond 901
  * eax = 0 - success
902
  * eax = -1 - error (process is not found or is system)
114 mikedld 903
Remarks:
118 diamond 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.
114 mikedld 908
 
909
======================================================================
131 diamond 910
======== Function 18, subfunction 19 - get/set mouse features. =======
120 mario79 911
======================================================================
131 diamond 912
 
913
---------------- Subsubfunction 0 - get mouse speed. -----------------
120 mario79 914
Parameters:
915
  * eax = 18 - function number
916
  * ebx = 19 - subfunction number
131 diamond 917
  * ecx = 0 - subsubfunction number
918
Returned value:
919
  * eax = current mouse speed
120 mario79 920
 
131 diamond 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
120 mario79 929
 
131 diamond 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
120 mario79 937
 
131 diamond 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
120 mario79 946
 
131 diamond 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
120 mario79 955
Remarks:
131 diamond 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.
133 diamond 966
    Mouse delay can be regulated through the application SETUP.
131 diamond 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.
120 mario79 971
 
972
======================================================================
193 diamond 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
======================================================================
118 diamond 997
==================== Function 20 - MIDI interface. ===================
114 mikedld 998
======================================================================
999
 
118 diamond 1000
----------------------- Subfunction 1 - reset ------------------------
114 mikedld 1001
Parameters:
118 diamond 1002
  * eax = 20 - function number
1003
  * ebx = 1 - subfunction number
114 mikedld 1004
 
1005
-------------------- Subfunction 2 - output byte ---------------------
1006
Parameters:
118 diamond 1007
  * eax = 20 - function number
1008
  * ebx = 2 - subfunction number
114 mikedld 1009
  * cl = byte for output
118 diamond 1010
Returned value (is the same for both subfunctions):
1011
  * eax = 0 - success
114 mikedld 1012
  * eax = 1 - base port is not defined
1013
Remarks:
118 diamond 1014
  * Previously the base port must be defined by
1015
    subfunction 1 of function 21.
114 mikedld 1016
 
1017
======================================================================
118 diamond 1018
======== Function 21, subfunction 1 - set MPU MIDI base port. ========
114 mikedld 1019
======================================================================
1020
Parameters:
118 diamond 1021
  * eax = 21 - function number
1022
  * ebx = 1 - subfunction number
1023
  * ecx = number of base port
1024
Returned value
1025
  * eax = 0 - success
114 mikedld 1026
  * eax = -1 - erratic number of a port
1027
Remarks:
118 diamond 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.
114 mikedld 1031
 
1032
======================================================================
118 diamond 1033
========== Function 21, subfunction 2 - set keyboard layout. =========
114 mikedld 1034
======================================================================
118 diamond 1035
Keyboard layout is used to convert keyboard scancodes to ASCII-codes,
1036
which will be read by function 2.
114 mikedld 1037
Parameters:
118 diamond 1038
  * eax = 21 - function number
1039
  * ebx = 2 - subfunction number
1040
  * ecx = which layout to set:
114 mikedld 1041
    * 1 = normal layout
1042
    * 2 = layout at pressed Shift
1043
    * 3 = layout at pressed Alt
118 diamond 1044
  * edx = pointer to layout - table of length 128 bytes
114 mikedld 1045
Or:
1046
  * ecx = 9
118 diamond 1047
  * dx = country identifier (1=eng, 2=fi, 3=ger, 4=rus)
114 mikedld 1048
Returned value:
118 diamond 1049
  * eax = 0 - success
1050
  * eax = 1 - incorrect parameter
114 mikedld 1051
Remarks:
118 diamond 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.
114 mikedld 1064
 
1065
======================================================================
118 diamond 1066
============== Function 21, subfunction 3 - set CD base. =============
114 mikedld 1067
======================================================================
1068
Parameters:
118 diamond 1069
  * eax = 21 - function number
1070
  * ebx = 3 - subfunction number
1071
  * ecx = CD base: 1=IDE0, 2=IDE1, 3=IDE2, 4=IDE3
114 mikedld 1072
Returned value:
1073
  * eax = 0
1074
Remarks:
118 diamond 1075
  * CD base is used by function 24.
1076
  * To get CD base use subfunction 3 of function 26.
114 mikedld 1077
 
1078
======================================================================
118 diamond 1079
====== Function 21, subfunction 4 - set Sound Blaster base port. =====
114 mikedld 1080
======================================================================
1081
Parameters:
118 diamond 1082
  * eax = 21 - function number
1083
  * ebx = 4 - subfunction number
1084
  * ecx = number of the base port
114 mikedld 1085
Returned value:
118 diamond 1086
  * eax = 0 - success
1087
  * eax = -1 - erratic port number
114 mikedld 1088
Remarks:
118 diamond 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.
114 mikedld 1093
 
1094
======================================================================
118 diamond 1095
========== Function 21, subfunction 5 - set system language. =========
114 mikedld 1096
======================================================================
1097
Parameters:
118 diamond 1098
  * eax = 21 - function number
1099
  * ebx = 5 - subfunction number
1100
  * ecx = system language (1=eng, 2=fi, 3=ger, 4=rus)
114 mikedld 1101
Returned value:
1102
  * eax = 0
1103
Remarks:
118 diamond 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.
114 mikedld 1110
 
1111
======================================================================
118 diamond 1112
============== Function 21, subfunction 7 - set HD base. =============
114 mikedld 1113
======================================================================
118 diamond 1114
The HD base defines hard disk to write with usage of obsolete
346 diamond 1115
syntax /HD in obsolete function 58; at usage of modern syntax
1116
/HD0,/HD1,/HD2,/HD3 base is set automatically.
114 mikedld 1117
Parameters:
118 diamond 1118
  * eax = 21 - function number
1119
  * ebx = 7 - subfunction number
1120
  * ecx = HD base: 1=IDE0, 2=IDE1, 3=IDE2, 4=IDE3
114 mikedld 1121
Returned value:
1122
  * eax = 0
1123
Remarks:
118 diamond 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.
114 mikedld 1130
 
1131
======================================================================
118 diamond 1132
========= Function 21, subfunction 8 - set used HD partition. ========
114 mikedld 1133
======================================================================
118 diamond 1134
The HD partition defines partition of the hard disk to write with
346 diamond 1135
usage of obsolete syntax /HD and obsolete function 58;
118 diamond 1136
at usage of functions 58 and 70 and modern syntax /HD0,/HD1,/HD2,/HD3
346 diamond 1137
base and partition are set automatically.
114 mikedld 1138
Parameters:
118 diamond 1139
  * eax = 21 - function number
1140
  * ebx = 8 - subfunction number
1141
  * ecx = HD partition (beginning from 1)
1142
Return value:
114 mikedld 1143
  * eax = 0
1144
Remarks:
118 diamond 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.
114 mikedld 1153
 
1154
======================================================================
118 diamond 1155
======== Function 21, subfunction 10 - set sound DMA channel. ========
114 mikedld 1156
======================================================================
1157
Parameters:
118 diamond 1158
  * eax = 21 - function number
1159
  * ebx = 10 - subfunction number
114 mikedld 1160
  * ecx = number of channel (from 0 up to 3 inclusively)
1161
Returned value:
118 diamond 1162
  * eax = 0 - success
1163
  * eax = -1 - incorrect channel number
114 mikedld 1164
Remarks:
118 diamond 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.
114 mikedld 1167
 
1168
======================================================================
118 diamond 1169
 Function 21, subfunction 11 - enable/disable low-level access to HD.
114 mikedld 1170
======================================================================
1171
Parameters:
118 diamond 1172
  * eax = 21 - function number
1173
  * ebx = 11 - subfunction number
1174
  * ecx = 0/1 - disable/enable
114 mikedld 1175
Returned value:
1176
  * eax = 0
1177
Remarks:
118 diamond 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.
114 mikedld 1181
 
1182
======================================================================
118 diamond 1183
 Function 21, subfunction 12 - enable/disable low-level access to PCI.
114 mikedld 1184
======================================================================
1185
Parameters:
118 diamond 1186
  * eax = 21 - function number
1187
  * ebx = 12 - subfunction number
1188
  * ecx = 0/1 - disable/enable
114 mikedld 1189
Returned value:
1190
  * eax = 0
1191
Remarks:
118 diamond 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.
114 mikedld 1195
 
1196
======================================================================
118 diamond 1197
============ Function 21, subfunction 13, subsubfunction 1 ===========
1198
======== Initialize + get information on the driver vmode.mdr. =======
114 mikedld 1199
======================================================================
1200
Parameters:
118 diamond 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
114 mikedld 1205
Returned value:
118 diamond 1206
  * if driver is not loaded
1207
    (never happens in the current implementation):
114 mikedld 1208
    * eax = -1
118 diamond 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
114 mikedld 1216
Format of the buffer:
118 diamond 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)
114 mikedld 1228
Remarks:
118 diamond 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.
114 mikedld 1234
 
1235
======================================================================
118 diamond 1236
============ Function 21, subfunction 13, subsubfunction 2 ===========
1237
================ Get information on current videomode. ===============
114 mikedld 1238
======================================================================
1239
Parameters:
118 diamond 1240
  * eax = 21 - function number
1241
  * ebx = 13 - subfunction number
1242
  * ecx = 2 - number of the driver function
114 mikedld 1243
Returned value:
118 diamond 1244
  * eax = -1 - driver is not loaded or not initialized;
1245
    ebx,ecx are destroyed
114 mikedld 1246
  * eax = [width]*65536 + [height]
118 diamond 1247
  * ebx = frequency of the vertical scanning (in Hz)
114 mikedld 1248
  * ecx = number of current videomode
1249
Remarks:
118 diamond 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.
114 mikedld 1255
 
1256
======================================================================
118 diamond 1257
=== Function 21, subfunction 13, subsubfunction 3 - set videomode. ===
114 mikedld 1258
======================================================================
1259
Parameters:
118 diamond 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]
114 mikedld 1264
Returned value:
118 diamond 1265
  * eax = -1 - driver is not loaded, not initialized or
1266
    an error has occured
1267
  * eax = 0 - success
1268
  * ebx, ecx destroyed
114 mikedld 1269
Remarks:
118 diamond 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.
114 mikedld 1273
 
1274
======================================================================
118 diamond 1275
============ Function 21, subfunction 13, subsubfunction 4 ===========
1276
================== Return to the initial videomode. ==================
114 mikedld 1277
======================================================================
118 diamond 1278
Returns the screen to the videomode set at system boot.
114 mikedld 1279
Parameters:
118 diamond 1280
  * eax = 21 - function number
1281
  * ebx = 13 - subfunction number
1282
  * ecx = 4 - number of the driver function
114 mikedld 1283
Returned value:
118 diamond 1284
  * eax = -1 - driver is not loaded or not initialized
1285
  * eax = 0 - success
1286
  * ebx, ecx destroyed
114 mikedld 1287
Remarks:
118 diamond 1288
  * Driver must be initialized by call to driver function 1.
114 mikedld 1289
 
118 diamond 1290
======================================================================
1291
============ Function 21, subfunction 13, subsubfunction 5 ===========
1292
===== Increase/decrease the size of the visible area of monitor. =====
1293
======================================================================
114 mikedld 1294
Parameters:
118 diamond 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
114 mikedld 1301
Returned value:
118 diamond 1302
  * eax = -1 - driver is not loaded or not initialized
1303
  * eax = 0 - success
1304
  * ebx, ecx destroyed
114 mikedld 1305
Remarks:
118 diamond 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.
114 mikedld 1309
 
1310
======================================================================
118 diamond 1311
================= Function 22 - set system date/time. ================
114 mikedld 1312
======================================================================
1313
Parameters:
118 diamond 1314
  * eax = 22 - function number
1315
  * ebx = 0 - set time
1316
    * ecx = 0x00SSMMHH - time in the binary-decimal code (BCD):
114 mikedld 1317
    * HH=hour 00..23
1318
    * MM=minute 00..59
1319
    * SS=second 00..59
118 diamond 1320
  * ebx = 1 - set date
1321
    * ecx = 0x00DDMMYY - date in the binary-decimal code (BCD):
114 mikedld 1322
    * DD=day 01..31
1323
    * MM=month 01..12
1324
    * YY=year 00..99
118 diamond 1325
  * ebx = 2 - set day of week
114 mikedld 1326
    * ecx = 1 for Sunday, ..., 7 for Saturday
118 diamond 1327
  * ebx = 3 - set alarm clock
114 mikedld 1328
    * ecx = 0x00SSMMHH
1329
Returned value:
118 diamond 1330
  * eax = 0 - success
1331
  * eax = 1 - incorrect parameter
114 mikedld 1332
  * eax = 2 - CMOS-battery was unloaded
1333
Remarks:
118 diamond 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.
114 mikedld 1347
 
1348
======================================================================
118 diamond 1349
============= Function 23 - wait for event with timeout. =============
114 mikedld 1350
======================================================================
118 diamond 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.
114 mikedld 1353
 
1354
Parameters:
118 diamond 1355
  * eax = 23 - function number
114 mikedld 1356
  * ebx = timeout (in 1/100 of second)
1357
Returned value:
118 diamond 1358
  * eax = 0 - the message queue is empty
1359
  * otherwise eax = event (see the list of events)
114 mikedld 1360
Remarks:
118 diamond 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.
114 mikedld 1370
 
1371
======================================================================
118 diamond 1372
======== Function 24, subfunction 1 - begin to play CD-audio. ========
114 mikedld 1373
======================================================================
1374
Parameters:
118 diamond 1375
  * eax = 24 - function number
1376
  * ebx = 1 - subfunction number
114 mikedld 1377
  * ecx = 0x00FRSSMM, where
118 diamond 1378
    * MM = starting minute
1379
    * SS = starting second
1380
    * FR = starting frame
114 mikedld 1381
Returned value:
118 diamond 1382
  * eax = 0 - success
1383
  * eax = 1 - CD base is not defined
114 mikedld 1384
Remarks:
118 diamond 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).
114 mikedld 1389
 
1390
======================================================================
118 diamond 1391
======= Function 24, subfunction 2 - get information on tracks. ======
114 mikedld 1392
======================================================================
1393
Parameters:
118 diamond 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)
114 mikedld 1398
Returned value:
118 diamond 1399
  * eax = 0 - success
1400
  * eax = 1 - CD base is not defined
114 mikedld 1401
Remarks:
118 diamond 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.
114 mikedld 1409
 
1410
======================================================================
118 diamond 1411
========== Function 24, subfunction 3 - stop play CD-audio. ==========
114 mikedld 1412
======================================================================
1413
Parameters:
118 diamond 1414
  * eax = 24 - function number
1415
  * ebx = 1 - subfunction number
114 mikedld 1416
Returned value:
118 diamond 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.
114 mikedld 1422
 
1423
======================================================================
118 diamond 1424
=================== Function 25 - set SBPro volume. ==================
114 mikedld 1425
======================================================================
1426
Parameters:
118 diamond 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
114 mikedld 1433
Returned value:
118 diamond 1434
  * eax = 0 - success
1435
  * eax = 1 - SB base is not defined
114 mikedld 1436
  * eax = 2 - incorrect subfunction
1437
Remarks:
118 diamond 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.
114 mikedld 1442
 
1443
======================================================================
118 diamond 1444
======== Function 26, subfunction 1 - get MPU MIDI base port. ========
114 mikedld 1445
======================================================================
1446
Parameters:
118 diamond 1447
  * eax = 26 - function number
1448
  * ebx = 1 - subfunction number
114 mikedld 1449
Returned value:
118 diamond 1450
  * eax = port number
1451
Parameters:
1452
  * To set base port use subfunction 1 of function 21.
114 mikedld 1453
 
1454
======================================================================
1455
========== Function 26, subfunction 2 - get keyboard layout. =========
1456
======================================================================
118 diamond 1457
The keyboard layout is used to convert keyboard scancodes to
1458
ASCII-codes for function 2.
114 mikedld 1459
Parameters:
118 diamond 1460
  * eax = 26 - function number
1461
  * ebx = 2 - subfunction number
114 mikedld 1462
  * ecx = what layout to get:
1463
    * 1 = normal layout
118 diamond 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
114 mikedld 1468
Returned value:
1469
  * function does not return value
118 diamond 1470
Or:
1471
  * eax = 26 - function number
1472
  * ebx = 2 - subfunction number
114 mikedld 1473
  * ecx = 9
1474
Returned value:
118 diamond 1475
  * eax = country identifier (1=eng, 2=fi, 3=ger, 4=rus)
114 mikedld 1476
Remarks:
118 diamond 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.
114 mikedld 1489
 
1490
======================================================================
118 diamond 1491
============== Function 26, subfunction 3 - get CD base. =============
114 mikedld 1492
======================================================================
1493
Parameters:
118 diamond 1494
  * eax = 26 - function number
1495
  * ebx = 3 - subfunction number
114 mikedld 1496
Returned value:
118 diamond 1497
  * eax = CD base: 1=IDE0, 2=IDE1, 3=IDE2, 4=IDE3
114 mikedld 1498
Remarks:
118 diamond 1499
  * CD base is used by function 24.
1500
  * To set CD base use subfunction 3 of function 21.
114 mikedld 1501
 
1502
======================================================================
118 diamond 1503
====== Function 26, subfunction 4 - get Sound Blaster base port. =====
114 mikedld 1504
======================================================================
1505
Parameters:
118 diamond 1506
  * eax = 26 - function number
1507
  * ebx = 4 - subfunction number
114 mikedld 1508
Returned value:
118 diamond 1509
  * eax = base port number
114 mikedld 1510
Remarks:
118 diamond 1511
  * Bae port is used by functions 25, 55.
1512
  * To set base port use subfunction 4 of function 21.
114 mikedld 1513
 
1514
======================================================================
118 diamond 1515
========== Function 26, subfunction 5 - get system language. =========
114 mikedld 1516
======================================================================
1517
Parameters:
118 diamond 1518
  * eax = 26 - function number
1519
  * ebx = 5 - subfunction number
114 mikedld 1520
Returned value:
118 diamond 1521
  * eax = system language (1=eng, 2=fi, 3=ger, 4=rus)
114 mikedld 1522
Remarks:
118 diamond 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.
114 mikedld 1527
 
1528
======================================================================
118 diamond 1529
============== Function 26, subfunction 7 - get HD base. =============
114 mikedld 1530
======================================================================
118 diamond 1531
The HD base defines hard disk to write with usage of obsolete
346 diamond 1532
syntax /HD in obsolete function 58; at usage of modern syntax
1533
/HD0,/HD1,/HD2,/HD3 base is set automatically.
114 mikedld 1534
Parameters:
118 diamond 1535
  * eax = 26 - function number
1536
  * ebx = 7 - subfunction number
114 mikedld 1537
Returned value:
118 diamond 1538
  * eax = HD base: 1=IDE0, 2=IDE1, 3=IDE2, 4=IDE3
114 mikedld 1539
Remarks:
118 diamond 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.
114 mikedld 1543
 
1544
======================================================================
118 diamond 1545
========= Function 26, subfunction 8 - get used HD partition. ========
114 mikedld 1546
======================================================================
118 diamond 1547
The HD partition defines partition of the hard disk to write with
346 diamond 1548
usage of obsolete syntax /HD in obsolete function 58;
118 diamond 1549
at usage of functions 58 and 70 and modern syntax /HD0,/HD1,/HD2,/HD3
346 diamond 1550
base and partition are set automatically.
114 mikedld 1551
Parameters:
118 diamond 1552
  * eax = 26 - function number
1553
  * ebx = 8 - subfunction number
114 mikedld 1554
Returned value:
118 diamond 1555
  * eax = HD partition (beginning from 1)
114 mikedld 1556
Remarks:
118 diamond 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.
114 mikedld 1562
 
1563
======================================================================
118 diamond 1564
=== Function 26, subfunction 9 - get the value of the time counter. ==
114 mikedld 1565
======================================================================
1566
Parameters:
118 diamond 1567
  * eax = 26 - function number
1568
  * ebx = 9 - subfunction number
114 mikedld 1569
Returned value:
118 diamond 1570
  * eax = number of 1/100s of second, past from the system boot time
114 mikedld 1571
Remarks:
118 diamond 1572
  * Counter takes modulo 2^32, that correspond to a little more
1573
    than 497 days.
1574
  * To get system time use function 3.
114 mikedld 1575
 
1576
======================================================================
118 diamond 1577
======== Function 26, subfunction 10 - get sound DMA channel. ========
114 mikedld 1578
======================================================================
1579
Parameters:
118 diamond 1580
  * eax = 26 - function number
1581
  * ebx = 10 - subfunction number
114 mikedld 1582
Returned value:
118 diamond 1583
  * eax = number of the channel (from 0 to 3 inclusive)
114 mikedld 1584
Remarks:
118 diamond 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.
114 mikedld 1587
 
1588
======================================================================
118 diamond 1589
===================== Function 26, subfunction 11 ====================
1590
========== Find out whether low-level HD access is enabled. ==========
114 mikedld 1591
======================================================================
1592
Parameters:
118 diamond 1593
  * eax = 26 - function number
1594
  * ebx = 11 - subfunction number
114 mikedld 1595
Returned value:
118 diamond 1596
  * eax = 0/1 - disabled/enabled
114 mikedld 1597
Remarks:
118 diamond 1598
  * Is used in LBA read (subfunction 8 of function 58).
1599
  * To set current state use subfunction 11 of function 21.
114 mikedld 1600
 
1601
======================================================================
118 diamond 1602
===================== Function 26, subfunction 12 ====================
1603
========== Find out whether low-level PCI access is enabled. =========
114 mikedld 1604
======================================================================
1605
Parameters:
118 diamond 1606
  * eax = 26 - function number
1607
  * ebx = 12 - subfunction number
114 mikedld 1608
Returned value:
118 diamond 1609
  * eax = 0/1 - disabled/enabled
114 mikedld 1610
Remarks:
118 diamond 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.
114 mikedld 1614
 
1615
======================================================================
118 diamond 1616
=================== Function 28 - set SB16 volume. ===================
114 mikedld 1617
======================================================================
1618
Parameters:
118 diamond 1619
  * eax = 28 - function number
114 mikedld 1620
  * ebx = what to install:
1621
    * 1 - install common volume
118 diamond 1622
    * 2 - install CD-audio volume
1623
  * cl = volume level (0=off, 0xFF=max)
114 mikedld 1624
Returned value:
118 diamond 1625
  * eax = 0 - success
1626
  * eax = 1 - SB base is not defined
114 mikedld 1627
  * eax = 2 - incorrect subfunction
1628
Remarks:
118 diamond 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.
114 mikedld 1632
 
1633
======================================================================
118 diamond 1634
=================== Function 29 - get system date. ===================
114 mikedld 1635
======================================================================
1636
Parameters:
118 diamond 1637
  * eax = 29 - function number
114 mikedld 1638
Returned value:
1639
  * eax = 0x00DDMMYY, where
118 diamond 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)
114 mikedld 1644
Remarks:
118 diamond 1645
  * To set system date use function 22.
114 mikedld 1646
 
1647
======================================================================
118 diamond 1648
=============== Function 32 - delete file from ramdisk. ==============
114 mikedld 1649
======================================================================
1650
Parameters:
118 diamond 1651
  * eax = 32 - function number
1652
  * ebx = pointer to the filename
114 mikedld 1653
Returned value:
118 diamond 1654
  * eax = 0 - success; otherwise file system error code
114 mikedld 1655
Remarks:
118 diamond 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.
114 mikedld 1669
 
1670
======================================================================
118 diamond 1671
================ Function 33 - write file to ramdisk. ================
114 mikedld 1672
======================================================================
1673
Parameters:
118 diamond 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
114 mikedld 1679
Returned value:
118 diamond 1680
  * eax = 0 - success, otherwise file system error code
114 mikedld 1681
Remarks:
118 diamond 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.
114 mikedld 1696
 
1697
======================================================================
118 diamond 1698
======= Function 35 - read the color of a pixel on the screen. =======
114 mikedld 1699
======================================================================
1700
Parameters:
1701
  * eax = 35
1702
  * ebx = y*xsize+x, where
118 diamond 1703
  * (x,y) = coordinates of a pixel (beginning from 0)
1704
  * xsize = horizontal screen size
114 mikedld 1705
Returned value:
118 diamond 1706
  * eax = color 0x00RRGGBB
114 mikedld 1707
Remarks:
118 diamond 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.
114 mikedld 1713
 
1714
======================================================================
277 diamond 1715
=================== Function 37 - work with mouse. ===================
114 mikedld 1716
======================================================================
1717
 
118 diamond 1718
---------- Subfunction 0 - screen coordinates of the mouse -----------
114 mikedld 1719
Parameters:
118 diamond 1720
  * eax = 37 - function number
1721
  * ebx = 0 - subfunction number
114 mikedld 1722
Returned value:
118 diamond 1723
  * eax = x*65536 + y, (x,y)=coordinates of the mouse pointer
1724
    (beginning from 0)
114 mikedld 1725
 
118 diamond 1726
-- Subfunction 1 - coordinates of the mouse relative to the window ---
114 mikedld 1727
Parameters:
118 diamond 1728
  * eax = 37 - function number
1729
  * ebx = 1 - subfunction number
114 mikedld 1730
Returned value:
118 diamond 1731
  * eax = x*65536 + y, (x,y)=coordinates of the mouse pointer
1732
    relative to the application window (beginning from 0)
114 mikedld 1733
Remarks:
118 diamond 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.
114 mikedld 1740
 
118 diamond 1741
------------ Subfunction 2 - pressed buttons of the mouse ------------
114 mikedld 1742
Parameters:
118 diamond 1743
  * eax = 37 - function number
1744
  * ebx = 2 - subfunction number
114 mikedld 1745
Returned value:
118 diamond 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
114 mikedld 1750
 
277 diamond 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
 
114 mikedld 1799
======================================================================
1800
====================== Function 38 - draw line. ======================
1801
======================================================================
1802
Parameters:
118 diamond 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
133 diamond 1809
    edx = 0x01xxxxxx - draw inversed line
1810
          (low 24 bits are ignored)
114 mikedld 1811
Returned value:
1812
  * function does not return value
1813
Remarks:
118 diamond 1814
  * Coordinates are relative to the window.
1815
  * End point is also drawn.
114 mikedld 1816
 
1817
======================================================================
118 diamond 1818
== Function 39, subfunction 1 - get a size of the background image. ==
114 mikedld 1819
======================================================================
1820
Parameters:
118 diamond 1821
  * eax = 39 - function number
1822
  * ebx = 1 - subfunction number
114 mikedld 1823
Returned value:
1824
  * eax = [width]*65536 + [height]
1825
Remarks:
118 diamond 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.
114 mikedld 1829
 
1830
======================================================================
118 diamond 1831
== Function 39, subfunction 2 - get pixel from the background image. =
114 mikedld 1832
======================================================================
1833
Parameters:
118 diamond 1834
  * eax = 39 - function number
1835
  * ebx = 2 - subfunction number
114 mikedld 1836
  * ecx = offset
1837
Returned value:
118 diamond 1838
  * eax = 0x00RRGGBB - pixel color, if offset is valid
1839
    (less than 0x160000-16)
1840
  * eax = 2 otherwise
114 mikedld 1841
Remarks:
118 diamond 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.
114 mikedld 1848
 
1849
======================================================================
118 diamond 1850
== Function 39, subfunction 4 - get drawing mode for the background. =
114 mikedld 1851
======================================================================
1852
Parameters:
118 diamond 1853
  * eax = 39 - function number
1854
  * ebx = 4 - subfunction number
114 mikedld 1855
Returned value:
118 diamond 1856
  * eax = 1 - tile
1857
  * eax = 2 - stretch
114 mikedld 1858
Remarks:
118 diamond 1859
  * There is a pair function to set drawing mode -
1860
    subfunction 4 of function 15.
114 mikedld 1861
 
1862
======================================================================
118 diamond 1863
=========== Function 40 - set the mask for expected events. ==========
114 mikedld 1864
======================================================================
118 diamond 1865
The mask for expected events affects function working with events
1866
10, 11, 23 - they notify only about events allowed by this mask.
114 mikedld 1867
Parameters:
118 diamond 1868
  * eax = 40 - function number
114 mikedld 1869
  * ebx = mask: bit i corresponds to event i+1 (see list of events)
118 diamond 1870
    (set bit permits notice on event)
114 mikedld 1871
Returned value:
1872
  * function does not return value
1873
Remarks:
118 diamond 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.
114 mikedld 1880
 
1881
======================================================================
118 diamond 1882
==================== Function 41 - get IRQ owner. ====================
114 mikedld 1883
======================================================================
1884
Parameters:
118 diamond 1885
  * eax = 41 - function number
1886
  * ebx = IRQ number, 0..15
114 mikedld 1887
Returned value:
118 diamond 1888
  * eax = owner PID
1889
  * eax = 0, if there is no owner
114 mikedld 1890
  * eax = -1 for incorrect ebx
1891
 
1892
======================================================================
118 diamond 1893
==================== Function 42 - read IRQ data. ====================
114 mikedld 1894
======================================================================
118 diamond 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.
114 mikedld 1899
Parameters:
118 diamond 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):
114 mikedld 1904
    * ecx = 2
118 diamond 1905
  * if there is no data:
114 mikedld 1906
    * eax = 0
1907
    * ecx = 1
118 diamond 1908
    * ebx destroyed
1909
  * if all is ok:
1910
    * eax = byte size of data, not yet read from buffer
114 mikedld 1911
    * ecx = 0
1912
    * ebx = current byte
1913
Remarks:
118 diamond 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.
114 mikedld 1918
 
1919
======================================================================
118 diamond 1920
================ Function 43 - input/output to a port. ===============
114 mikedld 1921
======================================================================
1922
 
118 diamond 1923
------------------------ Output data to port -------------------------
114 mikedld 1924
Parameters:
118 diamond 1925
  * eax = 43 - function number
114 mikedld 1926
  * bl = byte for output
118 diamond 1927
  * ecx = port number 0xnnnn (from 0 to 0xFFFF)
114 mikedld 1928
Returned value:
118 diamond 1929
  * eax = 0 - success
1930
  * eax = 1 - the thread has not reserved the selected port
114 mikedld 1931
 
118 diamond 1932
------------------------ Input data from port ------------------------
114 mikedld 1933
Parameters:
118 diamond 1934
  * eax = 43 - function number
1935
  * ebx is ignored
1936
  * ecx = 0x8000nnnn, where nnnn = port number (from 0 to 0xFFFF)
114 mikedld 1937
Returned value:
118 diamond 1938
  * eax = 0 - success, thus ebx = entered byte
1939
  * eax = 1 - the thread has not reserved the selected port
114 mikedld 1940
Remarks:
118 diamond 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.
114 mikedld 1946
 
1947
======================================================================
118 diamond 1948
=========== Function 44 - define operations at IRQ arrival. ==========
114 mikedld 1949
======================================================================
118 diamond 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.
114 mikedld 1953
Parameters:
118 diamond 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
114 mikedld 1957
    * +2: byte: reserved (ignored)
118 diamond 1958
    * +3: byte: 1=read byte from this port, 2=read word
1959
  * ecx = IRQ number, 0..15
114 mikedld 1960
Returned value:
118 diamond 1961
  * eax = 0 - success
1962
  * eax = 1 - the thread is not owner of selected IRQ
114 mikedld 1963
Remarks:
118 diamond 1964
  * Previously the thread must reserve for itself selected IRQ
1965
    by function 45.
114 mikedld 1966
  * First 16 ports are considered only.
118 diamond 1967
  * The current implementation considers incorrect value of field +3
1968
    as a signal to terminate IRQ processing.
114 mikedld 1969
 
1970
======================================================================
118 diamond 1971
=================== Function 45 - reserve/free IRQ. ==================
114 mikedld 1972
======================================================================
1973
Parameters:
118 diamond 1974
  * eax = 45 - function number
114 mikedld 1975
  * ebx = 0 - reserve, 1 = free
118 diamond 1976
  * ecx = IRQ number, 0..15
114 mikedld 1977
Returned value:
118 diamond 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)
114 mikedld 1982
Remarks:
118 diamond 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.
114 mikedld 1989
 
1990
======================================================================
118 diamond 1991
====== Function 46 - reserve/free a group of input/output ports. =====
114 mikedld 1992
======================================================================
118 diamond 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).
114 mikedld 1996
Parameters:
118 diamond 1997
  * eax = 46 - function number
114 mikedld 1998
  * ebx = 0 - reserve, 1 - free
118 diamond 1999
  * ecx = start port number
2000
  * edx = end port number (inclusive)
114 mikedld 2001
Returned value:
118 diamond 2002
  * eax = 0 - success
114 mikedld 2003
  * eax = 1 - error
2004
Remarks:
118 diamond 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.
277 diamond 2017
  * At booting the system reserves for itself ports
2018
    0..0x2d, 0x30..0x4d, 0x50..0xdf, 0xe5..0xff (inclusively).
118 diamond 2019
  * When a thread terminates, all reserved by it ports
2020
    are freed automatically.
114 mikedld 2021
 
2022
======================================================================
118 diamond 2023
============= Function 47 - draw a number in the window. =============
114 mikedld 2024
======================================================================
2025
Parameters:
118 diamond 2026
  * eax = 47 - function number
2027
  * ebx = parameters of conversion number to text:
114 mikedld 2028
    * bl = 0 - ecx contains number
118 diamond 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)
114 mikedld 2036
  * edx = [coordinate on axis x]*65536 + [coordinate on axis y]
139 diamond 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
114 mikedld 2043
Returned value:
2044
  * function does not return value
2045
Remarks:
118 diamond 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).
114 mikedld 2053
 
2054
======================================================================
118 diamond 2055
========= Function 48, subfunction 0 - apply screen settings. ========
114 mikedld 2056
======================================================================
2057
Parameters:
118 diamond 2058
  * eax = 48 - function number
2059
  * ebx = 0 - subfunction number
114 mikedld 2060
  * ecx = 0 - reserved
2061
Returned value:
2062
  * function does not return value
2063
Remarks:
118 diamond 2064
  * Function redraws the screen after parameters change by
114 mikedld 2065
    subfunctions 1 and 2.
118 diamond 2066
  * Function call without prior call to one of indicated subfunctions
2067
    is ignored.
2068
  * Function call with nonzero ecx is ignored.
114 mikedld 2069
 
2070
======================================================================
118 diamond 2071
=========== Function 48, subfunction 1 - set button style. ===========
114 mikedld 2072
======================================================================
2073
Parameters:
118 diamond 2074
  * eax = 48 - function number
2075
  * ebx = 1 - subfunction number
2076
  * ecx = button style:
2077
    * 0 = flat
2078
    * 1 = 3d
114 mikedld 2079
Returned value:
2080
  * function does not return value
2081
Remarks:
118 diamond 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.
114 mikedld 2085
 
118 diamond 2086
======================================================================
2087
====== Function 48, subfunction 2 - set standard window colors. ======
2088
======================================================================
114 mikedld 2089
Parameters:
118 diamond 2090
  * eax = 48 - function number
2091
  * ebx = 2 - subfunction number
2092
  * ecx = pointer to the color table
114 mikedld 2093
  * edx = size of the color table
118 diamond 2094
    (must be 40 bytes for future compatibility)
2095
Format of the color table is shown in description of subfunction 3.
114 mikedld 2096
Returned value:
2097
  * function does not return value
2098
Remarks:
118 diamond 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'.
114 mikedld 2108
 
2109
======================================================================
118 diamond 2110
====== Function 48, subfunction 3 - get standard window colors. ======
114 mikedld 2111
======================================================================
2112
Parameters:
118 diamond 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)
114 mikedld 2119
Returned value:
2120
  * function does not return value
118 diamond 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
114 mikedld 2135
Remarks:
118 diamond 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:
131 diamond 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
118 diamond 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'.
114 mikedld 2153
 
2154
======================================================================
118 diamond 2155
============ Function 48, subfunction 4 - get skin height. ===========
114 mikedld 2156
======================================================================
2157
Parameters:
118 diamond 2158
  * eax = 48 - function number
2159
  * ebx = 4 - subfunction number
114 mikedld 2160
Returned value:
118 diamond 2161
  * eax = skin height
114 mikedld 2162
Remarks:
118 diamond 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.
114 mikedld 2167
 
2168
======================================================================
118 diamond 2169
======== Function 48, subfunction 5 - get screen working area. =======
114 mikedld 2170
======================================================================
2171
Parameters:
118 diamond 2172
  * eax = 48 - function number
2173
  * ebx = 5 - subfunction number
114 mikedld 2174
Returned value:
2175
  * eax = [left]*65536 + [right]
2176
  * ebx = [top]*65536 + [bottom]
2177
Remarks:
118 diamond 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.
114 mikedld 2189
 
2190
======================================================================
118 diamond 2191
======== Function 48, subfunction 6 - set screen working area. =======
114 mikedld 2192
======================================================================
2193
Parameters:
118 diamond 2194
  * eax = 48 - function number
2195
  * ebx = 6 - subfunction number
114 mikedld 2196
  * ecx = [left]*65536 + [right]
2197
  * edx = [top]*65536 + [bottom]
2198
Returned value:
2199
  * function does not return value
2200
Remarks:
118 diamond 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).
114 mikedld 2219
 
2220
======================================================================
118 diamond 2221
=========== Function 48, subfunction 7 - get skin margins. ===========
114 mikedld 2222
======================================================================
118 diamond 2223
Returns the area of a header of a skinned window, intended for
2224
a text of a header.
114 mikedld 2225
Parameters:
118 diamond 2226
  * eax = 48 - function number
2227
  * ebx = 7 - subfunction number
114 mikedld 2228
Returned value:
2229
  * eax = [left]*65536 + [right]
2230
  * ebx = [top]*65536 + [bottom]
2231
Remarks:
118 diamond 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).
114 mikedld 2237
 
2238
======================================================================
118 diamond 2239
============= Function 48, subfunction 8 - set used skin. ============
114 mikedld 2240
======================================================================
2241
Parameters:
118 diamond 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
114 mikedld 2246
Returned value:
118 diamond 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).
114 mikedld 2251
Remarks:
118 diamond 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'.
114 mikedld 2258
 
2259
======================================================================
118 diamond 2260
=========== Function 49 - Advanced Power Management (APM). ===========
114 mikedld 2261
======================================================================
2262
Parameters:
118 diamond 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
114 mikedld 2267
Returned value:
118 diamond 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
114 mikedld 2272
Remarks:
118 diamond 2273
  * APM 1.2 specification is described in the document
2274
    "Advanced Power Management (APM) BIOS Specification"
2275
    (Revision 1.2), available at
114 mikedld 2276
    http://www.microsoft.com/whdc/archive/amp_12.mspx;
118 diamond 2277
    besides it is included in famous Interrupt List by Ralf Brown
114 mikedld 2278
    (http://www.pobox.com/~ralf/files.html,
2279
    ftp://ftp.cs.cmu.edu/afs/cs/user/ralf/pub/).
2280
 
2281
======================================================================
118 diamond 2282
=================== Function 50 - set window shape. ==================
114 mikedld 2283
======================================================================
118 diamond 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.
114 mikedld 2289
 
118 diamond 2290
--------------------------- Set shape data ---------------------------
114 mikedld 2291
Parameters:
118 diamond 2292
  * eax = 50 - function number
2293
  * ebx = 0 - subfunction number
2294
  * ecx = pointer to shape data (array of bytes 0/1)
114 mikedld 2295
Returned value:
2296
  * function does not return value
2297
 
118 diamond 2298
-------------------------- Set shape scale ---------------------------
114 mikedld 2299
Parameters:
118 diamond 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
114 mikedld 2304
Returned value:
2305
  * function does not return value
2306
Remarks:
118 diamond 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
114 mikedld 2312
    functions 0, 67.
118 diamond 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
114 mikedld 2318
    (a mod (xsize shr scale), a div (xsize shr scale))
118 diamond 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.
114 mikedld 2326
 
2327
======================================================================
2328
==================== Function 51 - create thread. ====================
2329
======================================================================
2330
Parameters:
118 diamond 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)
114 mikedld 2335
Returned value:
118 diamond 2336
  * eax = -1 - error (there is too many threads)
2337
  * otherwise eax = TID - thread identifier
2338
    
114 mikedld 2339
 
2340
======================================================================
118 diamond 2341
=== Function 52, subfunction 0 - get network driver configuration. ===
114 mikedld 2342
======================================================================
2343
Parameters:
118 diamond 2344
  * eax = 52 - function number
2345
  * ebx = 0 - subfunction number
114 mikedld 2346
Returned value:
118 diamond 2347
  * eax = configuration dword
114 mikedld 2348
Remarks:
118 diamond 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.
114 mikedld 2353
 
2354
======================================================================
118 diamond 2355
========= Function 52, subfunction 1 - get local IP-address. =========
114 mikedld 2356
======================================================================
2357
Parameters:
118 diamond 2358
  * eax = 52 - function number
2359
  * ebx = 1 - subfunction number
114 mikedld 2360
Returned value:
2361
  * eax = IP-address (4 bytes)
2362
Remarks:
118 diamond 2363
  * Local IP-address is set by subfunction 3.
114 mikedld 2364
 
2365
======================================================================
118 diamond 2366
=== Function 52, subfunction 2 - set network driver configuration. ===
114 mikedld 2367
======================================================================
2368
Parameters:
118 diamond 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
114 mikedld 2374
Returned value:
118 diamond 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
114 mikedld 2379
Remarks:
118 diamond 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,
114 mikedld 2383
    is represented doubtful.
2384
 
2385
======================================================================
2386
========= Function 52, subfunction 3 - set local IP-address. =========
2387
======================================================================
2388
Parameters:
118 diamond 2389
  * eax = 52 - function number
2390
  * ebx = 3 - subfunction number
114 mikedld 2391
  * ecx = IP-address (4 bytes)
2392
Returned value:
118 diamond 2393
  * the current implementation returns eax=3, but this can be changed
2394
    in future versions
114 mikedld 2395
Remarks:
118 diamond 2396
  * Local IP-address can be get by subfunction 1.
114 mikedld 2397
 
2398
======================================================================
118 diamond 2399
= Function 52, subfunction 6 - add data to the stack of input queue. =
114 mikedld 2400
======================================================================
2401
Parameters:
118 diamond 2402
  * eax = 52 - function number
2403
  * ebx = 6 - subfunction number
2404
  * edx = data size
2405
  * esi = data pointer
114 mikedld 2406
Returned value:
2407
  * eax = -1 - error
118 diamond 2408
  * eax = 0 - success
114 mikedld 2409
Remarks:
118 diamond 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.
114 mikedld 2414
 
2415
======================================================================
118 diamond 2416
 Function 52, subfunction 8 - read data from the network output queue.
114 mikedld 2417
======================================================================
2418
Parameters:
118 diamond 2419
  * eax = 52 - function number
2420
  * ebx = 8 - subfunction number
2421
  * esi = pointer to 1500-byte buffer
114 mikedld 2422
Returned value:
118 diamond 2423
  * eax = number of read bytes (in the current implementation
2424
    either 0 = no data or 1500)
2425
  * data was copied in buffer
114 mikedld 2426
Remarks:
118 diamond 2427
  * This function is intended only for slow network drivers
2428
    (PPP, SLIP).
114 mikedld 2429
 
2430
======================================================================
118 diamond 2431
============ Function 52, subfunction 9 - get gateway IP. ============
114 mikedld 2432
======================================================================
2433
Parameters:
118 diamond 2434
  * eax = 52 - function number
2435
  * ebx = 9 - subfunction number
114 mikedld 2436
Returned value:
2437
  * eax = gateway IP (4 bytes)
2438
 
2439
======================================================================
118 diamond 2440
=========== Function 52, subfunction 10 - get subnet mask. ===========
114 mikedld 2441
======================================================================
2442
Parameters:
118 diamond 2443
  * eax = 52 - function number
2444
  * ebx = 10 - subfunction number
114 mikedld 2445
Returned value:
118 diamond 2446
  * eax = subnet mask
114 mikedld 2447
 
2448
======================================================================
118 diamond 2449
============ Function 52, subfunction 11 - set gateway IP. ===========
114 mikedld 2450
======================================================================
2451
Parameters:
118 diamond 2452
  * eax = 52 - function number
2453
  * ebx = 11 - subfunction number
114 mikedld 2454
  * ecx = gateway IP (4 bytes)
2455
Returned value:
118 diamond 2456
  * the current implementation returns eax=11, but this can be changed
2457
    in future versions
114 mikedld 2458
 
2459
======================================================================
118 diamond 2460
=========== Function 52, subfunction 12 - set subnet mask. ===========
114 mikedld 2461
======================================================================
2462
Parameters:
118 diamond 2463
  * eax = 52 - function number
2464
  * ebx = 12 - subfunction number
2465
  * ecx = subnet mask
114 mikedld 2466
Returned value:
118 diamond 2467
  * the current implementation returns eax=12, but this can be changed
2468
    in future versions
114 mikedld 2469
 
2470
======================================================================
118 diamond 2471
============== Function 52, subfunction 13 - get DNS IP. =============
114 mikedld 2472
======================================================================
2473
Parameters:
118 diamond 2474
  * eax = 52 - function number
2475
  * ebx = 13 - subfunction number
114 mikedld 2476
Returned value:
2477
  * eax = DNS IP (4 bytes)
2478
 
2479
======================================================================
118 diamond 2480
============== Function 52, subfunction 14 - set DNS IP. =============
114 mikedld 2481
======================================================================
2482
Parameters:
118 diamond 2483
  * eax = 52 - function number
2484
  * ebx = 14 - subfunction number
114 mikedld 2485
  * ecx = DNS IP (4 bytes)
2486
Returned value:
118 diamond 2487
  * the current implementation returns eax=14, but this can be changed
2488
    in future versions
114 mikedld 2489
 
2490
======================================================================
277 diamond 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
======================================================================
118 diamond 2505
============ Function 53, subfunction 0 - open UDP-socket. ===========
114 mikedld 2506
======================================================================
2507
Parameters:
118 diamond 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)
114 mikedld 2512
  * esi = remote IP
2513
Returned value:
118 diamond 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
114 mikedld 2518
 
2519
======================================================================
118 diamond 2520
=========== Function 53, subfunction 1 - close UDP-socket. ===========
114 mikedld 2521
======================================================================
2522
Parameters:
118 diamond 2523
  * eax = 53 - function number
2524
  * ebx = 1 - subfunction number
2525
  * ecx = socket handle
114 mikedld 2526
Returned value:
118 diamond 2527
  * eax = -1 - incorrect handle
2528
  * eax = 0 - success
2529
  * ebx destroyed
114 mikedld 2530
Remarks:
118 diamond 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).
114 mikedld 2538
 
2539
======================================================================
2540
============== Function 53, subfunction 2 - poll socket. =============
2541
======================================================================
2542
Parameters:
118 diamond 2543
  * eax = 53 - function number
2544
  * ebx = 2 - subfunction number
2545
  * ecx = socket handle
114 mikedld 2546
Returned value:
118 diamond 2547
  * eax = number of read bytes
2548
  * ebx destroyed
114 mikedld 2549
Remarks:
118 diamond 2550
  * There is no checks for correctness.
114 mikedld 2551
 
2552
======================================================================
118 diamond 2553
========= Function 53, subfunction 3 - read byte from socket. ========
114 mikedld 2554
======================================================================
2555
Parameters:
118 diamond 2556
  * eax = 53 - function number
2557
  * ebx = 3 - subfunction number
2558
  * ecx = socket handle
114 mikedld 2559
Returned value:
118 diamond 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
114 mikedld 2564
Remarks:
118 diamond 2565
  * There is no checks for correctness.
114 mikedld 2566
 
2567
======================================================================
118 diamond 2568
========== Function 53, subfunction 4 - write to UDP-socket. =========
114 mikedld 2569
======================================================================
2570
Parameters:
118 diamond 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
114 mikedld 2576
Returned value:
118 diamond 2577
  * eax = 0xffffffff - invalid handle
2578
  * eax = 0xffff - not enough memory
2579
  * eax = 0 - success
2580
  * ebx destroyed
114 mikedld 2581
Remarks:
118 diamond 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.
114 mikedld 2586
 
2587
======================================================================
2588
============ Function 53, subfunction 5 - open TCP-socket. ===========
2589
======================================================================
2590
Parameters:
118 diamond 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)
114 mikedld 2595
  * esi = remote IP
118 diamond 2596
  * edi = open mode: SOCKET_PASSIVE=0 or SOCKET_ACTIVE=1
114 mikedld 2597
Returned value:
118 diamond 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
114 mikedld 2602
 
2603
======================================================================
118 diamond 2604
========= Function 53, subfunction 6 - get TCP-socket status. ========
114 mikedld 2605
======================================================================
2606
Parameters:
118 diamond 2607
  * eax = 53 - function number
2608
  * ebx = 6 - subfunction number
2609
  * ecx = socket handle
114 mikedld 2610
Returned value:
118 diamond 2611
  * eax = socket status: one of
114 mikedld 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
118 diamond 2623
  * ebx destroys
114 mikedld 2624
Remarks:
118 diamond 2625
  * There is no checks for correctness.
114 mikedld 2626
 
2627
======================================================================
118 diamond 2628
========== Function 53, subfunction 7 - write to TCP-socket. =========
114 mikedld 2629
======================================================================
2630
Parameters:
118 diamond 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
114 mikedld 2636
Returned value:
2637
  * eax = 0xffffffff - error
118 diamond 2638
  * eax = 0xffff - not enough memory
2639
  * eax = 0 - success
2640
  * ebx destroyed
114 mikedld 2641
Remarks:
118 diamond 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.
114 mikedld 2646
 
2647
======================================================================
118 diamond 2648
=========== Function 53, subfunction 8 - close TCP-socket. ===========
114 mikedld 2649
======================================================================
2650
Parameters:
118 diamond 2651
  * eax = 53 - function number
2652
  * ebx = 8 - subfunction number
2653
  * ecx = socket handle
114 mikedld 2654
Returned value:
118 diamond 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
114 mikedld 2661
Remarks:
118 diamond 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).
114 mikedld 2669
 
2670
======================================================================
118 diamond 2671
=== Function 53, subfunction 9 - check whether local port is free. ===
114 mikedld 2672
======================================================================
2673
Parameters:
118 diamond 2674
  * eax = 53 - function number
2675
  * ebx = 9 - subfunction number
2676
  * ecx = local port number (low 16 bits are used only)
114 mikedld 2677
Returned value:
2678
  * eax = 0 - port is used
2679
  * eax = 1 - port is free
118 diamond 2680
  * ebx destroyed
114 mikedld 2681
 
2682
======================================================================
314 diamond 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
346 diamond 2693
  * ebx destroyed
314 diamond 2694
Remarks:
2695
  * The current kernel implementation supports this function
2696
    only for RTL8139 network cards.
2697
 
2698
======================================================================
346 diamond 2699
======= Function 53, subfunction 11 - read network stack data. =======
340 heavyiron 2700
======================================================================
346 diamond 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.
340 heavyiron 2713
 
2714
======================================================================
118 diamond 2715
= Function 53, subfunction 255 - debug information of network driver.
114 mikedld 2716
======================================================================
2717
Parameters:
118 diamond 2718
  * eax = 53 - function number
2719
  * ebx = 255 - subfunction number
114 mikedld 2720
  * ecx = type of requested information (see below)
2721
Returned value:
2722
  * eax = requested information
118 diamond 2723
  * ebx destroyed
2724
Possible values for ecx:
114 mikedld 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)
118 diamond 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;
114 mikedld 2733
    in this case eax is not defined
118 diamond 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
114 mikedld 2744
 
2745
======================================================================
2746
========== Function 55, subfunction 0 - load data for SB16. ==========
2747
======================================================================
2748
Parameters:
118 diamond 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)
114 mikedld 2753
Returned value:
2754
  * function does not return value
2755
Remarks:
118 diamond 2756
  * Format and size of data are set by subfunction 2.
114 mikedld 2757
 
2758
======================================================================
118 diamond 2759
======== Function 55, subfunction 1 - begin play data on SB16. =======
114 mikedld 2760
======================================================================
2761
Parameters:
118 diamond 2762
  * eax = 55 - function number
2763
  * ebx = 1 - subfunction number
114 mikedld 2764
Returned value:
2765
  * function does not return value
2766
Remarks:
118 diamond 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).
114 mikedld 2775
 
2776
======================================================================
118 diamond 2777
======== Function 55, subfunction 2 - set format of SB16 data. =======
114 mikedld 2778
======================================================================
2779
Parameters:
118 diamond 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
114 mikedld 2786
    * edx = size in bytes
118 diamond 2787
  * ecx = 2 - set play frequency
114 mikedld 2788
    * edx = frequency
2789
Returned value:
2790
  * function does not return value
2791
Remarks:
118 diamond 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.
114 mikedld 2796
 
2797
======================================================================
118 diamond 2798
 Function 55, subfunction 55 - begin to play data on built-in speaker.
114 mikedld 2799
======================================================================
2800
Parameters:
118 diamond 2801
  * eax = 55 - function number
2802
  * ebx = 55 - subfunction number
2803
  * esi = pointer to data
114 mikedld 2804
Returned value:
118 diamond 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:
114 mikedld 2809
  * 0 = end of data
118 diamond 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
114 mikedld 2814
  * 0x81 = invalid
118 diamond 2815
  * 0x82..0xFF = note is defined by octave and number:
2816
    * duration in 1/100 of second = (first byte)-0x81
114 mikedld 2817
    * there is one more byte;
118 diamond 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)
114 mikedld 2821
Remarks:
118 diamond 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.
114 mikedld 2829
 
2830
======================================================================
118 diamond 2831
================ Function 58 - work with file system. ================
114 mikedld 2832
======================================================================
2833
Parameters:
2834
  * eax = 58
118 diamond 2835
  * ebx = pointer to the information structure
114 mikedld 2836
Returned value:
118 diamond 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
114 mikedld 2841
  * +4: dword: number of block
2842
  * +8: dword: size
118 diamond 2843
  * +12 = +0xC: dword: pointer to data
2844
  * +16 = +0x10: dword: pointer to a memory for system operations
114 mikedld 2845
    (4096 bytes)
118 diamond 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:
114 mikedld 2851
/base/number/dir1/dir2/.../dirn/file,
118 diamond 2852
where /base/number identifies device, on which file is located:
114 mikedld 2853
one of
118 diamond 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),
114 mikedld 2862
    IDE2 (Secondary Master), IDE3 (Secondary Slave);
118 diamond 2863
    x - partition number on the selected hard drive, varies from 1
2864
    to 255 (on each hard drive the indexing starts from 1)
114 mikedld 2865
Remarks:
118 diamond 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.
114 mikedld 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
118 diamond 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
114 mikedld 2887
 
2888
======================================================================
118 diamond 2889
=========== Function 58, subfunction 0 - read file/folder. ===========
114 mikedld 2890
======================================================================
2891
Parameters:
2892
  * eax = 58
118 diamond 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
114 mikedld 2900
    (4096 bytes)
118 diamond 2901
  * +20 = +0x14: ASCIIZ-name of file, the rules of names forming are
2902
    given in the general description
114 mikedld 2903
Returned value:
118 diamond 2904
  * eax = 0 - success, otherwise file system error code
2905
  * ebx = file size (in bytes) or -1=0xffffffff, if file was not found
114 mikedld 2906
Remarks:
118 diamond 2907
  * Block size is 512 bytes.
114 mikedld 2908
  * This function is obsolete, for reading files use subfunction 0
118 diamond 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:
114 mikedld 2921
    for /rd/1:
118 diamond 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.
114 mikedld 2949
 
2950
======================================================================
118 diamond 2951
============= Function 58, subfunction 1 - rewrite file. =============
114 mikedld 2952
======================================================================
118 diamond 2953
If the file does not exist, it is created.
114 mikedld 2954
If the file exists, it is rewritten.
2955
Parameters:
118 diamond 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
114 mikedld 2964
    (4096 bytes)
118 diamond 2965
  * +20 = +0x14: ASCIIZ-name of file, the rules of names forming are
2966
    given in the general description
114 mikedld 2967
Returned value:
118 diamond 2968
  * eax = 0 - success, otherwise file system error code
2969
  * ebx destroyed
114 mikedld 2970
Remarks:
118 diamond 2971
  * This function is obsolete, use subfunction 2 of function 70.
114 mikedld 2972
 
2973
======================================================================
118 diamond 2974
========= Function 58, subfunction 8 - LBA-read from device. =========
114 mikedld 2975
======================================================================
2976
Parameters:
118 diamond 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
114 mikedld 2985
    (4096 bytes)
118 diamond 2986
  * +20 = +0x14: ASCIIZ-name of device: case-insensitive, one of
2987
    /rd/1 = /RamDisk/1, /hd/n = /HardDisk/n,
114 mikedld 2988
    1<=n<=4 - number of device: 1=IDE0, ..., 4=IDE3.
118 diamond 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'.
114 mikedld 2992
Returned value:
118 diamond 2993
  * for device name /hd/xxx, where xxx is not in the list above:
114 mikedld 2994
    * eax = ebx = 1
118 diamond 2995
  * for invalid device name (except for the previous case):
114 mikedld 2996
    * eax = 5
118 diamond 2997
    * ebx does not change
2998
  * if LBA-access is disabled by subfunction 11 of function 21:
114 mikedld 2999
    * eax = 2
118 diamond 3000
    * ebx destroyed
3001
  * for ramdisk: attempt to read block outside ramdisk
3002
    (18*2*80 blocks) results in
114 mikedld 3003
    * eax = 3
3004
    * ebx = 0
118 diamond 3005
  * for successful read:
114 mikedld 3006
    * eax = ebx = 0
3007
Remarks:
118 diamond 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).
114 mikedld 3024
 
118 diamond 3025
======================================================================
3026
==== Function 58, subfunction 15 - get information on file system. ===
3027
======================================================================
114 mikedld 3028
Parameters:
118 diamond 3029
  * eax = 58 - function number
3030
  * ebx = pointer to the information structure
3031
Format of the information structure:
3032
  * +0: dword: 15 = subfunction number
114 mikedld 3033
  * +4: dword: ignored
3034
  * +8: dword: ignored
3035
  * +12 = +0xC: dword: ignored
3036
  * +16 = +0x10: dword: ignored
118 diamond 3037
  * +20 = +0x14: (only second character is checked)
114 mikedld 3038
    /rd=/RAMDISK or /hd=/HARDDISK
3039
Returned value:
118 diamond 3040
  * if the second character does not belong to set {'r','R','h','H'}:
114 mikedld 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
118 diamond 3048
  * for hard disk: base and partition are defined by subfunctions
3049
    7 and 8 of function 21:
114 mikedld 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:
118 diamond 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.
114 mikedld 3066
 
3067
======================================================================
118 diamond 3068
========== Function 60 - Inter Process Communication (IPC). ==========
114 mikedld 3069
======================================================================
118 diamond 3070
IPC is used for message dispatching from one process/thread to
3071
another. Previously it is necessary to agree how to interpret
114 mikedld 3072
the concrete message.
3073
 
118 diamond 3074
----------- Subfunction 1 - set the area for IPC receiving -----------
3075
Is called by process-receiver.
114 mikedld 3076
Parameters:
118 diamond 3077
  * eax = 60 - function number
3078
  * ebx = 1 - subfunction number
3079
  * ecx = pointer to the buffer
3080
  * edx = size of the buffer
114 mikedld 3081
Returned value:
118 diamond 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)
114 mikedld 3087
  * +4: dword: occupied place in the buffer (in bytes)
3088
  * +8: first message
3089
  * +8+n: second message
3090
  * ...
118 diamond 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
114 mikedld 3095
 
118 diamond 3096
------------------ Subfunction 2 - send IPC message ------------------
3097
Is called by process-sender.
114 mikedld 3098
Parameters:
118 diamond 3099
  * eax = 60 - function number
3100
  * ebx = 2 - subfunction number
114 mikedld 3101
  * ecx = PID of receiver
118 diamond 3102
  * edx = pointer to the message data
3103
  * esi = message length (in bytes)
114 mikedld 3104
Returned value:
118 diamond 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
114 mikedld 3111
  * eax = 4 - process/thread with such PID does not exist
3112
Remarks:
118 diamond 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).
114 mikedld 3115
 
3116
======================================================================
118 diamond 3117
==== Function 61 - get parameters for the direct graphics access. ====
114 mikedld 3118
======================================================================
118 diamond 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:
131 diamond 3122
	mov	eax, [gs:0]
118 diamond 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).
131 diamond 3126
	mov	[gs:0], eax
118 diamond 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.
114 mikedld 3131
Remarks:
118 diamond 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.
114 mikedld 3149
 
3150
------------------------- Screen resolution --------------------------
3151
Parameters:
118 diamond 3152
  * eax = 61 - function number
3153
  * ebx = 1 - subfunction number
114 mikedld 3154
Returned value:
118 diamond 3155
  * eax = [resolution on x axis]*65536 + [resolution on y axis]
114 mikedld 3156
Remarks:
118 diamond 3157
  * One can use function 14 paying attention that
3158
    it returns sizes on 1 pixel less. It is fully equivalent way.
114 mikedld 3159
 
118 diamond 3160
---------------------- Number of bits per pixel ----------------------
114 mikedld 3161
Parameters:
118 diamond 3162
  * eax = 61 - function number
3163
  * ebx = 2 - subfunction number
114 mikedld 3164
Returned value:
118 diamond 3165
  * eax = number of bits per pixel (24 or 32)
114 mikedld 3166
 
118 diamond 3167
-------------------- Number of bytes per scanline --------------------
114 mikedld 3168
Parameters:
118 diamond 3169
  * eax = 61 - function number
3170
  * ebx = 3 - subfunction number
114 mikedld 3171
Returned value:
118 diamond 3172
  * eax = number of bytes occupied by one scanline
114 mikedld 3173
    (horizontal line on the screen)
3174
 
3175
======================================================================
118 diamond 3176
===== Function 62, subfunction 0 - get version of PCI-interface. =====
114 mikedld 3177
======================================================================
3178
Parameters:
118 diamond 3179
  * eax = 62 - function number
3180
  * bl = 0 - subfunction number
114 mikedld 3181
Returned value:
118 diamond 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
114 mikedld 3185
Remarks:
118 diamond 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.
114 mikedld 3189
 
3190
======================================================================
118 diamond 3191
==== Function 62, subfunction 1 - get number of the last PCI-bus. ====
114 mikedld 3192
======================================================================
3193
Parameters:
118 diamond 3194
  * eax = 62 - function number
3195
  * bl = 1 - subfunction number
114 mikedld 3196
Returned value:
118 diamond 3197
  * eax = -1 - access to PCI is disabled; otherwise
3198
  * al = number of the last PCI-bus; other bytes of eax are destroyed
114 mikedld 3199
Remarks:
118 diamond 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.
114 mikedld 3203
 
3204
======================================================================
118 diamond 3205
===================== Function 62, subfunction 2 =====================
3206
===== Get mechanism of addressing to the PCI configuration space. ====
114 mikedld 3207
======================================================================
3208
Parameters:
118 diamond 3209
  * eax = 62 - function number
3210
  * bl = 2 - subfunction number
114 mikedld 3211
Returned value:
118 diamond 3212
  * eax = -1 - access to PCI is disabled; otherwise
3213
  * al = mechanism (1 or 2); other bytes of eax are destroyed
114 mikedld 3214
Remarks:
118 diamond 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.
114 mikedld 3221
 
3222
======================================================================
118 diamond 3223
======== Function 62, subfunctions 4,5,6 - read PCI-register. ========
114 mikedld 3224
======================================================================
3225
Parameters:
118 diamond 3226
  * eax = 62 - function number
3227
  * bl = 4 - read byte
3228
  * bl = 5 - read word
3229
  * bl = 6 - read dword
114 mikedld 3230
  * bh = number of PCI-bus
118 diamond 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)
114 mikedld 3235
Returned value:
118 diamond 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
114 mikedld 3240
Remarks:
118 diamond 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
114 mikedld 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/);
118 diamond 3251
    registers of the second type must be listed
3252
    in the device documentation.
114 mikedld 3253
 
3254
======================================================================
118 diamond 3255
====== Function 62, subfunctions 8,9,10 - write to PCI-register. =====
114 mikedld 3256
======================================================================
3257
Parameters:
118 diamond 3258
  * eax = 62 - function number
3259
  * bl = 8 - write byte
3260
  * bl = 9 - write word
3261
  * bl = 10 - write dword
114 mikedld 3262
  * bh = number of PCI-bus
118 diamond 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
114 mikedld 3269
Returned value:
118 diamond 3270
  * eax = -1 - error (access to PCI is disabled or parameters
3271
    are not supported)
3272
  * eax = 0 - success
114 mikedld 3273
Remarks:
118 diamond 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.
114 mikedld 3283
 
3284
======================================================================
118 diamond 3285
============== Function 63 - work with the debug board. ==============
114 mikedld 3286
======================================================================
118 diamond 3287
The debug board is the global system buffer (with the size
3288
512 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,
114 mikedld 3299
but also does not prevent.
118 diamond 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.
114 mikedld 3304
 
118 diamond 3305
----------------------------- Write byte -----------------------------
114 mikedld 3306
Parameters:
118 diamond 3307
  * eax = 63 - function number
3308
  * ebx = 1 - subfunction number
3309
  * cl = data byte
114 mikedld 3310
Returned value:
3311
  * function does not return value
3312
Remarks:
118 diamond 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.
114 mikedld 3319
 
118 diamond 3320
----------------------------- Read byte ------------------------------
3321
Takes away byte from the buffer.
114 mikedld 3322
Parameters:
118 diamond 3323
  * eax = 63 - function number
3324
  * ebx = 2 - subfunction number
114 mikedld 3325
Returned value:
118 diamond 3326
  * eax = ebx = 0 - the buffer is empty
3327
  * eax = byte, ebx = 1 - byte was successfully read
114 mikedld 3328
 
3329
======================================================================
118 diamond 3330
============== Function 64 - resize application memory. ==============
114 mikedld 3331
======================================================================
3332
Parameters:
118 diamond 3333
  * eax = 64 - function number
3334
  * ebx = 1 - unique subfunction
3335
  * ecx = new memory size
114 mikedld 3336
Returned value:
118 diamond 3337
  * eax = 0 - success
3338
  * eax = 1 - not enough memory
114 mikedld 3339
Remarks:
193 diamond 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.
114 mikedld 3345
 
3346
======================================================================
283 diamond 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]
314 diamond 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
283 diamond 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.
314 diamond 3367
  * The call to function 7 is equivalent to call to this function
3368
    with esi=24, ebp=0.
283 diamond 3369
 
3370
======================================================================
118 diamond 3371
================== Function 66 - work with keyboard. =================
114 mikedld 3372
======================================================================
118 diamond 3373
The input mode influences results of reading keys by function 2.
3374
When a program loads, ASCII input mode is set for it.
114 mikedld 3375
 
118 diamond 3376
-------------- Subfunction 1 - set keyboard input mode. --------------
114 mikedld 3377
Parameters:
118 diamond 3378
  * eax = 66 - function number
3379
  * ebx = 1 - subfunction number
114 mikedld 3380
  * ecx = mode:
3381
    * 0 = normal (ASCII-characters)
3382
    * 1 = scancodes
3383
Returned value:
3384
  * function does not return value
3385
 
118 diamond 3386
-------------- Subfunction 2 - get keyboard input mode. --------------
114 mikedld 3387
Parameters:
118 diamond 3388
  * eax = 66 - function number
3389
  * ebx = 2 - subfunction number
114 mikedld 3390
Returned value:
3391
  * eax = current mode
3392
 
118 diamond 3393
------------ Subfunction 3 - get status of control keys. -------------
114 mikedld 3394
Parameters:
118 diamond 3395
  * eax = 66 - function number
3396
  * ebx = 3 - subfunction number
114 mikedld 3397
Returned value:
3398
  * eax = bit mask:
118 diamond 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
114 mikedld 3409
 
118 diamond 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.
114 mikedld 3416
Parameters:
118 diamond 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
114 mikedld 3430
Returned value:
118 diamond 3431
  * eax=0 - success
3432
  * eax=1 - too mant hotkeys (maximum 256 are allowed)
114 mikedld 3433
Remarks:
118 diamond 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.
114 mikedld 3440
 
118 diamond 3441
-------------- Subfunction 5 - delete installed hotkey. --------------
114 mikedld 3442
Parameters:
118 diamond 3443
  * eax = 66 - function number
3444
  * ebx = 5 - subfunction number
3445
  * cl = scancode of key and edx = 0xXYZ the same as in subfunction 4
114 mikedld 3446
Returned value:
118 diamond 3447
  * eax = 0 - success
114 mikedld 3448
  * eax = 1 - there is no such hotkey
3449
Remarks:
118 diamond 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.
114 mikedld 3455
 
3456
======================================================================
118 diamond 3457
========= Function 67 - change position/sizes of the window. =========
114 mikedld 3458
======================================================================
3459
Parameters:
118 diamond 3460
  * eax = 67 - function number
114 mikedld 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:
118 diamond 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.
114 mikedld 3471
    It sets initial coordinates and sizes of the window.
118 diamond 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).
114 mikedld 3479
 
3480
======================================================================
118 diamond 3481
====== Function 68, subfunction 0 - get the task switch counter. =====
114 mikedld 3482
======================================================================
3483
Parameters:
118 diamond 3484
  * eax = 68 - function number
3485
  * ebx = 0 - subfunction number
114 mikedld 3486
Returned value:
118 diamond 3487
  * eax = number of task switches from the system booting
3488
    (modulo 2^32)
114 mikedld 3489
 
3490
======================================================================
118 diamond 3491
======= Function 68, subfunction 1 - switch to the next thread. ======
114 mikedld 3492
======================================================================
118 diamond 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.
114 mikedld 3497
Parameters:
118 diamond 3498
  * eax = 68 - function number
3499
  * ebx = 1 - subfunction number
114 mikedld 3500
Returned value:
3501
  * function does not return value
3502
 
3503
======================================================================
118 diamond 3504
============= Function 68, subfunction 2 - cache + rdpmc. ============
114 mikedld 3505
======================================================================
3506
Parameters:
118 diamond 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
114 mikedld 3515
Returned value:
3516
  * for ecx=0:
118 diamond 3517
    * eax = the value of cr4
114 mikedld 3518
  * for ecx=1:
3519
    * eax = (cr0 and 0x60000000):
118 diamond 3520
    * eax = 0 - cache is on
3521
    * eax <> 0 - cache is off
114 mikedld 3522
  * for ecx=2 and ecx=3:
3523
    * function does not return value
3524
 
3525
======================================================================
3526
=========== Function 68, subfunction 3 - read MSR-register. ==========
3527
======================================================================
118 diamond 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.
114 mikedld 3533
Parameters:
118 diamond 3534
  * eax = 68 - function number
3535
  * ebx = 3 - subfunction number
3536
  * ecx is ignored
3537
  * edx = MSR address
114 mikedld 3538
Returned value:
118 diamond 3539
  * ebx:eax = high:low dword of the result
114 mikedld 3540
Remarks:
118 diamond 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.
114 mikedld 3548
 
3549
======================================================================
118 diamond 3550
========= Function 68, subfunction 4 - write to MSR-register. ========
114 mikedld 3551
======================================================================
118 diamond 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.
114 mikedld 3557
Parameters:
118 diamond 3558
  * eax = 68 - function number
3559
  * ebx = 4 - subfunction number
3560
  * ecx is ignored
3561
  * edx = MSR address
3562
  * esi:edi = high:low dword
114 mikedld 3563
Returned value:
118 diamond 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.
114 mikedld 3573
 
3574
======================================================================
193 diamond 3575
======= Function 68, subfunction 11 - initialize process heap. =======
114 mikedld 3576
======================================================================
3577
Parameters:
118 diamond 3578
  * eax = 68 - function number
193 diamond 3579
  * ebx = 11 - subfunction number
114 mikedld 3580
Returned value:
193 diamond 3581
  * eax = 0 - failed
3582
  * otherwise size of created heap
114 mikedld 3583
Remarks:
193 diamond 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.
114 mikedld 3590
 
3591
======================================================================
193 diamond 3592
======== Function 68, subfunction 12 - allocate memory block. ========
114 mikedld 3593
======================================================================
3594
Parameters:
118 diamond 3595
  * eax = 68 - function number
193 diamond 3596
  * ebx = 12 - subfunction number
3597
  * ecx = required size in bytes
114 mikedld 3598
Returned value:
193 diamond 3599
  * eax = pointer to the allocated block
114 mikedld 3600
Remarks:
193 diamond 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.
114 mikedld 3606
 
3607
======================================================================
193 diamond 3608
========== Function 68, subfunction 13 - free memory block. ==========
114 mikedld 3609
======================================================================
3610
Parameters:
118 diamond 3611
  * eax = 68 - function number
193 diamond 3612
  * ebx = 13 - subfunction number
3613
  * ecx = pointer to the memory block
114 mikedld 3614
Returned value:
193 diamond 3615
  * eax = 1 - success
3616
  * eax = 0 - failed
114 mikedld 3617
Remarks:
193 diamond 3618
  * The memory block must have been allocated by subfunction 12.
114 mikedld 3619
 
3620
======================================================================
193 diamond 3621
======== Function 68, subfunction 14 - wait for driver notify. =======
114 mikedld 3622
======================================================================
3623
Parameters:
118 diamond 3624
  * eax = 68 - function number
193 diamond 3625
  * ebx = 14 - subfunction number
3626
  * ecx = pointer to the buffer for information (8 bytes)
114 mikedld 3627
Returned value:
193 diamond 3628
  * buffer pointed to by ecx contains the following information:
3629
    * +0: dword: constant EV_INTR = 1
3630
    * +4: dword: driver data
114 mikedld 3631
Remarks:
193 diamond 3632
  * The current implementation at wait time uses "heavy" operations
3633
    of task switch.
114 mikedld 3634
 
3635
======================================================================
193 diamond 3636
====== Function 68, subfunction 15 - set FPU exception handler. ======
3637
======================================================================
3638
Parameters:
3639
  * eax = 68 - function number
3640
  * ebx = 15 - subfunction number
3641
  * ecx = address of the new exception handler
3642
Returned value:
3643
  * eax = address of the old exception handler (0, if it was not set)
3644
 
3645
======================================================================
3646
============= Function 68, subfunction 16 - load driver. =============
3647
======================================================================
3648
Parameters:
3649
  * eax = 68 - function number
3650
  * ebx = 16 - subfunction number
3651
  * ecx = pointer to ASCIIZ-string with driver name
3652
Returned value:
3653
  * eax = 0 - failed
3654
  * otherwise eax = driver handle
3655
Remarks:
3656
  * If the driver was not loaded yet, it is loaded;
3657
    if the driver was loaded yet, nothing happens.
3658
  * Driver name is case-sensitive.
3659
    Maximum length of the name is 16 characters, including
3660
    terminating null character, the rest is ignored.
346 diamond 3661
  * Driver ABC is loaded from file /rd/1/drivers/ABC.obj.
193 diamond 3662
 
3663
======================================================================
3664
============ Function 68, subfunction 17 - driver control. ===========
3665
======================================================================
3666
Parameters:
3667
  * eax = 68 - function number
3668
  * ebx = 17 - subfunction number
3669
  * ecx = pointer to the control structure:
3670
    * +0: dword: handle of driver
3671
    * +4: dword: code of driver function
3672
    * +8: dword: pointer to input data
3673
    * +12 = +0xC: dword: size of input data
3674
    * +16 = +0x10: dword: pointer to output data
3675
    * +20 = +0x14: dword: size of output data
3676
Returned value:
3677
  * eax = determined by driver
3678
Remarks:
3679
  * Function codes and the structure of input/output data
3680
    are defined by driver.
3681
  * Previously one must obtain driver handle by subfunction 16.
3682
 
3683
======================================================================
3684
====== Function 68, subfunction 18 - set SSE exception handler. ======
3685
======================================================================
3686
Parameters:
3687
  * eax = 68 - function number
3688
  * ebx = 15 - subfunction number
3689
  * ecx = address of the new exception handler
3690
Returned value:
3691
  * eax = address of the old exception handler (0, if it was not set)
3692
 
3693
======================================================================
277 diamond 3694
=============== Function 68, subfunction 19 - load DLL. ==============
3695
======================================================================
3696
Parameters:
3697
  * eax = 68 - function number
3698
  * ebx = 19 - subfunction number
3699
  * ecx = pointer to ASCIIZ-string with the full path to DLL
3700
Returned value:
3701
  * eax = 0 - failed
3702
  * otherwise eax = pointer to DLL export table
3703
Remarks:
3704
  * Export table is an array of structures of 2 dword's, terminated
3705
    by zero. The first dword in structure points to function name,
3706
    the second dword contains address of function.
3707
 
3708
======================================================================
118 diamond 3709
====================== Fucntion 69 - debugging. ======================
114 mikedld 3710
======================================================================
118 diamond 3711
A process can load other process as debugged by set of corresponding
193 diamond 3712
bit by call to subfunction 7 of function 70.
118 diamond 3713
A process can have only one debugger; one process can debug some
3714
others. The system notifies debugger on events occuring with
3715
debugged process. Messages are written to the buffer defined by
114 mikedld 3716
subfunction 0.
118 diamond 3717
Format of a message:
3718
  * +0: dword: message code
3719
  * +4: dword: PID of debugged process
3720
  * +8: there can be additional data depending on message code
3721
Message codes:
114 mikedld 3722
  * 1 = exception
118 diamond 3723
    * in addition dword-number of the exception is given
3724
    * process is suspended
3725
  * 2 = process has terminated
3726
    * comes at any termination: both through the system function -1,
3727
      and at "murder" by any other process (including debugger itself)
114 mikedld 3728
  * 3 = debug exception int 1 = #DB
118 diamond 3729
    * in addition dword-image of the register DR6 is given:
3730
      * bits 0-3: condition of the corresponding breakpoint (set by
3731
        subfunction 9) is satisfied
3732
      * бит 14: exception has occured because of the trace mode
3733
        (flag TF is set TF)
3734
    * process is suspended
3735
When debugger terminates, all debugged processes are killed.
3736
If debugger does not want this, it must previously detach by
114 mikedld 3737
subfunction 3.
3738
 
118 diamond 3739
All subfunctions are applicable only to processes/threads started
3740
from the current by function 58 or 70 with set debugging flag.
3741
Debugging of multithreaded programs is not supported yet.
3742
The full list of subfunctions:
3743
  * subfunction 0 - define data area for debug messages
3744
  * subfunction 1 - get contents of registers of debugged thread
3745
  * subfunction 2 - set contents of registers of debugged thread
3746
  * subfunction 3 - detach from debugged process
3747
  * subfunction 4 - suspend debugged thread
3748
  * subfunction 5 - resume debugged thread
3749
  * subfunction 6 - read from the memory of debugged process
3750
  * subfunction 7 - write to the memory of debugged process
3751
  * subfunction 8 - terminate debugged thread
3752
  * subfunction 9 - set/clear hardware breakpoint
114 mikedld 3753
 
3754
======================================================================
118 diamond 3755
= Function 69, subfunction 0 - define data area fror debug messages. =
114 mikedld 3756
======================================================================
3757
Parameters:
118 diamond 3758
  * eax = 69 - function number
3759
  * ebx = 0 - subfunction number
114 mikedld 3760
  * ecx = pointer
3761
Format of data area:
118 diamond 3762
  * +0: dword: N = buffer size (not including this header)
3763
  * +4: dword: occupied place
114 mikedld 3764
  * +8: N*byte: buffer
3765
Returned value:
3766
  * function does not return value
3767
Remarks:
118 diamond 3768
  * If the size field is negative, the buffer is considered locked
3769
    and at arrival of new message the system will wait.
3770
    For synchronization frame all work with the buffer by operations
3771
    lock/unlock
131 diamond 3772
    	neg	[bufsize]
118 diamond 3773
  * Data in the buffer are considered as array of items with variable
3774
    length - messages. Format of a message is explained in
3775
    general description.
114 mikedld 3776
 
3777
======================================================================
118 diamond 3778
===================== Function 69, subfunction 1 =====================
3779
============ Get contents of registers of debugged thread. ===========
114 mikedld 3780
======================================================================
3781
Parameters:
118 diamond 3782
  * eax = 69 - function number
3783
  * ebx = 1 - subfunction number
114 mikedld 3784
  * ecx = thread identifier
118 diamond 3785
  * edx = size of context structure, must be 0x28=40 bytes
3786
  * esi = pointer to context structure
114 mikedld 3787
Returned value:
3788
  * function does not return value
118 diamond 3789
Format of context structure: (FPU is not supported yet)
114 mikedld 3790
  * +0: dword: eip
3791
  * +4: dword: eflags
3792
  * +8: dword: eax
3793
  * +12 = +0xC: dword: ecx
3794
  * +16 = +0x10: dword: edx
3795
  * +20 = +0x14: dword: ebx
3796
  * +24 = +0x18: dword: esp
3797
  * +28 = +0x1C: dword: ebp
3798
  * +32 = +0x20: dword: esi
3799
  * +36 = +0x24: dword: edi
3800
Remarks:
118 diamond 3801
  * If the thread executes code of ring-0, the function returns
3802
    contents of registers of ring-3.
3803
  * Process must be loaded for debugging (as is shown in
3804
    general description).
114 mikedld 3805
 
3806
======================================================================
118 diamond 3807
===================== Function 69, subfunction 2 =====================
3808
============ Set contents of registers of debugged thread. ===========
114 mikedld 3809
======================================================================
3810
Parameters:
118 diamond 3811
  * eax = 69 - function number
3812
  * ebx = 2 - subfunction number
114 mikedld 3813
  * ecx = thread identifier
118 diamond 3814
  * edx = size of context structure, must be 0x28=40 bytes
114 mikedld 3815
Returned value:
3816
  * function does not return value
118 diamond 3817
Format of context structure is shown in the description of
3818
subfunction 1.
114 mikedld 3819
Remarks:
118 diamond 3820
  * If the thread executes code of ring-0, the function returns
3821
    contents of registers of ring-3.
3822
  * Process must be loaded for debugging (as is shown in
3823
    general description).
114 mikedld 3824
 
3825
======================================================================
118 diamond 3826
===== Function 69, subfunction 3 - detach from debugged process. =====
114 mikedld 3827
======================================================================
3828
Parameters:
118 diamond 3829
  * eax = 69 - function number
3830
  * ebx = 3 - subfunction number
114 mikedld 3831
  * ecx = identifier
3832
Returned value:
3833
  * function does not return value
3834
Remarks:
118 diamond 3835
  * If the process was suspended, it resumes execution.
114 mikedld 3836
 
3837
======================================================================
118 diamond 3838
======== Function 69, subfunction 4 - suspend debugged thread. =======
114 mikedld 3839
======================================================================
3840
Parameters:
118 diamond 3841
  * eax = 69 - function number
3842
  * ebx = 4 - subfunction number
3843
  * ecx = thread identifier
114 mikedld 3844
Returned value:
3845
  * function does not return value
3846
Remarks:
118 diamond 3847
  * Process must be loaded for debugging (as is shown in
3848
    general description).
114 mikedld 3849
 
3850
======================================================================
118 diamond 3851
======== Function 69, subfunction 5 - resume debugged thread. ========
114 mikedld 3852
======================================================================
3853
Parameters:
118 diamond 3854
  * eax = 69 - function number
3855
  * ebx = 5 - subfunction number
3856
  * ecx = thread identifier
114 mikedld 3857
Returned value:
3858
  * function does not return value
3859
Remarks:
118 diamond 3860
  * Process must be loaded for debugging (as is shown in
3861
    general description).
114 mikedld 3862
 
3863
======================================================================
118 diamond 3864
= Fucntion 69, subfunction 6 - read from memory of debugged process. =
114 mikedld 3865
======================================================================
3866
Parameters:
118 diamond 3867
  * eax = 69 - function number
3868
  * ebx = 6 - subfunction number
114 mikedld 3869
  * ecx = identifier
118 diamond 3870
  * edx = number of bytes to read
3871
  * esi = address in the memory of debugged process
3872
  * edi = pointer to buffer for data
114 mikedld 3873
Returned value:
118 diamond 3874
  * eax = -1 at an error (invalid PID or buffer)
3875
  * otherwise eax = number of read bytes (possibly, 0,
3876
    if esi is too large)
114 mikedld 3877
Remarks:
118 diamond 3878
  * Process must be loaded for debugging (as is shown in
3879
    general description).
114 mikedld 3880
 
3881
======================================================================
118 diamond 3882
== Function 69, subfunction 7 - write to memory of debugged process. =
114 mikedld 3883
======================================================================
3884
Parameters:
118 diamond 3885
  * eax = 69 - function number
3886
  * ebx = 7 - subfunction number
114 mikedld 3887
  * ecx = identifier
118 diamond 3888
  * edx = number of bytes to write
3889
  * esi = address of memory in debugged process
3890
  * edi = pointer to data
114 mikedld 3891
Returned value:
118 diamond 3892
  * eax = -1 at an error (invalid PID or buffer)
3893
  * otherwise eax = number of written bytes (possibly, 0,
3894
    if esi is too large)
114 mikedld 3895
Remarks:
118 diamond 3896
  * Process must be loaded for debugging (as is shown in
3897
    general description).
114 mikedld 3898
 
3899
======================================================================
118 diamond 3900
======= Function 69, subfunction 8 - terminate debugged thread. ======
114 mikedld 3901
======================================================================
3902
Parameters:
118 diamond 3903
  * eax = 69 - function number
3904
  * ebx = 8 - subfunction number
114 mikedld 3905
  * ecx = identifier
3906
Returned value:
3907
  * function does not return value
3908
Remarks:
118 diamond 3909
  * Process must be loaded for debugging (as is shown in
3910
    general description).
3911
  * The function is similar to subfunction 2 of function 18
3912
    with two differences: it requires first remark and
3913
    accepts PID rather than slot number.
114 mikedld 3914
 
3915
======================================================================
118 diamond 3916
===== Function 69, subfunction 9 - set/clear hardware breakpoint. ====
114 mikedld 3917
======================================================================
3918
Parameters:
118 diamond 3919
  * eax = 69 - function number
3920
  * ebx = 9 - subfunction number
114 mikedld 3921
  * ecx = thread identifier
118 diamond 3922
  * dl = index of breakpoint, from 0 to 3 inclusively
114 mikedld 3923
  * dh = flags:
118 diamond 3924
    * if high bit is cleared - set breakpoint:
114 mikedld 3925
      * bits 0-1 - condition:
3926
        * 00 = breakpoint on execution
118 diamond 3927
        * 01 = breakpoint on read
3928
        * 11 = breakpoint on read/write
3929
      * bits 2-3 - length; for breakpoints on exception it must be
3930
        00, otherwise one of
3931
        * 00 = byte
114 mikedld 3932
        * 01 = word
118 diamond 3933
        * 11 = dword
3934
      * esi = breakpoint address; must be aligned according to
3935
        the length (i.e. must be even for word breakpoints,
3936
        divisible by 4 for dword)
3937
    * if high bit is set - clear breakpoint
114 mikedld 3938
Returned value:
118 diamond 3939
  * eax = 0 - success
114 mikedld 3940
  * eax = 1 - error in the input data
118 diamond 3941
  * eax = 2 - (reserved, is never returned in the current
3942
    implementation) a global breakpoint with that index is already set
114 mikedld 3943
Remarks:
118 diamond 3944
  * Process must be loaded for debugging (as is shown in
3945
    general description).
3946
  * Hardware breakpoints are implemented through DRx-registers of
3947
    the processor, all limitations results from this.
3948
  * The function can reinstall the breakpoint, previously set
3949
    by it (and it does not inform on this).
3950
    Carry on the list of set breakpoints in the debugger.
3951
  * Breakpoints generate debug exception #DB, on which the system
3952
    notifies debugger.
3953
  * Breakpoints on write and read/write act after
3954
    execution of the caused it instruction.
114 mikedld 3955
 
3956
======================================================================
118 diamond 3957
==== Function 70 - work with file system with long names support. ====
114 mikedld 3958
======================================================================
3959
Parameters:
3960
  * eax = 70
118 diamond 3961
  * ebx = pointer to the information structure
114 mikedld 3962
Returned value:
118 diamond 3963
  * eax = 0 - success; otherwise file system error code
3964
  * some subfunctions return value in other registers too
3965
General format of the information structure:
3966
  * +0: dword: subfunction number
3967
  * +4: dword: file offset
3968
  * +8: dword: high dword of offset (must be 0) or flags field
114 mikedld 3969
  * +12 = +0xC: dword: size
118 diamond 3970
  * +16 = +0x10: dword: pointer to data
3971
  * +20 = +0x14: n db: ASCIIZ-string with the filename
114 mikedld 3972
    or
3973
  * +20 = +0x14: db 0
118 diamond 3974
  * +21 = +0x15: dd pointer to ASCIIZ-string with the filename
3975
Specifications - in documentation on the appropriate subfunction.
3976
Filename is case-insensitive. Russian letters must be written in
3977
the encoding cp866 (DOS).
3978
Format of filename:
114 mikedld 3979
/base/number/dir1/dir2/.../dirn/file,
118 diamond 3980
where /base/number identifies device, on which file is located:
114 mikedld 3981
one of
118 diamond 3982
  * /RD/1 = /RAMDISK/1 to access ramdisk
3983
  * /FD/1 = /FLOPPYDISK/1 to access first floppy drive,
3984
    /FD/2 = /FLOPPYDISK/2 to access second one
3985
  * /HD0/x, /HD1/x, /HD2/x, /HD3/x to access accordingly to devices
3986
    IDE0 (Primary Master), IDE1 (Primary Slave),
114 mikedld 3987
    IDE2 (Secondary Master), IDE3 (Secondary Slave);
118 diamond 3988
    x - partition number on the selected hard drive, varies from 1
3989
    to 255 (on each hard drive the indexing starts from 1)
3990
  * /CD0/1, /CD1/1, /CD2/1, /CD3/1 to access accordingly to
3991
    CD on IDE0 (Primary Master), IDE1 (Primary Slave),
3992
    IDE2 (Secondary Master), IDE3 (Secondary Slave)
114 mikedld 3993
Examples:
3994
  * '/rd/1/kernel.asm',0
3995
  * '/HD0/1/kernel.asm',0
3996
  * '/hd0/2/menuet/pics/tanzania.bmp',0
3997
  * '/hd0/1/Program files/NameOfProgram/SomeFile.SomeExtension',0
118 diamond 3998
Available subfunctions:
114 mikedld 3999
  * subfunction 0 - read file
4000
  * subfunction 1 - read folder
4001
  * subfunction 2 - create/rewrite file
131 diamond 4002
  * subfunction 3 - write to existing file
133 diamond 4003
  * subfunction 4 - set file size
118 diamond 4004
  * subfunction 5 - get attributes of file/folder
4005
  * subfunction 6 - set attributes of file/folder
114 mikedld 4006
  * subfunction 7 - start application
193 diamond 4007
  * subfunction 8 - delete file/folder
321 diamond 4008
  * subfunction 9 - create folder
118 diamond 4009
For CD-drives due to hardware limitations only subfunctions
4010
0,1,5 and 7 are available, other subfunctions return error
4011
with code 2.
114 mikedld 4012
 
4013
======================================================================
118 diamond 4014
=== Function 70, subfunction 0 - read file with long names support. ==
114 mikedld 4015
======================================================================
4016
Parameters:
118 diamond 4017
  * eax = 70 - function number
4018
  * ebx = pointer to the information structure
4019
Format of the information structure:
4020
  * +0: dword: 0 = subfunction number
4021
  * +4: dword: file offset (in bytes)
4022
  * +8: dword: 0 (reserved for high dword of offset)
4023
  * +12 = +0xC: dword: number of bytes to read
4024
  * +16 = +0x10: dword: pointer to buffer for data
4025
  * +20 = +0x14: ASCIIZ-name of file, the rules of names forming are
4026
    given in the general description
114 mikedld 4027
    or
4028
  * +20 = +0x14: db 0
118 diamond 4029
  * +21 = +0x15: dd pointer to ASCIIZ-string with file name
114 mikedld 4030
Returned value:
118 diamond 4031
  * eax = 0 - success, otherwise file system error code
4032
  * ebx = number of read bytes or -1=0xffffffff if file was not found
114 mikedld 4033
Remarks:
118 diamond 4034
  * If file was ended before last requested block was read,
4035
    the function will read as many as it can, and after that return
4036
    eax=6 (EOF).
4037
  * The function does not allow to read folder (returns eax=10,
4038
    access denied).
114 mikedld 4039
 
118 diamond 4040
======================================================================
4041
== Function 70, subfunction 1 - read folder with long names support. =
4042
======================================================================
114 mikedld 4043
Parameters:
118 diamond 4044
  * eax = 70 - function number
4045
  * ebx = pointer to the information structure
4046
Format of the information structure:
4047
  * +0: dword: 1 = subfunction number
4048
  * +4: dword: index of starting block (beginning from 0)
4049
  * +8: dword: flags field:
114 mikedld 4050
    * bit 0 (mask 1): in what format to return names,
4051
      0=ANSI, 1=UNICODE
118 diamond 4052
    * other bits are reserved and must be set to 0 for the future
4053
      compatibility
4054
  * +12 = +0xC: dword: number of blocks to read
4055
  * +16 = +0x10: dword: pointer to buffer for data, buffer size
4056
    must be not less than 32 + [+12]*560 bytes
4057
  * +20 = +0x14: ASCIIZ-name of folder, the rules of names forming are
4058
    given in the general description
114 mikedld 4059
    or
4060
  * +20 = +0x14: db 0
118 diamond 4061
  * +21 = +0x15: dd pointer to ASCIIZ-string with file name
114 mikedld 4062
Returned value:
118 diamond 4063
  * eax = 0 - success, otherwise file system error code
4064
  * ebx = number of files, information on which was written to
4065
    the buffer, or -1=0xffffffff, if folder was not found
114 mikedld 4066
Structure of the buffer:
4067
  * +0: 32*byte: header
4068
  * +32 = +0x20: n1*byte: block with information on file 1
118 diamond 4069
  * +32+n1: n2*byte: block with information on file 2
114 mikedld 4070
  * ...
4071
Structure of header:
118 diamond 4072
  * +0: dword: version of structure (current is 1)
4073
  * +4: dword: number of placed blocks; is not greater than requested
4074
    in the field +12 of information structure; can be less, if
4075
    there are no more files in folder (the same as in ebx)
4076
  * +8: dword: total number of files in folder
4077
  * +12 = +0xC: 20*byte: reserved (zeroed)
4078
Structure of block of data for folder entry (BDFE):
4079
  * +0: dword: attributes of file:
4080
    * bit 0 (mask 1): file is read-only
4081
    * bit 1 (mask 2): file is hidden
4082
    * bit 2 (mask 4): file is system
4083
    * bit 3 (mask 8): this is not a file but volume label
4084
      (for one partition meets no more than once and
4085
      only in root folder)
4086
    * bit 4 (mask 0x10): this is a folder
4087
    * bit 5 (mask 0x20): file was not archived - many archivation
4088
      programs have an option to archive only files with this bit set,
4089
      and after archiving this bit is cleared - it can be useful
4090
      for automatically creating of backup-archives as at writing
4091
      this bit is usually set
4092
  * +4: byte: type of name data:
4093
    (coincides with bit 0 of flags in the information structure)
4094
    * 0 = ASCII = 1-byte representation of each character
4095
    * 1 = UNICODE = 2-byte representation of each character
114 mikedld 4096
  * +5: 3*byte: reserved (zero)
118 diamond 4097
  * +8: 4*byte: time of file creation
4098
  * +12 = +0xC: 4*byte: date of file creation
4099
  * +16 = +0x10: 4*byte: time of last access (read or write)
114 mikedld 4100
  * +20 = +0x14: 4*byte: date of last access
118 diamond 4101
  * +24 = +0x18: 4*byte: time of last modification
4102
  * +28 = +0x1C: 4*byte: date of last modification
4103
  * +32 = +0x20: qword: file size in bytes (up to 16777216 Tb)
114 mikedld 4104
  * +40 = +0x28: name
118 diamond 4105
    * for ASCII format: maximum length is 263 characters
4106
      (263 bytes), byte after the name has value 0
321 diamond 4107
    * for UNICODE format: maximum length is 259 characters
118 diamond 4108
      (518 bytes), 2 bytes after the name have value 0
4109
Time format:
114 mikedld 4110
  * +0: byte: seconds
4111
  * +1: byte: minutes
4112
  * +2: byte: hours
4113
  * +3: byte: reserved (0)
118 diamond 4114
  * for example, 23.59.59 is written as (in hex) 3B 3B 17 00
4115
Date format:
4116
  * +0: byte: day
4117
  * +1: byte: month
4118
  * +2: word: year
4119
  * for example, 25.11.1979 is written as (in hex) 19 0B BB 07
114 mikedld 4120
Remarks:
118 diamond 4121
  * If BDFE contains ASCII name, the length of BDFE is 304 bytes,
4122
    if UNICODE name - 560 bytes. Value of length is aligned
4123
    on 16-byte bound (to accelerate processing in CPU cache).
4124
  * First character after a name is zero (ASCIIZ-string). The further
4125
    data contain garbage.
4126
  * If files in folder were ended before requested number was read,
4127
    the function will read as many as it can, and after that return
4128
    eax=6 (EOF).
114 mikedld 4129
  * Any folder on the disk, except for root, contains two special
118 diamond 4130
    entries "." and "..", identifying accordingly the folder itself
4131
    and the parent folder.
4132
  * The function allows also to read virtual folders "/", "/rd",
4133
    "/fd", "/hd[n]", thus attributes of subfolders are set to 0x10,
4134
    and times and dates are zeroed. An alternative way to get the
4135
    equipment information - subfunction 11 of function 18.
114 mikedld 4136
 
4137
======================================================================
118 diamond 4138
===================== Function 70, subfunction 2 =====================
4139
============ Create/rewrite file with long names support. ============
114 mikedld 4140
======================================================================
4141
Parameters:
118 diamond 4142
  * eax = 70 - function number
4143
  * ebx = pointer to the information structure
4144
Format of the information structure:
4145
  * +0: dword: 2 = subfunction number
114 mikedld 4146
  * +4: dword: 0 (reserved)
4147
  * +8: dword: 0 (reserved)
118 diamond 4148
  * +12 = +0xC: dword: number of bytes to read
4149
  * +16 = +0x10: dword: pointer to data
4150
  * +20 = +0x14: ASCIIZ-name of file, the rules of names forming are
4151
    given in the general description
114 mikedld 4152
    or
4153
  * +20 = +0x14: db 0
118 diamond 4154
  * +21 = +0x15: dd pointer to ASCIIZ-string with file name
114 mikedld 4155
Returned value:
118 diamond 4156
  * eax = 0 - success, otherwise file system error code
4157
  * ebx = number of written bytes (possibly 0)
114 mikedld 4158
Remarks:
118 diamond 4159
  * If a file with given name did not exist, it is created;
4160
    if it existed, it is rewritten.
4161
  * If there is not enough free space on disk, the function will
4162
    write as many as can and then return error code 8.
4163
  * The function is not supported for CD (returns error code 2).
114 mikedld 4164
 
4165
======================================================================
131 diamond 4166
===================== Function 70, subfunction 3 =====================
4167
=========== Write to existing file with long names support. ==========
4168
======================================================================
4169
Parameters:
4170
  * eax = 70 - function number
4171
  * ebx = pointer to the information structure
4172
Format of the information structure:
4173
  * +0: dword: 3 = subfunction number
4174
  * +4: dword: file offset (in bytes)
4175
  * +8: dword: high dword of offset (must be 0 for FAT)
4176
  * +12 = +0xC: dword: number of bytes to write
4177
  * +16 = +0x10: dword: pointer to data
4178
  * +20 = +0x14: ASCIIZ-name of file, the rules of names forming are
4179
    given in the general description
4180
    or
4181
  * +20 = +0x14: db 0
4182
  * +21 = +0x15: dd pointer to ASCIIZ-string with file name
4183
Returned value:
4184
  * eax = 0 - success, otherwise file system error code
4185
  * ebx = number of written bytes (possibly 0)
4186
Remarks:
4187
  * The file must already exist, otherwise function returns eax=5.
4188
  * The only result of write 0 bytes is update in the file attributes
4189
    date/time of modification and access to the current date/time.
4190
  * If beginning and/or ending position is greater than file size
4191
    (except for the previous case), the file is expanded to needed
4192
    size with zero characters.
133 diamond 4193
  * The function is not supported for CD (returns error code 2).
131 diamond 4194
 
4195
======================================================================
133 diamond 4196
============ Function 70, subfunction 4 - set end of file. ===========
4197
======================================================================
4198
Parameters:
4199
  * eax = 70 - function number
4200
  * ebx = pointer to the information structure
4201
Format of the information structure:
4202
  * +0: dword: 4 = subfunction number
4203
  * +4: dword: low dword of new file size
4204
  * +8: dword: high dword of new file size (must be 0 for FAT)
4205
  * +12 = +0xC: dword: 0 (reserved)
4206
  * +16 = +0x10: dword: 0 (reserved)
4207
  * +20 = +0x14: ASCIIZ-name of file, the rules of names forming are
4208
    given in the general description
4209
    or
4210
  * +20 = +0x14: db 0
4211
  * +21 = +0x15: dd pointer to ASCIIZ-string with file name
4212
Returned value:
4213
  * eax = 0 - success, otherwise file system error code
4214
  * ebx destroyed
4215
Remarks:
4216
  * If the new file size is less than old one, file is truncated.
4217
    If the new size is greater than old one, file is expanded with
4218
    characters with code 0. If the new size is equal to old one,
4219
    the only result of call is set date/time of modification and
4220
    access to the current date/time.
4221
  * If there is not enough free space on disk for expansion, the
4222
    function will expand to maximum possible size and then return
4223
    error code 8.
4224
  * The function is not supported for CD (returns error code 2).
4225
 
4226
======================================================================
118 diamond 4227
==== Function 70, subfunction 5 - get information on file/folder. ====
114 mikedld 4228
======================================================================
4229
Parameters:
118 diamond 4230
  * eax = 70 - function number
4231
  * ebx = pointer to the information structure
4232
Format of the information structure:
4233
  * +0: dword: 5 = subfunction number
114 mikedld 4234
  * +4: dword: 0 (reserved)
4235
  * +8: dword: 0 (reserved)
4236
  * +12 = +0xC: dword: 0 (reserved)
118 diamond 4237
  * +16 = +0x10: dword: pointer to buffer for data (40 bytes)
4238
  * +20 = +0x14: ASCIIZ-name of file, the rules of names forming are
4239
    given in the general description
114 mikedld 4240
    or
4241
  * +20 = +0x14: db 0
118 diamond 4242
  * +21 = +0x15: dd pointer to ASCIIZ-string with file name
114 mikedld 4243
Returned value:
118 diamond 4244
  * eax = 0 - success, otherwise file system error code
4245
  * ebx destroyed
4246
Information on file is returned in the BDFE format (block of data
4247
for folder entry), explained in the description of
4248
subfunction 1, but without filename
4249
(i.e. only first 40 = 0x28 bytes).
114 mikedld 4250
Remarks:
118 diamond 4251
  * The function does not support virtual folders such as /, /rd and
4252
    root folders like /rd/1.
114 mikedld 4253
 
4254
======================================================================
118 diamond 4255
===== Function 70, subfunction 6 - set attributes of file/folder. ====
114 mikedld 4256
======================================================================
4257
Parameters:
118 diamond 4258
  * eax = 70 - function number
4259
  * ebx = pointer to the information structure
4260
Format of the information structure:
4261
  * +0: dword: 6 = subfunction number
114 mikedld 4262
  * +4: dword: 0 (reserved)
4263
  * +8: dword: 0 (reserved)
4264
  * +12 = +0xC: dword: 0 (reserved)
118 diamond 4265
  * +16 = +0x10: dword: pointer to buffer with attributes (32 bytes)
4266
  * +20 = +0x14: ASCIIZ-name of file, the rules of names forming are
4267
    given in the general description
114 mikedld 4268
    or
4269
  * +20 = +0x14: db 0
118 diamond 4270
  * +21 = +0x15: dd pointer to ASCIIZ-string with file name
114 mikedld 4271
Returned value:
118 diamond 4272
  * eax = 0 - success, otherwise file system error code
4273
  * ebx destroyed
4274
File attributes are first 32 bytes in BDFE (block of data
4275
for folder entry), explained in the description of subfunction 1
4276
(that is, without name and size of file). Attribute
4277
file/folder/volume label (bits 3,4 in dword +0) is not changed.
4278
Byte +4 (name format) is ignored.
114 mikedld 4279
Remarks:
118 diamond 4280
  * The function does not support virtual folders such as /, /rd and
4281
    root folders like /rd/1.
4282
  * The function is not supported for CD (returns error code 2).
114 mikedld 4283
 
4284
======================================================================
118 diamond 4285
=========== Function 70, subfunction 7 - start application. ==========
114 mikedld 4286
======================================================================
4287
Parameters:
118 diamond 4288
  * eax = 70 - function number
4289
  * ebx = pointer to the information structure
4290
Format of the information structure:
4291
  * +0: dword: 7 = subfunction number
4292
  * +4: dword: flags field:
4293
    * бит 0: start process as debugged
4294
    * other bits are reserved and must be set to 0
4295
  * +8: dword: 0 or pointer to ASCIIZ-string with parameters
114 mikedld 4296
  * +12 = +0xC: dword: 0 (reserved)
4297
  * +16 = +0x10: dword: 0 (reserved)
118 diamond 4298
  * +20 = +0x14: ASCIIZ-name of file, the rules of names forming are
4299
    given in the general description
114 mikedld 4300
    or
4301
  * +20 = +0x14: db 0
118 diamond 4302
  * +21 = +0x15: dd pointer to ASCIIZ-string with file name
114 mikedld 4303
Returned value:
4304
  * eax > 0 - program is loaded, eax contains PID
118 diamond 4305
  * eax < 0 - an error has occured, -eax contains
4306
    file system error code
4307
  * ebx destroyed
114 mikedld 4308
Remarks:
118 diamond 4309
  * Command line must be terminated by the character with the code 0
4310
    (ASCIIZ-string); function takes into account either all characters
4311
    up to terminating zero inclusively or first 256 character
4312
    regarding what is less.
4313
  * If the process is started as debugged, it is created in
4314
    the suspended state; to run use subfunction 5 of function 69.
114 mikedld 4315
 
4316
======================================================================
193 diamond 4317
========== Function 70, subfunction 8 - delete file/folder. ==========
4318
======================================================================
4319
Parameters:
4320
  * eax = 70 - function number
4321
  * ebx = pointer to the information structure
4322
Format of the information structure:
4323
  * +0: dword: 8 = subfunction number
4324
  * +4: dword: 0 (reserved)
4325
  * +8: dword: 0 (reserved)
4326
  * +12 = +0xC: dword: 0 (reserved)
4327
  * +16 = +0x10: dword: 0 (reserved)
4328
  * +20 = +0x14: ASCIIZ-name of file, the rules of names forming are
4329
    given in the general description
4330
    or
4331
  * +20 = +0x14: db 0
4332
  * +21 = +0x15: dd pointer to ASCIIZ-string with file name
4333
Returned value:
4334
  * eax = 0 - success, otherwise file system error code
4335
  * ebx destroyed
4336
Remarks:
4337
  * The function is not supported for CD (returns error code 2).
4338
  * The function can delete only empty folders (attempt to delete
4339
    nonempty folder results in error with code 10, "access denied").
4340
 
4341
======================================================================
321 diamond 4342
============= Function 70, subfunction 9 - create folder. ============
4343
======================================================================
4344
Parameters:
4345
  * eax = 70 - function number
4346
  * ebx = pointer to the information structure
4347
Format of the information structure:
4348
  * +0: dword: 9 = subfunction number
4349
  * +4: dword: 0 (reserved)
4350
  * +8: dword: 0 (reserved)
4351
  * +12 = +0xC: dword: 0 (reserved)
4352
  * +16 = +0x10: dword: 0 (reserved)
4353
  * +20 = +0x14: ASCIIZ-name of folder, the rules of names forming are
4354
    given in the general description
4355
    or
4356
  * +20 = +0x14: db 0
4357
  * +21 = +0x15: dd pointer to ASCIIZ-string with folder name
4358
Returned value:
4359
  * eax = 0 - success, otherwise file system error code
4360
  * ebx destroyed
4361
Remarks:
4362
  * The function is not supported for CD (returns error code 2).
4363
  * The parent folder must already exist.
4364
  * If target folder already exists, function returns success (eax=0).
4365
 
4366
======================================================================
118 diamond 4367
========== Function 71, subfunction 1 - set window caption. ==========
114 mikedld 4368
======================================================================
4369
Parameters:
4370
  * eax = 71 - function number
4371
  * ebx = 1 - subfunction number
118 diamond 4372
  * ecx = pointer to caption string
114 mikedld 4373
Returned value:
118 diamond 4374
  * function does not return value
114 mikedld 4375
Remarks:
118 diamond 4376
  * String must be in the ASCIIZ-format. Disregarding real string
4377
    length, no more than 255 characters are drawn.
4378
  * Pass NULL in ecx to remove caption.
114 mikedld 4379
 
4380
======================================================================
118 diamond 4381
=============== Function -1 - terminate thread/process ===============
114 mikedld 4382
======================================================================
4383
Parameters:
118 diamond 4384
  * eax = -1 - function number
114 mikedld 4385
Returned value:
118 diamond 4386
  * function does not return neither value nor control
114 mikedld 4387
Remarks:
118 diamond 4388
  * If the process did not create threads obviously, it has only
4389
    one thread, which termination results in process termination.
4390
  * If the current thread is last in the process, its termination
4391
    also results in process terminates.
4392
  * This function terminates the current thread. Other thread can be
4393
    killed by call to subfunction 2 of function 18.
114 mikedld 4394
 
4395
======================================================================
4396
=========================== List of events ===========================
4397
======================================================================
118 diamond 4398
Next event can be retrieved by the call of one from functions 10
4399
(to wait for event), 11 (to check without waiting), 23
4400
(to wait during the given time).
4401
These functions return only those events, which enter into a mask set
4402
by function 40. By default it is first three,
4403
there is enough for most applications.
114 mikedld 4404
Codes of events:
118 diamond 4405
  * 1 = redraw event (is reset by call to function 0)
4406
  * 2 = key on keyboard is pressed (acts, only when the window is
4407
    active) or hotkey is pressed; is reset, when all keys from
4408
    the buffer are read out by function 2
4409
  * 3 = button is pressed, defined earlier by function 8
4410
    (or close button, created implicitly by function 0;
4411
    minimize button is handled by the system and sends no message;
4412
    acts, only when the window is active;
4413
    is reset when all buttons from the buffer
4414
    are read out by function 17)
4415
  * 4 = reserved (in current implementation never comes even after
4416
    unmasking by function 40)
4417
  * 5 = the desktop background is redrawed (is reset automatically
4418
    after redraw, so if in redraw time program does not wait and
4419
    does not check events, it will not remark this event)
4420
  * 6 = mouse event (something happened - button pressing or moving;
4421
    is reset at reading)
4422
  * 7 = IPC event (see function 60 -
4423
    Inter Process Communication; is reset at reading)
4424
  * 8 = network event (is reset at reading)
4425
  * 9 = debug event (is reset at reading; see
4426
    debug subsystem)
4427
  * 16..31 = event with appropriate IRQ
4428
    (16=IRQ0, 31=IRQ15) (is reset after reading all IRQ data)
114 mikedld 4429
 
4430
======================================================================
118 diamond 4431
=================== Error codes of the file system ===================
114 mikedld 4432
======================================================================
118 diamond 4433
  * 0 = success
4434
  * 1 = base and/or partition of a hard disk is not defined
4435
    (by subfunctions 7, 8 of function 21)
4436
  * 2 = function is not supported for the given file system
4437
  * 3 = unknown file system
4438
  * 4 = is returned only from function 'rename' by transmission of
4439
    the strongly incorrect parameter and in any way does not
4440
    correspond to the description in the kernel sources
4441
    "partition not defined at hd"
4442
  * 5 = file not found
4443
  * 6 = end of file, EOF
4444
  * 7 = pointer lies outside of application memory
4445
  * 8 = disk is full
4446
  * 9 = FAT table is destroyed
114 mikedld 4447
  * 10 = access denied
118 diamond 4448
  * 11 = device error
4449
Application start functions can return also following errors:
4450
  * 30 = 0x1E = not enough memory
4451
  * 31 = 0x1F = file is not executable
4452
  * 32 = 0x20 = too many processes