home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
World of Shareware - Software Farm 2
/
wosw_2.zip
/
wosw_2
/
QBAS
/
TERM10D.ZIP
/
TERM.BAS
next >
Wrap
BASIC Source File
|
1992-07-18
|
12KB
|
548 lines
' TERM.BAS: Public domain terminal package utilizes serial communication ports.
'
' Note: Compiling instructions;
' (Microsoft Basic Development System 7.1, Overlay Linker)
'
' BC TERM/S/O;
' LINK TERM,,,QBX/E;
'
Type RegType
AX As Integer
BX As Integer
CX As Integer
DX As Integer
BP As Integer
SI As Integer
DI As Integer
Flags As Integer
End Type
DefStr A-B
DefInt C-Z
Common Shared ANSI.TTY%, Baud%, Column, Echo, Flow, Init.Type
Common Shared Inregs As RegType, Linefeeds, Outregs As RegType, Port, Return$
Common Shared Row, Video.Page
Const False=0
Const True=Not False
Const Version$="v1.0-d"
Return$=Chr$(13)+Chr$(10)
Def FNport$
K$="Port#"+Mid$(Str$(Port),2)
K$=K$+"/Com#"+Mid$(Str$(Port+1),2)
K$=K$+":N,8,1"+Return$
FNport$=K$
End Def
Call Get.Video
Call Init.Term
Do
I$=Inkey$
Select Case Len(I$)
Case 1
I=Asc(I$)
If Echo Then
If I<>8 Then
Call Scrn(I$)
Endif
Endif
Inregs.AX=I
Call Driver(6)
If I=13 Then
If Echo Or Linefeeds Then
Call Scrn(Chr$(10))
Endif
Endif
Case 2
I=Asc(Right$(I$,1))
If ANSI.TTY% Then
Call Out.ANSI(I)
Endif
Call Function.Key(I)
End Select
Call Driver(5)
J=(Outregs.AX And &HFF)
Select Case J
Case 8
Call BackSpace
Case 10
If Linefeeds Then
Call Scrn(Chr$(10))
Endif
Case 12
Call Function.Key(46)
Case 13
Call Scrn(Return$)
Case 255
J=False
Case Else
Call Scrn(Chr$(J))
End Select
Loop
End
Sub BackSpace
Call Get.Cursor
If Column Then
Out$=Chr$(27)+"[D"
Call Scrn(Out$)
Out$=Chr$(32)
Call Scrn(Out$)
Out$=Chr$(27)+"[D"
Call Scrn(Out$)
Endif
End Sub
Sub Get.Video
Inregs.AX=&H0F00 ' Get and Store Video Page
Call Interrupt(&H10,Inregs,Outregs)
Video.Page=Outregs.BX
End Sub
Sub Out.Modem(I$)
For K=1 To Len(I$)
Inregs.AX=Asc(Mid$(I$,K,1))
Call Driver(6)
Next
End Sub
Sub Init.Term
Key Off
Locate 24,1,1
Out$=Chr$(27)+"[24;1H"
Call Scrn(Out$)
Call Parse.Command
Out$="Term "+Version$+Return$
Call Scrn(Out$)
Call Init.Driver
If Init.Type<>2 Then
Call Function.Key(35)
Call Pause.Second
Call Function.Key(31)
Endif
If Init.Type=3 Then
Call Function.Key(45)
Endif
Out$="Alt-Z: Display Keys"+Return$
Call Scrn(Out$)
Linefeeds=False
Echo=False
End Sub
Sub Init.Driver
Call Driver(1)
If Outregs.AX<>&H1954 Then
Out$="FOSSIL driver not installed."+Return$
Call Scrn(Out$)
End
Endif
Call Driver(9)
End Sub
Sub Pause.Second
T!=Timer+1
Do
Loop Until T!<=Timer
End Sub
Sub Driver(Var)
Select Case Var
Case 1
Inregs.AX=&H0400 ' Initialize Driver
Case 2
Inregs.AX=&H0600 ' Lower DTR
Case 3
Inregs.AX=&H0601 ' Raise DTR
Case 4
Select Case Baud% ' Change Baud
Case 3
Inregs.AX=&H0043
Case 6
Inregs.AX=&H0063
Case 12
Inregs.AX=&H0083
Case 24
Inregs.AX=&H00A3
Case 48
Inregs.AX=&H00C3
Case 96
Inregs.AX=&H00E3
Case 192
Inregs.AX=&H0003
Case 384
Inregs.AX=&H0023
End Select
Case 5
Inregs.AX=&H2000 ' Read Character
Case 6
Inregs.AX=Inregs.AX Or &H0B00 ' Send Character
Case 7
Inregs.AX=&H0A00 ' Purge Input Buffer
Case 8
Inregs.AX=&H0900 ' Purge Output Buffer
Case 9
If Flow Then ' Xon/Xoff, RTS/CTS Flow Control
Inregs.AX=&H0F0B
Else
Inregs.AX=&H0F00
Endif
End Select
Inregs.DX=Port ' Call Device Driver
Call Interrupt(&H14,Inregs,Outregs)
End Sub
Sub Out.ANSI(I)
Select Case I
Case 71 ' Home
J$=Chr$(27)+"[H"
Case 72 ' Up-Arrow
J$=Chr$(27)+"[A"
Case 75 ' Left-Arrow
J$=Chr$(27)+"[D"
Case 77 ' Right-Arrow
J$=Chr$(27)+"[C"
Case 79 ' End
J$=Chr$(27)+"[K"
Case 80 ' Down-Arrow
J$=Chr$(27)+"[B"
Case 82 ' Insert
J$=Chr$(22)
Case 83 ' Delete
J$=Chr$(127)
Case 115 ' Control-Left
J$=Chr$(1)
Case 116 ' Control-Right
J$=Chr$(6)
Case 118 ' Control-PageDown
J$=Chr$(3)
Case 132 ' Control-PageUp
J$=Chr$(18)
Case Else
J$=""
End Select
Call Out.Modem(J$)
End Sub
Sub Parse.Command
C$=Command$
If C$="" Then
Call Term.Usage
Endif
L=False
Do Until C$=""
M=Instr(C$," ")
If M Then
D$=Left$(C$,M-1)
C$=Mid$(C$,M+1)
Else
D$=C$
C$=""
Endif
L=L+1
Select Case L
Case 1
Select Case D$
Case "1"
Port=0
Case "2"
Port=1
Case "3"
Port=2
Case "4"
Port=3
Case Else
Call Term.Usage
End Select
Case 2
Select Case D$
Case "3"
Baud%=3
Case "12"
Baud%=12
Case "24"
Baud%=24
Case "48"
Baud%=48
Case "96"
Baud%=96
Case "192"
Baud%=192
Case "384"
Baud%=384
Case Else
Call Term.Usage
End Select
Case 3
Select Case D$
Case "I"
Init.Type=1
Case "N"
Init.Type=2
Case "X"
Init.Type=3
Case Else
Call Term.Usage
End Select
Case Else
Call Term.Usage
End Select
Loop
End Sub
Sub Function.Key(I)
Call Get.Cursor
If Column Then
Call Scrn(Return$)
Endif
Select Case I
Case 30 ' Alt-A
Out$="Auto Answer"+Return$
Call Scrn(Out$)
Call Out.Modem("ATA"+Chr$(13))
Case 46 ' Alt-C
Out$="Clear Screen"+Return$
Call Scrn(Out$)
Out$=Chr$(27)+"[2J"
Call Scrn(Out$)
Case 32 ' Alt-D
Out$="Enter number: "
Call Scrn(Out$)
I$=""
P$=""
Do Until I$=Chr$(13)
If Len(I$)=1 Then
If I$=Chr$(8) Then
If Len(P$) Then
Call BackSpace
P$=Left$(P$,Len(P$)-1)
Endif
Else
If Asc(I$)>=32 And Asc(I$)<=127 Then
P$=P$+I$
Call Scrn(I$)
Endif
Endif
Endif
I$=Inkey$
Loop
Call Scrn(Return$)
Out$="Dial Out: "+P$+Return$
Call Scrn(Out$)
Call Out.Modem("ATDT"+P$+Return$)
Case 18 ' Alt-E
Echo=Not Echo
Out$="Echo: "
If Echo Then
Out$=Out$+"on."
Else
Out$=Out$+"off."
Endif
Out$=Out$+Return$
Call Scrn(Out$)
Case 33 ' Alt-F
Flow=Not Flow
Call Driver(9)
Out$="Flow Control: "
If Flow Then
Out$=Out$+"on."
Else
Out$=Out$+"off."
Endif
Out$=Out$+Return$
Call Scrn(Out$)
Case 34 ' Alt-G
Out$="Sending ANSI Report."+Return$
Call Scrn(Out$)
Out$=Chr$(27)+"[6n"
Call Out.Modem(Out$)
Out$=""
T!=Timer+1
Do
Call Driver(5)
J=(Outregs.AX And &HFF)
If J<>255 Then
Out$=Out$+Chr$(J)
Endif
Loop Until T!<=Timer
Got.ANSI=False
If Left$(Out$,1)=Chr$(27) Then
Out$=Mid$(Out$,2)
If Left$(Out$,1)="[" Then
Out$=Mid$(Out$,2)
While Left$(Out$,1)>="0" And Left$(Out$,1)<="9"
Out$=Mid$(Out$,2)
Wend
If Left$(Out$,1)=";" Then
Out$=Mid$(Out$,2)
While Left$(Out$,1)>="0" And Left$(Out$,1)<="9"
Out$=Mid$(Out$,2)
Wend
If Left$(Out$,1)="R" Then
Got.ANSI=True
Endif
Endif
Endif
Endif
If Got.ANSI=False Then
For I=1 To 4
Out$=Chr$(8)+" "+Chr$(8)
Call Out.Modem(Out$)
Next
Out$="Remote does not have ANSI."
Else
Out$="Remote does have ANSI."
Endif
Out$=Out$+Return$
Call Scrn(Out$)
Case 35 ' Alt-H
Out$="Drop DTR"+Return$
Call Scrn(Out$)
Call Driver(3)
Call Driver(2)
Call Driver(7)
Call Driver(8)
Call Pause.Second
Call Driver(3)
Call Driver(9)
Case 38 ' Alt-L
Linefeeds=Not Linefeeds
Out$="Linefeeds: "
If Linefeeds Then
Out$=Out$+"on."
Else
Out$=Out$+"off."
Endif
Out$=Out$+Return$
Call Scrn(Out$)
Case 25 ' Alt-P
Out$="Enter port(1-4): "
Call Scrn(Out$)
I$=""
While I$=""
I$=Inkey$
Wend
Call Scrn(I$)
Call Scrn(Return$)
X=Val(I$)
X=X-1
X=Int(X)
If X=0 Or X=1 Or X=2 Or X=3 Then
Port=X
Out$=FNport$
Call Scrn(Out$)
Call Init.Driver
Else
Beep
Endif
Case 31 ' Alt-S
Out$="Set Baud:"+Str$(Baud%*100)+Return$
Call Scrn(Out$)
Call Driver(4)
Call Driver(9)
Case 20 ' Alt-T
ANSI.TTY%=Not ANSI.TTY%
If ANSI.TTY% Then
Out$="ANSI TTY: on"
Else
Out$="ANSI TTY: off"
Endif
Out$=Out$+Return$
Call Scrn(Out$)
Case 45 ' Alt-X
Out$="Exit"+Return$
Call Scrn(Out$)
End
Case 44 ' Alt-Z
Out$="Help"+Return$
Call Scrn(Out$)
Call Display.Keys
End Select
End Sub
Sub Display.Keys
Out$=FNport$
Call Scrn(Out$)
Out$="Alt-A: Auto Answer"+Return$
Call Scrn(Out$)
Out$="Alt-C: Clear Screen"+Return$
Call Scrn(Out$)
Out$="Alt-D: Dial Out"+Return$
Call Scrn(Out$)
Out$="Alt-E: Echo"+Return$
Call Scrn(Out$)
Out$="Alt-F: Flow Control"+Return$
Call Scrn(Out$)
Out$="Alt-G: Get Remote ANSI"+Return$
Call Scrn(Out$)
Out$="Alt-H: Drop DTR"+Return$
Call Scrn(Out$)
Out$="Alt-L: Linefeeds"+Return$
Call Scrn(Out$)
Out$="Alt-P: Port"+Return$
Call Scrn(Out$)
Out$="Alt-S: Set Baud"+Return$
Call Scrn(Out$)
Out$="Alt-T: ANSI Terminal"+Return$
Call Scrn(Out$)
Out$="Alt-X: Exit Term"+Return$
Call Scrn(Out$)
End Sub
Sub Term.Usage
Out$="TERM "+Version$+" usage:"+Return$
Call Scrn(Out$)
Out$=" Term <port> <baud> <boot>"+Return$
Call Scrn(Out$)
Out$=" <port>=1, 2, 3, or 4."+Return$
Call Scrn(Out$)
Out$=" <baud>=3, 12, 24, 48, 96, 192, or 384."+Return$
Call Scrn(Out$)
Out$=" <boot>=I (do init),"+Return$
Call Scrn(Out$)
Out$=" N (no init),"+Return$
Call Scrn(Out$)
Out$=" X (init & exit)."+Return$
Call Scrn(Out$)
End
End Sub
Sub Get.Cursor
Inregs.AX=&H0300 ' Get Current Cursor Row and Column
Inregs.BX=Video.Page
Call Interrupt(&H10,Inregs,Outregs)
Row=Outregs.DX\256
Column=Outregs.DX And &H00FF
End Sub
Sub Scrn(Var$)
For Count=1 To Len(Var$)
Call Get.Cursor
Char=Asc(Mid$(Var$,Count,1))
If Row=23 And Char=10 Then
Count=Count+1
Else
If Row=23 Then
If Char=13 Or Column=79 Then
Inregs.AX=&H0601 ' Page Scroll
Inregs.BX=&H0700
Inregs.CX=&H0000
Inregs.DX=&H174F
Call Interrupt(&H10,Inregs,Outregs)
Inregs.AX=&H0200 ' Set Cursor 24,1
Inregs.BX=Video.Page
Inregs.DX=&H1700
Call Interrupt(&H10,Inregs,Outregs)
Endif
Endif
Inregs.AX=&H0600 ' Character to Standard Out
Inregs.DX=Char
Call Interrupt(&H21,Inregs,Outregs)
Endif
Next
End Sub