uxn-utils/gui/notepad/src/notepad.tal

771 lines
13 KiB
Tal
Raw Normal View History

2024-05-26 22:35:57 -04:00
|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
2024-05-27 23:01:57 -04:00
|000
2024-05-26 22:35:57 -04:00
@page $1
@collapsed $1
@selection &a $2 &b $2 &length $2
2024-05-27 23:01:57 -04:00
|100
2024-05-26 22:35:57 -04:00
( 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
2024-05-27 23:01:57 -04:00
( date ) "May 20 "27, 20 "2024 00
2024-05-26 22:35:57 -04: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
2024-05-27 23:01:57 -04:00
( pagination )
DUP #21 NEQ OVR #81 NEQ AND ?{ next-page }
DUP #11 NEQ OVR #41 NEQ AND ?{ prev-page }
2024-05-26 22:35:57 -04:00
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
2024-05-26 22:41:17 -04:00
[ LIT2 00 -collapsed ] LDZ EQU .collapsed STZ
2024-05-26 22:35:57 -04:00
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
2024-05-26 22:41:17 -04:00
[ LIT2 00 -Mouse/state ] DEI NEQ .Mouse/x DEI2 #0018 LTH2 AND ?&on-mouse-down
2024-05-26 22:35:57 -04:00
BRK
&on-mouse-down ( -> )
[ LIT2 00 -Mouse/state ] DEO
.Mouse/y DEI2 #00d6 SUB2 NIP
2024-05-26 22:41:17 -04:00
[ LIT2 18 -Mouse/x ] DEI2 NIP SUB
2024-05-26 22:35:57 -04:00
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* -- )
2024-05-26 22:41:17 -04:00
[ LIT2 04 -Controller/button ] DEI AND ?select-to
2024-05-26 22:35:57 -04:00
!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
2024-05-26 22:41:17 -04:00
[ LIT2 04 -Controller/button ] DEI AND #00 NEQ
2024-05-26 22:35:57 -04:00
ORA ?&no-block
get-from !select-from
&no-block
.selection/b LDZ2 #0001 SUB2
!select-variable
@select-right ( -- )
.selection/length LDZ2 #0000 EQU2
2024-05-26 22:41:17 -04:00
[ LIT2 04 -Controller/button ] DEI AND #00 NEQ
2024-05-26 22:35:57 -04:00
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
2024-05-27 23:25:39 -04:00
( tabbed )
2024-05-27 23:46:28 -04:00
DUP2 find-line-start LDA2
DUP2 #093e NEQ2 ?{
POP2 #01 #0021 !draw-linebreak }
DUP2 #092d NEQ2 ?{
POP2 #01 #0022 !draw-linebreak }
POP2
2024-05-27 23:25:39 -04:00
#01 #0008 !draw-linebreak
2024-05-26 22:35:57 -04:00
&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
2024-05-27 23:25:39 -04:00
#01 #0008 !draw-linebreak
2024-05-26 22:35:57 -04:00
&no-lb
#00
JMP2r
@get-page ( -- addr* )
2024-05-26 22:41:17 -04:00
;mem [ LIT2 00 -page ] LDZ #c0 SFT2 ADD2
2024-05-26 22:35:57 -04:00
JMP2r
2024-05-27 23:12:52 -04:00
@char-addr ( prev char -- addr* )
2024-05-26 22:35:57 -04:00
DUP #7e GTH ?&missing
DUP #20 LTH ?&blank
2024-05-27 23:12:52 -04:00
DUP2 #093e EQU2 ?&marker
2024-05-27 23:38:21 -04:00
DUP2 #092d EQU2 ?&bullet
2024-05-27 23:12:52 -04:00
NIP #20 SUB
2024-05-26 22:35:57 -04:00
#00 SWP #50 SFT2 ;font/glyphs ADD2
JMP2r
2024-05-27 23:12:52 -04:00
&blank POP2 ;font/glyphs JMP2r
&missing POP2 ;error-icn JMP2r
&marker POP2 ;marker-icn JMP2r
2024-05-27 23:38:21 -04:00
&bullet POP2 ;bullet-icn JMP2r
2024-05-26 22:35:57 -04:00
@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
2024-05-27 23:25:39 -04:00
#0001 SUB2 LDAk
DUP #0a EQU SWP #00 EQU ORA ?&end
2024-05-26 22:35:57 -04:00
LTH2k ?&l
&end
NIP2 INC2
JMP2r
@find-line-end ( addr* -- addr* )
get-eof SWP2
&l
LDAk #0a EQU ?&end
2024-05-27 23:25:39 -04:00
LDAk #00 EQU ?&end
2024-05-26 22:35:57 -04:00
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
2024-05-26 22:41:17 -04:00
#00 [ LIT2 00 -Mouse/state ] DEI NEQ .Mouse/x DEI2 #0008 SUB2 #000a LTH2 AND
2024-05-26 22:35:57 -04:00
#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 )
2024-05-27 23:12:52 -04:00
DUP2 #0001 SUB2 LDA2 char-addr .Screen/addr DEO2
2024-05-26 22:35:57 -04:00
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
2024-05-27 23:25:39 -04:00
@draw-linebreak ( x* -- )
2024-05-26 22:35:57 -04:00
2024-05-27 23:25:39 -04:00
.Screen/x DEO2
2024-05-26 22:35:57 -04:00
.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
2024-05-27 23:12:52 -04:00
( >> )
2024-05-26 22:35:57 -04:00
@draw-cursor ( color -- )
[ LIT2 &x $2 ] .Screen/x DEO2
[ LIT2 &y $2 ] .Screen/y DEO2
.Screen/sprite DEO
JMP2r
(
@|stdlib )
2024-05-27 23:12:52 -04:00
@<phex> ( 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
2024-05-26 22:35:57 -04:00
@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