From 65ef3c54266a2927fb6513d912bc122d0900015b Mon Sep 17 00:00:00 2001 From: zongor Date: Tue, 17 Feb 2026 22:48:46 -0800 Subject: [PATCH] next highest level ir example --- test/paint.vuir.ul | 264 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 264 insertions(+) create mode 100644 test/paint.vuir.ul diff --git a/test/paint.vuir.ul b/test/paint.vuir.ul new file mode 100644 index 0000000..6eeffb5 --- /dev/null +++ b/test/paint.vuir.ul @@ -0,0 +1,264 @@ +str screen_namespace = "/dev/screen/0"; +str mouse_namespace = "/dev/mouse/0"; +byte BLACK = 0; +byte WHITE = 255; +byte DARK_GRAY = 73; +byte GRAY = 146; +byte LIGHT_GRAY = 182; +byte CHARCOAL = 36; +byte DARK_RED = 128; +byte RED = 224; +byte DARK_YELLOW = 144; +byte YELLOW = 252; +byte DARK_TEAL = 9; +byte TEAL = 18; +byte DARK_GREEN = 12; +byte GREEN = 16; +byte LIME = 28; +byte LIGHT_CYAN = 159; +byte NAVY = 2; +byte BLUE = 3; +byte DEEP_SKY_BLUE = 10; +byte LIGHT_BLUE = 19; +byte PURPLE = 131; +byte LIGHT_PURPLE = 147; +byte DARK_MAGENTA = 130; +byte MAGENTA = 227; +byte PLUM = 129; +byte PINK = 226; +byte SADDLE_BROWN = 72; +byte PERU = 141; +byte SIENNA = 136; +byte ORANGE = 241; +byte DARK_ORANGE = 208; +byte GOLD = 244; +byte SELECTED_COLOR = 255; + +function main () { + // Open screen + int mode = 0; + ptr screen = open(screen_namespace, mode); + + nat width = &screen + 8; + nat size = &screen + 12; + nat screen_buffer = &screen + 16; + + // open mouse + ptr mouse = open(mouse_namespace, mode); // Mouse mouse = open("/dev/mouse/0", 0); + + byte color; + nat x_pos; + nat y_pos; + + color = BLACK; + x_pos = 1; + y_pos = 1; + draw_outlined_swatch (screen_buffer, color, x_pos, y_pos, width); + + color = WHITE; + x_pos = 21; + y_pos = 1; + draw_outlined_swatch (screen_buffer, color, x_pos, y_pos, width); + + color = CHARCOAL; + x_pos = 1; + y_pos = 21; + draw_outlined_swatch (screen_buffer, color, x_pos, y_pos, width); + + color = DARK_GRAY; + x_pos = 21; + y_pos = 21; + draw_outlined_swatch (screen_buffer, color, x_pos, y_pos, width); + + color = RED; + x_pos = 1; + y_pos = 41; + draw_outlined_swatch (screen_buffer, color, x_pos, y_pos, width); + + color = ORANGE; + x_pos = 21; + y_pos = 41; + draw_outlined_swatch (screen_buffer, color, x_pos, y_pos, width); + + color = YELLOW; + x_pos = 1; + y_pos = 61; + draw_outlined_swatch (screen_buffer, color, x_pos, y_pos, width); + + color = GREEN; + x_pos = 21; + y_pos = 61; + draw_outlined_swatch (screen_buffer, color, x_pos, y_pos, width); + + color = BLUE; + x_pos = 1; + y_pos = 81; + draw_outlined_swatch (screen_buffer, color, x_pos, y_pos, width); + + color = PURPLE; + x_pos = 21; + y_pos = 81; + draw_outlined_swatch (screen_buffer, color, x_pos, y_pos, width); + + // screen.draw + write(screen, screen_buffer, size); + + nat zero = 0; + + loop draw_loop { + // load mouse click data + stat(mouse); + + byte left_down = &mouse + 16; // load btn1 pressed + + jump_eq_nat(draw_loop, left_down, zero); // if (!btn1.left) continue; + + nat mouse_x = &mouse + 8; // load x + nat mouse_y = &mouse + 12; // load y + + nat box_size = 20; + + // first row + color = BLACK; + x_pos = 1; + y_pos = 1; + draw_outlined_swatch (screen_buffer, color, x_pos, y_pos, width); + set_color_if_clicked (mouse_x, mouse_y, x_pos, y_pos, color, box_size); + + color = WHITE; + x_pos = 21; + y_pos = 1; + draw_outlined_swatch (screen_buffer, color, x_pos, y_pos, width); + set_color_if_clicked (mouse_x, mouse_y, x_pos, y_pos, color, box_size); + + color = CHARCOAL; + x_pos = 1; + y_pos = 21; + draw_outlined_swatch (screen_buffer, color, x_pos, y_pos, width); + set_color_if_clicked (mouse_x, mouse_y, x_pos, y_pos, color, box_size); + + color = DARK_GRAY; + x_pos = 21; + y_pos = 21; + draw_outlined_swatch (screen_buffer, color, x_pos, y_pos, width); + set_color_if_clicked (mouse_x, mouse_y, x_pos, y_pos, color, box_size); + + color = RED; + x_pos = 1; + y_pos = 41; + draw_outlined_swatch (screen_buffer, color, x_pos, y_pos, width); + set_color_if_clicked (mouse_x, mouse_y, x_pos, y_pos, color, box_size); + + color = ORANGE; + x_pos = 21; + y_pos = 41; + draw_outlined_swatch (screen_buffer, color, x_pos, y_pos, width); + set_color_if_clicked (mouse_x, mouse_y, x_pos, y_pos, color, box_size); + + color = YELLOW; + x_pos = 1; + y_pos = 61; + draw_outlined_swatch (screen_buffer, color, x_pos, y_pos, width); + set_color_if_clicked (mouse_x, mouse_y, x_pos, y_pos, color, box_size); + + color = GREEN; + x_pos = 21; + y_pos = 61; + draw_outlined_swatch (screen_buffer, color, x_pos, y_pos, width); + set_color_if_clicked (mouse_x, mouse_y, x_pos, y_pos, color, box_size); + + color = BLUE; + x_pos = 1; + y_pos = 81; + draw_outlined_swatch (screen_buffer, color, x_pos, y_pos, width); + set_color_if_clicked (mouse_x, mouse_y, x_pos, y_pos, color, box_size); + + color = PURPLE; + x_pos = 21; + y_pos = 81; + draw_outlined_swatch (screen_buffer, color, x_pos, y_pos, width); + set_color_if_clicked (mouse_x, mouse_y, x_pos, y_pos, color, box_size); + + write(screen, screen_buffer, size); + + byte selected_color = SELECTED_COLOR; + nat brush_size = 5; + + draw_box(screen_buffer, width, selected_color, mouse_x, mouse_y, brush_size, brush_size); + + jump draw_loop; + } + + // Flush and exit + exit 0; +} + +function set_color_if_clicked (int click_x, int click_y, int box_x, int box_y, byte check_color, int size) { + + // Compute right + int right_edge = box_x + size; + + // Compute bottom = box_y + size + int bottom_edge = box_y + size; + + // Bounds check: x in [box_x, right] and y in [box_y, bottom] + jump_lt_int(fail, click_x, box_x); + jump_gt_int(fail, click_x, right_edge); + jump_lt_int(fail, click_y, box_y); + jump_gt_int(fail, click_y, bottom_edge); + + SELECTED_COLOR = check_color; + + else fail + return; +} + +function draw_outlined_swatch(nat base, byte color, int x, int y, int width) { + + // Constants + const byte selected_color = SELECTED_COLOR; + byte background_color = GRAY; + + jump_eq_int set_selected color selected_color; + jump end_set_selected; + do set_selected + background_color = DARK_GRAY; + else end_set_selected + + const nat outline_size = 20; + const nat fill_size = 17; + + draw_box(base, width, background_color, x, y, outline_size, outline_size); + + const nat offset = 2; + int x_off = x + offset; + int y_off = y + offset; + + draw_box(base, width, color, x_off, y_off, fill_size, fill_size); + + return; +} + +function draw_box (nat db_base, nat screen_width, + byte box_color, nat x_start, nat y_start, + nat db_width, nat height) { + + // Compute start address: base + y*640 + x + nat fat_ptr_size = 4; + + nat offset = y_start * screen_width; + offset = offset + x_start; + offset = offset + db_base; + offset = offset + fat_ptr_size; // need to add offset for fat pointer size + + int i = 0; + const int zero = 0; + + loop draw_box_outer { + memset_8 box_color db_width -> offset; // draw row + add_int offset screen_width -> offset; // next row += 640 + sub_int height i -> height; // decrement row count + jump_gt_int draw_box_outer height zero; + } + return; +} \ No newline at end of file