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

	FILE	VCM100 - VT100 V.C.M. FILE
/	TITLE	VERSION 01.21  --  VISTA INTRODUCTION
/
/
/		******************************************
/		**					**
/		**	        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
/
/
/	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')
	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.
/
/	THEN SAVE VISTA WITH A STARTING ADDRESS OF 200, AND SAVE
/	VCM WITH A STARTING ADDRESS OF 7605 (I.E. IT SHOULD NEVER
/	BE RUN DIRECTLY.
	TITLE	FIXED SECTION
/
XT3	EQU	XT2+1		TEMPORARY LOCATION ON PAGE 0 FOR VCM FILE
/
	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
	JMP	XIN		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	030		24 ROWS ON VIDEO SCREEN
VCOLS	DC	0120		80 COLUMNS ON VIDEO SCREEN
VAUCOL	DC	0110		COLUMN 72 FOR AUDIT TRAIL OF VERSION #'S
VSTAT	DC	06000		XON/XOFF PROCESSED, CTRL/O ALLOWED
/
/	### END OF FIXED ADDRESS SECTION UTILIZED BY VISTA PROGRAM ###
/
XSIO	JMPI	SIO		HERE TO EXIT FROM 'SIO'
PXOUT	DC	XOUT		POINTER TO 'XOUT'
	TITLE	KEYBOARD ESCAPE TRANSLATION TABLE
/
/	VISTA INTERNAL CODE FOR ALL ESCAPED CHARACTERS POSSIBLE ON THE
/	KEYBOARD.
/
/ P,Q,R,S ARE THE 'PFX' KEYS ON THE VT100. 'M' IS GENERATED FROM THE ENTER
/ KEY
/
MPQRS	DC	Y:NEWCMD	M	ENTER COMMAND MODE
	DC	Y:DELSCR	N	DELETE SCREEN (GENERATED MANUALLY)
	DC	Y:TRUNCF	O	TRUNCATE FILE (GENERATED MANUALLY)
	DC	Y:PAGEUP	P	PAGE UP
	DC	Y:PAGEDN	Q	PAGE DOWN
	DC	Y:SCRLUP	R	SCROLL UP
	DC	Y:SCRLDN	S	SCROLL DOWN
/
/ LOWER CASE TABLE, PREFIXED WITH ESCAPE AND 'O'
/ THIS IS THE AUXILIARY KEYPAD, WHEN IN ANSI MODE.
/
LMN	DC	Y:CNEXTL	L	NEXT LINE
	DC	Y:CEOL		M	CURSOR TO END OF LINE
	DC	Y:HOME		N	HOME CURSOR
	DC	0		O	(NOT GENERATED)
	DC	Y:ROWINS	P	INSERT LINE
	DC	Y:WLEFT 	Q	WORD LEFT
	DC	Y:SEARCH	R	START OF LINE
	DC	Y:WRIGHT	S	WORD RIGHT
	DC	Y:MKROW 	T	MARK LINE
	DC	Y:PICKUP	U	PICKUP LINES
	DC	Y:PUTDN		V	PUT DOWN LINES
	DC	Y:TOFC		W	FIRST PAGE
	DC	Y:DOSCRN	X	RESTORE SCREEN
	DC	Y:BOFC 		Y	LAST PAGE
/
/	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	(RESERVED FOR XON/XOFF)
	DC	Y:RCONT		CTRL/R	CONTINUOUS REPLACE
	DC	0		CTRL/S	(RESERVED FOR XON/XOFF)
	DC	Y:RSTEP		CTRL/T	STEP REPLACEMENT
	DC	Y:DLETLN	CTRL/U	DELETE LINE
	DC	Y:INSBLK	CTRL/V	INSERT BLOCK
	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/[
/
/ VT100 CURSOR CONTROL KEYS. OVERLAYS CONTROL KEYS FOR SPACE
/ SO IF CONTROL KEY IS HIT BY MISTAKE, NO HARM IS DONE, IT JUST
/ DOES A CURSOR MOVEMENT.
/
ABCD	DC	Y:CUP		A	CURSOR UP	CTRL/\
	DC	Y:CDOWN		B	CURSOR DOWN	CTRL/]
	DC	Y:CRIGHT	C	CURSOR RIGHT	CTRL/^
	DC	Y:CLEFT		D	CURSOR LEFT	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 RETURN VDT TO ORIGINAL STATE
	DC	Z:CTRL		15 CONTROL CODE-NON-DISPLAYABLE
/
	TITLE	TRANSLATION ROUTINES
/
	ISEC	0		ENABLE PAGING
/
/	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.
/
IGCHAR	CLA			(BACK HERE AFTER BAD SEQUENCE)
XIN	JMSI	PKBD		GET CHARACTER FROM KEYBOARD
	TAD	=-0233		TEST FOR ESCAPE CODE
	SNA			SKIP IF NOT
	JMP	ESCODE		HANDLE ESCAPE CODE
	TAD	=0233-0240	TEST FOR CONTROL CODE
	SPA			SKIP IF NOT CONTROL CODE
	JMP	CTRCOD		ELSE HANDLE CONTROL CODE
	TAD	=0240		RESTORE NORMAL CHARACTER
/
/	MERGE FROM SEVERAL PLACES TO EXIT
/
XKIO	JMPI	KIO		RETURN DIRECTLY TO VISTA
/
/	HERE ON ESCAPE CODE.
/	NEXT CHARACTER WILL BE LETTER O, SO FLUSH IT OUT
/
ESCODE	JMSI	PKBD		READ CHARACTER AFTER ESCAPE CODE
	CLA			IGNORE IT
/
/ WE ARE HANDLING A 3-CHAR ESCAPE SEQUENCE. GET THE THIRD CHAR NOW
/
	JMSI	PKBD		READ 3RD CHAR OF SEQUENCE
	TAD	=-'D-1		TEST FOR A-D
	CLL			...
	TAD	='D-'A+1	...
	SZL
	JMP	DOABCD		A-D
/
	TAD	='A-'S-1	M-S?
	CLL			...
	TAD	='S-'M+1	...
	SZL
	JMP	DOMPQRS		M-S
/
	TAD	='M-'Y-040-1	L-Y LOWER CASE?
	CLL			...
	TAD	='Y-'L+1	...
	SNL			
	JMP	IGCHAR		SOMETHING ELSE: IGNORE IT
/
	TAD	=LMN-ABCD	INDEX TABLE
DOABCD	TAD	=ABCD-MPQRS	...
DOMPQRS	TAD	=MPQRS-ITRAN-040 ...
CTRCOD	TAD	=ITRAN+040	BIAS CODE TO RANGE 0-37
/
	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	OUTPUT SECTION
/
/	ENTER HERE WITH CHARACTER TO BE OUTPUT TO THE SCREEN
/
XOUT	TAD	=-0200		LOWEST ASCII CODE
	SPA			SKIP IF DISPLAYABLE CODE
	JMP	FUNCOD		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 ON CONTROL CHARACTER - MUST DISPLAY SOME KIND OF GRAPHIC
/	ON SCREEN. ENTER VT52 MODE TEMPORARILY AND ISSUE GRAPHIC CODE
/
Z:END	TAD	='H-'A		'H' IN GRAPHICS FOR END OF LINE GRAPHIC
Z:CTRL	TAD	='A+040		'A' IN GRAPHICS FOR CONTROL CHARACTER
DOGRAF	DCA	XT2		SAVE GRAPHIC CHARACTER
	CLA CMA			SET FLAG: NOT IN 'Z:RTN' FUNCTION
/
/ MERGE HERE TO END UP FROM 'Z:RTN' FUNCTION
/
Z:RTN2	DCA	XT3		CLEAR FLAG HERE
	TAD	='?		PRIVATE MODE
	JMS	ESCBRA		...
	TAD	='2		ENTER VT52 MODE
	JMSI	PSCR		...
	TAD	='L+040		END OF ESCAPE SEQUENCE--RESET MODE
	JMSI	PSCR		...
	ISZ	XT3		WERE WE IN THE 'Z:RTN' FUNCTION?
	JMP	XSIO		YES: SO ALL DONE HERE NOW
	TAD	='F		ENTER GRAPHICS MODE
	JMS	DOESC		...
	TAD	XT2		GRAPHIC CHAR
	JMSI	PSCR		...
	TAD	='G		EXIT GRAPHICS MODE
	JMS	DOESC		...
	TAD	='<		RETURN TO ANSCII MODE
	JMS	DOESC		...
	JMP	XSIO		DONE HERE
/
/ HERE TO RETURN VDT TO ORIGINAL CONDITION. ASSUME THAT MOST PDP-8 USERS
/ OF THE VT100 WILL WANT TO RETURN TO VDT-52 MODE, TO BE COMPATIBLE WITH
/ MOST DEC SOFTWARE
/
Z:RTN	TAD	='>		EXIT ALTERNATE KEYPAD MODE
	JMS	DOESC		...
	JMP	Z:RTN2		ALL DONE HERE
/
/	HERE ON FUNCTION CODE: INDEX DISPATCH TABLE
/
FUNCOD	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	CLA CMA			CONTROL/G DOES BELL FUNCTION
Z:BKSP	TAD	=0210		CONTROL/H DOES BACKSPACE FUNCTION
	JMP	CHOUT		...
/
/	HERE TO INITIALIZE VDT. RUN VDT IN ANSI MODE.
/
Z:INIT	TAD	='<		ENTER ANSI MODE
	JMS	DOESC		...
	JMS	WINDOW		ENSURE WINDOW RESET PROPERLY
	TAD	='=		SET ALTERNATE KEYPAD MODE
	JMS	DOESC		...
	TAD	='?		DEC PRIVATE FLAG
	JMS	ESCBRA		SEND ESC[?1
	TAD	='1		SET CURSOR KEYS TO APPLIC. KEYPAD MODE
	JMSI	PSCR		...
	TAD	=';		SEPARATOR ON SEQUENCE
	JMSI	PSCR		...
	TAD	='8		TURN AUTO-REPEAT TO ON CONDITION
	JMSI	PSCR		...
	TAD	='H+040		END OF SET MODE
	JMP	CHOUT		DONE HERE
/
/	ERASE TO END OF LINE
/
Z:EOL	TAD	='0		END OF LINE FUNCTION
	JMS	ESCBRA		...
	TAD	='K		END WITH CAP 'K'
	JMP	CHOUT		...
/
/	HERE TO DO FUNCTION PREFIXED BY ESCAPE AND BRACKET.
/
ESCBRA	DC	0
	DCA	XT		SAVE CHARACTER TO GO OUT
	TAD	=0233		SEND ESCAPE
	JMSI	PSCR		...
	TAD	='[		BRACKET
	JMSI	PSCR		...
	TAD	XT		LAST CHARACTER
	SZA			SKIP IF ZERO ON ENTRY HERE
	JMSI	PSCR		...
	JMPI	ESCBRA		DONE HERE
/
/	DELETE LINE FUNCTION
/	HERE WE SET SCROLL PARAMETERS SO THAT TOP WINDOW IS THE LINE
/	TO DELETE. THEN WE CURSOR ADDRESS TO BOTTOM OF SCREEN AND
/	ISSUE A LINE FEED TO FORCE UPWARDS SCROLL
/	OPTIMIZE, HOWEVER SO THAT IF WE ARE ON THE TOP LINE, THERE
/	IS NO NEED TO RESET THE WINDOW
/
Z:DEL	JMS	CROW		GET ADDRESS OF CURRENT ROW
	SZA			AVOID WINDOW IF LINE 0
	JMS	WINDOW		SET NEW WINDOW VALUE
/
/	NOW WE HAVE SET THE WINDOW. CURSOR ADDRESS TO BOTTOM OF SCREEN.
/
	TAD	ROWSIZ		ROW TO ADDRESS TO
	JMS	MOVEC		MOVE CURSOR THERE
	TAD	=LF		LINE FEED AT BOTTOM NOW
	JMSI	PSCR		...
	JMS	CROW		WHAT ROW ARE WE ON?
	SZA CLA			DON'T RESET WINDOW IF ON TOP ROW
	JMS	WINDOW		RESET WINDOW NOW TO TOP LINE
	JMS	CROW		ADDRESS OF CURRENT ROW
	JMS	MOVEC		MOVE CURSOR TO COL 0, CURRENT LINE
	JMP	XSIO		ALL DONE HERE
/
/	CLEAR SCREEN COMMAND
/
Z:CLSC	TAD	='2		ERASE ENTIRE SCREEN
	JMS	ESCBRA		DO ESCAPE AND [ AHEAD OF IT
	TAD	='J		END OF CLEAR SEQUENCE
	JMSI	PSCR		...
	JMS	MOVEC		HOME THE CURSOR NOW
	JMP	XSIO		ALL DONE HERE
/
/	SUBROUTINE TO GET ADDRESS OF CURRENT ROW
/	RETURNS VALUE OF 0 FOR ROW 1 TO MAKE IT EASY TO DETECT
/
CROW	DC	0
	TAD	ROWTAB		FIRST LINE IN TABLE
	CMA IAC			NEGATE AND SUBTRACT
	TAD	ROW		ADJUST TO RANGE 1-N
	SZA			IF ON ROW 0, LEAVE AT 0
	IAC			ELSE UPDATE TO ROW 1-N RANGE
	JMPI	CROW		ALL DONE HERE
/
/	MOVE LINE ADDRESS SPECIFIED IN AC ON ENTRY
/
MOVEC	DC	0
	DCA	XT2		SAVE FOR A MOMENT
	JMS	ESCBRA		ESCAPE [ AGAIN
	TAD	XT2		ADDRESS OF SPECIFIED LINE
	JMS	TWOUT		...
	TAD	=';		SEPARATOR
	JMSI	PSCR		...
	TAD	='0		COLUMN ZERO
	JMSI	PSCR		...
	TAD	='F+040		END SEQUENCE
	JMSI	PSCR		...
	JMPI	MOVEC		DONE HERE
/
/	HERE TO SET WINDOW. BINARY LINE ADDRESS IN AC ON ENTRY
/
WINDOW	DC	0
	DCA	XT2		SAVE LINE NUMBER
	JMS	ESCBRA		DO ESCAPE AND BRACKET
	TAD	XT2		GET TOP LINE POSITION
	JMS	TWOUT		SET TOP LINE POSITION
	TAD	=';		SEPARATE PARAMETERS
	JMSI	PSCR		...
	TAD	ROWSIZ		FINAL COLUMN
	JMS	TWOUT		...
	TAD	='R+040		END OF SEQUENCE
	JMSI	PSCR		...
	JMPI	WINDOW		DONE HERE
/
/	HERE FOR INSERT LINE. TO INSERT A LINE. SET TOP WINDOW
/	ON THAT LINE, CURSOR ADDRESS TO THAT LINE AND ISSUE
/	A REVERSE INDEX COMMAND.
/	OPTIMIZE IF ROW IS UNESTABLISHED, ALL WE HAVE TO DO IS ERASE
/	THE ROW.
/
Z:INS	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	CROW		START OF SCREEN
	SZA			AVOID WINDOW IF INSERT ON ROW 0
	JMS	WINDOW		ELSE SET TOP WINDOW
	JMS	CROW		CURRENT LINE AGAIN
	JMS	MOVEC		MOVE CURSOR TO THAT LINE
	TAD	='M		DO REVERSE INDEX
	JMS	DOESC		...
	JMS	CROW		GET POSITION AGAIN
	SNA CLA			SKIP IF WE WERE NOT ON TOP ROW
	JMP	XSIO		ALL DONE (CURSOR IN POSITION)
	JMS	WINDOW		RESET SCREEN WINDOW
	JMS	CROW		CURRENT ROW ADDRESS AGAIN
	JMS	MOVEC		MOVE CURSOR BACK THERE
	JMP	XSIO		ALL DONE HERE
/
/	OUTPUT ESCAPE SEQUENCE, CHAR IN AC
/
DOESC	DC	0
	DCA	XT		SAVE CHARACTER
	TAD	=0233		OUTPUT ESCAPE CODE
	JMSI	PSCR		...
	TAD	XT		REGET CHARACTER
	JMSI	PSCR		...
	JMPI	DOESC		ALL DONE HERE
/
/	HERE FOR CR/LF ON SCREEN.
/
Z:CRLF	TAD	=0215		CR
	JMSI	PSCR		...
	TAD	=LF		LF CODE
	JMP	CHOUT		DONE HERE
/
/	HERE FOR VIDEO MODES WITH ADVANCED VIDEO OPTION.
/	IF YOU DO NOT HAVE ADVANCED VIDEO, CHANGE THE
/	CODE BELOW TO:
/
/		Z:NMV	JMP	XNULL	/ NOTHING FOR NORMAL
/		Z:SPV1	TAD	ZCHAR
/			JMP	DOGRAF	/ DO GRAPHIC INSTEAD
/		ZCHAR	DC	'O+040	/ GRAPHIC CHARACTER
/
Z:NMV	CLA CMA			TURN OFF ATTRIBUTES
/
Z:SPV1	TAD	='1-'4		SET FOR BOLD
Z:SPV2	TAD	='4		SET FOR UNDERLINE
	JMS	ESCBRA		DO ESC[DIGIT
	TAD	='M+040		END OF SEQUENCE
	JMP	CHOUT		...
	EJECT
/
/	HERE FOR POSITION CURSOR COMMAND. IN THIS CASE, WE POSITION
/	TO THE ROW AND COLUMN SPECIFIED BY 'ROW' AND 'COL'
/
/	VT100 REQUIRES:
/
/		ESC	[	XXX	YYY	f
/
/	WHERE XXX IS THE LINE NUMBER, AND YYY IS THE COLUMN POSITION
/
Z:POS	JMS	ESCBRA		START WITH ESCAPE AND BRACKET
	JMS	CROW		ADDRESS OF CURRENT ROW
	JMS	TWOUT		OUTPUT LINE ADDRESS
	TAD	=';		SEPARATOR
	JMSI	PSCR		...
	TAD	COL		COLUMN POSITION
	IAC			ADJUST TO RANGE 1-N
	JMS	TWOUT		OUTPUT THAT
	TAD	='F+040		END OF SEQUENCE
	JMP	CHOUT		ALL DONE HERE
/
/	OUTPUT BINARY NUMBER IN AC AS TWO ASCII DIGITS
/
TWOUT	DC	0
	DCA	XT		SAVE RESULT
	TAD	='0-1		INITIALIZE HIGH DIGIT
	DCA	XT2		ACCUMULATE RESULT
	TAD	XT		GET THE NUMBER
/
TW1	INC	XT2		COUNT THE DIGIT
	TAD	=-012		COUNT TENS POSITION
	SMA			ALL DONE?
	JMP	TW1		NO: SO LOOP BACK NOW
/
	TAD	=012+'0		MAKE A DIGIT
	DCA	XT		AND SAVE IT
	TAD	XT2		OUTPUT FIRST DIGIT
	JMSI	PSCR		...
	TAD	XT		OUTPUT SECOND DIGIT
	JMSI	PSCR		...
	JMPI	TWOUT		ALL DONE HERE
/
	ORG	06600