User Tag List

Показано с 1 по 10 из 63

Тема: Специалист: Вопросы программирования

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #11

    Регистрация
    05.10.2016
    Адрес
    г. Санкт-Петербург
    Сообщений
    1,080
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    5
    Поблагодарили
    5 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    В базовом 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 маш.тактов.
    Последний раз редактировалось barsik; 12.01.2018 в 20:36.

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Специалист: Бейсик
    от Prusak в разделе Специалист
    Ответов: 28
    Последнее: 26.07.2019, 16:07
  2. Специалист: Разное
    от Splinter в разделе Специалист
    Ответов: 171
    Последнее: 09.05.2018, 07:50
  3. Языки программирования
    от BlackWolf в разделе Программирование
    Ответов: 188
    Последнее: 26.04.2009, 15:34
  4. Техника программирования процедурных сопроцессоров
    от andrews в разделе Программирование
    Ответов: 4
    Последнее: 29.12.2006, 20:10

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •