	.TITLE	DE ANZA 2000 SERIES HANDLER

;	DE ANZA SYSTEMS, INCORPORATED

;	ALL NEW CODE: APRIL 13, 1977
;	REVISIONS TO: DECEMBER 21, 1977
;	ORTEC ADDRESSES: MAY 16, 1978

;	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

	..V2..

;	REGISTER DEFINITION

	.REGDEF

;	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

;	ID-2000 CONTROL REGISTERS (ORTEC VERSION)

	XREG	=166020	; X-REGISTER ADDRESS
	YREG	=166022	; Y-REGISTER ADDRESS
	BPMR	=166024	; BIT-PLANE MASK REGISTER ADDRESS
	CSR	=166026	; CONTROL/STATUS REGISTER ADDRESS
	DREG	=166030	; DATA REGISTER ADDRESS

;	LSI-11 IDENTIFICATION FLAG

	LSI11	=0	; ASSEMBLE FOR THE PDP-11
	.PAGE
	.SBTTL	ID-2000 DEVICE HANDLER

DZSTRT:		; LOAD POINT

	.WORD	DZVEC	; ADDRESS OF INTERRUPT VECTOR
	.WORD	DZINT-.	; OFFSET TO INTERRUPT ROUTINE
	.WORD	PR7	; PRIORITY 7
DZLQE:	.WORD	0	; POINTER TO LAST Q ENTRY
DZCQE:	.WORD	0	; POINTER TO CURRENT Q ENTRY
	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

	BR	DZHOME	; ABORT BRANCH FOR F/B MONITOR
DZINT:	JSR	R5,@INTPTR	; NOTIFY MONITOR AND
	.WORD	^C<PR6>&PR7	; SET PRIORITY TO LEVEL 6
	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:	MOV	PC,R4	
	ADD	#DZCQE-.,R4	; PIC ADDRESS OF CURRENT Q ENTRY
	MOV	@#MONLOW,R5
	JMP	@OFFSET(R5)	; EXIT TO MONITOR QUEUE COMPLETION

;	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, TEST READY BIT IN DISPLAY CSR
	RTS	PC	; NO, RETURN
ITTXF1:	TSTB	@#CSR	; READY BIT SET ?
	BPL	ITTXF2	; NO, GO PREPARE FOR IT
	RTS	PC
ITTXF2:	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
	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
ITTXF3:	RTS	PC	; GO AWAY TO AWAIT INTERRUPT

INTPTR:	.WORD	0	; MONITOR ENTRY ADDRESS

	DZSIZE	=.-DZSTRT	; HANDLER SIZE

	.END
                                                                                                                                                          