	.TITLE	CURSRD


;	* * * CURSOR OPTION SOFTWARE MODULE (WITH DMA ALSO) * * *
 
 
;	PROVIDES FORTRAN-COMPATIBLE SOFTWARE-ONLY COMMUNICATION WITH THE
;	DE ANZA SYSTEMS, INC. CG-201 DUAL CURSOR GENERATOR.

;	THE SUBROUTINE MAY BE INVOKED WITH EITHER 1, 3 OR 5 ARGUMENTS:

;		CALL CURSOR (ICRCTL[,IX1,IY1][,IX2,IY2])

;	THE FIRST (MANDATORY) ARGUMENT IS THE CURSOR CONTROL BYTE, THE
;	BITS OF WHICH POSSESS THE FOLLOWING SIGNIFICANCE:

;		BITS 0-2: CURSOR FORM

;			0 = RECTANGLE
;			1 = DASHED RECTANGLE
;			2 = TWO FULL-SCREEN CROSSHAIRS
;			3 = TWO SINGLE PIXELS
;			4 = SOLID CROSSHAIR & HORIZONTAL BAR
;			5 = TWO DASHED CROSSHAIRS
;			6 = TWO SOLID CROSSHAIRS
;			7 = SOLID & DASHED CROSSHAIRS

;		BIT 3:	0 = LOW BLINK RATE
;			1 = HIGH BLINK RATE

;		BIT 4:	0 = DISABLE CURSOR 1
;			1 = ENABLE CURSOR 1

;		BIT 5:	0 = DISABLE CURSOR 2
;			1 = ENABLE CURSOR 2

;		BIT 6:	0 = FIX CURSOR 1
;			1 = BLINK CURSOR 1

;		BIT 7:	0 = FIX CURSOR 2
;			1 = BLINK CURSOR 2
	.PAGE

;	THE SUCCEEDING (OPTIONAL) ARGUMENT PAIRS ARE X AND Y COORDINATES
;	OF THE RESPECTIVE CURSORS, EACH RANGING FROM 0 TO 255.

;	IF THE VALUE ORIGINALLY SPECIFIED FOR CURSOR CONTROL IS NEGATIVE,
;	THE VALUE OF THE CONTROL REGISTER WILL BE RETURNED AS WELL AS ANY 
;	COORDINATE PAIRS SPECIFIED IN THE ARGUMENT LIST.

;	IF THE ORIGINAL SPECIFIED VALUE FOR CURSOR CONTROL IS POSITIVE,
;	A WRITE OPERATION TO ALL ARGUMENTS IS ASSUMED.

;	ALL NEW CODE: 24 APRIL 78
;	MODIFICATIONS TO: 3 NOVEMBER 78

;	PROGRAMMER:  KEN DINWIDDIE

	.MCALL	.REGDEF

	.REGDEF

	.GLOBL	CURSOR

;	CURSOR REGISTER DEFINITIONS (WITH DMA):

	CURXY1	=166032		; CURSOR 1 X & Y COORDINATES
	CURXY2	=166034		; CURSOR 2 X & Y COORDINATES
	CURCTL	=166036		; CURSOR CONTROL
	.PAGE
CURSOR:	MOV	#CURXY1,R0	; INITIALIZE REGISTER POINTER
	MOV	(R5)+,R4	; SAVE NUMBER OF ARGUMENTS
	MOV	(R5)+,R3	; PICK UP CONTROL POINTER
	TST	(R3)		; READ OR WRITE OPERATION?
	BMI	CURSR2		; IF NEGATIVE, GO TO READ DATA
	MOVB	(R3),@#CURCTL	; SET CURSOR CONTROL
CURSR1:	DEC	R4		; ACCOUNT FOR THIS ARGUMENT
	BEQ	DONE		; GO RETURN AFTER LAST ARGUMENT
	MOV	@(R5)+,R1	; PICK UP X-COORDINATE
	BIC	#177400,R1	; STRIP UPPER BYTE
	MOV	@(R5)+,R2	; PICK UP Y-COORDINATE
	BIC	#177400,R2	; STRIP UPPER BYTE
	SWAB	R2		; EXCHANGE UPPER AND LOWER BYTES
	BIS	R2,R1		; MERGE X AND Y COORDINATES
	MOV	R1,(R0)+	; AND PASS TO CURSOR COORDINATE REGISTER
	DEC	R4		; ACCOUNT FOR ONE OF THE COORDINATES
	BR	CURSR1
CURSR2:	MOVB	@#CURCTL,(R3)	; READ CURSOR CONTROL
CURSR3:	DEC	R4		; ACCOUNT FOR THIS ARGUMENT
	BEQ	DONE		; GO RETURN AFTER LAST ARGUMENT
	MOVB	(R0)+,R1	; PICK UP CURSOR COORDINATE
	BIT	#1,R4		; X - COORDINATE ?
	BEQ	CURSR4		; SKIP COMPLEMENTATION IF SO
	COM	R1		; TAKE 1'S COMPLEMENT
CURSR4:	BIC	#177400,R1	; STRIP TO LOW-ORDER BYTE
	MOV	R1,@(R5)+	; AND PASS TO TARGET LOCATION
	BR	CURSR3
DONE:	RTS	PC		; RETURN TO CALLING PROGRAM
	.END
                                                                                                                                          