struc FontFileHeader
ffhFileTag db 8 dup (?) ; Font-file identifier (0ffh,"FONT ")
ffhReserved db 8 dup (?) ; Reserved (must be 0)
ffhPointers dw ? ; No. of information pointers (= 1)
ffhPointerType db ? ; Type of pointer (= 1)
ffhOffset dd ? ; File offset of FontInfoHeader
ends ; = 23d bytes


struc FontInfoHeader
fihCodePages dw ? ; No. of code-page entries
ends ; = 2 bytes


struc CPEntryHeader
cpeLength dw 28d ; Size of this structure, in bytes (28)
cpeNext dd ? ; Offset to next CPEntryHeader (last=0)
cpeDevType dw ? ; Device type (1=screen, 2=printer)
cpeDevSubType db 8 dup (?) ; Name of device & file (e.g. "EGA ")
cpeCodePageID dw ? ; Code-page identifier
cpeReserved db 6 dup (?) ; Reserved (must be 0)
cpeOffset dd ? ; Offset to font data for this code-page
ends ; = 28d bytes


struc FontDataHeader
fdhReserved dw 1 ; Reserved (must be 1)
fdhFonts dw ? ; Number of fonts (max. 1 if printer)
fdhLength dw ? ; Byte size of font data
ends ; = 6 bytes


struc ScreenFontHeader
sfhHeight db ? ; Character height
sfhWidth db ? ; Character width
sfhRelHeight db ? ; Currently unused; must be 0
sfhRelWidth db ? ; Currently unused; must be 0
sfhCharacters dw ? ; No. of characters defined in bitmap
ends ; = 6 bytes
; ScreenFontHeader followed immediately by character bitmaps.
; Byte size of bitmaps = sfhCharacters * 8


struc PrintFontHeader
pfhSelType dw ? ; Selection type for printer font
pfhSeqLength dw ? ; Byte size of control-sequence data
ends ; = 4 bytes
; PrinterFontHeader followed immediately by control sequence
; data (< 31 bytes) and possibly downloadable font data.


; Structure of EGA.CPI ; Code-Page Information file
; FontFileHeader
; FontInfoHeader
; NUM_CODEPAGES * CPEntryHeader
; NUM_CODEPAGES * (FontDataHeader
; (ScreenFontHeader + bitmaps ; VGA 8*16
; (ScreenFontHeader + bitmaps ; EGA 8*14
; (ScreenFontHeader + bitmaps ; CGA 8*8
; Copyright notice (1-150 bytes)