Главная · Поиск книг · Поступления книг · 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 ... 39 40 41 42 43 44 45  46 47 48 49 50 51 52 ... 92
жат  координаты правого нижнего угла.  Появлящиеся  из-за  сдвига
строки чистые и они выводятся с кодом атрибутов из BH.

;---сдвиг вверх на одну строку
   MOV  AH,6      ;номер функции сдвига вверх
   MOV  AL,1      ;число строк сдвига
   MOV  CH,0      ;строка левого верхнего угла
   MOV  CL,0      ;столбец левого верхнего угла
   MOV  DH,24     ;строка правого нижнего угла
   MOV  DL,79     ;столбец правого нижнего угла
   MOV  BH,7      ;атрибуты очищаемой строки
   INT  10H       ;делаем сдвиг

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

   Вертикальный сдвиг всего  экрана  это тривиальная задача, пос-
кольку  правая граница одной строки в памяти  продолжается  левой
границей следующей строки. Сдвиг всего содержимого видеобуфера на
160  байт вверх по памяти (80 символов в строке * 2 байта на сим-
вол) приводит к сдвигу экрана вниз на одну строку. Если Вы пишете
свою  собственную  процедуру сдвига экрана,  использующую  прямое
отображение в память, то не  забывайте  об интерференции, которая
возникает на цветном дисплее и PCjr.  Эта проблема обсуждается  в
[4.3.1]. Обычное решение этой проблемы состоит в проверке статус-
ного  байта,  ожидая пока он разрешит запись в  видеобуфер.   Вам
придется поэкспериментировать, чтобы определить сколько данных Вы
можете записать за один цикл.
   Другое  решение этой проблемы состоит в выключении  экрана  на
время операции сдвига, а затем в его восстановлении.  "Выключение
экрана" подразумевает, что вывод содержащихся в видеобуфере  дан-
ных запрещен, но сам буфер при этом  не изменяется.  Этот процесс
используется функцией сдвига BIOS, использованной выше.  Хотя это
не очень приятно для  глаз,  но  все-таки  не  так плохо, как уже
упоминавшаяся интерференция.
   Для  выключения  экрана у цветного графического  дисплея  надо
сбросить бит 3 порта с адресом  3D8H.   Изменение бита назад на 1
моментально включает экран обратно.  Этот адрес порта  соответст-
вует регистру выбора режима цветного графического адаптора.  Этот
однобайтный регистр только для записи, поэтому программа не может
просто прочитать его, изменить  значение  бита 3 и вернуть прочи-
танный  байт.  Вместо этого Вам необходимо определить также  пра-
вильную установку всех остальных битов (перечисленных в [4.1.2]).
Для  PCjr  этот бит расположен в регистре  управления  режимом  1
массива ворот дисплея. В [4.1.1]  объяснено как получить доступ и
запрограммировать этот регистр.
   4.5.2 Сдвиг текстового экрана горизонтально.

   Горизонтальный сдвиг иногда требуется в специальных программах
обработки текста, таких как  текстовые  редакторы.   Операционная
система  не имеет для этого специальных средств.  По этой причине
данная  задача немного сложнее чем вертикальный сдвиг - но  несу-
щественно.  Рассмотрим случай, когда Вы хотите, чтобы экран сдви-
гался  влево  на 5 позиций.  При этом левые 5 столбцов  исчезнут,
весь остальной текст сдвигается влево,  а самые правые 5 столбцов
должны  быть очищены.  Поскольку видеобуфер представляет из  себя
одну длинную строку, то если  каждый символ буфера сдвинуть на 10
байтов  вниз, то суммарный эффект будет состоять в том, что самые
левые 5 символов каждой строки  будут  передвинуты  в последние 5
позиций предыдущей строки.  Таким образом, весь экран будет сдви-
нут влево на 5 позиций,  передвигая  5 ненужных столбцов в правую
часть  экрана.   Все что после остается - это очистить  правые  5
столбцов. Это легко делается  с  помощью  процедуры вертикального
сдвига  [4.5.1], которая может выполняться для любой части экрана
и которая  очищает  указанную  область  если  указать  сдвиг на 0
строк. Рисунок 4-6 иллюстрирует этот метод.

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

   В этом примере осуществляется сдвиг на 5 позиций влево.  Легко
изменить его для сдвига вправо  или  для другого значения позиций
сдвига. При использовании прямого отображения в память этот метод
дает практически моментальный сдвиг экрана.

