DataMuseum.dk

Presents historical artifacts from the history of:

Philips Data Systems

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Philips Data Systems

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download

⟦33e39eeac⟧

    Length: 123060 (0x1e0b4)
    Notes: pts_type(SC)
    Names: »DRVU01.SC«

Derivation

└─⟦bc20f3abf⟧ Bits:30009670 Philips computer tape "600126"
    └─⟦this⟧ »TOSSWORK/DRVU01.SC« 

PTS(SC)

	IDENT DRVU01 	REL 11.0 81-07-07 870105041100 




* 
**************************************************
* 
*   PHILIPS TERMINAL SYSTEM PTS 
* 
*   DRVU01 = DRIVER VIDEO CONNECTED DISPLAY PTS8041 
*            AND
*            DRIVER CHANNEL UNIT FOR VIDEO TERMINALS
* 
* 
* 
* 
* 
* 
**************************************************
* 
*	THIS DRIVER CONSISTS OF THE FOLLOWING TWO SECTIONS: 
* 
*	- S C R E E N   S E C T I O N 
*	- P E R I P H E R A L   S E C T I O N 
* 
	EJECT
* 
*    THE  S C R E E N   S E C T I O N  HANDLES OUTPUT TO
*     THE VIDEO DISPLAY PTS8041 
*	CONNECTED VIA THE SCREEN SECTION OF THE VIDEO CHANNEL UNIT VCCU1/4. 
* 
*    THE DRIVER INCLUDES DEVICE DEPENDENT ECHO-FUNCTIONS
*    WHICH MAKES IT POSSIBLE TO USE THE DISPLAY AS AN 
*    ECHO-DEVICE TO ANY KEYBOARD, THAT RUNS UNDER THE 
*    GENERAL KEYBOARD DRIVER DRKB04.
* 
* 
* 
* 
* 
*    THE  S C R E E N   S E C T I O N  OF THE DRIVER
*       CONSISTS OF FOLLOWING PARTS:
* 
*	- D E V I C E   D R I V E R   P A R T 
*	- L I N E   D R I V E R   P A R T 
* 
	EJECT
* 
*	THE  D E V I C E   D R I V E R   P A R T
*	OF THE SCREEN SECTION OF THE DRIVER 
*	CONSISTS OF THE FOLLOWING ROUTINES: 
* 
* 
* 
* 
*	A C T I V A T I O N   R O U T I N E 
* 
*	-ACVU	ACTIVATION OF DEVICE DRIVER, AT LKM DATA 1
* 
* 
* 
* 
*	A B O R T   R O U T I N E 
* 
*	-ABVU	ABORT HANDLING IN DEVICE DRIVER, AT LKM DATA 10 
* 
* 
* 
* 
*	R E C O V E R Y   R O U T I N E 
* 
*	-RCVU	RECOVERY HANDLING IN DEVICE DRIVER, AT POWER ON 
* 
* 
* 
* 
*	E C H O   R O U T I N E 
* 
*	-ECHOVU	ECHO-HANDLING OF KEYBOARD INPUT 
* 
* 
* 
* 
*	E R R O R   R O U T I N E 
* 
*	-DEVERR	DEVICE DRIVER ERROR HANDLING, 
*		AT ERROR-RETURN FROM LINE DRIVER 
* 
* 
* 
*	S U B - R O U T I N E S 
* 
*	-CHKOUT	CHECK IF LAST COLUMN WRITTEN, AND OUTPUT ONE CHARACTER
*	-ECHOUT	OUTPUT ONE CHARACTER IN ECHO MODE 
*	-NXTROW	UPDATE ROW COUNTER TO NEXT ROW, 
*		AND IF NECESSARY HANDLE SCROLL.
*	-NXTCOL	CALLED AFTER WRITE IN CURRENT COLUMN, SO: 
*		UPDATE COLUMN COUNTER TO NEXT COLUMN,
*		AND IF NECESSARY HANDLE LAST COLUMN WRITTEN. 
*	-SAVCN	SAVE CURRENT NEXT WRITE POSITION 
*	-RESCN	RESTORE SAVED WRITE POSITION TO BECOME CURRENT NEXT
* 
* 
* 
* 
*    NORMAL REGISTER USAGE
*    IN THE DEVICE DRIVER PART OF SCREEN SECTION: 
* 
*    REGISTER A1 = RETURN CODE TO ECB 
*             A2 = OUTPUT CHARACTER OR WRITE POSITION OR CURSOR POSITION
*             A3 = BUFFER INDEX 
*             A4 = WORK REGISTER
*             A5 = STACK BASE 
*             A6 = DWT-ADDRESS
*             A7 = ORDER
*             A8 = ECB-ADDRESS
* 
	EJECT
* 
*	THE  L I N E   D R I V E R   P A R T
*	OF THE SCREEN SECTION OF THE DRIVER 
*	CONSISTS OF THE FOLLOWING ROUTINES: 
* 
* 
* 
* 
*	A C T I V A T I O N   R O U T I N E S 
* 
*	-STAWRI	START WRITE SCREEN IN SPECIFIED POSITION
*	-OUTCHA	OUTPUT ONE SCREEN CHARACTER 
*	-ENDWRI	END WRITE SCREEN
*	-OUTCUR	OUTPUT VISUAL CURSOR IN SPECIFIED POSITION
*	-CLESCR	CLEAR SCREEN AND RESET CURSOR 
* 
* 
* 
* 
*	I N T E R R U P T   R O U T I N E S 
* 
*	IHSVU1	VCCU NO 1
*	IHSVU2	VCCU NO 2
*	IHSVU3	VCCU NO 3
*	IHSVU4	VCCU NO 4
*	IHSVU5	VCCU NO 5
*	IHSVU6	VCCU NO 6
*	IHSVU7	VCCU NO 7
*	IHSVU8	VCCU NO 8
* 
* 
* 
* 
	EJECT
* 
*	E R R O R   R O U T I N E S 
* 
*	-LINER0	CIO START NOT ACCEPTED
*	-LINER1	OTR NOT ACCEPTED
*	-LINER2	SST NOT ACCEPTED
*	-LINER3	SST UNEXPECTEDLY ACCEPTED 
*	-LINER4	UNEXPECTED INTERRUPT
*	-LINER5	I/O-INSTRUCTION TRIED DURING POWER FAIL POST PROCESSING 
* 
* 
* 
*	S U B - R O U T I N E S 
* 
*	-CONPOS	CONVERT SCREEN POSITION INTO SCREEN MEMORY DISPLACEMENT 
*	-IXTERM	INDEX SCREEN MEMORY DISPLACEMENT WITH TERMINAL NUMBER 
*	-CWTDWT	GET CWT-ADDRESS FROM DWT-ADDRESS
*	-PUTQUE	PUT DWT INTO SCREEN OUTPUT QUEUE
*	-GETQUE	GET DWT FROM SCREEN OUTPUT QUEUE
* 
* 
* 
*	NORMAL REGISTER USAGE 
*	IN THE LINE DRIVER PART OF THE SCREEN SECTION:
* 
*	A1 = RETURN CODE TO DEVICE DRIVER PART
*	A2 = BIO-LINES OUTPUT 
*	A3 = WORK REGISTER
*	A4 = WORK REGISTER
*	A5 = CWT-ADDRESS
*	A6 = DWT-ADDRESS
*	A7 = WORK REGISTER
*	A8 = WORK REGISTER
* 
* 
	EJECT
* 
*	THE  P E R I P H E R A L   S E C T I O N  OF THE DRIVER IS A
*	L I N E   D R I V E R   ONLY. 
*	IT HANDLES INPUT FROM AND OUTPUT TO DEVICES CONNECTED VIA 
*	THE PERIPHERAL SECTION OF THE VIDEO CHANNEL UNIT VCCU1/4. 
* 
* 
*	THE PERIPHERAL SECTION OF THE DRIVER CONSISTS OF
*	THE FOLLOWING (LINE DRIVER) ROUTINES: 
* 
*	A C T I V A T I O N   R O U T I N E S 
* 
*	-VUSTBL	DEFINE START OF OUTPUT BLOCK
*	-VUCHRO	CHARACTER OUTPUT
*	-VUENBL	DEFINE END OF OUTPUT BLOCK
*	-VUCHRI	CHARACTER INPUT 
*	-VUDISP	VIDEO DISPATCHER
* 
* 
*	I N T E R R U P T   R O U T I N E S 
* 
*	FOR DATA INPUT
* 
*	-IHPVU1	VCCU NO 1 
*	-IHPVU2	VCCU NO 2 
*	-IHPVU3	VCCU NO 3 
*	-IHPVU4	VCCU NO 4 
*	-IHPVU5	VCCU NO 5 
*	-IHPVU6	VCCU NO 6 
*	-IHPVU7	VCCU NO 7 
*	-IHPVU8	VCCU NO 8 
* 
*	AND FOR DATA OUTPUT 
* 
*	-TIMOUT	MONITOR CLOCK TIME-OUT
* 
	EJECT
* 
*	R E C O V E R Y   R O U T I N E 
* 
*	-VUON	LINE DRIVER RECOVERY ROUTINE, 
*		COMMON TO PERIPHERAL AND SCREEN SECTIONS.
* 
* 
* 
* 
*   NORMAL REGISTER USAGE IN THE LINE DRIVER PART 
*	 OF THE PERIPHERAL SECTION: 
* 
*   A1 = WORK REGISTER
*   A2 = INPUT WORD 
*   A3 = WORK REGISTER
*   A4 = WORK REGISTER
*   A5 = CWT-ADDRESS
*   A6 = DWT-ADDRESS
*   A7 = WORK REGISTER
*   A8 = WORK REGISTER
* 
* 
* 
	EJECT
* 
* 
*    SYSTEM ADAPTATION
* 
* 
*    BY MEANS OF CONDITIONAL ASSEMBLY THE DRIVER: 
* 
*   -IS ADAPTED TO CONTROL ONE OR UP TO EIGHT VIDEO CHANNELS
*  -IS ADAPTED FOR CONNECTION OF THE VIDEO CHANNELS 
*	      EITHER ON PROGRAMMED CHANNEL OR IOP.
*  -HANDLES EITHER OF TWO CHARACTER GENERATORS. 
*  -HANDLES ONE OF ELEVEN DIFFERENT (COUNTRY DEPENDANT) CHARACTER SETS, 
*	      PROVIDED THAT THE SELECTED CHARACTER SET, 
*	      IS SUPPORTED BY THE SELECTED CHARACTER GENERATOR. 
*   -CAN ECHO ALSO END OF RECORD CHARACTER
*   -CAN SUPPRESS TRAILING STRINGS COMPOSED OF: 
*			SPACE (/20) 
*			TABULATION (/11 + POS.CHAR.)
*			UNDERLINE START (/12) 
*			LOW INTENSITY START (/1E) 
*			LOW INTENSITY STOP (/1F)
*   -CAN BE ADAPTED TO THE EXTENDED INSTRUCTION SET.
*   -CONTAINS LENGTH OF DRIVER MMU-BUFFER.
	EJECT
* 
* 
* 
* 
*********** 
* ENTRIES * 
*********** 
* 
* 
*	SCREEN SECTION DEVICE DRIVER ACTIVATION ROUTINES
* 
* 
	ENTRY	VUAD	ADDRESS TO ADDRESSBLOCK 
* 
* 
*	SCREEN SECTION LINE DRIVER
*	INTERRUPT ROUTINES ENTERED FROM INTERRUPT VECTOR
* 
	ENTRY	IHSVU1	INTERRUPT FROM  VCCU1/4 NO 1
	ENTRY	IHSVU2	INTERRUPT FROM  VCCU1/4 NO 2
	ENTRY	IHSVU3	INTERRUPT FROM  VCCU1/4 NO 3
	ENTRY	IHSVU4	INTERRUPT FROM  VCCU1/4 NO 4
	ENTRY	IHSVU5	INTERRUPT FROM  VCCU1/4 NO 5
	ENTRY	IHSVU6	INTERRUPT FROM  VCCU1/4 NO 6
	ENTRY	IHSVU7	INTERRUPT FROM  VCCU1/4 NO 7
	ENTRY	IHSVU8	INTERRUPT FROM  VCCU1/4 NO 8
* 
	EJECT
* 
*	PERIPHERAL SECTION LINE DRIVER
*	ACTIVATION ROUTINES ENTERED FROM DEVICE DRIVERS VIA NETWORK DISTRIBUTO
* 
	ENTRY	VUCHRI	CHARACTER INPUT 
	ENTRY	VUSTBL	DEFINE START OF OUTPUT BLOCK
	ENTRY	VUCHRO	CHARACTER OUTPUT
	ENTRY	VUENBL	DEFINE END OF OUTPUT BLOCK
	ENTRY	VUDISP	VIDEO DISPATCHER
* 
*	PERIPHERAL SECTION LINE DRIVER
*	INTERRUPT ROUTINES ENTERED FROM INTERRUPT VECTOR
* 
	ENTRY	IHPVU1	INTERRUPT FROM  VCCU1/4 NO 1
	ENTRY	IHPVU2	INTERRUPT FROM  VCCU1/4 NO 2
	ENTRY	IHPVU3	INTERRUPT FROM  VCCU1/4 NO 3
	ENTRY	IHPVU4	INTERRUPT FROM  VCCU1/4 NO 4
	ENTRY	IHPVU5	INTERRUPT FROM  VCCU1/4 NO 5
	ENTRY	IHPVU6	INTERRUPT FROM  VCCU1/4 NO 6
	ENTRY	IHPVU7	INTERRUPT FROM  VCCU1/4 NO 7
	ENTRY	IHPVU8	INTERRUPT FROM  VCCU1/4 NO 8
* 
*	MISCELLENEOUS ENTRIES 
* 
	ENTRY	VUON	START RECOVERY OF VCCU1/4  UNITS
* 
* 
* 
* 
	EJECT
* 
***************************************** 
*    EXTERNAL TOSS MODULE ENTRIES       * 
***************************************** 
* 
* 
* 
	EXTRN	SAVE8	SAVE A1-A8 
	EXTRN	TDISP	DISPATCH 
	EXTRN	TENDIO	END I/O 
	EXTRN	DISEND	END I/O AND DISPATCH
	EXTRN	DISIOE	ERROR, END I/O AND DISPATCH 
	EXTRN	IHRTN	RETURN 
	EXTRN	SWL48	SWITCH TO LEVEL 48 AND ENB 
* 
	EXTRN	INTVU1	INTERRUPT TABLE FOR VCCU1/4 NO 1
	EXTRN	INTVU2	INTERRUPT TABLE FOR VCCU1/4 NO 2
	EXTRN	INTVU3	INTERRUPT TABLE FOR VCCU1/4 NO 3
	EXTRN	INTVU4	INTERRUPT TABLE FOR VCCU1/4 NO 4
	EXTRN	INTVU5	INTERRUPT TABLE FOR VCCU1/4 NO 5
	EXTRN	INTVU6	INTERRUPT TABLE FOR VCCU1/4 NO 6
	EXTRN	INTVU7	INTERRUPT TABLE FOR VCCU1/4 NO 7
	EXTRN	INTVU8	INTERRUPT TABLE FOR VCCU1/4 NO 8
* 
	EXTRN	SETIMP	GET TIMER BLOCK 
	EXTRN	INTSAV	SAVE AREA LAST INTERRUPT
	EXTRN	PFPOST	POWER FAIL POST PROCESSING FLAG 
* 
	EXTRN	NDSAV8	SAVE A3-A5, A7-A8 IN DWT
	EXTRN	NDGEDW	GET DWT ADDRESS FOR A DEVICE
	EXTRN	NDREWS	CALL RECOVERY FOR A WORK-STATION
	EXTRN	NDRET	RETURN 
	EXTRN	NDRETO	OK & RETURN 
	EXTRN	NDREP	POP & RETURN 
	EXTRN	NDREPO	POP, OK AND RETURN
	EXTRN	ECHRTN	RETURN TO KEYBOARD AFTER ECHO 
	EXTRN	GETCHR	GET CHARACTER FROM ECB-BUFFER 
	EJECT
* 
******************************************************
*	DRIVER ADDRESS BLOCK DISPLACEMENTS
******************************************************* 
* 
	EXTRN	INTADR	INTERRUPT ADDRESS DISPLACEMENT
* 
* 
***************************************************** 
*	DEVICE INDEX VALUES 
***************************************************** 
* 
	EXTRN	PC:DIX	PROGRAMMED CHANNEL DEVICE INDEX 
* 
* 
*********************************************************** 
*	ECB DISPLACEMENTS 
*********************************************************** 
* 
	EXTRN	ECBBA	ECB BUFFER ADDRESS 
	EXTRN	ECBRL	ECB REQUESTED LENGTH 
	EXTRN	ECBEL	ECB EFFECTIVE LENGTH 
	EXTRN	ECBRC	ECB RETURN CODE
	EXTRN	ECBCW	ECB CONTROL WORD 
	EJECT
* 
* 
************************
*    DWT PARAMETERS    *
************************
* 
	EXTRN	DWTST	STATUS 
	EXTRN	DWTOCH	LAST OUTPUT CHARACTER 
	EXTRN	DWTADR	ADDRESS TO ADDRESS-BLOCK
	EXTRN	DWTOTQ	OUTPUT QUEUE
	EXTRN	DWTSB2	STACK BASE 2 IN DWT 
	EXTRN	DWTCP2	CHANNEL PARAMETERS 2
	EXTRN	DWTLD1	LINE DRIVER DEPENDANT 1 
	EXTRN	DWTLD2	LINE DRIVER DEPENDANT 2 
* 
* 
	EXTRN	DWTDEV	DEVICE DRIVER DEPENDANT (FIRST FIELD) 
* 
	EJECT
* 
* 
***************************************** 
*    CONDITIONAL ASSEMBLY               * 
***************************************** 
* 
*	THE NUMBER OF VIDEO CHANNELS HANDLED BY 
*	 THE LINE DRIVER PART OF THIS DRIVER
*	IS SELECTED BY SETTING X:A TO 1,2,3,4,5,6,7 OR 8. 
* 
X:A	EQU	1 
VUCHAN	EQU	X:A
* 
* 
* 
*	WHEATHER THE LINE DRIVER PART OF THE DRIVER 
*	 SHOULD HANDLE SCREEN SECTION OF VCCU1/4
*	CONNECTED ON PROGRAMMED CHANNEL OR IOP
*	IS SELECTED BY SETTING X:B TO 0 OR 1. 
* 
X:B	EQU	0 
IOP	EQU	X:B 
* 
* 
* 
*	IF A DRIVER VERSION USING THE EXTENDED INSTRUCTION SET IS WANTED, 
*	THIS IS SELECTED BY SETTING CPU852 TO 0.
* 
CPU852	EQU	0
* 
* 
* 
*	WHICH ONE OF EITHER OF THE TWO CHARACTER GENERATORS 
*	FOR SCREEN OUTPUT (TYPE I = ENGLISH, OR TYPE II = AMERICAN) 
*	THE LINE DRIVER PART OF THE DRIVER SHOULD HANDLE, 
*	IS SELECTED BY SETTING X:C TO 1 OR 2. 
* 
X:C	EQU	1 
CHAGEN	EQU	X:C
* 
*	WHICH CHARACTER-SET FOR SCREEN OUTPUT,
*	THE LINE DRIVER PART OF THE DRIVER SHOULD HANDLE
*	   (PROVIDED THAT THE CHARACTER SET IS SUPPORTED
*	    BY THE SELECTED CHARACTER GENERATOR), 
*	IS SELECTED BY SETTING X:D TO 0,1,2,3,4,5,6,7,8,9 OR /A.


* CHARACTER-SET	COUNTRY 

*	0	GB/NZ/SA/NL/B 
*	1	D/A/L/CH
*	2	F/CH/B/L
*	3	E 
*	4	I/CH
*	5	S/SF
*	6	DK/N
*	7	P 
*	8	YU
*	9	US
*	A	S (INDUSTRY VERSION)
* 
X:D	EQU	0 
CHASET	EQU	X:D
* 
* 
* 
	EJECT
* 
*	IF THE DEVICE DRIVER PART OF THE DRIVER 
*	 SHOULD ECHO ALSO END-OF-RECORD-CHARACTER,
*	THIS IS SELECTED BY SETTING X:E TO 1. 
* 
X:E	EQU	0 
EORECH	EQU	X:E
* 
*	IF THE DEVICE DRIVER PART OF THE DRIVER 
*	 SHOULD SUPPRESS TRAILING STRINGS COMPOSED ONLY OF
*	/20, /11+POS.CHARACTERS, /12, /1E, /1F, 
*	THIS IS SELECTED BY SETTING X:F TO 1. 
* 
X:F	EQU	1 
TRASPA	EQU	X:F
* 
* 
*	MEMORY MANAGEMENT BUFFER SIZE FOR 
*	 THE DEVICE DRIVER PART OF THE DRIVER 
*	IS SELECTED BY SETTING X:G TO THE WANTED SIZE IN BYTES. 
* 
* 
X:G	EQU	80
DVBLEN	EQU	X:G
* 
	EJECT
