From: "Tims News" Newsgroups: comp.os.msdos.djgpp Subject: DMA, Pointers and Physical Memory Date: Fri, 11 May 2001 11:42:10 +0100 Message-ID: <989577210.22969.0.nnrp-02.c30b1810@news.demon.co.uk> NNTP-Posting-Host: [195.11.24.16] X-NNTP-Posting-Host: [195.11.24.16]:195.11.24.16 X-Trace: news.demon.co.uk 989577210 nnrp-02:22969 NO-IDENT [195.11.24.16]:195.11.24.16 X-Complaints-To: abuse AT demon DOT net X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 5.00.2014.211 X-MimeOLE: Produced By Microsoft MimeOLE V5.00.2014.211 Lines: 55 To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com Hi, I am currently working on MultiBus II Message Passing and have hit a small problem with the DMA transfer. I need to convert a standard pointer (eg. struct mystruct* pInstance) to a PHYSICAL memory address. This is not the address of the data to be transferred (that seems well documented in the FAQ - although I haven't tried the code yet), this is for the DMA command block. The code I have at present, does not seem to be working - can anybody help me please. Also, PLEASE PLEASE PLEASE, if you send me a "read faq entry n" could you please also include the link for the FAQ to which you refer - as far as I can make out there are a number of (all sleightly) different ones around - Thank You :) By means of further explanation, below is a snippet of my code: main() { struct cb_short1* pCmd; cb_short.info=some_stuff; AdmaStart(1,pCmd); } void AdmaStart(UINT8 chan, struct cb_short1* pCmd) { UINT32 Physical; UINT16 Selector; // Convert pointer to physical memory location Selector = *((UINT16*)(((UINT8*)(&pCmd))+4)); __dpmi_get_segment_base_address((UINT32)Selector, &Physical); Physical += *((UINT32*)(&pCmd)); // Address of command block outportb(CPRL +(CHAN_SEP*chan), Physical &0xFF ); outportb(CPRH +(CHAN_SEP*chan), (Physical>>16) &0xFF ); // GO! outportb(GCR, 1<<(chan+4) |0x0A); } Tim =%¬}