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

📄 ves2.h

📁 小型游戏引擎
💻 H
📖 第 1 页 / 共 2 页
字号:
		regs.x.ax = 0x4f0a; regs.x.bx = 0;		DPMI_int86x(0x10,&regs,&regs,&sregs);		if (regs.x.ax == 0x004f)   //cx is length of protected mode code		{			i = (((long)sregs.es)<<4)+((long)regs.x.di);			p1 = (short *)i;			setactiveentry = ((long)p1[0]) + i;			setvisualentry = ((long)p1[1]) + i;			setpaletteentry = ((long)p1[2]) + i;				//p1[2] is useless palette function - see vesprot.asm for code		}			//Linear mode		if (modeInfo.ModeAttributes&128) //128 is vbeMdLinear		{			GetPtrToLFB(modeInfo.PhysBasePtr);			linearmode = 1;			buffermode = (maxpages<=1);			imageSize = bytesperline*yres;			if (!buffermode) frameplace = globlinplace;							else frameplace = FP_OFF(screen);			j = 0;			for(i=0;i<maxpages;i++)			{				activepagelookup[i] = globlinplace+j;				j += imageSize;			}		}		else  //Banked mode		{				//Get granularity			switch(modeInfo.WinGranularity)			{				case 64: davesapageshift = 0; break;				case 32: davesapageshift = 1; break;				case 16: davesapageshift = 2; break;				case 8: davesapageshift = 3; break;				case 4: davesapageshift = 4; break;				case 2: davesapageshift = 5; break;				case 1: davesapageshift = 6; break;			}			linearmode = 0;			if ((x == 320) && (y == 200) && (maxpages >= 2))			{				buffermode = 0;				imageSize = 65536;				frameplace = 0xa0000;			}			else			{				buffermode = 1;				imageSize = bytesperline*yres;				frameplace = FP_OFF(screen);				maxpages = 1;			}		}		origbuffermode = buffermode;		j = 0;		for(i=0;i<maxpages;i++)		{			dived = div(j,bytesperline);			visualpagelookup[i][0] = (short)dived.rem;			visualpagelookup[i][1] = (short)dived.quot;			j += imageSize;		}		return(0);	}	return(-1);}long setdacbits(long newdacbits){	RMREGS regs;	if ((vgaInfo.Capabilities&1) == 0) return(6L);	regs.x.ax = 0x4f08;	regs.x.bx = (((long)newdacbits)<<8);	DPMI_int86(0x10,&regs,&regs);	return((long)regs.h.bh);}#define setvesapage(i)                                      \{                                                           \	if (setactiveentry)                                      \		vesasetactive(0x4f05,0L,0L,i);                        \	else                                                     \	{                                                        \		regs.x.ax = 0x4f05; regs.x.bx = 0; regs.x.dx = i;     \		DPMI_int86(0x10,&regs,&regs);                         \	}                                                        \}void setactivepage(long dapagenum){	RMREGS regs;	if ((origbuffermode == 0) && (linearmode == 0))	{		frameplace = 0xa0000;		setvesapage(dapagenum<<davesapageshift);	}	if (buffermode != 0) { frameplace = FP_OFF(screen); return; }	if (linearmode != 0) { frameplace = activepagelookup[dapagenum]; return; }}static long curpag = 0;void setvisualpage(long dapagenum){	RMREGS regs;	long i, /*j,*/ p, dx, cx1, cy1, cx2, cy2, delta, x, y, y1, y2, ny1, ny2;	if (buffermode != 0)	{		cx1 = windowx1; cy1 = windowy1; cx2 = windowx2; cy2 = windowy2;		if (permanentupdate) { cx1 = 0; cy1 = 0; cx2 = xdim-1; cy2 = ydim-1; }		dx = cx2-cx1+1;		if (linearmode)		{			p = FP_OFF(screen);			delta = activepagelookup[dapagenum&0x7fffffff]-FP_OFF(screen);			if (permanentupdate == 0)			{				y1 = startumost[cx1]; y2 = y1;				for(x=cx1;x<=cx2;x++)				{					ny1 = startumost[x]-1; ny2 = startdmost[x];					if (ny1 < ny2-1)					{						if (ny1 >= y2)						{							while (y1 < y2-1)							{								y1++; if ((y1&31) == 0) faketimerhandler();									//x,y1								i = p+ylookup[y1]+ves2lastx[y1];								copybufbyte((void *)i,(void *)(i+delta),x-ves2lastx[y1]);							}							y1 = ny1;						}						else						{							while (y1 < ny1)							{								y1++; if ((y1&31) == 0) faketimerhandler();									//x-1,y1								i = p+ylookup[y1]+ves2lastx[y1];								copybufbyte((void *)i,(void *)(i+delta),x-ves2lastx[y1]);							}							while (y1 > ny1) ves2lastx[y1--] = x;						}						while (y2 > ny2)						{							y2--; if ((y2&31) == 0) faketimerhandler();								//x-1,y2							i = p+ylookup[y2]+ves2lastx[y2];							copybufbyte((void *)i,(void *)(i+delta),x-ves2lastx[y2]);						}						while (y2 < ny2) ves2lastx[y2++] = x;					}					else					{						while (y1 < y2-1)						{							y1++; if ((y1&31) == 0) faketimerhandler();								//x-1,y1							i = p+ylookup[y1]+ves2lastx[y1];							copybufbyte((void *)i,(void *)(i+delta),x-ves2lastx[y1]);						}						if (x == cx2) break;						y1 = startumost[x+1]; y2 = y1;					}				}				while (y1 < y2-1)				{					y1++; if ((y1&31) == 0) faketimerhandler();						//cx2+1,y1					i = p+ylookup[y1]+ves2lastx[y1];					copybufbyte((void *)i,(void *)(i+delta),cx2+1-ves2lastx[y1]);				}			}			else			{				p += ylookup[cy1]+cx1;				delta = activepagelookup[dapagenum&0x7fffffff]-FP_OFF(screen);				for(y=cy1;y<=cy2;y++)				{					copybufbyte((void *)p,(void *)(p+delta),dx);					p += ylookup[1];					if ((y&31) == 0) faketimerhandler();				}			}		}		else		{			p = ylookup[cy1]+cx1;			for(y=cy1;y<=cy2;y++)			{				if ((p>>16) != curpag)				{					curpag = (p>>16);					setvesapage(curpag<<davesapageshift);					faketimerhandler();				}				i = (p&65535)+dx-65536;				if (i <= 0)					copybufbyte((void *)(p+FP_OFF(screen)),(void *)((p&65535)+0xa0000),dx);				else				{					copybufbyte((void *)(p+FP_OFF(screen)),(void *)(0xb0000-(dx-i)),dx-i);					curpag = ((p+dx-1)>>16);					setvesapage(curpag<<davesapageshift);					faketimerhandler();					copybufbyte((void *)(p+(dx-i)+FP_OFF(screen)),(void *)0xa0000,i);				}				p += ylookup[1];			}		}		permanentupdate = 0;	}	if (origbuffermode == 0)	{		if (setvisualentry)		{			i = imageSize*(dapagenum&0x7fffffff);			if (vgacompatible)			{				if (dapagenum >= 0) qlimitrate();				vesasetvisual(0x4f07,0L,i>>2,i>>18);			}			else				{ vesasetvisual(0x4f07,0x80,i>>2,i>>18); }		}		else		{			regs.x.ax = 0x4f07;			regs.x.cx = visualpagelookup[dapagenum&0x7fffffff][0]; //X-coordinate			regs.x.dx = visualpagelookup[dapagenum&0x7fffffff][1]; //Y-coordinate			if (vgacompatible)			{				regs.x.bx = 0;				if (dapagenum >= 0) qlimitrate();				DPMI_int86(0x10,&regs,&regs);			}			else				{ regs.x.bx = 0x80; DPMI_int86(0x10,&regs,&regs); }		}		if (dapagenum >= 0) faketimerhandler();	}}void uninitvesa(void){	if (backlinaddress)	{		union REGS r;		r.w.ax = 0x801;		r.w.bx = (backlinaddress >> 16);		r.w.cx = (backlinaddress & 0xffff);		backupsegs(); int386(0x31,&r,&r); restoresegs();		if (r.x.cflag) { printf("Free Physical Address failed!\n"); }		backlinaddress = 0;	}	VESABuf_sel = 0;	vesachecked = 0;}#if 0  // doesn't appear to be used anymore. --ryan.#pragma aux setpalettequick =\	"mov edx, 0x3c8",\	"out dx, al",\	"inc edx",\	"lea ecx, [ecx+ecx*2]",\	"cld",\	"rep outsb",\	parm [eax][ecx][esi]\	modify exact [ecx edx esi]#endifint VBE_setPalette(long start, long num, char *dapal){	RMREGS regs;	long i, j, k;	char palquick[768];	if (stereomode == 1)	{		if ((unsigned)((blackband&255)-start) < (unsigned)num)		{			dapal[(((blackband&255)-start)<<2)+0] = 0;			dapal[(((blackband&255)-start)<<2)+1] = 0;			dapal[(((blackband&255)-start)<<2)+2] = 0;		}		if ((unsigned)((whiteband&255)-start) < (unsigned)num)		{			dapal[(((whiteband&255)-start)<<2)+0] = 255;			dapal[(((whiteband&255)-start)<<2)+1] = 255;			dapal[(((whiteband&255)-start)<<2)+2] = 255;		}	}	if ((vgacompatible) || (vgaInfo.VESAVersion < 0x200) || (vidoption != 1))	{		j = 0; k = (start<<2);		for(i=0;i<num;i++)		{			palquick[j] = dapal[k+2];			palquick[j+1] = dapal[k+1];			palquick[j+2] = dapal[k];			j += 3; k += 4;		}		//setpalettequick(start,num,palquick);		koutp(0x3c8,start);		for(i=(num>>1);i>0;i--)		{			koutp(0x3c9,(long) dapal[2]);			while (kinp(0x3da)&1); while (!(kinp(0x3da)&1));										  koutp(0x3c9,(long) dapal[1]); koutp(0x3c9,(long) dapal[0]);			koutp(0x3c9,(long) dapal[6]); koutp(0x3c9,(long) dapal[5]); koutp(0x3c9,(long) dapal[4]);			dapal += 8;		}		if (num&1)		{			koutp(0x3c9,(long) dapal[2]);			while (kinp(0x3da)&1); while (!(kinp(0x3da)&1));										  koutp(0x3c9,(long) dapal[1]); koutp(0x3c9,(long) dapal[0]);		}		return(1);	}	if (setpaletteentry)	{		i = (vesasetpalette(0x4f09,(vgaInfo.Capabilities&4)<<5,								  num,start,0L,dapal)&65535);	}	else	{		regs.x.ax = 0x4f09; regs.h.bl = ((vgaInfo.Capabilities&4)<<5);		regs.x.cx = num; regs.x.dx = start;		VBE_callESDI(&regs,dapal,sizeof(dapal)*num);		i = regs.x.ax;	}	if (i != 0x004f) return(0);	return(1);}VBE_getPalette(long start, long num, char *dapal){	RMREGS regs;	long i;	if ((vgacompatible) || (vgaInfo.VESAVersion < 0x200) || (vidoption != 1))	{		koutp(0x3c7,start);		for(i=num;i>0;i--)		{			dapal[2] = (char) kinp(0x3c9);			dapal[1] = (char) kinp(0x3c9);			dapal[0] = (char) kinp(0x3c9);			dapal += 4;		}		return(1);	}	regs.x.ax = 0x4f09; regs.h.bl = 1;	regs.x.cx = num; regs.x.dx = start;	VBE_callESDI(&regs,dapal,sizeof(dapal)*num);	i = regs.x.ax;	if (i != 0x004f) return(0);	return(1);}#endif   // _INCLUDE_VES2_H_// end of ves2.h ...

⌨️ 快捷键说明

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