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

#define n360    3600         /* scale  3600 -- 360 degree */
#define n180    1800         /* shift  south=1800         */

#define slit    12
#define t_gap   28
#define d120    30           /* origion 120 */
#define p824    788


#define xstep 192
#define ystep 144
#define dtime   1

#define ss    1.2                /* 1.25 time speed */
#define WORD  unsigned short

double pi,twopi,phi,sphi,cphi;
double angle,alpha,delta,s0;
int z0,z1,z2,z3;

int  ww[4];

main(ac,av)
int ac; char *av[];
{
  char c;
  int i,j,k,w;
  WORD  dx,dy;
  float x,y;
  if(ac<3){
    printf("\n\t  Usage: calatmc 15.0  0\n");
    printf("\n\t  means: RA_direct +, 15 arcsec/sec; Dec not moved\n");
    printf("\n\t         disptmc 200 -400.9");
    printf("\n\t  means: RA +, 200.0 arcsec/sec; Dec -, 400.9 arcsec/sec\n");
    printf("\n\t  speed: RA  0, 0.046~2000\n");
    printf("\t\t 0.046 <+-0.001   90~0.01   300~0.1   880~1  2000 >2\n");
    printf("\n\t  speed  Dec 0, 0.035~1500\n");
    printf("\t\t 0.035 <+-0.001   76~0.01   275~0.1   776~1  1500 >2\n");
    printf("\n\t   Notice: run in DOS or win98\n");
    exit(0);
  }
  sscanf(av[1],"%f",&x);

  dx=1; if(x<0.){ dx=0; x=-x; }
  if(x>2000.)goto toofast;
  sscanf(av[2],"%f",&y);
  dy=1; if(y<0.){ dy=0; y=-y; }
  if(y>1500.)goto toofast;
  k=0;  if(dx)k+=4;  if(dy==0)k+=8;
  printf("RA"); startcw(1,&x,xstep); printf("%5.2fs %d\"\n",ww[0]*0.055,ww[1]);
  printf("DE"); startcw(3,&y,ystep); printf("%5.2fs %d\"\n",ww[0]*0.055,ww[1]);
  printf("START NORMAL TRACING!\n\n");
  ww[3]+=ww[0]*x*0.055;
  printf("Time_all:  %5.2fs\n",(ww[0]+ww[2])*0.055);
  if(dx==0)ww[3]=-ww[3];
  if(dy==0)ww[1]=-ww[1];
  printf("RA move:    %d\"\n", ww[3]);
  printf("DE move:    %d\"\n", ww[1]);
  exit(0);
toofast:
  printf("\n\n\t Set parameter error, too fast!\n");
}

startcw(char chip, float *xy, WORD step)
{
  float f,x,z,s,dis=0;
  WORD  i,j,k;
  int  z0,z1;
  ww[2]=ww[0];
  ww[3]=ww[1];
  ww[0]=ww[1]=0;
  z0=peek(0,0x46c);
  x=*xy;
  if(x<=0.)return;
               j=512;
  if(x>step/64)j=32;
  if(x>step/8) j=2;
  f=8000./j;
  z=f*step/x+0.5; if(z>65535)z=65535; k=z;
  tmc10_c1(chip,j);
  if(j>2)goto l20;
  i=20000;
  if(i>k){ tmc10_c2(chip,i);  delay50(dtime);
           s=f*step/i;
           dis+=s;
  }
L10:
  if(i>k){
    tmc10_c2(chip,i);  delay50(dtime);
    printf(".");
           s=f*step/i;
    dis+=s;
    i/=ss;
    goto L10;
  }
l20:
  tmc10_c2(chip,k);
           s=f*step/k;
  z1=peek(0,0x46c);
/*printf("%d %f %f\n",z1-z0,s,dis*0.055); */
  ww[0]=z1-z0;
  ww[1]=dis*0.055;
}

tmc10_c1(char chip, WORD speed)
{
  return;
}

tmc10_c2(char chip, WORD speed)
{
  return;
}

delay50(int i)
{
  int j,k,m;
  m=0;
  j=peek(0,0x46c);
l10:
  k=peek(0,0x46c);
  if(j==k)goto l10;
  m++;
  if(m>i)return;
  j=k;
  goto l10;
}
