Rev 8610 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
8610 | maxcodehac | 1 | //////////////////////////////////////////// |
2 | // KolibriOS Syscalls // |
||
3 | // sys/kos.h // |
||
8611 | maxcodehac | 4 | // Based on kos32sys and other wrappers // |
8610 | maxcodehac | 5 | // // |
6 | // Syscalls scheme: kos_XxxYyy // |
||
8611 | maxcodehac | 7 | // (e.g. kos_DrawWindow) // |
8610 | maxcodehac | 8 | //////////////////////////////////////////// |
9 | |||
8611 | maxcodehac | 10 | // Some code was written by maxcodehack |
11 | |||
8610 | maxcodehac | 12 | #include |
13 | #include |
||
14 | |||
8611 | maxcodehac | 15 | /*********************** Types *************************/ |
8610 | maxcodehac | 16 | typedef unsigned int color_t; |
17 | |||
18 | // Struct for App running |
||
19 | #pragma pack(push,1) |
||
20 | typedef struct |
||
21 | { |
||
22 | unsigned p00; |
||
23 | unsigned p04; |
||
24 | char *p08; |
||
25 | unsigned p12; |
||
26 | unsigned p16; |
||
27 | char p20; |
||
28 | char *p21; |
||
29 | } kos_Struct70; |
||
30 | #pragma pack(pop) |
||
31 | |||
32 | // Blitter struct |
||
33 | struct blit_call |
||
34 | { |
||
8611 | maxcodehac | 35 | int dstx; |
36 | int dsty; |
||
37 | int w; |
||
38 | int h; |
||
8610 | maxcodehac | 39 | |
8611 | maxcodehac | 40 | int srcx; |
41 | int srcy; |
||
42 | int srcw; |
||
43 | int srch; |
||
8610 | maxcodehac | 44 | |
8611 | maxcodehac | 45 | void *bitmap; |
46 | int stride; |
||
8610 | maxcodehac | 47 | }; |
48 | |||
49 | // Process info for sysfn 9 |
||
50 | #pragma pack(push, 1) |
||
51 | struct proc_info |
||
52 | { |
||
8611 | maxcodehac | 53 | unsigned long cpu_usage; |
54 | unsigned short pos_in_stack; |
||
55 | unsigned short slot; |
||
56 | unsigned short reserved; |
||
57 | char name[12]; |
||
58 | unsigned long address; |
||
59 | unsigned long memory_usage; |
||
60 | unsigned long ID; |
||
61 | unsigned long left,top; |
||
62 | unsigned long width,height; |
||
63 | unsigned short thread_state; |
||
64 | unsigned short reserved2; |
||
65 | unsigned long cleft, ctop, cwidth, cheight; |
||
66 | unsigned char window_state; |
||
67 | unsigned char reserved3[1024-71]; |
||
8610 | maxcodehac | 68 | }; |
69 | #pragma pack(pop) |
||
70 | |||
8611 | maxcodehac | 71 | // Color struct for sysfn 48 |
8610 | maxcodehac | 72 | struct kolibri_system_colors { |
73 | color_t frame_area; |
||
74 | color_t grab_bar; |
||
75 | color_t grab_bar_button; |
||
76 | color_t grab_button_text; |
||
77 | color_t grab_text; |
||
78 | color_t work_area; |
||
79 | color_t work_button; |
||
80 | color_t work_button_text; |
||
81 | color_t work_text; |
||
82 | color_t work_graph; |
||
83 | }; |
||
84 | |||
85 | typedef union __attribute__((packed)) |
||
86 | { |
||
8611 | maxcodehac | 87 | uint32_t val; |
88 | struct |
||
89 | { |
||
90 | short x; |
||
91 | short y; |
||
92 | }; |
||
8610 | maxcodehac | 93 | } pos_t; |
94 | |||
95 | |||
8611 | maxcodehac | 96 | /*********************** Window Syscalls *************************/ |
8610 | maxcodehac | 97 | // Start drawing |
98 | static inline void kos_BeginDraw(void) |
||
99 | { |
||
8611 | maxcodehac | 100 | __asm__ __volatile__( |
101 | "int $0x40" ::"a"(12),"b"(1)); |
||
8610 | maxcodehac | 102 | }; |
103 | |||
104 | // End drawing |
||
105 | static inline void kos_EndDraw(void) |
||
106 | { |
||
8611 | maxcodehac | 107 | __asm__ __volatile__( |
108 | "int $0x40" ::"a"(12),"b"(2)); |
||
8610 | maxcodehac | 109 | }; |
110 | |||
111 | // Draw window |
||
112 | static inline void kos_DrawWindow(int x, int y, int w, int h, const char *title, |
||
8611 | maxcodehac | 113 | color_t bgcolor, uint32_t style) |
8610 | maxcodehac | 114 | { |
8611 | maxcodehac | 115 | __asm__ __volatile__( |
116 | "int $0x40" |
||
117 | ::"a"(0), |
||
118 | "b"((x << 16) | ((w-1) & 0xFFFF)), |
||
119 | "c"((y << 16) | ((h-1) & 0xFFFF)), |
||
120 | "d"((style << 24) | (bgcolor & 0xFFFFFF)), |
||
121 | "D"(title), |
||
122 | "S"(0) : "memory"); |
||
8610 | maxcodehac | 123 | }; |
124 | |||
8611 | maxcodehac | 125 | // Set window layer behaviour |
126 | #define ZPOS_DESKTOP -2 |
||
127 | #define ZPOS_ALWAYS_BACK -1 |
||
128 | #define ZPOS_NORMAL 0 |
||
129 | #define ZPOS_ALWAYS_TOP 1 |
||
130 | |||
131 | static inline void kos_SetWindowLayerBehaviour(int zpos) |
||
132 | { |
||
133 | __asm__ __volatile__( |
||
134 | "int $0x40" |
||
135 | ::"a"(18), |
||
136 | "b"(25), |
||
137 | "c"(2), |
||
138 | "d"(-1), |
||
139 | "S"(zpos) : "memory"); |
||
140 | }; |
||
141 | |||
8610 | maxcodehac | 142 | // Change window size |
143 | #define OLD -1 |
||
144 | static inline void kos_ChangeWindow(int new_x, int new_y, int new_w, int new_h) |
||
145 | { |
||
8611 | maxcodehac | 146 | __asm__ __volatile__( |
147 | "int $0x40" |
||
148 | ::"a"(67), "b"(new_x), "c"(new_y), "d"(new_w),"S"(new_h) |
||
149 | ); |
||
8610 | maxcodehac | 150 | } |
151 | |||
8611 | maxcodehac | 152 | /*********************** Other GUI functions *************************/ |
8610 | maxcodehac | 153 | // Draw text |
154 | static inline void kos_DrawText(int x, int y, const char *text, color_t color) |
||
155 | { |
||
8611 | maxcodehac | 156 | __asm__ __volatile__( |
157 | "int $0x40" |
||
158 | ::"a"(4),"d"(text), |
||
159 | "b"((x << 16) | y), |
||
160 | "S"(strlen(text)),"c"(color) |
||
161 | :"memory"); |
||
8610 | maxcodehac | 162 | } |
163 | |||
164 | // Draw button |
||
165 | static inline void kos_DrawButton(int x, int y, int w, int h, int id, color_t color) |
||
166 | { |
||
8611 | maxcodehac | 167 | __asm__ __volatile__( |
168 | "int $0x40" |
||
169 | ::"a"(8), |
||
170 | "b"(x * 65536 + w), |
||
171 | "c"(y * 65536 + h), |
||
172 | "d"(id), |
||
173 | "S"(color)); |
||
8610 | maxcodehac | 174 | }; |
175 | |||
176 | // Draw button with text |
||
177 | void kos_DrawButtonWithText(int x, int y, int w, int h, int id, color_t color, const char* text) |
||
178 | { |
||
179 | kos_DrawButton(x, y, w, h, id, color); |
||
180 | |||
181 | int tx = ((((-strlen(text))*8)+w)/2)+x; |
||
182 | int ty = h/2-7+y; |
||
183 | |||
184 | kos_DrawText(tx, ty, text, 0x90000000); |
||
185 | }; |
||
186 | |||
187 | // Draw line |
||
188 | static inline void kos_DrawLine(int x_start, int y_start, int x_end, int y_end, color_t color) |
||
189 | { |
||
8611 | maxcodehac | 190 | __asm__ __volatile__( |
191 | "int $0x40" |
||
192 | ::"a"(38), "d"(color), |
||
193 | "b"((x_start << 16) | x_end), |
||
194 | "c"((y_start << 16) | y_end)); |
||
8610 | maxcodehac | 195 | } |
196 | |||
197 | // Draw bar |
||
198 | static inline void kos_DrawBar(int x, int y, int w, int h, color_t color) |
||
199 | { |
||
8611 | maxcodehac | 200 | __asm__ __volatile__( |
201 | "int $0x40" |
||
202 | ::"a"(13), "d"(color), |
||
203 | "b"((x << 16) | w), |
||
204 | "c"((y << 16) | h)); |
||
8610 | maxcodehac | 205 | } |
206 | |||
207 | // Put one pixel |
||
208 | void kos_PutPixel(int x, int y, color_t color) { |
||
209 | __asm__ __volatile__("int $0x40" |
||
210 | ::"a"(1), |
||
211 | "b"(x), |
||
212 | "c"(y), |
||
213 | "d"(color)); |
||
214 | } |
||
215 | |||
216 | // Draw bitmap image |
||
217 | static inline void kos_DrawBitmap(void *bitmap, int x, int y, int w, int h) |
||
218 | { |
||
8611 | maxcodehac | 219 | __asm__ __volatile__( |
220 | "int $0x40" |
||
221 | ::"a"(7), "b"(bitmap), |
||
222 | "c"((w << 16) | h), |
||
223 | "d"((x << 16) | y)); |
||
8610 | maxcodehac | 224 | } |
225 | |||
8611 | maxcodehac | 226 | // Blitter |
227 | static inline void Blit(void *bitmap, int dst_x, int dst_y, |
||
228 | int src_x, int src_y, int w, int h, |
||
229 | int src_w, int src_h, int stride) |
||
230 | { |
||
231 | volatile struct blit_call bc; |
||
8610 | maxcodehac | 232 | |
8611 | maxcodehac | 233 | bc.dstx = dst_x; |
234 | bc.dsty = dst_y; |
||
235 | bc.w = w; |
||
236 | bc.h = h; |
||
237 | bc.srcx = src_x; |
||
238 | bc.srcy = src_y; |
||
239 | bc.srcw = src_w; |
||
240 | bc.srch = src_h; |
||
241 | bc.stride = stride; |
||
242 | bc.bitmap = bitmap; |
||
243 | |||
244 | __asm__ __volatile__( |
||
245 | "int $0x40" |
||
246 | ::"a"(73),"b"(0),"c"(&bc.dstx)); |
||
247 | }; |
||
248 | |||
249 | // Get screen part as image |
||
250 | static inline void kos_ScreenShot(char* image, int x, int y, int w, int h) |
||
251 | { |
||
252 | __asm__ __volatile__( |
||
253 | "int $0x40" |
||
254 | ::"a"(36), |
||
255 | "b"(image), |
||
256 | "c"(w*65536+h), |
||
257 | "d"(x*65536+y) : "memory"); |
||
258 | }; |
||
259 | |||
260 | /*********************** Skin *************************/ |
||
8610 | maxcodehac | 261 | // Return skin height |
262 | static inline uint32_t kos_SkinHeight(void) |
||
263 | { |
||
8611 | maxcodehac | 264 | uint32_t height; |
8610 | maxcodehac | 265 | |
8611 | maxcodehac | 266 | __asm__ __volatile__( |
267 | "int $0x40 \n\t" |
||
268 | :"=a"(height) |
||
269 | :"a"(48),"b"(4)); |
||
270 | return height; |
||
8610 | maxcodehac | 271 | }; |
272 | |||
8611 | maxcodehac | 273 | /*********************** Mouse *************************/ |
8610 | maxcodehac | 274 | // Get mouse position |
275 | #define POS_SCREEN 0 |
||
276 | #define POS_WINDOW 1 |
||
277 | |||
278 | static inline |
||
279 | pos_t kos_GetMousePos(int origin) |
||
280 | { |
||
8611 | maxcodehac | 281 | pos_t val; |
8610 | maxcodehac | 282 | |
8611 | maxcodehac | 283 | __asm__ __volatile__( |
284 | "int $0x40 \n\t" |
||
285 | "rol $16, %%eax" |
||
286 | :"=a"(val) |
||
287 | :"a"(37),"b"(origin)); |
||
288 | return val; |
||
8610 | maxcodehac | 289 | } |
290 | |||
291 | // Get mouse buttons |
||
292 | static inline |
||
293 | uint32_t kos_GetMouseButtons(void) |
||
294 | { |
||
8611 | maxcodehac | 295 | uint32_t val; |
8610 | maxcodehac | 296 | |
8611 | maxcodehac | 297 | __asm__ __volatile__( |
298 | "int $0x40" |
||
299 | :"=a"(val) |
||
300 | :"a"(37),"b"(2)); |
||
301 | return val; |
||
8610 | maxcodehac | 302 | }; |
303 | |||
304 | // Get mouse wheels |
||
305 | static inline |
||
306 | uint32_t kos_GetMouseWheels(void) |
||
307 | { |
||
8611 | maxcodehac | 308 | uint32_t val; |
8610 | maxcodehac | 309 | |
8611 | maxcodehac | 310 | __asm__ __volatile__( |
311 | "int $0x40 \n\t" |
||
312 | :"=a"(val) |
||
313 | :"a"(37),"b"(7)); |
||
314 | return val; |
||
8610 | maxcodehac | 315 | }; |
316 | |||
317 | // Load cursor |
||
318 | static inline uint32_t kos_LoadCursor(void *path, uint32_t flags) |
||
319 | { |
||
8611 | maxcodehac | 320 | uint32_t val; |
321 | __asm__ __volatile__( |
||
322 | "int $0x40" |
||
323 | :"=a"(val) |
||
324 | :"a"(37), "b"(4), "c"(path), "d"(flags)); |
||
325 | return val; |
||
8610 | maxcodehac | 326 | } |
327 | |||
328 | // Set cursor |
||
329 | static inline uint32_t kos_SetCursor(uint32_t cursor) |
||
330 | { |
||
8611 | maxcodehac | 331 | uint32_t old; |
332 | __asm__ __volatile__( |
||
333 | "int $0x40" |
||
334 | :"=a"(old) |
||
335 | :"a"(37), "b"(5), "c"(cursor)); |
||
336 | return old; |
||
8610 | maxcodehac | 337 | }; |
338 | |||
339 | // Destroy cursor |
||
340 | static inline int kos_DestroyCursor(uint32_t cursor) |
||
341 | { |
||
8611 | maxcodehac | 342 | int ret; |
343 | __asm__ __volatile__( |
||
344 | "int $0x40" |
||
345 | :"=a"(ret) |
||
346 | :"a"(37), "b"(6), "c"(cursor) |
||
347 | :"memory"); |
||
348 | return ret; |
||
8610 | maxcodehac | 349 | }; |
350 | |||
8611 | maxcodehac | 351 | /*********************** OS Events *************************/ |
8610 | maxcodehac | 352 | #define evReDraw 1 |
353 | #define evKey 2 |
||
354 | #define evButton 3 |
||
355 | #define evExit 4 |
||
356 | #define evDesktop 5 |
||
357 | #define evMouse 6 |
||
358 | #define evIPC 7 |
||
359 | #define evNetwork 8 |
||
360 | #define evDebug 9 |
||
361 | |||
362 | static inline |
||
363 | uint32_t kos_WaitForEventTimeout(uint32_t time) |
||
364 | { |
||
8611 | maxcodehac | 365 | uint32_t val; |
366 | __asm__ __volatile__( |
||
367 | "int $0x40" |
||
368 | :"=a"(val) |
||
369 | :"a"(23), "b"(time)); |
||
370 | return val; |
||
8610 | maxcodehac | 371 | }; |
372 | |||
373 | static inline uint32_t kos_CheckForEvent(void) |
||
374 | { |
||
8611 | maxcodehac | 375 | uint32_t val; |
376 | __asm__ __volatile__( |
||
377 | "int $0x40" |
||
378 | :"=a"(val) |
||
379 | :"a"(11)); |
||
380 | return val; |
||
8610 | maxcodehac | 381 | }; |
382 | |||
383 | static inline uint32_t kos_WaitForEvent(void) |
||
384 | { |
||
8611 | maxcodehac | 385 | uint32_t val; |
386 | __asm__ __volatile__( |
||
387 | "int $0x40" |
||
388 | :"=a"(val) |
||
389 | :"a"(10)); |
||
390 | return val; |
||
8610 | maxcodehac | 391 | }; |
392 | |||
8611 | maxcodehac | 393 | /*********************** Eventmask *************************/ |
8610 | maxcodehac | 394 | #define EVM_REDRAW 1 |
395 | #define EVM_KEY 2 |
||
396 | #define EVM_BUTTON 4 |
||
397 | #define EVM_EXIT 8 |
||
398 | #define EVM_BACKGROUND 16 |
||
399 | #define EVM_MOUSE 32 |
||
400 | #define EVM_IPC 64 |
||
401 | #define EVM_STACK 128 |
||
402 | #define EVM_DEBUG 256 |
||
403 | #define EVM_STACK2 512 |
||
404 | #define EVM_MOUSE_FILTER 0x80000000 |
||
405 | #define EVM_CURSOR_FILTER 0x40000000 |
||
406 | |||
407 | static inline uint32_t kos_SetMaskForEvents(uint32_t event_mask) |
||
408 | { |
||
8611 | maxcodehac | 409 | uint32_t old_event_mask; |
410 | __asm__ __volatile__( |
||
411 | "int $0x40" |
||
412 | :"=a"(old_event_mask) |
||
413 | :"a"(40),"b"(event_mask)); |
||
414 | |||
415 | return old_event_mask; |
||
8610 | maxcodehac | 416 | }; |
417 | |||
8611 | maxcodehac | 418 | /*********************** Other *************************/ |
8610 | maxcodehac | 419 | // Get key |
420 | int kos_GetKey() |
||
421 | { |
||
422 | unsigned short key; |
||
423 | __asm__ __volatile__("int $0x40":"=a"(key):"0"(2)); |
||
424 | if(!(key & 0xFF)) return (key>>8)&0xFF; else return 0; |
||
425 | } |
||
426 | |||
427 | // Get pressed button ID |
||
428 | static inline |
||
429 | uint32_t kos_GetButtonID(void) |
||
430 | { |
||
8611 | maxcodehac | 431 | uint32_t val; |
432 | __asm__ __volatile__( |
||
433 | "int $0x40" |
||
434 | :"=a"(val) |
||
435 | :"a"(17)); |
||
436 | return val>>8; |
||
8610 | maxcodehac | 437 | }; |
438 | |||
439 | // Sleep.. |
||
440 | static inline void kos_Delay(uint32_t time) |
||
441 | { |
||
8611 | maxcodehac | 442 | __asm__ __volatile__( |
443 | "int $0x40" |
||
444 | ::"a"(5), "b"(time) |
||
445 | :"memory"); |
||
8610 | maxcodehac | 446 | }; |
447 | |||
448 | // Get screen size |
||
449 | static inline |
||
450 | pos_t kos_ScreenSize() |
||
451 | { |
||
452 | pos_t size; |
||
453 | __asm__ __volatile__( |
||
454 | "int $0x40" |
||
455 | :"=a"(size) |
||
456 | :"a"(14)); |
||
457 | |||
458 | return size; |
||
459 | }; |
||
460 | |||
461 | // Get system color table |
||
462 | static inline void kos_GetSystemColors(struct kolibri_system_colors *color_table) |
||
463 | { |
||
464 | __asm__ __volatile__ ("int $0x40" |
||
465 | : |
||
466 | :"a"(48),"b"(3),"c"(color_table),"d"(40) |
||
467 | ); |
||
468 | } |
||
469 | |||
470 | // SysFn 9 |
||
471 | static inline void kos_ProcessInfo(char *info) |
||
472 | { |
||
8611 | maxcodehac | 473 | __asm__ __volatile__( |
474 | "int $0x40" |
||
475 | : |
||
476 | :"a"(9), "b"(info), "c"(-1) |
||
477 | :"memory"); |
||
8610 | maxcodehac | 478 | }; |
479 | |||
480 | void kos_RunApp(char* app, char* param) |
||
481 | { |
||
482 | kos_Struct70 r; |
||
483 | r.p00 = 7; |
||
484 | r.p04 = 0; |
||
485 | r.p08 = param; |
||
486 | r.p12 = 0; |
||
487 | r.p16 = 0; |
||
488 | r.p20 = 0; |
||
489 | r.p21 = app; |
||
490 | __asm__ __volatile__ ("int $0x40"::"a"(70), "b"(&r)); |
||
491 | }><>><>><>><>><>><>><>><>><>><> |