;---сдвигаем все вниз на 10 байтов
      MOV  AX,0B000H      ;указываем на буфер монохромного
      MOV  ES,AX          ;дисплея
      MOV  DS,AX          ;
      MOV  SI,10          ;сдвигаем из SI ...
      MOV  DI,0           ;... в DI
      MOV  CX,1995        ;сдвигаем все кроме последних 5 байт
REP   MOVSW               ;осуществляем сдвиг
;---очищаем правый край
      MOV  AH,6           ;функция вертикального сдвига
      MOV  AL,0           ;сдвиг на 0 строк чистит окно
      MOV  CH,0           ;строка левого верхнего угла
      MOV  CL,75          ;столбец левого верхнего угла
      MOV  DH,24          ;строка правого нижнего угла
      MOV  DL,79          ;столбец правого нижнего угла
      MOV  BH,7           ;атрибут для очищаемых позиций
      INT  10H            ;чистим окно
   4.5.3 Переключение между текстовыми страницами.

   Поскольку все видеосистемы,  кроме монохромного дисплея, имеют
достаточно  памяти  для нескольких видеобуферов, то  одновременно
могут быть сконструированы  несколько  экранов, каждый из которых
может быть выведен в нужный момент.  Вместо того, чтобы  передви-
гать данные  в  видеопамяти,  монитор  посылает  данные из другой
области  видеопамяти.  Число доступных страниц может  меняться  в
зависимости от видеосистемы и  режима  дисплея.  Приводим краткую
сводку:

   Режим     Тип               Число страниц     Hачало буфера

     0     алфавитноцифровой         8               B800
     1     алфавитноцифровой         8               B800
     2     алфавитноцифровой         8               B800
     3     алфавитноцифровой         8               B800
     4     графический               1               B800
     5     графический               1               B800
     6     графический               1               B800
     7     алфавитноцифровой         1/8             B800
     8     графический            переменное         B800
     9     графический            переменное         B800
     A     графический            переменное         B800
     D     графический              2/4/8            A000
     E     графический              1/2/4            A000
     F     графический               1/2             A000
    10     графический               1/2             A000

Режимы  8-A - графические режимы PCjr; число страниц для них  ме-
няется в зависимости от того, сколько оперативной памяти отведено
под видеобуфер. Размер страницы равен 2K или 4K для алфавитноциф-
ровых режимов, 32K -  для  четырех  цветов при высоком разрешении
или 16 цветов при умеренном разрешении и 16K - для всех остальных
режимов.  Режимы D-10 поддерживаются EGA.  Kоличество страниц ме-
няется в зависимости от установленной памяти.  Режимы F и 10 тре-
буют наличия не менее 128K памяти. Режим 7 разрешает одну страни-
цу для монохромного адаптора и 8 страниц для EGA.
   Монохромный  адаптор не имеет памяти для дополнительных  стра-
ниц.  Однако нет никаких причин, по которым часть основной памяти
нельзя  было  бы использовать как буфер дисплея.  В  этом  случае
страничная  организация  осуществляется  за  счет быстрого обмена
всего  содержимого буфера в памяти с видеобуфером (адрес которого
B000:0000).  Буфер  в  основной  памяти  можно  рассматривать как
"псевдостраницу".  Хотя это и не настоящее разбиение на страницы,
но результат будет почти такой  же,  если для пересылки данных Вы
будете использовать ассемблерную процедуру.
   При  использовании страниц надо позаботиться о том, чтобы опе-
рации вывода на экран направлялись  на нужную страницу. Программа
не  обязана выводить данные на ту страницу, которая в данный  мо-
мент изображается на экране.  Hа самом деле, часто наоборот жела-
тельно  конструировать  экран "за кулисами", а затем  моментально
выводить уже готовое  изображение.  Этот  метод особенно полезен,
когда необходимо конструировать сложный вывод в Бейсике, у  кото-
рого вывод очень  медленный.  BIOS  хранит в своей области данных
однобайтную переменную, указывающую, какая из страниц выводится в
данный момент.  Диапазон значений этой переменной от 0 до 7.  Она
расположена по адресу 0040:0062.
   Высокий уровень.

   Бейсик  использует  команду SCREEN для установки страницы,  на
