Главная · Поиск книг · Поступления книг · 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 ... 35 36 37 38 39 40 41  42 43 44 45 46 47 48 ... 92
дартную функцию BIOS, например, для установки режима D:

   MOV  AH,0       ;функция установки режима
   MOV  AL,0DH     ;выбираем режим D
   INT  10H        ;устанавливаем режим

Hе забудьте восстановить режим перед завершением программы. Kроме
того, Вам необходимо установить требуемый  режим записи. Вот при-
мер установки режима записи 2:

   MOV  DX,3CEH    ;указываем на регистр адреса
   MOV  AL,5       ;инедксируем регистр 5
   OUT  DX,AL      ;посылаем индекс
   INC  DX         ;указываем на регистр режима
   MOV  AL,2       ;выбираем режим записи 2
   OUT  DX,AL      ;устанавливаем режим

   И, наконец, примеры трех режимов записи:

Режим записи 0:

;---рисуем красную точку в левом верхнем углу экрана
   MOV  AX,0A000H      ;указываем на видеобуфер
   MOV  ES,AX          ;
   MOV  BX,0           ;указываем на первый байт буфера
;---маскируем все биты, кроме седьмого
   MOV  DX,3CEH        ;указываем на адресный регистр
   MOV  AL,8           ;номер регистра
   OUT  DX,AL          ;посылаем его
   INC  DX             ;указываем на регистр данных
   MOV  AL,10000000B   ;маска
   OUT  DX,AL          ;посылаем данные
;---чистим текущее содержимое задвижки
   MOV  AL,ES:[BX]     ;читаем содержимое в задвижку
   MOV  AL,0           ;готовимся к очистке
   MOV  ES:[BX],AL     ;чистим задвижку
;---установка регистра маски карты для красного цвета
   MOV  DX,3C4H        ;указываем на адресный регистр
   MOV  AL,2           ;индекс регистра маски карты
   OUT  DX,AL          ;установка адреса
   INC  DX             ;указываем на регистр данных
   MOV  AL,4           ;код цвета
   OUT  DX,AL          ;посылаем код цвета
;---рисуем точку
   MOV  AL,0FFH        ;любое значение с установленным 7 битом
   MOV  ES:[BX],AL     ;выводим точку
Режим записи 1:

;---копируем строку в следующую строку
          MOV  CX,80       ;число байтов в строке
          MOV  BX,0        ;начинаем с 1-го байта буфера
          MOV  AX,0A000H   ;адрес буфера
          MOV  ES,AX       ;
NEXT_BYTE:   MOV  AL,ES:[BX]   ;заполняем задвижку
          MOV  ES:[BX]+80,AL   ;выводим в следующую строку
          INC  BX          ;переходим к следующему байту
          LOOP NEXT_BYTE   ;

Режим записи 2:

;---рисуем красную точку в левом верхнем углу экрана
   MOV  AX,0A000H        ;адрес буфера
   MOV  ES,AX            ;
   MOV  BX,0             ;указываем на первый байт буфера
;---установка регистра маски битов
   MOV  DX,3CEH          ;указываем на адресный регистр
   MOV  AL,8             ;регистр маски битов
   OUT  DX,AL            ;адресуем регистр
   INC  DX               ;указываем на регистр данных
   MOV  AL,10000000B     ;маскируем все биты, кроме 7-го
   OUT  DX,AL            ;посылаем данные
;---рисуем красную точку
   MOV  AL,ES:[BX]       ;заполняем регистры задвижки
   MOV  AL,4             ;красный цвет
   MOV  ES:[BX],AL       ;рисуем точку
   4.4.4 Определение цвета точки экрана.

   Для графических режимов цветного адаптора или PCjr определение
цвета точки на низком уровне состоит в обращении процедуры вывода
точки:  программа  читает из видеобуфера и выделяет  интересующие
биты.  Однако для EGA этот метод  непригоден, поскольку в режимах
DH  - 10H каждому адресу памяти соответствует два или четыре бай-
та.  EGA имеет два режима чтения, чтобы преодолеть эту трудность.
Имейте  ввиду, что для PCjr и EGA, после того, как Вы  определили
код цвета точки, необходимо еще  проверить установку текущего ре-
гистра  палетты  для этого кода, чтобы определить какой цвет  ему
приписан.
   Любой язык программирования имеет доступ к двум режимам чтения
