From cbb904abd97e92b142eed43f322a065c11d954ac Mon Sep 17 00:00:00 2001 From: zongor Date: Sat, 23 May 2026 12:24:18 -0700 Subject: [PATCH] wip arrays --- compiler.c | 21 ++++++++ emit/uxn/lib/undar.c | 61 ++++++++++++++++++++++ emit/uxn/lib/undar.tal | 116 ++++++++++++++++++++++++++++++++++++++++- test/add.ul | 6 +-- test/bang.ul | 2 + test/fib.ul | 5 +- test/for.ul | 10 ++-- test/global.ul | 6 +-- test/if.ul | 16 +++--- test/local.ul | 7 ++- test/malloc.ul | 13 ++--- test/paint.ul | 54 +++++++++---------- test/plex.ul | 10 ++-- 13 files changed, 256 insertions(+), 71 deletions(-) diff --git a/compiler.c b/compiler.c index 4f1080c..5fae12b 100644 --- a/compiler.c +++ b/compiler.c @@ -676,6 +676,27 @@ grouping() consume(TOKEN_RPAREN); } + +void calculate_strides(i32* dims, i32 num_dims, i32* out_strides) { + int current_stride = 1; + + for (int i = num_dims - 1; i >= 0; i--) { + out_strides[i] = current_stride; + current_stride *= dims[i]; + } +} + +void +define_array() +{ + /* example + i32 dims[3] = {3, 3, 3}; + i32 strides[3]; + + calculate_strides(dims, 3, strides); + */ +} + void number() { diff --git a/emit/uxn/lib/undar.c b/emit/uxn/lib/undar.c index 9d682c5..e9bddb8 100644 --- a/emit/uxn/lib/undar.c +++ b/emit/uxn/lib/undar.c @@ -82,3 +82,64 @@ nat_to_int(unsigned n) { return (int)n; } + +int +int_add(int a, int b) +{ + return a + b; +} +int +int_sub(int a, int b) +{ + return a - b; +} +int +int_mul(int a, int b) +{ + return a * b; +} +int +int_div(int a, int b) +{ + return a / b; +} +int +int_eq(int a, int b) +{ + return a == b; +} +int +int_ne(int a, int b) +{ + return a != b; +} +int +int_lt(int a, int b) +{ + return a < b; +} +int +int_le(int a, int b) +{ + return a <= b; +} +int +int_gt(int a, int b) +{ + return a > b; +} +int +int_ge(int a, int b) +{ + return a >= b; +} +int +int_neg(int f) +{ + return -f; +} +int +int_abs(int f) +{ + return (f < 0) ? -f : f; +} \ No newline at end of file diff --git a/emit/uxn/lib/undar.tal b/emit/uxn/lib/undar.tal index 5c3cd04..2d85a48 100644 --- a/emit/uxn/lib/undar.tal +++ b/emit/uxn/lib/undar.tal @@ -146,6 +146,120 @@ &return POP2r JMP2r + +@int_add_ ( b* a* -- result* ) + OVR2r LIT2r 0004 SUB2r STH2kr INC2 INC2 STA2 + STH2kr STA2 + STH2kr INC2 INC2 LDA2 STH2kr LDA2 ADD2 !&return + #0000 + + &return + POP2r JMP2r + +@int_sub_ ( b* a* -- result* ) + OVR2r LIT2r 0004 SUB2r STH2kr INC2 INC2 STA2 + STH2kr STA2 + STH2kr INC2 INC2 LDA2 STH2kr LDA2 SUB2 !&return + #0000 + + &return + POP2r JMP2r + +@int_mul_ ( b* a* -- result* ) + OVR2r LIT2r 0004 SUB2r STH2kr INC2 INC2 STA2 + STH2kr STA2 + STH2kr INC2 INC2 LDA2 STH2kr LDA2 MUL2 !&return + #0000 + + &return + POP2r JMP2r + +@int_div_ ( b* a* -- result* ) + OVR2r LIT2r 0004 SUB2r STH2kr INC2 INC2 STA2 + STH2kr STA2 + STH2kr INC2 INC2 LDA2 STH2kr LDA2 sdiv + !&return + #0000 + + &return + POP2r JMP2r + +@int_eq_ ( b* a* -- result* ) + OVR2r LIT2r 0004 SUB2r STH2kr INC2 INC2 STA2 + STH2kr STA2 + STH2kr INC2 INC2 LDA2 STH2kr LDA2 EQU2 #00 SWP !&return + #0000 + + &return + POP2r JMP2r + +@int_ne_ ( b* a* -- result* ) + OVR2r LIT2r 0004 SUB2r STH2kr INC2 INC2 STA2 + STH2kr STA2 + STH2kr INC2 INC2 LDA2 STH2kr LDA2 NEQ2 #00 SWP !&return + #0000 + + &return + POP2r JMP2r + +@int_lt_ ( b* a* -- result* ) + OVR2r LIT2r 0004 SUB2r STH2kr INC2 INC2 STA2 + STH2kr STA2 + STH2kr INC2 INC2 LDA2 #8000 EOR2 STH2kr LDA2 #8000 EOR2 LTH2 #00 SWP !&return + #0000 + + &return + POP2r JMP2r + +@int_le_ ( b* a* -- result* ) + OVR2r LIT2r 0004 SUB2r STH2kr INC2 INC2 STA2 + STH2kr STA2 + STH2kr INC2 INC2 LDA2 #8000 EOR2 STH2kr LDA2 #8000 EOR2 GTH2 #00 SWP #01 EOR !&return + #0000 + + &return + POP2r JMP2r + +@int_gt_ ( b* a* -- result* ) + OVR2r LIT2r 0004 SUB2r STH2kr INC2 INC2 STA2 + STH2kr STA2 + STH2kr LDA2 #8000 EOR2 STH2kr INC2 INC2 LDA2 #8000 EOR2 LTH2 #00 SWP !&return + #0000 + + &return + POP2r JMP2r + +@int_ge_ ( b* a* -- result* ) + OVR2r LIT2r 0004 SUB2r STH2kr INC2 INC2 STA2 + STH2kr STA2 + STH2kr LDA2 #8000 EOR2 STH2kr INC2 INC2 LDA2 #8000 EOR2 GTH2 #00 SWP #01 EOR !&return + #0000 + + &return + POP2r JMP2r + +@int_neg_ ( f* -- result* ) + OVR2r LIT2r 0002 SUB2r STH2kr STA2 + #0000 STH2kr LDA2 SUB2 !&return + #0000 + + &return + POP2r JMP2r + +@int_abs_ ( f* -- result* ) + OVR2r LIT2r 0002 SUB2r STH2kr STA2 + STH2kr LDA2 #8000 EOR2 #8000 LTH2 ?&then.1 + STH2kr LDA2 !&end.1 + + &then.1 + #0000 STH2kr LDA2 SUB2 + + &end.1 + !&return + #0000 + + &return + POP2r JMP2r @str/ ( str* -- ) LDAk DUP ?{ POP POP2 JMP2r } @@ -153,4 +267,4 @@ INC2 !/ @mem_length_ #0000 -@mem_ \ No newline at end of file +@mem_ \ No newline at end of file diff --git a/test/add.ul b/test/add.ul index 7083804..a05808b 100755 --- a/test/add.ul +++ b/test/add.ul @@ -1,7 +1,5 @@ - -function main() { - print(add(1, 1) as str); -} +print(add(1, 1) as str); +halt; /** * Add two numbers together diff --git a/test/bang.ul b/test/bang.ul index 0016e07..49b2b24 100755 --- a/test/bang.ul +++ b/test/bang.ul @@ -3,3 +3,5 @@ bool flag = false; if (!flag) { print("flag is false"); } + +halt; \ No newline at end of file diff --git a/test/fib.ul b/test/fib.ul index d87eada..bdd8328 100755 --- a/test/fib.ul +++ b/test/fib.ul @@ -1,6 +1,5 @@ -function main() { - print(fib(23) as str); -} +print(fib(23) as str); +halt; /** * Recursively calculate fibonacci diff --git a/test/for.ul b/test/for.ul index 3e74023..0bb82b6 100755 --- a/test/for.ul +++ b/test/for.ul @@ -1,9 +1,11 @@ nat i = 0; -for (nat x in [0..10]) { - print(x as str); -} +//for (nat x in [0..10]) { +// print(x as str); +//} for (nat j = 0; j < 10; j = j + 1) { print(j as str); -} \ No newline at end of file +} + +halt; \ No newline at end of file diff --git a/test/global.ul b/test/global.ul index 18897d2..6e90409 100755 --- a/test/global.ul +++ b/test/global.ul @@ -1,6 +1,4 @@ int i = 122; int j = 32; - -function main() { - putchar((i - j)); -} +print((i - j) as str); +halt; diff --git a/test/if.ul b/test/if.ul index 06f11f6..e9d15df 100755 --- a/test/if.ul +++ b/test/if.ul @@ -1,11 +1,9 @@ -function main() { - nat x = 20; +nat x = 20; - if (x == 10) { - print("x is 10"); - } else if (x == 20) { - print("x is 20"); - } else { - print("x is something else"); - } +if (x == 10) { + print("x is 10"); +} else if (x == 20) { + print("x is 20"); +} else { + print("x is something else"); } \ No newline at end of file diff --git a/test/local.ul b/test/local.ul index 2d112b6..648adee 100755 --- a/test/local.ul +++ b/test/local.ul @@ -1,6 +1,9 @@ -function main() { +local_fn(); +halt; + +function local_fn() { int i = 122; int j = 32; - putchar((i - j)); // prints ascii `Z` + printf((i - j)); } diff --git a/test/malloc.ul b/test/malloc.ul index 1532618..1b17d7c 100755 --- a/test/malloc.ul +++ b/test/malloc.ul @@ -1,9 +1,4 @@ -/** - * Main function - */ -function main() { - print("Enter a string: "); - str msg = read(32); - print(msg); - return 0; -} +print("Enter a string: "); +str msg = read(32); +print(msg); +return 0; diff --git a/test/paint.ul b/test/paint.ul index 51dc67b..eca7f97 100755 --- a/test/paint.ul +++ b/test/paint.ul @@ -34,38 +34,34 @@ plex Mouse implements Device { bool btn4; } -/** - * Main function - */ -function main() { - Screen screen = open("/dev/screen/0", 0); - Mouse mouse = open("/dev/mouse/0", 0); +Screen screen = open("/dev/screen/0", 0); +Mouse mouse = open("/dev/mouse/0", 0); - outline_swatch(screen, BLACK, 1, 1); - outline_swatch(screen, WHITE, 21, 1); - screen.draw(); +outline_swatch(screen, BLACK, 1, 1); +outline_swatch(screen, WHITE, 21, 1); +screen.draw(); - loop { - mouse.refresh(); - if (!mouse.left) continue; - - int box_size = 20; - int x = 1; - int y = 1; - byte color = BLACK; - outlined_swatch(screen, color, x, y); - set_color(box_size, x, y, mouse.x, mouse.y, color); - - color = WHITE; - x = 21; - outlined_swatch(screen, color, x, y); - set_color(box_size, x, y, mouse.x, mouse.y, color); - screen.draw(); - - rectangle(screen, selected_color, x, y, 5, 5); - } - exit(0); +loop { + mouse.refresh(); + if (!mouse.left) continue; + + int box_size = 20; + int x = 1; + int y = 1; + byte color = BLACK; + outlined_swatch(screen, color, x, y); + set_color(box_size, x, y, mouse.x, mouse.y, color); + + color = WHITE; + x = 21; + outlined_swatch(screen, color, x, y); + set_color(box_size, x, y, mouse.x, mouse.y, color); + screen.draw(); + + rectangle(screen, selected_color, x, y, 5, 5); } +halt; + /** * Checks if the click is within the bound and update the selected color if so. diff --git a/test/plex.ul b/test/plex.ul index f534ca6..e8ce36a 100755 --- a/test/plex.ul +++ b/test/plex.ul @@ -36,15 +36,13 @@ plex Rect { } } +Rect r = create_geometry(); +print(r.toS()); +halt; + function create_geometry() Rect { Point tl(10, 20); Point br(100, 50); Rect final_rect(tl, br, 90, 180); return final_rect; } - -function main() int { - Rect r = create_geometry(); - print(r.toS()); - return 0; -}