home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Columbia Kermit
/
kermit.zip
/
pdp11
/
k11rxx.mac
< prev
next >
Wrap
Text File
|
2020-01-01
|
12KB
|
425 lines
.title k11rxx alter rsx connect terminal emu
; 16-Jul-85 15:13:03 BDN
;
; SET RSX CON BIN
;
; Alternate internal flow control and multibuffering for RSX11M/M=
; If it turns out that this option work ok, then we will replace
; Bob's code with this. RSX is a P A I N with it's ttdrv.
.ident /8.0.02/
.psect
.include /IN:K11MAC.MAC/
.iif ndf ,k11inc ,.error ; missing INCLUDE for K11MAC.MAC
.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 !!
;
; Rich Seibel 850605 Double buffered I/O
; It still didn't work at 4800 baud. Added double buffering
; of the remote to local data. Flow control was not reliable,
; so added internal flow control (XON/XOFF).
;
; Brian Nelson 16-Jul-85 15:14:37 Insure XON sent iff XOFF sent
; Split from mainline code into overlay
; via SET RSX CON BIN
; The other mod re SET RSX TC.DLU is NOT
; in this module as of yet. wait........
; if this module works better, then ....
.sbttl RSX Connect code - Definitions
ef.lot = 13. ; Local output event flag
em.lot = 010000 ; Local output event flag mask
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
sentxof:.word 0 ; did we ever send XOFF ?
savti: .byte TC.FDX,0,TC.SLV,0,TC.BIN,0 ; Original setting for remote
sizti = .-savti ; for the next time
savco: .byte TC.FDX,0 ; Original setting for local
fdxchr: .byte TC.FDX,1,TC.SLV,1,TC.BIN,1 ; Change to FDX if required
sizchr = .-fdxchr
; 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:
qio$ io.wal,lun.co,ef.lot,,,,<bufptr>
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,,<bufptr+1>
remxoff:
qiow$ io.wal,lun.ti,ef.rem,,,,<xoff,1>
remxon:
qiow$ io.wal,lun.ti,ef.lot,,,,<xon,1>
;
; Other stuff
;
efbuf: .blkw 4 ; Event flags buffer
rembf: .blkb 2 ; Remote data buffer
rembf1: .blkb 256. ; Local output data buffer
rembf2: .blkb 256. ; Local output data buffer
bufptr: .word 0 ; Local output buffer pointer
locbf: .blkb 2 ; Local data buffer
eseen: .word 0 ; 1 = escape seen
locios: .word 0,0
remios: .word 0,0
.psect $code
; .sbttl RSX Connect Code -- Setup
.mcall qio$ qiow$ qiow$s dir$ wtlo$s setf$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
xdorsx::message <Alternate RSX connect code called>,cr
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,#sizti> ; Crude
qiow$s #sf.gmc,#lun.co,#ef.loc,,,,<#savco,#2>
qiow$s #sf.smc,#lun.ti,#ef.rem,,#remios,,<#fdxchr,#sizchr>
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
setf$s #ef.lot ; Signal local output available
clr sentxof ; no xoff's have been sent
clr r3 ; Count of rem buffer (empty)
mov #rembf1,bufptr ; Pick a buffer
;
; Main loop - Handle incoming and outgoing streams
; until escape character is detected on outgoing (local KB)
;
20$: wtlo$s 0,#<em.loc!em.rem!em.lot> ; 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 30$ ; (no)
movb remios ,r5 ; get the status of the read
call iocheck ; and check for allowable errors
bcs 23$ ; fatal (likely was IE.DNR)
mov bufptr ,r1 ; Get buffer
add r3 ,r1 ; and position in buffer
movb rembf ,(r1)+ ; put in character
inc r3 ; running count of buffer
dir$ #remtest ; More in typeahead?
movb remios ,r5 ; get the status of the read
call iocheck ; and check for allowable errors
23$: 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 25$ ; (no)
add r0 ,r3 ; keep count of buffer
mov r1,remtab+q.iopl ; Set address to drain into
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)
25$: cmp r3 ,#20 ; Check for buffer fill limit
ble 28$ ; not yet
dir$ #remxoff ; Stop input please
mov sp ,sentxof ; flag that we sent an XOFF
28$: dir$ #remread ; Re-issue input
.sbttl RSX Connect code - Local Output
;
; Handle completion of output to local terminal
; and check for more output available
;
30$: bit #em.lot,efbuf+0 ; Check output flag
beq 40$ ; (no, still busy)
tst r3 ; Anything to output
beq 40$ ; no
mov bufptr,locwrite+q.iopl ; Buffer to write
mov r3,locwrite+q.iopl+2 ; amount to write
dir$ #locwrite ; Start the output
bit #log$co,trace ; Is logging enabled
beq 34$ ; no
mov bufptr,r1 ; start of data
32$: calls putc,<(r1)+,#lun.lo> ; put character
sob r3,32$ ; til count exhausted
34$: cmp bufptr,#rembf1 ; switch buffers
beq 36$
mov #rembf1,bufptr
br 38$
36$: mov #rembf2,bufptr
38$: clr r3 ; New buffer is empty
tst sentxof ; skip if we never sent an
beq 39$ ; xoff please
dir$ #remxon ; Start input if stopped
clr sentxof ; no xoff's are active now
39$:
.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
clr eseen ; clear the flag
tst r0 ; Exit CONNECT mode?
bgt 100$ ; (yes, clean up etc.)
blt 70$ ; no, but it was a command
60$: clr eseen ; clear the flag
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,#sizti> ; 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
.sbttl dump i/o to a log file ?
dumplo: bit #log$co ,trace ; is this enabled ?
beq 100$ ; no
save <r0> ; yes, save temps please
calls putc,<r1,#lun.lo> ; thats it folks
unsave <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