From: tdu AT enter DOT net (Tim Updegrove) Newsgroups: comp.os.msdos.djgpp Subject: Allocate dos memory Date: Fri, 23 Apr 1999 01:48:10 GMT Message-ID: <371fcde7.5102505@news.enter.net> X-Newsreader: Forte Free Agent 1.11/32.235 NNTP-Posting-Host: 207.18.11.22 X-Original-NNTP-Posting-Host: 207.18.11.22 X-Trace: 22 Apr 1999 21:51:11 -0400, 207.18.11.22 Organization: Enter.Net Lines: 46 To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com I'm still trying to allocate memory and get a physical address for a DMA controller. As a temporary approach to my physical address problem, I've tried to use __dpmi_allocate_dos_memory. The below piece of code works but I have several questions: 1. How do I get the physical address from the selector and/or segment that is returned by __dpmi_allocate_dos_memory? Is it just (segment*16)+offset? 2. I assume this area of memory doesn't have to be locked. Correct? 3. If more than 64k bytes are allocated (like I did), must __dpmi_get_selector_increment_value or something be called to get a new selector when crossing a 64k boundary? ------------------------------------------------------------ int i, desc_lwds, desc_sel, desc_seg; desc_lwds = 32768; desc_seg = __dpmi_allocate_dos_memory(((desc_lwds*4)+15) >> 4, &desc_sel); _farsetsel(desc_sel); printf("Writing memory area\n"); for(i=0; i < desc_lwds; i++) _farnspokel(i*4, i); printf("Verifying memory area\n"); for(i=0; i < desc_lwds; i++) { data = _farnspeekl(i*4); if (data != i) { printf("Error: Expected data=%08lx Actual data=%08lx\n", i, data); exit(1); } /* compare */ } /* for */ Tim Updegrove tdu AT enter DOT net (remove the "nospam." in the reply address)