Google
 

Trailing-Edge - PDP-10 Archives - BB-M836B-BM - tools/sed/sedv2.mac
There are 2 other files named sedv2.mac in the archive. Click here to see a list.
TITLE	SEDV2 - VT52 AND VT100 TERMINAL DEFINITIONS FOR SED
SUBTTL	A CHRISTOPHER HALL FECIT

;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
;  OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;COPYRIGHT (C) 1981,1982 BY DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.

;LOAD THE EDITOR BY: .COM  SED,SEDV2
;                    .LOAD SEDV2,SED

	SEARCH	SEDSYM
IFE TOPS10,<SEARCH MONSYM>

	EXTERN	CPOPJ,PUTSQ1,PUTNUM,PUTTYP,PUTSTG,TRMNAM,HOMPOS
	INTERN	TERMNL

FTFAST==1	;SET THIS IF TERMINAL SENDS OUT XON-XOFF'S

TERMNL:	OVT52	;ADDRESSES OF THE TERMINAL TABLES TO USE
	OVT100

OVT52:	BYTE (7) 33,"A" 	;CURSOR UP
	BYTE (7) 33,"B" 	; DOWN
	BYTE (7) 33,"C" 	; RIGHT
	BYTE (7) 10		; LEFT
	BYTE (7) 33,"H" 	; HOME
	BYTE (7) 33,"J" 	;CLEAR PAGE
	BYTE (7) 33,"K" 	;CLEAR LINE
	BYTE (7) 12		;ROLL UP AND CLEAR LINE
	BYTE (7) 33,"I" 	;ROLL DOWN AND CLEAR LINE
	CPOPJ			;PROTECT ON (NONE FOR A VT52)
	CPOPJ			;PROTECT OFF
	0			;INSERT LINE (NONE)
	0			;INSERT SPACE (NONE)
	0			;DELETE LINE (NONE)
	0			;DELETE SPACE (NONE)
	BYTE (7) 33,"Y","7"," "	;MOVE TO BOTTOM
	BYTE (7) 33,"H",33,"J"	;HOME AND CLEAR PAGE
	VT5PSC			;ROUTINE TO POSITION TO CHARACTER
	VT5PSL			;ROUTINE TO POSITION TO START OF LINE
	^D24			;LINES PER PAGE
	^D80			;CHARACTERS PER LINE
IFE FTFAST,<
	MRK!TBS!SLW		;FLAGS (NO PROTECT, HARD TABS)
>
IFN FTFAST,<
	MRK!TBS!NPG!SLW		;FLAGS (NO PROTECT, HARD TABS, KEEP TTY PAGE)
>
	TENTRY 			;ROUTINE TO CALL ON ENTRY
	TEXIT			;ROUTINE TO CALL ON EXIT
	0			;NO NULLS NEEDED
	IVT52			;ADDRESS OF INPUT CHARACTER TABLE
	"~"			;MARK TO DISPLAY ON ENTER

IFE FTFAST,<
	EXP	$RESET				;RUBOUT
IVT52:	EXP		$RECAL, $INSSP, $SETFI	;   0, A, B
	EXP	$ABORT, $INSLN, $SRCBK, $DELLN	;C, D, E, F
	EXP	$PUT,   $DELCH, $TAB,   $ERSLN	;G, H, I, J
	EXP	$SLDLF, $SLDRT, $RETRN, $SWTCH	;K, L, M, N
	EXP	$ENTCC, $GOTO,  $RLBKP, $SRCFW	;O, P, Q, R
	EXP	$DELSP, $RLFWL, $BKTAB, $PICK	;S, T, U, V
	EXP	$RLBKL, $EXEC,  $RLFWP, $EXIT	;W, X, Y, Z
	EXP	-SIZ.IS,,I.VT52			;ESCAPE
	EXP	$PUSH,  $CURRT, $SUBST, $SAVE 	;\, ], ^, _
