((code (label main (load-immediate $0 &screen-namespace) (load-immediate $11 0) (syscall OPEN $0 $11) (syscall WRITE $0 $0 $0) (load-immediate $16 1) ; device info call (load-immediate $17 16) ; sizeof screen device info (malloc $18 $17) (syscall IOCTL $0 $16 $18) (load-immediate $1 12) ; offset for width (add-nat $19 $18 $1) (load-r $20 $19) ; load width (load-immediate $1 4) ; offset for width (add-nat $19 $18 $1) (load-r $21 $19) ; load base pointer (add-nat $21 $21 $1) ; need to add offset for fat pointer size (load-immediate $16 &mouse-namespace) (load-immediate $3 12) ; malloc sizeof mouse data (malloc $4 $3) (label draw-loop ; load mouse click data (syscall READ $16 $2 $3 $4) (load-immediate $5 4) ; offset for x (add-nat $6 $5 $2) (load-r $7 $6) ; load x (load-immediate $5 8) ; offset for y (add-nat $6 $5 $2) (load-r $8 $6) ; load y (load-immediate $5 12) ; offset for btn1 (add-nat $6 $5 $2) (load-r8 $9 $6) ; load btn1 pressed (load-immediate $5 13) ; offset for btn2 (add-nat $6 $5 $2) (load-r8 $10 $6) ; load btn2 pressed (jump-eq-nat &draw-loop $9 $11) ; Compute start address: y*width + x (mul-nat $15 $8 $20) ; $15 = y * width (add-nat $15 $15 $7) ; $15 += x (add-nat $15 $21 $15) ; $15 = base + pixel_offset (load $3 &WHITE) ; color (store-8 $15 $3) ; draw color at screen [x,y] (syscall WRITE $0 $0 $0) ; redraw (jump-eq-nat &draw-loop $10 $11)) (halt)) (label println (load-immediate $0 &terminal-namespace) (load-immediate $3 &new-line) (pop $1) (string-length $2 $1) (syscall WRITE $0 $1 $2) (string-length $4 $3) (syscall WRITE $0 $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)))