#include <stdio.h>
#include <math.h>

#include "asin_param.h"
#include "asin_result.h"

#define TABLESIZE 256

#define fp2_14 short
//#define DEBUG

int main(int argc, char **argv) {
  int i, angle;
  fp2_14 asintab[256];

  fprintf(stdout, "fp2_14 asintab[256] = { // multiply by 360 for degrees, by 256 for angles\n");
  fprintf(stdout, "                        // (float)asintab[x]*(360.0)/(1<<14) would be directly equivalent to scratch's asin\n");
  fprintf(stdout, "                        // but we want asintab[x]>>6 for 256 angles\n");
  for (angle = 0; angle < 256; angle++) {
    int x = angle;
    asintab[x] = (int)lrint(((float)(1<<14) * (float)asin(((float)x-TABLESIZE/2.0)/(TABLESIZE/2.0)))/(2.0 * 3.1415926));;
    fprintf(stdout, "  %5hd,",
                     asintab[x]
           );
    if ((angle&7) == 7) fprintf(stdout, "\n");
  }
  fprintf(stdout, "};\n");

#ifdef NEVER
  for (angle = 0; angle < 256; angle++) {
    //-1.0 maps to -128
    //0.999 maps to 127
    fprintf(stdout, "%d (%f) %f\n", angle-128, (angle-128)/128.0, (float)asin(((float)angle-128.0)/128.0)*90.0);
  }
#endif
  // asin_x -> asin_result
  // again, not exact, but close enough for video game work!
#ifdef DEBUG
  for (i = 0; i < 1786; i++) {
    int x = (int)lrint(asin_x[i] * (TABLESIZE/2.0) + (TABLESIZE/2.0));
    fprintf(stdout, "asin(%f) -> %f; asintab[%d] = %1.3fdeg (%d)\n",
                     asin_x[i],
	             asin_result[i],
                     x,
                     (float)asintab[x]*(360.0)/(1<<14), // FP2_14 accuracy
                     asintab[x]>>6 // FP2_14 accuracy
           );
  }
#endif

  return 0;
}