>
IFN FTFAST,<
;THIS TABLE SETS UP THE KEYBOARD ARRANGEMENT FOR WHEN YOU NEED TO KEEP
;TTY PAGE IN EFFECT BECAUSE THE TERMINAL SENDS OUT ITS OWN CONTROL S AND Q'S
;THOSE TWO CHARACTERS CANNOT BE COMMANDS SINCE SED DOES NOT KNOW WHETHER THE
;USER HAS TYPED THEM OR THEY WERE SENT BY THE TERMINAL.

;SO Q GOES TO A, A AND S GO TO K AND L, K TO ESCAPE-L, AND L TO ESCAPE-T

	EXP	$RESET				;RUBOUT
IVT52:	EXP		$RECAL, $RLBKP, $SETFI	;   0, A, B
	EXP	$ABORT, $INSLN, $SRCBK, $DELLN	;C, D, E, F
	EXP	$PUT,   $DELCH, $TAB,   $ERSLN	;G, H, I, J
	EXP	$INSSP, $DELSP, $RETRN, $SWTCH	;K, L, M, N
	EXP	$ENTCC, $GOTO,  0,	$SRCFW	;O, P, Q, R
	EXP	0,	$RLFWL, $BKTAB, $PICK	;S, T, U, V
	EXP	$RLBKL, $EXEC,  $RLFWP, $EXIT	;W, X, Y, Z
		-SIZ.IS,,I.VT52			;ESCAPE
	EXP	$PUSH,  $CURRT, $SUBST, $SAVE 	;\, ], ^, _
>
I.VT52:	$ENTER,,"P" 	;ESCAPE P == ENTER
	$CURHM,,"R" 	;ESCAPE R == HOME
	$CURUP,,"A" 	;ESCAPE A == UP
	$CURDN,,"B" 	;ESCAPE B == DOWN
	$CURRT,,"C" 	;ESCAPE C == RIGHT
	$CURLF,,"D" 	;ESCAPE D == LEFT
	$RECAL,,"Q" 	;ESCAPE Q == RECALL
	IAVT52,,"?"	;ESCAPE ? == CHECK SOME MORE
	$TBSET,,"S" 	;ESCAPE S == SET-TABS
	$TBSET,,"s" 	;ESCAPE s == SET-TABS
IFN FTFAST,<
	$SLDLF,,"L" 	;ESCAPE L == SLIDE-LEFT
	$SLDRT,,"T" 	;ESCAPE T == SLIDE-RIGHT
	$SLDLF,,"l" 	;ESCAPE l == SLIDE-LEFT
	$SLDRT,,"t" 	;ESCAPE t == SLIDE-RIGHT
>
SIZ.IS=.-I.VT52

IAVT52:	$BLINE,,"t"	;ESCAPE ? t == START-OF-LINE
	$ELINE,,"v"	;ESCAPE ? v == END-OF-LINE
	$DNTAB,,"r"	;ESCAPE ? r == DOWN-TAB
	$UPTAB,,"x"	;ESCAPE ? x == UP-TAB
	$CASE ,,"y"	;ESCAPE ? y == CASE
	$ERSWD,,"n"	;ESCAPE ? n == ERASE-WORD
	$RLTAB,,"p"	;ESCAPE ? p == REAL-TAB
	$MARK ,,"w"	;ESCAPE ? w == MARK
	$INMOD,,"M"	;ESCAPE ? M == INSERT-MODE
	$REWRT,,"u"	;ESCAPE ? u == REWRITE SCREEN
	$WINDW,,"q"	;ESCAPE ? q == WINDOW
	$HELP ,,"s"	;ESCAPE ? s == HELP
	0

;ROUTINE CALLED ON ENTRY: DECIDE WHETHER IT'S A VT52 OR VT100
;IF VT52, SET UP KEYPAD IN APPLICATION MODE; DONE

