diff --git a/.gitignore b/.gitignore index 9dc8305..9041cb6 100644 --- a/.gitignore +++ b/.gitignore @@ -3,11 +3,10 @@ *png *bmp */bin -*snarf -*notepad -*theme *nametable -*rom -*sym - +*.rom +*.rom.sym +.snarf +.theme +.notepad diff --git a/gui/notepad/makefile b/gui/notepad/makefile new file mode 100644 index 0000000..133cf65 --- /dev/null +++ b/gui/notepad/makefile @@ -0,0 +1,29 @@ +ID=notepad +DIR=~/roms +ASM=uxncli ${DIR}/drifblim.rom +LIN=uxncli ${DIR}/uxnlin.rom +EMU=uxn11 +ROM=bin/${ID}.rom + +all: ${ROM} src/assets.tal + +lint: + @ ${LIN} src/${ID}.tal +run: all + @ ${EMU} ${ROM} +clean: + @ rm -f ${ROM} ${ROM}.sym +install: ${ROM} + @ cp ${ROM} ${DIR} +uninstall: + @ rm -f ${DIR}/${ID}.rom +archive: all + @ cat src/${ID}.tal src/assets.tal | sed 's/~[^[:space:]]\+//' > bin/res.tal + @ ${ASM} bin/res.tal bin/res.rom && ${EMU} bin/res.rom + @ cp bin/res.tal ../oscean/etc/${ID}.tal.txt + +.PHONY: all clean lint run install uninstall archive + +${ROM}: src/* + @ mkdir -p bin + @ ${ASM} src/${ID}.tal ${ROM} diff --git a/gui/notepad/src/assets.tal b/gui/notepad/src/assets.tal new file mode 100644 index 0000000..f1f5607 --- /dev/null +++ b/gui/notepad/src/assets.tal @@ -0,0 +1,262 @@ +@fill-icn [ + ffff ffff ffff ffff ffff ffff ffff ffff ] +@error-icn [ + aa55 aa55 aa55 aa55 aa55 aa55 aa55 aa55 ] +@blink-icn [ + 8080 8080 8080 8080 8080 8080 8080 8080 ] +@caret-icn [ + c628 1010 1010 1010 1010 1010 1010 28c6 ] +@mouse-icn [ + 80c0 e0f0 f8fc feff f8d8 8c0c 0606 0000 ] +@bar-icn + &a [ + 0000 007e 007e 007e 007e 007e 007e 0000 ] + &b [ + 0000 00ff 00ff 00ff 00ff 00ff 00ff 0000 ] + &c [ + 0000 00fe 00fe 00fe 00fe 00fe 00fe 0000 ] +@close-icn + 0000 00ff 8080 8080 8080 8080 80ff 0000 + 0000 00ef 202f 202f 202f 202f 20ef 0000 + 0000 00ff 84a4 9580 f180 95a4 84ff 0000 + 0000 00ef 20af 202f e02f 20af 20ef 0000 ] +@title-icn [ + 0000 0080 0080 0080 0000 0000 82c2 e2f2 + 0000 0000 0000 3c66 0000 0000 3030 7831 + 0000 0000 0000 f098 0000 0000 1f19 1919 + 0000 0000 0080 8f91 0000 0000 0101 0f99 + 0000 0000 8080 8080 0080 0080 0080 0000 + ba9e 8e86 8200 0000 6666 6666 3c00 0000 + 3131 3131 1800 0000 98f8 8088 f000 0000 + 1f18 1818 1800 0000 0f19 1919 0f00 0000 + 9999 9999 8f00 0000 8080 8080 8000 0000 ] +@page-icn [ + 00ff 4020 1008 0402 00ff 0000 0000 0000 + 00ff 0101 0101 0101 0100 0000 0000 0000 + 0080 4020 1008 0402 0101 0101 0101 0101 + 0000 0000 0000 0000 0100 0000 0000 0000 + 0181 4121 1109 0503 0000 ff00 ff00 ffff + 0000 ff00 ff00 ffff 0100 ff00 ff00 ffff ] + &bottom [ + ff00 ff00 ff00 ffff ] +@line-icn [ + 00ff 0000 0000 0000 ] +@appicon ( 24x24 ) [ + 0009 161f 1f1f 1f1f 093f 3f3f 3f3f 3f3f 0024 dbff ffff ffff 24ff ffff ffff ffff + 0090 68f8 f8f8 f8f8 90fc fcfc fcfc fcfc 1f1f 1f1f 1f1f 0016 3f3f 3f3f 3f3f 3f3f + ffff ffff ffff ffff ffff ffff ffff ffff f8f8 f8f8 f8f8 f8f8 fcfc fcfc fcfc fcfc + 1a1c 1e1f 001f 0000 3f3f 3f3f 3f20 3f00 ffff 00ff 00ff 0000 ffff ffff ff00 ff00 + f8f8 00f8 00f8 0000 fcfc fcfc fc04 fc00 ] +@font ( newyork12 - removed 0x20 down ) [ +0404 0508 0709 0a03 0505 0606 0306 0307 +0807 0808 0808 0808 0808 0303 0507 0507 +0a0a 0807 0807 0708 0906 0508 080c 0908 +0808 0807 0809 0a0d 0808 0604 0704 0407 +0407 0806 0807 0507 0804 0408 040c 0807 +0808 0606 0508 080b 0708 0605 0305 0601 +0a0a 0707 0908 0907 0707 0707 0706 0707 +0707 0404 0404 0807 0707 0707 0808 0808 +0405 0708 0708 0907 0909 0904 0400 0c08 +0000 0000 0800 0000 0000 0007 0600 0a07 +0704 0000 0000 0007 0709 080a 0a08 0c0b +0509 0505 0303 0009 080a 0000 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +&glyphs +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0020 2020 2020 2020 0020 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0050 5000 0000 0000 0000 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0014 7e28 fc50 0000 0000 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 1038 5450 3010 1814 5438 1000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 003e 494a 3408 1629 4946 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0018 2428 1029 4542 4539 0000 0000 +0000 0000 0000 0080 0000 0080 0000 0000 +0000 0040 4000 0000 0000 0000 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 1020 2040 4040 4040 2020 1000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 4020 2010 1010 1010 2020 4000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 20a8 7070 a820 0000 0000 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 0000 2020 f820 2000 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 0000 0000 0000 0040 4080 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 0000 0000 7800 0000 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 0000 0000 0000 0040 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0004 0408 0810 1020 2040 4000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0018 2442 4242 4242 2418 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0010 3010 1010 1010 1038 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0038 4404 0408 1020 447c 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0018 2404 0818 0402 0202 4438 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0004 0810 2444 7e04 040e 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 007c 4040 7804 0202 0204 0870 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 1820 4058 6442 4242 2418 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 007e 4204 0408 0810 1010 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0018 2424 1824 4242 4224 1800 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0018 2442 4242 261a 0204 1800 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 0000 4000 0000 0040 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 0000 4000 0000 0040 4080 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 0000 1020 4020 1000 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 0000 007c 007c 0000 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 0000 4020 1020 4000 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0038 4404 0408 1010 0010 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 001e 214c 5252 4d20 1e00 0000 +0000 0000 0000 0080 8080 0000 0000 0000 +0000 0008 0814 1422 3e41 41e3 0000 0000 +0000 0000 0000 0000 0000 0080 0000 0000 +0000 00f8 4444 7844 4242 44f8 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0038 4480 8080 8080 4438 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 00f8 4442 4242 4242 44f8 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 00fc 4440 4878 4840 44fc 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 00fc 4440 4878 4840 40e0 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 003c 4480 808e 8484 4438 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 00e7 4242 427e 4242 42e7 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0070 2020 2020 2020 2070 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0070 2020 2020 2020 2020 2020 c000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 00ee 4448 5060 5048 44ee 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0070 2020 2020 2020 227e 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 00e0 6060 5151 4a4a 44e4 0000 0000 +0000 00e0 c0c0 4040 4040 40e0 0000 0000 +0000 00e7 6252 524a 4a46 46e2 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0038 4482 8282 8282 4438 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 00f8 4442 4244 7840 40e0 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0038 4482 8282 8282 4438 100c 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 00f8 4444 4478 5048 44e6 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 003c 4440 2010 0804 4478 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 00fe 9210 1010 1010 1038 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 00e7 4242 4242 4242 2418 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 00e3 4141 2222 1414 0808 0000 0000 +0000 0080 0000 0000 0000 0000 0000 0000 +0000 0077 2222 1515 1508 0808 0000 0000 +0000 0070 2020 4040 4080 8080 0000 0000 +0000 00ee 4428 2810 2828 44ee 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 00ee 4428 2810 1010 1038 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 00f8 8810 1020 4040 88f8 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 6040 4040 4040 4040 4040 6000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0040 4020 2010 1008 0804 0400 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 6020 2020 2020 2020 2020 6000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0040 a000 0000 0000 0000 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 0000 0000 0000 00fe 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0080 4020 0000 0000 0000 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 0070 8818 6888 8874 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0040 c058 6442 4242 6458 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 0030 4880 8080 4830 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 000c 0434 4c84 8484 4e34 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 0030 4884 fc80 4830 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0030 40e0 4040 4040 40e0 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 0074 8888 8870 8078 8484 7800 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0040 c058 6444 4444 44ee 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0040 0040 c040 4040 40e0 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0040 0040 c040 4040 4040 4040 8000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0040 c04c 4850 6050 48ee 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0040 c040 4040 4040 40e0 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 0059 e644 4444 44ee 0000 0000 +0000 0000 0080 4040 4040 40e0 0000 0000 +0000 0000 0058 e444 4444 44ee 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 0030 4884 8484 4830 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 00f8 4442 4242 6458 4040 e000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 0034 4c84 8484 4c34 0404 0e00 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 0058 e040 4040 40e0 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 0070 8880 7008 8870 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0040 40f0 4040 4040 4830 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 00cc 4444 4444 443a 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 00ee 4444 2828 1010 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 00e0 4444 2a2a 1111 0000 0000 +0000 0000 00e0 4040 8080 0000 0000 0000 +0000 0000 00ee 4428 1028 44ee 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 00ee 4444 2828 1010 2020 4000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 00f8 8810 2040 88f8 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0010 2020 2020 2040 2020 2020 2010 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0040 4040 4040 4040 4040 4040 4040 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0040 2020 2020 2010 2020 2020 2040 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0068 b000 0000 0000 0000 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 0000 0000 0000 0000 0000 00ff +0000 0000 0000 0000 ffff ffff ffff ffff ] $1 + +@mem ( placeholder ) + "Keep 20 "up 20 "to 20 "eight 20 "pages 20 "of 20 "notes 20 "in 20 "the 20 "Note 20 "Pad. 20 + "Click 20 "on 20 "the 20 "dog-ear 20 "to 20 "turn 20 "to 20 "the 20 "next 20 "following 20 "page. 20 + "Click 20 "in 20 "the 20 "lower 20 "left 20 "corner 20 "to 20 "turn 20 "to 20 "the 20 "next 20 "previous 20 "page. 20 $1 diff --git a/gui/notepad/src/notepad.tal b/gui/notepad/src/notepad.tal new file mode 100644 index 0000000..dbf03cc --- /dev/null +++ b/gui/notepad/src/notepad.tal @@ -0,0 +1,745 @@ +|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 + +|0000 + + @page $1 + @collapsed $1 + @selection &a $2 &b $2 &length $2 + +|0100 + + ( 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 ) "Jul 20 "27, 20 "2023 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 + 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 + .collapsed LDZ #00 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 + + .Mouse/state DEI #00 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 + #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* -- ) + + .Controller/button DEI #04 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 + .Controller/button DEI #04 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 + .Controller/button DEI #04 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 + #01 !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 !draw-linebreak + &no-lb + #00 + +JMP2r + +@get-page ( -- addr* ) + + ;mem #00 .page LDZ #c0 SFT2 ADD2 + +JMP2r + +@char-addr ( char -- addr* ) + + DUP #7e GTH ?&missing + DUP #20 LTH ?&blank + #20 SUB + #00 SWP #50 SFT2 ;font/glyphs ADD2 + +JMP2r + &blank POP ;font/glyphs JMP2r + &missing POP ;error-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 #0a EQU ?&end + LTH2k ?&l + &end + NIP2 INC2 + +JMP2r + +@find-line-end ( addr* -- addr* ) + + get-eof SWP2 + &l + LDAk #0a 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 .Mouse/state DEI #00 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 ) + LDAk 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 ( -- ) + + #0008 .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 ) + +@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 +