forked from KolibriOS/kolibrios
0f5cbca619
git-svn-id: svn://kolibrios.org@2415 a494cfbc-eb01-0410-851d-a64ba20cac60
312 lines
5.3 KiB
C
312 lines
5.3 KiB
C
|
|
#include <newlib.h>
|
|
#include <stdint.h>
|
|
#include <stddef.h>
|
|
|
|
#ifdef CONFIG_DEBUF
|
|
#define DBG(format,...) printf(format,##__VA_ARGS__)
|
|
#else
|
|
#define DBG(format,...)
|
|
#endif
|
|
|
|
typedef unsigned int color_t;
|
|
|
|
typedef union __attribute__((packed))
|
|
{
|
|
uint32_t val;
|
|
struct
|
|
{
|
|
short x;
|
|
short y;
|
|
};
|
|
}pos_t;
|
|
|
|
typedef union __attribute__((packed))
|
|
{
|
|
uint32_t val;
|
|
struct
|
|
{
|
|
uint8_t state;
|
|
uint8_t code;
|
|
uint16_t ctrl_key;
|
|
};
|
|
}oskey_t;
|
|
|
|
static inline
|
|
void BeginDraw(void)
|
|
{
|
|
__asm__ __volatile__(
|
|
"int $0x40" ::"a"(12),"b"(1));
|
|
};
|
|
|
|
static inline
|
|
void EndDraw(void)
|
|
{
|
|
__asm__ __volatile__(
|
|
"int $0x40" ::"a"(12),"b"(2));
|
|
};
|
|
|
|
static inline void DrawWindow(int x, int y, int w, int h, char *name,
|
|
color_t workcolor, uint32_t style)
|
|
{
|
|
|
|
__asm__ __volatile__(
|
|
"int $0x40"
|
|
::"a"(0),
|
|
"b"((x << 16) | (w & 0xFFFF)),
|
|
"c"((y << 16) | (h & 0xFFFF)),
|
|
"d"((style << 24) | (workcolor & 0xFFFFFF)),
|
|
"D"(name));
|
|
};
|
|
|
|
static inline
|
|
pos_t get_mouse_pos(void)
|
|
{
|
|
pos_t val;
|
|
|
|
__asm__ __volatile__(
|
|
"int $0x40 \n\t"
|
|
"rol $16, %%eax"
|
|
:"=eax"(val)
|
|
:"a"(37),"b"(1));
|
|
return val;
|
|
}
|
|
|
|
static inline
|
|
pos_t get_cursor_pos(void)
|
|
{
|
|
pos_t val;
|
|
|
|
__asm__ __volatile__(
|
|
"int $0x40 \n\t"
|
|
"rol $16, %%eax"
|
|
:"=eax"(val)
|
|
:"a"(37),"b"(0));
|
|
return val;
|
|
}
|
|
|
|
static inline
|
|
uint32_t get_mouse_buttons(void)
|
|
{
|
|
uint32_t val;
|
|
|
|
__asm__ __volatile__(
|
|
"int $0x40"
|
|
:"=a"(val)
|
|
:"a"(37),"b"(2));
|
|
return val;
|
|
};
|
|
|
|
static inline
|
|
uint32_t get_mouse_wheels(void)
|
|
{
|
|
uint32_t val;
|
|
|
|
__asm__ __volatile__(
|
|
"int $0x40 \n\t"
|
|
"rol $16, %%eax"
|
|
:"=a"(val)
|
|
:"a"(37),"b"(7));
|
|
return val;
|
|
};
|
|
|
|
static inline
|
|
uint32_t wait_for_event(uint32_t time)
|
|
{
|
|
uint32_t val;
|
|
__asm__ __volatile__(
|
|
"int $0x40"
|
|
:"=a"(val)
|
|
:"a"(23), "b"(time));
|
|
return val;
|
|
};
|
|
|
|
static inline uint32_t check_os_event()
|
|
{
|
|
uint32_t val;
|
|
__asm__ __volatile__(
|
|
"int $0x40"
|
|
:"=a"(val)
|
|
:"a"(11));
|
|
return val;
|
|
};
|
|
|
|
static inline
|
|
uint32_t get_tick_count(void)
|
|
{
|
|
uint32_t val;
|
|
__asm__ __volatile__(
|
|
"int $0x40"
|
|
:"=eax"(val)
|
|
:"a"(26),"b"(9));
|
|
return val;
|
|
};
|
|
|
|
static inline
|
|
oskey_t get_key(void)
|
|
{
|
|
oskey_t val;
|
|
__asm__ __volatile__(
|
|
"int $0x40"
|
|
:"=eax"(val)
|
|
:"a"(2));
|
|
return val;
|
|
}
|
|
|
|
static inline
|
|
void draw_line(int xs, int ys, int xe, int ye, color_t color)
|
|
{
|
|
__asm__ __volatile__(
|
|
"int $0x40"
|
|
::"a"(38), "d"(color),
|
|
"b"((xs << 16) | xe),
|
|
"c"((ys << 16) | ye));
|
|
}
|
|
|
|
|
|
|
|
static inline
|
|
void draw_bar(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));
|
|
}
|
|
|
|
static inline
|
|
void draw_bitmap(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));
|
|
}
|
|
|
|
static inline
|
|
void draw_text(const char *text, int x, int y, int len, color_t color)
|
|
{
|
|
__asm__ __volatile__(
|
|
"int $0x40"
|
|
::"a"(4),"d"(text),
|
|
"b"((x << 16) | y),
|
|
"S"(len),"c"(color));
|
|
}
|
|
|
|
static inline
|
|
void *user_alloc(size_t size)
|
|
{
|
|
void *val;
|
|
__asm__ __volatile__(
|
|
"int $0x40"
|
|
:"=eax"(val)
|
|
:"a"(68),"b"(12),"c"(size));
|
|
return val;
|
|
}
|
|
|
|
static inline
|
|
int user_free(void *mem)
|
|
{
|
|
int val;
|
|
__asm__ __volatile__(
|
|
"int $0x40"
|
|
:"=eax"(val)
|
|
:"a"(68),"b"(12),"c"(mem));
|
|
return val;
|
|
}
|
|
|
|
static inline
|
|
int *user_unmap(void *base, size_t offset, size_t size)
|
|
{
|
|
void *val;
|
|
__asm__ __volatile__(
|
|
"int $0x40"
|
|
:"=eax"(val)
|
|
:"a"(68),"b"(26),"c"(base),"d"(offset),"S"(size));
|
|
return val;
|
|
}
|
|
|
|
/*
|
|
extern inline
|
|
void exit(int status) __attribute__((noreturn)) ;
|
|
|
|
extern inline
|
|
void exit(int status)
|
|
{
|
|
__asm__ __volatile__(
|
|
"int $0x40"
|
|
::"a"(-1));
|
|
for(;;);
|
|
}
|
|
*/
|
|
|
|
static inline
|
|
uint32_t load_cursor(void *path, uint32_t flags)
|
|
{
|
|
uint32_t val;
|
|
__asm__ __volatile__(
|
|
"int $0x40"
|
|
:"=eax"(val)
|
|
:"a"(37), "b"(4), "c"(path), "d"(flags));
|
|
return val;
|
|
}
|
|
|
|
static inline
|
|
uint32_t set_cursor(uint32_t cursor)
|
|
{
|
|
uint32_t old;
|
|
__asm__ __volatile__(
|
|
"int $0x40"
|
|
:"=eax"(old)
|
|
:"a"(37), "b"(5), "c"(cursor));
|
|
return old;
|
|
}
|
|
|
|
static inline void get_proc_info(char *info)
|
|
{
|
|
__asm__ __volatile__(
|
|
"int $0x40"
|
|
:
|
|
:"a"(9), "b"(info), "c"(-1));
|
|
}
|
|
|
|
static inline
|
|
void* user_realloc(void *mem, size_t size)
|
|
{
|
|
void *val;
|
|
__asm__ __volatile__(
|
|
"int $0x40"
|
|
:"=eax"(val)
|
|
:"a"(68),"b"(12),"c"(size),"d"(mem)
|
|
:"memory");
|
|
|
|
return val;
|
|
}
|
|
|
|
void *load_file(const char *path, size_t *len);
|
|
|
|
void *get_resource(void *data, uint32_t id);
|
|
|
|
struct blit_call
|
|
{
|
|
int dstx;
|
|
int dsty;
|
|
int w;
|
|
int h;
|
|
|
|
int srcx;
|
|
int srcy;
|
|
int srcw;
|
|
int srch;
|
|
|
|
unsigned char *bitmap;
|
|
int stride;
|
|
};
|
|
|
|
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);
|
|
|