home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Columbia Kermit
/
kermit.zip
/
pdp11
/
k11rtc.mac
< prev
next >
Wrap
Text File
|
2020-01-01
|
19KB
|
665 lines
; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
; !!!!!
; !!!!! The file is NO longer used.
.title k11con terminal emu
.ident /8.0.01/
.psect
r$rt11 = 1
; Brian Nelson 29-Dec-83 16:00:09 initial version
; Brian Nelson 23-Jan-84 16:19:49 RSX mods
; Brian Nelson 16-Apr-84 08:01:57 Merge Bob Denny's changes for RSX
; John Pieper 840607 Fix TC.DLU for autocall modems (RSX)
; John Pieper 840614 Attach lun.ti (even though slaved!)
; Brian nelson 840616 Don't change TC.DLU, does not work for
; my system at any rate.
.iif ndf, r$rt11, r$rt11 = 0 ; assume not rt11 today
.include /IN:K11MAC.MAC/
.iif ndf ,k11inc ,.error ; missing INCLUDE for K11MAC.MAC
locmod = ter$cc ! ter$bi ; for the 11's console
remmod = ter$cc
; note: vt125's are a problem as they don't send xon when you type one
.psect $code
.sbttl connect code for kermit
.enabl gbl
.enabl lsb
doconn::message <You have linked in obsolete CONNECT code>,cr
tstb ttname ; insure that a device name is set
bne 1$ ; ok
message <You must first define an output port:>,cr ;jfp 840607
message <Use the SET LINE command for this.>,cr
return
1$: message <Connecting to line > ; Print the line and speed out
print #ttname ; the link name
calls ttspee ,<#ttname> ; get the speed now
tst r0 ; not if we can't get it
ble 5$ ; yes, do not print 0 or -1 baud
message < at > ; and the speed
sub #10 ,sp ; try to format the response a little
mov sp ,r1 ; allocate a buffer and point to it
deccvt r0,r1,#4 ; convert to decimal, 4 wide
print r1 ,#4 ; print it
add #10 ,sp ; pop the buffer
message < baud>,cr ; and finish off the message
5$: message < Type CTRL >
clr -(sp) ; allocate a text buffer
bisb conesc ,(sp) ; get it
add #100 ,(sp) ; convert it back to printable
mov sp ,r0 ; point to it now
print r0 ,#1 ; at last
tst (sp)+ ; pop the buffer
message < and then C to return to command level>,cr
call getsys ; get the exec we are running today
cmpb r0 ,#sy$rsts ; rsts today ?
bne 10$ ; no
call dorsts ; yes, call the correct routine
br 100$
10$: cmpb r0 ,#sy$rt
bne 20$
call dort11
br 100$
20$: call dorsx
br 100$
100$: return
.dsabl lsb
global <conesc ,getsys ,ttcons ,ttname ,lun.co ,lun.ti>
.sbttl do the connect command for RSTS/E
; This is the module that handles the CONNECT command for a Kermit
; running in local mode on a RSTS or RT11 system. The method used is
; simply to try a read without stall on the remote's line, echo to
; the user's terminal if there was data, read without stall on the
; users local terminal and send that data to the remote if there was
; data to be read. If neither terminal had data to get, then Kermit
; will suspend itself for 1 second. For RT11, we will never stall.
; Also, for RT11, whenever we get 20 (8) characters, we will send
; the remote system an XOFF so we can catch up on the input due to
; the RT MT service overhead for single character i/o.
chcount = 0
exectyp = 2
needxon = 4
locsize = 10
dort11:
dorsts: sub #locsiz ,sp ; allocate local r/w data
mov sp ,r4 ; and a pointer to it please
clr -(sp) ; allocate single character buffer
mov sp ,r3 ; and point to it please
call getsys ; get system type
movb r0 ,exectyp(r4) ; save system type in exectype(r4)
mov #10 ,chcount(r4) ; count down for rt11 to do an XOFF
clr needxon(r4) ; don't need to send xon yet
calls noecho ,<#ttname> ; don't want echoing please
calls gttnam ,<#ttcons> ; get the 11's terminal name
calls ttyini ,<#ttcons,#lun.co,#locmod>
tst r0 ; did it work
bne 5$ ; no, exit with error
calls ttysav ,<#ttcons> ; save terminal settings
calls ttyset ,<#ttcons> ; set terminal up
tst r0 ; did the initialization work ?
bne 5$ ; no, exit
calls ttyini ,<#ttname,#lun.ti,#remmod>
tst r0 ; did the initialization work ?
bne 5$ ; no, exit
calls ttyset ,<#ttname> ; ok, set some useful things up
br 10$
5$: jmp 90$
10$: .iif ne,r$rt11 ,call contrp ; special ^C things for RT11
20$: clr r2 ; assume a short nap is needed
calls xbinrea ,<#lun.ti,#-1> ; try to get a charater from remote
call errchk ; insure error is correct one
tst r0 ; did it work ?
bne 30$ ; no, send an XON to the remote system
clrpar r1 ; yes, drop any aprity bits please
movb r1 ,@r3 ; yes, get the character and print
cmpb r1 ,#'S&37 ; /48/ Xoff?
beq 24$ ; /48/ Yes, ignore
calls binwri ,<r3,#1,#lun.co>; it out on the local terminal
24$: call dumplo ; dump to a log file perhaps
mov sp ,r2 ; and say we don't want to sleep
dec chcount(r4) ; is it time to do a RT11 XOFF ?
bne 40$ ; no, wait a while then
cmpb exectype(r4),#sy$rt ; if not rt11, then skip the xoff
bne 25$
mov #2 ,needxon(r4) ; will need to send xon later
call sxoff ; yes, send an xoff please
25$: mov #10 ,chcount(r4) ; and reset the character counter
br 40$ ; and look for local terminal input
30$: cmpb exectype(r4),#sy$rt ; if not rt, then skip the xon
bne 40$ ; not rt
tst needxon(r4) ; really send an xon today?
beq 40$ ; no
dec needxon(r4) ; don't overdo sending xon's please
call sxon ; no data, send an xon please
40$: calls xbinrea ,<#lun.co,#-1> ; see if any input is pending from
tst r0 ; the local terminal
bne 70$ ; no
movb r1 ,@r3 ; yes, get it and send it to the
bic #^C177 ,r1 ; insure no high bits are set.
cmpb r1 ,conesc ; other system unless it's the escape
bne 50$
calls xbinrea ,<#lun.co,#20> ; char. get the next one please
tst r0 ; but wait for it. did it work ?
bne 70$ ; no
bic #^C177 ,r1 ; insure no high bits are set.
cmpb r1 ,conesc ; really send the escape ?
beq 50$ ; yes
call concmd ; yes, do the command
tst r0 ; exit ?
bne 100$ ; yes, bye
br 70$ ; no, next please
50$: setpar @r3 ,@r3 ; insure correct outgoing parity now
calls binwri ,<r3,#1,#lun.ti>; the data is for the remote system
tst duplex ; full or half duplex connection?
beq 60$ ; full
calls binwri ,<r3,#1,#lun.co>; half, send it back please
60$: mov sp ,r2 ; flag that no wait is needed
70$: tst r2 ; should we take a short nap ?
bne 80$ ; no
cmpb exectype(r4),#sy$rt ; don't wait if rt11
beq 80$ ; yep, it's rt11 today
calls suspend ,<#1,#0> ; yes, sleep 1 second for RSTS/E
80$: jmp 20$ ; and back for more
90$: direrr r0 ; problems in getting the connection
100$: tst (sp)+ ; pop the one byte buffer and exit
calls ttyfin ,<#ttcons,#lun.co>
calls ttyrst ,<#ttcons> ; restore terminal settings
calls ttyfin ,<#ttname,#lun.ti>
.iif ne,r$rt11 ,call conrst ; for RT11 control C junk
add #locsiz ,sp ; pop local r/w data
return ; bye
.sbttl RSX Connect code - Rev. Notes
;
; This is the terminal emulator for Kermit-11 on native RSX. It was
; rewritten because the original version developed on the RSTS emulator
; was unsuitable for native RSX. It wouldn't work reliably at baud
; rates over 1200 on a moderately busy system.
;
;
; Bob Denny 10-Mar-84
;
; NOTE: vt125's are a problem as they don't send xon when you type one
;
; John Pieper 840607 fix for connecting to an autocall modem
; Note: Autocall modems are a pain under RSX.
; If the TTnn: is set /remote ,
; the Terminal Handler will NOT let you talk to it until it senses
; DSR . This logic is based on the assumption that a remote line
; will be used only for incoming calls.
; If the TTnn: is set /noremote ,
; then you can talk to it, but the Terminal Handler will drop DTR .
; Thus, unless your modem has a local DTR override, it thinks
; that you are not connected to it.
; Solution: RSX-11m V4.1 allows TC.DLU = 2
; which holds DTR but allows you to talk without having DSR .
; Note -- this mechanism is NOT available from MCR level.
; Further, TC.DLU must be reset to 1 when KERMIT is done or else
; the system will not recognize the TT as really being remote --
; things such as .IFF <LOCAL> in an indirect command file will fail.
;
; John Pieper 840614 Slave Terminal Fix!
; Due to a change in the Terminal Handler, a slaved terminal must also
; be attached or else unsolicited input will NOT be kept in the
; typeahead buffer. (See Software Dispatch Dec. 1983).
; Terminal Emulation sure works better with this fix !!
.sbttl RSX Connect code - Definitions
;
.if eq ,r$rt11
.iff
dorsx:: return
.ift ; keep some sanity for the rt assembler
ef.rem = 14. ; Remote event flag
em.rem = 020000 ; Remote event flag mask
ef.loc = 15. ; Local event flag
em.loc = 040000 ; Local event flag mask
;
; LOCAL IMPURE DATA
;
.psect $idata rw,d,lcl,rel,con
;
; Characteristics buffers
;
; Note: TC.SLV must be second in the list BDN 18-Apr-84 10:47:18
;
savti: .byte TC.FDX,0,TC.SLV,0 ; Original setting for remote
savco: .byte TC.FDX,0 ; Original setting for local
fdxchr: .byte TC.FDX,1,TC.SLV,1 ; Change to FDX if required
; Buffers for Autocall modem fix
savti2: .byte TC.DLU,0,TC.ABD,0 ; TC.ABD maybe not needed - can't hurt
sizti2 = .-savti2 ; in case we ever add more functions
fixti2: .byte TC.DLU,2,TC.ABD,0 ; values we need for a modem
rtab: .byte TC.TBF,0 ; #chars in remote typeahead
ltab: .byte TC.TBF,0 ; #chars in local typeahead
.mcall qio$ qiow$
;
; Oft' used QIO DPB's
;
remread:
qio$ <io.rne!tf.ral>,lun.ti,ef.rem,,remios,,<rembf,1>
locread:
qio$ <io.rne!tf.ral>,lun.co,ef.loc,,locios,,<locbf,1>
remwrite:
qiow$ io.wal,lun.ti,ef.loc,,,,<locbf,1>
locwrite:
qiow$ io.wal,lun.co,ef.rem,,,,<rembf>
locech:
qiow$ io.wal,lun.co,ef.rem,,,,<locbf,1>
remtest:
qiow$ sf.gmc,lun.ti,ef.rem,,remios,,<rtab,2>
remtab:
qiow$ <io.rne!tf.ral>,lun.ti,ef.rem,,remios,,<rembf+1>
;
; Other stuff
;
efbuf: .blkw 4 ; Event flags buffer
rembf: .blkb 256. ; Remote data buffer
locbf: .blkb 256. ; Local data buffer
eseen: .word 0 ; 1 = escape seen
locios: .word 0,0
remios: .word 0,0
.psect $code
.endc ; for r$rt11 = 0
; .sbttl RSX Connect Code -- Setup
.if eq ,r$rt11
.ift
.mcall qio$ qiow$ qiow$s dir$ wtlo$s
.mcall alun$s dscp$s encp$s exit$s rdaf$s srex$s
.sbttl Connect code for RSX kermit
;
; D O C O N N - Connect for native RSX
;
; Assumes that the remote device has been attached via the
; SET LINE command and its "asslun()" routine.
.enabl lsb
dorsx: clr eseen ; must do this for next connect cmd
calls ttpars ,<#ttname> ; Get remote unit number
srex$s #rsxabo ; abort perhaps
alun$s #lun.ti,r1,r0 ; Assign it
alun$s #lun.co,#"TI,#0 ; Assign our local terminal
tst proflg
bne 5$ ; yes, don't try to attach xk0:
qiow$s #io.att,#lun.ti,#ef.rem ; and now Attach it. (jfp 840614)
5$:
;
; Save local and remote's /{NO}FULLDUPLEX settings, and
; set them to /FULLDUPLEX. Then DISABLE CHECKPOINTING
; so asynchronous buffered I/O is disabled and true full
; duplex communication can take place.
; BDN 18-Apr-84 10:41:51 Also force slave mode
;
qiow$s #sf.gmc,#lun.ti,#ef.rem,,,,<#savti,#4> ; This is crude ...
qiow$s #sf.gmc,#lun.co,#ef.loc,,,,<#savco,#2>
qiow$s #sf.smc,#lun.ti,#ef.rem,,#remios,,<#fdxchr,#4>
qiow$s #sf.smc,#lun.co,#ef.loc,,#remios,,<#fdxchr,#2>
; If lun.ti is currently /noremote (hard wire connection), leave it.
; Notify user to make sure correct TT number.
; If it is /remote , fix it for autocall.
tst proflg
bne 10$
qiow$s #sf.gmc,#lun.ti,#ef.rem,,,,<#savti2,#sizti2>
tstb savti2+1 ; currently /remote ?
bne 6$ ; Yes
message <Note: This is NOT a Remote line.>,cr
br 10$ ; that's all we do if local.
6$:
;- qiow$s #sf.smc,#lun.ti,#ef.rem,,,,<#fixti2,#sizti2> ; fix it.
10$: dscp$s ; **DISABLE CHECKPOINTING**
.sbttl RSX Connect code - Remote Input
;
; Prime incoming and outgoing streams
;
dir$ #remread
dir$ #locread
;
; Main loop - Handle incoming and outgoing streams
; until escape character is detected on outgoing (local KB)
;
20$: wtlo$s 0,#<em.loc!em.rem> ; Wait for a character on either
rdaf$s #efbuf ; Read the event flags
;
; Handle character(s) on incoming stream
;
bit #em.rem,efbuf+0 ; Anything coming in?
beq 40$ ; (no)
movb remios ,r5 ; get the status of the read
call iocheck ; and check for allowable errors
bcs 100$ ; fatal (likely was IE.DNR)
dir$ #remtest ; More in typeahead?
movb remios ,r5 ; get the status of the read
call iocheck ; and check for allowable errors
bcs 100$ ; fatal (likely was IE.DNR)
clr r0 ; m+ may have a lot ready to get
bisb rtab+1,r0 ; r0 = # in typeahead
beq 30$ ; (no)
mov r0,remtab+q.iopl+2 ; Set # to read to drain
dir$ #remtab ; Read 'em in
;- movb remios ,r5 ; get the status of the read
;- call iocheck ; and check for allowable errors
;- bcs 100$ ; fatal (likely was IE.DNR)
30$: inc r0 ; r0 = total # chars to show
mov r0,locwrite+q.iopl+2 ; Write out this many
dir$ #locwrite
mov locwrite+q.iopl+0,r2 ; now dump junk to logging file
35$: movb (r2)+ ,r1 ; a character at a time
call dumplo ; simple to do
sob r0 ,35$ ; next please
dir$ #remread ; Re-issue read
.sbttl RSX Connect code - Local Input
;
; Handle characters on outgoing (Local input) stream
; do this without fast-drain (yet)
;
40$: bit #em.loc,efbuf+0 ; Anything typed locally?
beq 20$ ; (no, loop back)
movb locbf,r1 ; r1 = just typed character
bic #^C177,r1 ; drop bit 7 if mark set (BDN)
cmpb r1,conesc ; Console escape?
bne 50$ ; (no)
tst eseen ; Already seen one escape?
bne 60$ ; (yes, send this one)
inc eseen ; Yes, note it for now
br 70$ ; And go read again
50$: tst eseen ; Character following conesc?
beq 60$ ; (no, send it)
call concmd ; Yup, process it
tst r0 ; Exit CONNECT mode?
bne 100$ ; (yes, clean up etc.)
60$: clr eseen ; Assure escape flag reset
setpar locbf ,locbf ; set correctr outgoing parity
dir$ #remwrite ; Transmit character to remote
tst duplex ; ibm type things today?
beq 70$ ; no
dir$ #locech ; need half duplex duplex ?
70$: dir$ #locread ; Re-issue local read
jmp 20$ ; Loop back
.sbttl RSX Connect code - Clean Up and Exit
;
; Exit CONNECT mode
;
100$: call rsxrst ; restore terminal settings
encp$s ;**ENABLE CHECKP**
return
rsxabo: call rsxrst ; called via requested exit
srex$s ; disable further exits
exit$s ; bye
rsxrst: qiow$s #io.kil,#lun.ti,#ef.rem ; Kill incoming I/O
qiow$s #io.kil,#lun.co,#ef.loc ; Kill incoming I/O
qiow$s #sf.smc,#lun.ti,#ef.rem,,,,<#savti,#4> ; Restore lines
qiow$s #sf.smc,#lun.co,#ef.loc,,,,<#savco,#2>
qiow$s #sf.smc,#lun.ti,#ef.rem,,,,<#savti2,#sizti2> ;jfp
qiow$s #io.det,#lun.ti,#ef.rem ; De-Attach remote line
return
iocheck:mov r0 ,-(sp) ; insure this is saved
tstb r5 ; sucessesful read qio ?
bpl 180$ ; yes
scan r5 ,#200$ ; allowable error code ?
tst r0 ; well
bne 180$ ; yes, let it through
neg r5 ; make > 0 for direrr macro
direrr r5 ; simple
sec ; failure, exit to command level
br 190$ ; bye
180$: clc ; success, stay in connect code
190$: mov (sp)+ ,r0 ; restore old r0 please
return
200$: .byte IE.BCC ,IE.DAO ,IE.IES ,IE.NOD ,IE.PES ,IE.VER ,0
.even
global <conesc ,ttcons ,ttname ,lun.co ,lun.ti>
.dsabl lsb
.endc ; for r$rt11 = 0
.sbttl errchk check for allowable errors on the link
errchk: mov r0 ,-(sp) ; save the error code
cmpb r0 ,#nodata ; check error codes out please
beq 210$ ; that is what we wanted (no data)
tst r0 ; any other kind of error ?
beq 210$ ; no
calls syserr ,<r0,#errtxt> ; yes, get the error text please
strlen #errtxt ; ok
add #errtxt ,r0 ; get the length, point to the end
movb #cr ,(r0)+ ; and stuff a carriage return and
movb #lf ,(r0)+ ; a line feed in
clrb @r0 ; insure .asciz please
strlen #errtxt ; the length once again
calls binwri ,<#errtxt,r0,#lun.co> ; try to print error on TI
tst r0 ; did that also fail ?
beq 210$ ; no
mov @sp ,r0 ; yes
direrr r0 ; yes, print on default TI: lun
210$: mov (sp)+ ,r0 ; pop saved r0 and exit
return ; bye
global <errtxt ,lun.co ,nodata>
.sbttl concmd terminal emulation escape commands
concmd: save <r1>
bicb #^C177 ,r1
scan r1,#200$ ; look for a match here
asl r0 ; word offsets
jsr pc ,@210$(r0) ; dispatch to the correct routine
unsave <r1>
return
200$: .byte 'C&137 ,'c!40 ; drop connection ctrl \ C
.byte 'I&137 ,'i!40 ; init the line
.byte 'Q&137 ,'q!40 ; quit logging but leave file open
.byte 'R&137 ,'r!40 ; resume logging if file is open
.byte 'X&137 ,'X!40 ; control Q and then thats all
.byte 'B&137 ,'b!40
.byte '? ,177 ; help, rub for send break
.byte 'H&137 ,'h!40
.byte 0
.even
210$: .word con.$ ; unknown escape command
.word con.c ,con.c ; drop connection
.word con.i ,con.i ; get modems attention
.word con.q ,con.q ; turn console logging off
.word con.r ,con.r ; turn it back on please
.word con.x ,con.x ; send XON
.word con.br ,con.br ; break
.word con.hl ,con.br ; print out commands
.word con.hl ,con.hl ; help
con.$: calls binwri ,<#200$,#1,#lun.co> ; beep at user
clr r0
return
200$: .byte 'G&37 ; [BEL]
.even
con.c: mov sp ,r0 ; set flag to exit connect code
return ; simple
con.i: calls ttydtr ,<#ttname> ; try to force DTR up on the line
clr r0
return
con.q: bic #log$co ,trace ; turn off console logging
clr r0
return
con.r: bit #log$op ,trace ; if the file is open do it
beq 100$ ; no
bis #log$co ,trace ; yes, enable this
100$: clr r0
return
con.x: calls binwri ,<#200$,#1,#lun.ti>; insure a control Q goes down
calls ttxon ,<#ttname>
clr r0
return
200$: .byte 'Q&37
.even
con.br: calls senbrk ,<#ttname,#lun.ti>
clr r0
return
con.hl: strlen #200$
calls binwri ,<#200$,r0,#lun.co>
clr r0
return
200$: .ascii /B Try to send a break to the remote/<cr><lf>
.ascii /C Connect back to the local Kermit-11/<cr><lf>
.ascii /I Drop and raise DTR (for RSTS only)/<cr><lf>
.ascii /Q Quit console logging. See SET LOG/<cr><lf>
.ascii /R Resume console logging. See SET LOG/<cr><lf>
.ascii /X Send XON and cancel any active XONs/<cr><lf>
.asciz /RUBOUT Try to fake a break to the remote/<cr><lf>
.ascii /? Print this message/<cr><lf>
.byte 0
.even
.sbttl dump i/o to a log file ?
dumplo: bit #log$co ,trace ; is this enabled ?
beq 100$ ; no
bit #log$op ,trace ; is it open
beq 100$ ; no
save <r0,r1> ; yes, save temps please
mov r1 ,r0 ; call simple version
mov #lun.lo ,r1 ; unit number
call putcr0 ; thats it folks
unsave <r1,r0>
100$: return
sxon: tst conflow
beq 100$
calls binwri ,<#xon,#1,#lun.ti>
100$: return
sxoff: tst conflow
beq 100$
calls binwri ,<#xoff,#1,#lun.ti>
100$: return
.save
.psect $pdata
xon: .byte 'Q&37
xoff: .byte 'S&37
.even
.restore
global <lun.lo ,putcr0 ,trace ,conflow>
.end