#include <vectrex.h>

const int dots[8] = {
  -60, 10,
   71, 50,
   57, -69,
   -66,-61,
};

int rotated[8];

static inline void scale(unsigned int scalefac) {/*VIA_t1_cnt_lo*/ *(volatile unsigned int *)0xD004 = scalefac;}
static inline void rotate(unsigned int angle, unsigned int points, const int *original, int *rotated)
{
  *(volatile unsigned int *)0xC836 = angle;
  *(volatile unsigned int *)0xC823 = points-1;
  Rot_VL((int *)original, rotated);
}

int main(void)
{
  int angle=63, sc = (int)0xFF, i;
  for (;;) {
    for (i = 0; i < 0x30; i++) {
		Wait_Recal();
        *(volatile char *)0xC823 = 3;
        Intensity_a(((unsigned int)sc-(unsigned int)0xBF)/2U);
        scale((unsigned int)sc-(unsigned int)0xBF);
        Dot_List((void *)dots);  Reset0Ref(); 
 
        rotate((unsigned int)((angle+11)&63), (unsigned int)4, dots, rotated);
        *(volatile char *)0xC823 = 3;
        Intensity_a(((unsigned int)sc-(unsigned int)0x7F)/2U);
        scale((unsigned int)sc-(unsigned int)0x7F);
        Dot_List((void *)rotated);   Reset0Ref();     

        rotate((unsigned int)((angle+14)&63), (unsigned int)4, dots, rotated);
        *(volatile char *)0xC823 = 3;
        Intensity_a(((unsigned int)sc-(unsigned int)0x3F)/2U);
        scale((unsigned int)sc-(unsigned int)0x3F);
        Dot_List((void *)rotated);   Reset0Ref();     

        rotate((unsigned int)((angle+4)&63), (unsigned int)4, dots, rotated);
        *(volatile char *)0xC823 = 3;
        scale((unsigned int)sc);
        Intensity_a(((unsigned int)sc)/2U);
        Dot_List((void *)rotated);        
        sc -= 4;
    };
  }	
  return 0;
}
