.TITLE TRM - TELL ALL ABOUT OUR TERMINAL .NLIST BEX .MCALL EXIT$S,DIR$,QIOW$,SMACIT,GMCR$,QIOW$C SMACIT .MACRO DSWERR BCC .+10 MOV $DSW,R0 HALT .ENDM .MACRO FIND X,Y,Z Y: CMPB #X,(R0)+ BNE .+6 DEC R1 BR .+12 DEC R1 BNE Y JMP Z .ENDM ;LST$$ = 0 ;IF DEFINED, SHOW MACRO EXPANSION .PAGE ; ; MESSAGES AND STORAGE DEFINITIONS ; TTY: .ASCIZ /TT%O:/ LUIC: .ASCIZ /LOG-IN UIC = [%2B]/ DUIC: .ASCIZ /DEFAULT UIC = [%2B] [SET UIC]/ OTTY: .ASCIZ /TERMINAL OWNER TT%O:/ .EVEN RTTY: .ASCII /TERMINAL REDIRECTED TO / RTYPE: .ASCIZ /XX%O: [RED]/ BUFS: .ASCIZ /BUFFER SIZE = %M [SET BUF]/ LINES: .ASCIZ /LINES PER PAGE = %M [SET LINES]/ SPEED: .ASCIZ /SPEED = %M:%M [SET SPEED]/ TCHAR: .ASCIZ /TERMINAL CHARACTERISTICS: %N/ BSY: .ASCIZ / DEVICE IS BUSY./ DSB: .ASCIZ / DEVICE IS DISABLED [SET DISABLED]/ CRW: .ASCIZ / WAITING FOR CARRIER [SET CARRIER-WAIT]/ OUT: .ASCIZ / DEVICE EXPECTING AN OUTPUT INTERRUPT/ ABS: .ASCIZ / ABSCAN ENABLED [SET ABSCAN]/ UMD: .ASCIZ / ATTACHED FOR DIAGNOSTICS/ PUB: .ASCIZ / PUBLIC DEVICE [SET PUB]/ RED: .ASCIZ / REDIRECTABLE/ OFL: .ASCIZ / OFF-LINE [SET OFFLINE]/ OSP: .ASCIZ / OUTPUT SPOOLED DEVICE/ ISP: .ASCIZ / INPUT SPOOLED DEVICE/ SWL: .ASCIZ / SOFTWARE WRITE LOCKED/ MXD: .ASCIZ / MASS BUS DEVICE/ SQD: .ASCIZ / SEQUENTIAL DEVICE/ DIR: .ASCIZ / FILE STRUCTURED DEVICE/ TTYD: .ASCIZ / TERMINAL IS A DEVICE/ CCL: .ASCIZ / CARRIAGE CONTROL DEVICE/ REC: .ASCIZ / RECORD ORIENTED DEVICE/ DH1: .ASCIZ / DEVICE IS A MULTIPLEXER/ RMT: .ASCIZ / DEVICE IS A REMOTE [SET REMOTE]/ L8S: .ASCIZ / DEVICE IS A LA180S/ NEC: .ASCIZ / WILL NOT ECHO SOLICITED INPUT [SET NOECHO]/ CRT: .ASCIZ / DEVICE IS A CRT [SET CRT]/ ESC: .ASCIZ / CAN GENERATE ESCAPE SEQUENCES [SET ESCSEQ]/ LOG: .ASCIZ / HAS A USER LOGGED ON [SET LOGON]/ NLOG: .ASCIZ / HAS NO USER LOGGED ON [SET LOGGED-OUT]/ SLV: .ASCIZ / SLAVE TERMINAL [SET SLAVE]/ DZ1: .ASCIZ / DEVICE IS A DZ11/ HLD: .ASCIZ / IN HOLD SCREEN MODE [SET HOLD]/ ATT: .ASCIZ / HAS MCR AN INDIRECT MCR COMMAND BEING PROCESSED/ PRV: .ASCIZ / PRIVILEDGED TERMINAL [SET PRIV]/ L3S: .ASCIZ / DEVICE IS A LA30S/ VT5: .ASCIZ / DEVICE IS A VT05B/ LWC: .ASCIZ / WILL CONVERT LOWERCASE TO UPPERCASE [SET LOWER]/ WRP: .ASCIZ / WRAPAROUND ENABLED [SET WRAP]/ HHT: .ASCIZ / HARDWARE HORTIZONTAL TABS (FILL CHAR = %O) [SET HHT,HFILL]/ VFL: .ASCIZ / VERTICAL FILL ENABLED [SET VFILL]/ FRM: .ASCIZ / HARDWARE FORMFEED [SET FORMFEED]/ FDX: .ASCIZ / FULL DUPLEX [SET FDX]/ EBC: .ASCIZ / EIGHT BIT CHARACTERS [SET EBC]/ TYPA: .ASCIZ / TYPEAHEAD ENABLED [SET TYPEAHEAD]/ RPA: .ASCIZ / READ PASS ALL [SET RPA]/ .PAGE TTYPE: .ASCIZ /TERMINAL TYPE IS %2R [SET TERM]/ .EVEN SYN: .ASCII /*** TERMINAL NUMBER CONVERSION ERROR, TYPE HELP TRM ***/ SYNL = .-SYN .EVEN .PAGE ; INFO: .BLKW 15. ;1 - TTY NUMBER ;2 - LOG IN UIC ;3 - DEFAULT UIC ;4 - TTY # OF OWNER (OR -1) ;5 - REDIRECT UNIT # (OR -1) ;6 - U.STS/U.CTL ;7 - U.ST2 ;8 - U.CW1 ;9 - U.CW2 ;10 - TERMINAL TYPE ;11 - U.CW3 (SPEED) ;12 - U.CW4 (BUF SIZE) ;13 - U.CNT ;14 - U.CBF ;15 - BYTE 36,37 LINES PER PAGE MESG: QIOW$ IO.WVB,5,1,,,,<0,0,40> ;SET-UP FOR OUTPUT CMD: GMCR$ TTABLE: .RAD50 /UNKNWN/ .RAD50 /ASR33 / ;TERMINAL TYPES TABLE .RAD50 /KSR33 / .RAD50 /ASR35 / .RAD50 /LA30S / .RAD50 /LA30P / .RAD50 /LA36 / .RAD50 /VT05B / .RAD50 /VT50 / .RAD50 /VT52 / .RAD50 /VT55 / .RAD50 /VT61 / .RAD50 /LA180S/ .RAD50 /VT100 / .RAD50 /LA120 / STABLE: .WORD 150.,150.,300.,300.,600.,600. ;SPEED VALUE TABLE .WORD 1200.,1200.,1800.,1800. .WORD 2000.,2000.,2400.,2400. .WORD 3600.,3600.,4800.,4800. .WORD 7200.,7200.,9600.,9600. .PAGE ; ; START OF MAIN CODE ; START: DIR$ #CMD ;GET COMMAND LINE IF EXISTS BCS USEOUR ;USE OUR TTY IF ERROR LET R0 := #CMD+G.MCRB ;GET ADDRESS OF COMMAND LINE LET R1 := $DSW ;GET LENGTH OF COMMAND LINE IF R1 LT #4 THEN GOTO USEOUR ;IF NO TTY SPECIFIED, USE OURS FIND 40,1$,SYNERR ;IF CMD LINE, FIND SPACE BEFORE # CALL $COTB ;CONVERT TTY NUMBER IF R1 LT #0 THEN GOTO SYNERR ;NO NEGATIVE TTY #'S IF R1 GT #20 THEN GOTO SYNERR ;WE ONLY HAVE 20 TERMINAL PORTS LET R0 := $DEVHD ;POINT TO DEVICE TABLE WHILE R0 NE #0 ;LOOP THRU ENTIRE DCB TABLE IF D.NAM(R0) EQ #"TT ;GOT A TERMINAL DCB? IF D.UNIT(R0) EQ #0 AND R1 EQ #0 ;LOOKING FOR THE SPECIAL TT0: LET R2 := D.UCB(R0) ;GOT THE CORRECT UCB ADDRESS GOTO GOTTY ;GO PROCESS END ;END IF LET R2 := D.UCB(R0) ;POINT TO THE 1ST UCB LETB R5 := D.UNIT+1(R0) ;GET LAST UNIT # FOR THIS DCB LETB R3 := D.UNIT(R0) ;GET FIRST UNIT # FOR THIS DCB WHILE R3 NE R5 ;CHECK EACH UNIT # FOR THIS DCB IF R3 EQ R1 THEN GOTO GOTTY ;WHEN EQUAL, R2 POINTS TO UCB LET R3 := R3 + #1 ;CHECK NEXT UNIT # LET R2 := R2 + D.UCBL(R0) ;POINT TO NEXT UCB END ;END WHILE END ;END IF LET R0 := D.LNK(R0) ;CHECK NEXT DCB END ;END WHILE (KEEP LOOKING THRU DCB'S) JMP SYNERR ;ERROR IF CAN'T FIND UCB USEOUR: LET R1 := $TKTCB ;OUR CURRENT TCB WILL GET US TO... LET R2 := T.UCB(R1) ;...OUR CURRENT UCB .PAGE ; ; WE GOT THE UCB ADDRESS OF DESIRED TERMINAL ; GOTTY: LET R0 := #INFO ;GET OUR INFORMATION BLOCK LET R5 := R2 ;OUR UCB ADDR IN R5 $CALL TTYNUM ;GO GET TTY # IN (R0)+ LET (R0)+ := U.LUIC(R2) ;GET THE LOG IN UIC LET (R0)+ := U.UIC(R2) ;GET THE DEFAULT UIC IF U.OWN(R2) GT #0 ;DO WE HAVE AN OWNER LET R5 := U.OWN(R2) ;GO TO THE OWNER UCB $CALL TTYNUM ;GO GET OWNER UNIT # ELSE ;IF WE DON'T HAVE AN OWNER... LET (R0)+ := #-1 ;FLAG THE FACT END ;END IF IF U.RED(R2) NE R2 ;ARE WE REDIRECTED? LET R5 := U.RED(R2) ;GO TO THE REDIRECT UCB LET R4 := U.DCB(R5) ;AND GO BACK TO DCB TO GET NAME LET RTYPE := D.NAM(R4) ;STORE OWNER DEVICE NAME $CALL TTYNUM ;GO GET REDIRECT UNIT # ELSE ;IF WE DON'T HAVE A REDIRECT... LET (R0)+ := #-1 ;FLAG THE FACT END ;END IF LET (R0)+ := U.CTL(R2) ;GET U.STS/U.CTL LETB (R0)+ := U.ST2(R2) ;U.ST2 TSTB (R0)+ ;USE A FULL WORD LET (R0)+ := U.CW1(R2) ;U.CW1 LET (R0)+ := U.CW2(R2) ;U.CW2 LET (R0)+ := U.TTYP(R2) ;TERMINAL TYPE LET (R0)+ := U.CW3(R2) ;U.CW3 (SPEED IS IN UPPER BYTE) LET (R0)+ := U.CW4(R2) ;U.CW4 (BUFFER SIZE) LET (R0)+ := U.CNT(R2) ;TERMINAL CHARACTERISTICS LET (R0)+ := U.CBF(R2) ;TERMINAL CHARACTERISTICS LET (R0)+ := 36(R2) ;# OF LINES PER PAGE .PAGE ; ; TIME TO REPORT THE INFO WE COLLECTED ; LET SP := SP - #100. ;MAKE A BUFFER FOR A MESSAGE $CALL PRINT <,#TTY,#INFO> ;PRINT OUR TTY NUMBER LET INFO := #INFO+2 ;SET UP FOR LOGIN UIC OUTPUT SWAB INFO+2 ;GET GROUP, MEMBER STRAIGHT $CALL PRINT <,#LUIC,#INFO> ;PRINT OUR LOGIN UIC LET INFO := #INFO+4 ;SET UP FOR DEFAULT UIC OUTPUT SWAB INFO+4 ;GET GROUP, MEMBER STRAIGHT $CALL PRINT <,#DUIC,#INFO> ;PRINT OUR DEFAULT UIC IF INFO+6 GT #0 $CALL PRINT <,#OTTY,#INFO+6> ;IF WE HAVE OWNER END IF INFO+10 GT #0 $CALL PRINT <,#RTTY,#INFO+10> ;IF WE REDIRECT END $CALL PRINT <,#BUFS,#INFO+26> ;BUFFER SIZE $CALL PRINT <,#LINES,#INFO+34> ;# OF LINES PER PAGE LETB R2 := INFO+25 ;GET SPEED CODE LET R2 := R2 - #24 ;MAKE IT A WORD OFFSET IN STABLE ASH #2,R2 ;MAKE IT A DOUBLE WORD OFFSET LET R2 := R2 + #STABLE ;GET STABLE ADDRESS FOR PRINT $CALL PRINT <,#SPEED,> ;SPEED $CALL PRINT <,#TCHAR,> ;TERMINAL CHARACTERISTICS HEADER .PAGE ; ; ANALYZE U.STS ; LETB R3 := INFO+13 ;GET U.STS IF #US.BSY SET.IN R3 $CALL PRINT <,#BSY> END IF #US.ECH SET.IN R3 $CALL PRINT <,#DSB> END IF #US.CRW SET.IN R3 $CALL PRINT <,#CRW> END IF #US.OUT OFF.IN R3 $CALL PRINT <,#OUT> END ; ; ANALYZE U.ST2 ; LET R3 := INFO+14 ;GET U.ST2 IF #US.UMD SET.IN R3 $CALL PRINT <,#UMD> END IF #US.PUB SET.IN R3 $CALL PRINT <,#PUB> END IF #US.RED OFF.IN R3 $CALL PRINT <,#RED> END IF #US.OFL SET.IN R3 $CALL PRINT <,#OFL> END IF #100 SET.IN R3 $CALL PRINT <,#ABS> END .PAGE ; ANALYZE U.CW1 LET R3 := INFO+16 ;GET U.CW1 IF #DV.OSP SET.IN R3 $CALL PRINT <,#OSP> END IF #DV.ISP SET.IN R3 $CALL PRINT <,#ISP> END IF #DV.SWL SET.IN R3 $CALL PRINT <,#SWL> END IF #DV.MXD SET.IN R3 $CALL PRINT <,#MXD> END IF #DV.SQD SET.IN R3 $CALL PRINT <,#SQD> END IF #DV.DIR SET.IN R3 $CALL PRINT <,#DIR> END IF #DV.TTY SET.IN R3 $CALL PRINT <,#TTYD> END IF #DV.CCL SET.IN R3 $CALL PRINT <,#CCL> END IF #DV.REC SET.IN R3 $CALL PRINT <,#REC> END .PAGE ; ; ANALYZE U.CW2 ; LET R3 := INFO+20 ;GET U.CW2 IF #U2.DH1 SET.IN R3 $CALL PRINT <,#DH1> END IF #U2.RMT SET.IN R3 $CALL PRINT <,#RMT> END IF #U2.L8S SET.IN R3 $CALL PRINT <,#L8S> END IF #U2.NEC SET.IN R3 $CALL PRINT <,#NEC> END IF #U2.CRT SET.IN R3 $CALL PRINT <,#CRT> END IF #U2.ESC SET.IN R3 $CALL PRINT <,#ESC> END IF #U2.LOG SET.IN R3 $CALL PRINT <,#NLOG> END IF #U2.LOG OFF.IN R3 $CALL PRINT <,#LOG> END IF #U2.SLV SET.IN R3 $CALL PRINT <,#SLV> END IF #U2.DZ1 SET.IN R3 $CALL PRINT <,#DZ1> END IF #U2.HLD SET.IN R3 $CALL PRINT <,#HLD> END IF #U2.AT. SET.IN R3 $CALL PRINT <,#ATT> END IF #U2.PRV SET.IN R3 $CALL PRINT <,#PRV> END IF #U2.L3S SET.IN R3 $CALL PRINT <,#L3S> END IF #U2.VT5 SET.IN R3 $CALL PRINT <,#VT5> END IF #U2.LWC SET.IN R3 $CALL PRINT <,#LWC> END .PAGE ; ; ANALYZE U.CNT ; LETB R3 := INFO+30 ;U.CNT (LOWER BYTE) LETB R4 := INFO+31 ;U.CNT (UPPER BYTE) IF #1 SET.IN R3 $CALL PRINT <,#WRP> END LET R3 := R4 ;COPY R4 BIC #177770,R3 ;GET ONLY HFILL VALUE LET INFO+30 := R3 ;RESTORE IT FOR PRINT IF #20 SET.IN R4 $CALL PRINT <,#HHT,#INFO+30> END IF #10 SET.IN R4 $CALL PRINT <,#VFL> END IF #40 SET.IN R4 $CALL PRINT <,#FRM> END IF #200 SET.IN R4 $CALL PRINT <,#FDX> END ; ANALYZE U.CBF LET R3 := INFO+32 ;U.CBF IF #200 SET.IN R3 $CALL PRINT <,#EBC> END IF #100 SET.IN R3 $CALL PRINT <,#TYPA> END IF #10 SET.IN R3 $CALL PRINT <,#RPA> END ; PRINT TERMINAL TYPE LET R2 := INFO+22 ;GET TTY TYPE NUMBER CODE IF R2 GT #16 THEN LET R2 := #0 ;PRINT UNKNWN IF UNKNOWN ASH #2,R2 ;MAKE DOUBLE WORD OFFSET LET R2 := R2 + #TTABLE ;GET POINTER INTO TERM TYPE TABLE $CALL PRINT <,#TTYPE> EXIT$S .PAGE ; ; PRINT MESSAGE ROUTINE ; PROCEDURE PRINT,LOCAL LET R0 := SP + #2 ;PLACE FOR MESSAGE CALL $EDMSG ;FORMAT THE MESSAGE LET MESG+Q.IOPL := SP + #2 ;SET UP MESSAGE ADDRESS LET MESG+Q.IOPL+2 := R1 ;SET UP LENGTH DIR$ #MESG ;DO THE OUTPUT DSWERR RETURN ; ; CALCULATE TTY NUMBER ; INPUT R5=UCB ADDR, OUTPUT (R0)+=TTY NUMBER PROCEDURE TTYNUM,LOCAL PUSH R4 ;SAVE REGS PUSH R3 ; PUSH R2 ; PUSH R1 ; LET R4 := U.DCB(R5) ;GET BACK TO DCB LET R2 := D.UCBL(R4) ;GET LENGTH OF A UCB LETB R1 := D.UNIT(R4) ;GET LOWEST UNIT NUMBER LET R3 := D.UCB(R4) ;GET ADDRESS OF 1ST UCB LET R5 := R5 - R3 ;CALC OFFSET LET R4 := #0 ;CLEAR R4 FOR DIVIDE LET R4 := R4 / R2 ;DIVIDE BY SIZE OF UCB LET (R0) := R1 ;GET ACTUAL UNIT # LET (R0)+ := (R0)+ + R4 ; POP R1 ;RETRIEVE REGS POP R2 ; POP R3 ; POP R4 ; RETURN ; ; SYNTAX ERROR IN COMMAND LINE ; SYNERR: QIOW$C IO.WVB,5,1,,,, DSWERR EXIT$S .END START