Да вроде сейчас Квартус не ругается на шину адреса. Зашил ПЛИС новой прошивкой, еще не включал. Хоть бы затикала...
Да вроде сейчас Квартус не ругается на шину адреса. Зашил ПЛИС новой прошивкой, еще не включал. Хоть бы затикала...
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
В базовом 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= адрес символа в ОЗУ
С учётом того, что в H ранее уже есть 0, то число команд CPU всего на одну больше, а число байтов на 2 больше. Но так делать правильно. А при Z80 число команд одинаково. При выводе символа процессор исполняет не менее 200 команд. Экономия одной команды ускоряет вывод на 0.5%. Если уж хотелось ускорить, это делается линейным участком копирования символа, что даёт выигрыш в более, чем в 150 маш.тактов.Код: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= адрес символа в ОЗУ
Последний раз редактировалось barsik; 12.01.2018 в 20:36.
barsik, Волков сэкономил на подпрограмме вычисления адреса символа в фонте (а этот код вызывается каждый раз при выводе символа) выравняв расположение этого фонта ровно по блоку, что дает младший байт равным 00. Это хорошее решение при тех условиях. А еще, этот адрес заранее поделенный на 8. Тем не менее, с этим загрузчиком работал ED^7000 корректно, используя свой фонт для маленьких букв. И да, ПСПЗУ с C000-C7FF это именно загрузчик, согласно журнальному описанию. Ибо он загружал либо игру либо монитор с кассеты и передавал туда автоматически управление. А то, что он предоставлял базовый сервис это названия не меняет.
Последний раз редактировалось HardWareMan; 12.01.2018 в 20:24.
Не совсем так. Адрес фонта поделён на 8, чтобы не было переноса в команде ADD L, адрес фонта должен быть кратным 800h.
- - - Добавлено - - -
Учитывая, что перед этим из кода символа вычитается 20h, можно фонт подвинуть вперёд максимум на 100h байт. Вышесказанное верно, если мы хотим использовать весь диапазон символов 20-FF.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)