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

	FILE	VCMBEE - BEEHIVE SUPER BEE II
/	TITLE	VERSION 01.09  --  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')
	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.
/
	DSEC
/
XT3	QUT	0,XT2+1		TEMPORARY CELL
XT4	QUT	0,XT3+1		TEMPORARY CELL
/
	ORG	KIO		KEYBOARD I/O
/
/	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	25		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.
/
ITRAN	DC	0		CTRL/NULL
	DC	Y:TRANSP	CTRL/A	TRANSPARENT MODE
	DC	0		CTRL/B
	DC	0		CTRL/C
	DC	0		CTRL/D
	DC	Y:TRUNCF	CTRL/E
	DC	0		CTRL/F
	DC	0		CTRL/G
	DC	Y:BKDEL		CTRL/H
	DC	Y:TABR		CTRL/I
	DC	Y:CNEXTL	CTRL/J
	DC	Y:DELWD		CTRL/K
	DC	0		CTRL/L
	DC	Y:RETURN	CTRL/M
	DC	0		CTRL/N
	DC	0		CTRL/O
	DC	Y:CASE		CTRL/P
	DC	0		CTRL/Q
	DC	0		CTRL/R
	DC	0		CTRL/S
	DC	0		CTRL/T
	DC	Y:DLETLN	CTRL/U
	DC	0		CTRL/V
	DC	Y:QUIT		CTRL/W
	DC	0		CTRL/X
	DC	0		CTRL/Y
	DC	Y:XEDIT		CTRL/Z
	DC	0233		CTRL/[	RETURN SINGLE ESCAPE CODE
	DC	0		CTRL/\
	DC	0		CTRL/]
	DC	0		CTRL/^
	DC	0		CTRL/_
/
	DC	0		SPACE
	DC	0		!
	DC	0		"
	DC	0		#
	DC	0		$
	DC	0		%
	DC	0		&
	DC	0		'
	DC	0		(
	DC	0		)
	DC	0		*
	DC	0		+
	DC	0		,
	DC	0		-
	DC	0		.
	DC	0		/
	DC	Y:RSTEP		0	REPLACEMENT STEP
	DC	Y:WLEFT		1	WORD LEFT
	DC	Y:WRIGHT	2	WORD RIGHT
	DC	0		3
	DC	0		4
	DC	0		5
	DC	0		6
	DC	0		7
	DC	0		8
	DC	0		9
	DC	0		:
	DC	0		;
	DC	0		<
	DC	0		=
	DC	0		>
	DC	0		?
/
	DC	0		@
	DC	Y:CUP		A	CURSOR UP
	DC	Y:CDOWN		B	CURSOR DOWN
	DC	Y:CRIGHT	C	CURSOR RIGHT
	DC	Y:CLEFT		D	CURSOR LEFT
	DC	Y:DELSCR	E	DELETE SCREEN
	DC	0		F
	DC	0		G
	DC	Y:HOME		H	HOME CURSOR
	DC	0		I
	DC	0		J
	DC	Y:CEOL		K
	DC	Y:ROWINS	L	INSERT LINE
	DC	Y:MKROW		M	MARK ROW
	DC	Y:SEARCH	N	PAGE EDIT IS SEARCH KEY
	DC	0		O
	DC	Y:UNMKROW	P	UNMARK ROW
	DC	Y:INSTOG	Q	INSERT CHARACTER MODE TOGGLE
	DC	0		R
	DC	Y:SCRLUP	S	SCROLL UP
	DC	Y:SCRLDN	T	SCROLL DOWN
	DC	Y:PAGEUP	U	PAGE UP
	DC	Y:PAGEDN	V	PAGE DOWN
	DC	Y:RCONT		W	FMT KEY: REPLACEMENT: CONTINUOUS
	DC	0		X
	DC	0		Y
	DC	Y:TRUNCF	Z	TRUNCATE FILE
	DC	0		[
	DC	0		\
	DC	0		]
	DC	0		^
	DC	0		_
/
	DC	Y:TABL		OPEN QUOTE	BACK TAB
	DC	0		A - LOWER CASE
	DC	0		B - ETC.
	DC	0		C
	DC	0		D
	DC	0		E
	DC	Y:AWAY		F	CURSOR TO END OF SCREEN
	DC	0		G
	DC	0		H
	DC	0		I
	DC	0		J
	DC	0		K
	DC	0		L
	DC	0		M
	DC	0		N
	DC	0		O
	DC	Y:NEWCMD	P	COMMAND MODE
	DC	Y:TOFC		Q	TOP OF FILE
	DC	Y:BOFC		R	BOTTOM OF FILE
	DC	Y:CAPTOG	S	CAPS LOCK TOGGLE
	DC	Y:PICKUP	T	PICK UP
	DC	Y:PUTDN		U	PUT DOWN
	DC	Y:DISMOD	V	DISPLAY MODIFIED LINES
	DC	Y:DOSCRN	W	DO SCREEN RESTORE
	DC	0		X
	DC	0		Y
	DC	0		Z
	DC	0		OPEN BRACK
	DC	0		LONG COLON
	DC	0		CLOSE BRACE
	DC	0		TILDE
	DC	0		DELETE
	AIF	(ITRAN+0200).EQ.*,.OK
	ERROR:	TRANSLATE TABLE LENGTH IS BAD
