Mail Archives: djgpp/1999/04/22/22:20:17
| 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)
- Raw text -