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