.TITLE GRID SFGL70 ROUTINE TO GENERATE X & Y AXIS .IDENT 'GRID01' .PSECT GRID ; KEN DEMERS ; UTRC ; OCT 1979 ; THIS ROUTINE GENERATES THE X AND Y AXIS. IT ; SET THE X AND Y MAXS & MINS. IT DRAWS A LABEL ; FOR THE X AND Y AXIS. ; REVISED 22-FEB-80 ; ADDED EXTRA ARG TO ALLOW GRID MINS & MAXES NOT TO BE DISPLAYED ; CALLING FORMAT: ; CALL GRID(LABELX,XMAX,XMIN,YAXLOC,LABELY,YMAX,YMIN,XAXLOC,NODISP) ; WHERE: ; LABELX = ADDRESS OF LABEL TO BE PRINTED ON THE X AXIS ; XMAX = HIGH LIMIT OF X AXIS ; XMIN = LOW LIMIT OF X AXIS ; YAXLOC = POSITION OF Y AXIS ON X AXIS ; LABELY = ADDRESS OF LABEL TO BE PRINTED ON THE Y AXIS ; YMAX = HIGH LIMIT OF Y AXIS ; YMIN = LOW LIMIT OF Y AXIX ; XAXLOC = POSITION OF X AXIS ON Y AXIS ; NODISP = -1 = DO NOT DISPLAY GRID MINS & MAXES ; INTERNAL GLOBALS .GLOBL GRID,X$MAX,X$MIN,Y$MAX,Y$MIN,X$RANGE,Y$RANGE .GLOBL A$RGB1,A$RG21,A$RG22,X$MAXCO,Y$MAXCO .GLOBL R$IDGX,R$IDGY,X$ABMAX,Y$ABMAX .GLOBL A$RGB2,B$UFPTR,A$RG2PT,X$MXCOR,Y$MXCOR .GLOBL X$GRDLO,Y$GRDLO ; EXTERNAL GLOBALS .GLOBL L$INE,MVCURI,H$TXT,V$TXT,E$NCODE,C$BUFF .GLOBL G$FLEN ; ASSIGNMENTS AC0 = %0 ;F.P. ACCUMULATOR 0 AC1 = %1 AC2 = %2 AC3 = %3 AC4 = %4 AC5 = %5 G$FLEN = 16. ;LENGTH OF G FORMAT SPECIFIER ;ALSO DEFINED IN E$NCODE.MAC R$IDGX = 103. ;SPACE FOR LABELS BESIDE Y AXIS ON X GRID ; ;CHANGE BECAUSE 'WINDOW' NEEDS ROOM FOR TIC LABELS(WAS 20) ; ;DON'T FORGET TO CHANGE X$ABMAX!!!! R$IDGY = 45. ;SPACE FOR LABELS BELOW X AXIS ON Y GRID Y$MAXCO = 780. ;MAXIMUN Y COORDINATE X$MAXCO = 1023. ;MAXIMUM X COORDINATE X$MXCOR = X$MAXCO - R$IDGX ;MAX X COORDINATE - X RIDGE Y$MXCOR = Y$MAXCO - R$IDGY ;MAX Y COORDINATE - Y RIDGE MIDDLX = + R$IDGX ;MIDDLE OF X GRID MIDDLY = + R$IDGY ;MIDDLE OF Y GRID CHWIDT = 14. ;CHARACTER WIDTH IN SCREEN COORDINATES CHHIGH = 22. ;CHARACTER HIGHT IN SCREEN COORDINATES HLFWID = CHWIDT/2 ;1/2 CHAR WIDTH HLFHIG = CHHIGH/2 ;1/2 CHAR HIGTH GRID: TST (R5)+ ;BUMP PTR PAST # ARGS MOV (R5)+,LABELX ;GET A(LABELX) MOV (R5)+,R0 ;R0= A(X$MAX) MOV (R0)+,X$MAX ;GET X$MAX MOV (R0),X$MAX+2 ;GET LOW ORDER MOV (R5)+,R0 ;GET A(X$MIN) MOV (R0)+,X$MIN ;GET X$MIN MOV (R0),X$MIN+2 ;GET LOW ORDER MOV (R5)+,R0 ;GET A(YAXLOC) MOV (R0)+,YAXLOC ;GET YAXLOC MOV (R0),YAXLOC+2 ;GET LOW ORDER MOV (R5)+,LABELY ;GET A(LABELY) MOV (R5)+,R0 ;GET A(Y$MAX) MOV (R0)+,Y$MAX ;GET Y$MAX MOV (R0),Y$MAX+2 ;GET LOW ORDER MOV (R5)+,R0 ;GET A(Y$MIN) MOV (R0)+,Y$MIN ;GET Y$MIN MOV (R0),Y$MIN+2 ;GET LOW ORDER MOV (R5)+,R0 ;GET A(XAXLOC) MOV (R0)+,XAXLOC ;GET XAXLOC MOV (R0),XAXLOC+2 ;GET LOW ORDER MOV @(R5),NODISP ;SAVE NO DISPLAY FLAG SETF ;SET FPP IN S.P. MODE SETI ;SET FPP TO S.P. I MODE ; COMPUTE RANGE OF X AXIS LDF X$MAX,AC0 ;GET X$MAX SUBF X$MIN,AC0 ;SUB X$MIN STF AC0,X$RANGE ;SAVE X$RANGE ; COMPUTE RANGE OF Y AXIS GRI10: LDF Y$MAX,AC0 ;GET Y$MAX SUBF Y$MIN,AC0 ;SUB Y$MIN STF AC0,Y$RANGE ;SAVE Y$RANGE ; COMPUTE Y GRID GRI20: LDF YAXLOC,AC0 ;GET LOC OF Y AXIS SUBF X$MIN,AC0 ;CONVERT IT MULF X$ABMAX,AC0 ; TO ABSOLUTE DIVF X$RANGE,AC0 ;COORDINATES STCFI AC0,A$RG21 ;SAVE THE ABSOLUTE COORD CMP #X$MXCOR,A$RG21 ;IS X OUT OF RANGE? BGE GRI30 ;NO MOV #X$MXCOR,A$RG21 ;YES,SET IT TO MAX BR GRI40 ;DON'T HAVE TO CK FOR MIN GRI30: TST A$RG21 ;IS X OUT OF RANGE? BGE GRI40 ;NO CLR A$RG21 ;YES,SET IT TO MIN GRI40: ADD #R$IDGX,A$RG21 ;X AXIS LEAVES COORDS FOR TEXT RIDGE MOV A$RG21,X$GRDLO ;SAV X POSITION OF Y GRID GRI50: MOV #Y$MAXCO,A$RG22 ;GET ABSOLUTE Y COORD MOV #A$RGB1,R5 ;R5= A(MVCURI ARG BLK) CALL MVCURI ;MOVE CURSOR TO TOP OF Y AXIS MOV #R$IDGY,A$RG22 ;POSITION BOTTOM OF Y AXIS CALL L$INE ;PLOT THE Y AXIS ; COMPUTE X GRID LDF XAXLOC,AC0 ;GET LOC OF X AXIS SUBF Y$MIN,AC0 ;CONVERT IT MULF Y$ABMAX,AC0 ;TO ABSOLUTE DIVF Y$RANGE,AC0 ;COORDINATES STCFI AC0,A$RG22 ;SAVE THE ABSOLUTE COORD CMP #Y$MXCOR,A$RG22 ;IS Y OUT OF RANGE? BGE GRI60 ;NO MOV #Y$MXCOR,A$RG22 ;YES,SET IT TO MAX BR GRI70 ;DON'T HAVE TO CK FOR MIN GRI60: TST A$RG22 ;IS Y OUT OF RANGE? BGE GRI70 ;NO CLR A$RG22 ;YES,SET IT TO MIN GRI70: ADD #R$IDGY,A$RG22 ;Y AXIS LEAVES COORDS FOR TEXT RIDGE MOV A$RG22,Y$GRDLO ;SAV Y POSITION OF Y GRID GRI80: MOV #X$MAXCO,A$RG21 ;GET ABSOLUTE X COORD CALL MVCURI ;MOVE CURSOR TO RIGHT OF X AXIS MOV #R$IDGX,A$RG21 ;POSITION LEFT END OF X AXIS CALL L$INE ;PLOT THE X AXIS MOV LABELX,R0 ;R0= A(LABELX) MOV #MIDDLX,R1 ;R1= MIDDLE OF X AXIS GRI90: TSTB (R0)+ ;END OF STRING? BEQ GRI100 ;YES SUB #HLFWID,R1 ;BACKSPACE PTR 1/2 CHAR BR GRI90 ;KEEP LOOPING TO CENTER LABEL GRI100: MOV R1,A$RG21 ;INIT X COORD MOV #4,A$RG22 ;INIT Y COORD CALL MVCURI ;POSITION CURSOR MOV LABELX,B$UFPTR ;INIT ARG BLK MOV #A$RGB2,R5 ;PT TO H$TXT'S ARG BLK CALL H$TXT ;DRAW X AXIS LABEL MOV LABELY,R0 ;R0= A(LABELY) MOV #MIDDLY,R1 ;R1= MIDDLE OF Y AXIS GRI110: TSTB (R0)+ ;END OF STRING? BEQ GRI120 ;YES ADD #HLFHIG,R1 ;UPSPACE PTR 1/2 CHAR BR GRI110 ;KEEP LOOPING TO CENTER LABEL GRI120: MOV R1,A$RG22 ;INIT Y COORD CLR A$RG21 ;INIT X COORD MOV #A$RGB1,R5 ;R5= A(MVCURI ARG BLK) CALL MVCURI ;POSITION CURSOR MOV LABELY,B$UFPTR ;INIT ARG BLK MOV #A$RGB2,R5 ;PT TO V$TXT'S ARG BLK CALL V$TXT ;DRAW Y AXIS LABEL CMP #-1,NODISP ;SHOULD WE DISPLAY GRID MINS & MAXES? BEQ GRI150 ;NO MOV #X$MAX,A$RG2PT ;INIT ARG BLK PTR TO # CALL E$NCODE ;E$NCODE THE # MOV #X$MAXCO,A$RG21 ;INIT X COORD TO RIGHT OF SCREEN MOV #C$BUFF,R0 ;R0= STRT OF CHAR STRING GRI123: TSTB (R0)+ ;END OF STRING? BEQ GRI125 ;YES SUB #CHWIDT,A$RG21 ;BACKSPACE WIDTH OF CHAR BR GRI123 ;CONTINUE GRI125: CLR A$RG22 ;INIT Y COORD OF LABEL MOV #A$RGB1,R5 ;R5= A(MVCURI ARG BLK) CALL MVCURI ;MOVE CURSOR MOV #C$BUFF,B$UFPTR ;INIT ARG BLK PTR TO CHAR STRING MOV #A$RGB2,R5 ;R5= A(H$TXT ARG BLK) CALL H$TXT ;PLOT THE X$MAX LABEL MOV #Y$MIN,A$RG2PT ;INIT ARG BLK PTR TO # CALL E$NCODE ;E$NCODE THE # CLR A$RG21 ;INIT X COORD TO STRT OF LABEL MOV #23.,A$RG22 ;INIT Y COORD OF LABEL MOV #A$RGB1,R5 ;R5= A(MVCURI ARG BLK) CALL MVCURI ;MOVE CURSOR MOV #C$BUFF,B$UFPTR ;INIT ARG BLK PTR TO CHAR STRING MOV #A$RGB2,R5 ;R5= A(H$TXT ARG BLK) CALL H$TXT ;PLOT THE Y$MIN LABEL CMP Y$MIN,X$MIN ;ARE Y$MIN & X MIN EQUAL? BNE GRI130 ;NO CMP Y$MIN+2,X$MIN+2 ;ARE THEY EQUAL? BEQ GRI140 ;YES DON'T PLOT X$MIN GRI130: MOV #X$MIN,A$RG2PT ;INIT ARG BLK PTR TO # CALL E$NCODE ;E$NCODE THE # CLR A$RG21 ;INIT X COORD TO STRT OF LABEL CLR A$RG22 ;INIT Y COORD OF LABEL MOV #A$RGB1,R5 ;R5= A(MVCURI ARG BLK) CALL MVCURI ;MOVE CURSOR MOV #C$BUFF,B$UFPTR ;INIT ARG BLK PTR TO CHAR STRING MOV #A$RGB2,R5 ;R5= A(H$TXT ARG BLK) CALL H$TXT ;PLOT THE X$MIN LABEL GRI140: MOV #Y$MAX,A$RG2PT ;INIT ARG BLK PTR TO # CALL E$NCODE ;E$NCODE THE # CLR A$RG21 ;INIT X COORD TO START OF LABEL MOV #Y$MAXCO-CHHIGH,A$RG22 ;INIT Y COORD OF LABEL MOV #A$RGB1,R5 ;R5= A(MVCURI ARG BLK) CALL MVCURI ;MOVE CURSOR MOV #C$BUFF,B$UFPTR ;INIT ARG BLK PTR TO CHAR STRING MOV #A$RGB2,R5 ;R5= A(V$TXT ARG BLK) CALL H$TXT ;PLOT THE Y$MAX LABEL GRI150: RETURN LABELX: .WORD 0 ;PTR TO LABEL X LABELY: .WORD 0 ;PTR TO LABEL Y X$MAX: .WORD 0,0 ;X$MAX X$MIN: .WORD 0,0 ;X$MIN Y$MAX: .WORD 0,0 ;Y$MAX Y$MIN: .WORD 0,0 ;Y$MIN XAXLOC: .WORD 0,0 ;Y AXIS POSITION OF X AXIS YAXLOC: .WORD 0,0 ;X AXIS POSITION OF Y AXIS X$RANGE:.WORD 0,0 ;RANGE OF X AXIS Y$RANGE:.WORD 0,0 ;RANGE OF Y AXIS X$ABMAX:.FLT2 920. ;ABSOLUTE MAX OF X COORD ;MUST = 1023. - R$IDGX Y$ABMAX: .FLT2 735. ;ABSOLUTE MAX OF Y COORD ;MUST = 780. - R$IDGY X$GRDLO: .WORD 0 ;X COORD OF Y GRID Y$GRDLO: .WORD 0 ;Y COORD OF X GRID NODISP: .WORD 0 ;FLG NOT = -1 = DON'T DISPLAY GRID MINS & MAXES ; ARG BLK FOR MVCURI & L$INE A$RGB1: .BYTE 2,0 ;# ARGS,NOT USED .WORD A$RG21 ;PTR TO ABSOLUTE X VALUE .WORD A$RG22 ;PTR TO ABSOLUTE Y VALUE A$RG21: .WORD 0 ;ABSOLUTE SCOPE X COORD A$RG22: .WORD 0 ;ABSOLUTE SCOPE Y COORD ; ARG BLK FOR H$TXT & V$TXT & E$NCODE A$RGB2: .BYTE 1,0 ;# ARGS,NOT USED B$UFPTR: .WORD 0 ;PTR TO CHAR BUFFER A$RG2PT = B$UFPTR ;EQUATE ARG BLK PTR TO ARG BLK LOC .END