	.TITLE	DE ANZA 2000 SERIES HANDLER

;	DE ANZA SYSTEMS, INCORPORATED

;	ALL NEW CODE: APRIL 13, 1977
;	REVISIONS TO: DECEMBER 21, 1977
;		      NOVEMBER 8, 1978  (N.I.H. W.RISSO)
;	              November 20, 1981 - Test for ready removed from ITTXF

;	PROGRAMMER: KEN DINWIDDIE

;	IMPLEMENTS BI-DIRECTIONAL 16-BIT WORD TRANSFERS BETWEEN
;	DIGITAL EQUIPMENT CORPORATION 11 SERIES COMPUTERS
;	OPERATING WITH THE RT-11 OPERATING SYSTEM AND
;	DE ANZA SYSTEMS, INCORPORATED 2000 SERIES IMAGE DISPLAY SYSTEMS.

;	TRANSFERS OF TWO DIFFERENT TYPES ARE PROVIDED:

;		(1) READ/WRITE TO ANNOTATION OR INTENSITY TRANSFORMATION
;		TABLE - STARTING BLOCK NUMBER SPECIFIES X-ADDRESS > 1777.

;		(2) READ/WRITE TO IMAGE REFRESH MEMORY - STARTING BLOCK
;		NUMBER SPECIFIES X-ADDRESS 0-1777; FIRST THREE WORDS OF
;		BUFFER CONTAIN Y-REGISTER, BIT-PLANE MASK REGISTER AND
;		CONTROL/STATUS REGISTER RESPECTIVELY. A MAXIMUM OF
;		256 WORDS MAY BE TRANSFERRED PER TYPE 2 CALL.
	.PAGE
	.SBTTL	HANDLER DEFINITIONS

	.MCALL	..V2..,.REGDEF
	.MCALL	.DRBEG,.DRAST,.DRFIN,.DREND,.QELDF

	..V2..

;	REGISTER DEFINITION

	.REGDEF

;	QUEUE ELEMENT DEFINITIONS

	.QELDF

;	RT-11 MONITOR DEFINED CONSTANTS

	MONLOW	=54	; MONITOR BASE POINTER
	OFFSET	=270	; POINTER TO Q MANAGER COMPLETION ENTRY
	HDERR	=1	; HARD ERROR BIT

; 	PRIORITY CONSTANTS

	PR7	=340	; HANDLER ENTERED AT PRIORITY 7
	PR6	=300	; HANDLER RUNS AT PRIORITY 6

;	ID-2000 COMMUNICATION CONSTANTS

	GO	=101	; TRANSFER AND INTERRUPT ENABLE
	READBK	=117	; READBACK AND INTERRUPT ENABLE
	DZVEC	=234	; INTERRUPT VECTOR ADDRESS (UDC11 VECTOR)

;	ID-2000 CONTROL REGISTERS

	XREG	=166000	; X-REGISTER ADDRESS
	YREG	=166002	; Y-REGISTER ADDRESS                  GT-40 
	BPMR	=166004	; BIT-PLANE MASK REGISTER ADDRESS   BOOTSTRAP
	CSR	=166006	; CONTROL/STATUS REGISTER ADDRESS     AREA!!
	DREG	=166010	; DATA REGISTER ADDRESS

;	LSI-11 IDENTIFICATION FLAG

	LSI11	= 1	; ASSEMBLE FOR THE LSI-11

;	DEFAULT SYSTEM BUILD PARAMETERS

	.IIF NDF MMG$T,MMG$T = 0
	.IIF NDF ERL$G,ERL$G = 0
	.IIF NDF TIM$IT,TIM$IT = 0

;	DEVICE STATUS INFORMATION

	DZDSIZ = 20000		;DEVICE "SIZE" IN 256 WD. "BLOCKS".
	DZSTS  = 100024		;BLOCK STRUCTURED, #24
	.PAGE
	.SBTTL	ID-2000 DEVICE HANDLER

       	.DRBEG	DZ,DZVEC,DZDSIZ,DZSTS
	MOV	DZCQE,R0	; PICK UP POINTER
	MOV	(R0),XADDR	; PICK UP X-ADDRESS
	MOV	4(R0),R5	; PICK UP BUFFER POINTER
	MOV	6(R0),R3	; PICK UP WORD COUNT
	MOV	XADDR,@#XREG	; X-ADDRESS TO X-REGISTER
	CMP	XADDR,#2000
	BMI	IMAGE	; IMAGE REFRESH TRANSFER IF < 2000
	MOV	#2,MFLAG	; SET FLAG TO WRITE
	TST	R3	; WORD COUNT POSITIVE ?
	BPL	DZRAM0	; YES, SHOW READ
	NEG	R3	; NO, NEGATE WORD COUNT
	BR	DZRAM1	; AND PROCEED
