VT100 library for the Micromite console


Author Message
Mixtel90

Guru

Joined: 05/10/2019
Location: United Kingdom
Posts: 7858
Posted: 08:11am 23 Apr 2021      

If anyone is interested, I put this together a while back and it's rather nice to have a bit of colour and Print@ to console displays. It's at it's most useful when loaded as a "fit & forget" library when it can, of course, run on a "headless" Micromite chip.

'These are MMBasic library routines for TeraTerm VT100 terminal video.
'Comments are NOT recoverable from the Micromite as they are stripped out on
'inclusion into the library. It is worth keeping a copy of this file. :)

' Vhelp          show help info
' Vcls           clear screen
' Vch            cursor home to top left
' Vcdn n         move cursor down n lines
' Vcr n          move cursor rignt n characters
' Vcl n          move cursor left n characters
' Vcup n         move cursor up n lines
' Vat row col    move cursor to row,column
' Vsc            save current cursor position
' Vrc            restore cursor position saved by Vsc
' Vbox y,x,w,h,t draw a box
' Vl y,x,l,t     draw a vertical or horixontal line to divide a box
' Vatt n$        set text attributes to n$ (none,bold,inverse,underlined)
' Vfc n$         set text/foreground colour by name or str$(number) 0-15
' Vbc n$         set background colour by name or str$(number) 0-16 (16 is light grey)
' ch             print Chr$(27)+"["  (the Escape sequence) - used internally

Sub Vcls 'clear the screen
ch
Print "2J";
End Sub

Sub Vch  'cursor home to top left corner
ch
Print "H";
End Sub

Sub Vcdn(n) 'move cursor down n lines
Local vz$
vz$=Str$(n)+";B"
ch
Print vz$;
End Sub

Sub Vcup(n) 'move cursor up n lines
Local vz$
vz$=Str$(n)+";A"
ch
Print vz$;
End Sub

Sub Vcr(n) 'move cursor right n characters
Local vz$
vz$=Str$(n)+";C"
ch
Print vz$;
End Sub

Sub Vcl(n) 'move cursor left n characters
Local vz$
vz$=Str$(n)+";D"
ch
Print vz$;
End Sub

Sub Vat(row,col) 'locate cursor to row,col
Local vz$
vz$=Str$(row)+";"+Str$(col)+"H"
ch
Print vz$;
End Sub

Sub Vsc  'save current cursor position
ch
Print "7";
End Sub

Sub Vrc  'restore cursor position saved with Vsc
ch
Print "8";
End Sub

Sub Vbox(row,col,w,h,t) 'daw a box in "Terminal" font box chars
 Vat row,col
 If t=0 Then
  Print Chr$(218);String$(w-2,196);Chr$(191);
  Vat row+h,col
  Print Chr$(192);String$(w-2,196);Chr$(217);
  For i=1 To h-1
   Vat row+i,col:Print Chr$(179);
   Vat row+i,col+w-1:Print Chr$(179);
  Next
 Else
  Print Chr$(201);String$(w-2,205);Chr$(187);
  Vat row+h,col
  Print Chr$(200);String$(w-2,205);Chr$(188);
  For i=1 To h-1
   Vat row+i,col:Print Chr$(186);
   Vat row+i,col+w-1:Print Chr$(186);
  Next
 End If
End Sub

Sub Vl(row,col,l,t) 'draw a vertical or horizontal line to divide a box
Local i,m
m=t:t=Abs(t)
If m>0 Then 'vertical line
 vat row,col: If t=0 Then Print Chr$(194); Else Print Chr$(203);
 vat row+l,col: If t=0 Then Print Chr$(193); Else Print Chr$(202);
 vat row+1,col
 For i=1 To l-1
  vat row+i,col
  If t=0 Then Print Chr$(179); Else Print Chr$(186);
 Next
Else  'horizontal line
 vat row,col
 If t=0 Then
   Print Chr$(195)String$(w-2,196)Chr$(180)
 Else
   Print Chr$(204)String$(w-2,205)Chr$(185)
 End If
End If
End Sub

Sub Vatt(tatt$)  'set text attributes
ch
Select Case LCase$(tatt$)
Case "none"
Print "0m";
Case "b"
Print "1m";
Case "/b"
Print "22m";
Case "in"
Print "7m";
Case "/in"
Print "27m";
Case "u"
Print "4m";
Case "/u"
Print "24m";
End Select
End Sub

Sub Vfc(color$)  'set text foreground colour
Local vz$        'if we have a colour number 0-15 then use it
If Len(color$)<3 And Val(color$)<16 Then
vz$="38;5;"+color$+"m"
ch
Print vz$
Else
ch
Select Case LCase$(color$)  'otherwise use the colour name
Case "black"
Print "30m";
Case "red"
Print "31m";
Case "green"
Print "32m";
Case "yellow"
Print "33m";
Case "blue"
Print "34m";
Case "magenta"
Print "35m";
Case "cyan"
Print "36m";
Case "white"
Print "37m";
Case "grey","gray"
Print "90m";
End Select
End If
End Sub

Sub Vbc(color$)  'set text background colour
Local vz$        'if we have a colour number 0-15 then use it
If Len(color$)<3 And Val(color$)<16 Then
vz$="48;5;"+color$+"m"
ch
Print vz$
Else If Val(color$)=16 Then
vz$="48:2:115:115:115m"
ch
Print vz$
Else
ch
Select Case LCase$(color$) 'otherwise use the colour name
Case "black"
Print "40m";
Case "red"
Print "41m";
Case "green"
Print "42m";
Case "yellow"
Print "43m";
Case "blue"
Print "44m";
Case "magenta"
Print "45m";
Case "cyan"
Print "46m";
Case "white"
Print "47m";
Case "grey","gray"
Print "100m";
Case Else
Print "39m"; 'default background
End Select
End If
End Sub

Sub Vhelp
Print
Print "      The V VT100 library"
Print
Print "Vcls            clear screen"
Print "Vch             cursor home to top left"
Print "Vcdn n          move cursor down n lines"
Print "Vcup n          move cursor up n lines"
Print "Vcr n           move cursor rignt n characters"
Print "Vcl n           move cursor left n characters"
Print "Vat row col     move cursor to row,column"
Print "Vsc             save current cursor position"
Print "Vrc             restore cursor position saved by Vsc"
Print "Vbox x,y,w,h,t  draw a box width w height h at x,y using 'Terminal' font box characters."
Print "                t=0 for single line, 1 for double"
Print "Vl y,x,l,t      draw a horizotal or vertical line to divide a box."
Print "                l is length, t=0 for single line, 1 for double, negative for horizontal"
Print "Vatt n$         set text attributes to n$ - none b /b in /in low u /u"
Print "                (none,bold,inverse,low_intensity,underlined)"
Print "Vfc n$          set text/foreground colour by name or str$(number) 0-15"
Print "Vbc n$          set background colour by name or str$(number) 0-16 (16 is light grey)"
Print "                Colours names are black, red, green, yellow, blue, magenta, cyan, white, grey"
Print "ch              print the Escape sequence 'Chr$27 [' - used internally"
Print
End Sub

Sub ch
Print Chr$(27);"[";
End Sub