DOS 3.3+ device drivers which support code page switching (via Fn 44H
IOCTL commands) read specially-formatted data files in order to prepare a
device to handle a selected code page font.  These .CPI files are in the
following format:

FontLibHdrRec
font library name
offset of FontInfo
FontInfoHdrRec
CpEntryHdrRec
pointer to next CodePageInfo header
device type (display or printer) and subtype (EGA, LCD, etc.)
CodePage number.  See Code Page
offset of FontData Header for this code page

FontDataHdrRec        FontData Header
number of fonts defined
Font 1 data (ScreenFontDataRec or PrinterFontDataRec)
Font 2 data
.
:
Font n

The following describes the structures used in .CPI files:

FontLibHdrRec
Offset Size Contents
                                                                          
+0      8  abSig        font library identifier: ffH,'FONT',20H,20H,20H
+8      8  res          8 bytes reserved; must be 00
+10H     2  wPtrCnt      Count of pointers in hdr (0001 for DOS 3.3-6.0)
+12H     1  bPtrType     Type of info pointer (use 01 for DOS 3.3-6.0)
+15H     4  lOffset      DWORD file offset of a FontInfoRec
23               size of a FontLibHdrRec (designed to be longer,
but DOS 3.3-6.0 define only one font).

FontInfoHdrRec
Offset Size Contents
                                                                          
+0      2  wCpEntryCnt  number of CpEntryHdrRecs to follow
2               size of a FontInfoHdrRec

CpEntryHdrRec
Offset Size Contents
                                                                          
+0      2  wCpEntryCnt  number of CpEntryHdrRecs to follow
+2      2  wLen         size of this structure, in bytes
+4      4  lNextCpEH    DWORD file offset of next CpEntryHdrRec
(0000 0000 indicates this is the last)
+8      2  wDevType     device type (0001=display, 0002=printer)
+0aH     8  abDevSubType device subtype and font file name;
left-justified, blank-padded.  For instance,
'EGA     ' means EGA.CPI.
+12H     2  wCpID        code page number (e.g., 01b5H = 437 = US
standard)
+14H     6  res          (6 bytes reserved, 0)
+18H     4  lOffset      file offset of FontDataHdrRec for this code page
24               length of a CpEntryHdrRec

FontDataHdrRec
Offset Size Contents
                                                                          
+0      2  res          (reserved: must be 0001)
+2      2  wFontCnt     number of fonts defined for this code page
+4      2  wLen         total length of all following font definitions
6               length of a FontDataHdrRec

ScreenFontDataRec
Offset Size Contents
                                                                          
+0      1  bCharHeight  lines per character (e.g., 0eH=14; 350-line mode)
+1      1  bCharWidth   clms per character (usually 08)
+2      1  bRelHeight   must be 00
+3      1  bRelWidth    must be 00
+4      2  wCharCnt     number of characters defined (e.g., 100H = 256)
+6      ?  abFontData   pixel data.  Each character has (rows * clms)
bits, formatted row by row.  Thus, in a 14-row by
8-clm character, each byte defines one row so a
set of 14 bytes define one character.
?+6              length of a ScreenFontDataRec
(256 chars * 14) = 3584 = 0e00H total bytes.

PrinterFontDataRec
Offset Size Contents
                                                                          
+0      2  wSelType     0001=the rCtrlSeq selects the default (hardware)
font and the data that follows it contains codes
to select a downloaded font followed by down-
laodable data.  See below.
0002=the rCtrlSeq consists of a single sequence
of data to select a character set (for instance,
if it is supported in the hardware).
+2      2  wSeqLength   size of the rCtrlSeq data (31 or less).
For wSelType=0001, this is the entire length.
For wSelType=0002, is just the length of the
first escape sequence (that selects the default
hardware font).

+4      ?  rCtrlSeq     this data is in the form of a PrnSelType1Rec or a
PrnSelType2Rec.
?+4              length of a PrinterFontDataRec

PrnSelType1Rec
Offset Size Contents
                                                                          
+0     1  bResetLen    the length of the escape sequence which selects
the default (hardware) character set.
+1     n  abResetData  the escape sequence to select the default
character set
+n+1     1  bSelLen      the length of the escape sequence which selects
this character set (once the download has been
performed).
+n+2     m  abSelData    escape codes to select this character set
+m+n+2     1  bDnldLen     the length of the download data that sets up this
character set.
+m+n+3     ?  abDnldData   bytes to download
+?+m+n+3         length of a PrSelType1Rec structure

PrnSelType2Rec
Offset Size Contents
                                                                          
+0     ?  abSelData    the escape sequence to select this character set.
The length is in PrinterFontDataRec.wSeqLength

fn 44H (IOCTL functions)
fn 66H (code page switching)
- -

Code Page Font Files