#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <memory.h>
#include "beep.h"

void msec_wait(int msec);

void main()
{
	int i,j;
	int k=1;
	

	printf("\n\x1b[32mどの周波数の音まで聞こえますか.\x1b[0m\n");
	printf("小中学生で12,000Hz, 50才で5,000Hzまで聞こえれば上等です.\n\n"); 
	for(i=0; i<6; i++){
		j=k<<i;
		BEEP_on_userset(800,(int)(261.63*j));
		printf("只今はオクターブ%2i の[ド],   周波数%5iHzの音です.\n",i+4,(int)(261.63*j));
		msec_wait(1000);
		BEEP_on_userset(800,(int)(293.66*j));
		printf("只今はオクターブ%2i の[レ],   周波数%5iHzの音です.\n",i+4,(int)(293.66*j));
		msec_wait(1000);
		BEEP_on_userset(800,(int)(329.63*j));
		printf("只今はオクターブ%2i の[ミ],   周波数%5iHzの音です.\n",i+4,(int)(329.63*j));
		msec_wait(1000);
		BEEP_on_userset(800,(int)(349.23*j));
		printf("只今はオクターブ%2i の[ファ], 周波数%5iHzの音です.\n",i+4,(int)(349.23*j));
		msec_wait(1000);
		BEEP_on_userset(800,392*j);
		printf("只今はオクターブ%2i の[ソ],   周波数%5iHzの音です.\n",i+4,392*j);
		msec_wait(1000);
		BEEP_on_userset(800,440*j);
		printf("只今はオクターブ%2i の[ラ],   周波数%5iHzの音です.\n",i+4,440*j);
		msec_wait(1000);
		BEEP_on_userset(800,(int)(493.88*j));
		printf("只今はオクターブ%2i の[シ],   周波数%5iHzの音です.\n",i+4,(int)(493.88*j));
		msec_wait(1000);
	}
	j=k<<i;
	BEEP_on_userset(800,(int)(261.63*j));
	printf("只今はオクターブ%2i の[ド],   周波数%5iHzの音です.\n",i+4,(int)(261.63*j));

	printf("\n\x1b[33mどの周波数の音まで聞こえましたか.\x1b[0m\n");

}

void msec_wait(int msec) {
   union  REGS  inregs, outregs;
   struct SREGS segregs;
   register int i;

	for(i=1; i<msec; i++){
		segread(&segregs);
   		inregs.x.cx=94;		/* 10ﾏｲｸﾛ秒×100-計算時間 */
   		int86x(0xfd,&inregs,&outregs,&segregs);
	}
}

unsigned int BEEP_on(void) {
   union  REGS  inregs, outregs;
   struct SREGS segregs;

   segread(&segregs);
   inregs.x.ax=0x0000;
   int86x(0x9e,&inregs,&outregs,&segregs);
   return (unsigned int)outregs.h.ah;
}

unsigned int BEEP_off(void) {
   union  REGS  inregs, outregs;
   struct SREGS segregs;

   segread(&segregs);
   inregs.x.ax=0x0100;
   int86x(0x9e,&inregs,&outregs,&segregs);
   return (unsigned int)outregs.h.ah;
}

unsigned int BEEP_200m(void) {
   union  REGS  inregs, outregs;
   struct SREGS segregs;

   segread(&segregs);
   inregs.x.ax=0x0200;
   int86x(0x9e,&inregs,&outregs,&segregs);
   return (unsigned int)outregs.h.ah;
}

unsigned int BEEP_on_userset(unsigned int msec, unsigned int hertz) {
   union  REGS  inregs, outregs;
   struct SREGS segregs;

   segread(&segregs);
   inregs.x.ax=0x0500;
   inregs.x.bx=msec/10;
   inregs.x.dx=hertz;
   int86x(0x9e,&inregs,&outregs,&segregs);
   return (unsigned int)outregs.h.ah;
}

unsigned int BEEP_get_userset(unsigned int *status,
							  unsigned int *msec,
							  unsigned int *hertz) {
   union  REGS  inregs, outregs;
   struct SREGS segregs;

   segread(&segregs);
   inregs.x.ax=0x0600;
   int86x(0x9e,&inregs,&outregs,&segregs);
   *status=(unsigned int)outregs.h.al;
   *msec=(unsigned int)outregs.x.bx;
   *hertz=(unsigned int)outregs.x.dx;
   return (unsigned int)outregs.h.ah;
}
