Страница Ивана Рощина > Статьи >

© Иван Рощин, Москва

ZXNet: 500:95/462.53
E-mail: bestview@mtu-net.ru
WWW: http://www.ivr.da.ru

Особенности видеоконтроллера 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.


            
 Картинка 1
            
            
            
            
            
            

2) Очищаем 1-й экран и устанавливаем INK 7, PAPER 0.


            
            
            
            
            
            
            
            

3) Включаем 2-й экран, и на нём на мгновение появляется горизонтальная белая линия длиной примерно 8 пикселов.


            
            
            
            
            
            
         -  
            

4) После HALT’а для картинки на 2-м экране устанавливаем её атрибуты.

            
            
            
            
            
 Картинка 2
            
            
Страница Ивана Рощина > Статьи >