((code (label main ; open terminal for debug (load-immediate $32 &terminal-namespace) (load-immediate $11 0) (syscall OPEN $32 $32 $11) ; Open screen ; use load immediate because it is a pointer to a string, not a value (load-immediate $0 &screen-namespace) (syscall OPEN $18 $0 $11) ; open(out Plex screen, in namespace, in flags) (load-immediate $1 4) ; offset for handle (add-nat $19 $18 $1) (get $0 $19) ; load handle (nat-to-string $5 $0) (push $32) (push $5) (call &pln) (load-immediate $1 8) ; offset for width (add-nat $19 $18 $1) (get $20 $19) ; load width (nat-to-string $5 $20) (push $32) (push $5) (call &pln) (load-immediate $1 12) ; offset for size (add-nat $19 $18 $1) (get $22 $19) ; load size (nat-to-string $5 $22) (push $32) (push $5) (call &pln) (load-immediate $1 16) ; offset for screen buffer (add-nat $21 $18 $1) (nat-to-string $5 $21) (push $32) (push $5) (call &pln) ; open mouse (load-immediate $16 &mouse-namespace) (syscall OPEN $15 $16 $11) ; open(out Plex mouse, in namespace, in flags) (load-immediate $1 4) ; offset for handle (add-nat $19 $15 $1) (nat-to-string $5 $19) (push $32) (push $5) (call &pln) (get $16 $19) ; load handle (syscall WRITE $0 $21 $22) ; redraw (load-immediate $3 16) (label draw-loop ; load mouse click data (syscall READ $16 $2 $3 $15) (load-immediate $5 16) ; offset for btn1 (add-nat $6 $15 $5) (get-8 $9 $6) ; load btn1 pressed (jump-eq-nat &draw-loop $9 $11) (load-immediate $5 8) ; offset for x (add-nat $6 $5 $2) (get $7 $6) ; load x (load-immediate $5 12) ; offset for y (add-nat $6 $5 $2) (get $8 $6) ; load y ; Compute start address: y*width + x (mul-nat $30 $8 $20) ; $15 = y * width (add-nat $30 $30 $7) ; $15 += x (add-nat $30 $30 $21) ; $15 += pixel_offset (load-immediate $1 4) ; need to add offset for fat pointer size (add-nat $30 $30 $1) (load $3 &WHITE) ; color (store-8 $30 $3) ; draw color at screen [x,y] (syscall WRITE $0 $21 $22) ; redraw (jump &draw-loop)) (halt)) (label pln (load-immediate $3 &new-line) (pop $1) (pop $0) (load-immediate $5 4) ; offset for handle (add-nat $6 $0 $5) (get $7 $6) ; load handle (string-length $2 $1) (syscall WRITE $7 $1 $2) (string-length $4 $3) (syscall WRITE $7 $3 $4) (return))) (data (label screen-namespace "/dev/screen/0") (label mouse-namespace "/dev/mouse/0") (label terminal-namespace "/dev/term/0") (label new-line "\n") (label WHITE 255)))