* 
* 
********************************
*    DWT-DISPLACEMENTS RELATIVE DWTDEV          * 
********************************
* 
* 
* 
* 
DWTCN	EQU	2	CURRENT NEXT WRITE POS. DURING REQUEST
DWTCNR	EQU	DWTCN	CURRENT NEXT WRITE POSITION ROW NUMBER 
DWTCNC	EQU	DWTCN+1	CURRENT NEXT WRITE POS. COLUMN NUMBER
* 
* 
DWTSN	EQU	4	SAVED CURRENT NEXT WRITE POSITION 
*			AFTER PREVIOUS REQUEST OR AT /14 COMMAND
DWTSNR	EQU	DWTSN	SAVED NEXT WRITE POSITION ROW NUMBER 
DWTSNC	EQU	DWTSN+1	SAVED NEXT WRITE POS. COLUMN NUMBER
	EJECT
* 
************* 
* CONSTANTS * 
************* 
* 
*	USED BY SCREEN SECTION, DEVICE DRIVER PART
* 
MAXROW	EQU	/1818	MAX NUMBER OF ROWS PER SCREEN IS 24
MAXCOL	EQU	/5050	MAX NUMBER OF COLUMNS PER SCREEN IS 80 
*	DWTDEV-BITS 
UNDBIT	EQU	/0400	UNDERLINE/NON-UNDERLINE DISPLAY-MODE 
INTBIT	EQU	/0100	HIGH/LOW INTENSITY DISPLAY-MODE
ROLBIT	EQU	/80	SCROLL MODE
LCWBIT	EQU	/40	LAST COLUMN WRITTEN
LCPBIT	EQU	/20	LAST COLUMN WRITTEN BY PREVIOUS REQUEST
* 
SPACE	EQU	/20	SPACE 
POINT	EQU	/2E	POINT CHARACTER 
* 
CCERR	EQU	/4	STATUS: CODE CHECK ERROR 
OPERR	EQU	/1	STATUS: NOT OPERABLE 
* 
* 
*	USED BY SCREEN SECTION, LINE DRIVER PART
* 
IOPPAR	EQU	/C000	WORD-MODE + READ-MEMORY TRANSFER 
*	DWTST BIT 11,12,13 (LINE DRIVER DEPENDANT)
OTRFLA	EQU	/0010	OTR-ACTION AT NEXT INTERRUPT 
HLTFLA	EQU	/0008	HALT-ACTION AT NEXT INTERRUPT
SSTFLA	EQU	/0004	SST-ACTION AT NEXT INTERRUPT 
* 
SMLCUR	EQU	/07FF	SCREEN MEMORY LOCATION 
*			HOLDING CURSOR POSITION 
* 
AUTCLE	EQU	/2000	BIO-BIT FOR AUTO-CLEAR 
*	ERROR-STATUS FROM LINE DRIVER TO DEVICE DRIVER PART OF SCREEN SECTION 
CIOERR	EQU	/8000	ERROR: CIO START NOT ACCEPTED
OTRERR	EQU	/4000	ERROR: OTR NOT ACCEPTED
SSTERR	EQU	/2000	ERROR: SST NOT ACCEPTED
SSTER2	EQU	/1000	ERROR: SST UNEXPECTEDLY ACCEPTED 
*			(AFTER CIO START OR OTR,
*			BUT BEFORE CIO HALT)
PFERR	EQU	/0800	I/O-INSTRUCTION TRIED DURING PFPOST 
* 
* 
*	USED BY PERIPHERAL SECTION: 
* 
* 
QUETIM	EQU	1	CWT PERIPHERAL OUTPUT QUEUE TIME-OUT VALUE 
*			(MULTIPLES OF 100MS)
MAXTVU	EQU	4	MAX NBR OF TERMINALS ON ANY VCCU1/4
TCPON	EQU	/0001	RECOVERY CAUSE: TC POWER ON 
PONPSW	EQU	/2080	POWER-ON-PSW: LEVEL 8, RUN-MODE, INH-MODE
* 
INSTAT	EQU	/0800	MASK FOR BIO BIT : STATUS OR DATA INPUT
TERMNR	EQU	/0300	MASK FOR BIO BITS : TERM.NBR WITHIN CHANNEL
DEVADR	EQU	/0400	MASK FOR BIO BIT: DEV.ADR. WITHIN TERM.
INDATA	EQU	/00FF	MASK FOR BIO DATA BITS IN INPUT WORD 
* 
	EJECT
* 
**********
* TABLES *
**********
* 
*	DRIVER ADDRESS BLOCK
* 
	DATA	DVBLEN	BUFFER LENGTH
	DATA	PC:DIX	PROGRAMMED CHANNEL DEVICE INDEX (ALWAYS!)
VUAD	EQU	*	ADDRESS BLOCK
	DATA	ACVU	ACTIVATION DRIVER
	DATA	ABVU	ABORT ROUTINE ADDRESS
	DATA	0	INTERRUPT HANDLER 
	DATA	RCVU	RECOVERY ROUTINE 
	DATA	ECHOVU	DEVICE-DEPENDENT ECHO-ROUTINE
* 
* 
* 
*	CODE CONVERSION TABLE 
* 
* 
CODINP	EQU	*
	DATA	/2340,/5B5C,/5D60,/7B7C,/7D7E 
CODOUT	EQU	*
	IFT	CHASET=0 
	IFT	CHAGEN=1 
	DATA	/2340,/5B5C,/5D60,/7B7C,/7D7E 
	XIF
	IFT	CHASET=0 
	IFT	CHAGEN=2 
	DATA	/0340,/5B5C,/5D60,/7B7C,/7D7E 
	XIF
	IFT	CHASET=1 
	IFT	CHAGEN=1 
	DATA	/0310,/0B0C,/0E60,/1B1C,/1E11 
	XIF
	IFT	CHASET=2 
	IFT	CHAGEN=1 
	DATA	/2312,/0618,/1060,/1716,/1305 
	XIF
	IFT	CHASET=3 
	IFT	CHAGEN=2 
	DATA	/0340,/5B08,/5D60,/7B18,/7D7E 
	XIF
	IFT	CHASET=4 
	IFT	CHAGEN=1 
	DATA	/2310,/0618,/1716,/1215,/1314 
	XIF
	IFT	CHASET=5 
	IFT	CHAGEN=1 
	DATA	/0307,/0B0C,/0D17,/1B1C,/1D7E 
	XIF
	IFT	CHASET=6 
	IFT	CHAGEN=1 
	DATA	/2340,/0A02,/0D60,/1A04,/1D7E 
	XIF
	IFT	CHASET=7 
	IFT	CHAGEN=2 
	DATA	/0340,/0604,/0560,/1614,/157E 
	XIF
	IFT	CHASET=8 
	IFT	CHAGEN=2 
	DATA	/0307,/0B0C,/0D17,/1B1C,/1D7E 
	XIF
	IFT	CHASET=9 
	IFT	CHAGEN=1 
	DATA	/0340,/5B5C,/5D60,/7B7C,/7D7E 
	XIF
	IFT	CHASET=9 
	IFT	CHAGEN=2 
	DATA	/2340,/5B5C,/5D60,/7B7C,/7D7E 
	XIF
	IFT	CHASET=/A
	IFT	CHAGEN=1 
	DATA	/2340,/0B0C,/0D60,/1B1C,/1D7E 
	XIF
* 
*	IF ERROR IN SYSGEN (WRONG COMBINATION OF CHASET AND CHAGEN),
*	THEN CHARACTER-SET DEPENDANT INPUT-CODES
*	ARE CONVERTED TO QUESTION MARKS.
* 
	DATA	/3F3F,/3F3F,/3F3F,/3F3F,/3F3F 
* 
* 
	EJECT
* 
**********************************************
*    C W T T A B                               *
**********************************************
* 
*   THIS TABLE HOLDS ADDRESSES TO CHANNEL WORK TABLES, CWT:S, 
*   ONE CWT PER VIDEO CHANNEL UNIT. 
* 
* 
CWTTAB	EQU	*
	DATA	CWTABE-*	TABLE LENGTH 
	DATA	CWTVU1	 
	IFF	VUCHAN=1 
	DATA	CWTVU2
	XIF
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	DATA	CWTVU3
	XIF
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	DATA	CWTVU4
	XIF
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	IFF	VUCHAN=4 
	DATA	CWTVU5
	XIF
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	IFF	VUCHAN=4 
	IFF	VUCHAN=5 
	DATA	CWTVU6
	XIF
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	IFF	VUCHAN=4 
	IFF	VUCHAN=5 
	IFF	VUCHAN=6 
	DATA	CWTVU7
	XIF
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	IFF	VUCHAN=4 
	IFF	VUCHAN=5 
	IFF	VUCHAN=6 
	IFF	VUCHAN=7 
	DATA	CWTVU8
	XIF
CWTABE	EQU	*	END OF TABLE 
* 
	EJECT
* 
* 
***************************************************** 
*    C W T V U 1                                    * 
***************************************************** 
* 
*    CHANNEL WORK TABLE FOR VIDEO CHANNEL UNIT NO. 1
* 
* 
VU1	EQU	/0C	CONTROL UNIT ADDRESS
* 
CWTVU1	EQU	*	TABLE ENTRY
CWTDOS	EQU	*-CWTVU1	
	DATA	0	DWT OCCUPYING SCREEN SECTION OF VCCU1/4 
CWTPQ	EQU	*-CWTVU1	 
	DATA	0	PERIPHERAL SECTION OUTPUT QUEUE ANCHOR
CWTSEQ	EQU	*-CWTVU1	
	DATA	0	SCREEN SECTION ECHO OUTPUT QUEUE ANCHOR 
CWTSLQ	EQU	*-CWTVU1	
	DATA	0	SCREEN SECTION LKM OUTPUT QUEUE ANCHOR
CWTTP	EQU	*-CWTVU1	 
	DATA	0	PERIPH. SECTION OUTPUT QUEUE TIMER PTR
CWTACK	EQU	*-CWTVU1	
	DATA	0	ACKUMULATOR DATA INPUT ERRORS PERIPHERAL SECTION
CWTSRD	EQU	*-CWTVU1	
	DATA	0	SST-READY DWT (SCREEN ONLY) 
CWTITA	EQU	*-CWTVU1	
	DATA	INTVU1	ADDRESS TO POINTER TO WORK-STATION TABLE 
CWTCSS	EQU	*-CWTVU1	
	CIO	A2,1,VU1	CIO START SCREEN
CWTCSP	EQU	*-CWTVU1	
	CIO	A2,1,VU1+1	CIO START PERIPHERAL
CWTOTS	EQU	*-CWTVU1	
	OTR	A2,0,VU1	OTR SCREEN
CWTOTP	EQU	*-CWTVU1	
	OTR	A2,0,VU1+1	OTR PERIPHERAL
CWTCHS	EQU	*-CWTVU1	
	CIO	A2,0,VU1	CIO HALT SCREEN 
CWTCHP	EQU	*-CWTVU1	
	CIO	A2,0,VU1+1	CIO HALT PERIPHERAL 
CWTSST	EQU	*-CWTVU1	
	SST	A2,VU1	SST (SCREEN ONLY) 
CWTINR	EQU	*-CWTVU1	
	INR	A2,0,VU1+1	INR (PERIPHERAL ONLY) 
	IFT	IOP=1
CWTWE1	EQU	*-CWTVU1	
	WER	A2,VU1+VU1	WER1 (SCREEN ONLY, IOP ONLY)
CWTWE2	EQU	*-CWTVU1	
	WER	A2,VU1+VU1+1	WER2 (SCREEN ONLY, IOP ONLY)
CWTBUF	EQU	*-CWTVU1	
	RES	160	IOP-BUFFER (SCREEN ONLY, IOP ONLY) 
CWTBIN	EQU	*-CWTVU1	
	DATA	0	IOP-BUFFER INDEX (SCREEN ONLY, IOP ONLY)
	XIF
* 
	IFF	VUCHAN=1 
	EJECT
* 
* 
***************************************************** 
*    C W T V U 2                                    * 
***************************************************** 
* 
*    CHANNEL WORK TABLE FOR VIDEO CHANNEL UNIT NO. 2
* 
* 
VU2	EQU	/06	CONTROL UNIT ADDRESS
* 
CWTVU2	EQU	*	TABLE ENTRY
* 
	DATA	0	DWT OCCUPYING SCREEN SECTION OF VCCU1/4 
	DATA	0	PERIPHERAL SECTION OUTPUT QUEUE ANCHOR
	DATA	0	SCREEN SECTION ECHO OUTPUT QUEUE ANCHOR 
	DATA	0	SCREEN SECTION LKM OUTPUT QUEUE ANCHOR
	DATA	0	PERIPH. SECTION OUTPUT QUEUE TIMER PTR
	DATA	0	ACKUMULATOR DATA INPUT ERRORS PERIPHERAL SECTION
	DATA	0	SST-READY DWT (SCREEN ONLY) 
	DATA	INTVU2	ADDRESS TO POINTER TO WORK-STATION TABLE 
	CIO	A2,1,VU2	CIO START SCREEN
	CIO	A2,1,VU2+1	CIO START PERIPHERAL
	OTR	A2,0,VU2	OTR SCREEN
	OTR	A2,0,VU2+1	OTR PERIPHERAL
	CIO	A2,0,VU2	CIO HALT SCREEN 
	CIO	A2,0,VU2+1	CIO HALT PERIPHERAL 
	SST	A2,VU2	SST (SCREEN ONLY) 
	INR	A2,0,VU2+1	INR (PERIPHERAL ONLY) 
	IFT	IOP=1
	WER	A2,VU2+VU2	WER1 (SCREEN ONLY, IOP ONLY)
	WER	A2,VU2+VU2+1	WER2 (SCREEN ONLY, IOP ONLY)
	RES	160	IOP-BUFFER (SCREEN ONLY, IOP ONLY) 
	DATA	0	IOP-BUFFER INDEX (SCREEN ONLY, IOP ONLY)
	XIF
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	EJECT
* 
* 
***************************************************** 
*    C W T V U 3                                    * 
***************************************************** 
* 
*    CHANNEL WORK TABLE FOR VIDEO CHANNEL UNIT NO. 3
* 
* 
VU3	EQU	/02	CONTROL UNIT ADDRESS
* 
CWTVU3	EQU	*	TABLE ENTRY
* 
	DATA	0	DWT OCCUPYING SCREEN SECTION OF VCCU1/4 
	DATA	0	PERIPHERAL SECTION OUTPUT QUEUE ANCHOR
	DATA	0	SCREEN SECTION ECHO OUTPUT QUEUE ANCHOR 
	DATA	0	SCREEN SECTION LKM OUTPUT QUEUE ANCHOR
	DATA	0	PERIPH. SECTION OUTPUT QUEUE TIMER PTR
	DATA	0	ACKUMULATOR DATA INPUT ERRORS PERIPHERAL SECTION
	DATA	0	SST-READY DWT (SCREEN ONLY) 
	DATA	INTVU3	ADDRESS TO POINTER TO WORK-STATION TABLE 
	CIO	A2,1,VU3	CIO START SCREEN
	CIO	A2,1,VU3+1	CIO START PERIPHERAL
	OTR	A2,0,VU3	OTR SCREEN
	OTR	A2,0,VU3+1	OTR PERIPHERAL
	CIO	A2,0,VU3	CIO HALT SCREEN 
	CIO	A2,0,VU3+1	CIO HALT PERIPHERAL 
	SST	A2,VU3	SST (SCREEN ONLY) 
	INR	A2,0,VU3+1	INR (PERIPHERAL ONLY) 
	IFT	IOP=1
	WER	A2,VU3+VU3	WER1 (SCREEN ONLY, IOP ONLY)
	WER	A2,VU3+VU3+1	WER2 (SCREEN ONLY, IOP ONLY)
	RES	160	IOP-BUFFER (SCREEN ONLY, IOP ONLY) 
	DATA	0	IOP-BUFFER INDEX (SCREEN ONLY, IOP ONLY)
	XIF
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	EJECT
* 
* 
***************************************************** 
*    C W T V U 4                                    * 
***************************************************** 
* 
*    CHANNEL WORK TABLE FOR VIDEO CHANNEL UNIT NO. 4
* 
* 
VU4	EQU	/0E	CONTROL UNIT ADDRESS
* 
CWTVU4	EQU	*	TABLE ENTRY
* 
	DATA	0	DWT OCCUPYING SCREEN SECTION OF VCCU1/4 
	DATA	0	PERIPHERAL SECTION OUTPUT QUEUE ANCHOR
	DATA	0	SCREEN SECTION ECHO OUTPUT QUEUE ANCHOR 
	DATA	0	SCREEN SECTION LKM OUTPUT QUEUE ANCHOR
	DATA	0	PERIPH. SECTION OUTPUT QUEUE TIMER PTR
	DATA	0	ACKUMULATOR DATA INPUT ERRORS PERIPHERAL SECTION
	DATA	0	SST-READY DWT (SCREEN ONLY) 
	DATA	INTVU4	ADDRESS TO POINTER TO WORK-STATION TABLE 
	CIO	A2,1,VU4	CIO START SCREEN
	CIO	A2,1,VU4+1	CIO START PERIPHERAL
	OTR	A2,0,VU4	OTR SCREEN
	OTR	A2,0,VU4+1	OTR PERIPHERAL
	CIO	A2,0,VU4	CIO HALT SCREEN 
	CIO	A2,0,VU4+1	CIO HALT PERIPHERAL 
	SST	A2,VU4	SST (SCREEN ONLY) 
	INR	A2,0,VU4+1	INR (PERIPHERAL ONLY) 
	IFT	IOP=1
	WER	A2,VU4+VU4	WER1 (SCREEN ONLY, IOP ONLY)
	WER	A2,VU4+VU4+1	WER2 (SCREEN ONLY, IOP ONLY)
	RES	160	IOP-BUFFER (SCREEN ONLY, IOP ONLY) 
	DATA	0	IOP-BUFFER INDEX (SCREEN ONLY, IOP ONLY)
	XIF
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	IFF	VUCHAN=4 
	EJECT
* 
* 
***************************************************** 
*    C W T V U 5                                    * 
***************************************************** 
* 
*    CHANNEL WORK TABLE FOR VIDEO CHANNEL UNIT NO. 5
* 
* 
VU5	EQU	/20	CONTROL UNIT ADDRESS
* 
CWTVU5	EQU	*	TABLE ENTRY
* 
	DATA	0	DWT OCCUPYING SCREEN SECTION OF VCCU1/4 
	DATA	0	PERIPHERAL SECTION OUTPUT QUEUE ANCHOR
	DATA	0	SCREEN SECTION ECHO OUTPUT QUEUE ANCHOR 
	DATA	0	SCREEN SECTION LKM OUTPUT QUEUE ANCHOR
	DATA	0	PERIPH. SECTION OUTPUT QUEUE TIMER PTR
	DATA	0	ACKUMULATOR DATA INPUT ERRORS PERIPHERAL SECTION
	DATA	0	SST-READY DWT (SCREEN ONLY) 
	DATA	INTVU5	ADDRESS TO POINTER TO WORK-STATION TABLE 
	CIO	A2,1,VU5	CIO START SCREEN
	CIO	A2,1,VU5+1	CIO START PERIPHERAL
	OTR	A2,0,VU5	OTR SCREEN
	OTR	A2,0,VU5+1	OTR PERIPHERAL
	CIO	A2,0,VU5	CIO HALT SCREEN 
	CIO	A2,0,VU5+1	CIO HALT PERIPHERAL 
	SST	A2,VU5	SST (SCREEN ONLY) 
	INR	A2,0,VU5+1	INR (PERIPHERAL ONLY) 
	IFT	IOP=1
	WER	A2,VU5+VU5	WER1 (SCREEN ONLY, IOP ONLY)
	WER	A2,VU5+VU5+1	WER2 (SCREEN ONLY, IOP ONLY)
	RES	160	IOP-BUFFER (SCREEN ONLY, IOP ONLY) 
	DATA	0	IOP-BUFFER INDEX (SCREEN ONLY, IOP ONLY)
	XIF
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	IFF	VUCHAN=4 
	IFF	VUCHAN=5 
	EJECT
