Message-ID: <3842D52E.7BBA7F2E@interlog.com> From: Alan Illeman X-Mailer: Mozilla 4.04 [en] (Win95; U) MIME-Version: 1.0 Newsgroups: comp.os.msdos.djgpp Subject: Re: nearptr access to memory mapped devices References: <81s582$bmt$1 AT nntp8 DOT atl DOT mindspring DOT net> Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Lines: 76 Date: Mon, 29 Nov 1999 14:34:06 -0500 NNTP-Posting-Host: 154.11.82.190 X-Trace: cac1.rdr.news.psi.ca 943903627 154.11.82.190 (Mon, 29 Nov 1999 14:27:07 EST) NNTP-Posting-Date: Mon, 29 Nov 1999 14:27:07 EST To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com Marp wrote: > > I have a question about accessing a memory mapped device using a near > pointer. I was reading through the vbe 3.0 spec and it suggested the > following to access the linear frame buffer: [snip] this works for me.. static int GetModeInfo(unsigned short mode) { long modeptr; int i, error; __dpmi_meminfo mapping; if((error=GetVESAINFO()) != VESA_SUCCESS) return error; /* convert the mode list pointer from seg:offset to a linear address */ modeptr = ((vesainfo.VideoModePtr & 0xFFFF0000) >> 12) + (vesainfo.VideoModePtr & 0xFFFF); for(i=0; ;i++) { if(_farpeekw(_dos_ds, modeptr) == 0xFFFF) return VESA_MODE_ERROR; if(_farpeekw(_dos_ds, modeptr) == mode) break; modeptr += 2; /* next WORD */ } if((error=GetMODEINFO(mode)) != VESA_SUCCESS) return error; /* check for linear frame buffer capability */ if(!(modeinfo.ModeAttributes & 0x0080)) return VESA_LINEAR_ERROR; /* create direct pointer to video memory */ if (!__djgpp_nearptr_enable()) return VESA_MAPPING_ERROR; /* map into linear memory */ mapping.address = modeinfo.PhysBasePtr; mapping.size = vesainfo.TotalMemory << 16; if (__dpmi_physical_address_mapping(&mapping) != 0) return VESA_MAPPING_ERROR; video = (unsigned char *)(mapping.address + __djgpp_conventional_base); xres = modeinfo.XResolution; yres = modeinfo.YResolution; return VESA_SUCCESS; } int SetVesaMode(unsigned short mode) { __dpmi_regs r; int error; if((error=GetModeInfo(mode)) != VESA_SUCCESS) return error; /* get current video mode */ oldmode = _farpeekb(_dos_ds, 0x449); /* byte at 40:49h */ /* call the VESA function */ r.x.ax = SET_VESA_MODE; r.x.bx = mode | SET_VESA_LINEAR; __dpmi_int(0x10, &r); if (r.d.eax == -1) return VESA_ERROR; return VESA_SUCCESS; } If you want the rest of it, say.