Mail Archives: djgpp/2003/02/18/16:15:12.1
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 -