© Иван Рощин, Москва
Особенности видеоконтроллера ZX Spectrum
(Adventurer #8)
Дата последнего редактирования: 24.02.2003.
Что будет видно на экране, если записать по адресам #4000#57FF любую
информацию, а атрибуты обнулить? А если обнулить #4000#57FF и установить
PAPER равным 0, а INK каким угодно? Здравый смысл подсказывает, что и в том, и
в другом случае мы не увидим абсолютно ничего. Всё это так, но приведённая
ниже программа доказывает обратное.
LD HL,#5800
LD (HL),L
LD DE,#5801
LD BC,#2FF
LDIR
LD HL,0
LD DE,#4000
LD BC,#1800
LDIR
LD BC,#7FFD
LD A,#17
OUT (C),A
LD HL,#C000
LD (HL),L
LD DE,#C001
LD BC,#17FF
LDIR
LD HL,#D800
LD (HL),7
LD DE,#D801
LD BC,#2FF
LDIR
LD BC,#7FFD
M1 LD A,#18
OUT (C),A
LD A,#10
OUT (C),A
XOR A
IN A,(254)
CPL
AND 31
JR Z,M1
RET
Эта программа заполняет 1-й экран содержимым ПЗУ и обнуляет
атрибуты (таким образом, на экране ничего не видно), затем очищает
2-й экран и устанавливает для него атрибуты INK 7, PAPER 0 (и на
2-м экране ничего не видно). Затем программа начинает быстро
переключать 1-й и 2-й экраны, и тут мы видим такую
картину:
- - -
- - -
- - -
- - -
- -
- -
- - -
|
По-видимому, происходит следующее: при выводе изображения на
экран байт из экранной памяти вместе со своим атрибутом попадает в специальный
сдвиговый регистр, но может случиться так, что видеоконтроллер возьмёт байт из
экранной памяти 1-го экрана, а затем программа переключит экран,
и байт атрибутов будет взят уже из 2-го экрана (или наоборот). В
обоих случаях на экране появятся белые полосы.
Интересно, наблюдается ли этот эффект на других компьютерах, кроме
«Пентагона-128»? А на эмуляторах? Можно ли найти для
него какое-нибудь применение?
Теперь расскажу, как я обнаружил этот эффект. Дело было так: я писал
программу, которая показывала некоторую картинку на 1-м экране,
затем показывала следующую картинку на 2-м экране, потом опять на
1-м и т.д. Вот как эта программа работала (активный экран выделен
рамкой):
1) На 1-м экране какая-то картинка, на
2-м экране другая картинка, скрытая под атрибутами INK 0, PAPER
0.
2) Очищаем 1-й экран и устанавливаем INK 7, PAPER 0.
3) Включаем 2-й экран, и на нём на мгновение появляется
горизонтальная белая линия длиной примерно 8 пикселов.
4) После HALTа для картинки на 2-м экране устанавливаем
её атрибуты.