File: VCM52.PG of Tape: Sources/Other/new-22-vista-2
(Source file text) 

	FILE	VCM52 - DEC VT52 TERMINAL				/01.11
/	TITLE	VERSION 01.15  --  COPYRIGHT NOTICE
/
/
/		******************************************
/		**					**
/		**	        V I D E O		**
/		**     C H A R A C T E R I S T I C S	**
/		**	       M O D U L E		**
/		**					**
/		**		CODED BY		**
/		**	   C. E. STEUART DEWAR		**
/		**	      MARCH, 1980		**
/		**					**
/		**					**
/		******************************************
/
/
/	COPYRIGHT  (c) 1980 Under BERNE and UNIVERSAL COPYRIGHT LAW
/		By: DEWAR INFORMATION SYSTEMS CORPORATION
/
/	The information in this document  is subject to change without
/	notice  and  should  not be construed as a commitment by DEWAR
/	INFORMATION SYSTEMS  CORPORATION.   DEWAR  INFORMATION SYSTEMS
/	assumes no  responsibility  for  any errors that may appear in
/	this document  other  than providing  corrections for any such
/	errors when brought to the attention of DEWAR INFORMATION SYS-
/	TEMS CORPORATION.
/
/	The SOFTWARE  described  in  this document is furnished to the
/	purchaser under a license for use on a  single computer system
/	and can be copied  (with inclusion of DISC's copyright notice)
/	only for use in such system.
/
/ 	Licensees  of the  SOFTWARE  may make changes to the  software
/ 	with the understanding that the warranty for the SOFTWARE only
/ 	applies  to the original  unmodified version  delivered to the
/ 	licensee.  The fact that licensee may have modified or changed
/ 	the  SOFTWARE  in no way alters or detracts from the copyright
/ 	protection and proprietary rights due to DISC for the SOFTWARE
	EJECT
/
/	VISTA IS A SCREEN ORIENTED TEXT EDITOR FOR A VISUAL DISPLAY
/	TERMINAL.
/
/	FUNCTION KEYS ON A TERMINAL ARE HANDLED THROUGH THE USE OF
/	THIS VIDEO CHARACTERISTICS MODULE (VCM), THAT HANDLES ALL INPUT TO THE
/	MAIN PORTION OF THE VISTA PROGRAM. IN THE SAME WAY, ALL OUTPUT FROM
/	THE VISTA PROGRAM IS ENCODED AND IT IS THE FUNCTION OF THE
/	'VCM' MODULE TO RETRANSLATE THIS OUTPUT INTO A FORM
/	SUITABLE FOR THE SPECIFIC TERMINAL IN USE.
/
/	THE VCM PROVIDED STANDARDLY PROVIDED WITH
/	VISTA HAS BEEN DESIGNED AROUND THE VT52/VT100 TERMINALS SINCE
/	IT IS EXPECTED THAT THESE ARE THE MOST COMMON DISPLAY TERMINALS
/	TO BE FOUND ON PDP8 SYSTEMS.
/
/	IMPLEMENTATION OF OTHER VIDEO DISPLAY TERMINALS IS EXTREMELY
/	SIMPLE SINCE THE MAIN CORE OF THE VISTA PROGRAM IS NEVER
/	CHANGED.
/
/	CONSULT THE 'VISTA' PROGRAM MANUAL FOR DETAILS ON THE USE OF THIS
/				EDITING PROGRAM.
/
/	VIDEO CHARACTERISTICS MODULE IS ALLOCATED 3 PDP8 PAGES FROM
/				06000-06577
	TITLE	SCREEN LAYOUT FORMAT
/
/	IN ORDER TO UNDERSTAND HOW VISTA WORKS IT IS ESSENTIAL TO
/	KNOW THE MEMORY LAYOUT.
/
/	A COPY OF EACH LINE ON THE VIDEO SCREEN IS MAINTAINED IN A
/	FIELD 1 BUFFER CALLED 'SCREEN'. EACH BYTE ON THE SCREEN OCCUPIES
/	ONE WORD IN THIS BUFFER.
/
/	A ROW TABLE IS MAINTAINED WHICH CONSISTS OF A ONE WORD ADDRESS
/	FOR EACH LINE ON THE SCREEN. THE ROW TABLE IS SIMPLY A SET OF
/	POINTERS TO THE FIRST WORD ON EACH LINE. THIS FIRST WORD IS
/	A STATUS/COUNT WORD FOR THE LINE WHICH IMMEDIATELY FOLLOWS.
/
/	THE FUNCTION OF THE ROW TABLE IS TO AVOID MOVING THE SCREEN MEMORY
/	AROUND DURING INSERTION AND DELETION OF LINES. IN THIS CASE, ONLY
/	THE ROW TABLE ITSELF HAS TO BE ADJUSTED. FOR THIS REASON, THE
/	POINTER ADDRESSES IN THE ROW TABLE ARE NOT NECESSARY IN ANY ORDER.
/
/	THE FORMAT OF THE STATUS/COUNT WORD FOR EACH LINE IS:
/
/		ABC DEE EEE EEE
/
/	A = 0	CURRENT LINE EXISTS
/	    1	CURRENT LINE DOES NOT EXIST (AT END OF FILE OR UNESTABLISHED)
/
/	B = 0	LINE ENDS WITH CR/LF
/	    1	LINE ENDS WITHOUT CR/LF
/
/	C = 0	LINE NOT MARKED
/	    1	LINE MARKED AS PART OF BLOCK (FOR SAVE/DELETION)
/
/	D = 0	CURRENT LINE HAS NOT BEEN MODIFIED ON THIS EDIT
/	    1   HAS BEEN MODIFIED ON THIS EDIT CYCLE
/
/	EEE..E	LINE LENGTH IN THE RANGE 0-255
/
/
/	END OF FILE IS INDICATED BY 'BOF' FLAG BEING SET AND BY ROWS
/	WITH A BIT 0 STATUS OF 1.
/
/	THERE ARE TWO ONE-BLOCK BUFFERS 'FEEDING' THE SCREEN WINDOW:
/	THE ABOVE SCREEN BUFFER (ABUF) AND THE BELOW SCREEN BUFFER
/	(BBUF). THESE BUFFERS ARE IN OS/8 FORMAT AND ARE READ AND
/	WRITTEN FROM THE OS/8 DEVICE AS NEEDED.
/
	TITLE	IMPORTANT GLOBAL CELLS
/
/	YOU MAY NEED TO BE AWARE OF THE FOLLOWING IMPORTANT CELLS AND
/	ENTRY POINTS IN VISTA:
/
/	NAME		FUNCTION
/
/	COL		CONTAINS BINARY COLUMN POSITION OF CURSOR IN RANGE
/			0-(N-1). NOTE: POSITION IS NOT GUARANTEED FOR ALL
/			POSSIBLE VCM FUNCTIONS (BUT IT IS FOR ALL IMPORTANT
/			ONES).
/
/	ROW		CURRENT POINTER INTO THE ROW TABLE.
/
/	ROWTAB		ADDRESS OF FIRST ROW IN ROW TABLE
/	LASTROW		ADDRESS OF LAST ROW IN ROW TABLE
/	ROWSIZ		COUNT OF NUMBER OF ROWS IN ROW TABLE (1-N)
/	COLSIZ		COUNT OF NUMBER OF COLUMNS ON SCREEN
/	PKBD		POINTER TO CONSOLE INPUT ROUTINE
/	PSCR		POINTER TO CONSOLE OUTPUT ROUTINE
/	XT/XT2		TWO CELLS ON PAGE 0 RESERVED FOR USE BY 'VCM'
/			MODULE. VCM CAN ALLOCATE MORE PAGE 0 STORAGE
/			FROM THE ADDRESS XT2+1 UP TO 177 ON PAGE 0.
/			CAUTION: SPR'S FOR VISTA MAY REQUIRE THE USE OF
/			PAGE 0 CELLS (STARTING BACK FROM 177), SO USE
/			PAGE 0 CELLS ONLY WHEN ABSOLUTELY NECESSARY.
/
/	PRLINE		SUBROUTINE TO OUTPUT A FULL ROW ON THE SCREEN.
/			CAN ONLY BE CALLED FROM VCM IF VCM FILE ITSELF
/			PROTECTS AGAINST A RECURSIVE CALL BY SAVING THE
/			RETURN ADDRESSES IN 'PRLINE' AND 'XTER'.
/
/			THIS ROUTINE WILL BE NEEDED FOR TERMINALS THAT ARE
/			CAPABLE OF PERFORMING INSERT AND DELETE LINE IN LOCAL
/			MODE (SEE VCM52 FOR AN EXAMPLE OF CALLING 'PRLINE')
/
/	GLEN		RETURNS LENGTH OF CURRENT LINE IN THE AC (0=NULL
/			LINE)
	TITLE	ASSEMBLY INSTRUCTIONS
/
/	THIS VCM FILE IS TO BE ASSEMBLED WITH THE GLOBAL SYMBOL
/	DICTIONARY FROM VISTA:
/
/	.R PAGE8
/	*VCM,LPT:<VISTA.SD,VCM/I
/
/	OR IF YOU HAVE TO USE PAL8
/
/	.R PAL8
/	*VCM,LPT:<VISTA.GL,VCM
/
/	WHERE FOR PAL8, 'VISTA.GL' IS THE PAGE8 SYMBOL DIRECTORY CONVERTED
/	INTO PAL8 COMPATIBLE FORMAT.
/
XT3	EQU	XT2+1		PAGE ZERO EQUATES
XT4	EQU	XT3+1		...
XT5	EQU	XT4+1		...
XT6	EQU	XT5+1		...
/
	ORG	KIO		KEYBOARD I/O
	DSEC
	AFIELD	BUF			MAIN DATA FIELD WHILE RUNNING
/
/	ALL FOLLOWING ADDRESSES ARE ABSOLUTELY REFERENCED BY VISTA
/	AND CANNOT BE CHANGED UNLESS VISTA ITSELF IS ALTERED.
/
KIO	DC	0		KEYBOARD I/O ENTRY
	JMPI	PXIN		CONTINUE NOW
/
SIO	DC	0		SCREEN I/O ENTRY POINT
	JMPI	PXOUT		CONTINUE
/
VMCMNT	DC	-'/		MINUS ASCII CODE OF COMMENT FIELD CHARACTER
VMTAG	DC	-',		MINUS ASCII CODE OF TAG FIELD DELIMITER
VROWS	DC	24		NUMBER OF ROWS ON VIDEO SCREEN
VCOLS	DC	80		NUMBER OF COLUMNS ON VIDEO SCREEN
VAUCOL	DC	72		STARTING COLUMN FOR AUDIT TRAIL OF VERSION #'S
VSTAT	DC	02000		NO XON/XOFF, CTRL/O ALLOWED
/
/	### END OF FIXED ADDRESS SECTION UTILIZED BY VISTA PROGRAM ###
/
XKIO	JMPI	KIO		HERE TO EXIT FROM 'KIO'
XSIO	JMPI	SIO		HERE TO EXIT FROM 'SIO'
PXIN	DC	XIN		POINTER TO 'XIN'
PXOUT	DC	XOUT		POINTER TO 'XOUT'
	TITLE	KEYBOARD ESCAPE TRANSLATION TABLE
/
/	VISTA INTERNAL CODE FOR ALL ESCAPED CHARACTERS POSSIBLE ON THE
/	KEYBOARD.
/
ABCD	DC	Y:CUP		A	CURSOR UP
	DC	Y:CDOWN		B	CURSOR DOWN
	DC	Y:CRIGHT	C	CURSOR RIGHT
	DC	Y:CLEFT		D	CURSOR LEFT
/
PQR	DC	Y:SCRLUP	P	SCROLL UP			/01.11
	DC	Y:SCRLDN	Q	SCROLL DOWN			/01.11
	DC	Y:SEARCH	R	SEARCH				/01.11
/									/01.11
/ ALL OF THE FOLLOWING CHARACTERS ARE IN LOWER CASE AND PRECEDED	/01.11
/ WITH AN ESCAPE AND THEN A QUESTION MARK				/01.11
/
NY	DC	Y:HOME		N	HOME CURSOR			/01.11
	DC	0		O	(NOT GENERATED)			/01.11
	DC	Y:ROWINS	P	INSERT LINE			/01.11
	DC	Y:WLEFT		Q	WORD LEFT			/01.11
	DC	Y:PAGEDN	R	PAGE DOWN			/01.11
	DC	Y:WRIGHT	S	WORD RIGHT			/01.11
	DC	Y:MKROW		T	MARK LINE			/01.11
	DC	Y:PICKUP	U	PICKUP TEXT			/01.11
	DC	Y:PUTDN		V	PUT DOWN TEXT			/01.11
	DC	Y:TOFC		W	FIRST PAGE			/01.11
	DC	Y:PAGEUP	X	PAGE UP				/01.11
	DC	Y:BOFC		Y	LAST PAGE			/01.11
/ 									/01.11
/ THE FOLLOWING TABLE ENTRIES ARE PRECEDED WITH THE ESCAPE KEY (AND	/01.11
/ USUALLY GENERATED MANUALLY)						/01.11
/ 									/01.11
ESCDIG	DC	Y:INSBLK	1	INSERT BLOCK			/01.11
	DC	Y:DELSCR	2	DELETE SCREEN			/01.11
	DC	Y:TRUNCF	3	TRUNCATE FILE			/01.11
/
/	ASCII CONTROL CODE TABLE
/
ITRAN	DC	0		CTRL/NULL
	DC	Y:TRANSP	CTRL/A	TRANSPARENT MODE
	DC	Y:DISMOD	CTRL/B	DISPLAY MODIFIED LINES
	DC	Y:QUIT		CTRL/C	ABORT TO OS/8 
	DC	Y:CSTART	CTRL/D	CURSOR TO START OF LINE
	DC	Y:TABL		CTRL/E	TAB LEFT
 	DC	Y:CEOL		CTRL/F	CURSOR TO END OF CURRENT LINE
	DC	Y:UNMKROW	CTRL/G	UNMARK ROW
	DC	Y:BKDEL		CTRL/H	BACKSPACE DELETE
	DC	Y:TABR		CTRL/I	TAB RIGHT
	DC	Y:INSTOG	CTRL/J	INSERT CHARACTER TOGGLE
	DC	Y:DELWD		CTRL/K	DELETE WORD
	DC	Y:DELEWD	CTRL/L	DELETE TO END OF WORD
	DC	Y:RETURN	CTRL/M	RETURN CODE
	DC	Y:DOSCRN	CTRL/N	RESTORE SCREEN
	DC	0		CTRL/O
	DC	Y:CASE		CTRL/P	INVERT CASE OF WORD
	DC	0		CTRL/Q
	DC	Y:RCONT		CTRL/R	CONTINUOUS REPLACE
	DC	0		CTRL/S
	DC	Y:RSTEP		CTRL/T	STEP REPLACE			/01.11
	DC	Y:DLETLN	CTRL/U	DELETE LINE
	DC	0		CTRL/V
	DC	Y:AWAY		CTRL/W	CURSOR TO AWAY POSITION
	DC	0		CTRL/X
	DC	Y:CNEXTL	CTRL/Y	CURSOR TO START OF NEXT LINE
	DC	Y:XEDIT		CTRL/Z	CLOSE FILE
	DC	0		CTRL/[
	DC	0		CTRL/\
	DC	0		CTRL/]
	DC	0		CTRL/^
	DC	0		CTRL/_
	TITLE	SCREEN TRANSLATION TABLE
/
/	DISPATCH TABLE FOR EXTERPRETER FUNCTION CODES
/
XTAB	DC	Z:POS		0 POSITION CURSOR
	DC	Z:INIT		1 INITIALIZE SCREEN
	DC	Z:SPAC		2 PAD CODE FOR TABS
	DC	Z:CRLF		3 CR/LF TYPE SEQUENCE
	DC	Z:EOL		4 ERASE TO END OF LINE
	DC	Z:CLSC		5 CLEAR SCREEN AND HOME CURSOR
	DC	Z:INS		6 INSERT LINE
	DC	Z:DEL		7 DELETE LINE
	DC	Z:BEL		8 RING BELL
	DC	Z:BKSP		9 BACKSPACE
	DC	Z:SPV1		10 SPECIAL VIDEO MODE 1
	DC	Z:SPV2		11 SPECIAL VIDEO MODE 2
	DC	Z:NMV		12 NORMAL VIDEO MODE
	DC	Z:END		13 NO-CRLF AT END OF LINE GRAPHIC
	DC	Z:RTN		14 RETURNING TO OS/8
	DC	Z:CTRL		15 CONTROL CODE-NON-DISPLAYABLE
	TITLE	TRANSLATION ROUTINES
/
	ISEC	0
/
/	ENTER HERE TO GET NEXT CHARACTER FROM CONSOLE TERMINAL.
/	ALL CHARACTERS ARE RETURNED IMMEDIATELY AND DIRECTLY
/	EXCEPT FOR THE ESCAPE/CONTROL CODES WHICH ARE USED TO IMPLEMENT
/	ALL FUNCTIONS.
/
XIN	JMSI	PKBD		GET CHARACTER FROM KEYBOARD
	TAD	=-0233		TEST FOR ESCAPE CODE
	SNA			SKIP IF NOT
	JMP	1F		HANDLE ESCAPE CODE
	TAD	=0233-0240	TEST FOR CONTROL CODE
	SPA			SKIP IF NOT CONTROL CODE
	JMP	0F		ELSE HANDLE CONTROL CODE
	TAD	=0240		RESTORE NORMAL CHARACTER
	JMP	XKIO		RETURN DIRECTLY TO VISTA
/
/	HERE ON CONTROL CODE.
/									/01.14
0H	TAD	=ITRAN+040	BIAS CODE TO RANGE 0-37
	JMP	2F		MERGE BELOW TO GET ASSOCIATED CODE
/
/	HERE ON ESCAPE CODE.
/	NEXT CHARACTER MUST BE QUESTION MARK OR A-D/M-S
/
1H	JMSI	PKBD		READ CHARACTER AFTER ESCAPE CODE
	TAD	=-'?		3-CHAR ESCAPE SEQUENCE?
	SNA 			SKIP IF NOT
	JMP	THRCHR		HANDLE THREE CHARACTER SEQUENCE
/ 									/01.11
/ CHECK FOR 1-3 FOR ESCAPE/DIGIT TYPE SEQUENCES				/01.11
/ 									/01.11
	TAD	='?-'3-1	TEST FOR 1-3				/01.11
	CLL			...					/01.11
	TAD	='3-'1+1	...					/01.11
	SZL			DIGIT 1-3 HERE?				/01.11
	JMP	DO123		YES: HANDLE THIS			/01.11
/
/	HERE TO CHECK FOR A-D FOR CURSOR MOVEMENT
/
ADCK	TAD	='1-'D-1	TEST FOR A-D				/01.11
	CLL			...
	TAD	='D-'A+1	...
	SZL			SKIP IF NOT A-D
	JMP	DOABCD		ELSE HANDLE A-D HERE
	TAD	='A-'R-1	P,Q,R?					/01.11
	CLL			...
	TAD	='R-'P+1	...					/01.11
	SZL
	JMP	DOPQR		P-R					/01.11
	JMP	BADESC		ELSE HANDLE BAD ESCAPE SEQUENCE NOW
/
THRCHR	JMSI	PKBD		READ THIRD CHARACTER OF SEQUENCE
	TAD	=-'M		ESC ? M  SEQUENCE HERE?			/01.11
	SNA			...					/01.11
	JMP	4F		YES: HANDLE THIS			/01.11
	TAD	='M-('Y+040)-1	N-Y LOWER CASE?				/01.11
	CLL			...
	TAD	='Y-'N+1	...					/01.11
	SZL			
	JMP	DONY		N-Y LOWER CASE				/01.11