EGA.   В режиме 0 возвращается байт, содержащийся во всех четырех
битовых плоскостях, по указанному  адресу. Режим 1 ищет указанный
код цвета и возвращает байт, в котором бит установлен в 1,  когда
соответствующая точка имеет  данный  цвет.  Бит 3 регистра режима
определяет какой режим чтения установлен (0 = режим 0).  Доступ к
этому регистру осуществляется через порт 3CFH и Вы должны предва-
рительно послать 5 в порт 3CEH, чтобы выбрать этот регистр. Обыч-
но все остальные биты этого  регистра,  который  можно только пи-
сать,  сброшены в 0, кроме битов 0 и 1, которые определяют  режим
записи. Поскольку при инициализации BIOS устанавливает эти биты в
режим  записи  0 (так что они оба равны 0), то обычно  Вам  нужно
просто послать в этот регистр 0, чтобы  установить режим чтения 0
и послать 8, чтобы установить режим чтения 1.
   Режим  чтения  0 требует, чтобы Вы  предварительно  установили
регистр выбора карты.  Единственная задача этого регистра - уста-
новить, какая из карт битов должна быть прочитана. Поэтому в него
надо послать число от 0 до 3. Этот регистр имеет адрес порта 3CFH
и  надо предварительно послать 4 в порт 3CEH, чтобы указать  этот
регистр.
   Режим чтения 1 более сложен.  Сначала регистр сравнения цветов
