! ! WAV2 - A variation of WAVPLT - Display multiple wave forms ! ! ! ! This routine was designed as a simple example of plotting ! multiple wave forms on an AM72 CRT via AMIGOS. ! ! ! PROGRAM WAV2,1.0(100) ++INCLUDE AMGSYM.BSI MAP1 GCB,X,56000 MAP1 POINT'MAX,F,6,200 MAP1 POINT'ARRAY MAP2 POINT'COUNT,B,2 MAP2 POINTS(200) MAP3 POINT'X,B,2 MAP3 POINT'Y,B,2 MAP1 MULTI'ARRAY,F,6,4 MAP1 MULTI'Y(4,200),B,2 MAP1 M'KTR(4),F,6 MAP1 MC'KTR(4),F,6 MAP1 DSP'MAX,F,6,10 MAP1 DSP'ARRAY MAP2 DSP'COUNT,B,2 MAP2 DSP'XY(10) MAP3 DSP'X,B,2 MAP3 DSP'Y,B,2 MAP1 CLR'MAX,F,6,10 MAP1 CLR'ARRAY MAP2 CLR'COUNT,B,2 MAP2 CLR'XY(10) MAP3 CLR'X,B,2 MAP3 CLR'Y,B,2 MAP1 STATUS,F !Status retruned from AMIGOS calls MAP1 TEXT(4),S,80 MAP1 PI,F,6 PI =3.141592654 !***********************************************! WAVPLT: ON ERROR GOTO ERROR'ROUTINE RANDOMIZE PRINT TAB(-1,14); ! turn off protected fields PRINT TAB(-1,12); ! normal intensity PRINT TAB(-1,24); ! turn off alt chr set PRINT TAB(-1,29); ! turn off cursor PRINT TAB(-1,0); ! clear screen GOSUB DO'OVERHEAD ! amigos overhead GOSUB SET'DEFAULTS ! plot/box area locations GOSUB DO'BOX ! our "world" GOSUB DO'WAVE ! plot the data END'IT: XCALL AMGSBR,G'CLWK,GCB,STATUS PRINT TAB(-1,28); ! turn cursor on PRINT TAB(23,1); ! position cursor ! CHAIN "WAV2" END ERROR'ROUTINE: XCALL AMGSBR,G'CLWK,GCB,STATUS PRINT TAB(-1,28); ! turn cursor on PRINT TAB(23,1); ! position cursor END !***********************************************! SET'DEFAULTS: ! ! X'MIN =2000 ! display area variables X'MAX =30000 ! X'AXIS =X'MIN ! X'INC =(X'MAX-X'MIN)/100 ! ! ! Y'MIN =1000 ! Y'MAX =21000 ! Y'AXIS =(((Y'MAX-Y'MIN)/2)+Y'MIN) ! Y'INC =8000 ! ! X'PTS =100 ! # of points in the wave X'KTR =0 ! current point # to plot C'SKIP =15 ! # of points to clear C'KTR =-(X'PTS-C'SKIP) ! current point # to clear ! DSP'COUNT =2 ! CLR'COUNT =2 ! PI'KTR =0 ! PI'VAR =0 ! PI'MAX = 256 ! MC'KTR(1) =C'KTR MC'KTR(2) =C'KTR MC'KTR(3) =C'KTR MC'KTR(4) =C'KTR TEXT(1) ="Wave Plot - Random Generator" TEXT(2) ="Wave Plot - Sine Wave" TEXT(3) ="Wave Plot - Square Wave" TEXT(4) ="Wave Plot - RC Wave" RETURN ! !***********************************************! DO'OVERHEAD: ! Open the workstation XCALL AMGSBR,G'OPWK,GCB,"",STATUS ! Clear the workstation XCALL AMGSBR,G'CLRW,GCB,STATUS ! Set the workstation window ! XCALL AMGSBR,G'SWKW,GCB,0,0,32567,32567,STATUS ! Set the workstation viewport ! XCALL AMGSBR,G'SWKV,GCB,20000,15000,32000,28000,STATUS ! Polymarker Overhead ! XCALL AMGSBR,G'SPMT,GCB,2,STATUS ! type ! XCALL AMGSBR,G'SPMS,GCB,20,STATUS ! style ! XCALL AMGSBR,G'SPMC,GCB,3,STATUS ! color ! Polyline Overhead XCALL AMGSBR,G'SPLT,GCB,1,STATUS ! type XCALL AMGSBR,G'SPLS,GCB,0,STATUS ! width XCALL AMGSBR,G'SPLC,GCB,1,STATUS ! color ! Text Overhead XCALL AMGSBR,G'STXF,GCB,1004,STATUS ! font XCALL AMGSBR,G'STXC,GCB,3,STATUS ! color XCALL AMGSBR,G'SCHH,GCB,1500,STATUS ! height ! Fill Area Overhead ! XCALL AMGSBR,G'SFAC,GCB,4,STATUS ! color ! XCALL AMGSBR,G'SFAS,GCB,3,STATUS ! style ! XCALL AMGSBR,G'SFAI,GCB,55,STATUS ! index RETURN !***********************************************! DO'BOX: ! ! draw the box ! FOR BOX=1 TO MULTI'ARRAY GOSUB SET'VIEWPORT POINT'COUNT =5 POINT'X(1) =X'MIN POINT'Y(1) =Y'MIN POINT'X(2) =X'MIN POINT'Y(2) =Y'MAX POINT'X(3) =X'MAX POINT'Y(3) =Y'MAX POINT'X(4) =X'MAX POINT'Y(4) =Y'MIN POINT'X(5) =POINT'X(1) POINT'Y(5) =POINT'Y(1) XCALL AMGSBR,G'SPLC,GCB,7,STATUS ! line color - cyan XCALL AMGSBR,G'PL,GCB,POINT'ARRAY,STATUS ! plot box ! ! Do Horizontal Reference Lines ! POINT'COUNT =2 POINT'X(1) =X'MIN POINT'X(2) =X'MAX XCALL AMGSBR,G'SPLC,GCB,15,STATUS ! line color - dim cyan IKTR =0 FOR I=(Y'MIN+2000) TO (Y'MAX-2000) STEP 2000 POINT'Y(1) =I POINT'Y(2) =I IKTR =IKTR+1 IF IKTR # 5 THEN & XCALL AMGSBR,G'PL,GCB,POINT'ARRAY,STATUS & ELSE & XCALL AMGSBR,G'SPLT,GCB,2,STATUS : & XCALL AMGSBR,G'SPLC,GCB,7,STATUS : & XCALL AMGSBR,G'PL,GCB,POINT'ARRAY,STATUS : & XCALL AMGSBR,G'SPLC,GCB,15,STATUS XCALL AMGSBR,G'SPLT,GCB,1,STATUS NEXT I ! ! Do Vertical Reference Lines ! POINT'Y(1) =Y'MIN POINT'Y(2) =Y'MAX IKTR =0 FOR I=(X'MIN+2000) TO (X'MAX-2000) STEP 2000 POINT'X(1) =I POINT'X(2) =I IKTR =IKTR+1 IF IKTR # 7 THEN & XCALL AMGSBR,G'PL,GCB,POINT'ARRAY,STATUS & ELSE & XCALL AMGSBR,G'SPLT,GCB,2,STATUS : & XCALL AMGSBR,G'SPLC,GCB,7,STATUS : & XCALL AMGSBR,G'PL,GCB,POINT'ARRAY,STATUS : & XCALL AMGSBR,G'SPLC,GCB,15,STATUS XCALL AMGSBR,G'SPLT,GCB,1,STATUS NEXT I ! ! Do Text ! XCALL AMGSBR,G'STXC,GCB,BOX,STATUS ! color XCALL AMGSBR,G'TX,GCB,X'MIN,Y'MAX+500,TEXT(BOX),STATUS NEXT BOX RETURN !***********************************************! DO'WAVE: ! ! Q =X'MIN ! load x co-or of all FOR I=1 TO X'PTS ! array pairs POINT'X(I)=Q ! Q=Q+X'INC ! NEXT I ! ! WAVE'LOOP: ! ! ! get input data ! GOSUB GET'DATA ! get the data from some place IF MS'FLAG=99 THEN RETURN ! check for abort condition ! ! set viewport ! BOX =MS'A ! determine plot # GOSUB SET'VIEWPORT ! set viewport for plot # ! ! ! determine x position ! M'KTR(MS'A)=M'KTR(MS'A)+1 ! bump count ! and loop if needed ! if so, make first point ! equal to last point IF M'KTR(MS'A)>X'PTS THEN M'KTR(MS'A)=2 : & MULTI'Y(MS'A,1)=MULTI'Y(MS'A,X'PTS) ! ! load points to be ploted ! MULTI'Y(MS'A,M'KTR(MS'A)) =Y'AXIS+(MS'YDATA*Y'INC) IF M'KTR(MS'A)<2 THEN GOTO WAVE'LOOP ! it takes two to plot DSP'X(1) =POINT'X(M'KTR(MS'A)-1) DSP'Y(1) =MULTI'Y(MS'A,M'KTR(MS'A)-1) DSP'X(2) =POINT'X(M'KTR(MS'A)) DSP'Y(2) =MULTI'Y(MS'A,M'KTR(MS'A)) DSP'COUNT =2 XCALL AMGSBR,G'SPLC,GCB,MS'A,STATUS ! plot this segment XCALL AMGSBR,G'PL,GCB,DSP'ARRAY,STATUS ! ! load points to be cleared ! MC'KTR(MS'A) =MC'KTR(MS'A)+1 ! bump the count IF MC'KTR(MS'A)<2 THEN GOTO WAVE'LOOP ! it takes two to clear IF MC'KTR(MS'A)>X'PTS THEN MC'KTR(MS'A)=2 ! loop back?? CLR'X(1) =POINT'X(MC'KTR(MS'A)-1) CLR'Y(1) =MULTI'Y(MS'A,MC'KTR(MS'A)-1) CLR'X(2) =POINT'X(MC'KTR(MS'A)) CLR'Y(2) =MULTI'Y(MS'A,MC'KTR(MS'A)) CLR'COUNT =2 XCALL AMGSBR,G'SPLC,GCB,0,STATUS ! clear this segment XCALL AMGSBR,G'PL,GCB,CLR'ARRAY,STATUS GOTO WAVE'LOOP ! that was fun, ! lets do it again! !***********************************************! GET'DATA: MS'A =MS'A+1 IF MS'A<1 THEN MS'A=1 IF MS'A>MULTI'ARRAY THEN & MS'A=1 : & PI'KTR=PI'KTR+1 ON MS'A GOSUB RANDOM'WAVE, SINE'WAVE, BOX'WAVE, RC'WAVE MS'FLAG =0 IF PI'KTR>PI'MAX THEN MS'FLAG=99 RETURN !***** ! RANDOM'WAVE: MS'YDATA=RND(1)*2 MS'YDATA=MS'YDATA-1 RETURN !***** ! SINE'WAVE: MS'YDATA=SIN(PI'VAR) PI'VAR =PI'VAR+((2*PI)/100) RETURN !***** ! BOX'WAVE: B'KTR =B'KTR+1 IF B'KTR>20 THEN B'KTR=1 IF B'KTR<11 THEN & MS'YDATA=.9 & ELSE & MS'YDATA=-.9 RETURN !***** ! RC'WAVE: MS'YDATA=SIN(RC'VAR) RC'VAR =RC'VAR+((2*PI)/100) IF MS'YDATA>.999 THEN RC'VAR=0 RETURN !***********************************************! SET'VIEWPORT: IF BOX=1 THEN & XCALL AMGSBR,G'SWKV,GCB,5000,15000,17000,28000,STATUS IF BOX=2 THEN & XCALL AMGSBR,G'SWKV,GCB,20000,15000,32000,28000,STATUS IF BOX=3 THEN & XCALL AMGSBR,G'SWKV,GCB,5000,500,17000,13500,STATUS IF BOX=4 THEN & XCALL AMGSBR,G'SWKV,GCB,20000,500,32000,13500,STATUS RETURN