(C) Иван Рощин, Москва, 1998
Особенности видеоконтроллера ZX SPECTRUM
Что будет видно на экране, если запи-
сать по адресам #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-м
экране устанавливаем ее атрибуты.
┌────────────┐ ╔════════════╗
│ │ ║ ░░░░░░░░░░ ║
│ │ ║ ░░░░░░░░░░║
│ │ ║ ▒▒▒▒▒▒▒▒▒▒ ║
│ │ ║ ▒▒▒▒▒▒▒▒ ║
└────────────┘ ╚════════════╝
* * *