Работа с VESA 2.0 (WATCOM C)
#include <i86.h>
#include <mem.h>
#include <bios.h>
typedef unsigned short us;
typedef unsigned int word;
typedef unsigned char uc;
typedef unsigned long ul;
typedef struct SVBE_InfoBlock {
uc VbeSignature[4]; // VBE Signature
us VbeVersion; // VBE Version
ul OemStringPtr; // Pointer to OEM String
ul Capabilities; // Capabilities of graphics cont.
ul VideoModePtr; // Pointer to Video Mode List
// Added for VBE 1.2+
us TotalMemory; // Number of 64kb memory blocks
// Added for VBE 2.0+
us OemSoftwareRev; // VBE implementation Software revision
ul OemVendorNamePtr; // Pointer to Vendor Name String
ul OemProductNamePtr; // Pointer to Product Name String
ul OemProductRevPtr; // Pointer to Product Revision String
us AccelVbeVersion; // VBE/AF Version
ul AccelVideoModePtr; // Pointer to Acclelerated Mode List
uc Reserved20[216]; // Reserved for VBE implementation
// scratch area
uc OemData[256]; // Data Area for OEM Strings
uc NaVsyakiySloochay[100]; // 2e
} VBE_InfoBlock;
typedef struct SVBE_ModeInfoBlock {
us ModeAttributes; // mode attributes
uc WinAAttributes; // window A attributes
uc WinBAttributes; // window B attributes
us WinGranularity; // window granularity
us WinSize; // window size
us WinASegment; // window A start segment
us WinBSegment; // window B start segment
ul WinFuncPtr; // pointer to window function
us BytesPerScanLine; // bytes per scan line
// Mandatory information for VBE 1.2 and above
us XResolution; // horizontal resolution in pixels or chars
us YResolution; // vertical resolution in pixels or chars
uc XCharSize; // character cell width in pixels
uc YCharSize; // character cell height in pixels
uc NumberOfPlanes; // number of memory planes
uc BitsPerPixel; // bits per pixel
uc NumberOfBanks; // number of banks
uc MemoryModel; // memory model type
uc BankSize; // bank size in KB
uc NumberOfImagePages; // number of images
uc Reserved12; // reserved for page function
// Direct Color fields (required
// for direct/6 and YUV/7 memory models)
uc RedMaskSize; // size of direct color red mask in bits
uc RedFieldPosition; // bit position of lsb of red mask
uc GreenMaskSize; // size of direct color green mask in bits
uc GreenFieldPosition; // bit position of lsb of green mask
uc BlueMaskSize; // size of direct color blue mask in bits
uc BlueFieldPosition; // bit position of lsb of blue mask
uc RsvdMaskSize; // size of direct color reserved mask in bits
uc RsvdFieldPosition; // bit position of lsb of reserved mask
uc DirectColorModeInfo; // direct color mode attributes
// Mandatory information for VBE 2.0 and above
ul PhysBasePtr; // physical address for flat frame buffer
ul OffScreenMemOffset; // pointer to start of off screen memory
us OffScreenMemSize; // amount of off screen memory in 1k units
uc Reserved20[206]; // remainder of ModeInfoBlock
uc NaVsyakiySloochay[100]; // 2e
} VBE_ModeInfoBlock;
typedef struct SVBE_RMI { // Rreal Mode Interrupt (RMI) structure
ul EDI, ESI, EBP, ReservedByRMI,
EBX, EDX, ECX, EAX;
us flags,
ES, DS,
FS, GS,
IP, CS,
SP, SS;
} VBE_RMI;
ul bpc,bpl;
word maxx,maxy,mmode;
us VBE_FillInfoBlock (VBE_InfoBlock *);
us VBE_FillModeInfoBlock (VBE_ModeInfoBlock *, us vbemode);
us VBE_SetMode (us vesamode, VBE_ModeInfoBlock *);
uc near * LFB;
VBE_InfoBlock far * vinfo;
VBE_ModeInfoBlock far * minfo;
void SetVESAMode(int xmax, int ymax, int bpp)
{
static VBE_RMI RMI;
union REGS r;
struct SREGS sr;
us sel,seg,x,y,ic;
ul phys;
r.x.eax=0x0100;
r.x.ebx=600>>4;
int386(0x31,&r,&r);
if (r.x.cflag)
{
puts (" ю DOS memory alocate error.");
return;
}
seg = r.w.ax; // RM segment
sel = r.w.dx; // PM selector
vinfo = (VBE_InfoBlock far *) MK_FP (sel, 0);
_fstrncpy ((uc far *) vinfo, "VBE2", 4);
memset (&sr, 0, sizeof (sr));
memset (&RMI, 0, sizeof (RMI));
RMI.EAX = 0x00004f00; // Get VBE Info
RMI.ES = seg;
RMI.EDI = 0;
r.w.ax = 0x0300;
r.h.bl = 0x10;
r.h.bh = 0;
r.w.cx = 0;
sr.es = FP_SEG (&RMI);
r.x.edi = FP_OFF (&RMI);
int386x (0x31, &r, &r, &sr);
if (r.x.cflag)
{
puts (" ю DPMI 300h failed.");
return;
}
if ((us) RMI.EAX != 0x004f)
{
puts (" ю Error Getting Video Controller Info.");
return;
}
if (vinfo -> VbeVersion > 4;
int386 (0x31, &r, &r);
if (r.x.cflag)
{
puts (" ю DOS memory alocate error.");
return;
}
seg = r.w.ax; // RM segment
sel = r.w.dx; // PM selector
minfo = (VBE_ModeInfoBlock far *) MK_FP (sel, 0);
memset (&sr, 0, sizeof (sr));
memset (&RMI, 0, sizeof (RMI));
mmode=0;
for (ic=0x4100;icBitsPerPixel==bpp)&&(minfo->XResolution==xmax)&&
(minfo->YResolution==ymax)&&((us)RMI.EAX==0x004f))
{
if (mmode==0) {mmode=ic;}
}
}
if (mmode==0)
{
puts (" ю Video mode no found.");
return;
}
RMI.EAX = 0x00004f01; // Get VBE Mode Info
RMI.ECX = mmode;
RMI.ES = seg;
RMI.EDI = 0;
r.w.ax = 0x0300;
r.h.bl = 0x10;
r.h.bh = 0;
r.w.cx = 0;
sr.es = FP_SEG (&RMI);
r.x.edi = FP_OFF (&RMI);
int386x (0x31, &r, &r, &sr);
phys=minfo->PhysBasePtr;
if (minfo->BitsPerPixel==32) {bpc=4;}
if (minfo->BitsPerPixel==24) {bpc=3;}
if (minfo->BitsPerPixel==16) {bpc=2;}
if (minfo->BitsPerPixel==15) {bpc=2;}
if (minfo->BitsPerPixel==8) {bpc=1;}
bpl=minfo->BytesPerScanLine;
maxx=minfo->XResolution;
maxy=minfo->YResolution;
r.w.ax = 0x0800;
r.w.bx = (phys >> 0x10);
r.w.cx = (phys & 0xffff);
r.w.si = (long)((maxy*bpl)>>16);
r.w.di = maxy*bpl;
int386 (0x31, &r, &r);
if (r.x.cflag)
{
puts (" ю Error mapping physical to linear");
return;
}
LFB = (uc near *) (((ul) r.w.bx >8);
b=(long)(color>>16);
addr=y*bpl+x*bpc;
LFB[addr+0]=r;
LFB[addr+1]=g;
LFB[addr+2]=b;
}
void ellipse(int x, int y, int a, int b, long color)
{
int col,i,row,bnew;
long a_square,b_square,two_a_square,two_b_square,four_a_square,four_b_square,d;
b_square=b*b;
a_square=a*a;
row=b;
col=0;
two_a_square=a_squareb_square*(col))
{
putpixel(col+x,row+y,color);
putpixel(col+x,y-row,color);
putpixel(x-col,row+y,color);
putpixel(x-col,y-row,color);
if (d>=0)
{
row--;
d-=four_a_square*(row);
}
d+=two_b_square*(3+(col0;i--) {ellipse((maxx/2),(maxy/2),i,i,(j to test or to change mode");
ch=getch();
if (ch==13)
{
SetVESAMode(x,y,c);
if (mmode!=0) {test();}
SetVGAMode(3);
}
if (ch==32)
{
printf("XResolution=");x=atoi(gets(xs));
printf("YResolution=");y=atoi(gets(ys));
printf("BitsPerPixel=");c=atoi(gets(cs));
}
} while (ch!=27);
}