.TITLE TRMSET - SET TERMINAL ATTRIBUTES .IDENT /Y01.01/ .SBTTL TITLE PAGE .ENABLE LC ;ENABLE LOWER CASE .LIST MEB ;LIST CODE FROM MACROS ; ;**- ; Module name: TRMSET - SET TERMINAL ATTRIBUTES ; ; Version Y01.01 Last edit: 01-DEC-80 13:42 ; Status: Released for test ; ; Revision history: ; ; Version X01.00 21-NOV-80 12:26 - 26-NOV-80 08:31 ; Created by: K.J. CROSS ; ; Version Y01.00 26-NOV-80 08:31 - 01-DEC-80 13:41 ; Modified by: KJC ; ; Version Y01.01 01-DEC-80 13:42 - 01-DEC-80 13:42 ; Modified by: KJC ; SET /LOWER EXPLICITLY ; ;**- ; ; THIS PROGRAM IS (NORMALLY) RUN WHEN A TERMINAL IS LOGGED ONTO THE ; SYSTEM. IT TRIES TO DETERMINE THE TYPE OF TERMINAL YOU ARE ON AND ; SET THE CHARACTERISTICS OF THE TERMINAL APPROPRIATELY. ; ; THE FOLLOWING TERMINALS ARE SUPPORTED: ; ; 1. VT100 - RETURNS "[?1,*c" WHERE * IS 1, 2, OR 3 ; WHEN IN ANSI MODE, OR "/M" WHEN IN ; VT52 EMULATION MODE IN RESPONSE TO "WHAT ARE YOU" ; 2. VT52/55 - RETURNS "/K" OR "/E" ; IN RESPONSE TO "WHAT ARE YOU" ; 3. LA120 - RETURNS "[?2c" IN RESPONSE TO "WHAT ARE YOU" ; 4. TEKTRONIX 4006 - RETURNS NOTHING IN RESPONSE TO "WHAT ARE YOU", ; BUT SPEED IS SET AT 4800 BAUD ; ; IF NONE OF THE ABOVE ARE DETECTED, THEN THE TERMINAL IS SET TO LOWER ; CASE AND, IF THE SPEED IS GREATER THAN 300 BAUD, SET TO A CRT. ; .SBTTL MACRO CALLS AND DEFINITIONS ; ; MACROS. ; .MCALL TTSYM$ ;TERMINAL SYMBOLS TTSYM$ .MCALL QIOW$C,QIOW$S,QIO$C ;QIO .MCALL DSCP$S ;DISABLE CHECKPOINTING .MCALL MRKT$C ;MARK TIME .MCALL STLO$C ;STOP FOR LOGICAL OR .MCALL WTLO$C ;WAIT FOR LOGICAL OR .MCALL RDAF$C ;READ ALL EVENT FLAGS .MCALL EXST$S,EXIT$S ;TASK EXIT .MCALL ALUN$C ;ASSIGN LUN .MCALL GLUN$C ;GET LUN INFO ; ; MACRO TO GENERATE THE ESCAPE SEQUENCE TABLE. THE ESCAPE SEQUENCE ; IS STORED IN PSECT "SEQTBL". THE TABLE CONTAINS THE ADDRESS OF THE ; ESCAPE SEQUENCE IN THE FIRST WORD, THE LENGTH IN THE SECOND, THE ; ADDRESS OF THE SF.SMC LIST IN THE THIRD, THE LENGTH OF THE SF.SMC ; LIST IN THE FOURTH, AND THE ADDRESS OF A SPECIAL SERVICE ROUTINE ; IN THE FIFTH. ; .MACRO ESCSEQ SEQUEN,SMCADD,SMCLEN,ROUTIN .PSECT SEQTBL D $$$ = . .BYTE SEQUEN $$$$ = .-$$$ ;NUMBER OF CHARACTERS .PSECT .WORD $$$,$$$$,SMCADD,SMCLEN,ROUTIN TBLENT = 5*2 ;LENGTH OF A TABLE ENTRY .ENDM ESCSEQ .SBTTL LOCAL DEFINITIONS ; ; LOCAL DEFINITIONS. ; ESC = 33 ;ESCAPE CHARACTER TILUN = 1 ;LUN ASSIGNED TO TI: TEKTYP = T.USR0 ;TERMINAL TYPE FOR TEKTRONIX UNKTYP = T.USR1 ;UNKNOWN TERMINAL TYPE CRTTYP = T.USR2 ;FOREIGN CRT TERMINAL TIMOUT = 20. ;NO. OF TICKS FOR TERM TO RESPOND TMOEFN = 2 ;EVENT FLAG FOR MARK TIME TI.MSK = 1 ;TI: EVENT FLAG MASK MT.MSK = 2 ;MARK TIME EVENT FLAG MASK WT.MSK = TI.MSK!MT.MSK ;"OR" OF EVENT FLAG MASKS .SBTTL LOCAL DATA ; ; LOCAL DATA AREAS. ; DRVSUP: .BLKW 4 ;TERMINAL DRIVER SUPPORT REQSUP: .WORD F1.ESQ!F1.RNE!F1.RPR!F1.TRW ;REQUIRED SUPPORT .WORD F2.SCH!F2.GCH ; FOR THIS PROGRAM TO WORK IOSB: .BLKW 2 ;I/O STATUS GMCLST: ;LIST FOR SF.GMC GMCSPD: .BYTE TC.XSP,0 ; TRANSMIT SPEED GMCSIZ = .-GMCLST ;LENGTH OF SF.GMC LIST SETESQ: .BYTE TC.ESQ,1 ;ENABLE ESCAPE SEQUENCES ENQ1: .BYTE ESC,'Z ;"WHAT ARE YOU?" (VTXXX) ENQ1L = .-ENQ1 ENQ2: .BYTE ESC,'[,'c ;"WHAT ARE YOU?" (LA120) ENQ2L = .-ENQ2 .EVEN EFNBUF: ;READ EVENT FLAG BUFFER GLUNBF: .BLKW 6 ;FOR GETLUN ANSWER: .BLKB 20. ;BUFFER FOR RESPONSE ANSLEN = .-ANSWER ; ; THE FOLLOWING TABLE CONTAINS THE LIST OF TERMINAL LINES TO ; SKIP, I.E., IF 3 IS IN THE TABLE, DON'T DO ANY PROCESSING ON TT3:. ; THE TABLE IS TERMINATED WITH -1. ; SKIP: .WORD 0 ;TT0: .WORD -1 ;END OF LIST .EXSTS: .WORD 0 ;TASK'S EXIT STATUS SVT52: ;SF.SMC FOR VT52/VT55 .BYTE TC.TTP,T.VT52 ;SET /VT52 .BYTE TC.SMR,1 ;SET /LOWER=TI: .BYTE TC.ESQ,1 ;SET /ESCSEQ .BYTE TC.HFF,0 ;SET /NOFORMFEED .BYTE TC.HHT,1 ;SET /HHT (HARDWARE TABS) VT5SIZ = .-SVT52 SVT100: ;SF.SMC FOR VT100 .BYTE TC.TTP,T.V100 ;SET /VT100 .BYTE TC.SMR,1 ;SET /LOWER=TI: .BYTE TC.ESQ,1 ;SET /ESCSEQ .BYTE TC.HFF,0 ;SET /NOFORMFEED .BYTE TC.HHT,1 ;SET /HHT (HARDWARE TABS) VT1SIZ = .-SVT100 SLA120: ;SF.SMC FOR LA120 .BYTE TC.TTP,T.L120 ;SET /LA120 .BYTE TC.ESQ,1 ;SET /ESCSEQ .BYTE TC.SMR,1 ;SET /LOWER=TI: .BYTE TC.HFF,1 ;SET /FORMFEED .BYTE TC.HHT,1 ;SET /HHT (HARDWARE TABS) LA1SIZ = .-SLA120 STEK06: ;SF.SMC FOR TEKTRONIX 4006/4010 .BYTE TC.TTP,TEKTYP ;SET /TERM=TI:16. .BYTE TC.ESQ,0 ;SET /NOESCSEQ .BYTE TC.HFF,1 ;SET /FORMFEED (FOR ERASE SCREEN) .BYTE TC.HHT,0 ;SET /NOHHT (HARDWARE TABS) .BYTE TC.SCP,0 ;SET /NOCRT .BYTE TC.SMR,0 ;SET /NOLOWER .BYTE TC.WID,74. ;SET /BUF=TI:74. .BYTE TC.LPP,34. ;SET /LINES=TI:34. TEKSIZ = .-STEK06 STI700: ;SF.SMC FOR TI SILENT-700 .BYTE TC.TTP,UNKTYP ;SET /TERM=TI:17. .BYTE TC.ESQ,0 ;SET /NOESCSEQ .BYTE TC.HFF,0 ;SET /NOFORMFEED .BYTE TC.HHT,0 ;SET /NOHHT (HARDWARE TABS) .BYTE TC.SCP,0 ;SET /NOCRT .BYTE TC.SMR,1 ;SET /LOWER .BYTE TC.WID,80. ;SET /BUF=TI:80. .BYTE TC.LPP,66. ;SET /LINES=TI:66. TI7SIZ = .-STI700 SCRT: ;SF.SMC FOR FOREIGN CRT .BYTE TC.TTP,CRTTYP ;SET /TERM=TI:18. .BYTE TC.ESQ,0 ;SET /NOESCSEQ .BYTE TC.HFF,0 ;SET /NOFORMFEED .BYTE TC.HHT,0 ;SET /NOHHT (HARDWARE TABS) .BYTE TC.LPP,24. ;SET /LINES=TI:24. .BYTE TC.SCP,1 ;SET /CRT=TI: .BYTE TC.SMR,1 ;SET /LOWER=TI: .BYTE TC.WID,80. ;SET /BUF=TI:80. CRTSIZ = .-SCRT ; ; THE FOLLOWING TABLE LISTS ALL THE THE RECOGNIZED ESCAPE SEQUENCES. ; ; THE ENTRIES CONTAIN THE ESCAPE SEQUENCE, THE ADDRESS AND LENGTH OF ; THE SF.SMC LIST, AND (OPTIONALLY) A SPECIAL ROUTINE TO CALL FOR THAT ; TERMINAL TO SET UP ANYTHING ELSE SPECIAL. ; ESCTBL: ;START OF TABLE ESCSEQ ,SVT52,VT5SIZ ;VT52 ESCSEQ ,SVT52,VT5SIZ ;VT55 (SAME AS VT52) ESCSEQ ,SVT52,VT5SIZ ;VT100 IN VT52 MODE ESCSEQ ,SLA120,LA1SIZ ;LA120 ESCSEQ ,SVT100,VT1SIZ ;VT100 ESCSEQ ,SVT100,VT1SIZ ;VT100 (WITH AVO) ESCSEQ ,SVT100,VT1SIZ ;VT100 (WITH AVO AND PRINTER) .WORD 0 ;END OF TABLE .SBTTL INITIALIZATION .NLIST MEB ; ; START BY ASSIGNING THE LUN TO TI:. IF TI: IS IN THE LIST OF LINES ; TO IGNORE, EXIT IMMEDIATELY. ; TRMSET: ;PROGRAM ENTRY POINT ALUN$C TILUN,TI,0 ;ASSIGN LUN TO TI: BCS EXERR ;IF CS, FORGET IT GLUN$C TILUN,GLUNBF ;GET LUN INFO BCS EXERR ;IF CS, ??? MOvb GLUNBF+G.LUNU,R0 ;GET UNIT NUMBER MOV #SKIP,R1 ;GET ADDR OF SKIP TABLE 10$: TST (R1) ;END OF TABLE? BLT 20$ ;IF LT, YES CMP (R1)+,R0 ;IN TABLE? BNE 10$ ;IF NE, NO BR EXSUC ;YES - SKIP IT 20$: QIOW$C IO.GTS,TILUN,TILUN,,IOSB,, ;GET TERMINAL SUPPORT BCS EXERR ;??? CMPB #IS.SUC,IOSB ;OK? BNE EXWAR ;EXIT WITH WARNING - NOTHING DONE MOV DRVSUP,R0 ;GET 1ST WORD MOV REQSUP,R1 ;GET REQUIRED MASK COM R1 ;SET UP FOR BIC BIC R1,R0 ;CLEAR EXTRANEOUS BITS COM R1 ;GET REQUIRED BIT MASK CMP R1,R0 ;TTDRV HAVE REQUIRED FEATURES? BNE EXWAR ;IF NE, NO - CAN'T FINISH MOV DRVSUP+2,R0 ;GET 2ND WORD MOV REQSUP+2,R1 ;GET REQUIRED MASK COM R1 ;SET UP FOR BIC BIC R1,R0 ;CLEAR EXTRANEOUS BITS COM R1 ;GET REQUIRED BIT MASK CMP R1,R0 ;TTDRV HAVE REQUIRED FEATURES? BNE EXWAR ;IF NE, NO - CAN'T FINISH ; ; ATTACH AND ENABLE ESCAPE SEQUENCE HANDLING. ; QIOW$C IO.ATT!TF.ESQ,TILUN,TILUN BCS EXERR ;??? QIOW$C SF.SMC,TILUN,TILUN,,IOSB,, ;ENABLE ESCAPE SEQUENCES BCS EXERR ;??? CMPB #IS.SUC,IOSB ;OK? BNE EXERR ;IF NE, NO - SOMETHINGS WRONG ; ; FINALLY, CALL THE ROUTINES TO DO EVERYTHING. ; CALL FINDIT ;FIND THE TYPE OF TERMINAL IT IS QIOW$S #SF.SMC,#TILUN,#TILUN,,#IOSB,, ;SET ITS CHARACTERISTICS BCS EXERR ;??? CMPB #IS.SUC,IOSB ;OK BNE EXWAR ;IF NE, NO TST R3 ;ANY SUBROUTINE? BEQ EXSUC ;IF EQ, NO CALL (R3) ;CALL IT ; ; ON ALL BUT A SUCCESSFUL EXIT, RESET THE TERMINAL TO SET /NOESCSEQ. ; EXSUC: MOV #EX$SUC,.EXSTS ;SUCCESSFUL EXIT BR TRMEX1 EXWAR: MOV #EX$WAR,.EXSTS ;WARNING EXIT BR TRMEX EXERR: MOV #EX$ERR,.EXSTS ;ERROR EXIT TRMEX: CLRB SETESQ+1 ;SET /NOESCSEQ QIOW$C SF.SMC,TILUN,TILUN,,,, TRMEX1: EXST$S .EXSTS ;EXIT WITH STATUS EXIT$S ;(GO HERE IF EXST$S FAILS) .SBTTL FINDIT - DETERMINE THE TERMINAL TYPE ; ; THE TERMINAL TYPE IS DETERMINED BY SENDING A "WHAT ARE YOU" REQUEST TO ; THE TERMINAL AND CHECKING ITS RESPONSE. IF IT DOESN'T RESPOND (WITHIN ; "TIMOUT" TICKS), THEN IT IS ASSUMED TO BE A FOREIGN TERMINAL. IN THIS ; CASE, IF ITS SPEED IS GREATER THAN 300 BAUD, IT IS SET TO A CRT WITH ; LOWER CASE. OTHERWISE, IT IS SET TO A SILENT-700 TYPE TERMINAL. ; ; IF IT DOES RESPOND, THEN ITS RESPONSE IS CHECKED AGAINST THE TABLE ; TO DETERMINE WHAT TYPE OF TERMINAL IT IS AND THE CHARACTERISTICS THAT ; SHOULD BE SET FOR IT. ; ; THE TERMINAL IS ATTACHED AT THIS POINT, AND IS SET WITH ESCAPE SEQUENCES ; ENABLED. ; ; ON EXIT: R1 = ADDRESS OF SF.SMC CHARACTERISTICS TO SET ; R2 = LENGTH OF THE SF.SMC LIST ; R3 = ADDRESS OF SPECIAL SUBROUTINE ; .ENABL LSB FINDIT: QIOW$C IO.WAL,TILUN,TILUN,,IOSB,, ;"WHAT ARE YOU?" BCS EXERR ;??? CMPB #IS.SUC,IOSB ;OK? BNE EXWAR ;IF NE, NO ; ; NOW TRY TO READ AN ESCAPE SEQUENCE. SET A TIMEOUT OF "TIMOUT" TICKS. ; ; (NOTE - THE TASK MUST BE NON-CHECKPOINTABLE FOR THE QIO TO NOT WAIT) ; DSCP$S ;DISABLE CHECKPOINTING QIO$C IO.RNE,TILUN,TILUN,,IOSB,, ;GET RESPONSE MRKT$C TMOEFN,TIMOUT,1 ;WAIT "TIMOUT" TICKS WTLO$C 0,WT.MSK ;WAIT FOR RESPONSE OR TIMEOUT 10$: RDAF$C EFNBUF ;READ THE EVENT FLAGS BIT #TI.MSK,EFNBUF ;TI: READ FINISH? BNE 50$ ;IF NE, YES ; ; THE TERMINAL DIDN'T RESPOND TO THE FIRST "WHAT ARE YOU" MESSAGE. TRY ; ANOTHER ONE (ANSI COMPATIBLE - LA120 OR VT100) ; QIOW$C IO.KIL,TILUN,TILUN ;KILL PENDING REQUEST QIOW$C IO.WAL,TILUN,TILUN,,IOSB,, ;"WHAT ARE YOU?" BCS EXERR ;??? CMPB #IS.SUC,IOSB ;OK? BNE EXWAR ;IF NE, NO ; ; NOW TRY TO READ AN ESCAPE SEQUENCE. SET A TIMEOUT OF "TIMOUT" TICKS. ; QIO$C IO.RNE,TILUN,TILUN,,IOSB,, ;GET RESPONSE MRKT$C TMOEFN,TIMOUT,1 ;WAIT "TIMOUT" TICKS WTLO$C 0,WT.MSK ;WAIT FOR RESPONSE OR TIMEOUT 20$: RDAF$C EFNBUF ;READ THE EVENT FLAGS BIT #TI.MSK,EFNBUF ;TI: READ FINISH? BNE 50$ ;IF NE, YES ; ; THE TERMINAL DID NOT RESPOND. TRY TO GET THE TERMINAL'S SPEED. ; 30$: QIOW$C IO.KIL,TILUN,TILUN ;KILL PENDING REQUEST QIOW$C SF.GMC,TILUN,TILUN,,IOSB,, BCS EXERR ;??? CLR R3 ;NO SPECIAL SUBROUTINE IF UNKNOWN MOVB GMCSPD+1,R0 ;GET THE SPEED CMPB #S.4800,R0 ;4800 BAUD? BNE 40$ ;IF NE, NO MOV #STEK06,R1 ;ASSUME TEKTRONIX MOV #TEKSIZ,R2 ; CHARACTERISTICS BR 90$ ;EXIT 40$: MOV #SCRT,R1 ;ASSUME NON-STANDARD CRT MOV #CRTSIZ,R2 ; ... CMP R0,#S.300 ;IS IT > 300 BAUD? BGT 90$ ;IF GT, YES - CRT MOV #STI700,R1 ;ASSUME SILENT-700 MOV #TI7SIZ,R2 ; TYPE TERMINAL BR 90$ ;EXIT ; ; THE TERMINAL RESPONDED TO THE "WHAT ARE YOU". ; CHECK THE RESPONSE AGAINST THE TABLE. IF NOT FOUND, HANDLE ; LIKE NO RESPONSE. ; 50$: CMP #IS.ESQ,IOSB ;SUCCESSFUL ESCAPE SEQUENCE? BNE 30$ ;IF NE, NO - ASSUME NO RESPONSE MOV #ESCTBL,R0 ;GET ADDRESS OF ESCAPE SEQUENCE TABLE 60$: TST (R0) ;END OF TABLE? BEQ 30$ ;IF EQ, YES - NOT FOUND CMP 2(R0),IOSB+2 ;LENGTH OF ESCAPE SEQUENCES MATCH? BNE 80$ ;IF NE, NO - KEEP TRYING MOV (R0),R3 ;GET ADDRESS OF SEQUENCE IN TABLE MOV 2(R0),R1 ;GET LENGTH OF SEQUENCE MOV #ANSWER,R2 ;GET SEQUENCE RETURNED BY TERMINAL 70$: CMPB (R2)+,(R3)+ ;MATCH? BNE 80$ ;IF NE, NO SOB R1,70$ ;CHECK ENTIRE SEQUENCE MOV 4(R0),R1 ;GET ADDRESS OF SMC LIST MOV 6(R0),R2 ;GET LENGTH OF SMC LIST MOV 8.(R0),R3 ;GET ADDRESS OF SPECIAL SUBROUTINE BR 90$ ;EXIT HAPPILY 80$: ADD #TBLENT,R0 ;COMPUTE ADDRESS OF NEXT TABLE ENTRY BR 60$ ;TRY IT 90$: RETURN ;R1 = ADDRESS OF SMC LIST, R2 = LENGTH ;R3 = ADDRESS OF SPECIAL SUBROUTINE .DSABL LSB .END TRMSET