?? kdmeng.c
字號:
frqeff[chanum] = 0; frqoff[chanum] = 0; voleff[chanum] = 0; voloff[chanum] = 0; paneff[chanum] = 0; panoff[chanum] = 0; return; }}void getsndbufinfo(long *dasndoffsplc, long *dasndbufsiz){ *dasndoffsplc = sndoffsplc; *dasndbufsiz = (sndbufsiz<<(bytespersample+numspeakers-2));}void preparesndbuf(void){ long i, j, k, voloffs1, voloffs2, *stempptr; long daswave, dasinc, dacnt; long ox, oy, x, y; //char *sndptr, v1, v2; kdmintinprep++; if (kdminprep != 0) return; if ((digistat == 1) || (digistat == 2)) { i = kinp(dmacheckport); i += (kinp(dmacheckport)<<8); if (i <= dmachecksiz) { i = ((i > 32) && (i <= (dmachecksiz>>1)+32)); if ((sndoffsplc<(sndoffsplc^sndoffsxor)) == i) kdmintinprep++; } } kdminprep = 1; while (kdmintinprep > 0) { sndoffsplc ^= sndoffsxor; for (i=NUMCHANNELS-1;i>=0;i--) if ((splc[i] < 0) && (chanstat[i] > 0)) { if (chanstat[i] == 1) { ox = xplc[i]; oy = yplc[i]; } else { stempptr = (long *)xplc[i]; ox = *stempptr; stempptr = (long *)yplc[i]; oy = *stempptr; } ox -= globposx; oy -= globposy; x = dmulscale28(oy,globxvect,-ox,globyvect); y = dmulscale28(ox,globxvect,oy,globyvect); if ((klabs(x) >= 32768) || (klabs(y) >= 32768)) { splc[i] = 0; continue; } j = vdist[i]; vdist[i] = msqrtasm(x*x+y*y); if (j) { j = (sinc[i]<<10)/(min(max(vdist[i]-j,-768),768)+1024)-sinc[i]; sincoffs[i] = ((sincoffs[i]*7+j)>>3); } voloffs1 = min((vol[i]<<22)/(((x+1536)*(x+1536)+y*y)+1),255); voloffs2 = min((vol[i]<<22)/(((x-1536)*(x-1536)+y*y)+1),255); if (numspeakers == 1) calcvolookupmono(FP_OFF(volookup)+(i<<(9+2)),-(voloffs1+voloffs2)<<6,(voloffs1+voloffs2)>>1); else calcvolookupstereo(FP_OFF(volookup)+(i<<(9+2)),-(voloffs1<<7),voloffs1,-(voloffs2<<7),voloffs2); } for(dacnt=0;dacnt<sndbufsiz;dacnt+=bytespertic) { if (musicstatus > 0) //Gets here 120 times/second { while ((notecnt < numnotes) && (timecount >= nttime[notecnt])) { j = trinst[nttrack[notecnt]]; k = mulscale24(frqtable[ntfreq[notecnt]],finetune[j]+748); if (ntvol1[notecnt] == 0) //Note off { for(i=NUMCHANNELS-1;i>=0;i--) if (splc[i] < 0) if (swavenum[i] == j) if (sinc[i] == k) splc[i] = 0; } else //Note on startwave(j,k,ntvol1[notecnt],ntvol2[notecnt],ntfrqeff[notecnt],ntvoleff[notecnt],ntpaneff[notecnt]); notecnt++; if (notecnt >= numnotes) if (musicrepeat > 0) notecnt = 0, timecount = nttime[0]; } timecount++; } for(i=NUMCHANNELS-1;i>=0;i--) { if (splc[i] >= 0) continue; dasinc = sinc[i]+sincoffs[i]; if (frqeff[i] != 0) { dasinc = mulscale16(dasinc,eff[frqeff[i]-1][frqoff[i]]); frqoff[i]++; if (frqoff[i] >= 256) frqeff[i] = 0; } if ((voleff[i]) || (paneff[i])) { voloffs1 = svol1[i]; voloffs2 = svol2[i]; if (voleff[i]) { voloffs1 = mulscale16(voloffs1,eff[voleff[i]-1][voloff[i]]); voloffs2 = mulscale16(voloffs2,eff[voleff[i]-1][voloff[i]]); voloff[i]++; if (voloff[i] >= 256) voleff[i] = 0; } if (numspeakers == 1) calcvolookupmono(FP_OFF(volookup)+(i<<(9+2)),-(voloffs1+voloffs2)<<6,(voloffs1+voloffs2)>>1); else { if (paneff[i]) { voloffs1 = mulscale16(voloffs1,131072-eff[paneff[i]-1][panoff[i]]); voloffs2 = mulscale16(voloffs2,eff[paneff[i]-1][panoff[i]]); panoff[i]++; if (panoff[i] >= 256) paneff[i] = 0; } calcvolookupstereo(FP_OFF(volookup)+(i<<(9+2)),-(voloffs1<<7),voloffs1,-(voloffs2<<7),voloffs2); } } daswave = swavenum[i]; voloffs1 = FP_OFF(volookup)+(i<<(9+2)); kdmasm1 = repleng[daswave]; kdmasm2 = wavoffs[daswave]+repstart[daswave]+repleng[daswave]; kdmasm3 = (repleng[daswave]<<12); //repsplcoff kdmasm4 = soff[i]; if (numspeakers == 1) { if (kdmqual == 0) splc[i] = monolocomb(0L,voloffs1,bytespertic,dasinc,splc[i],FP_OFF(stemp)); else splc[i] = monohicomb(0L,voloffs1,bytespertic,dasinc,splc[i],FP_OFF(stemp)); } else { if (kdmqual == 0) splc[i] = stereolocomb(0L,voloffs1,bytespertic,dasinc,splc[i],FP_OFF(stemp)); else splc[i] = stereohicomb(0L,voloffs1,bytespertic,dasinc,splc[i],FP_OFF(stemp)); } soff[i] = kdmasm4; if ((kdmqual == 0) || (splc[i] >= 0)) continue; if (numspeakers == 1) { if (kdmqual == 0) monolocomb(0L,voloffs1,samplerate>>11,dasinc,splc[i],FP_OFF(stemp)+(bytespertic<<2)); else monohicomb(0L,voloffs1,samplerate>>11,dasinc,splc[i],FP_OFF(stemp)+(bytespertic<<2)); } else { if (kdmqual == 0) stereolocomb(0L,voloffs1,samplerate>>11,dasinc,splc[i],FP_OFF(stemp)+(bytespertic<<3)); else stereohicomb(0L,voloffs1,samplerate>>11,dasinc,splc[i],FP_OFF(stemp)+(bytespertic<<3)); } } if (kdmqual) { if (numspeakers == 1) { for(i=(samplerate>>11)-1;i>=0;i--) stemp[i] += mulscale16(stemp[i+1024]-stemp[i],ramplookup[i]); j = bytespertic; k = (samplerate>>11); copybuf(&stemp[j],&stemp[1024],k); clearbuf(&stemp[j],k,32768); } else { for(i=(samplerate>>11)-1;i>=0;i--) { j = (i<<1); stemp[j+0] += mulscale16(stemp[j+1024]-stemp[j+0],ramplookup[i]); stemp[j+1] += mulscale16(stemp[j+1025]-stemp[j+1],ramplookup[i]); } j = (bytespertic<<1); k = ((samplerate>>11)<<1); copybuf(&stemp[j],&stemp[1024],k); clearbuf(&stemp[j],k,32768); } } if (numspeakers == 1) { if (bytespersample == 1) { if (digistat == 13) pcbound2char(bytespertic>>1,FP_OFF(stemp),sndoffsplc+dacnt); else bound2char(bytespertic>>1,FP_OFF(stemp),sndoffsplc+dacnt); } else bound2short(bytespertic>>1,FP_OFF(stemp),sndoffsplc+(dacnt<<1)); } else { if (bytespersample == 1) bound2char(bytespertic,FP_OFF(stemp),sndoffsplc+(dacnt<<1)); else bound2short(bytespertic,FP_OFF(stemp),sndoffsplc+(dacnt<<2)); } } kdmintinprep--; } kdminprep = 0;}void wsay(char *dafilename, long dafreq, long volume1, long volume2){ unsigned char ch1, ch2; long i, j, bad; if (digistat == 0) return; i = numwaves-1; do { bad = 0; j = 0; while ((dafilename[j] > 0) && (j < 16)) { ch1 = dafilename[j]; if ((ch1 >= 97) && (ch1 <= 123)) ch1 -= 32; ch2 = instname[i][j]; if ((ch2 >= 97) && (ch2 <= 123)) ch2 -= 32; if (ch1 != ch2) {bad = 1; break;} j++; } if (bad == 0) { startwave(i,(dafreq*11025)/samplerate,volume1,volume2,0L,0L,0L); return; } i--; } while (i >= 0);}void loadwaves(char *wavename){ long fil, i, j, dawaversionum; char filename[80]; strcpy(filename,wavename); if (strstr(filename,".KWV") == 0) strcat(filename,".KWV"); if ((fil = kopen4load(filename,0)) == -1) if (strcmp(filename,"WAVES.KWV") != 0) { strcpy(filename,"WAVES.KWV"); fil = kopen4load(filename,0); } totsndbytes = 0; if (fil != -1) { if (strcmp(kwvname,filename) == 0) { kclose(fil); return; } strcpy(kwvname,filename); kread(fil,&dawaversionum,4); if (dawaversionum != 0) { kclose(fil); return; } kread(fil,&numwaves,4); for(i=0;i<numwaves;i++) { kread(fil,&instname[i][0],16); kread(fil,&wavleng[i],4); kread(fil,&repstart[i],4); kread(fil,&repleng[i],4); kread(fil,&finetune[i],4); wavoffs[i] = totsndbytes; totsndbytes += wavleng[i]; } } else { dawaversionum = 0; numwaves = 0; } for(i=numwaves;i<MAXWAVES;i++) { for(j=0;j<16;j++) instname[i][j] = 0; wavoffs[i] = totsndbytes; wavleng[i] = 0L; repstart[i] = 0L; repleng[i] = 0L; finetune[i] = 0L; } if (snd == 0) { if ((snd = (char *)malloc(totsndbytes+2)) == 0) { printf("Not enough memory for digital music!\n"); exit(0); } } for(i=0;i<MAXWAVES;i++) wavoffs[i] += FP_OFF(snd); if (fil != -1) { kread(fil,snd,totsndbytes); kclose(fil); } snd[totsndbytes] = snd[totsndbytes+1] = 128;}int loadsong(char *filename){ long /*i,*/ fil; if (musistat != 1) return(0); musicoff(); filename = strupr(filename); if (strstr(filename,".KDM") == 0) strcat(filename,".KDM"); if ((fil = kopen4load(filename,0)) == -1) { printf("I cannot load %s.\n",filename); uninitsb(); return(-1); } kread(fil,&kdmversionum,4); if (kdmversionum != 0) return(-2); kread(fil,&numnotes,4); kread(fil,&numtracks,4); kread(fil,trinst,numtracks); kread(fil,trquant,numtracks); kread(fil,trvol1,numtracks); kread(fil,trvol2,numtracks); kread(fil,nttime,numnotes<<2); kread(fil,nttrack,numnotes); kread(fil,ntfreq,numnotes); kread(fil,ntvol1,numnotes); kread(fil,ntvol2,numnotes); kread(fil,ntfrqeff,numnotes); kread(fil,ntvoleff,numnotes); kread(fil,ntpaneff,numnotes); kclose(fil); return(0);}void musicon(void){ if (musistat != 1) return; notecnt = 0; timecount = nttime[notecnt]; musicrepeat = 1; musicstatus = 1;}void musicoff(void){ long i; musicstatus = 0; for(i=0;i<NUMCHANNELS;i++) splc[i] = 0; musicrepeat = 0; timecount = 0; notecnt = 0;}kdmconvalloc32 (long size){#ifdef PLATFORM_DOS union REGS r; r.x.eax = 0x0100; //DPMI allocate DOS memory r.x.ebx = ((size+15)>>4); //Number of paragraphs requested int386(0x31,&r,&r); if (r.x.cflag != 0) //Failed return ((long)0); return ((long)((r.x.eax&0xffff)<<4)); //Returns full 32-bit offset#else fprintf (stderr, "%s line %d; kdmconvalloc32() called\n", __FILE__, __LINE__);#endif }installbikdmhandlers(){#ifdef PLATFORM_DOS union REGS r; struct SREGS sr; long lowp; void far *fh; //Get old protected mode handler r.x.eax = 0x3500+kdmvect; /* DOS get vector (INT 0Ch) */ sr.ds = sr.es = 0; int386x(0x21,&r,&r,&sr); kdmpsel = (unsigned short)sr.es; kdmpoff = r.x.ebx; //Get old real mode handler r.x.eax = 0x0200; /* DPMI get real mode vector */ r.h.bl = kdmvect; int386(0x31,&r,&r); kdmrseg = (unsigned short)r.x.ecx; kdmroff = (unsigned short)r.x.edx; //Allocate memory in low memory to store real mode handler if ((lowp = kdmconvalloc32(KDMCODEBYTES)) == 0) { printf("Can't allocate conventional memory.\n"); exit; } memcpy((void *)lowp,(void *)pcrealbuffer,KDMCODEBYTES); //Set new protected mode handler r.x.eax = 0x2500+kdmvect; /* DOS set vector (INT 0Ch) */ fh = (void far *)pctimerhandler; r.x.edx = FP_OFF(fh); sr.ds = FP_SEG(fh); //DS:EDX == &handler sr.es = 0; int386x(0x21,&r,&r,&sr); //Set new real mode handler (must be after setting protected mode) r.x.eax = 0x0201; r.h.bl = kdmvect; //CX:DX == real mode &handler r.x.ecx = ((lowp>>4)&0xffff); //D32realseg r.x.edx = 0L; //D32realoff int386(0x31,&r,&r);#else fprintf(stderr,"%s line %d; installbikdmhandlers() called\n", __FILE__, __LINE__);#endif }uninstallbikdmhandlers(){#ifdef PLATFORM_DOS union REGS r; struct SREGS sr; //restore old protected mode handler r.x.eax = 0x2500+kdmvect; /* DOS set vector (INT 0Ch) */ r.x.edx = kdmpoff; sr.ds = kdmpsel; /* DS:EDX == &handler */ sr.es = 0; int386x(0x21,&r,&r,&sr); //restore old real mode handler r.x.eax = 0x0201; /* DPMI set real mode vector */ r.h.bl = kdmvect; r.x.ecx = (unsigned long)kdmrseg; //CX:DX == real mode &handler r.x.edx = (unsigned long)kdmroff; int386(0x31,&r,&r);#else fprintf(stderr,"%s line %d; uninstallbikdmhandlers() called\n", __FILE__, __LINE__);#endif }
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -