retroforth/library/tob.retro

73 lines
2 KiB
Forth
Raw Normal View History

_ _ _ _ _ __ __
| |_ _____ _| |_ ___ _ _| |_ _ __ _ _| |_ | |__ _ _ / _|/ _| ___ _ __
| __/ _ \ \/ / __| / _ \| | | | __| '_ \| | | | __| | '_ \| | | | |_| |_ / _ \ '__|
| || __/> <| |_ | (_) | |_| | |_| |_) | |_| | |_ | |_) | |_| | _| _| __/ |
\__\___/_/\_\\__| \___/ \__,_|\__| .__/ \__,_|\__| |_.__/ \__,_|_| |_| \___|_|
|_|
The text output buffer (TOB) provides a virtual terminal model
emulating a small subset of the traditional DEC VT100. It is
sufficient to support the Termina vocabulary and application
scaffold.
This is intended to be a virtual terminal, with support for the
DEC escape sequence subset used by the termina vocabulary. At
present it does not yet implement most of the needed functions.
DEPENDS:
- konilo
TODO:
- cursor row, col
- improve handling of newlines
- escape sequence support
- separate out attributes to separate buffers
You can create constants for the terminal width & height before
loading the TOB library. If you do not do so, this will create
them for an 80x25 display.
~~~
'TOB:W d:lookup [ #80 'TOB:W const ] -if
'TOB:H d:lookup [ #25 'TOB:H const ] -if
~~~
~~~
'TOB d:create TOB:W TOB:H n:mul #4 n:mul allot
'TX var (col)
'TY var (row)
:scroll (source) &TOB TOB:W n:add
(dest) &TOB
(length) TOB:W TOB:H n:dec n:mul copy
&TY v:dec
(erase) #32 &TOB TOB:W TOB:H n:dec n:mul n:add TOB:W fill
;
:advance-cursor @TX TOB:W eq? [ #0 !TX &TY v:inc ] if
@TY TOB:H eq? [ &TY v:dec scroll ] if ;
:handle
#8 [ ] case
#127 [ ] case
#9 [ ] case
#10 [ #0 !TX &TY v:inc ] case
#13 [ #0 !TX &TY v:inc ] case
&TOB TOB:W @TY n:mul n:add @TX n:add store &TX v:inc ;
:tob:put (c-) handle advance-cursor ;
:tob:display
&TOB TOB:H [ TOB:W [ fetch-next c:put ] times nl ] times drop ;
:tob:with (q-) &tob:put &c:put set-hook call &c:put unhook ;
:tob:clear (-)
TOB:W TOB:H n:mul [ #32 tob:put ] times #0 !TX #0 !TY ;
tob:clear
~~~