📄 wav.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 + -