BADESC	CLA
	JMP	XIN		SOMETHING ELSE: IGNORE IT
/
DO123	TAD	=ESCDIG-ABCD	INDEX TABLE				/01.11
DOABCD	TAD	=ABCD-PQR	...					/01.11
DOPQR	TAD	=PQR-NY	...					/01.11	/01.11
DONY	TAD	=NY		...					/01.11
/
2H	DCA	XT		...
	CDF	%*
	TADI	XT		LOAD VISTA INTERNAL CODE
3H	CDF	BUF		RESET TO MAIN BUFFER FIELD		/01.11
	SZA			IS THIS AN UNDEFINED CODE?
	JMP	XKIO		NO: SO RETURN IT IN THE AC
	JMP	XIN		YES: SO STRIP COMPLETELY
/ 									/01.11
/ HERE ON <ESCAPE ? M> WHICH IS USED FOR THE ENTER COMMAND MODE FUNCTION/01.11
/ 									/01.11
4H	TAD	=Y:NEWCMD	GET VISTA FUNCTION CODE			/01.11
	JMP	3B		LOOP BACK NOW				/01.11
	TITLE	OUTPUT PROCESSING
/
/	ENTER HERE WITH CHARACTER TO BE OUTPUT TO THE SCREEN
/
XOUT	DCA	XT		SAVE CHARACTER FOR A MOMENT
	TAD	XT		REGET CHARACTER
	TAD	=-0200		LOWEST ASCII CODE
	SPA			SKIP IF DISPLAYABLE CODE
	JMP	1F		ELSE OFF FOR FUNCTION CODE
	TAD	=0200		NORMAL CODE: RESTORE IT
