Жанр: Учеба
Справочник программиста на IBM PC
... регистр. Наконец, надо
послать данные по тому же адресу. Поскольку этот регистр только
для записи, то все биты должны быть правильно установлены. Мигание
включается установкой бита 3, а выключается сбросом этого
бита. Все остальные биты в цветном текстовом режиме должны быть
равны 0.
Для цветного адаптора, когда символы выводятся на дисплей в
цветном графическом режиме, то они изображаются в текущем фоновом
цвете. Операторы, которые выводят на экран, как в Бейсике, так и
в MS DOS (прерывание 21H) ограничены выводом символов в третьем
цвете используемой палетты (имеются две палетты из трех цветов -
см. [4.4.1]). В палетте 0 символы желтые/коричневые, а в палетте
1 они белые. Процедуры вывода символов BIOS (прерывание 10H),
однако, могут указать любой из трех цветов палетты. С другой
стороны, для PCjr, цвет назначенный определенной позиции палетты
может быть изменен, поэтому для вывода символов могут использованы
любые цвета.
Для PCjr цвета соответствующие данным кодовым номерам могут
быть изменены. Каждый кодовый номер связан с регистром палетты в
массиве ворот дисплея [4.1.1]. Эти регистры пронумерованы от 10H
до 1FH, что соответствует кодам от 0 до 15. Каждый 4-битный регистр
содержит число в диапазоне 0-15, которое представляет
реальный цвет, выводимый когда оператор программы встречает один
из кодовых номеров. Например, если в каком-то месте программы
указано, что символ должен выводиться с кодовым номером 0, то
цвет выводимого символа определяется кодом цвета, хранящемся в
регистре палетты 0. Начальное значение этого регистра 0000, поэтому
будет выводиться черный цвет. Но содержимое этого регистра
может быть изменено, скажем, на 0001, а в этом случае кодовый
номер 0 приведен к выводу синим цветом. Кодовые номера, используемые
в регистрах палетты такие же, как и в операторах программы.
На рис. 4-1 показана начальная установка регистров палетты
для всех регистров, кроме регистра для зеленого цвета, который
изменен так, чтобы выводился цвет магента.
Чтобы запрограммировать регистр палетты PCjr нужно сначала
послать его номер (от 10H до 1FH) в массив ворот дисплея, адрес
порта которого 3DAH. Затем нужно послать данные по тому же адресу.
Чтобы быть уверенным, что массив готов принять номер регистра,
а не данные, надо сначала прочитать из порта 3DAH, отбросив
прочитанное.
EGA также использует 16 регистров палетты. Они расположены в
порте с номером 3C0H, а номера их меняются от 00 до 0FH. Надо
сначала прочитать из порта 3DAH, чтобы переключить порт на его
адресный регистр, затем послать номер регистра палетты в 3C0H, а
затем послать данные. Когда переключатели на EGA установлены на
улучшенный режим (для улучшенного цветного дисплея IBM), то палетта
может быть выбрана из 64 цветов. В этом случае установка
регистра палетты имеет длину 6 битов в формате R'G'B'RGB. Биты
RGB дают темные цветы, а биты R'G'B' - цвета повышенной яркости.
Когда установлены и R' и R, например, то это приводит к очень
яркому красному цвету. Биты могут смешиваться давая новые оттенки.
Если регистры палетты, предназначенные для 64 цветов, используются
не в улучшенном режиме, то 4-й и 5-й биты регистра игнорируются
и содержимое регистров рассматривается по обычной схеме
RGB. Поскольку PCjr и EGA используют регистры палетты, то выбор
фонового цвета не ограничен использованием бита 7 байта атрибутов
в качестве бита мигания.
Монохромные символы:
Монохромные символы используют байт атрибутов несколько более
странным образом. Как и с атрибутами цвета, биты 0-2 устанавливают
основной цвет, а биты 4-6 - фоновый. Эти цвета могут быть
только белым и черным, со следующим соответствием битам:
Бит Бит Бит Основной атрибут Фоновый
6 или 2 5 или 1 4 или 0
0 0 0 черный черный
0 0 1 подчеркнутый белый белый
0 1 0 белый белый
0 1 1 белый белый
1 0 0 белый белый
1 0 1 белый белый
1 1 0 белый белый
1 1 1 белый белый
Нормальный режим белый на черном, когда биты 0-2 установлены в
111, а биты 4-6 установлены в 000. Негативное изображение создается
обратными значениями битов. Символы выводятся с повышенной
яркостью, когда бит 3 установлен в 1; не существует способа придать
повышенную яркость фону, когда символы выводятся в негативном
изображении, а также недоступно подчеркивание в негативе. Во
всех случаях, установка в 1 бита 7 дает мигание символов. Всего
возможно только 10 комбинаций, когда символы видны. Они могут
быть реализованы различными установками битов. Ниже приводятся по
одной из возможных установок для каждого случая:
Атрибут Цепочка битов Гекс 10-ное
нормальный 00000111 7 7
интенсивный 00001111 F 15
нормальный подчеркнутый 00000001 1 1
интенсивный подчеркнутый 00001001 9 9
негативный 01110000 70 112
нормальный мигающий 10000111 87 135
интенсивный мигающий 10001111 8F 143
нормальный мигающий подч. 10000001 81 129
яркий мигающий подчерк. 10001001 89 137
яркий негативный 11110000 F0 240
Высокий уровень.
Бейсик устанавливает цвета и атрибуты символов оператором
COLOR. Все операторы PRINT и WRITE, которые следуют за данным
оператором COLOR, выполняются с атрибутами, указанными в этом
операторе. Цвет фона меняется только для выодимых символов, но не
для всего экрана. Новый оператор COLOR не влияет на то, что было
выведено ранее.
Кроме случая монохромного адаптора, COLOR 3,4 устанавливает
основной цвет символа циан (#3), а фоновый - красный (#4). Диапазон
кодов основных цветов 0-31, причем числа 0-15 соответствуют
цветам, перечисленным в вышеприведенной таблице, а числа 16-31
получаются прибавлением к любому из этих кодов числа 16, что дает
тот же самый цвет, но с миганием символов. (При мигании основной
цвет периодически меняется на фоновый, в то время как фоновый
цвет остается неизменным.)
Операторы PRINT и WRITE могут также выводить символы на графический
экран. При этом цвет символов - это всегда третий цвет
текущей палетты, т.е. желтый/коричневый для палетты 0 и белый -
для палетты 1.
Отметим, что когда Вы начинаете работать в цветном текстовом
режиме, то весь экран черно-белый. Чтобы закрасить весь экран в
фоновый цвет, необходимо указать оператором COLOR ,2, например,
зеленый цвет и затем очистить экран командой CLS. Когда Вы чистите
экран по ходу выполнения программы, то необходимо, чтобы последний
оператор COLOR установил фоновый цвет таким, каким Вы
хотите закрасить весь экран.
Для монохромного дисплея атрибуты устанавливаются аналогичным
образом. 0 соответствует черному цвету, а любое из чисел 1-7
соответствует белому. Таким образом COLOR 0,7 устанавливает черное
изображение на белом фоне (негатив), в то время как COLOR 7,0
дает вывод белых символов на черном фоне (обычная установка).
Имеется одно исключение: если в качестве основного цвета использовать
код 1, то будут выводиться подчеркнутые символы. Прибавив
8 к любому из кодов основного цвета, получим яркое изображение.
Прибавив 16 к любому из кодов 0-15, получим мигающие символы.
Таким образом 7+8+16=31 дает яркое мигающее белое изображение.
Для фонового цвета допустимы только значения от 0 до 7.
Если Вы используете прямое отображение в память [4.3.1], то
оператор COLOR не влияет на вывод. Вместо этого Вы должны выбрать
требуемую установку атрибутов из таблиц и прямо присвоить значение
соответствующего байта атрибутов оператором POKE. Помните,
что байты атрибутов всегда занимают нечетные позиции в видеобуфере.
Отображение в память позволяет Вам иметь 16 фоновых цветов в
Бейсике (при условии, что Вам не нужны мигающие символы). Для
графического адаптора введите OUT &H3D8,8, чтобы старший бит
каждого атрибута действовал как бит яркости для фоновых цветов. В
следующем примере в центре экрана печатается яркокрасный "!" на
светлокрасном фоне.
100 DEF SEG = &HB800 'указываем на буфер цветного дисплея
110 OUT &H3D8,8 'используем 16 фоновых цветов
120 POKE 1000,33 'печатаем ! в центре экрана
130 POKE 1001,196 'красный на светлокрасном (11000100)
Как уже говорилось выше PCjr хранит бит мигания в массиве ворот
дисплея. Вот та же программа для PCjr (но она не будет работать в
режиме двухцветной графики):
100 DEF SEG = &HB800 'указываем на видеобуфер
110 X = INP(&H3AH) 'читаем из массива ворот дисплея
120 OUT &H3AH,3 'требуем доступ к регистру 3
130 OUT &H3AH,0 'сбрасываем все биты этого регистра
140 POKE 1000,33 'печатаем ! в центре экрана
150 POKE 1001,196 'красный на светлокрасном (11000100)
Приведем еще пример изменения назначения цвета регистра палетты.
Код цвета, который обычно выводится синим (0001) сделаем, чтобы
он выводил цвет магента (0101). Номер регистра массива ворот
дисплея, соответствующий коду цвета 1 равен 11H.
100 X = INP (&H3AH) 'читаем из массива ворот дисплея
110 OUT &H3AH,&H11 'требуем доступ к регистру 11H
120 OUT &H3AH,5 'помещаем туда код магенты (0101 = 5)
Средний уровень.
Прерывания DOS и BIOS предоставляют очень бедные возможности
для работы с цветным текстом. Только функция 9 прерывания 10H
принимает байт атрибутов при выводе символа. Функция A прерывания
10H выводит символ без указания цвета или атрибута; она просто
помещает символ в видеобуфер, не трогая байт атрибута, таким
образом атрибуты сохраняют свое старое значение. Функция D прерывания
10H также оставляет нетронутым байт атрибутов. Все эти
функции обсуждаются в [4.3.1].
Функции вывода на экран DOS прерывания 21H всегда выводят
белое на черном. Даже если для всего экрана установлен некоторый
фоновый цвет, то функции DOS устанавливают атрибут в нормальный
черный при выводе каждого символа. Однако имеется способ преодолеть
это ограничение. MS DOS предоставляет драйвер устройства
ANSI.SYS, который может интерпретировать специальные Esc-последовательности.
В приложении Д объясняются основы его использования.
Esc-последовательности выводятся через функцию 9 прерывания 21H,
которые обычно выводят строку символов на экран. В этом случае
строка состоит из символа Esc, за которым следует [, а далее одно
или более кодовых чисел из нижеприведенного списка. Строка должна
кончаться символом m и обычным ограничителем $. Вот кодовые номера:
0 все атрибуты выключены (черный на белом)
1 включена повышенная интенсивность
4 включено подчеркивание
5 включено мигание
7 включено негативное изображение
8 все включено (при этом символы невидимы)
30 черный основной цвет 40 черный фон
31 красный основной цвет 41 красный фон
32 зеленый основной цвет 42 зеленый фон
33 желтый основной цвет 43 желтый фон
34 синий основной цвет 44 синий фон
35 основной цвет магента 45 фон магента
36 основной цвет циан 46 фон циан
37 белый основной цвет 40 белый фон
Отметим, что когда функции MS DOS выводят символы в графическом
режиме, то они обычно используют код 3 текущей палетты. С помощью
Esc-последовательностей можно установить цвет символа соответствующим
любому из цветов палетты. Надо указывать 30 или 31 для
фонового цвета, 32 или 33 - для кода 1, 34 или 35 - для кода 2 и
36 или 37 - для кода 3. В этом случае не надо указывать фоновый
цвет.
В следующем примере на экран выводятся две строки с помощью
функции 9 прерывания 21H. Первая выводится синим на красном, а
вторая - мигающим цианом на красном. Не надо переопределять красный
в качестве фонового цвета для второй строки, поскольку назначения
цветов действуют на все последующие команды вывода (включая
функции BIOS прерывания 10H), до тех пор, пока не будут сделаны
другие назначения. Отметим, как просто перемешивать команды управления
цветом с выводом самих строк.
;---в сегменте данных
STRING_1 DB 'The rain in Spain',0AH,0DH,'$'
STRING_2 DB 'Falls mainly on the plain$'
BLUE_RED DB 27,'[34;41m$'
BLINK_CYAN DB 27,'[5;36m$'
;---вывод строк
MOV AH,9 ;функция вывода строки
LEA DX,BLUE_RED ;адрес управляющей строки в DX
INT 21H ;все будет выдаваться синим на красном
LEA DX,STRING_1 ;указываем на первую строку
INT 21H ;печатаем строку
LEA DX,BLINK_CYAN ;адрес второй управляющей строки
INT 21H ;меняем цвет на мигающий циан
LEA DX,STRING_2 ;указываем на вторую строку
INT 21H ;печатаем строку
Вы всегда должны позаботиться о том, чтобы сбросить атрибуты
цвета в нормальное состояние перед завершением программы, поскольку
в противном случае они будут действовать и на вывод последующих
программ. В конце следует вывести Esc-последовательность,
использующую код номер 0, как указано выше.
PCjr и EGA имеют специальную функцию BIOS для установки содержимого
регистров палетты. Это подфункция 0 функции 10H прерывания
10H. Надо поместить номер регистра палетты (от 0 до 15) в BL, а
значение кода цвета (также от 0 до 15) в BH, а затем выполнить
прерывание. Подфункция 2 функции 10H устанавливает все регистры
палетты, а также цвет границы, используя 17-байтный массив, на
который должны указывать ES:DX. Байты 0-15 массива помещаются в
регистры палетты 0-15, а байт 16 устанавливает цвет границы. О
том, как отдельно установить цвет границы см. [4.1.4].
Низкий уровень.
Как уже объяснялось в разделе "Высокий уровень", надо просто
поместить требуемое значение байта атрибутов в видеобуфер, за тем
символом, к которому эти атрибуты должны относиться. Приведен
пример для цветного адаптора или PCjr. В примере устанавливается
текстовый экран 80*25 с 16 фоновыми цветами, а затем экран инициализируется
в красный цвет светлосинем фоне:
;---установка 16 фоновых цветов в текстовом режиме 80*25
MOV AL,00001001B ;установка в 0 бита мигания
MOV DX,3D8H ;адрес регистра
OUT DX,AL ;посылаем в регистр
;---инициализируем весь экран в красный на светлосинем фоне
MOV AX,0B800H ;указываем на видеобуфер
MOV ES,AX ;
MOV CX,2000 ;записываем атрибут в 2000 ячеек
MOV BX,1 ;BX указывает на байт атрибутов
MOV AL,10010100B ;значение байта атрибутов
NEXT_CHAR: MOV ES:[BX],AL ;посылаем атрибуты в буфер
INC BX ;увеличиваем указатель на атрибуты
INC BX ;
LOOP NEXT_CHAR ;пишем в следующую позицию
4.1.4 Установка цвета границы экрана.
Граница символьного экрана может иметь цвет, отличный от фонового
цвета центральной части экрана. Может быть использован любой
из 16 цветов. С другой стороны, графические экраны технически не
имеют области границы. Когда цвет фона устанавливается в графическом
режиме, то весь экран, включая область границы, окрашивается
в этот цвет. Однако, операции вывода точек на экран не
имеют доступа к области границы; если большую часть адресуемых
точек экрана изменить в нефоновый цвет, то будет создана видимость
границы экрана.
Высокий уровень.
Третий параметр оператора Бейсика COLOR устанавливает цвет
границы. Используются те же самые кодовые номера цветов, приведенные
в [4.1.3]. Например, для установки границы в светлосиний
цвет, надо написать COLOR ,,8. PCjr кроме того может изменять
цвет, за счет изменения установки регистра палетты, соответствующего
коду цвета, указанного для цвета границы. Полное объяснение
см. в [4.1.3].
Средний уровень.
Для всех видеосистем фоновый цвет может быть установлен функцией
BH, прерывания 10H. Эта функция устанавливает также основные
цвета. Чтобы указать, что надо изменить фоновый цвет, надо поместить
0 в BH, а код цвета в BL и выполнить прерывание. Кроме того,
PCjr и EGA имеют специальную функцию для установки фонового цвета.
Это подфункция 1 функции 10H прерывания 10H. Надо поместить
10H в AH, 1 в AL и код цвета в BH. Никаких значений не возвращается.
Низкий уровень.
Для цветного графического адаптора биты 0-3 порта 3D9H (Регистр
выбора цвета) устанавливают цвет границы, когда экран находмтся
в текстовом режиме. Как обычно, назначение битов в восходящем
порядке - синий (B), зеленый (G), красный (R) и интенсивность.
Поскольку этот адрес предназначен только для записи, все
остальные биты этого регистра должны быть правильно установлены.
Это бит 4, который, если его установить в 1, приводит к тому, что
все фоновые цвета будут выводиться с высокой интенсивностью.
;---установка светлосинего цвета границы
MOV AL,00001001B ;атрибут светлосинего цвета
MOV DX,3D9H ;адрес регистра выбора цвета
OUT DX,AL ;устанавливаем цвет границы
Для PCjr массив ворот дисплея [4.1.1] имеет регистр, который
устанавливает цвет границы. Это 4-битный регистр, причем биты 0-3
соответствуют синему, зеленому, красному и высокой интенсивности,
когда установлены в 1. Для установки светлосинего цвета надо
послать в регистр 1001. Регистр цвета границы - это регистр 2
массива ворот дисплея. Чтобы получить доступ к этому регистру
надо сначала послать 2 в порт по адресу 3DAH. Затем надо послать
данные по тому же адресу. Чтобы быть уверенным, что микросхема
готова принять номер регистра, а не данные, надо сначала прочитать
из порта 3DAH. Следующий пример устанавливает красный цвет
границы (бит 2 установлен).
MOV DX,3DAH ;адрес порта массива ворот дисплея
IN AL,DX ;чтение для подготовки микросхемы
MOV AL,2 ;номер требуемого регистра
OUT DX,AL ;посылаем в порт
MOV AL,4 ;устанавливаемс только бит 2
OUT DX,AL ;устанавливаем цвет границы
Для EGA цвет границы устанавливается регистром сканирования
(overscan). Это регистр номер 11H порта с адресом 3C0H. Надо
сначала прочитать этот порт, чтобы переключить его на адресный
регистр, затем послать туда номер 11H в качестве индекса, а затем
послать данные. Имеют значение только младшие 4 бита данных, если
только EGA не связан с улучшенным цветным дисплеем IBM, а в этом
случае имеют значение младшие 6 битов, которые устанавливают цвет
границы.
4.1.5 Очистка части/всего экрана.
Очистка экрана состоит просто в записи пробела в каждую из
позиций экрана (код ASCII - 32). Однако, если при выводе на экран
были использованы ненормальные атрибуты, то должны быть также
изменены и байты атрибутов. Операционная система обеспечивает
простой способ очистки только части экрана.
Высокий уровень.
Бейсик для очистки экрана использует оператор CLS. При этом
25-я строка внизу экрана становится пустой только если был убран
список значений функциональных клавиш с помощью команды KEY OFF.
Байты атрибутов устанавливаются равными ASCII 7. В [4.5.1] дана
процедура прокрутки, которая может быть использована в Бейсике
для очистки окон на экране.
Средний уровень.
Операционная система предоставляет несколько способов очистки
экрана. Какой из них Вы выберете зависит от того, какие средства
требуются программе для достижения других целей. Первый метод -
это просто сброс режима дисплея, используя функцию 0 прерывания
10H [4.1.2]. Для символьного экрана каждая позиция заполняется
пробелом (ASCII 32), а все атрибуты устанавливаются нормальными
(ASCII 7). Обычно этот метод хорош только в начале программы,
когда все равно надо устанавливать режим работы дисплея. Для
цветного графического адаптора и PCjr реинициализация режима
дисплея приводит к катавасии на экране. Этот эффект отсутствует у
монохромного адаптора и EGA.
;---очистка экрана путем установки нового режима
MOV AH,0 ;номер функции установки режима дисплея
MOV AL,2 ;код режима 80*25 черно-белого
INT 10H ;очистка экрана
Второй метод состоит в использовании функций 6 и 7 прерывания
10H, которые сдвигают экран. Число строк, на которое надо сдвинуть
экран помещается в AL и когда это число равно нулю экран
очищается. Прерывание позволяет сдвигать только часть экрана,
поэтому таким образом можно очистить отдельное окно на экране.
Надо поместить координаты левого верхнего угла окна в CX, а координаты
правого нижнего угла в DX (номер строки в CH/DH, а номер
столбца в CL/DL). Поместите атрибут, с которым должен чиститься
экран в BH. Координаты отсчитываются от 0.
;---очистка окна между 3,4 и 13,15
MOV AH,6 ;используем процедуру сдвига
MOV AL,0 ;число строк сдвига делаем равным нулю
MOV BH,7 ;байт атрибутов для заполнения
MOV CH,3 ;строка для верхнего левого угла
MOV CL,4 ;столбец для левого верхнего угла
MOV DH,13 ;строка для нижнего левого угла
MOV DL,15 ;столбец для нижнего левого угла
INT 10H ;чистим окно
Третий метод заключается в использовании фукнции 9 прерывания
10H; которая выводит символ и атрибуты столько раз, сколько указано
в CX. Значение 2000 чистит весь экран, если курсор был установлен
в 0,0, используя метод показанный в [4.2.1]. AH должен
содержать символ пробела, AL - байт атрибутов, а BH - номер страницы
дисплея.
;---установка курсора в левый верхний угол экрана
MOV AH,2 ;функция установки курсора
MOV BH,0 ;номер страницы
MOV DX,0 ;координаты 0,0
INT 10H ;устанавливаем курсор
;---вывод символа пробела 2000 раз
MOV AH,9 ;номер функции
MOV CX,2000 ;число повторений вывода
MOV AL,' ' ;символ пробела в AL
MOV BL,7 ;атрибуты в BL
INT 10H ;очистка экрана
Наконец, DOS обеспечивает очистку экрана с помощью специальных
Esc-последовательностей, которые работают с драйвером ANSI.SYS.
Основные сведения о нем приведены в приложении Д. Эти последовательности
- это строки, начинающиеся с символа Esc, а завершающиеся
ограничителем $. Такие строки выводятся функцией 9 прерывания
21H, при этом DS:DX должны указывать на первый символ строки.
DOS интерпретирует строку не выводя ее на дисплей. Чтобы стереть
весь экран строка должна быть [2J. Чтобы стереть конец строки,
начиная от позиции курсора (включая эту позицию), строка [K.
;---в сегменте данных
CLEAR_LINE DB 27,'[K$'
;---очистка конца строки, начиная от позиции курсора
MOV AH,9 ;функция вывода строки
LEA DX,CLEAR_LINE ;DX должен указывать на начало строки
INT 21H ;стираем конец строки
Низкий уровень.
На низком уровне надо просто поместить символы пробела и требуемый
байт атрибутов в память дисплея, используя инструкцию
STOSW. Вот пример для монохромного дисплея:
MOV AX,0B000H ;указываем на память дисплея
MOV ES,AX ;
MOV DI,0 ;DI указывает на начало буфера
MOV AL,32 ;символ пробела
MOV AH,7 ;нормальные атрибуты
MOV CX,2000 ;число повторений
REP STOSW ;посылаем AX в ES:DI 2000 раз
4.1.6 Переключение между видеоадапторами.
Машина может быть оснащена и монохромным и цветным адаптором,
или одним из этих адапторов и EGA. Программа может выбирать,
какой из мониторов должен быть активным, изменяя значения битов 4
и 5 в ячейке памяти 0000:0410. Установив оба этих бита в 1 мы
выбираем монохромный адаптор. Изменив установку битов 5-4 на 10
устанавливаем графический адаптор в режиме 80 символов в строке,
а на 01 - 40 символов в строке. И, наконец, изменив биты на 00,
выбираем EGA. Во всех случаях Вы должны немедленно подать команду
установки режима, поскольку BIOS имеет еще очень много регистров,
которые надо изменить, прежде чем дисплей будет работать нормально.
Отметим, что хотя операционная система не может управлять
одновременно двумя мониторами, программы могут осуществлять вывод
на оба дисплея, используя прямое отображение в память [4.3.1] для
адресов буфера неактивного монитора.
Высокий уровень.
В Бейсике надо просто использовать следующий код:
100 'Переключение на монохромный дисплей
110 KEY OFF: CLS
120 WIDTH 40
130 DEF SEG = 0
140 M = PEEK(&H410)
150 POKE &H410,M OR &H30
160 WIDTH 80
170 LOCATE,,1,12,13
180 KEY ON
100 'Переключение на цветной графический дисплей (80 символов)
110 KEY OFF: CLS
120 WIDTH 80
130 DEF SEG = 0
140 M = PEEK(&H410)
150 POKE &H410,(M AND &HCF) OR &H20
160 WIDTH 80
170 SCREEN 0
180 LOCATE,,1,6,7
190 KEY ON
100 'Переключение на EGA (80 символов)
110 KEY OFF: CLS
120 WIDTH 80
130 DEF SEG = 0
140 M = PEEK(&H410)
150 POKE &H410,M AND &HCF
160 WIDTH 80
170 SCREEN 0
180 LOCATE,,1,6,7
190 KEY ON
Измените команды WIDTH и SCREEN, чтобы переключиться на другие
начальные режимы дисплея.
Низкий уровень.
В ассемблере, как и в Бейсике, надо прямо изменить биты 4 и 5
по адресу 0000:0410. Надо сбросить режим дисплея сразу вслед за
изменением.
;---переключение на монохромный монитор
SUB AX,AX ;обнуляем AX
MOV ES,AX ;устанавливаем ES на начало памяти
MOV DL,ES:[410H] ;получаем байт по адресу 0000:0410
OR DL,00110000B ;устанавливаем биты 4 и 5
MOV ES:[410H],DL ;возвращаем байт
MOV AH,0 ;фукция установки режима дисплея
MOV AL,0 ;монохромный режим 80*25
INT 10H ;устанавливаем режим
;---переключение на цветной монитор (40 символов)
SUB AX,AX ;устанавливаем ES на начало памяти
MOV ES,AX ;
MOV DL,ES:[410H] ;берем байт по адресу 0000:0410
AND
...Поділитися у соцмережах