Dec пишет:Т.е. технически возможен и гигаскрин 128x256.
Да, на девятке все нужное для этого есть. Например, в одном кадре показываем чересстрочно страницы 1 и 2, а в другом - страницы 3 и 4.
Вот на семерке уже не получится - там штатно только 4 страницы с разрешением 128x128, причем самой первой пользоваться нельзя - она находится по адресам $0000-$1FFF, то есть там же, где нулевая страница и стек процессора. Ну и частота IRQ на семерке другая - одно прерывание на 32 телевизионных строки. Из-за этого момент преключения строк будет сильнее уплывать.
====
С этим переключением строк я тут напоролся на неожиданную проблему. В первом варианте, когда я заливал экран вертикальными полосами все выглядело прилично:
Тут используется всего 4 цвета (1, 6, 11 и 16 полосы - это исходные Агатовские цвета), из которых получается 10 смешанных цветов (6 штук повторяются, типа зеленый + желтый = желтый + зеленый).
Но как только я сделал шахматку, вылезла неприятность. Вот исходные страницы (разводы кругами - это не часть картинки, это из-за съемки телефоном):
А вот то что получилось в режиме гигаскрин:
Проблема видна на двух левых полосах - вместо ровной заливки местами видны здоровые пиксели. Это результат того, что переключение страниц опоздало - отображение строки уже началось и только потом страница переключилась. В результате первые пиксели на строке были взяты из одной страницы, а остальные - из другой. Что самое неприятное - эти задержки случайные, они происходят на разных строках, поэтому по левой части экрана бежит рябь из коротких полосочек.
И это при том, что задержки в коде для всех строк одинаковые и все было просчитано несколько раз.
Я даже думал, что это ДК как-то реагирует на дергание страниц. Но нет, вот разброс времени переключения по осциллографу:
Первый канал - СГИ, второй - разряд D5 регистра режима ДК. Разброс почти 8 мкс. Я ожидал, что он будет не больше 4. При включенных прерываниях работает только цикл опроса клавиатуры из двух команд:
И прерывание в лучшем случае вызовется сразу, в худшем случае - после того как закончится текущая команда. Самая длинная команда - LDA. Это 4 такта.
Но получается, что нет, вызов прерывания запаздывает. Я нашел подсказку почему так происходит, но надо разбираться как с этим бороться.