From 96deaa9ff704578b9cefcb1c46cfbda92ddc6e14 Mon Sep 17 00:00:00 2001 From: zongor Date: Sat, 22 Nov 2025 13:52:31 -0800 Subject: [PATCH] more syntax refinement --- test/window.ul.ir | 113 +++++++++++++++++++------------------- test/window.ul.ir2 | 73 +++++++++++++++++++++++++ test/window.ul.uir | 73 ------------------------- test/window.ul.vuir | 129 ++++++++++++++++++++++++++------------------ 4 files changed, 206 insertions(+), 182 deletions(-) create mode 100644 test/window.ul.ir2 delete mode 100644 test/window.ul.uir diff --git a/test/window.ul.ir b/test/window.ul.ir index a5a60b2..7f52163 100644 --- a/test/window.ul.ir +++ b/test/window.ul.ir @@ -1,91 +1,92 @@ -global const str screen_namespace = "/dev/screen/0" -global const str mouse_namespace = "/dev/mouse/0" -global const str terminal_namespace = "/dev/term/0" -global const str new_line = "\n" -global const byte WHITE = 255 +global str screen_namespace = "/dev/screen/0" +global str mouse_namespace = "/dev/mouse/0" +global str terminal_namespace = "/dev/term/0" +global str new_line = "\n" +global byte WHITE = 255 function main () - # Open screen - # use load immediate because it is a pointer to a string, not a value - plex screen is $0 - plex mouse is $1 - str tmp_str is $2 - byte color is $3 - byte left_down is $4 - int mode is $5 - nat offset_temp is $6 - nat x is $7 - nat y is $8 - nat width is $9 - nat screen_buffer is $10 - nat buffer_size is $11 - nat pixel_pos is $12 + // Open screen + // use load immediate because it a pointer to a string, not a value - load_address &screen_namespace -> tmp_str + plex screen $0 + plex mouse $1 + str tmp_str $2 + byte color $3 + byte left_down $4 + int mode $5 + nat offset_temp $6 + nat x $7 + nat y $8 + nat width $9 + nat screen_buffer $10 + nat buffer_size $11 + nat pixel_pos $12 + + load_address screen_namespace -> tmp_str load_immediate 0 -> mode - syscall OPEN tmp_str mode -> screen # openout Plex screen, in namespace, in flags + syscall OPEN tmp_str mode -> screen // open Plex screen, in namespace, in flags nat_to_string screen -> tmp_str - call &pln tmp_str + call pln tmp_str - load_offset_32 screen 8 -> width # load width + load_offset_32 screen 8 -> width // load width nat_to_string width -> tmp_str - call &pln tmp_str + call pln tmp_str - load_offset_32 screen 12 -> buffer_size # load size + load_offset_32 screen 12 -> buffer_size // load size nat_to_string buffer_size -> tmp_str - call &pln tmp_str + call pln tmp_str - load_immediate 16 -> offset_temp # offset for screen buffer + load_immediate 16 -> offset_temp // offset for screen buffer add_nat screen offset_temp -> screen_buffer nat_to_string screen_buffer -> tmp_str - call &pln tmp_str + call pln tmp_str - # open mouse - load_address &mouse_namespace -> tmp_str - syscall OPEN tmp_str mode -> mouse # openout Plex mouse, in namespace, in flags + // open mouse + load_address mouse_namespace -> tmp_str + syscall OPEN tmp_str mode -> mouse // open Plex mouse, in namespace, in flags - syscall WRITE screen screen_buffer buffer_size # redraw + syscall WRITE screen screen_buffer buffer_size // redraw - draw_loop: - # load mouse click data + loop draw_loop + // load mouse click data syscall STAT mouse - load_offset_8 mouse 16 -> left_down # load btn1 pressed + load_offset_8 mouse 16 -> left_down // load btn1 pressed - jump_eq_nat &draw_loop left_down mode # mode is 0 which is an alias for false + jump_eq_nat draw_loop left_down mode // mode 0 which an alias for false - load_offset_32 mouse 8 -> x # load x - load_offset_32 mouse 12 -> y # load y + load_offset_32 mouse 8 -> x // load x + load_offset_32 mouse 12 -> y // load y - # Compute start address: y*width + x - mul_nat y width -> pixel_pos # = y * width - add_nat x pixel_pos -> pixel_pos # += x - add_nat screen_buffer pixel_pos -> pixel_pos # += pixel_offset - load_immediate 4 -> fat_ptr_size # need to add offset for fat pointer size + // Compute start address: y*width + x + mul_nat y width -> pixel_pos // = y * width + add_nat x pixel_pos -> pixel_pos // += x + add_nat screen_buffer pixel_pos -> pixel_pos // += pixel_offset + load_immediate 4 -> fat_ptr_size // need to add offset for fat pointer size add_nat pixel_pos fat_ptr_size -> pixel_pos - load_absolute_32 &WHITE -> color - store_absolute_8 pixel_pos color # draw color at screen [x,y] - syscall WRITE screen screen_buffer buffer_size # redraw + load_absolute_32 WHITE -> color + store_absolute_8 pixel_pos color // draw color at screen [x,y] + syscall WRITE screen screen_buffer buffer_size // redraw - jump &draw_loop + jump draw_loop exit 0 -function pln (str message is $0) - str term is $1 - int msg_length is $2 - str nl is $3 - int nl_length is $4 - int mode is $5 +function pln (str message $0) + str term $1 + int msg_length $2 + str nl $3 + int nl_length $4 + int mode $5 - load_address &terminal_namespace -> term # get terminal device + load_address terminal_namespace -> term // get terminal device load_immediate 0 -> mode syscall OPEN term mode -> term strlen message -> msg_length syscall WRITE term message msg_length - load_address &new_line -> nl + load_address new_line -> nl strlen nl -> nl_length syscall WRITE term nl nl_length return diff --git a/test/window.ul.ir2 b/test/window.ul.ir2 new file mode 100644 index 0000000..e47579c --- /dev/null +++ b/test/window.ul.ir2 @@ -0,0 +1,73 @@ +global str screen_namespace = "/dev/screen/0" +global str mouse_namespace = "/dev/mouse/0" +global str terminal_namespace = "/dev/term/0" +global str new_line = "\n" +global byte WHITE = 255 + +function main () + // open screen + // use load immediate because it is a pointer to a string not a value + + ptr tmp_ptr $0 = &screen_namespace + int mode $1 = 0 + ptr screen $2 = open tmp_ptr mode + + nat screen_handle $3 = @memory.u32[screen + 4] + str tmp_str $4 = nat_to_string screen_handle + pln(tmp_str) + + nat width $5 = @memory.u32[screen + 8] + tmp_str = nat_to_string width + pln(tmp_str) + + nat buffer_size $6 = @memory.u32[screen + 12] + tmp_str = nat_to_string buffer_size + pln(tmp_str) + + nat offset_temp $7 = 16 + ptr screen_buffer = add_nat screen offset_temp + + tmp_str = nat_to_string screen_buffer + pln(tmp_str) + + // open mouse + tmp_ptr = &mouse_namespace + ptr mouse $8 = open tmp_ptr mode + + write screen screen_buffer buffer_size // redraw + + loop draw_loop + // load mouse click data + stat mouse + + bool left_down $9 = @memory.u8[mouse + 16] // load btn1 pressed + + jump_eq_nat &draw_loop left_down mode // mode is 0 which is an alias for false + + nat x $10 = @memory.u32[mouse + 8] + nat y $11 = @memory.u32[mouse + 12] + + // Compute start address: y*width + x + nat pixel_pos $12 = mul_nat y width + pixel_pos = add_nat x pixel_pos + pixel_pos = add_nat screen_buffer pixel_pos + nat fat_ptr_size $13 = 4 // need to add offset for fat pointer size + pixel_pos = add_nat pixel_pos fat_ptr_size + + byte color $14 = @memory.u8[ &WHITE ] + @memory.u8[pixel_pos] = color // draw color at screen [xy] + write screen screen_buffer buffer_size // redraw + + jump &draw_loop + exit 0 + +function pln (str message $0) + nat term_ns $1 = &terminal_namespace // get terminal device + int mode $2 = 0 + ptr term $3 = open term_ns mode + int msg_length $4 = strlen message + write term message msg_length + str nl $5 = &new_line + int nl_length $6 = strlen nl + write term nl nl_length + return diff --git a/test/window.ul.uir b/test/window.ul.uir deleted file mode 100644 index b75e516..0000000 --- a/test/window.ul.uir +++ /dev/null @@ -1,73 +0,0 @@ -global const str screen_namespace = "/dev/screen/0" -global const str mouse_namespace = "/dev/mouse/0" -global const str terminal_namespace = "/dev/term/0" -global const str new_line = "\n" -global const byte WHITE = 255 - -function main () - # open screen - # use load immediate because it is a pointer to a string, not a value - - nat tmp_ptr = load_address screen_namespace - int mode = load_immediate 0 - plex screen = open tmp_ptr, mode - - nat screen_handle = load_offset_32 screen, 4 - str tmp_str = nat_to_string screen_handle - call pln tmp_str - - nat width = load_offset_32 screen, 8 - tmp_str = nat_to_string width - call pln tmp_str - - nat buffer_size = load_offset_32 screen, 12 - tmp_str = nat_to_string buffer_size - call pln tmp_str - - nat offset_temp = load_immediate 16 - nat screen_buffer = add_nat screen, offset_temp - - tmp_str = nat_to_string screen_buffer - call pln tmp_str - - # open mouse - tmp_ptr = load_address mouse_namespace - plex mouse = open tmp_ptr, mode - - write screen, screen_buffer, buffer_size # redraw - - draw_loop: - # load mouse click data - stat mouse - - byte left_down = load_offset_8 mouse, 16 # load btn1 pressed - - jump_eq_nat draw_loop, left_down, mode # mode is 0 which is an alias for false - - nat x = load_offset_32 mouse, 8 - nat y = load_offset_32 mouse, 12 - - # Compute start address: y*width + x - nat pixel_pos = mul_nat y, width # = y * width - pixel_pos = add_nat x, pixel_pos # += x - pixel_pos = add_nat screen_buffer, pixel_pos # += pixel_offset - nat fat_ptr_size = load_immediate 4 # need to add offset for fat pointer size - pixel_pos = add_nat pixel_pos, fat_ptr_size - - byte color = load_absolute_32 WHITE - store_absolute_8 pixel_pos, color # draw color at screen [x,y] - write screen, screen_buffer, buffer_size # redraw - - jump draw_loop - exit 0 - -function pln (str message) - nat term_ns = load_address terminal_namespace # get terminal device - int mode = load_immediate 0 - plex term = open term_ns, mode - int msg_length = strlen message - write term, message, msg_length - str nl = load_address new_line - int nl_length = strlen nl - write term, nl, nl_length - return diff --git a/test/window.ul.vuir b/test/window.ul.vuir index 8ac09b0..aacf89b 100644 --- a/test/window.ul.vuir +++ b/test/window.ul.vuir @@ -1,72 +1,95 @@ -const str screen_namespace = "/dev/screen/0"; -const str mouse_namespace = "/dev/mouse/0"; -const str terminal_namespace = "/dev/term/0"; -const str new_line = "\n"; -const byte WHITE = 255; +global str screen_namespace = "/dev/screen/0" +global str mouse_namespace = "/dev/mouse/0" +global str terminal_namespace = "/dev/term/0" +global str new_line = "\n" +global byte WHITE = 255 -function main () { +/** + * Devices + */ +plex Terminal + nat handle + +plex Screen + nat handle + nat width + nat height + byte[] buffer + +plex Mouse + nat handle + nat x + nat y + bool left + bool right + bool middle + bool btn4 + nat size + +function main () // open screen // use load immediate because it is a pointer to a string, not a value - nat tmp_ptr = &screen_namespace; - int mode = 0; - plex screen = open(tmp_ptr, mode); + nat tmp_ptr = &screen_namespace + int mode = 0 + ptr screen = open(tmp_ptr, mode) - nat screen_handle = screen.handle; - str tmp_str = screen_handle as str; - pln(tmp_str); + nat screen_handle = screen.handle + str tmp_str = nat_to_string(screen_handle) + pln(tmp_str) - nat width = screen.width; - tmp_str = width as str; - pln(tmp_str); + nat width = screen.width + tmp_str = nat_to_string(width) + pln(tmp_str) - nat buffer_size = screen.size; - tmp_str = buffer_size as str; - pln(tmp_str); + nat buffer_size = screen.buffer + tmp_str = nat_to_string(buffer_size) + pln(tmp_str) - nat screen_buffer = screen.buffer.ptr; - tmp_str = screen_buffer as str; - pln(tmp_str); + nat offset_temp = 16 + nat screen_buffer = add_nat(screen, offset_temp) + + tmp_str = nat_to_string(screen_buffer) + pln(tmp_str) // open mouse - tmp_ptr = &mouse_namespace; - plex mouse = open(tmp_ptr, mode); + tmp_ptr = &mouse_namespace + ptr mouse = open(tmp_ptr, mode) - write(screen, screen_buffer, buffer_size); // redraw + write(screen, screen_buffer, buffer_size) // redraw - loop { + loop draw_loop // load mouse click data - stat(mouse); + stat(mouse) - byte left_down = mouse.left; + byte left_down = mouse.left // load btn1 pressed - if (left_down == 1) { - nat x = mouse.x; - nat y = mouse.y; + jump_eq_nat(&draw_loop, left_down, mode) // mode is 0 which is an alias for false - // Compute start address: y*width + x - nat pixel_pos = y * width; // = y * width - pixel_pos = x + pixel_pos; // += x - pixel_pos = screen_buffer + pixel_pos; // += pixel_offset - nat fat_ptr_size = 4; // need to add offset for fat pointer size - pixel_pos = pixel_pos + fat_ptr_size; + nat x = mouse.x + nat y = mouse.y - byte color = WHITE; - store_absolute_8(pixel_pos, color); // draw color at screen [x,y] - write(screen, screen_buffer, buffer_size); // redraw - } - } - exit(0); -} + // Compute start address: y*width + x + nat pixel_pos = mul_nat(y, width) + pixel_pos = add_nat(x, pixel_pos) + pixel_pos = add_nat(screen_buffer, pixel_pos) + nat fat_ptr_size = 4 // need to add offset for fat pointer size + pixel_pos = add_nat(pixel_pos, fat_ptr_size) -function pln (str message) { - nat term_ns = &terminal_namespace; // get terminal device - int mode = 0; - plex term = open(term_ns, mode); - int msg_length = message.length; - write(term, message, msg_length); - str nl = &new_line; - int nl_length = nl.length; - write(term, nl, nl_length); + byte color = WHITE + screen.buffer[pixel_pos] = color // draw color at screen [x,y] + write(screen, screen_buffer, buffer_size) // redraw + + jump(&draw_loop) + exit 0 + +function pln (str message) + nat term_ns = &terminal_namespace // get terminal device + int mode = 0 + ptr term = open(term_ns, mode) + int msg_length = strlen(message) + write(term, message, msg_length) + str nl = &new_line + int nl_length = strlen(nl) + write(term, nl, nl_length) return -} \ No newline at end of file