diff options
| author | Kai Gunger <kgunger12@gmail.com> | 2026-07-11 16:17:57 -0400 |
|---|---|---|
| committer | Kai Gunger <kgunger12@gmail.com> | 2026-07-11 16:17:57 -0400 |
| commit | f56c11b48ac6ef65622d38da2d8d8ff04dd4049d (patch) | |
| tree | c599c9c2986f240187c403cf4eb2ffed0d1678f4 /internal | |
| parent | fd5d79d8a2e438fac351099553438ed071d63d84 (diff) | |
Diffstat (limited to 'internal')
| -rw-r--r-- | internal/c_wrap_linux.tnsl | 272 | ||||
| -rw-r--r-- | internal/c_wrap_windows.tnsl | 284 |
2 files changed, 556 insertions, 0 deletions
diff --git a/internal/c_wrap_linux.tnsl b/internal/c_wrap_linux.tnsl new file mode 100644 index 0000000..31bee1a --- /dev/null +++ b/internal/c_wrap_linux.tnsl @@ -0,0 +1,272 @@ +# Must be included at the top of the file +asm "extern malloc, realloc, free, printf, putchar, open, close, read, write, lseek, perror" + +~void NULL = 0 + +/; _alloc (uint size) [~void] + ~void out + + asm "mov rax, rsp" + asm "xor rdx, rdx" + asm "mov rcx, 16" + asm "div rcx" + asm "sub rsp, rdx" + asm "sub rsp, 128" + + # Mov size into proper register, and set all extras to zero + asm "mov rdi, r10" + asm "mov rsi, 0" + asm "xor rax, rax" + + # Do call + asm "call malloc wrt ..plt" + + # Set out to the returned value + # (The compiler assignes spaces sequentially, and we have a uint in r10) + asm "mov r11, rax" + + return out +;/ + +/; _realloc (~void ptr, uint new_size) [~void] + ~void out + + asm "mov rax, rsp" + asm "xor rdx, rdx" + asm "mov rcx, 16" + asm "div rcx" + asm "sub rsp, rdx" + asm "sub rsp, 128" + + # Mov ptr and new size into proper registers, and set all extras to zero + asm "mov rdi, r10" + asm "mov rsi, r11" + asm "xor rax, rax" + + # Do call + asm "call realloc wrt ..plt" + + # Set out to the returned value + # (The compiler assignes spaces sequentially. We have a ptr in r10, and a uint in r11) + asm "mov r12, rax" + + return out +;/ + +/; _delete (~void ptr) + + asm "mov rax, rsp" + asm "xor rdx, rdx" + asm "mov rcx, 16" + asm "div rcx" + asm "sub rsp, rdx" + asm "sub rsp, 128" + + # setup call by clearing most values + asm "mov rdi, r10" + asm "mov rsi, 0" + asm "xor rax, rax" + + # do call + asm "call free wrt ..plt" + + # there's no more to do 'cause free returns nothing +;/ + +/; _putchar (uint8 char) + + asm "mov rax, rsp" + asm "xor rdx, rdx" + asm "mov rcx, 16" + asm "div rcx" + asm "sub rsp, rdx" + asm "sub rsp, 128" + + # setup call by clearing most values + asm "mov rdi, r10" + asm "xor rsi, rsi" + asm "xor rax, rax" + + # do call + asm "call putchar wrt ..plt" + + # there's no more to do 'cause I don't care about putchar's output +;/ + +# wrap around putchar ( I was dumb and was using printf when I shouldn't have been ) +/; _print (~uint8 str) + /; loop (str` !== 0) [str++] + _putchar(str`) + ;/ +;/ + +/; _print_num (~void str, int num) + + asm "mov rax, rsp" + asm "xor rdx, rdx" + asm "mov rcx, 16" + asm "div rcx" + asm "sub rsp, rdx" + asm "sub rsp, 128" + + # setup call by clearing most values + asm "mov rdi, r10" + asm "mov rsi, r11" + asm "xor rax, rax" + + # do call + asm "call printf wrt ..plt" + + # there's no more to do 'cause printf returns nothing +;/ + + +# Create file for writing (overwrite) +/; _create_file (~void name) [int] + int out + + asm "mov rax, rsp" + asm "xor rdx, rdx" + asm "mov rcx, 16" + asm "div rcx" + asm "sub rsp, rdx" + asm "sub rsp, 128" + + # Do call + asm "mov rdi, r10" + asm "mov rsi, 0q1102" + asm "mov rdx, 0q700" + asm "call open wrt ..plt" + + # Set out to the returned value + # (The compiler assignes spaces sequentially. We have a ptr in r8) + asm "mov r11, rax" + + return out +;/ + +# Open file for reading or writing (no overwrite) +/; _open_file (~void name) [int] + int out + + asm "mov rax, rsp" + asm "xor rdx, rdx" + asm "mov rcx, 16" + asm "div rcx" + asm "sub rsp, rdx" + asm "sub rsp, 128" + + # Do syscall + asm "mov rdi, r10" + asm "mov rsi, 2" + asm "mov rdx, 0q700" + asm "call open wrt ..plt" + + # Set out to the returned value + # (The compiler assignes spaces sequentially. We have a ptr in r8, and a uint in r9) + asm "mov r11, rax" + + return out +;/ + +/; _close_file (int handle) + + asm "mov rax, rsp" + asm "xor rdx, rdx" + asm "mov rcx, 16" + asm "div rcx" + asm "sub rsp, rdx" + asm "sub rsp, 128" + + # Do syscall + asm "mov rdi, r10" + asm "call close wrt ..plt" +;/ + +/; _read_byte (int handle, ~uint8 byte) [int] + int out + + asm "mov rax, rsp" + asm "xor rdx, rdx" + asm "mov rcx, 16" + asm "div rcx" + asm "sub rsp, rdx" + asm "sub rsp, 128" + + # Do syscall + asm "mov rdi, r10" # handle + asm "mov rsi, r11" # buffer + asm "mov rdx, 1" # one byte + asm "call read wrt ..plt" + + # return number of bytes read + asm "mov r12, rax" + + return out +;/ + +/; _fseek (int handle, uint pos) [int] + int out + + # align stack + asm "mov rax, rsp" + asm "xor rdx, rdx" + asm "mov rcx, 16" + asm "div rcx" + asm "sub rsp, rdx" + # add buffer zone to stack + asm "sub rsp, 128" + + # Call c func + asm "mov rdi, r10" + asm "mov rsi, r11" + asm "mov rdx, 0" # standard value for SEEK_SET as per GNU libc + asm "call lseek wrt ..plt" + + # get return value + asm "mov r12, rax" + + return out +;/ + +/; _write_byte (int handle, ~uint8 byte) [int] + int out + + asm "mov rax, rsp" + asm "xor rdx, rdx" + asm "mov rcx, 16" + asm "div rcx" + asm "sub rsp, rdx" + asm "sub rsp, 128" + + # Do syscall + asm "mov rdi, r10" # handle + asm "mov rsi, r11" # buffer + asm "mov rdx, 1" # one byte + asm "call write wrt ..plt" + + asm "mov r12, rax" + + return out +;/ + +/; _perror (~void str) + + asm "mov rax, rsp" + asm "xor rdx, rdx" + asm "mov rcx, 16" + asm "div rcx" + asm "sub rsp, rdx" + asm "sub rsp, 128" + + # setup call by clearing most values + asm "mov rdi, r10" + asm "xor rsi, rsi" + asm "xor rax, rax" + + # do call + asm "call perror wrt ..plt" + + # there's no more to do 'cause printf returns nothing +;/ + diff --git a/internal/c_wrap_windows.tnsl b/internal/c_wrap_windows.tnsl new file mode 100644 index 0000000..839c976 --- /dev/null +++ b/internal/c_wrap_windows.tnsl @@ -0,0 +1,284 @@ +# Must be included at the top of the file +asm "extern malloc" +asm "extern realloc" +asm "extern free" + +asm "extern printf" + +asm "extern CreateFileA" +asm "extern ReadFile" +asm "extern WriteFile" +asm "extern CloseHandle" + +~uint8 _alert = "Alert!\n\0" +~uint8 _dec = "%d\n\0" +~uint8 _ptr = "%p\n\0" + +/; _alloc (uint size) [~void] + ~void out + + asm "mov rax, rsp" + asm "xor rdx, rdx" + asm "mov rcx, 32" + asm "div rcx" + asm "sub rsp, rdx" + asm "sub rsp, 32" + + # Mov size into proper register, and set all extras to zero + asm "mov rcx, r8" + asm "mov rdx, 0" + asm "mov r8, 0" + asm "mov r9, 0" + + asm "call malloc" + # Set out to the returned value + # (The compiler assignes spaces sequentially, and we have a uint in r8) + asm "mov r9, rax" + return out +;/ + +/; _realloc (~void ptr, uint new_size) [~void] + ~void out + + asm "mov rax, rsp" + asm "xor rdx, rdx" + asm "mov rcx, 32" + asm "div rcx" + asm "sub rsp, rdx" + asm "sub rsp, 32" + + # Mov ptr and new size into proper registers, and set all extras to zero + asm "mov rcx, r8" + asm "mov rdx, r9" + asm "mov r8, 0" + asm "mov r9, 0" + # Do call + asm "call realloc" + # Set out to the returned value + # (The compiler assignes spaces sequentially. We have a ptr in r8, and a uint in r9) + asm "mov r10, rax" + return out +;/ + +/; _delete (~void ptr) + + asm "mov rax, rsp" + asm "xor rdx, rdx" + asm "mov rcx, 32" + asm "div rcx" + asm "sub rsp, rdx" + asm "sub rsp, 32" + + # setup call by clearing most values + asm "mov rcx, r8" + asm "mov rdx, 0" + asm "mov r8, 0" + asm "mov r9, 0" + # do call + asm "call free" + # there's no more to do 'cause free returns nothing +;/ + +/; _printf (~void str) + + asm "mov rax, rsp" + asm "xor rdx, rdx" + asm "mov rcx, 32" + asm "div rcx" + asm "sub rsp, rdx" + asm "push qword 0" + asm "push qword 0" + asm "push qword 0" + asm "push qword 0" + + # setup call by clearing most values + asm "mov rcx, r8" + asm "mov rdx, 0" + asm "mov r8, 0" + asm "mov r9, 0" + # do call + asm "call printf" + # there's no more to do 'cause printf returns nothing +;/ + +/; _print_num (~void str, int num) + + asm "mov rax, rsp" + asm "xor rdx, rdx" + asm "mov rcx, 32" + asm "div rcx" + asm "sub rsp, rdx" + asm "push qword 0" + asm "push qword 0" + asm "push qword 0" + asm "push qword 0" + + # setup call by clearing most values + asm "mov rcx, r8" + asm "mov rdx, r9" + asm "mov rdi, 0" + asm "mov rsi, 0" + asm "mov r8, 0" + asm "mov r9, 0" + # do call + asm "call printf" + # there's no more to do 'cause printf returns nothing +;/ + + +# Create file for writing (overwrite) +/; _create_file (~void name) [~void] + ~void out + + asm "mov rax, rsp" + asm "xor rdx, rdx" + asm "mov rcx, 32" + asm "div rcx" + asm "sub rsp, rdx" + + asm "mov rcx, r8" # lpFileName + asm "mov rdx, 1" # dwDesiredAccess + asm "shl rdx, 28" # (GENERIC_READ 1 << 31 | GENERIC_WRITE 1 << 30) + asm "mov r8, 3" # dwShareMode + asm "mov r9, 0" # lpSecurityAttributes + + asm "push qword 0" # hTemplateFile + asm "push qword 128" # dwFlagsAndAttributes (NORMAL_FILE = 128) + asm "push qword 2" # dwCreationDisposition (CREATE_ALWAYS = 2) + + # Shadow space + asm "push r9" + asm "push r8" + asm "push rdx" + asm "push rcx" + + # Do call + asm "call CreateFileA" + + # Set out to the returned value + # (The compiler assignes spaces sequentially. We have a ptr in r8) + asm "mov r9, rax" + + return out +;/ + +# Open file for reading or writing (no overwrite) +/; _open_file (~void name) [~void] + ~void out + + asm "mov rax, rsp" + asm "xor rdx, rdx" + asm "mov rcx, 32" + asm "div rcx" + asm "sub rsp, rdx" + + asm "mov rcx, r8" # lpFileName + asm "mov rdx, 1" # dwDesiredAccess + asm "shl rdx, 28" # (GENERIC_READ 1 << 31 | GENERIC_WRITE 1 << 30) + asm "mov r8, 3" # dwShareMode + asm "mov r9, 0" # lpSecurityAttributes + + asm "push qword 0" # hTemplateFile + asm "push qword 128" # dwFlagsAndAttributes (NORMAL_FILE = 128) + asm "push qword 3" # dwCreationDisposition (OPEN_EXISTING = 3) + + # Shadow space + asm "push r9" + asm "push r8" + asm "push rdx" + asm "push rcx" + + # Do call + asm "call CreateFileA" + + # Set out to the returned value + # (The compiler assignes spaces sequentially. We have a ptr in r8, and a uint in r9) + asm "mov r9, rax" + + return out +;/ + +/; _close_file (~void handle) + + asm "mov rax, rsp" + asm "xor rdx, rdx" + asm "mov rcx, 32" + asm "div rcx" + asm "sub rsp, rdx" + + asm "mov rcx, r8" # handle + asm "mov rdx, 0" + asm "mov r8, 0" + asm "mov r9, 0" + + # Shadow space + asm "push r9" + asm "push r8" + asm "push rdx" + asm "push rcx" + + asm "call CloseHandle" + + asm "add rsp, 32" +;/ + +/; _read_byte (~void handle, ~uint8 byte) [int] + ~int out + int i = 0 + out = ~i + + + asm "mov rax, rsp" + asm "xor rdx, rdx" + asm "mov rcx, 32" + asm "div rcx" + asm "sub rsp, rdx" + + asm "mov rcx, r8" # handle + asm "mov rdx, r9" # buffer + asm "mov r8, 1" # one byte + asm "mov r9, r10" # read bytes buffer + asm "push qword 0" + + # Shadow space + asm "push r9" + asm "push r8" + asm "push rdx" + asm "push rcx" + + asm "call ReadFile" + + return out` +;/ + +/; _write_byte (~void handle, ~uint8 byte) [int] + ~int out + int i = 0 + out = ~i + + asm "mov rax, rsp" + asm "xor rdx, rdx" + asm "mov rcx, 32" + asm "div rcx" + asm "sub rsp, rdx" + + asm "mov rcx, r8" # handle + asm "mov rdx, r9" # buffer + asm "mov r8, 1" # one byte + asm "mov r9, 0" + asm "push qword 0" + + # Shadow space + asm "push r9" + asm "push r8" + asm "push rdx" + asm "push rcx" + + asm "call WriteFile" + + return out` +;/ + +/; print_alert + _printf(_alert) +;/ |