Google
 

Trailing-Edge - PDP-10 Archives - decuslib20-03 - decus/20-0078/libsim/calsim.sim
There is 1 other file named calsim.sim in the archive. Click here to see a list.
OPTIONS(/E/C/-Q/-A/-I/-D);
CLASS calsim;
BEGIN   INTEGER izet,izorg,izz;
    REAL xorg,yorg,xfact,yfact,x0,y0,ln10;
    ARRAY save[1:7];
    REF (Outfile) pltfile;

    PROCEDURE calcmp(x,y,iz,k);   NAME x,y,iz;   REAL x,y;
    INTEGER iz,k;
    BEGIN
	IF k = 0 THEN
	BEGIN   pltfile:- NEW Outfile("PLT:");
	pltfile.Open(Blanks(32));
	    GO TO print
	END ELSE
	IF k > 0 THEN
	BEGIN
	    IF k = 1 THEN BEGIN  x0:= x;   y0:= y;
	    izz:= iz  END ELSE
	    IF k = 7 THEN izet:= iz ELSE
	    IF k = 3 THEN BEGIN   xorg:= x;   yorg:= y;
	    izorg:= iz   END ELSE
	    IF k = 4 THEN BEGIN   xfact:= x;   yfact:= y   END;
	    print:
	    INSPECT pltfile DO
	    BEGIN   Outchar('1');    Outreal(x,5,11);
	    Outreal(y,5,11);
		Outint(iz,4);    Outint(k,2);   Outimage;
		IF k = 2 AND iz = 9000 THEN Close;
	    END inspect
	END k > 0 ELSE
	IF k = -7 THEN iz:= izet ELSE
	IF k = -3 THEN BEGIN   x:= xorg;   y:= yorg;
	iz:= izorg   END ELSE
	IF k = -4 THEN BEGIN   x:= xfact;   y:= yfact   END ELSE
	IF k = -1 THEN BEGIN   x:= x0;   y:= y0;
	iz:= izz   END ELSE
	IF k = -2 OR k = -8 THEN GO TO print;

    END of calcmp;

    PROCEDURE symbol(x,y,h,itext,theta,n);   NAME itext;
    REAL x,y,h,theta;
    TEXT itext;   INTEGER n;
    BEGIN    TEXT t;
	t:- Copy(itext);
	INSPECT pltfile DO
	BEGIN   Outchar('2');   Outreal(x,5,11);   Outreal(y,5,11);
	    IF n > 0 THEN n:= t.Length;
	    Outint(n,4);    Outimage;
	    IF n < 0 THEN
	    BEGIN   Outfix(h,3,6);   Outfix(theta,1,6);
		Outint(Mod(t.Getint,128),3);   Outimage;
	    END ELSE
	    BEGIN
		IF n = 0 AND t.Length >= 1 THEN t:- t.Sub(1,1);
		Outfix(h,3,6);   Outfix(theta,1,6);
		IF t.Length > 20 THEN
		BEGIN   Outtext(t.Sub(1,20));
		t:- t.Sub(21,t.Length-20)   END;
		WHILE t.Length > 30 DO
		BEGIN    Outtext(t.Sub(1,30));
		t:- t.Sub(31,t.Length-30)   END;
		Outtext(t);   Outimage
	    END n >= 0
	END inspect
    END of symbol;

    PROCEDURE number(x,y,h,f,theta,n);
    REAL x,y,h,f,theta;   INTEGER n;
    INSPECT pltfile DO
    BEGIN   Outchar('3');   Outreal(x,5,11);
    Outreal(y,5,11);
	Outint(n,3);   Outimage;
	Outfix(h,3,6);   Outfix(theta,1,6);   Outreal(f,10,16);
	Outimage
    END of number;

    PROCEDURE Line(xa,ya,npts,inc,lintyp,inteq);
    NAME inteq;   TEXT inteq;
    ARRAY xa,ya;   INTEGER npts,inc,lintyp;
    BEGIN
	INTEGER
	lmin,ldx,nl,ipen,icode,nt,ldy,nf,na,kk,ipena,icodea,lsw,i;
	REAL firstx,deltax,firsty,deltay,df,xn,yn,dl;
	REAL PROCEDURE amax1(a,b);   REAL a,b;
	amax1:= IF a > b THEN a ELSE b;

	lmin:= npts*inc + 1;	ldx:= lmin + inc;
	nl:= lmin - inc;
	firstx:= xa[lmin];	deltax:= xa[ldx];
	firsty:= ya[lmin];	deltay:= ya[ldy];
	calcmp(xn,yn,izz,-1);
	df:= amax1( Abs((xa[1]-firstx)/deltax-xn),
	Abs((ya[1]-firsty)/deltay-yn) );
	dl:= amax1( Abs((xa[1]-firstx)/deltax-xn),
	Abs((ya[1]-firsty)/deltay-yn) );
	ipen:= 0;	icode:= -1;
	nt:= Abs(lintyp);
	IF lintyp NE 0 THEN GO TO label7;
	label6: nt:= 1;
	label7: IF dl >= df THEN GO TO label9;
	label8: nf:= nl;	na:= ((npts-1)//nt)*nt + nt - (npts-1);
	kk:= -inc;
	GO TO label10;
	label9: nf:= 1;		na:= nt;	kk:= inc;
	label10:
	GO TO IF lintyp < 0 THEN label11 ELSE IF lintyp = 0 THEN
	label12 ELSE label13;
	label11: ipena:= 0;	icodea:= -1;	lsw:= 1;   GO TO label15;
	label12: na:= ldx;
	label13: ipena:= 99;	icodea:= -2;	lsw:= 0;
	label15: FOR i:= 1 STEP 1 UNTIL npts DO
	BEGIN   xn:= (xa[nf]-firstx)/deltax;
	yn:= (ya[nf]-firsty)/deltay;
	    GO TO IF na > nt THEN label22 ELSE IF na = nt THEN
	    label21 ELSE label20;
	    label20: GO TO IF lsw = 0 THEN label22 ELSE label23;
	    label21: symbol(xn,yn,0.2,inteq,0,icode);
	    na:= 1;		GO TO label25;
	    label22: calcmp(xn,yn,ipen,1);
	    label23: na:= na + 1;
	    label25: nf:= nf + kk;	icode:= icodea;
	    label30: ipen:= ipena;
	END i-loop;

    END of line;

    PROCEDURE
    axis(xpage,ypage,ibcd,nchar,axlen,angle,firstv,deltav);
    NAME ibcd;
    TEXT ibcd;   REAL xpage,ypage,axlen,angle,firstv,deltav;
    INTEGER nchar;
    BEGIN
	INTEGER i,kn,ntic,nt;
	REAL c,a,ex,adx,xval,cth,sth,dxb,dyb,z,xt,yt,xn,yn;
	c:= 2.54;	kn:= nchar;	a:= 1.0;
	IF kn >= 0 THEN GO TO label2;
	label1: a:= -a;		kn:= -kn;
	label2: ex:= 0.0;	adx:= Abs(deltav);
	IF adx = 0 THEN GO TO label7;
	label3: IF adx < 99.0 THEN GO TO label6;
	label4: adx:= adx/10.0;		ex:= ex + 1.0;	GO TO label3;
	label5: adx:= adx*10.0;		ex:= ex - 1.0;
	label6: IF adx < 0.01 THEN GO TO label5;
	label7: xval:= firstv*10.0**(-ex);
	adx:= deltav*10.0**(-ex);
	sth:= angle*0.0174533;		cth:= Cos(sth);	sth:= Sin(sth);
	dxb:= -0.1*c;			dyb:= 0.15*a - 0.05;	dyb:= dyb*c;
	xn:= xpage+dxb*cth-dyb*sth;	yn:= ypage+dyb*cth+dxb*sth;
	ntic:= axlen + 1.0;	nt:= ntic//2;
	FOR i:= 1 STEP 1 UNTIL ntic DO
	BEGIN
	    IF Mod(i,2) = 0 THEN
	    number(xn,yn,0.105*c,xval,angle,2);
	    xval:= xval + adx;		xn:= xn + cth;		yn:= yn + sth;
	    IF nt NE 0 THEN GO TO label20;
	    label11: z:= kn;		IF ex = 0 THEN GO TO label13;
	    label12: z:= z + 7.0;		z:= z*c;
	    label13: dxb:= -0.07*z + axlen/2;
	    dyb:= 0.325*a-0.075;		dyb:= dyb*c;
	    xt:= xpage+dxb*cth-dyb*sth;	yt:= ypage+dyb*cth+dxb*sth;
	    symbol(xt,yt,0.14*c,ibcd,angle,kn);
	    IF ex = 0 THEN GO TO label20;
	    label14: z:= kn + 2;		xt:= xt+z*cth*0.14*c;
	    yt:= yt+z*sth*0.14*c;
	    symbol(xt,yt,0.14*c,"1550938112",angle,3);
	    xt:= xt + (3.0*cth-0.8*sth)*0.14*c;
	    yt:= yt + (3.0*sth+0.8*cth)*0.14*c;
	    number(xt,yt,0.07*c,ex,angle,-1);
	    label20:
	    nt:= nt - 1;
	END i-loop;
	calcmp(xpage+axlen*cth,ypage+axlen*sth,0,1);
	dxb:= -0.07*a*sth*c;		dyb:= 0.07*a*cth*c;
	a:= ntic - 1;			xn:= xpage + a*cth;	yn:= ypage + a*sth;
	FOR i:= 1 STEP 1 UNTIL ntic DO
	BEGIN
	    calcmp(xn,yn,99,1);	calcmp(xn+dxb,yn+dyb,99,1);
	    calcmp(xn,yn,0,1);
	    xn:= xn - cth;			yn:= yn - sth;
	END i-loop;

    END of axis;

    PROCEDURE scale(arr,axlen,npts,inc);   ARRAY arr;
    REAL axlen;
    INTEGER npts,inc;
    BEGIN
	INTEGER i,k,n,is_;
	REAL fad,ys,firstv,deltav,p,t,yn,y0;

	fad:= 0.01;	k:= Abs(inc);		n:= npts*k;
	y0:= arr[1];	yn:= y0;
	FOR i:= 1 STEP k UNTIL n DO
	BEGIN
	    ys:= arr[i];
	    IF y0 <= ys THEN GO TO label22;
	    label21: y0:= ys;	GO TO label25;
	    label22: IF ys <= yn THEN GO TO label25;
	    label24: yn:= ys;
	    label25:
	END i-loop;
	firstv:= 0;
	IF y0 >= 0 THEN GO TO label35;
	label34: fad:= fad - 1.0;
	label35: deltav:= (yn-firstv)/axlen;
	IF deltav <= 0 THEN
	BEGIN   deltav:= 2.0*firstv;
	deltav:= Abs(deltav/axlen) + 1.0   END;
	label40: i:= Ln(deltav)/ln10 + 1000.0;
	p:= 10.0**(i-1000);		deltav:= deltav/p - 0.01;
	FOR i:= 1 STEP 1 UNTIL 6 DO
	BEGIN
	    is_:= i;
	    IF save[i] >= deltav THEN GO TO label50;
	    label45:
	END of i-loop;
	label50: deltav:= save[is_]*p;
	firstv:= p*Entier(y0/p+fad);
	t:= firstv+(axlen+0.01)*deltav;
	IF t >= yn THEN GO TO label57;
	label56: is_:= is_ + 1;		GO TO label50;
	label57: firstv:= firstv -
	Entier((axlen+(firstv-yn)/deltav)/2.0)*deltav;
	IF y0*firstv > 0 THEN GO TO label59;
	label58: firstv:= 0;
	label59: IF inc > 0 THEN GO TO label65;
	label61: firstv:= firstv + Entier(axlen+0.5)*deltav;
	deltav:= -deltav;
	label65: n:= n + 1;	arr[n]:= firstv;
	n:= n + k;		arr[n]:= deltav;
    END of scale;


    save[1]:= 1;	save[2]:= 2.0;		save[3]:= 4.0;
    save[4]:= 5.0;	save[5]:= 8.0;		save[6]:= 10.0;
    save[7]:= 20.0;
    izet:= 16;		xfact:= yfact:= 1.0;	ln10:= Ln(10.0&&0);

END of calsim;