⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wav.h

📁 C语言游戏编程
💻 H
字号:
#define NumberOfTimes1 50
#define NumberOfTimes2 100
#define OldTimerInt 0x60
#ifdef __cplusplus
    #define __CPPARGS ...
#else
    #define __CPPARGS
#endif
unsigned long Counter;
unsigned CounterInt8,fpI8;
unsigned Port=0x210;
char Found=0;
unsigned Cnt1,Cnt2;
FILE *fp;
long num;
int smp1;
unsigned char a[1];
struct wavhead
{
	char riffid[4];
	long cksize;
	char fcctype[4];
	char fmtid[4];
	long ck16;
	unsigned fortag;
	unsigned nchan;
	long nsamps;
	long navgbgs;
	unsigned nblocka;
	unsigned wbpsam;
	char dataid[4];
	long datalen;
}wfhead;

void Testsb()
{
	Cnt1=NumberOfTimes1;
	while((Port<=0x260)&&!Found)
	{
		outportb(Port+0x6,1);
		outportb(Port+0x6,0);
		Cnt2=NumberOfTimes2;
		while((Cnt2>0)&&(inportb(Port+0xE)<128))
			--Cnt2;
		if((Cnt2==0)||(inportb(Port+0xA)!=0xAA))
		{
			--Cnt1;
			if(Cnt1==0)
			{
				Cnt1=NumberOfTimes1;
				Port=Port+0x10;
			}
		}
		else
			Found=1;
	}
	if(!Found)
	{
		printf("Nobase port found!\n");
		printf("\nDSP not reseted!\n");
		exit(0);
	}
}


void interrupt NewTimer(__CPPARGS)
{
	struct REGPACK R;
	Counter++;
	if(--CounterInt8==0)
	{
		intr(OldTimerInt,&R);
		CounterInt8=fpI8;
	}
	else outportb(0x20,0x20);
}

void SetTimer(void interrupt(*Rout)(__CPPARGS),unsigned freq)
{
	int ICnt;
	unsigned char intreg21;
	fpI8=(freq+9)/18;
	intreg21=inportb(0x21);
	outportb(0x21,255);
	ICnt=1193180/freq;
	outportb(0x43,0x36);
	outportb(0x40,ICnt&255);
	outportb(0x40,ICnt>>8);
	setvect(OldTimerInt,getvect(8));
	setvect(8,Rout);
	outportb(0x21,intreg21);
}

void RestoreTimer()
{
	unsigned char intreg21;
	intreg21=inportb(0x21);
	outportb(0x21,255);
	outportb(0x43,0x36);
	outportb(0x40,0);
	outportb(0x40,0);
	setvect(8,getvect(OldTimerInt));
	outportb(0x21,intreg21);
}

void PlayWav()
{
	unsigned char dat;
	long i;
	smp1=44100/wfhead.nsamps;
	Counter=1;
	SetTimer(NewTimer,44100);
	fseek(fp,44L,0);
	if(wfhead.wbpsam==16)
		num=num/2;
	for(i=0;i<num;i++)
	{
		outportb(Port+0xC,0x10);
		if(wfhead.wbpsam==8)
			dat=fgetc(fp);
		if(wfhead.wbpsam==16)
			dat=(getw(fp)+32768)/256;
		if(wfhead.nchan==2)
		{
			if(wfhead.wbpsam==8)
				fgetc(fp);
			if(wfhead.wbpsam==16)
				getw(fp);
		}
		while(inportb(Port+0xC)&0x80);
		outportb(Port+0xC,dat);
		if(peekb(0x40,0x1a)!=peekb(0x40,0x1c))
			break;
//		for(i=0;i<1000;i++)
  //			printf("%d",i);
		while(Counter<smp1);
		Counter=0;
//		if(i%1000==0)
//			printf("%d\n",i/1000);
	}
	RestoreTimer();
}

void PlayWavGD()
{
	smp1=44100/wfhead.nsamps;
	Counter=1;
	fseek(fp,44L,0);
	if(wfhead.wbpsam==16)
		num=num/2;
	SetTimer(NewTimer,44100);
}

void interrupt NewTimerGD(__CPPARGS)
{
	struct REGPACK R;
	static long i=0;
	Counter++;
	if((Counter>=smp1&&i<num)||i==0)
	{
		i++;
		outportb(Port+0xC,0x10);
		while(inportb(Port+0xC)&0x80);
		outportb(Port+0xC,a[i%64000]);
		Counter=0;
	}

	if(--CounterInt8==0)
	{
		intr(OldTimerInt,&R);
		CounterInt8=fpI8;
	}
	else outportb(0x20,0x20);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -