Adventurer
#08
31 августа 1998 |
|
Обмен опытом - Особенности видеоконтроллера ZX Spectrum (для программистов).
(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-м экране устанавливаем ее атрибуты. ┌────────────┐ ╔════════════╗ │ │ ║ ░░░░░░░░░░ ║ │ │ ║ ░░░░░░░░░░║ │ │ ║ ▒▒▒▒▒▒▒▒▒▒ ║ │ │ ║ ▒▒▒▒▒▒▒▒ ║ └────────────┘ ╚════════════╝ * * *
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября