Главная · Поиск книг · Поступления книг · 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 ... 38 39 40 41 42 43 44  45 46 47 48 49 50 51 ... 92
ческих объектов. Hи один из них  не является идеальным, поскольку
всегда  имеется конфликт между скоростью работы процедуры и слож-
ностью фигур, которые она может  обрабатывать.  Любая  процедура,
которая заполняет область точку за точкой будет медленной,  неза-
висимо от того, насколько элегантно она реализована.  Имейте вви-
ду,  что почти каждая модифицируемая точка  расположена в  байте,
все точки которого будут изменяться в тот же самый цвет.  Получе-
ние  доступа  к одному и тому же байту с  использованием  сложных
процедур требует существенно больше времени, чем установка целого
байта  за один доступ к ячейке видеобуфера.  Hапример, поточечная
очистка экрана требует на IBM PC нескольких  секунд при использо-
вании функции BIOS, в то время как прямой доступ в память  произ-
водит эту операцию мгновенно:

      MOV  AX,0B800H     ;ES указывает на буфер экрана
      MOV  ES,AX         ;
      MOV  CX,8192       ;заполняем все байты
      MOV  AX,0          ;в каждый байт пишем 0
      MOV  DI,0          ;DI поочередно указывает на все байты
REP   STOSW              ;повторяем запись 8192 раза

   Многие процедуры заполняют  по  одной  горизонтальной  строке,
проверяя на цвет границы справа и слева. Поскольку строки состоят
из смежных байтов данных, то  надо  поочередно брать байты из ви-
деобуфера  и проверять присутствует ли в них цвет границы.   Если
цвет границы отсутствует, то  можно  заменить  сразу весь байт на
цвет  заполнения.  В противном случае к данному байту применяется
поточечный подход.
   Имеется очень быстрый способ определения  присутствует ли гра-
ничный цвет в данном байте видеобуфера. Предположим, что процеду-
ра ищет цвет 1 палетты в режиме умеренного  разрешения с четырьмя
цветами. Этому цвету соответствует код 01, поэтому сначала запол-
ним весь байт этим кодом: 01010101. Затем используем операцию NOT
для обращения каждого бита, после чего байт примет вид  10101010.
Проделаем операцию  XOR  со  значением  взятым  из видеобуфера; в
результате получим байт, у которого оба бита, относящиеся к одной
точке равны 1 только для  точек,  имеющих  граничный цвет.  Затем
снова используем операцию NOT с тем, чтобы пара битов, относящих-
ся к точке граничного цвета имела  код 00. После этого используем
операцию  TEST для нахождения полей со значением 00.  Если  такое
поле найдено, то граничный цвет обнаружен и процедура переходит к
обычному поточечному анализу данного байта.  Эту процедуру  можно
еще убыстрить, если использовать словные данные.

   MOV  AL,ES:[BX]    ;берем байт из видеобуфера
   XOR  AL,10101010B  ;устанавливаем биты для цвета границы
   NOT  AL            ;обращаем биты
   TEST AL,11000000B  ;проверяем биты 7-6
   JZ   FOUND_BOUND   ;переход если граничный цвет
   TEST AL,00110000B  ;проверяем биты 5-4
   JZ   FOUND_BOUND   ;переход если граничный цвет
   TEST AL,00001100B  ;проверяем биты 3-2
   JZ   FOUND_BOUND   ;переход если граничный цвет
   TEST AL,00000011B  ;проверяем биты 1-0
   JZ   FOUND_BOUND   ;переход если граничный цвет
   MOV  AL,FILL_COLOR ;граничного цвета нет, заполняем байт
   MOV  ES:[BX],AL    ;возвращаем байт в видеобуфер
    .
    .
FOUND_BOUND:

   Kогда это возможно,  постарайтесь, чтобы границы прямоугольных
областей  Ваших картинок были выравнены на границу двух,  четырех
или восьми точек, с тем чтобы  прямое  отображение в память имело
дело с целыми байтами.  Другая возможность, хотя и не столь быст-
рая, состоит в создании  определяемых  пользователем псевдографи-
ческих  символов [4.3.4] и выводе их на границе области  заполне-
ния.  Kороче, в данной области Вы имеете все возможности проявить
сообразительность,  а  зачастую  стоит подумать, а нужна  ли  Вам
столь сложная графика в данной задаче.
   4.4.7 Графический вывод с использованием символов псевдографи-
