/*----------------------------------------------------------------------------------------
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));
}