* 
* 
***************************************************** 
*    C W T V U 6                                    * 
***************************************************** 
* 
*    CHANNEL WORK TABLE FOR VIDEO CHANNEL UNIT NO. 6
* 
* 
VU6	EQU	/22	CONTROL UNIT ADDRESS
* 
CWTVU6	EQU	*	TABLE ENTRY
* 
	DATA	0	DWT OCCUPYING SCREEN SECTION OF VCCU1/4 
	DATA	0	PERIPHERAL SECTION OUTPUT QUEUE ANCHOR
	DATA	0	SCREEN SECTION ECHO OUTPUT QUEUE ANCHOR 
	DATA	0	SCREEN SECTION LKM OUTPUT QUEUE ANCHOR
	DATA	0	PERIPH. SECTION OUTPUT QUEUE TIMER PTR
	DATA	0	ACKUMULATOR DATA INPUT ERRORS PERIPHERAL SECTION
	DATA	0	SST-READY DWT (SCREEN ONLY) 
	DATA	INTVU6	ADDRESS TO POINTER TO WORK-STATION TABLE 
	CIO	A2,1,VU6	CIO START SCREEN
	CIO	A2,1,VU6+1	CIO START PERIPHERAL
	OTR	A2,0,VU6	OTR SCREEN
	OTR	A2,0,VU6+1	OTR PERIPHERAL
	CIO	A2,0,VU6	CIO HALT SCREEN 
	CIO	A2,0,VU6+1	CIO HALT PERIPHERAL 
	SST	A2,VU6	SST (SCREEN ONLY) 
	INR	A2,0,VU6+1	INR (PERIPHERAL ONLY) 
	IFT	IOP=1
	WER	A2,VU6+VU6	WER1 (SCREEN ONLY, IOP ONLY)
	WER	A2,VU6+VU6+1	WER2 (SCREEN ONLY, IOP ONLY)
	RES	160	IOP-BUFFER (SCREEN ONLY, IOP ONLY) 
	DATA	0	IOP-BUFFER INDEX (SCREEN ONLY, IOP ONLY)
	XIF
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	IFF	VUCHAN=4 
	IFF	VUCHAN=5 
	IFF	VUCHAN=6 
	EJECT
* 
* 
***************************************************** 
*    C W T V U 7                                    * 
***************************************************** 
* 
*    CHANNEL WORK TABLE FOR VIDEO CHANNEL UNIT NO. 7
* 
* 
VU7	EQU	/26	CONTROL UNIT ADDRESS
* 
CWTVU7	EQU	*	TABLE ENTRY
* 
	DATA	0	DWT OCCUPYING SCREEN SECTION OF VCCU1/4 
	DATA	0	PERIPHERAL SECTION OUTPUT QUEUE ANCHOR
	DATA	0	SCREEN SECTION ECHO OUTPUT QUEUE ANCHOR 
	DATA	0	SCREEN SECTION LKM OUTPUT QUEUE ANCHOR
	DATA	0	PERIPH. SECTION OUTPUT QUEUE TIMER PTR
	DATA	0	ACKUMULATOR DATA INPUT ERRORS PERIPHERAL SECTION
	DATA	0	SST-READY DWT (SCREEN ONLY) 
	DATA	INTVU7	ADDRESS TO POINTER TO WORK-STATION TABLE 
	CIO	A2,1,VU7	CIO START SCREEN
	CIO	A2,1,VU7+1	CIO START PERIPHERAL
	OTR	A2,0,VU7	OTR SCREEN
	OTR	A2,0,VU7+1	OTR PERIPHERAL
	CIO	A2,0,VU7	CIO HALT SCREEN 
	CIO	A2,0,VU7+1	CIO HALT PERIPHERAL 
	SST	A2,VU7	SST (SCREEN ONLY) 
	INR	A2,0,VU7+1	INR (PERIPHERAL ONLY) 
	IFT	IOP=1
	WER	A2,VU7+VU7	WER1 (SCREEN ONLY, IOP ONLY)
	WER	A2,VU7+VU7+1	WER2 (SCREEN ONLY, IOP ONLY)
	RES	160	IOP-BUFFER (SCREEN ONLY, IOP ONLY) 
	DATA	0	IOP-BUFFER INDEX (SCREEN ONLY, IOP ONLY)
	XIF
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	IFF	VUCHAN=4 
	IFF	VUCHAN=5 
	IFF	VUCHAN=6 
	IFF	VUCHAN=7 
	EJECT
* 
* 
***************************************************** 
*    C W T V U 8                                    * 
***************************************************** 
* 
*    CHANNEL WORK TABLE FOR VIDEO CHANNEL UNIT NO. 8
* 
* 
VU8	EQU	/2C	CONTROL UNIT ADDRESS
* 
CWTVU8	EQU	*	TABLE ENTRY
* 
	DATA	0	DWT OCCUPYING SCREEN SECTION OF VCCU1/4 
	DATA	0	PERIPHERAL SECTION OUTPUT QUEUE ANCHOR
	DATA	0	SCREEN SECTION ECHO OUTPUT QUEUE ANCHOR 
	DATA	0	SCREEN SECTION LKM OUTPUT QUEUE ANCHOR
	DATA	0	PERIPH. SECTION OUTPUT QUEUE TIMER PTR
	DATA	0	ACKUMULATOR DATA INPUT ERRORS PERIPHERAL SECTION
	DATA	0	SST-READY DWT (SCREEN ONLY) 
	DATA	INTVU8	ADDRESS TO POINTER TO WORK-STATION TABLE 
	CIO	A2,1,VU8	CIO START SCREEN
	CIO	A2,1,VU8+1	CIO START PERIPHERAL
	OTR	A2,0,VU8	OTR SCREEN
	OTR	A2,0,VU8+1	OTR PERIPHERAL
	CIO	A2,0,VU8	CIO HALT SCREEN 
	CIO	A2,0,VU8+1	CIO HALT PERIPHERAL 
	SST	A2,VU8	SST (SCREEN ONLY) 
	INR	A2,0,VU8+1	INR (PERIPHERAL ONLY) 
	IFT	IOP=1
	WER	A2,VU8+VU8	WER1 (SCREEN ONLY, IOP ONLY)
	WER	A2,VU8+VU8+1	WER2 (SCREEN ONLY, IOP ONLY)
	RES	160	IOP-BUFFER (SCREEN ONLY, IOP ONLY) 
	DATA	0	IOP-BUFFER INDEX (SCREEN ONLY, IOP ONLY)
	XIF
* 
* 
* 
* 
	EJECT
* 
************************************************************
* 
*	S C R E E N   S E C T I O N 
*	D E V I C E   D R I V E R   P A R T 
*	A C T I V A T I O N   R O U T I N E 
* 
************************************************************* 
* 
* 
*	ENTERED:	AT LKM DATA 1
* 
*	FUNCTIONS:
* 
* 
*	    ORDER /00: TEST STATUS. 
*		 1.DUMMY IS SENT TO DISPLAY VIA VCCU1/4. 
*              2.STATUS IS RETURNED INTO ECBRC IF VCCU1/4 NOT OPERABLE
*		3.CURSOR POSITION IS RETURNED INTO ECBCW.
*		ADDITIONALLY:
*		IF CURSOR POSITION IS LAST COLUMN OF A ROW,
*		AND IF THAT LAST COLUMN IS WRITTEN INTO, 
*		AND IF THE CURSOR HAS NOT BEEN POSITIONED SINCE
*		THE WRITING OF THAT LAST COLUMN, THEN: 
*		ECBCW IS INCREMENTED WITH 1
*		(INDICATING LAST+1 COLUMN OF THAT ROW) 
* 
* 
*	    ORDER /05: BASIC WRITE. 
*		 1.DISPLAY-ACTION IS PERFORMED 
*              ACCORDING TO CHARACTER(S) FROM ECB-BUFFER. 
*		CHARACTERS IN THE RANGE /20 - /7F ARE ACCEPTED AND DISPLAYED.
*              CHARACTERS IN THE RANGE /00 - /1F (COMMAND CHARACTERS) 
*              FROM ECB-BUFFER,  ARE ILLEGAL EXCEPT FOR /0A AND /0D.
*              ILLEGAL CHARACTERS ARE IGNORED WITHOUT ANY ERROR 
*              INDICATION IN ECBRC. 
*		WHEN THE LAST COLUMN OF A ROW HAS BEEN WRITTEN INTO, 
*		THE CURSOR REMAINS IN THAT POSITION, 
*		AND THE FOLLOWING CHARACTERS (/20-/7F) 
*		ARE WRITTEN INTO THAT SAME POSITION. 
*		2.EFFECTIVE LENGTH IS RETURNED INTO ECBEL. 
*		3.STATUS IS RETURNED INTO ECBRC, IF VCCU1/4 IS NOT OPERABLE. 
*		4.CURSOR POSITION AFTER REQUEST IS RETURNED INTO ECBCW.
*		ADDITIONALLY:
*		IF CURSOR POSITION IS LAST COLUMN OF A ROW,
*		AND IF THAT LAST COLUMN IS WRITTEN INTO, 
*		AND IF THE CURSOR HAS NOT BEEN POSITIONED SINCE
*		THE WRITING OF THAT LAST COLUMN, THEN: 
*		ECBCW IS INCREMENTED WITH 1
*		(INDICATING LAST+1 COLUMN OF THAT ROW) 
* 
*	    ORDER /06: STANDARD WRITE.
*		1.IF REQUESTED LENGTH IS LESS THAN 2 BYTES 
*		(NO CONTROL CHARACTER), THEN DEFAULT-ACTION LF+CR IS DONE. 
*	     2.IF REQUESTED LENGTH IS AT LEAST 2 BYTES, THEN
*	    ACTIONS SPECIFIED BY USER IN RIGHT-MOST BYTE OF FIRST WORD IN BUFF
*	    (CONTROL CHARACTER) ARE CARRIED OUT:
*	    /2B            NO MOVING OF WRITE POSITION
*	    /30            LF, LF, CR 
*	    /31            ERASE SCREEN AND WRITE FROM HOME POSITION
*	    OTHER VALUE:    LF, CR
* 
*		3.IF REQUESTED LENGTH EXCEEDS 2 BYTES, THEN ALSO 
*		 DISPLAY-ACTION IS PERFORMED 
*               ACCORDING TO CHARACTER(S) FROM ECB-BUFFER . 
*		CHARACTERS IN THE RANGE /20 - /7F ARE ACCEPTED AND DISPLAYED.
*              CHARACTERS IN THE RANGE /00 - /1F (COMMAND CHARACTERS) 
*              FROM ECB-BUFFER, ARE ILLEGAL EXCEPT FOR /11, /12, /13, 
*              /14, /1E, /1F. ILLEGAL CHARACTERS ARE IGNORED AND
*              WHEN THE REQUEST IS COMPLETED, ERROR INDICATION IS 
*              GIVEN IN ECBRC.
*		WHEN THE LAST COLUMN OF A ROW HAS BEEN WRITTEN INTO, 
*		THE CURSOR REMAINS IN THAT POSITION, 
*		AND THE FOLLOWING CHARACTERS (/20-/7F) 
*		ARE WRITTEN INTO THAT SAME POSITION. 
*		4.EFFECTIVE LENGTH IS RETURNED INTO ECBEL. 
*		5.STATUS IS RETURNED INTO ECBRC, 
*		IF VCCU1/4 IS NOT OPERABLE OR IF CODE CHECK ERROR. 
*		6.CURSOR POSITION AFTER REQUEST IS RETURNED INTO ECBCW.
*		ADDITIONALLY:
*		IF CURSOR POSITION IS LAST COLUMN OF A ROW,
*		AND IF THAT LAST COLUMN IS WRITTEN INTO, 
*		AND IF THE CURSOR HAS NOT BEEN POSITIONED SINCE
*		THE WRITING OF THAT LAST COLUMN, THEN: 
*		ECBCW IS INCREMENTED WITH 1
*		(INDICATING LAST+1 COLUMN OF THAT ROW) 
* 
* 
*	    ORDER /0B: CURSOR POSITIONING AND STANDARD WRITE. 
*              1.THE CURSOR IS SENT TO THE POSITION GIVEN 
*	     IN ECBCW AT START OF REQUEST.
*		 NO INFORMATION ON SCREEN IS ERASED. 
*		2.THEN, IF REQUESTED LENGTH EXCEEDS 2 BYTES, 
*		DISPLAY-ACTION IS PERFORMED ACCORDING TO 
*		CHARACTERS FROM ECB BUFFER (SEE ORDER /06, NOTE NUMBER 3-6). 
* 
*	    ORDER /31: ERASE. 
*		 1.THE SCREEN IS ERASED ON THE LINE
*		WHERE THE CURSOR IS POSITIONED.
*		THE NUMBER OF CHARACTERS (1-80) TO BE ERASED,
*		IS DEFINED IN ECBCW AT START OF REQUEST. 
*		ERASING STARTS IN THE CURSOR POSITION. 
*		THE CURSOR REMAINS IN THAT POSITION. 
*		2.STATUS IS RETURNED INTO ECBRC, IF VCCU1/4 IS NOT OPERABLE. 
* 
* 
*	INPUT:	A5 = DWT STACK BASE
*		A6 = DWT ADDRESS 
*		A7 = ORDER 
*		A8 = ECB ADDRESS 
* 
*	OUTPUT:	A1 = RETURN CODE FOR ECB
*		A6 = DWT ADDRESS 
*		A7 = ORDER 
*		A8 = ECB ADDRESS 
* 
***************************************************************** 
* 
ACVU	EQU	*
* 
*	SWITCH TO LEVEL 48 AND ENB
*	(TO HAVE, DURING IOP-PREPARATION-LOOP,
*	LOWER PRIORITY THAN VCCU-INPUT-INTERRUPTS)
* 
	CF	A15,SWL48	SWITCH TO LEVEL 48 AND ENB
* 
*	CHECK ORDER CODE
* 
	CWK	A7,/06	ORDER /06 ? 
	RF(E)	ACV100	YES 
	CWK	A7,/0B	ORDER /0B ? 
	ABL(E)	ACV420	YES
	CWK	A7,/31	ORDER /31 ? 
	ABL(E)	ACV450	YES
	CWK	A7,/00	ORDER /00 ? 
	ABL(E)	ACV460	YES
	CWK	A7,/05	ORDER /05 ? 
	ABL(E)	ACV470	YES
* 
*	ILLEGAL ORDER CODE
* 
	ABL	DISIOE	I/O REQUEST ERROR 
	EJECT
**************************************************
*	ORDER /06 
*	STANDARD WRITE
**************************************************
* 
ACV100	EQU	*
	LD	A3,ECBRL,A8	INITIATE BUFFER INDEX(=REQUESTED
			LENGTH IF IT IS < 2) 
	LD	A2,ECBRL,A8	GET REQUESTED LENGTH
	SUK	A2,2	AT LEAST 2 BYTES ?
	RF(N)	ACV120	NO. THEN NO CONTROL CHARACTER, SO 
*			DO DEFAULT: LF+CR.
* 
*	CHECK BUFFER CONTROL CHARACTER
* 
	LDK	A3,2	INITIATE BUFFER INDEX 
*			TO POINT AFTER 2 CONTROL CHARACTERS 
	LD	A2,ECBBA,A8	GET ECB BUFFER ADDRESS
	LC	A2,1,A2	GET BUFFER CONTROL CHAR 
	ANK	A2,/FF	CLEAN LEFT BYTE 
	SUK	A2,/2B	WITHOUT POSITIONING BEFORE WRITE ?
	RF(Z)	ACV150	YES 
	SUK	A2,5	LF+LF+CR ? (=/30) 
	RF(Z)	ACV110	YES 
	SUK	A2,1	CLEAR SCREEN, HOME WRITE POS. ? (=/31)
	RF(NZ)	ACV120	NO. THEN FOR ALL OTHER VALUES: LF+CR 
* 
*	INITIAL ACTION
*	ACCORDING TO DETECTED BUFFER CONTROL CHARACTER
* 
	LDKL	A2,/0101	HOME WRITE POSITION
	ST	A2,DWTCN+DWTDEV,A6	AS CURRENT NEXT WRITE POSITION 
	LDK	A4,ROLBIT	BIT 8 (SET IF SCROLL MODE) 
	C1R	A4,A4	COMPLEMENT 
	ANS	A4,DWTDEV,A6	RESET BIT 8 (NO LONGER SCROLL MODE) 
	CF	A5,CLESCR	CLEAR SCREEN, RESET WRITE+CURSOR POS
	ABL(NZ)	DEVERR	STATUS NOT OK 
	RF	ACV140	GO RESET DWTDEV BIT 9
ACV110	EQU	*
	CF	A5,NXTROW	DO LINE-FEED TO NEXT ROW
ACV120	EQU	*
	CF	A5,NXTROW	DO LINE-FEED TO NEXT ROW
*	DO CR 
ACV130	EQU	*
	LDK	A2,/01	FIRST COLUMN
	SC	A2,DWTCNC+DWTDEV,A6	AS CURRENT NEXT WRITE COLUMN
ACV140	EQU	*
	LDK	A4,LCWBIT	BIT 9 (SET IF LAST COLUMN WRITTEN) 
	C1R	A4,A4	COMPLEMENT 
	ANS	A4,DWTDEV,A6	RESET BIT 9 
	EJECT
* 
*	START WRITING 
*	ACCORDING TO ASCII CHARACTERS FROM BUFFER 
* 
ACV150	EQU	*
	LD	A2,DWTCN+DWTDEV,A6	GET CURRENT NEXT WRITE POSITION
	CF	A5,STAWRI	START NEW WRITE REQUEST 
	ABL(NZ)	DEVERR	STATUS NOT OK 
	IFT	TRASPA=1 
	EJECT
* 
*	REMOVE ANY TRAILING /20, /11, /12, /1E, /1F 
*	BY DECREMENTING REQUESTED LENGTH
* 
	LD	A1,ECBBA,A8	GET BUFFER ADDRESS
	LD	A2,ECBRL,A8	GET REQUESTED LENGTH
	ADR	A1,A2	GET ADDRESS TO END OF BUFFER 
ACV160	CWK	A2,2	REQUESTED LENGTH < 3 ?
	RF(NG)	ACV200	YES. THEN NO (MORE) ACTION 
	SUK	A1,1	DECR ADDRESS IN BUFFER
	LCR	A4,A1	GET CHAR 
	CCK	A4,/2020	TRAILING SPACE ?
	RF(NE)	ACV180	NO. GO CHECK IF OTHER SKIPPABLE CHAR 
ACV170	SUK	A2,1	DECR REQUESTED LENGTH 
*			TO SKIP THAT TRAILING CHAR
	RB	ACV160	GO BACKWARDS TO CHECK PRECEEDING CHAR
ACV180	CWK	A2,4	REQUESTED LENGTH < 5 ?
	RF(NG)	ACV200	YES. THEN NO (MORE) ACTION 
	LC	A4,-2,A1	NOW GET THE CHAR 2 BYTES BEFORE
	CCK	A4,/1111	TRAILING TABULATION CHAR ?
	RF(NE)	ACV190	NO. GO CHECK IF OTHER SKIPPABLE CHAR 
	SUK	A1,2	DECR ADDRESS IN BUFFER
	SUK	A2,2	DECR REQUESTED LENGTH 
	RB	ACV170	 
ACV190	LCR	A4,A1	GET THE CHARACTER AGAIN
	ANK	A4,/FF 
	SUK	A4,/12	TRAILING UNDERLINE START? 
	RB(Z)	ACV170	YES. SKIP IT
	SUK	A4,/C	TRAILING LOW INTENSITY START?
	RB(Z)	ACV170	YES. SKIP IT
	SUK	A4,1	TRAILING LOW INTENSITY STOP?
	RB(Z)	ACV170	YES. SKIP IT
* 
ACV200	ST	A2,ECBRL,A8	STORE (NEW) REQUESTED LENGTH
	EJECT
	XIF
ACV210	EQU	*
	CF	A15,GETCHR	GET CHAR FROM ECB BUFFER 
	LDR	A1,A1	END OF ECB BUFFER ?
	RF(NP)	ACV380	YES
	ANK	A2,/7F	CLEAN 
	CWK	A2,SPACE	< /20 ? 
	RF(L)	ACV220	YES. THEN CHECK COMMAND CHARACTER 
	CF	A5,CHKOUT	CHECK IF LAST COLUMN AND DO OUTPUT
	RB	ACV210	GET NEXT CHAR
	EJECT
* 
*	CHECK OF COMMAND CHARACTER
* 
ACV220	EQU	*
	CWK	A7,/05	ORDER /05 RUNNING ? 
	ABL(E)	ACV480	YES. THEN DIFFERENT CHARACTER CHECK
	SUK	A2,/11	TABULATION ?
	RF(Z)	ACV290	YES 
	SUK	A2,1	START UNDERLINE ? (/12) 
	RF(Z)	ACV230	YES 
	SUK	A2,1	STOP UNDERLINE ? (/13)
	RF(Z)	ACV250	YES 
	SUK	A2,1	FAST OUTPUT ? (/14) 
	RF(Z)	ACV350	YES 
	SUK	A2,/A	START LOW INTENSITY ? (/1E)
	RF(Z)	ACV270	YES 
	SUK	A2,1	STOP LOW INTENSITY ? (/1F)
	RF(Z)	ACV280	YES 
