FONTFILE.RAW:
+0 - Byte offset to FONTDATA
+4 - FONTLOOKUP
FONTLOOKUP:
+0 - Maximum character height
+4 - Average character width
+8 - CHARDEF (starting at ASCII 32)
+20 - next CHARDEF (ASCII 33)....
+20 + n*12 - all the way to ASCII (((sizeof(FONTLOOKUP)-8)/12)+32)
CHARDEF:
+0 - FONTDATA offset for this character
+4 - Width of character
+8 - Height of character
FONTDATA:
RLE data for each character offset in FONTLU
The annoyance of course is that you have to decompress each character with the RLE decompressor which seems to be causing you some trouble with dodgy offsets.
The player decompresses each character as it needs it to save run time memory overhead. This is how we suddenly acquired a more complete character set and actually saved memory (at the expense of cpu) overhead.