#include <math.h>
#include <float.h>
#include <stdio.h>
#include <stdlib.h>

main()
{
   int i;
   double nDo7 = 2093.004522404790e0;
   double nFreq;
   double nSemi;
   unsigned int nPhaseIncr;
   char *sName[12] = {"Do  ", "Do# ", "Re  ", "Re# ", "Mi  ", "Fa  ",
		      "Fa# ", "Sol ", "Sol#", "La  ", "La# ", "Si  "};
   double nFithFreq[12] = {2085.9259e0, 2197.5187e0, 2346.6666e0,
			   2472.2085e0, 2640.0e0,    2781.2346e0,
			   2970.0e0,    3128.8888e0, 3296.2780e0,
			   3520.0e0,    3708.3128e0, 3960.0e0     };

   nSemi = pow(2.0 , 1.0/12.0);

   printf("\nPhaseTblL:");
   printf("\n     addwf   pcl,f");
   printf("\n; 'Equal temperade tuning' mode");
   for(nFreq=nDo7, i=0; i < 12; i++, nFreq *= nSemi) {
      nPhaseIncr= (unsigned int)(65535*40.0e-6*nFreq+0.5);
      printf("\n     retlw   0%02Xh    ; %s (f=%4.2f Hz, phase incr=%u [%04Xh])",
	      (nPhaseIncr & 0xff), sName[i], nFreq, nPhaseIncr, nPhaseIncr);
   }
   printf("\n; 'Tuned by fifths' mode");
   for(i=0; i<12; i++) {
      nPhaseIncr= (unsigned int)(65535*40.0e-6*nFithFreq[i]+0.5);
      printf("\n     retlw   0%02Xh    ; %s (f=%4.2f Hz, phase incr=%u [%04Xh])",
	      (nPhaseIncr & 0xff), sName[i], nFithFreq[i], nPhaseIncr, nPhaseIncr);
   }

   printf("\nPhaseTblL_End:");
   printf("\n;");
   printf("\n   if ( (PhaseTblL & 0x0FF) >= (PhaseTblL_End & 0x0FF) )");
   printf("\n       MESSG   \"Warning: table PhaseTblL crosses page boundry\"");
   printf("\n    endif");
   printf("\n;");

   printf("\n");
   printf("\nPhaseTblH:");
   printf("\n     addwf   pcl,f");
   printf("\n; 'Equal temperade tuning' mode");
   for(nFreq=nDo7, i=0; i < 12; i++, nFreq *= nSemi) {
      nPhaseIncr= (unsigned int)(65535*40.0e-6*nFreq+0.5);
      printf("\n     retlw   0%02Xh    ; %s (f=%4.2f Hz, phase incr=%u [%04Xh])",
	      ((nPhaseIncr>>8) & 0xff), sName[i], nFreq, nPhaseIncr, nPhaseIncr);
   }
   printf("\n; 'Tuned by fifths' mode");
   for(i=0; i<12; i++) {
      nPhaseIncr= (unsigned int)(65535*40.0e-6*nFithFreq[i]+0.5);
      printf("\n     retlw   0%02Xh    ; %s (f=%4.2f Hz, phase incr=%u [%04Xh])",
	      ((nPhaseIncr>>8) & 0xff), sName[i], nFithFreq[i], nPhaseIncr, nPhaseIncr);
   }
   printf("\nPhaseTblH_End:");
   printf("\n;");
   printf("\n   if ( (PhaseTblH & 0x0FF) >= (PhaseTblH_End & 0x0FF) )");
   printf("\n       MESSG   \"Warning: table PhaseTblH crosses page boundry\"");
   printf("\n    endif");
   printf("\n;");
   printf("\n");
   return(0);
}