ки.

   Kогда Вы выводите изображение точка за точкой, то это отнимает
очень много времени, особенно когда  создаются эффекты мультипли-
кации.  Один из способов экономии времени состоит в сведении всех
или части выводимых форм к  фигурам, которые могут быть построены
на матрице точек 8*8.  Такие фигуры могут быть созданы, как опре-
деляемые  пользователем  символы,  как  показано в [4.3.4]. После
того,  как  эти символы определены они выводятся на  экран  очень
быстро и просто. Эти символы  могут выводиться вперемешку с пото-
чечными графиками, как обычные буквы.  Один из способов  быстрого
заполнения фигуры состоит в последовательном выводе внутри фигуры
полностью  закрашенного блока.  Отметим, что эти  символы  всегда
располагаются в стандартных позициях курсора.

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

   В этом примере рисуется фигура  человека, занимающая 2 символа
в  высоту и 2 символа в ширину.  Kак объяснено в  [4.3.4]  вектор
прерывания 1FH указывает на  начало  области данных, определяющих
символы.  Четыре символа могут быть выведены обычными процедурами
DOS или BIOS. Легко  создать  другой  набор  символов, для вывода
фигуры с руками и ногами в другом месте экрана. Два набора симво-
лов могут поочередно меняться в соседних позициях курсора, созда-
вая иллюзию человека, идущего по экрану.

;---в сегменте данных
CHARACTER_DATA  DB   00110000B   ;левый верхний квадрант
                DB   01100111B
                DB   01100111B
                DB   00110011B
                DB   00011111B
                DB   00001111B
                DB   00001111B
                DB   00000111B

                DB   00000011B   ;правый верхний квадрант
                DB   10001100B
                DB   10011000B
                DB   00110000B
                DB   11100000B
                DB   11000000B
                DB   11000000B
                DB   10000000B

                DB   00001111B   ;левый нижний квадрант
                DB   00011111B
                DB   00011100B
                DB   00011000B
                DB   00011000B
                DB   00110000B
                DB   01100000B
                DB   00010000B
                DB   11000000B   ;правый нижний квадрант
                DB   11000000B
                DB   11000000B
                DB   11000000B
                DB   01100000B
                DB   01100000B
                DB   00010000B
                DB   00011110B
                DB   00000000B

;---установка вектора прерывания
   PUSH DS                ;сохраняем DS
   MOV  DX,OFFSET CHAR_DATA  ;смещение для данных в DX
   MOV  AX,SEG CHAR_DATA  ;сегмент для данных в DS
   MOV  DS,AX             ;
   MOV  AH,25H            ;функция установки вектора
   MOV  AL,1FH            ;номер вектора
   INT  21H               ;устанавливаем вектор
   POP  DS                ;восстанавливаем DS

;---рисуем фигуру
;---позиционируем курсор на верхний ряд
   MOV  AH,2         ;функция установки курсора
   MOV  DH,13        ;строка 13
   MOV  DL,20        ;столбец 20
   MOV  BH,0         ;страница 0
   INT  10H          ;установка курсора
;---рисуем верхние два символа
   MOV  DL,128       ;берем символ 128
   MOV  AH,2         ;функция вывода/курсор вперед
   INT  21H          ;вывод символа
   MOV  DL,129       ;берем символ 129
   INT  21H          ;выводим его
;---позиционируем курсор на нижнюю строку
   MOV  DH,14        ;строка 14
   MOV  DL,20        ;столбец 20
   MOV  AH,2         ;функция установки курсора
   INT  10H          ;устанавливаем курсор
;---рисуем нижние два символа
   MOV  DL,130       ;берем символ 130
   MOV  AH,2         ;функция вывода/курсор вперед
   INT  21H          ;вывод символа
   MOV  DL,131       ;берем символ 131
   INT  21H          ;выводим его
                 Раздел 5. Сдвиг экрана и страницы.

   Сдвиг экрана и разбиение на страницы - это два способа перено-
са блока информации из памяти на экран. При сдвиге одна из границ
экрана  сдвигается  внутрь, стирая информацию на  противоположной
стороне.  Затем  освободившаяся  область  заполняется  из памяти.
Повторение этого действия строка за строкой создает иллюзию сдви-
га экрана.
   С другой стороны, разбиение на  страницы  основано на одновре-
