72 lines
2.0 KiB
Common Lisp
72 lines
2.0 KiB
Common Lisp
((code
|
|
(label main
|
|
(load-immediate $0 &screen-namespace)
|
|
(load-immediate $11 0)
|
|
(syscall OPEN $0 $11)
|
|
|
|
(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 8) ; offset for size
|
|
(add-nat $19 $18 $1)
|
|
(load-r $22 $19) ; load size
|
|
(malloc $21 $22) ; malloc frame buffer
|
|
(syscall WRITE $0 $21 $22)
|
|
|
|
(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 12) ; offset for btn1
|
|
(add-nat $6 $5 $2)
|
|
(load-r8 $9 $6) ; load btn1 pressed
|
|
|
|
(jump-eq-nat &draw-loop $9 $11)
|
|
|
|
(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
|
|
|
|
; 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-immediate $1 4) ; need to add offset for fat pointer size
|
|
(add-nat $15 $15 $1)
|
|
|
|
(load $3 &WHITE) ; color
|
|
(store-8 $15 $3) ; draw color at screen [x,y]
|
|
(syscall WRITE $0 $21 $22) ; redraw
|
|
|
|
(load-immediate $5 13) ; offset for btn2
|
|
(add-nat $6 $5 $2)
|
|
(load-r8 $10 $6) ; load btn2 pressed
|
|
|
|
(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)))
|