www.pudn.com > singing.rar > singing.c


#include   
#include   
#include   
#include   
 
void interrupt(*oldint)();  
void interrupt music();  
 
unsigned char stack[0x1000];  
unsigned intsp,intss;  
unsigned freql[87];  
unsigned freq[87]={196,262,262,262,330,294,262,294,330,294,262,  
                  330,394,440,440.394,330,330,262,294,262,294,  
                  330,294,262,230,230,196,262,440,394,330,330,  
                  262,294,262,294,440,394,330,330,394,440,523,  
                  394,330,330,262,294,262,294,330,294,262,230,  
                  230,196,262,440,394,330,330,262,294,262,294,  
                  440,394,330,330,394,440,523,394,330,330,262,  
                  294,262,294,330,294,262,230,230,196,262};  
int dely[87]={25,38,12,25,25,38,12,25,12,12,56,25,25,50,25,  
              38,12,12,12,38,12,25,12,12,38,12,25,25,100,25,  
              38,12,12,12,38,12,25,25,38,12,25,25,100,25,38,  
              12,12,12,38,12,25,12,12,38,12,25,25,100,25,38,  
              12,12,12,38,12,25,25,38,12,25,25,100,25,38,12,  
              12,12,38,12,25,12,12,38,12,25,25,100};  
 
void main()  
{  
  oldint=getvect(0x1b);  
  setvect(0x1b,music);  
  keep(0,(_SS+(_SP/16)-_psp));  
}  
 
void interrupt music(bp,di,si,ds,es,dx,cx,bx,ax,ip,cs,flags)  
{  
  int i;  
  char orignalbits,bits;  
  disable();  
  intsp=_SP;  
  intss=_SS;  
  _SP=(unsigned)&stack[0x1000-2];  
  _SS=_DS;  
  enable();  
  clrscr();  
  printf("Sing a song!");  
  for(i=0;i<87;i++)  
  {  
    outportb(0x43,0xb6);  
    freql[ i]=0x1234dc/freq[ i];  
    outportb(0x42,freql[ i]&0x00ff);  
    freql[ i]=freql[ i]>>8;  
    outportb(0x42,freql[ i]);  
    bits=orignalbits=inportb(0x61);  
    outportb(0x61,bits|3);  
    delay(dely[ i]*25);  
    outportb(0x61,orignalbits);  
  }  
  oldint();  
  disable();  
  _SP=intsp;  
  _SS=intss;  
  enable();  
}