mirror of
https://git.sr.ht/~rabbits/uxn
synced 2024-11-01 03:52:39 +00:00
3c758b734b
All these programs tested working, except for left, which compiles but doesn't run properly.
718 lines
18 KiB
Text
718 lines
18 KiB
Text
(
|
|
app/left : text editor
|
|
|
|
TODO
|
|
- Rename icon in titlebar
|
|
- Save/Load
|
|
- Double-click select word
|
|
- Right-click find next instance of selection
|
|
- Draw tab characters
|
|
- Don't redraw if nothing has changed
|
|
- Input on selection should erase selection range
|
|
- Erase on selection should erase selection range
|
|
- Scrollbar
|
|
- Don't scroll past oef
|
|
- Hor scroll
|
|
- Real scrolling distance
|
|
FIXME
|
|
- Imperfect port from previous assembler syntax
|
|
)
|
|
|
|
|
|
%RTN { JMP2r }
|
|
%RTN? { #00 EQU #02 JNZ STH2r JMP2 }
|
|
|
|
%++ { #0001 ADD2 } %-- { #0001 SUB2 }
|
|
%8/ { #0003 SFT2 } %8* { #0030 SFT2 }
|
|
%8- { #0008 SUB2 } %8+ { #0008 ADD2 }
|
|
|
|
( devices )
|
|
|
|
|00 @System [ &vector $2 &pad $6 &r $2 &g $2 &b $2 ]
|
|
|10 @Console [ &vector $2 &pad $6 &char $1 &byte $1 &short $2 &string $2 ]
|
|
|20 @Screen [ &vector $2 &width $2 &height $2 &pad $2 &x $2 &y $2 &addr $2 &color $1 ]
|
|
|40 @Controller [ &vector $2 &button $1 &key $1 ]
|
|
|60 @Mouse [ &vector $2 &x $2 &y $2 &state $1 &chord $1 ]
|
|
|70 @File [ &vector $2 &success $2 &offset $2 &pad $2 &name $2 &length $2 &load $2 &save $2 ]
|
|
|
|
( variables )
|
|
|
|
|0000
|
|
|
|
@lock [ &byte $1 ]
|
|
@k [ &byte $1 ]
|
|
@l [ &byte $1 ]
|
|
@i [ &short $2 ]
|
|
@j [ &short $2 ]
|
|
@addr [ &short $2 ]
|
|
@selection [ &from $2 &to $2 ]
|
|
@position [ &x $2 &y $2 ]
|
|
@scroll [ &x $2 &y $2 ]
|
|
@pt [ &x $2 &y $2 ]
|
|
@mouse [ &x $2 &y $2 ]
|
|
@touch [ &x1 $2 &y1 $2 &x2 $2 &y2 $2 &state $1 ]
|
|
@textarea [ &x1 $2 &y1 $2 &x2 $2 &y2 $2 &addr $2 &cursor $1 ]
|
|
@label [ &x $2 &y $2 &color $1 &addr $2 ] ( remove )
|
|
|
|
( program )
|
|
|
|
|0100 @RESET
|
|
|
|
( theme ) #e0fa .System/r DEO2 #30fa .System/g DEO2 #30fa .System/b DEO2
|
|
( vectors ) ;on-mouse .Mouse/vector DEO2
|
|
( vectors ) ;on-button .Controller/vector DEO2
|
|
|
|
( load file )
|
|
;filepath ;load-file JSR2
|
|
|
|
( place textarea )
|
|
#0018 .textarea/x1 POK2 .Screen/height DEI2 8- .textarea/y2 POK2
|
|
|
|
;select JSR2
|
|
;redraw JSR2
|
|
|
|
BRK
|
|
|
|
@on-button ( -> )
|
|
|
|
( alt + arrow )
|
|
.Controller/button DEI #0f AND #02 NEQ ,&no-alt JNZ
|
|
.Controller/button DEI #04 SFT
|
|
DUP #01 NEQ ,&no-aup JNZ
|
|
( sel word ) ;find-wordstart JSR2 .selection/to POK2 &no-aup
|
|
DUP #02 NEQ ,&no-adown JNZ
|
|
( sel word ) ;find-wordend JSR2 .selection/to POK2 &no-adown
|
|
DUP #04 NEQ ,&no-aleft JNZ
|
|
( sel decr ) .selection/to PEK2 -- .selection/to POK2 &no-aleft
|
|
DUP #08 NEQ ,&no-aright JNZ
|
|
( sel incr ) .selection/to PEK2 ++ .selection/to POK2 &no-aright
|
|
POP
|
|
;clamp-selection JSR2
|
|
;redraw JSR2
|
|
BRK
|
|
&no-alt
|
|
|
|
( ctrl + arrow )
|
|
.Controller/button DEI #0f AND #01 NEQ ,&no-ctrl JNZ
|
|
.Controller/button DEI #04 SFT
|
|
DUP #01 NEQ ,&no-cup JNZ
|
|
( jump scroll ) #0004 ;scroll-up JSR2 &no-cup
|
|
DUP #02 NEQ ,&no-cdown JNZ
|
|
( jump scroll ) #0004 ;scroll-down JSR2 &no-cdown
|
|
DUP #04 NEQ ,&no-cleft JNZ
|
|
( jump line ) ;goto-linestart JSR2 &no-cleft
|
|
DUP #08 NEQ ,&no-cright JNZ
|
|
( jump line ) ;goto-lineend JSR2 &no-cright
|
|
POP
|
|
;redraw JSR2
|
|
BRK
|
|
&no-ctrl
|
|
|
|
( arrow )
|
|
.Controller/button DEI #f0 AND #00 EQU ;&no-arrow JNZ2
|
|
.Controller/button DEI #f0 AND
|
|
DUP #10 NEQ ,&no-arrowup JNZ
|
|
( clamp ) .position/y PEK2 #0000 EQU2 ,&no-arrowup JNZ
|
|
;find-lineoffset JSR2 .position/x POK2 .position/y PEK2 -- .position/y POK2
|
|
;find-selection JSR2 DUP2 .selection/from POK2 ++ .selection/to POK2 &no-arrowup
|
|
DUP #20 NEQ ,&no-arrowdown JNZ
|
|
( clamp:TODO )
|
|
;find-lineoffset JSR2 .position/x POK2 .position/y PEK2 ++ .position/y POK2
|
|
;find-selection JSR2 DUP2 .selection/from POK2 ++ .selection/to POK2 &no-arrowdown
|
|
DUP #40 NEQ ,&no-arrowleft JNZ
|
|
( clamp ) .selection/from PEK2 ;document/body EQU2 ,&no-arrowleft JNZ
|
|
.selection/from PEK2 -- DUP2 .selection/from POK2 ++ .selection/to POK2 &no-arrowleft
|
|
DUP #80 NEQ ,&no-arrowright JNZ
|
|
( clamp:TODO )
|
|
#aa .Console/byte DEO
|
|
.selection/from PEK2 ++ DUP2 .selection/from POK2 ++ .selection/to POK2 &no-arrowright
|
|
POP
|
|
;clamp-selection JSR2
|
|
;follow-selection JSR2
|
|
;redraw JSR2
|
|
&no-arrow
|
|
|
|
.Controller/key DEI #08 NEQ ,&no-backspace JNZ
|
|
( erase )
|
|
.selection/to PEK2 .selection/from PEK2 SUB2 #0001 NEQ2 ,&erase-multiple JNZ
|
|
.selection/to PEK2 .selection/from PEK2 SUB2 ;shift-left JSR2
|
|
;&erase-end JMP2
|
|
&erase-multiple
|
|
.selection/from PEK2 ++ .selection/from POK2
|
|
.selection/to PEK2 .selection/from PEK2 SUB2 ++ ;shift-left JSR2
|
|
&erase-end
|
|
.selection/from PEK2 -- .selection/from POK2
|
|
.selection/from PEK2 ++ .selection/to POK2
|
|
;redraw JSR2
|
|
BRK
|
|
&no-backspace
|
|
|
|
( insert )
|
|
.selection/to PEK2 .selection/from PEK2 SUB2 ;shift-right JSR2
|
|
.Controller/key DEI .selection/from PEK2 PUT
|
|
.selection/from PEK2 ++ .selection/from POK2
|
|
.selection/from PEK2 ++ .selection/to POK2
|
|
;redraw JSR2
|
|
|
|
BRK
|
|
|
|
@on-mouse ( -> )
|
|
|
|
.Mouse/state DEI #00 EQU ,&touch-end JNZ
|
|
.Mouse/x DEI2 #0010 LTH2 ;touch-linebar JNZ2
|
|
.Mouse/x DEI2 .Screen/width DEI2 8- LTH2 ;touch-body JNZ2
|
|
;touch-scrollbar JMP2
|
|
&touch-end
|
|
|
|
.Mouse/state DEI .touch/state POK
|
|
|
|
;draw-cursor JSR2
|
|
|
|
BRK
|
|
|
|
@touch-linebar ( -- )
|
|
|
|
#0000 .position/x POK2
|
|
.Mouse/y DEI2 8/ .scroll/y PEK2 ADD2 .position/y POK2
|
|
;find-selection JSR2 DUP2 .selection/from POK2 ++ .selection/to POK2
|
|
;goto-linestart JSR2
|
|
;redraw JSR2
|
|
;draw-cursor JSR2
|
|
|
|
BRK
|
|
|
|
@touch-body ( -- )
|
|
|
|
.Mouse/y DEI2 8/ .scroll/y PEK2 ADD2 .position/y POK2
|
|
.Mouse/x DEI2 .textarea/x1 PEK2 SUB2 #0007 ADD2 #0007 DIV2 .position/x POK2
|
|
( chords )
|
|
.Mouse/chord DEI #00 EQU ,&no-chords JNZ
|
|
.Mouse/chord DEI
|
|
DUP #01 NEQ ,&no-chord-cut JNZ
|
|
;cut JSR2 ( release ) #00 DUP .Mouse/state DEO .Mouse/chord DEO &no-chord-cut
|
|
DUP #10 NEQ ,&no-chord-paste JNZ
|
|
;paste JSR2 ( release ) #00 DUP .Mouse/state DEO .Mouse/chord DEO &no-chord-paste
|
|
POP
|
|
;redraw JSR2
|
|
BRK
|
|
&no-chords
|
|
( drag )
|
|
.Mouse/state DEI .touch/state PEK NEQ .Controller/button DEI #0f AND #02 NEQ #0101 EQU2 ,&no-drag JNZ
|
|
( on drag )
|
|
;find-selection JSR2 ++ .selection/to POK2
|
|
;clamp-selection JSR2
|
|
,&end JMP
|
|
&no-drag
|
|
( on click )
|
|
;find-selection JSR2 DUP2 .selection/from POK2 ++ .selection/to POK2
|
|
&end
|
|
.Mouse/state DEI .touch/state POK
|
|
;draw-cursor JSR2
|
|
;redraw JSR2
|
|
|
|
BRK
|
|
|
|
@touch-scrollbar ( -- )
|
|
|
|
.Mouse/y DEI2 #0008 GTH2 ,&no-up JNZ
|
|
( decr ) .scroll/y PEK2 #00 .scroll/y PEK2 #0000 NEQ2 SUB2 .scroll/y POK2
|
|
,&end JMP
|
|
&no-up
|
|
.Mouse/y DEI2 .Screen/height DEI2 8- LTH2 ,&no-down JNZ
|
|
( incr ) .scroll/y PEK2 ++ .scroll/y POK2
|
|
,&end JMP
|
|
&no-down
|
|
.Mouse/y DEI2 8- .scroll/y POK2
|
|
&end
|
|
.Mouse/state DEI .touch/state POK
|
|
;draw-cursor JSR2
|
|
;redraw JSR2
|
|
|
|
BRK
|
|
|
|
@load-file ( path )
|
|
|
|
.File/name DEO2 #8000 .File/length DEO2 ;document/body .File/load DEO2
|
|
( get file length )
|
|
;document/body ;document/eof PUT2
|
|
&loop
|
|
( incr ) ;document/eof GET2 ++ ;document/eof PUT2
|
|
;document/eof GET2 GET #00 NEQ ,&loop JNZ
|
|
|
|
RTN
|
|
|
|
@scroll-up ( length -- )
|
|
|
|
DUP2 .scroll/y PEK2 LTH2 ,&clamp JNZ
|
|
#0000 .scroll/y POK2 POP2 RTN
|
|
&clamp
|
|
.scroll/y PEK2 SWP2 SUB2 .scroll/y POK2
|
|
|
|
RTN
|
|
|
|
@scroll-down ( length -- )
|
|
|
|
( TODO: Clamp )
|
|
.scroll/y PEK2 SWP2 ADD2 .scroll/y POK2
|
|
|
|
RTN
|
|
|
|
@shift-left ( length -- )
|
|
|
|
.i POK2
|
|
.selection/from PEK2 -- .j POK2 ( start -> end )
|
|
&loop
|
|
( move ) .j PEK2 .i PEK2 ADD2 GET .j PEK2 PUT
|
|
( incr ) .j PEK2 ++ .j POK2
|
|
.j PEK2 ;document/eof GET2 LTH2 ,&loop JNZ
|
|
;document/eof GET2 .i PEK2 SUB2 ;document/eof PUT2
|
|
|
|
RTN
|
|
|
|
@shift-right ( length -- )
|
|
|
|
.i POK2
|
|
;document/eof GET2 .j POK2 ( end -> start )
|
|
&loop
|
|
( move ) .j PEK2 .i PEK2 SUB2 GET .j PEK2 PUT
|
|
( decr ) .j PEK2 -- .j POK2
|
|
.j PEK2 .selection/from PEK2 GTH2 ,&loop JNZ
|
|
;document/eof GET2 .i PEK2 ADD2 ;document/eof PUT2
|
|
|
|
RTN
|
|
|
|
@follow-selection ( -- )
|
|
|
|
.position/y PEK2 .scroll/y PEK2 GTH2 ,&no-up JNZ
|
|
.position/y PEK2 .scroll/y POK2 RTN
|
|
&no-up
|
|
.position/y PEK2 .Screen/height DEI2 #0010 SUB2 8/ .scroll/y PEK2 ADD2 LTH2 ,&no-down JNZ
|
|
.position/y PEK2 .Screen/height DEI2 #0010 SUB2 8/ SUB2 .scroll/y POK2 RTN
|
|
&no-down
|
|
|
|
RTN
|
|
|
|
@clamp-selection ( -- )
|
|
|
|
.selection/from PEK2 .selection/to PEK2 LTH2 RTN?
|
|
.selection/from PEK2 ++ .selection/to POK2
|
|
|
|
RTN
|
|
|
|
@goto-linestart ( -- )
|
|
|
|
&loop
|
|
.selection/from PEK2 -- GET #0a EQU RTN?
|
|
.selection/from PEK2 -- GET #0d EQU RTN?
|
|
( decr ) .selection/from PEK2 DUP2 .selection/to POK2 -- .selection/from POK2
|
|
.selection/from PEK2 GET #00 NEQ ,&loop JNZ
|
|
( clamp at document body )
|
|
.selection/from PEK2 ;document/body GTH2 RTN?
|
|
;document/body DUP2 .selection/from POK2 ++ .selection/to POK2
|
|
|
|
RTN
|
|
|
|
@goto-lineend ( -- )
|
|
|
|
&loop
|
|
.selection/from PEK2 GET #0a EQU RTN?
|
|
.selection/from PEK2 GET #0d EQU RTN?
|
|
( incr ) .selection/from PEK2 ++ DUP2 ++ .selection/to POK2 .selection/from POK2
|
|
.selection/from PEK2 GET #00 NEQ ,&loop JNZ
|
|
( clamp at document body )
|
|
.selection/from PEK2 ;document/eof LTH2 RTN?
|
|
;document/eof -- DUP2 .selection/from POK2 ++ .selection/to POK2
|
|
|
|
RTN
|
|
|
|
@find-wordstart ( -- )
|
|
|
|
.selection/to PEK2 .j POK2
|
|
&loop
|
|
( decr ) .j PEK2 -- .j POK2
|
|
.j PEK2 GET #20 EQU ,&end JNZ
|
|
.j PEK2 GET #0a EQU ,&end JNZ
|
|
.j PEK2 GET #0d EQU ,&end JNZ
|
|
.j PEK2 ;document/body GTH2 ,&loop JNZ
|
|
&end
|
|
( return ) .j PEK2 --
|
|
|
|
RTN
|
|
|
|
@find-wordend ( -- )
|
|
|
|
.selection/to PEK2 .j POK2
|
|
&loop
|
|
( incr ) .j PEK2 ++ .j POK2
|
|
.j PEK2 GET #20 EQU ,&end JNZ
|
|
.j PEK2 GET #0a EQU ,&end JNZ
|
|
.j PEK2 GET #0d EQU ,&end JNZ
|
|
.j PEK2 ;document/body GTH2 ,&loop JNZ
|
|
&end
|
|
( return ) .j PEK2 ++
|
|
|
|
RTN
|
|
|
|
@find-lineoffset ( return character offset from linestart )
|
|
|
|
#0000 .j POK2
|
|
&loop
|
|
( incr ) .j PEK2 ++ .j POK2
|
|
.selection/from PEK2 .j PEK2 SUB2 GET #0a EQU ,&end JNZ
|
|
.selection/from PEK2 .j PEK2 SUB2 GET #0d EQU ,&end JNZ
|
|
.selection/from PEK2 .j PEK2 SUB2 ;document/body GTH2 ,&loop JNZ
|
|
&end
|
|
( return ) .j PEK2
|
|
|
|
RTN
|
|
|
|
@find-line ( position -> addr )
|
|
|
|
;document/body .j POK2 #0000 .pt/y POK2
|
|
&loop
|
|
.pt/y PEK2 .position/y PEK2 -- GTH2 ,&end JNZ
|
|
.j PEK2 GET #0a NEQ .j PEK2 GET #0d NEQ #0101 EQU2 ,&no-space JNZ
|
|
( incr ) .pt/y PEK2 ++ .pt/y POK2
|
|
&no-space
|
|
( incr ) .j PEK2 ++ .j POK2
|
|
.j PEK2 GET #00 NEQ ,&loop JNZ
|
|
&end
|
|
( return ) .j PEK2
|
|
|
|
RTN
|
|
|
|
@find-selection ( position -> addr )
|
|
|
|
;find-line JSR2 ( find line )
|
|
#0000 .pt/x POK2
|
|
&loop
|
|
.j PEK2 .pt/x PEK2 ADD2 GET #0a EQU ,&end JNZ
|
|
.j PEK2 .pt/x PEK2 ADD2 GET #0d EQU ,&end JNZ
|
|
( incr ) .pt/x PEK2 ++ .pt/x POK2
|
|
.pt/x PEK2 .position/x PEK2 -- LTH2 ,&loop JNZ
|
|
&end
|
|
( return ) .pt/x PEK2 ADD2
|
|
|
|
RTN
|
|
|
|
@cut ( -- )
|
|
|
|
;copy JSR2
|
|
.selection/to PEK2 .selection/from PEK2 SUB2 ;shift-left JSR2
|
|
.selection/from PEK2 ++ .selection/to POK2
|
|
|
|
RTN
|
|
|
|
@copy ( -- )
|
|
|
|
#0000 .i POK2 ( start )
|
|
.selection/to PEK2 .selection/from PEK2 SUB2 .j POK2 ( end )
|
|
.j PEK2 ;clip/len PUT2
|
|
&loop
|
|
.selection/from PEK2 .i PEK2 ADD2 GET ;clip/body .i PEK2 ADD2 PUT
|
|
( incr ) .i PEK2 ++ .i POK2
|
|
.i PEK2 .j PEK2 LTH2 ,&loop JNZ
|
|
|
|
RTN
|
|
|
|
@paste ( -- )
|
|
|
|
;clip/len GET2 ;shift-right JSR2
|
|
#0000 .i POK2 ( start )
|
|
;clip/len GET2 .j POK2 ( end )
|
|
&loop
|
|
;clip/body .i PEK2 ADD2 GET .selection/from PEK2 .i PEK2 ADD2 PUT
|
|
( incr ) .i PEK2 ++ .i POK2
|
|
.i PEK2 .j PEK2 LTH2 ,&loop JNZ
|
|
|
|
RTN
|
|
|
|
@select ( position -> selection )
|
|
|
|
;document/body .selection/from POK2 #0000 .pt/x POK2 #0000 .pt/y POK2
|
|
&loop
|
|
.selection/from PEK2 GET #0a NEQ .selection/from PEK2 GET #0d NEQ #0101 EQU2 ,&no-space JNZ
|
|
( incr ) .pt/y PEK2 ++ .pt/y POK2
|
|
#0000 .pt/x POK2
|
|
&no-space
|
|
.pt/y PEK2 .position/y PEK2 -- GTH2 .pt/x PEK2 .position/x PEK2 -- GTH2 #0101 NEQ2 ,&no-reached JNZ
|
|
.selection/from PEK2 ++ .selection/to POK2
|
|
RTN
|
|
&no-reached
|
|
( incr ) .pt/x PEK2 ++ .pt/x POK2
|
|
( incr ) .selection/from PEK2 ++ .selection/from POK2
|
|
.selection/from PEK2 GET #00 NEQ ,&loop JNZ
|
|
|
|
RTN
|
|
|
|
( drawing functions )
|
|
|
|
@redraw
|
|
|
|
;draw-textarea JSR2
|
|
;draw-scrollbar JSR2
|
|
;draw-titlebar JSR2
|
|
|
|
( save/load icons )
|
|
.Screen/height DEI2 8- .Screen/y DEO2
|
|
|
|
.Screen/width DEI2 #0030 SUB2 .Screen/x DEO2
|
|
;eye_icn .Screen/addr DEO2
|
|
#22 .Screen/color DEO
|
|
|
|
.Screen/width DEI2 #0028 SUB2 .Screen/x DEO2
|
|
;name_icn .Screen/addr DEO2
|
|
#22 .Screen/color DEO
|
|
|
|
.Screen/width DEI2 #0020 SUB2 .Screen/x DEO2
|
|
;load_icn .Screen/addr DEO2
|
|
#22 .Screen/color DEO
|
|
|
|
.Screen/width DEI2 #0018 SUB2 .Screen/x DEO2
|
|
;save_icn .Screen/addr DEO2
|
|
#22 .Screen/color DEO
|
|
|
|
RTN
|
|
|
|
@draw-short ( short )
|
|
|
|
.addr POK2
|
|
;font_hex #00 ;addr GET #f0 AND #04 SFT #08 MUL ADD2 .Screen/addr DEO2
|
|
( draw ) #2e .Screen/color DEO
|
|
.Screen/x DEI2 8+ .Screen/x DEO2
|
|
;font_hex #00 ;addr GET #0f AND #08 MUL ADD2 .Screen/addr DEO2
|
|
( draw ) #2e .Screen/color DEO
|
|
.Screen/x DEI2 8+ .Screen/x DEO2
|
|
;font_hex #00 ;addr ++ GET #f0 AND #04 SFT #08 MUL ADD2 .Screen/addr DEO2
|
|
( draw ) #2e .Screen/color DEO
|
|
.Screen/x DEI2 8+ .Screen/x DEO2
|
|
;font_hex #00 ;addr ++ GET #0f AND #08 MUL ADD2 .Screen/addr DEO2
|
|
( draw ) #2e .Screen/color DEO
|
|
|
|
RTN
|
|
|
|
@draw-cursor
|
|
|
|
( clear last cursor )
|
|
.mouse/x PEK2 .Screen/x DEO2
|
|
.mouse/y PEK2 .Screen/y DEO2
|
|
;blank_icn .Screen/addr DEO2
|
|
#30 .Screen/color DEO
|
|
|
|
( record mouse positions )
|
|
.Mouse/x DEI2 .mouse/x POK2
|
|
.Mouse/y DEI2 .mouse/y POK2
|
|
|
|
( draw new cursor )
|
|
.mouse/x PEK2 .Screen/x DEO2
|
|
.mouse/y PEK2 .Screen/y DEO2
|
|
;cursor_icn .Screen/addr DEO2
|
|
#3f .Mouse/state DEI #01 EQU #0a MUL SUB .Screen/color DEO
|
|
|
|
RTN
|
|
|
|
@draw-textarea ( x y color addr )
|
|
|
|
;document/body .textarea/addr POK2
|
|
|
|
( scroll to position )
|
|
#0000 .j POK2 ( j is linebreaks )
|
|
&find-offset
|
|
.scroll/y PEK2 .j PEK2 EQU2 ,&find-offset-end JNZ
|
|
.textarea/addr PEK2 GET #0a NEQ .textarea/addr PEK2 GET #0d NEQ #0101 EQU2 ,&no-break JNZ
|
|
( incr ) .j PEK2 ++ .j POK2 &no-break
|
|
( incr ) .textarea/addr PEK2 ++ .textarea/addr POK2
|
|
.textarea/addr PEK2 GET #00 NEQ ,&find-offset JNZ
|
|
&find-offset-end
|
|
|
|
#0018 .Screen/x DEO2 #0000 .Screen/y DEO2
|
|
.textarea/addr PEK2 .i POK2
|
|
|
|
&loop
|
|
|
|
.Screen/y DEI2 .Screen/height DEI2 #0010 SUB2 GTH2 ;&end JNZ2
|
|
|
|
|
|
.i PEK2 GET #0a NEQ .i PEK2 GET #0d NEQ #0101 EQU2 ;&no-linebreak JNZ2
|
|
( draw linebreak )
|
|
;linebreak_icn .Screen/addr DEO2
|
|
( draw ) #02
|
|
.i PEK2 .selection/from PEK2 -- GTH2
|
|
.i PEK2 .selection/to PEK2 LTH2 #0101 EQU2
|
|
#26 MUL ADD .Screen/color DEO
|
|
( fill clear )
|
|
&fill-clear
|
|
( incr ) .Screen/x DEI2 8+ .Screen/x DEO2
|
|
;font .Screen/addr DEO2
|
|
#21 .Screen/color DEO
|
|
.Screen/x DEI2 .Screen/width DEI2 8- LTH2 ,&fill-clear JNZ
|
|
|
|
( draw line number )
|
|
#0000 .Screen/x DEO2
|
|
.scroll/y PEK2 .Screen/y DEI2 8/ ADD2 DUP2 SWP POP .k POK
|
|
.position/y PEK2 EQU2 #05 MUL .l POK
|
|
;font_hex #00 .k PEK #f0 AND #04 SFT #08 MUL ADD2 .Screen/addr DEO2
|
|
#24 .l PEK ADD .Screen/color DEO
|
|
#0008 .Screen/x DEO2
|
|
;font_hex #00 .k PEK #0f AND #08 MUL ADD2 .Screen/addr DEO2
|
|
#24 .l PEK ADD .Screen/color DEO
|
|
|
|
#0010 .Screen/x DEO2
|
|
( incr ) .Screen/y DEI2 8+ .Screen/y DEO2
|
|
&no-linebreak
|
|
|
|
|
|
( get character )
|
|
;font #00 .i PEK2 GET #20 SUB 8* ADD2 .Screen/addr DEO2
|
|
( is a special character )
|
|
.i PEK2 GET #20 GTH ,&no-tab JNZ ;font .Screen/addr DEO2 &no-tab
|
|
|
|
( draw ) #21
|
|
.i PEK2 .selection/from PEK2 -- GTH2
|
|
.i PEK2 .selection/to PEK2 LTH2 #0101 EQU2
|
|
#05 MUL ADD .Screen/color DEO
|
|
|
|
( incr ) .i PEK2 ++ .i POK2
|
|
( incr ) .Screen/x DEI2 #0007 ADD2 .Screen/x DEO2
|
|
|
|
.i PEK2 GET #00 NEQ ;&loop JNZ2
|
|
|
|
&end
|
|
|
|
RTN
|
|
|
|
@draw-scrollbar ( -- )
|
|
|
|
;scrollbar_icn ( keeping a copy on stack )
|
|
|
|
.Screen/width DEI2 8- .Screen/x DEO2
|
|
#0008 .Screen/y DEO2
|
|
DUP2 .Screen/addr DEO2
|
|
|
|
#0008 .Screen/height DEI2 8-
|
|
&loop
|
|
( draw ) #21 .Screen/color DEO
|
|
( incr ) SWP2 8+ DUP2 .Screen/y DEO2 SWP2
|
|
OVR2 OVR2 LTH2 ,&loop JNZ
|
|
POP2 POP2
|
|
|
|
.scroll/y PEK2 8+ .Screen/y DEO2
|
|
DUP2 #0008 ADD2 .Screen/addr DEO2
|
|
( draw ) #21 .Screen/color DEO
|
|
|
|
#0000 .Screen/y DEO2
|
|
DUP2 #0010 ADD2 .Screen/addr DEO2
|
|
( draw ) #24 .Screen/color DEO
|
|
|
|
.Screen/height DEI2 8- .Screen/y DEO2
|
|
#0018 ADD2 .Screen/addr DEO2
|
|
( draw ) #24 .Screen/color DEO
|
|
|
|
RTN
|
|
|
|
@draw-titlebar
|
|
|
|
#0018 .Screen/height DEI2 8- #29 ;filepath
|
|
( load ) .label/addr POK2 .label/color POK .Screen/y DEO2 .Screen/x DEO2
|
|
.label/addr PEK2
|
|
&loop
|
|
( draw ) DUP2 GET #00 SWP #20 SUB 8* ;font ADD2 .Screen/addr DEO2 .label/color PEK .Screen/color DEO
|
|
( incr ) ++
|
|
( incr ) .Screen/x DEI2 8+ .Screen/x DEO2
|
|
DUP2 GET #00 NEQ ,&loop JNZ
|
|
POP2
|
|
( selection )
|
|
.selection/from PEK2 ;document/body SUB2 ;draw-short JSR2
|
|
|
|
RTN
|
|
|
|
@font_hex ( 0-F TODO: should pull from @font instead.. )
|
|
[
|
|
003c 464a 5262 3c00 0018 0808 0808 1c00
|
|
003c 4202 3c40 7e00 003c 421c 0242 3c00
|
|
000c 1424 447e 0400 007e 407c 0242 3c00
|
|
003c 407c 4242 3c00 007e 0204 0810 1000
|
|
003c 423c 4242 3c00 003c 4242 3e02 3c00
|
|
003c 4242 7e42 4200 007c 427c 4242 7c00
|
|
003c 4240 4042 3c00 007c 4242 4242 7c00
|
|
007e 4078 4040 7e00 007e 4078 4040 4000
|
|
]
|
|
|
|
@font ( specter8-frag font )
|
|
[
|
|
0000 0000 0000 0000 0008 0808 0800 0800
|
|
0014 1400 0000 0000 0024 7e24 247e 2400
|
|
0008 1e28 1c0a 3c08 0000 2204 0810 2200
|
|
0030 4832 4c44 3a00 0008 1000 0000 0000
|
|
0004 0808 0808 0400 0020 1010 1010 2000
|
|
0000 2214 0814 2200 0000 0808 3e08 0800
|
|
0000 0000 0000 0810 0000 0000 3e00 0000
|
|
0000 0000 0000 0800 0000 0204 0810 2000
|
|
003c 464a 5262 3c00 0018 0808 0808 1c00
|
|
003c 4202 3c40 7e00 003c 421c 0242 3c00
|
|
000c 1424 447e 0400 007e 407c 0242 3c00
|
|
003c 407c 4242 3c00 007e 0204 0810 1000
|
|
003c 423c 4242 3c00 003c 4242 3e02 3c00
|
|
0000 0010 0000 1000 0000 1000 0010 1020
|
|
0000 0810 2010 0800 0000 003e 003e 0000
|
|
0000 1008 0408 1000 003c 420c 1000 1000
|
|
003c 4232 4a42 3c00 003c 4242 7e42 4200
|
|
007c 427c 4242 7c00 003c 4240 4042 3c00
|
|
007c 4242 4242 7c00 007e 4078 4040 7e00
|
|
007e 4078 4040 4000 003c 4240 4642 3c00
|
|
0042 427e 4242 4200 001c 0808 0808 1c00
|
|
007e 0202 0242 3c00 0042 4478 4442 4200
|
|
0040 4040 4040 7e00 0042 665a 4242 4200
|
|
0042 6252 4a46 4200 003c 4242 4242 3c00
|
|
007c 4242 7c40 4000 003c 4242 4244 3a00
|
|
007c 4242 7c44 4200 003e 403c 0242 3c00
|
|
007e 0808 0808 1000 0042 4242 4244 3a00
|
|
0042 4242 4224 1800 0042 4242 5a66 4200
|
|
0042 423c 4242 4200 0042 423e 0242 3c00
|
|
007e 020c 3040 7e00 000c 0808 0808 0c00
|
|
0040 2010 0804 0200 0030 1010 1010 3000
|
|
0008 1400 0000 0000 0000 0000 0000 7e00
|
|
0008 0400 0000 0000 0000 3c02 3e42 3a00
|
|
0040 407c 4242 7c00 0000 3c42 4042 3c00
|
|
0002 023e 4242 3e00 0000 3c42 7e40 3e00
|
|
0000 3e40 7840 4000 0000 3c42 3e02 3c00
|
|
0040 405c 6242 4200 0008 0018 0808 0400
|
|
0008 0018 0808 4830 0040 4244 7844 4200
|
|
0010 1010 1010 0c00 0000 6c52 5252 5200
|
|
0000 5c62 4242 4200 0000 3c42 4242 3c00
|
|
0000 7c42 427c 4040 0000 3e42 423e 0202
|
|
0000 5c62 4040 4000 0000 3e40 3c02 7c00
|
|
0008 7e08 0808 1000 0000 4242 4244 3a00
|
|
0000 4242 4224 1800 0000 5252 5252 2e00
|
|
0000 4224 1824 4200 0000 4242 3e02 7c00
|
|
0000 7e02 3c40 7e00 000c 0810 1008 0c00
|
|
0008 0808 0808 0800 0030 1008 0810 3000
|
|
0000 0032 4c00 0000 3c42 99a1 a199 423c
|
|
]
|
|
|
|
( interface )
|
|
@eye_icn
|
|
[ 0038 4492 2810 0000 ] ( open )
|
|
[ 0000 0082 4438 0000 ] ( closed )
|
|
|
|
@scrollbar_icn
|
|
[ aa55 aa55 aa55 aa55 ] ( bg )
|
|
[ ffff ffff ffff ffff ] ( fg )
|
|
[ 0010 387c fe10 1010 ] ( up )
|
|
[ 0010 1010 fe7c 3810 ] ( down )
|
|
|
|
@name_icn [ 1054 28c6 2854 1000 ]
|
|
@load_icn [ feaa d6aa d4aa f400 ]
|
|
@save_icn [ fe82 8282 848a f400 ]
|
|
|
|
@linebreak_icn [ 003e 7474 3414 1400 ]
|
|
|
|
@blank_icn [ 0000 0000 0000 0000 ]
|
|
@cursor_icn [ 80c0 e0f0 f8e0 1000 ]
|
|
|
|
@filepath1 [ "projects/examples/gui.hover.usm 00 ]
|
|
@filepath [ "README.md 00 ]
|
|
|
|
@clip [ &len $2 &body $100 ]
|
|
@document [ &eof $2 &body $0 ]
|
|
|