* 
*	ILLEGAL (COMMAND) CHARACTER 
* 
	LDK	A1,CCERR	CODE CHECK ERROR STATUS 
	ORS	A1,ECBRC,A8	INTO ECB RETURN CODE 
	RB	ACV210	GO GET NEXT CHAR 
	EJECT
* 
*	START UNDERLINE 
* 
ACV230	EQU	*
	LDKL	A2,UNDBIT	GET UNDERLINE MODE BIT
ACV240	EQU	*
	ORS	A2,DWTDEV,A6	SET BIT INTO DWT
	RB	ACV210	GO GET NEXT CHAR 
* 
*	STOP UNDERLINE
* 
ACV250	EQU	*
	LDKL	A2,UNDBIT	GET UNDERLINE MODE BIT
ACV260	EQU	*
	C1R	A2,A2	COMPLEMENT 
	ANS	A2,DWTDEV,A6	RESET BIT IN DWT
	RB	ACV210	GO GET NEXT CHAR 
* 
*	START LOW (!) INTENSITY 
* 
ACV270	EQU	*
	LDKL	A2,INTBIT	GET HIGH INTENSITY MODE BIT 
	RB	ACV260	GO RESET BIT IN DWT
* 
*	STOP LOW (!) INTENSITY
* 
ACV280	EQU	*
	LDKL	A2,INTBIT	GET HIGH INTENSITY MODE BIT 
	RB	ACV240	GO SET BIT INTO DWT
	EJECT
* 
*	ORDER /06, COMMAND /11 (TABULATION) 
* 
ACV290	EQU	*
	CF	A5,ENDWRI	END THE WRITE REQUEST 
	ABL(NZ)	DEVERR	STATUS NOT OK 
	CF	A15,GETCHR	GET TAB COLUMN NUMBER (FIRST DIGIT)
	LDR	A4,A2	SAVE FIRST DIGIT 
	CF	A15,GETCHR	GET TAB COLUMN NUMBER (SECOND DIGIT) 
* 
*	CONVERT FROM DECIMAL INTO HEXA
* 
	ANK	A2,/F	GET UNITS
	ANK	A4,/F	GET TENTHS. ANY ?
	RF(Z)	ACV310	NO
ACV300	EQU	*
	ADK	A2,/A	INCR WITH TEN UNITS
	SUK	A4,1	ONE MORE TIME ? 
	RB(NZ)	ACV300	YES
* 
*	CHECK COLUMN NUMBER TABULATED INTO
* 
ACV310	EQU	*
	LDK	A4,0	CLEAR REGISTER
	LC	A4,DWTCNR+DWTDEV,A6	GET CURRENT NEXT WRITE ROW NUMBER 
	ECR	A4,A4	ROW NUMBER INTO LEFT BYTE
ACV320	EQU	*
	CWK	A2,1	< COLUMN 1 ? (=COLUMN 'ZERO' ?) 
	RF(NL)	ACV330	NO 
	LCK	A2,/0101	YES. SET COLUMN 1 INSTEAD 
	RF	ACV340
ACV330	EQU	*
	CCK	A2,MAXCOL	EXCEEDING MAX NUMBER OF COLUMNS ?
	RF(NG)	ACV340	NO 
	LCK	A2,MAXCOL	YES. SET LAST COLUMN INSTEAD 
* 
*	EXECUTE THE TABULATION
* 
ACV340	EQU	*
	ORR	A2,A4	COMBINE ROW AND COLUMN NUMBERS 
	ST	A2,DWTCN+DWTDEV,A6	SET CURRENT NEXT WRITE POSITION
	ABL	ACV140	GO RESET BIT 9 IN DWTDEV, DO STAWRI.
	EJECT
* 
*	ORDER /06, COMMAND /14 (FAST OUTPUT)
* 
ACV350	EQU	*
	CF	A15,SAVCN	SAVE CURRENT NEXT WRITE POSITION
	CF	A15,GETCHR	GET NEXT CHARACTER FROM ECB BUFFER 
	LD	A4,ECBRL,A8	GET REQUESTED LENGTH
	ST	A4,ECBEL,A8	SET EFFECTIVE LENGTH
	SUR	A4,A3	SUBTRACT BUFFER INDEX
	LDR	A3,A4	SAVE REMAINING LENGTH FOR 'FAST OUTPUT'
	RF(Z)	ACV370	NO OUTPUT IF ZERO LENGTH
* 
*  NO OUTPUT IF NO ASCII CHARACTERS : SET STATUS
* 
	ANK	A2,/7F 
	CWK	A2,SPACE	</20? 
	RF(NL)	ACV360
	LDK	A1,CCERR	CODE CHECK ERROR STATUS 
	ORS	A1,ECBRC,A8	INTO ECB RETURN CODE 
	RF	ACV370
ACV360	EQU	*
	CF	A5,CHKOUT	CHECK LAST COLUMN WRITTEN AND DO OUTPUT 
	SUK	A3,1	ONE MORE TIME ? 
	RB(NZ)	ACV360	YES
ACV370	EQU	*
	CF	A5,ENDWRI	END THE WRITE REQUEST 
	ABL(NZ)	DEVERR	STATUS NOT OK 
	CF	A15,RESCN	RESTORE SAVED WRITE POS. AS CURRENT NEXT
	RF	ACV390	GO SET CURSOR TO IT
	EJECT
* 
*	END OF LKM-REQUEST
* 
ACV380	EQU	*
	CF	A5,ENDWRI	END THE WRITE REQUEST 
	ABL(NZ)	DEVERR	STATUS NOT OK 
	CF	A15,SAVCN	SAVE CURRENT NEXT WRITE POSITION
ACV390	EQU	*
	CWK	A7,/31	ORDER /31 ? 
	RF(E)	ACV395	YES. THEN DO NOT MODIFY ECBCW.
ACV392	EQU	*
	ST	A2,ECBCW,A8	SAVE NEXT WRITE POSITION ALSO INTO ECB
	LD	A4,DWTDEV,A6	 
	ANK	A4,LCWBIT	BIT 9 SET ?
	RF(Z)	ACV395	NO = LAST COLUMN NOT WRITTEN
	IM	ECBCW,A8	YES. INDICATE BY RETURNING LAST+1 COLUMN 
ACV395	EQU	*
	CF	A5,OUTCUR	SET CURSOR TO NEXT WRITE POSITION 
	ABL(NZ)	DEVERR	STATUS NOT OK 
* 
*	RESET DISPLAY MODE BITS IN DWT
* 
ACV400	EQU	*
	LDKL	A2,UNDBIT	GET UNDERLINE MODE BIT
	C1R	A2,A2	COMPLEMENT 
	ANS	A2,DWTDEV,A6	RESET BIT IN DWT
	LDKL	A2,INTBIT	GET HIGH INTENSITY MODE BIT 
	ORS	A2,DWTDEV,A6	SET BIT INTO DWT
ACV410	EQU	*
	ABL	DISEND	END I/O AND DISPATCH
	EJECT
******************************************************* 
*	ORDER /0B 
*	SET CURSOR (AND WRITE)
********************************************************* 
* 
ACV420	EQU	*
	LDK	A3,2	INITIATE BUFFER INDEX 
*			 (SKIP UNUSED LEADING 2 BYTES)
	LDK	A2,0	CLEAR WORK REGISTER 
	LDK	A4,0	CLEAR WORK REGISTER 
	LC	A4,ECBCW,A8	GET REQUESTED ROW NUMBER
	CWK	A4,1	< ROW 1 ? (=ROW 'ZERO' ?) 
	RF(NL)	ACV430	NO 
	LCK	A4,/0101	YES. SET ROW 1 INSTEAD
	RF	ACV440	 
ACV430	EQU	*
	CCK	A4,MAXROW	EXCEEDING MAX NUMBER OF ROWS ? 
	RF(NG)	ACV440	NO 
	LCK	A4,MAXROW	YES. SET LAST ROW INSTEAD
ACV440	EQU	*
	ECR	A4,A4	ROW NUMBER INTO LEFT BYTE
	LC	A2,ECBCW+1,A8	GET REQUESTED COLUMN NUMBER 
	RB	ACV320	GO CHECK REQUESTED COLUMN NUMBER ETC.
	EJECT
********************************************************
*	ORDER /31 
*	ERASE 
******************************************************* 
* 
ACV450	EQU	*
	LD	A2,DWTCN+DWTDEV,A6	GET CURRENT NEXT WRITE POSITION
	LD	A3,ECBCW,A8	GET NUMBER OF CHARACTERS TO ERASE 
	RB(Z)	ACV395	NO ERASE IF ZERO CHARACTERS,
*			BUT THEN GO SET CURSOR ETC
*			+ DO ENDIO. 
	CF	A5,STAWRI	START NEW WRITE REQUEST 
	ABL(NZ)	DEVERR	STATUS NOT OK 
	LDK	A2,SPACE	GET SPACE TO DO ERASE WITH
	RB	ACV360	GO DO ERASE
	EJECT
************************************************
*	ORDER /00 
*	TEST STATUS 
************************************************* 
* 
ACV460	EQU	*
	LD	A2,DWTCN+DWTDEV,A6	GET CURRENT NEXT WRITE POSITION
	RB	ACV392	SET ECBCW AND DO (DUMMY) OUTPUT CURSOR 
	EJECT
************************************************* 
*	ORDER /05 
*	BASIC WRITE 
************************************************* 
* 
ACV470	EQU	*
	LDK	A3,0	INITIATE BUFFER INDEX 
	ABL	ACV150	GO START WRITE REQUEST ETC. 
* 
* 
* 
* 
*	CHECK OF DETECTED COMMAND CHARACTER 
* 
ACV480	EQU	*
	SUK	A2,/0A	LINE-FEED ? (=/0A)
	RF(NZ)	ACV490	NO 
	CF	A5,ENDWRI	END THE WRITE REQUEST 
	ABL(NZ)	DEVERR	STATUS NOT OK 
	CF	A5,NXTROW	DO LINE-FEED TO NEXT ROW
	ABL	ACV150	GO START NEW WRITE REQUEST ETC. 
ACV490	EQU	*
	SUK	A2,3	CARRIAGE RETURN ? (=/0D)
	ABL(NZ)	ACV210	NO. THEN ILLEGAL COMMAND CHAR ! 
*			NO OUTPUT, NO ERROR STATUS, GET NEXT CHAR 
	CF	A5,ENDWRI	END THE WRITE REQUEST 
	RF(NZ)	DEVERR	STATUS NOT OK
	ABL	ACV130	GO DO CARRIAGE RETURN ETC.
	EJECT
* 
*********************************************************** 
* 
*	S C R E E N   S E C T I O N 
*	D E V I C E   D R I V E R   P A R T 
*	A B O R T   R O U T I N E 
* 
*********************************************************** 
* 
* 
*	CALL:	CFR A15,A2  (A2 = ABVU) 
* 
*	USED BY:	ABORT-LKM PROCESSOR
*		AT ABORT OF KEYBOARD INPUT WITH ECHO 
* 
*	FUNCTION:SAVE CURRENT NEXT WRITE POSITION (DEFINING 
*		END OF REQUEST POSITION) INTO DWT
* 
*	INPUT:	A6 = DWT-ADDRESS OF ECHO DEVICE
*		A8 = DWT-ADDRESS OF INPUT DEVICE 
* 
*	OUTPUT:	A6,A8 UNCHANGED ! 
* 
************************************************************
* 
ABVU	EQU	*
	CF	A15,SAVCN	SAVE CURRENT NEXT WRITE POSITION
	IFT	CPU852=1 
	ABL	IHRTN	RETURN 
	XIF
	RTN	A15
	EJECT
* 
*********************************************************** 
* 
*	S C R E E N   S E C T I O N 
*	D E V I C E   D R I V E R   P A R T 
*	R E C O V E R Y   R O U T I N E 
* 
*********************************************************** 
* 
*	ENTERED:	FROM LINE DRIVER PART VIA NETWORK DISTRIBUTOR, 
*		AT POWER ON
* 
*	FUNCTIONS:
*		1. SET DWT BUSY
*		2. CLEAR SCREEN
*		3. INITIATE CURRENT NEXT WRITE POSITION IN DWT 
*		4. RESET BITS IN DWT FOR 
*			- SCROLL MODE 
*			- LAST COLUMN WRITTEN 
*			- UNDERLINE MODE
*		5. SET BIT IN DWT FOR
*			- HIGH INTENSITY MODE 
*		6. SET RETURN STATUS FOR ECBRC: 'NOT OPERABLE' 
*		7. EXIT: ENDIO+DISPATCH
* 
*	INPUT:	A4 = RECOVERY CAUSE
*		A5 = DWT STACK BASE
*		A6 = DWT ADDRESS 
*		A7 = ORDER (IF REQUEST IS ON)
*		A8 = ECB ADDRESS (IF REQUEST IS ON)
*		     0 (IF NO REQUEST IS ON) 
* 
*	OUTPUT:	A1 = RETURN CODE
*		A6 = DWT ADDRESS 
* 
**************************************************************
* 
RCVU	EQU	*
	LDKL	A2,/7FFF	READY-BIT
	ANS	A2,DWTST,A6	RESET IT (=SET DWT BUSY) 
	CF	A5,CLESCR	CLEAR SCREEN, RESET WRITE+CURSOR POS. 
	RF(NZ)	DEVERR	STATUS NOT OK
	LDKL	A2,/0101	HOME POSITION
	ST	A2,DWTCN+DWTDEV,A6	AS CURRENT NEXT WRITE POSITION 
	LDK	A4,ROLBIT+LCWBIT	BIT 8+9 (SCROLL + LAST COLUMN WRITTEN)
	C1R	A4,A4	COMPLEMENT 
	ANS	A4,DWTDEV,A6	RESET BITS IN DWT 
	CF	A15,SAVCN	SAVE CURRENT NEXT WRITE POSITION
	LDK	A1,OPERR	STATUS NOT OPERABLE (FOR ECBRC) 
	RB	ACV400	GO RESET UNDERLINE+INTENSITY MODE, 
*			AND EXIT:  ENDIO+DISPATCH 
	EJECT
* 
**************************************************************
* 
*	S C R E E N   S E C T I O N 
*	D E V I C E   D R I V E R   P A R T 
*	E C H O   R O U T I N E 
* 
**************************************************************
* 
* 
*	ENTERED:	FROM KEYBOARD DRIVER VIA NETWORK DISTRIBUTOR,
*		AT KEYBOARD INPUT WITH ECHO
* 
*	FUNCTIONS:
*		1. ECHOING OF ALPHANUMERIC CHARACTERS
*		2. HANDLING OF BACKSPACE-CHARACTER 
*		3. HANDLING OF CLEAR-CHARACTER 
*		4. HANDLING OF LINEFEED-CHARACTER
*		5. HANDLING OF CARRIAGE-RETURN-CHARACTER 
*		6. HANDLING OF END-OF-RECORD-CHARACTER (ALPHANUM., LF OR CR) 
*		7. EXIT: TO KEYBOARD DRIVER VIA NETWORK DISTRIBUTOR
* 
*	INPUT:	A2 = BITS 0-7 : ZERO 
*		     BITS 8-15: CHARACTER
*		A5 = DWT STACK BASE
*		A6 = DWT ADDRESS 
*		A7 = BIT 0  =1 IF END OF ECHO
*		            =0 IF NOT
* 
*	OUTPUT:	A6 = DWT ADDRESS
* 
*************************************************************** 
* 
ECHOVU	EQU	*
	LDR	A7,A7	END OF REQUEST FOR ECHO ?
	RF(N)	ECV110	YES 
* 
*	CHECK IF SPECIAL ECHO CHARACTER 
* 
	CWK	A2,/80	8-BIT SET ? (=EOR-CHARACTER, >=/80) 
	IFT	EORECH=0 
	RF(NL)	ECV120	YES. NOT TO BE ECHOED. 
	XIF
	IFT	EORECH=1 
	RF(L)	ECV080	NO. THEN NOT EOR-CHARACTER
* 
*	ECHO OF EOR-CHARACTER 
* 
	ANK	A2,/7F	CLEAN 
	CWK	A2,/20	</20 ?
	RF(L)	ECV085	YES. COMMAND CHARACTER AS EOR-CHAR. 
	RF	ECV095	NO. ALPHANUMERIC CHAR AS EOR-CHAR. 
	XIF
* 
*	ECHO OF NON-EOR CHARACTER 
* 
ECV080	EQU	*
	CWK	A2,/20	</20 ?
	RF(NL)	ECV095	NO. THEN ALPHANUMERIC CHARACTER. 
	SUK	A2,/08	BACKSPACE ? (/08) 
	RF(Z)	ECV130	YES 
	SUK	A2,/10	CLEAR-CHARACTER ? (/18) 
	RF(Z)	ECV160	YES 
	ADK	A2,/18	RESTORE CHARACTER 
ECV085	EQU	*
	SUK	A2,/0A	LINEFEED ? (/0A)
	RF(NZ)	ECV090	NO 
* 
*	ECHO OF LINEFEED
* 
	CF	A5,NXTROW	DO LINEFEED TO NEXT ROW 
	RF	ECV100	GO SET CURSOR
ECV090	EQU	*
	SUK	A2,3	CARRIAGE RETURN ? (/0D) 
	RF(NZ)	ECV120	NO. THEN ILLEGAL ECHO CHARACTER! 
* 
*	ECHO OF CARRIAGE RETURN 
* 
	LDK	A2,/01	FIRST COLUMN OF ROW 
	SC	A2,DWTCNC+DWTDEV,A6	AS CURRENT NEXT WRITE COLUMN
	LDK	A4,LCWBIT	BIT 9 (SET IF LAST COLUMN WRITTEN) 
	C1R	A4,A4	COMPLEMENT 
	ANS	A4,DWTDEV,A6	RESET BIT 9 
	RF	ECV100	GO SET CURSOR
* 
*	DO ECHO OF ALPHANUMERIC CHARACTER 
* 
ECV095	EQU	*
	CF	A5,ECHOUT	ECHO THE CHARACTER
	CF	A15,NXTCOL	UPDATE COLUMN COUNTER TO NEXT COLUMN 
ECV100	EQU	*
	LD	A2,DWTCN+DWTDEV,A6	GET CURRENT NEXT WRITE POSITION
	CF	A5,OUTCUR	OUTPUT CURSOR IN IT 
	RF(NZ)	DEVERR	STATUS NOT OK
	RF	ECV120	RETURN 
* 
*	END THE ECHO REQUEST
* 
ECV110	EQU	*
	CF	A15,SAVCN	SAVE CURRENT NEXT WRITE POSITION
	CF	A15,TENDIO	END ECHO-OUTPUT I/O-REQUEST
* 
*	RETURN FROM ECHO HANDLING 
* 
ECV120	EQU	*
	ABL	ECHRTN	RETURN FROM ECHO TO KB-DRIVER 
	EJECT
* 
*	HANDLING OF A BACKSPACE-CHARACTER 
* 
ECV130	EQU	*
	LD	A2,DWTDEV,A6	 
	LDR	A4,A2	SAVE INTO A4 
	ANK	A4,LCPBIT	BIT 10 SET ? (=LAST COLUMN ALREADY WRITTEN 
*			BY PREVIOUS REQUEST)
	RB(NZ)	ECV120	YES. THEN NO RUBOUT !
	ANK	A2,LCWBIT	BIT 9 SET ?
	RF(NZ)	ECV140	YES.LAST COLUMN WRITTEN (DURING REQUEST) 
	LD	A4,DWTSN+DWTDEV,A6	GET NEXT WRITE POSITION SAVED AFTER
*			PREVIOUS REQUEST
	CW	A4,DWTCN+DWTDEV,A6	= CURRENT NEXT WRITE POSITION ?
	RB(E)	ECV120	YES. THEN NO RUB-OUT !
	LDKL	A4,-1	
	ADS	A4,DWTCN+DWTDEV,A6	DECR CURRENT NEXT WRITE POSITION
	RF	ECV150
ECV140	EQU	*
	XRS	A2,DWTDEV,A6	RESET BIT 9 (LAST COLUMN NO LONGER WRITTEN) 
ECV150	EQU	*
	LDK	A2,SPACE	RUBOUT PREVIOUS (OR LAST) COLUMN
	CF	A5,ECHOUT	OUTPUT ONE SPACE TO RUBOUT
	RB	ECV100	GO SET CURSOR
	EJECT
* 
*	HANDLING OF A CLEAR-CHARACTER 
* 
ECV160	EQU	*
	LD	A4,DWTDEV,A6	 
	LDR	A2,A4	ALSO INTO A2 
	ANK	A4,LCPBIT	BIT 10 SET ? (=LAST COLUMN WRITTEN 
*			ALREADY BY PREVIOUS REQUEST)
	RB(NZ)	ECV120	YES. THEN NO RUBOUT !
* 
*	PREPARE THE RUBOUT
* 
	LD	A3,DWTCN+DWTDEV,A6	GET CURRENT NEXT WRITE POSITION
	SU	A3,DWTSN+DWTDEV,A6	SUBTRACT WITH NEXT WRITE POSITION