CHOUT	JMSI	PSCR		OUTPUT BACK TO SCREEN
/
/	COME HERE TO IGNORE CHARACTER
/
XNULL	JMP	XSIO		ALL DONE HERE
/
/	HERE FOR VIDEO MODES. CAN'T REALLY DO ANYTHING SINCE VT52 HAS NO
/	VIDEO ENHANCEMENTS. BEST BET IS JUST TO USE A SPECIAL GRAPHIC CODE
/
Z:NMV	JMP	XSIO		NORMAL VIDEO: DO NOTHING
/
Z:SPV1	TAD	='H-'K		GENERATE GRAPHIC
Z:SPV2	TAD	='K-'I		USE APPROPRIATE GRAPHIC CHARACTER
/
/	HERE ON CONTROL CHARACTER - MUST DISPLAY SOME KIND OF GRAPHIC
/	ON SCREEN.
/
Z:END	TAD	='I-'A		GRAPHIC FOR END OF LINE
Z:CTRL	TAD	='A+040		GRAPHIC FOR CONTROL CHARACTER
	DCA	XT2		SAVE FOR A MOMENT
	TAD	='F		ENTER GRAPHICS MODE
	JMS	DOESC		...
	TAD	XT2		GENERATES NICE GRAPHIC
	JMSI	PSCR		...
	TAD	='G		RE-SET GRAPHICS MODE
	JMP	ESCX		ALL DONE HERE
