From: Johan De Messemaeker Newsgroups: comp.os.msdos.djgpp Subject: Why doesn't this work ? Date: Sun, 12 Jan 1997 05:10:47 +0100 Organization: RUG Gent Lines: 148 Message-ID: <32D86447.C74@rug.ac.be> Reply-To: Johan DOT DeMessemaeker AT rug DOT ac DOT be NNTP-Posting-Host: infernal.rug.ac.be Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------49997AC41C48" To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp This is a multi-part message in MIME format. --------------49997AC41C48 Content-Type: text/plain; charset=us-ascii; name="Vesa.c" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="Vesa.c" #include "vesa.h" int xres, yres; unsigned int addr; // Address of the linear frame buffer unsigned char *video_pointer; // 8 bit pointer to the video memory unsigned short *vid_point; // 16 bit pointer VBE_ModeInfo *get_mode_info(int mode) { static VBE_ModeInfo modeinfo; __dpmi_regs r; r.x.ax = 0x4F01; r.x.cx = mode; r.x.es = __tb / 16; r.x.di = 0; __dpmi_int(0x10, &r); if(r.h.ah) return 0; dosmemget(__tb, sizeof(VBE_ModeInfo), &modeinfo); return &modeinfo; } void VESA_INIT(int mode) { int bpp; VBE_ModeInfo *modeinfo; __dpmi_meminfo mem; __dpmi_regs reg; modeinfo=get_mode_info(mode); xres=modeinfo->XResolution; yres=modeinfo->YResolution; bpp=modeinfo->BitsPerPixel/8; mem.size=yres*xres*(bpp+1); mem.address=modeinfo->PhysBasePtr; __dpmi_physical_address_mapping(&mem); addr=mem.address; video_pointer = (unsigned char *)(addr + __djgpp_conventional_base); vid_point = (unsigned short *)video_pointer; printf("Vesa mode %x: %d x %d, %d colors\n", mode, xres, yres, (int)pow(2,bpp*8)); reg.x.ax=0x4f02; reg.x.bx=0x4000+mode; __dpmi_int(0x10,®); } void TEXT_MODE(unsigned char mode) { union REGS in; union REGS out; in.h.ah=0; in.h.al=mode; int86(0x10, &in, &out); } void putpixel(int x, int y, unsigned short c) { video_pointer[y*xres+x]=c; // same as *vid_point+y*xres+x = c } // note: change to *video_pointer for 8bit modes --------------49997AC41C48 Content-Type: text/plain; charset=us-ascii; name="Vesa.h" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="Vesa.h" #include #include #include #include #include #include #include #include #include #define PACKED __attribute__((packed)) #pragma pack(1) typedef struct { short ModeAttributes PACKED; /* Mode attributes */ char WinAAttributes PACKED; /* Window A attributes */ char WinBAttributes PACKED; /* Window B attributes */ short WinGranularity PACKED; /* Window granularity in k */ short WinSize PACKED; /* Window size in k */ short WinASegment PACKED; /* Window A segment */ short WinBSegment PACKED; /* Window B segment */ void *WinFuncPtr PACKED; /* Pointer to window function */ short BytesPerScanLine PACKED; /* Bytes per scanline */ short XResolution PACKED; /* Horizontal resolution */ short YResolution PACKED; /* Vertical resolution */ char XCharSize PACKED; /* Character cell width */ char YCharSize PACKED; /* Character cell height */ char NumberOfPlanes PACKED; /* Number of memory planes */ char BitsPerPixel PACKED; /* Bits per pixel */ char NumberOfBanks PACKED; /* Number of CGA style banks */ char MemoryModel PACKED; /* Memory model type */ char BankSize PACKED; /* Size of CGA style banks */ char NumberOfImagePages PACKED; /* Number of images pages */ char res1 PACKED; /* Reserved */ char RedMaskSize PACKED; /* Size of direct color red mask */ char RedFieldPosition PACKED; /* Bit posn of lsb of red mask */ char GreenMaskSize PACKED; /* Size of direct color green mask */ char GreenFieldPosition PACKED; /* Bit posn of lsb of green mask */ char BlueMaskSize PACKED; /* Size of direct color blue mask */ char BlueFieldPosition PACKED; /* Bit posn of lsb of blue mask */ char RsvdMaskSize PACKED; /* Size of direct color res mask */ char RsvdFieldPosition PACKED; /* Bit posn of lsb of res mask */ char DirectColorModeInfo PACKED; /* Direct color mode attributes */ /* VESA 2.0 variables */ long PhysBasePtr; /* physical address for flat frame buffer */ long OffScreenMemOffset; /* pointer to start of off screen memory */ short OffScreenMemSize; /* amount of off screen memory in 1k units */ char res2[206] PACKED; /* Pad to 256 byte block size */ } VBE_ModeInfo; #pragma pack(4) VBE_ModeInfo *get_mode_info(int mode); void VESA_INIT(int mode); void TEXT_MODE(unsigned char mode); void putpixel(int x, int y, unsigned short c); --------------49997AC41C48 Content-Type: text/plain; charset=us-ascii; name="Main.c" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="Main.c" #include "vesa.h" main() { VESA_INIT(0x4101); putpixel(100,100,255); getch(); TEXT_MODE(0x3); } --------------49997AC41C48--