.TITLE CURSIS - CROSSHAIR CURSOR ROUTINE .IDENT /21NOV7/ ;16:55, MK ; .ENTRY CURSIS - CROSSHAIR CURSOR ROUTINE ;+ ; C U R S I S ; ; PURPOSE: CROSSHAIR CURSOR ROUTINE ; ; INTERFACE: CALLING SEQUENCE: (FORTRAN-CALLABLE SUBROUTINE) ; CALL CURSIS(ICHAR,IX,IY) ; ; INPUT: ICHAR(INTEGER)=VARIABLE TO RECEIVE INPUT CHARACTER ; IX(INTEGER) =VARIABLE TO RECEIVE X CURSOR COORDINATE ; IY(INTEGER) =VARIABLE TO RECEIVE Y CURSOR COORDINATE ; ; METHOD: TURNS ON GRAPHIC CURSOR AND WAITS 60 SECONDS FOR ; CHARACTER TO BE TYPED. IF A CHARACTER WAS TYPED, ; THE CHARACTER IS PUT IN 'ICHAR' AND CURSOR COORDINATES ; TO 'IX' AND 'IY'. ANY CHARACTER WILL BE INPUT ; EXACTLY AS TYPED (LOW BYTE) WITH BLANK FILL IN THE ; HIGH BYTE. ; ; IF NO CHARACTER IS TYPED, THE ROUTINE WILL TIME-OUT ; AND RETURN 0 (NULL CODES) IN 'ICHAR' AND CURSOR ; COORDINATES IN IX, IY. ; ; IF ROUTINE CANNOT GET COORDINATES OF CURSOR IN ; 5 ATTEMPTS (4010 MAY NOT BE WORKING PROPERLY), ; ROUTINE RETURNS ICHAR=0 AND LEAVES IX,IY UNCHANGED. ; THIS ROUTINE ASSUMES THE 4010 STRAPPABLE GRAPHIC ; INPUT TERMINATION OPTION IS IN. ; ; THE TIME-OUT TIME MAY BE CHANGED ; TO ANY N TICKS BY CALLING CURSIS WITH ICHAR=-N. ; DEFAULT TIME-OUT IS N=3600. (1 MIN) ; ; LANGUAGE: MACRO-11 ;- ; REVISIONS: ; 30-SEP-75 MK MODIFIED TO INTERFACE WITH NEW CHO ; 01-JUN-77 LV UPDATED TO CONFORM TO STANDARDS ; 18-NOV-77 MK MAKE RSX-11M COMPATIBLE ; 21-NOV-77 MK IF TERMINAL WAS ATTACHED AND CURSOR TIMED ; OUT, REATTACH IT ; .MCALL PUSH,POP,DIR$ .MCALL CMKT$S,QIO$,QIOW$,MRKT$,WTSE$ ; CURSIS::PUSH JSR PC,WTFOUT ;WAIT FOR OUTPUT TO FINISH MOV @2(R5),R0 ;TEST FOR TIME CHANGE BGE 1$ ; DON'T NEG R0 ;NEW TIME MOV R0,TMAG 1$: MOV #-1,CH.MOD ;GRAPHIC MODE MOV #IN.BUF,R0 ;INPUT BUFFER ADDRESS MOV #-5,CURSFL BCUR: DIR$ #CURSON ;ECHO ESC, SUB-- TURN ON CURSOR DIR$ #MARK ;SET TO TIME OUT DIR$ #IN.DPB ;REQ OPERATOR/HARDWARE RESPONSE DIR$ #WT ;WAIT FOR RESPONSE OR TIME OUT TSTB IN.ST ;INPUT OR TIME OUT? BNE 1$ ;INPUT DIR$ #KILL ;KILL I/O REQUEST DIR$ #CURSON ;TURN ON CURSOR DIR$ #MT DIR$ #WT DIR$ #ECESEN ;ECHO ESC, ENQ - ASKING 4010 FO IX,IY DIR$ #IN.DPB ;RECEIVE HARDWARE RESPONSE DIR$ #WT ;WAIT FOR IT TST CM.ATF ;WAS TERMINAL ATTACHED? BEQ 10$ ;NO DIR$ #CM.ATC ;YES - REATTACH IT 10$: CMP #4,IN.CHA ;CHECK FOR FOUR CHARACTERS BNE 3$ ;MAY BE 4010 ERROR OR READ-AHEAD CLR @2(R5) ;NULL ICHAR BR 2$ .PAGE ; SET UP LOOPS 3$: INC CURSFL ;ONLY LOOP 5 TIMES BGE 4$ BR BCUR ;GO TRY AGAIN 4$: CLR @2(R5) ;GIVE UP - SEND NULL ICHAR BR RTRN ; 1$: CMKT$S #INFL ;CANCEL MARK TIME CMP #5,IN.CHA ;CHECK FOR 5 CHARACTERS BNE 3$ ;SEE IF WE SHOULD TRY AGAIN MOV 2(R5),R1 ;LOC 'ICHAR' MOVB (R0)+,(R1)+ ;MOVE CHARACTER IN MOVB #40,(R1)+ ;BLANK FILL HIGH BYTE 2$: JSR PC,CVTIN ;CONVERT X COORDINATE MOV R1,@4(R5) ;STORE IN IX JSR PC,CVTIN ;CONVERT Y MOV R1,@6(R5) ;STORE IN IY RTRN: CLR CH.MOD POP RTS PC ; MARK: MRKT$ INFL,3600.,1 TMAG=MARK+M.KTMG ; ECESEN: QIOW$ IO.WAL,LUN,INFL,,,, ; ;QIOW$ - REQUEST CROSSHAIR COORDINATES ESENBF: .BYTE 33,5 ;ESC, ENQ ; ; CONVERT INPUT COORDINATE ; CVTIN: MOVB (R0)+,R1 ;GET HIGH BYTE BIC #177740,R1 ;CLEAN UP ASH #5,R1 ;ALIGN BICB #340,(R0) ;CLEAN UP LOW BYTE BISB (R0)+,R1 ;COMBINE WITH HIGH BYTE RTS PC ; CURSFL: .WORD 0 ;TRY AGAIN FLAG ; CURSON: QIOW$ IO.WAL,LUN,,,,, ; QIOW$ - TURN ON CURSOR CURSBF: .BYTE 33,32 ; KILL: QIOW$ IO.KIL,LUN,INFL ;KILL TERMINAL INPUT MT: MRKT$ INFL,3,1 WT: WTSE$ INFL ;WTSE$ .END