IFN TOPS10,<
TENTRY:	MOVE	T1,[2,,TRMBLK]	;READ SIXBIT TERMINAL TYPE INTO T1
	TRMOP.	T1,
	  JFCL
	CAMN	T1,[SIXBIT /VT100/]
	JRST	VENTRY		;IF IT'S A VT100 HANDLE SEPARATELY
	CAME	T1,[SIXBIT /VT52/]
	JRST	TENERR		;ELSE IF NOT A VT52 THERE'S A PROBLEM
>
IFE TOPS10,<
TENTRY:	MOVEI	T1,.PRIIN	;READ TERMINAL TYPE
	GTTYP
	CAIN	T2,20		;VT100?
	JRST	VENTRY		;YES - SET UP SPECIALLY
	CAIE	T2,17		;VT52?
	JRST	TENERR		;NO - DON'T KNOW WHAT TO DO
>
	MOVSI	T1,(BYTE (7) 33,"=")
	PUSHJ	P,PUTSQ1
	JRST	PUTTYP

IFN TOPS10,<
TENERR:	OUTSTR	[ASCIZ /Terminal is not a VT52 or VT100
/]
	EXIT			;VERY HOSTILE IF ILLEGAL TERMINAL
>
IFE TOPS10,<
TENERR:	MOVEI	T1,[ASCIZ /Terminal is not a VT52 or VT100
/]
	PSOUT
	HALTF			;VERY HOSTILE IF ILLEGAL TERMINAL
>
;ROUTINE CALLED ON EXIT: RESTORE KEYPAD TO NON-APPLICATION MODE

TEXIT:	MOVSI	T1,(BYTE (7) 33,">")
	PUSHJ	P,PUTSQ1
	JRST	PUTTYP

;POSITIONING ALGORITHMS

VT5PSC:	MOVSI	T1,(BYTE (7) 33,"Y")
	PUSHJ	P,PUTSQ1	;START IT OFF
	MOVEI	T1,40(RW)	;GET ROW POSITION
	IDPB	T1,TY
	MOVEI	T1,40(CM)	;GET COLUMN POSITION
	IDPB	T1,TY
	POPJ	P,		;DONE

VT5PSL:	MOVSI	T1,(BYTE (7) 33,"Y")
	PUSHJ	P,PUTSQ1	;START IT OFF
	MOVEI	T1,40(T4)	;GET ROW POSITION
	IDPB	T1,TY
	MOVEI	T1,40		;MOVE TO COLUMN ZERO
	IDPB	T1,TY
	POPJ	P,


;TERMINAL TABLES FOR THE VT100
;NOTE: THE WRP FLAG SHOULD NOT BE SET WHETHER OR NOT THE VT100 HAS WRAPAROUND

OVT100:	BYTE (7) 33,"[","A"	;CURSOR UP
	BYTE (7) 33,"[","B"	; DOWN
	BYTE (7) 33,"[","C"	; RIGHT
	BYTE (7) 33,"[","D"	; LEFT
	BYTE (7) 33,"[","H"	; HOME
	BYTE (7) 33,"[","J"	;CLEAR PAGE
	BYTE (7) 33,"[","K"	;CLEAR LINE
	BYTE (7) 33,"D"		;ROLL UP AND CLEAR LINE
	BYTE (7) 33,"M"		;ROLL DOWN AND CLEAR LINE
	BYTE (7) 33,"[","7","m"	;PROTECT ON
	BYTE (7) 33,"[","0","m"	;PROTECT OFF
	ILVT10			;INSERT LINE
	0			;INSERT SPACE (NONE)
	DLVT10			;DELETE LINE
	0			;DELETE SPACE (NONE)
	3777,,[BYTE (7) 33,"[","2","4",";","1","H"] ;MOVE TO BOTTOM
	HVT100			;HOME AND CLEAR PAGE
	POSCUR			;ROUTINE TO POSITION TO CHARACTER
	POSLIN			;ROUTINE TO POSITION TO START OF LINE
	^D24			;LINES PER PAGE
	^D80			;CHARACTERS PER LINE
IFE FTFAST,<
	SLW!TBS			;FLAGS (SLOW TTY,TTY WRAPS,HARDWARE TABS)