/
/	HERE ON FUNCTION CODE: INDEX DISPATCH TABLE
/
1H	TAD	=XTAB+0200	INDEX DISPATCH TABLE
	DCA	XT2		...
	CDF	%*		TO CURRENT FIELD
	TADI	XT2		GET ADDRESS
	CDF	BUF		BACK TO BUFFER FIELD
	DCA	XT2		...
	JMPI	XT2		PASS CONTROL NOW
/
/	HERE ON TAB/PAD CODE: SEND AS SPACE
/
Z:SPAC	TAD	=' 		RETURN SPACE INSTEAD
	JMP	CHOUT		...
	EJECT
/
/	HERE FOR BACKSPACE FUNCTION
/
Z:BEL	LDI	-1		CONTROL/G DOES BELL FUNCTION
Z:BKSP	TAD	=0210		CONTROL/H DOES BACKSPACE FUNCTION
	JMP	CHOUT		...
/
/	HERE FOR SIMPLE TWO-CHARACTER ESCAPE FUNCTIONS
/
Z:RTN	TAD	='>-'=		EXIT FROM ALTERNATE KEYPAD MODE
Z:INIT	TAD	='=-'K		ESCAPE/= SETS ALTERNATE KEYPAD MODE
Z:EOL	TAD	='K-'C		DO ESCAPE/K FOR ERASE TO EOL
Z:CRI	TAD	='C		ESCAPE/C IS CURSOR RIGHT
ESCX	JMS	DOESC		DO ESCAPE SEQUENCE
	JMP	XSIO		ALL DONE HERE