.OK	ANOP
	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 END OF LINE GRAPHIC
	DC	Z:RTN		14 RETURN VDT TO ORIGINAL CONDITION
	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 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-' 	CONTROL CODE?
	SPA			SKIP IF NOT
	JMP	0F		HANDLE CONTROL CODE
	TAD	=' 		ELSE RESTORE CHARACTER
	JMP	XKIO		RETURN DIRECTLY TO VISTA
/
/	HERE ON CONTROL CODE, MAP TO FIRST PART OF TABLE (I.E.
/	CONTROL CHARS JUST TREATED THE SAME AS ESCAPE THEN A
/	CONTROL CHAR.
/
0H	TAD	=' 		RESTORE CHARACTER CODE
	JMP	*+2		MERGE TO PROCESS CHARACTER
/
/	HERE ON ESCAPE CODE.
/
1H	JMSI	PKBD		READ CHARACTER AFTER ESCAPE CODE
	TAD	=ITRAN-0200	INDEX TRANSLATE TABLE
	DCA	XT		...
	CDF	%ITRAN
	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	EXTERPRETER FOR BEEHIVE SUPER BEE II
/
/	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
Z:RTN	QUT	%XNULL,XNULL	NOTHING TO DO FOR EXIT
/
/	HERE ON CONTROL CHARACTER - MUST DISPLAY SOME KIND OF GRAPHIC
/	ON SCREEN. USE PROGRAM ENTRY MODE FOR THIS PURPOSE
/
Z:END	LDI	-1		USE LINE FEED AS GRAPHIC
Z:CTRL	TAD	='K-64		USE CONTROL/K AS NORMAL GRAPHIC
	DCA	XT2		SAVE FOR A MOMENT
	TAD	='Y		ENTER PROGRAM ENTRY
	JMS	DOESC		...
	TAD	=-2000		BEEHIVE NOW NEEDS ABOUT 1 MSEC DELAY
	DCA	XT		(!!!)
	ISZ	XT		(CAN'T USE NULL BECAUSE OF PROGRAM ENTRY)
	JMP	*-1		...
	TAD	XT2		GET GRAPHIC CHARACTER
	JMSI	PSCR		...
	TAD	='Z		END UP NOW
	JMS	DOESC		...
	JMP	XSIO		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 CONTROL CODE WHICH WE WISH TO SEND NORMALLY
/
OCTRL	TAD	XT		REGET THE CONTROL CHARACTER
	JMP	CHOUT		OUTPUT CHARACTER 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:INIT	TAD	='R-'K		ESCAPE/R REMOVES INSERT CHARACTER MODE
Z:EOL	TAD	='K		DO ESCAPE/K FOR ERASE TO EOL
	JMS	DOESC		DO ESCAPE SEQUENCE
	JMP	XSIO		ALL DONE HERE
/
/	DELETE LINE FUNCTION. AFTER DOING THE DELETE LINE. PUT
/	A NEW-LINE CODE AT THE BOTTOM OF THE SCREEN. THAT WAY, IT
/	WILL GET PUSHED ALONG WHEN A NEW LINE IS WRITTEN TO THE BOTTOM
/	OF THE SCREEN.
/
Z:DEL	TAD	='M		ESCAPE/M DELETES LINE
	JMS	DOESC		...
	TAD	=-120		120 NULLS TO FOLLOW
	JMS	DONULLS		...
	TAD	ROW		SAVE ROW POSITION
	DCA	XT3		...
	TAD	LASTROW		ADDRESS OF FINAL ROW
	DCA	ROW		...
	JMS	POSITION	POSITION CURSOR ON THAT ROW
	TAD	=0237		PUT NEWLINE ON THAT LINE
	JMSI	PSCR		...
	TAD	XT3		RESTORE CURSOR POSITION
	DCA	ROW		...
	JMS	POSITION	RE-POSITION CURSOR ON SCREEN
	JMP	XSIO		ALL DONE HERE
/
/	SUBROUTINE TO GENERATE # OF NULLS SPECIFIED AS A NEGATIVE NUMBER
/	IN THE AC ON ENTRY.
/
DONULLS SUB
	DCA	XT		...
1H	TAD	=NULL		OUTPUT NULLS
	JMSI	PSCR		...
	ISZ	XT		MORE NULLS?
	JMP	1B		YES: DO THEM
	RET	DONULLS		ALL DONE HERE
/
/	INSERT LINE AND CLEAR SCREEN.
/
Z:INS	TAD	ROW		SAVE CURRENT ROW
	DCA	XT3		...
	TAD	COL		SAVE CURRENT COLUMN
	DCA	XT4		...
	TAD	LASTROW		POSITION AT LAST ROW
	DCA	ROW		...
	DCA	COL		...
	JMS	POSITION	POSITION CURSOR NOW
	TAD	='J		ERASE TO END OF MEMORY
	JMS	DOESC		...
	LDI	-3
	JMS	DONULLS		SEND SOME NULLS
	TAD	XT3		RESTORE ROW
	DCA	ROW		...
	TAD	XT4		RESTORE COLUMN
	DCA	COL		...
	JMS	POSITION	RE-POSITION CURSOR
	TAD	='L-'E		ESCAPE/L INSERTS LINE
Z:CLSC	TAD	='E		DO ESCAPE/E FOR CLEAR SCREEN
	JMS	DOESC		OUTPUT ESCAPE SEQUENCE
	LDI	-3		FOLLOW WITH THREE NULLS
	JMS	DONULLS		...
	JMP	XSIO		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. USE NEWLINE FOR THIS
/
Z:CRLF	TAD	=0237		NEWLINE CODE
	JMP	CHOUT		...
/
/	HERE FOR VIDEO MODES
/
Z:NMV	JMP	XSIO		NORMAL VIDEO: DO NOTHING FOR BEEHIVE
/
Z:SPV1	TAD	='1		SET FOR REVERSE VIDEO CODE
Z:SPV2	QUT	%*,Z:SPV1	SAME ENTRY ADDRESS
	DCA	XT		...
	TAD	=0233		SEND ESCAPE FIRST
	JMSI	PSCR		...
	TAD	='_		THEN UNDERLINE
	JMSI	PSCR		...
	TAD	XT		THEN SEND THE DIGIT
	JMP	CHOUT		...
	EJECT
/
/	HERE FOR POSITION CURSOR COMMAND. IN THIS CASE, WE POSITION
/	TO THE ROW AND COLUMN SPECIFIED BY 'ROW' AND 'COL'
/
/	BEEHIVE REQUIRES:
/
/		ESC	F	YYY	XXX
/
/	WHERE XXX IS THE LINE NUMBER, AND YYY IS THE COLUMN POSITION
/
/	THERE IS A SERIOUS BUG IN THE BEEHIVE VDT. IF WHILE PROCESSING
/	AN ESCAPE SEQUENCE, THE KEYBOARD IS STRUCK, THE VDT LOSES TRACK
/	OF WHAT IT IS DOING. FOR EXAMPLE, IF DELETE CHARACTER IS STRUCK
/	(ESCAPE 'P') THE BEEHIVE CAN MERGE THE ESCAPE WITH A '0' FROM
/	AN ESCAPE SEQUENCE AND DO A PRINT FUNCTION (!). TO AVOID THIS
/	DESIGN FLAW, WE LOCK THE KEYBOARD DURING ESCAPE SEQUENCES.
/
Z:POS	JMS	POSITION	POSITION CURSOR
	JMP	XSIO		ALL DONE HERE
/
/	SUBROUTINE TO POSITION CURSOR
/	(ALSO USED BY DELETE LINE ROUTINE)
/
POSITION SUB
	TAD	=0233		OUTPUT ESCAPE CODE
	JMSI	PSCR		...
	TAD	='F		AND 'F'
	JMSI	PSCR		...
/
/	OUTPUT COLUMN NUMBER AS THREE ASCII, DECIMAL DIGITS
/
	TAD	='0		FIRST DIGIT OF COLUMN ALWAYS 0
	JMSI	PSCR		...
	TAD	COL		GET COLUMN NUMBER
	JMS	TWOUT		OUTPUT AS TWO 8-BIT CHARS
/
/	OUTPUT ROW NUMBER AS THREE ASCII, DECIMAL DIGITS
/
	TAD	='0		FIRST DIGIT OF ROW IS ALWAYS 0
	JMSI	PSCR		...
	TAD	ROWTAB		GET STARTING ADDRESS OF ROW TABLE
	CMA IAC			SUBTRACT FROM CURRENT ROW
	TAD	ROW		...
	JMS	TWOUT		OUTPUT AS 2 8-BITS CODES
	RET	POSITION	ALL DONE HERE
/
/	OUTPUT BINARY NUMBER IN AC AS TWO ASCII DIGITS
/
TWOUT	SUB
	DCA	XT		SAVE RESULT
	TAD	='0		INITIALIZE HIGH DIGIT
	DCA	XT2		ACCUMULATE RESULT
	TAD	XT		GET THE NUMBER
/
1H	TAD	=-10		COUNT TENS POSITION
	SPA			ALL DONE?
	JMP	2F		YES:
/
	INC	XT2		NO: COUNT DIGIT
	JMP	1B		LOOP BACK
/
2H	TAD	=10+'0		MAKE A DIGIT
	DCA	XT		AND SAVE IT
	TAD	XT2		OUTPUT FIRST DIGIT
	JMSI	PSCR		...
	TAD	XT		OUTPUT SECOND DIGIT
	JMSI	PSCR		...
	RET	TWOUT		ALL DONE HERE