>
IFN FTFAST,<
	NPG!SLW!TBS		;FLAGS (KEEP TTY PAGE AND ONES ABOVE)
>
	VENTRY			;ROUTINE TO CALL ON ENTRY
	TEXIT			;ROUTINE TO CALL ON EXIT
	0,,0			;NO NULLS NEEDED
	IVT100			;ADDRESS OF INPUT CHARACTER TABLE

HVT100:	MOVEI	T1,[BYTE (7) 33,"[","H",33,"[" ;HOME AND CLEAR PAGE
		    BYTE (7) "J"]
	PUSHJ	P,PUTSTG
	PUSHJ	P,PUTTYP	;OUTPUT IT NOW
	MOVEI	T1,^D0100	;DELAY JUST A LITTLE
IFN TOPS10,<
	HIBER	T1,
	  JFCL
>
IFE TOPS10,<
	DISMS
>
	POPJ	P,		;THEN RETURN

;INSERT (T4) LINES (USES LIMITED SCROLLING REGION)

ILVT10:	PUSHJ	P,LVT100	;SET UP THE SCROLLING REGION
	MOVSI	T1,(BYTE (7) 33,"[")
	PUSHJ	P,PUTSQ1
	PUSHJ	P,GETROW	;GET THE CURRENT ROW IN T1
	PUSHJ	P,PUTNUM	;AND OUTPUT DECIMAL IN ASCII
	MOVE	T1,[BYTE (7) ";","0","H"]
	PUSHJ	P,PUTSQ1	;AND MAKE SURE WE ARE THERE
	PUSH	P,T4
ILVT1A:	MOVE	T1,[BYTE (7) 33,"M"]
	PUSHJ	P,PUTSQ1	;INSERT A LINE
	SOJG	T4,ILVT1A	;LOOP TO INSERT ALL THE LINES

	PUSHJ	P,RVT100	;NOW RESTORE THE INITIAL STATE
	POP	P,T4
	SOJLE	T4,RVT100	;JUMP IF ONLY ONE LINE
ILVT1B:	MOVE	T1,[BYTE (7) 33,"[","B"]
	PUSHJ	P,PUTSQ1	;ELSE MOVE DOWN ONE LESS TIME THAN LINES
	SOJG	T4,ILVT1B	;LOOP TO INSERT ALL THE LINES
	POPJ	P,		;DONE

;DELETE ONE LINE (USES LIMITED SCROLLING REGION)

DLVT10:	MOVE	T1,LPP(TM)	;ON THE BOTTOM LINE?
	CAIN	T1,1(RW)
	JRST	[MOVE T1,[BYTE (7) 33,"[","K"]
		 JRST PUTSQ1]	;YES - JUST CLEAR IT OUT AND RETURN
	PUSHJ	P,LVT100	;SET UP THE SCROLLING REGION
	MOVEI	T1,[BYTE (7) 33,"[","2","4",";"
		    BYTE (7) "0","H",33,"D"]
	PUSHJ	P,PUTSTG
	PUSHJ	P,RVT100
	JRST	PUTTYP		;OUTPUT AND RETURN

RVT100:	MOVEI	T1,[BYTE (7) 33,"[","0",";","2"
		    BYTE (7) "4","r",33,"8"]
	JRST	PUTSTG		;OUTPUT AND RETURN

;SET UP SCROLLING REGION FOR INSERT OR DELETE LINES

LVT100:	MOVE	T1,[BYTE (7) 33,"7",33,"["]
	PUSHJ	P,PUTSQ1
	PUSHJ	P,GETROW	;GET THE CURRENT ROW IN T1
	PUSHJ	P,PUTNUM	;OUTPUT DECIMAL NUMBER IN ASCII
	MOVE	T1,[BYTE (7) ";","2","4","r"]
	JRST	PUTSQ1

GETROW:	MOVEI	T1,1(RW)	;GET THE CURRENT ROW
	ADD	T1,HOMPOS	;ADD WINDOW OFFSET, IF ANY
	JUMPE	CM,CPOPJ	;IS THE CURSOR AT THE START OF THE ROW?
	AOJA	T1,CPOPJ	;NO - START ONE ROW FARTHER DOWN AND RETURN