/
/	DELETE LINE FUNCTION. SINCE VT52 HAS NO DELETE LINE FUNCTION, WE
/	HAVE TO IMPROVISE HERE:
/
/		IF ON TOP HALF OF SCREEN, ISSUE LINE FEED ON BOTTOM LINE TO
/		SCROLL UP, THEN COPY ALL LINES FROM TOP OF SCREEN UP TO BUT
/		NOT INCLUDING THE LINE TO BE DELETED.
/
/		IF ON BOTTOM HALF OF SCREEN, COPY LINES FROM DELETED LINE
/		TO END OF SCREEN.
/
/	WITH THIS ALGORITHM, ARE WORST CASE IS THAT WE HAVE TO COPY HALF
/	OF THE SCREEN BACK OUT
/
	ROOM	4
Z:DEL	JMS	HALFCK		CHECK FOR WHICH HALF OF SCREEN
	JMP	BOTHLF		<1> SECOND HALF OF SCREEN
/
/	<2> HERE WE ARE IN THE TOP HALF OF THE SCREEN, SO ISSUE LINE FEED
/	ON BOTTOM LINE TO SCROLL UP, THEN COPY LINES OUT.
/
	LDI	-1		LINE WE WANT TO MOVE TO
	TAD	ROWSIZ		...
	JMS	MOVEC		MOVE CURSOR TO THAT LINE
	TAD	=LF		LINE FEED
	JMSI	PSCR		...
	JMS	TOPHLF		RESTORE TOP HALF OF SCREEN
	JMP	XSIO		ALL SET (CURSOR AT START OF LINE BELOW)
