.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