SUBROUTINE GRAPHS(IBUF,MODE,X,Y,NPTS,SHADE,IGR) C C C J. LISCOUSKI DIGITAL EQUIPMENT CORPORATION C NOV. 9, 1979 C C THIS SUBROUTINE WILL PERMIT GRAPHS TO BE DRAWS GIVEN C A FEW ARGUMENTS. C C IBUF IS THE INFORMATION BUFFER DIMENSIONED BY THE C USER FOR 30 WORDS. C C MODE MODE IS USED TO ENABLE OR DISABLE CERTAIN DISPLAY C FEATURE OF THE SYSTEM. SOME COMBINATIONS OF MODES C CAN BE EFFECTED BY SUMMING THE VALUES FOR THE VARIOUS C TYPES: C OPTION VALUE (IF ENABLED) C ----- ----------------- C FRAME 1 C HOR. LINES 2 C SHADING 4 C INDEX 8 (not implemented as yet) C MOVE 16 C AUTOSCALING 32 C UNITS 64 C MARKERS 128 C C SOME COMBINATIONS INTERACT: C C A) HORIZONTAL LINES CAN BE USED IFF FRAME IS CHOSEN C B) INDEX AND MOVE ARE MUTUALLY EXCLUSIVE C C THE DEFAULT IS 35 (FRAME, HORIZONTAL LINES, UNITS, C MARKERS, AND AUTOSCALING) C C X IS THE ARRAY FOR THE HORIZONTAL AXIS, IT MAY BE DEFAULTED. C IF THE DEFAULT IS CHOSEN, A COUNTER FROM 1 TO NPTS WILL BE C USED IN ITS PLACE. C C Y IS THE ARRAY FOR THE VERTICAL AXIS AND IS MANDITORY. C C NPTS IS THE NUMBER OF POINTS TO BE PLOTTED. C C SHADE IS THE POINT ON THE VERTICAL AXIS (EXPRESSED IN USER VALUES) C AT WHICH SHADING IS TO BE DONE. THE DEFAULT IS THE BOTTOM C OF THE GRAPH. C C IGR IS THE GRAPH NUMBER (0/1) FOR PLOTTING, THE DEFAULT IS 0. C C NOTE: ALL ARGUMENTS ARE NEEDED, EITHER BY DEFAULT OR BY USER C DEFINITION. IF ANY ARE MISSING, A TRAP TO 4 MAY RESULT. C DIMENSION X(1),Y(1),IBUF(1),TEMP(4),ITEMP(8),IRB(2,3),IB(2) BYTE CMD(11),ENTRGR(3),EXITGR(3),IGCODE(2) EQUIVALENCE (TEMP(1),ITEMP(1)) !THIS IS TO PROVIDE A QUICK MEANS EQUIVALENCE (TEMP(1),XMIN) !OF GETTING SCALED VALUES FROM EQUIVALENCE (TEMP(2),XMAX) !FROM IBUF INTO THE APPROPRIATE EQUIVALENCE (TEMP(3),YMIN) !REAL VARIABLES EQUIVALENCE (TEMP(4),YMAX) DATA IRB/239,150,129,50,239,50/ !REGION BOUNDS DATA ENTRGR/"33,'1',0/ DATA EXITGR/"33,'2',0/ DATA IGCODE/'B','J'/ DATA IB/10,18/ F(Z,ZMAX,ZMIN)=(Z-ZMIN)/(ZMAX-ZMIN) !ARITH. STAT. SUBROUTINE C C BEGINNING OF EXECUTABLE CODE C CALL IDFLT(IGRAPH,0,IGR) !CHECK FOR DEFAULT ON GRAPH # IF((IGRAPH.EQ.0).OR.(IGRAPH.EQ.1))GOTO 1 !IGRAPH OK? CALL ERRMSG('?GRAPHS - invalid graph number, must be 0/1') CALL EXIT RETURN 1 IF(IBUF(27).NE."52525)CALL GRINIT(IBUF) !GRINIT CALLED? IRGN=IBUF(8+IGRAPH) IF(IRGN.NE.-1)GOTO 3 !FIND WHICH REGION IS BEING PLOTTED CALL ERRMSG('?GRAPHS - graph not assigned to region') CALL EXIT RETURN 3 CALL IDFLT(IMODE,227,MODE) !CHECK DEFAULT ON MODE CALL GRCLN(IBUF,IGRAPH) !CLEAN PLOTTING AREA C C NOW, IS AUTO SCALING NECESSARY? C IF((IMODE.AND.32).EQ.0)GOTO 10 C C PERFORM AUTOSCALING C IFLAG=0 !FLAG TO SHOW IF X HAS BEEN DEFAULTED (1=YES) IF(IADDR(X).EQ."177777)GOTO 4 !HAS X BEEN DEFAULTED? CALL BOUNDS(1,X,XMAX,XMIN,NPTS) !GET LIMITS GOTO 5 4 IFLAG=1 !SHOW X DEFAULTED XMIN=1 XMAX=NPTS 5 IF(IADDR(Y).NE."177777)GOTO 6 !HAS Y BEEN DEFAULTED? CALL ERRMSG('?GRAPHS - Y array cannot be defaulted') CALL EXIT RETURN 6 CALL BOUNDS(1,Y,YMAX,YMIN,NPTS) !GET Y LIMITS IBASE=IB(IGRAPH+1) DO 7 I=1,8 7 IBUF(IBASE+I)=ITEMP(I) !STORE LIMITS IN IBUF IBUF(2+IGRAPH)=1 !SHOW THAT SCALING FACTORS EXIST GOTO 20 10 IF(IBUF(2+IGRAPH).NE.0)GOTO 12 !HAVE SCALED VALUES BEEN ENTERED? CALL ERRMSG('?GRAPHS - scaling has not been provided for graph') CALL EXIT RETURN 12 IBASE=IB(IGRAPH+1) DO 15 I=1,8 15 ITEMP(I)=IBUF(IBASE+I) !GET SCALED VALUES FROM IBUF C C (20) NOW SEE IF FRAME IS REQUIRED C 20 IF((IMODE.AND.1).EQ.0)GOTO 30 CALL GRFRAM(IBUF,IGRAPH,IMODE) C C (30) CHECK FOR SHADE MODE C 30 NCHAR=3 !AT LEAST 3 CHARACTER WILL BE SENT TO THE TERMINAL IF((IMODE.AND.4).EQ.0)GOTO 40 !IF NOT, KEEP GOING CALL DFLTCK(SHADEL,YMIN,SHADE) !CKECK FOR DEFAULT ON SHADE LINE I=2 IF(IGRAPH.EQ.1)I=4 !SHADE APPROPRIATE GRAPH IBUF(5)=((IBUF(5).OR.I).OR.IGRAPH) !SET BITS FOR SHADING NCHAR=6 !SHADE LINE, 6 CHAR. WILL BE SENT TO THE TERMINAL CMD(4)='@' !LOAD SHADE LINE CHARACTERS INTO CMD IY=F(SHADEL,YMAX,YMIN)*FLOAT(IRB(1,IRGN)-IRB(2,IRGN)) IY=IY+IRB(2,IRGN) C C IF THE REQUESTED SHADELINE IS OUT OF THE REGION SET IT TO THE C LIMIT OF THE REGION C IF(IY.GT.IRB(1,IRGN))IY=IRB(1,IRGN) IF(IY.LT.IRB(2,IRGN))IY=IRB(2,IRGN) C CMD(5)=32+(IY.AND."37) CMD(6)=32+((IY.AND."340)/32) C C (40) NOW LOAD GRAPHICS C 40 IF((IBUF(4).AND.1).NE.0)GOTO 45 !DISPLAY GRAPHICS ENABLED? IBUF(4)=IBUF(4).OR.1 45 I=2 !ENABLE GRAPHICS FOR APPROPRIATE GRAPH IF(IGRAPH.EQ.1)I=4 IBUF(4)=IBUF(4).OR.I !SET BITS CMD(1)='A' CMD(2)=IBUF(4) CMD(3)=IBUF(5) CALL OUTSTR(ENTRGR) CALL OUTSTR(CMD,NCHAR) C C NOW (FINALLY) PUT UP THE GRAPH C RANGE=IRB(1,IRGN)-IRB(2,IRGN) !# OF DOTS ON Y-AXIS DO 100 I=1,NPTS X1=I IF(IFLAG.EQ.0)X1=X(I) !USE ACTUAL X VALUES IF NO DEFAULT Y1=Y(I) IX=INT(F(X1,XMAX,XMIN)*511.) C C CHECK FOR X OUT OF RANGE C IF(IX.LT.0)IX=0 IF(IX.GT.511)IX=511 C CMD(1)='H' CMD(2)=32+("37 .AND. IX) CMD(3)=32+(("740 .AND. IX)/32) IY=INT(F(Y1,YMAX,YMIN)*RANGE) IF(((IX/128)*128) .EQ. IX)IY=0 !LEAVE TICK MARKS ALONE IY=IY+IRB(2,IRGN) !ADD OFFSET FOR BOTTOM OF GRAPH C C CHECK FOR Y OUT OF RANGE C IF(IY.GT.IRB(1,IRGN))IY=IRB(1,IRGN) IF(IY.LT.IRB(2,IRGN))IY=IRB(2,IRGN) C CMD(4)=IGCODE(IGRAPH+1) CMD(5)=32+("37 .AND. IY) CMD(6)=32+(("340 .AND. IY)/32) CALL OUTSTR(CMD,6) 100 CONTINUE CALL OUTSTR(EXITGR) !EXIT GRAPHICS MODE RETURN END