diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index 0c0c109..5997ecc 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -13,6 +13,19 @@ "SYSCALLS_VERSION_C" ] }, + { + "name": "Windows Lua5.3", + "includePath": [ + "C:/MinGW/msys/1.0/home/autobuild/tools/win32/include", + "C:/MinGW/msys/1.0/home/autobuild/tools/win32/include/lua5.3", + "${workspaceFolder}/../kolibrios/contrib/sdk/sources/newlib/libc/include" + ], + "defines": [ + "SYSCALLS_VERSION_A", + "SYSCALLS_VERSION_B", + "SYSCALLS_VERSION_C" + ] + }, { "name": "Debug", "includePath": [ diff --git a/Makefile b/Makefile index cff78f1..f1868a4 100644 --- a/Makefile +++ b/Makefile @@ -38,7 +38,7 @@ Socket_O = src/sockets/socket.o src/sockets/socket_lua.o src/sockets/sockaddr.o Debug_O = src/debug/debug.o src/debug/registers.o Version_O = src/version/coreversion.o src/version/version_type.o -ALL_O = src/syscalls.o src/ARP_entry.o src/systemColors.o src/graphic.o $(Socket_O) $(Debug_O) $(Version_O) +ALL_O = src/syscalls.o src/ARP_entry.o src/systemColors.o src/graphic.o $(Socket_O) $(Debug_O) $(Version_O) src/background/background.o syscalls.dll: $(ALL_O) $(LD) -shared -T dll.lds --entry _DllStartup $(LDFLAGS) -o $@ $(ALL_O) $(LIBS) @@ -61,6 +61,7 @@ src/debug/debug.o: src/debug/debug.c src/debug/debug.h src/debug/registers.h src/debug/registers.o: src/debug/registers.c src/debug/registers.h src/syscalls.h src/debug.h src/version/coreversion.o: src/version/coreversion.c src/version/coreversion.h src/version/version_type.o: src/version/version_type.c src/version/version_type.h src/debug.h +src/background/background.o: src/background/background.c src/background/background.h ## headers @@ -71,3 +72,4 @@ src/debug/debug.h: src/syscalls.h src/debug/registers.h: src/syscalls.h src/version/coreversion.h: src/version/version_type.h src/version/version_type.h: src/syscalls.h +src/background/background.h: src/syscalls.h diff --git a/lua b/lua deleted file mode 160000 index eae2ea0..0000000 --- a/lua +++ /dev/null @@ -1 +0,0 @@ -Subproject commit eae2ea0aaa2c4d0ad9e9c5c6594f9b2378971ced diff --git a/src/background/background.c b/src/background/background.c new file mode 100644 index 0000000..d68563b --- /dev/null +++ b/src/background/background.c @@ -0,0 +1,129 @@ +#include "background.h" + +static ksys_pos_t sizes; + +int syscalls_backgroundGetSize(lua_State* L) +{ + asm_inline( + "int $0x40" + :"=a"(sizes) + : "a"(39), "b"(1) + ); + + syscalls_push_pos_t(L, sizes); + + return 1; +} + +int syscalls_backgroundSetSize(lua_State* L) +{ + sizes = syscalls_check_pos_t(L, 1); + + _ksys_bg_set_size( + sizes.x, + sizes.y + ); + + return 0; +} + +int syscalls_backgroundPutPixel(lua_State* L) +{ + uint32_t x = luaL_checkinteger(L, 1); + uint32_t y = luaL_checkinteger(L, 2); + + _ksys_bg_put_pixel( + x, + y, + sizes.x, + luaL_checkinteger(L, 3) + ); + + return 0; +} + +ksys_color_t background_read_point(ksys_pos_t pos, uint16_t w) +{ + ksys_color_t color; + + asm_inline( + "int $0x40" + :"=a"(color) + : "a"(39), "b"(2), "c"((pos.x + pos.y * w) * 3) + ); + + return color; +} + +int syscalls_backgroundReadPoint(lua_State* L) +{ + lua_pushinteger( + L, + background_read_point(syscalls_check_pos_t(L, 1), sizes.x) + ); + + return 1; +} + +int syscalls_backgroundRedraw(lua_State* L) +{ + _ksys_bg_redraw(); + + return 0; +} + +int syscalls_backgroundSetDrawMode(lua_State* L) +{ + _ksys_bg_set_mode(luaL_checkinteger(L, 1)); + + return 0; +} + +int syscalls_backgroundGetDrawMode(lua_State* L) +{ + enum KSYS_BG_MODES mode; + + asm_inline( + "int $0x40" + :"=a"(mode) + : "a"(39), "b"(4) + ); + + lua_pushinteger(L, mode); + + return 1; +} + +int syscalls_backgroundOpenMap(lua_State* L) +{ + lua_pushinteger( + L, + _ksys_bg_get_map() + ); + + return 1; +} + +int syscalls_backgroundCloseMap(lua_State* L) +{ + if (_ksys_bg_close_map(luaL_checkinteger(L, 1)) == 0) + { + lua_pushnil(L); + } + else + { + lua_pushboolean(L, true); + } + + return 1; +} + +int syscalls_backgroundRedrawArea(lua_State* L) +{ + _ksys_bg_redraw_bar( + syscalls_check_pos_t(L, 1), + syscalls_check_pos_t(L, 3) + ); + + return 0; +} diff --git a/src/background/background.h b/src/background/background.h new file mode 100644 index 0000000..6168827 --- /dev/null +++ b/src/background/background.h @@ -0,0 +1,33 @@ +#ifndef __BACKGROUND_H__ +#define __BACKGROUND_H__ + +#include "../syscalls.h" + +int syscalls_backgroundSetSize(lua_State* L); + +int syscalls_backgroundPutPixel(lua_State* L); + +int syscalls_backgroundRedraw(lua_State* L); + +int syscalls_backgroundSetDrawMode(lua_State* L); + +int syscalls_backgroundGetDrawMode(lua_State* L); + +int syscalls_backgroundOpenMap(lua_State* L); + +int syscalls_backgroundCloseMap(lua_State* L); + +int syscalls_backgroundRedrawArea(lua_State* L); + +inline syscalls_push_BackgroundDrawMode(lua_State* L) +{ + lua_createtable(L, 0, 2); + + LUA_PUSH_INTEGER_FIELD(L, KSYS_BG_MODE_PAVE, "Pave"); + + LUA_PUSH_INTEGER_FIELD(L, KSYS_BG_MODE_STRETCH, "Stretch"); + + lua_setfield(L, -2, "DrawMode"); +} + +#endif // __BACKGROUND_H__ diff --git a/src/syscalls.c b/src/syscalls.c index ceb555b..c8531ba 100644 --- a/src/syscalls.c +++ b/src/syscalls.c @@ -17,6 +17,7 @@ #include "graphic.h" #include "version/coreversion.h" #include "version/library_version.h" +#include "background/background.h" /* Режим ввода с клавиатуры @@ -107,7 +108,7 @@ static int syscalls_SetSkin(lua_State* L) return 1; } -static int syscalls_GetSkinTilteArea(lua_State* L) +static int syscalls_GetSkinTitleArea(lua_State* L) { ksys_pos_t leftRight, topBottom; @@ -408,37 +409,6 @@ static int syscalls_getButton(lua_State* L) } -/* - Backgound -*/ - -static int syscalls_backgroundSetSize(lua_State* L) -{ - _ksys_bg_set_size( - luaL_checkinteger(L, 1), - luaL_checkinteger(L, 2)); - - return 0; -} - -static int syscalls_backgroundPutPixel(lua_State* L) -{ - _ksys_bg_put_pixel( - luaL_checkinteger(L, 1), - luaL_checkinteger(L, 2), - luaL_checkinteger(L, 3), - luaL_checkinteger(L, 4)); - - return 0; -} - -static int syscalls_backgroundRedraw(lua_State* L) -{ - _ksys_bg_redraw(); - - return 0; -} - static int syscalls_getCPUClock(lua_State* L) { lua_pushinteger(L, _ksys_get_cpu_clock()); @@ -1495,7 +1465,7 @@ static const luaL_Reg syscallsLib[] = { {"SetWindowTitle", syscalls_setWindowTitle}, {"GetSkinHeight", syscalls_getSkinHeight}, {"SetSkin", syscalls_SetSkin}, - {"GetSkinTitleArea", syscalls_GetSkinTilteArea}, + {"GetSkinTitleArea", syscalls_GetSkinTitleArea}, /* Buttons funcs*/ {"DefineButton", syscalls_defineButton}, {"DeleteButton", syscalls_deleteButton}, @@ -1507,11 +1477,16 @@ static const luaL_Reg syscallsLib[] = { {"CheckEvent", syscalls_checkEvent}, {"WaitEventTimeout", syscalls_waitEventTimeout}, /* Background funcs */ - {"BackgroundSetSize", syscalls_backgroundSetSize}, - {"BackgroundPutPixel", syscalls_backgroundPutPixel}, - {"BackgroundRedraw", syscalls_backgroundRedraw}, + { "BackgroundSetSize", syscalls_backgroundSetSize }, + { "BackgroundPutPixel", syscalls_backgroundPutPixel }, + { "BackgroundRedraw", syscalls_backgroundRedraw }, + { "BackgroundSetDrawMode", syscalls_backgroundSetDrawMode }, + { "BackgroundGetDrawMode", syscalls_backgroundGetDrawMode }, + { "BackgroundOpenMap", syscalls_backgroundOpenMap }, + { "BackgroundCloseMap", syscalls_backgroundCloseMap }, + { "BackgroundRedrawArea", syscalls_backgroundRedrawArea }, /* system funcs */ - {"GetRamSize", syscalls_getRamSize}, + { "GetRamSize", syscalls_getRamSize }, {"GetFreeRam", syscalls_getFreeRam}, {"GetCPUClock", syscalls_getCPUClock}, {"ShutdownPowerOff", syscalls_shutdownPowerOff}, diff --git a/src/syscalls.h b/src/syscalls.h index 16b2755..2931d3d 100644 --- a/src/syscalls.h +++ b/src/syscalls.h @@ -4,8 +4,9 @@ #include #include #include +#include -inline void syscalls_ReturnIntegerOrNil(LUA_INTEGER value, lua_State* L) +static inline void syscalls_ReturnIntegerOrNil(LUA_INTEGER value, lua_State* L) { if (value == -1) { @@ -17,7 +18,7 @@ inline void syscalls_ReturnIntegerOrNil(LUA_INTEGER value, lua_State* L) } } -inline void syscalls_ReturnIntegerValueOrNil(LUA_INTEGER cond, LUA_INTEGER value, lua_State* L) +static inline void syscalls_ReturnIntegerValueOrNil(LUA_INTEGER cond, LUA_INTEGER value, lua_State* L) { if (cond == -1) { @@ -29,7 +30,7 @@ inline void syscalls_ReturnIntegerValueOrNil(LUA_INTEGER cond, LUA_INTEGER value } } -inline void syscalls_ReturnTrueOrNil(LUA_INTEGER value, lua_State* L) +static inline void syscalls_ReturnTrueOrNil(LUA_INTEGER value, lua_State* L) { if (value == -1) { @@ -41,7 +42,7 @@ inline void syscalls_ReturnTrueOrNil(LUA_INTEGER value, lua_State* L) } } -inline void syscalls_ReturnStringOrNil(LUA_INTEGER cond, const char* value, lua_State* L) +static inline void syscalls_ReturnStringOrNil(LUA_INTEGER cond, const char* value, lua_State* L) { if (cond == -1) { @@ -57,4 +58,23 @@ inline void syscalls_ReturnStringOrNil(LUA_INTEGER cond, const char* value, lua_ #define LUA_PUSH_STRING_FIELD(L, val, name) lua_pushstring(L, val); lua_setfield(L, -2, name); #define LUA_PUSH_NUMBER_FIELD(L, val, name) lua_pushnumber(L, val); lua_setfield(L, -2, name); +static inline ksys_pos_t syscalls_check_pos_t(lua_State* L, int index) +{ + ksys_pos_t pos; + + pos.x = luaL_checkinteger(L, index); + pos.y = luaL_checkinteger(L, index + 1); + + return pos; +} + +static inline void syscalls_push_pos_t(lua_State* L, ksys_pos_t pos) +{ + lua_createtable(L, 0, 2); + + LUA_PUSH_INTEGER_FIELD(L, pos.x, "x"); + + LUA_PUSH_INTEGER_FIELD(L, pos.y, "y"); +} + #endif // __SYSCALLS_H__