www.delorie.com/archives/browse.cgi | search |
Message-ID: | <3842D52E.7BBA7F2E@interlog.com> |
From: | Alan Illeman <illeman AT interlog DOT com> |
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> |
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.
webmaster | delorie software privacy |
Copyright © 2019 by DJ Delorie | Updated Jul 2019 |