*			SAVED AFTER PREVIOUS REQUEST
	ANK	A2,LCWBIT	BIT 9 SET ? (=LAST COLUMN WRITTEN, 
*			DURING REQUEST !) 
	RF(Z)	ECV170	NO
	ADK	A3,1	YES. MODIFY TO RUBOUT ALSO LAST COLUMN
ECV170	EQU	*
	ADK	A3,0	ANY ECHOED CHARACTERS TO RUBOUT ? 
	RB(Z)	ECV120	NO
* 
*	DO THE RUBOUT 
* 
	CF	A15,RESCN	RESTORE SAVED WRITE POS. AS CURRENT NEXT
	CF	A5,STAWRI	START NEW WRITE REQUEST TO DO RUBOUT
	RF(NZ)	DEVERR	STATUS NOT OK
ECV180	EQU	*
	LDK	A2,SPACE	GET SPACE TO DO RUBOUT WITH 
	CF	A5,OUTCHA	OUTPUT IT 
	RF(NZ)	DEVERR	STATUS NOT OK
	SUK	A3,1	ONE MORE CHAR TO RUBOUT ? 
	RB(NZ)	ECV180	YES
	CF	A5,ENDWRI	END THE WRITE REQUEST 
	RF(NZ)	DEVERR	STATUS NOT OK
	RB	ECV100	GO SET CURSOR
	EJECT
* 
********************************************************
* 
*	S C R E E N   S E C T I O N 
*	D E V I C E   D R I V E R   P A R T 
*	E R R O R   R O U T I N E 
* 
********************************************************
* 
* 
*	ENTERED:	FROM DEVICE DRIVER PART, 
*		AT ERROR STATUS AT RETURN FROM LINE DRIVER PART
* 
*	FUNCTION: 1. INDICATE STATUS 'NOT OPERABLE' FOR ECBRC 
*		 2. EXIT FROM DRIVER 
* 
*	INPUT:	A6 = DWT ADDRESS 
* 
*	OUTPUT:	A1 = BIT 15  =1 (STATUS NOT OPERABLE) 
*		A6 = DWT ADDRESS 
* 
********************************************************* 
* 
DEVERR	EQU	*
	LDK	A1,OPERR	STATUS NOT OPERABLE (FOR ECBRC) 
	ABL	ACV410	EXIT: ENDIO AND DISPATCH
	EJECT
* 
***************************************************************** 
* 
*	S C R E E N   S E C T I O N 
*	D E V I C E   D R I V E R   P A R T 
*	S U B - R O U T I N E S 
* 
***************************************************************** 
* 
* 
* 
*	-CHKOUT	CHECK IF LAST COLUMN WRITTEN, AND OUTPUT ONE CHARACTER
*	-ECHOUT	OUTPUT ONE CHARACTER IN ECHO MODE 
*	-NXTROW	UPDATE ROW COUNTER TO NEXT ROW, 
*		AND IF NECESSARY HANDLE SCROLL.
*	-NXTCOL	CALLED AFTER WRITE IN CURRENT COLUMN, SO: 
*		UPDATE COLUMN COUNTER TO NEXT COLUMN,
*		AND IF NECESSARY HANDLE LAST-COLUMN-WRITTEN. 
*	-SAVCN	SAVE CURRENT NEXT WRITE POSITION 
*	-RESCN	RESTORE SAVED WRITE POSITION TO BECOME CURRENT NEXT
* 
* 
* 
	EJECT
* 
********************************************************
* 
*	C H K O U T 
* 
********************************************************* 
* 
* 
*	CALL:	CF A5,CHKOUT
* 
*	USED BY:	SCREEN SECTION, DEVICE DRIVER PART 
* 
*	FUNCTION: 1. CHECK IF LAST COLUMN WRITTTEN, 
*		  AND IF SO END THE WRITE REQUEST AND START A NEW ONE. 
*		2. OUTPUT ONE CHARACTER
*		3. UPDATE COLUMN COUNTER TO NEXT COLUMN
* 
*	INPUT:	A2 = CHARACTER TO BE OUTPUT
*		A5 = DWT STACK POINTER 
*		A6 = DWT ADDRESS 
* 
*	OUTPUT:	A2 = UNCHANGED !
*		A4 = CHANGED 
*		A5 = DWT STACK BASE
*		A6 = DWT ADDRESS 
* 
******************************************************************
* 
CHKOUT	EQU	*
	LDR	A4,A2	 SAVE CHARACTER TO BE OUTPUT 
	LD	A2,DWTDEV,A6	 
	ANK	A2,LCWBIT	BIT 9 SET ? (=LAST COLUMN WRITTEN) 
	RF(Z)	CHKO10	NO
	CF	A5,ENDWRI	END THE WRITE REQUEST 
	RB(NZ)	DEVERR	STATUS NOT OK
	LD	A2,DWTCN+DWTDEV,A6	NOW ALSO NEXT CHAR IN LAST COLUMN
	CF	A5,STAWRI	START NEW WRITE REQUEST 
	RB(NZ)	DEVERR	STATUS NOT OK
CHKO10	EQU	*
	LDR	A2,A4	RESTORE  SAVED CHARACTER 
	CF	A5,OUTCHA	OUTPUT IT 
	RB(NZ)	DEVERR	STATUS NOT OK
	LDR	A2,A4	RESTORE A2 AGAIN 
	CF	A15,NXTCOL	UPDATE COLUMN COUNTER TO NEXT COLUMN 
	ABL	NDRET	RETURN VIA A5-STACK
	EJECT
* 
************************************************************
* 
*	E C H O U T 
* 
************************************************************
* 
* 
*	CALL:	CF A5,ECHOUT
* 
*	USED BY:	SCREEN SECTION, DEVICE DRIVER PART 
* 
*	FUNCTION: OUTPUT ONE CHARACTER IN ECHO MODE 
*		OBS: COLUMN COUNTER IS NOT UPDATED 
* 
*	INPUT:	A2 = ECHO CHARACTER
*		A5 = DWT STACK POINTER 
*		A6 = DWT ADDRESS 
* 
*	OUTPUT:	A2 = CHANGED
*		A4 = CHANGED 
*		A5 = DWT STACK BASE
*		A6 = DWT ADDRESS 
* 
********************************************************
* 
ECHOUT	EQU	*
	LDR	A4,A2	SAVE CHARACTER TO BE OUTPUT
	LD	A2,DWTCN+DWTDEV,A6	GET CURRENT NEXT WRITE POSITION
	CF	A5,STAWRI	START THE WRITE REQUEST 
	RB(NZ)	DEVERR	STATUS NOT OK
	LDR	A2,A4	RESTORE SAVED CHARACTER
	CF	A5,OUTCHA	OUTPUT IT 
	RB(NZ)	DEVERR	STATUS NOT OK
	CF	A5,ENDWRI	END THE WRITE REQUEST 
	RB(NZ)	DEVERR	STATUS NOT OK
	ABL	NDRET	RETURN VIA A5-STACK
	EJECT
* 
**********************************************************
* 
*	N X T R O W 
* 
**********************************************************
* 
* 
*	CALL:	CF A5, NXTROW 
* 
*	USED BY:	SCREEN SECTION, DEVICE DRIVER PART 
* 
*	FUNCTION: UPDATE ROW COUNTER TO NEXT ROW, 
*		 AND IF NECESSARY HANDLE SCROLL
* 
*	INPUT:	A5 = DWT STACK POINTER 
*		A6 = DWT ADDRESS 
* 
*	OUTPUT:	A2 = CHANGED
*		A4 = CHANGED 
*		A5 = DWT STACK BASE
*		A6 = DWT ADDRESS 
* 
**********************************************************
* 
NXTROW	EQU	*
	LC	A4,DWTCNR+DWTDEV,A6	GET CURRENT ROW NUMBER
	CCK	A4,MAXROW	= LAST ROW ? 
	RF(E)	NXTR10	YES. START SCROLLING
	LDKL	A2,/0100	POSITION DISPLACEMENT = ONE ROW
	ADS	A2,DWTCNR+DWTDEV,A6	INCR CURRENT ROW NUMBER
	LD	A4,DWTDEV,A6	 
	ANK	A4,ROLBIT	BIT 8 SET ? (=ALREADY IN SCROLL MODE)
	RF(Z)	NXTR40	NO. THEN RETURN 
* 
*	CONTINUE SCROLLING
* 
	LC	A4,DWTCNR+DWTDEV,A6	GET CURRENT ROW NUMBER AFTER LF 
	CCK	A4,MAXROW	= LAST ROW ? 
	RF(E)	NXTR40	YES. THE NO RUBOUT ONE ROW IN ADVANCE.
* 
*	CONTINUE RUBOUT 
* 
	LD	A2,DWTCN+DWTDEV,A6	GET CURRENT NEXT WRITE POSITION
	ADKL	A2,/0100	RUBOUT ONE ROW IN ADVANCE
	LDK	A4,/50	ONE ROW CONTAINS 80 CHAR TO RUBOUT
	RF	NXTR20	GO DO RUBOUT 
* 
*	START SCROLLING AND RUBOUT
* 
NXTR10	EQU	*
	LDK	A4,ROLBIT	SET BIT 8 (SCROLL MODE)
	ORS	A4,DWTDEV,A6	INTO DWT
	LDK	A2,/01	SET FIRST ROW 
	SC	A2,DWTCNR+DWTDEV,A6	AS CURRENT WRITE ROW
	LDK	A4,/A0	TWO ROWS CONTAIN 160 CHAR TO RUBOUT 
	LD	A2,DWTCN+DWTDEV,A6	GET CURRENT NEXT WRITE POSITION
NXTR20	EQU	*
	ANKL	A2,/FF00	RUB FROM BEGIN OF THAT ROW 
	ADK	A2,1	BEGIN OF ROW IS COLUMN 1 (NOT 'ZERO') 
	CF	A5,STAWRI	START NEW WRITE REQUEST TO RUBOUT 
	RB(NZ)	DEVERR	STATUS NOT OK
NXTR30	EQU	*
	LDK	A2,SPACE	GET SPACE TO DO RUBOUT WITH 
	CF	A5,OUTCHA	OUTPUT IT 
	RB(NZ)	DEVERR	STATUS NOT OK
	SUK	A4,1	ONE MORE TIME ? 
	RB(NZ)	NXTR30	YES
	CF	A5,ENDWRI	END THE WRITE REQUEST 
	RB(NZ)	DEVERR	STATUS NOT OK
NXTR40	EQU	*
	ABL	NDRET	RETURN VIA A5 STACK
	EJECT
* 
********************************************************* 
* 
*	N X T C O L 
* 
********************************************************* 
* 
* 
*	CALL:	CF A15,NXTCOL 
* 
*	USED BY:	SCREEN SECTION, DEVICE DRIVER PART 
* 
*	FUNCTION: CALLED AFTER WRITE IN CURRENT COLUMN, SO: 
*		1. IF LAST COLUMN NOT WRITTEN, 
*		   UPDATE COLUMN COUNTER TO NEXT COLUMN. 
*		2. IF LAST COLUMN WRITTEN, 
*		   SET BIT 9 IN DWTDEV.
* 
*	INPUT:	NONE.
* 
*	OUTPUT:	A4 CHANGED. 
* 
*********************************************************** 
* 
NXTCOL	EQU	*
	LD	A4,DWTDEV,A6	 
	ANK	A4,LCWBIT	BIT 9 SET ?
	RF(NZ)	NXTC20	YES. LAST COLUMN IS WRITTEN
	LC	A4,DWTCNC+DWTDEV,A6	GET CURRENT NEXT WRITE COLUMN 
	CCK	A4,MAXCOL	= LAST COLUMN ?
	RF(NE)	NXTC10	NO 
	LDK	A4,LCWBIT	LAST COLUMN WRITTEN
	ORS	A4,DWTDEV,A6	SET BIT 9 
	RF	NXTC20	 
NXTC10	EQU	*
	IM	DWTCN+DWTDEV,A6	INCR CURRENT NEXT WRITE COLUMN
NXTC20	EQU	*
	RTN	A15	RETURN 
	EJECT
* 
********************************************************* 
* 
*	S A V C N 
* 
**********************************************************
* 
* 
*	CALL:	CF 15,SAVCN 
* 
*	USED BY:	SCREEN SECTION, DEVICE DRIVER PART 
* 
*	FUNCTION: 1. SAVE DWTCN (CURRENT NEXT WRITE POSITION) INTO DWTSN
*		 2. SAVE DWTDEV BIT 9 INTO BIT 10
* 
*	INPUT:	NONE 
* 
*	OUTPUT:	A2,A4 CHANGED 
* 
*************************************************************** 
* 
SAVCN	EQU	* 
*	COPY DWTDEV BIT 9 INTO BIT 10 
	LD	A4,DWTDEV,A6	 
	LDR	A2,A4	SAVE INTO A2 
	ANK	A4,LCWBIT	GET BIT 9 (SET IF LAST COLUMN WRITTEN) 
	LDK	A2,LCPBIT	BIT 10 (SET IF LAST COLUMN WRITTEN 
*			ALREADY BY PREVIOUS REQUEST)
	C1R	A2,A2	COMPLEMENT 
	ANS	A2,DWTDEV,A6	RESET BIT 10
	SRL	A4,1	SHIFT BIT 9 INTO BIT 10 
	ORS	A4,DWTDEV,A6	STORE INTO DWT
*	COPY DWTCN INTO DWTSN 
	LD	A2,DWTCN+DWTDEV,A6	GET CURRENT NEXT WRITE POSITION
	ST	A2,DWTSN+DWTDEV,A6	SET SAVED WRITE POSITION 
	RTN	A15	RETURN 
	EJECT
* 
*********************************************************** 
* 
*	R E S C N 
* 
************************************************************
* 
* 
*	CALL:	CF A15,RESCN
* 
*	USED BY:	SCREEN SECTION,DEVICE DRIVER PART
* 
*	FUNCTION: 1. RESTORE, FROM DWTSN INTO DWTCN,
*		  SAVED WRITE POSITION TO BECOME CURRENT NEXT. 
*		2. RESTORE DWTDEV BIT 9 FROM BIT 10. 
* 
*	INPUT:	NONE.
* 
*	OUTPUT:	A2,A4 CHANGED.
* 
**************************************************************
* 
RESCN	EQU	* 
*	COPY DWTDEV BIT 10 INTO BIT 9 
	LD	A4,DWTDEV,A6	 
	ANK	A4,LCPBIT	GET BIT 10 (SET IF LAST COLUMN WRITTEN 
*			ALREADY BY PREVIOUS REQUEST)
	LDK	A2,LCWBIT	BIT 9 (SET IF LAST COLUMN WRITTEN) 
	C1R	A2,A2	COMPLEMENT 
	ANS	A2,DWTDEV,A6	RESET BIT 9 
	SLL	A4,1	SHIFT BIT 10 INTO BIT 9 
	ORS	A4,DWTDEV,A6	STORE INTO DWT
*	COPY DWTSN INTO DWTCN 
	LD	A2,DWTSN+DWTDEV,A6	GET SAVED NEXT WRITE POSITION
	ST	A2,DWTCN+DWTDEV,A6	RESTORE CURRENT NEXT WRITE POSITION
	RTN	A15	RETURN 
	EJECT
* 
**********************************************************
* 
*	S C R E E N   S E C T I O N 
*	L I N E   D R I V E R   P A R T 
*	A C T I V A T I O N   R O U T I N E S 
* 
**********************************************************
* 
* 
*	THEESE ACTIVATION ROUTINES ARE CALLED DIRECTLY
*	FROM THE SCREEN SECTION DEVICE DRIVER PART OF THIS DRIVER.
*	RETURN TO DEVICE DRIVER PART IS MADE VIA THE NETWORK DISTRIBUTOR. 
* 
* 
	EJECT
* 
***************************************************** 
* 
*	S T A W R I 
* 
***************************************************** 
* 
* 
*	CALL:	CF A5, STAWRI 
* 
*	USED BY:	SCREEN SECTION, DEVICE DRIVER PART 
* 
*	FUNCTION:TO DEFINE, FOR THIS CIO-REQUEST, 
*		THE START WRITE POSITION ON SCREEN.
* 
*	INPUT:	A2 = WRITE POSITION ON SCREEN
*		( /0101-/1850 )
*		A6 = DWT-ADDRESS 
* 
*	OUTPUT:	A1 = RETURN CODE
*		0 IF OK, NOT 0 IF ERROR
*		A2 = DESTROYED 
* 
******************************************************
* 
STAWRI	EQU	*
	CF	A15,NDSAV8	SAVE A3-A5, A7-A8 INTO DWT 
	CF	A15,CONPOS	CONVERT SCREEN POSITION
*			INTO SCREEN MEMORY DISPLACEMENT 
	CF	A15,IXTERM	INDEX SCREEN MEMORY DISPL. WITH TERM. NBR
	ST	A2,DWTLD1,A6	SAVE SCREEN MEMORY LOCATION
*			(=BIO FOR CIO START)
	CF	A15,CWTDWT	GET CWT FROM DWT 
	INH
	LD	A3,CWTDOS,A5	ANY DWT OCCUPYING SCREEN SECTION ? 
	RF(Z)	STAWR2	NO
STAWR1	EQU	*
	CF	A15,PUTQUE	PUT REQUESTING DWT INTO SCREEN QUEUE 
	ABL	TDISP	DISPATCH 
STAWR2	EQU	*
	ST	A6,CWTDOS,A5	OCCUPY SCREEN SECTION OF VCCU1/4 
	IFT	IOP=0
	RF	CLESC2	DO CIO START 
	XIF
	IFT	IOP=1
	CM	CWTBIN,A5	RESET INDEX IN IOP-BUFFER 
	ABL	NDREPO	POP REGISTERS, SET OK-STATUS AND RETURN 
	XIF
	EJECT
* 
****************************************************
* 
*	O U T C H A 
* 
****************************************************
* 
* 
*	CALL:	CF A5,OUTCHA
* 
*	USED BY:	SCREEN SECTION, DEVICE DRIVER PART 
* 
*	FUNCTION:TO OUTPUT ONE VIDEO CHARACTER
* 
*	INPUT:	A2 = ASCII-CHARACTER (/20-/7F) 
*		A6 = DWT-ADDRESS 
* 
*	OUTPUT:	A1 = RETURN CODE
*		      0 IF OK, NOT 0 IF ERROR
*		A2 = DESTROYED 
* 
******************************************************
* 
OUTCHA	EQU	*
	CF	A15,NDSAV8	SAVE A3-A5, A7-A8 INTO DWT 
* 
*	A 7-BIT ASCII-CHAR IS CONVERTED,
*	ACCORDING TO CHARACTER GENERATOR IN SYSTEM AND CURRENT DISPLAY MODE,
*	INTO A 11-BIT VIDEO-CHARACTER.
* 
	ANK	A2,/7F	CLEAR INSIGNIFICANT BITS
	LDK	A4,CODOUT-CODINP	LENGTH OF CONVERSION TABLE
OUTCH1	EQU	*
	SUK	A4,1	DECR INDEX IN TABLE. END OF TABLE ? 
	RF(N)	OUTCH2	YES 
	CC	A2,CODINP,A4	COMPARE CHAR WITH TABLE ELEMENT
	RB(NE)	OUTCH1	NOT EQUAL
	LC	A2,CODOUT,A4	CONVERT CHARACTER
OUTCH2	EQU	*
	LD	A3,DWTDEV,A6	GET DISPLAY-MODE 
	ANKL	A3,INTBIT+UNDBIT	BITS 
	ORR	A2,A3	INTO BIO 
* 
* 
	CF	A15,CWTDWT	GET CWT FROM DWT 
OUTCH3	EQU	*
	INH
	IFT	IOP=0
	EX	CWTOTS,A5	EXECUTE OTR ON SCREEN SECTION OF VCCU1/4
	ABL(NA)	LINER1	ERROR IF NOT ACCEPTED 
	ABL	TDISP	DISPATCH 
	XIF
	IFT	IOP=1
	LD	A3,CWTBIN,A5	GET WORD-INDEX IN IOP-BUFFER 
	ADR	A3,A3	CONVERT TO DISPLACEMENT IN BYTES 
	LDKL	A4,CWTBUF	GET ADDRESS TO IOP-BUFFER 
	ADR	A4,A5	IN CWT 
	ADR	A4,A3	INDEXING IN BUFFER 
	STR	A2,A4	STORE VIDEO-CHAR INTO IOP-BUFFER 
	IM	CWTBIN,A5	INCR BUFFER INDEX 
	ABL	NDREPO	POP REGISTERS, SET OK-STATUS AND RETURN 
	XIF
	EJECT
