/* === BIOMORPH === Vers 3-10-92 */ /* Prog by Terry Newton 10-24-89 */ /* This program plots the complex */ /* number plane using various */ /* algorithms. See the July 89 */ /* issue of Scientific American. */ /* Required Link Files... */ /* GR7P6F00.OBJ Mode 15 Code */ /* CMP6D40.OBJ File Compression */ /* PLOTSUB.CCC Math Art Subs */ /* ACECIO.CCC ACE C functions */ /* ENGINE.OBJ ACE C runtime */ /* COL06F0.OBJ Default Colors */ int check1; char ca[6],cb[6],z0a[6],z0b[6]; char za[6],zb[6],real[6],imag[6]; char gapx[6],gapy[6],range[6]; char va[6],vb[6],vc[6],vd[6]; char ve[6],vf[6],vg[6],vh[6]; char acor[6],bcor[6],z1a[6],z1b[6]; char fp2[6],fp3[6],temp[6],temp1[6]; char *start,*ptr; char ac[6],bc[6],temps[20]; char xc[6],yc[6],magf[6]; char fspec[20], prevf[20]; int size,iterlmt,sizelmt; int a,b,j,k,n,esc,hres,vres; int lores,key,cr0,cr1,cr2,cr3,cr4; int col,formula,esc1,func,contflg; int x,y,tempi,tempi1; int qcnt,err,drv,check2; main() $( /* set Sparta RUNLOC */ if(peek(dpeek(10)+28)==128|| peek(0x0700)==0x53) dpoke(dpeek(10)+61,0x3635); /* initialize default variables */ if(peek(0x6F00)>0)check1=0; if(check1!=4321||check2!=8765) $( poke(0x6F00,0); itof(2,fp2);itof(3,fp3); j=0;k=0;iterlmt=20;sizelmt=10; formula=1;lores=1; atof(real,"0");atof(imag,"0"); atof(range,"3"); atof(ca,".6");atof(cb,"0"); poke(prevf,0);poke(fspec,0); graphics(8);defaultc(); $) /* loop always */ while(1) $( start=dpeek(0x0058); setresol(lores,start); menu(); if(func==1)newplot(); if(func==2)plotpic(); if(func==3)saveima(); if(func==4)loadima(); if(func==5)magnify(); if(func==6)viewima(); if(func==7)alter(); if(func==9)dispdata(); if(func==8) $( printf("↰↓ Select Drive (1-8) "); key=getchar();key=key-48; if(key>0&&key<9) $( drv=key;setdrive();dispdir(); $) $) if(func==10) $( printf("↰↓Press RETURN to Exit"); key=getkey();if(key==155) $( poke(752,0);printf("↰"); check1=4321;check2=8765;exit(); $) $) $) $) /* set drive number for ACE */ setdrive() $( poke(dpeek(0x2CB4),drv+48); $) /* confirm new plot */ newplot() $( printf("↰↓ *** NEW PLOT ***\n"); printf(" Are you sure? (Y/N)"); key=tolower(getkey()); if(key=='y')getdata(); $) /* alter colors (link) */ alter() $( altcolor();cr0=peek(708); cr1=peek(709);cr2=peek(710); cr3=peek(711);cr4=peek(712); $) /* main menu */ menu() $( if(formula<1||formula>4)formula=1; poke(range+4,0);poke(range+5,0); graphics(8+32);if(lores)gr7plus(); setcols();poke(82,2); printf("↰*** BIOMORPH *** %s\n",prevf); printf("Select: New Continue Save Load\n"); printf("Magnify View Parameters Files\n"); printf("Alter colors DOS"); func=0;while(func==0) $( poke(764,255); while(peek(764)==255) poke(77,0); key=tolower(getkey()); if(key=='n')func=1; if(key=='c')func=2; if(key=='s')func=3; if(key=='l')func=4; if(key=='m')func=5; if(key=='v')func=6; if(key=='a')func=7; if(key=='f')func=8; if(key=='p')func=9; if(key=='d')func=10; $) $) /* show plot parameters */ dispdata() $( poke(82,0);printf("↰"); if(func!=9)printf("↓ Current Parameters...↓\n"); printf("Real=%-14f CA=%f\n",real,ca); printf("Imag=%-14f CB=%f\n",imag,cb); printf("Range=%-13f Formula %d\n",range,formula); printf("Iter Limit=%-8d Size Limit=%d",iterlmt,sizelmt); if(func==9)waitkey(); $) /* get new plot parameters */ getdata() $( graphics(0);textcols(); dispdata();poke(82,2); printf("\n↓Enter New Parameters...↓\n"); printf("Real Center:");gets(temps); if(strlen(temps)>0)atof(real,temps); printf("Imag Center:");gets(temps); if(strlen(temps)>0)atof(imag,temps); printf("Plot Range :");gets(temps); if(strlen(temps)>0) atof(range,temps); printf("C Real (CA):"); gets(temps); if(strlen(temps)>0) atof(ca,temps); printf("C Imag (CB):"); gets(temps); if(strlen(temps)>0) atof(cb,temps); printf("Iter Limit :"); gets(temps); if(strlen(temps)>0)iterlmt=val(temps); printf("Size Limit :"); gets(temps); if(strlen(temps)>0)sizelmt=val(temps); printf("Formulas...\n"); printf(" 1. Z=Z^2+C\n"); printf(" 2. Z=Z^3+C\n"); printf(" 3. Z=Z^4+C\n"); printf(" 4. Z=Z^5+C\n"); printf("Which one:"); key=getkey()-48; if(key>0&&key<5) $( printf("%d",key);formula=key; $) printf("\nLow or High Resolution:"); key=tolower(getkey()); if(key=='l'||key=='h') $( tempi=lores; lores=0;if(key=='l')lores=1; if(tempi!=lores) defaultc(); $) j=0;k=0;graphics(8);poke(prevf,0); $) /* plot the image (if not done) */ plotpic() $( getresol(); if(k<vres) plotpic1(); $) plotpic1() $( printf("↰↓ While plotting...\n"); printf(" [F] Fast [S] Slow [ESC] Menu"); for(n=0;n<3000;n++);if(j==hres)j=0; if(j==0&&k==0)graphics(8+16); graphics(8+48);if(lores)gr7plus(); setcols(); itof(hres,va);fdiv(range,va,gapx); itof(vres,va);fdiv(range,va,gapy); fdiv(range,fp2,va); fsub(real,va,acor); fsub(imag,va,bcor); esc=0;contflg=0; for(;k<vres&&esc==0;k++) $( itof(k,va);fmul(va,gapy,va); fadd(va,bcor,z0b); if(contflg)j=0; for(;j<hres&&esc==0;j++) $( itof(j,va);fmul(va,gapx,va); fadd(va,acor,z0a); move(z0a,za,6);move(z0b,zb,6); n=0;poke(77,0); for(;n<iterlmt;n++) $( if(formula==2)compfnc2(); else if(formula==3)compfnc3(); else if(formula==4)compfnc4(); else compfnc1(); a=abs(ftoi(za));b=abs(ftoi(zb)); size=a*a;size+=b*b; if(size>sizelmt*sizelmt)break; if(a>sizelmt||b>sizelmt)break; $) if(lores==0) $( if(a<sizelmt||b<sizelmt)color(0); else color(1); plot(j,k); $) else $( if(a<sizelmt&&b<sizelmt)col=0; else if(a<sizelmt)col=1; else if(b<sizelmt)col=2; else col=3; pplot(j,k,col); $) contflg=1; key=peek(764);poke(764,255); if(key==28)esc=1; if(key==56)fast(); if(key==62)slow(); $) $) slow();if(esc) $( j--;k--; $) $) /* Function #1... */ /* za,zb = (za,zb)^2 + ca,cb */ compfnc1() $( fmul(za,za,va);fmul(zb,zb,vb); fsub(va,vb,z1a);fmul(fp2,za,vc); fmul(zb,vc,z1b);fadd(z1a,ca,za); fadd(z1b,cb,zb); $) /* Function #2... */ /* za,zb = (za,zb)^3 + ca,cb */ compfnc2() $( fmul(za,za,va);fmul(zb,zb,vb); fmul(vb,fp3,vd);fsub(va,vd,z1a); fmul(va,fp3,vd);fsub(vd,vb,z1b); fmul(za,z1a,z1a);fmul(zb,z1b,z1b); fadd(z1a,ca,za);fadd(z1b,cb,zb); $) /* Function #3 */ /* za,zb = (za,zb)^4 + ca,cb */ compfnc3() $( fmul(za,za,va);fmul(zb,zb,vb); fsub(va,vb,vc);fmul(fp2,za,vd); fmul(vd,zb,vd);fmul(vc,vc,va); fmul(vd,vd,vb);fsub(va,vb,z1a); fmul(fp2,vc,z1b);fmul(z1b,vd,z1b); fadd(z1a,ca,za);fadd(z1b,cb,zb); $) /* Function #4 */ /* za,zb = (za,zb)^5 + ca,cb */ compfnc4() $( /* vc,vd = (za,zb)^2 */ fmul(za,za,va);fmul(zb,zb,vb); fsub(va,vb,vc);fmul(za,zb,vd); fmul(fp2,vd,vd); /* ve,vf = (za,zb)^3 */ fmul(fp3,vb,ve);fmul(fp3,va,vf); fsub(va,ve,ve);fsub(vf,vb,vf); fmul(za,ve,ve);fmul(zb,vf,vf); /* z1a,z1b = vc,vd * ve,vf */ fmul(vc,ve,vg);fmul(vd,vf,vh); fsub(vg,vh,z1a);fmul(vc,vf,vg); fmul(vd,ve,vh);fadd(vg,vh,z1b); /* za,zb = z1a,z1b + ca,cb */ fadd(z1a,ca,za);fadd(z1b,cb,zb); $) /* set color registers */ setcols() $( poke(708,cr0);poke(709,cr1); poke(710,cr2);poke(711,cr3); poke(712,cr4);poke(752,1); $) /* get hres, vres */ getresol() $( if(lores==0) $( hres=320;vres=192; $) else $( hres=160;vres=192; $) $) /* compression ML */ encode() asm 0x6D40; decode() asm 0x6D43; /* save plot to disk */ saveima() $( poke(752,0); printf("↰*** SAVE PLOT ***\n"); printf("Name>");gets(fspec); tempi=strlen(fspec); if(tempi>0) $( normalize(fspec,"PIC");poke(752,1); printf("\nSaving %s...",fspec); err=open(4,8,0,fspec); if(err<0)errtrap(err); else $( strcpy(prevf,fspec); tempi=8;if(lores)tempi=15; cr3=254;/* compressed bitmap */ cputc(tempi,4);cputc(cr0,4); cputc(cr1,4);cputc(cr2,4); cputc(cr3,4);cputc(cr4,4); start=dpeek(0x0058); encode(start,7680,4); err=peek(0x0383); if(err>1)errtrap(err); else wrdata(); $) close(4); $) $) /* load plot */ loadima() $( poke(752,0); printf("↰*** LOAD PLOT ***\n"); printf("Name>");gets(fspec); tempi=strlen(fspec); if(tempi>0) $( normalize(fspec,"PIC"); err=open(4,4,0,fspec); if(err<0)errtrap(err); else $( tempi=cgetc(4); if(tempi==8||tempi==15) $( strcpy(prevf,fspec); lores=0;if(tempi==15)lores=1; graphics(8+16);if(lores)gr7plus(); cr0=cgetc(4);cr1=cgetc(4); cr2=cgetc(4);cr3=cgetc(4); cr4=cgetc(4);setcols(); start=dpeek(0x0058); if(cr3==254)decode(start,7680,4); else bgets(start,7680,4); err=peek(0x0383); if(err>1)errtrap(err); else $( rddata();getresol(); if(j==hres&&k==vres)waitkey(); $) $) else $( poke(752,1); printf("↰↓ Cannot Load File"); getkey(); $) $) close(4); $) $) /* write data block to #4 */ wrdata() $( printf(4,"%f\n",real); printf(4,"%f\n",imag); printf(4,"%f\n",range); printf(4,"%f\n",ca); printf(4,"%f\n",cb); printf(4,"%d\n",iterlmt); printf(4,"%d\n",sizelmt); printf(4,"%d\n",formula); printf(4,"%d\n",j); printf(4,"%d\n",k); $) /* read data block from #4 */ rddata() $( err=cgets(temps,4);if(err>0) $( atof(real,temps); cgets(temps,4);atof(imag,temps); cgets(temps,4);atof(range,temps); cgets(temps,4);atof(ca,temps); cgets(temps,4);atof(cb,temps); cgets(temps,4);iterlmt=val(temps); cgets(temps,4);sizelmt=val(temps); cgets(temps,4);formula=val(temps); cgets(temps,4);j=val(temps); cgets(temps,4);k=val(temps); $) $) /* magnify an area */ magnify() $( getresol();x=hres/2;y=vres/2;esc=0; while(esc==0) $( graphics(8+48);if(lores)gr7plus(); setcols();esc=0;qcnt=1; while(esc==0) $( drawcurs(x,y);tempi=x+y; key=peek(764);poke(764,255); if(key==14)y-=qcnt; if(key==15)y+=qcnt; if(key==6)x-=qcnt; if(key==7)x+=qcnt; if(key==12)esc=1; if(tempi!=x+y) $( qcnt=qcnt+1;if(qcnt>10)qcnt=10; if(x<2)x+=hres-4; else if(x>=hres-2)x-=hres-4; else if(y<2)y+=vres-4; else if(y>=vres-2)y-=vres-4; $) else qcnt=1; $) graphics(8+32);if(lores)gr7plus(); setcols();poke(752,1);printf("↰"); itof(hres,temp); fdiv(range,temp,gapx); itof(vres,temp); fdiv(range,temp,gapy); itof(2,temp); fdiv(range,temp,temp1); fsub(real,temp1,acor); fsub(imag,temp1,bcor); itof(x,temp); fmul(gapx,temp,temp); fadd(acor,temp,xc); itof(y,temp); fmul(gapy,temp,temp); fadd(bcor,temp,yc); printf("Real=%f\nImag=%f\n",xc,yc); printf("Find Magnify Set\n"); printf("RETURN for menu "); esc=0;while(esc==0) $( key=tolower(getkey()); if(key=='f'||key=='m'||key=='s'|| key==155)esc=1; $) esc=0;if(key==155)esc=1; if(key=='s') $( esc=1;poke(prevf,0);graphics(8); move(xc,ca,6);move(yc,cb,6); atof(real,"0");atof(imag,"0"); atof(range,"4");j=0;k=0; iterlmt=20;sizelmt=10;formula=1; $) if(key=='m') $( poke(752,0);esc=1; printf("↰Current Range=%f\n",range); printf("Enter Magnification :"); gets(temps); if(strlen(temps)>0) $( atof(magf,temps); fdiv(range,magf,range); move(xc,real,6);move(yc,imag,6); j=0;k=0;graphics(8);poke(prevf,0); $) $) $) $) /* default colors */ defaultc() $( ptr=0x06F0;if(lores) $( cr0=*(ptr);cr1=*(ptr+1); cr2=*(ptr+2);cr4=*(ptr+3); $) else $( cr1=*(ptr+4);cr2=*(ptr+5); cr4=*(ptr+6);cr0=0; $) cr3=254;setcols(); $) /* end of part one */