uxn

Varvara Ordinator, written in ANSI C(SDL2)
git clone https://git.eamoncaddigan.net/uxn.git
Log | Files | Refs | README | LICENSE

commit 6a6e9acc50d0670e62692f200fadd6f0a7ce5cd6
parent 0bd8a3066ecdfff0ec2cae4f01b8dd79afeef408
Author: neauoire <aliceffekt@gmail.com>
Date:   Tue, 13 Apr 2021 22:50:01 -0700

Trying to optimize drawing routines

Diffstat:
Mbuild.sh | 2+-
Mprojects/examples/dev.screen.usm | 23++++++++++++++---------
Mprojects/examples/gui.shapes.usm | 86+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------
Mprojects/examples/gui.wallpaper.usm | 4++--
Mprojects/software/noodle.usm | 42+++++++++++++++++++-----------------------
5 files changed, 112 insertions(+), 45 deletions(-)

diff --git a/build.sh b/build.sh @@ -32,7 +32,7 @@ else fi echo "Assembling.." -./bin/assembler projects/software/noodle.usm bin/boot.rom +./bin/assembler projects/examples/gui.shapes.usm bin/boot.rom echo "Running.." if [ "${2}" = '--cli' ]; diff --git a/projects/examples/dev.screen.usm b/projects/examples/dev.screen.usm @@ -28,7 +28,7 @@ ( program ) -|0200 @RESET +|0200 ( theme ) #127f =System.r #34e7 =System.g #56c4 =System.b ( vectors ) ,on-mouse =Mouse.vector @@ -274,17 +274,22 @@ RTN RTN -@fill-rect ( x1 y1 x2 y2 color -- ) - - ( load ) =color =rect.y2 =rect.x2 DUP2 =Screen.y =rect.y1 DUP2 =Screen.x =rect.x1 +@fill-rect ( x1 y1 x2 y2 color ) + + =color + ( x1 x2 y1 y2 ) ROT2 SWP2 $ver - ~rect.x1 =Screen.x + ( save ) OVR2 =Screen.y + STH2 STH2 OVR2 OVR2 $hor + ( save ) OVR2 =Screen.x ( draw ) ~color =Screen.color - ( incr ) ~Screen.x ++ =Screen.x - ~Screen.x ~rect.x2 LTH2 ^$hor JNZ - ( incr ) ~Screen.y ++ =Screen.y - ~Screen.y ~rect.y2 LTH2 ^$ver JNZ + ( incr ) SWP2 #0001 ADD2 SWP2 + OVR2 OVR2 LTH2 ^$hor JNZ + POP2 POP2 STH2r STH2r + ( incr ) SWP2 #0001 ADD2 SWP2 + OVR2 OVR2 LTH2 ^$ver JNZ + POP2 POP2 POP2 POP2 RTN diff --git a/projects/examples/gui.shapes.usm b/projects/examples/gui.shapes.usm @@ -13,6 +13,7 @@ ;circle { xc 2 yc 2 x 2 y 2 r 2 d 2 } |0100 ;System { vector 2 pad 6 r 2 g 2 b 2 } +|0110 ;Console { vector 2 pad 6 char 1 byte 1 short 2 } |0120 ;Screen { vector 2 width 2 height 2 pad 2 x 2 y 2 addr 2 color 1 } ( program ) @@ -21,12 +22,12 @@ ( theme ) #13fd =System.r #1ef3 =System.g #1bf2 =System.b - #0010 #0020 #0040 #0060 #01 ,fill-rect JSR2 - #0020 #0030 #0050 #0070 #02 ,fill-rect JSR2 - #0030 #0040 #0060 #0080 #03 ,fill-rect JSR2 - #0070 #0020 #00a0 #0060 #01 ,line-rect JSR2 - #0080 #0030 #00b0 #0070 #02 ,line-rect JSR2 - #0090 #0040 #00c0 #0080 #03 ,line-rect JSR2 + #0010 #0020 #0040 #0060 #01 ,fill-rect-fast JSR2 + #0020 #0030 #0050 #0070 #02 ,fill-rect-fast JSR2 + #0030 #0040 #0060 #0080 #03 ,fill-rect-fast JSR2 + #0070 #0020 #00a0 #0060 #01 ,line-rect-slow JSR2 + #0080 #0030 #00b0 #0070 #02 ,line-rect-slow JSR2 + #0090 #0040 #00c0 #0080 #03 ,line-rect-slow JSR2 #0000 #0080 #0020 #0020 #21 ,pict_small ,draw-picture JSR2 #0010 #0088 #0020 #0020 #22 ,pict_small ,draw-picture JSR2 @@ -41,6 +42,15 @@ #0040 #0040 #0030 #01 ,draw-circle JSR2 #0070 #0030 #0040 #02 ,draw-circle JSR2 #0050 #0080 #0050 #03 ,draw-circle JSR2 + + ( benchmark ) + #0000 #0000 #0008 #000f #01 ,fill-rect-fast JSR2 + #0008 #0000 #0010 #000f #02 ,fill-rect-medium JSR2 + #0010 #0000 #0018 #000f #03 ,fill-rect-slow JSR2 + + ( #0000 #0010 #0008 #001f #01 ,line-rect-fast JSR2 ) + #0008 #0010 #000f #001f #02 ,line-rect-medium JSR2 + #0010 #0010 #0017 #001f #03 ,line-rect-slow JSR2 BRK @@ -70,7 +80,26 @@ BRK RTN -@line-rect ( x1 y1 x2 y2 color ) +@line-rect-medium ( x1 y1 x2 y2 color -- ) + + ( load ) =color DUP2 ++ STH2 =rect.y2 =rect.x2 DUP2 STH2 =rect.y1 =rect.x1 + STH2r STH2r + $ver + ( save ) OVR2 =Screen.y + ( draw ) ~rect.x1 =Screen.x ~color DUP =Screen.color ~rect.x2 =Screen.x =Screen.color + ( incr ) SWP2 ++ SWP2 + OVR2 OVR2 LTH2 ^$ver JNZ + POP2 POP2 + ~rect.x1 ++ ~rect.x2 -- + $hor + ( save ) OVR2 =Screen.x + ( draw ) ~rect.y1 =Screen.y ~color DUP =Screen.color ~rect.y2 =Screen.y =Screen.color + ( incr ) SWP2 ++ SWP2 + OVR2 OVR2 ++ LTH2 ^$hor JNZ + POP2 POP2 +RTN + +@line-rect-slow ( x1 y1 x2 y2 color -- ) ( load ) =color =rect.y2 =rect.x2 DUP2 =Screen.y =rect.y1 DUP2 =Screen.x =rect.x1 $hor @@ -87,7 +116,44 @@ RTN RTN -@fill-rect ( x1 y1 x2 y2 color ) +@fill-rect-fast ( x1 y1 x2 y2 color -- ) + + =color + ( x1 x2 y1 y2 ) ROT2 SWP2 + $ver + ( save ) OVR2 =Screen.y + STH2 STH2 OVR2 OVR2 + $hor + ( save ) OVR2 =Screen.x + ( draw ) ~color =Screen.color + ( incr ) SWP2 ++ SWP2 + OVR2 OVR2 LTH2 ^$hor JNZ + POP2 POP2 STH2r STH2r + ( incr ) SWP2 ++ SWP2 + OVR2 OVR2 LTH2 ^$ver JNZ + POP2 POP2 POP2 POP2 + +RTN + +@fill-rect-medium ( x1 y1 x2 y2 color -- ) + + ( load ) =color SWP2 =rect.x2 ROT2 =rect.x1 + $ver + ( save ) OVR2 =Screen.y + ~rect.x1 ~rect.x2 + $hor + ( save ) OVR2 =Screen.x + ( draw ) ~color =Screen.color + ( incr ) SWP2 ++ SWP2 + OVR2 OVR2 LTH2 ^$hor JNZ + POP2 POP2 + ( incr ) SWP2 ++ SWP2 + OVR2 OVR2 LTH2 ^$ver JNZ + POP2 POP2 + +RTN + +@fill-rect-slow ( x1 y1 x2 y2 color -- ) ( load ) =color =rect.y2 =rect.x2 DUP2 =Screen.y =rect.y1 DUP2 =Screen.x =rect.x1 $ver @@ -124,7 +190,7 @@ RTN ( draw ) ,$seg JSR2 $loop ( incr ) ~circle.x ++ =circle.x - ~circle.d #0000 #0001 ADD2 LTS2 ^$else JNZ + ~circle.d #0000 ++ LTS2 ^$else JNZ ( decr ) ~circle.y -- =circle.y ~circle.x ~circle.y SUB2 #0004 MUL2 ~circle.d ADD2 #000a ADD2 =circle.d ,$end JMP2 @@ -132,7 +198,7 @@ RTN ~circle.x #0004 MUL2 ~circle.d ADD2 #0006 ADD2 =circle.d $end ( draw ) ,$seg JSR2 - ~circle.y ~circle.x #0001 SUB2 GTS2 ^$loop JNZ + ~circle.y ~circle.x -- GTS2 ^$loop JNZ RTN $seg ~circle.xc ~circle.x ADD2 =Screen.x ~circle.yc ~circle.y ADD2 =Screen.y ~color =Screen.color diff --git a/projects/examples/gui.wallpaper.usm b/projects/examples/gui.wallpaper.usm @@ -11,7 +11,7 @@ |0170 ;File { vector 2 pad 6 name 2 length 2 load 2 save 2 } |01a0 ;DateTime { year 2 month 1 day 1 hour 1 minute 1 second 1 dotw 1 doty 2 isdst 1 refresh 1 } -|0200 @RESET +|0200 #90ff =System.r #9000 =System.g #900f =System.b #08e0 ~Screen.width #0001 SFT2 SUB2 =scroll.x #09b0 =scroll.y @@ -19,7 +19,7 @@ #30 =scroll.wait BRK -@frame +@frame ( -> ) #ffff $loop DUP2 ^row JSR diff --git a/projects/software/noodle.usm b/projects/software/noodle.usm @@ -534,45 +534,37 @@ RTN @patternize ( -- ) ~brush.patt #00 NEQ ^$noplain JNZ - #01 RTN - $noplain + #01 RTN $noplain ~brush.patt #01 NEQ ^$notone1 JNZ ~pt0.x #00 ~px.x ADD2 ~pt0.y #00 ~px.y ADD2 ADD2 #0001 AND2 #0000 EQU2 ~pt0.x #00 ~px.x ADD2 ~pt0.y #00 ~px.y ADD2 SUB2 #0001 AND2 #0000 EQU2 #0101 EQU2 - RTN - $notone1 + RTN $notone1 ~brush.patt #02 NEQ ^$notone2 JNZ ~pt0.x #00 ~px.x ADD2 ~pt0.y #00 ~px.y ADD2 ADD2 #0003 AND2 #0000 EQU2 ~pt0.x #00 ~px.x ADD2 ~pt0.y #00 ~px.y ADD2 SUB2 #0003 AND2 #0000 EQU2 #0101 EQU2 - RTN - $notone2 + RTN $notone2 ~brush.patt #03 NEQ ^$notone3 JNZ ~pt0.x #00 ~px.x ADD2 ~pt0.y #00 ~px.y ADD2 ADD2 #0005 AND2 #0000 EQU2 ~pt0.x #00 ~px.x ADD2 ~pt0.y #00 ~px.y ADD2 SUB2 #0005 AND2 #0000 EQU2 #0101 EQU2 - RTN - $notone3 + RTN $notone3 ~brush.patt #04 NEQ ^$notone4 JNZ - ~pt0.x #00 ~px.x ADD2 ~pt0.y #00 ~px.y ADD2 ADD2 #0003 AND2 #0000 EQU2 RTN - $notone4 + ~pt0.x #00 ~px.x ADD2 ~pt0.y #00 ~px.y ADD2 ADD2 #0003 AND2 #0000 EQU2 RTN $notone4 ~brush.patt #05 NEQ ^$notone5 JNZ - ~pt0.x #00 ~px.x ADD2 ~pt0.y #00 ~px.y ADD2 SUB2 #0003 AND2 #0000 EQU2 RTN - $notone5 + ~pt0.x #00 ~px.x ADD2 ~pt0.y #00 ~px.y ADD2 SUB2 #0003 AND2 #0000 EQU2 RTN $notone5 ~brush.patt #06 NEQ ^$notone6 JNZ - ~pt0.x #00 ~px.x ADD2 #0001 AND2 SWP POP RTN - $notone6 + ~pt0.x #00 ~px.x ADD2 #0001 AND2 SWP POP RTN $notone6 ~brush.patt #07 NEQ ^$notone7 JNZ - ~pt0.y #00 ~px.y ADD2 #0001 AND2 SWP POP RTN - $notone7 + ~pt0.y #00 ~px.y ADD2 #0001 AND2 SWP POP RTN $notone7 #00 @@ -842,17 +834,21 @@ RTN RTN -@fill-rect ( x1 y1 x2 y2 color -- ) +@fill-rect ( x1 y1 x2 y2 color ) - ( load ) =color =rect.y2 =rect.x2 DUP2 =Screen.y =rect.y1 DUP2 =Screen.x =rect.x1 + ( load ) =color SWP2 =rect.x2 ROT2 =rect.x1 $ver - ~rect.x1 =Screen.x + ( save ) OVR2 =Screen.y + ~rect.x1 ~rect.x2 $hor + ( save ) OVR2 =Screen.x ( draw ) ~color =Screen.color - ( incr ) ~Screen.x ++ =Screen.x - ~Screen.x ~rect.x2 NEQ2 ^$hor JNZ - ( incr ) ~Screen.y ++ =Screen.y - ~Screen.y ~rect.y2 NEQ2 ^$ver JNZ + ( incr ) SWP2 ++ SWP2 + OVR2 OVR2 LTH2 ^$hor JNZ + POP2 POP2 + ( incr ) SWP2 ++ SWP2 + OVR2 OVR2 LTH2 ^$ver JNZ + POP2 POP2 RTN