?? kdmeng.c
字號:
sndbufsiz = bytespertic*(120/intspersec); if (sndseg == 0) //Allocate DMA buffer in conventional memory { if ((sndseg = convallocate(((sndbufsiz<<(bytespersample+numspeakers))+15)>>4)) == 0) { printf("Could not allocation conventional memory for digitized music\n"); exit(0); } sndoffs = (((long)sndseg)<<4); if ((sndoffs&65535)+(sndbufsiz<<(bytespersample+numspeakers-1)) >= 65536) //64K DMA page check sndoffs += (sndbufsiz<<(bytespersample+numspeakers-1)); sndoffsplc = sndoffs; sndoffsxor = sndoffsplc ^ (sndoffsplc+(sndbufsiz<<(bytespersample+numspeakers-2))); } j = (((11025L*2093)/samplerate)<<13); for(i=1;i<76;i++) { frqtable[i] = j; j = mulscale30(j,1137589835); //(pow(2,1/12)<<30) = 1137589835 } for(i=0;i>=-14;i--) frqtable[i&255] = (frqtable[(i+12)&255]>>1); loadwaves("WAVES.KWV"); timecount = notecnt = musicstatus = musicrepeat = 0; clearbuf((void *)(FP_OFF(stemp)),sizeof(stemp)>>2,32768L); for(i=0;i<256;i++) for(j=0;j<16;j++) { qualookup[(j<<9)+i] = (((-i)*j+8)>>4); qualookup[(j<<9)+i+256] = (((256-i)*j+8)>>4); } for(i=0;i<(samplerate>>11);i++) { j = 1536 - (i<<10)/(samplerate>>11); fsin(&j); ramplookup[i] = ((16384-j)<<1); } for(i=0;i<256;i++) { j = i*90; fsin(&j); eff[0][i] = 65536+j/9; eff[1][i] = min(58386+((i*(65536-58386))/30),65536); eff[2][i] = max(69433+((i*(65536-69433))/30),65536); j = (i*2048)/120; fsin(&j); eff[3][i] = 65536+(j<<2); j = (i*2048)/30; fsin(&j); eff[4][i] = 65536+j; switch((i>>1)%3) { case 0: eff[5][i] = 65536; break; case 1: eff[5][i] = 65536*330/262; break; case 2: eff[5][i] = 65536*392/262; break; } eff[6][i] = min((i<<16)/120,65536); eff[7][i] = max(65536-(i<<16)/120,0); } switch(digistat) { case 1: case 2: if (sbirq < 8) { oldsbhandler = _dos_getvect(sbirq+0x8); //Set new IRQ7 vector _disable(); _dos_setvect(sbirq+0x8, sbhandler); _enable(); koutp(0x21,kinp(0x21) & ~(1<<(sbirq&7))); } else { oldsbhandler = _dos_getvect(sbirq+0x68); //Set new SB IRQ vector _disable(); _dos_setvect(sbirq+0x68, sbhandler); _enable(); koutp(0xa1,kinp(0xa1) & ~(1<<(sbirq&7))); } break; } musicoff(); if (digistat != 255) { preparesndbuf(); if (digistat != 13) preparesndbuf(); if ((digistat == 1) || (digistat == 2)) { if (sbdma < 4) { dmacheckport = (sbdma<<1)+1; dmachecksiz = (sndbufsiz<<(bytespersample+numspeakers-1))-1; koutp(0xa,sbdma+4); //Set up DMA REGISTERS koutp(0xc,0); koutp(0xb,0x58+sbdma); //&H58 - auto-init, &H48 - 1 block only koutp(sbdma<<1,sndoffs&255); koutp(sbdma<<1,(sndoffs>>8)&255); koutp(dmacheckport,dmachecksiz&255); koutp(dmacheckport,(dmachecksiz>>8)&255); koutp(dmapagenum[sbdma],((sndoffs>>16)&255)); koutp(0xa,sbdma); } else { dmacheckport = ((sbdma&3)<<2)+0xc2; dmachecksiz = ((sndbufsiz<<(bytespersample+numspeakers-1))>>1)-1; koutp(0xd4,sbdma); //Set up DMA REGISTERS koutp(0xd8,0); koutp(0xd6,0x58+(sbdma&3)); //&H58 - auto-init, &H48 - 1 block only koutp(dmacheckport-2,(sndoffs>>1)&255); koutp(dmacheckport-2,((sndoffs>>1)>>8)&255); koutp(dmacheckport,dmachecksiz&255); koutp(dmacheckport,(dmachecksiz>>8)&255); koutp(dmapagenum[sbdma],((sndoffs>>16)&255)); koutp(0xd4,sbdma&3); } } switch(digistat) { case 1: sbout(0xd1); //SB Speaker on if (sbver < 0x0400) { sbout(0x40); //SB Set speed sbout(256-(1000000/(samplerate<<(numspeakers-1)))); } if (sbver < 0x0200) { sbout(0x14); //SB 1-shot mode i = sndbufsiz-1; sbout(i&255); sbout((i>>8)&255); } else { if (sbver < 0x0400) { //Set length for auto-init mode i = (sndbufsiz<<(numspeakers+bytespersample-2))-1; sbout(0x48); sbout(i&255); sbout((i>>8)&255); if (numspeakers == 2) //SB set stereo { sbmixout(0L,0L); sbmixout(0xe,sbmixin(0xe)|2); } if ((samplerate<<(numspeakers-1)) <= 22050) sbout(0x1c); //Start SB interrupts! else sbout(0x90); //High Speed DMA } else { sbout(0x41); sbout((samplerate>>8)&255); sbout(samplerate&255); sbout(0xc6-((bytespersample-1)<<4)); sbout(((bytespersample-1)<<4)+((numspeakers-1)<<5)); i = (sndbufsiz<<(numspeakers-1))-1; sbout(i&255); sbout((i>>8)&255); } } break; case 2: koutp(0xf88,128); koutp(0xb8a,0); i = (1193180L>>(numspeakers-1)) / samplerate; koutp(0x138b,0x36); koutp(0x1388,i&255); koutp(0x1388,i>>8); i = (sndbufsiz<<(bytespersample+numspeakers-2)); koutp(0x138b,0x74); koutp(0x1389,i&255); koutp(0x1389,i>>8); koutp(0x8389,0x3+((bytespersample-1)<<2)); //0x3=8bit/0x7=16bit koutp(0xb89,0xdf); koutp(0xb8b,0x8); koutp(0xf8a,0xd9+((2-numspeakers)<<5)); //0xd9=play/0xc9=record koutp(0xb8a,0xe1); break; case 13: samplecount = sndbufsiz; pcsndptr = (char *)sndoffs; bufferside = 0; pcsndbufsiz = sndbufsiz; pcrealmodeint = 0; samplediv = 1193280L / samplerate; j = 0; for(i=0;i<256;i++) { //Scale (65536 normal) k = mulscale24(j-(samplediv<<7),160000) + (samplediv>>1); if (k < 0) k = 0; if (k > samplerate) k = samplerate; pcsndlookup[i] = (char)(k+1); j += samplediv; } oldtimerfreq = gettimerval(); chainbackstart = oldtimerfreq/samplediv; chainbackcnt = chainbackstart; setuppctimerhandler(sndoffs+sndbufsiz,oldtimerfreq,0L,0L,0L,0L); _disable(); oldpctimerhandler = _dos_getvect(0x8); installbikdmhandlers(); koutp(0x43,0x34); koutp(0x40,samplediv&255); koutp(0x40,(samplediv>>8)&255); koutp(0x43,0x90); koutp(97,kinp(97)|3); _enable(); break; } }#else fprintf(stderr, "%s line %d; initsb() called\n", __FILE__, __LINE__);#endif }void getsbset(void){ char *sbset; long i; sbset = getenv("BLASTER"); i = 0; while (sbset[i] > 0) { switch(sbset[i]) { case 'A': case 'a': i++; sbport = 0; while (((sbset[i] >= 48) && (sbset[i] <= 57)) || ((sbset[i] >= 'A') && (sbset[i] <= 'F')) || ((sbset[i] >= 'a') && (sbset[i] <= 'f'))) { sbport *= 16; if ((sbset[i] >= 48) && (sbset[i] <= 57)) sbport += sbset[i]-48; if ((sbset[i] >= 'A') && (sbset[i] <= 'F')) sbport += sbset[i]-55; if ((sbset[i] >= 'a') && (sbset[i] <= 'f')) sbport += sbset[i]-55-32; i++; } break; case 'I': case 'i': i++; sbirq = 0; while ((sbset[i] >= 48) && (sbset[i] <= 57)) { sbirq *= 10; sbirq += sbset[i]-48; i++; } break; case 'D': case 'd': i++; sbdma8 = 0; while ((sbset[i] >= 48) && (sbset[i] <= 57)) { sbdma8 *= 10; sbdma8 += sbset[i]-48; i++; } break; case 'H': case 'h': i++; sbdma16 = 0; while ((sbset[i] >= 48) && (sbset[i] <= 57)) { sbdma16 *= 10; sbdma16 += sbset[i]-48; i++; } break; default: i++; break; } }}#ifdef PLATFORM_DOSvoid __interrupt __far sbhandler(){ switch(digistat) { case 1: if (sbver < 0x0200) { sbout(0x14); //SB 1-shot mode sbout((sndbufsiz-1)&255); sbout(((sndbufsiz-1)>>8)&255); kinp(sbport+0xe); //Acknowledge SB } else { mixerval = sbmixin(0x82); if (mixerval&1) kinp(sbport+0xe); //Acknowledge 8-bit DMA if (mixerval&2) kinp(sbport+0xf); //Acknowledge 16-bit DMA } break; case 2: if ((kinp(0xb89)&8) > 0) koutp(0xb89,0); break; } if (sbirq >= 8) koutp(0xa0,0x20); koutp(0x20,0x20); _enable(); preparesndbuf();}#endifuninitsb(){#ifdef PLATFORM_DOS if ((digistat == 0) && (musistat != 1)) return; if (digistat != 255) { if ((digistat == 1) || (digistat == 2)) //Mask off DMA { if (sbdma < 4) koutp(0xa,sbdma+4); else koutp(0xd4,sbdma); } switch(digistat) { case 1: if (sbver >= 0x0400) sbout(0xda-(bytespersample-1)); resetsb(); sbout(0xd3); //Turn speaker off break; case 2: koutp(0xb8a,32); //Stop interrupts koutp(0xf8a,0x9); //DMA stop break; case 13: koutp(97,kinp(97)&252); koutp(0x43,0x34); koutp(0x40,0); koutp(0x40,0); koutp(0x43,0xbc); uninstallbikdmhandlers(); break; } } if (snd != 0) free(snd), snd = 0; if (sndseg != 0) convdeallocate(sndseg), sndseg = 0; switch(digistat) { case 1: case 2: if (sbirq < 8) { koutp(0x21,kinp(0x21) | (1<<(sbirq&7))); _disable(); _dos_setvect(sbirq+0x8, oldsbhandler); _enable(); } else { koutp(0xa1,kinp(0xa1) | (1<<(sbirq&7))); _disable(); _dos_setvect(sbirq+0x68, oldsbhandler); _enable(); } break; }#else fprintf (stderr, "%s line %d, uninitsb() called\n",__FILE__,__LINE__);#endif }void startwave(long wavnum, long dafreq, long davolume1, long davolume2, long dafrqeff, long davoleff, long dapaneff){ long i, /*j,*/ chanum; if ((davolume1|davolume2) == 0) return; chanum = 0; for(i=NUMCHANNELS-1;i>0;i--) if (splc[i] > splc[chanum]) chanum = i; splc[chanum] = 0; //Disable channel temporarily for clean switch if (numspeakers == 1) calcvolookupmono(FP_OFF(volookup)+(chanum<<(9+2)),-(davolume1+davolume2)<<6,(davolume1+davolume2)>>1); else calcvolookupstereo(FP_OFF(volookup)+(chanum<<(9+2)),-(davolume1<<7),davolume1,-(davolume2<<7),davolume2); sinc[chanum] = dafreq; svol1[chanum] = davolume1; svol2[chanum] = davolume2; soff[chanum] = wavoffs[wavnum]+wavleng[wavnum]; splc[chanum] = -(wavleng[wavnum]<<12); //splc's modified last swavenum[chanum] = wavnum; frqeff[chanum] = dafrqeff; frqoff[chanum] = 0; voleff[chanum] = davoleff; voloff[chanum] = 0; paneff[chanum] = dapaneff; panoff[chanum] = 0; chanstat[chanum] = 0; sincoffs[chanum] = 0;}void setears(long daposx, long daposy, long daxvect, long dayvect){ globposx = daposx; globposy = daposy; globxvect = daxvect; globyvect = dayvect;}void wsayfollow(char *dafilename, long dafreq, long davol, long *daxplc, long *dayplc, char followstat){ char ch1, ch2, bad; long i, wavnum, chanum; if (digistat == 0) return; if (davol <= 0) return; for(wavnum=numwaves-1;wavnum>=0;wavnum--) { bad = 0; i = 0; while ((dafilename[i] > 0) && (i < 16)) { ch1 = dafilename[i]; if ((ch1 >= 97) && (ch1 <= 123)) ch1 -= 32; ch2 = instname[wavnum][i]; if ((ch2 >= 97) && (ch2 <= 123)) ch2 -= 32; if (ch1 != ch2) {bad = 1; break;} i++; } if (bad != 0) continue; chanum = 0; for(i=NUMCHANNELS-1;i>0;i--) if (splc[i] > splc[chanum]) chanum = i; splc[chanum] = 0; //Disable channel temporarily for clean switch if (followstat == 0) { xplc[chanum] = *daxplc; yplc[chanum] = *dayplc; } else { xplc[chanum] = ((long)daxplc); yplc[chanum] = ((long)dayplc); } vol[chanum] = davol; vdist[chanum] = 0; sinc[chanum] = (dafreq*11025)/samplerate; svol1[chanum] = davol; svol2[chanum] = davol; sincoffs[chanum] = 0; soff[chanum] = wavoffs[wavnum]+wavleng[wavnum]; splc[chanum] = -(wavleng[wavnum]<<12); //splc's modified last swavenum[chanum] = wavnum; chanstat[chanum] = followstat+1;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -