/*----------------------------------------------------------------------------------------

                block1.c

                Blockheads shall rule the world!

               

                (c) 1998  Jason Ditmars // dope-a-delic

----------------------------------------------------------------------------------------*/

 

 

/* I/O defs:

 

PortA: 74hc154 enable (pin 2)

PortB 0-7 single light outputs (PNPs switch light on when pin is H)

PortC 0-7 single light outputs

PortD 0-3 multiplexed outputs (4 to 16)

           4-5 single light outputs

PortE: unused

 

total of 34 outputs for 34 blockheads    */

 

 

#include "mytimer.h"

#include "mystdlib.h"

void wait(int);

void pass_the_ball(int,int);

void binary_counter(int,int);

void blinkfuck(int);

void back_and_forth(void);

void blink_d(void);

void srand(unsigned int);

void countdown(void);

int rand(void);

 

void main(void){

                int i;

                unsigned int jooky;

                hc11setup();

                PORTA = 0xFF;                                    /* disable 74hc154 */

                while(1==1){

                                if (jooky == 32000)

                                                jooky = 1;

                                srand(jooky);

                                jooky++;

                                back_and_forth();

                                pass_the_ball((int)30,500);

                                blink_d();

                                wait(100+(rand() % 300));

                                pass_the_ball((int)40,(1400+(rand() % 6000)));

                                if ((rand() % 3) == 1)

                                                binary_counter((int)18,1700);

                                pass_the_ball((int)20,2000);

                                wait(200);

                                pass_the_ball((int)50,(400+(rand() % 300)));

                                wait(400);

                                if ((rand() % 3) == 1)

                                                binary_counter((int)10,1300);

                                wait(1000);

                                pass_the_ball((int)17,(2500+(rand() % 5000)));

                                wait(100);

                                blink_d();

                                for (i=0;i<(3+(rand() % 12));i++)

                                                pass_the_ball((int)(5+(rand() % 30)),(200+(rand() % 3000)));

                                wait(500);

                                pass_the_ball((int)50,(140+(rand() % 200)));

                                wait(1000);

                                blink_d();

                                pass_the_ball((int)14,10000);

                                wait(200);

                                i=(rand() % 4);

                                if (i==3)

                                                countdown();

                }

}

 

void countdown(){

                int c;

                for(c=25;c>-50;c--)

                                blinkfuck(c);

}

 

void blinkfuck(int c){

                PORTB = 0;

                PORTC = 0xff;

                if (c>0)

                                wait(c*6);

                else

                                wait(4);

                PORTB = 0xff;

                PORTC = 0;

                if (c>0)

                                wait(c*5);

                else

                                wait(4);

}

 

void blink_d(){

                int i,j,k;

                j=(rand() % 20);

                k=(rand() % 9);

                PORTB = 1;

                for (i=0;i<k;i++)

                                PORTB<<=1;

                k = PORTB;

                PORTA = 0;                          /* enable 74154 */

                for (i=0;i<10;i++){

                                PORTD = j;

                                PORTB = k;

                                wait(20);

                                PORTD = 0;

                                PORTB = 0;

                                wait(20);

                }

                PORTA = 0xff;

}

 

void back_and_forth(){

                int i;

                for (i=0;i<3;i++){

                                PORTB = 0xff;

                                wait(50);

                                PORTB = 0x00;

                                PORTC = 0xff;

                                wait(50);

                                PORTC = 0x00;

                }

}

 

void binary_counter(int speed,int duration){

                int i;

                RTICntr = 0;

                while(duration > RTICntr){

                                for(i=0;i<256;i++){

                                                PORTB = i;

                                                wait(speed);

                                }

                                for(i=0;i<256;i++){

                                                PORTC = i;

                                                wait(speed - 10);

                                }

                }

}

 

void pass_the_ball(int speed,int duration){

                int bulk,i;

                bulk = (rand() % 6);

                if (bulk > 4)

                                bulk = 1;

                RTICntr = 0;

                while(duration > RTICntr){                                /* do it this long */

                                PORTD = 0x10;

                                wait(speed);

                                PORTD = 0x20;

                                wait(speed);                                          /* stragglers */

                                PORTD = 0;

                                PORTB = bulk;

                                while(PORTB != 0){

                                                wait(speed);

                                                i=(rand() % 16);

                                                if (i == 10){

                                                                PORTB = (rand() % 256);

                                                                wait((10 + (rand() % 400)));

                                                }

                                                PORTB<<=1;                        /* lft shift across B */

                                }

                                PORTC = bulk;                                     /* lft shift across C */

                                while(PORTC != 0){

                                                wait(speed);

                                                i=(rand() % 20);

                                                if (i == 10){

                                                                PORTC = (rand() % 256);

                                                                wait((10 + (rand() % 200)));

                                                }

                                                PORTC<<=1;

                                }

                                PORTA=0;                                            /* enable, ya! */

                                PORTD=0;

                                while(PORTD < 16){                            /* across 74154 */

                                                wait(speed);

                                                PORTD++;

                                }

                                PORTA=0xFF;                                      /* disable, woo! */

                }

}

 

void wait(int dur){

                long i = RTICntr;

                while(RTICntr < (dur+i));

}

BACK