When the GMA950 operates in text video mode, the Graphics Memory is organized as a list of dwords. The 1st byte of each dword matches a byte in display plane 0, the 2nd byte of each dword matches a byte in display plane 1, and so on...
There can be 8 display pages.
GM + 00000000h : Display page 0
GM + 00004000h : Display page 1
GM + 00008000h : Display page 2
GM + 0000C000h : Display page 3
GM + 00010000h : Display page 4
GM + 00014000h : Display page 5
GM + 00018000h : Display page 6
GM + 0001C000h : Display page 7
There can be 8 fonts loaded.
GM + 00000000h : Font block 0
GM + 00008000h : Font block 4
GM + 00010000h : Font block 1
GM + 00018000h : Font block 5
GM + 00020000h : Font block 2
GM + 00028000h : Font block 6
GM + 00030000h : Font block 3
GM + 00038000h : Font block 7
This is how the first 12 bytes of the Graphics Memory are used:
/------------------------------------------------> character code 1st cell
| /--------------------------------------------> attribute byte 1st cell
| | /----------------------------------------> 1st bit pattern 1st ascii
| | | /------------------------------------> unused (a)
| | | | /--------------------------------> unused (b)
| | | | | /----------------------------> unused (b)
| | | | | | /------------------------> 2nd bit pattern 1st ascii
| | | | | | | /--------------------> unused (a)
| | | | | | | | / ---------------> character code 2nd cell
| | | | | | | | | /------------> attribute byte 2nd cell
| | | | | | | | | | /--------> 3rd bit pattern 1st ascii
| | | | | | | | | | | /----> unused (a)
| | | | | | | | | | | |
00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h
(a) These byte aren't used because they match with an unused bit-plane 3
(b) Not using these bytes is the inevitable consequence of the odd/even operation used in the text video mode, where 2 consecutive character codes in the host memory occupy consecutive even addresses in the display memory. Since the bytes marked with (b) correspond to odd adresses they aren't used.