/
/	SUBROUTINE TO RESTORE THE TOP HALF OF THE SCREEN. USED BY INSERT
/	AND DELETE LINE COMMANDS
/
TOPHLF	SUB
	TAD	='H		HOME CURSOR
	JMS	DOESC		...
	TAD	ROWTAB		SET POINTER TO START OF TABLE
	JMS	PRCALL		CALL ROUTINE TO DISPLAY THE LINES
	RET	TOPHLF		ALL DONE HERE
/
/	SET UP TO CALL 'PRLINE' TO PRINT OUT ALL LINES UP TO LINE BEING	/01.14
/	DELETED.
/
PRCALL	SUB
	DCA	XT3		...
	TAD	ROW		CURRENT ROW ADDRESS
	CMA 			NEGATE AND SUBTRACT FROM
	TAD	ROWTAB		START OF ROW TABLE
	JMS	DOROWS		DO THAT SET OF ROWS (MAY BE NULL)
/
/	RE-POSITION CURSOR NOW IN CASE WE WERE COPYING THE BOTTOM HALF
/	OF THE SCREEN. VISTA ASSUMES THAT CURSOR IS POSITIONED PROPERLY
/	AFTER AN INSERT LINE COMMAND IS EXECUTED.
/
	TAD	ROWTAB		START OF ROW TABLE
	CMA IAC			SUBTRACT FROM CURRENT ROW
	TAD	ROW		TO GET OFFSET INTO SCREEN
	JMS	MOVEC		MOVE CURSOR NOW
	RET	PRCALL		ALL DONE HERE
