more syntax refinement

This commit is contained in:
zongor 2025-11-22 13:52:31 -08:00
parent 32365a8895
commit 96deaa9ff7
4 changed files with 206 additions and 182 deletions

View File

@ -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

73
test/window.ul.ir2 Normal file
View File

@ -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

View File

@ -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

View File

@ -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
}