diff --git a/.gitmodules b/.gitmodules index 3129a53..e69de29 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +0,0 @@ -[submodule "lua"] - path = lua - url = https://git.kolibrios.org/lua/lua.git diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index 936f463..5997ecc 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -1,20 +1,42 @@ { "configurations": [ { - "name": "Release", + "name": "Windows Lua5.4", "includePath": [ - "${workspaceFolder}/lua/src", + "C:/MinGW/msys/1.0/home/autobuild/tools/win32/include", + "C:/MinGW/msys/1.0/home/autobuild/tools/win32/include/lua5.4", "${workspaceFolder}/../kolibrios/contrib/sdk/sources/newlib/libc/include" ], - "defines": [] + "defines": [ + "SYSCALLS_VERSION_A", + "SYSCALLS_VERSION_B", + "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": [ - "${workspaceFolder}/lua/src", + "/home/autobuild/tools/win32/include", + "/home/autobuild/tools/win32/include/lua5.4", "${workspaceFolder}/../kolibrios/contrib/sdk/sources/newlib/libc/include" ], "defines": [ + "SYSCALLS_VERSION_A", + "SYSCALLS_VERSION_B", + "SYSCALLS_VERSION_C", "NDEBUG" ] } diff --git a/.vscode/settings.json b/.vscode/settings.json index 805b389..844e796 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -7,7 +7,9 @@ "socket.h": "c", "graphic.h": "c", "syscalls.h": "c", - "registers.h": "c" + "registers.h": "c", + "version_type.h": "c", + "library_version.h": "c" }, "cSpell.words": [ "syscalls", diff --git a/Makefile b/Makefile index 01ae0fb..e0d1b27 100644 --- a/Makefile +++ b/Makefile @@ -1,13 +1,18 @@ -LUA_V = 54 + +LUA_V = 5.4 +SYSCALLS_VER_A = 2 +SYSCALLS_VER_B = 0 +SYSCALLS_VER_C = 0 +SYSCALLS_VER = $(SYSCALLS_VER_C).$(SYSCALLS_VER_B).$(SYSCALLS_VER_A) CC = kos32-gcc LD = kos32-ld STRIP = kos32-strip OBJCOPY = kos32-objcopy STD = -std=gnu11 -CFLAGS = $(SYSCFLAGS) -O2 -Wall -Wextra $(STD) $(MYCFLAGS) +CFLAGS = $(SYSCFLAGS) -O2 -Wall -Wextra $(STD) $(MYCFLAGS) -DSYSCALLS_VERSION_A=$(SYSCALLS_VER_A) -DSYSCALLS_VERSION_B=$(SYSCALLS_VER_B) -DSYSCALLS_VERSION_C=$(SYSCALLS_VER_C) LDFLAGS = $(SYSLDFLAGS) $(MYLDFLAGS) -LIBS = $(SYSLIBS) $(MYLIBS) $(TOOLCHAIN_PATH)/mingw32/lib/lua$(LUA_V).dll.a +LIBS = $(SYSLIBS) $(MYLIBS) -llua$(LUA_V).dll ifeq ($(OS), Windows_NT) TOOLCHAIN_PATH = C:/MinGW/msys/1.0/home/autobuild/tools/win32 @@ -21,9 +26,8 @@ KOLIBRIOS_REPO = $(abspath ../kolibrios) SDK_DIR = $(KOLIBRIOS_REPO)/contrib/sdk NewLib_DIR = $(SDK_DIR)/sources/newlib -SYSCFLAGS = -fno-ident -fomit-frame-pointer -U__WIN32__ -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32 -I$(NewLib_DIR)/libc/include -I$(abspath .)/lua/src -SYSLDFLAGS = --image-base 0 -Tapp-dynamic.lds -SYSLIBS = -nostdlib -L $(SDK_DIR)/lib -L$(TOOLCHAIN_PATH)/lib -L$(TOOLCHAIN_PATH)/mingw32/lib -lgcc -lc.dll -ldll +SYSCFLAGS = -fno-ident -fomit-frame-pointer -U__WIN32__ -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32 -I$(NewLib_DIR)/libc/include -I$(TOOLCHAIN_PATH)/include/lua$(LUA_V) +SYSLIBS = -L $(SDK_DIR)/lib -lgcc -lc.dll -ldll MYCFLAGS = MYLDFLAGS = MYLIBS = @@ -33,11 +37,12 @@ MYOBJS = Socket_O = src/sockets/socket.o src/sockets/socket_lua.o src/sockets/sockaddr.o IPC_O = src/IPC/ipc.o src/IPC/IPC_msg.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) $(IPC_O) +ALL_O = src/syscalls.o src/ARP_entry.o src/systemColors.o src/graphic.o $(Socket_O) $(Debug_O) $(Version_O) $(IPC_O) src/background/background.o syscalls.dll: $(ALL_O) - $(CC) -shared -T dll.lds --entry _DllStartup -o $@ $(ALL_O) $(LIBS) + $(LD) -shared -T dll.lds --entry _DllStartup $(LDFLAGS) -o $@ $(ALL_O) $(LIBS) clean: rm -f $(ALL_O) syscalls.dll @@ -46,7 +51,7 @@ clean: ## Sources -src/syscalls.o: src/syscalls.c src/syscalls.h src/systemColors.h src/ARP_entry.h src/scancodes.h src/sockets/socket_lua.h src/graphic.h +src/syscalls.o: src/syscalls.c src/syscalls.h src/systemColors.h src/ARP_entry.h src/scancodes.h src/sockets/socket_lua.h src/graphic.h src/version/library_version.h src/ARP_entry.o: src/ARP_entry.c src/ARP_entry.h src/debug.h src/systemColors.o: src/systemColors.c src/systemColors.h src/debug.h src/sockets/socket.o: src/sockets/socket.c src/sockets/socket.h @@ -54,9 +59,12 @@ src/sockets/socket_lua.o: src/sockets/socket_lua.c src/sockets/socket_lua.h src/sockets/sockaddr.o: src/sockets/sockaddr.c src/sockets/sockaddr.h src/graphic.o: src/graphic.c src/graphic.h 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/IPC/ipc.o: src/IPC/ipc.c src/IPC/ipc.h src/IPC/IPC_msg.h src/IPC/IPC_msg.o: src/IPC/IPC_msg.c src/IPC/IPC_msg.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 @@ -67,3 +75,6 @@ src/debug/debug.h: src/syscalls.h src/debug/registers.h: src/syscalls.h src/IPC/IPC_msg.h: src/syscalls.h src/IPC/ipc.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 1f26835..9f9f077 100644 --- a/src/syscalls.c +++ b/src/syscalls.c @@ -17,6 +17,9 @@ #include "graphic.h" #include "IPC/ipc.h" #include "IPC/IPC_msg.h" +#include "version/coreversion.h" +#include "version/library_version.h" +#include "background/background.h" /* Режим ввода с клавиатуры @@ -107,7 +110,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 +411,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()); @@ -506,7 +478,7 @@ static int syscalls_getKey(lua_State* L) { char s[2]; s[0] = a.code; - s[1] = '\n'; + s[1] = '\0'; lua_pushstring(L, s); } else @@ -1495,7 +1467,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 +1479,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}, @@ -1779,6 +1756,8 @@ LUALIB_API int luaopen_syscalls(lua_State* L) { luaL_newlib(L, syscallsLib); + syscalls_push_library_version(L); + syscalls_push_events(L); syscalls_push_slotStates(L); syscalls_register_scancodes(L); @@ -1793,6 +1772,7 @@ LUALIB_API int luaopen_syscalls(lua_State* L) syscalls_register_ARPEntry(L); syscalls_register_SystemColors(L); + syscalls_register_Version(L); _ksys_set_event_mask(7); // set default event mask 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__ diff --git a/src/version/coreversion.c b/src/version/coreversion.c new file mode 100644 index 0000000..a50d712 --- /dev/null +++ b/src/version/coreversion.c @@ -0,0 +1,13 @@ +#include "coreversion.h" + +int syscalls_GetCoreVersion(lua_State* L) +{ + struct core_version* ver = syscalls_pushVersion(L); + + asm_inline( + "int $0x40" + ::"a"(18), "b"(13), "c"(ver) + ); + + return 1; +} \ No newline at end of file diff --git a/src/version/coreversion.h b/src/version/coreversion.h new file mode 100644 index 0000000..cfa3782 --- /dev/null +++ b/src/version/coreversion.h @@ -0,0 +1,8 @@ +#ifndef __CORE_VERSION_H__ +#define __CORE_VERSION_H__ + +#include "version_type.h" + +int syscalls_GetCoreVersion(lua_State *L); + +#endif // __CORE_VERSION_H__ diff --git a/src/version/library_version.h b/src/version/library_version.h new file mode 100644 index 0000000..f2f5067 --- /dev/null +++ b/src/version/library_version.h @@ -0,0 +1,17 @@ +#ifndef __LIBRARY_VERSION_H__ +#define __LIBRARY_VERSION_H__ + +#include "../syscalls.h" + +inline void syscalls_push_library_version(lua_State* L) +{ + lua_createtable(L, 0, 3); + + LUA_PUSH_INTEGER_FIELD(L, SYSCALLS_VERSION_A, "a"); + LUA_PUSH_INTEGER_FIELD(L, SYSCALLS_VERSION_B, "b"); + LUA_PUSH_INTEGER_FIELD(L, SYSCALLS_VERSION_C, "c"); + + lua_setfield(L, -2, "version"); +} + +#endif // __LIBRARY_VERSION_H__ \ No newline at end of file diff --git a/src/version/version_type.c b/src/version/version_type.c new file mode 100644 index 0000000..ff8394a --- /dev/null +++ b/src/version/version_type.c @@ -0,0 +1,202 @@ +#include "version_type.h" +#include +#include "../debug.h" + +static int syscalls_indexVersion(lua_State* L) +{ + struct core_version* r = luaL_checkudata(L, 1, syscalls_Version_metatable_name); + const char* index = luaL_checkstring(L, 2); + + if (strcmp(index, "a") == 0) + { + lua_pushinteger(L, r->a); + } + else if (strcmp(index, "b") == 0) + { + lua_pushinteger(L, r->b); + } + else if (strcmp(index, "c") == 0) + { + lua_pushinteger(L, r->c); + } + else if (strcmp(index, "d") == 0) + { + lua_pushinteger(L, r->d); + } + else if (strcmp(index, "rev") == 0) + { + lua_pushinteger(L, r->revision); + } + else + { + lua_pushnil(L); + } + + return 1; +} + +static int syscalls_newindexVersion(lua_State* L) +{ + struct core_version* r = luaL_checkudata(L, 1, syscalls_Version_metatable_name); + const char* index = luaL_checkstring(L, 2); + uint32_t val = luaL_checkinteger(L, 3); + + if (strcmp(index, "a") == 0) + { + r->a = val; + } + else if (strcmp(index, "b") == 0) + { + r->b = val; + } + else if (strcmp(index, "c") == 0) + { + r->c = val; + } + else if (strcmp(index, "d") == 0) + { + r->d = val; + } + else if (strcmp(index, "rev") == 0) + { + r->revision = val; + } + else + { + luaL_error(L, "wrong index: %s", index); + } + + return 0; +} + +static int syscalls_eqVersion(lua_State* L) +{ + lua_pushboolean( + L, + memcmp( + luaL_checkudata(L, 1, syscalls_Version_metatable_name), + luaL_checkudata(L, 2, syscalls_Version_metatable_name), + sizeof(struct core_version) + ) + ); + + return 1; +} + +static int syscalls_ltVersion(lua_State* L) +{ + struct core_version* a = luaL_checkudata(L, 1, syscalls_Version_metatable_name); + struct core_version* b = luaL_checkudata(L, 2, syscalls_Version_metatable_name); + + bool r; + + if (a->a < b->a) + r = true; + else if (a->b < b->b) + r = true; + else if (a->c < b->c) + r = true; + else if (a->d < b->d) + r = true; + else if (a->revision < b->revision) + r = true; + else + r = false; + + lua_pushboolean(L, r); + + return 1; +} + +static int syscalls_leVersion(lua_State* L) +{ + struct core_version* a = luaL_checkudata(L, 1, syscalls_Version_metatable_name); + struct core_version* b = luaL_checkudata(L, 2, syscalls_Version_metatable_name); + + bool r; + + if (a->a <= b->a) + r = true; + else if (a->b <= b->b) + r = true; + else if (a->c <= b->c) + r = true; + else if (a->d <= b->d) + r = true; + else if (a->revision <= b->revision) + r = true; + else + r = false; + + lua_pushboolean(L, r); + return 1; +} + +static int syscalls_tostringVersion(lua_State* L) +{ + // AAA.BBB.CCC.DDD.RRRRRRRRRRRRR + // +1 на конце на всякий случай + char buff[4 + 4 + 4 + 4 + 13 + 1]; + struct core_version* a = luaL_checkudata(L, 1, syscalls_Version_metatable_name); + + sprintf(buff, "%d.%d.%d.%d.%d", a->a, a->b, a->c, a->d, a->revision); + + lua_pushstring(L, buff); + + return 1; +} + +static const luaL_Reg syscalls_Version_m[] = { + {"__index", syscalls_indexVersion}, + {"__newindex", syscalls_newindexVersion}, + {"__eq", syscalls_eqVersion}, + {"__lt", syscalls_ltVersion}, + {"__le", syscalls_ltVersion}, + {"__tostring", syscalls_tostringVersion}, + {NULL, NULL} +}; + +struct core_version* syscalls_pushVersion(lua_State* L) +{ + DEBUG_LINE("push Version entry"); + + struct core_version* entry = lua_newuserdata(L, sizeof(struct core_version)); + + luaL_setmetatable(L, syscalls_Version_metatable_name); + + return entry; +} + +static int syscalls_newVersion(lua_State* L) +{ + struct core_version* r = syscalls_pushVersion(L); + memset(r, 0, sizeof(struct core_version)); + + r->a = luaL_checkinteger(L, 1); + r->b = luaL_checkinteger(L, 2); + r->c = luaL_checkinteger(L, 3); + r->d = luaL_checkinteger(L, 4); + r->revision = luaL_checkinteger(L, 5); + + return 1; +} + +static const luaL_Reg syscalls_Version_lib[] = { + {"new", syscalls_newVersion}, + {NULL, NULL} +}; + +void syscalls_register_Version(lua_State* L) +{ + DEBUG_LINE("register Version entry"); + + luaL_newlib(L, syscalls_Version_lib); + + lua_setfield(L, -2, syscalls_Version_name); + + + luaL_newmetatable(L, syscalls_Version_metatable_name); + luaL_setfuncs(L, syscalls_Version_m, 0); + + lua_pop(L, 1); +} diff --git a/src/version/version_type.h b/src/version/version_type.h new file mode 100644 index 0000000..9fe66d7 --- /dev/null +++ b/src/version/version_type.h @@ -0,0 +1,28 @@ +#ifndef __VERSION_TYPE_H__ +#define __VERSION_TYPE_H__ + +#include +#include "../syscalls.h" + +// sub library name +#define syscalls_Version_name "CoreVersion" +#define syscalls_Version_metatable_name "Version table" +#define syscalls_Version_metatable_name "Version metatable" + +struct core_version +{ + uint8_t a; + uint8_t b; + uint8_t c; + uint8_t d; + uint8_t zero; + uint32_t revision; + + uint32_t unused; +}; + +struct core_version* syscalls_pushVersion(lua_State* L); + +void syscalls_register_Version(lua_State* L); + +#endif // __VERSION_TYPE_H__