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

📄 kdmeng.c

📁 小型游戏引擎
💻 C
📖 第 1 页 / 共 3 页
字号:
		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 + -