/* === LINEAUTO = Vers 2/12/92 */ /* By William T Newton 4/18/89 */ /* This program generates one */ /* dimensional line automata */ /* from a rule string of the */ /* digits 0-3. Link to... */ /* AUTO.OBJ Generation ML */ /* GR7P6F00.OBJ Simulate GR15 */ /* ACECIO.CCC Function Libr */ /* ENGINE.OBJ ACE C Runtime */ char rulestr[23],rule[23]; char pattern[160],inpstr[80]; int radius,midflg,esc,temp,i,rand; int rulelen,pattlen,key; int c0,c1,c2,c3,randmode; int creg,cbyte,intens,hue; int curpos,esc1; char *text; main() $( /* set Sparta RUNLOC */ if(peek(dpeek(10)+28)==128|| peek(0x0700)==0x53) dpoke(dpeek(10)+61,0x3635); intro();randmode=1; c0=0;c1=8+192;c2=12+64;c3=4+128; clear(inpstr,23);clear(pattern,160); strcpy(inpstr,"1012132"); convrule(); graphics(8);graphics(8+32); gr7plus();setcols(); while(1) $( esc=1;while(esc) $( clear(inpstr,23); strcpy(inpstr,rulestr); printf("↰↓Rule:%s\n",rulestr); temp=radius*2; if(midflg==0)temp++; printf("Neighborhood Size:%d\n",temp); poke(752,0);printf("↑↑→→→→→"); inputstr(); if(i=='C')altcols(); else if(i=='E')edit(); else if(i=='R')randmode=1; else if(i==155)esc=0; else convrule(); $) convrule(); /* random starting pattern */ if(randmode) $( i=0;for(;i<160;i++) $( rand=peek(0xd20a)&3; poke(pattern+i,rand); $) $) /* run the automaton */ setauto(rule,pattern,radius,midflg); graphics(8+48);gr7plus();setcols(); esc=0;while(esc==0) $( clear(dpeek(0x0058),7680); runauto(); key=getkey();if(key=='␛')esc=1; $) graphics(8+32);gr7plus();setcols(); $) $) /* start automaton code */ setauto() asm 0x7000; /* generate automaton code */ runauto() asm 0x7003; /* gr7plus mach code */ gr7plus() asm 0x6F01; /* set plotting colors */ setcols() $( poke(708,c1);poke(709,c2); poke(710,c3);poke(712,c0); $) /* Alter Colors */ altcols() $( creg=0; esc=0; while(esc==0) $( poke(752,1); if(creg==0)i=712;else i=707+creg; cbyte=peek(i)&254; hue=cbyte/16; intens=hue*16; intens=(cbyte-intens)&14; printf("\f CHANGE COLOR REGISTERS\n"); printf("\n R Reg:%-2d H Hue:%-2d L Lum:%d",creg,hue,intens); key=toupper(getkey()); if(key=='R') $( creg++; if(creg>3) creg=0; $) else if(key=='H') $( hue++; if(hue>15) hue=0; $) else if(key=='L') $( intens+=2; if(intens>14) intens=0; $) else esc=1; if(key=='H' || key=='L') $( cbyte=hue*16; cbyte+=intens; if(creg==0)i=712;else i=707+creg; poke(i,cbyte); $) $) c0=peek(712);c1=peek(708); c2=peek(709);c3=peek(710); $) /* edit starting pattern */ edit() $( text=peek(106)*256;text-=160; esc=0;while(esc!=1) $( randmode=0;curpos=0; poke(82,0);poke(752,1);printf("↰"); i=0;for(;i<158;i++) poke(text+i,peek(pattern+i)+16); poke(752,0);printf("\r\l"); esc=0;while(esc==0) $( key=getkey(); if(key>='0'&&key<='3') $( i=key-48;poke(pattern+curpos,i); printf("\r"); poke(text+curpos,i+16);curpos++; if(curpos==40||curpos==80|| curpos==120)printf("↓"); if(curpos>157) $( curpos=157;printf("\l"); $) $) if(key=='+'&&curpos>0) $( curpos--;printf("\l"); if(curpos==39||curpos==79|| curpos==119)printf("↑"); $) if(key=='*'&&curpos<158) $( curpos++;printf("\r"); if(curpos==40||curpos==80|| curpos==120)printf("↓"); $) if(key=='-'&&curpos>39) $( printf("↑");curpos-=40; $) if(key=='='&&curpos<118) $( printf("↓");curpos+=40; $) if(key=='␛')esc=1; if(key=='↰')esc=2; $) if(esc==2) for(i=0;i<160;i++) poke(pattern+i,0); $) poke(82,2); $) /* convert input into rule */ convrule() $( rulelen=strlen(inpstr); if(rulelen>22)rulelen=22; clear(rule,23);clear(rulestr,23); i=0;for(;i<rulelen;i++) $( temp=0;key=peek(inpstr+i); if(key=='1')temp=1; if(key=='2')temp=2; if(key=='3')temp=3; poke(rule+i,temp); if(temp==0)key='0'; if(temp==1)key='1'; if(temp==2)key='2'; if(temp==3)key='3'; poke(rulestr+i,key); $) rulelen=strlen(rulestr); /* normalize rule length */ while(rulelen%3!=1||rulelen<7) $( poke(rulestr+rulelen,'0'); rulelen++; $) /* infer radius and middle count */ radius=1;midflg=1; if(rulelen==10)midflg=0; else if(rulelen==13)radius=2; else if(rulelen==19)radius=3; else if(rulelen==16) $( radius=2;midflg=0; $) else if(rulelen==22) $( radius=3;midflg=0; $) $) inputstr() $( curpos=0;esc1=1;while(esc1) $( i=toupper(getkey()); if(i=='↰'||i=='<') $( poke(inpstr+curpos,0);esc1=0; $) if(i>='0'&&i<='3') $( printf("%c",i); poke(inpstr+curpos,i); curpos++; if(curpos>21) $( printf("\l");curpos--; $) $) if(i=='+'&&curpos>0) $( printf("\l");curpos--; $) if(i=='*'&&curpos<22) $( printf("\r");curpos++; $) if(i==155||i==' '||i=='C'|| i=='E'||i=='R')esc1=0; $) $) /* introducing... */ intro() $( graphics(0);poke(752,1); poke(709,12);poke(710,0);poke(712,0); printf("*** LINEAUTO *** By Terry Newton\n"); printf("This program generates four state\n"); printf("one dimensional automata from a rule\n"); printf("string of the digits 0 to 3 defining\n"); printf("the next state for all state totals.\n\n"); printf("At rule prompt...\n"); printf(" [0][1][2][3] Change rule state\n"); printf(" [+][*] Move cursor\n"); printf(" [Clear] Zero rule from cursor\n"); printf(" [Space] Normalize rule length\n"); printf(" [Return] Generate automaton\n"); printf(" [C] Change plotting colors\n"); printf(" [E] Edit starting pattern\n"); printf(" [R] Random start mode\n\n"); printf("While editing start...\n"); printf(" [0][1][2][3] Change cell states\n"); printf(" [+][*][-][=] Move cursor\n"); printf(" [Clear] Zero all cells\n"); printf(" [ESC] Go to rule prompt\n\n"); printf("During automaton press [ESC] to exit\n"); printf("or any key for next screen."); getkey(); $)