Well the GDI code (v2) works perfectly.

The palette seems to be right. Only problem is GDI is SLOOOOOOOOOOW (maybe we get 10-15fps which isn't too bad). However, using GDI, I don't think there is enough CPU for MP3 voices or adlib music.
Fades/color palette cycling and scrolling, etc are slow, but otherwise GDI is ok, as long as you're not updating the entire screen

.
I'll put some screenshots up at
Yep, the Jornada 820 uses a 640x480x256 color display. The reason is the SA-1100 LCD controller shares the LCD memory bus with everything else (PCMCIA, etc). The SA-1100 LCD controller just doesn't have the bandwidth for more colors.
We've fiddled with getting Linux running on the Jornada 820, but we're not at the stage of getting the Framebuffer working (yet). The memory map of the LCD seems to be similar to that below. Maybe the LCD controller wants 16-bit values for each pixel? I'm not sure atm. I've put some small detail below.
0xc0002e00 Palette 0x200 bytes
0xc0003000 Upper Half 0x12C00 bytes for 8-bit 640x240
0x25800 bytes for 16-bit 640x240
0x25800 bytes for 8-bit 640x480
0xc0028800 Bottom Half 0x12C00 bytes for 8-bit 640x240
0x25800 bytes for 16-bit 640x240
0x25800 bytes for 8-bit 640x480
Note that if 640x480x8 or 640x480x16 is used then the upper and lower halves of the screen are contiguous in memory.
There are a few other HPCs around that have large(r) displays. And there's always the Zaurus C700 (runs Linux at 640x480). So the Jornada 820 isn't the only "handheld" device that'll run COMI at 640x480.