
- •4) Mov esi,6*2 ; 2 байта – размер элементов
- •Индексная адресация со смещением — режим адресации, при котором полный адрес формируется из двух компонентов:
- •Базовая индексная адресация со смещением — режим адресации, при котором полный адрес формируется максимум из трех компонентов:
- •Xor ecx,ecx ;обнуление есx
- •Структуры
- •Организовать обращение к элементам структуры.
- •Цепочечные команды или команды обработки строк символов
- •Организация обращения к элементам записи.
- •Работа с записями
- •1) Для выделения элемента записи необходимо:
- •2) Чтобы поместить измененный элемент на его место в запись необходимо:
- •3. В конце работы файл следует закрыть.
- •4. Признаком ошибки при выполнении функции dos является взведенный флаг с (переноса).
- •2. Создание файла с усечением существующего до нулевой длины.
- •LpFileName — указатель на asciiz-строку с именем (путем) открываемого или создаваемого файла;
- •DwDesiredAccess — тип доступа к файлу:
- •3) Создать и открыть новый файл
- •4) Чтение из файла или устройства
- •5) Переместить указатель чтения/записи
- •1) HFile – хэндл того файла, в котором перемещается указатель.
- •7) Запись в файл или устройство
- •8) Закрыть файл
- •9) Удаление файла
- •Функция 01h – ожидание ввода символа с эхопечатью
- •Функция 0ah – получение строки символов
- •1) Создать каталог
- •2) Удалить каталог
- •5) Определить текущий каталог
- •Перечень функций прерывания 21h, работающих с файлами, которые имеют длинные имена и соответствующие функции api Win32.
- •Перечислим функции api Win32, имеющие отношение к работе с файловой системой.
- •1) В Win32 получить время создания, время последнего доступа и время последней модификации файла можно с помощью функции GetFileTime.
- •3) В Win32 имеется функция GetFileInformationByHandle, с помощью которой можно получить все атрибуты файла:
- •Обзор прерываний bios
- •Int 10h, функция 0Dh. Чтение пиксела.
- •02H/03h - Чтение/запись секторов.
- •Прямое программирование видеобуфера в текстовом режиме
- •Текстовый режим. Доступ к памяти
- •Организация памяти в графическом режиме 12h
- •Вычисление адреса Пикселя по экранным координатам.
- •Рисование с помощью регистров Графического Контроллера
- •Установка цвета отдельных пикселей.
- •Прокрутка областей экрана, копирование областей экрана.
- •Чтение отдельных пикселей с экрана.
- •Рисование с помощью регистров Указателя Последовательности
- •Установка цвета ячейки пикселей.
Прокрутка областей экрана, копирование областей экрана.
Прием основан на использовании регистра Режим (индекс 5) и принципа действия регистров-защелок - для выполнения копирования 8-ми бытовых ячеек без изменения в пределах видеопамяти программе не нужно получать значения цветов, распределенных по 4-м битовым матрицам. Используется режим записи 1 регистра Режим.
; На входе: di - смещение видеопамяти, по которому производится копирование
; si - смещение видеопамяти, по которому находится копируемая ячейка
; * Пример копирует только одну 8-ми пиксельную ячейку. Нетрудно модиицировать его для копирования/прокрутки любых областей экрана.
CopyPixels PROC
push ES
push 0A000h
pop ES
mov DX, 3CEh
mov AX, 0105h
out DX, AX ; Выбор регистра Режим и одновременная установка режима записи 1
mov AH, ES:[DI] ; Чтение ячейки в регистры-защелки
mov ES:[SI], AH ; Запись регистров-защелок в память
pop ES
ret
CopyPixels ENDP
Следует отметить, что пример эффективен только в том случае, если прокручиваемая/копируемая область по ширине и начальная координата области по горизонтали кратны 8-ми пикселям.
Чтение отдельных пикселей с экрана.
Прием основан на использовании регистров Выбор Схемы Чтения (индекс 4) и Режим (индекс 5). В зависимости от установки бита 3 регистра Режим можно выбрать 2 режима чтения. В режиме чтения 0 чтение из байта памяти возвращает байт, записанный в битовой матрице, заданной в регистре Выбор Схемы Чтения. Таким образом, чтобы считать 8-ми пиксельную ячейку экрана потребуется 4 операции чтения и, соответственно, 4 байта в области данных для сохранения прочитанной ячейки. Режим 1 более сложен для программирования и на мой взгляд менее функционален для решения простых прикладных задач, поэтому я опускаю его подробное рассмотрение.
Следующий пример демонстрирует чтение 8-ми пиксельной ячейки с координатами 0, 0 в область данных со смещением DI
; На входе: DI - смещение области данных для сохранения значений.
; SI - смещение ячейки в видеопамяти
ReadPixels PROC
push ES
push 0A000h
pop ES
mov DX, 3CEh
mov AX, 0005h
out DX, AX ; Выбор регистра Режим и одновременная установка режима чтения 0
xor AH, AH
@Again: mov AL, 04h
out DX, AX ; Выбор регистра Выбор Схемы Чтения и установка битовой матрицы AH
mov AL, ES:[SI]
mov DS:[DI], AL
inc DI
inc AH
cmp AH, 4
jnz @Again
pop ES
ret
ReadPixels ENDP
Следует заметить, что восстановление сохраненной таким образом области экрана - восстановление с использованием регистров Графического Контроллера - вызовет определенные трудности. Может потребоваться не 4 операции записи, а значительно больше - в зависимости от "разноцветья" пикселей в сохраненных ячейках. Однако, здесь нам на помощь приходит другой прием - рисование с помощью регистров Указателя Последовательности.
Рисование с помощью регистров Указателя Последовательности
Регистры Указателя Последовательности также доступны только косвенно через порт 3C5h. Индекс требуемого регистра следует записать в порт 3C4h - в регистр Адреса Указателя Последовательности.
Установка цвета ячейки пикселей.
Прием основан на использовании регистра Маскирования Растра (индекс 2), позволяющего разрешить/запретить для записи отдельные битовые матрицы.
Следующий пример демонстрирует вывод 8-ми пиксельной ячейки на экран. Предполагается, что в области данных по смещению SI находятся 4 байта ячейки, эквивалентные полученным в результате Чтения ячейки экрана в предыдущем примере. Следует отметить, что формат регистра AH, идентифицирующего текущую битовую матрицу отличается от предыдущего примера. Матрица в регистре Выбор Схемы Чтения задается обычным числовым индексом (в битах 0..2) матрицы. В регистре Маскирования Растра матрица задается с помощью битовой маски:
Бит 0 - Матрица 0
1 - Матрица 1
2 - Матрица 2
3 - Матрица 3
Остальные биты регистра не используются.
Установка бита в 1 разрешает запись в Матрицу, сброс бита - запрещает.
; На входе: SI - Смещение области данных, по которому располагаются
; подготовленные 4 байта ячейки.
; DI - Смещение в видеопамяти, по которому записывается ячейка
WritePixels PROC
push ES
push 0A000h
pop ES
mov DX, 3C4h
mov AH, 01h
@Again: mov AL, 02h
out DX, AX ; Выбор регистра Маскирования Растра и установка битовой матрицы AH
mov AL, DS:[SI]
mov ES:[DI], AL
inc SI
shl AH, 1
cmp AH, 10h
jnz @Again
mov AX,0F02h
out DX,AX ; *
pop ES
ret
WritePixels ENDP
* Запись в регистр Маскирования Растра, осуществляемая командами mov AX, 0F02h; out DX, AX разрешает запись во все битовые матрица. Необходимость выдачи этих команд обусловлена тем, что установки регистра Маскирования Растра действуют для всех режимов записи (в том числе для записи через регистры Графического Контроллера, рассмотренной выше).
Регистр Маскирования Растра кроме того очень удобен для выполнения операций только над определенными цветами определенных пикселей. Режим записи 0 регистра Режим Графического Контроллера позволяет комбинировать установки регистра Маскирования Растра (разрешающего матрицы) и регистра Битовой Маски (разрешающего пиксели).
Следующий фрагмент устанавливает яркость каждого второго пикселя ячейки не изменяя цвет (при стандартной настройке палитры):
mov DX 3C4h
mov AX, 0802h ; Разрешаем битовую матрицу 3
out DX, AX
mov DX, 3CEh
mov AH, 01010101b ; Маскируем пиксели
mov AL, 8
out DX, AX
mov AX, 0005h ; Устанавливаем режим записи 0
out DX, AX
mov AL, 0FFh
mov AH, ES:[DI]
mov ES:[DI], AL ; Изменяем цвет
Графический режим 13h
Графический режим 13h (320*200 пикселей, 256 цветов) представляется значительно более простым для программирования. Видеобуфер в этом режиме располагается также по адресу 0A0000h, однако каждому экранному пикселю соответствует один байт видеобуфера. Иными словами, запись в видеопамять байта означает установку цвета (в диапазоне 0..255) экранного пикселя. Так как байты-пиксели располагаются в памяти последовательно, непосредственно один за другим, вычисление адреса пикселя в памяти по заданным координатам полностью эквивалентно вычислению адреса символа в текстовом режиме.
Конечно, это описание возможностей регистрового программирования видеоадаптеров далеко не полно. Целью данной статьи было дать возможность читателю быстро и легко оснастить программу наиболее существенными в большинстве практических приложений графическими функциями, а также показать на примерах, что регистровое программирование далеко не так сложно, как может показаться неискушенному кодеру на первый взгляд. А при более глубоком ознакомлении с документацией по этому вопросу можно творить с обычным видеоадаптером почти фантастические вещи :)