Not all projects require an LCD panel but a simple console connection can often benefit from a bit more than a dumb scrolling display.
The following Subs and Functions provide functionality similar to that found on personal computers prevalent in the 80s. Console displays can be made quite pleasant with this output and hark back to the character based screens of early PCs.
At() - Screen positioning uses the "At" function for cursor positioning. It uses less program space and is arguably more intuitive than a stand-alone LOCATE command. Note that because it produces a string, strictly a ; or + should be used when printing following output, but because of a quirk in how lines are parsed when printing, it can be omitted resulting in the pleasing.
Print At(10,10) "fred"
VTKey$() - Key Scanning for non-ASCII keys (Function keys, Home, PageUp etc.) is a real pain in the neck. The Function VTKey$() can be used to replace Inkey$ and will return either the ASCII value of the key pressed or a predictable three-letter token for any of the special keys.
Your console emulator must support ANSI screen/keyboard codes - usually defined as VT52, VT100 etc. emulation. Personally I use PuTTY.
DependanciesExample Usage
Option Base 0
InitVTKeys
Main:' just something to demonstrate usage
Clr ' clear the screen
For n=1 To 25 ' print out a diagonal line of numbers
Print At(n,n);Str$(n)
Next
Window 6,10 ' define window
For n=1 To 25 ' demonstrate the contained area of the screen
Print n
Next
Window 1,25
Clr
a$=StrEdit$("Fred",10,10,60)
? At(1,1);a$
The Code
Function At(v As Integer,h As Integer) As String
At=Chr$(27)+"["+Str$(v)+";"+Str$(h)+"H"
End Function
Sub Clr
Window 1,25' redefine the whole screen
Print Chr$(27)+"[2J";
End Sub
Sub Window(Pt As Integer, Pb As Integer)
'defines a window from line t to line b and positions the cursor in the start of it
'Clr and At still work on the whole screen. Only when scrolling (or CRLF) enteres the
'window does it capture the cursor. Note 0<Pt<Pb is enforced by the console emulator
Print Chr$(27)+"["+Str$(Pt)+";"+Str$(Pb)+"r"+At(Pt,1);
End Sub
Function VTKey$() ' replaces Inkey$ and will return the character pressed or the special token _xx
Local a$
VTKey$=Inkey$
Pause 25 ' give the remaining sequence (if any) time to arrive. Any less than 25 can give mis-reads of expanded tokens
Do
a$=Inkey$:If a$="" Then Exit Do ' jump out when we are scanning ""
VTKey$=VTKey$+a$ ' build up the character codes
Loop
If Len(VTKey$)>1 Then VTKey$=ExpandKey(VTKey$)
End Function
Function ExpandKey(c$) As String' called from VTKey$
Local n
For n=0 To Kct
If KCode$(n)=c$ Then ExpandKey=KTkn$(n):Exit Function
Next
ExpandKey=""
End Function
Sub InitVTKeys
Dim Integer Kct
Local x$
Local Integer q
KeyData:
' <esc> [
Data 27,91,68,0,"_LT"
Data 27,91,67,0,"_RT"
Data 27,91,65,0,"_UP"
Data 27,91,66,0,"_DN"
Data 27,91,49,126,0,"_HM"
Data 27,91,50,126,0,"_IN"
Data 27,91,51,126,0,"_DL"
Data 27,91,52,126,0,"_ED"
Data 27,91,53,126,0,"_PU"
Data 27,91,54,126,0,"_PD"
Data 27,91,55,126,0,"_HM"
Data 27,91,56,126,0,"_ED"
Data 27,91,49,49,126,0,"_F1"
Data 27,91,49,50,126,0,"_F2"
Data 27,91,49,51,126,0,"_F3"
Data 27,91,49,52,126,0,"_F4"
Data 27,91,49,53,126,0,"_F5"
Data 27,91,49,55,126,0,"_F6"
Data 27,91,49,56,126,0,"_F7"
Data 27,91,49,57,126,0,"_F8"
Data 27,91,50,48,126,0,"_F9"
Data 27,91,50,49,126,0,"_FA"
Data 27,91,50,51,126,0,"_FB"
Data 27,91,50,52,126,0,"_FC"
Data 255
Restore KeyData 'determine size of the key table
Do
Read q
If q=255 Then Exit Do
If q=0 Then Kct=Kct+1:Read x$
Loop
Dim KCode$(Kct-1) Length 5
Dim KTkn$(Kct-1) Length 3
Restore KeyData
Kct=0
Do
Read q
If q=255 Then Kct=Kct-1:Exit Do ' adjust Kct to point at top of key array
If q=0 Then
Read KTkn$(Kct)
Kct=Kct+1
Else
KCode$(Kct)=KCode$(Kct)+Chr$(q)
EndIf
Loop
'Here KCode$(n) is the key sequences we get from the keypress
' KTkn$(n) is the shorthand code name _xx
End Sub
See Also:
String editing on-screen for VT compatible Terminals