В базовом ROM-BIOS СПЕЦИАЛИСТА ошибочно называемом загрузчиком (вот в ВЕКТОРЕ действительно загрузчик в 512 байт) обнаружил идиотическую ошибку. Которая заключается в том, что хотя есть ячейки для адреса фонта (AFONT=8FE7), как и в ОРИОНЕ, но пользоваться ими в отличие от ОРИОНА, свободно нельзя. Невозможно поменять фонт разместив его в произвольном месте ОЗУ.
Оказывается фонт можно размещать только по определённым адресам. Можно размещать фонт только по такому адресу, которое удовлетворяет следующему условию. Если адрес размещения фонта разделить на 8 (что равноценно сдвигу вправо на 3 разряда), то в младшем байте получившегося числа, должно быть значение меньше 80H. В противном случае драйвер вывода выдаёт на экран мусор.
Это происходит потому, что А.Волков применил 8-ми разрядное сложение, а следовало применить 16-ти разрядное сложение. И такой драйвер вообще непригоден для вывода (без извращений) 8-ми битовых символов (КОИ-8). Это может делать драйвер ОРИОНА, а чтобы выводить КОИ-8 данным драйвером надо немножко извращаться, - при кодах символов >80H отнимать от кода символа 80H и в ходе вывода менять адрес фонта в ячейках AFONT.
Раньше я не знал об этом, т.к в 80-тые не доводилось менять фонт. Столкнулся с этим сегодня, когда хотел загрузить латинский фонт большие и маленькие буквы, т.к это требуют CP/M-программы. Чтобы не заморачиваться, можно использовать адрес фонта кратный 1000H, т.е D000, E000, F000. Но это не всегда выгодно, когда приходится биться за экономию каждого байта.
Естественно, эта ошибка повторена и во всех совместимых мониторах, в т.числе и в мониторе В.Ивинских.
Вот подпрограмма А.Волкова:
Код:
A_C056: LD HL,(AFONT)
ADD L
LD L,A ; A= код символа
ADD HL,HL
ADD HL,HL
ADD HL,HL ; HL= адрес символа в ОЗУ
А вот как правильно:
Код:
LD L, A ; A= код символа
LD H,0
ADD HL, HL
ADD HL, HL
ADD HL, HL
EX DE,HL
LD HL, (AFONT)
ADD HL, DE ; HL= адрес символа в ОЗУ
С учётом того, что в H ранее уже есть 0, то число команд CPU всего на одну больше, а число байтов на 2 больше. Но так делать правильно. А при Z80 число команд одинаково. При выводе символа процессор исполняет не менее 200 команд. Экономия одной команды ускоряет вывод на 0.5%. Если уж хотелось ускорить, это делается линейным участком копирования символа, что даёт выигрыш в более, чем в 150 маш.тактов.