* 
****************************************************
* 
*	E N D W R I 
* 
***************************************************** 
* 
* 
*	CALL:	CF A5,ENDWRI
* 
*	USED BY:	SCREEN SECTION, DEVICE DRIVER PART 
* 
*	FUNCTION:TO END CURRENT CIO-WRITE-REQUEST 
* 
*	INPUT:	A6 = DWT-ADDRESS 
* 
*	OUTPUT:	A1 = RETURN CODE
*		     0 IF OK, NOT O IF ERROR 
*		A2 = DESTROYED 
* 
************************************************* 
* 
ENDWRI	EQU	*
	CF	A15,NDSAV8	SAVE A3-A5, A7-A8 INTO DWT 
	CF	A15,CWTDWT	GET CWT FROM DWT 
	INH
	IFT	IOP=0
	LDKL	A4,HLTFLA	FLAG HALT-ACTION REQUESTED
	ORS	A4,DWTST,A6	INTO DEVICE STATUS 
	ABL	IHS125	DO CIO HALT 
	XIF
	IFT	IOP=1
ENDWR1	EQU	*
	LD	A2,CWTBIN,A5	GET WORD-INDEX IN IOP-BUFFER 
	RF(NZ)	ENDWR2	INDEX NOT ZERO 
*	IF INDEX IS ZERO, THEN NO OUTPUT
	CM	CWTDOS,A5	SCREEN SECTION NO LONGER OCCUPIED 
	ABL	NDREPO	POP REGISTERS, SET OK-STATUS AND RETURN 
ENDWR2	EQU	*
	ORKL	A2,IOPPAR	WORD-MODE + READ-MEMORY TRANSFER
	EX	CWTWE1,A5	WRITE BUFFER LENGTH INTO IOP
	LDKL	A2,CWTBUF	GET ADDRESS TO IOP-BUFFER 
	ADR	A2,A5	IN CWT 
	EX	CWTWE2,A5	WRITE BUFFER ADDRESS INTO IOP 
	LDKL	A3,SSTFLA	FLAG SST-ACTION AT NEXT INTERRUPT 
	ORS	A3,DWTST,A6	INTO DEVICE STATUS 
	RF	CLESC2	DO CIO START 
	XIF
	EJECT
* 
*************************************************** 
* 
*	O U T C U R 
* 
*************************************************** 
* 
* 
*	CALL:	CF A5,OUTCUR
* 
*	USED BY:	SCREEN SECTION, DEVICE DRIVER PART 
* 
*	FUNCTION:TO OUTPUT THE VISUAL CURSOR
* 
*	INPUT:	A2 = REQUESTED  CURSOR POSITION ON SCREEN
*		      ( /0101 - /1850 )
*		A6 = DWT-ADDRESS 
* 
*	OUTPUT:	A1 = RETURN CODE
*		      0 IF OK, NOT 0 IF ERROR
*		A2 = DESTROYED 
* 
*************************************************** 
* 
OUTCUR	EQU	*
	CF	A15,NDSAV8	SAVE A3-A5, A7-A8 INTO DWT 
	CF	A15,CONPOS	CONVERT SCREEN POSITION
*			INTO SCREEN MEMORY DISPLACEMENT 
	CF	A15,IXTERM	INDEX SCREEN MEMORY DISPL. WITH TERM. NBR
	ST	A2,DWTLD2,A6	SAVE SCREEN MEMORY LOCATION
*			(=BIO FOR OTR)
	LDKL	A2,SMLCUR	SCREEN MEM.LOC. HOLDING CURSOR POS. 
	CF	A15,IXTERM	INDEX SCREEN MEMORY WITH TERMINAL NBR
	ST	A2,DWTLD1,A6	SAVE SCREEN MEMORY LOCATION
*			(=BIO FOR CIO-START)
	LDKL	A3,OTRFLA	FLAG OTR-ACTION AT NEXT INTERRUPT 
	ORS	A3,DWTST,A6	INTO DEVICE STATUS 
	CF	A15,CWTDWT	GET CWT FROM DWT 
	INH
	LD	A3,CWTDOS,A5	ANY DWT OCCUPYING SCREEN SECTION ? 
	RB(NZ)	STAWR1	YES. QUEUE REQUESTING DWT
OUTCU1	EQU	*
	ST	A6,CWTDOS,A5	OCCUPY SCREEN SECTION OF VCCU1/4 
	IFT	IOP=0
	RF	CLESC2	DO CIO START 
	XIF
	IFT	IOP=1
	LDKL	A3,OTRFLA	IF THEN RESET OTR-FLAG
	XRS	A3,DWTST,A6	IN DEVICE STATUS 
	LD	A3,DWTLD2,A6	GET SCREEN MEMORY CURSOR POSITION
OUTCU2	EQU	*
	ST	A3,CWTBUF,A5	STORE INTO IOP-BUFFER
	CM	CWTBIN,A5	RESET INDEX IN IOP-BUFFER 
	IM	CWTBIN,A5	INCR BUFFER INDEX 
	RB	ENDWR1	DO WER:S 
	XIF
	EJECT
* 
****************************************************
* 
*	C L E S C R 
* 
****************************************************
* 
* 
*	CALL:	CF A5,CLESCR
* 
*	USED BY:	SCREEN SECTION, DEVICE DRIVER PART 
* 
*	FUNCTION:TO CLEAR SCREEN, RESET CURSOR AND
*		RESET START WRITE POSITION.
* 
*	INPUT:	A6 = DWT-ADDRESS 
* 
*	OUTPUT:	A1 = RETURN CODE
*		       0 IF OK, NOT 0 OF ERROR 
*		A2 = DESTROYED 
* 
*************************************************** 
* 
CLESCR	EQU	*
	CF	A15,NDSAV8	SAVE A3-A5, A7-A8 INTO DWT 
	LDKL	A2,AUTCLE	SET BIO FOR AUTO-CLEAR
	CF	A15,IXTERM	INDEX WITH TERMINAL NUMBER 
	ST	A2,DWTLD1,A6	SAVE BIO FOR CIO START 
	LDKL	A3,HLTFLA	FLAG HALT-ACTION AT NEXT INTERRUPT
	ORS	A3,DWTST,A6	INTO DEVICE STATUS 
	CF	A15,CWTDWT	GET CWT FROM DWT 
	INH
	LD	A3,CWTDOS,A5	ANY DWT OCCUPYING SCREEN SECTION ? 
	RB(NZ)	STAWR1	YES. QUEUE REQUESTING DWT
CLESC1	EQU	*
	ST	A6,CWTDOS,A5	OCCUPY SCREEN SECTION OF VCCU1/4 
	IFT	IOP=1
	LDKL	A3,HLTFLA	RESET HALT-FLAG 
	XRS	A3,DWTST,A6	IN DEVICE STATUS 
	LDKL	A3,/0120	SPACE (HIGH-INTENSITY MODE)
	RB	OUTCU2	STORE INTO IOP-BUFFER AND DO WER:S 
	XIF
CLESC2	EQU	*
	LD	A3,PFPOST	GET POWER FAIL POST PROCESSING FLAG 
	ABL(NZ)	LINER5	FLAG SET: I/O-INSTRUCTIONS NOT ALLOWED. 
	LD	A2,DWTLD1,A6	GET BIO FOR CIO START
	EX	CWTCSS,A5	CIO START ON SCREEN SECTION OF VCCU1/4
	ABL(NA)	LINER0	ERROR IF NOT ACCEPTED 
CLESC3	EQU	*
	LD	A6,CWTSRD,A5	ANY SST-READY DWT ?
	ABL(Z)	TDISP	NO. DISPATCH
	CM	CWTSRD,A5	YES. RESET SAVE-AREA
	ABL	NDREPO	POP REGISTERS, SET OK-STATUS AND RETURN 
	EJECT
* 
***************************************************** 
* 
*	S C R E E N   S E C T I O N 
*	L I N E   D R I V E R   P A R T 
*	I N T E R R U P T   R O U T I N E S 
* 
***************************************************** 
* 
* 
*	ENTERED:	VIA THE INTERRUPT VECTOR 
* 
*	FUNCTIONS FOR EACH INTERRUPT ROUTINE: 
* 
*	1. SAVE START ADDRESS OF ENTERED INTERRUPT ROUTINE. 
*	2. SAVE A1-A8 ONTO STACK. 
*	3. GET CWT-ADDRESS FOR ENTERED INTERRUPT ROUTINE. 
*	4. GET THE DWT OCCUPYING THE SCREEN SECTION OF THIS CWT.
*	5. TEST CHANNEL UNIT STATUS.
*	6. TEST AND UPDATE INTERRUPT-ACTION-FLAGS,
*	   GO TO ERROR ROUTINE, OR: 
*	7. GO TO APROPRIATE ACTIVATION ROUTINE, 
*	   IN SCREEN SECTION LINE DRIVER PART,
*	   OR 
*	   GET DWT FROM OUTPUT QUEUE, 
*	   AND GO TO APROPRIATE ACTIVATION ROUTINE. 
* 
* 
* 
*	ON EXIT:	A5 = CWT-ADDRESS 
*		A6 = DWT-ADDRESS 
* 
*********************************************************** 
* 
* 
* 
	EJECT
* 
* 
*   INTERRUPT FROM SCREEN SECTION OF VCCU1/4 NO 1 
* 
IHSVU1	EQU	*
	IFT	VUCHAN=1 
IHSVU2	EQU	*
IHSVU3	EQU	*
IHSVU4	EQU	*
IHSVU5	EQU	*
IHSVU6	EQU	*
IHSVU7	EQU	*
IHSVU8	EQU	*
	XIF
	ST	P,INTSAV	SAVE LAST INTERRUPT
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1-A8 ON STACK 
	XIF
* 
	IFT	CPU852=0 
	MSR	8,A15	SAVE A1-A8 ON STACK
	XIF
* 
	LDKL	A5,CWTVU1	SET CWT-ADDRESS FOR VCCU1/4 NO 1
	IFF	VUCHAN=1 
	RF	IHS100
* 
*   INTERRUPT FROM SCREEN SECTION OF VCCU1/4 NO 2 
* 
IHSVU2	EQU	*
	XIF
	IFT	VUCHAN=2 
IHSVU3	EQU	*
IHSVU4	EQU	*
IHSVU5	EQU	*
IHSVU6	EQU	*
IHSVU7	EQU	*
IHSVU8	EQU	*
	XIF
	IFF	VUCHAN=1 
	ST	P,INTSAV	SAVE LAST INTERRUPT
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1-A8 ON STACK 
	XIF
* 
	IFF	VUCHAN=1 
	IFT	CPU852=0 
	MSR	8,A15	SAVE A1-A8 ON STACK
	XIF
* 
	IFF	VUCHAN=1 
	LDKL	A5,CWTVU2	SET CWT-ADDRESS FOR VCCU1/4 NO 2
	XIF
	IFT	VUCHAN=2 
IHS100	EQU	*
* 
	XIF
* 
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	RF	IHS100
* 
*   INTERRUPT FROM SCREEN SECTION OF VCCU1/4 NO 3 
* 
IHSVU3	EQU	*
	XIF
	IFT	VUCHAN=3 
IHSVU4	EQU	*
IHSVU5	EQU	*
IHSVU6	EQU	*
IHSVU7	EQU	*
IHSVU8	EQU	*
	XIF
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	ST	P,INTSAV	SAVE LAST INTERRUPT
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1-A8 ON STACK 
	XIF
* 
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFT	CPU852=0 
	MSR	8,A15	SAVE A1-A8 ON STACK
	XIF
* 
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	LDKL	A5,CWTVU3	SET CWT-ADDRESS FOR VCCU1/4 NO 3
	XIF
	IFT	VUCHAN=3 
IHS100	EQU	*
* 
	XIF
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	RF	IHS100
* 
*   INTERRUPT FROM SCREEN SECTION OF VCCU1/4 NO 4 
* 
IHSVU4	EQU	*
	XIF
	IFT	VUCHAN=4 
IHSVU5	EQU	*
IHSVU6	EQU	*
IHSVU7	EQU	*
IHSVU8	EQU	*
	XIF
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	ST	P,INTSAV	SAVE LAST INTERRUPT
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1-A8 ON STACK 
	XIF
* 
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	IFT	CPU852=0 
	MSR	8,A15	SAVE A1-A8 ON STACK
	XIF
* 
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	LDKL	A5,CWTVU4	SET CWT-ADDRESS FOR VCCU1/4 NO 4
	XIF
	IFT	VUCHAN=4 
IHS100	EQU	*
	XIF
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	IFF	VUCHAN=4 
	RF	IHS100
* 
*	INTERRUPT FROM SCREEN SECTION OF VCCU1/4 NO 5 
* 
IHSVU5	EQU	*
	XIF
	IFT	VUCHAN=5 
IHSVU6	EQU	*
IHSVU7	EQU	*
IHSVU8	EQU	*
	XIF
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	IFF	VUCHAN=4 
	ST	P,INTSAV	SAVE LAST INTERRUPT
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1 - A8 ON STACK 
	XIF
* 
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	IFF	VUCHAN=4 
	IFT	CPU852=0 
	MSR	8,A15	SAVE A1 - A8 ON STACK
	XIF
* 
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	IFF	VUCHAN=4 
	LDKL	A5,CWTVU5	SET CWT-ADDRESS FOR VCCU1/4 NO 5
	XIF
	IFT	VUCHAN=5 
IHS100	EQU	*
	XIF
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	IFF	VUCHAN=4 
	IFF	VUCHAN=5 
	RF	IHS100
* 
*	INTERRUPT FROM SCREEN SECTION OF VCCU1/4 NO 6 
* 
IHSVU6	EQU	*
	XIF
	IFT	VUCHAN=6 
IHSVU7	EQU	*
IHSVU8	EQU	*
	XIF
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	IFF	VUCHAN=4 
	IFF	VUCHAN=5 
	ST	P,INTSAV	SAVE LAST INTERRUPT
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1 - A8 ON STACK 
	XIF
* 
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	IFF	VUCHAN=4 
	IFF	VUCHAN=5 
	IFT	CPU852=0 
	MSR	8,A15	SAVE A1 - A8 ON STACK
	XIF
* 
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	IFF	VUCHAN=4 
	IFF	VUCHAN=5 
	LDKL	A5,CWTVU6	SET CWT-ADDRESS FOR VCCU1/4 NO 6
	XIF
	IFT	VUCHAN=6 
IHS100	EQU	*
	XIF
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	IFF	VUCHAN=4 
	IFF	VUCHAN=5 
	IFF	VUCHAN=6 
	RF	IHS100
* 
*	INTERRUPT FROM SCREEN SECTION OF VCCU1/4 NO 7 
* 
IHSVU7	EQU	*
	XIF
	IFT	VUCHAN=7 
IHSVU8	EQU	*
	XIF
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	IFF	VUCHAN=4 
	IFF	VUCHAN=5 
	IFF	VUCHAN=6 
	ST	P,INTSAV	SAVE LAST INTERRUPT
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1 - A8 ON STACK 
	XIF
* 
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	IFF	VUCHAN=4 
	IFF	VUCHAN=5 
	IFF	VUCHAN=6 
	IFT	CPU852=0 
	MSR	8,A15	SAVE A1 - A8 ON STACK
	XIF
* 
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	IFF	VUCHAN=4 
	IFF	VUCHAN=5 
	IFF	VUCHAN=6 
	LDKL	A5,CWTVU7	SET CWT-ADDRESS FOR VCCU1/4 NO 7
	XIF
	IFT	VUCHAN=7 
IHS100	EQU	*
	XIF
	IFT	VUCHAN=8 
	RF	IHS100
* 
*	INTERRUPT FROM SCREEN SECTION OF VCCU1/4 NO 8 
* 
IHSVU8	EQU	*
	ST	P,INTSAV	SAVE LAST INTERRUPT
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1 - A8 ON STACK 
	XIF
* 
	IFT	VUCHAN=8 
	IFT	CPU852=0 
	MSR	8,A15	SAVE A1 - A8 ON STACK
	XIF
* 
	IFT	VUCHAN=8 
	LDKL	A5,CWTVU8	SET CWT-ADDRESS FOR VCCU1/4 NO 8
IHS100	EQU	*
	XIF
	EJECT
* 
* 
* 
*	COMMON PART FOR ALL SCREEN SECTION LINE DRIVER INTERRUPT ROUTINES 
* 
* 
	LD	A6,CWTDOS,A5	GET DWT OCCUPYING SCREEN SECTION OF CWT
	ABL(Z)	LINER4	IF NOT OCCUPYED: CIO HALT+SST+DISPATCH 
IHS110	EQU	*
	EX	CWTSST,A5	EXECUTE SST ON SCREEN SECTION OF VCCU1/4
	RF(NA)	IHS120	NOT ACCEPTED 
	LD	A3,DWTST,A6	GET DEVICE STATUS 
	ANKL	A3,SSTFLA	TEST SST-ACTION FLAG
	ABL(Z)	LINER3	ERROR IF NOT SET 
* 
*	END OF CIO-REQUEST
* 
	XRS	A3,DWTST,A6	RESET SST-ACTION FLAG
	ST	A6,CWTSRD,A5	SAVE SST-READY DWT 
	CM	CWTDOS,A5	SCREEN SECTION NO LONGER OCCUPYED 
* 
*	GET AND CHECK QUEUED DWT
* 
	CF	A15,GETQUE	GET QUEUED DWT FROM SCREEN QUEUE 
	ADK	A6,0	ANY QUEUED DWT ?
	RB(Z)	CLESC3	NO. GET SAVED SST-READY DWT 
	LD	A3,DWTST,A6	YES. GET DEVICE STATUS
	LDR	A4,A3	 
	ANKL	A4,HLTFLA	TEST HALT-ACTION FLAG 
	RB(NZ)	CLESC1	IF SET: CLEAR WAS QUEUED 
	ANKL	A3,OTRFLA	TEST OTR-ACTION FLAG
	ABL(NZ)	OUTCU1	IF SET: OUTPUT CURSOR WAS QUEUED
	ABL	STAWR2	ELSE: WRITE SCREEN WAS QUEUED 
	EJECT
* 
*	SST NOT ACCEPTED
* 
IHS120	EQU	*
	LD	A3,DWTST,A6	GET DEVICE STATUS 
	LDR	A4,A3	 
	ANKL	A4,SSTFLA	TEST SST-ACTION FLAG
	ABL(NZ)	LINER2	ERROR IF SET
	LDR	A4,A3	 
	ANKL	A4,HLTFLA	TEST HALT-ACTION FLAG 
	RF(Z)	IHS130	NOT SET 
* 
*	HALT-FLAG IS SET. DO CIO HALT.
* 
IHS125	EQU	*
	XRS	A4,DWTST,A6	RESET HALT-ACTION FLAG 
	EX	CWTCHS,A5	CIO HALT ON SCREEN SECTION OF VCCU1/4 
	LDKL	A3,SSTFLA	FLAG SST-ACTION REQUESTED 
	ORS	A3,DWTST,A6	INTO DEVICE STATUS 
	RB	IHS110	DO SST 
IHS130	EQU	*
	ANKL	A3,OTRFLA	TEST OTR-ACTION FLAG
	ABL(Z)	NDREPO	POP REGISTERS, SET OK-STATUS AND RETURN
* 
*	OTR-FLAG IS SET: DO OTR-CURSOR. 
* 
	XRS	A3,DWTST,A6	RESET OTR-ACTION FLAG
	LDKL	A3,HLTFLA	FLAG HALT-ACTION AT NEXT INTERRUPT
	ORS	A3,DWTST,A6	INTO DEVICE STATUS 
	LD	A2,DWTLD2,A6	GET BIO FOR OTR-CURSOR 
	ABL	OUTCH3	DO OTR-CURSOR 
	EJECT
* 
****************************************************
* 
*	S C R E E N   S E C T I O N 
*	L I N E   D R I V E R   P A R T 
*	E R R O R   R O U T I N E S 
* 
***************************************************** 
* 
* 
*	-LINER0	CIO START NOT ACCEPTED
*	-LINER1	OTR NOT ACCEPTED
*	-LINER2	SST NOT ACCEEPTED 
*	-LINER3	SST UNEXPECTEDLY ACCEPTED (AFTER CIO START OR OTR,
*		BUT BEFORE CIO HALT) 
*	-LINER4	UNEXPECTED INTERRUPT
*	-LINER5	I/O-INSTRUCTIONS TRIED DURING POWER FAIL POST PROCESSING
* 
* 
	EJECT
