While the core functionality of Konilo is usable on a simple serial connection, many of the programs I've written target a DEC compatible terminal. To help make this easier, and to gain a degree of similarity across the system, I have written a scaffold named Termina. There are two parts to this. The first is a vocabulary for color and cursor movement, and the second is the actual scaffold for writing programs. Before proceeding I will say this: if your program doesn't fit into the framework Termina provides, don't use it. There's not anything wrong with rolling your own solution that meets your needs. The basic color and cursor movement vocabulary is easy to use. Color words are in the `fg:` (foreground) and `bg:` (background) namespaces. The basic VGA colors (black, red, green, yellow, blue, magenta, cyan, and white) are supported for each. For cursor movement, a `vt:` (visual terminal) namespace is provided. This has words to move the cursor to the top left or to a specific location. (vt:home and vt:row,col). I also have words to move the cursor up, down, left, and right. Rounding out the core vt:namespace are words to reset attributes and clear the display. All of that is pretty straightforward, and should be easy to figure out. This brings me to the larger scaffold. I designed Termina to support programs with a static display and an interaction model built around the use of a keyboard. A Termina program has three parts: a set of keyboard actions, a collection of hints regarding keyboard use, and a display function. To use the scaffold, write the words for these, and pass in the relevant pointers to +ti:application : [ &actions &hints &display ] ti:application The User Interface & Interaction Model Programs using Termina have a similar visual style. They will show a display area, followed by a horizontal separator with an optional program title, then a set of "hints" for the keys mapping to 0-9. (By convention, key 0 is used to quit a Termina program). Termina will run your provided display function, then show the hints. It then waits for a keypress. Keyboard Actions Termina has a keyboard processing loop that maps the printable ASCII characters to functions. These are setup by an "actions" word, using +ti:set-action. An example: :actions &prev $1 ti:set-action &next $2 ti:set-action &ti:done $0 ti:set-action ; Hints A "hints" area is provided below the display. This shows a short help text for keys 0-9, which are intended to serve as the main navigation and functions in the program. I normally map 0 to +ti:quit which exits a Termina program. The others get mapped as needed by the program. Hints are added using +ti:add-hint : 'Quit #0 ti:add-hint 'Previous #1 ti:add-hint Additional Hints / Help Before going further, I recognize that many programs will need additional keys that won't fit in the hints area. To help show these, Termina has a +ti:help word that can be used to display a block of help text. This is used like: [ #12345 ti:help ] $? ti:set-action Program Title One last thing before leaving the hints section. Programs using Termina tend to look similar. This can make it difficult to keep track of which program you are currently using. To help with this, you can add a title as part of the hints or display code. To do this, pass a string to +ti:set-title : 'MyProgram ti:set-title I suggest having this in your display code if you need to update it as the program is run, or in the hints area if it's static text. The Display Termina calls the display word at the start of each loop. This word should clear the display as needed, and then display any data the program needs to present. To determine the space available, you can check the +ti:height and +ti:width variables. The height, minus four lines, is safe to use. (The user should set these to match their local terminal configuration). A Sample Program :hints 'Previous #1 ti:add-hint 'Next #2 ti:add-hint 'Quit #0 ti:add-hint ; :actions &prev $1 ti:set-action &next $2 ti:set-action &ti:done $0 ti:set-action ; :display clear list# ; :block-viewer [ &actions &hints &display ] ti:application ; The basic rationale behind Termina is this: I'm happy working in a text-based environment, and prefer to keep mouse use to a bare minimum. I also like keeping my programs consistent. I'll deviate from a common interface model if it makes things better, but I try to stay consistent when possible to reduce the mental load in lear- ning new interfaces for each program. The simple structure used by Termina has proven satisfactory for various editors, browsers, and games I've written.