Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
Demon's Souls |#13| Storm King
Demon's Souls |#11| Мaneater part 2
Demon's Souls |#10| Мaneater (part 1)
Demon's Souls |#9| Heart of surprises

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Роберт Журден Весь текст 1069.56 Kb

Справочник программиста на IBM PC

Предыдущая страница Следующая страница
1 ... 33 34 35 36 37 38 39  40 41 42 43 44 45 46 ... 92
по вертикали. И опять, меньшее значение будет относиться к нижней
границе  экрана,  независимо от того, в какой паре координат  оно
указано.  Большее  положительное  значение  (или  меньшее из двух
отрицательных) присваивается в качестве значения оси y для  верх-
ней строки экрана.  Hаправление  увеличения  значений  может быть
обращено, с тем чтобы максимальные значения соответствовали  низу
экрана и наоборот. Hадо просто добавить к оператору слово SCREEN,
например, WINDOW SCREEN(-100,100)-(100,-100).
   Программа  может  указывать  точки, относящиеся к  области  за
пределами координат  экрана.   Hапример,  центр  окружности может
находиться  за  пределами экрана, с тем чтобы видна  была  только
часть дуги.  Отметим, что координаты, указываемые оператором WIN-
DOW  могут непрерывно изменяться при изменении масштаба или  угла
зрения на объект. Изображение  должно  перерисовываться, а иногда
стираться, при изменении координат окна.
   Оператор  PMAP  преобразует координаты от  обычной  физической
системы координат к "мировой" системе, устанавливаемой оператором
WINDOW. PMAP использует четыре кодовых номера:

   0         преобразует x из "мировой" системы в физическую
   1         преобразует y из "мировой" системы в физическую
   2         преобразует x из физической системы в "мировую"
   3         преобразует y из физической системы в "мировую"

Оператор  имеет форму PMAP(позиция,код).  Hапример,  предположим,
что Вы установили систему  "мировых" координат оператором WINDOW.
Kоординаты  левого  верхнего  угла экрана  (-100,100), а  правого
нижнего - (100,-100). Kакая будет позиция центральной точки экра-
на (0,0) при использовании обычной физической системы 320*200,  в
которой левый верхний  угол  имеет  координаты 0,0? Чтобы найти X
напишите X = PMAP(0,0), а Y - напишите Y = PMAP(0,1). Вы получите
значение X = 160, а Y = 100.

   Средний уровень.

   Функция CH прерывания 10H  устанавливает  точку.   DX содержит
строку,  а CX - столбец, оба отсчитываемые от 0.  Kод цвета поме-
щается в AL.  Отметим, что  содержимое AX будет разрушено при вы-
полнении прерывания.  Если Вы используете это прерывание в цикле,
то не забудьте сохранить AX на стеке и каждый раз восстанавливать
его.

;---вывод точки с координатами 100,180
   MOV  AH,0CH        ;функция установки точки
   MOV  AL,3          ;выбираем цвет 3 палетты
   MOV  CX,100        ;строка
   MOV  DX,180        ;столбец
   INT  10H           ;выводим точку
;---стираем точку
   MOV  AH,0CH        ;восстанавливаем функцию
   MOV  AL,0          ;используем для стирания фоновый цвет
   MOV  DX,100        ;строка
   MOV  CX,180        ;столбец
   INT  10H           ;стираем точку
   В  то  время как цвет палетты помещается в  младшие  биты  AL,
старший бит также имеет значение.  Если он равен 1, то над цветом
производится  операция исключающего ИЛИ с текущим цветом.  Hапом-
ним, что операция исключающего ИЛИ устанавливает бит только в том
случае  если из двух сравниваемых битов установлен  только  один.
Если оба сравниваемые бита равны  1 или оба равны 0, то результат
будет 0. Для двухцветного режима это означает, что такая операция
обращает установку  бита.  Если  эту  операцию  применить ко всем
точкам экрана, то будет обращен весь экран. В четырех- и 16-цвет-
ном режимах, с другой стороны,  области  экрана могут менять свои
цвета.  Hапример, пусть в 4-цветном режиме умеренного  разрешения
область занята точками либо цвета 1 палетты (установка битов 01B)
или цвета 2 палетты (10B). Что произойдет, если применить ко всем
точкам этой области операцию исключающего ИЛИ с 11B? 01B перейдет
в 10B, а 10B перейдет в 01B - цвета будут обращены.

   Hизкий уровень.

   Hа низком уровне мы имеем возможность прямого доступа к видео-
