.sbttl K11RCO New RT11 connect code .psect .ident /3.51.4/ .if ndf, K11INC .ift .include /IN:K11MAC.MAC/ .endc .enabl gbl ; Copyright (C) 1986 Change Software, Inc ; ; 07-MAY-1986 10:55 Brian Nelson ; ; Edits: ; ; 16-May-86 11:12:55 ; ;3.51.2 Add tasks to watch for carrier transitions and hung XOFF'ed ; status (XC/XL/CL only). ;3.51.3 Check for tt output ring buffer overflow. ;3.51.4 Kludge to correct for bug in RT11 5.1 XL handler ;3.56.5 Allow XL a little time to finish 09-Dec-86 10:52:04 ;3.56.6 Fix LF processing. Not strictly needed because the XL driver ; under 5.2 and later filters LF's that follow CR's. We will do ; it here anyway though for non-DEC drivers (like CL and KL). ; ; ; ; Complete rewrite of RT11 connect code. For XC/XL/CL, we use ; a multitasking approach and drive it via interupts (actually ; timer and read completions). For MultiTerminal data, see code ; at DOMT:. Maybe the MT code will run on SJ now, the XL/CL/XC ; code will NOT. .psect concod ,ro,i,lcl,rel,con .psect condat ,rw,d,lcl,rel,con JSW = 44 ERRBYTE = 52 $XLV51 = 16. ; XL/XC for RT11 v5.1 $XLV52 = 17. ; XL/XC for RT11 v5.2 .mcall .WRITC ,.SPFUN ,.TTINR ,.TTYIN ,.TTYOU ,.TTOUTR .mcall .MRKT ,.CMKT ,.TWAIT ,.SCCA ,.QSET ,.PRINT .mcall .RSUM ,.SPND ,.RCTRLO,.GVAL ,.SERR ,.HERR .iif ndf, SJ$TEST ,SJ$TEST = 0 GLOBAL .if ne ,SJ$TEST .ift .macro .RSUM .endm .RSUM .macro .SPND .endm .SPND .macro .MRKT a,b,c,d,e,f .endm .MRKT .macro .TWAIT a,b,c,d,e,f .endm .TWAIT .macro .CMKT a,b,c .endm .CMKT .endc ; IF ne, SJ$TEST .psect condat .even .macro BEEP mov #7 ,r0 .TTOUTR .endm BEEP .macro SCHEDULE taskheader mov r0 ,-(sp) mov taskheader,r0 mov #runable,STATE(r0) mov (sp)+ ,r0 .endm SCHEDULE RUNABLE = 1 STATE = 0 TASKADDR= 2 IODONE = 4 IOPEND = 6 IOBUFF = 10 IOSTALL = 12 ; This is the schedulers 'JOB' table. tlist: ; STATE DISPATCH IODONE IOPEND IOBUFF IOSTALL xkhead: .word 0 ,XKPROC ,0 ,0 ,0 ,0 tthead: .word 0 ,TTPROC ,0 ,0 ,0 ,0 rmhead: .word 0 ,RMPROC ,0 ,0 ,TTBUFF ,0 sthead: .word 0 ,STPROC ,0 ,0 ,0 ,0 wthead: .word 0 ,WTPROC ,0 ,0 ,0 ,0 .word -1 ,-1 ,-1 ,-1 ,0 ,0 sjlist: .word STSDONE ,WTDONE ,TTDONE ,0 hdsize = tthead - xkhead .if NE ,SJ$TEST .ift sj.dec: .word 1 ; Testing under XM .iff sj.dec: .word 0 ; SJ and no .MRKT if NE .endc crflag: .blkw 1 ; CR seen flag xk: .blkw 1 ; Save flag rt.v51: .blkw 1 ; Need to know Xl handler version xksdon: .blkw 1 ; Remote terminal set done ttsdon: .blkw 1 ; Local terminal set done ioseen: .blkw 1 ; Some input was seen somewhere ttio: .blkw 1 ; Console read worked xkio: .blkw 1 ; Remote read worked eseen: .blkw 1 ; Control \ happened at console ttunit: .blkw 1 ; Our console terminal unit xkunit: .blkw 1 ; Connected line's unit number scca: .word 0,0,0 ; For getting control C's mark: .blkw 4 ; For MARKTIME short: .word 0,1 ; mtime: .word 0,0 ; Timeout value twait: .word 0,0,0,0 ; 'AREA' for TWAITS cancel: .word 0,0,0,0 ; 'AREA' for CANCEL mark time rmwork: .word 0,0,0,0 rmtime: .word 0,3*60. ttmark: .word 0,0,0,0 ttwait: .word 0,3 suspend:.word 0 xkrd1: .word 0,0,0,0,0,0 xkrd2: .word 0,0,0,0,0,0 xkr1do: .word 0 xkr2do: .word 0 xkwork: .word 0,0,0,0,0,0 done: .word 0 xkmark: .word 0,0,0,0 xktime: .word 0,10. idle: .word 0 idmark: .word 0,0,0,0 idtime: .word 0,62. ; Check for idle state stswork:.word 0,0,0,0,0,0 ; For status watcher task's .SPFUN stsmark:.word 0,0,0,0 ; For .MRKT to schedule status watcher ststime:.word 0,20. ; Schedule status watcher 20 ticks wtmark: .word 0,0,0,0 ; For XOFF watcher wttime: .word 0,20. ; Do it every 20 ticks xksts: .word 0,0 ; Save status wtsts: .word 0,0 ; Save status again wtcount:.word 0 ; Save low 16 bits of char count charcou:.word 0,0 ; Total chars sent by HOST tsxbrk: .byte 0,133 ; TSX+ SET break address .word 0 ; No 'break' char .word brkast ; Where to jump to tsxnbrk:.byte 0,133 ; TSX+, turn break AST's off .word 0,0 ; Disable XKSIZE = 200 ; Large buffers for remote reads xkbuff: .blkb XKSIZE+2 ; Buffer for connected line xkpoint:.word xkbuff ttbuff: .blkb 80. ; Buffer for console terminal rmbuff: .blkb 2 msg: .blkb 110 co: .asciz /Connecting to / spd: .asciz / Speed: /<200> .even .psect concod .enabl lsb doconn::call check ; SJ checks .iif NE, SJ$TEST, clr clkflg ; For testing clr xk ; Clear device type tstb ttname ; Anything there ? bne 1$ ; Yes message ,cr return ; Exit 1$: strcpy #msg ,#co ; Build a header up. strcat #msg ,#ttname ; ... strcat #msg ,#spd ; ...... cmpb ttname ,#'0 ; Is this using XC/XL/CLn? blo 5$ ; No cmpb ttname ,#'9 ; Well? bhi 5$ ; No call domt ; Switch modes then. return ; Exit 5$: inc xk ; Flag device class call init ; Startup bcs 100$ ; Oops call ttinit ; Save terminal characteristics bcs 90$ ; Die ; 10$: tst done ; Time to go now ? bne 90$ ; Yes, exit mov #ttbuff ,r4 ; Pointer to local term buffer inc suspend ; Count the number of suspends .SPND ; Suspend ourself clr idle ; No longer idle tst sj.dec ; Minimal SJ system? beq 25$ ; No mov #sjlist ,r5 ; Yes, No mark time so we will 20$: tst @r5 ; have to call all of the watchers beq 25$ ; If zero, all done jsr pc ,@(r5)+ ; Do it for Sj krud br 20$ ; Check for more calls needed for SJ 25$: mov #tlist ,r5 ; Find out who woke up 30$: cmp taskaddr(r5),#-1 ; End of the table now? beq 50$ ; Yes, suspend again tst state(r5) ; Runnable task ? beq 40$ ; No jsr pc ,@taskaddr(r5) ; Yes, run the sucker. 40$: add #HDSIZE ,r5 ; Next task control block please br 30$ ; ... 50$: br 10$ ; Go away until something happens 90$: .CMKT #cancel,#0 ; Kill all marktime requests call ttrst ; Restore terminal chars 100$: bic #40000+10000+100,@#JSW ; Clear special modes .SCCA #scca,#0 ; Enable control C stuff again .CMKT #cancel,#0 ; Kill all marktime requests return .dsabl lsb .sbttl misc support routines .enabl lsb .mcall .scca $TCFIG = 424 ttinit: clc ; Basically a NO-OP return ; Exit init: tst tsxsave ; True TSX+ today? beq 5$ ; No .SERR ; To be safe mov #tsxbrk ,r0 ; Set break AST EMT 375 ; Do it. .HERR ; Normal now 5$: mov #tlist ,r0 ; Clear out task list 10$: cmp TASKAD(r0),#-1 ; All done with list beq 20$ ; Yes clr STATE(r0) ; No clr IODONE(r0) ; ... clr IOPEND(r0) ; ... clr IOSTALL(r0) ; Stalled flag. add #HDSIZE ,r0 ; Next please br 10$ ; ... 20$: clr eseen ; No escape seen clr crflag ; No carriage returns yet clr idle ; clr done ; ... clr xkr1done ; Clear out clr xkr2done ; Ditto clr xkio ; No remote I/O seen clr ttio ; No local I/O seen clr ioseen ; No I/O at all happened clr ttsdon ; No terminal settings done yet clr xksdon ; No terminal settings done yet clr charcount ; Clear out data count clr charcount+2 ; All 32 bits of it please. mov #1 ,suspend ; Suspension count mov #xkbuff ,xkpoint ; Current pointer into buffer. .SCCA #scca ,#scca+4 ; Trap all control c's calls ttyset ,<#ttname,#LUN.XK> calls ttyini ,<#ttname,#LUN.XK,#0> tst r0 ; Successfull setup of port? beq 25$ ; Yes, continue jmp 90$ ; No, exit ; 25$: .print #msg ; A header message ,cr ; ... message ,cr ; ; All done, prime the system. .MRKT #idmark,#idtime,#iddone,#11 .MRKT #stsmark,#ststime,#stsdone,#7 .MRKT #wtmark,#wttime,#wtdone,#10 .SPFUN #stswork,#XC.CONTROL,#STSDRV,#xksts,#0,#1 clr rt.v51 ; Flag if 5.1 or 5.2 please cmpb xksts+1 ,#$XLV51 ; Is this a 5.1 system? bne 30$ ; No, must be 5.2 or later. inc rt.v51 ; Yes, a serious bug in XL/XC 30$: ; .SPFUN #xkrd1,#LUN.XK,#203,#xkbuff,#xksize,#1,#xkdone .MRKT #ttmark,#ttwait,#ttdone,#3 clc ; Successfull exit br 100$ ; Exit ; 90$: mov r0 ,r1 ; Save error code message direrr r1 sec ; Failure to initialize things 100$: return ; Exit INIT code .dsabl lsb .sbttl Restore line settings, check options for SJ exec ttrst: .TWAIT #twait,#short ; Eat up extra .RSUM's ? .TWAIT #twait,#short ; ...Ditto (one Tick) .TWAIT #twait,#short ; ...Ditto .TWAIT #twait,#short ; ...Ditto calls ttyfin ,<#ttname,#LUN.XK>; Drop things and exit calls ttyrst ,<#ttname,#LUN.XK>; .SERR ; To be safe tst tsxsave ; TSX+ beq 100$ ; No mov #tsxnbrk,r0 ; Yes, turn break AST's off EMT 375 ; Do it 100$: .HERR ; Restore return ; Bye .enabl lsb $CONFIG = 300 $SYSGEN = 372 SJMON = 1 ; RMON offset 300 (Config) CLOCK = 100000 ; RMON offset 300 (Config) MRKTIM = 2000 ; RMON offset 372 (Sysgen) .mcall .GVAL check: .GVAL #xkwork,#$CONFIG ; Get the configuration word bit #SJMON ,r0 ; Is this a SJ monitor ? bne 100$ ; No, just exit bit #CLOCK ,r0 ; SJ, is there a clock present bne 10$ ; Yes message <%Kermit-W Kermit needs a line or programable CLOCK>,CR 10$: .GVAL #xkwork ,#$SYSGEN ; Check for MARK TIME support bit #MRKTIM ,r0 ; Well? bne 100$ ; Yes, support is present message <%Kermit-W The SJ executive should have timer support>,CR message ,CR inc sj.dec ; Save the result sec ; Flag return ; Exit 100$: clc ; Success return ; Exit .sbttl reading from XK (XC/XL/CL) and TT: .enabl lsb ttdone: mov r0 ,-(sp) ; Save this clr tthead+state ; Assume no data present bis #40000+10000+100+20,@#JSW; Enable special modes .TTINR ; Check for input waiting for term bcs 90$ ; Nothing to do bicb #^C177 ,r0 ; Strip any parity bits please tst rt.v51 ; Is this RT11 5.1 and OLD XL/XC bne 10$ ; Yes, kludge a bug in the handler asr crflag ; See if a carriage return preceeds bcc 5$ ; a line feed. Was last one a CR? cmpb r0 ,#12 ; Ignore LINE feeds Please beq 90$ ; Exit on 5$: cmpb r0 ,#15 ; Is this one a carriage return? bne 10$ ; No inc crflag ; Yes, save for next time. 10$: movb r0 ,ttbuff ; Insure we save this SCHEDULE #TTHEAD ; Get a process going to use data tst suspend ; Fix up the .SPND count beq 20$ ; ... dec suspend ; ... .RSUM ; Get scheduler going 20$: br 100$ ; Exit ; 90$: .MRKT #ttmark,#ttwait,#ttdone,#3 ; 100$: mov (sp)+ ,r0 ; Restore this return ; Exit .dsabl lsb ttproc: clr STATE(r5) ; Don't come back right away save ; Save registers we use mov #ttbuff ,r4 ; Point to terminal buffer movb @r4 ,r0 ; Get the data please cmpb r0 ,conesc ; Escape sequence today? bne 50$ ; No, must dump character as is mov #10*60. ,r1 ; Loop a while looking for data 10$: bis #40000+10000+100+20,@#JSW ; Enable special modes .TTINR ; Was the escape characters, trynext bcc 30$ ; Got something valid .TWAIT #twait,#short ; Nothing, wait a little bit tst sj.dec ; Did we have timer support? beq 20$ ; Yes CPUWAIT #1 ; No (really should boot FB up) 20$: sob r1 ,10$ ; Next please br 100$ ; Exit as we did not get any data 30$: bicb #^C177 ,r0 ; Strip junk from the character movb r0 ,@r4 ; Insure we save this cmpb r0 ,conesc ; Double escape sequence read? beq 50$ ; Yes, dump that character as is call concmd ; No, check for emulator command br 100$ ; 50$: tst duplex ; Need local echoing today? beq 60$ ; No .TTOUTR ; Yes, echo the data please 60$: setpar (r4) ,(r4) ; Set parity up if needed SCHEDULE #RMHEAD ; Dump the data down the line 100$: .MRKT #ttmark,#ttwait,#ttdone,#3 unsave ; Pop and exit return ; Exit xkdone: SCHEDULE #XKHEAD ; Get things going when we exit clr xkhead+iopend ; I/O is complete mov sp ,xkhead+iodone ; Say so. mov #xkbuff ,xkpoint ; Reset buffer pointer now. tst suspend ; Fix up suspention count beq 100$ ; No dec suspend ; Yes, suspend-- .RSUM ; Resume mainline 100$: return ; Thus XKPROC will get called xkredo: SCHEDULE #XKHEAD ; If we need to retry terminal output tst suspend ; Fix up suspention count beq 100$ ; No dec suspend ; Yes, suspend-- .RSUM ; Resume mainline 100$: return ; Thus XKPROC will get called xkproc: mov r0 ,-(sp) ; Save please mov r1 ,-(sp) ; Ditto mov r3 ,-(sp) ; .... mov xkpoint ,r1 ; Dump the buffer now mov sp ,ioseen ; Say we got some data 210$: tstb (r1) ; All done yet? beq 240$ ; Yes movb (r1)+ ,r0 ; cmpb parity ,#PAR$NO ; No parity? bne 215$ ; No, clear high bit tst con8bit ; SET CON 7/8 ? bne 215$ ; No bicb #200 ,r0 ; Strip high bit now 215$: .TTOUTR ; No, dump the data bcs 220$ ; If we fail, come back later add #1 ,charcount ; Bump up the character count adc charcount+2 ; The high part also. inc xkpoint ; Remember where we were at now. br 210$ ; Next please ; 220$: .MRKT #xkmark,#xktime,#xkredo,#13 ; Output ring buffer is FULL. inc IOSTALL(r5) ; Flag we are stalled. clr STATE(r5) ; No longer runable please br 250$ ; Exit ; 240$: mov #xkbuff ,xkpoint ; Reset the pointer now. mov #xkbuff ,r3 ; Disk logging next call dumplog ; clr STATE(r5) ; clr IODONE(r5) ; clr IOSTALL(r5) ; mov sp ,IOPEND(r5) ; ... .TWAIT #twait ,#short ; /56/ .SPFUN #xkrd1,#LUN.XK,#203,#xkbuff,#xksize,#1,#xkdone 250$: mov (sp)+ ,r3 ; Pop r3 mov (sp)+ ,r1 ; Pop r1 mov (sp)+ ,r0 ; And R0 please return ; Exit rmproc: mov r0 ,-(sp) ; Save mov r1 ,-(sp) ; ... tst IOPENDING(r5) ; Are we still waiting for XC/XL? beq 30$ ; /56/ No .CMKT #cancel ,#3 ; /56/ Disable terminal input checking mov #10. ,r1 ; /56/ Wait a total of 10 ticks 10$: tst IOPENDING(r5) ; /56/ Done YET? beq 20$ ; /56/ Yes, at last .TWAIT #twait ,#short ; /56/ Wait a tick sob r1 ,10$ ; /56/ And go back and take a peek 20$: .MRKT #ttmark,#ttwait,#ttdone,#3 ; /56/ Reenable terminal checking 30$: mov IOBUFF(r5),r1 ; /56/ Pointer to I/O buffer movb @r1 ,rmbuff ; Copy the data clrb rmbuff+1 ; Tack a NULL on the end. mov sp ,IOPENDING(r5) ; Flag that we are waiting here. .MRKT #rmwork,#rmtime,#300$,#5; Start timer to clear driver. .WRITC #xkwork,#LUN.XK,#rmbuff,#1,#200$,#1 100$: mov (sp)+ ,r1 ; Pop mov (sp)+ ,r0 ; ... clr STATE(r5) ; Don't reschedule please. return ; Simple ; ; XC/XL WRITE completion. 200$: clr RMHEAD+IOPENDING ; I/O no longer pending .CMKT #rmwork,#5 ; Stop the marktime for XOFFED return ; Ast completion is a NO-OP ; ; MARKTIME completion. 300$: call x.ttxon ; Force a driver reset. clr RMHEAD+IOPENDING ; Say we are ready for MORE data return ; Done. .sbttl Status watchers stsdone:mov r0 ,-(sp) ; Save this (?) SCHEDULE #STHEAD ; Schedule the status checker br wtexit ; Exit now wtdone: mov r0 ,-(sp) ; Save this (?) SCHEDULE #WTHEAD ; Schedule the xon/xoff checker wtexit: tst suspend ; Fix the suspended count beq 100$ ; No dec suspend ; Yes, suspend-- .RSUM ; Start scheduler now 100$: mov (sp)+ ,r0 ; Pop R0 and exit return ; Exit the ast now .enabl lsb stproc: save ; Save registers we may need clr STATE(r5) ; No longer runnable mov xksts ,r2 ; Save old status word .SPFUN #stswork,#XC.CONTROL,#STSDRV,#xksts,#0,#1 bcs 100$ ; Failed?? mov xksts ,r1 ; Get the current status bic #^C4 ,r2 ; Leave only the carrier detect bic #^C4 ,r1 ; bits on for the status cmp r1 ,r2 ; Are they the same? beq 100$ ; Yes, then ignore BEEP ; Make a small noise tst r1 ; Not the same, did we loose it? bne 10$ ; No, we must have just gotten it message <%Kermit-11 Carrier lost>,cr br 100$ ; Exit 10$: message <%Kermit-11 Carrier detected>,cr 100$: .MRKT #stsmark,#ststime,#stsdone,#7 ; Reschedule us unsave ; Pop registers and exit return ; Exit .dsabl lsb .sbttl Check for hung driver .enabl lsb wtproc: save ; Save registers please clr STATE(r5) ; No longer runnable mov wtsts ,r2 ; Save old Status flags .SPFUN #stswork,#XC.CONTROL,#STSDRV,#wtsts,#0,#1 bcs 100$ ; It should ALWAYS work. mov wtsts ,r1 ; Get new status bic #^C3 ,r2 ; Leave only XOFF'ed status bic #^C3 ,r1 ; Same for the current status word tst r1 ; See if XOFF'ed at either end beq 100$ ; No, so just reschedule ourself cmp r2 ,r1 ; Same status as last time here? bne 100$ ; No, just exit normally then. mov #tlist ,r0 ; Ok, check for any i/o stalled. 10$: cmp TASKAD(r0),#-1 ; End of list so far ? beq 20$ ; Yes, fix the line up tst IOSTALL(r0) ; No, anybody stalled intentionally? bne 100$ ; Yes, just reschedule ourself add #HDSIZE ,r0 ; No, check next task out br 10$ ; Next please 20$: ; .SPFUN #stswork,#XC.CONTROL,#CLRDRV,#0,#0,#1 100$: .MRKT #wtmark,#wttime,#wtdone,#10 mov charcount,wtcount ; Copy low 16 bits of char count. unsave ; Pop registers return ; Exit .dsabl lsb iddone: inc idle ; Has anything happended in a while? cmp idle ,#3 ; Well? ble 100$ ; No clr idle ; Yes, force a .RSUM clr suspend ; Clear suspended flag .RSUM ; Force mainline to run 100$: .MRKT #idmark,#idtime,#iddone,#11 ; Reshedule return ; And exit .sbttl Connect for RT11 Multiple terminal service ONLY ; Rewitten: 08-May-86 14:49:40 Brian Nelson .save .psect mtdata ,rw,d,lcl,rel,con chcount:.word 0 needxon:.word 0 mtbuff: .word 0 mttime: .word 0,0 mtwait: .word 0,1 .restore .enabl lsb domt: clr done ; Not done yet, please. mov #10 ,chcount ; Count down for rt11 to do an XOFF .SCCA #scca,#scca+4 ; No control C's please clr needxon ; Don't need to send xon yet calls noecho ,<#ttname> ; Don't want echoing please calls ttyini ,<#ttname,#LUN.XK,#0> tst r0 ; Did the initialization work ? beq 1$ ; Yes jmp 90$ ; No, exit 1$: calls ttyset ,<#ttname> ; Ok, set some useful things up mov #mtbuff ,r3 ; A tiny one character buffer. .print #msg ; calls ttspeed ,<#ttname> ; ...... tst r0 ; This is getting tedious bgt 5$ ; ... message ,cr ; br 6$ ; And so on 5$: decout r0 ; A REAL speed that RT11 knows about message ; CR/LF 6$: message ,cr mov r3 ,r4 ; Compatibility with XM code .sbttl Main loop for MT reading 10$: tst done bne 100$ ; Exit calls xbinrea ,<#LUN.XK,#-1> ; Try to get a charater from remote tst r0 ; Did the read succeed? bne 20$ ; No, try console terminal then clrpar r1 ; Yes, drop any aprity bits please clr @r3 ; Insure .asciz string here. bisb r1 ,@r3 ; Yes, get the character and print cmpb r1 ,#'S&37 ; Xoff? beq 15$ ; Yes, ignore movb r1 ,r0 ; Copy the data now. .TTOUTR ; Dump the character 15$: call dumplo ; Dump to a log file perhaps dec chcount ; Is it time to do a RT11 XOFF ? bne 25$ ; No, wait a while then mov #2 ,needxon ; Will need to send xon later call sxoff ; Yes, send an xoff please mov #10 ,chcount ; And reset the character counter br 25$ ; And look for local terminal input 20$: tst needxon ; Really send an xon today? beq 25$ ; No dec needxon ; Don't overdo sending xon's please call sxon ; No data, send an xon please ; 25$: bis #40000+10000+100+20,@#JSW ; Insure special modes .TTINR ; Try to read something now bcs 70$ ; No data, exit movb r0 ,@r3 ; yes, get it and send it to the bic #^C177 ,r0 ; insure no high bits are set. cmpb r0 ,#12 ; Ditch LINE FEEDS Please. beq 25$ ; A Line Feed, next please? cmpb r0 ,conesc ; other system unless it's the escape bne 50$ ; mov #20*60 ,r1 ; Loop a bit for a read 30$: bis #40000+10000+100,@#JSW ; Insure special modes .TTINR ; Try to read something now. bcc 40$ ; Successfull read, exit .TWAIT #twait,#short ; Wait a moment now. sob r1 ,30$ ; Try again br 70$ ; Nothing, ignore please 40$: bic #^C177 ,r0 ; Insure no high bits are set. cmpb r0 ,#12 ; Ditch LINE FEEDS Please. beq 30$ ; A Line Feed, next please? movb r0 ,@r3 ; Must save it here! cmpb r0 ,conesc ; Really send the escape ? beq 50$ ; Yes call concmd ; Yes, do the command br 70$ ; No, next please ; 50$: setpar @r3 ,@r3 ; Insure correct outgoing parity now calls binwri ,; The data is for the remote system tst duplex ; Full or half duplex connection? beq 70$ ; Full movb @r3 ,r0 ; Half duplex, echo the data now. .TTOUTR ; Simple to do. 70$: ; 80$: br 10$ ; and back for more 90$: direrr r0 ; problems in getting the connection 100$: calls ttyfin ,<#ttname,#LUN.XK> bic #40000+10000+100,@#JSW ; Get rid of special modes .SCCA #scca,#0 ; Get rid of control C trapping return ; And exit now. .dsabl lsb sxon: tst conflow beq 100$ calls binwri ,<#$xon,#1,#LUN.XK> 100$: return sxoff: tst conflow beq 100$ calls binwri ,<#$xoff,#1,#LUN.XK> 100$: return .sbttl concmd terminal emulation escape commands .enabl lsb concmd::mov r1 ,-(sp) ; Save it movb @r4 ,r1 ; Get the character to check bicb #^C177 ,r1 ; Must drop parity scan r1 ,#200$ ; look for a match here asl r0 ; word offsets jsr pc ,@210$(r0) ; dispatch to the correct routine 100$: mov (sp)+ ,r1 ; Pop R1 and exit return .save .psect rwdata ,rw,d,lcl,rel,con 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 .restore ; Pop code psect context .dsabl lsb ; Turn off current symbol block con.$: movb $bel ,r0 .TTOUTR ; Beep a little clc ; commands. Say it is not fatal. return ; Bye con.c: mov sp ,done ; Exit connection return ; And return con.i: calls ttydtr ,<#ttname> ; try to force DTR up on the line clc ; And say it's NOT fatal return ; Exit con.q: bic #log$co ,trace ; turn off console logging clc ; Successfull return ; Exit con.r: bit #log$op ,trace ; if the file is open do it beq 100$ ; no bis #log$co ,trace ; yes, enable this 100$: clc ; Success return ; Exit .enabl lsb con.x: tst xk ; MT or XC/XL/CL today? beq 30$ ; MT service .SPFUN #200$,#XC.CONTROL,#CLRDRV,#0,#0,#1 mov #tlist ,r0 ; Ok, check for any i/o stalled. 10$: cmp TASKAD(r0),#-1 ; End of list so far ? beq 20$ ; Yes, fix the line up clr IOSTALL(r0) ; Clear task stalled flags add #HDSIZE ,r0 ; No, check next task out br 10$ ; Next please 20$: .WRITC #200$,#LUN.XK,#$xon,#1,#190$,#1 br 100$ ; Exit 30$: calls ttxon ,<#ttname> ; and try to clear our xoffed state 100$: clc ; Success return ; Exit 190$: return ; AST write completion .save .psect rwdata ,d,lcl 200$: .word 0,0,0,0,0,0,0 .restore .dsabl lsb brkast: call con.br mov #tsxbrk ,r0 EMT 375 return con.br: calls senbrk ,<#ttname,#lun.ti> clc return con.hl::.print #hlptxt clc return .save .psect rwdata ,rw,d,lcl,rel,con hlptxt: .ascii /B Try to send a break to the remote/ .ascii /C Connect back to the local Kermit-11/ .ascii /I Drop and raise DTR (for RSTS only)/ .ascii /Q Quit console logging. See SET LOG/ .ascii /R Resume console logging. See SET LOG/ .ascii /X Send XON and cancel any active XONs/ .asciz /RUBOUT Try to fake a break to the remote/ .ascii /? Print this message/ .byte 0 .even .restore .sbttl dump i/o to a log file ? ; Passed: r3 buffer address dumplo: bit #LOG$CO ,trace ; Is this enabled ? beq 100$ ; No bit #LOG$OP ,trace ; Is it open beq 100$ ; No save ; Save work registers strlen r3 ; Get size mov r0 ,r2 ; Copy size beq 90$ ; Nothing to do ? 10$: clrb r0 ; Avoid sign extension bisb (r3)+ ,r0 ; Get the next character mov #LUN.LO ,r1 ; Unit number call putcr0 ; Thats it folks sob r2 ,10$ ; Next please 90$: unsave ; Pop registers and exit 100$: clc ; May as well say it worked return ; Bye .save .psect rwdata $xon: .byte 'Q&37,0 $xoff: .byte 'S&37,0 $bel: .byte 'G&37,0 .even .restore .end