.TITLE SCREEN - DO SCREEN FORMATTING .IDENT /01/ .ENABL LC ;+ ; ; Free software BY ; Project Software & Development, Inc. ; ; This software is furnished for free and may be used and copied as ; desired. This software or any other copies thereof may be provided ; or otherwise made available to any other person. No title to and ; ownership of the software is hereby transferred or allowed. ; ; The information in this software is subject to change without notice ; and should not be construed as a commitment by PROJECT SOFTWARE ; AND DEVELOPMENT, INC. ; ; PROJECT SOFTWARE assumes no responsibility for the use or reliability ; of this software on any equipment whatsoever. ; ; Project Software & Development, Inc. ; 14 Story St. ; Cambridge, Ma. 02138 ; 617-661-1444 ; ; ; Title: SCREEN ; Author: Robin Miller ; Date: October 28, 1981 ; ; Description: ; ; These routines do the screen formatting for the VT52, VT100, ; and Tektronix scopes. ; ; ; Modification History: ; ;- .ENABL AMA .NLIST BEX .MCALL DIR$, GTSK$, MRKT$, QIOW$, QIOW$S, QIO$, WTSE$ ; ; Local/Global equates. ; NULL = 0 ; ASCII FOR NULL FF = 14 ; ASCII FOR FORM FEED LF = 12 ; ASCII FOR LINE FEED CR = 15 ; ASCII FOR CARRIAGE RETURN ESC = 33 ; ASCII FOR ESCAPE ; ; Terminal type offsets. ; O.HARD == 0 ; HARDCOPY TERMINAL O.VT52 == 2 ; VT52 TERMINAL O.VAVO == 4 ; VT100 W/ADVANCED VIDEO OPTION O.V100 == 6 ; VT100 WITHOUT AVO O.TEK == 10 ; TEKTRONIX SCOPE ; ; Local storage. ; BUF132: .BYTE TC.WID ; SET WIDTH .BYTE 132. ; TO 132. CHARACTERS TTYST: .BYTE TC.TTP ; GET TERMINAL TYPE TTYPE:: .BYTE T.V100 ; INITIALIZE TO VT100 WIDBUF:: .BYTE TC.WID ; GET/SET TERMINAL WIDTH WIDTH:: .BYTE 80. ; INITIALIZE TO 80 COLUMNS TTYSIZ = .-TTYST ; SIZE OF STATUS TABLE TSKBUF: .BLKW 16. ; STORAGE FOR TASK PARAMETERS TEMP: .BLKW 10. ; TEMPORARY BUFFER SPACE TERM:: .WORD 0 ; TERMINAL TYPE VAXFLG:: .WORD 0 ; VAX/VMS INDICATOR CRTFLG:: .BYTE 1 ; CRT FLAG TRUE = 1 FLG132:: .BYTE 0 ; WIDTH CHANGED TRUE = 1 VT1OPT: .ASCII %<% ; SET VT100 TO ANSI MODE .ASCII %[c%<0> ; VT100 GET OPTIONS PRESENT .EVEN .SBTTL DIRECTIVE PARAMETER BLOCKS GETCHA: QIOW$ SF.GMC,OUTLUN,OUTEFN,,TIOSB,, ; GET TERM. CHAR. GETTSK: GTSK$ TSKBUF ; GET TASK PARAMETERS SET132: QIOW$ SF.SMC,OUTLUN,OUTEFN,,TIOSB,, ; SET WIDTH TO 132. MRKTIM: MRKT$ MRKEFN,2,2 ; MARK TIME FOR 2 SECONDS MRKWAT: WTSE$ MRKEFN ; WAIT FOR MARK TIME READOP: QIO$ IO.RAL!IO.RNE,OUTLUN,OUTEFN,,TIOSB,, ; VT100 OPTIONS KILLIO: QIOW$ IO.KIL,OUTLUN,OUTEFN,,TIOSB ; KILL I/O DPB .SBTTL GTTYPE - GET TERMINAL TYPE ;+ ; ; GTTYPE - Get terminal type. ; ;- GTTYPE:: CALL $SAVAL ; SAVE R0 - R5 DIR$ #GETTSK ; GET TASK PARAMETERS CLR TERM ; PRESUME HARDCOPY TERMINAL CLRB VAXFLG ; PRESUME NOT ON VAX/VMS CMPB #5,TSKBUF+G.TSSY ; ARE WE ON VAX/VMS ? BNE 5$ ; IF NE, NO INCB VAXFLG ; YES, SHOW THAT WE ARE 5$: DIR$ #GETCHA ; GET TERMINAL CHARACTERISTICS CMPB WIDTH,#131. ; IS WIDTH SET UP OK ? BPL 10$ ; IF PL, YES DIR$ #SET132 ; NOPE, SET IT TO 132. CHAR. INCB FLG132 ; SHOW TERMINAL WIDTH MODIFIED 10$: CMPB #T.V100,TTYPE ; IS THIS A VT100 ? BNE 20$ ; IF NE, NO MOV #O.VAVO,TERM ; PRESUME VT100 WITH AVO MOV #VT1OPT,R4 ; SET TO GET VT100 OPTIONS CALL WRITE ; AND GO DO IT DIR$ #READOP ; ISSUE READ TO GET OPTIONS DIR$ #MRKTIM ; WAIT 2 SECONDS FOR I/O DIR$ #MRKWAT ; WAIT FOR MARK TIME DIR$ #KILLIO ; KILL I/O (INCASE NOT VT100) CMPB TEMP+5,#'0 ; VT100 WITH NO OPTIONS ? BNE 100$ ; IF NE, NO MOV #O.V100,TERM ; VT100 WITHOUT AVO BR 100$ ; AND CONTINUE 20$: CMPB #T.VT52,TTYPE ; IS THIS A VT52 ? BNE 30$ ; IF NE, NO MOV #O.VT52,TERM ; SHOW VT52 TERMINAL BR 100$ ; AND CONTINUE 30$: CMPB #T.L180,TTYPE ; IS THIS AN LA180 ? BEQ 50$ ; IF EQ, YES CMPB #T.L120,TTYPE ; IS THIS AN LA120 ? BEQ 50$ ; IF EQ, YES ; VAX/VMS can set /UNKNOWN for Tektronix, RSX-11M can not. ; For RSX-11M the Tektronix should be set to an LA36. CMPB #T.UNK0,TTYPE ; UNKNOWN TERMINAL ? BEQ 40$ ; YES, PRESUME TEKTRONIX CMPB #T.LA36,TTYPE ; IS THIS AN LA36 ? BNE 50$ ; IF NE, NO (MUST BE HARDCOPY) MOVB #T.UNK0,TTYPE ; USE T.UNK0 FOR TEKTRONIX 40$: MOV #O.TEK,TERM ; SHOW TEKTRONIX SCOPE BR 100$ ; AND CONTINUE ... 50$: MOV #-1,MAXLIN ; SET UP FOR HARDCOPY CLRB CRTFLG ; FLAG HARDCOPY TERMINAL 100$: RETURN .SBTTL CLRSCR - CLEAR TERMINAL SCREEN ;+ ; ; CLRSCR - Clear terminal screen. ; ;- CLRSCR:: CALL $SAVAL ; SAVE R0 - R5 MOV #100$,R0 ; GET START OF TABLE CALL DOTYPE ; GO TYPE IT OUT CMPB TERM,#O.TEK ; IS THIS A TEKTRONIX ? BNE 10$ ; IF NE, NO DIR$ #MRKTIM ; WAIT FOR 2 SECONDS BCS 10$ ; IF CS, WE FAILED DIR$ #MRKWAT ; WAIT FOR THE MARK TIME 10$: RETURN 100$: .WORD 110$,120$,130$,130$,140$ 110$: .BYTE ,<0> ; FOR HARDCOPY TERMINAL 120$: .BYTE ,'H,,'J,<0> ; VT52 HOME, CLEAR SCREEN 130$: .ASCII %[H%%[J%<0> ; VT100 HOME, CLEAR SCREEN 140$: .BYTE ,,<0> ; TEKTRONIX CLEAR SCREEN .EVEN .SBTTL CLRPAG - CLEAR CURRENT PAGE ;+ ; ; CLRPAG - Clears the current page on the terminal. ; ; On the VT52 and VT100 terminals, the file name is not erased ; from the screen. On the Tektronix, the entire screen is ; erased since partial erases are not possible. ; ;- CLRPAG:: CALL $SAVAL ; SAVE R0 - R5 CMPB TERM,#O.TEK ; IS THIS A TEKTRONIX ? BNE 10$ ; IF NE, NO CALL WRTHDR ; WRITE THE FILE NAME BR 20$ ; BR TO CONTINUE ... 10$: MOV #100$,R0 ; GET START OF TABLE CALL DOTYPE ; GO TYPE IT OUT 20$: RETURN 100$: .WORD 110$,120$,130$,130$,NULL 110$: .BYTE ,<0> ; FOR HARDCOPY TERMINAL 120$: .BYTE ,'Y,42,40 ; VT52 LINE 3, COLUMN 1 .BYTE ,'J ; VT52 CLEAR SCREEN .BYTE ,'Y,41,40,<0> ; VT52 LINE 2, COLUMN 1 130$: .ASCII %[3;1H% ; VT100 LINE 3, COLUMN 1 .ASCII %[J% ; VT100 CLEAR SCREEN .ASCII %[2;1H%<0> ; VT100 LINE 2, COLUMN 1 .EVEN .SBTTL SETTOP - Position to top of screen. ;+ ; ; SETTOP - Position at top of screen under the file name. ; ;- SETTOP:: CALL $SAVAL ; SAVE R0 - R5 CMPB TERM,#O.TEK ; IS THIS A TEKTRONIX ? BNE 10$ ; IF NE, NO CALL WRTHDR ; WRITE THE FILE NAME BR 20$ ; BR TO CONTINUE ... 10$: MOV #100$,R0 ; GET START OF TABLE CALL DOTYPE ; GO TYPE IT OUT 20$: RETURN 100$: .WORD 110$,120$,130$,130$,NULL 110$: .BYTE ,<0> ; FOR HARDCOPY TERMINAL 120$: .BYTE ,'Y,41,40 ; VT52 LINE 2, COLUMN 1 .ASCII %K%<0> ; VT52 ERASE TO END OF LINE 130$: .ASCII %[2;1H% ; VT100 LINE 2, COLUMN 1 .ASCII %[K%<0> ; VT100 ERASE TO END OF LINE .EVEN .SBTTL NXTPAG - NEXT PAGE PROCESSING ;+ ; ; NXTPAG - Next page processing. ; ;- NXTPAG:: CALL $SAVAL ; SAVE R0 - R5 CMPB TERM,#O.TEK ; IS THIS A TEKTRONIX ? BNE 10$ ; IF NE, NO CALL WRTHDR ; WRITE THE FILE NAME BR 20$ ; BR TO CONTINUE ... 10$: MOV #100$,R0 ; GET START OF TABLE CALL DOTYPE ; GO TYPE IT OUT 20$: RETURN 100$: .WORD 110$,120$,130$,140$,NULL 110$: .BYTE ,<0> ; FOR HARDCOPY TERMINAL 120$: .BYTE ,'Y,41,40 ; VT52 LINE 2, COLUMN 1 .BYTE ,'J,<0> ; VT52 CLEAR SCREEN ; VT100 with AVO. 130$: .ASCII %[24;1H% ; VT100 LINE 24, COLUMN 1 .ASCII %[J% ; VT100 CLEAR SCREEN .ASCII %[23;1H%<0> ; VT100 LINE 23, COLUMN 1 ; VT100 without AVO. 140$: .ASCII %[14;1H% ; VT100 LINE 14, COLUMN 1 .ASCII %[J% ; VT100 CLEAR SCREEN .ASCII %[13;1H%<0> ; VT100 LINE 13, COLUMN 1 .EVEN .SBTTL ADDATR - ADD ATTRIBUTES TO VT100 ;+ ; ; ADDATR - Add attributes to VT100. ; ;- ADDATR:: CALL $SAVAL ; SAVE R0 - R5 MOV #100$,R0 ; SET THE TABLE ADDR CALL DOTYPE ; AND DO IT RETURN 100$: .WORD NULL,NULL,110$,120$,NULL 110$: .ASCII %[1;7m%<0> ; VT100 BOLD, REVERSE VIDEO 120$: .ASCII %[7m%<0> ; VT100 REVERSE VIDEO .EVEN .SBTTL ADDREV - ADD REVERSE VIDEO TO VT100 ;+ ; ; ADDREV - Add reverse video to VT100 (with AVO only). ; ;- ADDREV:: CALL $SAVAL ; SAVE R0 - R5 MOV #100$,R0 ; SET THE TABLE ADDR CALL DOTYPE ; AND DO IT RETURN 100$: .WORD NULL,NULL,110$,NULL,NULL 110$: .ASCII %[7m%<0> ; VT100 REVERSE VIDEO .EVEN .SBTTL ADDBLI - ADD BLINK ATTRIBUTE TO VT100 ;+ ; ; ADDBLI - Add blink attribute to VT100. ; ;- ADDBLI:: CALL $SAVAL ; SAVE R0 - R5 MOV #100$,R0 ; SET THE TABLE ADDR CALL DOTYPE ; AND DO IT RETURN 100$: .WORD NULL,NULL,110$,120$,NULL 110$: .ASCII %[1;5m%<0> ; VT100 BOLD/BLINK 120$: .ASCII %[7m%<0> ; VT100 REVERSE VIDEO .EVEN .SBTTL REMATR - REMOVE VT100 ATTRIBUTES ;+ ; ; REMATR - Remove VT100 attributes. ; ;- REMATR:: CALL $SAVAL ; SAVE R0 - R5 MOV #100$,R0 ; SET THE TABLE ADDR CALL DOTYPE ; AND DO IT RETURN 100$: .WORD NULL,NULL,110$,110$,NULL 110$: .ASCII %[m%<0> ; VT100 TURN OFF ATTRIBUTES .EVEN .SBTTL SETNAR - SET VT100 NARROW ;+ ; ; SETNAR - Reset VT100 with no scroll region and 80 column. ; ;- SETNAR:: CALL $SAVAL ; SAVE R0 - R5 MOV #100$,R0 ; PRESUME REGION ONLY TSTB SETVT1 ; VT100 SET TO WIDE ? BEQ 10$ ; IF EQ, NO MOV #200$,R0 ; YES, SET 80 COLUMN ALSO 10$: CALL DOTYPE ; AND GO DO IT RETURN 100$: .WORD NULL,NULL,110$,110$,120$ 110$: .ASCII %[r%<0> ; VT100 CLEAR SCROLL REGION 120$: .BYTE ,':,<0> ; TEKTRONIX MEDIUM SIZE .EVEN 200$: .WORD NULL,NULL,210$,210$,120$ 210$: .ASCII %[r% ; VT100 CLEAR SCROLL REGION .ASCII %[?3l%<0> ; VT100 SET TO 80 COLUMNS .EVEN .SBTTL WRTEOS - WRITE END OF SCREEN SEQUENCE ;+ ; ; WRTEOS - Write end of screen sequence. ; ;- WRTEOS:: CALL $SAVAL ; SAVE R0 - R5 TSTB VAXFLG ; ARE WE ON VAX/VMS ? BEQ 10$ ; IF EQ, NO MOVB #66,110$+2 ; VT52 LINE # TO 23. 10$: MOV #100$,R0 ; SET TABLE ADDRESS TSTB SETVT1 ; VT100 SET WIDE ? BEQ 20$ ; IF EQ, NO MOV #200$,R0 ; ELSE USE THIS TABLE 20$: CALL DOTYPE ; AND DO IT RETURN 100$: .WORD NULL,110$,120$,130$,140$ 110$: .BYTE ,'Y,67,40 ; VT52 LINE 24, COLUMN 1 .ASCII %K%<0> ; VT52 ERASE TO END OF LINE 120$: .ASCII %[24;1H% ; VT100 LINE 24, COLUMN 1 .ASCII %[1;7m% ; VT100 BOLD, REVERSE VIDEO .ASCII %[K%<0> ; VT100 ERASE TO END OF LINE 130$: .ASCII %[24;1H% ; VT100 LINE 24, COLUMN 1 .ASCII %[7m% ; VT100 REVERSE VIDEO .ASCII %[K%<0> ; VT100 ERASE TO END OF LINE 140$: .BYTE ,,<0> ; TEKTRONIX, SINGLE SPACE .EVEN 200$: .WORD NULL,NULL,120$,220$,NULL 220$: .ASCII %[14;1H% ; VT100 LINE 14, COLUMN 1 .ASCII %[7m%<0> ; VT100 REVERSE VIDEO .EVEN .SBTTL WRTEOF - WRITE END OF FILE SEQUENCE ;+ ; ; WRTEOF - Write end of file sequence. ; ;- WRTEOF:: CALL $SAVAL ; SAVE R0 - R5 MOV #100$,R0 ; PRESUME VT100 NARROW TSTB SETVT1 ; VT100 SET TO WIDE ? BEQ 10$ ; IF EQ, NO MOV #200$,R0 ; YES, RESET TO NARROW 10$: CALL DOTYPE ; AND DO IT CALL BLANK ; STUPID VAX SPACING RETURN ; VT100 in 80. columns. 100$: .WORD NULL,110$,120$,120$,130$ 110$: .BYTE ,'Y,67,40 ; VT52 LINE 24, COLUMN 1 .BYTE ,'J ; VT52 CLEAR SCREEN .BYTE ,'Y,66,40,<0> ; VT52 LINE 23, COLUMN 1 120$: .ASCII %[r% ; VT100 NO SCROLL REGION .ASCII %[24;1H% ; VT100 LINE 24, COLUMN 1 .ASCII %[J% ; VT100 CLEAR SCREEN .ASCII %[23;1H%<0> ; VT100 LINE 23, COLUMN 1 130$: .BYTE ,';,<0> ; TEKTRONIX SMALL SIZE .EVEN ; VT100 set to 132. columns. 200$: .WORD NULL,110$,210$,210$,130$ 210$: .ASCII %[r% ; VT100 NO SCROLL REGION .ASCII %[?3l%<0> ; VT100 SET TO 80 COLUMNS .EVEN .SBTTL WRTHDR - WRITE HEADER ON TOP OF SCREEN ;+ ; ; WRTHDR - Writes the file name header on the top of the page. ; ;- WRTHDR:: CALL $SAVAL ; SAVE R0 - R5 CALL CLRSCR ; CLEAR THE SCREEN MOV #100$,R0 ; PRESUME 80 COLUMNS TSTB SETVT1 ; SET VT100 WIDE ? BEQ 10$ ; IF EQ, NO MOV #200$,R0 ; SET FOR 132 COLUMNS 10$: CALL DOTYPE ; AND DO IT CALL WRTNAM ; WRITE THE FILE NAME MOV #300$,R0 ; DO OTHER SPECIAL STUFF TSTB SETTEK ; TEKTRONIX SET WIDE ? BEQ 20$ ; IF EQ, NO MOV #400$,R0 ; SET FOR SMALL SIZE 20$: CALL DOTYPE ; AND GO DO IT RETURN ; VT100 in 80. column mode. 100$: .WORD NULL,NULL,110$,120$,130$ 110$: .ASCII %[3;23r% ; SET SCROLL REGION 3:23 .ASCII %[1;7m%<0> ; VT100 BOLD, REVERSE VIDEO 120$: .ASCII %[3;23r% ; SET SCROLL REGION 3:13 .ASCII %[7m%<0> ; VT100 REVERSE VIDEO 130$: .BYTE ,'8,<0> ; TEKTRONIX LARGE SIZE .EVEN ; VT100 in 132. column mode. 200$: .WORD NULL,NULL,210$,220$,130$ 210$: .ASCII %[?3h% ; VT100 SET TO 132 COLUMNS .ASCII %#6% ; VT100 DOUBLE WIDTH LINE .ASCII %[3;23r% ; SET SCROLL REGION 3:23 .ASCII %[1;7m%<0> ; VT100 BOLD, REVERSE VIDEO 220$: .ASCII %[?3h% ; VT100 SET TO 132 COLUMNS .ASCII %#6% ; VT100 DOUBLE WIDTH LINE .ASCII %[3;13r% ; SET SCROLL REGION 3:13 .ASCII %[7m%<0> ; VT100 REVERSE VIDEO .EVEN 300$: .WORD NULL,NULL,310$,310$,320$ 310$: .ASCII %[m%<0> ; VT100 TURN OFF ATTRIBUTES 320$: .BYTE ,':,<0> ; TEKTRONIX MEDIUM SIZE .EVEN 400$: .WORD NULL,NULL,310$,310$,410$ 410$: .BYTE ,,,';,<0> ; TEKTRONIX SMALL SIZE .EVEN .SBTTL WRTMSG - PREPARE TO WRITE MESSAGE ;+ ; ; WRTMSG - Prepare to write message on the screen. ; ;- WRTMSG:: CALL $SAVAL ; SAVE R0 - R5 TSTB VAXFLG ; ARE WE ON VAX/VMS ? BEQ 10$ ; IF EQ, NO MOVB #66,110$+2 ; VT52 LINE # TO 23. MOVB #13,130$ ; TEKTRONIX REVERSE LINE FEED 10$: CALL ADDATR ; ADD ATTRIBUTES TO VT100 MOV #100$,R0 ; PRESUME VT100 NARROW CALL DOTYPE ; AND DO IT RETURN 100$: .WORD NULL,110$,120$,120$,130$ 110$: .BYTE ,'Y,67,<32.+30.> ; VT52 LINE 24, COLUMN 30 .BYTE ,'K,<0> ; VT52 ERASE TO END OF LINE 120$: .ASCII %[24;30H% ; VT100 LINE 24, COLUMN 30 .ASCII %[K%<0> ; VT100 ERASE TO END OF LINE 130$: .REPT 30. ; TEKTRONIX SPACE 30 TIMES .BYTE 32. .ENDR .EVEN .SBTTL DOTYPE - DO SCREEN TYPEOUT ;+ ; ; DOTYPE - Do screen typeout. ; ; Inputs: ; R0 = Start of control characters table. ; TERM = Terminal type offset. ; ;- DOTYPE:: ADD TERM,R0 ; OFFSET INTO TABLE MOV (R0),R0 ; GET THE ACTUAL ADDRESS BEQ 20$ ; IF EQ, NONE MOV R0,R1 ; COPY ADDR FOR LOOP 10$: TSTB (R1)+ ; END OF MESSAGE ? BGT 10$ ; IF GT, NO DEC R1 ; DON'T OUTPUT TERMINATOR SUB R0,R1 ; CALCULATE THE BYTE COUNT QIOW$S #IO.WAL!TF.CCO,#INLUN,#INEFN,,#TIOSB,, 20$: RETURN .END