	.TITLE	DZD


;	* * * ID-2000 DEVICE HANDLER FOR RT-11 V02 (DMA) * * *


;	DE ANZA SYSTEMS, INCORPORATED

;	ALL NEW CODE: 13 APRIL 77
;	MODIFICATIONS INCORPORATING DMA: 21 JULY 78
;	REVISIONS TO: 19 OCTOBER 78

;	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.

;	NOTE: JOYSTICK INTERRUPTS ARE FLAGGED AS ERRORS.
	.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 (DMA SYSTEM)

	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
	.PAGE
;	DMA REGISTERS

	DAWC	= 166040	; WORD COUNT
	DABA	= 166042	; BUS ADDRESS
	DACS	= 166044	; CONTROL/STATUS

;	DMA OPERATION CODES

	DMARD	= 504		; READ WITH INTERRUPT AND CYCLE
	DMAWR	= 502		; WRITE WITH INTERRUPT AND CYCLE

;	INTERRUPT FLAGS

	DRDY	= 20000		; DISPLAY SYSTEM
	WCZ	= 10000		; WORD COUNT ZERO (DMA)
	JYKN	= 4000		; JOYSTICK/KNOB (CURRENTLY ERRONEOUS)
	.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),BUFF	; PICK UP BUFFER POINTER
	MOV	6(R0),WCNT	; 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	WCNT	; WORD COUNT POSITIVE ?
	BPL	DZRAM0	; YES, SHOW READ
	NEG	WCNT	; NO, NEGATE WORD COUNT
	BR	DZRAM1	; AND PROCEED
DZRAM0:	INC	MFLAG	; SHOW READ OPERATION REQUEST
DZRAM1:	MOV	MFLAG,R4
	SUB	#2,R4	; OPERATION TYPE ?
	BEQ	WRITE	; IF WRITE
READ:	MOV	#DMARD,DMAMOD	; PREPARE FOR READ OPERATION
	BR	TSTITT		; GO CHECK ON ITT TRANSFER
WRITE:	MOV	#DMAWR,DMAMOD	; PREPARE FOR WRITE OPERATION
TSTITT:	JSR	PC,ITTXF	; GO TEST FOR ITT TRANSFERS

DMAXFR:	MOV	WCNT,@#DAWC	; SET WORD COUNT
	MOV	DMAMOD,@#DACS	; SET OPERATION CODE, CYCLE, INTERRUPT ENABLE
	MOV	BUFF,@#DABA	; SET BUFFER STARTING ADDRESS
	BIS	#1,@#DACS	; INITIATE DMA TRANSFER
	RTS	PC		; AND GO AWAY TO AWAIT INTERRUPT
	.PAGE
IMAGE:	MOV	BUFF,R5		; PICK UP BUFFER POINTER
	MOV	(R5)+,@#YREG	; Y-REGISTER TO DISPLAY
	MOV	(R5)+,@#BPMR	; BIT-PLANE MASK TO DISPLAY
	MOV	(R5)+,R4	; PICK UP CONTROL/STATUS
	MOV	R5,BUFF		; RESTORE UPDATED BUFFER POINTER
	BIS	#GO,R4	; AND WITH GO AND INTERRUPT
	MOV	R4,CSRSAV	; SAVE FOR FUTURE REFERENCE
	CLR	MFLAG	; SET MODE FOR IMAGE WRITE
	TST	WCNT	; WORD COUNT POSITIVE ?
	BPL	DZIM0	; YES, SET FOR IMAGE READ
	NEG	WCNT	; NO, NEGATE WORD COUNT
	BR	DZIM1	; AND PROCEED
DZIM0:	INC	MFLAG	; FLAG FOR IMAGE READ
DZIM1:	TST	MFLAG	; WRITE MODE ?
	BEQ	WRITE	; YES, START WRITING OPERATION
	MOV	#DMARD,DMAMOD	; PREPARE FOR READ OPERATION
	MOV	#READBK,R4	; PICK UP READBACK WITH INTERRUPT CODE
	BIS	CSRSAV,R4	; INCLUDE CONTROL BITS SUPPLIED
	MOV	R4,@#CSR	; INITIATE READBACK OPERATION
	BIS	#100,@#DACS	; ENABLE DMA INTERRUPT
	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
	MOV	@#DACS,R5	; PICK UP DMA CSR CONTENTS
	CLR	@#DACS		; CLEAR DMA CSR FLAGS
	BIT	#DRDY,R5	; DISPLAY READY ?
	BEQ	DZINT2		; NO, GO CHECK WORD COUNT ZERO
	BIT	#1,MFLAG	; WRITE OPERATION ?
	BNE	DZINT3		; NO, GO CHECK FOR IMAGE READ
	BIT	#2,MFLAG	; YES, IS IT AN IMAGE WRITE ?
	BNE	DZINT4		; NO, GO START DMA TRANSFER
	BR	DZHOME		; YES, RETURN TO MONITOR

;	WORD COUNT ZERO INTERRUPT PROCESSING:

DZINT2:	BIT	#1,MFLAG	; WRITE OPERATION ?
	BNE	DZHOME		; NO, RETURN TO MONITOR
	BIT	#2,MFLAG	; YES, IS IT AN IMAGE WRITE ?
	BNE	DZHOME		; NO, RETURN TO MONITOR
	MOV	CSRSAV,@#CSR	; YES, ENABLE BUFFER TO IMAGE TRANSFER
	BIS	#100,@#DACS	; ENABLE DMA INTERRUPT
	RTS	PC		; AND GO AWAY TO AWAIT INTERRUPT

DZINT3:	BIT	#2,MFLAG	; IMAGE READ OPERATION ?
	BNE	DZINT4		; NO, SKIP BIT 9 RESET
	BIC	#1000,XADDR	; RESET BIT 9 FOR BUFFER/CPU TRANSFER

;	BUFFER TO CPU TRANSFER AFTER IMAGE REFRESH TO BUFFER,
;	OR ITT TRANSFER AFTER AWAITING VERTICAL INTERVAL:

DZINT4:	MOV	XADDR,@#XREG	; INITIALIZE DISPLAY X
	BR	DMAXFR		; GO INITIATE DMA TRANSFER

ERROR:	MOV	DZCQE,R5	; PICK UP CURRENT Q ENTRY POINTER
	BIS	#HDERR,@-(R5)	; SOMETHING IS VERY WRONG
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

BUFF:	.BLKW	1	; BUFFER STARTING ADDRESS
CSRSAV:	.BLKW	1	; COMPLETE CONTROL/STATUS REGISTER
DMAMOD:	.BLKW	1	; DMA OPERATION CODE
MFLAG:	.BLKW	1	; TRANSFER MODE FLAG
WCNT:	.BLKW	1	; TRANSFER BLOCK LENGTH
XADDR:	.BLKW	1	; DISPLAY SYSTEM INITIAL X-ADDRESS
	.PAGE
	.SBTTL	SUBROUTINE FOR MINIMIZING ITT TRANSFER VISIBILITY


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
	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
	BIS	#100,@#DACS	; ENABLE DMA INTERRUPT
ITTXF3:	RTS	PC	; GO AWAY TO AWAIT INTERRUPT

INTPTR:	.WORD	0	; MONITOR ENTRY ADDRESS

	DZSIZE	=.-DZSTRT	; HANDLER SIZE

	.END
                                                                                                                                                                                                                                                                                                                    