Вот как раз знакогенераторы делать мне приходилось. И для матричных принтеров, и для термо. И байта-то и не хватает часто. И символ удобнее для программы (а, значит, кооче и быстрее код) бывает хранть так, что в виде, грубо говоря
0b1111001
0b1001001
0b1001001
0b1001001
0b1000110
замучаешься голову выворачивать и зеркалить в уме чтобы допереть, что это "5" да ещё и оценить "красивость".
Поэтому для знакогенераторов нужны либо конвертилки BMP во что надо (желательно в исходниках или настраиваемые по эти самые - чтобы все перевороты/зеркалирования задать), или конвретор из текста, но, скажем, такого:
default = ' ' ; это указатель на что поместить в индекс шрифта,
; если для этого кода битмап не указан
code = 'P', 'Р' ; это латиница и кирилица
-*******--
-*--------
-*--------
-*--------
-******---
-------*--
--------*-
--------*-
--------*-
--------*-
-------*--
-******---
А дальше программулина парсит это дело, складывает в памяти, потом конвертирует в нужный вид и выдаёт асмовый текст.
Конвертор каждый раз правится под нужную задачу.
Один раз было вообще хитро - в памяти реально шли сначала все верхние строки каждого символа, потом все вторые, все третьи и так далее.
Это экономило в целевой программе формирование графических строк - в начале вывода графстроки по её номеру формировался указатель на "занкогенератор для данной графстроки", а потом по мере формирования этот указатель индексировался смещением образа для символа из текстовой строки.
Слабо такой знакогенератор рисовать и поддежрживать с помощью 0b1010101 ???
Вот потому я и сказал, что ни макросы _b(1010101) не коллекционирую, ни программы генерации такого не пишу.
А то "повезло, повезло"...