DZRAM0:	INC	MFLAG	; SHOW READ OPERATION REQUEST
DZRAM1:	JSR	PC,TCALC	; CALCULATE TRANSFER PARAMETERS
	MOV	MFLAG,R4
	SUB	#2,R4	; OPERATION TYPE ?
	BEQ	WRIT16	; IF WRITE
	.PAGE
READ16:	MOV	XFINIT,RD16-2	; PICK UP INITIAL OFFSET
	.IF	EQ,LSI11-1
	BIS	#1000,@#CSR	; PREPARE TO READ DATA REGISTER
	BIS	#1000,CSRSAV	; IF DUMMY READ REQUIRED  FOR ITT
	.ENDC
	JMP	0(PC)	; START INITIAL READ
RD16:	.REPT	20
	MOV	@#DREG,(R5)+	; TRANSFER WORD FROM DISPLAY
	.ENDR
	DEC	XFREPT	; ACCOUNT FOR TRANSFER
	JSR	PC,ITTXF	; GO TEST FOR ITT TRANSFER
RD16I:	TST	XFREPT	; MORE BLOCKS TO READ ?
	BNE	RD16	; IF SO, ATTEND TO IT
	.IF	EQ,LSI11-1
	BIC	#1000,@#CSR	; RETURN TO WRITE DATA REGISTER MODE
	BIC	#1000,CSRSAV	; AND RESTORE SAVED CSR CODE ALSO
	.ENDC
	BR	DZHOME	; GO RETURN TO MONITOR Q MANAGER
	.PAGE
WRIT16:	MOV	XFINIT,WR16-2	; PICK UP INITIAL OFFSET
	JMP	0(PC)	; START INITIAL WRITE
WR16:	.REPT	20
	MOV	(R5)+,@#DREG	; TRANSFER WORD TO DISPLAY
	.ENDR
	DEC	XFREPT	; ACCOUNT FOR TRANSFER
	JSR	PC,ITTXF	; GO TEST FOR ITT TRANSFER
WR16I:	TST	XFREPT	; MORE BLOCKS TO WRITE ?
	BNE	WR16	; IF SO ATTEND TO IT
	TST	MFLAG	; IMAGE WRITE ?
	BNE	DZHOME	; NO, GO RETURN TO MONITOR Q MANAGER
	MOV	CSRSAV,@#CSR	; ENABLE TRANSFER WITH INTERRUPT
	RTS	PC	; GO AWAY FOR I/O
	.PAGE
IMAGE:	MOV	(R5)+,@#YREG	; Y-REGISTER TO DISPLAY
	MOV	(R5)+,@#BPMR	; BIT-PLANE MASK TO DISPLAY
	MOV	(R5)+,R4	; PICK UP CONTROL/STATUS
	BIS	#GO,R4	; AND WITH GO AND INTERRUPT
	MOV	R4,CSRSAV	; SAVE FOR FUTURE REFERENCE
	CLR	MFLAG	; SET MODE FOR IMAGE WRITE
	TST	R3	; WORD COUNT POSITIVE ?
	BPL	DZIM0	; YES, SET FOR IMAGE READ
	NEG	R3	; NO, NEGATE WORD COUNT
	BR	DZIM1	; AND PROCEED
