From b23e29d6d1fa8d7b0de14b7f152bb21eba37f594 Mon Sep 17 00:00:00 2001 From: Ivan Baravy Date: Thu, 6 Feb 2020 06:19:20 +0300 Subject: [PATCH] Add wrappers to graphic syscalls. --- .gitignore | 1 + kofu.c | 165 ++++++++++++++++++++++++++++++++++++---- kofuse.c | 7 +- kolibri.asm | 175 +++++++++++++------------------------------ kolibri.h | 2 +- makefile | 4 +- syscalls.h | 171 ++++++++++++++++++++++++++++++++++++++++++ test/016_#f01_draw.t | 11 +++ 8 files changed, 393 insertions(+), 143 deletions(-) create mode 100644 syscalls.h diff --git a/.gitignore b/.gitignore index 1b8a4e7..43e5490 100644 --- a/.gitignore +++ b/.gitignore @@ -22,5 +22,6 @@ tags coverage.* covpreproc *.rgba +*.rgb *.png *.skn diff --git a/kofu.c b/kofu.c index 296195b..ec8adef 100644 --- a/kofu.c +++ b/kofu.c @@ -31,6 +31,7 @@ #include #include #include "kolibri.h" +#include "syscalls.h" #include "trace.h" #define PATH_MAX 4096 @@ -212,6 +213,129 @@ void kofu_pwd(int argc, const char **argv) { printf("%s%s%s\n", quote, cur_dir, quote); } +void kofu_set_pixel(int argc, const char **argv) { + size_t x = strtoul(argv[1], NULL, 0); + size_t y = strtoul(argv[2], NULL, 0); + uint32_t color = strtoul(argv[3], NULL, 16); + int invert = (argc == 5) && !strcmp(argv[4], "-i"); + umka_sys_set_pixel(x, y, color, invert); +} + +void kofu_write_text(int argc, const char **argv) { + (void)argc; + size_t x = strtoul(argv[1], NULL, 0); + size_t y = strtoul(argv[2], NULL, 0); + uint32_t color = strtoul(argv[3], NULL, 16); + const char *string = argv[4]; + int asciiz = strtoul(argv[5], NULL, 0); + int fill_background = strtoul(argv[6], NULL, 0); + int font_and_encoding = strtoul(argv[7], NULL, 0); + int draw_to_buffer = strtoul(argv[8], NULL, 0); + int scale_factor = strtoul(argv[9], NULL, 0); + int length = strtoul(argv[10], NULL, 0); + int background_color_or_buffer = strtoul(argv[11], NULL, 0); + umka_sys_write_text(x, y, color, asciiz, fill_background, font_and_encoding, draw_to_buffer, scale_factor, string, length, background_color_or_buffer); +} + +void kofu_display_number(int argc, const char **argv) { + (void)argc; + int is_pointer = strtoul(argv[1], NULL, 0); + int base = strtoul(argv[2], NULL, 0); + if (base == 10) base = 0; + else if (base == 16) base = 1; + else if (base == 2) base = 2; + else base = 0; + size_t digits_to_display = strtoul(argv[3], NULL, 0); + int is_qword = strtoul(argv[4], NULL, 0); + int show_leading_zeros = strtoul(argv[5], NULL, 0); + uintptr_t number_or_pointer = strtoul(argv[6], NULL, 0); + size_t x = strtoul(argv[7], NULL, 0); + size_t y = strtoul(argv[8], NULL, 0); + uint32_t color = strtoul(argv[9], NULL, 16); + int fill_background = strtoul(argv[10], NULL, 0); + int font = strtoul(argv[11], NULL, 0); + int draw_to_buffer = strtoul(argv[12], NULL, 0); + int scale_factor = strtoul(argv[13], NULL, 0); + uintptr_t background_color_or_buffer = strtoul(argv[14], NULL, 16); + umka_sys_display_number(is_pointer, base, digits_to_display, is_qword, show_leading_zeros, number_or_pointer, x, y, color, fill_background, font, draw_to_buffer, scale_factor, background_color_or_buffer); +} + +void kofu_button(int argc, const char **argv) { + (void)argc; + size_t x = strtoul(argv[1], NULL, 0); + size_t xsize = strtoul(argv[2], NULL, 0); + size_t y = strtoul(argv[3], NULL, 0); + size_t ysize = strtoul(argv[4], NULL, 0); + uint32_t button_id = strtoul(argv[5], NULL, 0); + uint32_t color = strtoul(argv[6], NULL, 16); + int draw_button = strtoul(argv[7], NULL, 0); + int draw_frame = strtoul(argv[8], NULL, 0); + umka_sys_button(x, xsize, y, ysize, button_id, draw_button, draw_frame, color); +} + +void kofu_put_image(int argc, const char **argv) { + (void)argc; + FILE *f = fopen(argv[1], "r"); + fseek(f, 0, SEEK_END); + size_t fsize = ftell(f); + rewind(f); + uint8_t *image = (uint8_t*)malloc(fsize); + fread(image, fsize, 1, f); + fclose(f); + size_t xsize = strtoul(argv[2], NULL, 0); + size_t ysize = strtoul(argv[3], NULL, 0); + size_t x = strtoul(argv[4], NULL, 0); + size_t y = strtoul(argv[5], NULL, 0); + umka_sys_put_image(image, xsize, ysize, x, y); + free(image); +} + +void kofu_put_image_palette(int argc, const char **argv) { + (void)argc; + FILE *f = fopen(argv[1], "r"); + fseek(f, 0, SEEK_END); + size_t fsize = ftell(f); + rewind(f); + uint8_t *image = (uint8_t*)malloc(fsize); + fread(image, fsize, 1, f); + fclose(f); + size_t xsize = strtoul(argv[2], NULL, 0); + size_t ysize = strtoul(argv[3], NULL, 0); + size_t x = strtoul(argv[4], NULL, 0); + size_t y = strtoul(argv[5], NULL, 0); + size_t bpp = strtoul(argv[6], NULL, 0); + void *palette = NULL; + size_t row_offset = strtoul(argv[7], NULL, 0); + umka_sys_put_image_palette(image, xsize, ysize, x, y, bpp, palette, row_offset); + free(image); +} + +void kofu_draw_rect(int argc, const char **argv) { + size_t x = strtoul(argv[1], NULL, 0); + size_t xsize = strtoul(argv[2], NULL, 0); + size_t y = strtoul(argv[3], NULL, 0); + size_t ysize = strtoul(argv[4], NULL, 0); + uint32_t color = strtoul(argv[5], NULL, 16); + int gradient = (argc == 7) && !strcmp(argv[6], "-g"); + umka_sys_draw_rect(x, xsize, y, ysize, color, gradient); +} + +void kofu_draw_line(int argc, const char **argv) { + size_t x = strtoul(argv[1], NULL, 0); + size_t xend = strtoul(argv[2], NULL, 0); + size_t y = strtoul(argv[3], NULL, 0); + size_t yend = strtoul(argv[4], NULL, 0); + uint32_t color = strtoul(argv[5], NULL, 16); + int invert = (argc == 7) && !strcmp(argv[6], "-i"); + umka_sys_draw_line(x, xend, y, yend, color, invert); +} + +void kofu_draw_window(int argc, const char **argv) { + (void)argc; + (void)argv; + umka_sys_draw_window(0, 300, 0, 200, 0x00000088, 1, 1, 1, 0, 1, 4, "hello"); +} + void kofu_scrot(int argc, const char **argv) { (void)argc; (void)argv; @@ -247,7 +371,7 @@ void ls_range(f7080s1arg_t *fX0, f70or80_t f70or80) { if (fX0->size > requested) { fX0->size = requested; } - kos_lfn(fX0, &r, f70or80); + umka_sys_lfn(fX0, &r, f70or80); fX0->offset += fX0->size; print_f70_status(&r, 1); f7080s1info_t *dir = fX0->buf; @@ -275,7 +399,7 @@ void ls_all(f7080s1arg_t *fX0, f70or80_t f70or80) { f7080ret_t r; size_t bdfe_len = (fX0->encoding == CP866) ? BDFE_LEN_CP866 : BDFE_LEN_UNICODE; while (true) { - kos_lfn(fX0, &r, f70or80); + umka_sys_lfn(fX0, &r, f70or80); print_f70_status(&r, 1); assert((r.status == ERROR_SUCCESS && r.count == fX0->size) || (r.status == ERROR_END_OF_FILE && r.count < fX0->size)); @@ -349,7 +473,7 @@ void kofu_stat(int argc, const char **argv, f70or80_t f70or80) { fX0.u.f80.path_encoding = DEFAULT_PATH_ENCODING; fX0.u.f80.path = argv[1]; } - kos_lfn(&fX0, &r, f70or80); + umka_sys_lfn(&fX0, &r, f70or80); print_f70_status(&r, 0); if (r.status != ERROR_SUCCESS) return; @@ -428,7 +552,7 @@ void kofu_read(int argc, const char **argv, f70or80_t f70or80) { } fX0.buf = (uint8_t*)malloc(fX0.count); - kos_lfn(&fX0, &r, f70or80); + umka_sys_lfn(&fX0, &r, f70or80); print_f70_status(&r, 1); if (r.status == ERROR_SUCCESS || r.status == ERROR_END_OF_FILE) { @@ -456,18 +580,27 @@ typedef struct { } func_table_t; func_table_t funcs[] = { - { "disk_add", kofu_disk_add }, - { "disk_del", kofu_disk_del }, - { "ls70", kofu_ls70 }, - { "ls80", kofu_ls80 }, - { "stat70", kofu_stat70 }, - { "stat80", kofu_stat80 }, - { "read70", kofu_read70 }, - { "read80", kofu_read80 }, - { "pwd", kofu_pwd }, - { "cd", kofu_cd }, - { "scrot", kofu_scrot }, - { NULL, NULL }, + { "disk_add", kofu_disk_add }, + { "disk_del", kofu_disk_del }, + { "ls70", kofu_ls70 }, + { "ls80", kofu_ls80 }, + { "stat70", kofu_stat70 }, + { "stat80", kofu_stat80 }, + { "read70", kofu_read70 }, + { "read80", kofu_read80 }, + { "pwd", kofu_pwd }, + { "cd", kofu_cd }, + { "draw_window", kofu_draw_window }, + { "set_pixel", kofu_set_pixel }, + { "write_text", kofu_write_text }, + { "put_image", kofu_put_image }, + { "button", kofu_button }, + { "draw_rect", kofu_draw_rect }, + { "draw_line", kofu_draw_line }, + { "display_number", kofu_display_number }, + { "put_image_palette", kofu_put_image_palette }, + { "scrot", kofu_scrot }, + { NULL, NULL }, }; void usage() { diff --git a/kofuse.c b/kofuse.c index baaed14..344d8e8 100644 --- a/kofuse.c +++ b/kofuse.c @@ -32,6 +32,7 @@ #include #include #include "kolibri.h" +#include "syscalls.h" #define DIRENTS_TO_READ 100 @@ -65,7 +66,7 @@ static int kofuse_getattr(const char *path, struct stat *stbuf, bdfe_t file; f7080s5arg_t fX0 = {.sf = 5, .flags = 0, .buf = &file, .u = {.f80 = {.path_encoding = UTF8, .path = path}}}; f7080ret_t r; - kos_lfn(&fX0, &r, F80); + umka_sys_lfn(&fX0, &r, F80); bdfe_to_stat(&file, stbuf); // res = -ENOENT; @@ -82,7 +83,7 @@ static int kofuse_readdir(const char *path, void *buf, fuse_fill_dir_t filler, f7080s1info_t *dir = (f7080s1info_t*)malloc(sizeof(f7080s1info_t) + BDFE_LEN_UNICODE * DIRENTS_TO_READ); f7080s1arg_t fX0 = {.sf = 1, .offset = 0, .encoding = UTF8, .size = DIRENTS_TO_READ, .buf = dir, .u = {.f80 = {.path_encoding = UTF8, .path = path}}}; f7080ret_t r; - kos_lfn(&fX0, &r, F80); + umka_sys_lfn(&fX0, &r, F80); bdfe_t *bdfe = dir->bdfes; for (size_t i = 0; i < dir->cnt; i++) { filler(buf, bdfe->name, NULL, 0, 0); @@ -109,7 +110,7 @@ static int kofuse_read(const char *path, char *buf, size_t size, off_t offset, f7080s0arg_t fX0 = {.sf = 0, .offset = offset, .count = size, .buf = buf, .u = {.f80 = {.path_encoding = UTF8, .path = path}}}; f7080ret_t r; - kos_lfn(&fX0, &r, F80); + umka_sys_lfn(&fX0, &r, F80); return size; } diff --git a/kolibri.asm b/kolibri.asm index 7efd068..b037074 100644 --- a/kolibri.asm +++ b/kolibri.asm @@ -12,6 +12,7 @@ _free fix free sys_msg_board equ _sys_msg_board cli equ nop +iretd equ retd lang fix en preboot_blogesc = 0 ; start immediately after bootlog @@ -20,7 +21,9 @@ VESA_1_2_VIDEO = 0 ; enable vesa 1.2 bank switch functions purge mov,add,sub purge mov,add,sub -section '.text' executable align 16 +section '.text' executable align 32 + +public i40 coverage_begin: public coverage_begin @@ -68,6 +71,7 @@ include 'gui/skincode.inc' restore load_file include 'gui/draw.inc' include 'gui/font.inc' +include 'core/syscall.inc' include 'sha3.asm' @@ -253,82 +257,6 @@ proc kos_init c uses ebx esi edi ebp mov [skin_data], 0 call load_default_skin - mov eax, 0 - mov ebx, (0 SHL 16)+300 - mov ecx, (0 SHL 16)+200 - mov edx, 0x34000088 - mov esi, 0x00008800 - mov edi, window_title - call syscall_draw_window - - mov eax, 1 - mov ebx, 0 - mov ecx, 0 - mov edx, 0x000000ff - call syscall_setpixel - - mov eax, 1 - mov ebx, 1 - mov ecx, 1 - mov edx, 0x00ff0000 - call syscall_setpixel - - mov eax, 1 - mov ebx, 2 - mov ecx, 2 - mov edx, 0x0000ff00 - call syscall_setpixel - - mov eax, 38 - mov ebx, (10 SHL 16) + 510 - mov ecx, (10 SHL 16) + 510 - mov edx, 0x00ff0000 - call syscall_drawline - - mov eax, 13 - mov ebx, (60 SHL 16) + 20 - mov ecx, (30 SHL 16) + 20 - mov edx, 0x0000ff00 - call syscall_drawrect - - mov eax, 7 - mov ebx, chess_image - mov ecx, (8 SHL 16) + 8 - mov edx, (5 SHL 16) + 15 - call syscall_putimage - - mov eax, 65 - mov ebx, chess_image - mov ecx, (12 SHL 16) + 12 - mov edx, (5 SHL 16) + 30 - mov esi, 9 - mov edi, 0 - mov ebp, 0 - call sys_putimage_palette - - mov eax, 4 - mov ebx, (10 SHL 16) + 70 - mov ecx, 0xffff00 - mov edx, window_title - mov esi, 5 - mov edi, 0 - call syscall_writetext - - mov eax, 8 - mov ebx, (55 SHL 16) + 40 - mov ecx, (5 SHL 16) + 20 - mov edx, 0x20c0ffee - mov esi, 0x00dddddd - call syscall_button - - mov eax, 47 - mov ebx, 0x80040000 - mov ecx, 1234 - mov edx, (5 SHL 16) + 45 - mov esi, 0x50ffff00 - mov edi, 0x000000ff - call display_number - ret endp @@ -408,28 +336,6 @@ proc kos_disk_del c uses ebx esi edi ebp, _name endp -public kos_lfn -proc kos_lfn c uses ebx edx esi edi ebp, _f7080arg, _f7080ret, _f70or80 - push ebx - mov ebx, [_f7080arg] - pushad ; file_system_lfn writes here - cmp [_f70or80], 80 - jz .f80 -.f70: - call file_system_lfn - jmp .done -.f80: - call fileSystemUnicode -.done: - popad - mov ecx, [_f7080ret] - mov [ecx+0], eax ; status - mov [ecx+4], ebx ; count - pop ebx - ret -endp - - proc vdisk_close stdcall uses ebx esi edi ebp, _userdata extrn cio_disk_free ccall cio_disk_free, [_userdata] @@ -593,6 +499,55 @@ wakeup_osloop: read_process_memory: .forced: ret +sys_getkey: +sys_clock: +delay_hs_unprotected: +undefined_syscall: +sys_cpuusage: +sys_waitforevent: +sys_getevent: +sys_redrawstat: +syscall_getscreensize: +sys_background: +sys_cachetodiskette: +sys_getbutton: +sys_system: +paleholder: +sys_midi: +sys_setup: +sys_settime: +sys_wait_event_timeout: +syscall_cdaudio: +syscall_putarea_backgr: +sys_getsetup: +sys_date: +syscall_getpixel_WinMap: +syscall_getarea: +readmousepos: +sys_getbackground: +set_app_param: +sys_outport: +syscall_reserveportarea: +sys_apm: +syscall_threads: +sys_clipboard: +sound_interface: +sys_pcibios: +sys_IPC: +sys_gs: +pci_api: +sys_resize_app_memory: +sys_process_def: +f68: +sys_debug_services: +sys_sendwindowmsg: +blit_32: +sys_network: +sys_socket: +sys_protocols: +sys_posix: +sys_end: + ret proc __load_file _filename push ebx ecx edx esi edi @@ -638,31 +593,9 @@ do_not_touch_winmap db 0 window_minimize db 0 sound_flag db 0 -chess_image db \ - 0xff,0xff,0xff, 0x00,0x00,0x00, 0xff,0xff,0xff, 0x00,0x00,0x00, \ - 0xff,0xff,0xff, 0x00,0x00,0x00, 0xff,0xff,0xff, 0x00,0x00,0x00, \ - 0x00,0x00,0x00, 0xff,0xff,0xff, 0x00,0x00,0x00, 0xff,0xff,0xff, \ - 0x00,0x00,0x00, 0xff,0xff,0xff, 0x00,0x00,0x00, 0xff,0xff,0xff, \ - 0xff,0xff,0xff, 0x00,0x00,0x00, 0xff,0xff,0xff, 0x00,0x00,0x00, \ - 0xff,0xff,0xff, 0x00,0x00,0x00, 0xff,0xff,0xff, 0x00,0x00,0x00, \ - 0x00,0x00,0x00, 0xff,0xff,0xff, 0x00,0x00,0x00, 0xff,0xff,0xff, \ - 0x00,0x00,0x00, 0xff,0xff,0xff, 0x00,0x00,0x00, 0xff,0xff,0xff, \ - 0xff,0xff,0xff, 0x00,0x00,0x00, 0xff,0xff,0xff, 0x00,0x00,0x00, \ - 0xff,0xff,0xff, 0x00,0x00,0x00, 0xff,0xff,0xff, 0x00,0x00,0x00, \ - 0x00,0x00,0x00, 0xff,0xff,0xff, 0x00,0x00,0x00, 0xff,0xff,0xff, \ - 0x00,0x00,0x00, 0xff,0xff,0xff, 0x00,0x00,0x00, 0xff,0xff,0xff, \ - 0xff,0xff,0xff, 0x00,0x00,0x00, 0xff,0xff,0xff, 0x00,0x00,0x00, \ - 0xff,0xff,0xff, 0x00,0x00,0x00, 0xff,0xff,0xff, 0x00,0x00,0x00, \ - 0x00,0x00,0x00, 0xff,0xff,0xff, 0x00,0x00,0x00, 0xff,0xff,0xff, \ - 0x00,0x00,0x00, 0xff,0xff,0xff, 0x00,0x00,0x00, 0xff,0xff,0xff - fl_moving db 0 rb 3 -;section '.bss' writeable align 16 -;IncludeUGlobals - - ;section '.bss' writeable align 16 ;IncludeUGlobals ; crap diff --git a/kolibri.h b/kolibri.h index fa7fa24..09bb11d 100644 --- a/kolibri.h +++ b/kolibri.h @@ -129,7 +129,7 @@ typedef struct { uint32_t kos_time_to_epoch(uint32_t *time); void kos_init(void); -void kos_lfn(void *f7080sXarg, f7080ret_t *r, f70or80_t f70or80); +void i40(void); void *kos_disk_add(const char *file_name, const char *disk_name); int kos_disk_del(const char *name); uint32_t kos_getcwd(char *buf, uint32_t len); diff --git a/makefile b/makefile index a068a6d..fad9d6e 100644 --- a/makefile +++ b/makefile @@ -47,8 +47,8 @@ trace_lwp.o: trace_lwp.c trace_lwp.h kolibri.h cio.o: cio.c $(CC) $(CFLAGS) $(CFLAGS_32) -c $< -kofu.o: kofu.c kolibri.h trace.h - $(CC) $(CFLAGS) $(CFLAGS_32) -c $< -std=c99 -D_POSIX_C_SOURCE +kofu.o: kofu.c kolibri.h trace.h syscalls.h + $(CC) $(CFLAGS) $(CFLAGS_32) -c $< -std=c99 -D_POSIX_C_SOURCE -masm=intel kofuse.o: kofuse.c kolibri.h $(CC) $(CFLAGS) $(CFLAGS_32) `pkg-config fuse3 --cflags` -c $< -std=gnu99 diff --git a/syscalls.h b/syscalls.h new file mode 100644 index 0000000..99fcd7b --- /dev/null +++ b/syscalls.h @@ -0,0 +1,171 @@ +#ifndef SYSCALLS_H_INCLUDED +#define SYSCALLS_H_INCLUDED + +#include +#include "kolibri.h" + +static inline void umka_sys_draw_window(size_t x, size_t xsize, + size_t y, size_t ysize, + uint32_t color, int has_caption, + int client_relative, + int fill_workarea, int gradient_fill, + int movable, uint32_t style, + const char *caption) { + __asm__ __inline__ __volatile__ ( + "call i40" + : + : "a"(0), + "b"((x << 16) + xsize), + "c"((y << 16) + ysize), + "d"((gradient_fill << 31) + (!fill_workarea << 30) + + (client_relative << 29) + (has_caption << 28) + (style << 24) + + color), + "S"(!movable << 24), + "D"(caption) + : "memory"); +} + +static inline void umka_sys_set_pixel(size_t x, size_t y, uint32_t color, + int invert) { + __asm__ __inline__ __volatile__ ( + "call i40" + : + : "a"(1), + "b"(x), + "c"(y), + "d"((invert << 24) + color) + : "memory"); +} + +static inline void umka_sys_write_text(size_t x, size_t y, + uint32_t color, + int asciiz, int fill_background, + int font_and_encoding, + int draw_to_buffer, + int scale_factor, + const char *string, size_t length, + uintptr_t background_color_or_buffer) { + __asm__ __inline__ __volatile__ ( + "call i40" + : + : "a"(4), + "b"((x << 16) + y), + "c"((asciiz << 31) + (fill_background << 30) + + (font_and_encoding << 28) + (draw_to_buffer << 27) + + (scale_factor << 24) + color), + "d"(string), + "S"(length), + "D"(background_color_or_buffer) + : "memory"); +} + +static inline void umka_sys_put_image(void *image, size_t xsize, size_t ysize, + size_t x, size_t y) { + __asm__ __inline__ __volatile__ ( + "call i40" + : + : "a"(7), + "b"(image), + "c"((xsize << 16) + ysize), + "d"((x << 16) + y) + : "memory"); +} + +static inline void umka_sys_button(size_t x, size_t xsize, + size_t y, size_t ysize, + size_t button_id, + int draw_button, int draw_frame, + uint32_t color) { + __asm__ __inline__ __volatile__ ( + "call i40" + : + : "a"(8), + "b"((x << 16) + xsize), + "c"((y << 16) + ysize), + "d"((!draw_button << 30) + (!draw_frame << 29) + button_id), + "S"(color) + : "memory"); +} + +static inline void umka_sys_draw_rect(size_t x, size_t xsize, + size_t y, size_t ysize, + uint32_t color, int gradient) { + __asm__ __inline__ __volatile__ ( + "call i40" + : + : "a"(13), + "b"((x << 16) + xsize), + "c"((y << 16) + ysize), + "d"((gradient << 31) + color) + : "memory"); +} + +static inline void umka_sys_draw_line(size_t x, size_t xend, + size_t y, size_t yend, + uint32_t color, int invert) { + __asm__ __inline__ __volatile__ ( + "call i40" + : + : "a"(38), + "b"((x << 16) + xend), + "c"((y << 16) + yend), + "d"((invert << 24) + color) + : "memory"); +} + +static inline void umka_sys_display_number(int is_pointer, int base, + int digits_to_display, int is_qword, + int show_leading_zeros, + int number_or_pointer, + size_t x, size_t y, + uint32_t color, int fill_background, + int font, int draw_to_buffer, + int scale_factor, + uintptr_t background_color_or_buffer) { + __asm__ __inline__ __volatile__ ( + "call i40" + : + : "a"(47), + "b"(is_pointer + (base << 8) + (digits_to_display << 16) + + (is_qword << 30) + (show_leading_zeros << 31)), + "c"(number_or_pointer), + "d"((x << 16) + y), + "S"(color + (fill_background << 30) + (font << 28) + + (draw_to_buffer << 27) + (scale_factor << 24)), + "D"(background_color_or_buffer) + : "memory"); +} + +static inline void umka_sys_put_image_palette(void *image, + size_t xsize, size_t ysize, + size_t x, size_t y, + size_t bpp, void *palette, + size_t row_offset) { + __asm__ __inline__ __volatile__ ( + "push ebp;" + "mov ebp, %[row_offset];" + "call i40;" + "pop ebp" + : + : "a"(65), + "b"(image), + "c"((xsize << 16) + ysize), + "d"((x << 16) + y), + "S"(bpp), + "D"(palette), + [row_offset] "rm"(row_offset) + : "memory"); +} + +static inline void umka_sys_lfn(void *f7080sXarg, f7080ret_t *r, + f70or80_t f70or80) { + __asm__ __inline__ __volatile__ ( + "call i40" + : "=a" (r->status), + "=b" (r->count) + : "a"(f70or80), + "b"(f7080sXarg) + : "memory"); +} + +#endif diff --git a/test/016_#f01_draw.t b/test/016_#f01_draw.t index c20e450..f09ee78 100644 --- a/test/016_#f01_draw.t +++ b/test/016_#f01_draw.t @@ -1 +1,12 @@ +draw_window +set_pixel 0 0 0x0000ff +set_pixel 1 1 0xff0000 +set_pixel 2 2 0x00ff00 +draw_line 10 510 10 510 0xff0000 +draw_rect 60 20 30 20 0x00ff00 +put_image chess_image.rgb 8 8 5 15 +put_image_palette chess_image.rgb 12 12 5 30 9 0 +write_text 10 70 0xffff00 hello 0 0 0 0 0 5 0 +button 55 40 5 20 0xc0ffee 0xffffff 1 0 +display_number 0 10 4 0 0 1234 5 45 0xffff00 1 1 0 0 0x0000ff scrot