В этих режимах отображается цветная графическая информация. Экран дисплея имеет разрешение 320 пикселов по горизонтали и 200 пикселов по вертикали.
В качестве дисплея могут использоваться цветной дисплей (CD), улучшенный цветной дисплей (ECD), а также некоторые многочастотные дисплеи и дисплей VGA.
При отображении могут использоваться либо четыре основных, либо четыре альтернативных цвета. Данные цвета приведены в таблице 3.3:
Стандартные цвета
Альтернативные цвета
черный
черный
светло-синий
зелный
малиновый
красный
белый
коричневый
Таблица 3.3 Цветовая палитра режимов 4 и 5
В отличие от предыдущих режимов поддерживается только одна страница экрана. Ее начальный адрес равен B800:0000.
Теперь мы приведем программу, отображающую пикселы на экране через непосредственный доступ к видеопамяти. Стержнем этой программы является функция Pixel_Offs_4_5. Первые два ее параметра определяют координаты пиксела. Третий параметр - это указатель на смещение байта, определяющего пиксел в видеопамяти. Четвертый параметр определяет номер младшего из битов, который отвечает за данный пиксел. Заметим, что так как каждый байт в этом режиме определяет четыре пиксела, то при изменении одного пиксела надо позаботится о сохранении остальных трех пикселов.
#include "sysp.h"
Pixel_Offs_4_5(unsigned x, unsigned y, unsigned *offset, unsigned char *shift) {
unsigned char bit_shift; unsigned byte_offset;
_asm {
; записываем в bx x-координату пиксела
mov bx,x
; запоминаем в регистре cl младший байт переменной x
mov cl,bl
; записываем в ax y-координату пиксела
mov ax,y
; вычисляем смещение байта, определяющего пиксел с ; координатами (x,y)
; ax = 100h * y
xchg ah,al
; в бит D7, регистра al, записываем младший бит ; переменной y; этот бит равен единице, если значение ; переменной y нечетное, и равен нулю, если оно четное
; al = 80h * (y&1) ; ax = ax/2 = 80h * y
shr ax,1
; bx = x + 8000h*(y&1)
add bh,al
; ax = 100h*(y/2)
xor al,al
; bx = x + 8000h*(y&1) + 100h*(y/2)
add bx,ax
; ax = 40h*(y/2)
shr ax,1 shr ax,1
; bx = x + 8000h*(y&1) + 100h*(y/2) + 40h*(y/2) = ; = x + 8000h*(y&1) + 140h*(y/2)
add bx,ax
; bx = x/4 + 2000h*(y&1) + 50h*(y/2)
shr bx,1 shr bx,1
; теперь bx содержит смещение байта, определяющего ; пиксел с координатами (x,y) относительно начала ; видеопамяти (страницы видеопамяти)
mov byte_offset,bx
; определяем биты, отвечающие за пиксел (x,y) ; записываем в регистр cl два последних бита переменной ; x