Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsia_8-11_Massivy-struktury.doc
Скачиваний:
11
Добавлен:
21.12.2018
Размер:
1.47 Mб
Скачать

Текстовый режим. Доступ к памяти

В текстовом режиме 03h видеоадаптер для вывода символов использует буфер в памяти, располагающийся по постоянному адресу 0B8000h (SEG: 0B800h, OFT: 0h). Каждая логическая ячейка этого буфера состоит из двух байт:

0 - ASCII-код символа

1 - Атрибут цветности

Ячейки располагаются непосредственно друг за другом построчно и постранично. (Видеоадаптеры с размером памяти >=256К поддерживают 8 экранных страниц из которых в некоторый момент времени может быть отображена только одна)

Это означает, что символ с экранными координатами 1*1 страницы 0 будет иметь адрес 0B8000h, символ с координатами 80*25 - 0B8000h + 80 * 25 * 2 - 2, символ с координатами 0*0 страницы 1 - 0B8000h + 80 * 25 * 2.

Отсюда выводится несколько простых и удобных функций записи символов на любую экранную страницу и чтения символов с любой экранной страницы независимо от позиции курсора и активной страницы:

Вычисление физического смещения символа по заданным координатам

; На входе: al - Горизонтальная координата X (отсчет от 1)

; ah - Вертикальная координата Y (отсчет от 1)

; cl - Номер страницы (отсчет от 0)

; На выходе: di - смещение символа по заданным координатам

CharAddr PROC

; Вычисляем смещение для позиции символа

mov CH, AH

mul CH ; Перемножаем координаты X, Y

shl AX, 1 ; Умножаем результат на 2

sub AX, 2 ; Устанавливаем смещение на начало ячейки

; Вычисляем смещение страницы

mov DI, AX ; Сохраняем смещение символа в DI

push DX ; Сохраняем содержимое DX

mov AX, 4000 ; Помещаем в AX размер страницы с байтах

xor CH, CH

mul CX ; Вычисляем смещение страницы

pop DX ; Восстанавливаем содержимое DX

; Вычисляем полное смещение

add DI, AX

ret

CharAddr ENDP

* Функция не проверяет переполнение AX при выполнении mul CX, полагая, что смещение позиции символа для диапазона страниц 0..7 не может превышать размера WORD

Запись символа по заданным координатам

; На входе: al - Горизонтальная координата (отсчет от 1)

; ah - Вертикальная координата (отсчет от 1)

; dl - ASCII-код символа

; dh - Атрибут цветности

; cl - Номер страницы (отсчет от 0)

WriteChar PROC

push ESpush DI

; Помещаем в ES сегмент видеобуфера

push 0B800h

pop ES

; Вычисляем полное смещение символа

call CharAddr

; Выводим символ на экранную страницу

mov ES:[DI], DX

pop DI

pop ES

ret

WriteChar ENDP

Чтение символа по заданным координатам

; На входе: al - Горизонтальная координата X (отсчет от 1)

; ah - Вертикальная координата Y (отсчет от 1)

; cl - Номер страницы (отсчет от 0)

; На выходе: al - ASCII-код символа

; ah - Атрибут цветности

ReadChar PROC

push ES

push DI

; Помещаем в ES сегмент видеобуфера

push 0B800h

pop ES

; Вычисляем полное смещение символа

Call CharAddr ; Читаем символ с экранную страницу

mov AX, ES:[DI]

pop DI

pop ES

ret

ReadChar ENDP

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]