www.delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/2003/02/18/16:15:12.1

Message-ID: <3E529D49.2F4BA039@worldnet.att.net>
From: Paul Cousoulis <paulcsouls AT worldnet DOT att DOT net>
X-Mailer: Mozilla 4.78 [en] (Win95; U)
X-Accept-Language: en
MIME-Version: 1.0
Newsgroups: comp.os.msdos.djgpp
Subject: Re: Passing pointers to dpmi_int
References: <3E51709E DOT DE111E40 AT worldnet DOT att DOT net> <Prp4a.50430$jM5 DOT 125811 AT newsfeeds DOT bigpond DOT com>
Lines: 49
Date: Tue, 18 Feb 2003 20:57:45 GMT
NNTP-Posting-Host: 12.81.71.108
X-Complaints-To: abuse AT worldnet DOT att DOT net
X-Trace: bgtnsc04-news.ops.worldnet.att.net 1045601865 12.81.71.108 (Tue, 18 Feb 2003 20:57:45 GMT)
NNTP-Posting-Date: Tue, 18 Feb 2003 20:57:45 GMT
Organization: AT&T Worldnet
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp
Reply-To: djgpp AT delorie DOT com

Great, I'll try that. I though there might something like that wrong
with the code.

Thanks
Paul Cousoulis

Ben Peddell wrote:
> 
> The dds_local structure must be copied to conventional memory, as the ES:DI
> is a real-mode pointer.
> Try:
> 
>     if ((retseg = __dpmi_allocate_dos_memory ((sizeof(dds_local) >>
> 4)+1,&retsel)) < 0){
>         printf ("Error allocating DOS memory\n");
>         /*
>          * No use trying to continue, as we don't have any DOS memory to use
>          */
>         return -1;
>     }
>     movedata (_my_ds(), &dds_local, retsel, 0, sizeof(dds_local));
> 
>     dr.w.dx = 0;
>     dr.w.ax = 0x8103;
>     dr.w.es = retseg;
>     dr.w.di = 0;
>     if (__dpmi_int (0x4B,&dr)) printf ("Error locking DMA Region\n");
>     movedata (retsel, 0, _my_ds(), &dds_local, sizeof(dds_local));
>     if (__dpmi_free_dos_memory (retsel)) printf ("Error freeing DOS
> memory\n");
> 
> Paul Cousoulis <paulcsouls AT worldnet DOT att DOT net> wrote in message
> news:3E51709E DOT DE111E40 AT worldnet DOT att DOT net...
> >
> > I'm trying to implement the Virtual DMA Service. In order to lock DMA
> > memory I need to pass the address of a structure to int 4b in es:di. The
> > physical address should be returned in dds_local, but I keep getting
> > zero even though the function seems to otherwise return successfully.
> > The code I'm using is:
> > >
> > > dr.x.dx = 0;
> > > dr.x.ax = 0x8103;
> > > temp = (int)(&dds_local);
> > > dr.x.es = (unsigned short)(temp>>16);
> > > dr.x.di = (unsigned short)(temp & 0xffff);
> > > if(__dpmi_int(0x4b,&dr)) printf("error\n");
> > >
> > Thanks
> > Paul

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019