home *** CD-ROM | disk | FTP | other *** search
- ' 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
-