( Hey now, Hey now, Don't dream it's over ) |00 @System/vector $2 &expansion $2 &wst $1 &rst $1 &metadata $2 &r $2 &g $2 &b $2 &debug $1 &state $1 |10 @Console/vector $2 &read $5 &type $1 &write $1 &error $1 |20 @Screen/vector $2 &width $2 &height $2 &auto $1 &pad $1 &x $2 &y $2 &addr $2 &pixel $1 &sprite $1 |80 @Controller/vector $2 &button $1 &key $1 |90 @Mouse/vector $2 &x $2 &y $2 &state $4 &scrollx $2 &scrolly |a0 @File/vector $2 &success $1 &success-lb $1 &stat $2 &delete $1 &append $1 &name $2 &length $2 &read $2 &write $2 |000 @filestate/changed $1 @brush/tool $1 &size $1 &oper $2 &mode $1 &patt $1 &patt-fn $2 @pointer/x0 $2 &y0 $2 &x1 $2 &y1 $2 &drag $1 @guide/x $2 &y $2 &x2 $2 &y2 $2 @panel/rect &x $2 &y $2 &x2 $2 &y2 $2 @canvas/rect &x $2 &y $2 &x2 $2 &y2 $2 &size &w $1 &h $1 @window/cols $1 &rows $1 @filepath/buf $40 |100 @on-reset ( -> ) ( | meta ) ;meta #06 DEO2 ( | theme ) #f075 .System/r DEO2 #f0c8 .System/g DEO2 #f096 .System/b DEO2 ( | size thinkpad ) #02a8 .Screen/width DEO2 #0180 .Screen/height DEO2 .Screen/width DEI2 #03 SFT2 .window/cols STZ NIP .Screen/height DEI2 #03 SFT2 .window/rows STZ NIP theme/ ( | default brush ) #0000 DUP2 panel/ #04 brush/ #00 brush/ ( | initial position ) canvas/ panel/ ( | begin. ) filepath/ menu/ menu/ filestate/ canvas/ BRK @meta 00 "Noodle 0a ( details ) "A 20 "Drawing 20 "Program 0a ( author ) "By 20 "Hundred 20 "Rabbits 0a ( date ) "17 20 "Sep 20 "2025 00 01 ( icon ) 83 =appicon ( @|vectors ) @ ( -- ) filepath/ ;Mouse/state DEO ;on-button .Controller/vector DEO2 ;on-mouse .Mouse/vector DEO2 JMP2r @on-mouse ( -> ) .Mouse/y DEI2 #000c LTH2 ?menu/ ( | test area ) .Mouse/x DEI2 .Mouse/y DEI2 ( | handlers ) OVR2 OVR2 .panel/rect within-rect ?panel/capture OVR2 OVR2 .canvas/rect within-rect ?canvas/capture POP2 POP2 ( | Continue .. ) cursor/ ( | when drag&release ) ;pointer/drag LDZ EQU ?{ .Mouse/state DEI ?{ ;pointer/drag STZ BRK } } ( | route touch ) .Mouse/x DEI2 .Mouse/y DEI2 ;pointer/drag LDZ NEQ ;Mouse/state DEI NEQ AND ?on-drag POP2 POP2 BRK @on-drag ( x* y* -> ) .pointer/drag LDZ #08 ADD LDZ2 JMP2 @on-mouse-release ( -> ) cursor/ zoom/ POP2 POP2 ;on-mouse .Mouse/vector DEO2 BRK @on-button ( -> ) .Controller/button DEI2 find-modkey ORAk #00 EQU ?{ DUP2 JSR2 } POP2 BRK ( @|Filepath ) @filepath/on-console ( -> ) [ LIT2 04 -Console/type ] DEI NEQ ?{ / BRK } .Console/read DEI / BRK @filepath/ ( -- ) .Console/type DEI ?{ canvas/ !filepath/ } ;&on-console .Console/vector DEO2 JMP2r @filepath/ ( -- ) / ;&untitled-txt / canvas/ .canvas/size LDZ2 / / filestate/ canvas/ !panel/ &untitled-txt "untitled00x00.icn $1 @filepath/ ( -- ) canvas/ filestate/ / /get-size !canvas/ @filepath/ ( -- ) /is-tga ?tga/ ;&buf .File/name DEO2 #fff0 ;canvas/buf SUB2 .File/length DEO2 ;canvas/buf .File/read DEO2 JMP2r @filepath/ ( -- ) ;&buf .File/name DEO2 canvas/get-length .File/length DEO2 ;canvas/buf .File/write DEO2 !filestate/ @filepath/ ( -- ) #00d8 .Screen/x DEO2 #0004 .Screen/y DEO2 [ LIT2 01 -Screen/auto ] DEO #08 ;font/color STA LIT "- font/ LIT 20 font/ ;&buf font/draw-str POP2 JMP2r @filepath/is-tga ( -- ) [ LIT2 00 _&ptr ] LDR #0004 SUB2 LDA2k [ LIT2 ".t ] NEQ2 ?{ INC2 INC2 LDA2k [ LIT2 "ga ] NEQ2 ?{ POP2 #01 JMP2r } } POP2 #00 JMP2r @filepath/ ( str* -- ) [ LIT2 -&buf _&ptr ] STR ( >> ) @filepath/ ( str* -- ) &>w LDAk DUP ?{ POP POP2 JMP2r } / INC2 !&>w @filepath/ ( -- ) ,&ptr LDR #04 SUB ,&ptr STR JMP2r @filepath/ ( c -- ) [ LIT2 00 &ptr -&buf ] INCk ,&ptr STR STZ2 JMP2r @filepath/ ( w h -- ) ( h ) hex/chr2 ,&ptr LDR #06 SUB STZ2 ( w ) hex/chr2 ,&ptr LDR #09 SUB STZ2 !/ @filepath/get-size ( -- w h ) [ LIT2 "x _&ptr ] LDR #07 SUB LDZ NEQ ?{ ( w ) ,&ptr LDR #09 SUB LDZ2 chr2/byte ( h ) ,&ptr LDR #06 SUB LDZ2 !chr2/byte } #2020 JMP2r @filestate/ ( -- ) [ LIT2 0f -&changed ] STZ !/ @filestate/ ( -- ) ;&changed STZ ( >> ) @filestate/ ( -- ) [ LIT2 01 -Screen/auto ] DEO #0006 .Screen/x DEO2 #0004 .Screen/y DEO2 ;state-icn .Screen/addr DEO2 .&changed LDZ .Screen/sprite DEO JMP2r ( @|Panel ) @panel/capture ( x* y* -> ) cursor/ ;&on-mouse .Mouse/vector DEO2 POP2 POP2 BRK @panel/on-mouse ( -> ) cursor/ .Mouse/x DEI2 .Mouse/y DEI2 ( | handlers ) OVR2 OVR2 .&rect within-rect ?{ !on-mouse-release } .Mouse/state DEI ?{ POP2 POP2 BRK } .&y LDZ2 INC2 INC2 INC2 SUB2 #000a DIV2 NIP STH .&x LDZ2 SUB2 #000a DIV2 NIP STHr ( | within x ) OVR #02 LTH ?{ POP2 BRK } ( | within y ) DUP #03 EQU ?&start-drag DUP #08 EQU ?&start-drag ( | release when not drag ) ;Mouse/state DEO DUP #03 LTH ?&tool DUP #03 GTH OVR #08 LTH AND ?&patt DUP #07 GTH OVR #0d LTH AND ?&size BRK &tool DUP ADD ADD brush/ BRK &patt #04 SUB DUP ADD ADD brush/ BRK &size #09 SUB DUP ADD ADD brush/ BRK @panel/on-drag ( -> ) .Mouse/state DEI ?{ ( | release ) ;&on-mouse .Mouse/vector DEO2 / / BRK } ( | drag ) / ( x ) .Mouse/x DEI2 [ LIT2 &offx $2 ] SUB2 ( y ) .Mouse/y DEI2 [ LIT2 &offy $2 ] SUB2 / / BRK @panel/start-drag ( x y -> ) POP2 cursor/ / canvas/ canvas/ .Mouse/x DEI2 .&x LDZ2 SUB2 ,&offx STR2 .Mouse/y DEI2 .&y LDZ2 SUB2 ,&offy STR2 ;&on-drag .Mouse/vector DEO2 BRK @panel/ ( -- ) .canvas/x LDZ2 #0019 SUB2 .canvas/y LDZ2 ( >> ) @panel/ ( x* y* -- ) DUP2 #8000 GTH2 ?&invalid OVR2 #8000 GTH2 ?&invalid ( miny ) #0010 GTH2k [ JMP SWP2 POP2 ] ( maxy ) .Screen/height DEI2 #008c SUB2 LTH2k [ JMP SWP2 POP2 ] DUP2 .&y STZ2 #0088 ADD2 .&y2 STZ2 ( minx ) #0004 GTH2k [ JMP SWP2 POP2 ] ( maxx ) .Screen/width DEI2 #001c SUB2 LTH2k [ JMP SWP2 POP2 ] DUP2 .&x STZ2 #0018 ADD2 .&x2 STZ2 JMP2r &invalid ( x* y* -- ) POP2 POP2 JMP2r @panel/ ( -- ) .&x LDZ2 .Screen/x DEO2 .&y LDZ2 .Screen/y DEO2 #ef22 ;fill-icn [ LIT2 40 -Screen/sprite ] ! @panel/ ( -- ) .&x LDZ2 .Screen/x DEO2 .&y LDZ2 .Screen/y DEO2 #ef22 ;hash-icn [ LIT2 43 -Screen/sprite ] ! @panel/ ( -- ) .&x LDZ2 .Screen/x DEO2 .&y LDZ2 .Screen/y DEO2 #ef22 ;fill-icn [ LIT2 00 -Screen/sprite ] ! @panel/ ( -- ) / / .&x LDZ2 INC2 .&x2 LDZ2 .&y LDZ2 #0026 ADD2 #02 / / .&x LDZ2 INC2 .&x2 LDZ2 .&y LDZ2 #0058 ADD2 #02 / !/ @panel/ ( -- ) ;tool-icns .Screen/addr DEO2 [ LIT2 06 -brush/tool ] LDZ .&x LDZ2 #0004 ADD2 .&y LDZ2 #0005 ADD2 !/ @panel/ ( -- ) ;patt-icns .Screen/addr DEO2 [ LIT2 08 -brush/patt ] LDZ .&x LDZ2 #0004 ADD2 .&y LDZ2 #002d ADD2 !/ @panel/ ( -- ) ;brush/mode LDZ #60 SFT ;size-icns ADD2 .Screen/addr DEO2 [ LIT2 08 -brush/size ] LDZ .&x LDZ2 #0004 ADD2 .&y LDZ2 #005f ADD2 !/ @panel/ ( x0* x1* y* color -- ) STH [ LITr -Screen/pixel ] .Screen/y DEO2 SWP2 &>ld DUP2 .Screen/x DEO2 DEOkr INC2 INC2 GTH2k ?&>ld POP2 POP2 POP2r JMP2r @panel/ ( length selection x* y* -- ) [ LIT2 04 -Screen/auto ] DEO ,&anchor-y STR2 ,&anchor-x STR2 STH #00 &>l #00 OVR #01 AND #09 MUL [ LIT2 &anchor-x $2 ] ADD2 .Screen/x DEO2 #00 OVR #01 SFT #0a MUL [ LIT2 &anchor-y $2 ] ADD2 .Screen/y DEO2 #01 OVR STHkr EQU DUP ADD ADD .Screen/sprite DEO INC GTHk ?&>l POP2 POPr JMP2r ( @|Canvas ) %abs2 ( a* -- res* ) { DUP2k #1f SFT2 MUL2 SUB2 } %lts2 ( a* b* -- f ) { SUB2 POP #07 SFT } %gts2 ( a* b* -- f ) { SWP2 lts2 } %gts2k ( a* b* -- f ) { SWP2k SUB2 POP #07 SFT } %canvas/offset-pos ( x* y* -- x* y* ) { .canvas/y LDZ2 ADD2 SWP2 .canvas/x LDZ2 ADD2 SWP2 } % ( -- ) { .Screen/y DEI2k #0008 ADD2 ROT DEO2 } @canvas/capture ( x* y* -> ) cursor/ ;&on-mouse .Mouse/vector DEO2 POP2 POP2 BRK @canvas/on-mouse ( -> ) cursor/ .Mouse/x DEI2 .Mouse/y DEI2 ( | handlers ) OVR2 OVR2 .panel/rect within-rect ?on-mouse-release OVR2 OVR2 .&rect within-rect ?{ !on-mouse-release } .&y LDZ2 SUB2 SWP2 .&x LDZ2 SUB2 SWP2 brush/get-tool JMP2 @canvas/ ( -- ) .window/cols LDZ .window/rows LDZ #02 SUB !/ @canvas/ ( -- ) .&x LDZ2 #0000 NEQ2 .&y LDZ2 #0010 NEQ2 ORA ?{ JMP2r } ( | is not covered ) #0010 .Screen/y DEO2 [ LIT2 01 -Screen/auto ] DEO #0000 ;window/cols LDZ SUB ;window/rows LDZ SUB ;hash2-icn [ LIT2 0b -Screen/sprite ] ! @canvas/ ( w h -- ) ( clamp x ) SWP .window/cols LDZ LTHk [ JMP SWP ] POP SWP ( clamp y ) .window/rows LDZ #02 SUB LTHk [ JMP SWP ] POP ( change name ) DUP2 filepath/ .&h STZ .&w STZ / ( | center ) .Screen/width DEI2 #01 SFT2 ;&w LDZ STH2k #20 SFT2 SUB2 DUP2 STH2r #30 SFT2 ADD2 .&x2 STZ2 .&x STZ2 .Screen/height DEI2 #01 SFT2 ;&h LDZ STH2k #20 SFT2 SUB2 #0008 ADD2 DUP2 STH2r #30 SFT2 ADD2 .&y2 STZ2 .&y STZ2 / / panel/ !panel/ @canvas/ ( -- ) [ LIT2 01 -Screen/auto ] DEO .Screen/width DEI2 #0030 SUB2 .Screen/x DEO2 #0004 .Screen/y DEO2 #0b ;font/color STA .&size LDZ2 !font/ @canvas/get-length ( -- length* ) ;&w LDZ ;&h LDZ MUL2 #30 SFT2 JMP2r @canvas/within ( x* y* -- x* y* flag ) ( clamp ) DUP2 #03 SFT2 NIP .&h LDZ #01 SUB GTH ?{ ( clamp ) OVR2 #03 SFT2 NIP .&w LDZ #01 SUB GTH ?{ #01 JMP2r } } #00 JMP2r @canvas/get-row ( x* y* -- row* ) STH2k #03 SFT2 SWP2 #03 SFT2 SWP2 ;&w LDZ MUL2 ADD2 #30 SFT2 STH2r #0007 AND2 ADD2 ;&buf ADD2 JMP2r @canvas/get-row-icn ( x y -- row* ) #0000 ROT SWP2 SWP SWP2 ;&w LDZ MUL2 ADD2 #30 SFT2 ;&buf ADD2 JMP2r @canvas/ ( -- ) ;&buf /get-length !mem/ @canvas/invert ( -- ) ;&buf STH2k /get-length ADD2 STH2r &>l ( load ) STH2k LDAk #ff EOR ( save ) STH2r STA INC2 GTH2k ?&>l POP2 POP2 / !panel/ @canvas/get-pixel ( x* y* -- b ) /within ?{ POP2 POP2 #02 JMP2r } OVR2 NIP #07 AND STH /get-row LDA ( flag ) #07 STHr SUB SFT #01 AND JMP2r @canvas/ ( x* y* color -- ) ?/add-pixel !/remove-pixel @canvas/add-pixel ( x* y* -- ) /within ?{ POP2 POP2 JMP2r } OVR2 OVR2 / OVR2 NIP #07 AND STH /get-row LDAk ( mask ) #0107 STHr SUB #40 SFT SFT ORA ( save ) ROT ROT STA JMP2r @canvas/remove-pixel ( x* y* -- ) /within ?{ POP2 POP2 JMP2r } OVR2 OVR2 / OVR2 NIP #07 AND STH /get-row LDAk ( mask ) #0107 STHr SUB #40 SFT SFT #ff EOR AND ( save ) ROT ROT STA JMP2r @canvas/clean-pixel ( x* y* -- ) OVR2 OVR2 #0001 SUB2 /get-pixel STH OVR2 INC2 OVR2 /get-pixel DUP ADD STH ADDr OVR2 OVR2 INC2 /get-pixel #20 SFT STH ADDr OVR2 #0001 SUB2 OVR2 /get-pixel #30 SFT STH ADDr STHr DUP #03 EQU ?&remove DUP #06 EQU ?&remove DUP #09 EQU ?&remove DUP #0c EQU ?&remove POP POP2 POP2 JMP2r &remove POP !/remove-pixel @canvas/ ( -- ) .&size LDZ2 ORA ?{ JMP2r } [ LIT2 05 -Screen/auto ] DEO .&y LDZ2 .Screen/y DEO2 .&x LDZ2 ;&w LDZ SUB ;&h LDZ SUB ;&buf [ LIT2 01 -Screen/sprite ] ! @canvas/ ( x h -- ) DUP2 canvas/get-row-icn .Screen/addr DEO2 #00 SWP #30 SFT2 .canvas/y LDZ2 ADD2 .Screen/y DEO2 #00 SWP #30 SFT2 .canvas/x LDZ2 ADD2 .Screen/x DEO2 [ LIT2 01 -Screen/sprite ] DEO JMP2r @canvas/find ( xy* -- xy* t ) STH2 ,&ptr LDR2 ;&stack EQU2k ?{ &>lf LDA2k STH2kr NEQ2 ?{ POP2 POP2 STH2r #01 JMP2r } INC2 INC2 GTH2k ?&>lf } POP2 POP2 STH2r #00 JMP2r @canvas/ ( x* y* -- ) #03 SFT2 NIP STH #03 SFT2 NIP STHr /find ?{ DUP2 / } POP2 JMP2r @canvas/ ( xy* -- ) [ LIT2 &ptr =&stack ] INC2k INC2 ( | overflow ) DUP2 ;&cap LTH2 ?{ POP2 POP2 POP2 ;&stack ,&ptr STR2 ;canvas/on-frame-full .Screen/vector DEO2 JMP2r } ( | push ) ,&ptr STR2 STA2 ;canvas/on-frame .Screen/vector DEO2 JMP2r @canvas/on-frame ( -> ) ,&ptr LDR2 ;&stack &>lo LDA2k / INC2 INC2 GTH2k ?&>lo POP2 POP2 ;&stack ,&ptr STR2 #0000 .Screen/vector DEO2 BRK @canvas/on-frame-full ( -> ) / ;&stack ,&ptr STR2 #0000 .Screen/vector DEO2 BRK @canvas/drag-u ( -- ) ( move ) ;&buf ;&w LDZ #30 SFT2 STH2k ADD2 ;&buf /get-length mem/ ( clear ) ;&buf /get-length STH2kr SUB2 ADD2 STH2r mem/ / !panel/ @canvas/drag-d ( -- ) ( move ) ;&buf ;&buf ;&w LDZ #30 SFT2 STH2k ADD2 /get-length mem/ ( clear ) ;&buf STH2r mem/ / !panel/ @canvas/drag-l ( -- ) ;&w LDZ #30 SFT2 STH2 ;&buf /get-length ADD2 ;&buf &>ldl ( move ) DUP2 #0008 ADD2 OVR2 STH2kr #0008 SUB2 mem/ ( clear ) DUP2 STH2kr ADD2 #0008 SUB2 #0008 mem/ STH2kr ADD2 GTH2k ?&>ldl POP2 POP2 POP2r / !panel/ @canvas/drag-r ( -- ) ;&w LDZ #30 SFT2 STH2 ;&buf /get-length ADD2 ;&buf &>ldr ( move ) DUP2 OVR2 #0008 ADD2 STH2kr #0008 SUB2 mem/ ( clear ) DUP2 #0008 mem/ STH2kr ADD2 GTH2k ?&>ldr POP2 POP2 POP2r / !panel/ @canvas/crop-h ( -- ) .&size LDZ2 #01 SUB !/ @canvas/size-h ( -- ) .&size LDZ2 INC !/ @canvas/crop-w ( -- ) [ LIT2r =&buf ] ;&buf /get-length ADD2 ;&buf &>lsl DUP2 STH2r ;&w LDZ #01 SUB #30 SFT2 ADD2k STH2 mem/ ;&w LDZ #30 SFT2 ADD2 GTH2k ?&>lsl POP2 POP2 POP2r ( update ) .&size LDZ2 #0100 SUB2 !/ @canvas/size-w ( -- ) [ LIT2r =&buf ] ;&buf /get-length ADD2 ;&buf &>lsr DUP2 STH2r ;&w LDZ INC #30 SFT2 ADD2k STH2 mem/ ;&w LDZ #30 SFT2 ADD2 GTH2k ?&>lsr POP2 POP2 POP2r ( update ) .&size LDZ2 #0100 ADD2 !/ ( @|Font ) @font/get-width ( str* -- width* ) str/len #30 SFT2 JMP2r @font/draw-str-right ( text* -- text* ) DUP2 font/get-width STH2 .Screen/x DEI2k STH2r SUB2 ROT DEO2 ( >> ) @font/draw-str ( str* -- str* ) [ LIT2 01 -Screen/auto ] DEO &>w LDAk DUP ?{ POP INC2 JMP2r } / INC2 !&>w @font/ ( w h -- ) SWP font/ [ LIT "x ] font/ ( >> ) @font/ ( byte -- ) DUP #04 SFT / ( >> ) @font/ ( char -- ) hex/chr ( >> ) @font/ ( char -- ) #20 SUB #00 SWP #30 SFT2 ;&spritesheet ADD2 .Screen/addr DEO2 [ LIT2 &color 03 -Screen/sprite ] DEO JMP2r @cursor/ ( -- ) ;Screen/auto DEO #40 ;fill-icn !/ @cursor/ ( -- ) / ;Screen/auto DEO #45 ;pointers-icns .Mouse/x DEI2 ,&x STR2 .Mouse/y DEI2 ,&y STR2 ( >> ) @cursor/ ( color addr* -- ) .Screen/addr DEO2 [ LIT2 &x $2 ] .Screen/x DEO2 [ LIT2 &y $2 ] .Screen/y DEO2 .Screen/sprite DEO JMP2r @zoom/ ( -- ) [ LIT &clean $1 ] ?{ [ LIT2 01 _&clean ] STR [ LIT2 &x $2 ] .Screen/x DEO2 [ LIT2 &y $2 ] .Screen/y DEO2 #f782 ;fill-icn [ LIT2 40 -Screen/sprite ] ! } JMP2r @zoom/ ( x* y* -- ) / .Mouse/x DEI2 #0020 SUB2 DUP2 ,&x STR2 DUP2 ,&anchor STR2 .Screen/x DEO2 .Mouse/y DEI2 #0020 SUB2 DUP2 ,&y STR2 .Screen/y DEO2 #0004 SUB2 ,&offy STR2 #0004 SUB2 ,&offx STR2 ;fill-icn .Screen/addr DEO2 [ LIT2 01 -Screen/auto ] DEO #0900 &>ver STHk #0900 &>hor ( x ) #00 OVR [ LIT2 &offx $2 ] ADD2 ( y ) #00 STHkr [ LIT2 &offy $2 ] ADD2 canvas/get-pixel #01 AND ( draw ) INC INC #40 ORA .Screen/sprite DEO INC GTHk ?&>hor POP2 POPr [ LIT2 &anchor $2 ] .Screen/x DEO2 INC GTHk ?&>ver POP2 #00 ;&clean STA JMP2r ( @|Misc ) @all/ ( -- ) menu/ canvas/ canvas/ canvas/ cursor/ filepath/ canvas/ filestate/ !panel/ @line/ ( x1* y1* x* y* fn* -- ) ;&fn STA2 ;&y2 STA2 ;&x2 STA2 STH2 STH2 ( | x ) [ LIT2 ADD2r SUB2r ] ,&x2 LDR2 STH2kr SUB2k abs2 ,&dx STR2 gts2 [ JMP SWP POP ] ,&sx STR SWP2r ( | y ) [ LIT2 ADD2r SUB2r ] ,&y2 LDR2 STH2kr SUB2k abs2 #0000 SWP2 SUB2 ,&dy STR2 gts2 [ JMP SWP POP ] ,&sy STR ,&dx LDR2 ,&dy LDR2 ADD2 &>w ( apply ) OVR2r STH2r STH2kr [ LIT2 &fn $2 ] JSR2 ( y ) STH2kr [ LIT2 &y2 $2 ] NEQ2 ?{ ( x ) OVR2r STH2r [ LIT2 &x2 $2 ] NEQ2 ?{ ( stop ) POP2 POP2r POP2r JMP2r } } ( e .. e2 ) DUP2k ADD2 DUP2 ( y ) [ LIT2 &dy $2 ] lts2 ?{ ( e+dy ) SWP2 ,&dy LDR2 ADD2 SWP2 ( x1+sx ) SWP2r [ LIT2r 0001 ] [ &sx $1 ] SWP2r } ( x ) [ LIT2 &dx $2 ] gts2 ?{ ( e+dx ) ,&dx LDR2 ADD2 ( y1+sy ) [ LIT2r 0001 ] [ &sy $1 ] } !&>w @within-rect ( x* y* rect -- flag ) STH ( y LTH rect.y1 ) DUP2 STHkr INC INC LDZ2 lts2 ?&skip ( y GTH rect.y2 ) INC2k STHkr #06 ADD LDZ2 gts2 ?&skip SWP2 ( x LTH rect.x1 ) DUP2 STHkr LDZ2 lts2 ?&skip ( x GTH rect.x2 ) INC2k STHkr #04 ADD LDZ2 gts2 ?&skip POP2 POP2 POPr #01 JMP2r &skip POP2 POP2 POPr #00 JMP2r @ ( x* -cols -rows addr* action* -- ) STH2 .Screen/addr DEO2 &>t OVR2 .Screen/x DEO2 OVR &>t2 DEOkr INC DUP ?&>t2 POP INC DUP ?&>t POP2 POP2 POP2r JMP2r @ ( -cols auto addr* action* -- ) STH2 .Screen/addr DEO2 .Screen/auto DEO &>t DEOkr INC DUP ?&>t POP POP2r JMP2r ( @|Brush ) @brush/ ( -- ) .pointer/y1 LDZ2 .pointer/y0 LDZ2 GTH2k [ JMP SWP2 ] &>ver STH2k .pointer/x1 LDZ2 .pointer/x0 LDZ2 GTH2k [ JMP SWP2 ] &>hor DUP2 STH2kr / INC2 gts2k ?&>hor POP2 POP2 POP2r INC2 gts2k ?&>ver POP2 POP2 canvas/ !panel/ %brush/outside ( x y -- t ) { #00 SWP ;brush/size LDZ #30 SFT2 ;size-icns ADD2 ADD2 LDA #ff EOR SWP SFT #01 AND } @brush/ ( x* y* -- ) #0003 SUB2 ,&y STR2 #0004 SUB2 ,&x STR2 #0800 &>verd STHk #0800 &>hord DUP STHkr brush/outside ?{ ( x ) #00 OVR [ LIT2 &x $2 ] ADD2 ( y ) #00 STHkr [ LIT2 &y $2 ] ADD2 / } INC GTHk ?&>hord POP2 POPr INC GTHk ?&>verd POP2 JMP2r @brush/ ( x* y* -- ) STH2 STH2 .&size LDZ #00 &>verm .&size LDZ #00 &>horm OVR2 NIP OVR SWP #00 SWP ROT #00 SWP STH2kr SWP2r STH2kr SWP2r ROT2 ADD2 ROT2 ROT2 ADD2 SWP2 ( skip blanks ) OVR2 OVR2 canvas/get-pixel #00 EQU ?&blank OVR2 OVR2 canvas/clean-pixel OVR2 OVR2 canvas/ &blank POP2 POP2 INC GTHk ?&>horm POP2 INC GTHk ?&>verm POP2 POP2r POP2r JMP2r @brush/ ( x* y* -- ) ROTk ROT POP .&patt-fn LDZ2 JSR2 ?{ POP2 POP2 JMP2r } .&oper LDZ2 JMP2 @brush/get-tool ( -- ptr* ) / ( touch ) ;Mouse/state DEI #00 NEQ DUP ADD ( changed ) [ LIT2 00 &last $1 ] NEQ ADD DUP ADD ( lut ) .&tool LDZ #30 SFT ADD ;&tools-lut ADD2 LDA2 ( record ) .Mouse/state DEI ,&last STR JMP2r @brush/ ( -- ) .&mode LDZ ?{ [ LIT2 01 -Mouse/state ] DEI LTH ?{ ;canvas/add-pixel .&oper STZ2 JMP2r } } ;canvas/remove-pixel .&oper STZ2 JMP2r @brush/ ( tool -- ) .&tool STZ !panel/ & #00 !/ & #01 !/ & #02 !/ & #03 !/ & #04 !/ & #05 !/ @brush/ ( patt -- ) #07 AND ( set fn ) #00 OVR DUP ADD ;patternize/lut ADD2 LDA2 .&patt-fn STZ2 .&patt STZ ( | select brush ) .&tool LDZ ?{ #01 / } !panel/ & #00 !/ & #01 !/ & #02 !/ & #03 !/ & #04 !/ & #05 !/ & #06 !/ & #07 !/ @brush/ ( -- ) .&size LDZ #01 SUB !/ @brush/ ( -- ) .&size LDZ INC ( >> ) @brush/ ( size -- ) #07 AND ( | toggle mode on reselection ) DUP .&size LDZ NEQ ?{ .&mode LDZk #00 EQU SWP STZ } .&size STZ ( | select brush ) .&tool LDZ ?{ #01 / } !panel/ @brush/ ( -- ) .&mode LDZk #00 EQU SWP STZ !panel/ @brush/tools-lut [ =pencil/hover =pencil/up =pencil/down =pencil/drag =marker/hover =marker/up =marker/down =marker/drag =stroke/hover =stroke/up =stroke/down =stroke/drag =magic/hover =magic/up =magic/down =magic/drag =box/hover =box/up =box/down =box/drag =magnify/hover =magnify/up =magnify/down =magnify/drag ] @patternize/full ( x y -- c ) POP2 #01 JMP2r @patternize/a ( x y -- c ) ADD #01 AND #00 EQU JMP2r @patternize/b ( x y -- c ) #0303 AND2 ADDk STH #0202 ADD2 #0303 AND2 ADD #00 EQU STHr #00 EQU ORA JMP2r @patternize/c ( x y -- c ) #0707 AND2 ADDk STH #0404 ADD2 #0707 AND2 ADD #00 EQU STHr #00 EQU ORA JMP2r @patternize/diag-r ( x y -- c ) SUB #03 AND #00 EQU JMP2r @patternize/diag-l ( x y -- c ) ADD #03 AND #00 EQU JMP2r @patternize/ver ( x y -- c ) NIP #01 AND JMP2r @patternize/hor ( x y -- c ) POP #01 AND JMP2r @patternize/lut [ =&full =&a =&b =&c =&diag-r =&diag-l =&ver =&hor ] @guide/ ( -- ) .&x LDZ2 .&y LDZ2 .&x2 LDZ2 .&y2 LDZ2 ;&do-draw !line/ @guide/ ( -- ) .&x LDZ2 .&y LDZ2 .&x2 LDZ2 .&y2 LDZ2 ;&do-clear !line/ @guide/do-draw ( x* y* -- ) .Screen/y DEO2 .Screen/x DEO2 [ LIT2 42 -Screen/pixel ] DEO JMP2r @guide/do-clear ( x* y* -- ) .Screen/y DEO2 .Screen/x DEO2 [ LIT2 40 -Screen/pixel ] DEO JMP2r @guide/ ( -- ) #40 !guide/ @guide/ ( -- ) #42 ( >> ) @guide/ ( color -- ) STH [ LITr -Screen/pixel ] ( | hor ) .&x2 LDZ2 .&x LDZ2 GTH2k [ JMP SWP2 ] &>hor DUP2 .Screen/x DEO2 .&y LDZ2 .Screen/y DEO2 DEOkr .&y2 LDZ2 .Screen/y DEO2 DEOkr INC2 GTH2k ?&>hor POP2 POP2 ( | ver ) .&y2 LDZ2 INC2 .&y LDZ2 GTH2k [ JMP SWP2 ] &>ver DUP2 .Screen/y DEO2 .&x LDZ2 .Screen/x DEO2 DEOkr .&x2 LDZ2 .Screen/x DEO2 DEOkr INC2 GTH2k ?&>ver POP2 POP2 POP2r JMP2r ( @|Tools ) @pencil/down ( x* y* -> ) SWP2k .pointer/x0 STZ2 .pointer/y0 STZ2 OVR2 OVR2 .brush/oper LDZ2 JSR2 ( >> ) @pencil/up ( x* y* -> ) canvas/ filestate/ BRK @pencil/drag ( x* y* -> ) OVR2 OVR2 STH2 STH2 .pointer/x0 LDZ2 .pointer/y0 LDZ2 STH2r STH2r .brush/oper LDZ2 line/ .pointer/y0 STZ2 .pointer/x0 STZ2 BRK @pencil/hover ( x* y* -> ) POP2 POP2 BRK @marker/down ( x* y* -> ) SWP2k .pointer/x0 STZ2 .pointer/y0 STZ2 OVR2 OVR2 brush/ ( >> ) @marker/up ( x* y* -> ) canvas/ filestate/ BRK @marker/drag ( x* y* -> ) OVR2 OVR2 STH2 STH2 .pointer/x0 LDZ2 .pointer/y0 LDZ2 STH2r STH2r ;brush/ line/ .pointer/y0 STZ2 .pointer/x0 STZ2 BRK @marker/hover ( x* y* -> ) POP2 POP2 BRK @stroke/down ( x* y* -> ) cursor/ guide/ .pointer/y0 STZ2 .pointer/x0 STZ2 BRK @stroke/up ( x* y* -> ) cursor/ guide/ .pointer/y1 STZ2 .pointer/x1 STZ2 .pointer/x0 LDZ2 .pointer/y0 LDZ2 .pointer/x1 LDZ2 .pointer/y1 LDZ2 ;brush/ line/ filestate/ BRK @stroke/drag ( x* y* -> ) cursor/ guide/ .pointer/y1 STZ2 .pointer/x1 STZ2 .pointer/x0 LDZ2 .pointer/y0 LDZ2 canvas/offset-pos .guide/y STZ2 .guide/x STZ2 .pointer/x1 LDZ2 .pointer/y1 LDZ2 canvas/offset-pos .guide/y2 STZ2 .guide/x2 STZ2 guide/ BRK @stroke/hover ( x* y* -> ) POP2 POP2 BRK @magic/up ( x* y* -> ) filestate/ ( >> ) @magic/down ( x* y* -> ) ( >> ) @magic/drag ( x* y* -> ) #0003 SUB2 SWP2 #0003 SUB2 SWP2 brush/ BRK @magic/hover ( x* y* -> ) POP2 POP2 BRK @box/down ( x* y* -> ) cursor/ guide/ .pointer/y0 STZ2 .pointer/x0 STZ2 BRK @box/up ( x* y* -> ) cursor/ guide/ .pointer/y1 STZ2 .pointer/x1 STZ2 brush/ filestate/ BRK @box/drag ( x* y* -> ) cursor/ guide/ .pointer/y1 STZ2 .pointer/x1 STZ2 .pointer/x0 LDZ2 .pointer/y0 LDZ2 canvas/offset-pos .guide/y STZ2 .guide/x STZ2 .pointer/x1 LDZ2 .pointer/y1 LDZ2 canvas/offset-pos .guide/y2 STZ2 .guide/x2 STZ2 guide/ BRK @box/hover ( x* y* -> ) POP2 POP2 BRK @magnify/down ( x* y* -> ) .Mouse/state DEI #02 LTH canvas/ BRK @magnify/up ( x* y* -> ) ( >> ) @magnify/drag ( x* y* -> ) ( >> ) @magnify/hover ( x* y* -> ) zoom/ #45 ;pointers-icns cursor/ BRK ( @|tga ) @tga/ ( -- ) ;filepath/buf .File/name DEO2 #0012 .File/length DEO2 ;image .File/read DEO2 ( | rename ) filepath/ ;&icn-ext filepath/ ( | flip endianness ) ;image/w LDA2k SWP SWP2 STA2 ;image/h LDA2k SWP SWP2 STA2 ( | resize canvas ) ;image/w LDA2 #03 SFT2 NIP ;image/h LDA2 #03 SFT2 NIP canvas/ ( | get parser ) ;image/image-type LDA #03 NEQ ?{ !tga/ } ;&error-unknown-txt str/ [ #00 ;image/image-type LDA DUP ADD ] ;image-types ADD2 LDA2 str/ #0a18 DEO JMP2r &error-unknown-txt "Unsupported 20 "tga-type: 20 $1 @tga/ ( -- ) #00 ;image/depth LDA #03 SFT .File/length DEO2 #0000 #0000 &>stream ;&pixel .File/read DEO2 .File/success-lb ] DEI ?{ POP2 POP2 JMP2r } OVR2 OVR2 ROTk ROT POP ( | draw ) [ LIT2 00 _&pixel ] LDR #16 SFT ;&bw-lut ADD2 LDA2 JSR2 canvas/ SWP2 INC2 DUP2 ;image/w LDA2 NEQ2 ?{ ( linebreak ) POP2 #0000 SWP2 INC2 SWP2 } SWP2 !&>stream &pixel $8 &icn-ext "00x00.icn 00 &bw-lut [ =&shade-a =patternize/a =patternize/b =&shade-d ] @tga/shade-a ( -- pixel ) POP2 #01 JMP2r @tga/shade-d ( -- pixel ) POP2 #00 JMP2r @image-types-txts &null "no-data $1 &rawc "RAW-color $1 &rawt "RAW-true $1 &rawbw "RAW-bw $1 &rlec "RLE-color $1 &rlet "RLE-true $1 &rlebw "RLE-bw $1 &err "err $1 @image-types [ =image-types-txts/null =image-types-txts/rawc =image-types-txts/rawt =image-types-txts/rawbw =image-types-txts/err =image-types-txts/err =image-types-txts/err =image-types-txts/err =image-types-txts/err =image-types-txts/rlec =image-types-txts/rlet =image-types-txts/rlebw ] @image &id-length $1 &color-map $1 &image-type $1 &map $5 &x $2 &y $2 &w $2 &h $2 &depth $1 &descriptor $1 ( manifest ) @menu/ ( -- ) #0000 .Screen/x DEO2 #0000 .Screen/y DEO2 ;window/cols LDZ SUB #11 ;&bg-icn [ LIT2 02 -Screen/sprite ] ! @menu/ ( mask -- ) #0010 .Screen/x DEO2 #0004 .Screen/y DEO2 [ LIT2r &sel ff 00 ] [ LIT2 &manifest =manifest ] &>cat #0b09 EQUkr STHr [ JMP SWP POP ] ;font/color STA INC2k font/draw-str POP2 #20 font/ skip-sub INCr LDAk ?&>cat POP2 POP2r JMP2r @menu/ ( -- ) ;&sel LDA DUP #ff EQU ?{ DUP #00 / #ff ;&sel STA all/ / } POP JMP2r @menu/ ;Mouse/state DEO BRK } } ( | when sub active ) ;&sel LDA #ff EQU ?{ ( | when sel changed ) .Mouse/y DEI2 #0004 SUB2 #03 SFT2 NIP #01 SUB DUP ;&sel-sub LDA EQU ?{ DUP ;&sel-sub STA ;&sel LDA #ff / } POP ( | when touch sub ) ;Mouse/state DEI EQU ?{ ;&sel-sub LDA / ;Mouse/state DEO } BRK } ( | do not leave if menu is active ) ;&sel LDA INC ?{ .Mouse/y DEI2 #000c LTH2 ?{ / } } BRK @menu/get-cat ( cat -- cat* ) STH [ LITr 00 ] ;&manifest LDA2 &>w EQUkr STHr ?{ skip-sub INCr LDAk ?&>w POP2 #0000 } POP2r JMP2r @menu/get-sub ( sub -- sub* ) STH ;&sel LDA /get-cat LDAk STH INC2 str/cap STHr #00 &>ls DUP STHkr EQU ?{ SWP2 #0004 ADD2 str/cap SWP2 INC GTHk ?&>ls POP2 POP2 POPr #0000 JMP2r } POP2 INC2 INC2 LDA2 POPr JMP2r @menu/get-catx ( cat -- x* ) LIT2r 0000 ,&target-catx STR #00 ,&id STR ;&manifest LDA2 &>lcx [ LIT &id 00 ] [ LIT &target-catx $1 ] EQU ?{ INC2k font/get-width #0008 ADD2 STH2 ADD2r skip-sub ,&id LDR INC ,&id STR LDAk ?&>lcx POP2 } STH2r #0010 ADD2 JMP2r @menu/get-xcat ( x* -- ) #0010 SUB2 LIT2r 0000 ,&target-xcat STR2 #00 ,&id-xcat STR ;&manifest LDA2 &>wxc INC2k font/get-width #0008 ADD2 STH2r ADD2 DUP2 [ LIT2 &target-xcat $2 ] LTH2 ?{ POP2 POP2 [ LIT &id-xcat 00 ] JMP2r } STH2 skip-sub ,&id-xcat LDR INC ,&id-xcat STR LDAk ?&>wxc POP2 POP2r #ff JMP2r @menu/ ( cat mask -- ) ,&mask STR POP ;&sel LDA /get-cat ORAk #00 EQU ?{ ;&sel LDA /get-catx ,&anchor STR2 LDAk STH INC2 str/cap STHr #00 &>subcat STHk #0b09 STHr [ LIT &sel-sub ff ] EQU [ JMP SWP POP ] [ LIT &mask $1 ] AND ;font/color STA [ LIT2 &anchor $2 ] .Screen/x DEO2 #00 OVR INC #30 SFT2 #0004 ADD2 .Screen/y DEO2 SWP2 / SWP2 INC GTHk ?&>subcat POP2 POP2 } POP2 JMP2r ( @|TODOs ) @find-modkey ( mod key -- fn* ) ORAk ?{ JMP2r } ,&mk STR2 ;menu/manifest LDA2 &>cat LDAk STH INC2 str/cap STHr #00 &>subcat OVR2 LDA2 [ LIT2 &mk $2 ] NEQ2 ?{ POP2 INC2 INC2 LDA2 JMP2r } SWP2 #0004 ADD2 str/cap SWP2 INC GTHk ?&>subcat POP2 LDAk ?&>cat POP2 #0000 JMP2r @skip-sub ( sub* -- sub* ) LDAk STH INC2 str/cap STHr #00 &>subcat SWP2 #0004 ADD2 str/cap SWP2 INC GTHk ?&>subcat POP2 JMP2r @get-modkey-str ( mod key -- str* ) ;&buf #0008 mem/ ( mod ) SWP STH #0800 &loop STHkr OVR SFT #01 AND #00 EQU ?{ #00 OVR ;&buttons ADD2 LDA ;&buf str/ } INC GTHk ?&loop POP2 ( mix ) DUP #00 NEQ STHr #00 NEQ #0101 NEQ2 ?{ LIT "+ ;&buf str/ } ( key ) DUP #08 NEQ ?{ ;&bsp !&cat } DUP #09 NEQ ?{ ;&tab !&cat } DUP #0d NEQ ?{ ;&ent !&cat } DUP #20 NEQ ?{ ;&spc !&cat } DUP #1b NEQ ?{ ;&esc !&cat } DUP #7f NEQ ?{ ;&del !&cat } DUP ;&buf str/ &end POP ;&buf JMP2r &buf $8 &buttons "ABsSUDLR $1 &cat ;&buf str/ !&end &bsp "bsp $1 &tab "tab $1 &ent "ent $1 &spc "spc $1 &esc "esc $1 &del "del $1 @exit ( -- ) #800f DEO JMP2r ( @|Theme ) @theme/ ( -- ) ;&path .File/name DEO2 #0002 .File/length DEO2 ;&r .File/read DEO2 ;&g .File/read DEO2 ;&b .File/read DEO2 .File/success-lb DEI ?{ JMP2r } LIT2 &r $2 .System/r DEO2 LIT2 &g $2 .System/g DEO2 LIT2 &b $2 .System/b DEO2 JMP2r &path ".theme $1 ( @|Standard ) @chr/hex ( char -- ) ( dec ) [ LIT "0 ] SUB DUP #09 GTH [ JMP JMP2r ] ( hex ) #27 SUB DUP #0a SUB #05 GTH [ JMP JMP2r ] ( nil ) POP #ff JMP2r @chr2/byte ( hn ln -- byte ) SWP chr/hex #40 SFT SWP chr/hex ORA JMP2r @hex/chr2 ( byte -- hn ln ) DUP #04 SFT hex/chr SWP ( >> ) @hex/chr ( hex -- char ) #0f AND DUP #09 GTH #27 MUL ADD #30 ADD JMP2r @str/ ( str* -- ) &>wp LDAk DUP ?{ POP POP2 JMP2r } #18 DEO INC2 !&>wp @str/cap ( str* -- end* ) LDAk ?{ INC2 JMP2r } INC2 !/cap @str/cap-1 ( str* -- end* ) LDAk ?{ JMP2r } INC2 !/cap-1 @str/len ( str* -- len* ) DUP2 str/cap-1 SWP2 SUB2 JMP2r @str/ ( chr str* -- ) /cap-1 INC2k #00 ROT ROT STA STA JMP2r @str/ ( src* dst* -- ) /cap-1 STH2 &>w LDAk STH2kr STA INC2r INC2 LDAk ?&>w POP2 #00 STH2r STA JMP2r @mem/ ( src* len* -- ) ,&lclr STR2 ,&aclr STR2 ;&clr .System/expansion DEO2 JMP2r &clr 00 &lclr $2 0000 &aclr $2 00 @mem/ ( a* b* len* -- ) ,&ll STR2 ,&dst-l STR2 ,&src-l STR2 ;&mmu-sfl .System/expansion DEO2 JMP2r &mmu-sfl 01 &ll $2 0000 &src-l $2 0000 &dst-l $2 @mem/ ( a* b* len* -- ) ,&lr STR2 ,&dst-r STR2 ,&src-r STR2 ;&mmu-sfr .System/expansion DEO2 JMP2r &mmu-sfr 02 &lr $2 0000 &src-r $2 0000 &dst-r $2 @manifest 04 "Noodle $1 [ 01 "n =filepath/ "New $1 01 "o =filepath/ "Open $1 01 "s =filepath/ "Save $1 01 "q =exit "Exit $1 ] 09 "Edit $1 [ 14 00 =canvas/drag-u "Drag 20 "Up $1 24 00 =canvas/drag-d "Drag 20 "Down $1 44 00 =canvas/drag-l "Drag 20 "Left $1 84 00 =canvas/drag-r "Drag 20 "Right $1 21 00 =canvas/crop-h "Crop 20 "Height $1 11 00 =canvas/size-h "Size 20 "Height $1 41 00 =canvas/crop-w "Crop 20 "Width $1 81 00 =canvas/size-w "Size 20 "Width $1 00 09 =canvas/invert "Invert $1 ] 09 "Tool $1 [ 00 "q =brush/ "Pen $1 00 "w =brush/ "Brush $1 00 "e =brush/ "Line $1 00 "r =brush/ "Magic $1 00 "t =brush/ "Rect $1 00 "y =brush/ "Zoom $1 00 "x =brush/ "Erase $1 00 "[ =brush/ "Decr.Size $1 00 "] =brush/ "Incr.Size $1 ] 08 "Pattern $1 [ 00 "1 =brush/ "Full $1 00 "2 =brush/ "HalftoneA $1 00 "3 =brush/ "HalftoneB $1 00 "4 =brush/ "PokeDot $1 00 "5 =brush/ "DiagonalA $1 00 "6 =brush/ "DiagonalB $1 00 "7 =brush/ "Vertical $1 00 "8 =brush/ "Horizontal $1 ] $1 ( icn ) @hand-icn [ 2020 20b8 7c7c 3838 ] @blank-icn [ 0000 0000 0000 0000 ] @fill-icn [ ffff ffff ffff ffff ] @hash-icn [ cccc 3333 cccc 3333 ] @diag-icn [ 0000 0010 0000 0000 ] @state-icn 1038 7cfe 7c38 1000 @eyes-icns 0000 0082 4438 0000 0038 4492 2810 0000 @size-icns 0000 0010 0000 0000 0000 1038 1000 0000 0000 3838 3800 0000 0010 387c 3810 0000 0038 7c7c 7c38 0000 1038 7cfe 7c38 1000 387c fefe fe7c 3800 7cfe fefe fefe 7c00 0000 0000 0000 0000 0000 0010 0000 0000 0000 1028 1000 0000 0010 2844 2810 0000 0038 4444 4438 0000 1028 4482 4428 1000 3844 8282 8244 3800 7c82 8282 8282 7c00 @patt-icns fefe fefe fefe fe00 fed6 aad6 aad6 fe00 fe92 82d6 8292 fe00 fe82 92aa 9282 fe00 fea6 ca92 a6ca fe00 feca a692 caa6 fe00 feaa aaaa aaaa fe00 fe82 fe82 fe82 fe00 @tool-icns c0e0 5028 140a 0400 e0d0 a844 2212 0c00 c0b8 4848 7804 0200 a850 8850 a804 0200 fc84 8480 84ea 0400 3048 8484 4834 0200 ( zoom ) 3245 8284 4834 0200 ( zoom out ) @brush-icns 0000 0010 0000 0000 0000 1028 1000 0000 0000 3828 3800 0000 0010 2844 2810 0000 0038 4444 4438 0000 1028 4482 4428 1000 3844 8282 8244 3800 7c82 8282 8282 7c00 7cfe fefe fefe 7c00 @pointers-icns 80c0 e0f0 f8e0 1000 2020 20b8 7c7c 3838 @menu/bg-icn [ ffff ffff ffff ffff ffff ffff ffff ffff ] @hash2-icn [ aa00 8000 8000 8000 ] @appicon [ 0000 0000 0000 0000 0000 0000 0000 0001 0000 0000 0000 78fc 0c1e 1e07 037b 8503 0000 0000 0000 0078 0000 0000 0000 7884 0101 0303 0303 0303 0202 0404 0404 0707 feff fff9 f6e9 c9e6 0100 0006 0f1f 3fff fcfc fefe fe7e 3e7c 0202 0101 0181 c3fe 0301 0100 0000 0000 0703 0301 0000 0000 f9ff ffff 7f37 0500 ffff ffff ff7f 3f07 fcf8 f8f0 e0c0 0000 fefc fcf8 f0e0 c000 ] @font/spritesheet ( atari8 ) 0000 0000 0000 0000 6060 6060 6000 6000 6666 6600 0000 0000 006c fe6c 6cfe 6c00 183e 603c 067c 1800 0066 6c18 3066 4600 386c 3870 decc 7600 6060 6000 0000 0000 1c30 3030 3030 1c00 380c 0c0c 0c0c 3800 0066 3cff 3c66 0000 0018 187e 1818 0000 0000 0000 0030 3060 0000 007e 0000 0000 0000 0000 0018 1800 0306 0c18 3060 c000 3c66 6e76 6666 3c00 1838 1818 1818 7e00 3c66 060c 1830 7e00 7e0c 180c 0666 3c00 0c1c 3c6c 7e0c 0c00 7e60 7c06 0666 3c00 3c60 607c 6666 3c00 7e06 0c18 3030 3000 3c66 663c 6666 3c00 3c66 663e 060c 3800 0018 1800 0018 1800 0018 1800 1818 3000 0c18 3060 3018 0c00 0000 7e00 007e 0000 3018 0c06 0c18 3000 3c66 060c 1800 1800 3c66 6e6a 6e60 3e00 183c 6666 7e66 6600 7c66 667c 6666 7c00 3c66 6060 6066 3c00 786c 6666 666c 7800 7e60 607c 6060 7e00 7e60 607c 6060 6000 3e60 606e 6666 3e00 6666 667e 6666 6600 3c18 1818 1818 3c00 3e06 0606 0666 3c00 666c 7870 786c 6600 6060 6060 6060 7e00 c6ee fed6 c6c6 c600 6676 7e7e 6e66 6600 3c66 6666 6666 3c00 7c66 667c 6060 6000 3c66 6666 766c 3600 7c66 667c 6c66 6600 3c66 603c 0666 3c00 7e18 1818 1818 1800 6666 6666 6666 3e00 6666 6666 663c 1800 c6c6 c6d6 feee c600 6666 3c18 3c66 6600 6666 663c 1818 1800 7e06 0c18 3060 7e00 3c30 3030 3030 3c00 c060 3018 0c06 0300 3c0c 0c0c 0c0c 3c00 1038 6cc6 0000 0000 0000 0000 0000 fe00 0060 3018 0000 0000 0000 3c06 3e66 3e00 6060 7c66 6666 7c00 0000 3c60 6060 3c00 0606 3e66 6666 3e00 0000 3c66 7e60 3c00 1c30 7c30 3030 3000 0000 3e66 663e 067c 6060 7c66 6666 6600 1800 3818 1818 3c00 1800 1818 1818 1870 6060 666c 786c 6600 3818 1818 1818 3c00 0000 ecfe d6c6 c600 0000 7c66 6666 6600 0000 3c66 6666 3c00 0000 7c66 6666 7c60 0000 3e66 6666 3e06 0000 7c66 6060 6000 0000 3e60 3c06 7c00 0018 7e18 1818 0e00 0000 6666 6666 3e00 0000 6666 663c 1800 0000 c6c6 d67c 6c00 0000 663c 183c 6600 0000 6666 663e 067c 0000 7e0c 1830 7e00 1c30 3060 3030 1c00 1818 1818 1818 1818 380c 0c06 0c0c 3800 0000 60f2 9e0c 0000 3c42 9985 8599 423c @canvas/stack $100 &cap $2 @canvas/buf