diff options
| author | Kyle Gunger <kgunger12@gmail.com> | 2024-03-13 08:00:33 -0400 | 
|---|---|---|
| committer | Kyle Gunger <kgunger12@gmail.com> | 2024-03-13 08:00:33 -0400 | 
| commit | 392984c0cf53fff4a64bc74e3f32ccba4c93dba8 (patch) | |
| tree | e09d18b75f423f55fa6474f385888a976682cb8a | |
| parent | c778683318d4f6fe7d23f4af5f768fdddec596c1 (diff) | |
port c_wrap from old proj
| -rwxr-xr-x | tnslc/build.sh | 7 | ||||
| -rw-r--r-- | tnslc/c_wrap_linux.tnsl | 226 | ||||
| -rw-r--r-- | tnslc/main.tnsl | 14 | 
3 files changed, 247 insertions, 0 deletions
| diff --git a/tnslc/build.sh b/tnslc/build.sh new file mode 100755 index 0000000..b492dcd --- /dev/null +++ b/tnslc/build.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +../ctc main.tnsl tnslc.asm +nasm -f elf64 -o tnslc.o tnslc.asm +gcc -o tnslc tnslc.o +rm tnslc.asm tnslc.o + diff --git a/tnslc/c_wrap_linux.tnsl b/tnslc/c_wrap_linux.tnsl new file mode 100644 index 0000000..4e7768a --- /dev/null +++ b/tnslc/c_wrap_linux.tnsl @@ -0,0 +1,226 @@ +# Must be included at the top of the file +asm "extern malloc, realloc, free, printf, open, close, read, write" + +{}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, 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  +;/ + +/; _printf (~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 printf wrt ..plt" +     +    # 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, 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) [~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" + +    # 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) [~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" + +    # 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 (~void 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 (~void 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 +;/ + +/; _write_byte (~void 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 +;/ + +/; print_alert +    _printf(~_alert{0}) +;/ diff --git a/tnslc/main.tnsl b/tnslc/main.tnsl new file mode 100644 index 0000000..1abedb3 --- /dev/null +++ b/tnslc/main.tnsl @@ -0,0 +1,14 @@ +:import "c_wrap_linux.tnsl" + +~uint8 str_a = "Hello World\n\0" +~uint8 str_b = "!\n\0" + +/; main (int argc, ~~uint8 argv) [int] +	_printf(str_a) + +	/; if (argc > 2) +		_printf(str_b) +	;/ +	 +	return 0 +;/ |