hi sieber,
what's the dsa paper from Nokia with that mistake!? If you refeer to the "DirScrAcc" flag example, i think there is something really wrong with it and a Nokia 6600 because i tried it too and it's all greeny and bad (i think the View3, with the flag in DSA/DMA mode). Anyway, this can be fixed by changing the color depth of the screen, if i remeber it correctly..
Anyway, i'm coding my own framework for our development team, and i really know how bad is to have to figure out this stuff by yourself and how it's stressfull trying and hanging the phone.
I'm posting some snippet from my framework, and these are surely working because we are using it for a game.
I'll try to explain as best as i can, sorry for some grammar-mistakes, i'm not an english guy ;-)
Here i'm setting up the DirectScreenAccess, depending on the target platform because, you know, the emulator is different from the real device: anyway, the preprocessor can help you a lot without loosing readability.
Code:
// Direct screen access
iDirectScreenAccess = CDirectScreenAccess::NewL(iClient, iScreenDevice, iWindow, *this);
#ifdef __WINS__
iScreenBufferBitmap = new (ELeave) CWsBitmap( iClient );
TSize size = iScreenDevice.SizeInPixels();
User::LeaveIfError(iScreenBufferBitmap->Create(size, KDisplayMode));
iScreenAddrBase = (TUint16*)iScreenBufferBitmap->DataAddress();
#else
// DSA and DMA
// fetch screen buffer address
TScreenInfoV01 screenInfo;
TPckg<TScreenInfoV01> sInfo(screenInfo);
UserSvr::ScreenInfo(sInfo);
TUint8* frameBufAddr = NULL;
frameBufAddr = screenInfo.iScreenAddressValid ? (TUint8*)screenInfo.iScreenAddress : 0;
User::LeaveIfNull(frameBufAddr);
// skip the palette data
frameBufAddr += 32;
iScreenAddrBase = (TUint16*)frameBufAddr;
// initialise the raw redraw event (used when drawing directly to frame buffer)
iRedraw.Set(TRawEvent::ERedraw);
#endif // __WINS__
iScreenAddr = iScreenAddrBase;
iSurface = new CSurface(iScreenAddr, iScreenDevice.SizeInPixels().iWidth, iScreenDevice.SizeInPixels().iHeight);
SetupDirectScreenAccessL();
iCanDraw = true;
Notice we are skipping the 16 2bytes palette entries with a TUint8* pointer, so we must add 32 bytes in order to skip correctly. If it was a TUint16* pointer, we would add 16 bytes instead of 32.
The next snippet came from my macros in order to compose a color for the 16bit color mode (EColor64K), given the RGB-triplet as a input:
Code:
#define MAKE_PIXEL16(R, G, B) (((R >> 3) << 11) | ((G >> 2) << 5) | (B >> 3))
this way you can draw a single pixel by doing something like this:
Code:
TUint16* pixel = iScreenAddr + yourX + yourY * iScreenPitch;
*pixel = MAKE_PIXEL16(126, 35, 89);
It's pretty self-explanatory 
Now, if you want to get your original RGB-triplet from your 16bit encoded one, you can use those macros, but read the note then:
Code:
// return color components using the byte notation
#define GETR(color) (((color >> 11) & 0x1F) << 3)
#define GETG(color) (((color >> 5) & 0x3F) << 2)
#define GETB(color) ((color & 0x1F) << 3)
// return color components using the 565 notation
#define GETR565(color) ( color >> 11 ) & 0x001f
#define GETG565(color) ( color >> 6 ) & 0x001f
#define GETB565(color) ( color & 0x001f )
This isn't completely true, the process cannot be reversed completely because when you encode an RGB-triplet to the corresponding 16bit encoding you are loosing informations: for example, u'll try to encode an R value of 255, you'll not be able to return to the original 255 value!
Why two version of GetR/G/B ?! Because you can extrapolate color informations in two ways, mapping the 5-bit (or 6-bit for green) to the corresponding 8-bit, or by retaining only the 5/6 bit information. So, for the previous R value of 255, you'll get "31" as the result from the GETR565, or something like 252 from the GETR one.
As last hint, i re-propose a snippet from the dsa one:
Code:
iSurface = new CSurface(iScreenAddr, iScreenDevice.SizeInPixels().iWidth, iScreenDevice.SizeInPixels().iHeight);
This code came from my framework, so u'll do better to remove it if you wanna compile, but take it as an advise: wrap screen addresses into "Symbian-TClasses" (i don't like this naming convention so the mine is called CSurface), your coding will be seriously more comfortable 
Hope to helped some people in trouble!