/
/	HERE ON BOTTOM HALF OF SCREEN. JUST COPY LINES FROM CURRENT
/	LINE UP TO END OF SCREEN.
/
BOTHLF	TAD	ROW		START AT CURRENT ROW
	JMS	PRCALL		USE 'PRLINE' NOW TO RE-DISPLAY THE LINES
	JMP	XSIO		ALL SET
	PART
/
/	SUBROUTINE TO PRINT OUT A SET OF ROWS. COUNT IS IN AC ON ENTRY.
/	XT3 SHOULD HAVE BEEN SET WITH INITIAL ROW POINTER.
/
/	NOTE: MUST SAVE CALLING ADDRESSES TO 'SIO' AND TO 'XTER' BECAUSE
/	OUR CALL TO 'PRLINE' HERE WILL DESTROY THEM.
/
DOROWS	SUB			ENTRY POINT
	DCA	XT4		SET LOOP COUNT
	CDF	%*		TO CURRENT FIELD FOR A MOMENT
	AFIELD	%*		...
	TAD	SIO		PROTECT AGAINST RECURSIVE CALL
	DCA	XT5		SAVE FOR EXIT
	TAD	XTER		...
	DCA	XT6		...
	CDF	BUF
	AFIELD	BUF
	JMP	2F		START AT END OF LOOP IN CASE DONE
/
/	LOOP BACK HERE TO PRINT OUT THE NEXT ROW
/
1H	TADI	XT3		NEXT ROW TABLE POINTER
	JMS	PRLINE		PRINT OUT THAT ROW
	TAD	='K		FOLLOW WITH ERASE TO END OF LINE	/01.14
	JMS	DOESC		...					/01.14
	TAD	XT3		GET ADDRESS OF THAT ROW
	CMA IAC			NEGATE AND SUBTRACT FROM
	TAD	LASTROW		LAST ROW ADDRESS
	SNA CLA			WAS THAT THE VERY LAST ROW?
	JMP	3F		YES: SO ALL DONE HERE
/
	INC	XT3		NOT LAST ROW: STEP POINTER
	TAD	=X:CRLF		RECURSIVE CALL FOR CR/LF
	JMS	SIO		...(SAFE SINCE ADDRESS WAS SAVED)
2H	ISZ	XT4		TEST LOOP COUNTER
	JMP	1B		MORE ROWS TO DO
/
/	HERE WHEN ALL DONE
/
3H	TAD	XT5		RESTORE ADDRESS SAVED FOR RECURSE
	CDF	%*		BACK TO CURRENT FIELD FOR A MOMENT
	AFIELD	%*		...
	DCA	SIO		...
	TAD	XT6		...
	DCA	XTER		...
	CDF	BUF
	AFIELD	BUF		...
	RET	DOROWS		ALL DONE HERE
/
/	HERE TO TEST TO SEE WHICH HALF OF THE SCREEN WE ARE IN. FIRST
/	RETURN INDICATES WE ARE IN SECOND HALF OF SCREEN. SECOND RETURN
/	INDICATES WE ARE IN FIRST HALF OF SCREEN.
/
	ROOM	5
	INC	HALFCK		TAKE SECOND RETURN
