Message-ID: <3E529D49.2F4BA039@worldnet.att.net> From: Paul Cousoulis 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> Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit 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 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