|00 @System &vector $2 &pad $6 &r $2 &g $2 &b $2 |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 $1 &chord $1 |a0 @File &vector $2 &success $2 &stat $2 &delete $1 &append $1 &name $2 &length $2 &read $2 &write $2 |000 @page $1 @collapsed $1 @selection &a $2 &b $2 &length $2 |100 ( meta ) ;meta #06 DEO2 ( theme ) #f00f .System/r DEO2 #f00f .System/g DEO2 #f00f .System/b DEO2 load-theme ( size ) #00e0 .Screen/width DEO2 #00f8 .Screen/height DEO2 ( unlock ) ;on-mouse-body .Mouse/vector DEO2 ;on-frame .Screen/vector DEO2 ;on-control .Controller/vector DEO2 ( let's go! ) file-init draw-header #00 change-page BRK @meta 00 ( name ) "Note 20 "Pad 0a ( details ) "Original 20 "by 20 "Donn 20 "Denman 0a ( author ) "By 20 "Devine 20 "Lu 20 "Linvega 0a ( date ) "May 20 "27, 20 "2024 00 01 ( icon ) 83 =appicon ( @|vectors ) @on-control ( -> ) .Controller/key DEI .Controller/button DEI ( shortcuts ) DUP2 [ LIT2 "a 01 ] NEQ2 ?&no-ca POP2 select-all BRK &no-ca DUP2 [ LIT2 "x 01 ] NEQ2 ?&no-cx POP2 edit-cut BRK &no-cx DUP2 [ LIT2 "c 01 ] NEQ2 ?&no-cc POP2 edit-copy BRK &no-cc DUP2 [ LIT2 "v 01 ] NEQ2 ?&no-cv POP2 edit-paste BRK &no-cv ( mask shift key ) #fb AND ( arrows ) DUP #10 NEQ ?&no-u get-to #0001 SUB2 find-line-start select-variable &no-u DUP #20 NEQ ?&no-d get-to INC2 find-line-end select-variable &no-d DUP #40 NEQ ?&no-l select-left &no-l DUP #80 NEQ ?&no-r select-right &no-r DUP #42 NEQ ?&no-sbl .selection/b LDZ2 #0001 SUB2 find-word-start select-variable &no-sbl DUP #82 NEQ ?&no-sbr .selection/b LDZ2 INC2 find-word-end select-variable &no-sbr ( pagination ) DUP #21 NEQ OVR #81 NEQ AND ?{ next-page } DUP #11 NEQ OVR #41 NEQ AND ?{ prev-page } POP ( key ) DUP #08 NEQ ?&no-bs erase &no-bs DUP #7f NEQ ?&no-del delete &no-del DUP #09 LTH ?&no-ascii DUP insert &no-ascii POP #00 ;on-frame/f STA BRK @on-mouse-head ( -> ) [ LIT2 00 -Mouse/state ] DEI NEQ #41 ADD ;mouse-icn update-cursor .Mouse/state DEI #01 GTH .Mouse/y DEI2 #0012 LTH2 AND ?&toggle-collapse trap-mouse [ LIT &last $1 ] .Mouse/state DEI DUP ,&last STR EQU ?&unchanged draw-header ( release on close button ) .Mouse/state DEI ?&unchanged .Mouse/x DEI2 #0008 SUB2 #000a GTH2 ?&unchanged ( exit ) #800f DEO &unchanged BRK &toggle-collapse ( -> ) #00f8 #0011 .collapsed LDZ ?{ SWP2 } POP2 .Screen/height DEO2 [ LIT2 00 -collapsed ] LDZ EQU .collapsed STZ draw-header redraw [ LIT2 00 -Mouse/state ] DEO BRK @on-mouse-body ( -> ) [ LIT2 00 -Mouse/state ] DEI NEQ #41 ADD ;caret-icn update-cursor trap-mouse [ LIT &last $1 ] .Mouse/state DEI DUP #02 LTH ?&no-mouse2 get-position select-word &no-mouse2 DUP2 #0001 NEQ2 ?&no-down get-position select-variable &no-down DUP2 #0101 NEQ2 ?&no-drag get-position select-to &no-drag ,&last STR POP BRK @on-mouse-foot ( -> ) [ LIT2 00 -Mouse/state ] DEI NEQ #41 ADD ;mouse-icn update-cursor trap-mouse [ LIT2 00 -Mouse/state ] DEI NEQ .Mouse/x DEI2 #0018 LTH2 AND ?&on-mouse-down BRK &on-mouse-down ( -> ) [ LIT2 00 -Mouse/state ] DEO .Mouse/y DEI2 #00d6 SUB2 NIP [ LIT2 18 -Mouse/x ] DEI2 NIP SUB ADD #18 LTH ?&go-next prev-page BRK &go-next next-page BRK @on-frame ( -> ) [ LIT2 &last $1 &f $1 ] INCk ,&f STR #05 SFT DUP ,&last STR EQU ?&unchanged draw-note &unchanged BRK ( @|editor ) @insert ( char -- ) get-from scap get-page #1000 ADD2 LTH2 ?&has-space POP JMP2r &has-space ( convert linebreaks ) DUP #0d EQU #03 MUL SUB .selection/length LDZ2 #0000 EQU2 ?&no-block erase-selection &no-block get-from STH2k #0001 SUB2 get-eof #0001 msfr STH2kr STA STH2r INC2 select-from !file-save @erase ( -- ) .selection/length LDZ2 #0000 EQU2 ?&no-block erase-selection !select-reset &no-block get-from get-page NEQ2 [ JMP JMP2r ] get-from #0001 SUB2 DUP2 cut-char select-from !file-save @erase-selection ( -- ) get-from get-eof .selection/length LDZ2 msfl !file-save @delete ( -- ) get-eof get-from SUB2 ORA #01 [ JCN JMP2r ] .selection/length LDZ2 #0000 EQU2 ?&no-block erase-selection !select-reset &no-block get-from cut-char redraw !file-save @get-eof ( -- addr* ) get-page !scap @cut-char ( addr* -- ) get-eof #0001 !msfl ( @|selection ) @select-variable ( addr* -- ) [ LIT2 04 -Controller/button ] DEI AND ?select-to !select-from @select-reset ( -- ) get-from ( >> ) @select-from ( addr* -- ) clamp-selection DUP2 .selection/a STZ2 .selection/b STZ2 !select @select-to ( addr* -- ) clamp-selection .selection/b STZ2 !select @select-word ( addr* -- ) DUP2 &back #0001 SUB2 LDAk #20 GTH ?&back INC2 .selection/a STZ2 &next INC2 LDAk #20 GTH ?&next .selection/b STZ2 !select @select-all ( -- ) get-page DUP2 .selection/a STZ2 scap #0001 SUB2 .selection/b STZ2 ( >> ) @select ( -- ) get-to get-from SUB2 .selection/length STZ2 #00 ;on-frame/f STA !redraw @select-left ( -- ) .selection/length LDZ2 #0000 EQU2 [ LIT2 04 -Controller/button ] DEI AND #00 NEQ ORA ?&no-block get-from !select-from &no-block .selection/b LDZ2 #0001 SUB2 !select-variable @select-right ( -- ) .selection/length LDZ2 #0000 EQU2 [ LIT2 04 -Controller/button ] DEI AND #00 NEQ ORA ?&no-block get-to !select-from &no-block .selection/b LDZ2 INC2 !select-variable @get-from ( -- addr* ) .selection/b LDZ2 .selection/a LDZ2 LTH2k [ JMP SWP2 POP2 ] JMP2r @get-to ( -- addr* ) .selection/a LDZ2 .selection/b LDZ2 GTH2k [ JMP SWP2 POP2 ] JMP2r @clamp-selection ( addr* -- addr* ) ( min ) get-page GTH2k [ JMP SWP2 POP2 ] ( max ) get-eof #0001 SUB2 LTH2k [ JMP SWP2 POP2 ] JMP2r @is-selected ( addr* -- addr* f ) DUP2 get-from LTH2 ?&false DUP2 get-to #0001 SUB2 GTH2 ?&false #01 JMP2r &false #00 JMP2r ( @|file ) @file-init ( -- ) ;notepad-txt file-size #0000 EQU2 ?file-new ( load file ) ;notepad-txt .File/name DEO2 #8000 .File/length DEO2 ;mem .File/read DEO2 JMP2r @file-new ( -- ) #0801 &l #00 OVR #c0 SFT2 ;mem ADD2 STH2 #20 STH2r STA INC GTHk ?&l POP2 JMP2r @file-save ( -- ) ;notepad-txt .File/name DEO2 #8000 .File/length DEO2 ;mem .File/write DEO2 JMP2r @notepad-txt ".notepad $1 @file-size ( path* -- size* ) .File/name DEO2 #0001 .File/length DEO2 [ LIT2r 0000 ] &s ;&b .File/read DEO2 .File/success DEI2 #0000 EQU2 ?&eof INC2r !&s &eof STH2r JMP2r &b $1 @file-inject ( name* -- ) DUP2 file-size ORAk ?&exists POP2 POP2 JMP2r &exists STH2 .File/name DEO2 STH2kr .File/length DEO2 ( erase when selection length ) .selection/length LDZ2 #0000 EQU2 ?&no-selection get-from get-eof .selection/length LDZ2 msfl &no-selection ( push right ) get-from #0001 SUB2 get-eof STH2kr msfr get-from .File/read DEO2 get-from STH2r ADD2 !select-from @edit-cut ( -- ) .selection/length LDZ2 #0001 GTH2 [ JMP JMP2r ] edit-copy erase-selection select-reset !file-save @edit-copy ( -- ) .selection/length LDZ2 #0001 GTH2 [ JMP JMP2r ] ;snarf-txt .File/name DEO2 .selection/length LDZ2 .File/length DEO2 get-from .File/write DEO2 JMP2r @edit-paste ( -- ) ;snarf-txt file-inject !file-save @snarf-txt ".snarf $1 ( @|core ) @trap-mouse ( -- ) .Mouse/y DEI2 DUP2 #0018 GTH2 ?&no-head POP2 ;on-mouse-head .Mouse/vector DEO2 JMP2r &no-head DUP2 #00d6 LTH2 ?&no-foot POP2 ;on-mouse-foot .Mouse/vector DEO2 JMP2r &no-foot POP2 ;on-mouse-body .Mouse/vector DEO2 JMP2r @change-page ( id -- ) .page STZ get-page scap #0001 SUB2 !select-from @prev-page ( -- ) .page LDZ #01 SUB #07 AND !change-page @next-page ( -- ) .page LDZ INC #07 AND !change-page @pos-to-line ( y* -- line ) #0012 SUB2 #04 SFT2 NIP JMP2r @get-position ( -- addr* ) #0008 .Screen/x DEO2 #0018 .Screen/y DEO2 ( walk to line ) .Mouse/y DEI2 pos-to-line ,&line STR get-page &walk-line .Screen/y DEI2 pos-to-line [ LIT &line $1 ] EQU ?&end-line walk-char POP INC2 LDAk ?&walk-line &end-line ( walk to char ) .Mouse/x DEI2 #0001 SUB2 ,&x STR2 &walk-char .Screen/x DEI2 [ LIT2 &x $2 ] GTH2 ?&end-char walk-char ?&end-char INC2 LDAk ?&walk-char &end-char JMP2r @walk-char ( addr* -- addr* lb ) ( wrap ) LDAk #20 GTH ?&no-wrap DUP2 word-width .Screen/x DEI2 ADD2 #00d0 LTH2 ?&no-wrap ( tabbed ) DUP2 find-line-start LDA2 DUP2 #093e NEQ2 ?{ POP2 #01 #0021 !draw-linebreak } DUP2 #092d NEQ2 ?{ POP2 #01 #0022 !draw-linebreak } POP2 #01 #0008 !draw-linebreak &no-wrap ( char ) LDAk char-width .Screen/x DEI2 ADD2 .Screen/x DEO2 ( tab ) LDAk #09 NEQ ?&no-tab #00 !draw-tab &no-tab ( linebreak ) LDAk #0a NEQ ?&no-lb #01 #0008 !draw-linebreak &no-lb #00 JMP2r @get-page ( -- addr* ) ;mem [ LIT2 00 -page ] LDZ #c0 SFT2 ADD2 JMP2r @char-addr ( prev char -- addr* ) DUP #7e GTH ?&missing DUP #20 LTH ?&blank DUP2 #093e EQU2 ?&marker DUP2 #092d EQU2 ?&bullet NIP #20 SUB #00 SWP #50 SFT2 ;font/glyphs ADD2 JMP2r &blank POP2 ;font/glyphs JMP2r &missing POP2 ;error-icn JMP2r &marker POP2 ;marker-icn JMP2r &bullet POP2 ;bullet-icn JMP2r @char-width ( char -- width* ) DUP #7e GTH ?&missing #20 SUB #00 SWP ;font ADD2 LDA #00 SWP JMP2r &missing POP #0008 JMP2r @word-width ( str* -- length* ) [ LIT2r 0000 ] &while LDAk char-width STH2 ADD2r INC2 LDAk #20 GTH ?&while POP2 STH2r JMP2r @find-line-start ( addr* -- addr* ) ;mem SWP2 &l #0001 SUB2 LDAk DUP #0a EQU SWP #00 EQU ORA ?&end LTH2k ?&l &end NIP2 INC2 JMP2r @find-line-end ( addr* -- addr* ) get-eof SWP2 &l LDAk #0a EQU ?&end LDAk #00 EQU ?&end INC2 GTH2k ?&l &end NIP2 JMP2r @find-word-start ( addr* -- addr* ) ;mem SWP2 &l #0001 SUB2 LDAk #21 LTH ?&end LTH2k ?&l &end NIP2 INC2 JMP2r @find-word-end ( addr* -- addr* ) get-eof SWP2 &l LDAk #21 LTH ?&end INC2 GTH2k ?&l &end NIP2 JMP2r ( @|drawing ) @draw-header ( -- ) ( a ) #0000 DUP2 .Screen/x DEO2 .Screen/y DEO2 [ LIT2 15 -Screen/auto ] DEO ;bar-icn/a .Screen/addr DEO2 [ LIT2 01 -Screen/sprite ] DEO ( close ) ;close-icn #00 [ LIT2 00 -Mouse/state ] DEI NEQ .Mouse/x DEI2 #0008 SUB2 #000a LTH2 AND #50 SFT2 ADD2 .Screen/addr DEO2 [ LIT2 01 -Screen/sprite ] DEOk DEO ( lead ) #e9 &l ;bar-icn/b .Screen/addr DEO2 [ LIT2 01 -Screen/sprite ] DEO INC DUP ?&l POP ;bar-icn/b .Screen/addr DEO2 [ LIT2 01 -Screen/sprite ] DEOk DEO ( title ) #004b .Screen/x DEO2 [ LIT2 86 -Screen/auto ] DEO ;title-icn .Screen/addr DEO2 [ LIT2 01 -Screen/sprite ] DEOk DEO ( line ) [ LIT2 d2 -Screen/auto ] DEO #0000 .Screen/x DEO2 #0010 .Screen/y DEO2 ;line-icn .Screen/addr DEO2 [ LIT2 01 -Screen/sprite ] DEO #0070 .Screen/x DEO2 #0010 .Screen/y DEO2 [ LIT2 01 -Screen/sprite ] DEO JMP2r @redraw ( -- ) #0000 .Screen/x DEO2 #0018 .Screen/y DEO2 [ LIT2 80 -Screen/pixel ] DEO @draw-note ( -- ) [ LIT2 15 -Screen/auto ] DEO #0008 .Screen/x DEO2 #0018 .Screen/y DEO2 get-page &while ( draw char ) DUP2 #0001 SUB2 LDA2 char-addr .Screen/addr DEO2 is-selected STH #0701 STHr [ JMP SWP POP ] .Screen/sprite DEOk DEO .Screen/x DEI2k #0010 SUB2 ROT DEO2 ( draw selector ) get-from get-to NEQ2 ?&block DUP2 get-from NEQ2 ?&block ;on-frame/last LDA #01 AND ?&block ;blink-icn .Screen/addr DEO2 [ LIT2 05 -Screen/sprite ] DEO .Screen/x DEI2k #0008 SUB2 ROT DEO2 &block walk-char POP INC2 LDAk ?&while POP2 @draw-footer ( -- ) .Screen/height DEI2 #0020 GTH2 ?&visible JMP2r &visible [ LIT2 26 -Screen/auto ] DEO #0000 .Screen/x DEO2 .Screen/height DEI2 #0020 SUB2 .Screen/y DEO2 ;page-icn .Screen/addr DEO2 [ LIT2 01 -Screen/sprite ] DEOk DEOk DEOk DEO ( across ) [ LIT2 01 -Screen/auto ] DEO #0018 .Screen/x DEO2 .Screen/height DEI2 #0008 SUB2 .Screen/y DEO2 ;page-icn/bottom .Screen/addr DEO2 #e7 &l [ LIT2 01 -Screen/sprite ] DEO INC DUP ?&l POP ( page number ) [ LIT2 15 -Screen/auto ] DEO .Screen/width DEI2 #01 SFT2 #0003 SUB2 .Screen/x DEO2 .Screen/height DEI2 #0020 SUB2 .Screen/y DEO2 #0011 .page LDZ ADD #50 SFT2 ;font/glyphs ADD2 .Screen/addr DEO2 [ LIT2 01 -Screen/sprite ] DEOk DEO JMP2r @draw-tab ( -- ) .Screen/x DEI2k #0010 ADD2 #33 SFT2 ROT DEO2 JMP2r @draw-linebreak ( x* -- ) .Screen/x DEO2 .Screen/y DEI2k #0010 ADD2 ROT DEO2 JMP2r @update-cursor ( color addr* -- ) [ LIT2 15 -Screen/auto ] DEO ;fill-icn .Screen/addr DEO2 #40 draw-cursor .Mouse/x DEI2 ,draw-cursor/x STR2 .Mouse/y DEI2 ,draw-cursor/y STR2 .Screen/addr DEO2 ( >> ) @draw-cursor ( color -- ) [ LIT2 &x $2 ] .Screen/x DEO2 [ LIT2 &y $2 ] .Screen/y DEO2 .Screen/sprite DEO JMP2r ( @|stdlib ) @ ( short* -: ) SWP /b &b ( byte -: ) DUP #04 SFT /c &c ( byte -: ) #0f AND DUP #09 GTH #27 MUL ADD [ LIT "0 ] ADD #18 DEO JMP2r @load-theme ( -- ) ;&path .File/name DEO2 #0002 .File/length DEO2 ;&r .File/read DEO2 ;&g .File/read DEO2 ;&b .File/read DEO2 .File/success DEI2 ORA [ #01 JCN JMP2r ] LIT2 &r $2 .System/r DEO2 LIT2 &g $2 .System/g DEO2 LIT2 &b $2 .System/b DEO2 JMP2r &path ".theme $1 @msfl ( b* a* len* -- ) STH2 SWP2 EQU2k ?&e &l DUP2k STH2kr ADD2 LDA ROT ROT STA INC2 GTH2k ?&l POP2 POP2 &e POP2r JMP2r @msfr ( b* a* len* -- ) STH2 EQU2k ?&e &l DUP2 LDAk ROT ROT STH2kr ADD2 STA #0001 SUB2 LTH2k ?&l POP2 POP2 &e POP2r JMP2r @scap ( str* -- end* ) LDAk #00 NEQ [ JMP JMP2r ] &w INC2 LDAk ?&w JMP2r ~src/assets.tal