Информационные технологииStfw.Ru 🔍

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

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

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 ES
push 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

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

DOS   Теги: Dos

Читать IT-новости в Telegram
Информационные технологии
Мы в соцсетях ✉