DZIM0:	INC	MFLAG	; FLAG FOR IMAGE READ
DZIM1:	JSR	PC,TCALC	; CALCULATE TRANSFER PARAMETERS
	TST	MFLAG	; WRITE MODE ?
	BEQ	WRIT16	; YES, START WRITING OPERATION
	MOV	#READBK,R4	; PICK UP READBACK WITH INTERRUPT CODE
	BIS	CSRSAV,R4	; INCLUDE CONTROL BITS SUPPLIED
	MOV	R4,@#CSR	; INITIATE READBACK OPERATION
	MOV	R5,R5SAV	; SAVE CURRENT BUFFER POINTER
	RTS	PC	; AND GO AWAY TO AWAIT INTERRUPT
	.PAGE
	.SBTTL	INTERRUPT PROCESSING ROUTINE

	.DRAST	DZ,6,DZHOME
	TST	MFLAG	; WRITE IMAGE MODE ?
	BEQ	DZHOME	; IF SO, WE'RE DONE
	MOV	R5SAV,R5	; RESTORE R5
	MOV	MFLAG,R4
	DEC	R4	; READ IMAGE MODE ?
	BEQ	IMRD	; YES, GO DO IT
	MOV	SAVX,@#XREG	; RESTORE DISPLAY X-REGISTER
	DEC	R4	; WRITE ITT MODE ?
	BEQ	WR16I	; YES, GO DO IT
	DEC	R4	; READ ITT MODE ?
	BEQ	RD16I	; YES, GO DO IT
	MOV	DZCQE,R5	; PICK UP CURRENT Q ENTRY POINTER
	BIS	#HDERR,@-(R5)	; SOMETHING IS VERY WRONG
	BR	DZHOME	; RETURN TO MONITOR Q MANAGER
IMRD:	MOV	XADDR,R4	; PICK UP X-ADDRESS
	BIC	#1000,R4	; CLEAR BIT 9, IF SET
	MOV	R4,@#XREG	; SET X-REGISTER IN DISPLAY
	JMP	READ16	; AND GO READ DATA FROM DISPLAY BUFFER
	.PAGE
DZHOME:	.DRFIN	DZ

;	TEMPORARY STORAGE LOCATIONS

MFLAG:	.WORD	0	; TRANSFER MODE FLAG
XFINIT:	.WORD	0	; INITIAL OFFSET INTO TRANSFER INSTRUCTIONS
XFREPT:	.WORD	0	; TRANSFER BLOCK CYCLE COUNT
XADDR:	.WORD	0	; STORAGE FOR INITIAL X-ADDRESS
R5SAV:	.WORD	0	; STORAGE FOR R5 (CURRENT BUFFER POINTER)
CSRSAV:	.WORD	0	; STORAGE FOR COMPLETE CONTROL/STATUS REGISTER
SAVX:	.WORD	0	; STORAGE FOR INTERIM X-REGISTER
	.PAGE
	.SBTTL	SUBROUTINES

TCALC:	MOV	R3,R4
	BIC	#177760,R4	; SAVE LEAST-SIGNIFICANT 4 BITS
	CLC
	ROL	R4
	ROL	R4	; MULTIPLY BY 4
	MOV	#100,R0
	SUB	R4,R0	; DETERMINE STARTING OFFSET INTO TRANSFERS
	MOV	R0,XFINIT	; SAVE FOR FUTURE REFERENCE
	ASR	R3
	ASR	R3
	ASR	R3
	ASR	R3	; DIVIDE BY 16
	INC	R3	; ADD 1 FOR FIRST CYCLE
	MOV	R3,XFREPT	; AND SAVE FOR FUTURE REFERENCE
	RTS	PC
	.PAGE
ITTXF:	BIT	#10000,XADDR	; ITT TRANSFER ?
	BNE	ITTXF1		; Yes, go perform dummy readback
	RTS	PC		; NO, RETURN
ITTXF1:	TST	(SP)+	; PUSH STACK POINTER UP ONE NOTCH
	MOV	R5,R5SAV	; SAVE CURRENT BUFFER POINTER
	MOV	@#XREG,SAVX	; SAVE CURRENT X-ADDRESS
	CLR	@#YREG	; POINT TO LINE ZERO IN DISPLAY
	CLR	@#XREG	; POINT TO START OF DISPLAY BUFFER
	MOV	#READBK,R5	; PICK UP READBACK WITH INTERRUPT CODE
	BIS	CSRSAV,R5	; INCLUDE PREVIOUS CONTROL BITS
	BIC	#40,R5		; CLEAR ZERO BIT IF SET (DO NOT SET "V" BITS)
	MOV	R5,@#CSR	; ENABLE READBACK WITH INTERRUPT
	RTS	PC	; GO AWAY TO AWAIT INTERRUPT

	.DREND	DZ

	.END
                                                                                                                                                                                                                             