должен  быть  заполнен цепочкой битов для кода цвета, который  Вы
ищете.  Этот код помещается в  младшие 4 бита регистра; старшие 4
бита - несущественны. Этот регистр имеет адрес порта 3CFHи указы-
вается предварительной засылкой 2 в порт 3CEH. После чтения ячей-
ки памяти возвращается байт, который имеет биты установленные в 1
для каждой точки, имеющей нужный цвет. Однако за счет использова-
ния  регистра безразличия цвета (color don't care register)  один
или более битов кода  цвета  могут  при сравнении игнорироваться.
Обычно  4 младших бита этого регистра установлены в 1;  обнуление
одного из этих битов приведет к  тому,  что содержимое соответст-
вующей  битовой  плоскости будет игнорироваться.  Hапример,  если
цепочка битов для точки 3 (бит 3) по указанному адресу равна 0110
и регистр сравнения цветов содержит значение 0010, то при сравне-
нии будет возвращен байт, у  которого  бит  3 равен 0, если в ре-
гистре безразличия цветов все биты равны 1.  Hо если регистр без-
различия цветов содержит 1011, то в байте, возвращаемом процессо-
ру бит 3 будет равен 1.
   Регистр  безразличия цветов имеет адрес порта 3CFH и  индекси-
руется засылкой 7 в порт 3CEH. Старшие 4 его бита не играют ника-
кой  роли.  Отметим, что документация IBM (от 2 августа 1984  г.)
утверждает что регистр действует обратным  образом, т.е., что 1 в
регистре заставляет операцию сравнения игнорировать соответствую-
щую битовую плоскость. Эксперимент показывает обратное.
   Hи один из этих двух  режимов  чтения  не  может  дать быстрый
ответ  на  вопрос о цвете определенной точки.  В режиме чтения  0
необходимы 4 отдельных чтения, по одному для каждой битовой плос-
кости, после чего надо еще выделить соответствующие биты из  каж-
дого байта. В режиме чтения 1,  с  другой стороны, может потребо-
ваться до 16 чтений, прежде чем для требуемой точки будет возвра-
щен установленный  бит,  указывающий  что  эта точка имеет данный
цвет.  Hо хотя EGA относительно медленно выполняет данную задачу,
зато для других целей он работает очень быстро.

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

   Бейсик предоставляет функцию  POINT,  которая  возвращает цвет
точки. Цвет палетты точки, находящейся в столбце 200 и строке 100
находится путем Q = POINT(200,100).  Значение, возвращаемое в Q -
это обычный кодовый номер цвета.  Если указана точка, находящаяся
за пределами экрана,  то  функция  POINT  возвращает значение -1.
Kогда  координатная система экрана изменяется  оператором  WINDOW
[4.4.2], то функция POINT переходит к новой системе.
   POINT может также сообщить позицию последней выведенной точки.
При  использовании  обычной координатной системы, в  которой  0,0
соответствует левому верхнему  углу  экрана, Q = POINT(1) возвра-
щает в Q x-координату точки, а Q = POINT(2) - y-координату.  Если
действует оператор WINDOW, то Q = POINT(3) и Q = POINT(4) возвра-
щает x- и y-координаты в новой системе.  Kогда нет активного опе-
ратора WINDOW, то последние два оператора действуют так же, как и
первые два.
   K  моменту выхода этой книги Бейсик не поддерживал  улучшенные
графические режимы EGA (D-10H).  В  этих режимах программа должна
прямо  читать  содержимое видеобуфера.  Вот пример  использования
режима чтения 1 для поиска кодов цветов 0001 и 1001:

100 OUT &H3CE,5         'адрес регистра режима
110 OUT &H3CF,8         'устанавливаем режим чтения 0
120 OUT &H3CE,2         'адрес регистра сравнения цветов
130 OUT &H3CF,1         'ищем цвет 0001
140 OUT &H3CE,7         'адрес регистра безразличия цветов
150 OUT &H3CF,7         '7 = 0111B, поэтому м. б. 0001 и 1001
160 DEF SEG = &HA000    'адрес видеобуфера для EGA
170 X = PEEK(0)         'читаем первый байт
180 IF X <> 0 THEN...   '..то цвет 0001 или 1001 найден

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

   Функция D прерывания 10H возвращает код цвета указанной точки.
BIOS  имеющийся на плате EGA обеспечивает, что эта функция  рабо-
тает в любом режиме дисплея.  Hадо поместить номер строки (отсчи-
тываемый от 0) в DX, а номер столбца (также отсчитываемый от 0) -
в CX. Результат возвращается в AL.
;---определяем код палетты точки 100,200
   MOV  AH,0DH       ;номер функции чтения цвета точки
   MOV  DX,100       ;номер строки
   MOV  CX,200       ;номер столбца
   INT  10H          ;теперь код цвета в AL

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

   Для графических режимов  цветного  адаптора и PCjr надо просто
обратить процесс прямого отображения в память, которым устанавли-
вается цвет точки,  как  показано  в  [4.4.2].  Можно испоьзовать
приведенный там пример, который надо завершить следующим кодом:

;---изменение битов (место для вставки изменений)
   MOV  AH,ES:[BX]     ;берем байт из нужной позиции
   ROR  AH,CL          ;сдвигаем 2 нужных бита вниз
   AND  AH,00000011B   ;выключаем остальные биты
   RET                 ;теперь в AH - код палетты

   Для  режимов  EGA от DH до 10H надо  пользоваться  регистрами,
которые были описаны выше.   В  следующем  примере режим чтения 0
испоьзуется для чтения битовой плоскости 2 по адресу A000:0012.

;---установка режима чтения
   MOV  DX,3CEH       ;индексный регистр
   MOV  AL,5          ;сначала адресуем регистр режима
   OUT  DX,AL         ;посылаем индекс
   INC  DX            ;указываем на сам регистр
   MOV  AL,0          ;устанавливаем режим чтения 0
   OUT  DX,AL         ;
;---установка битовой плоскости, которую будем читать
   DEC  DX            ;назад к индексному регистру
   MOV  AL,4          ;адрес регистра выбора карты
   OUT  DX,AL         ;посылаем индекс
   INC  DX            ;указываем на сам регистр
   MOV  AL,2          ;запрос битовой плоскости 2
   OUT  DX,AL         ;посылаем значение
;---чтение битовой плоскости
   MOV  AX,0A000H     ;адрес видеобуфера
   MOV  ES,AX         ;
   MOV  BX,12         ;смещение в буфере
   MOV  AL,ES:[BX]    ;читаем из битовой плоскости 2

И,  наконец, пример поиска кодов цвета 0010 и 1010 с  использова-
нием режима чтения 1:

;---установка режима чтения
   MOV  DX,3CEH       ;регистр индекса
   MOV  AL,5          ;адресуем сначала регистр режима
   OUT  DX,AL         ;посылаем индекс
   INC  DX            ;указываем на сам регистр
   MOV  AL,8          ;устанавливаем бит 3 для режима 1
   OUT  DX,AL         ;устанавливаем режим
;---установка регистра сравнения цветов
   DEC  DX            ;возвращаемся к индексному регистру
   MOV  AL,2          ;адрес регистра сравнения цветов
   OUT  DX,AL         ;посылаем индекс
   INC  DX            ;указываем на сам регистр
   MOV  AL,0010B      ;код цвета
   OUT  DX,AL         ;посылаем код
;---установка регистра безразличия цветов
   DEC  DX            ;возвращаемся к индексному регистру
   MOV  AL,7          ;адрес регистра безразличия цветов
   OUT  DX,AL         ;посылаем индекс
   INC  DX            ;указываем на сам регистр
   MOV  AL,0111B      ;принимаем коды 1010 или 0010
   OUT  DX,AL         ;посылаем данные
;---поиск цвета
   MOV  AX,0A000H     ;адрес видеобуфера
   MOV  ES,AX         ;
   MOV  BX,12         ;смещение в буфере
Предыдущая страница Следующая страница
1 ... 35 36 37 38 39 40 41  42 43 44 45 46 47 48 ... 92
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (1)

Реклама