undar-lang/test/window.ul.vuir

72 lines
1.8 KiB
Plaintext

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;
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 screen_handle = screen.handle;
str tmp_str = screen_handle as str;
pln(tmp_str);
nat width = screen.width;
tmp_str = width as str;
pln(tmp_str);
nat buffer_size = screen.size;
tmp_str = buffer_size as str;
pln(tmp_str);
nat screen_buffer = screen.buffer.ptr;
tmp_str = screen_buffer as str;
pln(tmp_str);
// open mouse
tmp_ptr = &mouse_namespace;
plex mouse = open(tmp_ptr, mode);
write(screen, screen_buffer, buffer_size); // redraw
loop {
// load mouse click data
stat(mouse);
byte left_down = mouse.left;
if (left_down == 0) continue;
nat x = mouse.x;
nat y = mouse.y;
// 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;
byte color = WHITE;
store_absolute_8(pixel_pos, color); // draw color at screen [x,y]
write(screen, screen_buffer, buffer_size); // redraw
}
exit(0);
}
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);
return
}