HALFCK	SUB			ENTRY AND EXIT POINT
	TAD	ROW		CURRENT ROW NUMBER
	CMA 			SUBTRACT FROM START OF ROW TABLE
	TAD	ROWTAB		...
	CLL RAL			MULTIPLY BY TWO (IT'S NEGATIVE)
	TAD	ROWSIZ		AND SUBTRACT FROM NUMBER OF ROWS
	SPA CLA			WHICH HALF OF THE SCREEN ARE WE IN?
	RET	HALFCK		SECOND HALF: TAKE FIRST RETURN
	JMP	HALFCK-2	FIRST HALF: TAKE SECOND RETURN
/
/	HERE FOR INSERT LINE FUNCTION. AS WITH DELETE LINE WE HAVE TO
/	IMPROVISE ON THE VT52 SINCE THERE IS NO NATIVE CRT FUNCTION.
/
/	IN THIS CASE WE ALSO OPTIMIZE:
/
/		INSERTION IN TOP HALF OF SCREEN:
/			ISSUE REVERSE LINE FEED ON TOP LINE, COPY ALL
/			ROWS FROM TOP ROW UP TO BUT NOT INCLUDING ROW
/			WE ARE ON. EXCEPTION: IF FOLLOWING LINE DOES NOT EXIST
/			ALL WE NEED TO DO IS ERASE THAT LINE (NO NEED TO COPY)
/
/		INSERTION IN BOTTOM HALF OF SCREEN. COPY ROWS FROM CURRENT
/		POSITION TO END OF SCREEN.
/
	ROOM	4
Z:INS	JMS	HALFCK		WHICH HALF OF SCREEN ARE WE IN?
	JMP	ZINS2		SECOND HALF OF SCREEN
	TAD	ROW		GET CURRENT ROW POINTER
	IAC			+1 TO LOOK AT NEXT ROW
	DCA	XT2		SAVE POINTER TO THAT ROW
	TADI	XT2		GET ADDRESS OF LENGTH/STATUS WORD FOR THAT ROW
	DCA	XT2		SAVE THAT POINTER
	TADI	XT2		GET ACTUAL LENGTH/STATUS WORD
	SPA CLA			SKIP IF THE FOLLOWING ROW EXISTS
	JMP	Z:EOL		DOES NOT EXIST: HANDLE WITH END OF LINE ERASE
	JMS	MOVEC		AC=0 TO MOVE CURSOR TO TOP ROW
	TAD	='I		ISSUE REVERSE INDEX COMMAND
	JMS	DOESC		...
	JMS	TOPHLF		NOW RECOPY TOP HALF OF SCREEN
	TAD	='K		ERASE TO END OF LINE NOW
	JMP	ESCX		ALL DONE HERE
/
ZINS2	TAD	=CR		RETURN TO START OF CURRENT LINE
	JMSI	PSCR		...
	TAD	='K		NOW ERASE TO END OF LINE
	JMS	DOESC		...
	JMP	BOTHLF		RECOPY BOTTOM HALF OF SCREEN NOW
/
/	CLEAR SCREEN.
/
Z:CLSC	TAD	='H		HOME CURSOR FIRST
	JMS	DOESC		...
	TAD	='J		NOW DO ERASE TO END OF MEMORY
	JMP	ESCX		...
/
/	OUTPUT ESCAPE SEQUENCE, CHAR IN AC
/
DOESC	SUB
	DCA	XT		SAVE CHARACTER
	TAD	=0233		OUTPUT ESCAPE CODE
	JMSI	PSCR		...
	TAD	XT		REGET CHARACTER
	JMSI	PSCR		...
	RET	DOESC		ALL DONE HERE
/
/	HERE FOR CR/LF ON SCREEN.
/
Z:CRLF	TAD	=CR		JUST DO A CR
	JMSI	PSCR		...
	TAD	=LF		FOLLOWED BY A LINE FEED
	JMP	CHOUT		...
	EJECT
/
/	HERE FOR POSITION CURSOR COMMAND. IN THIS CASE, WE POSITION
/	TO THE ROW AND COLUMN SPECIFIED BY 'ROW' AND 'COL'
/
/	VT52 REQUIRES:
/
/		ESC	Y	L	C
/
/	WHERE X IS THE LINE NUMBER, AND Y IS THE COLUMN POSITION
/
Z:POS	TAD	ROWTAB		START OF ROW TABLE
	CMA IAC			NEGATE AND SUBTRACT FROM
	TAD	ROW		CURRENT ROW POSITION
	JMS	MOVEC		MOVE CURSOR TO THAT ROW NOW
	JMP	XSIO		ALL DONE HERE
/
/	SUBROUTINE TO MOVE TO A PARTICULAR ROW AND COLUMN. ON ENTRY
/	'COL' HAS THE DESIRED COLUMN, AND THE AC HAS THE BINARY ROW
/	POSITION THAT WE WANT.
/
MOVEC	SUB
	TAD	=' 		BUILD ASCII CODE FOR LINE POSITION
	DCA	XT3		SAVE FOR A MOMENT
	TAD	='Y		START OF POSITIONING SEQUENCE
	JMS	DOESC		START THE SEQUENCE
	TAD	XT3		GET ROW POSITION
	JMSI	PSCR		OUTPUT THAT
	TAD	COL		GET THE BINARY COLUMN POSITION
	TAD	=' 		BUILD ASCII CODE FOR COLUMN
	JMSI	PSCR		OUTPUT THAT
	RET	MOVEC		ALL DONE HERE