uxn/projects/examples/dev.mouse.usm

140 lines
3.8 KiB
Plaintext

( Dev/Mouse )
%RTN { JMP2r }
%8+ { #0008 ADD2 }
%++ { #0001 ADD2 }
%-- { #0001 SUB2 }
;touch1 { xc 2 yc 2 r 2 }
;touch2 { xc 2 yc 2 r 2 }
;color { byte 1 }
;addr { short 2 }
;pointer { x 2 y 2 }
;circle { xc 2 yc 2 x 2 y 2 r 2 d 2 }
( devices )
|0100 ;System { vector 2 pad 6 r 2 g 2 b 2 }
|0120 ;Screen { vector 2 width 2 height 2 pad 2 x 2 y 2 addr 2 color 1 }
|0160 ;Mouse { vector 2 x 2 y 2 state 1 chord 1 }
( program )
|0200
( theme ) #03fd =System.r #0ef3 =System.g #0bf2 =System.b
( vectors ) ,on-screen =Screen.vector
( vectors ) ,on-mouse =Mouse.vector
BRK
@on-screen
( clear ) ~touch1.xc ~touch1.yc ~touch1.r #00 ,draw-circle JSR2
( clear ) ~touch2.xc ~touch2.yc ~touch2.r #00 ,draw-circle JSR2
~touch1.r ++ =touch1.r
~touch2.r ++ =touch2.r
( draw ) ~touch1.xc ~touch1.yc ~touch1.r #03 ,draw-circle JSR2
( draw ) ~touch2.xc ~touch2.yc ~touch2.r #02 ,draw-circle JSR2
~touch1.xc ~touch1.yc #23 ,touch1.r #0001 ADD2 ,draw-byte JSR2
~touch2.xc ~touch2.yc #28 ,touch2.r #0001 ADD2 ,draw-byte JSR2
BRK
@on-mouse
,draw-cursor JSR2
~Mouse.state #01 NEQ ,$no-touch1 JNZ2
( clear ) ~touch1.xc ~touch1.yc ~touch1.r #00 ,draw-circle JSR2
( update ) ~Mouse.x =touch1.xc ~Mouse.y =touch1.yc #0000 =touch1.r
( release ) #00 =Mouse.state
$no-touch1
~Mouse.state #10 NEQ ,$no-touch2 JNZ2
( clear ) ~touch2.xc ~touch2.yc ~touch2.r #00 ,draw-circle JSR2
( update ) ~Mouse.x =touch2.xc ~Mouse.y =touch2.yc #0000 =touch2.r
( release ) #00 =Mouse.state
$no-touch2
BRK
@draw-cursor ( -- )
( clear last cursor )
,clear_icn =Screen.addr
~pointer.x =Screen.x
~pointer.y =Screen.y
#30 =Screen.color
( record pointer positions )
~Mouse.x =pointer.x ~Mouse.y =pointer.y
( draw new cursor )
,cursor_icn =Screen.addr
~pointer.x =Screen.x
~pointer.y =Screen.y
#31 ~Mouse.state #00 NEQ ADD =Screen.color
RTN
@draw-circle ( xc yc r color )
( load ) =color =circle.r =circle.yc =circle.xc
#0000 =circle.x ~circle.r =circle.y
~circle.r #0002 MUL2 #0003 SUB2 =circle.d
( draw ) ,$seg JSR2
$loop
( incr ) ~circle.x ++ =circle.x
~circle.d #0000 #0001 ADD2 LTS2 ^$else JNZ
( decr ) ~circle.y -- =circle.y
~circle.x ~circle.y SUB2 #0004 MUL2 ~circle.d ADD2 #000a ADD2 =circle.d
,$end JMP2
$else
~circle.x #0004 MUL2 ~circle.d ADD2 #0006 ADD2 =circle.d
$end
( draw ) ,$seg JSR2
~circle.y ~circle.x #0001 SUB2 GTS2 ^$loop JNZ
RTN
$seg
~circle.xc ~circle.x ADD2 =Screen.x ~circle.yc ~circle.y ADD2 =Screen.y ~color =Screen.color
~circle.xc ~circle.x SUB2 =Screen.x ~circle.yc ~circle.y ADD2 =Screen.y ~color =Screen.color
~circle.xc ~circle.x ADD2 =Screen.x ~circle.yc ~circle.y SUB2 =Screen.y ~color =Screen.color
~circle.xc ~circle.x SUB2 =Screen.x ~circle.yc ~circle.y SUB2 =Screen.y ~color =Screen.color
~circle.xc ~circle.y ADD2 =Screen.x ~circle.yc ~circle.x ADD2 =Screen.y ~color =Screen.color
~circle.xc ~circle.y SUB2 =Screen.x ~circle.yc ~circle.x ADD2 =Screen.y ~color =Screen.color
~circle.xc ~circle.y ADD2 =Screen.x ~circle.yc ~circle.x SUB2 =Screen.y ~color =Screen.color
~circle.xc ~circle.y SUB2 =Screen.x ~circle.yc ~circle.x SUB2 =Screen.y ~color =Screen.color
RTN
@draw-byte ( x y color addr -- )
=addr STH
=Screen.y
=Screen.x
,font_hex #00 ~addr PEK2 #04 SFT #0008 MUL2 ADD2 =Screen.addr
STHr DUP STH =Screen.color
,font_hex #00 ~addr PEK2 #0f AND #0008 MUL2 ADD2 =Screen.addr
~Screen.x 8+ =Screen.x
STHr =Screen.color
RTN
@clear_icn [ 0000 0000 0000 0000 ]
@cursor_icn [ 80c0 e0f0 f8e0 1000 ]
@font_hex
[
003c 464a 5262 3c00 0018 0808 0808 1c00
003c 4202 3c40 7e00 003c 421c 0242 3c00
000c 1424 447e 0400 007e 407c 0242 3c00
003c 407c 4242 3c00 007e 0204 0810 1000
003c 423c 4242 3c00 003c 4242 3e02 3c00
003c 4242 7e42 4200 007c 427c 4242 7c00
003c 4240 4042 3c00 007c 4242 4242 7c00
007e 4078 4040 7e00 007e 4078 4040 4000
]