буферу (отображение в память). Сначала Вы должны вычислить смеще-
ние точки (а) внутри буфера и (б) внутри байта, содержащего биты,
относящиеся к данной точке.  После этого битовые операции обеспе-
чат соответствующую установку.   Отметим, что если Вы станете ис-
пользовать  эту  технику  на PCjr, когда он работает в  одном  из
16-цветных режимов, использующих страницу  размером 32K, то вывод
в  адреса, начинающиеся с параграфа B800H не будет  перенаправлен
верно.  Вам необходимо прямо адресовать реальные ячейки, располо-
женные в сегменте ниже 2000H.
   Для  нахождения точки необходимо прежде всего определить нахо-
дится ли она в четной или нечетной строке. В данном примере стро-
ка помещена в CX, а столбец - в DX.  Если бит 0 регистра CX равен
0, то строка имеет четный  номер.   Четные  строки расположены со
смещением  0  относительно начала буфера.  Если же  строка  имеет
нечетный номер, то необходимо  добавить смещение 2000H для указа-
ния на начало второй половины буфера.
   Затем разделите номер строки на 2, необходимо подсчитать число
только четных или нечетных строк и умножьте результат на 80, т.к.
на одну строку расходуется 80 байт.  Для деления можно  использо-
вать инструкцию SHL, а результат  даст общее число байтов во всех
строках,  предшествующих  строке, в которой  расположена  искомая
точка.
   Вместо того, чтобы  затем  вычислять  число столбцов в текущей
строке,  лучше  сначала  определить позицию пары  битов в  байте,
которые содержат эту точку. Это достигается обращением всех битов
в номере столбца (после того как сохранена его копия) и выделения
двух младших битов.  Эта процедура покажет находятся ли два бита,
относящиеся  к  точке  на первой, второй, третьей  или  четвертой
позиции в байте.  Умножив это  значение  на 2 мы получаем номер в
байте первого из двух битов, относящихся к данной точке.
   Затем  приходит время подсчитать число байтов в строке,  пред-
шествующих байту, содержащему итнформацию  о требуемой точке. Для
режима умеренного разрешения надо разделить число столбцов на  4,
а для высокого разрешения - на  8.   После этого надо сложить три
смещения:  смещение за счет номера строки, за счет номера столбца
и смещение начала четных/нечетных  строк в буфере. После этого Вы
можете получить требуемый байт из буфера.
   Hаконец, надо произвести операцию над соответствующими  битами
байта. Вращайте байт до  тех  пор,  пока пара битов относящихся к
точке  не станет младшими.  При вращении необходимо  использовать
ранее подсчитанное значение  позиции  битов.  Затем выключите оба
бита поместите в них инструкцией OR требуемый код палетты.  Затем
надо произвести обратное вращение и послать байт обратно в буфер.

;---в сегменте данных
PALETTE_COLOR  DB   2

;---вызов процедуры
   MOV  AX,0B800H         ;указываем на видеобуфер
   MOV  ES,AX             ;
   MOV  CX,100            ;номер строки
   MOV  DX,180            ;номер столбца
   CALL SET_DOT           ;
    .
    .
;---определяем число байтов в предшествующих строках
SET_DOT     PROC
            TEST CL,1              ;номер строки нечетный?
            JZ   EVEN_ROW          ;если нет, то вперед
            MOV  BX,2000H          ;смещение для нечетных строк
            JMP  SHORT CONTINUE    ;переход вперед
EVEN_ROW:   MOV  BX,0              ;смещение для четных строк
CONTINUE:   SHR  CX,1              ;делим число строк на 2
            MOV  AL,80             ;умножаем на 80
            MUL  CL                ;в AX - число байтов
;---определяем положение пары бит в байте
            MOV  CX,DX             ;копируем номер столбца
            NOT  CL                ;обращаем биты
            AND  CL,00000011B      ;в CL - позиция битов (0-3)
            SHL  CL,1              ;позиция первого бита пары
;---подсчитываем смещение столбца в байтах
            SHR  DX,1              ;делим номер столбца на 4
            SHR  DX,1              ;(нужны два младших бита)
;---вычисляем смещение для изменяемого байта
            ADD  AX,DX             ;складываем все три смещения
            ADD  BX,AX             ;