менном  хранении  нескольких экранов информации в  видеобуфере  и
переключении вывода с одной  страницы  на  другую.  Использование
дисплейных страниц невозможно на монохромном адапторе,  поскольку
его памяти хватает только для одного  символьного экрана.  Другие
видеосистемы  в  большинстве экранных режимов  могут  работать  с
несколькими  страницами.  Использование  страниц дисплея особенно
полезно  при построении сложных картин "за кулисами"; после  того
как эта  работа  завершена,  новый  экран  выводится моментально.
Процедура,  имитирующая  работу  со страницами  для  монохромного
адаптора приведена в  [4.5.3].   Она  особенно  полезна, когда Вы
имеете дело с медленным выводом на экран в Бейсике.
   4.5.1 Вертикальный сдвиг текстового экрана.

   Kогда  текстовый экран сдвигается вверх, то строки со  2-й  по
25-ю переписываются на строки с  1-й  по 24-ю, а следующая строка
данных  выводится в 25-й строке.  При этом верхняя строка, поверх
которой осуществлется  вывод  теряется,  хотя  она продолжает су-
ществовать в памяти. Сдвиг вниз устроен аналогично.

   Высокий уровень.

   Бейсик  утомительно медлителен при своих манипуляциях с  экра-
ном. Для быстрого сдвига Вы можете пожелать использовать процеду-
ру на машинном языке, которая не делает ничего другого, кроме как
использует прерывание  10H,  как  описано  ниже  в пункте средний
уровень. Процедура позволяет сдвигать весь экран или любое окно в
нем. Приложение Г показывает как  включать подпрограммы на машин-
ном  языке  в Ваши программы.  Ваша программа на  Бейсике  должна
указывать координаты  верхнего  левого  и  нижнего  правого углов
окна,  которые могут лежать в диапазоне от 0 до 24 и от 0 до  79.
Требуется также параметр,  указывающий  направление сдвига: вверх
или  вниз  (6 и 7, соответственно), число строк на которое  нужно
сдвинуть (если 0, то окно  очищается)  и значение байта атрибутов
для очищаемых строк (для "нормальных" - 7).  Используйте для  них
целые переменные. В  нижеприведенно примере экран сдвигается вниз
на одну строку, а затем освободившаяся строка освобождается.

100 '''данные для подпрограммы
110 DATA &H55, &H8B, &HEC, &H8B, &H76, &H12, &H8A
120 DATA &H24, &H8B, &H76, &H10, &H8A, &H04, &H8B
130 DATA &H76, &H0E, &H8A, &H2C, &H8B, &H76, &H0C
140 DATA &H8A, &H0C, &H8B, &H76, &H0A, &H8A, &H34
150 DATA &H8B, &H76, &H08, &H8A, &H14, &H8B, &H76
160 DATA &H06, &H8A, &H3C, &HCD, &H10, &H5D, &HCA
170 DATA &H0E, &H00
180 '''помещаем данные в сегмент &H2000
190 DEF SEG = &H2000      'помещаем данные начиная с &H2000
200 FOR N = 0 TO 43       '44 байта
210 READ Q                'читаем один байт
220 POKE N,Q              'помещаем его в память
230 NEXT                  'следующий

300 '''в программе
310 GOSUB 500             'сдвигаем на строку
320 LOCATE 1,1: PRINT TEXT$(LINEPTR);  'выводим строку текста

500 '''подпрограмма сдвига
510 DEFINT A-Z            'используем целые переменные
520 TLR = 0               'левая верхняя строка
530 TLC = 0               'левый верхний столбец
540 BRR = 24              'нижняя правая строка
550 BRC = 79              'нижний правый столбец
560 NUMROWS = 1           'число строк сдвига
570 DIR = 7               'направление сдвига вниз
580 FILL = 7              'заполнение обычным атрибутом
590 DEF SEG = &H2000      'указываем на подпрограмму
600 SCROLL = 0            'начинаем с 1-го байта
610 CALL SCROLL(DIR,NUMROWS,TLR,TLC,BRR,BRC,FILL)
620 RETURN                'все сделано
   Средний уровень.

   Функция  6 прерывания 10H сдвигает любую часть экрана вверх, а
функция 7 - вниз. В обоих случаях AL содержит число строк сдвига,
а  когда AL = 0, то весь экран чистится, а не сдвигается.   CH:CL
содержат строку и столбец левого  верхнего угла, а DH:DL - содер-
Предыдущая страница Следующая страница
1 ... 38 39 40 41 42 43 44  45 46 47 48 49 50 51 ... 92
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (1)

Реклама