Xref: news2.mv.net comp.os.msdos.djgpp:6248 From: bcalves AT access2 DOT digex DOT net () Newsgroups: comp.os.msdos.djgpp Subject: [Q] VBE/DJGPP mem. access Date: 22 Jul 1996 05:28:30 GMT Organization: Express Access Online Communications USA: 800-969-9090 Lines: 106 Message-ID: <4sv3hu$b3g@news3.digex.net> NNTP-Posting-Host: access2.digex.net To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Hi all, I'm having some difficulty with my simple VBE test program. My C program initializes 640x480x8bpp, packed pixel, linear framebuffer mode. Unfortunately, I seem to be unable to write to said framebuffer. I think the problem may lie in how I'm trying to gain access to the framebuf with dpmi. I've tried both near and far pointer techniques as per various tutorials/faqs I've seen, but the screen remains blank (except for garbage when I don't set the memory-clear bit on the mode set function). Could someone please suggest what I might be doing wrong in the attached program?? Incidentally, the program runs without returning errors or faulting. For what it's worth, I'm using UniVBE, QEMM's QDPMI, and a Diamond Edge 3D 3400XL. Do I need a newer DPMI implementation? My QDPMI came with QEMM 7. Thanks in advance, Brian --------Code Follows---------- #include #include #include #include #include #include #include "vbe.h" int main() { __dpmi_meminfo meminfo; __dpmi_regs r; CVBEMode *mode; uint linear_address; uchar *videoptr; int width, height, error, i; error = 0; // GET INFO FOR MODE 257 (640x480x8bpp, packed pixel, linear frame buf) mode = new CVBEMode(257); // CVBEMode wraps the GetModeInfo func width = mode->XRes(); // I'm printed out all the CVBEMode height = mode->YRes(); // data and it appears to be valid. // GET ADDRESS OF FRAME BUFFER meminfo.size = width * height; meminfo.address = (unsigned long int)mode->PhysBasePtr(); __dpmi_physical_address_mapping(&meminfo); linear_address = meminfo.address; // The physical base ptr returned (above) from VBE is 0xe1100000 // The resulting linear address was 0x8??????? // Do those values set off alarms with anyone? // THIS IS FROM A TUTORIAL I FOUND videoptr = (unsigned char *)0x0; short our_global_selector = __dpmi_allocate_ldt_descriptors(1); __dpmi_set_segment_base_address(our_global_selector, linear_address); // THEN I ADDED THIS WHEN _farpokeb (BELOW) CAUSED SEG-FAULTS __dpmi_set_segment_limit(our_global_selector, width*height); // INIT MODE r.x.ax = 0x4F02; r.x.bx = 0xc000 | mode->ModeNum(); __dpmi_int(0x10, &r); if (r.x.ax & 0xff00) error |= 0x1; // DISPLAY A FEW COLORFUL, HORIZONTAL BARS if (!error) { for (i=0; i<256; i++) { _farpokeb(our_global_selector, (uint)(videoptr + 100*width+i), i); _farpokeb(our_global_selector, (uint)(videoptr + 101*width+i), i); _farpokeb(our_global_selector, (uint)(videoptr + 102*width+i), i); _farpokeb(our_global_selector, (uint)(videoptr + 103*width+i), i); _farpokeb(our_global_selector, (uint)(videoptr + 104*width+i), i); } } getch(); // RESTORE TEXT MODE r.x.ax = 0x3; __dpmi_int(0x10, &r); // EXIT if (error) cout << "Error: 0x" << (hex) << error << (dec) << endl; else cout << "No error" << endl; delete mode; } --------End Code---------