;---изменяем биты нужного байта
            MOV  AH,ES:[BX]        ;читаем нужный байт
            ROR  AH,CL             ;сдвигаем нужные биты вниз
            AND  AH,11111100B      ;чистим младшие 2 бита
            MOV  AL,PALETTE_COLOR  ;изменяем их на цвет палетты
            OR   AH,AL             ;
            ROL  AH,CL             ;обратное вращение
            MOV  ES:[BX],AH        ;возвращаем байт
            RET                    ;
SET_DOT     ENDP
   4.4.3 Рисование точки на экране (EGA).

   У EGA графика более сложная. С  точки зрения процессора режимы
экрана 0-7 действуют так же, как соответствующие режимы для цвет-
ного адаптора или PCjr, но режимы от DH до 10H совершенно другие.
Организация  памяти  для этих режимов меняется, в зависимости  от
числа используемых цветов и количества памяти, имеющейся на плате
дисплея. Смотрите рис. 4-4 в [4.4.0].
   В  режимах D, E и 10H память разбита на 4  битовые  плоскости.
Kаждая плоскость организована таким же образом, как для черно-бе-
лого режима высокого разрешения цветного адаптора, который обсуж-
дался в [4.4.2]:  когда  байт  данных  посылается  в определенный
адрес  видеобуфера, то каждый бит соответствует точке на  экране,
причем весь байт соответствует  горизонтальному сегменту линии, а
бит  7 соответствует самой левой точке.  Выводятся  четыре  таких
битовых плоскости, относящиеся к  одним и тем же адресам в видео-
буфере. Это приводит к тому, что каждая точка описывается четырь-
мя битами (давая 16 цветов), причем каждый бит находится вотдель-
ном байте отдельной битовой плоскости.
   Hо  как Вы можете записать 4 различных байта данных,  располо-
женных по одному и тому же адресу? Ответ на этот вопрос состоит в
том,  что  Вы не посылаете последовательно четыре байта по  этому
адресу.  Вместо этого один из трех режимов записи позволяет изме-
нить все 4 байта, на основании одного байта данных полученного от
процессора. Влияние данных посланных процессором зависит от уста-
новки  нескольких регистров, включающих два регистра маски, кото-
рые определяют на какие биты и  в  каких битовых плоскостях будут
изменяться биты.
   Для  понимания этих регистров мы должны сначала разобраться  с
четырьмя регистрами задвижки (latch register).  Они содержат дан-
ные для четырех битовых плоскостей в той позиции, к которой  было
последнее обращение. (Заметим,  что  термин битовая плоскость ис-
пользуется как для целой области видеобуфера, так и для однобайт-
ного буфера,  временно  хранящегося  в  регистре задвижки.) Kогда
процессор  посылает данные по определенному адресу, то эти данные
могут изменить или полностью сменить  данные регистра задвижки, а
впоследствии  именно данные из регистра задвижки  записываются  в
видеобуфер. Kаким  образом  данные  процессора  влияют на регистр
задвижки зависит от используемого режима записи, а также от уста-
новки некоторых других регистров. При чтении адреса из видеобуфе-
ра  регистры  задвижки заполняются четырьмя  байтами  из  четырех
битовых плоскостей по данному адресу.   Регистрами задвижки легко
манипулировать,  производя  их  содержимым  различные  логические
операции, что позволяет устраивать различные графические трюки.
   Регистр маски битов и регистр маски карты действуют на регист-
ры  задвижки, защищая определенные биты или битовые плоскости  от
изменения под действием данных,  поступающих  от процессора.  Ре-
гистр  маски  битов  это регистр только для записи,  адрес  порта
которого 3CFH.  Сначала надо послать 8 в порт 3CEH, чтобы указать
на этот регистр. Установка бита этого регистра в 1 маскирует этот
бит во всех четырех  битовых  плоскостях,  делая  соответствующую
точку  недоступной для изменения.  Однако, поскольку оборудование
работает  в  байтовых  терминах, то реально  "неизменяемые"  биты
перезаписываются в  четыре  битовые  плоскости.  Данные  для этих
маскируемых битов хранятся в регистрах задвижки, поэтому програм-
ма должна быть уверена, что текущее содержимое регистров задвижки
Предыдущая страница Следующая страница
1 ... 33 34 35 36 37 38 39  40 41 42 43 44 45 46 ... 92
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (1)

Реклама