* 
************************************************* 
* 
*	L I N E R X   ( X = 0,1,2,3,4,5 ) 
* 
************************************************* 
* 
* 
*	CALL:	ABL LINERX  ( X = 0,1,2,3,4,5 ) 
* 
*	USED BY:	SCREEN SECTION, LINE DRIVER PART 
* 
*	FUNCTION:1.TO RESET VCCU1/4 CONTROL UNIT SCREEN SECTION 
*		 AFTER I/O-ERROR, (LINER0-4) 
*		2. INDICATE THE ERROR IN THE RETURN CODE 
*		AND RETURN TO DEVICE DRIVER PART 
*		 VIA NETWORK DISTRIBUTOR (LINER0-3, LINER5)
*		3. DISPATCH. (LINER4)
* 
*	INPUT:	A5 = CWT-ADDRESS 
*		A6 = DWT-ADDRESS (IF LINER0-3) 
* 
*	OUTPUT:	A1 = RETURN CODE (IF LINER0-3, LINER5)
*		      /8000 IF LINER0
*		      /4000 IF LINER1
*		      /2000 IF LINER2
*		      /1000 IF LINER3
*		      /0800 IF LINER5
* 
*********************************************** 
* 
LINER0	EQU	*
	LDKL	A1,CIOERR	SET STATUS BIT 0
LINERR	EQU	*
	EX	CWTCHS,A5	CIO HALT ON SCREEN SECTION OF VCCU1/4 
	EX	CWTSST,A5	SST ON SCREEN SECTION OF VCCU1/4
LINERP	EQU	*
	CM	CWTDOS,A5	SCREEN SECTION NO LONGER OCCUPYED 
	LDKL	A3,OTRFLA+HLTFLA	GET ACTION-FLAGS 
	ADKL	A3,SSTFLA	ALL ACTION-FLAGS
	C1R	A3,A3	COMPLEMENT 
	ANS	A3,DWTST,A6	RESET ALL ACTION-FLAGS 
	ABL	NDREP	POP REGISTERS AND RETURN WITH A1=STATUS
* 
LINER1	EQU	*
	LDKL	A1,OTRERR	SET STATUS BIT 1
	RB	LINERR	 
* 
LINER2	EQU	*
	LDKL	A1,SSTERR	SET STATUS BIT 2
	RB	LINERR	 
* 
LINER3	EQU	*
	LDKL	A1,SSTER2	SET STATUS BIT 3
	RB	LINERR	 
* 
LINER4	EQU	*	UNEXPECTED INTERRUPT 
	EX	CWTCHS,A5	CIO HALT ON SCREEN SECTION OF VCCU1/4 
	EX	CWTSST,A5	SST ON SCREEN SECTION OF VCCU1/4
	ABL	TDISP	DISPATCH 
* 
LINER5	EQU	*	I/O-INSTRUCTIONS TRIED DURING PFPOST 
	LDKL	A1,PFERR	SET STATUS BIT 4 
	RB	LINERP
	EJECT
* 
************************************************* 
* 
*	S C R E E N   S E C T I O N 
*	L I N E   D R I V E R   P A R T 
*	S U B - R O U T I N E S 
* 
************************************************
* 
* 
*	-CONPOS	CONVERT SCREEN POSITION INTO SCREEN MEMORY DISPLACEMENT 
*	-IXTERM	INDEX SCREEN MEMORY DISPLACEMENT WITH TERMINAL NUMBER 
*	-CWTDWT	GET CWT-ADDRESS FROM DWT-ADDRESS
*	-PUTQUE	PUT DWT INTO SCREEN OUTPUT QUEUE
*	-GETQUE	GET DWT FROM SCREEN OUTPUT QUEUE
* 
* 
	EJECT
* 
********************************************************* 
* 
*	C O N P O S 
* 
********************************************************* 
* 
* 
*	CALL:	CF A15,CONPOS 
* 
*	USED BY:	SCREEN SECTION, LINE DRIVER PART 
* 
*	FUNCTION:TO CONVERT A SCREEN POSITION 
*		INTO A SCREEN MEMORY DISPLACEMENT
* 
*	INPUT:	A2 = BITS 0-7: SCREEN POSITION ROW NUMBER 1-24 HEXADECIMAL 
*		      BITS 8-15: SCREEN POSITION COLUMN NUMBER 1-80 HEXADECIMAL
* 
*	OBS:	NO CHECK IS MADE HERE, THAT INPUT IS WITHIN /0101-/1850
* 
*	OUTPUT:	A2 = SCREEN MEMORY DISPLACEMENT /0000-/077F 
*		A3 = DESTROYED 
* 
********************************************************* 
* 
CONPOS	EQU	*
	SUKL	A2,/0101	SCREEN HOME POSITION IS DEFINED /0101
	LDR	A3,A2	SAVE INPUT 
	ANK	A2,/FF	GET MODULO 80 
*	MULTIPLY (LINENUMBER-1) WITH 80 (=64+16)
	ANKL	A3,/FF00	ALREADY MULTIPLIED WITH 256
	SRL	A3,2	NOW ONLY MULTIPLIED WITH 64 
	ADR	A2,A3	ADD
	SRL	A3,2	NOW ONLY MULTIPLIED WITH 16 
	ADR	A2,A3	ADD
	RTN	A15	RETURN 
	EJECT
* 
********************************************************* 
* 
*	I X T E R M 
* 
********************************************************* 
* 
* 
*	CALL:	CF A15,IXTERM 
* 
*	USED BY:	SCREEN SECTION, LINE DRIVER PART 
* 
*	FUNCTION:TO INDEX A SCREEN MEMORY DISPLACEMENT
*		WITH THE TERMINAL NUMBER OF CURRENT DWT
* 
*	INPUT:	A2 = SCREEN MEMORY DISPLACEMENT
*		A6 = DWT-ADDRESS 
* 
*	OUTPUT:	A2 = SCREEN MEMORY LOCATION 
*		A3 = DESTROYED 
* 
******************************************************* 
* 
IXTERM	EQU	*
	LD	A3,DWTCP2,A6	GET CHANNEL PARAMETERS 2 
	ANKL	A3,/300	GET TERMINAL NUMBER (0-3) 
	SLL	A3,3	INTO BITS 3 AND 4 
	ORR	A2,A3	COMBINE WITH SCREEN MEMORY DISPLACEMENT
	RTN	A15	RETURN 
	EJECT
* 
********************************************************* 
* 
*	C W T D W T 
* 
********************************************************* 
* 
* 
*	CALL:	CF A15,CWTDWT 
* 
*	USED BY:	SCREEN SECTION, LINE DRIVER PART 
* 
*	FUNCTION:TO GET THE CWT-ADDRESS FOR THE CWT USED BY CURRENT DWT 
* 
*	INPUT:	A6 = DWT-ADDRESS 
* 
*	OUTPUT:	A5 = CWT-ADDRESS
*		NO DESTROYED REGISTERS 
* 
************************************************************* 
* 
CWTDWT	EQU	*
	LDR*	A5,A6	GET DWTCHP-CONTENTS 
	ANK	A5,/F	BITS 12-15 = CHANNEL UNIT INDEX
	ADR	A5,A5	GET CWTTAB-DISPLACEMENT FROM INDEX 
	ADK	A5,2	SKIP TABLE LENGTH ITEM
	LD	A5,CWTTAB,A5	GET CWT-ADDRESS INTO A5
	RTN	A15	RETURN 
	EJECT
* 
**************************************************************
* 
*	P U T Q U E 
* 
************************************************************* 
* 
* 
*	CALL:	CF A15,PUTQUE 
* 
*	USED BY:	SCREEN SECTION, LINE DRIVER PART 
* 
*	FUNCTION:TO QUEUE A DWT LAST IN SCREEN ECHO OUTPUT QUEUE, 
*		IF DWT IN ECHO MODE, ELSE LAST IN SCREEN LKM OUTPUT QUEUE. 
* 
*	INPUT:	A5 = CWT-ADDRESS 
*		A6 =DWT-ADDRESS
* 
*	OUTPUT:	A3,A4,A7 = DESTROYED
* 
*********************************************************** 
* 
PUTQUE	EQU	*
* 
*	SELECT ECHO- OR LKM-QUEUE 
* 
	LD	A7,DWTST,A6	GET DEVICE STATUS 
	ANKL	A7,/2000	DEVICE IN ECHO MODE ?
	RF(Z)	PUTQ05	NO
	LDKL	A7,CWTSEQ	GET SCREEN ECHO OUTPUT QUEUE
	RF	PUTQ07	 
PUTQ05	EQU	*
	LDKL	A7,CWTSLQ	GET SCREEN LKM OUTPUT QUEUE 
PUTQ07	EQU	*
	ADR	A7,A5	ANCHOR 
* 
*	QUEUE DWT INTO SELECTED QUEUE 
* 
	LDR*	A4,A7	GET FIRST QUEUED DWT. QUEUE EMPTY ? 
	RF(Z)	PUTQ20	YES 
PUTQ10	EQU	*
	CWR	A6,A4	CURRENT DWT ALREADY IN QUEUE ? 
	RF(E)	PUTQ60	YES 
	LD	A3,DWTOTQ,A4	GET DWT NEXT IN QUEUE
	RF(Z)	PUTQ30	END OF QUEUE FOUND
	LDR	A4,A3	FOLLOW THE QUEUE 
	RB	PUTQ10
PUTQ20	EQU	*
	STR	A6,A7	QUEUE DWT, IF QUEUE WAS EMPTY
	RF	PUTQ40	 
PUTQ30	EQU	*
	ST	A6,DWTOTQ,A4	QUEUE DWT, IF QUEUE WAS NOT EMPTY
PUTQ40	EQU	*
	CM	DWTOTQ,A6	SET END OF QUEUE
PUTQ60	EQU	*
	IFT	CPU852=1 
	ABL	IHRTN	RETURN IN INHIBIT MODE 
	XIF
	IFT	CPU852=0 
	RTN	A15	RETURN 
	XIF
	EJECT
* 
***************************************************** 
* 
*	G E T Q U E 
* 
***************************************************** 
* 
* 
*	CALL:	CF A15,GETQUE 
* 
*	USED BY:	SCREEN SECTION, LINE DRIVER PART 
* 
*	FUNCTION:TO GET FIRST DWT FROM SCREEN ECHO OUTPUT QUEUE,
*		OR, IF ECHO OUTPUT QUEUE IS EMPTY, 
*		FROM SCREEN LKM OUTPUT QUEUE.
* 
*	INPUT:	A5 = CWT-ADDRESS 
* 
*	OUTPUT:	A6 = DWT-ADDRESS (OR 0 IF NO DWT IN QUEUES) 
*		A3 = DESTROYED 
* 
***************************************************** 
* 
GETQUE	EQU	*
	LD	A6,CWTSEQ,A5	GET FIRST DWT FROM ECHO OUTPUT QUEUE 
	RF(Z)	GETQ10	ECHO QUEUE EMPTY
	LD	A3,DWTOTQ,A6	GET QUEUE LINK 
	ST	A3,CWTSEQ,A5	STORE IT INTO CWT
	RF	GETQ30	 
GETQ10	EQU	*
	LD	A6,CWTSLQ,A5	GET FIRST DWT FROM LKM OUTPUT QUEUE
	RF(Z)	GETQ30	ALSO LKM QUEUE EMPTY
	LD	A3,DWTOTQ,A6	GET QUEUE LINK 
	ST	A3,CWTSLQ,A5	STORE IT INTO CWT
GETQ30	EQU	*
	IFT	CPU852=1 
	ABL	IHRTN	RETURN IN INHIBIT MODE 
	XIF
	IFT	CPU852=0 
	RTN	A15	RETURN 
	XIF
	EJECT
* 
****************************************************
* 
*	P E R I P H E R A L   S E C T I O N 
*	L I N E   D R I V E R   P A R T 
*	A C T I V A T I O N   R O U T I N E S 
* 
********************************************************* 
* 
*	FOR THE PERIPHERAL SECTION OF THE VCCU1/4 
*	THIS DRIVER IS A LINE-DRIVER ONLY,
*	WHICH IS USED BY SEPARATE TERMINAL DEVICE DRIVERS.
*	BELOW APPEARS THOSE ACTIVATION ROUTINES WHICH ARE USING THE 
*	PERIPHERAL SECTION OF THE VCCU1/4.
*	THE ACTIVATION ROUTINES ARE CALLED FROM TERMINAL DEVICE DRIVERS 
*	VIA THE NETWORK DISTRIBUTOR.
* 
* 
********************************************************
* 
*   CHARACTER INPUT 
* 
VUCHRI	EQU	*
	LDK	A2,/20 
	ORS	A2,DWTST,A6	SET INPUT REQUESTED IN DWT 
	CF	A15,NDSAV8	SAVE A3-A5, A7-A8 IN DWT 
	RF	VUDISP	VIDEO DISPATCHER 
* 
*   START OF A BLOCK
* 
VUSTBL	EQU	*
* 
*   END OF A BLOCK
* 
VUENBL	EQU	*
	ABL	NDRETO	RETURN TO DEVICE DRIVER. STATUS = OK. 
* 
*   VIDEO DISPATCHER
* 
VUDISP	EQU	*
	ABL	TDISP	GO TO DISPATCHER 
* 
* 
*   CHARACTER OUTPUT
* 
VUCHRO	EQU	*
	EJECT
* 
******************************************************* 
* 
* 
*    FUNCTIONS: 
* 
*	1. SAVE A1-A8 ONTO STACK
*	2. INHIBIT INTERRUPTS 
*	3. COMPUTE CWT FROM DWT 
*	4. TEST IF PERIPHERAL SECTION OUTPUT QUEUE IS EMPTY 
*	5.      IF NOT THEN TEST IF DWT IS ALREADY IN CWT OUTPUT QUEUE, 
*	                        FOR PERIPHERAL SECTION
*	                         IF NOT THEN QUEUE THE DWT LAST IN QUEUE, 
*	                          STORE OUTPUT-CHARACTER INTO QUEUED DWT, 
*	                          AND THEN DISPATCH.
*	                          ELSE: 
*	7.                        STORE OUTPUT-CHAR INTO ALREADY QUEUED DWT,
*	                          AND THEN DISPATCH.
*	               ELSE:
*	8.             PREPARE TO SEND THE CHAR TO THE CHANNEL
*	9.             TEST IF THE DWT IS FOR DEVICE ON PERIPHERAL
*	               SECTION ON CHANNEL.
*	                    IF NOT THEN NO OUTPUT,
*	                           ELSE:
*	10.                           OUTPUT CHARACTER. 
*	11.           IF OTR ACCEPTED 
*	                     STORE INTO DWT THE CHAR BEING OUTPUT 
*	                        AND RETURN TO DEVICE DRIVER.
*	12.            IF CHAR NOT ACCEPTED BY CHANNEL THEN 
*	                        TEST IF CWT OUTPUT QUEUE IS EMPTY.
*	                        IF SO THEN: 
*	13. 
*	                       START TIMER
*	                           AND SET OUTPUT QUEUE TIMER POINTER IN CWT. 
*	14.                        GO QUEUE DWT INTO CWT OUTPUT QUEUE 
*	                           AND DISPATCH.(5-7) 
* 
* 
* 
*     ON ENTRY: 
* 
*     A2 = OUTPUT CHARACTER IN RIGHT BYTE 
*     A6 = DWT-ADDRESS
************************************************************
* 
* 
* 
	EJECT
OUTPER	EQU	*
	CF	A15,NDSAV8	SAVE A3-A5, A7-A8 IN DWT 
* 
*	GET CWT FOR THIS DWT
* 
	INH		INHIBIT INTERRUPT 
	LDR*	A1,A6	CHANNEL PARAMETER 
	ANK	A1,/F	CHANNEL INDEX
	SLL	A1,1 
	ADK	A1,2 
	LD	A5,CWTTAB,A1	GET CWT-ADDRESS INTO A5
	RB(Z)	VUDISP	 IF NO CWT: DISPATCH
* 
*	TEST IF PERIPHERAL SECTION OUTPUT QUEUE IS EMPTY
* 
	LD	A4,CWTPQ,A5	IS OUTPUT QUEUE EMPTY ? 
	RF(NZ)	PER560	NO. THEN QUEUE DWT AND DISPATCH
	EJECT
* 
*    PREPARE TO SEND CHARACTER
* 
PER500	EQU	*
	LD	A3,DWTCP2,A6	GET CHANNEL PARAMETERS 2 
	LDR	A4,A3
	ANK	A3,/3	DEVICE ADDRESS 
* 
*	TEST IF THE DEVICE IS ON THE PERIPHERAL SECTION OF CHANNEL
* 
	SUK	A3,1	DEVICE-ADDRESS = 0 ?
	RF(N)	PER520	IF SO, NO OUTPUT
	SUK	A3,2	DEVICE-ADDRESS = 3 ?
	RF(Z)	PER520	IF SO, NO OUTPUT
* 
*	IF NOT POWER FAIL POST PROCESSING, THEN 
*	SEND CHARACTER TO CHANNEL 
* 
	ADK	A3,2	COMPUTE DEVICE-ADDRESS FOR BIO
	SRC	A3,6 
	ANKL	A4,/300	TERMINAL NUMBER 
	ORR	A3,A4	COMBINE DEV.ADDR. AND TERMINAL NUMBER
	ANK	A2,/FF 
	ORR	A2,A3	BIO IS READY-MADE
	LD	A3,PFPOST	GET POWER FAIL POST PROCESSING FLAG 
	RF(NZ)	PER510	FLAG SET: I/O-INSTRUCTIONS NOT ALLOWED.
	EX	CWTOTP,A5	EXECUTE OTR ON PERIPHERAL SECTION 
	RF(NA)	PER510	OTR NOT ACCEPTED 
* 
*	OTR IS ACCEPTED.
*	SAVE OUTPUT CHARACTER INTO DWT, 
*	THEN RETURN TO DEVICE DRIVER. 
* 
	SC	A2,DWTOCH,A6	SAVE OUTPUT
	ABL	NDREPO	POP REGISTERS,SET OK-STATUS AND RETURN
* 
*	OTR IS NOT ACCEPTED.
*	TEST IF PERIPHERAL SECTION OUTPUT QUEUE IS EMPTY. 
* 
PER510	EQU	*
	LD	A4,CWTPQ,A5	IS OUTPUT QUEUE EMPTY ? 
	RF(NZ)	PER560	NO. THEN ONLY QUEUE DWT, AND DISPATCH. 
* 
*	OUTPUT QUEUE IS EMPTY, THEN 
*	1.START TIMER (AND SET TIMER POINTER).
*	2.QUEUE DWT.
*	3.DISPATCH
* 
* 
PER520	EQU	*
	LDKL	A4,CWTTP	TIMER POINTER
	ADR	A4,A5	ADD WITH CWT-ADDRESS 
	LDR	A1,A5	PARAMETER (=CWT-ADDRESS) INTO A1 
	CF	A15,SETIMP	GET TIMER BLOCK
	DATA	TIMOUT,QUETIM	ADDRESS TO TIME-OUT ROUTINE AND DELAY 
	RF	PER570	QUEUE DWT WHEN QUEUE WAS EMPTY 
	EJECT
* 
*    QUEUE OUTPUT 
*	WHEN QUEUE NOT EMPTY (A4 POINTS TO FIRST QUEUED DWT)
* 
PER560	CWR	A6,A4
	RF(E)	PER600	THIS DWT IS ALREADY IN PERIPHERAL QUEUE 
	LD	A3,DWTOTQ,A4	GET DWT NEXT IN PERIPHERAL QUEUE 
	RF(Z)	PER580	END OF QUEUE FOUND
	LDR	A4,A3	FOLLOW THE QUEUE 
	RB	PER560
* 
*	QUEUE OUTPUT WHEN QUEUE IS EMPTY
* 
PER570	ST	A6,CWTPQ,A5	QUEUE DWT, IF QUEUE WAS EMPTY 
	RF	PER590
PER580	ST	A6,DWTOTQ,A4	QUEUE DWT, IF QUEUE WAS NOT EMPTY
PER590	CM	DWTOTQ,A6	SET END OF QUEUE
PER600	EQU	*
	SC	A2,DWTOCH,A6	STORE CHARACTER INTO DWT 
	RB	VUDISP	DISPATCH 
* 
	EJECT
* 
******************************************* 
* 
*	P E R I P H E R A L   S E C T I O N 
*	L I N E   D R I V E R   P A R T 
*	I N T E R R U P T   H A N D L E R 
* 
********************************************
* 
*	FOR THE PERIPHERAL SECTION OF THE VCCU1/4 
*	THIS DRIVER IS A LINE DRIVER ONLY, WHICH IS USED BY 
*	SEPARATE TERMINAL DEVICE DRIVERS. 
*	BELOW APPEARS THE INTERRUPT HANDLING ROUTINES,
*	USING THE PERIPHERAL SECTION OF THE VCCU1/4.
*	THE ROUTINES ARE OF TWO KINDS:
* 
*	1. INTERRUPT HANDLER FOR DATA INPUT.
*	   THEESE INTERRUPT ROUTINES ARE ENTERED VIA THE INTERRUPT VECTOR.
* 
*	2. INTERRUPT HANDLER FOR DATA OUTPUT. 
*	   THIS INTERRUPT ROUTINE IS ENTERED FROM THE MONITOR CLOCK ROUTINE,
*	   AT SOFTWARE TIME-OUT.
* 
	EJECT