;ROUTINE CALLED ON VT100 ENTRY: SET UP KEYPAD IN APPLICATION MODE

VENTRY:	HRR	TM,TERMNL+1	;SET UP THE VT100'S TABLES
	MOVE	T1,[BYTE (7) 33,"=",33,"<"]
	PUSHJ	P,PUTSQ1	;ASSUME VT52, SET VT100 (+ ALTERNATE KEYPAD)
	SKIPN	T1,TRMNAM	;DID THE USER TYPE A /Z SWITCH?
	JRST	PUTTYP

	CAMN	T1,[SIXBIT /G/]	;WANT A GIGI INSTEAD OF A VT100?
	JRST	VENTR1		;YES - SET UP FOR IT
	CAME	T1,[SIXBIT /GIGI/]
	JRST	PUTTYP		;NO - LEAVE IT A VT100
VENTR1:	SETZM	OVT100+ILN	;YES - VT100 CAN'T INSERT AND DELETE LINES
	SETZM	OVT100+DLN	;  SO SAY IT CAN'T BE DONE
	MOVE	T1,[3777,,[BYTE (7) 33,"[","3","1",";","4","4","m"]]
	MOVEM	T1,OVT100+PON	;CHANGE DISPLAY OF PROTECT-ON
	JRST	PUTTYP		;OUTPUT EVERYTHING AND RETURN

;TERMINAL INPUT TABLE - TELLS WHICH CHARACTER SEQUENCES
;INVOKE WHICH COMMANDS

IFE FTFAST,<
	EXP	$RESET				;RUBOUT
IVT100:	EXP		$RECAL,	$INSSP,	$SETFI	;   0, A, B
	EXP	$ABORT,	$INSLN,	$SRCBK,	$DELLN	;C, D, E, F
	EXP	$PUT,	$DELCH,	$TAB,	$ERSLN	;G, H, I, J
	EXP	$SLDLF,	$SLDRT,	$RETRN,	$SWTCH	;K, L, M, N
	EXP	$ENTCC,	$GOTO,	$RLBKP,	$SRCFW	;O, P, Q, R
	EXP	$DELSP,	$RLFWL,	$BKTAB,	$PICK	;S, T, U, V
	EXP	$RLBKL,	$EXEC,	$RLFWP,	$EXIT	;W, X, Y, Z
		-SIZ.I1,,ISUBTB			;ESCAPE
	EXP	$PUSH,	$CURRT,	$SUBST,	$CURHM	;\, ], ^, _
>
IFN FTFAST,<
;THIS TABLE SETS UP THE KEYBOARD ARRANGEMENT FOR WHEN YOU NEED TO KEEP
;TTY PAGE IN EFFECT BECAUSE THE TERMINAL SENDS OUT ITS OWN CONTROL S AND Q'S
;THOSE TWO CHARACTERS CANNOT BE COMMANDS SINCE SED DOES NOT KNOW WHETHER THE
;USER HAS TYPED THEM OR THEY WERE SENT BY THE TERMINAL.

;SO Q GOES TO A, A AND S GO TO K AND L, K TO ESCAPE-L, AND L TO ESCAPE-T

	EXP	$RESET				;RUBOUT
IVT100:	EXP		$RECAL,	$RLBKP,	$SETFI	;   0, A, B
	EXP	$ABORT,	$INSLN,	$SRCBK,	$DELLN	;C, D, E, F
	EXP	$PUT,	$DELCH,	$TAB,	$ERSLN	;G, H, I, J
	EXP	$INSSP,	$DELSP,	$RETRN,	$SWTCH	;K, L, M, N
	EXP	$ENTCC,	$GOTO,	0,	$SRCFW	;O, P, Q, R
	EXP	0,	$RLFWL,	$BKTAB,	$PICK	;S, T, U, V
	EXP	$RLBKL,	$EXEC,	$RLFWP,	$EXIT	;W, X, Y, Z
		-SIZ.I1,,ISUBTB			;ESCAPE
	EXP	$PUSH,	$CURRT,	$SUBST,	$CURHM	;\, ], ^, _
