Frame Buffer, DMA Question

Hi everyone,
I am planning on building a game for pocket pc, and have seen GAPI, PocketFrog, and a few other libraries. However, I am trying to understand how these libraries work. I have built a test app that can access the frame buffer (I think) at address 0x8451a000 on my iPaq. I got that address from the Microsoft GAPI dll.
What I want to understand though is where did that address come from - it seems that it can be anything depending on the device.
I have done heaps of searching around newsgroups and web pages and I have found a spot in the registry on my iPaq where I can get bpp and screen size but I'm not sure how portable that is. It also referenced ddi.dll which almost looked like the solution except I looked through all of the help on the MS site and none of the functions seem to return the address.
Using that address I do a VirtualAlloc, VirtualCopy to get a pointer to it and can write directly to what I think is the frame buffer. I have noticed discussions on this website about writing through DMA and there seems to be "direct access", and "backbuffer access" and I don't know how these fit together.
My little test app can draw a tile based map (tiles 32x32 pixels) and scroll around it at between 160fps and 200fps. This is by using memcpy, and having an offscreen bitmap the same size and bpp as the screen and drawing each tile to it, and then copying that whole bitmap to the frame buffer. I tried doing it pixel by pixel and it was heaps slower - about 50fps at best. I had a quick read of the ARM assembler commands and looked at the code produced by EC++4 and it seemed very inefficient from my limited knowledge, but I really don't want to go down to that level.
If anyone could shed some light on these topics it would be much appreciated.
I am planning on building a game for pocket pc, and have seen GAPI, PocketFrog, and a few other libraries. However, I am trying to understand how these libraries work. I have built a test app that can access the frame buffer (I think) at address 0x8451a000 on my iPaq. I got that address from the Microsoft GAPI dll.
What I want to understand though is where did that address come from - it seems that it can be anything depending on the device.
I have done heaps of searching around newsgroups and web pages and I have found a spot in the registry on my iPaq where I can get bpp and screen size but I'm not sure how portable that is. It also referenced ddi.dll which almost looked like the solution except I looked through all of the help on the MS site and none of the functions seem to return the address.
Using that address I do a VirtualAlloc, VirtualCopy to get a pointer to it and can write directly to what I think is the frame buffer. I have noticed discussions on this website about writing through DMA and there seems to be "direct access", and "backbuffer access" and I don't know how these fit together.
My little test app can draw a tile based map (tiles 32x32 pixels) and scroll around it at between 160fps and 200fps. This is by using memcpy, and having an offscreen bitmap the same size and bpp as the screen and drawing each tile to it, and then copying that whole bitmap to the frame buffer. I tried doing it pixel by pixel and it was heaps slower - about 50fps at best. I had a quick read of the ARM assembler commands and looked at the code produced by EC++4 and it seemed very inefficient from my limited knowledge, but I really don't want to go down to that level.
If anyone could shed some light on these topics it would be much appreciated.