* 
* 
****************************************************
*   THIS IS THE INTERRUPT HANDLER FOR 
*   DATA INPUT TO THE PERIPHERAL SECTION OF VCCU1/4.
******************************************************* 
* 
* 
* 
*    ENTERED: 
*	    VIA THE INTERRUPT VECTOR. 
* 
* 
*    FUNCTIONS FOR EACH INTERRUPT ROUTINE:
* 
*	1. SAVE START ADDRESS OF ENTERED ROUTINE
*	2. SAVE A1-A8 ONTO STACK
*	3. GET CWT-ADDRESS FOR ENTERED INTERRUPT ROUTINE
*	4. GET THE DATA INPUT FROM CHANNEL UNIT 
*	5. COMPUTE DWT FROM DATA INPUT
*	 IF NO DWT EXISTS THEN EXIT,
*	 ELSE:
*	6. TEST IF STATUS- OR DATA-INPUT
*	   IF STATUS-INPUT: INCREMENT ERROR ACKUMULATOR IN CWT AND THEN EXIT, 
*	   ELSE 
*	7. TEST IF DWT BELONGS TO INPUT-DEVICE. 
*	        IF NOT THEN EXIT, 
*	        ELSE: 
*	8.      TEST IF INPUT REQUESTED OR NOT
*	   IF INPUT REQUESTED: RETURN TO DEVICE DRIVER VIA NETWORK DISTRIBUTOR
*	        ELSE: 
*	9.      TEST IF ANY INTERRUPT ROUTINE DEFINED FOR THIS DEVICE 
*	             IF NOT THEN EXIT 
*	            ELSE: 
*	    ENTER DEVICE DEPENDANT INTERRUPT HANDLER. 
* 
* 
* 
*	ON EXIT:
*	        A2 = INPUT CHARACTER IN RIGHT BYTE
*	        A6 = DWT ADDRESS
* 
****************************************************
* 
* 
*   INTERRUPT FROM PERIPHERAL SECTION OF VCCU1/4 NO 1 
* 
IHPVU1	EQU	*
	IFT	VUCHAN=1 
IHPVU2	EQU	*
IHPVU3	EQU	*
IHPVU4	EQU	*
IHPVU5	EQU	*
IHPVU6	EQU	*
IHPVU7	EQU	*
IHPVU8	EQU	*
	XIF
	ST	P,INTSAV	SAVE LAST INTERRUPT
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1-A8 ON STACK 
	XIF
* 
	IFT	CPU852=0 
	MSR	8,A15	SAVE A1-A8 ON STACK
	XIF
* 
	LDKL	A5,CWTVU1	SET CWT-ADDRESS FOR VCCU1/4 NO 1
	IFT	VUCHAN=1 
	EX	CWTINR,A5	EXECUTE INR INSTRUCTION 
* 
	XIF
	IFF	VUCHAN=1 
	RF	IHP100
* 
*   INTERRUPT FROM PERIPHERAL SECTION OF VCCU1/4 NO 2 
* 
IHPVU2	EQU	*
	XIF
	IFT	VUCHAN=2 
IHPVU3	EQU	*
IHPVU4	EQU	*
IHPVU5	EQU	*
IHPVU6	EQU	*
IHPVU7	EQU	*
IHPVU8	EQU	*
	XIF
	IFF	VUCHAN=1 
	ST	P,INTSAV	SAVE LAST INTERRUPT
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1-A8 ON STACK 
	XIF
* 
	IFF	VUCHAN=1 
	IFT	CPU852=0 
	MSR	8,A15	SAVE A1-A8 ON STACK
	XIF
* 
	IFF	VUCHAN=1 
	LDKL	A5,CWTVU2	SET CWT-ADDRESS FOR VCCU1/4 NO 2
	XIF
	IFT	VUCHAN=2 
IHP100	EX	CWTINR,A5	EXECUTE INR-INSTRUCTION 
* 
	XIF
* 
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	RF	IHP100
* 
*   INTERRUPT FROM PERIPHERAL SECTION OF VCCU1/4 NO 3 
* 
IHPVU3	EQU	*
	XIF
	IFT	VUCHAN=3 
IHPVU4	EQU	*
IHPVU5	EQU	*
IHPVU6	EQU	*
IHPVU7	EQU	*
IHPVU8	EQU	*
	XIF
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	ST	P,INTSAV	SAVE LAST INTERRUPT
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1-A8 ON STACK 
	XIF
* 
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFT	CPU852=0 
	MSR	8,A15	SAVE A1-A8 ON STACK
	XIF
* 
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	LDKL	A5,CWTVU3	SET CWT-ADDRESS FOR VCCU1/4 NO 3
	XIF
	IFT	VUCHAN=3 
IHP100	EX	CWTINR,A5	EXECUTE INR 
* 
	XIF
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	RF	IHP100
*   INTERRUPT FROM PERIPHERAL SECTION OF VCCU1/4 NO 4 
* 
IHPVU4	EQU	*
	XIF
	IFT	VUCHAN=4 
IHPVU5	EQU	*
IHPVU6	EQU	*
IHPVU7	EQU	*
IHPVU8	EQU	*
	XIF
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	ST	P,INTSAV	SAVE LAST INTERRUPT
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1-A8 ON STACK 
	XIF
* 
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	IFT	CPU852=0 
	MSR	8,A15	SAVE A1-A8 ON STACK
	XIF
* 
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	LDKL	A5,CWTVU4	SET CWT-ADDRESS FOR VCCU1/4 NO 4
	XIF
	IFT	VUCHAN=4 
IHP100	EX	CWTINR,A5	EXECUTE INR 
	XIF
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	IFF	VUCHAN=4 
	RF	IHP100
* 
*	INTERRUPT FROM PERIPHERAL SECTION OV VCCU1/4 NO 5 
* 
IHPVU5	EQU	*
	XIF
	IFT	VUCHAN=5 
IHPVU6	EQU	*
IHPVU7	EQU	*
IHPVU8	EQU	*
	XIF
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	IFF	VUCHAN=4 
	ST	P,INTSAV	SAVE LAST INTERRUPT
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1 - A8 ON STACK 
	XIF
* 
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	IFF	VUCHAN=4 
	IFT	CPU852=0 
	MSR	8,A15	SAVE A1 - A8 ON STACK
	XIF
* 
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	IFF	VUCHAN=4 
	LDKL	A5,CWTVU5	SET CWT-ADDRESS FOR VCCU1/4 NO 5
	XIF
	IFT	VUCHAN=5 
IHP100	EX	CWTINR,A5	EXECUTE INR 
	XIF
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	IFF	VUCHAN=4 
	IFF	VUCHAN=5 
	RF	IHP100
* 
*	INTERRUPT FROM PERIPHERAL SECTION OF VCCU1/4 NO 6 
* 
IHPVU6	EQU	*
	XIF
	IFT	VUCHAN=6 
IHPVU7	EQU	*
IHPVU8	EQU	*
	XIF
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	IFF	VUCHAN=4 
	IFF	VUCHAN=5 
	ST	P,INTSAV	SAVE LAST INTERRUPT
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1 - A8 ON STACK 
	XIF
* 
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	IFF	VUCHAN=4 
	IFF	VUCHAN=5 
	IFT	CPU852=0 
	MSR	8,A15	SAVE A1 - A8 ON STACK
	XIF
* 
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	IFF	VUCHAN=4 
	IFF	VUCHAN=5 
	LDKL	A5,CWTVU6	SET CWT-ADDRESS FOR VCCU1/4 NO 6
	XIF
	IFT	VUCHAN=6 
IHP100	EX	CWTINR,A5	EXECUTE INR 
	XIF
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	IFF	VUCHAN=4 
	IFF	VUCHAN=5 
	IFF	VUCHAN=6 
	RF	IHP100
* 
*	INTERRUPT FROM PERIPHERAL SECTION OF VCCU1/4 NO 7 
* 
IHPVU7	EQU	*
	XIF
	IFT	VUCHAN=7 
IHPVU8	EQU	*
	XIF
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	IFF	VUCHAN=4 
	IFF	VUCHAN=5 
	IFF	VUCHAN=6 
	ST	P,INTSAV	SAVE LAST INTERRUPT
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1 - A8 ON STACK 
	XIF
* 
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	IFF	VUCHAN=4 
	IFF	VUCHAN=5 
	IFF	VUCHAN=6 
	IFT	CPU852=0 
	MSR	8,A15	SAVE A1 - A8 ON STACK
	XIF
* 
	IFF	VUCHAN=1 
	IFF	VUCHAN=2 
	IFF	VUCHAN=3 
	IFF	VUCHAN=4 
	IFF	VUCHAN=5 
	IFF	VUCHAN=6 
	LDKL	A5,CWTVU7	SET CWT-ADDRESS FOR VCCU1/4 NO 7
	XIF
	IFT	VUCHAN=7 
IHP100	EX	CWTINR,A5	EXECUTE INR 
	XIF
	IFT	VUCHAN=8 
	RF	IHP100
* 
*	INTERRUPT FROM PERIPHERAL SECTION OF VCCU1/4 NO 8 
* 
IHPVU8	EQU	*
	ST	P,INTSAV	SAVE LAST INTERRUPT
	IFT	CPU852=1 
	CF	A15,SAVE8	SAVE A1 - A8 ON STACK 
	XIF
* 
	IFT	VUCHAN=8 
	IFT	CPU852=0 
	MSR	8,A15	SAVE A1 - A8 ON STACK
	XIF
* 
	IFT	VUCHAN=8 
	LDKL	A5,CWTVU8	SET CWT-ADDRESS FOR VCCU1/4 NO 8
IHP100	EX	CWTINR,A5	EXECUTE INR 
	XIF
	EJECT
* 
* 
*	DETERMINE FROM INPUT: TERMINAL NUMBER AND DEVICE ADDRESS
*	THEN COMPUTE DWT-ADDRESS
* 
	LDR	A6,A2	GET INPUT-WORD (BIO) 
	ANKL	A6,TERMNR	GET TERMINAL NBR WITHIN CHANNEL 
	SRL	A6,8	
	LDR	A7,A2	GET INPUT WORD 
	ANKL	A7,DEVADR	GET DEVICE ADDR WITHIN TERMINAL 
	SRL	A7,/A	 
	ADK	A7,1 
	LD*	A1,CWTITA,A5	GET ADDR TO WORKSTATION TABLE 
	CF	A15,NDGEDW	GET DWT ADDRESS INTO A6
	ADK	A6,0	DWT ADDRESS FOUND ? 
	ABL(Z)	VUDISP	NO. THEN EXIT
* 
*	TEST IF STATUS- OR DATA-INPUT 
* 
	LDR	A3,A2	SAVE INPUT-WORD
	ANK	A2,INDATA	CLEAN INPUT-WORD 
	ANKL	A3,INSTAT	STATUS INPUT ?
	RF(Z)	IHP150	NO
* 
*	STATUS  INPUT 
* 
	IM	CWTACK,A5	INCR ERROR ACKUMULATOR
	ABL	VUDISP	EXIT
* 
*	DATA INPUT
* 
IHP150	EQU	*
	LD	A7,DWTST,A6	DEVICE STATUS 
	ANK	A7,/60	MASK INPUT DEV. AND INPUT REQ.
	SUK	A7,/40 
	RF(Z)	IHP160	INPUT DEV. BUT NO INPUT REQUESTED 
	ABL(N)	VUDISP	NO INPUT-DEVICE. THEN EXIT.
* 
*	INPUT DEV. WITH INPUT REQUESTED 
* 
	LDKL	A7,/FFDF
	ANS	A7,DWTST,A6	RESET FLAG 'INPUT REQUESTED' 
	LDK	A1,0	RESET INDICATOR OF MORE THAN 1 CHAR 
	ABL	NDREP	RETURN TO DEVICE DRIVER
* 
* 
*   GO TO INTERRUPT ROUTINE OF DEVICE DRIVER
* 
IHP160	EQU	*
	LD	A1,DWTADR,A6	ADDRESS BLOCK
	LD	A1,INTADR,A1	INTERRUPT ENTRY DEFINED? 
	ABL(Z)	VUDISP	NO, SKIP CHARACTER 
	LDR	A5,A6	DWT ADDRESS
	ADKL	A5,DWTSB2	STACK BASE
	ABR	A1	DEVICE DRIVER INTERRUPT ENTRY 
	EJECT
* 
******************************************
*   THIS IS THE INTERRUPT HANDLER FOR 
*   DATA OUTPUT TO THE PERIPHERAL SECTION OF THE VCCU1/4. 
***************************************************** 
* 
* 
*	ENTERED:
*              VIA THE MONITOR CLOCK TIME-OUT ROUTINE.
* 
* 
*    FUNCTIONS: 
* 
*	1. GET FIRST QUEUED DWT FOR PERIPHERAL SECTION OUTPUT PART OF THIS CWT
*	   IF QUEUE EMPTY THEN: 
*	2.	RESET OUTPUT QUEUE TIMER POINTER IN CWT, 
*	           AND DISPATCH.
*	               ELSE:
*	3.             GET,FROM THAT FIRST QUEUED DWT, THE CHAR TO BE OUTPUT, 
*	               REMOVE THE DWT FROM CWT PERIPHERAL SECTION OUTPUT QUEUE
*	              IF OUTPUT QUEUE IS STILL NOT EMPTY
*	            THEN:  RESTART TIMER
*	              ELSE: 
*	4.
*	                RESET OUTPUT QUEUE TIMER POINTER IN CWT.
*	5.      GO OUTPUT CHARACTER.
* 
* 
*   ON ENTRY: 
*	 A1 = TIME-OUT PARAMETER (CWT-ADDRESS)
* 
*    ON EXIT: 
*	A2 = CHARACTER TO BE OUTPUT 
*	A5 = CWT ADDRESS
*	A6 = DWT ADDRESS
* 
**********************************************
* 
TIMOUT	EQU	*
	LDR	A5,A1	CWT-ADDRESS INTO A5
* 
*    CHECK PERIPHERAL SECTION  OUTPUT QUEUE FOR THIS CWT
* 
	LD	A6,CWTPQ,A5	GET NEXT DWT FROM OUTPUT QUEUE
	RF(NZ)	TIM200	QUEUE NOT EMPTY
* 
*	PERIPHERAL SECTION OUTPUT QUEUE IS EMPTY AT THE TIMEOUT!
* 
	CM	CWTTP,A5	RESET POINTER TO TIMER BLOCK 
	ABL	VUDISP	DISPATCH
* 
*	PERIPHERAL SECTION OUTPUT QUEUE IS NOT EMPTY AT THE TIMEOUT.
*	GET QUEUED DWT AND TEST IF QUEUE IS EMPTY NOW.
* 
TIM200	EQU	*
	LD	A3,DWTOTQ,A6	GET QUEUE LINK 
	ST	A3,CWTPQ,A5	STORE IT INTO CWT 
	RF(Z)	TIM210	NOW QUEUE IS EMPTY
* 
*	QUEUE STILL NOT EMPTY: RESTART TIMER. 
* 
	LDKL	A3,-QUETIM	TIMEOUT VALUE
	ST*	A3,CWTTP,A5	INTO TIMER BLOCK 
	RF	TIM220	GO OUTPUT ONE CHARACTER
* 
*	NOW QUEUE IS EMPTY
* 
TIM210	EQU	*
	CM	CWTTP,A5	RESET POINTER TO TIMER BLOCK 
* 
*	GET AND SEND ONE CHARACTER
* 
TIM220	EQU	*
	LC	A2,DWTOCH,A6	GET CHARACTER FROM DWT 
	ABL	PER500	GO SEND CHARACTER 
	EJECT
* 
*************************************************************** 
* 
*	L I N E   D R I V E R   R E C O V E R Y   R O U T I  N E
*	C O M M O N   T O 
*	S C R E E N   A N D   P E R I P H E R A L   S E C T I O N S . 
* 
***************************************************************** 
* 
*   V U O N 
* 
*	SUBROUTINE TO RESTART THE VIDEO CHANNEL UNITS AT POWER ON 
****************************************************
* 
* 
*	CALL:	CF A15,VUON 
* 
*	
*	USED BY:	'PFINIT' 
* 
*	FUNCTIONS:
* 
*	1. SWITCH TO LEVEL 8, RUN-MODE, INH-MODE. 
*	2. TEST IF ALL CHANNELS IN SYSTEM HAVE BEEN TREATED.
*	   IF SO THEN ENABLE INTERRUPTS AND RETURN FROM SUBROUTINE, 
*	   ELSE:
*	3. GET CWT FOR NEXT CHANNEL.
*	  IF NO CWT DEFINED THEN CONTINUE IN 2, 
*	  ELSE: 
*	4. CIO START INPUT ON PERIPHERAL SECTION OF CHANNEL 
*	5. RESET DATA AREAS USED BY SCREEN AND PERIPHERAL SECTIONS, 
*	   LINE DRIVER PART.
*	6. FOR EACH TERMINAL ON THE CHANNEL 
*	        CALL DEVICE DEPENDANT RECOVERY ROUTINE
*	                         VIA NETWORK DISTRIBUTOR
*	7. CONTINUE IN 2. 
* 
******************************************************* 
* 
* 
*	SWITCH TO LEVEL 8 (LOWER THAN LEVEL OF ANY VCCU1/4 ON ANY CPU,
*		HIGHER THAN LEVEL OF POWER FAIL OR DC) 
* 
VUON	EQU	*
	LDKL	A2,VUON05	GET LEVEL 8 START ADDRESS 
	STR	A2,A15	STORE ONTO A15-STACK
	LDKL	A2,PONPSW	GET NEW PSW 
	STR	A2,A15	STORE ONTO A15-STACK
	RTN	A15	ENTER LEVEL 8
VUON05	EQU	*
	IFT	CPU852=1 
	INH
	XIF
* 
*	LOOP OVER ALL CWT:S IN CWTTAB 
* 
	LD	A1,CWTTAB 
VUON10	SUK	A1,2	ALL CWT:S TREATED ? 
	RF(NZ)	VUON20	NO TAKE NEXT 
* 
*	RETURN AND ENABLE INTERRUPTS AND SWITCH BACK TO LEVEL 0.
* 
	LDK	A1,/40	BIT FOR ENABLE MODE 
	ORS	A1,2,A15	INTO PSW ON STACK 
	RTN	A15	RETURN 
* 
*	GET CWT 
* 
VUON20	LD	A5,CWTTAB,A1	LOAD CWT-ADDRESS 
	RB(Z)	VUON10	NO CWT ADDRESS
* 
*	CIO START INPUT 
* 
	EX	CWTCSP,A5	EXECUTE CIO-START PERIPHERAL (INPUT)
	EJECT
* 
*	RESET DATA AREAS
*	USED BY SCREEN AND PERIPHERAL SECTIONS
*	LINE DRIVER PART
* 
	LDK	A4,OTRFLA+HLTFLA	GET ACTION-FLAGS
	ADKL	A4,SSTFLA	ALL ACTION FLAGS
	C1R	A4,A4	COMPLEMENT 
	LD	A6,CWTDOS,A5	ANY DWT OCCUPYING SCREEN SECTION ? 
	RF(NZ)	VUON25	YES. GO RESET DWTST BITS 11,12,13. 
VUON22	EQU	*
	CF	A15,GETQUE	GET QUEUED DWT FROM SCREEN QUEUE 
	ADK	A6,0	ANY (MORE) QUEUED DWT ? 
	RF(Z)	VUON27	NO. SCREEN QUEUE EMPTY
VUON25	EQU	*
	ANS	A4,DWTST,A6	RESET ALL ACTION-FLAGS 
	RB	VUON22	GET NEXT (QUEUED) DWT
VUON27	EQU	*
	CM	CWTDOS,A5	RESET INDICATOR OF DWT OCCUPYING SCREEN 
	CM	CWTSRD,A5	RESET INDICATOR SST-READY DWT (SCREEN)
	CM	CWTPQ,A5	RESET OUTPUT QUEUE ON PERIPH. SECTION
* 
* 
*	PREPARE LOOP OVER ALL TERMINALS ON THE CHANNEL
* 
	LD*	A3,CWTITA,A5	GET ADDRESS TO WORK-STATION TABLE 
	RB(Z)	VUON10	NO ADDRESS DEFINED IN TABLE 
	LDK	A6,0	RESET TERMINAL NUMBER 
* 
*	START DEVICE DRIVER RECOVERY FOR ALL TERMINALS ON THE CHANNEL 
* 
VUON30	EQU	*
	LDK	A4,TCPON	INDICATE RECOVERY CAUSE 
	CF	A15,NDREWS	CALL RECOVERY FOR THIS WORK-STATION
*			(=TERMINAL) 
	ADK	A6,1	NEXT TERMINAL 
	CWK	A6,MAXTVU	ANY MORE TERMINAL ON THIS CHANNEL ?
	RB(L)	VUON30	YES 
	RB	VUON10	NO 
* 
* 
* 
	END

Full view