#include <vectrex.h>

#define SCALE (127/14)
#define SPACING 30
#define XOFFSET (107)
#define YOFFSET (30)

const int pawn[] = {
  -1,0*SCALE,-10*SCALE,

  -1,2*SCALE,3*SCALE,
  -1,6*SCALE,0*SCALE,
  -1,2*SCALE,-2*SCALE,
  -1,3*SCALE,4*SCALE,
  -1,-3*SCALE,4*SCALE,
  -1,-2*SCALE,-2*SCALE,
  -1,-6*SCALE,0*SCALE,
  -1,-2*SCALE,3*SCALE,

  1
};

const int castle[] = {
  -1,0*SCALE,-10*SCALE,

  -1,2*SCALE,2*SCALE,
  -1,10*SCALE,0*SCALE,
  -1,1*SCALE,-2*SCALE,
  -1,3*SCALE,0*SCALE,
  -1,0*SCALE,2*SCALE,
  -1,-2*SCALE,0*SCALE,
  -1,0*SCALE,2*SCALE,
  -1,2*SCALE,0*SCALE,
  -1,0*SCALE,2*SCALE,
  -1,-2*SCALE,0*SCALE,
  -1,0*SCALE, 2*SCALE,
  -1,2*SCALE,0*SCALE,
  -1,0*SCALE,2*SCALE,
  -1,-3*SCALE,0*SCALE,
  -1,-1*SCALE,-2*SCALE,
  -1,-10*SCALE,0*SCALE,
  -1,-2*SCALE,2*SCALE,

  1
};

const int knight[] = {
  -1,0*SCALE,-10*SCALE,

  -1,2*SCALE,2*SCALE,
  -1,1*SCALE,-2*SCALE,
  -1,11*SCALE,3*SCALE,
  -1,2*SCALE,3*SCALE,
  -1,-1*SCALE,0*SCALE,
  -1,-2*SCALE,4*SCALE,
  -1,-2*SCALE,0*SCALE,
  -1,0*SCALE,-4*SCALE,
  -1,-8*SCALE,4*SCALE,
  -1,-1*SCALE,-2*SCALE,
  -1,-2*SCALE,2*SCALE,

  1
};

const int bishop[] = {
  -1,0*SCALE,-10*SCALE,

  -1,2*SCALE,3*SCALE,
  -1,12*SCALE,-2*SCALE,
  -1,4*SCALE,4*SCALE,
  -1,-4*SCALE,4*SCALE,
  -1,-4*SCALE,-4*SCALE,
  -1,2*SCALE,4*SCALE,
  -1,-10*SCALE,-2*SCALE,
  -1,-2*SCALE,3*SCALE,

  1
};

const int queen[] = {
  -1,0*SCALE,-10*SCALE,

  -1,2*SCALE,3*SCALE,
  -1,10*SCALE,0*SCALE,
  -1,0*SCALE,-2*SCALE,
  -1,10*SCALE,0*SCALE,
  -1,-4*SCALE,2*SCALE,
  -1,4*SCALE,2*SCALE,
  -1,-4*SCALE,2*SCALE,
  -1,4*SCALE,2*SCALE,
  -1,-10*SCALE,0*SCALE,
  -1,0*SCALE,-2*SCALE,
  -1,-10*SCALE,0*SCALE,
  -1,-2*SCALE,3*SCALE,

  1
};

const int king[] = {
  -1,0*SCALE,-10*SCALE,

  -1,2*SCALE,3*SCALE,
  -1,14*SCALE,1*SCALE,
  -1,1*SCALE,-4*SCALE,
  -1,1*SCALE,4*SCALE,
  -1,4*SCALE,1*SCALE,
  -1,-4*SCALE,1*SCALE,
  -1,-1*SCALE,4*SCALE,
  -1,-1*SCALE,-4*SCALE,
  -1,-14*SCALE,1*SCALE,
  -1,-2*SCALE,3*SCALE,

  1
};

static inline void set_scale(unsigned int s) {
  VIA_t1_cnt_lo = s;
}

#define WHITE 3
#define BLACK 0

int row, col, colour;
static inline void draw(const int *piece) {
  // black pieces are darker and do not have a base line
  Reset0Ref(); set_scale(127); Moveto_d(row,col); set_scale(16);
  col += SPACING;
  if (colour == BLACK) Moveto_d(0,10*SCALE);
  Draw_VLp((int *)piece+colour);
}

const int *piece[8] = {castle, knight, bishop, queen, king, bishop, knight, castle};

int main(void) {
  int i;
  for (;;) {
    Wait_Recal();

    Intensity_a(80);
    row = (SPACING<<2)-YOFFSET; col = -XOFFSET; colour = WHITE;
    for (i = 0; i < 8; i++) draw(pawn);
    row += SPACING; col = -XOFFSET;
    for (i = 0; i < 8; i++) draw(piece[i]);

    Intensity_a(120);
    row = (int)SPACING*-2-YOFFSET; col = -XOFFSET; colour = BLACK;
    for (i = 0; i < 8; i++) draw(pawn);
    row -= SPACING; col = -XOFFSET;
    for (i = 0; i < 8; i++) draw(piece[i]);
  }
  return 0;
}