#include "asinacos.h"

int coslimit[] = {
    	32767	,
	32767	,
	32766	,
	32765	,
	32763	,
	32761	,
	32758	,
	32755	,
	32751	,
	32747	,
	32742	,
	32737	,
	32731	,
	32725	,
	32718	,
	32711	,
	32703	,
	32695	,
	32686	,
	32677	,
	32667	,
	32657	,
	32647	,
	32636	,
	32624	,
	32612	,
	32599	,
	32586	,
	32573	,
	32559	,
	32544	,
	32529	,
	32514	,
	32498	,
	32482	,
	32465	,
	32448	,
	32430	,
	32412	,
	32393	,
	32374	,
	32355	,
	32335	,
	32314	,
	32293	,
	32272	,
	32250	,
	32228	,
	32206	,
	32183	,
	32159	,
	32136	,
	32111	,
	32087	,
	32061	,
	32036	,
	32010	,
	31984	,
	31957	,
	31930	,
	31902	,
	31875	,
	31846	,
	31818	,
	31789	,
	31759	,
	31729	,
	31699	,
	31669	,
	31638	,
	31607	,
	31575	,
	31543	,
	31511	,
	31478	,
	31445	,
	31412	,
	31378	,
	31344	,
	31310	,
	31275	,
	31241	,
	31205	,
	31170	,
	31134	,
	31098	,
	31061	,
	31024	,
	30987	,
	30950	,
	30912	,
	30874	,
	30836	,
	30798	,
	30759	,
	30720	,
	30681	,
	30641	,
	30601	,
	30561	,
	30521	,
	30481	,
	30440	,
	30399	,
	30358	,
	30316	,
	30274	,
	30232	,
	30190	,
	30148	,
	30105	,
	30063	,
	30020	,
	29977	,
	29933	,
	29890	,
	29846	,
	29802	,
	29758	,
	29714	,
	29669	,
	29625	,
	29580	,
	29535	,
	29490	,
	29444	,
	29399	,
	29353	,
	29308	,
	29262	,
	29216	,
	29170	,
	29123	,
	29077	,
	29030	,
	28984	,
	28937	,
	28890	,
	28843	,
	28796	,
	28749	,
	28701	,
	28654	,
	28607	,
	28559	,
	28511	,
	28463	,
	28416	,
	28368	,
	28319	,
	28271	,
	28223	,
	28175	,
	28127	,
	28078	,
	28030	,
	27981	,
	27932	,
	27884	,
	27835	,
	27786	,
	27738	,
	27689	,
	27640	,
	27591	,
	27542	,
	27493	,
	27444	,
	27395	,
	27346	,
	27297	,
	27247	,
	27198	,
	27149	,
	27100	,
	27051	,
	27001	,
	26952	,
	26903	,
	26854	,
	26804	,
	26755	,
	26706	,
	26657	,
	26607	,
	26558	,
	26509	,
	26460	,
	26410	,
	26361	,
	26312	,
	26263	,
	26214	,
	26164	,
	26115	,
	26066	,
	26017	,
	25968	,
	25919	,
	25870	,
	25821	,
	25772	,
	25723	,
	25675	,
	25626	,
	25577	,
	25528	,
	25480	,
	25431	,
	25382	,
	25334	,
	25285	,
	25237	,
	25188	,
	25140	,
	25092	,
	25044	,
	24995	,
	24947	,
	24899	,
	24851	,
	24803	,
	24755	,
	24707	,
	24660	,
	24612	,
	24564	,
	24517	,
	24469	,
	24422	,
	24374	,
	24327	,
	24280	,
	24233	,
	24186	,
	24139	,
	24092	,
	24045	,
	23998	,
	23951	,
	23905	,
	23858	,
	23812	,
	23765	,
	23719	,
	23673	,
	23627	,
	23581	,
	23535	,
	23489	,
	23443	,
	23397	,
	23351	,
	23306	,
	23260	,
	23215	,
	23170	};

