undar-lang/test/window.ul.ir2

74 lines
2.0 KiB
Plaintext

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