From 012d7fb6ad13a85c8b53f0c2a2ac8ca7ab9aef15 Mon Sep 17 00:00:00 2001 From: Krzosa Karol Date: Fri, 17 Jun 2022 17:00:48 +0200 Subject: [PATCH] Restructure os code --- base.kl | 24 ++++++++++++++++ programs/kernel32.kl | 60 ++++++++++++++++++++++++++++++++++++++++ programs/os_windows.kl | 63 ++++++++++++++++++++++++++++++++++++++++++ programs/winmm.kl | 5 ++++ 4 files changed, 152 insertions(+) create mode 100644 base.kl create mode 100644 programs/kernel32.kl create mode 100644 programs/os_windows.kl create mode 100644 programs/winmm.kl diff --git a/base.kl b/base.kl new file mode 100644 index 0000000..47abfd6 --- /dev/null +++ b/base.kl @@ -0,0 +1,24 @@ +Os :: #import "os_windows.kl" + +SizeU :: #strict U64 + +Arena :: struct + memory: Os.Memory + alignment: U64 + len: U64 + +clamp_top_sizeu :: (val: SizeU, max: SizeU): SizeU + if val > max + return max + return val + +get_align_offset :: (size: SizeU, align: SizeU): SizeU + mask := align - 1 + val := size & mask + if val != 0 + val = align - val + return val + +align_up :: (size: SizeU, align: SizeU): SizeU + result := size + get_align_offset(size, align) + return result diff --git a/programs/kernel32.kl b/programs/kernel32.kl new file mode 100644 index 0000000..1ec65e5 --- /dev/null +++ b/programs/kernel32.kl @@ -0,0 +1,60 @@ +DWORD :: U32 +LPCSTR :: *char +LPSTR :: *char +LPCWSTR :: *U16 +HWND :: *void +HMENU :: *void +HINSTANCE :: *void +HBITMAP :: *void +HDC :: *void +LPVOID :: *void +SIZE_T :: U64 +BOOL :: int +HANDLE :: *void +VOID :: void +HICON :: HANDLE +HCURSOR :: HANDLE +HBRUSH :: HANDLE +LPDWORD :: *DWORD +LRESULT :: S64 +WPARAM :: U64 +LPARAM :: S64 +BYTE :: U8 // @todo? unsigned char +WORD :: S16 // short +LONG :: S32 // @todo long +UINT :: U32 // @todo uint +ATOM :: WORD +LARGE_INTEGER :: S64 + +MEM_COMMIT :: 0x00001000 +MEM_RESERVE :: 0x00002000 +MEM_RESET :: 0x00080000 +MEM_RESET_UNDO :: 0x1000000 +MEM_DECOMMIT :: 0x00004000 +MEM_RELEASE :: 0x00008000 + +PAGE_NOACCESS :: 1 +PAGE_READONLY :: 2 +PAGE_READWRITE :: 4 +PAGE_WRITECOPY :: 8 +PAGE_EXECUTE :: 0x10; PAGE_EXECUTE_READ :: 0x20; PAGE_EXECUTE_READWRITE :: 0x40; PAGE_EXECUTE_WRITECOPY :: 0x80 +VirtualAlloc :: #foreign (lpAddress: LPVOID, dwSize: SIZE_T, flAllocationType: DWORD, flProtect: DWORD): LPVOID +VirtualFree :: #foreign (lpAddress: LPVOID, dwSize: SIZE_T, dwFreeType: DWORD): BOOL + +HEAP_ZERO_MEMORY :: 0x8; HEAP_NO_SERIALIZE :: 0x1; HEAP_GENERATE_EXCEPTIONS :: 0x4 +GetProcessHeap :: #foreign (): HANDLE +HeapAlloc :: #foreign (hHeap: HANDLE, dwFlags: DWORD, dwByte: SIZE_T): LPVOID +HeapFree :: #foreign (hHeap: HANDLE, dwFlags: DWORD, lpMe: LPVOID): BOOL + +STD_INPUT_HANDLE :: 4294967286//(-10)->DWORD +STD_OUTPUT_HANDLE :: 4294967285//(-11)->DWORD +//STD_ERROR_HANDLE :: (-12)->DWORD +GetStdHandle :: #foreign (nStdHandle: DWORD): HANDLE +WriteConsoleA :: #foreign (hConsoleOutput: HANDLE,lpBuffer: *VOID,nNumberOfCharsToWrite: DWORD,lpNumberOfCharsWritten: LPDWORD,lpReserve: LPVOID): BOOL +WriteConsoleW :: #foreign (hConsoleOutput: HANDLE,lpBuffer: *VOID,nNumberOfCharsToWrite: DWORD,lpNumberOfCharsWritten: LPDWORD,lpReserve: LPVOID): BOOL + +GetLastError :: #foreign (): DWORD +QueryPerformanceFrequency :: #foreign (lpFrequency: *LARGE_INTEGER): BOOL +QueryPerformanceCounter :: #foreign (lpFrequency: *LARGE_INTEGER): BOOL +Sleep :: #foreign (dwMilliseconds: DWORD) +OutputDebugStringA :: #foreign (lpOutputString: LPCSTR) \ No newline at end of file diff --git a/programs/os_windows.kl b/programs/os_windows.kl new file mode 100644 index 0000000..258e8d8 --- /dev/null +++ b/programs/os_windows.kl @@ -0,0 +1,63 @@ +#import "kernel32.kl" +#import "base.kl" + +PAGE_SIZE :: 4096 +Memory :: struct + commit : SizeU + reserve: SizeU + data : *U8 + +process_heap: HANDLE +allocate :: (size: U64): *void + if process_heap == 0 + process_heap = GetProcessHeap() + return HeapAlloc(process_heap, 0, size) + +reserve :: (size: SizeU): Memory + result := Memory{reserve=align_up(size, PAGE_SIZE)} + result.data = VirtualAlloc( + flProtect = PAGE_READWRITE, + dwSize = result.reserve, + flAllocationType = MEM_RESERVE, + lpAddress = 0)->*U8 + return result + +commit :: (m: *Memory, size: SizeU): Bool + commit_size := align_up(size, PAGE_SIZE) + total_commit := m.commit + commit_size + clamped_commit := clamp_top_sizeu(total_commit, m.reserve) + adjusted_commit := clamped_commit - m.commit + if adjusted_commit != 0 + result := VirtualAlloc( + lpAddress = (m.data + m.commit)->*void, + dwSize = adjusted_commit, + flAllocationType = MEM_COMMIT, + flProtect = PAGE_READWRITE, + ) + m.commit += adjusted_commit + return true + return false + +release :: (m: *Memory) + result := VirtualFree(m.data->*void, 0, MEM_RELEASE) + if result != 0 + m.data = 0 + m.commit = 0 + m.reserve = 0 + +print :: (string: String16) + handle := GetStdHandle(STD_OUTPUT_HANDLE) + WriteConsoleW(handle, (string.str)->*void, string.len->DWORD, 0, 0) + +performance_frequency: F64 +time :: (): F64 + query: LARGE_INTEGER + if !performance_frequency + err := QueryPerformanceFrequency(&query) + assert(err != 0) + performance_frequency = query->F64 + + err := QueryPerformanceCounter(&query) + assert(err != 0) + result := query->F64 / performance_frequency + return result diff --git a/programs/winmm.kl b/programs/winmm.kl new file mode 100644 index 0000000..4608215 --- /dev/null +++ b/programs/winmm.kl @@ -0,0 +1,5 @@ +#import "kernel32.kl" + +MMRESULT :: UINT +TIMERR_NOERROR :: 0 +timeBeginPeriod :: #foreign (uPeriod: UINT): MMRESULT \ No newline at end of file