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

	FILE	VCM200 - VISUAL TECHNOLOGY-200
/	TITLE	VERSION 01.30  --  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
/									/01.20
/ REVISION HISTORY							/01.20
/ 									/01.20
/ 1-MAY-80	C.E.S.D		MODIFIED TO INCLUDE INSERT BLOCK	/01.20
/ 				REMOVED CURSOR RIGHT FUNCTION		/01.21
/ 				REMOVED CONTROL TAB FUNCTION		/01.21
/ 5-MAY-80	C.E.S.D		ADDED SMOOTH SCROLL SUPPORT		/01.30
/ 				ADDED VIDEO ENHANCEMENT SUPPORT		/01.30
	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	/01.20
/	'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 IMPORT/01.20
/			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')
	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.EQ,VCM						/01.20
/
/	WHERE FOR PAL8, 'VISTA.EQ' IS THE PAGE8 SYMBOL DIRECTORY CONVERT/01.20
/	INTO PAL8 COMPATIBLE FORMAT.
/
XT3	EQU	XT2+1		SCRATCH CELL
/
/ ADJUST EQUATE BELOW BASED UPON BAUD RATE. VALUE BELOW IS CORRECT
/ FOR 9600 BAUD.
/
NULCT	EQU	142		NUMBER OF NULLS FOR SMOOTH SCROLL TIMING
/
	ORG	KIO		KEYBOARD I/O
	DSEC
/
/	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.
/
/	CHARACTERS PRECEDED BY ESCAPE KEY ONLY
/
PQR	DC	Y:NEWCMD	P	ENTER COMMAND MODE
	DC	Y:TOFC		Q	TOP OF FILE
	DC	Y:BOFC		R	BOTTOM OF FILE
/ 									/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
/
/	CHARACTERS PRECEDED BY ESCAPE KEY ONLY
/
SPST	DC	Y:PAGEUP	SP	PAGE UP
	DC	Y:PAGEDN	!	PAGE DOWN
	DC	Y:UNMKROW	"	UNMARK LINE
	DC	Y:MKROW		#	MARK LINE
	DC	Y:PICKUP	$	PICKUP
	DC	Y:PUTDN		%	PUT DOWN
	DC	Y:RSTEP		&	REPLACEMENT STEP
	DC	Y:RCONT		'	REPLACEMENT CONTINUOUS
	DC	Y:DISMOD	(	DISPLAY MODIFIED LINES
	DC	Y:DOSCRN	)	RESTORE SCREEN
	DC	Y:ROWINS	*	INSERT ROW
/
/	LOWER CASE CHARACTERS PRECEDED BY ESCAPE AND QUESTION MARK
/
LMN	DC	Y:CDOWN		L	CURSOR DOWN
	DC	Y:AWAY		M	CURSOR TO AWAY POSITION
	DC	Y:WRIGHT	N	WORD RIGHT
	DC	0		O
	DC	Y:WLEFT		P	WORD LEFT
	DC	Y:CLEFT		Q	CURSOR LEFT
	DC	Y:HOME		R	HOME CURSOR
	DC	Y:CRIGHT	S	CURSOR RIGHT
	DC	Y:CEOL		T	CURSOR TO END OF LINE
	DC	Y:CUP		U	CURSOR UP
	DC	Y:SCRLDN	V	SCROLL DOWN
	DC	Y:CNEXTL	W	CURSOR TO START OF NEXT LINE
	DC	Y:SEARCH	X	SEARCH KEY
	DC	Y:SCRLUP	Y	SCROLL UP
/
/	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
	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	Y:INSBLK	CTRL/^	INSERT BLOCK			/01.20
	DC	Y:TRUNCF	CTRL/_	TRUNCATE FILE
	TITLE	SCREEN TRANSLATION TABLE
