📄 ves2.h
字号:
regs.x.ax = 0x4f0a; regs.x.bx = 0; DPMI_int86x(0x10,®s,®s,&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,®s,®s); 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,®s,®s); \ } \}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,®s,®s); } else { regs.x.bx = 0x80; DPMI_int86(0x10,®s,®s); } } 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(®s,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(®s,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 + -