From 4657dec23b130b369d111b93aaa6c71c3ff549ea Mon Sep 17 00:00:00 2001 From: maxcodehack Date: Wed, 24 Feb 2021 08:40:54 +0000 Subject: [PATCH] Add new syscall wrapper - sys/kos.h Fridge: improve and move to sys/kos.h git-svn-id: svn://kolibrios.org@8610 a494cfbc-eb01-0410-851d-a64ba20cac60 --- .../sdk/sources/newlib/libc/include/sys/kos.h | 461 ++++++++++++++++++ programs/games/fridge/fridge.c | 67 +-- 2 files changed, 484 insertions(+), 44 deletions(-) create mode 100755 contrib/sdk/sources/newlib/libc/include/sys/kos.h diff --git a/contrib/sdk/sources/newlib/libc/include/sys/kos.h b/contrib/sdk/sources/newlib/libc/include/sys/kos.h new file mode 100755 index 0000000000..f46160aa5f --- /dev/null +++ b/contrib/sdk/sources/newlib/libc/include/sys/kos.h @@ -0,0 +1,461 @@ +//////////////////////////////////////////// +// Copyright (C) 2021 maxcodehack, GPLv2 // +// KolibriOS Syscalls // +// sys/kos.h // +// // +// Syscalls scheme: kos_XxxYyy // +// (e.g. kos_DrawWindow) // +//////////////////////////////////////////// + +#include +#include + +typedef unsigned int color_t; + +// Struct for App running +#pragma pack(push,1) +typedef struct +{ +unsigned p00; +unsigned p04; +char *p08; +unsigned p12; +unsigned p16; +char p20; +char *p21; +} kos_Struct70; +#pragma pack(pop) + +// Blitter struct +struct blit_call +{ + int dstx; + int dsty; + int w; + int h; + + int srcx; + int srcy; + int srcw; + int srch; + + void *bitmap; + int stride; +}; + +// Process info for sysfn 9 +#pragma pack(push, 1) +struct proc_info +{ + unsigned long cpu_usage; + unsigned short pos_in_stack; + unsigned short slot; + unsigned short reserved; + char name[12]; + unsigned long address; + unsigned long memory_usage; + unsigned long ID; + unsigned long left,top; + unsigned long width,height; + unsigned short thread_state; + unsigned short reserved2; + unsigned long cleft, ctop, cwidth, cheight; + unsigned char window_state; + unsigned char reserved3[1024-71]; +}; +#pragma pack(pop) + +// Color struct for sysfn ? +struct kolibri_system_colors { + color_t frame_area; + color_t grab_bar; + color_t grab_bar_button; + color_t grab_button_text; + color_t grab_text; + color_t work_area; + color_t work_button; + color_t work_button_text; + color_t work_text; + color_t work_graph; +}; + +typedef union __attribute__((packed)) +{ + uint32_t val; + struct + { + short x; + short y; + }; +} pos_t; + + +/// Window Syscalls: +// Start drawing +static inline void kos_BeginDraw(void) +{ + __asm__ __volatile__( + "int $0x40" ::"a"(12),"b"(1)); +}; + +// End drawing +static inline void kos_EndDraw(void) +{ + __asm__ __volatile__( + "int $0x40" ::"a"(12),"b"(2)); +}; + +// Draw window +static inline void kos_DrawWindow(int x, int y, int w, int h, const char *title, + color_t bgcolor, uint32_t style) +{ + __asm__ __volatile__( + "int $0x40" + ::"a"(0), + "b"((x << 16) | ((w-1) & 0xFFFF)), + "c"((y << 16) | ((h-1) & 0xFFFF)), + "d"((style << 24) | (bgcolor & 0xFFFFFF)), + "D"(title), + "S"(0) : "memory"); +}; + +// Change window size +#define OLD -1 +static inline void kos_ChangeWindow(int new_x, int new_y, int new_w, int new_h) +{ + __asm__ __volatile__( + "int $0x40" + ::"a"(67), "b"(new_x), "c"(new_y), "d"(new_w),"S"(new_h) + ); +} + +/// Other GUI functions: +// Draw text +static inline void kos_DrawText(int x, int y, const char *text, color_t color) +{ + __asm__ __volatile__( + "int $0x40" + ::"a"(4),"d"(text), + "b"((x << 16) | y), + "S"(strlen(text)),"c"(color) + :"memory"); +} + +// Draw button +static inline void kos_DrawButton(int x, int y, int w, int h, int id, color_t color) +{ + __asm__ __volatile__( + "int $0x40" + ::"a"(8), + "b"(x * 65536 + w), + "c"(y * 65536 + h), + "d"(id), + "S"(color)); +}; + +// Draw button with text +void kos_DrawButtonWithText(int x, int y, int w, int h, int id, color_t color, const char* text) +{ + kos_DrawButton(x, y, w, h, id, color); + + int tx = ((((-strlen(text))*8)+w)/2)+x; + int ty = h/2-7+y; + + kos_DrawText(tx, ty, text, 0x90000000); +}; + +// Draw line +static inline void kos_DrawLine(int x_start, int y_start, int x_end, int y_end, color_t color) +{ + __asm__ __volatile__( + "int $0x40" + ::"a"(38), "d"(color), + "b"((x_start << 16) | x_end), + "c"((y_start << 16) | y_end)); +} + +// Draw bar +static inline void kos_DrawBar(int x, int y, int w, int h, color_t color) +{ + __asm__ __volatile__( + "int $0x40" + ::"a"(13), "d"(color), + "b"((x << 16) | w), + "c"((y << 16) | h)); +} + +// Put one pixel +void kos_PutPixel(int x, int y, color_t color) { + __asm__ __volatile__("int $0x40" + ::"a"(1), + "b"(x), + "c"(y), + "d"(color)); +} + +// Draw bitmap image +static inline void kos_DrawBitmap(void *bitmap, int x, int y, int w, int h) +{ + __asm__ __volatile__( + "int $0x40" + ::"a"(7), "b"(bitmap), + "c"((w << 16) | h), + "d"((x << 16) | y)); +} + + +/// Skin: +// Return skin height +static inline uint32_t kos_SkinHeight(void) +{ + uint32_t height; + + __asm__ __volatile__( + "int $0x40 \n\t" + :"=a"(height) + :"a"(48),"b"(4)); + return height; +}; + +/// Mouse: +// Get mouse position +#define POS_SCREEN 0 +#define POS_WINDOW 1 + +static inline +pos_t kos_GetMousePos(int origin) +{ + pos_t val; + + __asm__ __volatile__( + "int $0x40 \n\t" + "rol $16, %%eax" + :"=a"(val) + :"a"(37),"b"(origin)); + return val; +} + +// Get mouse buttons +static inline +uint32_t kos_GetMouseButtons(void) +{ + uint32_t val; + + __asm__ __volatile__( + "int $0x40" + :"=a"(val) + :"a"(37),"b"(2)); + return val; +}; + +// Get mouse wheels +static inline +uint32_t kos_GetMouseWheels(void) +{ + uint32_t val; + + __asm__ __volatile__( + "int $0x40 \n\t" + :"=a"(val) + :"a"(37),"b"(7)); + return val; +}; + +// Load cursor +static inline uint32_t kos_LoadCursor(void *path, uint32_t flags) +{ + uint32_t val; + __asm__ __volatile__( + "int $0x40" + :"=a"(val) + :"a"(37), "b"(4), "c"(path), "d"(flags)); + return val; +} + +// Set cursor +static inline uint32_t kos_SetCursor(uint32_t cursor) +{ + uint32_t old; + __asm__ __volatile__( + "int $0x40" + :"=a"(old) + :"a"(37), "b"(5), "c"(cursor)); + return old; +}; + +// Destroy cursor +static inline int kos_DestroyCursor(uint32_t cursor) +{ + int ret; + __asm__ __volatile__( + "int $0x40" + :"=a"(ret) + :"a"(37), "b"(6), "c"(cursor) + :"memory"); + return ret; +}; + +/// OS Events: +#define evReDraw 1 +#define evKey 2 +#define evButton 3 +#define evExit 4 +#define evDesktop 5 +#define evMouse 6 +#define evIPC 7 +#define evNetwork 8 +#define evDebug 9 + +static inline +uint32_t kos_WaitForEventTimeout(uint32_t time) +{ + uint32_t val; + __asm__ __volatile__( + "int $0x40" + :"=a"(val) + :"a"(23), "b"(time)); + return val; +}; + +static inline uint32_t kos_CheckForEvent(void) +{ + uint32_t val; + __asm__ __volatile__( + "int $0x40" + :"=a"(val) + :"a"(11)); + return val; +}; + +static inline uint32_t kos_WaitForEvent(void) +{ + uint32_t val; + __asm__ __volatile__( + "int $0x40" + :"=a"(val) + :"a"(10)); + return val; +}; + +/// Eventmask: +#define EVM_REDRAW 1 +#define EVM_KEY 2 +#define EVM_BUTTON 4 +#define EVM_EXIT 8 +#define EVM_BACKGROUND 16 +#define EVM_MOUSE 32 +#define EVM_IPC 64 +#define EVM_STACK 128 +#define EVM_DEBUG 256 +#define EVM_STACK2 512 +#define EVM_MOUSE_FILTER 0x80000000 +#define EVM_CURSOR_FILTER 0x40000000 + +static inline uint32_t kos_SetMaskForEvents(uint32_t event_mask) +{ + uint32_t old_event_mask; + __asm__ __volatile__( + "int $0x40" + :"=a"(old_event_mask) + :"a"(40),"b"(event_mask)); + + return old_event_mask; +}; + +/// Other: +// Get key +int kos_GetKey() +{ + unsigned short key; + __asm__ __volatile__("int $0x40":"=a"(key):"0"(2)); + if(!(key & 0xFF)) return (key>>8)&0xFF; else return 0; +} + +// Get pressed button ID +static inline +uint32_t kos_GetButtonID(void) +{ + uint32_t val; + __asm__ __volatile__( + "int $0x40" + :"=a"(val) + :"a"(17)); + return val>>8; +}; + +// Sleep.. +static inline void kos_Delay(uint32_t time) +{ + __asm__ __volatile__( + "int $0x40" + ::"a"(5), "b"(time) + :"memory"); +}; + +// Get screen size +static inline +pos_t kos_ScreenSize() +{ + pos_t size; + __asm__ __volatile__( + "int $0x40" + :"=a"(size) + :"a"(14)); + + return size; +}; + +// Get system color table +static inline void kos_GetSystemColors(struct kolibri_system_colors *color_table) +{ + __asm__ __volatile__ ("int $0x40" + : + :"a"(48),"b"(3),"c"(color_table),"d"(40) + ); +} + +// SysFn 9 +static inline void kos_ProcessInfo(char *info) +{ + __asm__ __volatile__( + "int $0x40" + : + :"a"(9), "b"(info), "c"(-1) + :"memory"); +}; + +// Blitter +static inline void Blit(void *bitmap, int dst_x, int dst_y, + int src_x, int src_y, int w, int h, + int src_w, int src_h, int stride) +{ + volatile struct blit_call bc; + + bc.dstx = dst_x; + bc.dsty = dst_y; + bc.w = w; + bc.h = h; + bc.srcx = src_x; + bc.srcy = src_y; + bc.srcw = src_w; + bc.srch = src_h; + bc.stride = stride; + bc.bitmap = bitmap; + + __asm__ __volatile__( + "int $0x40" + ::"a"(73),"b"(0),"c"(&bc.dstx)); +}; + +void kos_RunApp(char* app, char* param) +{ + kos_Struct70 r; + r.p00 = 7; + r.p04 = 0; + r.p08 = param; + r.p12 = 0; + r.p16 = 0; + r.p20 = 0; + r.p21 = app; + __asm__ __volatile__ ("int $0x40"::"a"(70), "b"(&r)); +} diff --git a/programs/games/fridge/fridge.c b/programs/games/fridge/fridge.c index 922e936692..d4c8d881cb 100644 --- a/programs/games/fridge/fridge.c +++ b/programs/games/fridge/fridge.c @@ -1,5 +1,5 @@ // Includes // -#include +#include #include #include #include @@ -8,19 +8,6 @@ #include // #include "mp3.h" - -// C-- event defines // -#define evReDraw 1 -#define evKey 2 -#define evButton 3 -#define evExit 4 -#define evDesktop 5 -#define evMouse 6 -#define evIPC 7 -#define evNetwork 8 -#define evDebug 9 - - // Code // #define button_color 0xbbbbbb #define button_size 44 @@ -41,8 +28,8 @@ short victory = 0; // Load pictures // char temp_path[4096]; -char* HORIZONTAL_IMAGE; -char* VERTICAL_IMAGE; +Image* HORIZONTAL_IMAGE; +Image* VERTICAL_IMAGE; char* load_file_inmem(char* fname, int32_t* read_sz) { @@ -70,8 +57,8 @@ char* load_file_inmem(char* fname, int32_t* read_sz) void load_pictures() { const int icon_rgb_field_size = button_size*button_size; - char *image_data, - *filedata; + Image *image_data; + char *filedata; strcpy(temp_path, "h.png"); @@ -99,24 +86,24 @@ void load_pictures() { // GUI functions // -void redraw_buttons() { +void RedrawButtons() { for (int j = 5, x = 0; x