>
;SUBTABLE. PUT THE MOST FREQUENTLY-USED SEQUENCES FIRST
;ENTER IS PROBABLY THE MOST COMMON OF ALL

ISUBTB:	XVT100,,"["	;ESCAPE [ == READ NEXT CHAR
	SVT100,,"O"	;ESCAPE O == READ NEXT CHAR
	$TBSET,,"S" 	;ESCAPE S == SET-TABS
	$TBSET,,"s" 	;ESCAPE s == SET-TABS

SIZ.I1==.-ISUBTB

XVT100:	$CURUP,,"A"	;ESCAPE [ A == UP
	$CURDN,,"B"	;ESCAPE [ B == DOWN
	$CURRT,,"C"	;ESCAPE [ C == RIGHT
	$CURLF,,"D"	;ESCAPE [ D == LEFT
	0

SVT100:	$ENTER,,"P"	;ESCAPE O P == ENTER
	$CURHM,,"R"	;ESCAPE O R == HOME
	$RECAL,,"Q"	;ESCAPE O Q == RECALL
	$INMOD,,"M"	;ESCAPE O M == INSERT-MODE
	$SAVE,,"S"	;ESCAPE O S == SAVE-FILE

	$CURUP,,"A"	;ESCAPE O A == UP
	$CURDN,,"B"	;ESCAPE O B == DOWN
	$CURRT,,"C"	;ESCAPE O C == RIGHT
	$CURLF,,"D"	;ESCAPE O D == LEFT

	$BLINE,,"t"	;ESCAPE O t == START-OF-LINE
	$ELINE,,"v"	;ESCAPE O v == END-OF-LINE
	$DNTAB,,"r"	;ESCAPE O r == DOWN-TAB
	$UPTAB,,"x"	;ESCAPE O x == UP-TAB
	$ERSWD,,"n"	;ESCAPE O n == ERASE-WORD
	$RLTAB,,"p"	;ESCAPE O p == REAL-TAB
	$MARK,,"w"	;ESCAPE O w == MARK
	$CASE,,"y"	;ESCAPE O y == CASE
	$REWRT,,"u"	;ESCAPE O u == REWRITE SCREEN
	$WINDW,,"q"	;ESCAPE O q == WINDOW
	$SLDLF,,"m"	;ESCAPE O m == SLIDE-LEFT
	$SLDRT,,"l"	;ESCAPE O l == SLIDE-RIGHT
	$HELP,,"s"	;ESCAPE O s == HELP
	0

;MOVE TO ROW (RW), COLUMN (CM)

POSCUR:	MOVSI	T1,(BYTE (7) 33,"[")
	PUSHJ	P,PUTSQ1	;START IT OFF
	MOVEI	T1,1(RW)	;GET ROW POSITION
	PUSHJ	P,PUTNUM
	MOVEI	T1,";"		;THEN A SEMICOLON
	IDPB	T1,TY
	MOVEI	T1,1(CM)	;GET COLUMN POSITION
	PUSHJ	P,PUTNUM
	MOVEI	T1,"H"		;THEN AN H
	IDPB	T1,TY
	POPJ	P,		;DONE

;MOVE TO START OF LINE (T4)

POSLIN:	MOVSI	T1,(BYTE (7) 33,"[")
	PUSHJ	P,PUTSQ1	;START IT OFF
	MOVEI	T1,1(T4)	;GET ROW POSITION
	PUSHJ	P,PUTNUM
	MOVE	T1,[ASCII /;0H/]
	JRST	PUTSQ1		;MOVE TO FIRST COLUMN; DONE

IFN TOPS10,<
TRMBLK:	1041		;BLOCK FOR READING THE TOPS10 TERMINAL TYPE
	-1
>
	END