int sinlimit[] = {
0	,
128	,
256	,
384	,
512	,
640	,
768	,
896	,
1023	,
1151	,
1279	,
1407	,
1534	,
1662	,
1789	,
1917	,
2044	,
2171	,
2298	,
2425	,
2552	,
2679	,
2806	,
2932	,
3058	,
3185	,
3311	,
3437	,
3563	,
3688	,
3814	,
3939	,
4064	,
4189	,
4314	,
4439	,
4563	,
4687	,
4811	,
4935	,
5058	,
5182	,
5305	,
5428	,
5550	,
5673	,
5795	,
5917	,
6039	,
6160	,
6281	,
6402	,
6523	,
6643	,
6763	,
6883	,
7002	,
7121	,
7240	,
7359	,
7477	,
7595	,
7713	,
7830	,
7947	,
8064	,
8180	,
8296	,
8412	,
8527	,
8642	,
8757	,
8872	,
8986	,
9099	,
9212	,
9325	,
9438	,
9550	,
9662	,
9774	,
9885	,
9995	,
10106	,
10216	,
10325	,
10435	,
10543	,
10652	,
10760	,
10868	,
10975	,
11082	,
11188	,
11294	,
11400	,
11505	,
11610	,
11715	,
11819	,
11922	,
12026	,
12128	,
12231	,
12333	,
12434	,
12535	,
12636	,
12737	,
12836	,
12936	,
13035	,
13134	,
13232	,
13330	,
13427	,
13524	,
13620	,
13717	,
13812	,
13907	,
14002	,
14097	,
14191	,
14284	,
14377	,
14470	,
14562	,
14654	,
14745	,
14836	,
14927	,
15017	,
15106	,
15196	,
15284	,
15373	,
15461	,
15548	,
15635	,
15722	,
15808	,
15894	,
15979	,
16064	,
16149	,
16233	,
16317	,
16400	,
16483	,
16565	,
16647	,
16729	,
16810	,
16891	,
16971	,
17051	,
17130	,
17210	,
17288	,
17366	,
17444	,
17522	,
17599	,
17675	,
17752	,
17827	,
17903	,
17978	,
18052	,
18127	,
18200	,
18274	,
18347	,
18419	,
18492	,
18563	,
18635	,
18706	,
18777	,
18847	,
18917	,
18986	,
19055	,
19124	,
19192	,
19260	,
19328	,
19395	,
19462	,
19528	,
19594	,
19660	,
19726	,
19791	,
19855	,
19919	,
19983	,
20047	,
20110	,
20173	,
20235	,
20297	,
20359	,
20421	,
20482	,
20542	,
20603	,
20663	,
20722	,
20782	,
20841	,
20899	,
20958	,
21016	,
21073	,
21130	,
21187	,
21244	,
21300	,
21356	,
21412	,
21467	,
21523	,
21577	,
21632	,
21686	,
21739	,
21793	,
21846	,
21899	,
21951	,
22004	,
22056	,
22107	,
22159	,
22210	,
22260	,
22311	,
22361	,
22411	,
22460	,
22510	,
22558	,
22607	,
22656	,
22704	,
22752	,
22799	,
22846	,
22893	,
22940	,
22987	,
23033	,
23079	,
23124	,
23170	};

int limiter( int *vd, int *vq)
{
 int vdt;
 int vqt;
 int quad=0;
 int ratio;
 int i;

 //figure out whcih quaderant and correct temp variables to Quad 0
 vdt=*vd;
 vqt=*vq;

 if (vdt<0)
 {
     quad+=2;
     vdt=-vdt;
 }

 if (vqt<0)
 {
     quad+=1;
     vqt=-vqt;
 }

 if (vdt>vqt)
 {
    i=vdt>>8;
    i=vqt/i;
    switch (quad)
    {
        case 0:
            if ((vdt<coslimit[i])&&(vqt<sinlimit[i])) return (0);  //magnituide is acceptablle
            *vd=coslimit[i];  //to big limit
            *vq=sinlimit[i];
            return (1);
        case 1:
            if ((vdt<coslimit[i])&&(vqt<sinlimit[i])) return (0);  //magnituide is acceptablle
            *vd=coslimit[i];  //to big limit
            *vq=-sinlimit[i];
            return (1);
        case 2:
            if ((vdt<coslimit[i])&&(vqt<sinlimit[i])) return (0);  //magnituide is acceptablle
            *vd=-coslimit[i];  //to big limit
            *vq=sinlimit[i];
            return (1);
        case 3:
            if ((vdt<coslimit[i])&&(vqt<sinlimit[i])) return (0);  //magnituide is acceptablle
            *vd=-coslimit[i];  //to big limit
            *vq=-sinlimit[i];
            return (1);
    }
  }
  else
  {
     i=vqt>>8;
     i=vdt/i;
     switch (quad)
     {
        case 0:
            if ((vqt<coslimit[i])&&(vdt<sinlimit[i])) return (0);  //magnituide is acceptablle
            *vq=coslimit[i];  //to big limit
            *vd=sinlimit[i];
            return (1);
        case 1:
            if ((vqt<coslimit[i])&&(vdt<sinlimit[i])) return (0);  //magnituide is acceptablle
            *vq=coslimit[i];  //to big limit
            *vd=-sinlimit[i];
            return (1);
        case 2:
            if ((vqt<coslimit[i])&&(vdt<sinlimit[i])) return (0);  //magnituide is acceptablle
            *vq=-coslimit[i];  //to big limit
            *vd=sinlimit[i];
            return (1);
        case 3:
            if ((vqt<coslimit[i])&&(vdt<sinlimit[i])) return (0);  //magnituide is acceptablle
            *vq=-coslimit[i];  //to big limit
            *vd=-sinlimit[i];
     }
  }
 return (-1);
 }


// 000000000000000000000000000000000000000