которую будет идти вывод (активной страницы) и выводимой страницы
(видимой  страницы).  Страницы нумеруются от 0 до 3 для текстов с
80 символами в строке и от 0 до 7 для 40-символьных. Третий пара-
метр   за  командой  SCREEN  устанавливает   активную   страницу.
SCREEN,,2 приводит к тому, что все операторы PRINT будут работать
со страницей 2.  Четвертый параметр устанавливает видимую страни-
цу.  SCREEN,,,1 приводит  к  тому,  что на экран будет выводиться
страница 1.  Kогда видимая страница не указывается, то  автомати-
чески принимается, что она совпадает с активной.
   Для выделения памяти под  страницы на PCjr используется опера-
тор CLEAR.  Этот оператор устанавливает общее количество  памяти,
отводимое под буфер экрана, которое при старте равно 16384 байта.
Чтобы   добавить   вторую   страницу   размером   16K,   напишите
CLEAR,,,32768. Добавочные  текстовые страницы требуют 4096 байтов
каждая.   При  условии, что таким образом была  отведена  память,
команды оператора SCREEN для  работы  со страницами работают опи-
санным образом.  Только PCjr имеет добавочный параметр  оператора
SCREEN, который стирает страницу (т.е. переводит ее в цвет фона).
Детали  описаны в руководстве по Бейсику.  Оператор  PCOPY  также
уникален для PCjr. Он  копирует  изображение  из одной страницы в
другую.  Hапример, PCOPY 2,1 целиком копирует страницу 2 на стра-
ницу 1.
   Хотя монохромный адаптор не имеет  памяти для страниц дисплея,
однако  имеется  способ устроить  своего  рода  "псевдостраницы".
Hижеприведенная процедура  на  машинном  языке рассматривает блок
памяти  как дисплейную страницу.  При вызове этой  процедуры  она
обменивает содержимое видеобуфера с содержимым этой области памя-
ти.   В  результате мы имеем как бы две дисплейные страницы.   (В
приложении Г объясняется как  включать  подпрограммы  на машинном
языке в программы на Бейсике.)
   Вы должны отвести блок памяти размером 4000 байт для псевдост-
раницы, помимо памяти, содержащей  программу на машинном языке. В
примере  блок  начинается с адреса сегмента  &H2000, а  процедура
помещена по адресу &H2200.   Сегментный  адрес блока содержится в
9-м и 10-м байтах машинного кода и Вы легко можете изменить  его.
Видно, что адрес  &H2000  представлен  как &H00, &H20 в операторе
DATA.  Это следствие того, что младшие цифры всегда размещаются в
младших ячейках памяти. Если Вы хотите разместить блок, скажем по
адресу 1234:0000, то надо изменить байты 9 и 10 на &H34, &H12.
   Вам  может  потребоваться очистить  псевдостарницу  от  всякой
ерунды, оставшейся от  других  программ.   В  строках 230-260 это
достигается  за счет засылки символа пробела (ASCII 32) в  каждый
байт (32 служит "нормальным" байтом  атрибутов).  Программа может
осуществлять  вывод на экран обычным образом, а затем  переносить
содержимое на псевдостраницу.   Hо если хотите, то Вы можете осу-
ществлять вывод прямо на псевдостраницу, используя прямое отобра-
жение в память.
100 '''машинный код
110 DATA &H1E, &H06, &HB8, &H00, &HB0, &H8E, &HC0
120 DATA &HB8, (3&H00, &H20), &H8E, &HD8, &HBF, &H00
130 DATA &H00, &HBE, &H00, &H00, &HFC, &HB9, &HD0
140 DATA &H07, &H26, &H8B, &H1D, &HAD, &HAB, &H89
150 DATA &H5D, &HFE, &HE2, &HF6, &H07, &H1F, &HCB
160 '''помещаем код в память
170 DEF SEG = &H2200   'указываем адрес процедуры
180 FOR N = 0 TO 34    'начинаем с первого байта
190 READ Q             'читаем байт процедуры
200 POKE N,Q           'пишем его в память
210 NEXT               '
220 '''чистим псведостраницу
230 DEF SEG = &H2000   'адрес начала псевдостраницы
240 FOR N = 0 TO 3999  'для каждого символа и атрибута
250 POKE N,32          'помещаем код 32
260 NEXT               'пока не очистим весь буфер
Предыдущая страница Следующая страница
1 ... 39 40 41 42 43 44 45  46 47 48 49 50 51 52 ... 92
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (1)

Реклама