.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 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$ ,lun.ti,ef.rem,,remios,, locread: qio$ ,lun.co,ef.loc,,locios,, remwrite: qiow$ io.wal,lun.ti,ef.loc,,,, locwrite: qio$ io.wal,lun.co,ef.lot,,,, locech: qiow$ io.wal,lun.co,ef.rem,,,, remtest: qiow$ sf.gmc,lun.ti,ef.rem,,remios,, remtab: qiow$ ,lun.ti,ef.rem,,remios,, remxoff: qiow$ io.wal,lun.ti,ef.rem,,,, remxon: qiow$ io.wal,lun.ti,ef.lot,,,, ; ; 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 ,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 ,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,# ; 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 .dsabl lsb .sbttl dump i/o to a log file ? dumplo: bit #log$co ,trace ; is this enabled ? beq 100$ ; no save ; yes, save temps please calls putc, ; thats it folks unsave 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 .end