/
/	DISPATCH TABLE FOR OUTPUT FUNCTION CODES
/
XTAB	DC	Z:POS		0 POSITION CURSOR
	DC	Z:INIT		1 INITIALIZE SCREEN
	DC	Z:SPAC		2 TABULATION/PAD CODE			/01.21
	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	/01.21
	DC	Z:RTN		14 RETURN TERMINAL TO ORIGINAL CONDITION/01.21
	DC	Z:CTRL		15 CONTROL CODE-NON-DISPLAYABLE		/01.21
	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.
/
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 = 3 CHAR SEQUENCE
/		P-R		FIRST 3 FUNCTION KEYS
/		SPACE-*		NEXT 11 FUNCTION KEYS
/
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 P-R
/
ADCK	TAD	='1-'R-1	TEST FOR P-R
	CLL			...
	TAD	='R-'P+1	...
	SZL			SKIP IF NOT P-R
	JMP	DOPQR		ELSE HANDLE A-D HERE
	TAD	='P-'*-1	SPACE THROUGH STAR?
	CLL			...
	TAD	='*-' +1	...
	SZL
	JMP	DOSPST		SPACE-STAR
	JMP	BADESC		ELSE HANDLE BAD ESCAPE SEQUENCE NOW
/
THRCHR	JMSI	PKBD		READ THIRD CHARACTER OF SEQUENCE
	TAD	=-('Y+040)-1	L-Y LOWER CASE?
	CLL			...
	TAD	='Y-'L+1	...
	SZL			
	JMP	DOLMN		L-Y LOWER CASE
BADESC	CLA
	JMP	XIN		SOMETHING ELSE: IGNORE IT
/
DO123	TAD	=ESCDIG-PQR	INDEX TABLE
DOPQR	TAD	=PQR-SPST	...
DOSPST	TAD	=SPST-LMN	...
DOLMN	TAD	=LMN		...
/
2H	DCA	XT		...
	CDF	%*
	TADI	XT		LOAD VISTA INTERNAL CODE
	CDF	BUF		RESET TO MAIN BUFFER FIELD
	SZA			IS THIS AN UNDEFINED CODE?
	JMP	XKIO		NO: SO RETURN IT IN THE AC
	JMP	XIN		YES: SO STRIP COMPLETELY
	TITLE	VCM OUTPUT SECTION
/
/	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. USE HALF INTENSITY FEATURE FOR MARKED LINE/01.30
/ 									/01.30
Z:NMV	LDI	-1		NORMAL VIDEO: FULL INTENSITY		/01.30
/
Z:SPV1	TAD	='4		SPECIAL VIDEO: HALF INTENSITY		/01.30
Z:SPV2	QUT	%*,Z:SPV1	...					/01.30
	JMP	ESCX		SEND ESCAPE SEQUENCE			/01.30
/
/	HERE ON END OF LINE CODE- MUST DISPLAY SOME KIND OF GRAPHIC
/	ON SCREEN.
/
Z:END	TAD	='A-'P		GRAPHIC FOR END OF LINE
Z:CTRL	TAD	='P+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		...
RESETG	TAD	='G		RE-SET GRAPHICS MODE
	JMP	ESCX		ALL DONE HERE
/
/	HERE ON INITIAL ENTRY, MUST ENSURE GRAPHICS MODE CLEAR AND ALSO SET
/	ALTERNATE KEYPAD MODE
/
Z:RTN	TAD	='>-'=		RESET ALTERNATE KEYPAD MODE FOR EXIT
Z:INIT	TAD	='=		ESCAPE/= SETS ALTERNATE KEYPAD MODE
	JMS	DOESC		...
	JMP	RESETG		END UP NOW BY RESETTING GRAPHICS MODE
/
/	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 CONTROL CODE WHICH WE WISH TO SEND NORMALLY
/
OCTRL	TAD	XT		REGET THE CONTROL CHARACTER
	JMP	CHOUT		OUTPUT CHARACTER NOW
	EJECT
/
/	HERE FOR BACKSPACE/BELL/TAB AND PAD FUNCTIONS
/
Z:BEL	LDI	-1		CONTROL/G DOES BELL FUNCTION
Z:BKSP	TAD	=0210-' 	CONTROL/H DOES BACKSPACE FUNCTION
Z:SPAC	TAD	=' 		TAB/PAD CODE BECOMES A SPACE CODE
	JMP	CHOUT		...
/
/	HERE FOR SIMPLE TWO-CHARACTER ESCAPE FUNCTIONS
/
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
/
/ HERE FOR DELETE LINE. IF DELETING TOP LINE ON SCREEN, CURSOR POSITION
/ TO BOTTOM LINE AND ISSUE LINE FEED. IT HAS THE SAME EFFECT AND HAS THE
/ ADVANTAGE ON THE VISUAL-200 OF ENABLING THE SMOOTH SCROLL. THE
/ SMOOTH SCROLL IS NOT PERFECT BECAUSE OF DISC/TAPE I/O, BUT IT'S CLOSE
/
Z:DEL	TAD	ROW		GET CURRENT ROW POSITION
	CMA IAC			SUBTRACT FROM
	TAD	ROWTAB		FIRST ROW IN ROW TABLE
	SZA CLA			SKIP IF DELETING TOP ROW
	JMP	Z:DEL2		NOT TOP ROW: JUST DO DELETE LINE THEN
/
/ HERE FOR DELETE OF TOP ROW. ISSUE LINE FEED ON BOTTOM ROW.
/
	LDI	-1		COMPUTE BINARY POSITION OF LAST ROW
	TAD	ROWSIZ		...
	JMS	MOVEC		MOVE CURSOR TO THAT ROW
/
/ GET LENGTH OF CURRENT BOTTOM LINE ON SCREEN TO CALCULATE HOW
/ MANY NULLS TO SEND OUT.
/
	LDI	-1		LAST ROW IS NOW ON 2ND TO LAST ROW
	TAD	LASTROW		...
	DCA	XT		SAVE POINTER TO 2ND TO LAST ROW
	TADI	XT		GET ADDRESS OF LENGTH/STATUS
	DCA	XT		SET POINTER
	TADI	XT		GET THE LENGTH/STATUS WORD
	AND	=0377		ISOLATE THE LENGTH FIELD
	TAD	=-NULCT		NUMBER OF NULLS NEEDED AT BAUD RATE
	JMS	NULSUB		GENERATE THAT NUMBER OF NULLS NOW
	TAD	=LF		ISSUE LINE FEED ON THAT ROW
	JMSI	PSCR		...
	JMS	MOVEC		MOVE CURSOR BACK TO TOP ROW
	JMP	DONULLS		FOR SAFETY, FOLLOW WITH NULL STRING
/
/	DELETE LINE, INSERT LINE AND CLEAR SCREEN.
/
Z:DEL2	TAD	='M-('V+040)	ESCAPE/M DELETES LINE
Z:CLSC	TAD	='V+040-'L	DO ESCAPE/v FOR CLEAR SCREEN
Z:INS	TAD	='L		ESCAPE/L INSERTS LINE
	JMS	DOESC		...
/
/ COME HERE TO ISSUE A STRING OF NULLS TO AVOID TIMING PROBLEMS
/
DONULLS	TAD	=-30		FOLLOW WITH 30  NULLS FOR TIMING
	JMS	NULSUB		CALL NULL SUBROUTINE
	JMP	XSIO		ALL DONE HERE
/
/ SUBROUTINE TO GENERATE NULLS. CALL WITH NEGATIVE NUMBER OF NULLS
/ TO GENERATE IN AC ON ENTRY.
/
NULSUB	SUB
	DCA	XT		...
2H	TAD	=NULL		OUTPUT NULLS
	JMSI	PSCR		...
	ISZ	XT		MORE NULLS?
	JMP	2B		YES: DO THEM
	RET	NULSUB		NO: ALL DONE HERE
/
/	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		CARRIAGE RETURN
	JMSI	PSCR		...
	TAD	=LF		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'
/
/	VISUAL-200 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