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